硬汉嵌入式论坛

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

[RTOS] freertos 高速切换任务异常问题

  [复制链接]

17

主题

69

回帖

120

积分

初级会员

积分
120
发表于 2024-10-17 15:50:42 | 显示全部楼层 |阅读模式
目前流程是固定250us定时器触发恢复运行任务1、任务2、任务3,任务1优先级为最高15,任务2为14,任务3为13,即定时器溢出后三个任务依次进行,然后使用串口中断接收单个串口数据,中断中将数据放进队列,并将串口数据处理任务恢复,串口数据处理任务内部处理完数据如果该串数据符合协议就返回一样的数据并暂停等待后续新数据到来,串口任务比前3个任务优先级低,freertos的滴答周期是1khz。串口波特率测试时为115200
问题1:
不固定的会进入硬件错误中断,从PSP指针回溯,普遍问题出现在task.c的vTaskSuspend函数中的if(pxTCB == pxCurrentTCB)
问题2:
有时会出现某些任务不运行的情况
问题3:
该方案 串口有几率会丢失数据

后面查看任务的栈使用情况,认为应该不是栈大小不足,每个都扩到几k都没作用。
后将串口任务临时改成不暂停,占用所有空闲时间,发现问题消失。问题预计是在任务频繁切换导致的?

有大佬能指导下问题大概是什么原因,如何解决。
另外像这样us级的任务,有没有什么好的流程方案。

微信截图_20241017154518.png
该图为任务时间占用和流程
微信截图_20241017154617.png
该图为进入硬件错误中断前的情况
微信截图_20241017153450.png
该图为PSP指针进入错误中断时指向的位置
回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
发表于 2024-10-17 20:59:10 | 显示全部楼层
任务 有必要那么高速 吗 ?
回复

使用道具 举报

17

主题

69

回帖

120

积分

初级会员

积分
120
 楼主| 发表于 2024-10-18 08:36:51 | 显示全部楼层
hpdell 发表于 2024-10-17 20:59
任务 有必要那么高速 吗 ?

项目确实有这个需求,不加串口前都是正常的,主要还是串口的加入导致的这个问题。
回复

使用道具 举报

0

主题

40

回帖

40

积分

新手上路

积分
40
发表于 2024-10-18 09:10:50 | 显示全部楼层
这种没必要,串口你在用的时候,可以配合DMA使用,而且关于低优先级的任务,根本没有必要做线程的恢复或者挂起的动作,要秉着,有事就做,没事就坐的原则,这样整个工程才能顺畅
回复

使用道具 举报

5

主题

22

回帖

37

积分

新手上路

积分
37
发表于 2024-10-18 09:19:33 | 显示全部楼层
任务切换太快了,任务切换是要时间的,中断也要时间
回复

使用道具 举报

17

主题

69

回帖

120

积分

初级会员

积分
120
 楼主| 发表于 2024-10-18 09:46:45 | 显示全部楼层
a13421364618 发表于 2024-10-18 09:10
这种没必要,串口你在用的时候,可以配合DMA使用,而且关于低优先级的任务,根本没有必要做线程的恢复或者 ...

都us级了怎么可能是低优先级,说了是项目需求,我这只是主要的几个任务,其他杂的还没测试呢。串口在里面也不算低优先级了。而且串口速率还没拉上去呢,现在只是测试这4个任务就出异常了
回复

使用道具 举报

17

主题

69

回帖

120

积分

初级会员

积分
120
 楼主| 发表于 2024-10-18 09:51:20 | 显示全部楼层
1739728606 发表于 2024-10-18 09:19
任务切换太快了,任务切换是要时间的,中断也要时间

正常3个主任务切换 没有问题,切换的时间3us都能接受,上图都测试了大致的时间,估计还是在应对突发的串口中断 恢复任务的时候,碰到什么了
回复

使用道具 举报

4

主题

1459

回帖

1471

积分

至尊会员

积分
1471
发表于 2024-10-18 10:35:31 | 显示全部楼层
目前流程是固定250us定时器触发恢复运行任务1、任务2、任务3

你不是用的信号量?
回复

使用道具 举报

17

主题

69

回帖

120

积分

初级会员

积分
120
 楼主| 发表于 2024-10-18 10:40:52 | 显示全部楼层
morning_enr6U 发表于 2024-10-18 10:35
目前流程是固定250us定时器触发恢复运行任务1、任务2、任务3

你不是用的信号量?

不是,是用的xTaskResumeFromISR和portYIELD_FROM_ISR进行任务的恢复和任务切换
回复

使用道具 举报

356

主题

