[En-Nut-Discussion] Set Idle Heartbeat on entry and reset on leave of idle function

Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
Thu Apr 29 12:46:51 CEST 2010


Hello,

at present, in arch/avr/os/nutinit.c the idle heartbeat function toggles the
heartbeat bit once in the idle function. That way, you can't see, how long
the CPU stays idle.

Appended patch clears the heartbeart bit on idle-entry and sets on
idle-leave. That way, you can see on the scope how long the CPU is idle.
It also saves a byte on the stack and probably doesn't increas cycle usage.

-- 
Uwe Bonnes                bon at elektron.ikp.physik.tu-darmstadt.de

Institut fuer Kernphysik  Schlossgartenstrasse 9  64289 Darmstadt
--------- Tel. 06151 162516 -------- Fax. 06151 164321 ----------
Index: conf/os/os.nut
===================================================================
Index: arch/avr/os/nutinit.c
===================================================================
--- arch/avr/os/nutinit.c	(Revision 2181)
+++ arch/avr/os/nutinit.c	(Arbeitskopie)
@@ -473,9 +473,6 @@
 #if defined(__GNUC__) && defined(__AVR_ENHANCED__)
     uint8_t sleep_mode;
 #endif
-#ifdef IDLE_HEARTBEAT_BIT
-    uint8_t beat = 0;
-#endif
 
     /* Initialize system timers. */
     NutTimerInit();
@@ -494,16 +491,6 @@
         NutThreadYield();
         NutThreadDestroy();
 
-#ifdef IDLE_HEARTBEAT_BIT
-        if ((beat = !beat) == 0) {
-            //UDR = '*';
-            cbi(IDLE_HEARTBEAT_PORT, IDLE_HEARTBEAT_BIT);
-        }
-        else {
-            sbi(IDLE_HEARTBEAT_PORT, IDLE_HEARTBEAT_BIT);
-        }
-        sbi(IDLE_HEARTBEAT_DDR, IDLE_HEARTBEAT_BIT);
-#endif
 
 #if defined(__GNUC__) && defined(__AVR_ENHANCED__)
         if (idle_sleep_mode != SLEEP_MODE_NONE) {
@@ -517,11 +504,17 @@
             uint8_t bitkeeper = bit_is_set(XMCRB, XMBK);
             cbi(XMCRB, XMBK); // disable buskeeper
 #endif
-            /* Note:  avr-libc has a sleep_mode() function, but it's broken for
+#ifdef IDLE_HEARTBEAT_BIT
+            cbi(IDLE_HEARTBEAT_PORT, IDLE_HEARTBEAT_BIT);
+#endif
+             /* Note:  avr-libc has a sleep_mode() function, but it's broken for
             AT90CAN128 with avr-libc version earlier than 1.2 */
             AVR_SLEEP_CTRL_REG |= _BV(SE);
             __asm__ __volatile__ ("sleep" "\n\t" :: );
             AVR_SLEEP_CTRL_REG &= ~_BV(SE);
+#ifdef IDLE_HEARTBEAT_BIT
+            sbi(IDLE_HEARTBEAT_PORT, IDLE_HEARTBEAT_BIT);
+#endif
 #ifdef IDLE_THREAD_ADC_OFF
             if (bitkeeper) {
                 sbi(XMCRB, XMBK); // re-enable buskeeper



More information about the En-Nut-Discussion mailing list