單片機(jī)看門狗的作用
看門狗的作用是系統(tǒng)CPU正常工作時定時給看門狗喂狗,復(fù)位定時器,如果系統(tǒng)出問題,沒有給看門狗喂狗,看門狗就由于超時將CPU復(fù)位。
系統(tǒng)用初始化后注冊看門狗中斷request_irq(WDT0_ACCSCSSNBARK_INT, wdog_bark_handler, 0, "apps_wdog_bark", NULL);
和初始化看門狗的超時時間bark time,
__raw_writel(timeout, msm_tmr0_base + WDT0_BARK_TIME);
__raw_writel(timeout + 3*WDT_HZ, msm_tmr0_base + WDT0_BITE_TIME);
復(fù)位看門狗,使能看門狗和中斷極性。
__raw_writel(1, msm_tmr0_base + WDT0_EN);
__raw_writel(1, msm_tmr0_base + WDT0_RST);
enable_percpu_irq(WDT0_ACCSCSSNBARK_INT, IRQ_TYPE_EDGE_RISING);
并且初始化和啟動一個定時器,比如10秒一次,
schedule_delayed_work_on(0, &dogwork_struct, delay_time);
static DECLARE_DELAYED_WORK(dogwork_struct, pet_watchdog_work);
static DECLARE_WORK(init_dogwork_struct, init_watchdog_work);
static struct msm_watchdog_pdata msm_watchdog_pdata = {
.pet_time = 10000,
.bark_time = 11000,
.has_secure = true,
.needs_expired_enable = true,
};
delay_time = msecs_to_jiffies(pdata->pet_time);
schedule_work_on(0, &init_dogwork_struct);
定時器定時時間到了對定時器復(fù)位pet dog 和重新啟動定時器。
static void pet_watchdog_work(struct work_struct *work)
{
pet_watchdog();
if (enable)
schedule_delayed_work_on(0, &dogwork_struct, delay_time);
}
如果系統(tǒng)出問題了,沒有辦法執(zhí)行定時器的回到函數(shù),那么看門狗就產(chǎn)生中斷,執(zhí)行中斷服務(wù)程序static irqreturn_t wdog_bark_handler(int irq, void *dev_id),
執(zhí)行panic。 panic("Apps watchdog bark received!");
編輯:admin 最后修改時間:2018-05-18