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