1
概述
系统看门狗定时器(System WatchDog Timer)通常用于嵌入式系统,可以有效的防止软件错误、系统死锁、篡改以及意外行为,帮助维护健康和安全的系统。
在 AMD Versal™ 自适应 SoC 中,分别在 FPD(Full power domain)和 LPD(Low power domain)中各自集成了一个 SWDT 用来帮助客户开发稳定的系统。其整体结构框图如下:
从框图中可以看到 SWDT 中包含有 2 种不同的定时器,分别是窗口模式的定时器(Windowed WatchDog Timer)和通用模式的定时器(Generic WatchDog Timer)。
注意在使用 SWDT 之前,需要确认 LPD 和 FPD 的系统级别的复位是否已经释放,例如 CRL.RST_LPD_SWDT 寄存器和 CRF.RST_FPD_SWDT 寄存器。
2
通用模式定时器
通用模式定时器一共包含三个相关寄存器,分别是 G_Refresh,G_Offset 和 G_CSR 寄存器。
G_CSR 寄存器用来使能通用定时器模式,以及反馈状态。
G_Offset 寄存器用来配置定时的周期时间。
G_Refresh 寄存器用来刷新定时器,即喂狗。
工作模式如下图所示:
通用模式工作时最多会有两个定时周期,当计数器计时达到第一个定时周期后,定时器会产生一个定时中断。然后计数器会继续计时,当计数器计时到达第二个定时周期后,定时器会产生一个超时中断。在定时器的计数器到达第二个定时周期之前,软件程序都可以通过 G_Refresh 寄存器刷新计数器计数值,从头开始计时。
可以看到通用模式使用起来非常简单。但是有一点需要注意,通用模式的定时器在超时发生之后,并不会输出系统级错误到 PSM 的错误堆栈中,即不会产生系统错误,从而使得 PSM 或者 PLM 程序固件执行相应的系统层面的操作。
3
窗口模式定时器
窗口模式定时器功能较为全面,功能充分考虑了系统安全的各种应用场景。
窗口模式基本流程如上图所示,一共可以分成三个部分,分别是第一窗口(First Window),第二窗口(Second Window)和二次序列时间(Second Sequence Timer)。一共涉及到5个寄存器,分别是使能与状态寄存器(Enable_and_Status),功能控制寄存器(Funct_Ctrl),第一窗口时间寄存器(First_Wind),第二窗口时间寄存器(Second_Wind)和二次序列时间寄存器(SST_COUNT)。
第一窗口时间是一个封闭的时间段,在这个时间段内应用程序是不能对看门狗进行刷新和复位操作。如果这个时间段内对看门狗进行了刷新喂狗或是复位看门狗操作,那么就会产生一个错误事件,从而输出一个系统错误到 PSM 和 PMC。这样设计是考虑到用户既然配置看门狗,那么就一定是要让看门狗起到作用,所以设置了一个保护看门狗的时间,用来防范系统的异常操作。
当第一窗口保护期到了之后,看门狗会产生一个中断通知系统。这个中断的产生时间可以通过配置功能控制寄存器(Funct_Ctrl)中的 BSS 和 SBC 位设定。应用程序可以在接收到中断后刷新看门狗,或者复位/停止/重新配置看门狗。
如果应用程序在第二窗口没有对看门狗有任何处理,计时器超过了用户设定的第二窗口时间,这个时候会产生超时中断。如果在看门狗运行之前使能了二次序列时间,那么看门狗此时不会立刻产生系统错误,而是等到二次序列时间计时结束之后再产生。这样应用程序就可以有时间去记录一些状态,日志或是处理某些外设等操作,便于后续排查问题或是增加系统的安全性。但是要是没有配置这个二次序列时间,那么看门狗在第二窗口时间超时之后会立刻产生错误事件,并发送系统错误到 PSM 和 PMC。
以上就是看门狗窗口模式下最基础的功能。总的来说,应用程序只有在看门狗处于第二窗口时间段内,才能对看门狗进行刷新喂狗,复位/停止/重新配置操作,否则就会产生错误事件,并发送系统错误到 PSM 和 PMC。另外,需要注意以下两点:
第一个窗口的时间可以设置为 0,从而跳过保护周期。
在看门狗运行的任意窗口期间,如果通过 LPD 和 FPD 的系统级别的复位对整个看门狗进行复位,不会产生额外中断以及系统错误。
为了进一步提高看门狗的安全性,窗口模式下还提供了两种防止系统异常操作的进阶功能。它们是签名方式(PSM)和问答方式(Q&A),如下图红框标注的功能。
1. 签名方式(PSM)
在启动看门狗计时之前,用户需要先在 Task_Sig0 寄存器中保存一个签名。然后应用程序在第二窗口刷新看门狗之前,先要对 Task_Sig1 寄存器写入和 Task_Sig0 一样的签名。当看门狗被正常刷新之后,会先去比较这两个签名是否一致,如果不一致就会立刻产生一个错误事件,并产生系统错误输出 PSM 和 PMC。
2. 问答方式(Q&A)
在运行看门狗之前,用户需要先在 Token_fb 寄存器中设定种子(seed)和反馈(FeedBack)值,这两个值和使能与状态寄存器(Enable_and_Status)中 ACNT 位会被用来计算写入 Token_Resp 寄存器的值。算法如下表所示。Token 对应种子值,Count 对应 ACNT 值,Feedback Value 对应反馈值。
举个例子,如果反馈(Feedback)的值是 3,那么应答(response)的每一位的计算方法就需要参考上面列表中的最后一列"11"来进行。那么 bit0 的值就是将 ACNT 的 bit1 值,异或种子(seed) bit 2 的值,再异或种子(seed)的 bit 3 的值。当应答 8 个位的值都计算好之后,写入 Token_resp 寄存器中即完成了一次问答。
当用户配置好看门狗功能设置,各个窗口时间以及问答种子和反馈值后,需要通过执行第一次应答(response)以后,看门狗才会开始启动计时。并且在第一窗口时间内,用户需要完成第二次和第三次应答,间隔的时间可以由用户自行来控制。当这两次应答完成后,即使第一窗口时间没有计完,也会立即进入第二窗口进行计时。接着,用户需要在第二窗口时间内完成第四次应答。一旦第四次应答在第二窗口完成,即使第二窗口时间没有计完,也会立即返回到第一窗口,重新开始计时。但是,如果在第二窗口内没有完成第四次应答,那么同样会回到第一窗口重新计时,不过接下来的应答还是需要按照第四次应答去完成。
在这个复杂的过程中,可以允许有限次数的应答失败,失败次数保存在使能与状态寄存器(Enable_and_Status)的失败计数位中(Fail count)。也就是说每当失败一次,失败计数就会增加 1,每应答成功一次失败计数就会减 1。当失败次数累计到 7 次以后,那么再出现失败,就会产生一个错误事件,并发送系统错误输出到 PSM 和 PMC。
4
总结
Vesal 器件中的看门狗模块提供了丰富的功能,从应用简易程度和安全性方面层层递进,让用户根据不同的应用场景来实现对自己系统的保护。
AMD 自适应 SOC 及 FPGA 中文技术支持社区