使用"-mcode-region= 无 "我们可以 在链接器脚本中的每个段周围使用开始/结束标记来计算每个段的 CRC、以便在编译后处理步骤中进行计算。
msp430fr6043.ld 中的示例:
.lower.text : { . = ALIGN(2); __CRC_ADDR_FRAM_LOWER_TEXT_START = .; /* FRAM address for CRC-16 post-build calc and check */ *(.lower.text.* .lower.text) __CRC_ADDR_FRAM_LOWER_TEXT_END = .; /* FRAM address for CRC-16 post-build calc and check */ } > FRAM=0xff .upper.text : { . = ALIGN(2); __CRC_ADDR_FRAM_UPPER_TEXT_START = .; /* FRAM address for CRC-16 post-build calc and check */ *(.upper.text.* .upper.text) __CRC_ADDR_FRAM_UPPER_TEXT_END = .; /* FRAM address for CRC-16 post-build calc and check */ } > HIFRAM=0xff .text : { PROVIDE (_start = .); __CRC_ADDR_FRAM_TEXT_START = .; /* FRAM address for CRC-16 post-build calc and check */ . = ALIGN(2); KEEP (*(SORT(.crt_*))) . = ALIGN(2); KEEP (*(.lowtext)) . = ALIGN(2); *(.text .stub .text.* .gnu.linkonce.t.* .text:*) KEEP (*(.text.*personality*)) /* .gnu.warning sections are handled specially by elf32.em. */ *(.gnu.warning) *(.interp .hash .dynsym .dynstr .gnu.version*) PROVIDE (__etext = .); PROVIDE (_etext = .); PROVIDE (etext = .); . = ALIGN(2); KEEP (*(.init)) KEEP (*(.fini)) KEEP (*(.tm_clone_table)) __CRC_ADDR_FRAM_TEXT_END = .; /* FRAM address for CRC-16 post-build calc and check */ } > FRAM=0xff
然后、make 可以调用 msp430-elf-objdump 以找出这些标记、并使用 srec_cat 来计算 CRC 并将其注入到最终二进制中 (在专用存储器标头中)、这样做会按预期工作。
但是、在构建"-mcode-region=时、 任一 "结果包含由链接器放置在低或高 FRAM 中的.ober.text 段:
遗憾的是、所有这些.obery.text 段 都被放置在 指定的链接器脚本标记之外。 得到的映射文件示例:
.lower.text 0x000000000000fe16 0x18 0x000000000000fe16 . = ALIGN (0x2) 0x000000000000fe16 __CRC_ADDR_FRAM_LOWER_TEXT_START = . *(.lower.text.* .lower.text) 0x000000000000fe16 __CRC_ADDR_FRAM_LOWER_TEXT_END = . .either.text.some_function_1 0x000000000000fe16 0x10 out.nNvRL3.ltrans0.ltrans.o .either.text.__udivhi3 0x000000000000fe26 0x8 gcc/msp430-elf/9.3.1/large\libgcc.a(lib2divHI.o) 0x000000000000fe26 __mspabi_divu .upper.text 0x000000000001443c 0x1b70 0x000000000001443c . = ALIGN (0x2) 0x000000000001443c __CRC_ADDR_FRAM_UPPER_TEXT_START = . *(.upper.text.* .upper.text) 0x000000000001443c __CRC_ADDR_FRAM_UPPER_TEXT_END = . *() .either.text.some_function_2.constprop.0 0x000000000001443c 0x3a out.nNvRL3.ltrans0.ltrans.o *() .either.text.some_function_3.constprop.0 0x0000000000014476 0x5e out.nNvRL3.ltrans0.ltrans.o *() .either.text.some_function_4.constprop.0 0x00000000000144d4 0x10c out.nNvRL3.ltrans0.ltrans.o *() .either.text.some_function_5 0x00000000000145e0 0x10 out.nNvRL3.ltrans0.ltrans.o *() .either.text.some_function_6 0x00000000000145f0 0x44 out.nNvRL3.ltrans0.ltrans.o *() .either.text. ... etc *() .either.text.__mspabi_srll 0x0000000000015f10 0xe gcc/msp430-elf/9.3.1/large\libgcc.a(srli.o) 0x0000000000015f18 __mspabi_srll *() .either.text.memcpy 0x0000000000015f1e 0x20 msp430-elf/lib/large\libc.a(lib_a-memcpy.o) 0x0000000000015f1e memcpy *() .either.text.memmove 0x0000000000015f3e 0x54 msp430-elf/lib/large\libc.a(lib_a-memmove.o) 0x0000000000015f3e memmove *() .either.text.memset 0x0000000000015f92 0x1a msp430-elf/lib/large\libc.a(lib_a-memset.o) 0x0000000000015f92 memset .text 0x000000000000fe2e 0x14c 0x000000000000fe2e PROVIDE (_start = .) 0x000000000000fe2e __CRC_ADDR_FRAM_TEXT_START = . 0x000000000000fe2e . = ALIGN (0x2) *(SORT_BY_NAME(.crt_*)) .crt_0000start 0x000000000000fe2e 0x4 msp430-elf/lib/large/crt0.o 0x000000000000fe2e __crt0_start .crt_0100init_bss 0x000000000000fe32 0x10 msp430-elf/lib/large\libcrt.a(crt_bss.o) 0x000000000000fe32 __crt0_init_bss .crt_0300movedata 0x000000000000fe42 0x14 msp430-elf/lib/large\libcrt.a(crt_movedata.o) 0x000000000000fe42 __crt0_movedata .crt_0800call_main 0x000000000000fe56 0x6 msp430-elf/lib/large\libcrt.a(crt_main.o) 0x000000000000fe56 __crt0_call_main 0x000000000000fe5c . = ALIGN (0x2) *(.lowtext) .lowtext 0x000000000000fe5c 0x11e out.nNvRL3.ltrans0.ltrans.o 0x000000000000fe5c IRQ_comm 0x000000000000ff42 IRQ_timer 0x000000000000ff60 IRQ_UNMI 0x000000000000ff7a . = ALIGN (0x2) *(.text .stub .text.* .gnu.linkonce.t.* .text:*) *(.text.*personality*) *(.gnu.warning) *(.interp .hash .dynsym .dynstr .gnu.version*) [!provide] PROVIDE (__etext = .) [!provide] PROVIDE (_etext = .) [!provide] PROVIDE (etext = .) 0x000000000000ff7a . = ALIGN (0x2) *(.init) *(.fini) *(.tm_clone_table) 0x000000000000ff7a __CRC_ADDR_FRAM_TEXT_END = .
如上所示、所有.ther.text 都被放置在任何开始/结束配对标记之外。
是否有办法确定这些.obler.text 段的开头和结尾、以便也可对其计算 CRC?
谢谢 !