单片机的栈

2023-05-16

导读:在C语言的世界里,栈的地位非常举足轻重,许多错误都可能和栈设置有关,那么该如何确定栈的大小?

今天分享一点栈知识,帮助你确定栈的大小,参考链接请点击下方的阅读原文。

其实很多编译工具是可以获取函数调用信息的,比如:

KEIL 平台

可以使用参数:

  • --callgraph:生成一个静态调用图(html或文本格式),显示堆栈使用情况 

  •  
  • --info=stack:列出所有全局符号的堆栈使用情况

以上两个参数分别生成Objects目录下的 xxx.htm文件(事实上这个--callgraph是默认参数,用浏览器打开这个文件即可)和 Listings目录下的xxx.map 文件(keil或者记事本打开)。

xxx.htm

xxx.map

事实上这个文件生成也是由默认参数 --map 管理的,不同的是增加 --info=stack 参数后,文件中还会增加如下信息:

它描述了每一个函数调用情况,并且把最大调用链和最大使用栈给你找出来了(这个文件打开有一个小技巧,双击 Target 1,即可打开这个文件,方便快捷)。

事实上,这些信息只能用于参考,而不能作为最终的栈大小,计算实际栈大小远比这个复杂,这个原文进行了深入阐述。

事实上,一般设置栈大小都不会采用如此复杂的计算,而是通过长时间运行来简单确定栈大小(一般 RTOS 都有栈检查功能函数),并且会在长时间运行获取栈大小的前提下预留一定大小的栈空间,这样一般来说都能保证有足够的栈空间。

IAR 平台

这个平台鱼鹰不是很熟悉,原文是这样写的:

IAR Embedded Workbench for Arm (EWARM) provides stack size report in the linker map file. To enable this, the following project settings are required:

  1. Enable linker map file generation in Linker settings (List tap)

  2. Enable stack usage analysis (Advanced tap).

谷歌浏览器自动翻译结果是:

用这个开发平台的道友可以试试。

GCC

使用参数:

         -fstack-usage

并且 gcc上提供了堆栈保护功能,使用以下选项

  • -fstack-protector:在堆栈帧上为每个易受攻击的函数插入一个保护变量。

  • -fstack-protector-all:在堆栈帧上为所有函数插入一个保护变量。

 

 

然后在看看文中的几个有意思的点:

01 栈布局

 

一般情况下的栈布局有如下两种:

KEIL 平台下的属于第一种,这就是为什么栈空间小了会很大可能影响用户变量的原因(栈往低地址生长)。而 gcc 采用第二种情况,这种情况可以完全利用 RAM 空间,如果说这种布局还会导致栈空间不够,那么你怎么设置栈大小都没用了。

02 函数调用

需要特别了解来自开发工具的堆栈使用报告仅涵盖每个函数或调用树的堆栈使用情况。 它们不包括异常处理程序所需的额外堆栈空间。

假设应用程序仅对外设中断使用两个中断优先级,由于可能发生HardFault异常和NMI异常(如果应用程序使用),可能存在4级嵌套异常,如图所示。

(原作者为Joseph Yi)

这就是为什么栈计算复杂的原因了。

栈计算可用以下流程图:

 

(原作者为Joseph Yi)

03 栈大小难以计算原因

软件开发人员可能会发现,在许多情况下,报告无法提供有关应用程序某些部分的堆栈要求的信息。堆栈使用情况报告生成对某些代码不起作用的原因有很多:

 

  • 在应用程序中使用函数指针可能意味着该工具无法生成调用树。

  • 在许多工具中,C运行时库中函数的堆栈使用是未知的。

  • 该应用程序包含递归函数调用或自修改代码。

 

 

在这些情况下,您可能必须手动计算这些函数的最大堆栈使用量,或者通过试验来估计这些函数。例如,您可以在运行程序之前使用调试器以某种数据模式填充堆栈内存空间,然后执行代码,并检查堆栈内存空间以查看程序执行已修改了多少堆栈空间。

 

也可以通过在项目中添加检测代码来处理堆栈估算。例如,附录I显示了gcc Arm Embedded(使用NewLib)的堆栈检查实用程序代码。

 


 

最后再说一点,鱼鹰知道 PID 系列文章很多道友都不是很感兴趣(从阅读量可以看出),但是鱼鹰还是会继续更新下去的,因为鱼鹰写这部分笔记的初衷本来就是给自己看的,所以不会因为你们不感兴趣而停止更新。

 

