05嵌入式实时操作系统FreeRTOS任务调度.ppt
《05嵌入式实时操作系统FreeRTOS任务调度.ppt》由会员分享,可在线阅读,更多相关《05嵌入式实时操作系统FreeRTOS任务调度.ppt(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、嵌入式实时操作系统嵌入式实时操作系统FreeRTOSFreeRTOS原理及应用原理及应用基基于于STM32STM32微控制器微控制器嵌入式实时操作系统嵌入式实时操作系统FreeRTOS原理及应用原理及应用张超张超主编主编STM32Cortex-M4通用开发板通用开发板嵌入式实时操作系统嵌入式实时操作系统FreeRTOS原理及应用原理及应用开启调度器开启调度器任务的挂起和恢复任务的挂起和恢复任务的调度任务的调度FreeRTOS内核函数内核函数FreeRTOS任务调度任务调度主要内容:主要内容:一、开启调度器开启调度器FreeRTOS任务调度任务调度调度器开启函数调度器开启函数开启调度器开启调度器
2、调度器开启函数为vTaskStartScheduler(),该函数在tasks.c中定义。调度器开启过程调度器开启过程开启调度器开启调度器首先会创建一个空闲任务。如果配置了宏configUSE_TIMERS为1,则创建定时器服务任务。如果前面的任务创建成功,通过调用xPortStartScheduler()来初始化SysTick嘀嗒定时器作FreeRTOS操作系统的心跳时钟。然后启动第一个任务,启动任务后,程序将不会退出任务调度。启动第一个任务启动第一个任务开启调度器开启调度器在调度器的开启过程中,使用与移植层硬件密切相关的xPortStartScheduler()来初始化中断、嘀嗒定时器并启
3、动第一个任务。这部分代码与硬件密切相关,先设置PendSV和嘀嗒定时器的中断优先级为最低优先级,然后初始化嘀嗒定时器并使能嘀嗒定时器中断,对于有浮点运算的Cortex-M4等微控制器,使能FPU,最后调用prvStartFirstTask()打开中断,并触发SVC中断来启动第一个要运行的任务,至此,调度器开启完成。二、任务的挂起和恢复任务的挂起和恢复FreeRTOS任务调度任务调度任务的挂起任务的挂起任务的挂起和恢复任务的挂起和恢复任务挂起函数vTaskSuspend()。此函数用于将某个任务设置为挂起态,进入挂起态的任务永远都不会运行。退出挂起态的唯一方法就是调用任务恢复函数。任务挂起函数原
4、型为:voidvTaskSuspend(TaskHandle_txTaskToSuspend);任务任务的恢复的恢复任务的挂起和恢复任务的挂起和恢复将一个任务从挂起态恢复到就绪态,要使用任务恢复函数。任务恢复函数有二个版本,vTaskResume()和xTaskResumeFromISR(),后者是中断版本,在受FreeRTOS管理的中断服务函数中调用。1、任务恢复函数vTaskResume()。只有通过vTaskSuspend()挂起的任务,才能用vTaskResume()恢复,其函数原型为:voidvTaskResume(TaskHandle_txTaskToResume);任务任务的恢复
5、的恢复任务的挂起和恢复任务的挂起和恢复2、中断版本任务恢复函数xTaskResumeFromISR()在中断服务函数中使用,其函数原型为:BaseType_txTaskResumeFromISR(TaskHandle_txTaskToResume);三、任务的调度任务的调度FreeRTOS任务调度任务调度FreeRTOS任务切换场合任务切换场合任务的调度任务的调度FreeRTOS支持三种任务调度方式:抢占式调度、时间片调度和合作式调度。抢占式调度用于任务有不同优先级的场合。每一个任务都有不同的优先级,任务会一直运行到被高优先级任务抢占,或者遇到阻塞式的API函数调用,最简单的如vTaskDel
6、ay(),才让出CPU的使用权。抢占式任务调度总是选择就绪列表中最高优先级的任务来运行。时间片调度用于多个任务具有相同优先级场的合,当多个任务优先级相同时,每个任务在运行一个时间片后就让出CPU使用权。FreeRTOS任务切换场合任务切换场合任务的调度任务的调度FreeRTOS会在下面二种情况下执行任务切换(也称上下文切换)。1、执行一个系统调用。2、嘀嗒定时器中断。PendSV中断中断任务的调度任务的调度在STM32微控制器中,有SVC和PendSV二个系统中断,前者叫系统服务调用,简称系统调用,后者叫可挂起的系统调用。触发PendSV中断的方法是往ICSR(中断控制和状态寄存器)的bit2
7、8置1。PendSV中断的优先级可以通过编程进行设置,bit28置1后,若其中断优先级不够,则将等待更高优先级的中断执行完毕才会执行,这种特性,使PendSV中断非常适合在操作系统中用于任务切换。PendSV中断中断任务的调度任务的调度FreeRTOS通过将PendSV中断设置成最低优先级,使得在PendSV中断中进行的任务切换,延迟到所有其它中断服务函数都已处理完成之后才进行。查找下一个要运行的任务查找下一个要运行的任务任务的调度任务的调度在PendSV中断服务函数里通过vTaskSwitchContext()函数来查找下一个要运行的已经就绪且为最高优先级的任务,该函数在tasks.c中实现
8、,去掉条件编译后的代码为:查找下一个要运行的任务查找下一个要运行的任务任务的调度任务的调度voidvTaskSwitchContext(void)if(uxSchedulerSuspended!=(UBaseType_t)pdFALSE)/*调度器挂起则不能进行任务切换调度器挂起则不能进行任务切换*/xYieldPending=pdTRUE;elsexYieldPending=pdFALSE;traceTASK_SWITCHED_OUT();/*堆栈溢出检测,如果使能了的话堆栈溢出检测,如果使能了的话*/taskCHECK_FOR_STACK_OVERFLOW();/*使用通用方法或硬件方法查
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 05 嵌入式 实时 操作系统 FreeRTOS 任务 调度
限制150内