__define_initcall解析

单片机程序很难做到驱动和应用分层,在cola这种体系中,利用__define_initcall宏定义初步实现了这一目的,对这个宏定义的理解的难点总结如下:

#define __define_initcall(fn, id) \
    static const initcall_t __initcall_##fn##id __used \
    __attribute__((__section__("initcall" #id "init"))) = fn; 

1.__attribute__ 机制

GNU C 的一大特色就是__attribute__ 机制。__attribute__ 可以设置函数属性(Function Attribute )、变量属性(Variable Attribute )和类型属性(Type Attribute )

__attribute__ 语法格式为:__attribute__ ((attribute-list))

__attribute__((section("section_name"))),其作用是将作用的函数或数据放入指定名为"section_name"对应的段中。

2“#”符号的使用

("initcall" #id "init")中的‘#’的作用是将宏参数id转换为一个字符串,整条语句就是定义__section__的name是“initcallXinit”

3.__attribute__((_used_))的作用

使用前提是在编译器编译过程中,如果定义的符号没有被引用,编译器就会对其进行优化,不保留这个符号,而__attribute__((_used_))的作用是告诉编译器这个静态符号在编译的时候即使没有使用到也要保留这个符号。

整条宏定义的作用是

定义一个名为__initcall_##fn##id的结构体,他的值=fn这个函数指针,而段属性则规定了已定义的结构体会放在一起。

在调用的时候通过先检索initcallIDinit$$Base段,如果确定有函数则调用。但是没有解决initcallIDinit$$Base在哪里定义的问题,如果有知道的请不吝赐教,谢谢。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式螺丝钉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值