硬汉嵌入式论坛

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

[FreeRTOS] 消息队列问题

[复制链接]

20

主题

72

回帖

132

积分

初级会员

积分
132
发表于 2019-3-18 10:53:24 | 显示全部楼层 |阅读模式
串口接收大量数据,使用xQueueSendFromISR(xMessageBufferData,(void *)&byte_temp,&xHigherPriorityTaskWoken)

放入队列
一个任务使用xQueueReceive(xMessageBufferData,(void *)&byte_temp,portMAX_DELAY)取出数据

程序运行一段时间后,队列满了,(使用xQueueIsQueueFullFromISR(xMessageBufferData)和uxQueueSpacesAvailable( xMessageBufferData )查看),此时即使不再给串口发数据,队列依然是满的,也就是说,队列满一次之后,就再也无法接收新的数据了,此时程序的其他任务都能正常运行

尝试加大队列的大小,此问题依然出现,只是出现的时间长一点

请问有人遇到这种问题吗,怎么解决的?
回复

使用道具 举报

20

主题

72

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2019-3-18 10:55:30 | 显示全部楼层
怀疑是xQueueReceive(xMessageBufferData,(void *)&byte_temp,portMAX_DELAY)任务不运行造成的,但是这个任务最开始是可以正常运行的,中间也没有进行过挂起或删除之类的操作
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2019-3-18 11:20:42 | 显示全部楼层
中断消息触发的任务,要设置为高优先级才行,否则中断触发已经没有价值,还不如查询。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

20

主题

72

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2019-3-18 11:22:31 | 显示全部楼层
byccc 发表于 2019-3-18 11:20
中断消息触发的任务,要设置为高优先级才行,否则中断触发已经没有价值,还不如查询。

恩,xQueueReceive(xMessageBufferData,(void *)&byte_temp,portMAX_DELAY)任务已经是最高优先级
回复

使用道具 举报

20

主题

72

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2019-3-18 11:46:07 | 显示全部楼层
翻前面的帖子,发现我的问题和这个很相似http://www.armbbs.cn/forum.php?m ... &extra=page%3D1
但是没有给出解决方法
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106721
QQ
发表于 2019-3-18 11:51:03 | 显示全部楼层
502398542 发表于 2019-3-18 11:46
翻前面的帖子,发现我的问题和这个很相似http://www.armbbs.cn/forum.php?mod=viewthread&tid=14848&ext ...

每次发送的是多少字节,中断频率是多少。

先判断xQueueIsQueueFullFromISR,再发
回复

使用道具 举报

20

主题

72

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2019-3-18 12:09:38 | 显示全部楼层
eric2013 发表于 2019-3-18 11:51
每次发送的是多少字节,中断频率是多少。

先判断xQueueIsQueueFullFromISR,再发


1.发送的字节数和频率不固定,但是数据量很大,中断也很频繁

2.已经判断了xQueueIsQueueFullFromISR,如果队列满就直接抛弃数据了,但仍然是上面的现象,就是xQueueReceive任务进不去了,队列一直满着

回复

使用道具 举报

20

主题

72

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2019-3-18 12:14:40 | 显示全部楼层
根据网上查的资料,在串口中断中加入了如下函数
                if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET) // 检查 ORE 标志
                {
                                USART_ReceiveData(USART1);
                                USART_ClearFlag(USART1,USART_FLAG_ORE);      
                }
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106721
QQ
发表于 2019-3-18 12:19:25 | 显示全部楼层
502398542 发表于 2019-3-18 12:14
根据网上查的资料,在串口中断中加入了如下函数
                if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET ...

ORE的清除,直接读取SR,然后DR已经自动清除。

QQ截图20190318121658.jpg
回复

使用道具 举报

20

主题

72

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2019-3-18 12:23:02 | 显示全部楼层
eric2013 发表于 2019-3-18 12:19
ORE的清除,直接读取SR,然后DR已经自动清除。

是的,加入了这断ORE的代码之后,对上述问题并没有什么作用
现在问题归结于xQueueReceive任务运行一段时间后就无法运行了,此时队列中是有消息的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106721
QQ
发表于 2019-3-18 12:26:49 | 显示全部楼层
你这个参数是不是填错了
QQ截图20190318122441.jpg
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106721
QQ
发表于 2019-3-18 12:35:18 | 显示全部楼层
502398542 发表于 2019-3-18 12:23
是的,加入了这断ORE的代码之后,对上述问题并没有什么作用
现在问题归结于xQueueReceive任务运行一段时 ...

