Keil C51 中堆栈指针的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 程序异常,你直接将它关闭,重新运行不就可以了吗?
关于Keil C关键字xdata和data的问题
1.xdata表示这是一个外部RAM地址内的数据,数据最终将被保存至外部RAM的某个地址单元中;
但是,外部RAM只能通过寄存器间接寻址来访问,也就是说,其地址需要保存在内部RAM中(其实或许是SFR中,8位地址一般是R0、R1,16位地址一般通过DPTR间址)
这里,DPTR里保存的内容就相当于指向外部RAM单元的指针了…… 所以,用了内部数据类型(data)的指针,和外部数据类型(xdata)
2. 这里变量pAddress应该是指针型变量,所以给pAddress赋值应是外部地址, *pAddress才是在外部RAM地址的内容,因此它的数据类型是xdata(换句话说,pAddress是指针,*pAddress是指针指向的数据)
以上是关于Keil C51 中堆栈指针的问题的主要内容,如果未能解决你的问题,请参考以下文章