心然 发表于 2020-5-24 15:54:36

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






心然 发表于 2020-5-24 16:27:37

printf("task[%s] start\r\n", (char*)argument);

心然 发表于 2020-5-24 16:29:41

while(1)上面加个全局变量累加,结果也加上去了,说明8个任务是创建成功了,不知道为什么printf的打印这么奇怪

心然 发表于 2020-5-24 22:38:00

心然 发表于 2020-5-24 16:29
while(1)上面加个全局变量累加,结果也加上去了,说明8个任务是创建成功了,不知道为什么printf的打印这么 ...

直接用HAL_UART_TRANSMIT发送也是一样的结果,编译器优化等级是0

eric2013 发表于 2020-5-25 11:17:45

这是要测试什么。

心然 发表于 2020-5-25 20:19:48

eric2013 发表于 2020-5-25 11:17
这是要测试什么。

我想开多个线程来处理相同的任务,线程创建的时候传入不同的参数来区分不同的任务

glory 发表于 2020-5-26 09:38:31

我估计是你串口发送函数不合理,之前的函数没执行完,后续的发送函数就打断了之前的发送,或者后者被忽略而返回。

心然 发表于 2020-5-26 20:23:03

glory 发表于 2020-5-26 09:38
我估计是你串口发送函数不合理,之前的函数没执行完,后续的发送函数就打断了之前的发送,或者后者被忽略而 ...

直接调用hal库也不行,
另外每次切换线程都先切到uart1才能切到别的线程

李益达 发表于 2020-5-28 17:16:34

心然 发表于 2020-5-26 20:23
直接调用hal库也不行,
另外每次切换线程都先切到uart1才能切到别的线程

红色部分只打印一次是因为你所有的任务都是同一个优先级,同时创建,同时运行,在打印第一个task start时,别的也在打印,打印最终是调用串口的,串口函数是不支持重入的,所以别的打印就会异常,导致解析不出来,无论是调用printf还是hal的uarttransmit都必须做互斥处理,做了互斥处理就不会有问题了。

心然 发表于 2020-5-31 19:30:29

李益达 发表于 2020-5-28 17:16
红色部分只打印一次是因为你所有的任务都是同一个优先级,同时创建,同时运行,在打印第一个task start时 ...

嗯,我验证试试,不过我试过错开200ms创建也是一样的问题。
还有就是下面的每次切换线程时总是先打印 running再切到其他线程,这个问题您清楚原因吗

qq57379550 发表于 2020-6-2 18:02:51

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]
查看完整版本: FREERTOS线程调度感觉有问题啊