ULP Advisor > Rule 10.1 Minimize function calls from within ISRs

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

In an embedded system, and specifically the MSP430 microcontrollers, the usage of interrupts is key to obtain real-time and low-power performance. It is highly recommended to develop an interrupt-driven system to service external and peripheral events during main application runtime. Additionally, servicing the interrupts should be executed in a short and timely manner to improve real-time response of the system. Hence interrupt service routines should be kept to execute a minimal amount of instructions, allowing the CPU to quickly return to sleep or its previous task. Most of the processing should take place in the main application in active mode. Consequently, function calls within an interrupt service routine should be avoided to prevent considerable amount of additional code execution from being introduced (i.e. on entry: storing the current PC, stack, and CPU state, loading the function and preparing for its own stack; on exit: restoring the stack and the CPU state before going back to continue executing code in the original ISR).

Risks, Severity

Invoking function calls within an Interrupt Service Routine (ISR) significantly adds instruction execution cycles to the ISR. This time might increase depending on the number of parameters being passed, and whether they are passed by value or reference.

Why it is happening

An interrupt service routine (ISR) in the code project issues/invokes a function call.

Remedy

Instead of calling functions in the ISR, try to inline the instructions, i.e. move the code instructions directly into the ISR, or move the entire function call out of the ISR if possible (especially for processing intensive functions). For the latter option, a global flag can be setup to notify the main program to invoke the function call when the device is out of the ISR and back in active mode.

Alternatively, if the procedure must be executed within the ISR context, use macros or inline the function to minimize context switching sequences.

Code Example

 unsigned char interrupt_triggered = 0;
 void xxx_ServiceFunction(xxx_param);
 
 #pragma vector=xxx_VECTOR
__interrupt void xxx_ISR(void) 
{ 
   interrupt_triggered = 1;  
 _BIC_SR_IRQ(LPM3_bits);                 // Clear LPM3 bits from 0(SR), go back to Active Mode
}
 
 void main(void)
 {
   while(1)
   {
     /* go to low power mode, wait for xxx interrupt */
     if (interrupt_triggered)
       xxx_ServiceFunction(xxx_param);
   }
 }


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_10.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/1538 here.