summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2013-09-24 11:45:13 -0600
committerGregory Nutt <gnutt@nuttx.org>2013-09-24 11:45:13 -0600
commit5492db2e6255d74d4c7c7d517ca32eea0181ed72 (patch)
tree0193e84a42eed5c71c0d2c5b0fea1ad7047c74f4
parent332ecad5b20f77e8fc05ad3c30503864891bab46 (diff)
downloadnuttx-5492db2e6255d74d4c7c7d517ca32eea0181ed72.tar.gz
nuttx-5492db2e6255d74d4c7c7d517ca32eea0181ed72.tar.bz2
nuttx-5492db2e6255d74d4c7c7d517ca32eea0181ed72.zip
Standardize stack checking interface
-rw-r--r--nuttx/ChangeLog2
-rw-r--r--nuttx/Kconfig11
-rw-r--r--nuttx/arch/Kconfig1
-rw-r--r--nuttx/arch/arm/src/common/up_checkstack.c11
-rw-r--r--nuttx/arch/arm/src/common/up_createstack.c2
-rw-r--r--nuttx/arch/arm/src/common/up_internal.h22
-rw-r--r--nuttx/arch/avr/Kconfig1
-rw-r--r--nuttx/arch/avr/src/avr/avr_internal.h36
-rw-r--r--nuttx/arch/avr/src/avr/up_checkstack.c12
-rw-r--r--nuttx/arch/avr/src/common/up_internal.h38
-rw-r--r--nuttx/include/nuttx/arch.h24
11 files changed, 85 insertions, 75 deletions
diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog
index bd7c978a7..6194be14c 100644
--- a/nuttx/ChangeLog
+++ b/nuttx/ChangeLog
@@ -5623,4 +5623,6 @@
reliable. No idea why. RX DMA is still used (2013-9-23).
* driver/net/encx24j600.c: UDP/RXAVAIL backlog support from Max
Holtzberg (2013-9-24).
+ * Standardized stack checking logic so the interfaces can be used
+ by common stack monitoring logic (2013-9-24).
diff --git a/nuttx/Kconfig b/nuttx/Kconfig
index 2afd9a1c4..e65ed56a8 100644
--- a/nuttx/Kconfig
+++ b/nuttx/Kconfig
@@ -312,6 +312,10 @@ config DEBUG
Note that enabling this option by itself does not produce debug output.
Debug output must also be selected on a subsystem-by-subsystem basis.
+config ARCH_HAVE_STACKCHECK
+ bool
+ default n
+
if DEBUG
config DEBUG_VERBOSE
bool "Enable Debug Verbose Output"
@@ -402,6 +406,13 @@ config DEBUG_SYSCALL
Enable very low level output related to system calls. This gives
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"
config DEBUG_LCD
diff --git a/nuttx/arch/Kconfig b/nuttx/arch/Kconfig
index 34026cff9..2c81f17ca 100644
--- a/nuttx/arch/Kconfig
+++ b/nuttx/arch/Kconfig
@@ -17,6 +17,7 @@ config ARCH_ARM
bool "ARM"
select ARCH_HAVE_INTERRUPTSTACK
select ARCH_HAVE_VFORK
+ select ARCH_HAVE_STACKCHECK
---help---
The ARM architectures
diff --git a/nuttx/arch/arm/src/common/up_checkstack.c b/nuttx/arch/arm/src/common/up_checkstack.c
index 273d30d23..2bcd5c556 100644
--- a/nuttx/arch/arm/src/common/up_checkstack.c
+++ b/nuttx/arch/arm/src/common/up_checkstack.c
@@ -1,7 +1,7 @@
/****************************************************************************
* 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>
*
* 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;
}
+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)
{
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 */
diff --git a/nuttx/arch/arm/src/common/up_createstack.c b/nuttx/arch/arm/src/common/up_createstack.c
index 634fb9d61..46bf15358 100644
--- a/nuttx/arch/arm/src/common/up_createstack.c
+++ b/nuttx/arch/arm/src/common/up_createstack.c
@@ -85,7 +85,7 @@
/****************************************************************************
* 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?
*
****************************************************************************/
diff --git a/nuttx/arch/arm/src/common/up_internal.h b/nuttx/arch/arm/src/common/up_internal.h
index b39f456d0..448735e49 100644
--- a/nuttx/arch/arm/src/common/up_internal.h
+++ b/nuttx/arch/arm/src/common/up_internal.h
@@ -484,28 +484,6 @@ void up_usbuninitialize(void);
void up_rnginitialize(void);
#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 /* __ARCH_ARM_SRC_COMMON_UP_INTERNAL_H */
diff --git a/nuttx/arch/avr/Kconfig b/nuttx/arch/avr/Kconfig
index 41b6c72d3..acfbf6a60 100644
--- a/nuttx/arch/avr/Kconfig
+++ b/nuttx/arch/avr/Kconfig
@@ -44,6 +44,7 @@ endchoice
config ARCH_FAMILY_AVR
bool
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
bool
diff --git a/nuttx/arch/avr/src/avr/avr_internal.h b/nuttx/arch/avr/src/avr/avr_internal.h
index 9cd6c893e..8fb3fae28 100644
--- a/nuttx/arch/avr/src/avr/avr_internal.h
+++ b/nuttx/arch/avr/src/avr/avr_internal.h
@@ -1,7 +1,7 @@
/****************************************************************************
* 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>
*
* 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
@@ -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
@@ -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
@@ -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
@@ -167,33 +167,13 @@ struct spi_dev_s;
enum spi_dev_e;
#ifdef CONFIG_AVR_SPI
-extern 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);
+void avr_spiselect(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected);
+uint8_t avr_spistatus(FAR struct spi_dev_s *dev, enum spi_dev_e devid);
#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
-/****************************************************************************
- * 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 /* __ARCH_AVR_SRC_AVR_AVR_INTERNAL_H */
diff --git a/nuttx/arch/avr/src/avr/up_checkstack.c b/nuttx/arch/avr/src/avr/up_checkstack.c
index e58ee0ca3..6ff0db083 100644
--- a/nuttx/arch/avr/src/avr/up_checkstack.c
+++ b/nuttx/arch/avr/src/avr/up_checkstack.c
@@ -1,7 +1,7 @@
/****************************************************************************
* 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>
*
* 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;
}
+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)
{
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 */
diff --git a/nuttx/arch/avr/src/common/up_internal.h b/nuttx/arch/avr/src/common/up_internal.h
index fce3bc6fa..189aa8d33 100644
--- a/nuttx/arch/avr/src/common/up_internal.h
+++ b/nuttx/arch/avr/src/common/up_internal.h
@@ -126,17 +126,17 @@ extern uint32_t _ebss; /* End+1 of .bss */
/* Defined in files with the same name as the function */
-extern void up_boot(void);
-extern void up_irqinitialize(void);
+void up_boot(void);
+void up_irqinitialize(void);
#ifdef CONFIG_ARCH_DMA
-extern void weak_function up_dmainitialize(void);
+void weak_function up_dmainitialize(void);
#endif
-extern void up_sigdeliver(void);
-extern int up_timerisr(int irq, uint32_t *regs);
-extern void up_lowputc(char ch);
-extern void up_puts(const char *str);
-extern void up_lowputs(const char *str);
-extern void up_dumpstate(void);
+void up_sigdeliver(void);
+int up_timerisr(int irq, uint32_t *regs);
+void up_lowputc(char ch);
+void up_puts(const char *str);
+void up_lowputs(const char *str);
+void up_dumpstate(void);
/* 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.)
*/
-extern void up_lowinit(void);
+void up_lowinit(void);
/* Defined in chip/xxx_serial.c */
#if CONFIG_NFILE_DESCRIPTORS > 0
-extern void up_earlyserialinit(void);
-extern void up_serialinit(void);
+void up_earlyserialinit(void);
+void up_serialinit(void);
#else
# define up_earlyserialinit()
# define up_serialinit()
@@ -167,7 +167,7 @@ extern void up_serialinit(void);
/* Defined in drivers/lowconsole.c */
#ifdef CONFIG_DEV_LOWCONSOLE
-extern void lowconsole_init(void);
+void lowconsole_init(void);
#else
# define lowconsole_init()
#endif
@@ -179,8 +179,8 @@ extern void up_timerinit(void);
/* Defined in configs/<board-name>/src/up_leds.c */
#ifdef CONFIG_ARCH_LEDS
-extern void up_ledon(int led);
-extern void up_ledoff(int led);
+void up_ledon(int led);
+void up_ledoff(int led);
#else
# define up_ledon(led)
# define up_ledoff(led)
@@ -189,7 +189,7 @@ extern void up_ledoff(int led);
/* Defined in chip/xxx_ethernet.c */
#ifdef CONFIG_NET
-extern void up_netinitialize(void);
+void up_netinitialize(void);
#else
# define up_netinitialize()
#endif
@@ -197,14 +197,12 @@ extern void up_netinitialize(void);
/* Defined in chip/xxx_usbdev.c */
#ifdef CONFIG_USBDEV
-extern void up_usbinitialize(void);
-extern void up_usbuninitialize(void);
+void up_usbinitialize(void);
+void up_usbuninitialize(void);
#else
# define up_usbinitialize()
# define up_usbuninitialize()
#endif
#endif /* __ASSEMBLY__ */
-
#endif /* __UP_INTERNAL_H */
-
diff --git a/nuttx/include/nuttx/arch.h b/nuttx/include/nuttx/arch.h
index 480b5fde5..09936b285 100644
--- a/nuttx/include/nuttx/arch.h
+++ b/nuttx/include/nuttx/arch.h
@@ -987,6 +987,30 @@ void sched_process_timer(void);
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
****************************************************************************/