Rt-thread学习笔记(一)--启动过程

\qquad 在一些不使用操作系统的单片机软件工程里面,除了汇编启动文件之外,普遍认为程序入口 就是 main 函数,很多程序代码都是从 main 函数开始进行分析的。
\qquad 而对于 RT-Thread 实时操作系统,程序在跑到 main 函数之前,其实是进行了一系列的启动 流程初始化工作,而这些初始化操作是针对 RT-Thread 内核和具体的板卡进行的,用户不需 要干预这个启动流程。
\qquad 在进入 main 函数之前,RT-Thread 进行了如图所示的启动操作。
在这里插入图片描述
\qquad 不带操作系统的单片机程序,一般都会从启动文件 startup_xx.s 直接跳转到 main 函数开始执 行,而带 RT-Thread 操作系统的程序,在进入 main 函数之前,还进行了如上图所示的一系 列操作。以 上 的 操 作 看 似 复 杂 繁 多 , 但 其 实 主 要 是 在 调 用 main 函 数 之 前 , 调 用 了 rtthread_startup 函数。关于如何在调用 main 函数之前,调用 rtthread_startup 函数,不同的 编译器有不同的操作。
\qquad 对于 MDK 编译器,主要是使用了 MDK 的扩展功能 $Sub\$$ 和$Super\$$ 而对于 IAR 编译 器,则是通过__low_level_init()函数,对于 GCC 编译器,则是通过 entry 函数,这些函数都 是会在调用 main 函数之前被调用的。
\qquad 以 MDK 编译器为例,给 main 函数添加一个 $Sub$$ 前缀,就形成了一个新的功能函数, 这个功能函数会在调用 main 函数之前被调用,这是 MDK 编译器所规定的,具体可以查看以 下链接:
ARM® Compiler v5.06 for µVision®armlink User Guide
\qquad 关于程序从启动文件跳转到 main 函数入口的关系,总结概括如下图所示。
在这里插入图片描述

\qquad 在$Sub$$main 函数里面,主要是调用了 rtthread_startup()函数,这个函数是 RT-Thread 规定 的统一启动入口,这个函数主要进行了如图所示的一系列初始化工作。
在这里插入图片描述
\qquad 以下是关于 rtthread_startup()函数里面各个函数的具体说明。
\qquad 1. 关于 rt_hw_board_init()函数,主要是初始化了中断向量表,完成了系统时钟的初始化, 如果有使用到系统组件的话,同时初始化系统组件,并且设置打印信息的输出控制台, 同时初始化系统堆内存,程序代码如下图所示。
在这里插入图片描述
\qquad 2. 关于 rt_show_version()函数,主要是在信息控制台初始化成功后,打印 RT-Thread 内核 的系统版本信息,这个函数的具体实现,如下图所示。
在这里插入图片描述
\qquad 3. 关于 rt_system_timer_init()和 rt_system_scheduler_init()函数,主要是初始化了系统定时 器链表和 RT-Thread 系统调度器,由于调度器的实现原理略为复杂,此处暂不展开论述。
\qquad 4. 关于 rt_application_init()函数,主要是创建了一个名为 main 的主线程,这个线程的函数 入口是 main_thread_entry,这里有两种创建方式,二选一,如果使用了系统堆内存, 则使用动态创建的方式,线程使用的内存资源可以动态进行申请或释放,如果没有使用 系统堆内存,则使用静态创建的方式,线程使用的内存资源是固定好的,不能被释放, 函数实现如下图所示。
在这里插入图片描述

\qquad 5.关于 rt_system_timer_thread_init()函数,主要是初始化软件定时器的列表,并且采用静 态方式创建一个名为 timer 的软件定时器,并且把软件定时器线程放入调度器里面,函 数实现如下图所示。
在这里插入图片描述
\qquad 6.关于 rt_thread_idle_init()函数,主要是根据芯片 CPU 的数量,使用静态方式创建空闲线程,实际上,空闲线程并不空闲,这个线程在系统没有任何用户线程调度的时候,就会 被调度起来,这个空闲线程主要是检查系统有没有已经消亡的线程,如果有,则把消亡 线程的资源进行回收,如果系统使能了电源管理,则会让系统进行低功耗模式,函数的 具体实现,如下图所示。
在这里插入图片描述
\qquad 7. 关于 rt_system_scheduler_start()函数,主要是开始使能操作系统调度器,调度器启动后, 会根据系统的调度规则,从线程就绪列表里面,选择优先级最高的线程进行启动。
\qquad 8. 从以上分析可知,RT-Thread 系统在启动的时候,至少会启动一个 main 主线程和一个 idle 空闲线程,如果系统配置有使能软件定时器,还会启动一个 timer 定时器线程,也就是 说,系统一旦启动后,就会有两个(或三个)线程在进行调度,如下图所示。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值