接上篇的优先级翻转
互斥量
#include "stm32f10x.h"
#include "led.h"
#include "stdio.h"
#include "usart1.h"
#include "systick.h"
#include "delay.h"
#include "my_key.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
#define QUEUE_LEN 8
#define QUEUE_SIZE 8
static TaskHandle_t AppTaskCreate_Handle = NULL;/* 创建任务句柄 */
static TaskHandle_t hight_Task_Handle = NULL;/* server 任务句柄 */
static TaskHandle_t med_Task_Handle = NULL;/* client 任务句柄 */
static TaskHandle_t low_Task_Handle = NULL;/* client 任务句柄 */
static void AppTaskCreate(void);/* 用于创建任务 */
static void low_Task(void* pvParameters);
static void med_Task(void* pvParameters);
static void hight_Task(void* parameter);
SemaphoreHandle_t MuxSem_Handle =NULL;//二值信号量句柄
int main(void)
{
BaseType_t xReturn = pdPASS;//创建任务返回值
NVIC_SetPriorityGrouping(3);
usrat1_config();
systick_config();
key_init();
led_config();
printf("hello\r\n");
//创建任务
/* 创建 AppTaskCreate 任务 */
xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,/* 任务入口函数 */
(const char *)"AppTaskCreate",/* 任务名字 */
(uint16_t )512,
(void *)NULL,
(UBaseType_t )1,
(TaskHandle_t* )&AppTaskCreate_Handle);/* 任务控制块指针 */
/* 启动任务调度 */
if (pdPASS == xReturn)
{
vTaskStartScheduler();
}
else
{
return -1;
}
while (1); /* 正常不会执行到这里 */
}
static void AppTaskCreate(void)
{
BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为 pdPASS */
taskENTER_CRITICAL();
MuxSem_Handle = xSemaphoreCreateMutex();//创建二值信号量
xSemaphoreGive(MuxSem_Handle);//释放
xReturn = xTaskCreate((TaskFunction_t )hight_Task,/* 任务入口函数 */
(const char *)"hight_Task",/* 任务名字 */
(uint16_t )128,
(void *)NULL,
(UBaseType_t )4,
(TaskHandle_t* )&hight_Task_Handle);/* 任务控制块指针 */
if(pdPASS == xReturn)
{
printf("hight任务创建成功\r\n");
}
xReturn = xTaskCreate((TaskFunction_t )med_Task,/* 任务入口函数 */
(const char *)"med_Task",/* 任务名字 */
(uint16_t )128,
(void *)NULL,
(UBaseType_t )3,
(TaskHandle_t* )&med_Task_Handle);/* 任务控制块指针 */
if(pdPASS == xReturn)
{
printf("med任务创建成功\r\n");
}
xReturn = xTaskCreate((TaskFunction_t )low_Task,/* 任务入口函数 */
(const char *)"low_Task",/* 任务名字 */
(uint16_t )128,
(void *)NULL,
(UBaseType_t )2,
(TaskHandle_t* )&low_Task_Handle);/* 任务控制块指针 */
if(pdPASS == xReturn)
{
printf("low任务创建成功\r\n");
}
vTaskDelete(AppTaskCreate_Handle); //删除 AppTaskCreate 任务
taskEXIT_CRITICAL();//退出临界区
}
//定义一个任务
static void hight_Task(void* parameter)
{
while(1)
{
printf("高优申请\r\n");
xSemaphoreTake(MuxSem_Handle,portMAX_DELAY);//申请
printf("高优获得\r\n");
printf("hight_run\r\n");
printf("高优释放\r\n");
xSemaphoreGive(MuxSem_Handle);//释放
vTaskDelay(500);
}
}
static void med_Task(void* parameter)
{
while(1)
{
printf("1\r\n");
vTaskDelay(500);
}
}
static void low_Task(void* parameter)
{
uint32_t i=0;
while(1)
{
xSemaphoreTake(MuxSem_Handle,portMAX_DELAY);//申请
printf("低优获得\r\n");
for(i=0;i<2000000;i++)
{
taskYIELD();//发起任务调度
}
xSemaphoreGive(MuxSem_Handle);//释放
vTaskDelay(500);
}
}
运行结果:
可以看到,当高优先级任务运行到延时后,转到中优先级,中优先级遇到延时后,转到低优先级,低优先级里面运行到调度函数,高优先级申请不到资源阻塞。接着中优先级并没有被调度运行,而是依旧运行低优先级任务。这就出现了优先级继承。