Skip to content

Commit

Permalink
Merge pull request #1886 from tracernz/mrc-stax
Browse files Browse the repository at this point in the history
Flight: Implement Stack Unused Checks
  • Loading branch information
mlyle committed Jul 26, 2017
2 parents b638c10 + 374d76e commit 0151ab0
Show file tree
Hide file tree
Showing 9 changed files with 176 additions and 28 deletions.
30 changes: 2 additions & 28 deletions flight/Modules/System/systemmod.c
Original file line number Diff line number Diff line change
Expand Up @@ -728,33 +728,6 @@ static void updateRfm22bStats() {
#endif /* if defined(PIOS_INCLUDE_RFM22B) */
}

/**
* Called periodically to update the system stats
*/
static uint16_t GetFreeIrqStackSize(void)
{
uint32_t i = 0x200;

#if !defined(ARCH_POSIX) && !defined(ARCH_WIN32) && defined(CHECK_IRQ_STACK)
extern uint32_t _irq_stack_top;
extern uint32_t _irq_stack_end;
uint32_t pattern = 0x0000A5A5;
uint32_t *ptr = &_irq_stack_end;

uint32_t stack_size = (((uint32_t)&_irq_stack_top - (uint32_t)&_irq_stack_end) & ~3 ) / 4;

for (i=0; i< stack_size; i++)
{
if (ptr[i] != pattern)
{
i=i*4;
break;
}
}
#endif
return i;
}

/**
* Called periodically to update the system stats
*/
Expand All @@ -770,7 +743,8 @@ static void updateStats()
stats.FastHeapRemaining = PIOS_fastheap_get_free_size();

// Get Irq stack status
stats.IRQStackRemaining = GetFreeIrqStackSize();
stats.IRQStackRemaining = (uint16_t)PIOS_SYS_IrqStackUnused();
stats.OSStackRemaining = (uint16_t)PIOS_SYS_OsStackUnused();

// When idleCounterClear was not reset by the idle-task, it means the idle-task did not run
if (idleCounterClear) {
Expand Down
10 changes: 10 additions & 0 deletions flight/PiOS/STM32F0xx/pios_sys.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,16 @@ int32_t PIOS_SYS_SerialNumberGet(char *str)
return 0;
}

size_t PIOS_SYS_IrqStackUnused(void)
{
return 0;
}

size_t PIOS_SYS_OsStackUnused(void)
{
return 0;
}

/**
* Configures SysTick
*/
Expand Down
48 changes: 48 additions & 0 deletions flight/PiOS/STM32F10x/pios_sys.c
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,54 @@ int32_t PIOS_SYS_SerialNumberGet(char *str)
return 0;
}

static inline size_t unused_mem(uint32_t *top, uint32_t *bot, uint32_t pattern)
{
uint32_t *p = bot;
for (; p < top && *p == pattern; p++);
return (p - bot) * sizeof(uint32_t);
}

#ifdef PIOS_INCLUDE_CHIBIOS

#if !defined(CRT0_STACKS_FILL_PATTERN)
#define CRT0_STACKS_FILL_PATTERN 0x55555555 /* ChibiOS ResetHandler */
#endif
/* c.f. linker */
extern uint32_t __main_stack_base__;
extern uint32_t __main_stack_end__;
extern uint32_t __process_stack_base__;
extern uint32_t __process_stack_end__;

size_t PIOS_SYS_IrqStackUnused(void)
{
return unused_mem(&__main_stack_end__, &__main_stack_base__,
CRT0_STACKS_FILL_PATTERN);
}

size_t PIOS_SYS_OsStackUnused(void)
{
return unused_mem(&__process_stack_end__, &__process_stack_base__,
CRT0_STACKS_FILL_PATTERN);
}

#else

/* c.f. linker */
extern uint32_t _irq_stack_end;
extern uint32_t _irq_stack_top;

size_t PIOS_SYS_IrqStackUnused(void)
{
return unused_mem(&_irq_stack_top, &_irq_stack_end, 0xa5a5);
}

size_t PIOS_SYS_OsStackUnused(void)
{
return 0;
}

#endif /* PIOS_INCLUDE_CHIBIOS */

/**
* Configures Vector Table base location and SysTick
*/
Expand Down
48 changes: 48 additions & 0 deletions flight/PiOS/STM32F30x/pios_sys.c
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,54 @@ int32_t PIOS_SYS_SerialNumberGet(char *str)
return 0;
}

static inline size_t unused_mem(uint32_t *top, uint32_t *bot, uint32_t pattern)
{
uint32_t *p = bot;
for (; p < top && *p == pattern; p++);
return (p - bot) * sizeof(uint32_t);
}

#ifdef PIOS_INCLUDE_CHIBIOS

#if !defined(CRT0_STACKS_FILL_PATTERN)
#define CRT0_STACKS_FILL_PATTERN 0x55555555 /* ChibiOS ResetHandler */
#endif
/* c.f. linker */
extern uint32_t __main_stack_base__;
extern uint32_t __main_stack_end__;
extern uint32_t __process_stack_base__;
extern uint32_t __process_stack_end__;

size_t PIOS_SYS_IrqStackUnused(void)
{
return unused_mem(&__main_stack_end__, &__main_stack_base__,
CRT0_STACKS_FILL_PATTERN);
}

