ETAS StackM配置及使用-stack监控

news2024/9/20 7:49:37

文章目录

    • 前言
    • Stack基本介绍
    • StackM配置
      • StackMTarget
      • StackMGeneral
    • Linker配置
    • EcuM配置
    • RTE配置
    • 集成与测试
    • 总结

前言

嵌入式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空间,也是非常有意义的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1939330.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JAVA多线程】Future,专为异步编程而生

目录 1.Future 2.CompletableFuture 2.1.为什么会有CompletableFuture? 2.2.使用 2.2.1.提交任务获取结果 2.2.2.回调函数 2.2.3.CompletableFuture嵌套问题 1.Future Java中的Future接口代表一个异步计算。其提供了一组规范用来对异步计算任务进行管理控制…

java项目(knife4j使用,静态资源未放在static资源包下,公共字段自动填充,Spring Cache与Spring Task)

Knife4j(生成接口文档) 使用swagger你只需要按照它的规范去定义接口及接口相关的信息,就可以做到生成接口文档,以及在线接口调试页面。官网:https://swagger.io/ Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。…

uni-app 影视类小程序开发从零到一 | 开源项目推荐

引言 在数字娱乐时代,对于电影爱好者而言,随时随地享受精彩影片成为一种日常需求。分享一款基于 uni-app 开发的影视类小程序。它不仅提供了丰富的影视资源推荐,还融入了个性化知乎日报等内容,是不错的素材,同时对电影…

Springboot同时支持http和https访问

springboot默认是http的 一、支持https访问 需要生成证书,并配置到项目中。 1、证书 如果公司提供,则直接使用公司提供的证书; 如果公司没有提供,也可自己使用Java自带的命令keytool来生成: (1&#x…

JavaWeb笔记_Cookie

一.会话技术概述 在日常生活中,A和B之间在打电话过程中一连串的你问我答就是一个会话 在BS模型中,会话可以理解为通过浏览器访问服务端的资源,点击超链接可以进行资源的跳转,直到浏览器关闭过程叫做会话 我们使用会话技术可以解决的是整个会话过程中(通过浏览器浏览服务…

【Linux】一文向您详细介绍 Vim编辑器 显示行号的方法

【Linux】一文向您详细介绍 Vim编辑器 显示行号的方法 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介:985高校的普通本…

【Matlab】PLS偏最小二乘法回归预测算法(附代码)

资源下载: 资源合集: 目录 一,概述 偏最小二乘法是一种新型的多元统计数据分析方法,于1983年由S.Wold和C.Albano等人首次提出。偏最小二乘法实现了,在一个算法下,可以同时实现回归建模(多元线…

类和对象:赋值函数

1.运算符重载 • 当运算符被⽤于类类型的对象时,C语⾔允许我们通过运算符重载的形式指定新的含义。C规定类类型对象使⽤运算符时,必须转换成调⽤对应运算符重载,若没有对应的运算符重载,则会编译报错;(运算…

SwiftUI 5.0(iOS 17)滚动视图的滚动目标行为(Target Behavior)解惑和实战

概览 在 SwiftUI 的开发过程中我们常说:“屏幕不够,滚动来凑”。可见滚动视图对于超长内容的呈现有着多么秉轴持钧的重要作用。 这不,从 SwiftUI 5.0(iOS 17)开始苹果又为滚动视图增加了全新的功能。但是官方的示例可…

【LeetCode】80.删除有序数组中的重复项II

1. 题目 2. 分析 3. 代码 class Solution:def removeDuplicates(self, nums: List[int]) -> int:if len(nums) < 3:return len(nums)i 0j 1k 2while(k < len(nums)):if (nums[i] nums[j]):while(k < len(nums) and nums[j] nums[k] ):k1if (k < len(nums…

C语言指针超详解——最终篇一

C语言指针系列文章目录 入门篇 强化篇 进阶篇 最终篇一 文章目录 C语言指针系列文章目录1. 回调函数是什么2. qsort 函数2.1 概念2.2 qsort 排序 int 类型数据2.3 使用 qsort 排序结构体数据 3. 模拟实现 qsort 函数4. sizeof 与 strlen 的对比4.1 sizeof4.2 strlen4.3 sizeof…

ctf中php反序列化汇总

序列化与反序列化的概念 序列化就是将对象转换成字符串。字符串包括 属性名 属性值 属性类型和该对象对应的类名。 反序列化则相反将字符串重新恢复成对象。 对象的序列化利于对象的保存和传输,也可以让多个文件共享对象。 序列化举例&#xff1a;一般ctf题目中我们就是要将对…

02设置burpsuite代理

在日常工作之中&#xff0c;我们最常用的web客服端就是web浏览器&#xff0c;我们可以通过代理的设置&#xff0c;做到web浏览器的流量拦截&#xff0c;并且经过burpsuite代理的数据流量进行处理。 在火狐浏览器中安装foxyporxy

哥德尔不完备定理(Godel‘s Incompleteness Theorem) —— 奠定了计算机与 AI 的理论基础

哥德尔不完备定理 在数理逻辑中&#xff0c;哥德尔不完备定理是指库尔特・哥德尔于 1931 年证明并发表的两条定理。简单地说&#xff0c;第一条定理指出&#xff1a;任何相容的形式系统&#xff0c;只要蕴涵皮亚诺算术公理&#xff0c;就可以在其中构造在体系中既不能证明也不…

Java GC(垃圾回收)机制详解

Java GC&#xff08;垃圾回收&#xff09;机制详解 1、GC触发的条件2、GCRoots的对象类型 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java的世界里&#xff0c;内存管理是自动进行的&#xff0c;其中垃圾回收&#xff08;Garbage Col…

WDL(Wide Deep Learning for Recommender Systems)——Google经典CTR预估模型

一、文章简介 Wide & Deep Learning for Recommender Systems这篇文章介绍了一种结合宽线性模型和深度神经网络的方法&#xff0c;以实现推荐系统中的记忆和泛化。这种方法在Google Play商店的应用推荐系统中进行了评估&#xff0c;展示了其显著的性能提升。 推荐系统中的…

解决使用腾讯地图没超过额度却一直报“此key每日调用量已达到上限”

1、个人开发者配额说明 2、需要在 配额管理 的 账户额度 中进行配额的分配即可。 3、开发工具接口的调用就不会出现该报错了

【专项刷题】— 快排

1、颜色分类 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 创建三个指针&#xff0c;然后把数组分为三个区域遍历代码&#xff1a; class Solution {public void swap(int[] nums, int i, int j){int t nums[i];nums[i] nums[j];nums[j] t;}public void sortCo…

如何快速开发一个简单的企业信息系统?O2OA手把手带你,高效开发!(附源码)

前言 想象一下&#xff0c;如果你的企业能够通过一个系统快速发布企业信息&#xff0c;员工们无论身在何处都能即时获取新信息&#xff0c;那该多好&#xff01;告别email轰炸和口头传达的低效&#xff0c;O2OA企业应用开发平台让这一切变得简单。 今天&#xff0c;就让我们一…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 二进制游戏(200分)- 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…