初级会员

- 积分
- 124
- 金钱
- 124
- 注册时间
- 2019-10-14
- 在线时间
- 24 小时
|
5金钱
本帖最后由 超级无敌磊果果 于 2020-3-11 16:17 编辑
这是程序,就一个互斥信号量的基础运用实验,但是他硬是不行,high_task请求高优先级任务的时候 low_task占用互斥信号量,那他的优先级应该会被临时拉高到high_task一样的优先级,使得medium_task任务阻塞,但是程序跑起来,中等优先级任务并未被阻塞
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "FreeRTOS.h"
- #include "task.h"
- #include "./KEY/key.h"
- #include "./TIM_Basic/tim_basic.h"
- #include "semphr.h"
- //任务优先级
- #define START_TASK_PRIO 1
- //任务堆栈大小
- #define START_STK_SIZE 128
- //任务句柄
- TaskHandle_t StartTask_Handler;
- //任务函数
- void Start_Task(void *pvParameters);
- //任务优先级
- #define LOW_TASK_PRIO 2
- //任务堆栈大小
- #define LOW_STK_SIZE 256
- //任务句柄
- TaskHandle_t Low_Handler;
- //任务函数
- void Low_Task(void *pvParameters);
- //任务优先级
- #define MEDIUM_TASK_PRIO 3
- //任务堆栈大小
- #define MEDIUM_STK_SIZE 256
- //任务句柄
- TaskHandle_t Medium_Task_Handler;
- //任务函数
- void Medium_Task(void *pvParameters);
- //任务优先级
- #define HIGH_TASK_PRIO 4
- //任务堆栈大小
- #define HIGH_STK_SIZE 256
- //任务句柄
- TaskHandle_t High_Task_Handler;
- //任务函数
- void High_Task(void *pvParameters);
- //定义互斥信号量
- SemaphoreHandle_t mutexsemaphore;
- int main(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
- delay_init(); //延时函数初始化
- uart_init(115200); //初始化串口
- LED_Init(); //初始化LED
- KEY_Config(); //初始化按键
-
- printf("\r\n互斥信号量操作实验\r\n\r\n");
-
- //创建开始任务
- xTaskCreate((TaskFunction_t )Start_Task, //任务函数
- (const char* )"start_task", //任务名称
- (uint16_t )START_STK_SIZE, //任务堆栈大小
- (void* )NULL, //传递给任务函数的参数
- (UBaseType_t )START_TASK_PRIO, //任务优先级
- (TaskHandle_t* )&StartTask_Handler); //任务句柄
- vTaskStartScheduler(); //开启任务调度
- }
- //开始任务任务函数
- void Start_Task(void *pvParameters)
- {
- taskENTER_CRITICAL(); //进入临界区
- //创建互斥信号量
- mutexsemaphore=xSemaphoreCreateMutex();
- if(mutexsemaphore==NULL)
- printf("semaphorebinary Create Failed in start_task()!\r\n");
- //创建Low任务
- xTaskCreate((TaskFunction_t )Low_Task,
- (const char* )"Task1_Task",
- (uint16_t )LOW_STK_SIZE,
- (void* )NULL,
- (UBaseType_t )LOW_TASK_PRIO,
- (TaskHandle_t* )&Low_Handler);
- //创建Medium任务
- xTaskCreate((TaskFunction_t )Medium_Task,
- (const char* )"Medium_task",
- (uint16_t )MEDIUM_STK_SIZE,
- (void* )NULL,
- (UBaseType_t )MEDIUM_TASK_PRIO,
- (TaskHandle_t* )&Medium_Task_Handler);
- //创建High任务
- xTaskCreate((TaskFunction_t )High_Task,
- (const char* )"High_task",
- (uint16_t )HIGH_STK_SIZE,
- (void* )NULL,
- (UBaseType_t )HIGH_TASK_PRIO,
- (TaskHandle_t* )&High_Task_Handler);
-
- vTaskDelete(StartTask_Handler); //删除开始任务
- taskEXIT_CRITICAL(); //退出临界区
- }
- //Low任务函数
- void Low_Task(void *pvParameters)
- {
- uint8_t i=0;
- while(1)
- {
- if(mutexsemaphore!=NULL)
- xSemaphoreTake(mutexsemaphore,portMAX_DELAY); //获取互斥信号量
- printf("Low Priority Task Running!\r\n");
- for(i=0;i<20;i++)
- {
- delay_ms(300);
- }
- xSemaphoreGive(mutexsemaphore); //释放互斥信号量
- vTaskDelay(1000);
- }
- }
- //Medium_Task任务函数
- void Medium_Task(void *pvParameters)
- {
- while(1)
- {
- printf("Medium Priority Task Running!\r\n");
- vTaskDelay(1000);
- }
- }
- //High_Task任务函数
- void High_Task(void *pvParameters)
- {
- while(1)
- {
- printf("High Priority Task apply Semaphare!\r\n");
- xSemaphoreTake(mutexsemaphore,portMAX_DELAY); //获取互斥信号量
- printf("High Priority Task Running!\r\n");
- xSemaphoreGive(mutexsemaphore); //释放互斥信号量
- vTaskDelay(1000);
- }
- }
复制代码
|
-
最佳答案
查看完整内容[请看2#楼]
自己写一个for死循环,不要用原子例程里的delay_ms(300),因为它那个可能是调用了系统的api函数把cpu释放掉了.
自己写个真正把cpu完全吃死的.
|