Standardize stack checking interface

This commit is contained in:
Gregory Nutt
2013-09-24 11:45:13 -06:00
parent 368867f06e
commit 7affa54e7e
11 changed files with 85 additions and 75 deletions
+2
View File
@@ -5623,4 +5623,6 @@
reliable. No idea why. RX DMA is still used (2013-9-23). reliable. No idea why. RX DMA is still used (2013-9-23).
* driver/net/encx24j600.c: UDP/RXAVAIL backlog support from Max * driver/net/encx24j600.c: UDP/RXAVAIL backlog support from Max
Holtzberg (2013-9-24). Holtzberg (2013-9-24).
* Standardized stack checking logic so the interfaces can be used
by common stack monitoring logic (2013-9-24).
+11
View File
@@ -312,6 +312,10 @@ config DEBUG
Note that enabling this option by itself does not produce debug output. Note that enabling this option by itself does not produce debug output.
Debug output must also be selected on a subsystem-by-subsystem basis. Debug output must also be selected on a subsystem-by-subsystem basis.
config ARCH_HAVE_STACKCHECK
bool
default n
if DEBUG if DEBUG
config DEBUG_VERBOSE config DEBUG_VERBOSE
bool "Enable Debug Verbose Output" bool "Enable Debug Verbose Output"
@@ -402,6 +406,13 @@ config DEBUG_SYSCALL
Enable very low level output related to system calls. This gives Enable very low level output related to system calls. This gives
you basically a poor man's version of strace. you basically a poor man's version of strace.
config DEBUG_STACK
bool "Stack usage debug hooks"
default n
depends on ARCH_HAVE_STACKCHECK
---help---
Enable hooks to check stack usage. Only supported by a few architectures.
comment "Driver Debug Options" comment "Driver Debug Options"
config DEBUG_LCD config DEBUG_LCD
+1
View File
@@ -17,6 +17,7 @@ config ARCH_ARM
bool "ARM" bool "ARM"
select ARCH_HAVE_INTERRUPTSTACK select ARCH_HAVE_INTERRUPTSTACK
select ARCH_HAVE_VFORK select ARCH_HAVE_VFORK
select ARCH_HAVE_STACKCHECK
---help--- ---help---
The ARM architectures The ARM architectures
+8 -3
View File
@@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
* arch/arm/src/common/up_checkstack.c * arch/arm/src/common/up_checkstack.c
* *
* Copyright (C) 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2011, 2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org> * Author: Gregory Nutt <gnutt@nuttx.org>
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@@ -134,14 +134,19 @@ size_t up_check_tcbstack(FAR struct tcb_s *tcb)
return mark*4; return mark*4;
} }
ssize_t up_check_tcbstack_remain(FAR struct tcb_s *tcb)
{
return (ssize_t)tcb->adj_stack_size - (ssize_t)up_check_tcbstack(tcb);
}
size_t up_check_stack(void) size_t up_check_stack(void)
{ {
return up_check_tcbstack((FAR struct tcb_s*)g_readytorun.head); return up_check_tcbstack((FAR struct tcb_s*)g_readytorun.head);
} }
size_t up_check_stack_remain(void) ssize_t up_check_stack_remain(void)
{ {
return ((FAR struct tcb_s*)g_readytorun.head)->adj_stack_size - up_check_tcbstack((FAR struct tcb_s*)g_readytorun.head); return up_check_tcbstack_remain((FAR struct tcb_s*)g_readytorun.head);
} }
#endif /* CONFIG_DEBUG && CONFIG_DEBUG_STACK */ #endif /* CONFIG_DEBUG && CONFIG_DEBUG_STACK */
+1 -1
View File
@@ -85,7 +85,7 @@
/**************************************************************************** /****************************************************************************
* Name: memset32 * Name: memset32
* *
* On most larger then 8 bit archs this will need to be word aligned so * On most larger than 8 bit archs this will need to be word aligned so
* so maybe some checks should be put in place? * so maybe some checks should be put in place?
* *
****************************************************************************/ ****************************************************************************/
-22
View File
@@ -484,28 +484,6 @@ void up_usbuninitialize(void);
void up_rnginitialize(void); void up_rnginitialize(void);
#endif #endif
/****************************************************************************
* Name: up_check_stack
*
* Description:
* Determine (approximately) how much stack has been used be searching the
* stack memory for a high water mark. That is, the deepest level of the
* stack that clobbered some recognizable marker in the stack memory.
*
* Input Parameters:
* None
*
* Returned value:
* The estimated amount of stack space used.
*
****************************************************************************/
#if defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_STACK)
size_t up_check_stack(void);
size_t up_check_tcbstack(FAR struct tcb_s);
size_t up_check_tcbstack_remain(FAR struct tcb_s);
#endif
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /* __ARCH_ARM_SRC_COMMON_UP_INTERNAL_H */ #endif /* __ARCH_ARM_SRC_COMMON_UP_INTERNAL_H */
+1
View File
@@ -44,6 +44,7 @@ endchoice
config ARCH_FAMILY_AVR config ARCH_FAMILY_AVR
bool bool
default y if ARCH_CHIP_ATMEGA128 || ARCH_CHIP_AT90USB646 || ARCH_CHIP_AT90USB647 || ARCH_CHIP_AT90USB1286 || ARCH_CHIP_AT90USB1287 default y if ARCH_CHIP_ATMEGA128 || ARCH_CHIP_AT90USB646 || ARCH_CHIP_AT90USB647 || ARCH_CHIP_AT90USB1286 || ARCH_CHIP_AT90USB1287
select ARCH_HAVE_STACKCHECK
config ARCH_FAMILY_AVR32 config ARCH_FAMILY_AVR32
bool bool
+8 -28
View File
@@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
* arch/avr/src/avr/avr_internal.h * arch/avr/src/avr/avr_internal.h
* *
* Copyright (C) 2011-2012 Gregory Nutt. All rights reserved. * Copyright (C) 2011-2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org> * Author: Gregory Nutt <gnutt@nuttx.org>
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@@ -104,7 +104,7 @@ extern uint16_t g_idle_topstack;
* *
************************************************************************************/ ************************************************************************************/
extern void up_copystate(uint8_t *dest, uint8_t *src); void up_copystate(uint8_t *dest, uint8_t *src);
/************************************************************************************ /************************************************************************************
* Name: up_fullcontextrestore * Name: up_fullcontextrestore
@@ -114,7 +114,7 @@ extern void up_copystate(uint8_t *dest, uint8_t *src);
* *
************************************************************************************/ ************************************************************************************/
extern void up_fullcontextrestore(uint8_t *restoreregs) noreturn_function; void up_fullcontextrestore(uint8_t *restoreregs) noreturn_function;
/************************************************************************************ /************************************************************************************
* Name: up_switchcontext * Name: up_switchcontext
@@ -124,7 +124,7 @@ extern void up_fullcontextrestore(uint8_t *restoreregs) noreturn_function;
* *
************************************************************************************/ ************************************************************************************/
extern void up_switchcontext(uint8_t *saveregs, uint8_t *restoreregs); void up_switchcontext(uint8_t *saveregs, uint8_t *restoreregs);
/************************************************************************************ /************************************************************************************
* Name: up_doirq * Name: up_doirq
@@ -134,7 +134,7 @@ extern void up_switchcontext(uint8_t *saveregs, uint8_t *restoreregs);
* *
************************************************************************************/ ************************************************************************************/
extern uint8_t *up_doirq(uint8_t irq, uint8_t *regs); uint8_t *up_doirq(uint8_t irq, uint8_t *regs);
/************************************************************************************ /************************************************************************************
* Name: avr_spiselect, avr_spitatus, and avr_spicmddata * Name: avr_spiselect, avr_spitatus, and avr_spicmddata
@@ -167,33 +167,13 @@ struct spi_dev_s;
enum spi_dev_e; enum spi_dev_e;
#ifdef CONFIG_AVR_SPI #ifdef CONFIG_AVR_SPI
extern void avr_spiselect(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected); void avr_spiselect(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected);
extern uint8_t avr_spistatus(FAR struct spi_dev_s *dev, enum spi_dev_e devid); uint8_t avr_spistatus(FAR struct spi_dev_s *dev, enum spi_dev_e devid);
#ifdef CONFIG_SPI_CMDDATA #ifdef CONFIG_SPI_CMDDATA
extern int avr_spicmddata(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool cmd); int avr_spicmddata(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool cmd);
#endif #endif
#endif #endif
/****************************************************************************
* Name: up_check_stack
*
* Description:
* Determine (approximately) how much stack has been used be searching the
* stack memory for a high water mark. That is, the deepest level of the
* stack that clobbered some recognizable marker in the stack memory.
*
* Input Parameters:
* None
*
* Returned value:
* The estimated amount of stack space used.
*
****************************************************************************/
#if defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_STACK)
extern size_t up_check_stack(void);
#endif
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /* __ARCH_AVR_SRC_AVR_AVR_INTERNAL_H */ #endif /* __ARCH_AVR_SRC_AVR_AVR_INTERNAL_H */
+11 -1
View File
@@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
* arch/avr/src/avr/up_checkstack.c * arch/avr/src/avr/up_checkstack.c
* *
* Copyright (C) 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2011, 2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org> * Author: Gregory Nutt <gnutt@nuttx.org>
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@@ -133,9 +133,19 @@ size_t up_check_tcbstack(FAR struct tcb_s *tcb)
return mark; return mark;
} }
ssize_t up_check_tcbstack_remain(FAR struct tcb_s *tcb)
{
return (ssize_t)tcb->adj_stack_size - (ssize_t)up_check_tcbstack(tcb);
}
size_t up_check_stack(void) size_t up_check_stack(void)
{ {
return up_check_tcbstack((FAR struct tcb_s*)g_readytorun.head); return up_check_tcbstack((FAR struct tcb_s*)g_readytorun.head);
} }
ssize_t up_check_stack_remain(void)
{
return up_check_tcbstack_remain((FAR struct tcb_s*)g_readytorun.head);
}
#endif /* CONFIG_DEBUG && CONFIG_DEBUG_STACK */ #endif /* CONFIG_DEBUG && CONFIG_DEBUG_STACK */
+18 -20
View File
@@ -126,17 +126,17 @@ extern uint32_t _ebss; /* End+1 of .bss */
/* Defined in files with the same name as the function */ /* Defined in files with the same name as the function */
extern void up_boot(void); void up_boot(void);
extern void up_irqinitialize(void); void up_irqinitialize(void);
#ifdef CONFIG_ARCH_DMA #ifdef CONFIG_ARCH_DMA
extern void weak_function up_dmainitialize(void); void weak_function up_dmainitialize(void);
#endif #endif
extern void up_sigdeliver(void); void up_sigdeliver(void);
extern int up_timerisr(int irq, uint32_t *regs); int up_timerisr(int irq, uint32_t *regs);
extern void up_lowputc(char ch); void up_lowputc(char ch);
extern void up_puts(const char *str); void up_puts(const char *str);
extern void up_lowputs(const char *str); void up_lowputs(const char *str);
extern void up_dumpstate(void); void up_dumpstate(void);
/* Defined in common/up_allocateheap.c or chip/xxx_allocateheap.c */ /* Defined in common/up_allocateheap.c or chip/xxx_allocateheap.c */
@@ -152,13 +152,13 @@ void up_addregion(void);
* before the OS gets started (clocks, console, LEDs, etc.) * before the OS gets started (clocks, console, LEDs, etc.)
*/ */
extern void up_lowinit(void); void up_lowinit(void);
/* Defined in chip/xxx_serial.c */ /* Defined in chip/xxx_serial.c */
#if CONFIG_NFILE_DESCRIPTORS > 0 #if CONFIG_NFILE_DESCRIPTORS > 0
extern void up_earlyserialinit(void); void up_earlyserialinit(void);
extern void up_serialinit(void); void up_serialinit(void);
#else #else
# define up_earlyserialinit() # define up_earlyserialinit()
# define up_serialinit() # define up_serialinit()
@@ -167,7 +167,7 @@ extern void up_serialinit(void);
/* Defined in drivers/lowconsole.c */ /* Defined in drivers/lowconsole.c */
#ifdef CONFIG_DEV_LOWCONSOLE #ifdef CONFIG_DEV_LOWCONSOLE
extern void lowconsole_init(void); void lowconsole_init(void);
#else #else
# define lowconsole_init() # define lowconsole_init()
#endif #endif
@@ -179,8 +179,8 @@ extern void up_timerinit(void);
/* Defined in configs/<board-name>/src/up_leds.c */ /* Defined in configs/<board-name>/src/up_leds.c */
#ifdef CONFIG_ARCH_LEDS #ifdef CONFIG_ARCH_LEDS
extern void up_ledon(int led); void up_ledon(int led);
extern void up_ledoff(int led); void up_ledoff(int led);
#else #else
# define up_ledon(led) # define up_ledon(led)
# define up_ledoff(led) # define up_ledoff(led)
@@ -189,7 +189,7 @@ extern void up_ledoff(int led);
/* Defined in chip/xxx_ethernet.c */ /* Defined in chip/xxx_ethernet.c */
#ifdef CONFIG_NET #ifdef CONFIG_NET
extern void up_netinitialize(void); void up_netinitialize(void);
#else #else
# define up_netinitialize() # define up_netinitialize()
#endif #endif
@@ -197,14 +197,12 @@ extern void up_netinitialize(void);
/* Defined in chip/xxx_usbdev.c */ /* Defined in chip/xxx_usbdev.c */
#ifdef CONFIG_USBDEV #ifdef CONFIG_USBDEV
extern void up_usbinitialize(void); void up_usbinitialize(void);
extern void up_usbuninitialize(void); void up_usbuninitialize(void);
#else #else
# define up_usbinitialize() # define up_usbinitialize()
# define up_usbuninitialize() # define up_usbuninitialize()
#endif #endif
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /* __UP_INTERNAL_H */ #endif /* __UP_INTERNAL_H */
+24
View File
@@ -986,6 +986,30 @@ void sched_process_timer(void);
void irq_dispatch(int irq, FAR void *context); void irq_dispatch(int irq, FAR void *context);
/****************************************************************************
* Name: up_check_stack and friends
*
* Description:
* Determine (approximately) how much stack has been used be searching the
* stack memory for a high water mark. That is, the deepest level of the
* stack that clobbered some recognizable marker in the stack memory.
*
* Input Parameters:
* None
*
* Returned value:
* The estimated amount of stack space used.
*
****************************************************************************/
#if defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_STACK)
struct tcb_s;
size_t up_check_tcbstack(FAR struct tcb_s *tcb);
ssize_t up_check_tcbstack_remain(FAR struct tcb_s *tcb);
size_t up_check_stack(void);
ssize_t up_check_stack_remain(void);
#endif
/**************************************************************************** /****************************************************************************
* Board-specific button interfaces exported by the board-specific logic * Board-specific button interfaces exported by the board-specific logic
****************************************************************************/ ****************************************************************************/