0


__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在哪里定义的问题,如果有知道的请不吝赐教,谢谢。

标签: p2p linq tv

本文转载自: https://blog.csdn.net/ada_song/article/details/123061226
版权归原作者 嵌入式螺丝钉 所有, 如有侵权,请联系我们删除。

“__define_initcall解析”的评论:

还没有评论