在刚使用RTTHREAD操作系统时,就因为某个子任务的使用的内存栈溢出问题导致死机,排查了很久,最后发现是分配给该任务的内存栈太小。
因此产生了个疑问,给子任务分配固定大小的栈,即使再小心,也可能会再次发生相同的问题。
目前我的做法是,用串口将每个子任务运行时的内存占用百分比 打印出来,尽可能的避免这种问题。
有没有更好的解决方法,或其他内存管理方法?有没有大佬解答以下
RT-Thread有一个宏RT_USING_OVERFLOW_CHECK
,打开后会在rt_schedule函数中调用_rt_scheduler_stack_check
,在该函数中完成栈空间的检查和Warning。
但实际情况是,很多情况下线程栈设置小了,就容易出现HardFault等错误,难以真正运行到此处。
FreeRTOS提供了一个接口uxTaskGetStackHighWaterMark
检查栈空间的最小值,即水位线。
LZ可以在_rt_scheduler_stack_check
函数的基础上,根据uxTaskGetStackHighWaterMark写法,自行修改源代码,在线程中调用判断栈深度,当低于预设值时使用log_I/E输出,这样能适当降低CPU使用率,避免每次调度都打印。
写法应该比较简单,以满递减栈为例,用thread->sp - stack_addr,将结果返回即可。如果参照FreeRTOS的实现,伪代码可以这么写:
ok谢谢大佬,我看一看