关于__attribute__((at(0x08010000)))的一些理解和实验

https://blog.csdn.net/weixin_42381351/article/details/89180609#comments

你好,我自己也试了下,用const uint16_t FlashDefValue[3] __attribute__((at(0x08010000))) = {0x01, 0x02, 0x03};

const uint32_t gFlash[3]__attribute__((at(0x8010000))) = {0x01,0x02,0x03};

在STM32F429和STM32F103尝试直接定位都会有你说的情况后面有不明数据,且数值恒定,间隔字节数也恒定,但是在map文件中又确实标注size为6字节,并无多余。

那么我怀疑这是编译器在转换为机器语言并烧入至flash时产生的(去掉const效果也一样)。

那么如果尝试直接将FlashDefValue[3]写入flash中,那么就不会出现多余的不明数据,你使用的芯片我不了解,这两款芯片的flash最小写入单元是两个字节或四个字节。

所以如果不想浪费flash的空间可以考虑直接写入,我使用__attribute__是用在FMC总线的地址上操控SDRAM,直接定位在flash上可以用于记录一些设备信息比如硬件版本,软件版本,ID号等。

两者的区别在于:直接定位是嵌入在代码中,在下载后flash就已经改变。直接定位在flash上的数组一旦定义就不可更改,直接定位在总线上的数组可以更改(比如FSMC、FMC操控SDRAM),效率高。 flash写入函数是需要程序启动后执行的。效率低。

两者的共同点在于:都需要确定所指向的位置没有正在使用的空间。

实验:

1.能否通过直接修改FlashDefValue修改目标地址数据?标注为const,无法直接操作。去掉const后,对FlashDefValue赋值会导致宕机。所以直接定位在flash上的还是加上const吧。

2.那么能否通过写入flash函数间接修改FlashDefValue指向的地址呢?可以的。

这是我的浅显理解,有不正确的地方还请指出

发布了26 篇原创文章 · 获赞 0 · 访问量 2997

猜你喜欢

转载自blog.csdn.net/nianzhu2937/article/details/103593271
今日推荐