ULP Advisor > Rule 2.1 Leverage timer module for delay loops

ULPAdvisorBanner.PNG

ULP Advisor - Rule Table

ULP 1.1 Ensure LPM usage
ULP 2.1 Leverage timer module for delay loops
ULP 3.1 Use ISRs instead of flag polling
ULP 4.1 Terminate unused GPIOs
ULP 5.1 Avoid processing-intensive operations: modulo, divide.
ULP 5.2 Avoid processing-intensive operations: floating point
ULP 5.3 Avoid processing-intensive operations: (s)printf()
ULP 6.1 Avoid multiplication on devices without hardware multiplier
ULP 6.2 Use MATHLIB for complex math operations
ULP 6.3 Use Low Energy Accelerator (LEA) software library
ULP 7.1 Use local instead of global variables where possible
ULP 8.1 Use 'static' & 'const' modifiers for local variables
ULP 9.1 Use pass by reference for large variables
ULP 10.1 Minimize function calls from within ISRs
ULP 11.1 Use lower bits for loop program control flow
ULP 11.2 Use lower bits for port bit-banging
ULP 12.1 Use DMA for large memcpy() calls
ULP 12.1b Use DMA for potentially large memcpy() calls
ULP 12.2 Use DMA for repetitive transfer
ULP 13.1 Count down in loops
ULP 14.1 Use unsigned variables for indexing
ULP 15.1 Use bit-masks instead of bit-fields

Let us know what you think! Feedback, suggestions & comments
are welcome @ ULPAdvisorFeedback@list.ti.com

What it means

The MSP430 offers various types of timers & clocks that can be configured to function without CPU intervention. When a delay is required, one of the timer peripherals can be leveraged to generate such delay without the CPU staying active. This method significantly reduces the power consumption of the device. These timers can enable the MSP430 microcontroller to stay in a Low Power Mode until the timer wakes up the CPU.

Risks, Severity

In a microcontroller, the CPU is the largest contributor to the overall power consumption. When an application executes a delay, if the CPU stays in active mode, a significant amount of power and energy is wasted.

Why it is happening

This remark is issued when a delay is found in any code file in the project.
Check your code for a loop that only contains either of the lines below, without any other code:

 __no_operation();
 _NOP();
  

Any empty loops. For example:

 volatile int i = MAX_VALUE;
 while (i-- > 0);
  

Any occurrences of this:

 __delay_cycles(NUMBER_OF_CYCLES);

Remedy

Code Example

 //******************************************************************************
 //  MSP430G2xx3 Demo - Timer_A, Toggle P1.0, CCR0 Cont. Mode ISR, DCO SMCLK
 //
 //  Description: Toggle P1.0 using software and TA_0 ISR. Toggles every
 //  50000 SMCLK cycles. SMCLK provides clock source for TACLK.
 //  During the TA_0 ISR, P1.0 is toggled and 50000 clock cycles are added to
 //  CCR0. TA_0 ISR is triggered every 50000 cycles. CPU is normally off and
 //  used only during TA_ISR.
 //  ACLK = n/a, MCLK = SMCLK = TACLK = default DCO
 //
 //           MSP430G2xx3
 //         ---------------
 //     /|\|            XIN|-
 //      | |               |
 //      --|RST        XOUT|-
 //        |               |
 //        |           P1.0|-->LED
 //
 //  D. Dang
 //  Texas Instruments Inc.
 //  December 2010
 //   Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
 //******************************************************************************
 
 #include <msp430g2553.h>
 
 void main(void)
 {
   WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
   P1DIR |= 0x01;                            // P1.0 output
   CCTL0 = CCIE;                             // CCR0 interrupt enabled
   CCR0 = 50000;
   TACTL = TASSEL_2 + MC_2;                  // SMCLK, contmode
 
   _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt
 }
 
 // Timer A0 interrupt service routine
 #pragma vector=TIMER0_A0_VECTOR
 __interrupt void Timer_A (void)
 {
   P1OUT ^= 0x01;                            // Toggle P1.0
   CCR0 += 50000;                            // Add Offset to CCR0
 }
 

See the rest of the code examples for all MSP430 devices here!

More Resources

Want to squeeze a few more nanoAmps out of your application? Leverage the e2e (Engineer-to-Engineer) online community to get all of your ULP questions answered! Or, if you are an Ultra-Low Power pro, give back to the community with your expertise.

Go to MSP430's e2e online forum! 

If you are posting on the forums in relation to this rule, try using the tag "ULP_2.1"

E2e.jpg For technical support please post your questions at http://e2e.ti.com. Please post only comments about the article Compiler/diagnostic messages/MSP430/1527 here.