FreeRTOS

数据结构及链表节点项:List ListItem。

实现创建任务函数: TaskCreate Static or Dynamic。

Static:①定义任务栈起始地址及大小;

          ②定义任务句柄;

          ③定义任务函数;

 实现原理:

传入栈底 栈大小 任务函数 "任务名" 任务控制块。

               ①获取栈顶;

               ②向控制块填入"任务名";

               ③调用栈初始化函数:PC指向任务函数;

设定PC Lr Xpsr 指针,即初始化内核r0-r15寄存器。

               ④任务句柄指向控制块。

启动任务调度器:TaskStartSched()

               ①创建空闲任务;

               ②初始化响应时间最大;系统时间0U;

                   调度器运行标志。

               ③开启调度:PortStartSchedular();

               ④初始化Systick Pendsv中断优先级;

               ⑤初始化Systick系统时基 1ms;

               ⑥启动任务 不再返回。

调度器的作用:在Pendsv中寻找当前优先级最高的任务控制块,更新至当前任务控制块,从而在退出后运行当前更新任务运行高级函数,由此实现任务优先级的寻找与切换;

任务的切换:任务总是需要调度和轮番运行,所以不管什么优先级任务都需要交出CPU的使用权;所有任务都需要延时阻塞,否则高优先级任务如若没有延时阻塞将不被切换,导致低优先级任务永远无法获得执行;

任务的延时与阻塞:将Pendsv中断挂起,在Pendsv中断中将任务从就序列表移除并将其添加至延时列表中,切换一次任务(切换任务是在就绪任务列表中寻找,即移除任务在系统调度时不可见)将CPU交给同级或低级任务;

任务的恢复:启动任务调度器后,根据时基在Systick中执行时基更新与恢复等待任务列表;通过

xTaskIncrementTick 时基更新函数返回值判断是否需要一次任务的调度(因为调度是需要开销的,只有当前优先级最高且单任务运行时没有必要调度),只有当恢复的任务中出现更高级任务被唤醒时才需要进行任务的调度;
自此FreeRtos的基本架构已经建立(后续更新);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值