wdt_sample.c 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2023-3-27 wcx1024979076 first version.
  9. */
  10. /*
  11. * 程序清单:这是一个独立看门狗设备使用例程
  12. * 例程导出了 wdt_sample 命令到控制终端
  13. * 命令调用格式:wdt_sample wdt
  14. * 命令解释:命令第二个参数是要使用的看门狗设备名称,为空则使用例程默认的看门狗设备。
  15. * 程序功能:程序通过设备名称查找看门狗设备,然后初始化设备并设置看门狗设备溢出时间。
  16. * 然后设置空闲线程回调函数,在回调函数里会喂狗。
  17. */
  18. #include <rtthread.h>
  19. #include <rtdevice.h>
  20. #ifdef RT_USING_WDT
  21. #define WDT_DEVICE_NAME "wdt" /* 看门狗设备名称 */
  22. static rt_device_t wdg_dev; /* 看门狗设备句柄 */
  23. static void idle_hook(void)
  24. {
  25. /* 在空闲线程的回调函数里喂狗 */
  26. rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
  27. rt_kprintf("feed the dog!\n ");
  28. }
  29. static int wdt_sample(int argc, char *argv[])
  30. {
  31. rt_err_t ret = RT_EOK;
  32. rt_uint32_t timeout = 1; /* 溢出时间,单位:秒 */
  33. char device_name[RT_NAME_MAX];
  34. /* 判断命令行参数是否给定了设备名称 */
  35. if (argc == 2)
  36. {
  37. rt_strncpy(device_name, argv[1], RT_NAME_MAX);
  38. }
  39. else
  40. {
  41. rt_strncpy(device_name, WDT_DEVICE_NAME, RT_NAME_MAX);
  42. }
  43. /* 根据设备名称查找看门狗设备,获取设备句柄 */
  44. wdg_dev = rt_device_find(device_name);
  45. if (!wdg_dev)
  46. {
  47. rt_kprintf("find %s failed!\n", device_name);
  48. return -RT_ERROR;
  49. }
  50. /* 初始化设备 */
  51. rt_device_init(wdg_dev);
  52. /* 设置看门狗溢出时间 */
  53. ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
  54. if (ret != RT_EOK)
  55. {
  56. rt_kprintf("set %s timeout failed!\n", device_name);
  57. return -RT_ERROR;
  58. }
  59. /* 启动看门狗 */
  60. ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
  61. if (ret != RT_EOK)
  62. {
  63. rt_kprintf("start %s failed!\n", device_name);
  64. return -RT_ERROR;
  65. }
  66. /* 设置空闲线程回调函数 */
  67. rt_thread_idle_sethook(idle_hook);
  68. return ret;
  69. }
  70. /* 导出到 msh 命令列表中 */
  71. MSH_CMD_EXPORT(wdt_sample, wdt sample);
  72. #endif /* RT_USING_WDT */