当前位置:首页 > 单片机 > 单片机
[导读]编译器在生成代码使用两个堆栈:一个是用于子程序调用和中断操作的硬件堆栈,一个是用于以堆栈结构传递的参数临时变量和局部变量的软件堆栈。硬件堆栈是从数据内存的顶部开始分配的,在硬件堆栈下面再分配一定数量的

编译器在生成代码使用两个堆栈:一个是用于子程序调用和中断操作的硬件堆栈,一个是用于以堆栈结构传递的参数临时变量和局部变量的软件堆栈。硬件堆栈是从数据内存的顶部开始分配的,在硬件堆栈下面再分配一定数量的字节作为软件堆栈。硬件堆栈和软件堆栈均为向下生长型的堆栈(注意:这与51单片机相反)。

通常如果你的程序没有子程序调用也不调用象带有%f 格式的printf()等库函数,那么默认的16 字节应该在大多数的例子中能良好工作。在绝大多数程序中除了很繁重的递归调用程序再入式函数,最多40 个字节的硬件堆栈应该是足够的。

如果函数的调用层次太深,有可能会发生硬件堆栈溢出到软件堆栈中,改变了软件堆栈中数据的内容,同样,当定义了太多的局部变量或一个局部集合变量太多也有可能出现软件堆栈溢出到动态分配的数据区,两个堆栈都有可能溢出,如果堆栈溢出,会引起不可预测的错误。可以使用堆栈检查函数检测两个堆栈是否溢出。

在Target的页面中有一个Return Stack Sizi选项,用于指定硬件堆栈(保存函数返回值)的大小,通常如果子程序调用嵌套不深(不超过4层),那么使用默认的16字节就足够了,如果使用了浮点函数,则至少应设定为30个字节。在一般情况下,除了层次很深的递归调用及使用了%f格式说明符外,设定为40个字节就足够了。

硬件堆栈是从数据内存的顶部开始分配的,而软件堆栈是在它下面一定数量字节处分配。硬件堆栈和数据内存的大小是受在编译器选项中的目标装置项设定限制的。数据区从0x60 开始分配。在IO 空间后面是正确的。允许数据区和软件堆栈彼此相向生长。

如果你选择的目标装置带有32K 或64K 的外部SRAM,那么堆栈是放在内部SRAM的顶部而且向低内存地址方向生长。参考程序和数据内存的使用。任意一个程序失败的重要原因是堆栈溢出到其它数据内存的范围,两个堆栈中的任意一个都可能溢出,并且当一个堆栈溢出时会偶然产生坏的事情,你可以使用堆栈检查函数检测溢出情况 。

关于堆栈检查函数:

启动代码在硬件堆栈和软件堆栈的最低字节分别写进一个代码(0xaa),把这个代码称为警戒线。如果硬件堆栈和软件堆栈如果溢出过,则警戒字节的代码(0xaa)就会被改变,堆栈检查函数就是通过检查这两个堆栈的最低字节的代码是否被改变来判断两个堆栈是否溢出。通过调用_StackCheck(void)函数来检查堆栈溢出,如果警戒线字节中的代码仍然保持正确的值,那么函数检查通过,没有溢出。如果堆栈溢出,那么警戒线字节将可能被破坏,_StackCheck(void)函数检查到警戒线判断字节中的代码被改变,就判断相应的堆栈溢出(当程序堆栈溢出,程序可能运行不正常或偶然崩溃),该函数再调用函数_StackOverflowed(char c),如果参数是1,那么硬件堆栈有过溢出;如果参数是0,那么软件堆栈曾经溢出。

在使用堆栈检查函数时应注意以下几点:

1、在使用堆栈检查函数时,前必须用#i nclude "macros.h"预处理。

2、如果使用自己的启动文件,在ICCAVR6.20以后的版中,如果使用的启动文件中没有警戒线的内容,ICCAVR也会自动添加警戒线。而在ICCAVR6.20以前的版本中,必须自己添加该部分内容,否则生成的代码中堆栈分配将不带警戒线。

3、如果使用动态内存分配,必须跳过警戒线字节_bss_end来分配您的堆(即增加一个字节),详见内存分配函数说明

4、当_StackCheck(void)函数检测到警戒线字节被改变,则会调用一个默认的_StackOverflowed 函数来跳转到程序存储器0的位置(复位向量地址)。可以指定或重新编写一个新的函数来代替它,例如可以用新函数来指示是哪个堆栈溢出等,但这个函数也不可能执行太多的功能或让程序恢复到正常状态。因为堆栈溢出后,会更改掉一些有用的数据,引起不可预测的错误,甚至使程序死机。

下面用一个简单的实例来说明堆栈检查函数的作用:

main( )

{

init( ) //调用初始化程序

float a,b;

a=1.0;

b=1.0;

printf("a = %fn", a);

printf("b = %fn", b);

_StackCheck( ); //调用堆栈检查函数

}

_StackOverflowed(char c)

{

if (c == 1)

puts("trashed HW stack"); //硬件堆栈溢出

else

puts("trashed SW stack"); //软件堆栈溢出

}

扩展阅读:AVR单片机一些学习笔记

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