如果存在内存越界导致程序dump后,我们也不由会怀疑是否是系统HEAP不够,或是task分的堆栈空间不够。FreeRTOS提供了相关API供查询使用:
1.检测系统堆大小
xPortGetFreeHeapSize()
可以获取调用时堆中空闲内存的大小,以字节为单位。
xPortGetMinimumEverFreeHeapSize()
此函数返回FreeRTOS应用程序开始运行之后,曾经存在的最小的未被分配的存储空间的字节数。
2.检测任务栈大小
uxTaskGetStackHighWaterMark()
就可以打印出来该任务自启动起来最小剩余栈空间大小。然后我们就可以计算出最大使用的大小,一般可以再乘以1.5左右作为最终分配的值。需要注意的是该函数不像前面两个返回的是bytes,而返回的以字为单位,真实的bytes需要乘以4。
使用说明:
要使用此函数的话宏INCLUDE_uxTaskGetStackHighWaterMark 必须为 1,
此函数原型如下:UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask )
参数:
xTask: 要查询的任务的任务句柄,当这个参数为 NULL 的话说明查询自身任务(即调用函数 uxTaskGetStackHighWaterMark()的任务)的“高水位线”
返回值:
任务堆栈的“高水位线”值,也就是堆栈的历史剩余最小值。