1、任务优先级
每个任务都可以分配一个从0~(configMAX_PRIORITIES-1)的优先级,configMAX_PRIORITIES在文件FreeRTOS.h中有定义,前面我们讲解FreeRTOS系统配置的时候已经讲过了。如果所使用的硬件平台支持类似计算前导零这样的指令(可以通过该指令选择下一个要运行的任务,Cortex-M处理器是支持该指令的),并且宏configUSE_PORT_OPTIMISED_TASK_SELECTION 也设置为了1,那么宏configMAX_PRIORITIES不能超过32!也就是优先级不能超过32级。其他情况下configMAX_PRIORITIES可以为任意值,但是考虑到RAM的消耗,宏configMAX_PRIORITIES最好设置一个满足应用的最小值。
优先级数字越低表示任务的优先级越低,0的优先级最低,configMAX_PRIORITIES-1的优先级最高。空闲任务的优先级最低,为0.
FreeRTOS调度器确保处于就绪态或者运行态的高优先级的任务获取处理器使用权,换句话说就是处于就绪态的最高优先级的任务才会运行。当宏configUSE_TIME_SLICING定义为1的时候多个任务可以公用一个优先级,数量不限。默认情况configUSE_TIME_SLICING在文件FreeRTOS.h中已经定义为1.此时处于就绪态的优先级相同的任务就会使用时间片轮转调度器获取运行时间。
2、任务实现
在使用FreeRTOS的过程中,我们要使用函数xTaskCreate()或xTaskCreateStatic()来创建任务,这两个函数的第一个参数pxTaskCode,就是这个任务的任务函数。什么是任务函数?任务函数就是完成本任务工作的函数。我这个任务要干嘛?要做什么?要完成什么样的功能都是在这个任务函数中实现的。比如我要做一个任务,这个任务要点流水灯,那么这个流水灯的程序就是任务函数中实现的。FreeRTOS官方给出的任务函数模板如下:
void vATaskFunction(void * pvParameters) (1)
{
for(; ;) (2)
{
---任务应用程序---(3)
vTaskDelay();(4)
}/*不能从任务函数中返回或者退出,从任务函数中返回挥着退出的话就会调用configASSERT(),前提是你定义了configASSERT()。如果一定要从任务函数中退出的话那一定要调用函数vTaskDelete()来删除此任务*/
vTaskDelete(NULL); (5)
}
(1):任务函数本质也是函数,所以肯定有任务名什么的,不过这里我们要注意:任务函数的返回类型一定要为void类型,也就是无返回值,而且任务的参数也是void指针类型的 。任务函数名可以根据实际情况定义。
(2):任务的具体执行过程是一个大循环,for(;;)就代表一个循环
(3):循环里面就是真正的任务代码,此任务具体要干的活就在这里实现
(4):FreeRTOS的延时函数,此处不一定要用延时函数,其他只要能让FreeRTOS发生任务切换的API函数都可以,比如请求信号量、队列等,甚至直接调用任务调度器。最常用就是延时函数
(5):任务函数一般不允许跳出循环,如果一定要跳出循环的话,在跳出循环以后一定要调用函数vTaskDelete(NULL)删除此任务
FreeRTOS的任务函数和Ucos的任务函数模式基本相同,其他的也基本是这种方式 |