NeorV32自定义section数组初始化值不符问题求助
NeorV32自定义内存段数组初始化值不符问题
问题概述
在NeorV32处理器的自定义地址空间段中声明数组后,打印时发现实际值与初始化值完全不符,已确认该内存区域具备可读写权限。
链接脚本配置
MEMORY块定义:
back (rwx): ORIGIN = 0xF0000000, LENGTH = 512K
SECTIONS块配置:
.background_section: ALIGN(4) { __background_start = .; KEEP(*(.background_section)) __background_end = .; } > back
C代码数组初始化
__attribute__((section(".background_section"))) uint32_t background[12] = { 0xBDEBDEBD,0xEBDEBDEB,0xDEBDEBDE, 0xBDEBDEBD,0xEBDEBDEB,0xDEBDEBDD, 0xBDEBDDBD,0xDBDDBCDA,0xCDACDACD, 0xBCDBCDBC,0xDBDDBDDB,0xDDBDDBDD};
(实际需处理122400个数据)
编译产物信息
.map文件内容
.background_section 0xf0000000 0x30 0xf0000000 __background_start = . *(.background_section) .background_section 0xf0000000 0x30 ./main.c.o 0xf0000000 background 0xf0000030 __background_end = .
段头信息
[ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] .text PROGBITS 00000000 001000 000ddc 00 AX 0 0 4 [ 2] .rodata PROGBITS 00000ddc 001ddc 000310 00 A 0 0 4 [ 3] .background_[...] PROGBITS f0000000 003000 000030 00 WA 0 0 4 [ 4] .data PROGBITS 80000000 003030 000000 00 WA 0 0 4 [ 5] .bss NOBITS 80000000 003000 000074 00 WA 0 0 4 [ 6] .heap PROGBITS 80000074 003030 000000 00 W 0 0 4 [ 7] .comment PROGBITS 00000000 003030 00000f 01 MS 0 0 1 [ 8] .riscv.attributes RISCV_ATTRIBUTE 00000000 00303f 000035 00 0 0 1 [ 9] .debug_aranges PROGBITS 00000000 003078 0001a0 00 0 0 8 [10] .debug_info PROGBITS 00000000 003218 002fe9 00 0 0 1 [11] .debug_abbrev PROGBITS 00000000 006201 00091d 00 0 0 1 [12] .debug_line PROGBITS 00000000 006b1e 002e0a 00 0 0 1 [13] .debug_frame PROGBITS 00000000 009928 0004c8 00 0 0 4 [14] .debug_str PROGBITS 00000000 009df0 002131 01 MS 0 0 1 [15] .debug_loclists PROGBITS 00000000 00bf21 000c3b 00 0 0 1 [16] .debug_rnglists PROGBITS 00000000 00cb5c 0001aa 00 0 0 1 [17] .debug_line_str PROGBITS 00000000 00cd06 0002b1 01 MS 0 0 1 [18] .symtab SYMTAB 00000000 00cfb8 0013f0 10 19 274 4 [19] .strtab STRTAB 00000000 00e3a8 00088e 00 0 0 1 [20] .shstrtab STRTAB 00000000 00ec36 0000e6 00 0 0 1
objdump -s -j .background_section输出
f0000010 ebbddeeb ddebbdde bdddebbd dabcdddb ................ f0000020 cddaaccd bccddbbc dbbddddb dddbbddd ................
解决思路
- 补充启动代码的自定义段初始化逻辑:默认RISC-V启动脚本仅会处理标准
.data段的Flash到RAM数据拷贝,自定义.background_section段需手动添加拷贝逻辑。从段头信息可知,该段在ELF文件中的偏移为003000,目标地址为0xf0000000,需在启动代码中添加对应的数据复制代码,将ELF中该段的内容同步到目标内存区域。 - 验证字节序匹配情况:NeorV32为小端架构,初始化的32位十六进制值会以小端格式存储(低字节在低地址)。打印时需确保按32位无符号整数读取,而非逐字节拼接,否则会出现值不符的情况。可对比objdump输出的字节序列与初始化值的小端形式,确认数据是否已正确存储。
- 确认内存读写有效性:通过手动向数组写入测试值再读取验证的方式,排除硬件内存区域不可用或MMU配置错误的问题。
- 排查编译器优化影响:给数组添加
volatile修饰(volatile uint32_t background[12]),防止编译器因优化忽略数组的初始化或读写操作,同时确保链接脚本中的KEEP指令生效。
内容的提问来源于stack exchange,提问作者etienne lattion
相关产品推荐
相关产品推荐

