ULP Advisor > Rule 11.2 Use lower bits for port bit-banging

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 microcontroller CPU architecture provides a constant generator that can generate constants for the most commonly used bits: -1, 0, 1, 2, 4, and 8 (1, 2, 4, 8 are the lower 4 bits in a byte). These constants are directly available for instructions that require access/compare against the aforementioned values. On the other hand, access/compare with other values requires additional cycles for the instruction. Hence, it is best to leverage these constants in the application code whenever possible. The benefit becomes more visible when the access/comparison is repeated in a loop structure. One of the most common use-cases is bit-banging control/data via one or more port pins repeatedly to control or transfer data externally. If the hardware design allows for flexible placement of the port pins, it is recommended to place the most commonly used pins on the lower 4 bits of the port to leverage the constant generator.

Risks, Severity

Using a regular bit/value instead of the lower 4 bits for program flow control can add additional clock cycle for each comparison instruction. In a loop structure, the additional cycles executed can add up depending on the number of iterations the program has to go through.

Why it is happening

The code contains at least one loop containing one or more port pin bit-banging operation that does not use one of the pins of the 4 lower bits (1, 2, 4, 8 or BIT0, BIT1, BIT2, BIT3)

Remedy

If hardware design can be flexible & replacement of device pin-out is possible, change the bit-banging pins to be the lower 4 bits of the port; change the software code accordingly.

Code Example

void main(void) 
{ 
  unsigned int i, variable=FLAG_1;
  P1DIR |= BIT2;                   // Use P1.2 for bit-banging, change direction to output
  P1DIR &= ~BIT2;                  // Reset pin P1.2
  for (i=0;i < 1000;i++)
  {
     /* Execute application code */
     P1DIR ^= BIT2;                // Toggle port pin P1.2, leverage BIT2 constant generator
  }
} 

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_11.2"

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/1540 here.