AVR单片机的堆栈指针SP初值是啥
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AVR单片机的堆栈指针SP初值是啥相关的知识,希望对你有一定的参考价值。
看你用的晶片的SRAM的大小了,以M16晶片1KB的SRAM为例最大初值就是$045F,最小好像是$0060。系统复位后,SP初值为07H,实际应用中通常根据需要在主程序开始处对堆栈指针SP进行初始化,一般设置SP为60H. 参考技术A 系统复位后,SP初值为07H,实际应用中通常根据需要在主程序开始处对堆栈指针SP进行初始化,一般设置SP为60H. 参考技术B 看你用的晶片的SRAM的大小了,以M16晶片1KB的SRAM为例最大初值就是$045F,最小好像是$0060。 参考技术C 那要看你的堆栈是向上开口的堆还是向下开口的堆栈。 参考技术D 看你放进堆栈多少程序了,每用一次SP-1追问
那上电时,初值是什么
追答不是很明白,上电是硬件上电,SP是堆栈指针,没有关系吧,上电只能说是,单片机开始工作,看程序怎么写,它怎么运行,程序一开始执行,向堆栈里放多少东西,它就有多少空间被分配,初始时地址为07h,加上程序放进去的大小,就是它的最终地址
本回答被提问者采纳Keil C51 中堆栈指针的问题
Keil C51 单片机程序.
因为 我的程序中做了一些抗干扰措施,当程序非正常跳转,如受干扰跑飞了,我会让程序跳转到主程序起始处(堆栈指针在之前已经由编译器初始化),那跳转到这里的时候,堆栈指针可能已经不一样了,我就想在这里加一条堆栈初始化指令,那么在这里 用什么语句怎么获得编译器生成的堆栈指针初始化值呢?
因为如果不这样,需要人工查看的话,很麻烦啊,再有就是增加了全局变量,堆栈指针初始化值也会变化的,一旦改程序但是忘记人工修改堆栈指针就会出问题啊.
To wuqing811 : 用看门狗了啊,但是有些情况下,程序会跑飞到一些关键程序处,比如 写EEPROM程序处,一旦错误写EEPROM将造成存储数据的丢失或者错误啊.
有些情况下,跑飞了,但是它后续还会执行喂狗程序,造成不复位啊.比如 主函数 循环依次调用 FuncA(), FuncB() FuncC() FeedWDG()[喂狗] 如果在执行FuncA()时跑飞到了FuncB()中呢?后续会照样喂狗啊!
To happycxz: 请教一下,看门狗复位 它会重新初始化堆栈指针吗?
,???????看门狗复位 它会重新初始化堆栈指针
这个问题问得....艾.
上面都写着是复位了,,,就是代码从最开始的地方运行了.
堆栈肯定初始化掉了..
???比如 写EEPROM程序处,一旦错误写EEPROM将造成存储数据的丢失或者错误啊.
所以必须.有数据检验功能,,eeprom是不可靠的,
不跳飞都可能出错,不要说跳飞了.
???/FuncA(), FuncB() FuncC() FeedWDG()[喂狗] 如果在执行FuncA()时跑飞到了FuncB()中呢?后续会照样喂狗啊!
如果这种问题出现..就是funca没有正常退出,
跑到funcb里面也不会正常退出,,很可能的情况就是推出到非法地址.
这样,看门狗自然还会复位的..放心好了.
另为.给你个建议,,,都用了c写程序,,就不要过多的考虑堆栈什么的.
一般来说.这种系统都会给你自动搞定,,除非你想特殊应用,
自己手动操作堆栈...,虽然也可以.但是调试时候麻烦多多,非常容易出错,
要想这么做..必须充分了解C编译器编译的调用结构,堆栈使用方式等等, 参考技术A 用看门狗吧。有些看门狗可以强行复位的。真的不行,可以在你需要的地方加上:
对看门狗进行极短时间的初始化,然后延时超过这个极短时间,这样系统也就复位了。 参考技术B 我觉得你的方法有问题,防止程序跑飞,用watchdog就可以。
不然你不知道程序飞到哪了,你怎么让程序跳转到主程序呢? 参考技术C 程序异常,你直接将它关闭,重新运行不就可以了吗?
以上是关于AVR单片机的堆栈指针SP初值是啥的主要内容,如果未能解决你的问题,请参考以下文章