0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么嵌入式系统需要堆栈分析?如何进行监控堆栈分析呢?

MATLAB 来源:MATLAB 2024-03-28 10:23 次阅读

随着代码行数从几千到上百万不等,嵌入式软件变得日益复杂,但总体目标依然是实现稳健、正确且快速执行的软件。快速执行的软件需要以最优方式管理可用的 CPU 和内存资源,这对内存空间(尤其是 RAM)有限的嵌入式系统来说不失为一项挑战。

为此,必须通过执行堆栈和堆分析对 RAM 的使用情况进行分析。开发人员手动估计堆栈和堆负载是一项艰巨的任务,即使对于小程序来说也是如此。如果估计不正确,则可能会导致堆栈溢出和未定义的行为。

因此,一些编码标准要求强制执行内存分配使用最佳实践,以避免不必要的开销。但是,堆栈仍是 RAM 的必要组成部分,需要得到优化利用。

为什么嵌入式系统需要堆栈分析?

当可用堆栈小于代码需求时,就会发生堆栈溢出。然而,当为环境配置的堆栈大于需求时,内存又会被浪费。开发人员必须持续一致地估计安全关键型应用中最差情形下的堆栈使用量,以防止软件运行时发生 RAM 不足的情况。

e8b80808-ec2b-11ee-a297-92fbcf53809c.png

堆栈估计不正确所带来的风险。

如何估计堆栈分析?

手动估计堆栈

虽然手动估计堆栈分析偶尔会有帮助,但对于更复杂的系统来说可能充满挑战。这就需要彻底了解函数调用的深度、所有局部变量的细节,以及执行过程中随时发生的中断帧的大小,等等。这是一个漫长而又容易出错的过程。使用静态代码分析工具可以快速计算出上述结果,而不必手动执行这个过程。

使用静态代码分析器

开发人员可以通过静态代码分析器预测堆栈的使用情况。分析工具有助于分析函数调用深度、局部变量和返回参数的堆栈估计、嵌套中断以及执行期间发生的中断帧的大小。使用静态代码分析器的好处在于,它可以处理编码规则违规、运行时缺陷、编码复杂性以及堆栈分析估计。它在几分钟内就能完成这些操作,从而帮助开发人员节省了手动计算堆栈使用量的时间。

对目标进行测试和测量

静态分析器可以在开发过程中估计堆栈的使用量。但是,最好在真实硬件上获得实际的堆栈使用量数据。许多开发环境都具有硬件模拟功能,并提供实时堆栈分析功能。在实际硬件上执行堆栈分析,并创建溢出场景来测试故障安全例程,这一点非常重要。现在,最大的问题是:何时使用静态分析工具执行堆栈分析?何时在实际目标上执行?

何时执行堆栈分析?

执行堆栈分析是软件开发生命周期中的一个连续过程。如果仅在软件开发生命周期结束时由单独的质量评估团队估计堆栈使用量,则可能会使整个开发工作面临风险。此外,在开发周期的后期解决问题可能会出错且耗时;在确定是更改硬件还是软件设计时,这种做法可能还会造成混乱。执行堆栈分析的最佳时点是:

在添加新功能时

在软件中每添加一项新功能,都会使堆栈使用量增加。开发人员必须密切关注新功能的堆栈使用情况。

执行堆栈分析、进行调试和修复复杂代码:在每个主要功能实现后,开发人员可以在本地对特定软件组件或软件模块应用静态分析器,以评估基础软件和已实现软件之间堆栈使用量的增加情况。

在整个开发过程中监控堆栈分析:QA 团队和产品负责人可以使用静态分析器对持续集成 (CI) 管道进行堆栈估计,以在控制板上显示结果。此过程有助于在软件开发生命周期中跟踪堆栈分析。

执行良好实践以确保堆栈使用量最低:质量门有助于避免违反 MISRA 和 AUTOSAR 编码规范。这些规范要求强制有条件地使用动态内存分配。

在软件发布前

静态分析器执行的堆栈估计提供了有力的证据,表明堆栈使用量处于控制之中。在每次软件发布之前,都应在标准工作负载、最小负载和最大负载下,对真实目标运行堆栈分析,以全面了解堆栈的使用情况。验证堆栈上溢和下溢事件的故障安全例程也至关重要。

