Watchdog使用实例

本例程提供Watchdog的完整使用流程。

在本例程中,我们打开一个看门狗设备,设置超时时间并启动计时:

1)首先定期喂狗,即按时清除看门狗定时器,确保系统不会因定时器超时而复位;

2)接着再停止喂狗,观察定时器到期后系统是否发生复位行为

示例如下:


1. #include "watchdog_if.h"
2. #include "hdf_log.h"
3. #include "osal_irq.h"
4. #include "osal_time.h"

6. #define WATCHDOG_TEST_TIMEOUT     2
7. #define WATCHDOG_TEST_FEED_TIME   6

9. static int32_t TestCaseWatchdog(void)
10. {
11. int32_t i;
12. int32_t ret;
13. uint32_t timeout;
14. struct DevHandle *handle = NULL;

16. /* 打开0号Watchdog设备 */
17. handle = WatchdogOpen(0);
18. if (handle == NULL) {
19. HDF_LOGE("Open Watchdog fail!");
20. return -1;
21. }

23. /* 设置超时时间 */
24. ret = WatchdogSetTimeout(handle, WATCHDOG_TEST_TIMEOUT);
25. if (ret != HDF_SUCCESS) {
26. HDF_LOGE("%s: set timeout fail! ret:%d\n", __func__, ret);
27. WatchdogClose(handle);
28. return ret;
29. }

31. /* 回读设置的timeout值 */
32. ret = WatchdogGetTimeout(handle, &timeout);
33. if (ret != HDF_SUCCESS) {
34. HDF_LOGE("%s: get timeout fail! ret:%d\n", __func__, ret);
35. WatchdogClose(handle);
36. return ret;
37. }
38. HDF_LOGI("%s: read timeout back:%u\n", __func__, timeout);

40. /* 启动看门狗,开始计时 */
41. ret = WatchdogStart(handle);
42. if (ret != HDF_SUCCESS) {
43. HDF_LOGE("%s: satrt fail! ret:%d\n", __func__, ret);
44. WatchdogClose(handle);
45. return ret;
46. }

48. /* 每隔1S喂狗一次 */
49. for (i = 0; i < WATCHDOG_TEST_FEED_TIME; i++) {
50. HDF_LOGE("%s: feeding watchdog %d times... \n", __func__, i);
51. ret = WatchdogFeed(handle);
52. if (ret != HDF_SUCCESS) {
53. HDF_LOGE("%s: feed dog fail! ret:%d\n", __func__, ret);
54. WatchdogClose(handle);
55. return ret;
56. }
57. OsalSleep(1);
58. }
59. /* 由于喂狗间隔小于超时时间,系统不会发生复位,此日志可以正常打印 */
60. HDF_LOGE("%s: no reset ... feeding test OK!!!\n", __func__);

62. /* 接下来持续不喂狗,使得看门狗计时器超时 */
63. for (i = 0; i < WATCHDOG_TEST_FEED_TIME; i++) {
64. HDF_LOGE("%s: watiting dog buck %d times... \n", __func__, i);
65. OsalSleep(1);
66. }

68. /* 当不喂狗时间到达之前设定的超时时间的时候,系统会发生复位,理论上观察不到此日志的打印 */
69. HDF_LOGE("%s: dog has't buck!!! \n", __func__, i);
70. WatchdogClose(handle);
71. return -1;
72. }