您的当前位置:首页正文

FreeRTOS任务调度基本原理

来源:筏尚旅游网

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

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

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

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


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

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


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

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

二、启动调度器:

三、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异常服务函数中完成任务切换)

因篇幅问题不能全部显示,请点此查看更多更全内容