ETAS StackM配置及使用-stack监控

58 篇文章 68 订阅 ¥159.90 ¥99.00

前言

嵌入式C语言执行的软件中,stack溢出会导致程序执行异常,严重可能导致直接进硬件异常中断(hardfault)。软件执行过程中的stack监控是非常有必要的,ETAS的StackM模块实现了运行过程中的stack监控,对于多核系统,对每个核的stack进行监控。本文介绍StackM配置及使用。

Stack基本介绍

栈是用来存储函数调用时的局部变量函数参数以及返回地址等信息的数据结构。栈的生长方向一般是向下生长的,栈顶为高地址

当一个函数被调用时,它的局部变量和函数调用的参数都会被压入栈中,这会导致栈指针(通常称为栈顶指针或SP)向下移动,即向更低的内存地址移动。当函数执行完毕并返回时,栈中的这些数据会被弹出,栈指针则会向上移动回到之前的值。

示例如下:
在这里插入图片描述
栈的原则:栈中的数据元素遵守 后进先出(LIFO)的原则

栈的两个经典操作:

压栈:栈的插入操作叫做 进栈 / 压栈 / 入栈 (入数据在栈顶)

出栈:栈的删除操作叫做出栈。(出数据也在栈顶)

StackM配置

以下配置都基于stack向下生长,即STACKM_GROWDOWN = TRUE

StackMTarget

配置将在运行时监控的堆栈属性,例如内核所属、起始地址和结束地址

StackMStackID:配置stack id,实际没啥用

StackMStackLimit1:Stack监控限制阈值1,固定为12.5%。

StackMStackLimit2:Stack监控限制阈值2,固定为25%。

StackMStackLimit3:Stack监控限制阈值3,固定为50%。

StackMStackCoreID:关联的核id
StackMStackName:关联的stack内存名
在这里插入图片描述
StackName在linker模块中配置,包括stack的大小

对应代码配置为:

#define Stack0_StackId     (0)
#if (STACKM_GROWDOWN == TRUE)
    #define Stack0_Start       ((uint32*)((uint32)&STACK_START_SYSCORE_STACK - 0x00000001))
    #define Stack0_End         ((uint32*)((uint32)&STACK_END_SYSCORE_STACK  + 0x00000000))
    #define Stack0_Limit0      ((uint32*)((uint32)&STACK_START_SYSCORE_STACK - (STACK_LEN_SYSCORE_STACK>>5)))  /* convert to uint32,limit boundary at 12.5% */
    #define Stack0_Limit1      ((uint32*)((uint32)&STACK_START_SYSCORE_STACK - (STACK_LEN_SYSCORE_STACK>>4)))  /* convert to uint32,limit boundary at 25% */
    #define Stack0_Limit2      ((uint32*)((uint32)&STACK_START_SYSCORE_STACK - (STACK_LEN_SYSCORE_STACK>>3)))  /* convert to uint32,limit boundary at 50% */

    /* Check whether the Address to check is out of address space of current stack */
    LOCAL_INLINE boolean STACKM_CBK_Stack0( const uint32* currAddr) {return (((currAddr > Stack0_Start) || (currAddr == 0))? TRUE:FALSE);}
#else
    #error "Stack growing direction not supported in current StackM version !"
#endif

上面的limit是转化为uint32之后的计算,不是基于byte的,所以多除了4

StackMGeneral

StackMDevErrorDetect:使能错误检测

StackMEnable:使能StackM

StackMTraceEnable:使能trace跟踪功能

StackMPatternEnable:使能stack填充功能

StackMPattern:stack默认填充值

StackMLimitHigh:limit处填充的64字节的高32字节

StackMLimitHigh:limit处填充的64字节的低32字节

对应代码配置为:

#define STACKM_DEV_ERROR_DETECT STD_ON

/* Set to STD_ON if this feature has to be enabled, otherwise set STD_OFF */
#define STACKM_CFG_ENABLE STD_ON    /* Enable StackM component. */
#define STACKM_CFG_ENABLETRACE STD_ON    /* Enable Stack utilization tracing feature. */
#define STACKM_CFG_PATTERNINIT STD_ON    /* Enable Stack filling for tracing feature. */


#define STACKM_CFG_DEFAULTFILLUPVALUE ((uint32)0x4C4C4946)  /* "FILL" */
#define STACKM_CFG_LIMITHIGH ((uint32)0x3179656B)  /* "key1" */
#define STACKM_CFG_LIMITLOW ((uint32)0x3279656B)  /* "key2" */

Linker配置

配置对应stack的ld段,及stacksize
在这里插入图片描述
对应代码配置为:

#define STACK_LEN_SYSCORE_STACK        12288
#if (LINKER_STACK_GROWDOWN == TRUE)
    #define STACK_START_SYSCORE_STACK  __Stack_start_c0
    #define STACK_END_SYSCORE_STACK    __Stack_end_c0
#else
    #define STACK_START_SYSCORE_STACK  __SYSCORE_STACK_START
    #define STACK_END_SYSCORE_STACK    __SYSCORE_STACK_END
#endif

#define STACK_LEN_COMCORE_STACK        12288
#if (LINKER_STACK_GROWDOWN == TRUE)
    #define STACK_START_COMCORE_STACK  __Stack_start_c1
    #define STACK_END_COMCORE_STACK    __Stack_end_c1
#else
    #define STACK_START_COMCORE_STACK  __COMCORE_STACK_START
    #define STACK_END_COMCORE_STACK    __COMCORE_STACK_END
#endif

此处__Stack_start_c0为ld文件中定义的宏,表示的stack的高地址

    __Stack_start_c0         = ADDR(int_sram_stack_c0) + SIZEOF(int_sram_stack_c0);

