硬汉嵌入式论坛

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

[MDK] 分享MDK 下的位置定义,和字节对齐申请,变量不初始化方法

  [复制链接]

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2019-2-15 11:45:13 | 显示全部楼层 |阅读模式
本帖最后由 在水一方 于 2019-2-15 12:09 编辑

1.变量位置定义及字节对齐
位置定义例如芯片有多个SRAM区,想把数据定义在不同的位置需要修改sct连接文件,添加相应的region

AC5编译器:
{
我这里添加了 RW_IRAM2
RW_IRAM2 0x10000000 UNINIT 0x00004000  {
   *(NoInit)
  }

这里使用宏定义的方式 定义了AT_SRAM2_SECTOR功能函数用来把 var 变量 放入 NoInit这个扇区中
#define AT_SRAM2_SECTOR(var) __attribute__((section("NoInit"), zero_init)) var
例:AT_SRAM2_SECTOR(uint8_t aaa);

AT_SRAM2_SECTOR_ALIGN 这个宏定义用来定义一些需要对齐的变量
#define AT_SRAM2_SECTOR_ALIGN(var, aligntype) __attribute__((section("NoInit"), zero_init)) __align(sizeof(aligntype)) var
例:AT_SRAM2_SECTOR_ALIGN(uint8_t bbb,uint8_t);

这里使用了sizeof的方法 也可以使用
#define AT_SRAM2_SECTOR_ALIGN(var, alignbytes) __attribute__((section("NoInit"), zero_init)) __align(sizeof(alignbytes)) var
例:AT_SRAM2_SECTOR_ALIGN(uint8_t bbb,4); 这种方式进行字节对齐

当然不修改SCT直接用位置定义也是可以的
例如 : #define AT_SRAM2_SECTOR(var) __attribute__((at(0x10000000), zero_init)) var
}

AC6编译器:
{
我这里添加了 RW_IRAM2
  RW_IRAM2 0x10000000 UNINIT 0x00004000  {
   *(.bss.NoInit)
  }

这里使用宏定义的方式 定义了AT_SRAM2_SECTOR功能函数用来把 var 变量 放入 .bss.NoInit这个扇区中
#define AT_SRAM2_SECTOR(var) __attribute__((section(".bss.NoInit"))) var
#define AT_SRAM2_SECTOR_ALIGN(var,alignbytes) __attribute__((section(".bss.NoInit"))) var __attribute__((aligned(alignbytes)))
例:
AT_SRAM2_SECTOR(uint8_t aaa);
AT_SRAM2_SECTOR_ALIGN(uint8_t bbb,4);

}

2.变量不初始化定义
在一些工作中需要用到一些变量,除了上电之外的重启,需要保持数据的不变性,就需要在系统启动的时候对这些变量不进行初始化 0 操作。例如:我使用L431做低功耗产品在休眠的时候可以选择PWR_STANDBY_RTC 这种低功耗模式,但是只有SRAM2区域的数据可以保存,但是只有16K大小,所以我把重要的数据放在SRAM2内,一些不重要的数据放在默认SRAM1即可。
第一步需要在SCT文件中相应的 region  例如:  RW_IRAM2 0x10000000 UNINIT 0x00004000 ,添加UNINIT 这特殊命令
但是在AC5编译器中还需要,zero_init关键字修饰才能保证数据不被 初始化 0 操作。
而AC6则需要稍微修改一下 具体见 http://www.keil.com/support/docs/3480.htm KEIL的官网说明,有详细讲解





AC5 SCT文件

AC5 SCT文件

AC5 位置定义

AC5 位置定义

AC6 SCT文件

AC6 SCT文件

AC6 位置定义

AC6 位置定义

评分

参与人数 1金币 +50 收起 理由
eric2013 + 50 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2019-2-15 11:50:38 | 显示全部楼层
是不是就是这个:

像使用内部SRAM一样定义使用SDRAM和CCM RAM,可以随意定义到指定的RAM区域且无需具体地址
http://www.armbbs.cn/forum.php?m ... 9275&fromuid=58
回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
 楼主| 发表于 2019-2-15 11:54:43 | 显示全部楼层
本帖最后由 在水一方 于 2019-2-15 12:03 编辑
eric2013 发表于 2019-2-15 11:50
是不是就是这个:

像使用内部SRAM一样定义使用SDRAM和CCM RAM,可以随意定义到指定的RAM区域且无需具体 ...

是的 ,还没编辑完,稍微有点不太一样
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2019-2-15 12:17:55 | 显示全部楼层
非常感谢楼主分享
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2019-4-9 16:16:16 | 显示全部楼层

非常感谢楼主分享
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2019-10-24 08:24:38 | 显示全部楼层
mark,先积累一个 意识。
Releasing your creativity
回复

使用道具 举报

3

主题

1231

回帖

1240

积分

至尊会员

积分
1240
发表于 2019-10-24 10:37:42 | 显示全部楼层
收藏了,持续关注哈!很有价值的分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 05:25 , Processed in 0.296883 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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