FreeRTOS之创建任务(静态创建为例)

从任务开始到调度过程:

简单讲述一个任务A的架构:

第一步、写一个数组,给他取名叫做任务A的任务栈,存放如下图这些数据的

FreeRTOS之创建任务(静态创建为例)_第1张图片

第二步、写一个结构体,给结构体取个名字叫任务控制块;写该结构体的成员,写好之后给这些成员取一些新的名字,分别叫做栈顶指针、任务节点、任务栈起始地址、任务名称(都是任务A的哦)

       简单解释一下每个名字的意思:

                                                            栈顶指针:顾名思义存放的是个指针,一直都会指向任务栈的栈顶,有着随时可变的属性,所以应该要用关键字volatile来修饰

                                                             任务节点:这个节点要加入后边的任务就绪列表里面,只有加入了任务就绪列表之后才能让系统找到他呀,不然系统也不认识他呀。

                                                             任务栈起始地址和任务名称没啥解释的,直接顾名思义就行,emmmm

第三步、写任务A函数,暂且叫他:taskA();

第四步、将前三步融合:创建任务;

     创建任务看起来很麻烦的地方应该是函数作为形参出现在函数里,简单例子理解:函数max(max(a,b),c);意思一目了然。当看见一大堆函数一定不要害怕,一害怕你还没开始你就输了,emmm,反正这函数也吃不了你,不要干,就是怂!

     直白来讲一下第四步是如何来融合前三步的吧:

           首先第一步里面建立的数组是有地址的,也就是数组的指针非空;第二步里面建立的结构体也是有地址的,也就是说结构体的指针非空;

            先把第一步和第二步融合一起,融合一起的方法很简单,把第一步写的数组的指针放入第二步结构体成员里的任务栈起始地址就行了,切记这里放入的是数组的指针哦。

            再融合第三部,更简单,把第三步的函数指针放入第一步里的数组里就行了,并给他起个名字叫PC

                   PC指针:指向当前运行指令的下一条指令的指针,也就是R15,参考代码    *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; //减一操作

 

好了,咱们核算一下咱们现在有什么了,首先咱们有一个任务A,然后任务A已经拥有了他的任务栈,任务栈里面有PC指针也就是要运行的任务函数入口地址,至此,静态任务建立完成!

              静态任务建立补充:虽然表述出来FreeRTOS静态任务创建过程中都主要干了什么,但是没有更细的去讲解,再细一点讲解的话无非就是如何实现第四步的融合算法,里面肯定有一些链表的初始化、节点插入链表和对栈操作的一些算法,这里不说了就,说了你也记不住,当然我也一样,也是当时记住了,知道怎么回事,后边使用都是直接移植过来用就行了。

 

阅读完毕记得点赞加关注呦!

 

 

 

 

 

 

 

            

 

     

 

 

 

 

 

你可能感兴趣的:(FreeRTOS,指针,链表,c语言)