硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3517|回复: 10
收起左侧

[FreeRTOS] FREERTOS线程调度感觉有问题啊

[复制链接]

1

主题

12

回帖

15

积分

新手上路

积分
15
发表于 2020-5-24 15:54:36 | 显示全部楼层 |阅读模式
本帖最后由 心然 于 2020-5-24 16:06 编辑



线程任务用的是统一个函数,在创建时传入不同参数,一共创建8个线程,运行log上看出两个问题:
1. 代码中的红色字体log中只打印了一次,讲道理应该是8次
2. 另外每次切换线程时总是先执行任务[uart1]再执行其他的任务
使用cube生成的工程,freertos也是cube上面的,哪位能说下原因呢



代码:
  1. void test_Task(void *argument)
  2. {
  3.     printf("task[%s] start\r\n", (char*)argument);
  4.     while(1)
  5.     {
  6.         printf("[%s] running\r\n", (char*)argument);
  7.         osDelay(2000);
  8.     }
  9. }

  10. void main(void)
  11. {
  12.     for(int i = 0; i < 8; i++)
  13.     {
  14.         UART_TaskHandle[i] = osThreadNew(test_Task, UART_Task_attributes[i].name, &UART_Task_attributes[i]);
  15.         osDelay(200);
  16.     }
  17. }
复制代码



LOG:
task[uart1] start
[uart1] running
[uart2] running
[uart1] running
[uart3] running
[uart1] running
[uart4] running
[uart1] running
[uart5] running
[uart1] running
[uart6] running
[uart1] running
[uart7] running
[uart1] running
[uart8] running
[uart1] running





回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2020-5-24 16:27:37 | 显示全部楼层
printf("task[%s] start\r\n", (char*)argument);
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2020-5-24 16:29:41 | 显示全部楼层
while(1)上面加个全局变量累加,结果也加上去了,说明8个任务是创建成功了,不知道为什么printf的打印这么奇怪
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

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

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2020-5-25 11:17:45 | 显示全部楼层
这是要测试什么。
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2020-5-25 20:19:48 | 显示全部楼层
eric2013 发表于 2020-5-25 11:17
这是要测试什么。

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

使用道具 举报

3

主题

336

回帖

345

积分

高级会员

积分
345
发表于 2020-5-26 09:38:31 | 显示全部楼层
我估计是你串口发送函数不合理,之前的函数没执行完,后续的发送函数就打断了之前的发送,或者后者被忽略而返回。
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2020-5-26 20:23:03 | 显示全部楼层
glory 发表于 2020-5-26 09:38
我估计是你串口发送函数不合理,之前的函数没执行完,后续的发送函数就打断了之前的发送,或者后者被忽略而 ...

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

使用道具 举报

8

主题

104

回帖

138

积分

初级会员

积分
138
发表于 2020-5-28 17:16:34 | 显示全部楼层
心然 发表于 2020-5-26 20:23
直接调用hal库也不行,
另外每次切换线程都先切到uart1才能切到别的线程

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

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2020-5-31 19:30:29 | 显示全部楼层
李益达 发表于 2020-5-28 17:16
红色部分只打印一次是因为你所有的任务都是同一个优先级,同时创建,同时运行,在打印第一个task start时 ...

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

使用道具 举报

2

主题

180

回帖

186

积分

初级会员

积分
186
发表于 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);
    }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 21:31 , Processed in 0.219152 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表