工具与软件:
您好!
我正在尝试为 F28388D 的固件更新构建自定义引导加载程序。
我已经实施了这一机制、似乎在特定条件下有效。
我的闪存被分成如下:
[选择逻辑]
[分区1]
[分区2]
[选择逻辑]放置在闪存入口点0x080000处。 它检查哪个分区是最新的并跳转到它的开头。
[Partition1]入口点以 codestartbranch.asm 开头。 该分区可以通过从 RAM 执行 FlashAPI 来刷写[Partition2]。
对称地、[Partition2]入口点以 codestartbranch.asm 开头。 该分区可以通过从 RAM 执行 FlashAPI 来刷写[Partition1]。
在更新过程结束时、系统将重新引导、[选择逻辑]将执行并跳转到最新的[分区]。
不幸的是、此流程的行为不符合预期。 当我使用调试器刷写[Partition1]时、我的代码按预期运行、并且我能够写入[Partition2]。 请注意、在这种情况下、尚未执行[选择逻辑]。
但是、如果让代码从[选择逻辑]开始、并在不刷写的情况下连接调试器、我可以看到我的代码行为没有预期的那样、我的应用程序只是运行怪异。 通过进一步调试、我注意到一些静态全局变量未初始化、即使已在我的代码中初始化、也会用0填充。
使用的链接器命令文件如下:(Partition1的链接器)
MEMORY
{
BOOT_RSVD : origin = 0x000002, length = 0x0001AF /* Part of M0, BOOT rom will use this for stack */
RAMLS0_2 : origin = 0x008000, length = 0x001800
RAMLS3 : origin = 0x009800, length = 0x000800
RAMGS0_4 : origin = 0x00D000, length = 0x005000
RAMGS10 : origin = 0x017000, length = 0x001000
RAMGS14 : origin = 0x01B000, length = 0x001000
PART1_HEADER : origin = 0x084000, length = 0x000100
FW_IMAGE_0 : origin = 0x084100, length = 0x003F00 /* on-chip Flash */
BEGIN : origin = 0x088000, length = 0x000100
FW_IMAGE_1 : origin = 0x088100, length = 0x01FF00 /* on-chip Flash */
CPU1TOCPU2RAM_0 : origin = 0x03A000, length = 0x000400
CPU2TOCPU1RAM_0 : origin = 0x03B000, length = 0x000400
CPUTOCMRAM_0 : origin = 0x039000, length = 0x000400
CMTOCPURAM_0 : origin = 0x038000, length = 0x000400
RESET : origin = 0x3FFFC0, length = 0x000002
}
SECTIONS
{
codestart : > BEGIN, ALIGN(8)
.text : >> FW_IMAGE_0 | FW_IMAGE_1, ALIGN(8)
.cinit : > FW_IMAGE_0 | FW_IMAGE_1, ALIGN(8)
.switch : > FW_IMAGE_0 | FW_IMAGE_1, ALIGN(8)
.reset : > RESET, TYPE = DSECT /* not used, */
.stack : > RAMGS0_4
#if defined(__TI_EABI__)
.init_array : > FW_IMAGE_0 | FW_IMAGE_1, ALIGN(8)
.bss : > RAMLS0_2
.bss:output : > RAMLS3
.bss:cio : > RAMLS0_2
.data : > RAMLS0_2
.sysmem : > RAMLS0_2
/* Initalized sections go in Flash */
.const : > FW_IMAGE_0 | FW_IMAGE_1, ALIGN(8)
#else
.pinit : > FW_IMAGE, ALIGN(8)
.ebss : > RAMLS0_1
.esysmem : > RAMLS0_1
.cio : > RAMLS0_1
/* Initalized sections go in Flash */
.econst : >> FW_IMAGE, ALIGN(8)
#endif
MSGRAM_CPU1_TO_CPU2 : > CPU1TOCPU2RAM_0, type=NOINIT
MSGRAM_CPU2_TO_CPU1 : > CPU2TOCPU1RAM_0, type=NOINIT
MSGRAM_CPU_TO_CM : > CPUTOCMRAM_0, type=NOINIT
MSGRAM_CM_TO_CPU : > CMTOCPURAM_0, type=NOINIT
GROUP
{
.TI.ramfunc
{
-l F2838x_C28x_FlashAPI.lib
}
} LOAD = FW_IMAGE_0,
RUN = RAMGS10,
LOAD_START(RamfuncsLoadStart),
LOAD_SIZE(RamfuncsLoadSize),
LOAD_END(RamfuncsLoadEnd),
RUN_START(RamfuncsRunStart),
RUN_SIZE(RamfuncsRunSize),
RUN_END(RamfuncsRunEnd),
ALIGN(8)
DataBufferSection : > RAMGS14, ALIGN(8)
}
通过查看生成的.map 文件、我可以看到.data 段已标记为未初始化。
.data 0 0000928e 0000024b UNINITIALIZED 0000928e 00000200 Codec.obj (.data:CRC32_TABLE) 0000948e 00000018 FW_updater.obj (.data) 000094a6 00000018 Sk.obj (.data:sk) 000094be 00000008 Codec.obj (.data:FRAME_HEADER_MAGIC_NUM) 000094c6 00000006 rts2800_fpu64_eabi.lib : exit.c.obj (.data) 000094cc 00000004 Codec.obj (.data:ENCODE_FRAME_HEADER_MAGIC_NUM) 000094d0 00000002 Main_Master_CPU1.obj (.data) 000094d2 00000002 SCIA.obj (.data) 000094d4 00000002 rts2800_fpu64_eabi.lib : _lock.c.obj (.data:_lock) 000094d6 00000002 : _lock.c.obj (.data:_unlock) 000094d8 00000001 HWConfig_cpu1.obj (.data)
在整法中、未初始化的变量是:
- 在我同时调试和闪存时正确初始化、从而出现正常行为
- 当代码从闪存入口点引导并在没有刷写的情况下调试时未初始化、从而导致异常行为。
通过查看其他论坛帖子、我可以看到这一点 -- abi=eabi. 选项对于构建和链接很重要。 此选项适用于我。
此外、链接器还使用--rom_model 选项。
我希望这一点很清楚、有人可以帮助我解决这个问题。
谢谢!
