729|0

504

帖子

4

TA的资源

纯净的硅(高级)

楼主
 

《嵌入式软件的时间分析》从书中到实践-使用Tracealyzer进行RTOS任务栈分析 [复制链接]

 

书中分享了很多理论,方法和案例,

基于本书,本人在此基础上再分享一些更贴近实战的案例分享。

本人公众号 嵌入式Lee(嵌入式软硬件技术:RTOS,GUI,FS,协议栈,ARM,总线,嵌入式C,开发环境 and blablaba....多年经验分享,非硬货不发,带你扒开每一个技术背后的根本原理。)

 

一. 前言

前面我们介绍完了Tracealyzer的基本原理和搭建了稳定的环境,现在开始就可以实践应用了。基于嵌入式RTOS的应用开发中到底分配多少任务栈是一个很重要的需要确定的事项,本文从任务栈监测原理,以及Tracealyzer的可视化栈监测应用等方面来介绍,Tracealyzer再RTOS任务栈分析中的应用。

二. 任务栈使用量监测原理

RTOS任务栈使用量监测原理,可以参考文章《Freertos栈检测》,https://mp.weixin.qq.com/s/3JgN6N87ww5Omw19jYldtw

简单的介绍下原理就是,栈初始化时全部初始化为固定值比如0xA5,运行一段时间后栈顶部分使用变为其他值。检查栈底有多少连续的初始值0xA5即可知道栈剩余多少。

Freertos提供接口函数uxTaskGetSystemState获取栈信息。

 

 

Freertos中需要配置使能宏

configCHECK_FOR_STACK_OVERFLOW会自动监测,栈溢出。

用户实现溢出回调,vApplicationStackOverflowHook,溢出时调用该函数。

其他相关宏使能

configUSE_TRACE_FACILITY

INCLUDE_uxTaskGetStackHighWaterMark

INCLUDE_uxTaskGetStackHighWaterMark2

则会实现prvTaskCheckFreeStackSpace计算函数,和获取栈最小剩余的接口uxTaskGetStackHighWaterMark,uxTaskGetStackHighWaterMark2.注意Freertos中以上接口返回的数据量单位是StackType_t而不是字节。

宏portSTACK_GROWTH配置栈的方向。

三. 任务栈事件

TzCtrl任务中,调用xTraceStackMonitorReport();报告栈使用量事件。

调用

xTraceKernelPortGetUnusedStack,调用uxTaskGetStackHighWaterMark获取最小剩余栈大小。

栈事件的格式见前一篇文章”Tracealyzer事件记录格式与丢事件监测”

对应事件类型是PSF_EVENT_UNUSED_STACK,0xEB

如下是一条记录,即0x20EB高4位表示后面参数有2个WORD,类型是

0xEB,0x5B70是当前事件计数,0x003CABCE是时间戳,0x0810E0F8是任务地址,0x018C是最小剩余栈数,即396字节。

 

 

四. 实测

创建两个测试任务

    os_create_task_ext(test_task1, NULL, 7, 512, "test_task1");
    os_create_task_ext(test_task2, NULL, 6, 512, "test_task2");
 

定义大的局部数据模拟栈的使用

static void test_task1(void *arg)
{
    (void)arg;
    while(1)
    {
        volatile uint8_t buffer[512];
        memset(buffer,0xAA,sizeof(buffer));
        while(buffer[0]--);
        os_delay(7);
    }
}

static void test_task2(void *arg)
{
    (void)arg;
    while(1)
    {
        volatile uint8_t buffer[1024];
        memset(buffer,0xAA,sizeof(buffer));
        while(buffer[0]--);
        os_delay(9);
    }
}
 

Tracealyzer上上位机抓取

菜单栏 views->Stack Usage点开栈可视化窗口

 

 

这里可以勾选只显示关心的任务

 

 

鼠标放在线上,下面会显示具体的数值,这里可以看到分别剩余276和148,

即相差(276-148)*4-512字节,正好是两个任务中数组的大小的差异。

 

 

 

 

事件log也可以看到对应的事件

 

 

 

五. 总结

以上分享了使用Tracealyzer进行可视化分析的案例,实践中可能在某些时候调用某个函数时使用多个栈变多,此时曲线就可以看到明显的变化,结合事件前后事件等就可以分析出是哪个函数什么时候导致的栈使用量大。一般调试时先分配足够大的栈,发布时再根据测试覆盖率设置使用量最大的值,预留一些余量。

此帖出自汽车电子论坛
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表