打印

警惕看门狗-C8051F350过度使用Xdata导致程序运行异常

[复制链接]
3011|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
霜之哀息|  楼主 | 2018-5-2 21:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     问题场景:使用查表法线性拟合计算温度(热敏电阻)
     出现情况:程序不运行,无法仿真
     一开始初步怀疑是自己的数组定义过程中出现问题,屏蔽放在xdata的数组,程序正常运行。
     然后留下一个放在xdata的数组,程序正常运行。(大写的黑人问号?)
     暂时找不出原因,只能去百度,看到有人提到了可能是看门狗的问题导致的无限复位。
     转头去看了一下手册,里面有这样一句话
     “WDT 在任何一次系统复位之后都被设置为使能状态。PCA0 计数器的缺省时钟为系统时钟的十二分频(SYSCLK/12)。PCA0L 和 PCA0CPL2 的缺省值均为0x00,因此 WDT 的超时间隔为 256 个系统时钟。表 23.3 列出了对应某些典型系统时钟频率的超时间隔。”
     “系统时钟(Hz )  PCA0CPL2   超时间隔(ms ) 24,500,000   255   32.1”这也就是说,如果初始化时间过长,超过看门狗的上电默认复位时间,会导致程序无法进入main函数,我在main函数中关闭看门狗的指令自然失效,程序不停的被狗复位。
     我用了个很蠢的方法,只定义了数组,不赋值初始化,然后使用一个函数进行赋值,程序正常运行。

     /*   ...........省略一部分  */
     uint xdata RT_table[13];
     void RT_GET_VALUE()
     {
        RT_table[0]=0x8354;
        RT_table[1]=............
     }

相关帖子

沙发
linqing171| | 2018-5-2 21:30 | 只看该作者

Keil\C51\LIB\INIT.A51
这个文件复制到你项目目录,加入到工程,然后
把里面的 WATCHDOG  这个宏 的内容,加入一行 MOV  0xED,A
然后世界就清净了。

使用特权

评论回复
板凳
airwill| | 2018-5-2 22:28 | 只看该作者
嗯, 看到这里, 我们不得不需要考虑看门狗的初始化问题
虽然很多时候为了避免这个问题, 会把看门狗的使能放在初始化的最后面. 但缺陷也是明显的
此外, 还有关不了看门狗的初始化过程.
这个看门狗还是值得大家注意一下

使用特权

评论回复
地板
ayb_ice| | 2018-5-3 08:25 | 只看该作者
这个正常,初始化时间长了,狗溢出了,在启动文件里关狗就可以了

使用特权

评论回复
5
gx_huang| | 2018-5-3 09:25 | 只看该作者
这只能说明这个MCU的WDT设计的不合理,复位后256个系统周期就复位,哪能这么设计的,光清零内存就不止这些时间了。

使用特权

评论回复
6
ningling_21| | 2018-5-3 09:30 | 只看该作者
设计有些不太合理

使用特权

评论回复
7
lyjian| | 2018-5-3 12:42 | 只看该作者
gx_huang 发表于 2018-5-3 09:25
这只能说明这个MCU的WDT设计的不合理,复位后256个系统周期就复位,哪能这么设计的,光清零内存就不止这些 ...

复位默认的复位时间32MS
清个内存用不到这么久吧

使用特权

评论回复
8
gx_huang| | 2018-5-3 12:50 | 只看该作者
lyjian 发表于 2018-5-3 12:42
复位默认的复位时间32MS
清个内存用不到这么久吧

没仔细看,LZ说只有256系统时钟。
32ms,应该足够了,有些大的MCU,难说。
一般默认WDT比较长时间才好。

使用特权

评论回复
9
lyjian| | 2018-5-3 18:26 | 只看该作者
gx_huang 发表于 2018-5-3 12:50
没仔细看,LZ说只有256系统时钟。
32ms,应该足够了,有些大的MCU,难说。
一般默认WDT比较长时间才好。 ...

看错。
复位复位默认的WDT超时时间是256ms。
WDT超时周期是256*256*12

使用特权

评论回复
10
linqing171| | 2018-5-3 21:06 | 只看该作者
lyjian 发表于 2018-5-3 18:26
看错。
复位复位默认的WDT超时时间是256ms。
WDT超时周期是256*256*12

24M的晶振,12分频后是2M的计数时钟。
256*256的溢出是6W多(做MCU的都熟悉那个数),6W/2M 大约30ms;

他家的硬件设计上看门狗默认开启是有原因的。
不过从startup.s 里面直接关闭了也问题不大。在某些特殊应用情况下还是建议全程开狗。

使用特权

评论回复
11
lyjian| | 2018-5-4 12:41 | 只看该作者
linqing171 发表于 2018-5-3 21:06
24M的晶振,12分频后是2M的计数时钟。
256*256的溢出是6W多(做MCU的都熟悉那个数),6W/2M 大约30ms;

F350复位后跑的是内部振荡器,系统时钟是24.5MHz/8

使用特权

评论回复
12
linqing171| | 2018-5-5 15:29 | 只看该作者
lyjian 发表于 2018-5-4 12:41
F350复位后跑的是内部振荡器,系统时钟是24.5MHz/8

你说的是对的。
keil的c运行库的init.a51里面提供了这个初始化全局变量的时候的喂狗的接口。只需要在那个宏里面填上代码即可。

使用特权

评论回复
13
Bikini| | 2018-8-13 16:30 | 只看该作者
麻烦问一下楼主,我定义了long类型和float类型在idata里,定义不会死机,只要初始化就会死机,根本进不去main函数,把long和float换成int就没问题,这也是看门狗的问题吗

使用特权

评论回复
14
linqing171| | 2018-8-13 22:43 | 只看该作者
Bikini 发表于 2018-8-13 16:30
麻烦问一下楼主,我定义了long类型和float类型在idata里,定义不会死机,只要初始化就会死机,根本进不去ma ...

像是。
你看一下 复位源寄存器里的值是多少。

使用特权

评论回复
15
Bikini| | 2018-8-16 10:55 | 只看该作者
linqing171 发表于 2018-8-13 22:43
像是。
你看一下 复位源寄存器里的值是多少。

是的,我关掉看门狗就好了,根本不给我机会看复位源,仿真都会被看门狗拉回来,停也停不下来,退出仿真也退不了,只能结束进程。
不过谢谢啦,看来这芯片启动不了基本上都是看门狗的锅

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

110

帖子

1

粉丝