改了,不用消息队列了,仅仅发送个信号量的消息通知,试试,如果这都有问题,那程序估计设置的有问题了。

ps:FreeRTOS信号量也是基于消息队列实现的。
回复

使用道具 举报

20

主题

72

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2019-3-18 14:06:51 | 显示全部楼层
eric2013 发表于 2019-3-18 12:35
改了,不用消息队列了,仅仅发送个信号量的消息通知,试试,如果这都有问题,那程序估计设置的有问题了。 ...

程序改为,串口收到数据放到自己写的缓存里,通过vTaskNotifyGiveFromISR通知任务处理数据,运行一段时间后,中断中发出通知,但是数据处理任务ulTaskNotifyTake接不到,现象类似于xQueueReceive

不管哪种方式,如果在数据处理任务中加入一个延时vTaskDelay(2),问题就解决了,但这个解决办法影响了数据的实时性

还需要继续找问题原因
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106721
QQ
发表于 2019-3-18 15:13:47 | 显示全部楼层
502398542 发表于 2019-3-18 14:06
程序改为,串口收到数据放到自己写的缓存里,通过vTaskNotifyGiveFromISR通知任务处理数据,运行一段时间 ...

最后还有个事情,你的NVIC优先级是设置为4吧,最好搞成4,然后将串口中断服务程序的优先级设置为FreeRTOS受管理的中断里面最高的。
回复

使用道具 举报

20

主题

72

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2019-3-18 16:24:50 | 显示全部楼层
eric2013 发表于 2019-3-18 15:13
最后还有个事情,你的NVIC优先级是设置为4吧,最好搞成4,然后将串口中断服务程序的优先级设置为FreeRTOS ...

我正在看中断这块,有点疑问
nvic设置是4
串口中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY                        0xf
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY        1
#define configKERNEL_INTERRUPT_PRIORITY                 ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY <<4)
#define configMAX_SYSCALL_INTERRUPT_PRIORITY         ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << 4 )

请问这样配置,可以安全的在中断函数里调用freertos的API吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106721
QQ
发表于 2019-3-18 16:35:33 | 显示全部楼层
502398542 发表于 2019-3-18 16:24
我正在看中断这块,有点疑问
nvic设置是4
串口中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPrior ...

那没问题了。
回复

使用道具 举报

20

主题

72

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2019-3-18 16:41:38 | 显示全部楼层
本帖最后由 502398542 于 2019-3-18 16:45 编辑

#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY                        0xf
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY        1

根据配置优先级1-15可以受freertos管理,我的串口优先级显示是16 QQ截图20190318163727.png ,不受管理?如果我理解的不对,请问这样配置,哪些优先级的中断是受管理的?
在当前 配置下,程序正常跑,一旦收到串口数据,停在configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );



回复

使用道具 举报

20

主题

72

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2019-3-18 17:00:58 | 显示全部楼层

不好意思,看错了,configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );是由于别的中断配置错误引起的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106721
QQ
发表于 2019-3-19 02:28:13 | 显示全部楼层
502398542 发表于 2019-3-18 17:00
不好意思,看错了,configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );是由于别的中断配置错误 ...

好的,那看来是其它问题导致的了。
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
发表于 2019-5-14 09:59:36 | 显示全部楼层
我也遇到了同样的问题,使用队列在串口中断中发送数据,然后创建了一个任务接收。一开始是可以的,但是运行一段时间后(时间不定),只要是队列满了以后接收任务就停掉了。我调试了很久了,监控过数据队列状态,发现是队列一满,接收任务进入了就绪态,但是已经回不去了。 不知道是解决? 还请硬汉兄指教!感谢!
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
发表于 2019-5-14 19:31:04 | 显示全部楼层
已经解决了,是我内部函数造成的问题,不是队列引发的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106721
QQ
发表于 2019-5-15 00:20:03 | 显示全部楼层
brightzeng 发表于 2019-5-14 19:31
已经解决了,是我内部函数造成的问题,不是队列引发的。

非常抱歉,没有及时回复你
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2020-11-25 15:59:09 | 显示全部楼层
解决了吗  碰到一样的问题
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 06:44 , Processed in 0.408637 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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