EcuM配置

配置各个核的Stack初始化函数
在这里插入图片描述
主要就是对stack区域赋一个指定值

RTE配置

将对应的StackM的主函数映射到1ms任务上,或者在idle task中调用也是可以的
在这里插入图片描述

集成与测试

需要确认ld文件中的stack定义与StackM中的一致。

通过调用StackM_GetStackInfo函数获取stack监控的结果,对应结果参数定义结构体为StackM_StackMeasureType

typedef struct {
   uint32  FreeSpace;
   float32 FreePercent;
   uint8   CheckWordReached;
} StackM_StackMeasureType;

FreeSpace为当前剩余stack字节数FreePercent为当前剩余stack百分比,CheckWordReached为1时说明Stack使用量达到过12.5%,为3时说明使用量达到过25%,为7时说明使用量达到过50%.

调试结果如下:
在这里插入图片描述
在这里插入图片描述

总结

在栈使用量超过一定值时可以做出一些报警动作,在调试阶段对stack监控后合理分配stack空间,也是非常有意义的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: ETAS-OS (RTA-OS)是一款实时操作系统,主要用于汽车和嵌入式系统的开发。下面是关于ETAS-OS (RTA-OS)用户手册的简要介绍。 ETAS-OS (RTA-OS)用户手册提供了详细的操作指南和技术说明,帮助开发人员使用配置ETAS-OS (RTA-OS)操作系统。该手册包含了各种重要的信息和功能,让用户更好地理解和运用这款操作系统。 首先,用户手册介绍了ETAS-OS (RTA-OS)的基本概念和架构。它解释了操作系统的组织结构,包括任务、中断、调度器等核心概念。此外,手册还描述了操作系统的各种组件和模块如何协同工作,以提供实时性和可靠性。 接下来,用户手册详细说明了ETAS-OS (RTA-OS)操作系统的安装和配置方法。它指导用户如何将操作系统集成到开发环境中,并介绍了各种配置选项和设置。用户可以根据自己的需求和项目要求,进行灵活的配置和调整。 此外,用户手册还提供了完整的API参考,包括操作系统的各种函数和接口。用户可以通过阅读用户手册,了解每个函数和接口的功能和使用方法,以便在开发过程中正确地调用和应用它们。 最后,用户手册还包含了一些实际案例和示例代码,以帮助用户更好地理解和应用ETAS-OS (RTA-OS)。这些案例和示例代码涵盖了各种应用场景和功能,具有很高的实用性和参考价值。 总之,ETAS-OS (RTA-OS)用户手册是使用配置ETAS-OS (RTA-OS)操作系统的重要参考资料。它提供了全面且详细的信息,帮助开发人员顺利地开发和调试嵌入式系统,并提高系统的实时性和可靠性。 ### 回答2: ETAS-OS (RTA-OS) 是一款嵌入式实时操作系统,被广泛应用于汽车电子系统的开发中。该操作系统具有高性能、高实时性和可扩展性的特点,能够有效地支持多任务处理和实时任务调度。 ETAS-OS (RTA-OS) 提供了丰富的功能模块和API,用于实现各种功能,如任务管理、中断处理、时钟管理、资源管理等。它采用优化的内核设计和高效的任务调度算法,能够满足复杂的实时需求。此外,ETAS-OS (RTA-OS) 还提供了丰富的驱动程序和硬件接口,方便开发者与外部设备进行通信和控制。 用户能够通过详细的用户手册来了解ETAS-OS (RTA-OS) 的使用方法和原理。用户手册中包含了操作系统的安装、配置和编程的详细步骤,以及各种功能模块和API的详细说明和示例代码。用户可以根据手册中的指导进行开发和调试工作,并能够深入了解操作系统的工作原理和内部机制。 除了用户手册之外,ETAS-OS (RTA-OS) 还提供了丰富的开发工具和支持,包括调试器、性能分析器和仿真环境等。这些工具能够帮助开发者进行调试和优化,并提高开发效率和系统可靠性。 总之,ETAS-OS (RTA-OS) 是一款功能强大的嵌入式实时操作系统,具有高性能和可扩展性的特点。用户可以通过详细的用户手册和丰富的开发工具来学习和使用该操作系统,实现复杂的实时系统开发。 ### 回答3: ETAS-OS(也称为RTA-OS)是一款用于汽车电子系统开发的实时操作系统。它被设计用于提供高效稳定的运行环境,以满足汽车行业对可靠性和性能的高要求。 ETAS-OS用户手册是一本详细说明和指导用户如何使用ETAS-OS操作系统的书籍。该手册的主要目的是帮助用户了解ETAS-OS的功能、特性和使用方法,以便在汽车电子系统开发中正确地使用该操作系统。 用户手册首先会介绍ETAS-OS的基本概念和架构,包括实时调度器、任务管理、中断处理和通信机制等。用户可以通过阅读手册来了解系统的工作原理和内部机制,从而更好地理解和使用ETAS-OS。 手册还提供了一系列操作指南和示例,以帮助用户进行系统配置、任务调度、中断处理和通信编程等操作。用户可以根据手册中的步骤和示例来正确地配置和编程ETAS-OS,以满足具体的应用需求。 此外,用户手册还涵盖了一些高级主题,如性能优化、调试和错误处理等。这些主题可以帮助用户进一步了解ETAS-OS的使用技巧和最佳实践,以提高系统的性能和稳定性。 总之,ETAS-OS用户手册是一本帮助用户正确使用ETAS-OS操作系统的重要参考书。通过阅读手册,用户可以深入了解该操作系统的功能和特性,掌握系统的配置和编程技巧,以提高汽车电子系统的开发效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赞哥哥s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值