概述
一、任务和TCB
个人理解 任务就是一些命令的区块。在这点上和函数有相似的地方。任务就是对一个函数的“封装”处理。为什么要进行“封装”,直接拿函数来作为任务,会存在什么问题。假如有A,B两个函数,想要各自占用CPU的一半时间进行运算(先不关注是怎么切换的)。
假如现在从A函数切换到B函数,那怎么切换过去呢?最直接的做法就是取出B函数的指针,跳转到B函数的地址区域执行。但是如果这样做的话,每次切换的时候就会从A或B函数的第一条函数语句去执行。那实际上切换来切换去,其实啥也没有执行。那怎么办呢?那从切换前,需要把当前的执行的位置以及状态(临时变量、寄存器的值、执行位置)记录下来,下次轮到我的时候,把参数恢复,以便于从这个断点执行。这样就可以不断地推进了。
怎么保存当前的执行的位置以及状态呢?这个时候我们就需要用到了栈这种东西,把需要记录的数据push到栈里面,便于下次执行的时候pop出来,然后从当前位置执行。每个任务都有自己的栈区。其实就是一个预先定好的全局数组。数组的大小可以自定义,FresRTOS推荐的最小值是128,单位为字。
#define TASK1_STACK_SIZE 128
StackType_t Task1Stack[TASK1_STACK_SIZE]
Freertos属于多任务系统,StackType_t 是在portmarco.h被定义为size_t ,在该平台下是uint32_t类型,4字节。
如果要实现这种操作的话,除了函数指针,还需要栈的初始地址(栈底),以及栈顶(栈底的相对偏移量),如果要实现优先级的话还需要记录该任务的优先级的任务节点,以及这个任务的名称(用于调试)。把这些保存到一个结构体里面,就是我们认为的TCB(Task Control Block)
甚至我们可以理解TCB是一个”函数“,每次TCB函数(暂且这么称呼)切换时候,和普通函数一样,会从TCB函数第一条语句执行。这个和普通函数不一样的地方是TCB函数会有两部分,第一部分恢复上次断点的数据,第二部分就是从上一次断点的地方执行(在属于这个任务的时间内)。第一部分就属于任务切换的开销。
最后
以上就是自觉草莓为你收集整理的FreeRTOS内核 基于stm32 学习个人理解笔记(1)的全部内容,希望文章能够帮你解决FreeRTOS内核 基于stm32 学习个人理解笔记(1)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复