安富莱电子 www.armfly.com
安富莱_STM32-V5开发板_FreeRTOS教程(V1.0)
任务的创建,删除,挂起和恢复, 设置任务 vTaskLED 的优先级
/* 打印任务执行情况 */
printf("=================================================\r\n");
printf("任务名 任务状态 优先级 剩余栈 任务序号\r\n");
vTaskList((char *)&pcWriteBuffer);
printf("%s\r\n", pcWriteBuffer);
printf("\r\n任务名 运行计数 使用率\r\n");
vTaskGetRunTimeStats((char *)&pcWriteBuffer);
printf("%s\r\n", pcWriteBuffer);
/* 删除任务vTaskLED */
printf("删除任务vTaskLED\r\n");
if(xHandleTaskLED != NULL)
{
vTaskDelete(xHandleTaskLED);
xHandleTaskLED = NULL;
}
break;
/* 重新创建任务vTaskLED */
printf("重新创建任务vTaskLED\r\n");
if(xHandleTaskLED == NULL)
{
xTaskCreate( vTaskLED, /* 任务函数 */
"vTaskLED", /* 任务名 */
512, /* stack大小,单位word,也就是4字节 */
NULL, /* 任务参数 */
2, /* 任务优先级*/
&xHandleTaskLED ); /* 任务句柄 */
}
break;
/* 挂起任务vTaskLED */
printf("挂起任务vTaskLED\r\n");
vTaskSuspend(xHandleTaskLED);
break;
/* 恢复任务vTaskLED */
printf("恢复任务vTaskLED\r\n");
vTaskResume(xHandleTaskLED);//中断服务程序中使用xTaskResumeFromISR()
/* 中断方式恢复任务vTaskLED */
初始化优先级分组
/* 优先级分组设置为4,可配置0-15级抢占式优先级,0级子优先级,即不存在子优先级。*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
1.初始化阶段,添加定时器中断
bsp_InitHardTimer(); /* 初始化TIM2定时器 */
2.添加中断回调函数,用于恢复任务
/*
*********************************************************************************************************
* 函 数 名: TIM_CallBack1
* 功能说明: 定时器中断的回调函数,此函数被bsp_StartHardTimer所调用。
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void TIM_CallBack1(void)
{
BaseType_t xYieldRequired;
/* 恢复挂起任务 */
xYieldRequired = xTaskResumeFromISR(xHandleTaskLED);
/* 退出中断后是否需要执行任务切换 */
if( xYieldRequired == pdTRUE )
{
portYIELD_FROM_ISR(xYieldRequired);
}
}
/*
*********************************************************************************************************
* 函 数 名: vTaskLED
* 功能说明: LED闪烁
* 形 参: pvParameters 是在创建该任务时传递的形参
* 返 回 值: 无
* 优 先 级: 2
*********************************************************************************************************
*/
static void vTaskLED(void *pvParameters)
{
while(1)
{
bsp_LedToggle(2);
vTaskDelay(200);
}
}
中 断 优 先 级 和 任 务 优 先 级
中断的优先级永远高于任何任务的优先级,即任务在执行的过程中,中断来了就开始执行中
断服务程序。
另外对于 STM32F103,F407 和 F429 来说,中断优先级的数值越小,优先级越高。而 FreeRTOS
的任务优先级是,任务优先级数值越小,任务优先级越低。
/*设置任务 vTaskLED 的优先级*/
printf("设置任务 vTaskLED 的优先级为 1\r\n");
vTaskPrioritySet( xHandleTaskLED, 1);
printf("任务 vTaskLED 的优先级已经设置为:%d\r\n",(int)uxTaskPriorityGet(xHandleTaskLED));
使用vTaskPrioritySet()函数需要在 FreeRTOSConfig.h 配置文件中配置如下宏定义为 1
#define INCLUDE_vTaskPrioritySet 1