FREERTOS线程调度感觉有问题啊
本帖最后由 心然 于 2020-5-24 16:06 编辑线程任务用的是统一个函数,在创建时传入不同参数,一共创建8个线程,运行log上看出两个问题:
1. 代码中的红色字体log中只打印了一次,讲道理应该是8次
2. 另外每次切换线程时总是先执行任务再执行其他的任务
使用cube生成的工程,freertos也是cube上面的,哪位能说下原因呢
代码:
void test_Task(void *argument)
{
printf("task[%s] start\r\n", (char*)argument);
while(1)
{
printf("[%s] running\r\n", (char*)argument);
osDelay(2000);
}
}
void main(void)
{
for(int i = 0; i < 8; i++)
{
UART_TaskHandle = osThreadNew(test_Task, UART_Task_attributes.name, &UART_Task_attributes);
osDelay(200);
}
}
LOG:
task start
running
running
running
running
running
running
running
running
running
running
running
running
running
running
running
printf("task[%s] start\r\n", (char*)argument); while(1)上面加个全局变量累加,结果也加上去了,说明8个任务是创建成功了,不知道为什么printf的打印这么奇怪 心然 发表于 2020-5-24 16:29
while(1)上面加个全局变量累加,结果也加上去了,说明8个任务是创建成功了,不知道为什么printf的打印这么 ...
直接用HAL_UART_TRANSMIT发送也是一样的结果,编译器优化等级是0 这是要测试什么。 eric2013 发表于 2020-5-25 11:17
这是要测试什么。
我想开多个线程来处理相同的任务,线程创建的时候传入不同的参数来区分不同的任务 我估计是你串口发送函数不合理,之前的函数没执行完,后续的发送函数就打断了之前的发送,或者后者被忽略而返回。 glory 发表于 2020-5-26 09:38
我估计是你串口发送函数不合理,之前的函数没执行完,后续的发送函数就打断了之前的发送,或者后者被忽略而 ...
直接调用hal库也不行,
另外每次切换线程都先切到uart1才能切到别的线程 心然 发表于 2020-5-26 20:23
直接调用hal库也不行,
另外每次切换线程都先切到uart1才能切到别的线程
红色部分只打印一次是因为你所有的任务都是同一个优先级,同时创建,同时运行,在打印第一个task start时,别的也在打印,打印最终是调用串口的,串口函数是不支持重入的,所以别的打印就会异常,导致解析不出来,无论是调用printf还是hal的uarttransmit都必须做互斥处理,做了互斥处理就不会有问题了。 李益达 发表于 2020-5-28 17:16
红色部分只打印一次是因为你所有的任务都是同一个优先级,同时创建,同时运行,在打印第一个task start时 ...
嗯,我验证试试,不过我试过错开200ms创建也是一样的问题。
还有就是下面的每次切换线程时总是先打印 running再切到其他线程,这个问题您清楚原因吗 void test_Task(void *argument)
{
printf("task[%s] start\r\n", (char*)argument);
osDelay(2000);
while(1)
{
printf("[%s] running\r\n", (char*)argument);
osDelay(2000);
}
}
页:
[1]