SPMU373A March   2021  – August 2022 TM4C1230C3PM , TM4C1230D5PM , TM4C1230E6PM , TM4C1230H6PM , TM4C1231C3PM , TM4C1231D5PM , TM4C1231D5PZ , TM4C1231E6PM , TM4C1231E6PZ , TM4C1231H6PGE , TM4C1231H6PM , TM4C1231H6PZ , TM4C1232C3PM , TM4C1232D5PM , TM4C1232E6PM , TM4C1232H6PM , TM4C1233C3PM , TM4C1233D5PM , TM4C1233D5PZ , TM4C1233E6PM , TM4C1233E6PZ , TM4C1233H6PGE , TM4C1233H6PM , TM4C1233H6PZ , TM4C1236D5PM , TM4C1236E6PM , TM4C1236H6PM , TM4C1237D5PM , TM4C1237D5PZ , TM4C1237E6PM , TM4C1237E6PZ , TM4C1237H6PGE , TM4C1237H6PM , TM4C1237H6PZ , TM4C123AE6PM , TM4C123AH6PM , TM4C123BE6PM , TM4C123BE6PZ , TM4C123BH6PGE , TM4C123BH6PM , TM4C123BH6PZ , TM4C123FE6PM , TM4C123FH6PM , TM4C123GE6PM , TM4C123GE6PZ , TM4C123GH6PGE , TM4C123GH6PM , TM4C123GH6PZ , TM4C123GH6ZXR , TM4C1290NCPDT , TM4C1290NCZAD , TM4C1292NCPDT , TM4C1292NCZAD , TM4C1294KCPDT , TM4C1294NCPDT , TM4C1294NCZAD , TM4C1297NCZAD , TM4C1299KCZAD , TM4C1299NCZAD , TM4C129CNCPDT , TM4C129CNCZAD , TM4C129DNCPDT , TM4C129DNCZAD , TM4C129EKCPDT , TM4C129ENCPDT , TM4C129ENCZAD , TM4C129LNCZAD , TM4C129XKCZAD , TM4C129XNCZAD

 

  1.   Read This First
    1.     About This Manual
    2.     Glossary
    3.     Related Documentation From Texas Instruments
    4.     Support Resources
    5.     Trademarks
  2. 1Introduction to TivaWare SDK
    1. 1.1 TivaWare SDK Folder Breakdown
  3. 2TivaWare Example Projects
    1. 2.1 TivaWare Development Board Examples
    2. 2.2 TivaWare Peripheral Examples
    3. 2.3 How to Import an Example Project into CCS
  4. 3Linking Files and Libraries into a TivaWare Project in Code Composer Studio
    1. 3.1 Linking Files in CCS
    2. 3.2 Linking Libraries in CCS
  5. 4How to Debug a TivaWare Library
    1. 4.1 How to Direct Code Composer Studio to a Source File
    2. 4.2 How to Rebuild TivaWare Libraries
  6. 5How to Add TivaWare to an Existing CCS Project
    1. 5.1 Path Variables
    2. 5.2 Include Paths
    3. 5.3 Predefined Variables
    4. 5.4 Library Linking
  7. 6TivaWare Boot Loader
    1. 6.1 Modifying a TivaWare Project for Boot Loading in Code Composer Studio
    2. 6.2 How to Boot Load with LM Flash Programmer
  8. 7Software Best Practices
    1. 7.1 Stack / Heap Settings and Stack Overflow
    2. 7.2 Interrupt Service Routines
      1. 7.2.1 Best Practices
      2. 7.2.2 TivaWare Vector Tables and IntDefaultHandler
    3. 7.3 TivaWare Hardware Header Files
    4. 7.4 ROM and MAP TivaWare Prefixes
  9. 8TM4C Resources
  10. 9Revision History

Best Practices

As the name implies, an Interrupt Service Routine will interrupt what a program is currently doing in order to execute the code within the routine. In the simplest of programs that behavior is generally harmless regardless of how an ISR is written, but as the size and scope of the program increases it becomes increasingly important to write efficient ISR’s in order to minimize the amount of time that typical program execution is being interrupted.

ISR’s are best used to quickly receive and store or fetch and send data, and/or reflect a change in state for the rest of the program. When receiving or sending data, the goal should be to process data from the hardware peripheral that triggers the ISR only and use flags or changes in state to inform the primary program application that data has been processed in order for the main program to control what is done with that data outside of the ISR.

On the topic of flags and best practices, when using global variables inside of an ISR to act as flag, counter, or any other variable that will be modified inside of the ISR, the global variable must be declared as a volatile variable. If the volatile keyword is not used, the compiler may determine the variable is not being used inside of an ISR and optimize it out of the ISR. This would prevent the variable from being modified when the ISR executes and the program will not run as intended. A missing volatile declaration for a global variable is one of the most common programming errors when using interrupts and should always be part of a code review checklist.

Key common mistakes that cause issues with ISR’s include: doing data crunching within an ISR, running loops in an ISR that prevent it from quickly exiting, or sending data with blocking commands such as UARTprintf where the ISR cannot exit until the data is transmitted properly. Each of these impede the ISR from quickly executing and cause latency that can impact system performance, and in each case, these should be handled within the main program execution instead.

If a system is experiencing unexpected behaviors and there is suspicion a slow ISR may be to blame, there is a simplistic method to measure the duration of ISR’s using an oscilloscope. Toggling a GPIO at the entry and exit of an ISR will allow for a measurement of how much time passes each time the ISR executes. If the ISR has multiple branches, additional GPIO can be added to help shed light on which branch is executing.