RT-Thread系列--启动过程

7 篇文章 2 订阅
订阅专栏
文章详细介绍了RT-Thread实时操作系统在STM32平台上的启动流程,从Reset_Handler开始,经过SystemInit和__main函数,通过补丁技术在main函数前进行系统初始化,包括时钟、堆、串口和调度器等的设置,最终进入main_thread_entry主线程执行原本的main函数。
摘要由CSDN通过智能技术生成

一、目的

RT-Thread是一个小而美的RTOS,所有的RTOS的都有一个特点,那就是存在调度器,像RT-Thread的调度器是一个实时抢占式调度器(同优先级任务使用时间片调度方式)。

本篇不讲调度器相关的内容,着重讲解调度器运行之前的启动过程,帮助大家理解OS启动过程。

二、介绍

本篇以STM32H750XBH6 Art-Pi硬件平台帮助大家理解

学习过STM32的同学都知道芯片上电后默认从Reset_Handler函数开始执行

; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler                    [WEAK]
        IMPORT  SystemInit
        IMPORT  __main

                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

上面的代码片段首先执行SystemInit函数,然后执行__main函数,__main函数里面执行一些分散加载的功能,最后调用main函数。

在RT-Thread中通过给main函数打补丁的方式在main函数执行之前做了一些系统初始化操作,包括时钟初始化、系统堆初始化、串口初始化、调度器初始化、软件定时器线程初始化,具体执行过程如上图所示。

#if defined(__CC_ARM) || defined(__CLANG_ARM)
extern int $Super$$main(void);
/* re-define main function */
int $Sub$$main(void)
{
    rtthread_startup();
    return 0;
}
#elif defined(__ICCARM__)
extern int main(void);
/* __low_level_init will auto called by IAR cstartup */
extern void __iar_data_init3(void);
int __low_level_init(void)
{
    // call IAR table copy function.
    __iar_data_init3();
    rtthread_startup();
    return 0;
}
#elif defined(__GNUC__)
/* Add -eentry to arm-none-eabi-gcc argument */
int entry(void)
{
    rtthread_startup();
    return 0;
}
#endif

关于$Sub$$main和$Super$$main的机制请参考《Arm Keil通过$Super\$$和$Sub\$$给已有符号打补丁》

在OS创建的main_thread_entry主线程中在调用原本的main函数。

/* the system main thread */
void main_thread_entry(void *parameter)
{
    extern int main(void);
    extern int $Super$$main(void);

#ifdef RT_USING_COMPONENTS_INIT
    /* RT-Thread components initialization */
    rt_components_init();
#endif
#ifdef RT_USING_SMP
    rt_hw_secondary_cpu_up();
#endif
    /* invoke system main function */
#if defined(__CC_ARM) || defined(__CLANG_ARM)
    $Super$$main(); /* for ARMCC. */
#elif defined(__ICCARM__) || defined(__GNUC__)
    main();
#endif
}

主线程中调用原本的main函数的代码

$Super$$main();

另外在启动过程中有个重要的组件初始化过程,至于其实现原理请参考《 RT-Thread系列--组件初始化》

