FreeRTOS内核 基于stm32 学习个人理解笔记(1)

一、任务和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函数会有两部分,第一部分恢复上次断点的数据,第二部分就是从上一次断点的地方执行(在属于这个任务的时间内)。第一部分就属于任务切换的开销。
        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值