【RT-Thread专题连载2】RT-Thread启动过程分析

本文来源:微联智控工作室

在一些不使用操作系统的单片机软件工程里面,除了汇编启动文件之外,普遍认为程序入口就是main函数,很多程序代码都是从main函数开始进行分析的。

而对于RT-Thread实时操作系统,程序在跑到main函数之前,其实是进行了一系列的启动流程初始化工作,而这些初始化操作是针对RT-Thread内核和具体的板卡进行的,用户不需要干预这个启动流程。

在进入main函数之前,RT-Thread进行了如图所示的启动操作。

不带操作系统的单片机程序,一般都会从启动文件startup_xx.s直接跳转到main函数开始执行,而带RT-Thread操作系统的程序,在进入main函数之前,还进行了如上图所示的一系列操作。以上的操作看似复杂繁多,但其实主要是在调用main函数之前,调用了rtthread_startup函数。关于如何在调用main函数之前,调用rtthread_startup函数,不同的编译器有不同的操作。

对于MDK编译器,主要是使用了MDK的扩展功能 $Sub$$ 和 $Super$$ ,而对于IAR编译器,则是通过__low_level_init()函数,对于GCC编译器,则是通过entry函数,这些函数都是会在调用main函数之前被调用的。

以MDK编译器为例,给main函数添加一个 $Sub$$ 前缀,就形成了一个新的功能函数,这个功能函数会在调用main函数之前被调用,这是MDK编译器所规定的,如下图所示。

关于程序从启动文件跳转到main函数入口的关系,总结概括如下图所示。

在$Sub$$main函数里面,主要是调用了rtthread_startup()函数,这个函数是RT-Thread规定的统一启动入口,这个函数主要进行了如图所示的一系列初始化工作。

以下是关于rtthread_startup()函数里面各个函数的具体说明

1、关于rt_hw_board_init()函数,主要是初始化了中断向量表,完成了系统时钟的初始化,如果有使用到系统组件的话,同时初始化系统组件,并且设置打印信息的输出控制台,同时初始化系统堆内存,程序代码如下图所示。

2、关于rt_show_version()函数,主要是在信息控制台初始化成功后,打印RT-Thread内核的系统版本信息,这个函数的具体实现,如下图所示。

3、关于rt_system_timer_init()和rt_system_scheduler_init()函数,主要是初始化了系统定时器链表和RT-Thread系统调度器,由于调度器的实现原理略为复杂,此处暂不展开论述。

4、关于rt_application_init()函数,主要是创建了一个名为main的主线程,这个线程的函数入口是main_thread_entry,这里有两种创建方式,二选一,如果使用了系统堆内存,则使用动态创建的方式,线程使用的内存资源可以动态进行申请或释放,如果没有使用系统堆内存,则使用静态创建的方式,线程使用的内存资源是固定好的,不能被释放,函数实现如下图所示。

5、关于rt_system_timer_thread_init()函数,主要是初始化软件定时器的列表,并且采用静态方式创建一个名为timer的软件定时器,并且把软件定时器线程放入调度器里面,函数实现如下图所示。

6、关于rt_thread_idle_init()函数,主要是根据芯片CPU的数量,使用静态方式创建空闲线程,实际上,空闲线程并不空闲,这个线程在系统没有任何用户线程调度的时候,就会被调度起来,这个空闲线程主要是检查系统有没有已经消亡的线程,如果有,则把消亡线程的资源进行回收,如果系统使能了电源管理,则会让系统进行低功耗模式,函数的具体实现,如下图所示。

7、关于rt_system_scheduler_start()函数,主要是开始使能操作系统调度器,调度器启动后,会根据系统的调度规则,从线程就绪列表里面,选择优先级最高的线程进行启动。

8、从以上分析可知,RT-Thread系统在启动的时候,至少会启动一个main主线程和一个idle空闲线程,如果系统配置有使能软件定时器,还会启动一个timer定时器线程,也就是说,系统一旦启动后,就会有两个(或三个)线程在进行调度,如下图所示。

感谢阅读!



你可以添加微信17775982065为好友,注明:公司+姓名,拉进 RT-Thread 官方微信交流群!

RT-Thread


让物联网终端的开发变得简单、快速,芯片的价值得到最大化发挥。Apache2.0协议,可免费在商业产品中使用,不需要公布源码,无潜在商业风险。

长按二维码,关注我们

 点击阅读原文进入官网

你点的每个“在看”,我都认真当成了喜欢

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值