RT-ThreadRTT启动流程
肥宅快乐博客
11-17 2472
文章目录RTOS的俩种启动方式方式一:先创建所有线程,再调度方式二:在启动线程中,创建线程RTT的启动流程1.上电后首先执行的复位函数2.调用__main函数3.main函数的预操作`$Sub$$main`函数`rtthread_startup()`函数`rt_application_init()`函数`main_thread_entry`函数4.main函数中创建线程 RTOS的俩种启动方式 R...
RT-Thread-MicroPython 用户手册.pdf
09-17
手册中包含了一系列的示例代码,涵盖了从基本操作到高级功能的使用,帮助开发者熟悉RT-Thread MicroPython的API和工作方式。 通过这份手册,开发者不仅可以理解RT-Thread MicroPython的特性和优势,还能快速掌握...
RT-Thread 启动流程详解
weixin_42530814的博客
04-23 1634
RT-Thread启动流程是操作系统初始化和运行应用程序之前的关键步骤。系统启动入口:RT-Thread 规定的统一启动入口是函数。不同的平台和编译器可能会有不同的启动文件和入口点,但最终都会调用这个函数。硬件初始化:在函数中首先进行的是硬件的初始化,这通常包括 CPU、内存、外设等的初始化。系统堆初始化:硬件初始化之后,系统会初始化系统堆,这是为应用程序和其他软件组件提供内存分配的基础。打印版本信息:系统会打印出 RT-Thread 的版本信息,这对于调试和确认系统状态很有帮助。定时器初始化。
RT-Thread 启动流程
最新发布
qq_24093081的博客
09-01 508
系统启动后先从汇编代码 startup_stm32f103xe.s 开始运行,然后跳转到 C 代码,进行 RT-Thread 系统启动,最后进入用户程序入口函数 main()。rt_hw_board_init() 中完成系统时钟设置,为系统提供心跳、串口初始化,将系统输入输出终端绑定到这个串口,后续系统运行信息就会从串口打印出来。main() 函数是 RT-Thread 的用户代码入口,用户可以在 main() 函数里添加自己的应用。(4)初始化定时器线程、空闲线程,并启动调度器。扩展功能的使用,详见。
RT-Thread启动流程
booksyhay的专栏
12-09 823
其中,rt_application_init()函数会创建“main”线程,线程函数为main_thread_entry(),该函数会调用用户的main()函数。最后,调用rt_system_scheduler_start()启动调度器。后面,rt_thread_idle_init()函数会创建idle线程。
RT-Thread学习笔记】01:RT-Thread系统启动流程
好奇的博客
05-01 1505
本文参考RT-Thread官方文档中心和RT-Thread创始人熊谱翔编写的《嵌入式实时操作系统:RT-Thread设计与实现》,官网给的资料很详细,书中和官网给的文档也一样。作这篇文章目的是加深印象。 在运行有RT-Thread操作系统的设备中,main()是用户程序入口,操作系统会启动一个主线程模块运行之。在运行主线程之前,需要先进行系统的初始化。故系统的一般启动顺序是 启动文件 → 在函数r...
RT-Thread OS的启动流程
weixin_34257076的博客
03-07 375
1、RT进入main之前, SystemInit函数初始化时钟。 2、main函数位于startup.c文件中。进行两个工作 系统开始前,rt_hw_interrupt_disable关闭所有中断。 之后使用rtthread_startup启动RTThread 3、函数rtthread_startup()完成的工作: 1、调用函数rt_hw_board_init 完成板子初始化工作 2、...
rt-thread-nano-3.1.3.rar
09-18
STM32系列是意法半导体推出的基于ARM Cortex-M处理器的微控制器,RT-Thread Nano 3.1.3版包含了对STM32的移植程序,使得开发者可以轻松地在STM32平台上运行Nano系统。移植过程包括配置启动代码、初始化硬件、设置...
STM32H750移植rt-thread操作系统完整工程.zip
05-17
5. **RTOS初始化**:调用rtthread_init()函数进行rt-thread的初始化,包括创建第一个线程、设置调度策略等。 6. **应用程序开发**:基于rt-thread的API开发用户应用,可以创建任务、信号量、消息队列等,实现特定的...
RT-thread+GD32F450+i2c
04-07
在本文中,我们将深入探讨如何在RT-thread操作系统上结合GD32F450系列微控制器(MCU)实现I2C通信。RT-thread是一个开源、实时、可扩展的嵌入式操作系统,广泛应用于物联网设备和智能硬件。GD32F450是兆易创新公司...
RT-Thread 嵌入式操作系统中文指导手册
03-10
RT-Thread 嵌入式操作系统中文指导手册
rt-thread-rt-smart.rar
04-12
这部分代码通常放在一个名为“rtthread_startup.s”或类似的汇编文件中。 5. **移植HAL**:将MCU的硬件抽象层(HAL)移植到RT-Thread,使得RT-Thread能与MCU的外设交互,如GPIO、UART、定时器等。 6. **构建系统**...
rt-thread启动流程(最详细教程)
记录自己工作生活中遇到的问题
05-16 1601
rt-thread启动流程
rt-thread启动流程分析(转载)
qq_21166415的博客
10-29 488
rt-thread启动流程分析 https://blog.csdn.net/qq_27508477/article/details/100089582
RTT(RT-Thread)内核启动流程详解
qq_25218501的博客
07-25 2324
启动的第一阶段从启动汇编代码开始执行,我们的编译环境一共有三种分别为MDK(如Keil5)、IAR、GCC(如VScode、CLion等),不同开发工具调用的函数都是不一样的,不过它们最终的结果都是进入到rtthread_startup函数里执行。我们使用的编译软件是RT Thread Stduio,它使用的是GCC编译环境,它执行完启动文件,然后经过入口函数entry()以后,最终调用了函数。
RT-Thread启动流程
qq_43460068的博客
09-24 1536
第二种我称之为小心翼翼,十分谨慎法,这种方法是在main函数中将硬件和RTOS系统初始化好,然后创建一个启动线程后就启动调度器,然后再启动线程里面在创建各种应用线程,当所有的线程都创建好之后,启动线程把自己删除,具体的伪代码实现如下。、应用线程的优先级比初始线程的优先级高,那创建完后立马去执行刚 刚创建的应用线程,当应用线程被阻塞时,继续回到初始线程被打断的地方继续往下执行, 直到所有应用线程创建完成,最后初始线程把自己关闭,完成自己的使命;到所有应用线程创建完成,最后初始线程把自己关闭,完成自己的使命。
rt_thread启动流程
weixin_38931060的博客
03-17 485
启动流程: 1:执行$sub$$main函数,此函数为main扩展函数,就相当于是在main函数里面进行操作,只是他是在执行main函数之前执行。   在components.c文件中有定义: /* $Sub$$main 函 数 */ int $Sub$$main(void) { rtthread_startup(); return 0; } 在这里 $Sub$$main 函数调用了 rtthread_startup() 函数,其中rtthread_startup() 函数的代码如下所示: int rtt
RT-Thread内核启动流程
caihaitao2000的博客
05-05 1355
一般了解一份代码大多从启动部分开始,同样这里也采用这种方式,先寻找启动的源头。RT-Thread 支持多种平台和多种编译器,而 rtthread_startup() 函数是 RT-Thread 规定的统一启动入口。一般执行顺序是:系统先从启动文件开始运行,例如,STM32平台的汇编语言编写的启动文件,然后进入 RT-Thread 的启动 rtthread_startup() ,最后进入用户入口 main()。如下图(此图是使用RT-Thread官网的图片)所示。 下面我们就以开发工具使用MDK为.
RT-Thread实时操作系统编程详解
RT-Thread内核包含了一系列组件,如实时内核、虚拟文件系统、轻型IP协议栈、shell系统、图形用户界面(GUI)等,这些组件使得RT-Thread能够在多种平台上运行,提供了丰富的功能和良好的可扩展性。 内核对象模型采用...
写文章