另外鱼鹰还想说的就是,一旦 PID 系列文章更新完毕,鱼鹰可能将停止更新。

 

为什么呢,从去年 11 月份开始到,因为做公众号而花费了很大精力,但收获很小,而且最近的状态是总想着怎么写出一篇好的文章,而不是说怎么研究技术问题。而本公众号的文章里面,只有 KEIL 调试系列和少数几篇文章还算满意,其他文章的价值很少。在鱼鹰看来,先有好的技术积累,才会有好的文章出现。最近一段时间一直在输出,而输入很少,所以鱼鹰准备暂停更新,直到认为有足够的技术积累再继续更新。

 

那什么时候恢复更新呢?鱼鹰无法确定,所以说如果你觉得本公众号没有价值了,那么可以取消关注。但是鱼鹰想说的是,当公众号恢复更新时,将呈现三大系列文章:

 

1、USB (包括如何自制一个调试器,将以它作为这个系列的最终目标)

2、FAT32FS 文件系统(源码理解,图解文件系统)

3、uCOS II (鱼鹰已全部看完并理解源码,只是需要点时间写出相应的笔记)

 

最近鱼鹰也算处于一种转型状态了,从单片机开发转向 linux 开发,不懂的知识点太多了,祝我好运咯!

转载于:https://www.cnblogs.com/CodeWorkerLiMing/p/11372687.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单片机的栈 的相关文章

  • eclipse运行mapreduce的wordcount

    1 xff0c eclipse安装hadoop插件 插件下载地址 xff1a 链接 https pan baidu com s 1U4 6kLFNiKeLsGfO7ahXew 提取码 as9e 下载hadoop eclipse plugin
  • 软件测试时间被压缩,应如何应对

    紧急情况下测试周期被压缩在国内大多数公司都会出现这种情况 那出现这种情况该如何去面对并展开测试呢 首先我们需要弄清楚是什么原因导致出现这种情况 到底是内部原因导致还是外部原因导致 说到底如果是外部原因导致基本都是由于需求变更引起的 内部原因
  • 在winform界面上实现伸缩功能

    要想在winform界面点击某个按钮或是图标 xff0c 实现某个区域的伸缩 xff0c 而且界面的布局还要随着一起变化 xff0c 看似不好实现 xff0c 因为他们的在winform上的依据坐标点来排兵布局的 xff0c 但是也不是不能
  • Android开发mac /dev/kvm is not found

    主要内容 1 错误起因 2 错误提示 3 解决问题办法 一 错误起因 运行项目的时候选择部署目标的弹出来如下错误提示 xff0c 如图 xff1a 二 错误提示 dev kvm is not found 三 解决问题办法 首先去Androi
  • 华为解锁BL

    华为手机要怎么查看手机是否需要解锁呢 相信许多机油都不懂自己入手的手机是否需要解锁 而华为手机自华为C8812之后的高通手机均需要先解锁才能够尽兴刷机或获取Root权限的 那么下面我给大家分享一下华为手机查看是否需要解锁的查看教程 方法 步
  • ---rk3399 平台出现不出桌面问题解决

    有开机动画 xff0c 有如下错误 xff1a drm vop afbdc atomic check ERROR not support afbdc 关掉afbdc功能 xff0c 就好了 xff01 hardware rockchip l
  • Hadoop MapReduce编程 API入门系列之统计学生成绩版本2(十八)

    不多说 xff0c 直接上代码 统计出每个年龄段的 男 女 学生的最高分 这里 xff0c 为了空格符的差错 xff0c 直接 xff0c 我们有时候 xff0c 像如下这样的来排数据 代码 package zhouls bigdata m
  • C# 窗体显示自定义位置,任意位置,窗体显示在屏幕下方

    由于项目需要 xff0c 打开窗体的位置要位于屏幕的右下方 xff0c 所以默认的位置解决不了 xff0c 那就自定义显示位置 xff0c 可以设置显示到任意位置 我的窗体大小为240 109 xff0c 在显示器的右下角打开 int Wi
  • GoldenGate 复制进程报错"OGG-01296 Error mapping",丢弃文件报错“Mapping problem with delete record (target format)...

    故障描述 xff1a 1 复制进程 Abended xff0c 通过 view report语句查看可发现类似如下的报错 xff1a 2017 10 23 15 01 43 ERROR OGG 01296 Error mapping fro
  • MySQL在远程访问时非常慢的解决skip-name-resolve

    服务器放在局域网内进行测试时 xff0c 数据库的访问速度还是很快 但当服务器放到外网后 xff0c 数据库的访问速度就变得非常慢 后来在网上发现解决方法 my cnf里面添加 mysqld skip name resolve 这样速度就快
  • 一起学Hadoop——二次排序算法的实现

    二次排序 xff0c 从字面上可以理解为在对key排序的基础上对key所对应的值value排序 xff0c 也叫辅助排序 一般情况下 xff0c MapReduce框架只对key排序 xff0c 而不对key所对应的值排序 xff0c 因此
  • MySQL复制表结构和复制表

    之前看到网上很多说用 SELECT INTO 表2 FROM 表1 WHERE 1 61 2 可以将表1结构复制到表2 用SELECT INTO 表2 FROM 表1 可以将表1 内容全部复制到表2 但是每次都会报错 xff1a 说表2 没
  • python的tuple()元组数据类型的使用方法以及案例

    一 元组的概念介绍 1 元组是列表的二次加工 列表可以被修改 列表的类型 list li 61 1 2 3 4 5 6 2 元组的元素不可被修改 xff0c 不能被增加或者删除 xff0c xff08 只是针对元组的一级元素是不可以修改的
  • 从源码解析ERROR 1129 (HY000):Host is blocked because of many connection errors

    原创水平有限 有错请指出 源码版本5 7 14 今天群里一个朋友出现如下错误 xff1a ERROR 1129 HY000 Host 39 10 0 0 8 39 is blocked because of many connection
  • 3.python 发送邮件之smtplib模块

    SMTP xff08 Simple Mail Transfer Protocol xff09 是简单邮件传输协议 xff0c 它是一组用于由源地址到目的地址的邮件传输规则 python中对SMTP进行了简单的封装 xff0c 可以发送纯文本
  • Linux VMWare VNC远程桌面管理

    一 linux vncserver环境配置 xff1a 1 vncserver和gnome安装软件包 xff1a yum install tigervnc server y yum groups install GNOME yum grou
  • UML动态模型(顺序图、协作图、状态图)

    顺序图 xff1a 用来表示用例中的行为顺序 xff0c 当执行一个用例行为时 xff0c 顺序图中的每条信息 对应了一个类操作或状态机中引起转换的事件 顺序图展示对象之间的交互 xff0c 这些交互是指在场景或用例的时间六中发生的 xff
  • PX4编译总结以及底层驱动流程

    师父给的 Px4编译总结 1 ld文件配置MCU Firmware nuttx configs typhoon scripts 2 配置NUTTX系统 xff1a 修改defconfig Firmware nuttx configs typ
  • ovs ovn 学习资料

    0 A Primer on OVN http blog spinhirne com 2016 09 a primer on ovn html 1 Open Virtual Networking With Docker http docs o
  • openstack No valid host was found. There are not enough hosts available.

    root 64 dell PowerEdge T30 gedit var log nova nova conductor log root 64 dell PowerEdge T30 gedit var log nova nova sche

