其他内容可以关注目录, FreeRTOS使用与内部机制(引言)-CSDN博客。
----------------------------------------------------------------------------------------------------------------------------
上一章虽然很短,但对于很多没接触过RTOS的小可爱来说,可能出手就是王炸。
其实也很能理解他们,毕竟我们一开始所接触到的单片机基本上单核CPU。
单核简单说,干活的只有一个人。如果这一个人能同时干两件事,甚至多件事,在生活中我们称这种人是"奇才"。
我们先大致看看这个"奇才",也就是CPU是怎么工作的。
我们将CPU暂且看作无情的机器,它只会按照特地的流程工作。
也就是别人说什么它就做什么。
而这个流程在哪?
当然是烧入进单片机Flash中的“代码”,对于STM32在通过ICode这条读指令总线可以获取相关指令码。
扩展:可能有些小伙伴有些疑惑了,我怎么好像记得还要加载到对应的RAM才能执行。其实你没有记错,对于 X86 或者 ARM-A 芯片的 CPU之类的是这样的,但这里的单片机运用了XIP技术。所谓XIP 全称为 eXecute In Place,即芯片内执行,是指 CPU 直接从存储器中读取程序代码执行,而不用再读到内存中。具体可以上网了解,本文重点不在这,就不过多阐述了。
CPU通过取到的指令码执行然后相关操作。
这一步,许多人也总结为“取指执行”。
现在我们执行下面两条简单的语句,看看CPU是怎么执行。
int a = 5
a = a + 2;
我们知道CPU是看不懂C语言的, 它只认识机器码,而我们大部分凡人是看不懂机器码的。
然而我们的前辈们也深知这一点,所以发明了相对于机器码更加有助于人类理解的助记符,也就是汇编。汇编与机器码之间存在一一对应的关系,所以我们需要用汇编当做桥梁翻译一下机器码。
例如a = a + 2用汇编的话说, 可以翻译成下面三句话。(这里备注一下,以后哪个地方可能还会见到。)
LDR R0, [a]
ADD R0, R0, #2
STM R0, [a]
对于大部分小可爱可能蒙了,脑海中估计在想:这啥意思啊?而且不就执行一句话, 怎么内部拆出了三个步骤。
先别慌,本文只会涉及一丢丢汇编,对于这三句话我接下来用通俗易懂的话翻译一遍。
在这之前我们先想想如何把大象装入冰箱,注意不要试图去问chatGPT。
第一步打开冰箱。
第二步把大象放进去,先别想怎么放进去的,我说能就是能。
第三步关上冰箱。
你看把大象放进冰箱都拆出了三步。
而执行a = a + 2;的时候,CPU先计入下a的值,存到某个寄存器中,然后对该值加2,在还给a。
这就是上面那条语句的理解。
聪明的小伙伴,可能发现了问题的关键。
在一段完整的程序中,我有这么多指令,CPU是根据什么判断我该执行那条语句呢?
一下子问到了关键,这也触及到了一点RTOS的“天机”。
这里就需要引入一点小知识:
在CPU内部有16个寄存器,其中就有一个叫PC寄存器的家伙,它作为指挥官,指挥着CPU将会执行哪。
有的小伙伴可能突然会问,如果它指挥错了呢?(坏笑)
你小子不对劲。
指挥错了当然是要坐牢的,而这个牢房就在某个异常中断中,你以后大可一试。
当然如果指挥的好可能会发挥奇效,还记得前面说过的两个函数,容我去CV过来。
void task1(void) {
int a = 0;
while(1) {
a++;
}
}
void task2(void) {
int a = 0;
while(1) {
a--;
}
}
有些小可爱那时不是疑惑,两个死循环怎么做到几乎同时运行的?现在可以回答了,这就是PC指挥的结果,一下指挥CPU去执行task1,一下指挥CPU去执行task2。
这下小可爱,心中是不是明朗了许多。
那是不是RTOS就是这样执行多任务的呢?
我的回答是,对也不对。因为内部细节还要复杂一点。
我们可以想这样一个问题,有一天你在看书,突然你妈叫你去买菜。
看书是任务1,买菜是任务2。
这时正在看书的你是不是需要加个书签,等做完任务2回来接着看。
而加书签的动作就是保存现场。
CPU好好的在执行一个任务的时候,突然被叫去做另一个任务,也需要保存好当前任务的现场,不然回来的时候都不知道从哪里做了,至于保存什么现场,那就是接下来几章的话题了。
本章用一句话总结RTOS执行多任务的核心秘方,就是PC寄存器有序指挥,加上现场工作的保存,才让两个乃至多个任务打破了while(1)的阻碍。
哎~不知道现实中有没有小可爱突破了爱情的阻碍。