From 46c0e6255e9d3013ce6308cd1fa494d6550fa80e Mon Sep 17 00:00:00 2001 From: gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> Date: Tue, 12 Aug 2014 16:05:36 +0000 Subject: Added chSysConditionalLock() and chSysConditionalUnlock() functions to RT and NIL. Improved debug documentation. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7166 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/rt/include/chsys.h | 34 ++++++++++++++++++++++++++++++---- os/rt/src/chdebug.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 4 deletions(-) (limited to 'os/rt') diff --git a/os/rt/include/chsys.h b/os/rt/include/chsys.h index bd2d0dffa..5b7355ade 100644 --- a/os/rt/include/chsys.h +++ b/os/rt/include/chsys.h @@ -291,7 +291,7 @@ static inline void chSysEnable(void) { } /** - * @brief Enters the kernel lock mode. + * @brief Enters the kernel lock state. * * @special */ @@ -303,7 +303,7 @@ static inline void chSysLock(void) { } /** - * @brief Leaves the kernel lock mode. + * @brief Leaves the kernel lock state. * * @special */ @@ -323,7 +323,7 @@ static inline void chSysUnlock(void) { } /** - * @brief Enters the kernel lock mode from within an interrupt handler. + * @brief Enters the kernel lock state from within an interrupt handler. * @note This API may do nothing on some architectures, it is required * because on ports that support preemptable interrupt handlers * it is required to raise the interrupt mask to the same level of @@ -342,7 +342,7 @@ static inline void chSysLockFromISR(void) { } /** - * @brief Leaves the kernel lock mode from within an interrupt handler. + * @brief Leaves the kernel lock state from within an interrupt handler. * * @note This API may do nothing on some architectures, it is required * because on ports that support preemptable interrupt handlers @@ -361,6 +361,32 @@ static inline void chSysUnlockFromISR(void) { port_unlock_from_isr(); } +/** + * @brief Conditionally enters the kernel lock state. + * @note Can be called without previous knowledge of the current lock state. + * The final state is "s-locked". + * + * @special + */ +static inline void chSysConditionalLock(void) { + + if (port_irq_enabled(port_get_irq_status())) + chSysLock(); +} + +/** + * @brief Conditionally leaves the kernel lock state. + * @note Can be called without previous knowledge of the current lock state. + * The final state is "normal". + * + * @special + */ +static inline void chSysConditionalUnlock(void) { + + if (!port_irq_enabled(port_get_irq_status())) + chSysUnlock(); +} + #endif /* _CHSYS_H_ */ /** @} */ diff --git a/os/rt/src/chdebug.c b/os/rt/src/chdebug.c index c18788454..d1b792921 100644 --- a/os/rt/src/chdebug.c +++ b/os/rt/src/chdebug.c @@ -27,16 +27,48 @@ * - Runtime system state and call protocol check. The following * panic messages can be generated: * - SV#1, misplaced @p chSysDisable(). + * - Called from an ISR. + * - Called from a critical zone. + * . * - SV#2, misplaced @p chSysSuspend() + * - Called from an ISR. + * - Called from a critical zone. + * . * - SV#3, misplaced @p chSysEnable(). + * - Called from an ISR. + * - Called from a critical zone. + * . * - SV#4, misplaced @p chSysLock(). + * - Called from an ISR. + * - Called from a critical zone. + * . * - SV#5, misplaced @p chSysUnlock(). + * - Called from an ISR. + * - Not called from a critical zone. + * . * - SV#6, misplaced @p chSysLockFromIsr(). + * - Not called from an ISR. + * - Called from a critical zone. + * . * - SV#7, misplaced @p chSysUnlockFromIsr(). + * - Not called from an ISR. + * - Not called from a critical zone. + * . * - SV#8, misplaced @p CH_IRQ_PROLOGUE(). + * - Not called at ISR begin. + * - Called from a critical zone. + * . * - SV#9, misplaced @p CH_IRQ_EPILOGUE(). + * - @p CH_IRQ_PROLOGUE() missing. + * - Not called at ISR end. + * - Called from a critical zone. + * . * - SV#10, misplaced I-class function. + * - I-class function not called from within a critical zone. + * . * - SV#11, misplaced S-class function. + * - S-class function not called from within a critical zone. + * - Called from an ISR. * . * - Trace buffer. * - Parameters check. -- cgit v1.2.3