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. }
