从0开始写RTOS—(嵌入式学习路线3)
·
前言
嵌入式以后想进入公司工作,必然还是要跑系统的,说到系统UCOS,RTOS,是比较常用的,刚好看到韦东山老师的从0开始写RTOS。费曼学习法开始(也方便后面自己记不住了拿来翻,哈哈哈)。
韦东山老师的B站课程
STM32:从0写RTOS,学习内部机制
学习RTOS有三个层次:
- 层次1:知道如何使用API
- 层次2:知道API的内部机制
- 层次3:掌握底层代码
为什么要使用RTOS
常见裸机编程中会使用轮询的方式进行事件的处理。
例如:
void main()
{
while(1)
{
执行事件1;
执行事件2;
}
}
这就相当于在执行1时,事件2被暂时搁置了。除了轮询制外,还可以使用事件驱动的方式来进行控制。事件是一个很宽泛的概念,什么是事件呢。
- 按下了按键
- 串口接收到了数据
- 模块产生了中断
- 全局变量被修改
但是使用事件去驱动的话,本质上任然有轮询方式的缺点。如果事件执行的时间也很长的话,也会影响事件的发生。
如何在裸机上解决这个问题呢。可以使用状态机的方式来解决这个问题。
void task_1(void)
{
static int state = 0;
switchi(state)
{
case 0 : //开始
{
//执行第一步
state++;
return;
}
case 1 :
{
//执行第二步
state++;
return;
}
case 2:
{
state++;
return;
}
}
}
把函数拆分成很多个片段,写程序很麻烦,且无法控制每个程序控制的事件。
RTOS的引入
在RTOS中,如何让一个程序运行,如何让一个程序暂停呢
为什么要用RTOS呢。裸机程序无法解决的问题可以用RTOS解决,同时写程序更加简单。什么东西叫程序,怎么保存程序。什么叫程序,
六条汇编指令
要想熟悉使用RTOS,则需要会使用一定的汇编指令。
- 读内存(load,缩写为LDR)
读内存的指令可以分解为三个部分。源在哪,目的在哪,长度是多少。列如:
LDR,R0,[R1,#4]
从R1+4中读取数据到R1中去。长度为4字节,由LDR自身决定。
- 写内存(store,简写为STR)
写内存,也需要知道源在哪,目的在哪,长度是多少。
STR,R1,[R2,#8]
从R1中读取数据,将其写入R2+8中。长度为4字节,由STR自身决定。
- 加/减(ADD/SUB)
加法例子:
ADD R0,R1,R2 等于 R0=R1+R2
ADD R0,R1, #1 等于 R0=R1+1
减法例子:
SUB R0,R1,R2 等于 R0=R1-R2
SUB R0,R1, #1 等于 R0=R1-1
- 比较(CMP)
CMP R0,R1 (结果保存在寄存器psr中)
- 跳转(B)
- 跳转加返回(BL 可以理解为branch和link)
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)