korren 发表于 2020-4-11 16:53:38

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也没有用。

wye11083 发表于 2020-4-11 19:37:09

有必要吗?哪怕你为了更新flash的值也不需要那么麻烦啊,直接volatile uint16_t * ptr = (volatile uint16_t*)&aa转一下就是地址了。定义这种后面更新的变量可以用volatile const定义。

还有一种办法,你定义成volatile 指针,然后编译时把flash设小点,以免被占用,当然数据就得手动写进去了。

最后一种办法,改lds脚本加一个新段,在c代码里加上段名,把你的变量在lds里面链到这块地方,理论上是可以的。

t3486784401 发表于 2020-4-11 19:53:28

PROGMEM 了解下?

qwe2231695 发表于 2020-4-12 00:02:29

设置局部-O0优化即可

Gorgon_Meducer 发表于 2020-4-21 17:20:55

本帖最后由 Gorgon_Meducer 于 2020-4-21 17:22 编辑

楼主应该试试看加 __attribute__((used))
这个 .ARM.__at_xxxx 的语法是 armlink用的,不是gcc的ld用的。
你这里只是定义了常量,显然不会有对应的code,因为这是常量不是代码。
另外,出这种问题的时候应该把map文件贴出来。

jenkins 发表于 2020-4-21 18:13:03

先在ld文件中单独定义一个区域,然后在程序中使用attribute指定

Gorgon_Meducer 发表于 2020-6-3 20:25:28

jenkins 发表于 2020-4-21 18:13
先在ld文件中单独定义一个区域,然后在程序中使用attribute指定

你用的这个方法还是无法避免编译器把这些未被使用的常量移除。还是要加上__attribute__((used))

jenkins 发表于 2020-6-4 08:41:25

Gorgon_Meducer 发表于 2020-6-3 20:25
你用的这个方法还是无法避免编译器把这些未被使用的常量移除。还是要加上__attribute__((used)) ...

在ld文件中指定KEEP就可以

笑笑我笑了 发表于 2020-6-4 08:52:52

一是要在ldscript里面加上对应的段,例如
.lua_script 0x080C0000:
{
    . = ALIGN(4);
        KEEP(*(.lua_script))
        . = ALIGN(4);
} >FLAS

二是定义变量的时候要加上刚才定义的段,例如
const char __attribute__((section(".lua_script"))) lua_script;

armstrong 发表于 2020-6-4 13:21:45

楼主,看你的地址连续,你也应该换一种更好维护的写法呀:

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
};

wajlh 发表于 2020-6-4 20:32:02

需要这么麻烦么?我都是直接用Jflash直接写到固定位置,代码直接去固定位置读取就行了。

Gorgon_Meducer 发表于 2020-6-5 05:00:03

本帖最后由 Gorgon_Meducer 于 2020-6-5 05:02 编辑

jenkins 发表于 2020-6-4 08:41
在ld文件中指定KEEP就可以

KEEP也是个好办法。不过怎么说呢……在程序中标记一下在代码可读性上要高不少——因为很多时候,ld并不在大家阅读的第一有限序列里……在代码里标记会比较容易注意到这个特殊意图。

Gorgon_Meducer 发表于 2020-6-5 05:00:27

wajlh 发表于 2020-6-4 20:32
需要这么麻烦么?我都是直接用Jflash直接写到固定位置,代码直接去固定位置读取就行了。 ...

你这个属于暴力美学的范畴——不依赖编译器——但很好用。

wajlh 发表于 2020-6-5 08:45:22

本帖最后由 wajlh 于 2020-6-5 08:52 编辑

Gorgon_Meducer 发表于 2020-6-5 05:00
你这个属于暴力美学的范畴——不依赖编译器——但很好用。

最早也是试过N多方法都不理想,达不到自己想要的效果。才出此下策,结果很爽。缺点呢,换个人维护代码估计会疯掉。所以要在相关读取的位置加上注释说明。

Gorgon_Meducer 发表于 2020-6-9 04:23:44

wajlh 发表于 2020-6-5 08:45
最早也是试过N多方法都不理想,达不到自己想要的效果。才出此下策,结果很爽。缺点呢,换个人维护代码估 ...

这种时候,写个文档就解决了。没啥好困扰的。
页: [1]
查看完整版本: GCC ARM怎样放置未使用常量在固定Flash空间?