【学习笔记】rt-thread

任务

  • 创建好任务,不管是动态还是静态创建,任务的状态是init ,通过start方法来启动任务;
  • 线程大小 设置小了,无法正常工作?显示占空间100%

启动过程

TODO 这是编译器特性?

因为RT-Thread使用编译器(这里仅讲解KEIL,IAR或 者GCC稍微有点区别,但是原理是一样的)自带的$Sub$$和$Super$$这两个符号来扩展了main函数,使 用$Sub$$main可以在执行main之前先执行$Sub$$main,在$Sub$$main函数中我们可以先执行一些预操作,

RT-Thread通过扩展main函数的方式都在component.c 里面实现了硬件初始化,系统初始化

启动过程中函数sub and super - CC-ARM编译器的特性

S u b Sub Sub$ 与 S u p e r Super Super$ 的“补丁”功能(_CC_ARM编译器环境)

extern void ExtraFunc(void);     /* 用户自己实现的外部函数*/

void $Sub$$function(void)
{
    ExtraFunc();                 /* 做一些其它的设置工作 */
    $Super$$function();          /* 回到原始的function函数 */
}

/* ==在执行function函数执行会先执行function的扩展函数$Sub$$function,在扩展函数里面执行一些扩展的操作,
当扩展操作完成后,最后必须调用$Super$$function函数通过它回到我们原始的function函数== */
void function(void)
{
    /* 函数实体 */
}

main 是初始线程-main_thread_entry【main d的 while 需要吗?】

在这个初始线程里面创建各 种应用线程,当所有应用线程都成功创建好后,初始线程就把自己关闭。那么这个初 始线程就在rt_application_init()里面创建

注意他的优先级 是 最大/3
TODO 等下测试下;打印线程列表
在这里插入图片描述
在原有 main 函数中的while循环 还需要吗?一般不需要,没事做就不需要
只有在不写成while时 才会退出该线程;
【解释了一个现象,这种写法是错误的,强制占用该线程,导致所有优先级比 main_thread低的都无法执行(main 的优先级是 max/3)】

main(){
while(1){
//什么也没有
}
}

初始化内核

  • 板级硬件初始化
  • 定时器初始化-线程
  • 调度器初始化-任务模块
  • 信号量初始化
  • 空闲线程

线程设计

  • 中断函数 不能使用挂起当前线程的操作,
  • 不允许调用任何会阻塞运行的API函数接口
  • 空闲线程是唯一不允许出现阻塞情况的线程
  • 一般来说处理时间更短的线程优先级应设置更高一些。

执行时间

线程的执行时间一般是指两个方面,一是线程从开始到结束的时间-线程本身运行的时长,二是线程的周期-响应时间。
一般来说处理时间更短的线程优先级应设置更高一些,因为即时低优先级被抢占,也花费不了多少时间;

在系统设计的时候这两个时间候我们都需要考虑,例如,对于事件A对应的服务线程Ta,系统要求的实时响应指标是10ms,而Ta的最大运行时间 是1ms,那么10ms就是线程Ta的周期了,1ms则是线程的运行时间,简单来说线程Ta在10ms内完成对事件A的响应即可。此时,系统中还存在着 以50ms为周期的另一线程Tb,它每次运行的最大时间长度是100us。在这种情况下,即使把线程Tb的优先级抬到比Ta更高的位置,对系统的实 时性指标也没什么影响,因为即使在Ta的运行过程中,Tb抢占了Ta的资源,等到Tb执行完毕,消耗的时间也只不过是100us,还是在事件A规定 的响应时间内(10ms),Ta能够安全完成对事件A的响应。但是假如系统中还存在线程Tc,其运行时间为20ms,假如将Tc的优先级设置比Ta更高, 那么在Ta运行的时候,突然间被Tc打断,等到Tc执行完毕,那Ta已经错过对事件A(10ms)的响应了,这是不允许的。所以在我们设计的时候, 必须考虑线程的时间,一般来说处理时间更短的线程优先级应设置更高一些。

参考资料

内核移植 cortex-M

上下文切换
中断开关

接口-全局中断开关

PRIMASK 寄存器只有一位,屏蔽所有的可屏蔽中断

任务栈的初始化

cortex-m3的核心寄存器
在这里插入图片描述

主堆栈指针(MSP)进程堆栈指针(PSP)


R13在任何时刻只能是其中一个,默认情况为MSP,可以通过控制寄存器(CONTORL)来改变。

一般情况下,没有必要使用PSP,除非是有os存在时,MSP用于os内核的sp,而PSP用于thread级app的sp,这两个sp需严格分开。

LR 返回的地址

PC 当前运行地址

在这里插入图片描述

其他

create and init

创建- 动态创建对象 动态的内存,从无到有
初始化-静态创建对象,本来就有,静态的数据;

  • 23
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值