Watchdog使用实例

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

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

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

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

示例如下:

  1. #include "watchdog_if.h"
  2. #include "hdf_log.h"
  3. #include "osal_irq.h"
  4. #include "osal_time.h"
  5. #define WATCHDOG_TEST_TIMEOUT 2
  6. #define WATCHDOG_TEST_FEED_TIME 6
  7. static int32_t TestCaseWatchdog(void)
  8. {
  9. int32_t i;
  10. int32_t ret;
  11. uint32_t timeout;
  12. struct DevHandle *handle = NULL;
  13. /* 打开0号Watchdog设备 */
  14. handle = WatchdogOpen(0);
  15. if (handle == NULL) {
  16. HDF_LOGE("Open Watchdog fail!");
  17. return -1;
  18. }
  19. /* 设置超时时间 */
  20. ret = WatchdogSetTimeout(handle, WATCHDOG_TEST_TIMEOUT);
  21. if (ret != HDF_SUCCESS) {
  22. HDF_LOGE("%s: set timeout fail! ret:%d\n", __func__, ret);
  23. WatchdogClose(handle);
  24. return ret;
  25. }
  26. /* 回读设置的timeout值 */
  27. ret = WatchdogGetTimeout(handle, &timeout);
  28. if (ret != HDF_SUCCESS) {
  29. HDF_LOGE("%s: get timeout fail! ret:%d\n", __func__, ret);
  30. WatchdogClose(handle);
  31. return ret;
  32. }
  33. HDF_LOGI("%s: read timeout back:%u\n", __func__, timeout);
  34. /* 启动看门狗,开始计时 */
  35. ret = WatchdogStart(handle);
  36. if (ret != HDF_SUCCESS) {
  37. HDF_LOGE("%s: satrt fail! ret:%d\n", __func__, ret);
  38. WatchdogClose(handle);
  39. return ret;
  40. }
  41. /* 每隔1S喂狗一次 */
  42. for (i = 0; i < WATCHDOG_TEST_FEED_TIME; i++) {
  43. HDF_LOGE("%s: feeding watchdog %d times... \n", __func__, i);
  44. ret = WatchdogFeed(handle);
  45. if (ret != HDF_SUCCESS) {
  46. HDF_LOGE("%s: feed dog fail! ret:%d\n", __func__, ret);
  47. WatchdogClose(handle);
  48. return ret;
  49. }
  50. OsalSleep(1);
  51. }
  52. /* 由于喂狗间隔小于超时时间,系统不会发生复位,此日志可以正常打印 */
  53. HDF_LOGE("%s: no reset ... feeding test OK!!!\n", __func__);
  54. /* 接下来持续不喂狗,使得看门狗计时器超时 */
  55. for (i = 0; i < WATCHDOG_TEST_FEED_TIME; i++) {
  56. HDF_LOGE("%s: watiting dog buck %d times... \n", __func__, i);
  57. OsalSleep(1);
  58. }
  59. /* 当不喂狗时间到达之前设定的超时时间的时候,系统会发生复位,理论上观察不到此日志的打印 */
  60. HDF_LOGE("%s: dog has't buck!!! \n", __func__, i);
  61. WatchdogClose(handle);
  62. return -1;
  63. }