求助STM32F103 FreeRTOS任务调度异常问题
系统设置2个任务,系统运行时出现一些异常现象,请问有没有遇到过?是什么原因引起的?方式1:系统运行正常
void Task1_Task(void * pvParameters)
{
while(1)
{
vTaskDelay(500); //延时函数(任务调度)
printf("Task1\r\n"); //串口打印
}
}
void Task2_Task(void * pvParameters)
{
while(1)
{
Delay_Ms(500); //延时函数(无任务调度)
LED_TOGGLE; //LED闪烁(取反)
}
}
方式2:任务1正常,任务2没反应,LED不闪烁
void Task1_Task(void * pvParameters)
{
while(1)
{
Delay_Ms(500); //延时函数(无任务调度)
printf("Task1\r\n"); //串口打印
}
}
void Task2_Task(void * pvParameters)
{
while(1)
{
vTaskDelay(500); //延时函数(任务调度)
LED_TOGGLE; //LED闪烁(取反)
}
}
方式3:任务1正常,任务2没反应,LED不闪烁
void Task1_Task(void * pvParameters)
{
while(1)
{
Delay_Ms(500); //延时函数(无任务调度)
printf("Task1\r\n"); //串口打印
}
}
void Task2_Task(void * pvParameters)
{
while(1)
{
Delay_Ms(500); //延时函数(无任务调度)
LED_TOGGLE; //LED闪烁(取反)
}
}
你可以试试把延迟Delay_Ms(500); 改短,看一下结果吗? 程序员 发表于 2018-10-8 11:46
你可以试试把延迟Delay_Ms(500); 改短,看一下结果吗?
改为延时50和延时100均不行,异常问题依旧,任务1能正常,任何2不执行:'( 本帖最后由 toofree 于 2018-10-8 12:29 编辑
Delay_Ms()是软件延时,死等吗?
在操作系统中最好不要用死等,除非任务之间有些条件,不得不这么做。
vTaskDelay()是任务阻塞时间,也就是释放当前任务时间,可以在这段时间内可以去执行别的任务。
任务优先级高的,可以打断优先级低的;但是不能打断同级别或高级别的。
一旦高优先级任务,来一个死等,那么其它同级或低级别的只能干瞪眼,执行不上任务。
你把两个任务的优先级掉换一下试试,数值大的优先级高,小的优先级低
楼上的正解。 toofree 发表于 2018-10-8 12:21
Delay_Ms()是软件延时,死等吗?
在操作系统中最好不要用死等,除非任务之间有些条件,不得不这么做。
vTa ...
Delay_Ms()是软件延时,死循环等待。
原来的优先级:
#define TASK1_TASK_PRIO 2
#define TASK2_TASK_PRIO 3
改为如下:问题依旧
#define TASK1_TASK_PRIO 3
#define TASK2_TASK_PRIO 2
改为如下:问题依旧
#define TASK1_TASK_PRIO 2
#define TASK2_TASK_PRIO 2 我觉得你的方式2和方式3的结果正常。反而方式1的两个任务都会执行,有点问题。你试一下将LED反转的函数换成printf,在看看结果 hu9977 发表于 2018-10-8 14:11
我觉得你的方式2和方式3的结果正常。反而方式1的两个任务都会执行,有点问题。你试一下将LED反转的函数换成 ...
为什么方式2和方式3的结果是正常呢?能否解析一下。我把LED反转的函数换成printf,任务1正常,任务2依然没执行,没有串口数据输出 你是刚弄RTOS吗?看看操作系统的基础书籍,有一些概念的认识
while(1)
{
Delay_Ms(500); //延时函数(无任务调度)
printf("Task1\r\n"); //串口打印
}
这个不会引起任务调度,会一直执行这个while循环。vTaskDelay会引起任务的调度,任务会交替执行。所以你如果想交替执行,你在上面的任务里加一个vTaskDelay()也可以。 hu9977 发表于 2018-10-8 14:25
你是刚弄RTOS吗?看看操作系统的基础书籍,有一些概念的认识
while(1)
{
嗯嗯,我是刚接触RTOS。
按照您的意思,是不是所有的任务里面都需要有vTaskDelay才会以前任务调度,系统才能正常的跑起来?