Keil C51 中堆栈指针的问题
KeilC51单片机程序.因为我的程序中做了一些抗干扰措施,当程序非正常跳转,如受干扰跑飞了,我会让程序跳转到主程序起始处(堆栈指针在之前已经由编译器初始化),那跳转到这...
Keil C51 单片机程序.
因为 我的程序中做了一些抗干扰措施,当程序非正常跳转,如受干扰跑飞了,我会让程序跳转到主程序起始处(堆栈指针在之前已经由编译器初始化),那跳转到这里的时候,堆栈指针可能已经不一样了,我就想在这里加一条堆栈初始化指令,那么在这里 用什么语句怎么获得编译器生成的堆栈指针初始化值呢?
因为如果不这样,需要人工查看的话,很麻烦啊,再有就是增加了全局变量,堆栈指针初始化值也会变化的,一旦改程序但是忘记人工修改堆栈指针就会出问题啊.
To wuqing811 : 用看门狗了啊,但是有些情况下,程序会跑飞到一些关键程序处,比如 写EEPROM程序处,一旦错误写EEPROM将造成存储数据的丢失或者错误啊.
有些情况下,跑飞了,但是它后续还会执行喂狗程序,造成不复位啊.比如 主函数 循环依次调用 FuncA(), FuncB() FuncC() FeedWDG()[喂狗] 如果在执行FuncA()时跑飞到了FuncB()中呢?后续会照样喂狗啊!
To happycxz: 请教一下,看门狗复位 它会重新初始化堆栈指针吗? 展开
因为 我的程序中做了一些抗干扰措施,当程序非正常跳转,如受干扰跑飞了,我会让程序跳转到主程序起始处(堆栈指针在之前已经由编译器初始化),那跳转到这里的时候,堆栈指针可能已经不一样了,我就想在这里加一条堆栈初始化指令,那么在这里 用什么语句怎么获得编译器生成的堆栈指针初始化值呢?
因为如果不这样,需要人工查看的话,很麻烦啊,再有就是增加了全局变量,堆栈指针初始化值也会变化的,一旦改程序但是忘记人工修改堆栈指针就会出问题啊.
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编译器编译的调用结构,堆栈使用方式等等,
,???????看门狗复位 它会重新初始化堆栈指针
这个问题问得....艾.
上面都写着是复位了,,,就是代码从最开始的地方运行了.
堆栈肯定初始化掉了..
???比如 写EEPROM程序处,一旦错误写EEPROM将造成存储数据的丢失或者错误啊.
所以必须.有数据检验功能,,eeprom是不可靠的,
不跳飞都可能出错,不要说跳飞了.
???/FuncA(), FuncB() FuncC() FeedWDG()[喂狗] 如果在执行FuncA()时跑飞到了FuncB()中呢?后续会照样喂狗啊!
如果这种问题出现..就是funca没有正常退出,
跑到funcb里面也不会正常退出,,很可能的情况就是推出到非法地址.
这样,看门狗自然还会复位的..放心好了.
另为.给你个建议,,,都用了c写程序,,就不要过多的考虑堆栈什么的.
一般来说.这种系统都会给你自动搞定,,除非你想特殊应用,
自己手动操作堆栈...,虽然也可以.但是调试时候麻烦多多,非常容易出错,
要想这么做..必须充分了解C编译器编译的调用结构,堆栈使用方式等等,
展开全部
用看门狗吧。有些看门狗可以强行复位的。真的不行,可以在你需要的地方加上:
对看门狗进行极短时间的初始化,然后延时超过这个极短时间,这样系统也就复位了。
对看门狗进行极短时间的初始化,然后延时超过这个极短时间,这样系统也就复位了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我觉得你的方法有问题,防止程序跑飞,用watchdog就可以。
不然你不知道程序飞到哪了,你怎么让程序跳转到主程序呢?
不然你不知道程序飞到哪了,你怎么让程序跳转到主程序呢?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
程序异常,你直接将它关闭,重新运行不就可以了吗?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询