[其他ST产品] 在联合中使用section属性

[复制链接]
 楼主| 石榴大王 发表于 2025-6-27 11:54 | 显示全部楼层 |阅读模式
在STM32 CubeIDE的项目中,我将一些存储区域分配到STM32H743ZITX_RAM.ld文件中定义的不同内存区域。

MEMORY{  DTCMRAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 128K  ITCMRAM    (xrw)    : ORIGIN = 0x00000000,   LENGTH = 64K  RAM_D1    (xrw)    : ORIGIN = 0x24000000,   LENGTH = 512K  RAM_D3    (xrw)    : ORIGIN = 0x38000000,   LENGTH = 64K  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 2048K} /* Sections */SECTIONS/* snip .. */  .myD3memory (NOLOAD):  {      . = ALIGN(4);     *(.myD3memory)    . = ALIGN(4);  } >RAM_D3/* etc .. */}
然后我可以在main()中使用它,如下所示:
uint16_t        buffer16[32768] __attribute__ ((section(".myD3memory")));
正Build Analyzer正确分配。但我想引用内存区域不是16位无符号短,而且是8位无符号字节,并尝试了以下方法:
union{    uint8_t        buffer8[65536] __attribute__ ((section(".myD3memory")));    uint16_t        buffer16[32768] __attribute__ ((section(".myD3memory")));}
产生错误:
../Core/Src/main.c: error: section attribute not allowed for 'buffer8'
uint8_t buffer8[65536] __attribute__ ((section(".myD3memory")));
../Core/Src/main.c: error: section attribute not allowed for 'buffer16'
uint16_t buffer16[32768] __attribute__ ((section(".myD3memory")));
请教如何解决

公羊子丹 发表于 2025-7-31 13:39 | 显示全部楼层
你这个错误是因为GCC不允许在union内部直接给成员变量加section属性。
周半梅 发表于 2025-7-31 13:40 | 显示全部楼层
正确做法是把section属性加在union变量本身,而不是union里的成员。
帛灿灿 发表于 2025-7-31 13:40 | 显示全部楼层
也就是说,声明写成 union { uint8_t buffer8[65536]; uint16_t buffer16[32768]; } myBuffer __attribute__((section(".myD3memory")));
童雨竹 发表于 2025-7-31 13:42 | 显示全部楼层
这样整个union变量myBuffer会被放到.myD3memory段,内部成员共享同一地址。
万图 发表于 2025-7-31 13:46 | 显示全部楼层
另外,注意对齐,确保内存地址对齐符合uint16_t访问要求。
Wordsworth 发表于 2025-7-31 13:49 | 显示全部楼层
你也可以用__packed__属性调整内存布局,但一般没必要,除非跨平台数据交换。
Bblythe 发表于 2025-7-31 13:49 | 显示全部楼层
链接脚本里已经定义了.myD3memory段,确保编译器和链接器都正确识别这个section。
Pulitzer 发表于 2025-7-31 14:00 | 显示全部楼层
你之前把section加在数组成员上,编译器无法处理,这就是报错的原因。
Uriah 发表于 2025-7-31 14:00 | 显示全部楼层
这个用法官方手册和GCC文档里都有介绍,建议查“section attribute on variables”部分。
Clyde011 发表于 2025-7-31 14:01 | 显示全部楼层
如果还有问题,可以试试分开定义两个变量,分别放section,再用指针或union引用。
和下土 发表于 2025-7-31 21:39 | 显示全部楼层
学习学习
和下土 发表于 2025-7-31 21:42 | 显示全部楼层
学习学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

40

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

40

主题

40

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部