attribute((section(x))) 使用详解
- 有如下变量声明:
__attribute__:设置属性, section:属于哪个输入段
1 |
|
- 编译代码可以在.map文件确实生成了输入段:”.fn_cmd.””0.end”,并且这个输入段中有一个变量fun_test

- 再添加一个变量到输入段
1 | int fun_test1(void) |

可以看到在相同代码端的变量保存在内存中的地址是连续的。(keil的.map文件没有显示地址,但其实他们的地址是连续的)
- 再有如果定义多个输入段它们在内存中排列的顺序是怎么样的:
1 | int fun_test1(void) |

- 根据输入段在内存中排列的顺序是按输入段名字的大小可以这样调用这些函数
1 | // my_fun1是属于.fn_cmd.1输入段的 |
- 再用宏定义的方式改进下上面的代码(实现类似rtthread里面用到的)
1 |
|

小结:rtthread里面的组件初始化原理:在用户函数定义的地方,通过宏顺便定义一个函数指针指向这个函数,但只是顺便定义的这个函数指针给它设置了一个属性让它属于指定的某个输入段,利用属于输入段的变量在内存上存放地址是连续的这一特性,通过开头和结束变量找到这整个输入段的所有变量,而这些变量里面保存的就是我们通过宏设置进去的那些函数入口地址。