From b9933c2089f5f0cd93738ae9081c45fcf3df54b7 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Thu, 11 Aug 2011 17:51:37 +0000 Subject: Implemented system state checker debug option, remove the option CH_USE_NESTED_LOCKS. Documentation improvements and fixes. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@3221 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/kernel/include/chdebug.h | 101 ++++++++++++++++---- os/kernel/include/chsys.h | 74 ++++++++------- os/kernel/include/chthreads.h | 6 -- os/kernel/src/chdebug.c | 163 ++++++++++++++++++++++++++++++-- os/kernel/src/chmtx.c | 1 + os/kernel/src/chschd.c | 3 - os/kernel/src/chsys.c | 22 +---- os/kernel/templates/chconf.h | 61 ++++++++---- os/ports/GCC/ARMCMx/STM32F1xx/vectors.c | 12 +++ os/ports/GCC/ARMCMx/chcore_v6m.c | 6 +- os/ports/GCC/ARMCMx/chcore_v7m.c | 6 +- os/ports/GCC/ARMCMx/crt0.c | 20 +++- os/ports/GCC/ARMCMx/port.dox | 31 ++---- os/ports/GCC/PPC/SPC56x/ivor.s | 2 +- 14 files changed, 369 insertions(+), 139 deletions(-) (limited to 'os') diff --git a/os/kernel/include/chdebug.h b/os/kernel/include/chdebug.h index b2edf176e..3bfadb750 100644 --- a/os/kernel/include/chdebug.h +++ b/os/kernel/include/chdebug.h @@ -29,15 +29,31 @@ #ifndef _CHDEBUG_H_ #define _CHDEBUG_H_ +#if CH_DBG_ENABLE_ASSERTS || CH_DBG_ENABLE_CHECKS || \ + CH_DBG_ENABLE_STACK_CHECK || CH_DBG_SYSTEM_STATE_CHECK +#define CH_DBG_ENABLED TRUE +#else +#define CH_DBG_ENABLED FALSE +#endif + +#define __QUOTE_THIS(p) #p + +/*===========================================================================*/ /** - * @brief Trace buffer entries. + * @name Debug related settings + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Trace buffer entries. */ #ifndef CH_TRACE_BUFFER_SIZE #define CH_TRACE_BUFFER_SIZE 64 #endif /** - * @brief Fill value for thread stack area in debug mode. + * @brief Fill value for thread stack area in debug mode. */ #ifndef CH_STACK_FILL_VALUE #define CH_STACK_FILL_VALUE 0x55 @@ -54,11 +70,31 @@ #define CH_THREAD_FILL_VALUE 0xFF #endif -#define __QUOTE_THIS(p) #p +/** @} */ + +/*===========================================================================*/ +/* System state checker related code and variables. */ +/*===========================================================================*/ + +#if !CH_DBG_SYSTEM_STATE_CHECK +#define dbg_check_disable() +#define dbg_check_suspend() +#define dbg_check_enable() +#define dbg_check_lock() +#define dbg_check_unlock() +#define dbg_check_lock_from_isr() +#define dbg_check_unlock_from_isr() +#define dbg_check_enter_isr() +#define dbg_check_leave_isr() +#endif + +/*===========================================================================*/ +/* Trace related structures and macros. */ +/*===========================================================================*/ #if CH_DBG_ENABLE_TRACE || defined(__DOXYGEN__) /** - * @brief Trace buffer record. + * @brief Trace buffer record. */ typedef struct { systime_t se_time; /**< @brief Time of the switch event. */ @@ -68,7 +104,7 @@ typedef struct { } ch_swc_event_t; /** - * @brief Trace buffer header. + * @brief Trace buffer header. */ typedef struct { unsigned tb_size; /**< @brief Trace buffer size (entries).*/ @@ -76,9 +112,25 @@ typedef struct { /** @brief Ring buffer.*/ ch_swc_event_t tb_buffer[CH_TRACE_BUFFER_SIZE]; } ch_trace_buffer_t; + +#if !defined(__DOXYGEN__) +extern ch_trace_buffer_t dbg_trace_buffer; +#endif + #endif /* CH_DBG_ENABLE_TRACE */ +#if !CH_DBG_ENABLE_TRACE +/* When the trace feature is disabled this function is replaced by an empty + macro.*/ +#define dbg_trace(otp) +#endif + +/*===========================================================================*/ +/* Parameters checking related macros. */ +/*===========================================================================*/ + #if CH_DBG_ENABLE_CHECKS || defined(__DOXYGEN__) + /** * @brief Function parameter check. * @details If the condition check fails then the kernel panics and halts. @@ -102,6 +154,10 @@ typedef struct { } #endif /* !CH_DBG_ENABLE_CHECKS */ +/*===========================================================================*/ +/* Assertions related macros. */ +/*===========================================================================*/ + #if CH_DBG_ENABLE_ASSERTS || defined(__DOXYGEN__) /** * @brief Condition assertion. @@ -130,37 +186,42 @@ typedef struct { #define chDbgAssert(c, m, r) {(void)(c);} #endif /* !CH_DBG_ENABLE_ASSERTS */ -#if !(CH_DBG_ENABLE_ASSERTS || \ - CH_DBG_ENABLE_CHECKS || \ - CH_DBG_ENABLE_STACK_CHECK) +extern char *dbg_panic_msg; + +/*===========================================================================*/ +/* Panic related macros. */ +/*===========================================================================*/ + +#if !CH_DBG_ENABLED /* When the debug features are disabled this function is replaced by an empty macro.*/ #define chDbgPanic(msg) {} #endif -#if !CH_DBG_ENABLE_TRACE -/* When the trace feature is disabled this function is replaced by an empty - macro.*/ -#define chDbgTrace(otp) {} -#endif - -#if !defined(__DOXYGEN__) #ifdef __cplusplus extern "C" { #endif +#if CH_DBG_SYSTEM_STATE_CHECK + void dbg_check_disable(void); + void dbg_check_suspend(void); + void dbg_check_enable(void); + void dbg_check_lock(void); + void dbg_check_unlock(void); + void dbg_check_lock_from_isr(void); + void dbg_check_unlock_from_isr(void); + void dbg_check_enter_isr(void); + void dbg_check_leave_isr(void); +#endif #if CH_DBG_ENABLE_TRACE || defined(__DOXYGEN__) - extern ch_trace_buffer_t dbg_trace_buffer; void _trace_init(void); - void chDbgTrace(Thread *otp); + void dbg_trace(Thread *otp); #endif -#if CH_DBG_ENABLE_ASSERTS || CH_DBG_ENABLE_CHECKS || CH_DBG_ENABLE_STACK_CHECK - extern char *dbg_panic_msg; +#if CH_DBG_ENABLED void chDbgPanic(char *msg); #endif #ifdef __cplusplus } #endif -#endif /* !defined(__DOXYGEN__) */ #endif /* _CHDEBUG_H_ */ diff --git a/os/kernel/include/chsys.h b/os/kernel/include/chsys.h index 37d4cd7ce..994b1301f 100644 --- a/os/kernel/include/chsys.h +++ b/os/kernel/include/chsys.h @@ -73,7 +73,10 @@ * * @special */ -#define chSysSwitchI(ntp, otp) port_switch(ntp, otp) +#define chSysSwitchI(ntp, otp) { \ + dbg_trace(otp); \ + port_switch(ntp, otp); \ +} /** * @brief Raises the system interrupt priority mask to the maximum level. @@ -83,7 +86,10 @@ * * @special */ -#define chSysDisable() port_disable() +#define chSysDisable() { \ + port_disable(); \ + dbg_check_disable(); \ +} /** * @brief Raises the system interrupt priority mask to system level. @@ -96,7 +102,10 @@ * * @special */ -#define chSysSuspend() port_suspend() +#define chSysSuspend() { \ + port_suspend(); \ + dbg_check_suspend(); \ +} /** * @brief Lowers the system interrupt priority mask to user level. @@ -107,45 +116,30 @@ * * @special */ -#define chSysEnable() port_enable() +#define chSysEnable() { \ + dbg_check_enable(); \ + port_enable(); \ +} /** * @brief Enters the kernel lock mode. - * @note The use of kernel lock mode is not recommended in the user code, - * it is a better idea to use the semaphores or mutexes instead. - * @see CH_USE_NESTED_LOCKS * * @special */ -#if CH_USE_NESTED_LOCKS || defined(__DOXYGEN__) -#if CH_OPTIMIZE_SPEED || defined(__DOXYGEN__) -#define chSysLock() { \ - if (currp->p_locks++ == 0) \ - port_lock(); \ +#define chSysLock() { \ + port_lock(); \ + dbg_check_lock(); \ } -#endif /* CH_OPTIMIZE_SPEED */ -#else /* !CH_USE_NESTED_LOCKS */ -#define chSysLock() port_lock() -#endif /* !CH_USE_NESTED_LOCKS */ /** * @brief Leaves the kernel lock mode. - * @note The use of kernel lock mode is not recommended in the user code, - * it is a better idea to use the semaphores or mutexes instead. - * @see CH_USE_NESTED_LOCKS * * @special */ -#if CH_USE_NESTED_LOCKS || defined(__DOXYGEN__) -#if CH_OPTIMIZE_SPEED || defined(__DOXYGEN__) -#define chSysUnlock() { \ - if (--currp->p_locks == 0) \ - port_unlock(); \ +#define chSysUnlock() { \ + dbg_check_unlock(); \ + port_unlock(); \ } -#endif /* CH_OPTIMIZE_SPEED */ -#else /* !CH_USE_NESTED_LOCKS */ -#define chSysUnlock() port_unlock() -#endif /* !CH_USE_NESTED_LOCKS */ /** * @brief Enters the kernel lock mode from within an interrupt handler. @@ -159,7 +153,10 @@ * * @special */ -#define chSysLockFromIsr() port_lock_from_isr() +#define chSysLockFromIsr() { \ + port_lock_from_isr(); \ + dbg_check_lock_from_isr(); \ +} /** * @brief Leaves the kernel lock mode from within an interrupt handler. @@ -174,14 +171,20 @@ * * @special */ -#define chSysUnlockFromIsr() port_unlock_from_isr() +#define chSysUnlockFromIsr() { \ + dbg_check_unlock_from_isr(); \ + port_unlock_from_isr(); \ +} /** * @brief IRQ handler enter code. * @note Usually IRQ handlers functions are also declared naked. * @note On some architectures this macro can be empty. */ -#define CH_IRQ_PROLOGUE() PORT_IRQ_PROLOGUE() +#define CH_IRQ_PROLOGUE() { \ + PORT_IRQ_PROLOGUE(); \ + dbg_check_enter_isr(); \ +} /** * @brief IRQ handler exit code. @@ -189,7 +192,10 @@ * @note This macro usually performs the final reschedule by using * @p chSchRescRequiredI() and @p chSchDoRescheduleI(). */ -#define CH_IRQ_EPILOGUE() PORT_IRQ_EPILOGUE() +#define CH_IRQ_EPILOGUE() { \ + dbg_check_leave_isr(); \ + PORT_IRQ_EPILOGUE(); \ +} /** * @brief Standard normal IRQ handler declaration. @@ -211,10 +217,6 @@ extern "C" { #endif void chSysInit(void); void chSysTimerHandlerI(void); -#if CH_USE_NESTED_LOCKS && !CH_OPTIMIZE_SPEED - void chSysLock(void); - void chSysUnlock(void); -#endif /* CH_USE_NESTED_LOCKS && !CH_OPTIMIZE_SPEED */ #ifdef __cplusplus } #endif diff --git a/os/kernel/include/chthreads.h b/os/kernel/include/chthreads.h index b02960bd4..a0a668df4 100644 --- a/os/kernel/include/chthreads.h +++ b/os/kernel/include/chthreads.h @@ -75,12 +75,6 @@ struct Thread { */ trefs_t p_refs; #endif -#if CH_USE_NESTED_LOCKS || defined(__DOXYGEN__) - /** - * @brief Number of nested locks. - */ - cnt_t p_locks; -#endif #if CH_DBG_THREADS_PROFILING || defined(__DOXYGEN__) /** * @brief Thread consumed time in ticks. diff --git a/os/kernel/src/chdebug.c b/os/kernel/src/chdebug.c index 0e378cc6d..28d4f7520 100644 --- a/os/kernel/src/chdebug.c +++ b/os/kernel/src/chdebug.c @@ -24,18 +24,161 @@ * * @addtogroup debug * @details Debug APIs and services: + * - Runtime system state and call protocol check. The following + * panic messages can be generated: + * - SV#1, misplaced @p chSysDisable(). + * - SV#2, misplaced @p chSysSuspend() + * - SV#3, misplaced @p chSysEnable(). + * - SV#4, misplaced @p chSysLock(). + * - SV#5, misplaced @p chSysUnlock(). + * - SV#6, misplaced @p chSysLockFromIsr(). + * - SV#7, misplaced @p chSysUnlockFromIsr(). + * - SV#8, misplaced @p CH_IRQ_PROLOGUE(). + * - SV#9, misplaced @p CH_IRQ_EPILOGUE(). + * . * - Trace buffer. * - Parameters check. * - Kernel assertions. + * - Kernel panics. * . - * @pre In order to use the debug APIs the @p CH_DBG_ENABLE_TRACE, - * @p CH_DBG_ENABLE_ASSERTS, @p CH_DBG_ENABLE_CHECKS options must - * be enabled in @p chconf.h. + * @note Stack checks are not implemented in this module but in the port + * layer in an architecture-dependent way. * @{ */ #include "ch.h" +/*===========================================================================*/ +/* System state checker related code and variables. */ +/*===========================================================================*/ + +#if CH_DBG_SYSTEM_STATE_CHECK || defined(__DOXYGEN__) + +/** + * @brief ISR nesting level. + */ +cnt_t dbg_isr_cnt; + +/** + * @brief Lock nesting level. + */ +cnt_t dbg_lock_cnt; + +/** + * @brief Guard code for @p chSysDisable(). + * + * @notapi + */ +void dbg_check_disable(void) { + + if ((dbg_isr_cnt != 0) || (dbg_lock_cnt != 0)) + chDbgPanic("SV#1"); +} + +/** + * @brief Guard code for @p chSysSuspend(). + * + * @notapi + */ +void dbg_check_suspend(void) { + + if ((dbg_isr_cnt != 0) || (dbg_lock_cnt != 0)) + chDbgPanic("SV#2"); +} + +/** + * @brief Guard code for @p chSysEnable(). + * + * @notapi + */ +void dbg_check_enable(void) { + + if ((dbg_isr_cnt != 0) || (dbg_lock_cnt != 0)) + chDbgPanic("SV#3"); +} + +/** + * @brief Guard code for @p chSysLock(). + * + * @notapi + */ +void dbg_check_lock(void) { + + if ((dbg_isr_cnt != 0) || (dbg_lock_cnt != 0)) + chDbgPanic("SV#4"); + dbg_lock_cnt = 1; +} + +/** + * @brief Guard code for @p chSysUnlock(). + * + * @notapi + */ +void dbg_check_unlock(void) { + + if ((dbg_isr_cnt != 0) || (dbg_lock_cnt <= 0)) + chDbgPanic("SV#5"); + dbg_lock_cnt = 0; +} + +/** + * @brief Guard code for @p chSysLockFromIsr(). + * + * @notapi + */ +void dbg_check_lock_from_isr(void) { + + if ((dbg_isr_cnt <= 0) || (dbg_lock_cnt != 0)) + chDbgPanic("SV#6"); + dbg_lock_cnt = 1; +} + +/** + * @brief Guard code for @p chSysUnlockFromIsr(). + * + * @notapi + */ +void dbg_check_unlock_from_isr(void) { + + if ((dbg_isr_cnt <= 0) || (dbg_lock_cnt <= 0)) + chDbgPanic("SV#7"); + dbg_lock_cnt = 0; +} + +/** + * @brief Guard code for @p CH_IRQ_PROLOGUE(). + * + * @notapi + */ +void dbg_check_enter_isr(void) { + + port_lock_from_isr(); + if (dbg_isr_cnt < 0) + chDbgPanic("SV#8"); + dbg_isr_cnt++; + port_unlock_from_isr(); +} + +/** + * @brief Guard code for @p CH_IRQ_EPILOGUE(). + * + * @notapi + */ +void dbg_check_leave_isr(void) { + + port_lock_from_isr(); + if (dbg_isr_cnt <= 0) + chDbgPanic("SV#9"); + dbg_isr_cnt--; + port_unlock_from_isr(); +} + +#endif /* CH_DBG_SYSTEM_STATE_CHECK */ + +/*===========================================================================*/ +/* Trace related code and variables. */ +/*===========================================================================*/ + #if CH_DBG_ENABLE_TRACE || defined(__DOXYGEN__) /** * @brief Public trace buffer. @@ -59,7 +202,7 @@ void _trace_init(void) { * * @notapi */ -void chDbgTrace(Thread *otp) { +void dbg_trace(Thread *otp) { dbg_trace_buffer.tb_ptr->se_time = chTimeNow(); dbg_trace_buffer.tb_ptr->se_tp = currp; @@ -71,13 +214,15 @@ void chDbgTrace(Thread *otp) { } #endif /* CH_DBG_ENABLE_TRACE */ -#if CH_DBG_ENABLE_ASSERTS || CH_DBG_ENABLE_CHECKS || \ - CH_DBG_ENABLE_STACK_CHECK || defined(__DOXYGEN__) +/*===========================================================================*/ +/* Panic related code and variables. */ +/*===========================================================================*/ + +#if CH_DBG_ENABLED || defined(__DOXYGEN__) /** * @brief Pointer to the panic message. * @details This pointer is meant to be accessed through the debugger, it is - * written once and then the system is halted. This variable can be - * set to @p NULL if the halt is caused by a stack overflow. + * written once and then the system is halted. */ char *dbg_panic_msg; @@ -91,6 +236,6 @@ void chDbgPanic(char *msg) { dbg_panic_msg = msg; chSysHalt(); } -#endif /* CH_DBG_ENABLE_ASSERTS || CH_DBG_ENABLE_CHECKS || CH_DBG_ENABLE_STACK_CHECK */ +#endif /* CH_DBG_ENABLED */ /** @} */ diff --git a/os/kernel/src/chmtx.c b/os/kernel/src/chmtx.c index df71d1cc6..21b92e388 100644 --- a/os/kernel/src/chmtx.c +++ b/os/kernel/src/chmtx.c @@ -157,6 +157,7 @@ void chMtxLockS(Mutex *mp) { #endif /* Re-enqueues tp with its new priority on the ready list.*/ chSchReadyI(dequeue(tp)); + break; } break; } diff --git a/os/kernel/src/chschd.c b/os/kernel/src/chschd.c index d41649b4c..e989f4039 100644 --- a/os/kernel/src/chschd.c +++ b/os/kernel/src/chschd.c @@ -113,7 +113,6 @@ void chSchGoSleepS(tstate_t newstate) { #endif setcurrp(fifo_remove(&rlist.r_queue)); currp->p_state = THD_STATE_CURRENT; - chDbgTrace(otp); chSysSwitchI(currp, otp); } #endif /* !defined(PORT_OPTIMIZED_GOSLEEPS) */ @@ -222,7 +221,6 @@ void chSchWakeupS(Thread *ntp, msg_t msg) { #endif setcurrp(ntp); ntp->p_state = THD_STATE_CURRENT; - chDbgTrace(otp); chSysSwitchI(ntp, otp); } } @@ -247,7 +245,6 @@ void chSchDoRescheduleI(void) { setcurrp(fifo_remove(&rlist.r_queue)); currp->p_state = THD_STATE_CURRENT; chSchReadyI(otp); - chDbgTrace(otp); chSysSwitchI(currp, otp); } #endif /* !defined(PORT_OPTIMIZED_DORESCHEDULEI) */ diff --git a/os/kernel/src/chsys.c b/os/kernel/src/chsys.c index 4c8cd708d..6c63e113f 100644 --- a/os/kernel/src/chsys.c +++ b/os/kernel/src/chsys.c @@ -98,6 +98,8 @@ void chSysInit(void) { setcurrp(_thread_init(&mainthread, NORMALPRIO)); currp->p_state = THD_STATE_CURRENT; #if CH_DBG_ENABLE_STACK_CHECK + /* This is a special case because the main thread Thread structure is not + adjacent to its stack area.*/ currp->p_stklimit = &__main_thread_stack_base__; #endif chSysEnable(); @@ -141,24 +143,4 @@ void chSysTimerHandlerI(void) { #endif } -#if CH_USE_NESTED_LOCKS && !CH_OPTIMIZE_SPEED -void chSysLock(void) { - - chDbgAssert(currp->p_locks >= 0, - "chSysLock(), #1", - "negative nesting counter"); - if (currp->p_locks++ == 0) - port_lock(); -} - -void chSysUnlock(void) { - - chDbgAssert(currp->p_locks > 0, - "chSysUnlock(), #1", - "non-positive nesting counter"); - if (--currp->p_locks == 0) - port_unlock(); -} -#endif /* CH_USE_NESTED_LOCKS && !CH_OPTIMIZE_SPEED */ - /** @} */ diff --git a/os/kernel/templates/chconf.h b/os/kernel/templates/chconf.h index c9c4c286a..6a365d96a 100644 --- a/os/kernel/templates/chconf.h +++ b/os/kernel/templates/chconf.h @@ -33,7 +33,10 @@ #define _CHCONF_H_ /*===========================================================================*/ -/* Kernel parameters. */ +/** + * @name Kernel parameters and options + * @{ + */ /*===========================================================================*/ /** @@ -60,21 +63,6 @@ #define CH_TIME_QUANTUM 20 #endif -/** - * @brief Nested locks. - * @details If enabled then the use of nested @p chSysLock() / @p chSysUnlock() - * operations is allowed.
- * For performance and code size reasons the recommended setting - * is to leave this option disabled.
- * You may use this option if you need to merge ChibiOS/RT with - * external libraries that require nested lock/unlock operations. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_USE_NESTED_LOCKS) || defined(__DOXYGEN__) -#define CH_USE_NESTED_LOCKS FALSE -#endif - /** * @brief Managed RAM size. * @details Size of the RAM area to be managed by the OS. If set to zero @@ -107,8 +95,13 @@ #define CH_NO_IDLE_THREAD FALSE #endif +/** @} */ + /*===========================================================================*/ -/* Performance options. */ +/** + * @name Performance options + * @{ + */ /*===========================================================================*/ /** @@ -123,8 +116,13 @@ #define CH_OPTIMIZE_SPEED TRUE #endif +/** @} */ + /*===========================================================================*/ -/* Subsystem options. */ +/** + * @name Subsystem options + * @{ + */ /*===========================================================================*/ /** @@ -346,10 +344,26 @@ #define CH_USE_DYNAMIC TRUE #endif +/** @} */ + /*===========================================================================*/ -/* Debug options. */ +/** + * @name Debug options + * @{ + */ /*===========================================================================*/ +/** + * @brief Debug option, system state check. + * @details If enabled the correct call protocol for system APIs is checked + * at runtime. + * + * @note The default is @p FALSE. + */ +#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) +#define CH_DBG_SYSTEM_STATE_CHECK FALSE +#endif + /** * @brief Debug option, parameters checks. * @details If enabled then the checks on the API functions input @@ -423,8 +437,13 @@ #define CH_DBG_THREADS_PROFILING TRUE #endif +/** @} */ + /*===========================================================================*/ -/* Kernel hooks. */ +/** + * @name Kernel hooks + * @{ + */ /*===========================================================================*/ /** @@ -495,6 +514,8 @@ } #endif +/** @} */ + /*===========================================================================*/ /* Port-specific settings (override port settings defaulted in chcore.h). */ /*===========================================================================*/ diff --git a/os/ports/GCC/ARMCMx/STM32F1xx/vectors.c b/os/ports/GCC/ARMCMx/STM32F1xx/vectors.c index d47eeb72e..43faa0ed0 100644 --- a/os/ports/GCC/ARMCMx/STM32F1xx/vectors.c +++ b/os/ports/GCC/ARMCMx/STM32F1xx/vectors.c @@ -25,6 +25,18 @@ * @defgroup ARMCMx_STM32F1xx_VECTORS STM32F1xx Interrupt Vectors * @ingroup ARMCMx_SPECIFIC * @details Interrupt vectors for the STM32F1xx family. + * One of the following macros must be defined on the + * compiler command line or in a file named board.h: + * - @p STM32F10X_LD + * - @p STM32F10X_LD_VL + * - @p STM32F10X_MD + * - @p STM32F10X_MD_VL + * - @p STM32F10X_HD + * - @p STM32F10X_XL + * - @p STM32F10X_CL + * . + * This is required in order to include a vectors table with + * the correct length for the specified STM32 model. * @{ */ diff --git a/os/ports/GCC/ARMCMx/chcore_v6m.c b/os/ports/GCC/ARMCMx/chcore_v6m.c index 2183a9ded..4ee3dca1a 100644 --- a/os/ports/GCC/ARMCMx/chcore_v6m.c +++ b/os/ports/GCC/ARMCMx/chcore_v6m.c @@ -90,8 +90,12 @@ __attribute__((naked)) #endif void _port_switch_from_isr(void) { + /* The calls to the debug functions are required in order to simulate the + correct call protocol from this peculiar code zone.*/ + dbg_check_lock(); if (chSchIsRescRequiredExI()) chSchDoRescheduleI(); + dbg_check_unlock(); #if CORTEX_ALTERNATE_SWITCH SCB_ICSR = ICSR_PENDSVSET; port_unlock(); @@ -176,7 +180,7 @@ void _port_irq_epilogue(regarm_t lr) { */ void _port_thread_start(void) { - port_unlock(); + chSysUnlock(); asm volatile ("mov r0, r5 \n\t" "blx r4 \n\t" "bl chThdExit"); diff --git a/os/ports/GCC/ARMCMx/chcore_v7m.c b/os/ports/GCC/ARMCMx/chcore_v7m.c index 39711ce79..5f9be6f4d 100644 --- a/os/ports/GCC/ARMCMx/chcore_v7m.c +++ b/os/ports/GCC/ARMCMx/chcore_v7m.c @@ -141,8 +141,12 @@ __attribute__((naked)) #endif void _port_switch_from_isr(void) { + /* The calls to the debug functions are required in order to simulate the + correct call protocol from this peculiar code zone.*/ + dbg_check_lock(); if (chSchIsRescRequiredExI()) chSchDoRescheduleI(); + dbg_check_unlock(); #if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) asm volatile ("svc #0"); #else /* CORTEX_SIMPLIFIED_PRIORITY */ @@ -183,7 +187,7 @@ void _port_switch(Thread *ntp, Thread *otp) { */ void _port_thread_start(void) { - port_unlock(); + chSysUnlock(); asm volatile ("mov r0, r5 \n\t" "blx r4 \n\t" "bl chThdExit"); diff --git a/os/ports/GCC/ARMCMx/crt0.c b/os/ports/GCC/ARMCMx/crt0.c index 6e4524fa9..e2cb2b3de 100644 --- a/os/ports/GCC/ARMCMx/crt0.c +++ b/os/ports/GCC/ARMCMx/crt0.c @@ -33,6 +33,15 @@ typedef void (*funcp_t)(void); typedef funcp_t * funcpp_t; +#define SYMVAL(sym) (uint32_t)(((uint8_t *)&(sym)) - ((uint8_t *)0)) + +/*===========================================================================*/ +/** + * @name Startup settings + * @{ + */ +/*===========================================================================*/ + /** * @brief Control special register initialization value. * @details The system is setup to run in privileged mode using the PSP @@ -84,7 +93,13 @@ typedef funcp_t * funcpp_t; #define CRT0_CALL_DESTRUCTORS TRUE #endif -#define SYMVAL(sym) (uint32_t)(((uint8_t *)&(sym)) - ((uint8_t *)0)) +/** @} */ + +/*===========================================================================*/ +/** + * @name Symbols from the scatter file + */ +/*===========================================================================*/ /** * @brief Main stack lower boundary. @@ -94,6 +109,7 @@ typedef funcp_t * funcpp_t; extern uint32_t __main_stack_base__; /** + * * @brief Main stack initial position. * @details This symbol must be exported by the linker script and represents * the main stack initial position. @@ -168,6 +184,8 @@ extern funcp_t __fini_array_start; */ extern funcp_t __fini_array_end; +/** @} */ + /** * @brief Application @p main() function. */ diff --git a/os/ports/GCC/ARMCMx/port.dox b/os/ports/GCC/ARMCMx/port.dox index 8f5efc9aa..13ab36d8a 100644 --- a/os/ports/GCC/ARMCMx/port.dox +++ b/os/ports/GCC/ARMCMx/port.dox @@ -126,19 +126,6 @@ * stack where all the interrupts and exceptions are processed. * - The threads are started in thread-privileged mode. * - Interrupt nesting and the other advanced core/NVIC features are supported. - * - When using an STM32 one of the following macros must be defined on the - * compiler command line or in a file named board.h: - * - @p STM32F10X_LD - * - @p STM32F10X_LD_VL - * - @p STM32F10X_MD - * - @p STM32F10X_MD_VL - * - @p STM32F10X_HD - * - @p STM32F10X_XL - * - @p STM32F10X_CL - * . - * This is required in order to include a vectors table with the correct - * length for the STM32 model, see the file - * ./os/ports/GCC/ARMCMx/STM32/vectors.c. * - The Cortex-Mx port is perfectly generic, support for more devices can be * easily added by adding a subdirectory under ./os/ports/GCC/ARMCMx * and giving it the name of the new device, then copy the files from another @@ -211,25 +198,27 @@ * @section ARMCMx_STARTUP_1 Startup Process * The startup process, as implemented, is the following: * -# Interrupts are masked globally. - * -# The two stacks are initialized by assigning them the sizes defined in the - * linker script (usually named @p ch.ld). Stack areas are allocated from - * the highest RAM location downward. + * -# The two stacks are initialized by assigning them the sizes defined in + * the linker script (also known as scatter file). * -# The CPU state is switched to Privileged and the PSP stack is used. * -# An early initialization routine @p __early_init() is invoked, if the * symbol is not defined then an empty default routine is executed * (weak symbol). * -# DATA and BSS segments are initialized. + * -# Constructors are invoked. * -# The @p main() function is invoked with no parameters. - * -# Should the @p main() function return a branch is performed to the weak - * symbol _main_exit_handler. The default code is an endless empty loop. + * -# Destructors are invoked. + * -# A branch is performed to the weak symbol @p _default_exit(). The + * default code is an endless empty loop. * . * @section ARMCMx_STARTUP_2 Expected linker symbols * The startup code starts at the symbol @p ResetHandler and expects the * following symbols to be defined in the linker script: * - @p __ram_end__ End of RAM. - * - @p __main_stack_size__ Exception stack size. - * - @p __process_stack_size__ Process stack size. This is the stack area used - * by the @p main() function. + * - @p __main_stack_base__ Main stack lower boundary. + * - @p __main_stack_end__ Main stack initial position. + * - @p __process_stack_base__ Process stack lower boundary. + * - @p __process_stack_end__ Process stack initial position. * - @p _textdata Address of the data segment source read only data. * - @p _data Start of the data segment. * - @p _edata End of the data segment end location. diff --git a/os/ports/GCC/PPC/SPC56x/ivor.s b/os/ports/GCC/PPC/SPC56x/ivor.s index 7f470d26a..660fab5ed 100644 --- a/os/ports/GCC/PPC/SPC56x/ivor.s +++ b/os/ports/GCC/PPC/SPC56x/ivor.s @@ -71,7 +71,7 @@ IVOR10: lis %r3, 0x0800 /* DIS bit mask. */ mtspr 336, %r3 /* TSR register. */ - /* System tick handler invokation.*/ + /* System tick handler invocation.*/ bl chSysTimerHandlerI bl chSchIsRescRequiredExI cmpli cr0, %r3, 0 -- cgit v1.2.3