SPRUIU9B August   2020  – September 2022 TMS320F280033 , TMS320F280034 , TMS320F280034-Q1 , TMS320F280036-Q1 , TMS320F280036C-Q1 , TMS320F280037 , TMS320F280037-Q1 , TMS320F280037C , TMS320F280037C-Q1 , TMS320F280038-Q1 , TMS320F280038C-Q1 , TMS320F280039 , TMS320F280039-Q1 , TMS320F280039C , TMS320F280039C-Q1 , TMS320F280040-Q1 , TMS320F280040C-Q1 , TMS320F280041 , TMS320F280041-Q1 , TMS320F280041C , TMS320F280041C-Q1 , TMS320F280045 , TMS320F280048-Q1 , TMS320F280048C-Q1 , TMS320F280049 , TMS320F280049-Q1 , TMS320F280049C , TMS320F280049C-Q1 , TMS320F28P550SJ , TMS320F28P559SJ-Q1

 

  1.   Live Firmware Update Without Device Reset on C2000 MCUs
  2.   Trademarks
  3. 1Introduction
  4. 2Key Innovations
  5. 3Building Blocks for LFU
  6. 4Details of Proposed Solution
    1. 4.1 Flash Bank Organization
    2. 4.2 LFU Concepts and Factors Impacting Performance
    3. 4.3 Hardware Support for LFU
      1. 4.3.1 Multiple Flash Banks
      2. 4.3.2 Interrupt Vector Table Swap
      3. 4.3.3 RAM Block Swap
      4. 4.3.4 Hardware Register Flags
    4. 4.4 LFU Compiler Support
    5. 4.5 Application LFU Flow
  7. 5Results and Conclusion
  8. 6Revision History

LFU Compiler Support

The Compiler provides the following support for LFU:

  1. LFU Initialization routine, named __TI_auto_init_warm
  2. LFU attributes for variables
  3. LFU modes

The Compiler requires the old firmware executable to be provided as a reference image while building the new firmware executable. This allows the compiler to identify common variables and their locations, and also identify new variables and deleted variables.

The compiler defines two new LFU attributes for variables, called preserve and update. “Preserve” is used to maintain the addresses of common variables between firmware versions. “Update” is used to indicate new variables that the compiler can assign addresses without constraints and also initialize during the Compiler’s LFU initialization routine, named __TI_auto_init_warm(). Examples of how these attributes can be used are listed below:

float32_t __attribute__((preserve)) BUCK_update_test_variable1_cpu;

float32_t __attribute__((update)) BUCK_update_test_variable2_cpu;

With the above assignments, the generated memory map file contains “.TI.bound” sections corresponding to the preserve variables and a single “.TI.update” section where all the update variables are collected into.

To make things easier for the application developer, different LFU modes are available. The default mode is called preserve (not to be confused with the corresponding variable attribute described above), which has the following properties:

  • With a reference (old) image provided, common variables do not even need to be specified as preserve. This will be the default attribute for common variables, and they are not initialized in the Compiler’s LFU initialization routine. Hence, it maintains the state.
  • Any new variables that do not have any attributes specified are assigned addresses, but these variables are not initialized in the Compiler’s LFU initialization routine. The Compiler’s LFU initialization routine initializes variables only when declared with the update attribute.