__attribute__((section(”name“)))是gcc编译器支持的一个编译特性(arm编译器也支持此特性),实现在编译时把某个函数/数据放到name的数据段中。

__attribute__主要用于改变所声明或定义的函数或数据的特性,它有很多子项,用于改变作用对象的特性。

比如对函数,noline将禁止进行内联扩展、noreturn表示没有返回值、pure表明函数除 返回值外,不会通过其它(如全局变量、指针)对函数外部产生任何影响。

当然,__attribute__肯定有很多的用法,今天就用到了section部分,所以就只针对这个做一些记录。

提到section,就得说RO RI ZI了,在ARM编译器编译之后,代码被划分为不同的段,RO Section(ReadOnly)中存放代码段和常量,RW Section(ReadWrite)中存放可读写静态变量和全局变量,ZI Section(ZeroInit)是存放在RW段中初始化为0的变量。

于是本文的大体意思就清晰了,__attribute__((section("xxxx"))),其作用是将作用的函数或数据放入指定名为"XXXX"对应的段中。

代码的编写部分主要分三部分,OSRAMCODE (OS 代码部分)、 全局变量、APPRAMCODE(APP 代码部分)

最简单了,因为你不做修改,你定义的全局变量默认都是在 RW 和 ZI 段,而这两段正好被我们分配到 了 BIN_OS 中。故而我们不需要操作什么

剩下的难题,我们怎么才能将指定的函数放进BIN_OS 和 BIN_APP 这两个区域呢?

实现方法如下

//指定函数放在 OSRAMCODE 也就是 BIN_OS 这一段中
#define __AT_OS __attribute__((used, section("OSRAMCODE")))//指定函数放在 APPRAMCODE 也就是 BIN_APP 这一段中
#define __AT_APP __attribute__((used, section("APPRAMCODE")))

所以我们编写代码的时候,只要在函数面前加入我们定义好的宏即可,例如:


//OS代码
__AT_OS int os_fun()
{return 1;
}                                  //APP的代码
__AT_APP int app_f()
{return 1;
} 

上面的方法就要求我们写的代码必须为每个函数指定位置,非常繁琐。

当然,还有更好的实现,那就是修改 .sct 链接脚本

具体就不细说了,大致如下,直接把 os 相关的 .c 文件指定到链接脚本中去。编译如果有错误就自己改下吧

BIN_OS为48K,只存放 OS的代码 和 +RW +ZI 也就是全局变量了。RW_IRAM1 0x20000000 0x0000c000 {os1.o(OSRAMCODE)
os2.o(OSRAMCODE)
os3.o(OSRAMCODE)
.ANY (+RW +ZI)};BIN_APP 为16K,用于存放APP的函数的内容RW_IRAM2 0x2000c000 0x00004000 {*.o(APPRAMCODE)}

出处:https://www.cnblogs.com/looner/p/11598685.html

https://www.freesion.com/article/2638311607/

__attribute__((section(”XXXX“)))的编译属性---section相关推荐

  1. 利用gcc的__attribute__编译属性section子项构建初始化函数表【转】

    转自:https://my.oschina.net/u/180497/blog/177206 gcc的__attribute__编译属性有很多子项,用于改变作用对象的特性.这里讨论section子项的 ...

  2. section标签及辨析div\section\article异同

    section标签 定义文档中的节(section.区段).比如章节.页眉.页脚或文档中的其他部分. div\section\article标签 div充当容器的角色,用来设置某一块的总体属性(一个d ...

  3. [IOS]如何设置section的title和改变section的背景色及样式

    参考: https://stackoverflow.com/questions/813068/uitableview-change-section-header-color/813103 1.背景色 ...

  4. DSP F28069 build 出现warning : creating output section “xxxx“ without a SECTIONS

    现象描述 程序本身没有问题.但是会出现warnings.如上图. 解决方案 添加cmd文件 F2806x_Headers_nonBIOS.cmd 原因分析 在warnings出现的时候,project ...

  5. tsconfig编译属性module详解

    作用 用来指定要使用的模块化的规范 可选版本 none.commonjs.amd.system.umd.es6.es2015.es2020.es2022.esnext.node16.nodenext ...

  6. C++(17):[[maybe_unused]]编译属性

    [[maybe_unused]]用于描述暂时没有被使用的函数或变量,以避免编译器对此发出警告: [[maybe_unused]] int f() //没有被使用的函数 {return 1; }int ...

  7. RT-Thread 的自动初始化机制

    金鳞岂是池中物,一遇风云便化龙. 九霄龙吟惊天变,风云际会浅水游. 出处<风云>,泥菩萨给雄霸算卦的批文. 一.前言介绍 RT-Thread 的自动初始化机制使用了自定义 RTI 符号段, ...

  8. __attribute__((used)) __attribute__((section(x)))

    1.通知编译器在目标文件中保留一个静态函数,即使它没有被引用. 2.标记为attribute__((used))的函数被标记在目标文件中,以避免链接器删除未使用的节. 3.静态变量也可以标记为used ...

  9. __attribute__((section(x))) 使用详解

    无论是GNU还是ARM的编译器, 都支持 __attribute__所指定的编译属性,这里着重讲解一下在KEIL 环境下__attribute__中的section的使用方法. section关键字可 ...

最新文章

  1. Kotlin进行异步操作
  2. es重建字段类型_关于elasticsearch中更新数据的几种方式
  3. Python之一行代码
  4. 【Android】 Android中ListView使用详解
  5. Python学习笔记-day1(while流程控制)
  6. Extjs FormPanel/TabPanel/GridPanel混合
  7. .Net 调用wordCOM组件转PDF
  8. 世界杯足球竞赛源码下载
  9. MySQL关于时间设置的注意事项
  10. 保研论坛app服务器网站,保研论坛官网版app
  11. python免费课程400节-Python2 教程
  12. Openbiz 推进PHP进入大App Store时代
  13. Eprime的txt数据转换为excel
  14. 二次规划与非线性规划及matlab应用
  15. C语言:判断对错(简化版)
  16. c语言编程输出等腰三角形,C语言输出等腰三角形
  17. VMware14配置虚拟网络详解
  18. 如何开发微信小程序呢
  19. 【信息系统项目管理师】第十五章 知识产权与法律法规(考点汇总篇)
  20. Java基础知识:线程池的种类(5种)

热门文章

  1. Python3.x:第三方库简介
  2. gs 服务器文件,服务器gs
  3. Transform 转换
  4. 超级右键 iRightMouse --Mac强大的右键菜单设置工具
  5. Oracle的表空间和sqlplus
  6. 副业赚钱的路子有哪些?分享6种较为实用的副业方式
  7. PocketGamer专访Adrealm:数字广告将迎来全新解决方案
  8. 病人陈天桥,归来依旧是传奇(转)
  9. “Word文件设置了多级列表,却还是不能创建目录”的解决办法
  10. 跟着团子学SAP:SAP用户状态管理详解(含权限分配等) OK02