先貼**
//看門狗實體地址
#define watchdog_base 0x01c20000 //基位址
#define block_size 0x1000 //4k大小
#define rwdog0_irq_en 0xca0
#define rwdog0_irq_sta 0xca4
#define rwdog0_ctrl 0xcb0
#define rwdog0_cfg 0xcb4
#define rwdog0_mode 0xcb8
/***@brief 看門狗和time定時
*/void *wdog_timer(void *b)
/* mmap wdog0 */
wdog_map = (unsigned char *)mmap(null, block_size, prot_read|prot_write, map_shared, mem_fd, watchdog_base);
close(mem_fd);
if (wdog_map == map_failed)
// always use volatile pointer!
wdog0_irq_en = (volatile unsigned int *)(wdog_map + rwdog0_irq_en);
wdog0_irq_sta = (volatile unsigned int *)(wdog_map + rwdog0_irq_sta);
wdog0_ctrl = (volatile unsigned int *)(wdog_map + rwdog0_ctrl);
wdog0_cfg = (volatile unsigned int *)(wdog_map + rwdog0_cfg);
wdog0_mode = (volatile unsigned int *)(wdog_map + rwdog0_mode);
*(volatile unsigned int *)wdog0_irq_en = 0x01;
*(volatile unsigned int *)wdog0_cfg = 0x01;
*(volatile unsigned int *)wdog0_mode = 0x30; //看門狗3秒
*(volatile unsigned int *)wdog0_mode |= 0x01;
while(1)
*(volatile unsigned int *)wdog0_ctrl |= ((0xa57 << 1) | (0x01 << 0)); //餵狗}}
mmap系統呼叫的過程:
void *addr;
addr = mmap(0,0x1000, prot_read|prot_write,
map_shared, fd, 0);
引數1:如果是0,核心幫找一塊記憶體區域,起始位址是返回值addr
引數2:虛擬記憶體的大小,0x1000一頁(如果申請的記憶體空間沒有對齊,核心會幫我們對齊,會經過一次if/else判斷,浪費開銷)
引數3:許可權
引數4:許可權
引數5:fd,將該檔案對映到該區域
引數6:對映的偏移量
通過資料手冊我查到看門狗的基位址0x01c20c00,但是我們通過mmap函式傳參的位址只能傳頁(4k)的整數倍,所以我傳的位址是0x01c20000,然後這個函式給我們返回了乙個指標,通過操作這個指標,加上實際實體地址的偏移量,我們就能操作暫存器了,比如我的暫存器rwdog0_irq_en的偏移量是0xa0,但是我傳參時少傳了乙個0xc00,所以偏移量加上這個即可,就成了0xca0,以此類推
LINUX系統看門狗
arm linux開發 warewin 2g 3g無線傳輸 dtu 和路由器 筆記 看門狗定時器 wdt watch dog timer 它實際上是乙個 計數器,一般給看門狗乙個大數,程式 開始執行後看門狗開始倒計數。如果程式 執行正常,過一段時間cpu 應發出指令讓看門狗 復位,重新開始倒計數。如...
Linux 軟體看門狗 watchdog
linux 自帶了乙個 watchdog 的實現,用於監視系統的執行,包括乙個核心 watchdog module 和乙個使用者空間的 watchdog 程式。核心 watchdog 模組通過 dev watchdog 這個字元裝置與使用者空間通訊。使用者空間程式一旦開啟 dev watchdog ...
Linux 軟體看門狗 watchdog 餵狗
linux 自帶了乙個 watchdog 的實現,用於監視系統的執行,包括乙個核心 watchdog module 和乙個使用者空間的 watchdog程式。核心 watchdog 模組通過 dev watchdog 這個字元裝置與使用者空間通訊。使用者空間程式一旦開啟 dev watchdog 裝...