上海爱观视觉 发表于 2018-3-31 17:31:50

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

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

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

上海爱观视觉 发表于 2018-3-31 17:53:02

现在改成在中断中接收,接收到一帧后抛信号量在任务中解析,内存溢出的问题就没有了。 感觉还是在中断中呆的时间太长,还是不太清楚FreeRTOS是怎么处理栈数据的

Scarlette 发表于 2018-3-31 18:11:23

晕死,driver和application不分,把主栈撑爆有什么好奇怪的

上海爱观视觉 发表于 2018-4-4 09:06:30

Scarlette 发表于 2018-3-31 18:11
晕死,driver和application不分,把主栈撑爆有什么好奇怪的

额能稍解释下么

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

lj123456 发表于 2018-4-4 09:55:17

不要在中断里面处理数据

pen245760036 发表于 2018-4-4 10:28:20

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

上海爱观视觉 发表于 2018-4-4 11:37:11

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

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

boycn 发表于 2018-4-4 13:33:58

肯定不是OS自身的问题

jameszxj 发表于 2018-4-4 14:21:26

中断接收完成,给任务发信号,这是标准操作。
尽量不要在中断里解析数据。

上海爱观视觉 发表于 2018-4-4 17:36:34

jameszxj 发表于 2018-4-4 14:21
中断接收完成,给任务发信号,这是标准操作。
尽量不要在中断里解析数据。 ...

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

上海爱观视觉 发表于 2018-4-4 17:39:19

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

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

zchong 发表于 2018-4-5 06:51:27

你在中断中动态申请了内存吗?

上海爱观视觉 发表于 2018-4-5 14:38:28

zchong 发表于 2018-4-5 06:51
你在中断中动态申请了内存吗?

没有,不知道os有没有

knight_sh 发表于 2018-4-6 10:03:35

主栈溢出了,每30hz中断就要压栈,你多大的栈都经不起这么玩!

just_lou 发表于 2018-4-6 16:39:27

Scarlette 发表于 2018-3-31 18:11
晕死,driver和application不分,把主栈撑爆有什么好奇怪的

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

上海爱观视觉 发表于 2018-4-12 10:32:40

knight_sh 发表于 2018-4-6 10:03
主栈溢出了,每30hz中断就要压栈,你多大的栈都经不起这么玩!

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

knight_sh 发表于 2018-4-14 10:45:26

上海爱观视觉 发表于 2018-4-12 10:32
进入中断后,系统肯定要执行压栈操作的,所以主栈溢出的原因是在中断里操作太多占用了太多内存,然后中断 ...

在中断中执行时间较长,下次中断来会压栈,也就是说出栈没有压栈快导致栈溢出。建议将中断中耗时操作移到中断下半部执行
页: [1]
查看完整版本: 求助---频繁进中断导致内存溢出