Polyspace 对堆栈估计有何作用?

Polyspace Code Prover 对每个函数中局部变量的大小上限和下限执行保守和乐观估计,以得出函数级和程序级的最大和最小堆栈使用量。该分析考虑了函数返回值的大小、函数参数的大小、局部变量的大小,以及内存对齐所需的额外填充。

e8c2975a-ec2b-11ee-a297-92fbcf53809c.png

Polyspace 桌面版上的堆栈分析代码度量。

要了解和调试堆栈利用过量的问题,开发人员可以在本地运行 Polyspace,通过检查函数调用深度来确定堆栈利用过量的确切原因,并通过优化利用可用资源来降低堆栈使用量。

e8d1c658-ec2b-11ee-a297-92fbcf53809c.png

函数 table_loop() 的调用树和更高的堆栈估计。

在整个开发过程中监控堆栈分析

Polyspace Access 是结果数据库服务器,可以在 Web 浏览器上呈现图形用户界面。CI 流程可以触发 Polyspace Server 上的堆栈分析,以生成堆栈使用量估计结果。此结果可以上传到结果数据库。QA 团队和产品负责人可以在图形化前端持续查看堆栈使用量,并在可用堆栈资源过度使用的情况下采取必要的措施。

e8d8b3fa-ec2b-11ee-a297-92fbcf53809c.png

Polyspace Access 中的项目级堆栈估计。

下一步是,检查堆栈使用量较高的函数,并将特定函数分配给开发人员,以供进一步调查和调试。Polyspace 允许您为分析结果指定状态和严重性并添加注释,然后在 Jira 等 Bug 跟踪工具中将这些结果分配给开发人员。

e8e3c876-ec2b-11ee-a297-92fbcf53809c.png

Polyspace Access 中的函数级堆栈估计和结果审查控制板。

执行良好实践以确保堆栈使用量最低

对于产品级代码,必须绝对避免违反编码标准,如 MISRA C、MISRA C++、AUTOSAR C++ 等。这些编码标准要求强制禁止动态内存分配,并推荐特定用例来优化静态内存分配。

Polyspace Bug Finder 有助于识别任何违反最佳实践的行为,开发人员可以在本地监控这些行为,而产品负责人可通过 Polyspace Access 监控这些行为。以下编码规则详细说明了静态内存分配的最佳实践。静态内存分配可以使用 Polyspace Bug Finder 进行分析。

e8f21138-ec2b-11ee-a297-92fbcf53809c.png

随着代码的循环复杂度、嵌套函数调用的数量、函数中变量数目等的增加,堆栈的使用量也在增加。Polyspace 能够控制影响堆栈使用量的诸多变量,并支持设置代码复杂度阈值。

e906038c-ec2b-11ee-a297-92fbcf53809c.png

设置代码复杂度阈值。

Polyspace Bug Finder 提供了许多针对静态和动态内存分配的运行时检查。解决所有高、中和低优先级缺陷有助于降低内存分配带来的风险。

e90c6b6e-ec2b-11ee-a297-92fbcf53809c.png

运行时静态和动态内存检查。

无论使用何种方法来计算堆栈使用量,稍微增大堆栈大小都不失为一个好办法。这种方法有助于避免测试期间可能未检测到的堆栈溢出导致的系统漏洞。

堆栈溢出漏洞是许多嵌入式应用程序在实际运行中表现出不可定义行为的一个重要原因。在正确的时间使用正确的工具并遵循最佳实践,可以增强对软件防止堆栈溢出的信心。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式系统
    +关注

    关注

    40

    文章

    3430

    浏览量

    128219
  • RAM
    RAM
    +关注

    关注

    7

    文章

    1321

    浏览量

    113705
  • AUTOSAR
    +关注

    关注

    9

    文章

    329

    浏览量

    21130

原文标题:嵌入式软件 | 如何在整个开发过程中持续监控堆栈分析?

