搜索
bottom↓
回复: 16

求助---频繁进中断导致内存溢出

[复制链接]

出0入0汤圆

发表于 2018-3-31 17:31:50 | 显示全部楼层 |阅读模式
大家好,小弟现在正在使用FreeRTOS,目前遇到一个问题,望大佬们点拨下^_^
问题如下:
使用了两个串口1,2
串口1:接收外部传感器数据,传感器以300Hz发送数据,一帧数据长度15Bytes,中断接收,直接在中断中逐个字节解析
串口2:以30Hz给PC发送数据,一帧50Bytes,  并且接收上位机传来的数据,也是在中断中逐个字节解析。

遇到情况是:同时启动串口1,2 串口1可以正常接收数据,串口2也可以正常发送数据,  但当上位机发送数据给MCU时,系统崩溃,跳转到硬件错误中断,检查内存情况,发现已经溢出。并且当上位机低频率发送小量数据时,系统不会崩溃。
                所有中断都由操作系统管理,不清楚哪里导致了内存溢出,希望各位指教下!

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

 楼主| 发表于 2018-3-31 17:53:02 | 显示全部楼层
现在改成在中断中接收,接收到一帧后抛信号量在任务中解析,内存溢出的问题就没有了。 感觉还是在中断中呆的时间太长,还是不太清楚FreeRTOS是怎么处理栈数据的

出0入0汤圆

发表于 2018-3-31 18:11:23 | 显示全部楼层
晕死,driver和application不分,把主栈撑爆有什么好奇怪的

出0入0汤圆

 楼主| 发表于 2018-4-4 09:06:30 | 显示全部楼层
Scarlette 发表于 2018-3-31 18:11
晕死,driver和application不分,把主栈撑爆有什么好奇怪的

额  能稍解释下么

现在改成在中断中接收,接收一帧后抛信号量在任务中解析就没问题了

出0入0汤圆

发表于 2018-4-4 09:55:17 | 显示全部楼层
不要在中断里面处理数据

出0入0汤圆

发表于 2018-4-4 10:28:20 | 显示全部楼层
中断收到数据丢进缓存(循环队列可以减少一半以上内存)这就是HAL层,然后定时去读取分析(APP/协议层) 你在中断中分析会导致中断不能及时释放数据丢失甚至是重入 反复申请内存,内存溢出应该是接收没利用循环队列去充分利用空间

出0入0汤圆

 楼主| 发表于 2018-4-4 11:37:11 | 显示全部楼层
pen245760036 发表于 2018-4-4 10:28
中断收到数据丢进缓存(循环队列可以减少一半以上内存)这就是HAL层,然后定时去读取分析(APP/协议层) 你 ...

嗯  我观察到的也是 感觉os一直在压栈,没有释放内存。 请感觉是频繁进入中断,os没时间做内存释放操作引起的 这么理解对么?  还是ARM自身的某些机制引起的???

出0入0汤圆

发表于 2018-4-4 13:33:58 | 显示全部楼层
肯定不是OS自身的问题

出0入0汤圆

发表于 2018-4-4 14:21:26 | 显示全部楼层
中断接收完成,给任务发信号,这是标准操作。
尽量不要在中断里解析数据。

出0入0汤圆

 楼主| 发表于 2018-4-4 17:36:34 | 显示全部楼层
jameszxj 发表于 2018-4-4 14:21
中断接收完成,给任务发信号,这是标准操作。
尽量不要在中断里解析数据。 ...

主要是为了实时性,在任务里解析感觉总会有百微妙的延时吧,系统重载时,延时可能到毫秒级吧

出0入0汤圆

 楼主| 发表于 2018-4-4 17:39:19 | 显示全部楼层
pen245760036 发表于 2018-4-4 10:28
中断收到数据丢进缓存(循环队列可以减少一半以上内存)这就是HAL层,然后定时去读取分析(APP/协议层) 你 ...

如果没来得及释放数据又重新申请,未释放的内存是不是会和内存泄漏一样,这部分内存就没用了?

出0入31汤圆

发表于 2018-4-5 06:51:27 来自手机 | 显示全部楼层
你在中断中动态申请了内存吗?

出0入0汤圆

 楼主| 发表于 2018-4-5 14:38:28 | 显示全部楼层
zchong 发表于 2018-4-5 06:51
你在中断中动态申请了内存吗?

没有,不知道os有没有

出190入0汤圆

发表于 2018-4-6 10:03:35 来自手机 | 显示全部楼层
主栈溢出了,每30hz中断就要压栈,你多大的栈都经不起这么玩!

出0入0汤圆

发表于 2018-4-6 16:39:27 来自手机 | 显示全部楼层
Scarlette 发表于 2018-3-31 18:11
晕死,driver和application不分,把主栈撑爆有什么好奇怪的

一般性的经验呀,如果可以,尽量分开驱动和应用,牺牲点性能和资源,做好分层与接口,出了问题方便定位!

出0入0汤圆

 楼主| 发表于 2018-4-12 10:32:40 | 显示全部楼层
knight_sh 发表于 2018-4-6 10:03
主栈溢出了,每30hz中断就要压栈,你多大的栈都经不起这么玩!

进入中断后,系统肯定要执行压栈操作的,所以主栈溢出的原因是在中断里操作太多占用了太多内存,然后中断频率又高,导致来不及出栈,然后主栈就被撑爆了?

出190入0汤圆

发表于 2018-4-14 10:45:26 来自手机 | 显示全部楼层
上海爱观视觉 发表于 2018-4-12 10:32
进入中断后,系统肯定要执行压栈操作的,所以主栈溢出的原因是在中断里操作太多占用了太多内存,然后中断 ...

在中断中执行时间较长,下次中断来会压栈,也就是说出栈没有压栈快导致栈溢出。建议将中断中耗时操作移到中断下半部执行
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 16:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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