1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-03-01 18:29:16 +01:00

proper floats + formatter

This commit is contained in:
sambas 2013-04-17 21:23:49 +03:00
parent a40f8f5ebd
commit 36d6c01864

View File

@ -64,8 +64,8 @@
#ifndef IDLE_COUNTS_PER_SEC_AT_NO_LOAD #ifndef IDLE_COUNTS_PER_SEC_AT_NO_LOAD
#define IDLE_COUNTS_PER_SEC_AT_NO_LOAD 995998 // calibrated by running tests/test_cpuload.c #define IDLE_COUNTS_PER_SEC_AT_NO_LOAD 995998 // calibrated by running tests/test_cpuload.c
// must be updated if the FreeRTOS or compiler // must be updated if the FreeRTOS or compiler
// optimisation options are changed. // optimisation options are changed.
#endif #endif
#if defined(PIOS_SYSTEM_STACK_SIZE) #if defined(PIOS_SYSTEM_STACK_SIZE)
@ -102,15 +102,15 @@ static void updateWDGstats();
*/ */
int32_t SystemModStart(void) int32_t SystemModStart(void)
{ {
// Initialize vars // Initialize vars
stackOverflow = false; stackOverflow = false;
mallocFailed = false; mallocFailed = false;
// Create system task // Create system task
xTaskCreate(systemTask, (signed char *)"System", STACK_SIZE_BYTES/4, NULL, TASK_PRIORITY, &systemTaskHandle); xTaskCreate(systemTask, (signed char *) "System", STACK_SIZE_BYTES / 4, NULL, TASK_PRIORITY, &systemTaskHandle);
// Register task // Register task
TaskMonitorAdd(TASKINFO_RUNNING_SYSTEM, systemTaskHandle); TaskMonitorAdd(TASKINFO_RUNNING_SYSTEM, systemTaskHandle);
return 0; return 0;
} }
/** /**
@ -120,26 +120,26 @@ int32_t SystemModStart(void)
int32_t SystemModInitialize(void) int32_t SystemModInitialize(void)
{ {
// Must registers objects here for system thread because ObjectManager started in OpenPilotInit // Must registers objects here for system thread because ObjectManager started in OpenPilotInit
SystemSettingsInitialize(); SystemSettingsInitialize();
SystemStatsInitialize(); SystemStatsInitialize();
FlightStatusInitialize(); FlightStatusInitialize();
ObjectPersistenceInitialize(); ObjectPersistenceInitialize();
#ifdef DIAG_TASKS #ifdef DIAG_TASKS
TaskInfoInitialize(); TaskInfoInitialize();
#endif #endif
#ifdef DIAG_I2C_WDG_STATS #ifdef DIAG_I2C_WDG_STATS
I2CStatsInitialize(); I2CStatsInitialize();
WatchdogStatusInitialize(); WatchdogStatusInitialize();
#endif #endif
objectPersistenceQueue = xQueueCreate(1, sizeof(UAVObjEvent)); objectPersistenceQueue = xQueueCreate(1, sizeof(UAVObjEvent));
if (objectPersistenceQueue == NULL) if (objectPersistenceQueue == NULL)
return -1; return -1;
SystemModStart(); SystemModStart();
return 0; return 0;
} }
MODULE_INITCALL(SystemModInitialize, 0) MODULE_INITCALL(SystemModInitialize, 0)
@ -148,77 +148,77 @@ MODULE_INITCALL(SystemModInitialize, 0)
*/ */
static void systemTask(void *parameters) static void systemTask(void *parameters)
{ {
/* create all modules thread */ /* create all modules thread */
MODULE_TASKCREATE_ALL; MODULE_TASKCREATE_ALL;
if (mallocFailed) { if (mallocFailed) {
/* We failed to malloc during task creation, /* We failed to malloc during task creation,
* system behaviour is undefined. Reset and let * system behaviour is undefined. Reset and let
* the BootFault code recover for us. * the BootFault code recover for us.
*/ */
PIOS_SYS_Reset(); PIOS_SYS_Reset();
} }
#if defined(PIOS_INCLUDE_IAP) #if defined(PIOS_INCLUDE_IAP)
/* Record a successful boot */ /* Record a successful boot */
PIOS_IAP_WriteBootCount(0); PIOS_IAP_WriteBootCount(0);
#endif #endif
// Initialize vars // Initialize vars
idleCounter = 0; idleCounter = 0;
idleCounterClear = 0; idleCounterClear = 0;
// Listen for SettingPersistance object updates, connect a callback function // Listen for SettingPersistance object updates, connect a callback function
ObjectPersistenceConnectQueue(objectPersistenceQueue); ObjectPersistenceConnectQueue(objectPersistenceQueue);
// Whenever the configuration changes, make sure it is safe to fly // Whenever the configuration changes, make sure it is safe to fly
HwSettingsConnectCallback(hwSettingsUpdatedCb); HwSettingsConnectCallback(hwSettingsUpdatedCb);
// Main system loop // Main system loop
while (1) { while (1) {
// Update the system statistics // Update the system statistics
updateStats(); updateStats();
// Update the system alarms // Update the system alarms
updateSystemAlarms(); updateSystemAlarms();
#ifdef DIAG_I2C_WDG_STATS #ifdef DIAG_I2C_WDG_STATS
updateI2Cstats(); updateI2Cstats();
updateWDGstats(); updateWDGstats();
#endif #endif
#ifdef DIAG_TASKS #ifdef DIAG_TASKS
// Update the task status object // Update the task status object
TaskMonitorUpdateAll(); TaskMonitorUpdateAll();
#endif #endif
// Flash the heartbeat LED // Flash the heartbeat LED
#if defined(PIOS_LED_HEARTBEAT) #if defined(PIOS_LED_HEARTBEAT)
PIOS_LED_Toggle(PIOS_LED_HEARTBEAT); PIOS_LED_Toggle(PIOS_LED_HEARTBEAT);
DEBUG_MSG("+ 0x%08x\r\n", 0xDEADBEEF); DEBUG_MSG("+ 0x%08x\r\n", 0xDEADBEEF);
#endif /* PIOS_LED_HEARTBEAT */ #endif /* PIOS_LED_HEARTBEAT */
// Turn on the error LED if an alarm is set // Turn on the error LED if an alarm is set
#if defined (PIOS_LED_ALARM) #if defined (PIOS_LED_ALARM)
if (AlarmsHasWarnings()) { if (AlarmsHasWarnings()) {
PIOS_LED_On(PIOS_LED_ALARM); PIOS_LED_On(PIOS_LED_ALARM);
} else { } else {
PIOS_LED_Off(PIOS_LED_ALARM); PIOS_LED_Off(PIOS_LED_ALARM);
} }
#endif /* PIOS_LED_ALARM */ #endif /* PIOS_LED_ALARM */
FlightStatusData flightStatus; FlightStatusData flightStatus;
FlightStatusGet(&flightStatus); FlightStatusGet(&flightStatus);
UAVObjEvent ev; UAVObjEvent ev;
int delayTime = flightStatus.Armed == FLIGHTSTATUS_ARMED_ARMED ? int delayTime = flightStatus.Armed == FLIGHTSTATUS_ARMED_ARMED ?
SYSTEM_UPDATE_PERIOD_MS / portTICK_RATE_MS / (LED_BLINK_RATE_HZ * 2) : SYSTEM_UPDATE_PERIOD_MS / portTICK_RATE_MS / (LED_BLINK_RATE_HZ * 2) :
SYSTEM_UPDATE_PERIOD_MS / portTICK_RATE_MS; SYSTEM_UPDATE_PERIOD_MS / portTICK_RATE_MS;
if(xQueueReceive(objectPersistenceQueue, &ev, delayTime) == pdTRUE) { if(xQueueReceive(objectPersistenceQueue, &ev, delayTime) == pdTRUE) {
// If object persistence is updated call the callback // If object persistence is updated call the callback
objectUpdatedCb(&ev); objectUpdatedCb(&ev);
} }
} }
} }
/** /**
@ -226,101 +226,94 @@ static void systemTask(void *parameters)
*/ */
static void objectUpdatedCb(UAVObjEvent * ev) static void objectUpdatedCb(UAVObjEvent * ev)
{ {
ObjectPersistenceData objper; ObjectPersistenceData objper;
UAVObjHandle obj; UAVObjHandle obj;
// If the object updated was the ObjectPersistence execute requested action // If the object updated was the ObjectPersistence execute requested action
if (ev->obj == ObjectPersistenceHandle()) { if (ev->obj == ObjectPersistenceHandle()) {
// Get object data // Get object data
ObjectPersistenceGet(&objper); ObjectPersistenceGet(&objper);
int retval = 1; int retval = 1;
FlightStatusData flightStatus; FlightStatusData flightStatus;
FlightStatusGet(&flightStatus); FlightStatusGet(&flightStatus);
// When this is called because of this method don't do anything // When this is called because of this method don't do anything
if (objper.Operation == OBJECTPERSISTENCE_OPERATION_ERROR || if (objper.Operation == OBJECTPERSISTENCE_OPERATION_ERROR || objper.Operation == OBJECTPERSISTENCE_OPERATION_COMPLETED) {
objper.Operation == OBJECTPERSISTENCE_OPERATION_COMPLETED) { return;
return; }
}
// Execute action if disarmed // Execute action if disarmed
if(flightStatus.Armed != FLIGHTSTATUS_ARMED_DISARMED) { if (flightStatus.Armed != FLIGHTSTATUS_ARMED_DISARMED) {
retval = -1; retval = -1;
} else if (objper.Operation == OBJECTPERSISTENCE_OPERATION_LOAD) { } else if (objper.Operation == OBJECTPERSISTENCE_OPERATION_LOAD) {
if (objper.Selection == OBJECTPERSISTENCE_SELECTION_SINGLEOBJECT) { if (objper.Selection == OBJECTPERSISTENCE_SELECTION_SINGLEOBJECT) {
// Get selected object // Get selected object
obj = UAVObjGetByID(objper.ObjectID); obj = UAVObjGetByID(objper.ObjectID);
if (obj == 0) { if (obj == 0) {
return; return;
} }
// Load selected instance // Load selected instance
retval = UAVObjLoad(obj, objper.InstanceID); retval = UAVObjLoad(obj, objper.InstanceID);
} else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLSETTINGS } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLSETTINGS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) {
|| objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjLoadSettings();
retval = UAVObjLoadSettings(); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLMETAOBJECTS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) {
} else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLMETAOBJECTS retval = UAVObjLoadMetaobjects();
|| objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { }
retval = UAVObjLoadMetaobjects(); } else if (objper.Operation == OBJECTPERSISTENCE_OPERATION_SAVE) {
} if (objper.Selection == OBJECTPERSISTENCE_SELECTION_SINGLEOBJECT) {
} else if (objper.Operation == OBJECTPERSISTENCE_OPERATION_SAVE) { // Get selected object
if (objper.Selection == OBJECTPERSISTENCE_SELECTION_SINGLEOBJECT) { obj = UAVObjGetByID(objper.ObjectID);
// Get selected object if (obj == 0) {
obj = UAVObjGetByID(objper.ObjectID); return;
if (obj == 0) { }
return; // Save selected instance
} retval = UAVObjSave(obj, objper.InstanceID);
// Save selected instance
retval = UAVObjSave(obj, objper.InstanceID);
// Not sure why this is needed // Not sure why this is needed
vTaskDelay(10); vTaskDelay(10);
// Verify saving worked // Verify saving worked
if (retval == 0) if (retval == 0)
retval = UAVObjLoad(obj, objper.InstanceID); retval = UAVObjLoad(obj, objper.InstanceID);
} else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLSETTINGS } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLSETTINGS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) {
|| objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjSaveSettings();
retval = UAVObjSaveSettings(); } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLMETAOBJECTS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) {
} else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLMETAOBJECTS retval = UAVObjSaveMetaobjects();
|| objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { }
retval = UAVObjSaveMetaobjects(); } else if (objper.Operation == OBJECTPERSISTENCE_OPERATION_DELETE) {
} if (objper.Selection == OBJECTPERSISTENCE_SELECTION_SINGLEOBJECT) {
} else if (objper.Operation == OBJECTPERSISTENCE_OPERATION_DELETE) { // Get selected object
if (objper.Selection == OBJECTPERSISTENCE_SELECTION_SINGLEOBJECT) { obj = UAVObjGetByID(objper.ObjectID);
// Get selected object if (obj == 0) {
obj = UAVObjGetByID(objper.ObjectID); return;
if (obj == 0) { }
return; // Delete selected instance
} retval = UAVObjDelete(obj, objper.InstanceID);
// Delete selected instance } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLSETTINGS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) {
retval = UAVObjDelete(obj, objper.InstanceID); retval = UAVObjDeleteSettings();
} else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLSETTINGS } else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLMETAOBJECTS || objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) {
|| objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = UAVObjDeleteMetaobjects();
retval = UAVObjDeleteSettings(); }
} else if (objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLMETAOBJECTS } else if (objper.Operation == OBJECTPERSISTENCE_OPERATION_FULLERASE) {
|| objper.Selection == OBJECTPERSISTENCE_SELECTION_ALLOBJECTS) { retval = -1;
retval = UAVObjDeleteMetaobjects();
}
} else if (objper.Operation == OBJECTPERSISTENCE_OPERATION_FULLERASE) {
retval = -1;
#if defined(PIOS_INCLUDE_FLASH_SECTOR_SETTINGS) #if defined(PIOS_INCLUDE_FLASH_SECTOR_SETTINGS)
retval = PIOS_FLASHFS_Format(0); retval = PIOS_FLASHFS_Format(0);
#endif #endif
} }
switch(retval) { switch (retval) {
case 0: case 0:
objper.Operation = OBJECTPERSISTENCE_OPERATION_COMPLETED; objper.Operation = OBJECTPERSISTENCE_OPERATION_COMPLETED;
ObjectPersistenceSet(&objper); ObjectPersistenceSet(&objper);
break; break;
case -1: case -1:
objper.Operation = OBJECTPERSISTENCE_OPERATION_ERROR; objper.Operation = OBJECTPERSISTENCE_OPERATION_ERROR;
ObjectPersistenceSet(&objper); ObjectPersistenceSet(&objper);
break; break;
default: default:
break; break;
} }
} }
} }
/** /**
@ -328,83 +321,82 @@ static void objectUpdatedCb(UAVObjEvent * ev)
*/ */
static void hwSettingsUpdatedCb(UAVObjEvent * ev) static void hwSettingsUpdatedCb(UAVObjEvent * ev)
{ {
AlarmsSet(SYSTEMALARMS_ALARM_BOOTFAULT,SYSTEMALARMS_ALARM_ERROR); AlarmsSet(SYSTEMALARMS_ALARM_BOOTFAULT, SYSTEMALARMS_ALARM_ERROR);
} }
/** /**
* Called periodically to update the I2C statistics * Called periodically to update the I2C statistics
*/ */
#ifdef DIAG_I2C_WDG_STATS #ifdef DIAG_I2C_WDG_STATS
static void updateI2Cstats() static void updateI2Cstats()
{ {
#if defined(PIOS_INCLUDE_I2C) #if defined(PIOS_INCLUDE_I2C)
I2CStatsData i2cStats; I2CStatsData i2cStats;
I2CStatsGet(&i2cStats); I2CStatsGet(&i2cStats);
struct pios_i2c_fault_history history; struct pios_i2c_fault_history history;
PIOS_I2C_GetDiagnostics(&history, &i2cStats.event_errors); PIOS_I2C_GetDiagnostics(&history, &i2cStats.event_errors);
for(uint8_t i = 0; (i < I2C_LOG_DEPTH) && (i < I2CSTATS_EVENT_LOG_NUMELEM); i++) { for(uint8_t i = 0; (i < I2C_LOG_DEPTH) && (i < I2CSTATS_EVENT_LOG_NUMELEM); i++) {
i2cStats.evirq_log[i] = history.evirq[i]; i2cStats.evirq_log[i] = history.evirq[i];
i2cStats.erirq_log[i] = history.erirq[i]; i2cStats.erirq_log[i] = history.erirq[i];
i2cStats.event_log[i] = history.event[i]; i2cStats.event_log[i] = history.event[i];
i2cStats.state_log[i] = history.state[i]; i2cStats.state_log[i] = history.state[i];
} }
i2cStats.last_error_type = history.type; i2cStats.last_error_type = history.type;
I2CStatsSet(&i2cStats); I2CStatsSet(&i2cStats);
#endif #endif
} }
static void updateWDGstats() static void updateWDGstats()
{ {
WatchdogStatusData watchdogStatus; WatchdogStatusData watchdogStatus;
watchdogStatus.BootupFlags = PIOS_WDG_GetBootupFlags(); watchdogStatus.BootupFlags = PIOS_WDG_GetBootupFlags();
watchdogStatus.ActiveFlags = PIOS_WDG_GetActiveFlags(); watchdogStatus.ActiveFlags = PIOS_WDG_GetActiveFlags();
WatchdogStatusSet(&watchdogStatus); WatchdogStatusSet(&watchdogStatus);
} }
#endif #endif
/** /**
* Called periodically to update the system stats * Called periodically to update the system stats
*/ */
static uint16_t GetFreeIrqStackSize(void) static uint16_t GetFreeIrqStackSize(void)
{ {
uint32_t i = 0x200; uint32_t i = 0x200;
#if !defined(ARCH_POSIX) && !defined(ARCH_WIN32) && defined(CHECK_IRQ_STACK) #if !defined(ARCH_POSIX) && !defined(ARCH_WIN32) && defined(CHECK_IRQ_STACK)
extern uint32_t _irq_stack_top; extern uint32_t _irq_stack_top;
extern uint32_t _irq_stack_end; extern uint32_t _irq_stack_end;
uint32_t pattern = 0x0000A5A5; uint32_t pattern = 0x0000A5A5;
uint32_t *ptr = &_irq_stack_end; uint32_t *ptr = &_irq_stack_end;
#if 1 /* the ugly way accurate but takes more time, useful for debugging */ #if 1 /* the ugly way accurate but takes more time, useful for debugging */
uint32_t stack_size = (((uint32_t)&_irq_stack_top - (uint32_t)&_irq_stack_end) & ~3 ) / 4; uint32_t stack_size = (((uint32_t)&_irq_stack_top - (uint32_t)&_irq_stack_end) & ~3 ) / 4;
for (i=0; i< stack_size; i++) for (i=0; i< stack_size; i++)
{ {
if (ptr[i] != pattern) if (ptr[i] != pattern)
{ {
i=i*4; i=i*4;
break; break;
} }
} }
#else /* faster way but not accurate */ #else /* faster way but not accurate */
if (*(volatile uint32_t *)((uint32_t)ptr + IRQSTACK_LIMIT_CRITICAL) != pattern) if (*(volatile uint32_t *)((uint32_t)ptr + IRQSTACK_LIMIT_CRITICAL) != pattern)
{ {
i = IRQSTACK_LIMIT_CRITICAL - 1; i = IRQSTACK_LIMIT_CRITICAL - 1;
} }
else if (*(volatile uint32_t *)((uint32_t)ptr + IRQSTACK_LIMIT_WARNING) != pattern) else if (*(volatile uint32_t *)((uint32_t)ptr + IRQSTACK_LIMIT_WARNING) != pattern)
{ {
i = IRQSTACK_LIMIT_WARNING - 1; i = IRQSTACK_LIMIT_WARNING - 1;
} }
else else
{ {
i = IRQSTACK_LIMIT_WARNING; i = IRQSTACK_LIMIT_WARNING;
} }
#endif #endif
#endif #endif
return i; return i;
} }
/** /**
@ -412,50 +404,49 @@ uint32_t *ptr = &_irq_stack_end;
*/ */
static void updateStats() static void updateStats()
{ {
static portTickType lastTickCount = 0; static portTickType lastTickCount = 0;
SystemStatsData stats; SystemStatsData stats;
// Get stats and update // Get stats and update
SystemStatsGet(&stats); SystemStatsGet(&stats);
stats.FlightTime = xTaskGetTickCount() * portTICK_RATE_MS; stats.FlightTime = xTaskGetTickCount() * portTICK_RATE_MS;
#if defined(ARCH_POSIX) || defined(ARCH_WIN32) #if defined(ARCH_POSIX) || defined(ARCH_WIN32)
// POSIX port of FreeRTOS doesn't have xPortGetFreeHeapSize() // POSIX port of FreeRTOS doesn't have xPortGetFreeHeapSize()
stats.HeapRemaining = 10240; stats.HeapRemaining = 10240;
#else #else
stats.HeapRemaining = xPortGetFreeHeapSize(); stats.HeapRemaining = xPortGetFreeHeapSize();
#endif #endif
// Get Irq stack status // Get Irq stack status
stats.IRQStackRemaining = GetFreeIrqStackSize(); stats.IRQStackRemaining = GetFreeIrqStackSize();
// When idleCounterClear was not reset by the idle-task, it means the idle-task did not run // When idleCounterClear was not reset by the idle-task, it means the idle-task did not run
if (idleCounterClear) { if (idleCounterClear) {
idleCounter = 0; idleCounter = 0;
} }
portTickType now = xTaskGetTickCount(); portTickType now = xTaskGetTickCount();
if (now > lastTickCount) { if (now > lastTickCount) {
uint32_t dT = (xTaskGetTickCount() - lastTickCount) * portTICK_RATE_MS; // in ms uint32_t dT = (xTaskGetTickCount() - lastTickCount) * portTICK_RATE_MS; // in ms
stats.CPULoad = stats.CPULoad = 100 - (uint8_t) roundf(100.0f * ((float) idleCounter / ((float) dT / 1000.0f)) / (float) IDLE_COUNTS_PER_SEC_AT_NO_LOAD);
100 - (uint8_t) roundf(100.0f * ((float)idleCounter / ((float)dT / 1000.0f)) / (float)IDLE_COUNTS_PER_SEC_AT_NO_LOAD); } //else: TickCount has wrapped, do not calc now
} //else: TickCount has wrapped, do not calc now lastTickCount = now;
lastTickCount = now; idleCounterClear = 1;
idleCounterClear = 1;
#if defined(PIOS_INCLUDE_ADC) && defined(PIOS_ADC_USE_TEMP_SENSOR) #if defined(PIOS_INCLUDE_ADC) && defined(PIOS_ADC_USE_TEMP_SENSOR)
#if defined(STM32F4XX) #if defined(STM32F4XX)
float temp_voltage = 3.3 * PIOS_ADC_PinGet(3) / ((1 << 12) - 1); float temp_voltage = 3.3f * PIOS_ADC_PinGet(3) / ((1 << 12) - 1);
const float STM32_TEMP_V25 = 0.76; /* V */ const float STM32_TEMP_V25 = 0.76f; /* V */
const float STM32_TEMP_AVG_SLOPE = 2.5; /* mV/C */ const float STM32_TEMP_AVG_SLOPE = 2.5f; /* mV/C */
stats.CPUTemp = (temp_voltage-STM32_TEMP_V25) * 1000 / STM32_TEMP_AVG_SLOPE + 25; stats.CPUTemp = (temp_voltage-STM32_TEMP_V25) * 1000 / STM32_TEMP_AVG_SLOPE + 25;
#else #else
float temp_voltage = 3.3 * PIOS_ADC_PinGet(0) / ((1 << 12) - 1); float temp_voltage = 3.3f * PIOS_ADC_PinGet(0) / ((1 << 12) - 1);
const float STM32_TEMP_V25 = 1.43; /* V */ const float STM32_TEMP_V25 = 1.43f; /* V */
const float STM32_TEMP_AVG_SLOPE = 4.3; /* mV/C */ const float STM32_TEMP_AVG_SLOPE = 4.3f; /* mV/C */
stats.CPUTemp = (temp_voltage-STM32_TEMP_V25) * 1000 / STM32_TEMP_AVG_SLOPE + 25; stats.CPUTemp = (temp_voltage-STM32_TEMP_V25) * 1000 / STM32_TEMP_AVG_SLOPE + 25;
#endif #endif
#endif #endif
SystemStatsSet(&stats); SystemStatsSet(&stats);
} }
/** /**
@ -463,66 +454,64 @@ static void updateStats()
*/ */
static void updateSystemAlarms() static void updateSystemAlarms()
{ {
SystemStatsData stats; SystemStatsData stats;
UAVObjStats objStats; UAVObjStats objStats;
EventStats evStats; EventStats evStats;
SystemStatsGet(&stats); SystemStatsGet(&stats);
// Check heap, IRQ stack and malloc failures // Check heap, IRQ stack and malloc failures
if ( mallocFailed if (mallocFailed || (stats.HeapRemaining < HEAP_LIMIT_CRITICAL)
|| (stats.HeapRemaining < HEAP_LIMIT_CRITICAL)
#if !defined(ARCH_POSIX) && !defined(ARCH_WIN32) && defined(CHECK_IRQ_STACK) #if !defined(ARCH_POSIX) && !defined(ARCH_WIN32) && defined(CHECK_IRQ_STACK)
|| (stats.IRQStackRemaining < IRQSTACK_LIMIT_CRITICAL) || (stats.IRQStackRemaining < IRQSTACK_LIMIT_CRITICAL)
#endif #endif
) { ) {
AlarmsSet(SYSTEMALARMS_ALARM_OUTOFMEMORY, SYSTEMALARMS_ALARM_CRITICAL); AlarmsSet(SYSTEMALARMS_ALARM_OUTOFMEMORY, SYSTEMALARMS_ALARM_CRITICAL);
} else if ( } else if ((stats.HeapRemaining < HEAP_LIMIT_WARNING)
(stats.HeapRemaining < HEAP_LIMIT_WARNING)
#if !defined(ARCH_POSIX) && !defined(ARCH_WIN32) && defined(CHECK_IRQ_STACK) #if !defined(ARCH_POSIX) && !defined(ARCH_WIN32) && defined(CHECK_IRQ_STACK)
|| (stats.IRQStackRemaining < IRQSTACK_LIMIT_WARNING) || (stats.IRQStackRemaining < IRQSTACK_LIMIT_WARNING)
#endif #endif
) { ) {
AlarmsSet(SYSTEMALARMS_ALARM_OUTOFMEMORY, SYSTEMALARMS_ALARM_WARNING); AlarmsSet(SYSTEMALARMS_ALARM_OUTOFMEMORY, SYSTEMALARMS_ALARM_WARNING);
} else { } else {
AlarmsClear(SYSTEMALARMS_ALARM_OUTOFMEMORY); AlarmsClear(SYSTEMALARMS_ALARM_OUTOFMEMORY);
} }
// Check CPU load // Check CPU load
if (stats.CPULoad > CPULOAD_LIMIT_CRITICAL) { if (stats.CPULoad > CPULOAD_LIMIT_CRITICAL) {
AlarmsSet(SYSTEMALARMS_ALARM_CPUOVERLOAD, SYSTEMALARMS_ALARM_CRITICAL); AlarmsSet(SYSTEMALARMS_ALARM_CPUOVERLOAD, SYSTEMALARMS_ALARM_CRITICAL);
} else if (stats.CPULoad > CPULOAD_LIMIT_WARNING) { } else if (stats.CPULoad > CPULOAD_LIMIT_WARNING) {
AlarmsSet(SYSTEMALARMS_ALARM_CPUOVERLOAD, SYSTEMALARMS_ALARM_WARNING); AlarmsSet(SYSTEMALARMS_ALARM_CPUOVERLOAD, SYSTEMALARMS_ALARM_WARNING);
} else { } else {
AlarmsClear(SYSTEMALARMS_ALARM_CPUOVERLOAD); AlarmsClear(SYSTEMALARMS_ALARM_CPUOVERLOAD);
} }
// Check for stack overflow // Check for stack overflow
if (stackOverflow) { if (stackOverflow) {
AlarmsSet(SYSTEMALARMS_ALARM_STACKOVERFLOW, SYSTEMALARMS_ALARM_CRITICAL); AlarmsSet(SYSTEMALARMS_ALARM_STACKOVERFLOW, SYSTEMALARMS_ALARM_CRITICAL);
} else { } else {
AlarmsClear(SYSTEMALARMS_ALARM_STACKOVERFLOW); AlarmsClear(SYSTEMALARMS_ALARM_STACKOVERFLOW);
} }
// Check for event errors
UAVObjGetStats(&objStats);
EventGetStats(&evStats);
UAVObjClearStats();
EventClearStats();
if (objStats.eventCallbackErrors > 0 || objStats.eventQueueErrors > 0 || evStats.eventErrors > 0) {
AlarmsSet(SYSTEMALARMS_ALARM_EVENTSYSTEM, SYSTEMALARMS_ALARM_WARNING);
} else {
AlarmsClear(SYSTEMALARMS_ALARM_EVENTSYSTEM);
}
if (objStats.lastCallbackErrorID || objStats.lastQueueErrorID || evStats.lastErrorID) {
SystemStatsData sysStats;
SystemStatsGet(&sysStats);
sysStats.EventSystemWarningID = evStats.lastErrorID;
sysStats.ObjectManagerCallbackID = objStats.lastCallbackErrorID;
sysStats.ObjectManagerQueueID = objStats.lastQueueErrorID;
SystemStatsSet(&sysStats);
}
// Check for event errors
UAVObjGetStats(&objStats);
EventGetStats(&evStats);
UAVObjClearStats();
EventClearStats();
if (objStats.eventCallbackErrors > 0 || objStats.eventQueueErrors > 0 || evStats.eventErrors > 0) {
AlarmsSet(SYSTEMALARMS_ALARM_EVENTSYSTEM, SYSTEMALARMS_ALARM_WARNING);
} else {
AlarmsClear(SYSTEMALARMS_ALARM_EVENTSYSTEM);
}
if (objStats.lastCallbackErrorID || objStats.lastQueueErrorID || evStats.lastErrorID) {
SystemStatsData sysStats;
SystemStatsGet(&sysStats);
sysStats.EventSystemWarningID = evStats.lastErrorID;
sysStats.ObjectManagerCallbackID = objStats.lastCallbackErrorID;
sysStats.ObjectManagerQueueID = objStats.lastQueueErrorID;
SystemStatsSet(&sysStats);
}
} }
/** /**
@ -530,13 +519,13 @@ static void updateSystemAlarms()
*/ */
void vApplicationIdleHook(void) void vApplicationIdleHook(void)
{ {
// Called when the scheduler has no tasks to run // Called when the scheduler has no tasks to run
if (idleCounterClear == 0) { if (idleCounterClear == 0) {
++idleCounter; ++idleCounter;
} else { } else {
idleCounter = 0; idleCounter = 0;
idleCounterClear = 0; idleCounterClear = 0;
} }
} }
/** /**
@ -545,11 +534,11 @@ void vApplicationIdleHook(void)
#define DEBUG_STACK_OVERFLOW 0 #define DEBUG_STACK_OVERFLOW 0
void vApplicationStackOverflowHook(xTaskHandle * pxTask, signed portCHAR * pcTaskName) void vApplicationStackOverflowHook(xTaskHandle * pxTask, signed portCHAR * pcTaskName)
{ {
stackOverflow = true; stackOverflow = true;
#if DEBUG_STACK_OVERFLOW #if DEBUG_STACK_OVERFLOW
static volatile bool wait_here = true; static volatile bool wait_here = true;
while(wait_here); while(wait_here);
wait_here = true; wait_here = true;
#endif #endif
} }
@ -559,15 +548,15 @@ void vApplicationStackOverflowHook(xTaskHandle * pxTask, signed portCHAR * pcTas
#define DEBUG_MALLOC_FAILURES 0 #define DEBUG_MALLOC_FAILURES 0
void vApplicationMallocFailedHook(void) void vApplicationMallocFailedHook(void)
{ {
mallocFailed = true; mallocFailed = true;
#if DEBUG_MALLOC_FAILURES #if DEBUG_MALLOC_FAILURES
static volatile bool wait_here = true; static volatile bool wait_here = true;
while(wait_here); while(wait_here);
wait_here = true; wait_here = true;
#endif #endif
} }
/** /**
* @} * @}
* @} * @}
*/ */