size_t PIOS_SYS_OsStackUnused(void)
{
return unused_mem(&__process_stack_end__, &__process_stack_base__,
CRT0_STACKS_FILL_PATTERN);
}

#else

/* c.f. linker */
extern uint32_t _irq_stack_end;
extern uint32_t _irq_stack_top;

size_t PIOS_SYS_IrqStackUnused(void)
{
return unused_mem(&_irq_stack_top, &_irq_stack_end, 0xa5a5a5a5);
}

size_t PIOS_SYS_OsStackUnused(void)
{
return 0;
}

#endif /* PIOS_INCLUDE_CHIBIOS */

/**
* Configures Vector Table base location and SysTick
*/
Expand Down
48 changes: 48 additions & 0 deletions flight/PiOS/STM32F4xx/pios_sys.c
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,54 @@ int32_t PIOS_SYS_SerialNumberGet(char *str)
return 0;
}

static inline size_t unused_mem(uint32_t *top, uint32_t *bot, uint32_t pattern)
{
uint32_t *p = bot;
for (; p < top && *p == pattern; p++);
return (p - bot) * sizeof(uint32_t);
}

#ifdef PIOS_INCLUDE_CHIBIOS

#if !defined(CRT0_STACKS_FILL_PATTERN)
#define CRT0_STACKS_FILL_PATTERN 0x55555555 /* ChibiOS ResetHandler */
#endif
/* c.f. linker */
extern uint32_t __main_stack_base__;
extern uint32_t __main_stack_end__;
extern uint32_t __process_stack_base__;
extern uint32_t __process_stack_end__;

size_t PIOS_SYS_IrqStackUnused(void)
{
return unused_mem(&__main_stack_end__, &__main_stack_base__,
CRT0_STACKS_FILL_PATTERN);
}

size_t PIOS_SYS_OsStackUnused(void)
{
return unused_mem(&__process_stack_end__, &__process_stack_base__,
CRT0_STACKS_FILL_PATTERN);
}

#else

/* c.f. linker */
extern uint32_t _irq_stack_end;
extern uint32_t _irq_stack_top;

size_t PIOS_SYS_IrqStackUnused(void)
{
return unused_mem(&_irq_stack_top, &_irq_stack_end, 0xa5a5a5a5);
}

size_t PIOS_SYS_OsStackUnused(void)
{
return 0;
}

#endif /* PIOS_INCLUDE_CHIBIOS */

/**
* Configures Vector Table base location and SysTick
*/
Expand Down
4 changes: 4 additions & 0 deletions flight/PiOS/inc/pios_sys.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
#ifndef PIOS_SYS_H
#define PIOS_SYS_H

#include <stddef.h>

#define PIOS_SYS_SERIAL_NUM_BINARY_LEN 12
#define PIOS_SYS_SERIAL_NUM_ASCII_LEN (PIOS_SYS_SERIAL_NUM_BINARY_LEN * 2)

Expand All @@ -39,6 +41,8 @@ extern void PIOS_SYS_Init(void);
extern int32_t PIOS_SYS_Reset(void);
extern int32_t PIOS_SYS_SerialNumberGetBinary(uint8_t array[PIOS_SYS_SERIAL_NUM_BINARY_LEN]);
extern int32_t PIOS_SYS_SerialNumberGet(char str[PIOS_SYS_SERIAL_NUM_ASCII_LEN+1]);
extern size_t PIOS_SYS_IrqStackUnused(void);
extern size_t PIOS_SYS_OsStackUnused(void);

#endif /* PIOS_SYS_H */

Expand Down
2 changes: 2 additions & 0 deletions flight/PiOS/posix/inc/pios_sys.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ extern void PIOS_SYS_Init(void);
extern int32_t PIOS_SYS_Reset(void);
extern int32_t PIOS_SYS_SerialNumberGetBinary(uint8_t array[PIOS_SYS_SERIAL_NUM_BINARY_LEN]);
extern int32_t PIOS_SYS_SerialNumberGet(char str[PIOS_SYS_SERIAL_NUM_ASCII_LEN+1]);
extern size_t PIOS_SYS_IrqStackUnused(void);
extern size_t PIOS_SYS_OsStackUnused(void);

extern void PIOS_SYS_Args(int argc, char *argv[]);

Expand Down
11 changes: 11 additions & 0 deletions flight/PiOS/posix/pios_sys.c
Original file line number Diff line number Diff line change
Expand Up @@ -865,6 +865,17 @@ int32_t PIOS_SYS_SerialNumberGet(char *str)
/* No error */
return 0;
}

size_t PIOS_SYS_IrqStackUnused(void)
{
return 0;
}

size_t PIOS_SYS_OsStackUnused(void)
{
return 0;
}

#endif

/**
Expand Down
3 changes: 3 additions & 0 deletions shared/uavobjectdefinition/systemstats.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@
<field name="IRQStackRemaining" units="bytes" type="uint16" elements="1">
<description>Unused space on the IRQ stack since boot.</description>
</field>
<field name="OSStackRemaining" units="bytes" type="uint16" elements="1">
<description>Unused space on the main thread OS stack since boot.</description>
</field>
<field name="CPULoad" units="%" type="uint8" elements="1">
<description>Indicative measure of current CPU load.</description>
</field>
Expand Down

0 comments on commit 0151ab0

Please sign in to comment.