相信不少工程师在阅读RT-Thread相关源代码的时候,都会经常看到如下图所示的宏定义,按照宏定义的命名来理解,这些宏定义似乎都是对一些初始化函数进行某些声明工作。
如上图所示,通过对源码的跟踪发现,这些INIT_XXX_EXPORT的宏定义,最终都是调用了INIT_EXPORT这个宏定义,而这个宏定义,就是把该初始化函数放在自定义的rti_fn符号段里面,源码在rtdef.h头文件里面,如下图所示。
把初始化函数放到自定义的符号段里面,有什么作用呢?答案就是,可以通过这种方式,让这些初始化函数被隐式调用,不用手动往RT-Thread的初始化过程里面添加该函数。
什么是隐式调用?隐式调用的意思就是,当我们往工程代码里面添加某个系统组件或外接设备的时候,这个组件或设备都需要进行初始化,而这个初始化函数,我们不需要在main函数或RT-Thread的启动函数里面直接添加调用,这样可以避免修改RT-Thread的启动过程代码。
先来看一下RT-Thread的启动函数调用流程,留意红色方框里面的内容,如下图所示。
启动函数里面,rt_components_board_init() 与 rt_components_init()这两个函数是专门用来处理自动初始化的,这两个函数的原型和注释,如下图所示。
从上面的函数原型可以看出,这两个函数都是从符号段区间里面,通过for循环不断遍历符号段里面的初始化函数,并获取这些初始化函数的指针,然后进行调用,以达到对设备或组件初始化的目的。
rt_components_board_init()函数最先执行,这个函数是用来初始化芯片相关的硬件的,这个函数会遍历用 INIT_BOARD_EXPORT(fn)声明的函数列表。
rt_components_init()函数是在系统启动后,在main线程里面被调用执行,这个函数是用来初始化其他用 INIT_XXX_EXPORT(fn)声明的函数列表的。
目前RT-Thread内核里面,用来实现自动初始化功能的宏定义接口,如下图所示。
综上所述,要使用RT-Thread的自动初始化流程,可以概括为以下如图所示的步骤。
为什么初始化函数加入了符号段之后,就可以被自动调用?符号段是什么?使用这种方式有什么好处?
把函数加入符号段,其实就是使用了MDK编译器的__attribute__((section(x)))关键字,对函数进行声明,通过section关键字进行声明的函数,在编译器进行链接的时候,就会自动收集这些函数并把他们放到一个集中的区域里面,查看以下.map文件可知。
如上图红框所示,rt_hw_pin_init和rt_hw_usart_init都是使用 INIT_BOARD_EXPORT(fn)声明的函数,因此,它们是存放在橙色竖线所在的区间的,使用rt_components_board_init()函数就可以对这个区间进行遍历。
如上图蓝框和绿框所示,它们分别是用 INIT_COMPONENT_EXPORT(fn)和 INIT_APP_EXPORT(fn)声明的函数,这些函数是存放在红色竖线所在的区间的,使用rt_components_init()函数就可以对这个区间进行遍历。
从上面的分析可以看出,使用符号段的方式来存放初始化函数,好处就是当我需要添加某一个初始化函数的时候,就不需要再去改动RT-Thread的启动代码了,直接通过section关键字,把初始化函数添加到相应的符号段即可。
以上就是RT-Thread的自动初始化机制分析,正是由于采用了这种机制,所以,当我们对内核或组件进行裁剪的时候,并不需要修改RT-Thread的初始化函数,也可以对组件进行初始化。
责任编辑:lq
-
函数
+关注
关注
3文章
4350浏览量
63051 -
编译器
+关注
关注
1文章
1642浏览量
49336 -
RT-Thread
+关注
关注
31文章
1308浏览量
40494
原文标题:【RT-Thread专题连载3】RT-Thread启动过程分析RT-Thread自动初始化机制分析
文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
如何将RT-Thread移植到NXP MCUXPressoIDE上
![如何将<b class='flag-5'>RT-Thread</b>移植到NXP MCUXPressoIDE上](https://file1.elecfans.com/web3/M00/08/12/wKgZPGetWzWAPmQsAAAT9RkoMiQ238.png)
RT-Thread上CAN实践
![<b class='flag-5'>RT-Thread</b>上CAN实践](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
开源共生 商业共赢 | RT-Thread 2024开发者大会报名启动!
![开源共生 商业共赢 | <b class='flag-5'>RT-Thread</b> 2024开发者大会报名<b class='flag-5'>启动</b>!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
2024 RT-Thread全球巡回 线下培训火热来袭!
![2024 <b class='flag-5'>RT-Thread</b>全球巡回 线下培训火热来袭!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
【好书推荐】RT-Thread设备驱动开发指南
![【好书推荐】<b class='flag-5'>RT-Thread</b>设备驱动开发指南](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
RT-Thread 新里程碑达成——GitHub Star 破万!
![<b class='flag-5'>RT-Thread</b> 新里程碑达成——GitHub Star 破万!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
6月6日杭州站RT-Thread线下workshop,探索RT-Thread混合部署新模式!
![6月6日杭州站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
2024 RT-Thread 全球技术大会演讲议程发布!
![2024 <b class='flag-5'>RT-Thread</b> 全球技术大会演讲议程发布!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
5月16日南京站RT-Thread线下workshop,探索RT-Thread混合部署新模式!
![5月16日南京站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
RT-Thread混合部署Workshop北京站来啦!
![<b class='flag-5'>RT-Thread</b>混合部署Workshop北京站来啦!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
4月25日北京站RT-Thread线下workshop,探索RT-Thread混合部署新模式
![4月25日北京站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!
![4月10日深圳场<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!](https://file1.elecfans.com/web2/M00/C6/D0/wKgaomYDlJyAKUBmAAAgR-TqYwc187.png)
4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!
![4月10日深圳场<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
RT-Thread成为恩智浦注册合作伙伴,共同赋能工业与物联网应用开发!
恩智浦半导体正式加入RT-Thread全球合作伙伴计划!
![恩智浦半导体正式加入<b class='flag-5'>RT-Thread</b>全球合作伙伴计划!](https://file1.elecfans.com/web2/M00/C5/31/wKgaomXyY_eAHGhqAAAkpBZI8PE901.png)
评论