前言:

为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长。


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 地址上固定写入数据,如下图:


如果不加 const 修饰,则定位到了 RAM 。

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

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


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

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

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


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


参考:

  1. C语言中__attribute__ ((at())绝对定位的应用
  2. STM32学习笔记之__attribute__ ((at())绝对定位分析
  3. MDK const U16__attribute__((at(0x0800E400)))RO-data统计特别大

C语言再学习24——__attribute__ (at())地址定位相关推荐

  1. C语言再学习 -- 详解C++/C 面试题 2

    (经典)C语言测试:想成为嵌入式程序员应知道的0x10个基本问题. 参看:嵌入式程序员面试问题集锦 1.用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define ...

  2. C语言再学习 -- 再论数组和指针

    之前有总结指针数组,但是现在看来总结的太简单了.好多重要的知识点都是一带而过的.本想在后面添加后来想想算了,还是再写一篇文章来详细介绍数组和指针这对冤家吧. 之前总结的,参看:C语言再学习 -- 数组 ...

  3. C语言再学习 -- 时间函数

    在软件设计中经常会用到关于时间的处理,用来计算语句.函数的执行时间,这时就需要精确到毫秒甚至是微妙的时间.我们首先来介绍一下,时间单位: 时间单位还有:秒(s).毫秒(ms).微秒 (μs).纳秒(n ...

  4. C语言再学习 -- 关键字const

    const 关键字其实我们并不陌生,之前有讲过const修饰数组和指针.现在来详细介绍这个关键字. 参看:[C/C++和指针]著名的<const的思考> 一.const 介绍 1.cons ...

  5. C语言再学习 -- 段错误(核心已转储)

    参看:Linux下的段错误产生的原因及调试方法 参看:Linux环境下段错误的产生原因及调试方法小结 参看:维基百科--Segmentation fault 参看:LINUX内核段错误调试详细指南精品 ...

  6. C语言再学习 -- 再论内存管理

    之前有总结过内存管理,参看:C语言再学习 -- 内存管理 但现在看来,缺少示例.从新再写一篇文章,着重介绍常见内存错误.跨函数使用存储区.开始吧,再论内存管理!! 发生内存错误是件非常麻烦的事情.编译 ...

  7. C语言再学习 -- 详解C++/C 面试题 1

    参看:<高质量C++ C编程指南>.林锐 对这篇文章记忆犹新,因为之前找工作面试的时候,遇到过一家公司就是用的这套面试题.现在就结合考查的知识点和我总结完 C 语言再学习后的深入理解,来详 ...

  8. C语言再学习 -- 关键字volatile

    上周确实事情挺多的,年会.公司聚餐,一到过年就有忙不完的事分心.还好C语言再学习总结的已经差不多了,年前也不展开别的了,接下来这十几天.总结几篇典型的面试题吧. 言归正传,接下来看看关键字 volat ...

  9. C语言再学习 -- 存储类型关键字

    定义: 是对声明的实现或者实例化.连接器(linker)需要它(定义)来引用内存实体.与上面的声明相应的定义如下:参看:C语言再学习 -- 存储类.链接 C语言中有 5 个作为存储类说明符的关键字,分 ...

最新文章

  1. OpenCV中CvArr* 的含义~
  2. 【Java 虚拟机原理】Class 字节码二进制文件分析 五 ( 方法计数器 | 方法表 | 访问标志 | 方法名称索引 | 方法返回值类型 | 方法属性数量 | 方法属性表 )
  3. 关于AIX lv 4k offset问题初步了解
  4. 设计模式 -- (7)外观模式
  5. 模板 - 数据结构 - ST表 + 二维ST表
  6. 深度学习的实用层面 —— 1.13 梯度检验
  7. line java_java – Line Rasterization / 4-bresenham
  8. 并发 锁和隔离等级的关系
  9. javascript中typeof、undefined 和 null
  10. chrome插件开发(Demo案例)
  11. web基础(一)——初识HTML5
  12. #贴改色膜前,你必须要知道的事情
  13. js代码中for循环里绑定onclick事件报错Uncaught TypeError Cannot set properties of undefined (setting ‘className‘)
  14. Project Treble是Android升级的最终方案吗?
  15. Mac小技巧:同时选中多个文件
  16. Mysql的基本函数--与自定义函数
  17. Set 中 toArray()
  18. 计算机显卡和cpu的关系,cpu和显卡的关系
  19. 安全环境中的WebSphere代理服务器路由功能
  20. 图片怎么在线压缩?图片在线压缩方法分享

热门文章

  1. D3D11笔记——Resource基本概念
  2. 工行的银行卡号代表开户行的数字是哪几位?怎么查询
  3. Vue数据双向绑定.sync 和v-model
  4. 从0搭建前端脚手架详解(小白也可以搭建)
  5. 优雅的在React项目中使用Redux 1
  6. java数组为空如何判断_Java中判断数组是否为空?
  7. java生成jar包时使第三方jar_IEDA生成可运行jar包(包含第三方jar包)的方法
  8. openCV学习笔记(5):使用sprintf函数实现在窗口连续显示同一文件夹下的图片
  9. Terraform基本介绍(1)
  10. linux 杀死进程命令