2180

回帖

3253

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3253
发表于 2024-10-18 11:09:11 | 显示全部楼层
可以在任务设置中,把任务的时间片改成10us(默认配置一般是1ms),应该就可以响应了吧。
回复

使用道具 举报

5

主题

22

回帖

37

积分

新手上路

积分
37
发表于 2024-10-18 11:57:45 | 显示全部楼层
opsd999 发表于 2024-10-18 09:51
正常3个主任务切换 没有问题,切换的时间3us都能接受,上图都测试了大致的时间,估计还是在应对突发的串 ...

用RTX5,比较快
回复

使用道具 举报

17

主题

69

回帖

120

积分

初级会员

积分
120
 楼主| 发表于 2024-10-18 14:20:35 | 显示全部楼层
caicaptain2 发表于 2024-10-18 11:09
可以在任务设置中,把任务的时间片改成10us(默认配置一般是1ms),应该就可以响应了吧。

改configTICK_RATE_HZ 这个吗,试了下没啥用,主要我定时器里恢复任务的时候用portYIELD_FROM_ISR强制切换过让恢复的高优先级任务直接运行。改这个不是花了更多时间去切换任务了吗
目前将任务2和3只创建一直暂停着,只让任务1运行,他也会进硬件错误中断 异常前是在xTaskResumeAll函数中,串口也改成了过用信号量唤醒,问题未消除
回复

使用道具 举报

17

主题

69

回帖

120

积分

初级会员

积分
120
 楼主| 发表于 2024-10-18 14:21:35 | 显示全部楼层

听说是rtx5更快。但没用过,主要怕不一定是速度问题,是别的地方的比较难发现的问题
回复

使用道具 举报

10

主题

111

回帖

141

积分

初级会员

积分
141
发表于 2024-10-18 15:44:38 | 显示全部楼层
115200的波特率,用中断来接收数据,还需要在中断中恢复任务,那就是一毫秒要恢复11次任务你用最新酷睿I9单核跑也吃不消吧。RTOS不是像这样用的吧。如果真需要微妙级别的响应就不要用RTOS,就像很多FOC都是裸机,如果用了RTOS也是一些业务逻辑用任务来做,控制部分也是用中断来做的。
回复

使用道具 举报

17

主题

233

回帖

284

积分

高级会员

积分
284
发表于 2024-10-18 15:58:23 | 显示全部楼层
用信号量触发任务
回复

使用道具 举报

7

主题

15

回帖

36

积分

新手上路

积分
36
发表于 2024-10-23 09:17:39 来自手机 | 显示全部楼层
os问题不大,考虑自身代码问题。
回复

使用道具 举报

7

主题

15

回帖

36

积分

新手上路

积分
36
发表于 2024-10-23 09:19:41 来自手机 | 显示全部楼层
挂调试器,找到函数调用参数。可以找到问题所在
回复

使用道具 举报

3

主题

16

回帖

25

积分

新手上路

积分
25
发表于 2024-10-24 22:26:01 | 显示全部楼层
有没有计算过3个任务的运行时间?
回复

使用道具 举报

3

主题

91

回帖

100

积分

初级会员

积分
100
发表于 2024-10-25 06:20:10 来自手机 | 显示全部楼层
串口开dma,缓冲大一点,设置中断都不用开
回复

使用道具 举报

17

主题

69

回帖

120

积分

初级会员

积分
120
 楼主| 发表于 2024-11-4 14:34:12 | 显示全部楼层
忘记回复了,感谢网友们,已经完成了,还是hal的串口中断效率不够,将串口用LL库,并按网友caicaptain2的将时间片加快,就正常了
回复

使用道具 举报

0

主题

27

回帖

27

积分

新手上路

积分
27
发表于 2024-11-5 12:05:43 | 显示全部楼层
串口可以用中断接收存在ringbuf里,然后其他任务用轮询就可以读取到了。
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
发表于 2024-12-24 10:21:27 | 显示全部楼层
我也遇到类似的情况,
一开始我的工程是四个任务运行的好好的,
然后我在添加代码加着加着突然就代码任务只在两个任务之间切换,
然后打印栈内存也都有很大的剩余,
不知道为啥不切换了,有无大佬指点一下呀
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117538
QQ
发表于 2024-12-25 06:52:39 | 显示全部楼层
敲威 发表于 2024-12-24 10:21
我也遇到类似的情况,
一开始我的工程是四个任务运行的好好的,
然后我在添加代码加着加着突然就代码任务 ...

估计是卡在高优先级任务了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-13 15:31 , Processed in 0.056823 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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