rt-thread中MSH_CMD_EXPORT()函数的实现原理-const char __fsym_##cmd##_name[] RT_SECTION(“.rodata.name“) = #cmd
const char _fsym##cmd##_name[] RT_SECTION(".rodata.name") = #cmd
学习一下这行代码
对这行代码里面的 __fsym 双#,RT_SECTION这些都不理解
#define RT_SECTION(x) attribute((section(x)))
这行代码的__attribute__((section(x)))又是什么意思???
学习结论:
把__fsym_##cmd##_name[]这个变量放置到名为".rodata.name"的段中
attribute((section(x))) 使用详解----精品
那么问题来了,使用section将变量放到我们自定义的输入段中有什么意义呢?
言归正传,现在继续来讲如何使用section将不同的函数放到我们想要的输入段中,并且获得他们的起始地址和结束地址。
我们可以在每个XXX_Init函数后面都调用宏CMD_EXPORT,在调用这个宏时编译器会将XXX_init这个函数加入到输入段中,由于变量在输入段中的地址是连续的,并且顺序先按 section 名 01234排一遍,section 内再按函数名称排。所以可以按照输入段中顺序来逐个调用这些初始化函数来完成系统的初始化。
单井号和双井号(##)的意义
二、#运算符的用法
(1)#运算符用在预编译时期,用于将宏参数转换为字符串,即是加上双引号。
三、##运算符的使用
(1)##运算符用于在预编译期粘连两个符号,增大了宏的使用灵活性!
看这里
看上面的代码,啥也不想说了。已经很明显了,我们已经看到了 ## 运算符的强大之处。如果我们的 # 和 ## 运算符运用的好的话,那么代码质量就会非常高。通过对 # 和 ## 运算符的学习,总结如下:1、# 运算符用于在预处理期将宏参数转换为字符串;2、## 运算符用于在预处理期粘连两个标识符;3、编译器不知道 # 和 ## 运算符的存在,# 和 ## 运算符只在宏定义中有效。
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。
于是本文的大体意思就清晰了,attribute((section(“section_name”))),其作用是将作用的函数或数据放入指定名为"section_name"对应的段中。
gcc attribute((section(“section_name”))) 使用方法
gcc的__attribute__编译属性有很多子项,用于改变作用对象的特性。这里讨论section子项的作用。
__attribute__的section子项使用方式为:
__attribute__((section("section_name")))
其作用是将作用的函数或数据放入指定名为"section_name"的段。
原文链接:https://blog.csdn.net/nyist327/article/details/59481809
相关文章
- Vitis嵌入式入门-------输出“hello world“(一)
- 最新的CorelDRAWX8序列号安装步骤教程
- Vitis嵌入式入门-------输出“hello world“(二)
- FPGA按键消抖
- 矩阵键盘FPGA实现(含消抖)
- U3D热更新技术
- 出现丢失MSVCR120.dll的解决方法
- IIC驱动FPGA-----oled
- 电子邮件有没有必要使用签名证书?
- QT串口助手
- STM32电机TB6612驱动
- mac 安装brew报错 Failed to connect to raw.githubusercontent.com port 443: Connection refused解决办法...
- 太令人吃惊了,Dubbo 服务发布-原理解析就这么轻松自然的梳理完了!
- Linux环境部署Nessus扫描工具
- 点晴OA系统中小企事业单位的共同选择
- VMware ESXI系统镜像定制
- STM32平衡车
- FPGA驱动Oled--IIC
- CDN产品介绍——产品计费
- ES6 从入门到精通 # 05:函数之扩展运算符、箭头函数