RT-Thread自用记录(暂定)
此文章为理论居多,以及和FreeRTOS的对比。
想看代码实操,可以去看基于RT-Thread Studio的RT-Thread入门教程_rt-thread studio 开发threadx系统教程-CSDN博客
FreeRTOS和RTT的简单对比
RTOS与裸机对比
裸机程序架构
裸机的程序结构一般为前后台系统。程序包括一个死循环和若干个中断服务函数。简单来说前台系统就是中断服务程序。
总结下就是,前后台:死循环+中断。中断服务程序为前台系统。大循环为后台系统。
RTOS架构
主要通过优先级抢占和时间片轮转机制进行调度。可以保证高优先级的任务先执行。
内核基础
RT-Thread的启动流程
1.系统先从启动文件开始运行。2.进入RT-Thread启动函数,rtthread_startup()。3.进入用户的main函数
启动函数的作用
主要包括禁用系统中断,板级初始化,系统定时器和调度器的初始化。
stm32启动文件的作用
由下图可得知,启动文件有以下作用。
1.初始化SP指针
2.初始化PC指针,指向Reset_Handler。也就是执行复位中断服务函数
3.设置中断向量表
4.初始化时钟
5.调用main函数
启动文件执行完SystemInit后会跳转到entry函数,然后在entry函数中调用rtthtrad_startup()。
内核的配置方法
1.如果是用的RT-Thread Studio 的IDE则是配置RT-Thread Seting
2.直接配置rtcconfig.h文件,根据需求,修改里面的宏定义即可。
线程管理
概念介绍
线程是RT-Thread中最基本的调度单位。
FreeRTOS中的“任务”在RT-Thread中则称为”线程“。二者叫法不同,但是实际指代的对象是一样的。
线程控制块
每个线程都有直接的线程控制块。线程控制块存放着线程的基本信息,如:优先级,线程名称,线程状态等。
在FreeRTOS中则叫做”任务控制块“。
线程的状态
RT-Thread中线程的状态5钟有:初始态,就绪态,运行态,关闭态,挂起态。
FreeRTOS中,任务的状态有4种:就绪态,运行态,阻塞态,挂起态。
RT-Thread的状态比FreeRTOS多一个初始状态。所以RTT中的线程创建好后需要我们手动开启才能运行。
线程创建
RTT中的线程创建分为动态和静态。
区别:静态创建需要自己指定线程栈的起始地址(需要自己创建线程栈和定义线程控制块)。动态创建则是系统分配。此外,动态创建函数的返回值是线程控制块,静态创建函数的返回值是错误码。
简单来说就是创建参数不同,函数返回值不同。
空闲线程和空闲钩子函数
空闲线程是RTT中优先级最低的线程。用来处理一些非紧急任务,常用于系统指示灯的运行和CPU使用率的统计。
空闲钩子函数就是空闲线程执行时运行的函数。
时钟管理
时钟节拍介绍
时钟节拍(OSTick)是RTT的最小时间单位。系统采用时钟节拍进行周期性的中断,一般在1ms到100ms之间,可以自己设置。时钟节拍设置的越快的,实时响应旧越快,但是系统的开销就越大。
简单理解就是,每经过一个时钟节拍就会执行一个时钟节拍的中断。假设设置为1ms,则每1ms都会进行执行中断,就像STM32中的SysTick_Handler中断一样。
如何配置时钟节拍?
在rtconfig.h中,修改RT_TICK_PER_SECOND这个宏定义即可。
内核通过全局变量rt_tick记录当前的时钟节拍值。类似STM32HAL库中的uwTick。
全局变量rt_tick在每次时钟节拍中断时都会自加一次。我们也可以通过API获取当前时钟节拍值。
获取当前时钟节拍值的API:rt_tick_t rt_tick_get(void)
(这个地方面试容易问到)
同时和FreeRTOS一样,线程的调度也是在OS Tick中断中执行的。内容包括:先检查时间片是否超时,修改线程状态,是否进行线程调度,检查定时器链表等。
定时器
硬件定时器
软件定时器
定时器的工作机制