随机推荐

  • Python中判断字符串是否为数字的三个方法isdecimal 、isdigit、isnumeric的差别

    isdecimal isdigit isnumeric这三个字符串方法都用于判断字符串是否为数字 xff0c 为什么用三个方法呢 xff1f 他们的差别是什么内 xff1f isdecimal xff1a 是否为十进制数字符 xff0c 包
  • 超过255台电脑IP和子网掩码的一些知识(轉)

    超过255台电脑IP和子网掩码的一些知识 我们都知道 xff0c xff29 xff30 是由四段数字组成 xff0c 在此 xff0c 我们先来了解一下3类常用的 xff29 xff30 A类IP段 0 0 0 0 到127 255 25
  • Unable to determine the device handle for GPU 0000:01:00.0: GPU is lost.问题排坑

    在运行maskrcnn时 xff0c 会碰到训练不动的问题 xff0c 就卡在这儿 UserWarning Converting sparse IndexedSlices to a dense Tensor of unknown shape
  • TCP/UDP协议

    一 协议的概念 什么是协议 xff1f 从应用的角度出发 xff0c 协议可理解为 规则 xff0c 是数据传输和数据的解释的规则 假设 xff0c A B双方欲传输文件 规定 xff1a 第一次 xff0c 传输文件名 xff0c 接收方
  • Chapter 4 Metrology system

    The metrology system measures the position of the probe relative to the product in the six critical directions in the pl
  • 二值信号量和互斥锁到底有什么区别?

    在说明之前我先抛出结论 xff1a 互斥锁和二值信号量在使用上非常相似 xff0c 但是互斥锁解决了优先级翻转的问题 假定我们现在有三个任务 xff0c task1 xff0c task2 xff0c task3 xff0c 任务优先级ta
  • uCos的多任务实现

    uCos的多任务实现 作为操作系统 OS xff0c 最基本的一项服务就是提供多线程 xff0c 在实时操作系统uCos里 xff0c 多线程被称为多任务 Task 多任务并不是CPU能真正同时运行多个程序 xff0c 实际是靠CPU在多个
  • 设置vnc登录远程虚拟机

    设置vnc登录远程虚拟机 原理简介 xff1a vnc分为vnc server 和vnc view xff0c 我们经常用来连接远端服务器的是vnc view客户端 xff0c server端部署在服务器端 vnc 能够与远端服务器实现通信
  • S03_CH13_ZYNQ A9 TCP UART双核AMP例程

    S03 CH13 ZYNQ A9 TCP UART双核AMP例程 13 1概述 ZYNQ中存在两个独立的ARM核 xff0c 在很多应用场景中往往只需使用其中的1个核心即可 然而 xff0c 对于复杂的设计 xff0c 例如多任务 xff0
  • Git 本地仓库(使用小乌龟进行操作,一个人开发)

    一 首先在本地创建版本库 创建成功最明显的特征是该目录下存在一个隐藏文件夹 xff08 git xff09 前提 xff1a 已设置显示隐藏文件 三种方式 xff1a 1 Git GUI Here xff08 右击 xff09 2 Git
  • ubuntu html5桌面,docker-ubuntu-vnc-desktop

    docker ubuntu vnc desktop Docker image to provide HTML5 VNC interface to access Ubuntu 16 04 LXDE desktop environment Qu
  • Docker容器跨主机通信--overlay网络

    一 Docker主机间容器通信的解决方案 Docker网络驱动 Overlay 基于VXLAN封装实现Docker原生Overlay网络Macvlan Docker主机网卡接口逻辑上分为多个子接口 xff0c 每个子接口标识一个VLAN 容
  • intel和AMD CPU性能对比(2016年CPU天梯图)组装电脑必读!

    http www 365pcbuy com article 411 html 特别提示 xff1a 此文已经于2016年10月12日更新 xff01 内容变动较大 xff0c 请细细品鉴 xff01 如何为客户推荐高性价比机型是我站的重要工
  • SDN控制器-POX学习(一)

    本文实验环境 1 VirtualBox 2 SDN Hub tutorial VM 64bit 学习目标 1 熟悉SDN Hub tutorial 2 学习POX提供的样例代码 tutorial l2 hub py SDN Hub tuto
  • android 编译突然出错,错误原因 Could not resolve com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+....

    错误追根是因为微信支付依赖的错误 解决办法 xff1a 微信支付依赖版本 43 号改为微信支付依赖最新版本 在这里https bintray com wechat sdk team maven可以查看到wechat sdk的最新版本号 xf
  • 浏览器相关知识

    1 认识浏览器 浏览器是把在互联网上找到的文本文档翻译成网页 xff0c 网页包括图形 音频 视频和文本等 2 浏览器的主要功能 展示网页资源 xff0c 即请求服务器并将请求的结果显示在浏览器窗口中 资源的格式一般是HTML xff0c
  • linux vnc的默认端口修改

    linux vnc的默认端口修改 2014 02 08 20 01 28 分类 xff1a LINUX vnc的默认端口是5901 xff0c 这个说法是不对的 vnc并不是只有一个端口 以前另一个文章介绍了nvcserver的配置用户的过
  • redis配置

    1 Redis 3 2x配置文件详解 2 3 4 默认redis不是以后台进程的方式启动 xff0c 如果需要在后台运行 xff0c 需要将这个值设置成yes 5 以后台方式启动的时候 xff0c redis会写入默认的进程文件 var r
  • Cosmos OpenSSD架构分析--FSC

    接口速度 xff1a type bw read75 s1s 75 s 8k 1s 61 104m swrite 1300 s 1s 1300 s 8k 1s 61 6m serase3 8ms 1s 3 8ms 8k 256 1s 61 5
  • 单片机的栈

    导读 xff1a 在C语言的世界里 xff0c 栈的地位非常举足轻重 xff0c 许多错误都可能和栈设置有关 xff0c 那么该如何确定栈的大小 xff1f 今天分享一点栈知识 xff0c 帮助你确定栈的大小 xff0c 参考链接请点击下方