1、背景介绍 Zynq在运行过程中,当出现了内核异常导致内核崩溃时,将导致整个系统瘫痪。为了解决这个问题,有两种思路,一是从源头杜绝任何可能导致内核异常的场景,二是当出现内核异常后能快速恢复。很显然,在现实应用中第二种思路更符合实际,系统不怕死机,就怕死机了无法恢复,在调试ast2500的过程中也发现其使用了内核异常恢复机制,在查阅资料后发现,zynq中也具备类似的异常恢复功能-watchdog。
UG585中对watchdog的描述如下:
文章图片
当watchdog只涉及到arm程序执行时,只需要修改ps部分,pl端无需配置,无需修改fpga。
2、内核设置 为了启用watchdog,需要在内核中增加watchdog选项
文章图片
3、devicetree设置 Devicetree中需要设置watchdog节点,注意要增加圈出来的这句,表明watchdog超时后需要对系统进行复位
文章图片
Watchdog复位是对整个zynq芯片进行复位,
文章图片
完整的复位关系如下图:
文章图片
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示例】