嵌入式技术论坛
直播中

h1654155275.5669

7年用户 1028经验值
私信 关注
[问答]

RTT长时间运行后导致内存不足如何解决呢?

现象:RTT长时间运行后,不断开关的线程资源无法得到回收,比finsh组件低优先级的线程得不到运行,最终导致内存不足。但是!!!高优先级的几个线程一直可以运行。

会是同优先级的线程数量过多,导致比该优先级的低的线程不能运行吗

回帖(5)

李丹

2023-4-14 11:27:16
在你的finshz组件中发生了什么?
你是否使用finsh输入了自定义的命令,且该函数没有任何放弃cpu的行为?
若是,则可以解释比finsh优先级低的的线程无法运行。
rtt是优先级抢占式rtos,运行处于就绪态的的最高优先级任务。
举报

h1654155275.5669

2023-4-14 11:27:24
是这样,finsh优先级为21,任务线程优先级为16,同时开了28个,时间片是10,每个任务线程都有delay 50ms的操作。
我是这样测试的,通过finsh创建了一个优先级为10的线程(该线程也有delay),每隔1s就会关闭5个任务线程,再隔1s把关闭的5个任务线程打开,如此反复。前4/500次,finsh都可以正常输入命令如查看当前线程,且关闭的线程都已被空闲线程回收掉了;后面突然开始,关闭的线程一直处于closed状态,空闲线程得不到运行,此时finsh组件也无法输入,但是任务线程一直都有打印,(这时我是通过优先级为5的telnet线程进去看系统状态的)。正常的时候,通过free查看内存都是此消彼长,维持一个稳定的上下浮动状态,异常之后,内存就开始逐渐增加,直到最后无法分配内存。
举报

h1654155275.5669

2023-4-14 11:27:38
会不会是因为不断开关线程,某一时刻,导致创建的线程彼此之间刚好无缝衔接,导致就绪队列里一直都有该优先级的线程,然后才让低优先级的线程无法执行,因为此时,用telnet线程是可以随时抢占cpu资源的,如果是的话,有什么好的办法解决这个问题呢
举报

李涛

2023-4-14 11:27:46
高优先级的线程不主动出让资源,低优先级的线程将不会得到执行机会
举报

李萍

2023-4-14 11:27:53
这不是RTT的问题了,是你自己代码设计的问题,高优先级的任务肯定要让资源的
举报

更多回帖

发帖
×
20
完善资料,
赚取积分