FreeRTOS任务调度基本原理

FreeRTOS为了任务启动和任务切换使用了三个异常:SVC、PendSV和Systick。

SVC:(系统服务调用,系统调用)用于任务启动,有些操作系统不允许应用程序直接访问硬件,而是通过提供一些系统服务函数,用户程序使用SVC发出对系统服务函数的呼叫请求,以这种方式调用它们来间接访问硬件,它就会产生一共SVC异常。

PendSV:(可挂起系统调用)用于完成任务切换,它是可以像普通的中断一样被挂起,它的最大特性是如果当前优先级比它高的中断在运行,PendSV会延迟执行,直到高优先级中断执行完毕,这样产生的PendSV中断就不会打断其他中断的运行。

SysTick:用于产生系统节拍时钟,提供一共时间片,如果多个任务共享一共优先级,则每次Sys tick中断下一个任务将获得一个时间片。


任务:从系统的角度看,任务是竞争系统资源的最小运行单元。

在多任务系统中,每个任务都是独立的,互不干扰的,所以要为每个任务都分配独立的栈空间,这个栈空间通常是一个预先定义好的全局数组,也可以是动态分配的一段内存空间,但它们都是在RAM中。


任务控制块:在裸机系统中,程序的主体是CPU按照顺序执行的。但是在多任务系统中,任务的执行是由系统调度的。系统为了顺利的调用任务,为每个任务都额外的定义了一个任务控制块,这个任务控制块就相当于任务的身份证,里面有任务的所有信息,比如任务的栈指针、任务名称、任务的形参等。有了这个任务控制块之后,以后系统对任务的全部操作都可以通过这个任务控制块来实现。

一、任务的创建:(每个任务都有一个任务控制块,来记录该任务的所有信息,每个任务也有自己的栈)

1、获取栈顶地址,向下8字节对齐、存储任务名称,初始化优先级,
2、初始化任务栈,(1)xPSR寄存器压入栈,bit=1 Thumb状态16位(2)PC压入栈:执行任务函数(3)LR寄存器压入栈,任务返回地址,无限循环(4)
R12、R3、R2、R1、入栈,R0任务形参压入栈(5)剩余寄存器入栈:异常发生时手动加载到CPU寄存器的内容。R11、R10、R9、R8、R7、R6、R5、R4
3、将任务加入就绪列表。

二、启动调度器:

1、创建一个空闲任务,
2、初始Systick定时器,
3、找到向量表的起始地址中存储的MSP地址,设置主堆栈指针MSP的值,开中断和异常
4、系统调用SVC异常,启动第一个任务。(找到就绪列表中优先级最高的任务的任务控制块)

三、SVC异常中断:(启动第一个任务)
1、找到第一个要执行的任务的任务控制块,找到栈顶指针。
2、从栈里面把R4~R11寄存器内存出栈,模拟恢复现场。(中断发生时需要手动保护的寄存器)
3、将任务的栈顶指针更新到进程堆栈指针PSP。
4、向R14寄存器后4位,或上0x0d使得硬件在退出时使用进程堆栈指针PSP完成出栈操作并返回后进入线程模式、返回Thumb状态。
5、Bx R14,异常返回,这时候任务栈中的内容将使用PSP自动加载到CPU寄存器,xPSR、PC、R14、R12、R3、R2、R1、R0,同时更新PSP的值。(硬件会自动加载)

四:SYSTick中断:
1、更新xTickCount++系统时基,将延时列表中的所有任务的xTicksToDelay--,
2、有任务延时间到了,就把任务移除延时列表加入就绪列表。
3、产生PendSV异常,(在PendSV异常服务函数中完成任务切换)


五、PendSV异常服务函数:
1、保护上个任务的现场,(需要手动加载的)将PSP栈里面的内容保存到任务的栈中,其他寄存器已经自动加载了。
2、把R3和R14寄存器的值压入MSP,(R3保存的是pxCurrentTCB的地址)
3、完成任务切换,(更新了*pxCurrentTCB的值,指向了下一个要运行任务的控制块)
4、从主堆栈中恢复寄存器R3和R14的值,此时使用的是MSP
5、任务切换后pxCurrentTCB指向新的任务控制块,这样从新的任务栈里面恢复R4~R11寄存器。
6、将任务栈顶指针更新的PSP。
7、Bx r14 异常返回,硬件自动加载xPSR、PC、LR、R3、R2、R1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值