最近想测试看门狗的效果,想问问,怎么样子可以让程序跑飞?

http://bbs.eeworld.com.cn/thread-365328-1-1.html


先要注意,喂狗动作一定不能在中断或异常服务程序中进行,最好在是main主线程中一处(无操作系统),或一个低优先级的任务中(带操作系统)。

否者看门狗效果基本无效。

方法如下:
1. 代码模拟方式 :在某个函数内部执行while(1);不喂狗,可以认为程序跑飞,看是否一会就硬复位了。
2. 野指针方式 :初始化指针变量,给一个不能访问的地址,如存储器空间中没有实际外设或存储器的地址,需要查找手册,比较容易找到。然后读写这个地址。一般会出现数据总线错误而进入异常,程序
跑飞。
3. 指针越界方式 :野指针的变化版,但更容易理解和出现。 在编写代码时,采用数组。读写数组数据时,有意让数组越界,也会导致同样的错误。这个很多童鞋都遇到过的,强力推荐

另外,不保证法2和法3的实际效果和理论效果一致。就看导致相应的异常服务程序是否会导致复位,一般不随便改写异常服务代码,它们都是默认做死循环的。跑到这里,程序就可以说是跑飞了。

程序跑飞,还有很多其他的原因和现象,无法全部列举和测试。但导致的结果都是一样的,所以解决的方法也基本都一样。
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是基于DSP28335的看门狗程序: ```c #include "F2837xD_Device.h" // 定义看门狗喂狗间,单位为微秒 #define WDT_FEED_TIME 1000000 void InitWatchdog(void) { // 先禁止看门狗 DisableDog(); // 配置看门狗喂狗间,这里配置为 1 秒 EALLOW; WdRegs.WDCR.all = 0x28; WdRegs.WDKEY.all = 0x55; WdRegs.WDKEY.all = 0xAA; EDIS; // 使能看门狗 EnableDog(); } void FeedWatchdog(void) { // 喂狗 EALLOW; WdRegs.WDKEY.all = 0x55; WdRegs.WDKEY.all = 0xAA; EDIS; } void main(void) { // 初始化看门狗 InitWatchdog(); while (1) { // 喂狗 FeedWatchdog(); // 这里写程序的主要逻辑 // 如果程序看门狗会在 WDT_FEED_TIME 后复位系统 // 所以需要在程序中定喂狗,保证看门狗不会复位系统 DELAY_US(WDT_FEED_TIME); } } ``` 上述程序中,我们使用了 DSP28335 的看门狗模块,通过配置看门狗的喂狗间来实现看门狗的功能。具体来说,程序中的 `InitWatchdog` 函数用来初始化看门狗,包括禁止看门狗、配置喂狗间和使能看门狗;`FeedWatchdog` 函数用来喂狗;`main` 函数中,我们在程序的主逻辑中加入了定喂狗的代码,保证看门狗不会复位系统。如果程序看门狗会在 `WDT_FEED_TIME` 后复位系统。 至于配置看门狗的喂狗间,我们可以通过修改 `WdRegs.WDCR.all` 的值来实现。该寄存器的位定义如下: | 位 | 描述 | | ------ | ----------------------------------- | | 0-12 | 看门狗喂狗间,单位为钟周期 | | 13 | 禁止看门狗复位 | | 14 | 看门狗复位系统是否清除 RAM | | 15 | 看门狗复位系统是否清除 Watchdog | | 16-31 | 保留 | 其中,位 0-12 用来配置看门狗喂狗间,单位为钟周期。钟周期可以通过 `SysCtrlRegs.LOSPCP.all` 的值来计算,具体公式为: $$\text{钟周期}=\frac{1}{\text{LSPCLK}}=\frac{1}{\text{SYSCLK}/(\text{LOSCLKDIV}+1)}$$ 其中,`SYSCLK` 为系统钟频率,`LOSCLKDIV` 为 LSPCLK 的分频系数,默认为 2。例如,如果 `SYSCLK` 为 150 MHz,`LOSCLKDIV` 为 2,则钟周期为 13.33 ns。因此,如果要设置喂狗间为 1 秒,需要将 `WdRegs.WDCR.all` 的值设置为 75000000(即 1 秒 / 13.33 ns)。 至于程序的复位间,则由看门狗喂狗间和程序中喂狗的间共同决定。例如,在上述程序中,如果看门狗喂狗间为 1 秒,程序中每隔 1 秒喂狗一次,那么如果程序看门狗就会在 1 秒后复位系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值