ucosiii中正点原子的内存管理函数外部内存申请使用率导致的时间片中断钩子任务的运行使得其它正常任务无法运行的情况

原因:时间片中断钩子任务里不能做太耗时的事情,因为时间片中断函数1ms触发一次,然后发消息给时间片钩子任务(优先级为2,即中断程序任务化),使得时间片钩子任务能够马上运行,但是若这个时间片钩子任务运行的时间超过了1ms(时间片长度),那么时间片中断函数就会再次到来,发消息给这个时间片钩子任务,使其可以再次运行。这样的话,可以发现,系统中的其他任务都得不到运行了(因为优先级都低于这个时间片钩子任务),所以就产生了别的任务卡死的现象,但是这个时间片钩子任务是还一直在运行的(我做了实验验证,确实如此)。因为我是在时间片钩子任务里进行外部内存池的内存申请,但是我忘了释放,造成内存泄漏(因为时间片钩子任务1ms执行一次,那么内存泄漏的速度就特别快),所以内存使用率就会不断升高,到百分之13的时候,这时候内存申请函数需要遍历的内存空间就很大了(而且还可能因为存在内存碎片,搜索区间不连续,所以时间更加不确定性),使得这个内存申请函数很耗时(而且申请的是外部内存池,即外部ram芯片,速度也不如内存ram快),超过了1ms,所以造成别的任务都卡死的现象。

所以说明正点原子的这个内存管理模块设计得没有实时性,内存申请时间不是一个常数,在实时系统中这个是不行的,不具有时间确定性。所以解决办法就是保证内存使用率在百分之10以下,且内存申请了一定要记得释放,避免内存释放,如果容易忘记释放,那么能够用局部变量就用局部变量,因为局部变量是栈的方式,内存会自动回收。同时能够申请内部内存池就尽量申请内部ram,因为这个访问速度比外部的ram快多了。

所以实时系统中,好的内存管理方式特别重要。

你可能感兴趣的:(ucosiii内核源码)