热门文章

  • 理解SPI/Dual SPI/Quad SPI/QPI之间的区别 35099
  • ESP32系列--ESP32各个系列对比 24432
  • ESP32S3系列--FLASH及PSRAM配置 19747
  • 手把手系列--STM32 QSPI操作指南 17147
  • 手把手系列--使用STM32CubeMX生成代码工程 16775

分类专栏

  • ESP32高级篇 付费 2篇
  • HPM5300 8篇
  • HPM6750 16篇
  • linux shell 4篇
  • c/c++ 9篇
  • visual studio code 1篇
  • Raspberry Pi Pico 12篇
  • 蓝牙基础 2篇
  • libuv 1篇
  • Linux内核 1篇
  • 链接器 8篇
  • STM32 18篇
  • ESP32 21篇
  • LwIP 8篇
  • RT-Thread 7篇
  • KEIL MDK 5篇
  • Core Audio API 1篇
  • 音频架构 2篇
  • FreeRTOS 4篇
  • 多线程开发 3篇
  • 音频播放器设计 3篇
  • ESP8266
  • 手把手系列--LVGL
  • 混音 1篇
  • K210 4篇
  • 语音应用框架设计 3篇

最新评论

  • 手把手系列--STM32H750移植FreeRTOS(三)--获取CPU占用

    Eminho: STM32H7 系列遇到 cpu utils 无法正常工作的问题。我很高兴在合适的时间看到这个项目!谢谢你!

  • Raspberry-Pi-PICO系列--第七篇 创建自己的工程

    Liu6889: 这样做的能编译通过,但是烧录后不执行是什么情况

  • 理解SPI/Dual SPI/Quad SPI/QPI之间的区别

    iwonako: DI = IO0,DO = IO1,那 IO2/IO3 呢?

  • HPM6750系列--第五篇 使用Segger Embedded Studio for RISC-V开发环境

    Eric Zane: 安装openocd的命令打错了,应该是brew install openocd

  • 手把手系列--STM32H750移植FreeRTOS

    EspL: 提取码失败诶

大家在看

  • 单片机通过AT指令控制ESP8266+TCP 实现收发数据
  • STM32--JQ8900语音模块
  • 论文 Python 实现WOA-CNN-BiGRU-Attention数据分类预测 64
  • 手环押金原路退回系统——足浴店——东方仙盟

最新文章

  • HPM5301系列--VSCODE开发环境问题修复(一)
  • Linux Shell编程系列--变量的定义与使用
  • Linux Shell系列--realpath 返回给定路径的规范化绝对路径名
2024年6篇
2023年48篇
2022年43篇
2021年14篇
2020年8篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家丹阳商场美陈装饰甘肃大型玻璃钢雕塑定做台湾仿铜玻璃钢雕塑菏泽玻璃钢雕塑安装吉林仿铜玻璃钢雕塑销售厂家安庆玻璃钢雕塑定制射洪玻璃钢卡通雕塑玻璃钢卡通门头雕塑设计哪里有陶瓷玻璃钢花盆批发安徽佛像玻璃钢雕塑方法广东商场美陈价格庆阳景区玻璃钢雕塑制作云南步行街玻璃钢雕塑四川户外装饰玻璃钢园林艺术雕塑巴中广场玻璃钢雕塑高质量玻璃钢雕塑批发武汉 玻璃钢雕塑佛像开模师台东玻璃钢雕塑马鞍山玻璃钢花盆花器惠州玻璃钢果蔬雕塑西湖区玻璃钢金属雕塑公司江苏商场创意商业美陈哪家好新乡镂空校园玻璃钢景观雕塑无锡有做玻璃钢马雕塑葡萄玻璃钢卡通雕塑设计厂家栾川玻璃钢雕塑加工厂家北京特色商场美陈价格金昌景区玻璃钢雕塑多少钱陕西个性化玻璃钢雕塑设计肇庆玻璃钢卡通雕塑经销商香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化