陈皮不能和什么一起吃| 阳痿是什么意思| 为什么抽烟会上瘾| 黄精是什么药材| 什么的陪伴| 什么叫凤凰男| 医院附近适合做什么生意| 滑膜炎吃什么好得快| 内参是什么意思| 四川是什么气候| 淘宝交易关闭是什么意思| 姑姑的女儿叫什么| 大姨妈可以吃什么水果| 三价铁离子什么颜色| 走路腿软没劲是什么原因引起的| 广东省省长是什么级别| 戌时是什么时候| 人尽可夫什么意思| dodo是什么意思| 红色裤子配什么上衣好看| 消化不良吃什么中药| 玄乎是什么意思| 有机会是什么意思| 什么地唱| 总蛋白高是什么原因| 小孩c反应蛋白高说明什么| 脑梗塞用什么药效果好| 老年痴呆症是什么原因引起的| 月经淋漓不尽是什么原因| 喜上眉梢是什么意思| 口腔溃疡吃什么维生素| 月经期间吃西瓜有什么影响| 什么是蚂蚁上树| 什么水果含糖低| 蜈蚣咬了擦什么药最好| 上火引起的喉咙痛吃什么药| 步步高升是什么意思| 空代表什么生肖| 肝脏多发囊肿什么意思| 花胶有什么功效与作用| 就读是什么意思| 清华大学前身叫什么| grace什么意思中文| 心脏跳的快是什么原因| 吃什么药可以减肥| 氧化氢是什么| 肠胃炎有什么症状| 头重脚轻是什么生肖| la什么牌子| 床上有横梁有什么害处| chloe是什么意思| 供血不足吃什么药效果最好| 玉米吃多了有什么坏处| 氟康唑治什么妇科炎症| 没必要什么意思| 有什么有什么的四字词语| 梦见死人的场面是什么兆头| 尔加玉读什么| 16岁是什么年华| 左什么结构| 医院验光挂什么科| 对节木是什么树| 肠道ct能检查什么| 普洱茶是什么茶| 胃总疼是什么原因| 胃烧心是怎么回事吃什么药| 什么是偶数| 吃苋菜有什么好处| 双相情感障碍什么意思| 亡羊补牢说明什么道理| 拉稀是什么原因| 1108是什么星座| 沉香有什么作用| 食色性也什么意思| 手脚麻木吃什么药| 乙肝两对半和乙肝五项有什么区别| 暖宫贴贴在什么位置| 充电宝100wh是什么意思| 数农是什么| 什么是散射光| 毒龙钻是什么意思| 面黄肌瘦是什么意思| 鼻窦炎有什么症状| 柯基犬为什么要断尾巴| 一直放屁是什么原因| 头晕恶心呕吐是什么原因| 吊儿郎当什么意思| 惨不忍睹是什么意思| 顶格是什么意思| 儿童头晕挂什么科| 新生儿呛奶是什么原因引起的| 人心惶惶是什么意思| 胃不好适合吃什么水果| 孩子吃什么有助于长高| 什么光会给人带来痛苦| 什么水果寒凉性| 桑黄长在什么树上| 体能是什么| 海葡萄是什么| 什么是犯太岁| 山东吃什么主食| 吴刚和嫦娥什么关系| 97年是什么年| 需要透析的是什么病| 作奸犯科是什么意思| 猪肝和什么菜搭配吃好| 莲雾吃了有什么好处| 苏麻为什么不嫁给康熙| 鬼斧神工是什么意思| 和谐的意思是什么| 凌晨三点醒是什么原因| 梦见死人了是什么预兆| 吃什么排湿气最好最快| 左腰疼痛是什么原因男性| 乜贴是什么意思| TV什么意思| 鱼香肉丝是什么菜系| 什么是蒸馏水| 肚子疼拉稀吃什么药| 吃香蕉有什么好处| 牛市是什么意思| 什么叫腔梗| 茯苓生长在什么地方| 早餐吃什么减肥| 吃什么水果降火最快| 掉睫毛是什么原因| 大修基金什么时候缴纳| 变蛋吃多了有什么好处和坏处| 小孩子黑眼圈重是什么原因| 锁阳是什么| 热感冒吃什么药好得快| 皮质醇高是什么原因| 什么是色盲| 中年人喝什么奶粉好| 什么是超话| 吃什么化痰效果最好最快| 梦到自己流鼻血是什么预兆| 中国特工组织叫什么| 62年属什么| 轮廓是什么意思| 知交是什么意思| 阑尾炎挂号挂什么科| cc什么意思| 便士是什么意思| 3价铁离子是什么颜色| 叻叻是什么意思| 一个女一个以念什么| 黄泉是什么意思| 晚上咳嗽什么原因| 电子厂是做什么的| 南瓜与什么食物相克| 伤口不结痂是什么原因| ala是什么意思| 胃酸过多吃什么| 智齿疼吃什么药最管用| 广东有什么烟| lee是什么档次| 吃鸡是什么意思| 心脏传导阻滞是什么意思| 尿酸升高是什么原因| dha不能和什么一起吃| 心慌是什么原因导致的| 什么是性压抑| 社会科学院是干什么的| 疥疮是什么原因造成的| 日加华念什么| 正比是什么意思| 标准的青色是什么颜色| 凝血四项能查出什么病| 超敏c蛋白反应高是什么原因| 喝隔夜茶有什么好处和坏处| 8月23是什么星座| 不成功便成仁的仁是什么意思| 脚板心发热是什么原因| 包拯属什么生肖| 箨是什么意思| 糖耐量是什么| 什么情况下吃救心丸| 什么的枝叶| 儿童头晕挂什么科| 一进去就射是什么原因| 藏毛窦是什么病| 三七主要治什么病| 什么是小暑| 怀孕哭对宝宝有什么影响| 嫡是什么意思| 防蓝光眼镜有什么用| 营销号是什么意思| 狗狗咳嗽吃什么药好得快| loho眼镜属于什么档次| 骨折恢复吃什么好| 早晨起床口干口苦是什么原因| 回家心切什么意思| 什么牌子的保温杯好| 胆碱酯酶高是什么原因| 嘴唇暗紫色是什么原因| 镇关西是什么意思| 脑梗塞吃什么食物好| 外婆菜是什么菜做的| 经行是什么意思| 人格的核心是什么| 7月8号是什么星座| 静脉曲张是什么症状| 婴儿枕头里面装什么好| 本钱是什么意思| 阳历是什么| 神仙眷侣是什么意思| 烫伤用什么药膏| 六五年属什么| 普工是什么| 甲减是什么病| 男同是什么| 泌尿是什么意思| 地藏经适合什么人念| 愚人节是什么时候| 黄鱼是什么鱼| 飞机杯是什么感觉| 什么汤清热解毒去火| 胆结石有什么治疗方法| 副处长是什么级别| 移植后可以吃什么水果| 减肥能吃什么零食| 运费险是什么意思| 头疼头晕是什么原因| 炎字五行属什么| 音什么笑什么成语| 雪莲果什么季节成熟| 微针有什么功效| 后脑两侧痛是什么原因| 花青素是什么| 铁皮石斛适合什么人吃| 精尽人亡什么意思| 粉色裤子配什么上衣好看| 羊齿状结晶代表什么| 梦见爸爸去世预兆什么| 复活节是什么意思| 双侧上颌窦炎是什么病| 朋字五行属什么| 7朵玫瑰花代表什么意思| 油压是什么意思| 悠着点是什么意思| 小跟班是什么意思| 蜗牛什么梗| 淋巴吃什么药可以消除| 福生无量是什么意思| 传宗接代是什么意思| 网剧是什么意思| tdp是什么意思| 喝咖啡有什么好处| 眼睛不舒服是什么原因| 米放什么不生虫子| 黑素瘤早期什么症状| 为什么男生| 做梦梦见死去的亲人是什么意思| apl医学上是什么意思| 梦见自己家盖房子是什么预兆| 进击的巨人真相是什么| 吃什么能提高记忆力| 海绵宝宝是什么生物| tr是什么| 左耳长痣代表什么| 旗舰店是什么意思| 什么动物睡觉不闭眼睛| 感冒适合吃什么水果| 百度

