c语言 recv_C语言再学习24——__attribute__ (at())地址定位

本文详细介绍了C语言中__attribute__ ((at()))特性,用于变量的绝对定位,包括如何定位到FLASH和RAM。该特性常用于固化信息存储和大缓存数据。注意绝对定位不能用于函数内部的局部变量,并且要确保定义的大小不超过存储区域。文中还通过实例展示了如何在特定地址写入数据,并对比了定位前后的二进制文件大小。
摘要由CSDN通过智能技术生成

4effe0da77f765a514a5718b32d1113d.png

1. __attribute __((at)) 绝对定位

__attribute__( at(绝对地址) )的作用:

(1)绝对定位到 Flash;

(2)绝对定位到 RAM。

__attribute__  :用来指定变量或结构位域的特殊属性,关键字后的双括弧中的内容是属性说明;

at:用来设置变量的绝对地址,指定某个变量处于内存或 FLASH 里面的某个给定的地址。

1.1 定位到 FLASH

定位到 flash 中,常用于固化信息,例如:设备的出厂信息,FLASH 标记等;

const uint8_t usFlashInitVal[] __attribute__((at(0x00030000))) = {0x11,0x22,0x33,0x44,0x55,0x66};//定位在flash中,0x00030000开始的6个字节信息固定

1.2 定位到 RAM

常用于数据量较大的缓存,如:串口接收数据。也用于某个位置的特定变量。

uint8_t ucUsartRecvBuffer[USART_RECV_LEN] __attribute__ ((at(0x00025000)));    //接收缓冲,最大USART_RECV_LEN个字节,起始地址为 0x00025000

注:

  1. 绝对定位不能在函数中定义,局部变量是定义在栈区,栈区是自动分配、释放,不能定义为绝对地址,只能于函数外定义;

  2. 定义的长度不能超过栈或 Flash 的大小,否则导致栈、Flash 溢出。

1.3 测试

比如:在 0x08010000 的 flash 地址上固定写入数据,如下图:

eef2d8bb599fc87c440dca1c3e258216.png
如果不加 const 修饰,则定位到了 RAM ,此处数据存到 FLASH。

编译出来各部分文件大小:

c297c5d803f17e970e2b7b709682faef.png

打开编译出来二进制文件,如下图:

3a7cf8ee592b90c7f014324dc88f9cdc.png

最后,我们来看一下加与不加 const uint8_t ucaSysFlashVal[] __ attribute__((at(0x08010000))) =
{0x11, 0x22, 0x33, 0x44}; 的 map 表的区别:

原编译结束的 map 文件各部分文件大小:

7d6caa4ba89c22cacb6271e485205a9f.png

添加定位代码后的 map 文件各部分的大小:

48c0e3cbbfce709a5ca1583795fc771d.png

可以发现添加后,RO Data 的大小发生了变化,即定位后 FLASH 的空间占用加大,并且打开 bin 文件,可以发现中间部分由全 0 填充。

参考:

  1. C语言中__attribute__ ((at())绝对定位的应用

  2. STM32学习笔记之__attribute__ ((at())绝对定位分析

  3. MDKconst U16__attribute__((at(0x0800E400)))RO-data统计特别大

55a2e5a07e97da7251aa7433e931578e.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值