前言
本文将基于正点原子RTOS开发手册进行讲解任务的基础知识。
一、什么是多任务系统
我们平时使用的51,STM32单片机大家可能接触到的都是裸机,没有涉及到操作系统的知识。裸机处理程序一般运用的都是前后台系统,相对于多任务 系统而言,这个就是单任务系统。中断服务函数作为前台程序,大循环 while(1)作为后台程序。
前后台系统相对于操作系统而言上手比较简单,对于新手的学习比较友好。但是他相对于操作系统也有很多缺点,他的实时性差,执行代码只能一条一条的执行这样重要的程序可能就不能得到及时的处理,这样可能会导致程序的效果变差。
多任务系统就是创建多个任务,每一个任务都可以执行相应的功能,在RTOS操作系统中每一个任务都有自己的任务优先级,优先级高的任务会先执行,这样重要的任务就可以得到及时的处理,当执行玩优先级高的任务才会去执行优先级低的任务。
二、任务状态
1.运行态
当一个任务正在运行时,那么就说这个任务处于运行态,处于运行态的任务就是当前正在使用处理器的任务。如果使用的是单核处理器的话那么不管在任何时刻永远都只有一个任务处于运行态。
2.就绪态
处于就绪态的任务是那些已经准备就绪(这些任务没有被阻塞或者挂起),可以运行的任务,但是处于就绪态的任务还没有运行,因为有一个同优先级或者更高优先级的任务正在运行!
3.就绪态
如果一个任务当前正在等待某个外部事件的话就说它处于阻塞态,比如说如果某个任务调用了函数 vTaskDelay()的话就会进入阻塞态,直到延时周期完成。任务在等待队列、信号量、事件组、通知或互斥信号量的时候也会进入阻塞态。任务进入阻塞态会有一个超时时间,当超过这个超时时间任务就会退出阻塞态,即使所等待的事件还没有来临!
4.就绪态
像阻塞态一样,任务进入挂起态以后也不能被调度器调用进入运行态,但是进入挂起态的任务没有超时时间。任务进入和退出挂起态通过调用函数 vTaskSuspend()和 xTaskResume()。
任务间转换图
三、任务优先级
每一个任务都有属于自己的一个任务优先级,在RTOS中优先级可以设置为0~(configMAX_PRIORITIES-1),优先级数值越小代表优先级越低,configMAX_PRIORITIES-1为最高优先级。高优先级的任务可打断正在运行的低优先级任务,这也是RTOS操作系统的特性。 FreeRTOS 调度器确保处于就绪态或运行态的高优先级的任务获取处理器使用权,换句话说就是处于就绪态的最高优先级的任务才会运行。当宏 configUSE_TIME_SLICING 定义为 1 的时候多个任务可以共用一个优先级,数量不限。默认情况下宏 configUSE_TIME_SLICING 在文件FreeRTOS.h 中已经定义为 1。此时处于就绪态的优先级相同的任务就会使用时间片轮转调度器获取运行时间。
四、任务实现
在使用 FreeRTOS 的过程中,我们要使用函数osThreadDef()创建任务,什么是任务函数?任务函数就是完成本任务工作的函数。比如点亮一个LED灯这就是一个任务,我们就可以将他放在任务函数中去执行。
osThreadId AppTaskHandle;
void AppTask(void const * argument);
osThreadDef(AppTaskName, AppTask, osPriorityNormal, 0, 128);
AppTaskHandle = osThreadCreate(osThread(AppTaskName), NULL);
void AppTask(void const * argument)(1)
{
for(;;)(2)
{
(3)
osDelay(5);
}
}
(1)任务函数的本质还是一个函数,每一个函数都有自己的名字那么任务函数也有对应的名字,任务函数的返回类型一定要为 void 类型,也就是无返回值,而且任务的参数也是 void 指针类型的!任务函数的名字可以根据自己来定义。
(2)任务函数执行的过程就是一个大循环,for(;;)这和while循环都是差不多的,都是一个死循环。
(3)循环里面执行的是主要代码。
(4)FreeRTOS的延时函数,调用此函数才会释放资源。
总结
任务的基础知识就给大家讲解到这里,大家有什么不了解的地方可以留言或者私信。
|