dongdaxing 发表于 2020-3-1 17:02:28

单片机FLASH空白区如何处理防止程序跑飞

各位大侠
        今天遇到一个问题,以前从来没想过,就是在使用单片机(MC9S08)的时候,如果程序指针由于故障跑到了FLASH的空白区,

一般空白区默认是0xff,这个时候程序故障,我认为看门狗就会动作重启单片机。
       
        但是请问有没有办法可以对空白区进行处理,而不需要看门狗就能回到正常工作状态,或者重启状态。
        或者请问大家一般是怎么处理这个问题的。
        谢谢

        (我所知道的就是我可以通过程序对flash的空白区直接写一写值进去,比如00或者其他值. 但是不知道MC9S08这个系列遇到这些值会怎么响应。)

dongdaxing 发表于 2020-3-1 17:12:10

这个是我刚才在网上找到的51的说明

不要用跳转指令填充空白区,因为跳转指令不是单字节指令,意外跑飞时,没法保证取指时取到哪个字节,会有什么效果。
通常51程序的空白部分保留为00就行,或者FF也行,00中NOP指令,FF是 MOV A, R7,注意,这两个指令都是单字节单周期的指令。
遇到程序跑飞的情况时,CPU可能会从空白区取指,取到NOP并执行,因为51的指令最多只有64K,顶多执行64K个周期,PC就会转回到复位地址0000处执行。

请问MC9S08是怎么运行的 ,有大侠知道吗?

vtte 发表于 2020-3-1 17:29:07

写满reset指令啊

dongdaxing 发表于 2020-3-1 17:33:03

vtte 发表于 2020-3-1 17:29
写满reset指令啊

有道理
正在找相应资料

wye11083 发表于 2020-3-1 17:38:53

dongdaxing 发表于 2020-3-1 17:12
这个是我刚才在网上找到的51的说明

不要用跳转指令填充空白区,因为跳转指令不是单字节指令,意外跑飞时 ...

万一某些地址没有外设给响应就完蛋了。。会彻底卡住。我做fpga soc就出现过多次这种情况。固件代码得非常仔细的写。

laujc 发表于 2020-3-1 17:39:36

写reset指令,其实芯片遇见处理不了的指令,都是会产生中断的

dongdaxing 发表于 2020-3-1 17:42:00

dongdaxing 发表于 2020-3-1 17:33
有道理
正在找相应资料

刚看了指令集和指令马集

填充 NOP 就可以了
0x9d

谢谢
解决了

dongdaxing 发表于 2020-3-1 17:44:28

vtte 发表于 2020-3-1 17:29
写满reset指令啊

rest 可能不行 应为没有单字节的这个指令 也许我没有找到
因为多字节指令的的话 第一次不知道跳到哪里(网上讲的我觉得是有道理的)
所以我觉得就填写NOP吧

dongdaxing 发表于 2020-3-1 17:45:39

laujc 发表于 2020-3-1 17:39
写reset指令,其实芯片遇见处理不了的指令,都是会产生中断的

请问 一般单片机的话 会产生什么中断
能介绍点资料看看吗
自己以前从来没注意过这方面的问题
可能做得太少了

相由心生 发表于 2020-3-1 18:06:14

楼主想多了,你应该考虑如果不跑到空白区去。而不是跑到空白区再跳回来。
正如前面是硫酸池,进去如何救生,还不如考虑下怎么会跳进去,绝对避免。

takashiki 发表于 2020-3-1 18:28:14

dongdaxing 发表于 2020-3-1 17:42
刚看了指令集和指令马集

填充 NOP 就可以了


呵呵,依赖填充NOP具有巨大的隐患,此时中断还开着,NOP跑一圈重新开始后内存初始化完成后中断来了改了内存数据咋办?
你首先要想的是如何防止进入到空白区而不是去补救

laujc 发表于 2020-3-1 18:44:09

dongdaxing 发表于 2020-3-1 17:45
请问 一般单片机的话 会产生什么中断
能介绍点资料看看吗
自己以前从来没注意过这方面的问题


不知道你使用的是哪种芯片,按道理处理方式应该是一样的。
以我比较熟悉的renesas芯片为例,见下表,指令错误是有专门中断入口的。

夏日么么茶 发表于 2020-3-1 18:55:16

楼主你搞错了,不应该用NOP指令。我也比较熟悉瑞萨的芯片,下面说下我的经验:
1.空白区域写满非法指令,比如瑞萨的非法指令是0xff,当然空白也是0xff,刚好运行到空白区域会引起非法指令的复位。
2.开启低电压检测,电压再复位电平附近波动的时候最容易跑飞。开启低电压检测,电压波动到一定值就复位。
3.处理号reset电路。
4.电源,掉电是减少振荡。瑞萨的功耗比较低,有大电容时掉电非常慢,一定要设计好电路。
以上2,3,4都是碰到过实际问题的。程序跑飞严重的可能会擦掉内部Flash,内部有操作Flash的程序时。

dongdaxing 发表于 2020-3-1 19:19:13

takashiki 发表于 2020-3-1 18:28
呵呵,依赖填充NOP具有巨大的隐患,此时中断还开着,NOP跑一圈重新开始后内存初始化完成后中断来了改了内 ...

谢谢

我现在要解决的问题: 前提就是假设程序到了空白区 如何自救

dongdaxing 发表于 2020-3-1 19:20:46

夏日么么茶 发表于 2020-3-1 18:55
楼主你搞错了,不应该用NOP指令。我也比较熟悉瑞萨的芯片,下面说下我的经验:
1.空白区域写满非法指令,比 ...

谢谢 我去找下资料 看看 MC9S08 有没有非法指令复位这个功能
如果您知道的话 能够告知哪里可以找到相关资料 谢谢

dongdaxing 发表于 2020-3-1 19:22:05

takashiki 发表于 2020-3-1 18:28
呵呵,依赖填充NOP具有巨大的隐患,此时中断还开着,NOP跑一圈重新开始后内存初始化完成后中断来了改了内 ...

谢谢

你说的是对的 ,避免进入是一方面

但是我现在需要解决的问题是 进入空白区后怎么办

夏日么么茶 发表于 2020-3-1 19:22:12

dongdaxing 发表于 2020-3-1 19:20
谢谢 我去找下资料 看看 MC9S08 有没有非法指令复位这个功能
如果您知道的话 能够告知哪里可以找到相关资 ...

看芯片的软件手册或者叫指令手册。

hongguan 发表于 2020-3-1 19:38:39

总感觉外置看门狗才比较可靠.
页: [1]
查看完整版本: 单片机FLASH空白区如何处理防止程序跑飞