摘要> 展示section关键字的作用,以及在SDK实现开机自启动的应用
1、section的作用
section主要作用是将函数或者变量放在指定段中,这样就可在指定的位置取出。
编译生成map文件:
my_test.map 文件片段如下:
分析可见,使用section修饰的函数和变量在自定义的片段,而且是连续存放在___start_xx到___stop_xx之间,这样可根据变量的地址得出与其同段变量的地址,为后续自动初始化等功能提供了基础。
2、 自动初始化
基于前面section的作用,可以将同类函数指针全部使用同一个段名修饰,然后开机后系统自动检索段内函数指针,逐个执行,对上层应用就是无需主动调用,系统自动初始化。
考虑到硬件初始化与应用功能初始化的先后顺序,可以对段名进行分配,map文件按段名排序。自动初始化主体是OS_INIT_EXPORT宏。
范例代码出自中国移动的oneos开源版本,使用gcc,方案和国产RT-Thread类似。
例如shell初始化函数,定义如下:
将宏定义展开
系统自身也有自定义函数,用来标记起止点函数
最终生成的map文件如下图:
注意:段中函数类型都是一样的,范例是同一类函数指针,也可以是结构体,需要确保每个成员占用空间大小相同,这样才能逐个遍历。
3、总结
不同编译器对section属性的定义略有差异,但效果相同。
上面的#error也是个应用技巧,配搭 #if / #else / #endif 在编译阶段即可发现代码问题,一般用于判断宏定义的配置是否在预期之外,编译报错必须修改。
配合C关键字,对代码的安全校验、扩展移植都会有很好的效果,可参考前文 C语言关键字技巧。对小型项目、个人独立开发看不出效果,但对复杂的多人合作的项目,合适的关键字对代码的稳定性和架构是锦上添花。
领取专属 10元无门槛券
私享最新 技术干货