初级会员
- 积分
- 53
- 金钱
- 53
- 注册时间
- 2020-5-1
- 在线时间
- 17 小时
|
10金钱
我在学习FreeRTOS的自己写了一个程序,用来学习任务删除函数;程序里有两个task,一个led_task 用来闪灯,并且打印helloworld,另外一个则是按键检测key_task。当检测到有按键按下的时候,就删除helloWorld打印的任务;具体代码如下(STM32F407,heap_4);
问题在于,如果这两个任务的优先级设定相同时,key_task删除led_task任务后会导致代码卡在heap_4.c 的vPortFree 中的Configassert()中;如果两个任务优先级不同,则不会卡住。求大神指教这是为什么呢?为什么在任务优先级相同的时候会卡住呢?
主程序代码如下:
#define START_TASK_PRIO 1
#define START_STK_SIZE 128
TaskHandle_t StartTask_Handler;
void start_task(void *pvParameters);
#define LED0_TASK_PRIO 2
#define LED0_STK_SIZE 50
TaskHandle_t LED0Task_Handler;
void led0_task(void *p_arg);
#define KEY_TASK_PRIO 2
#define KEY_STK_SIZE 50
TaskHandle_t KEY0Task_Handler;
void key0_task(void *p_arg);
int main(void)
{
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
uart_init(115200);
LED_Init(); //LED初始化
KEY_Init(); //按键初始化
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();
xTaskCreate((TaskFunction_t) key0_task,
(const char * ) "key0_task",
(uint16_t) KEY_STK_SIZE,
(void*) NULL,
(UBaseType_t) KEY_TASK_PRIO ,
(TaskHandle_t*)&KEY0Task_Handler
);
xTaskCreate ((TaskFunction_t) led0_task,
(const char * ) "led0_task",
(uint16_t) LED0_STK_SIZE,
(void*) NULL,
( UBaseType_t )LED0_TASK_PRIO,
(TaskHandle_t*)&LED0Task_Handler );
vTaskDelete(StartTask_Handler);
taskEXIT_CRITICAL();
}
void led0_task(void *p_arg)
{
while(1)
{
LED0 = ~LED0;
vTaskDelay(1000);
printf("hello World ");
}
}
void key0_task(void *p_arg)
{
u8 keyValue;
while(1)
{
keyValue = KEY_Scan(0);
if(keyValue == KEY0_PRES)
{
printf("Delete LE0_TASK!");
vTaskDelete(LED0Task_Handler);
}
vTaskDelay(10);
LED1 = ~ LED1;
}
}
|
|