硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2745|回复: 5
收起左侧

[MDK] 使用__attribute__ ((section (".SDRAM")))自定义段的变量怎样链接到ZI-data/bss

[复制链接]

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2021-12-13 00:01:10 | 显示全部楼层 |阅读模式
测试了两种方式都不能满足要求,详细如下:
方式一:
sct文件与变量定义分别如下:
下载 (1).png 下载 (2).png
变量并没有初值但编译后却放在RW-data而不是ZI-data,如下图
下载 (3).png
可此时生成的bin文件又是正常大小(几十K),但是下载到单片机并不能运行。

方式二:
在sct中直接指定文件,定义变量时不再使用attribute,可以得到正确的结果(ZI-data,下载能正常运行),但是这样如果较多文件用到需要逐个添加太繁琐,而且如果一个文件中只有部分变量需要指定段就不能满足了,还不如直接使用绝对地址自己管理。

下载 (4).png
下载 (5).png
6.png

怎样才能使用类似方式一的方法达到方式二的效果,还有就是方式一的变量为什么放到了RW-data,有人了解的话麻烦指点一下,万分感谢。



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2021-12-13 00:31:01 | 显示全部楼层
供参考:

像使用内部SRAM一样定义使用STM32H7的外部SDRAM,含MDK和IAR两版
https://www.armbbs.cn/forum.php? ... 8697&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2021-12-13 18:22:15 | 显示全部楼层
本帖最后由 yanglx2022 于 2021-12-13 20:39 编辑

谢谢硬汉,解决了
使用__attribute__时链接到ZI的话需要显式指出,对于AC5是定义变量时添加zero_init属性,AC6不支持此属性,而是要求段名以.bss开头,我使用的AC6,因此将方式一中的段名.SDRAM改为.bss.SDRAM即可,如下
sct:
  RW_IRAM3  0xC0000000 UNINIT 0x02000000  {  ; SDRAM 32MB   *(.bss.SDRAM)
  }
变量定义:
LX_NAND_FLASH nand_flash __attribute__ ((section (".bss.SDRAM"), aligned (4)));

参考:ARM: Uninialized Variables Get Initialized


回复

使用道具 举报

3

主题

1227

回帖

1236

积分

至尊会员

积分
1236
发表于 2021-12-13 22:24:15 | 显示全部楼层
  1. // Arm Compiler 5
  2. unsigned long NI_longVar __attribute__( ( section( "NoInit"),zero_init) ) ;

  3. // Arm Compiler 6
  4. unsigned long NI_longVar __attribute__( ( section( ".bss.NoInit")) ) ;
  5. //also modify one line of the scatterfile from:
  6. //        *(NoInit)
  7. //to:
  8. //        *(.bss.NoInit)
复制代码
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2021-12-14 12:29:37 | 显示全部楼层
谢谢morning_enr6U
这个刚解决就又遇到一个问题,使用的GCC编译器,需求是要同时在AXI_RAM上定义非0初值的data/RW段变量和0初值的bss/ZI段变量,我现在实现的ld链接文件如下(变量能正确分配到各自的段上,RW的初值正确但是ZI无法赋0初值)
  1. /* 自定义AXI_RAM段 */
  2.   .AXI_RAM (NOLOAD):   /* 设NOLOAD时.bss.AXI_RAM的变量才定义在bss段, 但这样就不能自动赋0初值了 */
  3.   {
  4.     *(.AXI_RAM)
  5.     *(.bss.AXI_RAM)
  6.   } > RAM_D1 AT> FLASH  /* 添加AT> FLASH设置LMA到FLASH */
复制代码
望指点迷津,谢谢!(ps 为什么问题描述里图片能显示但回帖图片显示不了??)


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2021-12-14 15:17:28 | 显示全部楼层
yanglx2022 发表于 2021-12-14 12:29
谢谢morning_enr6U
这个刚解决就又遇到一个问题,使用的GCC编译器,需求是要同时在AXI_RAM上定义非0初值的 ...

Embedded Studio的GCC比较简单和IAR设置方法一样。

CubeIDE的不清楚
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-13 19:04 , Processed in 0.236381 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表