|
本帖最后由 在水一方 于 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 位置定义
-
AC6 SCT文件
-
AC6 位置定义
评分
-
查看全部评分
|