Zynq-Linux移植学习笔记之44-linux下watchdog示例

1、背景介绍

Zynq在运行过程中,当出现了内核异常导致内核崩溃时,将导致整个系统瘫痪。为了解决这个问题,有两种思路,一是从源头杜绝任何可能导致内核异常的场景,二是当出现内核异常后能快速恢复。很显然,在现实应用中第二种思路更符合实际,系统不怕死机,就怕死机了无法恢复,在调试ast2500的过程中也发现其使用了内核异常恢复机制,在查阅资料后发现,zynq中也具备类似的异常恢复功能-watchdog。

UG585中对watchdog的描述如下:

Zynq-Linux移植学习笔记之44-linux下watchdog示例_第1张图片

 

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

 

2、内核设置

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

 

Zynq-Linux移植学习笔记之44-linux下watchdog示例_第2张图片

 

 

3、devicetree设置

Devicetree中需要设置watchdog节点,注意要增加圈出来的这句,表明watchdog超时后需要对系统进行复位

Zynq-Linux移植学习笔记之44-linux下watchdog示例_第3张图片

 

Watchdog复位是对整个zynq芯片进行复位,

Zynq-Linux移植学习笔记之44-linux下watchdog示例_第4张图片

 

完整的复位关系如下图:

 

Zynq-Linux移植学习笔记之44-linux下watchdog示例_第5张图片

 

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
esac

exit $?

 

5、一点补充

Watchdog能够对zynq进行复位,但有时候需要复位的不仅仅是zynq,譬如一些外围电路器件1848,5396这些,这就需要通过板上的CPLD进行电源复位了。此时需要PS,PL和CPLD协同工作。可以采用在应用中定时往某个GPIO写值,PL部分将值给CPLD送,并清值,CPLD收到值后判读,当10s内未收到正确的值就对整板进行电源复位。

 

你可能感兴趣的:(Felven在职场,zynq,watchdog,复位)