Felven在职场|Zynq-Linux移植学习笔记之44-linux下watchdog示例

1、背景介绍 Zynq在运行过程中,当出现了内核异常导致内核崩溃时,将导致整个系统瘫痪。为了解决这个问题,有两种思路,一是从源头杜绝任何可能导致内核异常的场景,二是当出现内核异常后能快速恢复。很显然,在现实应用中第二种思路更符合实际,系统不怕死机,就怕死机了无法恢复,在调试ast2500的过程中也发现其使用了内核异常恢复机制,在查阅资料后发现,zynq中也具备类似的异常恢复功能-watchdog。
UG585中对watchdog的描述如下:
Felven在职场|Zynq-Linux移植学习笔记之44-linux下watchdog示例
文章图片


当watchdog只涉及到arm程序执行时,只需要修改ps部分,pl端无需配置,无需修改fpga。

2、内核设置 为了启用watchdog,需要在内核中增加watchdog选项

Felven在职场|Zynq-Linux移植学习笔记之44-linux下watchdog示例
文章图片



3、devicetree设置 Devicetree中需要设置watchdog节点,注意要增加圈出来的这句,表明watchdog超时后需要对系统进行复位
Felven在职场|Zynq-Linux移植学习笔记之44-linux下watchdog示例
文章图片


Watchdog复位是对整个zynq芯片进行复位,
Felven在职场|Zynq-Linux移植学习笔记之44-linux下watchdog示例
文章图片


完整的复位关系如下图:

Felven在职场|Zynq-Linux移植学习笔记之44-linux下watchdog示例
文章图片


4、应用设置 在应用中需要启动一个线程或进程定时去刷新watchdog,示例如下:

void watchdog_thread_fun(void) { while(1) { system("echo s > /dev/watchdog"); sleep(3); } } void watchdog_thread(void) { pthread_t pid1; pthread_attr_t attr1; struct sched_param param1; pthread_attr_init(&attr1); pthread_attr_setschedpolicy(&attr1, SCHED_RR); param1.sched_priority = 40; pthread_attr_setschedparam(&attr1, ¶m1); if(pthread_create(&pid1,&attr1,watchdog_thread_fun,0)!=0) { printf("create watchdog_thread failed.\n"); }else { printf("create watchdog_thread successful.\n"); } } int main() { watchdog_thread(); ........ ........ return 0; }



当然也可以在系统中使用脚本执行
#!/bin/sh # # Start watchdog #case "$1" in start) echo "Starting watchdog..." watchdog -t 15 /dev/watchdog ; ; stop) ; ; restart|reload) ; ; *) echo "Usage: $0 {start|stop|restart}" exit 1 esacexit $?


5、一点补充 Watchdog能够对zynq进行复位,但有时候需要复位的不仅仅是zynq,譬如一些外围电路器件1848,5396这些,这就需要通过板上的CPLD进行电源复位了。此时需要PS,PL和CPLD协同工作。可以采用在应用中定时往某个GPIO写值,PL部分将值给CPLD送,并清值,CPLD收到值后判读,当10s内未收到正确的值就对整板进行电源复位。
【Felven在职场|Zynq-Linux移植学习笔记之44-linux下watchdog示例】

    推荐阅读