前言

嵌入式以后想进入公司工作,必然还是要跑系统的,说到系统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)
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