GCC ARM怎样放置未使用常量在固定Flash空间?
我的程序这样放置后,MAP看不到常量,好像这样根本就没有产生code.const u32aa __attribute((section(".ARM.__at_0x100")))= 0x0000CAAC;
const u32bb __attribute((section(".ARM.__at_0x104")))= 0xFFFFCCCC;
const u32cc __attribute((section(".ARM.__at_ 0x108")))= 123456;
const u8 dd __attribute((section(".ARM.__at_0x10C")))= "abcd";
const u32ff __attribute((section(".ARM.__at_0x114")))= 123;
怎样让编译器不被优化掉呢?
在section前加used也没有用。 有必要吗?哪怕你为了更新flash的值也不需要那么麻烦啊,直接volatile uint16_t * ptr = (volatile uint16_t*)&aa转一下就是地址了。定义这种后面更新的变量可以用volatile const定义。
还有一种办法,你定义成volatile 指针,然后编译时把flash设小点,以免被占用,当然数据就得手动写进去了。
最后一种办法,改lds脚本加一个新段,在c代码里加上段名,把你的变量在lds里面链到这块地方,理论上是可以的。 PROGMEM 了解下? 设置局部-O0优化即可 本帖最后由 Gorgon_Meducer 于 2020-4-21 17:22 编辑
楼主应该试试看加 __attribute__((used))
这个 .ARM.__at_xxxx 的语法是 armlink用的,不是gcc的ld用的。
你这里只是定义了常量,显然不会有对应的code,因为这是常量不是代码。
另外,出这种问题的时候应该把map文件贴出来。 先在ld文件中单独定义一个区域,然后在程序中使用attribute指定 jenkins 发表于 2020-4-21 18:13
先在ld文件中单独定义一个区域,然后在程序中使用attribute指定
你用的这个方法还是无法避免编译器把这些未被使用的常量移除。还是要加上__attribute__((used)) Gorgon_Meducer 发表于 2020-6-3 20:25
你用的这个方法还是无法避免编译器把这些未被使用的常量移除。还是要加上__attribute__((used)) ...
在ld文件中指定KEEP就可以 一是要在ldscript里面加上对应的段,例如
.lua_script 0x080C0000:
{
. = ALIGN(4);
KEEP(*(.lua_script))
. = ALIGN(4);
} >FLAS
二是定义变量的时候要加上刚才定义的段,例如
const char __attribute__((section(".lua_script"))) lua_script; 楼主,看你的地址连续,你也应该换一种更好维护的写法呀:
struct type_yours {
u32aa;
u32bb;
u32cc;
u8 dd;
u32ff;
};
struct type_yours const const_data __attribute((section("xxx"))) = {
.aa = 0x0000CAAC,
.bb = 0xFFFFCCCC,
.cc = 123456,
.dd = "abcd",
.ff = 123
}; 需要这么麻烦么?我都是直接用Jflash直接写到固定位置,代码直接去固定位置读取就行了。 本帖最后由 Gorgon_Meducer 于 2020-6-5 05:02 编辑
jenkins 发表于 2020-6-4 08:41
在ld文件中指定KEEP就可以
KEEP也是个好办法。不过怎么说呢……在程序中标记一下在代码可读性上要高不少——因为很多时候,ld并不在大家阅读的第一有限序列里……在代码里标记会比较容易注意到这个特殊意图。 wajlh 发表于 2020-6-4 20:32
需要这么麻烦么?我都是直接用Jflash直接写到固定位置,代码直接去固定位置读取就行了。 ...
你这个属于暴力美学的范畴——不依赖编译器——但很好用。 本帖最后由 wajlh 于 2020-6-5 08:52 编辑
Gorgon_Meducer 发表于 2020-6-5 05:00
你这个属于暴力美学的范畴——不依赖编译器——但很好用。
最早也是试过N多方法都不理想,达不到自己想要的效果。才出此下策,结果很爽。缺点呢,换个人维护代码估计会疯掉。所以要在相关读取的位置加上注释说明。 wajlh 发表于 2020-6-5 08:45
最早也是试过N多方法都不理想,达不到自己想要的效果。才出此下策,结果很爽。缺点呢,换个人维护代码估 ...
这种时候,写个文档就解决了。没啥好困扰的。
页:
[1]