【FreeRTOS操作系统教程】第13章 FreeRTOS任务优先级修改及其分配方案

标签:
fatfsfreertosstemwinstm32usb |
分类: FreeRTOS |
第13章
FreeRTOS任务优先级修改及其分配方案
本章节主要为大家讲解FreeRTOS任务优先级设置的注意事项、任务优先级的分配方案及其相关的一个例子,内容相对比较简单。
本章教程配套的例子含Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407以及F429。
13.1 任务优先级说明
13.2 任务优先级分配方案
13.3 中断优先级和任务优先级的区别
13.4 任务优先级修改
13.5 任务优先级获取
13.6 实验例程说明
13.7
13.1
任务优先级说明
下面对FreeRTOS优先级相关的几个重要知识点进行下说明,这些知识点在以后的使用中务必要掌握牢固。
u
u
u
Ø
²
²
²
Ø
²
²
²
²
u
(备注:没有定义configUSE_TIME_SLICING,也能使用时间片调度是因为此宏定义默认已经在FreeRTOS.h文件中使能)
u
13.2 任务优先级分配方案
对于初学者,有时候会纠结任务优先级设置为多少合适,因为任务优先级设置多少是没有标准的。对于这个问题,我们这里为大家推荐一个标准,任务优先级设置推荐方式如下图13.1所示:
图13.1 任务优先级分配方案
u
u
u
u
u
这里的优先级分配方案是我们推荐的一种方式,实际项目也可以不采用这种方法。调试出适合项目需求的才是最好的。
13.3 中断优先级和任务优先级区别
部分初学者也容易在这两个概念上面出现问题。简单的说,这两个之间没有任何关系,不管中断的优先级是多少,中断的优先级永远高于任何任务的优先级,即任务在执行的过程中,中断来了就开始执行中断服务程序。
另外对于STM32F103,F407和F429来说,中断优先级的数值越小,优先级越高。而FreeRTOS的任务优先级是,任务优先级数值越小,任务优先级越低。
13.4任务优先级修改
使用如下函数可以实现FreeRTOS的任务优先级修改:
u
关于这个函数的讲解及其使用方法可以看FreeRTOS在线版手册:
这里也对此函数进行下介绍。
函数原型:
void
vTaskPrioritySet( TaskHandle_t
xTask,
函数描述:
函数vTaskPrioritySet用于实现FreeRTOS任务优先级的修改。
u
u
使用这个函数要注意以下问题:
1.
#define
INCLUDE_vTaskPrioritySet
2.
3.
4.
#define
使用举例:
static TaskHandle_t xHandleTaskLED = NULL;
static void vTaskTaskUserIF(void *pvParameters)
{
}
static void AppTaskCreate (void)
{
}
13.5任务优先级获取
使用如下函数可以实现FreeRTOS的任务优先级获取:
u
关于这个函数的讲解及其使用方法可以看FreeRTOS在线版手册:
这里也对此函数进行下介绍。
函数原型:
UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask );
函数描述:
函数vTaskPriorityGet用于获取FreeRTOS任务优先级。
u
使用这个函数要注意以下问题:
1.
#define
INCLUDE_vTaskPriorityGet
2.
使用举例:
static TaskHandle_t xHandleTaskLED = NULL;
static void vTaskTaskUserIF(void *pvParameters)
{
}
static void AppTaskCreate (void)
{
}
13.6实验例程说明
13.6.1STM32F103开发板实验
配套例子:
V4-307_FreeRTOS实验_任务优先级修改
实验目的:
1. 学习FreeRTOS的任务优先级修改。
实验内容:
1.
2.
3.
4.
FreeRTOS的配置:
FreeRTOSConfig.h文件中的配置如下:
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
#endif
#define
configUSE_PREEMPTION
#define
configUSE_IDLE_HOOK
#define
configUSE_TICK_HOOK
#define
configCPU_CLOCK_HZ
#define
configTICK_RATE_HZ
#define
configMAX_PRIORITIES
#define configMINIMAL_STACK_SIZE
#define
configTOTAL_HEAP_SIZE
#define
configMAX_TASK_NAME_LEN
#define configUSE_TRACE_FACILITY
#define
configUSE_16_BIT_TICKS
#define
configIDLE_SHOULD_YIELD
#define
configGENERATE_RUN_TIME_STATS
#define
configUSE_STATS_FORMATTING_FUNCTIONS
#define
portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
#define
portGET_RUN_TIME_COUNTER_VALUE()
//#define
portALT_GET_RUN_TIME_COUNTER_VALUE
#define configUSE_CO_ROUTINES
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
#define
INCLUDE_vTaskPrioritySet
#define
INCLUDE_uxTaskPriorityGet
#define
INCLUDE_vTaskDelete
#define INCLUDE_vTaskCleanUpResources
#define
INCLUDE_vTaskSuspend
#define
INCLUDE_vTaskDelayUntil
#define
INCLUDE_vTaskDelay
#ifdef __NVIC_PRIO_BITS
#else
#endif
#define
configLIBRARY_LOWEST_INTERRUPT_PRIORITY
#define
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
FreeRTOS任务调试信息(按K1按键,串口打印):
上面截图中打印出来的任务状态字母B, R, D, S对应如下含义:
#define
tskBLOCKED_CHAR
#define
tskREADY_CHAR
#define
tskDELETED_CHAR
#define
tskSUSPENDED_CHAR
程序设计:
u
vTaskUserIF任务
vTaskLED任务
vTaskMsgPro任务 :2048字节
vTaskStart任务
任务栈空间是在任务创建的时候从FreeRTOSConfig.h文件中定义的heap空间中申请的
#define
configTOTAL_HEAP_SIZE
u
u
int main(void)
{
}
u
硬件外设的初始化是在bsp.c文件实现:
void bsp_Init(void)
{
}
u
static void AppTaskCreate (void)
{
}
u
static void vTaskTaskUserIF(void *pvParameters)
{
}
static void vTaskLED(void *pvParameters)
{
}
static void vTaskMsgPro(void *pvParameters)
{
}
static void vTaskStart(void *pvParameters)
{
}