文章出处:【微信号:MATLAB,微信公众号:MATLAB】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    uCOS任务堆栈的深入分析

    在uCOS中,每一个任务都有一个独立的任务堆栈。为了深入理解任务堆栈的作用,不妨分析任务从“出生”到“消亡”的整个过程,具体就是分析任务的建立,运行,挂起几种状态中任务
    发表于 11-01 11:52 3104次阅读

    基于arm的操作系统中断堆栈分析及实现

    基于arm的操作系统中断堆栈分析及实现
    发表于 08-16 14:25

    如何通过IAR进行堆栈使用分析

    前言在嵌入式应用开发过程中,由于MCU的存储资源有限,因此堆栈空间大小的设定极为关键。堆栈空间设置过大则会造成资源的浪费,堆栈空间设置过小则可能导致
    发表于 01-03 16:45

    嵌入式处理器环境中为什么汇编语言不需要堆栈

    嵌入式处理器环境中,为何C语言(函数调用)需要堆栈,而汇编语言却不需要堆栈?据我所知,c语言最终也是被编译成了汇编,都是汇编,为何c语言生
    发表于 03-20 04:35

    嵌入式学习手册——堆栈结构与编程

    栈这种结构在嵌入式里其实是非常常用的,比如函数调用与返回就是典型的栈应用,虽然很多时候栈都是 CPU 系统在自动管理,我们只需要在链接文件里分配栈大小以及栈存放位置,但稍微了解一下栈的原理会更加利于
    发表于 04-20 07:00

    嵌入式堆栈原理及其纯C的实现方法

    嵌入式堆栈原理及其纯C实现  
    发表于 12-28 06:30

    嵌入式系统使用的存储器是如何进行划分的

    嵌入式最小硬件系统是由哪些部分组成的?嵌入式系统使用的存储器是如何进行划分的?可分为哪几类?
    发表于 10-22 07:18

    嵌入式C语言应用工程中堆栈的相关资料分享

    堆栈的定义和作用2. 嵌入式 C 语言应用工程的栈大小确定3. 嵌入式 C 语言应用工程的堆栈溢出定义、危害以及应对措施 概述与案例分析过去
    发表于 11-04 06:10

    介绍嵌入式软件堆栈使用情况的估算方法

    介绍了嵌入式软件堆栈使用情况的估算方法。为了方便理解这种估算方法,还对相应的堆栈操作汇编代码(ARM Cortex-M处理器)进行分析和说明
    发表于 12-14 07:25

    多任务系统中的堆栈使用

    多任务系统运行过程中,此堆栈将专门用于中断和异常处理程序。多任务启动后,C堆栈会丢失,导致嵌入式应用中可用的RAM量减少,在资源有限的应用中,可以重用C
    发表于 01-05 13:52

    KAN316如何确定应用程序的堆栈使用情况

    使用,并通过进程堆栈指针(PSP)进行寻址。 由于堆栈的内存区域在大小上受到限制,因此在堆栈上分配比可用内存更多的内存可能会导致程序崩溃或堆栈
    发表于 08-28 07:27

    深入分析MCU堆栈的作用 以及该如何设置堆栈大小

    深入分析MCU堆栈的作用,以及该如何设置堆栈大小
    的头像 发表于 03-01 14:13 4532次阅读
    深入<b class='flag-5'>分析</b>MCU<b class='flag-5'>堆栈</b>的作用 以及该如何设置<b class='flag-5'>堆栈</b>大小

    嵌入式堆栈原理是怎么样的如何进行纯C实现

    栈这种结构在嵌入式里其实是非常常用的,比如函数调用与返回就是典型的栈应用,虽然很多时候栈都是CPU系统在自动管理,我们只需要在链接文件里分配栈大小以及栈存放位置,但稍微了解一下栈的原理会更加利于我们去理解
    的头像 发表于 02-06 16:23 2655次阅读
    <b class='flag-5'>嵌入式</b>里<b class='flag-5'>堆栈</b>原理是怎么样的如<b class='flag-5'>何进行</b>纯C实现

    Embedded Studio堆栈溢出预防简析

    为了识别运行的嵌入式系统中的堆栈溢出问题,SEGGER编译器通过为每个函数生成检测代码的方式来检查堆栈溢出。
    的头像 发表于 07-14 11:07 536次阅读

    嵌入式系统堆栈监控的作用

    在微控制器或微处理器中,堆栈是内存的一个保留区域,用于存储临时数据和函数调用信息,管理函数的执行,跟踪返回地址、局部变量和函数参数。堆栈监控嵌入式
    的头像 发表于 01-05 11:13 215次阅读