1、官方文档提供了 函数 用来查询 任务 剩余 栈 空间,首先是看官方的文档解释(某位大神 翻译 的 官方文档。)
参数解释: xTask:被查询任务的句柄——欲知如何获得任务句柄,详情请参见API 函数xTaskCreate()的参数pxCreatedTask。如果传入 NULL 句柄,则任务查询的是自身栈空间的高水线。
返回值: 任务栈空间的实际使用量会随着任务执行和中断处理过程上下浮动。uxTaskGetStackHighWaterMark()返回从任务启动执行开始的运行历史中,栈空间具有的最小剩余量。这个值即是栈空间使用达到最深时的剩下的未使用的栈空间。这个值越是接近0,则这个任务就越是离栈溢出不远了。
下面要说我的 使用方法:
首先 在 创建任务的时候 得 添加任务句柄:
具体方法是:
1、xTaskHandle pvCreatedTask_ToggleLed4; //这句代码 是定义一个 空指针变量。(typedef void * xTaskHandle;)
2、xTaskCreate(ToggleLed4, (int8_t *)"LED4", configMINIMAL_STACK_SIZE, NULL, LED_TASK_PRIO,&pvCreatedTask_ToggleLed4);//创建一个任务
3、要使用uxTaskGetStackHighWaterMark 这个函数,首先得看下面说明:
* INCLUDE_uxTaskGetStackHighWaterMark must be set to 1 in FreeRTOSConfig.h for
* this function to be available.
意思是在FreeRTOS.h(英文描述错误,实际在这个FreeRTOS.h中)文件中要 把 INCLUDE_uxTaskGetStackHighWaterMark的宏定义改为1,不能改的,修改一下文档的属性,把只读去掉!
2018年8月8日14:06:45,注,不是源文档描述错误,是我理解错误,应该修改配置文件 FreeRTOSConfig.h,在该文件中 增加 宏定义 #define INCLUDE_uxTaskGetStackHighWaterMark 1。
4、//下面就是我要查询的 任务 剩余的栈空间,里面调用了uxTaskGetStackHighWaterMark 这个函数
void ToggleLed4(void * pvParameters)
{
unsigned portBASE_TYPE uxHighWaterMark;
for( ;; )
{
/* toggle LED4 each 250ms */
STM_EVAL_LEDToggle(LED4);
uxHighWaterMark=uxTaskGetStackHighWaterMark( pvCreatedTask_ToggleLed4 );
printf("ToggleLed4剩余栈空间是多少:%d.\r\n",uxHighWaterMark);//gxp,串口检测,2015年11月17日11:26:42
vTaskDelay(500);
}
}
5、看 结果:
6、分析:
1、这里的 “74”,应该就是 74*4=296个 字节(1字节=8位),因为 freertos 在设置栈的时候是按照 “字”计算的,在STM32中一个字是32位!
2、根据 返回的数据判断,这个任务 还剩余 296个字节没有使用。
3、configMINIMAL_STACK_SIZE==128,还剩余74,就是已经使用等于128-74=54,那么设置任务栈的时候应该设置(已经使用*2)即54*2=108合适,即2倍合适(参考),2017年11月7日08:56:24.
7、2016年11月28日17:25:23,可以通过API 直接看系统的运行情况,进行可视化调试,这里推荐一个大神的博客!
朱工:http://blog.csdn.net/zhzht19861011/article/details/50717549
如果文章对你有帮助,微信赞赏码: