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

    文章

    4406

    浏览量

    66838
  • 编译器
    +关注

    关注

    1

    文章

    1669

    浏览量

    51082
  • RT-Thread
    +关注

    关注

    32

    文章

    1540

    浏览量

    44280

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    首搭RT-Thread程翧车控平台| RT-Thread程翧 S32K344 快速原型开发平台正式上市!| 产品动态

    在智能汽车迈向高集成与高安全的时代,VCU/ECU开发正面临效率与可靠性的双重考验。依赖单一硬件或拼凑软件方案的传统模式,已成为制约创新的瓶颈。为此,RT-Thread带来里程碑式的解决方案
    的头像 发表于 10-31 11:53 486次阅读
    首搭<b class='flag-5'>RT-Thread</b>程翧车控平台| <b class='flag-5'>RT-Thread</b>程翧 S32K344 快速原型开发平台正式上市!| 产品动态

    2025年RT-Thread开发者巡回培训报名正式启动

    亲爱的RT-Thread社区成员们:新程再启,共赴热爱!2025年RT-Thread开发者巡回培训正式启动报名!今年,我们选择了西安、武汉、北京、杭州、深圳、上海、成都这7座城市,为大家带来
    的头像 发表于 09-27 10:39 1141次阅读
    2025年<b class='flag-5'>RT-Thread</b>开发者巡回培训报名正式<b class='flag-5'>启动</b>!

    如何使用rt-thread studio中,使用 定制的SDK建立工程?

    --target=eclipse生成 rt-thread studio 工程 在rt-thread studio中,使用sdk Manager 导入配置成功。 配置成功了, 问题: 我如何使用在 rt-thread stud
    发表于 09-26 06:16

    为智能汽车打造“安全+效率+生态”内核,RT-Thread睿赛德重磅发布车控白皮书

    9月16日,RT-Thread睿赛德正式发布《RT-Thread程翧车控平台白皮书1.0》(2025),系统分析了车控操作系统领域格局与技术壁垒,以及集中、国产
    的头像 发表于 09-19 19:24 954次阅读
    为智能汽车打造“安全+效率+生态”内核,<b class='flag-5'>RT-Thread</b>睿赛德重磅发布车控白皮书

    rt-thread studio 2.2.9如何使用最新的RT-Thread v5.2.0 released?

    rt-thread studio2.2.9如何使用最新的RT-Thread v5.2.0 released? 原先以为修改index_all.json,发现联网的时候,会自动覆盖 另lastet版本
    发表于 09-16 06:06

    在Ubuntu上开发基于先楫MCU的RT-Thread应用指南

    1、前言RT-ThreadEnv是RT-Thread推出的开发辅助工具,针对基于RT-Thread操作系统的项目工程,提供编译构建环境、图形系统配置及软件包管理功能。其内置的menu
    的头像 发表于 08-29 12:22 1231次阅读
    在Ubuntu上开发基于先楫MCU的<b class='flag-5'>RT-Thread</b>应用指南

    【好书推荐】RT-Thread第20本相关书籍!《嵌入式实时操作系统RT-Thread原理与应用》| 技术集结

    01内容简介ContentSummary本书为读者提供了一个全面、系统的RT-Thread学习指南,旨在帮助初学者及有经验的开发者掌握RT-Thread实时操作系统和STM32嵌入式微控制器的核心
    的头像 发表于 08-24 10:05 688次阅读
    【好书推荐】<b class='flag-5'>RT-Thread</b>第20本相关书籍!《嵌入式实时操作系统<b class='flag-5'>RT-Thread</b>原理与应用》| 技术集结

    RT-Thread 遇上 Rust:安全内核 RusT-Thread 的诞生

    大家好,我们是中国科学技术大学操作系统原理与设计(H)课oooooS小组。这个项目是我们的课程大作业:参考RT-Thread架构,使用Rust搭建一个原生的嵌入式操作系统内核。初识Rust是因为xk
    的头像 发表于 08-02 11:03 3208次阅读
    <b class='flag-5'>RT-Thread</b> 遇上 Rust:安全内核 RusT-<b class='flag-5'>Thread</b> 的诞生

    用SPI玩转WiFi,RT-Thread ESP-Hosted驱动深度适配指南 | 技术集结

    还在为MCU的WiFi连接方案发愁?RT-Thread社区开源ESP-Hosted驱动,通过标准SPI接口即可实现,并且该仓库已整理成RT-Thread软件包。RT
    的头像 发表于 07-09 19:03 1118次阅读
    用SPI玩转WiFi,<b class='flag-5'>RT-Thread</b> ESP-Hosted驱动深度适配指南 | 技术集结

    RT-Thread荣获2025优秀开源项目 | 新闻速递

    6月底,RT-Thread睿赛德受邀参与由上海开源信息技术协会主办的2025上海开源创新精英荟。上海市商委副主任张杰出席会议并致辞。RT-Thread嵌入式操作系统项目凭借其卓越的技术创新与开源生态
    的头像 发表于 07-04 09:04 2431次阅读
    <b class='flag-5'>RT-Thread</b>荣获2025优秀开源项目 | 新闻速递

    深度剖析 RT-Thread 线程调度流程

    RT-Thread调度第一个线程的主要流程分如下:rtthread_startup:RTT的启动函数,主要负责板级驱动,调度器,系统线程初始化启动调度的工作
    的头像 发表于 06-25 18:24 1437次阅读
    深度剖析 <b class='flag-5'>RT-Thread</b> 线程调度流程

    揭秘RT-Thread上的AUTOSAR CP系统

    本文探讨了RT-Thread与AUTOSARCP的融合,解决车载ECU开发中实时性、安全性与灵活性的平衡问题。通过分层安全内核(rt-safetyos/autoos)和工具链整合,兼容AUTOSAR
    的头像 发表于 06-23 20:22 2944次阅读
    揭秘<b class='flag-5'>RT-Thread</b>上的AUTOSAR CP系统

    2025 RT-Thread全球技术大会议程正式发布!

    RT-ThreadGlobalTechConference(RT-ThreadGTC,RT-Thread全球技术大会)是聚焦基础软件技术创新与实践的嵌入式技术盛会,持续推动技术价值转化
    的头像 发表于 05-27 19:28 1072次阅读
    2025 <b class='flag-5'>RT-Thread</b>全球技术大会议程正式发布!

    RT-Thread审核团招募: 深度参与开源RTOS社区治理与演进

    全球开发者招募:RT-Thread审核团(ReviewTeam)正式开放申请!在开源的世界里,代码审查(CodeReview)是保证软件质量、促进技术交流的关键环节。RT-Thread作为全球领先
    的头像 发表于 05-21 18:02 1066次阅读
    <b class='flag-5'>RT-Thread</b>审核团招募: 深度参与开源RTOS社区治理与演进

    如何将RT-Thread移植到NXP MCUXPressoIDE上

    RT-Thread默认支持的IDE只有IAR 和 Keil, 那如何将RT-Thread移植到NXP MCUXPressoIDE上呢?本文内容比较简单但稍有琐碎,希望对有需要的小伙伴有所帮助。
    的头像 发表于 02-13 10:37 2440次阅读
    如何将<b class='flag-5'>RT-Thread</b>移植到NXP MCUXPressoIDE上