0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RT-Thread启动过程分析RT-Thread自动初始化机制分析

RTThread物联网操作系统 来源:RTThread物联网操作系统 作者:RTThread物联网操作 2021-01-13 16:45 次阅读

相信不少工程师在阅读RT-Thread相关源代码的时候,都会经常看到如下图所示的宏定义,按照宏定义的命名来理解,这些宏定义似乎都是对一些初始化函数进行某些声明工作。

5ff8e3ca-44ae-11eb-8b86-12bb97331649.png

如上图所示,通过对源码的跟踪发现,这些INIT_XXX_EXPORT的宏定义,最终都是调用了INIT_EXPORT这个宏定义,而这个宏定义,就是把该初始化函数放在自定义的rti_fn符号段里面,源码在rtdef.h头文件里面,如下图所示。

60119988-44ae-11eb-8b86-12bb97331649.png

把初始化函数放到自定义的符号段里面,有什么作用呢?答案就是,可以通过这种方式,让这些初始化函数被隐式调用,不用手动往RT-Thread的初始化过程里面添加该函数。

什么是隐式调用?隐式调用的意思就是,当我们往工程代码里面添加某个系统组件或外接设备的时候,这个组件或设备都需要进行初始化,而这个初始化函数,我们不需要在main函数或RT-Thread的启动函数里面直接添加调用,这样可以避免修改RT-Thread的启动过程代码。

先来看一下RT-Thread的启动函数调用流程,留意红色方框里面的内容,如下图所示。

6051c44a-44ae-11eb-8b86-12bb97331649.png

启动函数里面,rt_components_board_init() 与 rt_components_init()这两个函数是专门用来处理自动初始化的,这两个函数的原型和注释,如下图所示。

60cd114a-44ae-11eb-8b86-12bb97331649.png

从上面的函数原型可以看出,这两个函数都是从符号段区间里面,通过for循环不断遍历符号段里面的初始化函数,并获取这些初始化函数的指针,然后进行调用,以达到对设备或组件初始化的目的。

rt_components_board_init()函数最先执行,这个函数是用来初始化芯片相关的硬件的,这个函数会遍历用 INIT_BOARD_EXPORT(fn)声明的函数列表。

rt_components_init()函数是在系统启动后,在main线程里面被调用执行,这个函数是用来初始化其他用 INIT_XXX_EXPORT(fn)声明的函数列表的。

目前RT-Thread内核里面,用来实现自动初始化功能的宏定义接口,如下图所示。

611472ce-44ae-11eb-8b86-12bb97331649.png

综上所述,要使用RT-Thread的自动初始化流程,可以概括为以下如图所示的步骤。

6152e310-44ae-11eb-8b86-12bb97331649.png

为什么初始化函数加入了符号段之后,就可以被自动调用?符号段是什么?使用这种方式有什么好处?

把函数加入符号段,其实就是使用了MDK编译器的__attribute__((section(x)))关键字,对函数进行声明,通过section关键字进行声明的函数,在编译器进行链接的时候,就会自动收集这些函数并把他们放到一个集中的区域里面,查看以下.map文件可知。

61757844-44ae-11eb-8b86-12bb97331649.png

如上图红框所示,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关键字,把初始化函数添加到相应的符号段即可。

61c8fd16-44ae-11eb-8b86-12bb97331649.png

以上就是RT-Thread的自动初始化机制分析,正是由于采用了这种机制,所以,当我们对内核或组件进行裁剪的时候,并不需要修改RT-Thread的初始化函数,也可以对组件进行初始化。

责任编辑:lq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    3864

    浏览量

    61306
  • 编译器
    +关注

    关注

    1

    文章

    1575

    浏览量

    48606
  • RT-Thread
    +关注

    关注

    31

    文章

    1148

    浏览量

    38865

