历史上的今天
返回首页

历史上的今天

今天是:2025年01月08日(星期三)

正在发生

2020年01月08日 | IAR开发STM32堆栈设置

2020-01-08 来源:eefocus

一、前言

关于堆栈的定义在此就不赘述,详细内容可以看这篇博客。

堆栈溢出会导致野指针,返回地址错误等问题,通常程序已经无法正常运行,进入 HardFault 异常中断。为了避免这种情况,一般会分配较大的空间用做栈,可是如果仅仅为了安全就分配大空间的栈势必导致内存浪费。本文介绍两种获取栈最大消耗的方法,以方便合理设置栈的大小。


二、方法

1、方法一

栈指针 SP 指向的位置可以反应出当前栈的消耗量。在 STM32 中,栈是向下生长的,如果我们定期的获取栈指针 SP 的值,比较后得到一个最小值,就代表了栈的最大消耗量。而如何才能定期去获取栈指针 SP 的值呢?可以使用定时器产生一个周期性的中断,在中段函数中获取栈指针 SP 的值。最简单的方法就是在系统滴答定时器(SysTick)的中断函数中调用栈分析函数。具体可以参看如下的函数。在程序运行结束后,再去获取最大栈消耗量。


static uint32_t max_stack_usage = 0xffffffff;

void stack_parse()

{

int a = 0;


if((uint32_t)&a < max_stack_usage)

{

max_stack_usage = (uint32_t)&a;

}

}


uint32_t get_max_stack_usage()

{

return max_stack_usage;

}


由于这个函数是周期执行的,必然对程序的运行性能产生影响,不过这只是为了分析,最终是要移除的。另外由于是周期执行,所以可能会错过一些周期性的压栈,以至于获取的数值并不是最大值。不过,这种方法还是有它的参考意义的。


2、方法二

在 IAR 中,可以开启栈使用分析(IAR Embedded Workbench Stack Usage Analysis),让 IDE 在编译链接阶段就推算出这个程序的栈最大使用量。不过这种方法无法分析使用函数指针的方式调用的函数,也不能确定递归函数的嵌套次数,因此这两种情况下需要使用配置文件来指出这种调用的压栈空间,比较麻烦,具体可看官方手册。不过函数指针和递归函数毕竟是少数情况,大多数的函数都是显示调用的。因此 IDE 会分析出一条最长的调用路径,从而分析出最大的栈使用量。步骤如下:


1、开启 options > linker >Advanced > Enable stack usage analysis

2、编译后查看 map 文件中的 STACK USAGE 部分


内容类似于:


*******************************************************************************

*** STACK USAGE

***


  Call Graph Root Category  Max Use  Total Use

  ------------------------  -------  ---------

  Program entry              8 600      8 600

  Uncalled function            256      1 332


三、总结

栈空间用来存放局部变量,部分函数参数,返回地址,以及保存函数调用时主调函数的寄存器内容等。为了减少栈的分配,一定要注意不要在函数中放置很大的局部数组。上文所需的 8600 字节的栈空间,就是因为程序中有一个函数中分配了一个 8192 字节的数组,如下。


int decode_subframe_lpc(FLACContext *s, int32_t* decoded, int pred_order)

{

   int sum, i, j;

   int64_t wsum;

   int coeff_prec, qlevel;

   int coeffs[2048]; //8k, use heap to save stack

   int32_t* output;

   int32_t* reader;

   int* pcoeffs;

   ...

}


可以使用两种方式来修改。其一,将 coeffs 这个数据变成 static 局部静态变量,这样做可以将这个变量从栈中移到 .bss 区域中,不过这种方式并不灵活,相当于 8192 B 的空间被占用,而其他函数无法使用。所以本质上和放在栈空间中区别不大。其二是通过 malloc 的方式灵活申请和释放内存,当不在需要这部分空间时,可以将其释放。

推荐阅读

史海拾趣

Anadigm公司的发展小趣事

Anadigm是一家曾经存在的半导体公司,专注于可编程模拟信号处理器(PASP)技术。以下是Anadigm公司发展的相关故事:

  1. 公司成立与初期发展:Anadigm公司成立于1997年,总部位于美国加利福尼亚州圣塔莫尼卡市。公司的创始人致力于开发一种新型的可编程模拟信号处理器(PASP),以应对传统模拟电路设计的局限性。通过引入数字技术,Anadigm旨在提供更灵活、高性能的模拟信号处理解决方案。

  2. PASP技术的推出与市场应用:Anadigm公司于2000年推出了其首款可编程模拟信号处理器产品系列。这些器件具有灵活的可编程性和高度集成的特点,能够适应多种应用场景,包括电力管理、医疗设备、汽车电子和工业控制等领域。Anadigm的PASP技术受到了行业的关注,并在市场上取得了一定的成功。

  3. 技术创新与产品优化:Anadigm公司不断投入研发,致力于改进其PASP技术并推出更先进的产品。公司持续与客户合作,了解市场需求并进行技术创新,以满足不断变化的行业需求。Anadigm的产品不断优化,性能不断提升,赢得了客户的信赖和市场份额的扩大。

  4. 合并与收购:尽管Anadigm公司在PASP技术方面取得了一定的成就,但面临着激烈的市场竞争和资金压力。在公司运营一段时间后,Anadigm于2008年被美国半导体公司Exar Corporation收购。此次收购使得Anadigm成为Exar的全资子公司,继续在模拟信号处理领域发展。

  5. 最终终止业务:然而,随着时间的推移,Anadigm在市场上的地位逐渐下滑,未能在激烈的竞争中保持竞争优势。最终,Exar Corporation于2014年宣布终止Anadigm的业务,并关闭其产品线。这标志着Anadigm作为一个独立的实体在半导体行业的终结。

