本节介绍了如何利用编译器支持实现 LFU。
- LFU 支持所需的编译器版本为 21.6.0.LTS 或更高版本。
- 假设 BANK0_FLASH 构建配置是旧固件,则需要提供指向其输出可执行文件的路径,作为 BANK1_FLASH 构建配置的参考映像。这将允许编译器识别公用变量及其位置,以及识别新变量。这在 BANK1_FLASH 构建配置工程规格中按如下方式实现(对于 F28004x):
--lfu_reference_elf=${CWD}\..\BANK0_FLASH\buck_F28004x_lfu.out同样,对于 F28003x,--lfu_reference_elf=${CWD}\..\BANK0_FLASH\buck_F28003x_lfu.out
- 编译器为变量定义了 2 个新属性,分别称为 preserve 和 update。“Preserve”用于在固件升级期间维持公用变量的地址。“Update”用于指示编译器可以无约束地为其分配地址的新变量,还在 LFU 初始化例程 __TI_auto_init_warm() 期间进行初始化。下面列出了有关如何使用这些属性的示例:
float32_t __attribute__((preserve)) BUCK_update_test_variable1_cpu;
float32_t __attribute__((update)) BUCK_update_test_variable2_cpu; - 如果用户如上所述将 BANK0_FLASH 映像作为参考映像来编译 BANK1_FLASH 配置,则生成的 .map 文件将包含与“preserve”变量对应的 .TI.bound 段。此外,如果用户使用“update”属性指定变量(C28x 端或 CLA 端),则 .map 文件将包含单个 .TI.update 段(其中集合了所有“update”变量)。它们将不会放在 .bss 或 .data 或 .bss_cla 段中。用户需要在链接器命令文件中定义和分配 .TI.update 段。
- 为了让应用程序开发人员处理起来更轻松,可以使用不同的 LFU 模式。默认模式称为 preserve(不要与上述相应的变量属性混淆),在 BANK1_FLASH 构建配置工程规格中明确指定如下:
--lfu_default=preserve 此模式具有以下属性:
- 如果提供了参考(旧)映像,则不需要将公用变量指定为 preserve。这将是公用变量的默认属性,RTS 库将不会在 LFU 初始化例程中初始化它们。这有助于保持状态。
- 没有指定任何属性的任何新变量将会得到分配地址,但这些变量也不会在热启动 LFU 例程中初始化。如果用户希望 LFU 初始化例程初始化新变量,则需要使用 update 属性声明新变量。
- 本版本编译器支持的 LFU 模式的完整列表称为“none”和“preserve”。它们具有以下属性:
- none:默认情况下,不保留任何全局变量和静态变量地址,也不在热启动期间初始化任何变量。
- 如果明确指定了“preserve”属性,则保留变量的地址。
- 如果明确指定了“update”属性,则在热启动期间初始化变量的值。地址可以在内存中移动。
- preserve:保留在参考 ELF 中找到的所有全局变量和静态变量地址,除非为变量指定了“update”属性。
- 无需为公用变量指定“preserve”属性。如果为参考 ELF 中的变量明确指定了“preserve”属性,则其行为与未指定此属性时的行为相同。
- 如果明确指定了“update”属性,则在热启动期间初始化变量的值。否则,不会在热启动期间初始化。在这两种情况下,地址都可以在内存中移动。
- RTS 库提供了一个 LFU 初始化例程 (__TI_auto_init_warm())。它根据上述规则初始化任何新变量。
- 该例程执行 C28x CPU 端全局变量和静态变量的初始化,包括零初始化(默认)和非零初始化(如果指定了非零值)。
- 该例程只执行 CLA 端全局变量和静态变量的零初始化,不支持 CLA 端全局变量和静态变量的非零初始化。即使编译器不支持在启动 C 初始化例程中进行 CLA 端全局变量和静态变量的初始化(零或非零),它的确也支持在 __TI_auto_init_warm() 中进行零初始化。
- 如前所述,该例程不受 NOINIT pragma(应用于链接器命令文件中的一个或多个段)的影响。
有关更多信息,请参阅 TMS320C28x 优化 C/C++ 编译器用户指南的 LFU 部分。