上一讲反思
作为刚接触freertos的小菜,在观看完原子哥的移植视频后,感觉自己对实时系统还是有点不太了解。原因在于原子哥在上一讲的主题是从stm32到freertos的移植,并没有对其中的程序框架做出详细的解释,再加上自己对于其中的有些东西不了解(也没有私下里解决自己的疑惑)。这一讲当中,我会将我上一讲所遇到的不理解的问题会与大家分享。首先先步入主题,为大家讲讲原子哥这一讲当中讲了什么,个人认为所需要掌握的知识点有哪些。
主体内容
关于freertos的任务特性大家就简单了解了解即可,不必要深究,因为大家正像原子哥说的,我们学这个目的主要是为了用,而不是看。
这个非常重要!!!
(个人理解)
首先运行态,顾名思义代表的是这部分代码正在运行,相当于该函数放在了while循环里,一直运行。
就绪态,enmmm,这里举个小例子,有甲、乙运动员,两个运动员正在参加接力比赛,甲运动员作为第一棒在起跑线准备起跑,在听到枪声后,开始起跑(相当于现在甲运动员已经处在运行态),而乙运动员作为第二棒,在等待甲运动员交接接力棒,这种等待过程为就绪态,顾名思义,就绪态相当于已经做好准备,等待下一次程序运行,如果该部分代码运行后,也相当于从就绪态转变为运行态了,同理,运行态也能转变为就绪态。我们应该知道实时操作系统中每个函数之间都是有不同的优先级的。优先级高的,自然而然最先运行。
阻塞态相当于我们常常使用的if条件语句,在系统中也是如此,如果该部分代码没有接收到可以满足运行的条件时,该程序相当于是阻塞态,也相当于我们写程序时经常将不想执行的代码屏蔽掉。
挂起态,大家如果学linux的话,大部分人应该用到过虚拟机,在虚拟机上就有这么一个功能“挂起”,当你使用这个功能后,该系统会暂停运行,也相当于我们在程序仿真的的时候加的断点。
正如我上面所讲的,实时操作系统freertos中每个任务都会有优先级,优先级高的,优先运行。那么在程序中我们是怎么设置每个任务的优先级的呢。
这个宏定义当中,表示的是最多能设置多少个优先级,而不是这个处于第几优先级,相当于是任务优先级的容量吧!!!
这里的for(;;)相当于我们的while()。
这个vATASKFunction函数相当于是main函数。
但是大家看幻灯片有一段文字,这段文字说的是,在这一段任务执行周期内,如果想要退出这个任务,必须加这个函数来删除任务。
vTASKDelete(NULL);
这里任务堆栈,由于我刚开始对堆栈这个概念不太理解,所以我就搜一下360百科,结果如下:
在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。要点:堆,队列优先,先进先出。栈,先进后出(First-In/Last-Out)。
其中我觉得最重要的还是这句话“主要功能是暂时存放数据和地址”。
原子哥也是这么讲的,其中需要特别注意的是程序中所设置的堆栈大小并不是真正的所需要存放的寄存器的字节。解释如下:
这个变量显示的是无符号型32位的,相当于是4个字节,在前面设置的堆栈大小是128,则相当于堆栈所能存储的寄存器字节为128*4=512字节。一般程序不能正常运行,大部分原因都是自己设置的堆栈太小。
好了,以上就是我对于第二讲的理解,可能会有理解不对的地方,如果有,希望大家批评指正。下一讲继续为大家分享我的freertos学习收获,谢谢!!!