以上是Anadigm公司发展的一些主要故事,展示了该公司从创立到终止业务的发展历程。

Hsuan Mao Technology Co公司的发展小趣事

Hong Kong X'Tals Ltd在电子行业的发展故事

故事一:精密时间与频率产品的创新之路

Hong Kong X'Tals Ltd(简称HKC)自1991年成立以来,一直致力于精密时间和频率产品的研发与生产。公司最引人注目的成就是其KSTAR系列全球导航卫星系统(GNSS)驯服振荡器(GNSSDO)的推出。这款新产品不仅接收来自北斗、GPS、GLONASS和GALILEO等多卫星系统的信号,还具备高灵敏度和低噪声的特点,长期频率稳定性优于1E-12。KSTAR系列GNSSDO的推出,标志着HKC在通讯、自动驾驶、能源和金融等领域的时间同步解决方案上达到了国际领先水平。这一创新不仅增强了公司在全球市场的竞争力,也为众多行业客户提供了更加精准和可靠的时间同步服务。

故事二:从石英晶体到国际市场的跨越

HKC的母公司Kolinker Industrial Equipments Ltd拥有超过13年的中国晶体行业经验,并在深圳设立了首家中国本地的晶体工厂,该工厂荣获QS9000和ISO/TS16949认证。这一成就不仅体现了HKC在晶体制造领域的专业实力,也为其产品打入国际市场奠定了坚实的基础。HKC凭借其高质量的石英晶体产品,成功进入东欧、日本、韩国、中国大陆、北美、台湾和西欧等市场,成为国际市场上备受瞩目的晶体产品供应商。

故事三:技术研发与产品多元化的并行发展

HKC深知技术研发对于企业发展的重要性,因此不断加大在研发领域的投入。公司不仅专注于晶体、谐振器和振荡器的研发与生产,还积极拓展产品线,推出了一系列满足不同行业需求的电子产品。例如,在工业自动化领域,HKC设计并制造了多款机电一体化设备,赢得了国内外众多知名家电制造商的青睐。此外,公司还涉足新能源行业,通过投资组建益阳晶鑫新能源科技实业有限公司,致力于多晶硅产业链的建设与发展。

故事四:品质管理与国际认证的双重保障

HKC始终将品质管理视为企业发展的生命线。公司早在2000年和2003年就分别通过了ISO9002 1994及ISO9001 2000质量管理体系认证,成为同行业中最具实力的公司之一。这一系列的国际认证不仅证明了HKC在品质管理方面的卓越表现,也为其赢得了国内外客户的广泛信赖。HKC始终坚持以客户为中心,不断提升产品品质和服务水平,努力成为电子行业的佼佼者。

故事五:全球化战略与本土化运营的有机结合

随着全球市场的不断扩大,HKC积极实施全球化战略,在全球多个地区设立分公司和生产基地。同时,公司也注重本土化运营,根据不同地区的市场特点和客户需求,提供定制化的产品和服务。例如,HKC在中国内地市场就设立了多家子公司和生产基地,通过深入了解本地市场需求和客户需求,不断优化产品结构和服务模式,赢得了中国市场的广泛认可。这种全球化战略与本土化运营的有机结合,为HKC的可持续发展提供了强有力的支撑。

登丰微(GSTEK)公司的发展小趣事

歌普电子科技有限公司以自有品牌(GEPU歌普)创立于2006年,公司最初在台湾设立,随后逐步扩展至江苏和东莞,形成了跨区域的研发、生产和销售网络。公司自创立之初便专注于各式线对板连接器、板对板连接器、网络连接器等产品的研发与设计。通过不断的技术积累和市场需求洞察,歌普逐渐在连接器领域建立了自己的市场地位。

Heimann Optoelectronics Gmbh公司的发展小趣事