新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 单片机编程中关于堆栈的一些问题

人民日报评论员:始终把人民放在心中最高位置

作者: 时间:2025-08-04 来源:网络 收藏
百度   为期一个月的活动,为大家搭建了沟通交流、锻炼身体、增进友谊的平台,营造了和谐温馨、团结协作的浓厚氛围,进一步增强了生物中心全体同志的凝聚力和向心力。

在生成代码使用两个:一个是用于子程序调用和中断操作的硬件,一个是用于以结构传递的参数临时变量和局部变量的软件堆栈。硬件堆栈是从数据内存的顶部开始分配的,在硬件堆栈下面再分配一定数量的字节作为软件堆栈。硬件堆栈和软件堆栈均为向下生长型的堆栈(注意:这与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"); //软件堆栈溢出

}

51单片机相关文章:51单片机教程




评论


相关推荐

技术专区

关闭
桃花是指什么生肖 沛是什么意思 坐飞机需要什么证件 心愿是什么意思 后顶焦度是什么意思
命好的人都有什么特征 月经多是什么原因 舌头起泡吃什么药好 fs是什么单位 isis是什么组织
总出汗是什么原因 尿道下裂是什么意思 女人左手掌有痣代表什么 文殊菩萨是管什么的 刺猬的刺有什么作用
N1是什么 脚气真菌感染用什么药 日加军念什么 万丈深渊是什么意思 切忌是什么意思
煤气是什么气体hcv7jop6ns7r.cn 毛豆烧什么好吃hcv8jop2ns3r.cn 玉米有什么营养hcv9jop0ns9r.cn 湿气重吃什么药最有效hcv9jop2ns3r.cn 属猪的守护神是什么菩萨hcv9jop8ns1r.cn
芡实和什么搭配最好hcv8jop5ns7r.cn 婴儿的腿为什么是弯弯的hcv8jop1ns6r.cn 破溃是什么意思sanhestory.com 过年给老人买什么hcv8jop7ns7r.cn 口腔老是出血是什么原因hcv9jop6ns4r.cn
眼底出血吃什么药hcv8jop4ns1r.cn 口什么心什么hcv8jop1ns6r.cn 干眼症有什么症状hcv9jop6ns8r.cn 意有所指是什么意思hcv8jop6ns3r.cn 头皮痛是什么原因hcv9jop5ns4r.cn
属鸡的是什么命hcv8jop3ns5r.cn H 什么意思gysmod.com 刘姥姥和贾府什么关系hcv8jop8ns0r.cn 什么叫御姐hcv9jop7ns1r.cn 丙氨酸氨基转移酶是什么意思hcv8jop5ns5r.cn
百度