原文标题:【RT-Thread专题连载3】RT-Thread启动过程分析RT-Thread自动初始化机制分析

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    4月25日北京站RT-Thread线下workshop,探索RT-Thread混合部署新模式

    4月25日,下午我们将在北京举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
    的头像 发表于 04-16 08:35 77次阅读
    4月25日北京站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式

    4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    4月10日我们将在深圳福田举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深嵌入式软件工程师农晓明老师为您讲
    的头像 发表于 03-27 11:36 415次阅读
    4月10日深圳场<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    4月10日我们将在深圳福田举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
    的头像 发表于 03-27 08:34 142次阅读
    4月10日深圳场<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    RT-Thread qemu mps2-an385 bsp移植制作 :系统运行篇

    前面已经让 RT-Thread 进入了 entry 入口函数,并且 调整 链接脚本,自动初始化与 MSH shell 的符号已经预留, 进入了 RT-Thread
    的头像 发表于 11-14 12:27 501次阅读
    <b class='flag-5'>RT-Thread</b> qemu mps2-an385 bsp移植制作 :系统运行篇

    基于rt-thread的socket通信设计

    最近再研究 rt-thread 的通信 ,想设计出 eps8266(多个) rt-thread(作为中控) 服务器的通信框架,使用的开发板是 潘多拉
    的头像 发表于 10-13 15:02 673次阅读
    基于<b class='flag-5'>rt-thread</b>的socket通信设计

    试用RT-Thread Studio(VSCode)

    想尝试RT-Thread studio (VSCode),先下载安装VSCode,再搜索RT-Thread
    的头像 发表于 10-12 10:58 560次阅读
    试用<b class='flag-5'>RT-Thread</b> Studio(VSCode)

    RT-Thread v5.0.2 发布

    RT-Thread 代码仓库地址: ●  https://github.com/RT-Thread/rt-thread RT-Thread 5.0.2 版本发布日志详情: ●  htt
    的头像 发表于 10-10 18:45 770次阅读
    <b class='flag-5'>RT-Thread</b> v5.0.2 发布

    RT-Thread使用经验分享:链表未初始化造成死机

    最近在开发调试基于RT-Thread 的驱动时,遇到一个比较奇怪的死机问题,后来经过一步步排查,终于发现是驱动的链表节点没有初始化造成的死机
    的头像 发表于 10-08 14:49 476次阅读
    <b class='flag-5'>RT-Thread</b>使用经验分享:链表未<b class='flag-5'>初始化</b>造成死机

    新书上架|嵌入式系统原理及应用——基于STM32和RT-Thread

    教程书籍编撰过程中的第一选择! 本次上新的书籍为胡永涛主编的《嵌入式系统原理及应用——基于STM32和RT-Thread》。 本书以意法半导体(ST)的STM32L431系列微控制器为硬件核心,采用
    的头像 发表于 09-25 18:25 536次阅读
    新书上架|嵌入式系统原理及应用——基于STM32和<b class='flag-5'>RT-Thread</b>

    基于 RT-Thread 的 RoboMaster 电控框架(一)

    由于 RT-Thread 稳定高效的内核,丰富的文档教程,积极活跃的社区氛围,以及设备驱动框架、Kconfig、Scons、日志系统、海量的软件包……很难不选择 RT-Thread 进行项目开发
    的头像 发表于 09-19 19:55 412次阅读

    新书上架|RT-Thread带你解密“芯”世界

    教程书籍编撰过程中的第一选择!越来越多开发者通过RT-Thread解密“芯”世界,预见未来,领略科技之美。 以下介绍的两本书分别是RT-Thread第11本、第12本相关书籍, 在龙芯中科
    的头像 发表于 08-22 20:10 451次阅读
    新书上架|<b class='flag-5'>RT-Thread</b>带你解密“芯”世界

    rt-thread线程栈初始化参数分析

    RT-Thread 在线程初始化的代码内有一段初始化线程堆栈的代码
    的头像 发表于 08-14 16:50 992次阅读
    <b class='flag-5'>rt-thread</b>线程栈<b class='flag-5'>初始化</b>参数<b class='flag-5'>分析</b>

    RT-Thread Debug分析与调整方案

    RT-Thread 中可以通过 menuconfig 使能相关宏,配置和使用 debug 功能,即可向工作台输出程序运行信息,方便调试和使用。
    的头像 发表于 07-22 15:32 660次阅读

    教你手上没有开发板如何跑RT-THREAD STM32应用?

    首先打开 RT-Thread Studio,新建RT-Thread
    的头像 发表于 07-18 16:09 1047次阅读
    教你手上没有开发板如何跑<b class='flag-5'>RT-THREAD</b> STM32应用?

    基于RT-Thread Studio学习

    前期准备:从官网下载 RT-Thread Studio,弄个账号登陆,开启rt-thread学习之旅。
    的头像 发表于 05-15 11:00 2576次阅读
    基于<b class='flag-5'>RT-Thread</b> Studio学习