为了进一步扩大市场份额,Hei Inc Optoelectronic Division积极实施国际化战略。公司首先在欧洲和北美市场设立了分支机构,并建立了完善的销售和服务网络。通过参加国际展会、与当地企业建立合作关系等方式,公司成功地将产品推向了国际市场。同时,公司还加大了对海外研发中心的投入,吸引了众多国际顶尖的光电子专家加盟。这些举措不仅提升了公司的国际竞争力,还为公司带来了更多的国际订单和合作伙伴。

EOZ S.A.S公司的发展小趣事

EOZ S.A.S公司自创立之初,就致力于电子技术的研发与创新。在智能手机市场饱和之际,公司敏锐地捕捉到可穿戴设备市场的潜力,投入大量资源进行智能手表的研发。通过不断优化算法和硬件设计,EOZ S.A.S成功推出了一款具有超长待机、高精度健康监测和丰富应用场景的智能手表,迅速在市场上获得认可,公司因此崭露头角。

巨盛电子(Chesen)公司的发展小趣事

随着环保意识的提高,消费者对环保产品的需求也越来越高。巨盛电子(Chesen)积极响应环保号召,将环保理念融入产品设计和生产过程中。公司采用环保材料、优化生产工艺、加强废弃物处理等措施,减少了对环境的污染。同时,公司还积极开展环保宣传活动,提高了消费者对环保产品的认识和接受度。这些举措不仅塑造了巨盛电子的环保品牌形象,还为企业赢得了更多消费者的支持。

问答坊 | AI 解惑

哪位老师熟悉电动推杆的电气部分

就是附件的这种D24V电动推杆 我想请教的问题是1.工作循环:最大15%或者2min持续使用,休息15分钟,怕烧坏元件吗?这是为什么? 2.快速释放功能,指的是什么? 3.可配高感应的传感器,配传感器有什么用途? 我想深入的学习下电动推杆,哪位老师 ...…

查看全部问答>

电力系统开发招聘(广州猎头)

节能环保招聘需求(重点,急聘) 产品研发总监  20W/Y ?        招聘数量:若干 ?        工作职责 负责能源统计分析系统、能源审计预测系统研究; 负责能源管理系统总体设计; 掌握产 ...…

查看全部问答>

如何用方向键来控制鼠标移动,我做了一个,按方向键后鼠标位置是移动了,但是鼠标一动又回到原来位置,为什么啊?

如何用方向键来控制鼠标移动,我做了一个,按方向键后鼠标位置是移动了,但是鼠标一动又回到原来位置,为什么啊?…

查看全部问答>

小弟刚开始ARM7的USB开发,请推荐本好书看看

小弟刚开始ARM7的USB开发,请推荐本好书看看…

查看全部问答>

把WINCE设备做成U盘,连到PC怎么不见U盘盘符出现?设备管理器的设备列表也显示一个黄色的感叹号,为什么?难道还需要特别的U盘驱动程序?

把WINCE设备做成U盘,连到PC怎么不见U盘盘符出现?设备管理器的设备列表也显示一个黄色的感叹号,为什么?难道还需要特别的U盘驱动程序?…

查看全部问答>

STM32烧录的瓶颈在哪?

找了半天也没找到以前的那个讲usb时序的帖子,就新开一个了。现在在做一个usb的boot,基本功能已完成,只是下载速度不快,读取:50KB左右,下载20KB左右。  升级一个512K的芯片需要约22秒。不知道理论可以做到多少,是因为双缓冲的 ...…

查看全部问答>

请教一个LWIP问题

在LM3S上跑LWIP,RAW方式。在一个FOR循环中调用了TCP_WRITE()函数发送数据,发现循环次数多了的话,后面的数据会发送失败。请教,TCP_WRITE可以连续调用多少次,由哪个选项决定?…

查看全部问答>

【MSP430共享】基于射频技术的工程机械仪表无线通信解决方案

针对大型工程机械各类信号与驾驶操控室仪表异地显示的通信问题, 提出基于射频模块 n R F 2 4 0 1 实现无线数据通信的设计方案,详细介绍射频芯片 n R F 2 4 0 1 的工作原理及特点, 并给出了无线通信系统硬件结构、 接口电路及相应程序框图。系统 ...…

查看全部问答>

系统反删除Linux文件的方法

作为一个多用户、多任务的操纵系统,Linux下的文件一旦被删除,是难以恢复的。尽管删除命令只是在档节点中作删除标记,并不真正清除文件内容,但是其它用户和一些有写盘动作的进程会很快笼盖这些资料。不外,对于家庭单机使用的Linux,或者误删档 ...…

查看全部问答>

单片机人生-最彪悍的一生传记

某天某日某产房,你诞生了(power up , 上电运行),结果你不哭,医生把你提起来,屁股上狠狠一巴掌,你哇哇大哭(reset, 复位成功),护士给你检查,看有没有传染病(EMI测试)、然后打预防针(绝缘处理),没有问题后作记录(QC pass),你的父母来接你回去(客户验收 ...…

查看全部问答>