rt-thread端口时钟使能_(2)RTThread启动过程分析

点击上方蓝字,关注微联智控工作室

可点击右上角的 …,分享这篇文章

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

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

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

e01ea6063811b051f052feadade98855.png

不带操作系统的单片机程序,一般都会从启动文件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编译器所规定的,如下图所示。

bbd8166b3b7e5f039adf7beb7982ff19.png

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

fa80bbbe887cd9bf2020d908fbd9b4ea.png

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

17162272d49cb97b3fad10948fb16488.png

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

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

6ec7f2b1e51b37e46000425d0b90e278.png

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

b662da56ca733c40ad03ef6332769391.png

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

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

9e057df05172074e936bb8e785c428b7.png

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

5ac28cf56aefafc0a95c1e388cddac77.png

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

d67f1b1250572274000331faf87eff4e.png

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

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

d96cd3a167fef6412c21cf60226ede91.png

感谢阅读!

-- END --


专辑 | 【开源】嵌入式物联网应用开发

专辑 | 嵌入式Linux应用程序开发

专辑 | 嵌入式Linux开发环境搭建

专辑 | 物联网BLE裸机程序开发

专辑 | 物联网BLE应用程序开发

专辑 | RT-Thread学习笔记

关注并回复【技术文档】,可下载所有专辑的PDF文档


欢迎关注 --- 微联智控工作室

356e714477cbe620444376cdb211bf4b.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值