【问题标题】:How to change the watchdog timer in linux embedded如何在嵌入式linux中更改看门狗定时器
【发布时间】:2014-06-25 07:39:24
【问题描述】:

我必须使用 linux 看门狗驱动程序 (/dev/watchdog)。效果很好,我写一个这样的角色:

 echo 1 > /dev/watchdog

看门狗启动,大约 1 分钟后,系统重新启动。

问题是,如何更改超时?我必须在驱动程序中更改时间间隔?

【问题讨论】:

  • 大部分看门狗驱动都将超时间隔作为module_params。在插入看门狗驱动程序时更改它,或者您可以使用 ioclts(如果已实现)来更改超时值。为此,您需要编写一个简单的 c 程序。
  • 具体答案,请提供您的看门狗驱动程序的名称。检查它在lsmod
  • 感谢您的回答!不幸的是,当我输入 lsmod 它什么也没显示
  • 尝试查看内部/sys/devices/platform。对于 tegra 看门狗设备,我得到 /sys/devices/platform/tegra_wdt/ 目录。您可以从中识别映射到该设备的驱动程序。

标签: linux arm embedded-linux watchdog


【解决方案1】:

请阅读Linux documentation。从用户空间更改超时的标准方法是使用ioctl()

int timeout = 45;                        /* a time in seconds */
int fd;
fd = open("/dev/watchdog");
ioctl(fd, WDIOC_SETTIMEOUT, &timeout);   /* Send time request to the driver. */

每个看门狗设备可能具有硬件支持的上限(也可能是下限),因此您不能将超时设置任意高。所以设置了超时之后,再回读超时就好了。

ioctl(fd, WDIOC_GETTIMEOUT, &timeout);   /* Update timeout with driver value. */

现在,重读超时可以用作踢频。

assert(timeout > 2);
while (1) {
  ioctl(fd, WDIOC_KEEPALIVE, 0);
  sleep(timeout-2);
}

您可以在脚本/shell 命令中编写自己的踢球程序,

    while [ 1 ] ; do sleep 1; echo V > /dev/watchdog; done

但是,通常使用userspace watchdog 程序。这应该照顾所有深奥的特征。您可以将用户空间程序nice 设置为最低优先级,然后如果用户空间被挂起,系统将重置。 BusyBox 包含一个看门狗小程序。

每个看门狗驱动程序都有separate module parameters,并且大多数都包含设置超时的机制;使用内核命令行或模块参数设置机制。但是,如果您不了解看门狗硬件,则基础结构 ioctl 超时更便于移植。 ioctl 可能更适合未来,因为您的硬件可能会发生变化。

示例用户空间代码包含在Linux samples directory 中。

【讨论】:

  • 部分看门狗设备不支持修改超时时间。在这些情况下,内核将尝试通过启动定时器中断来扩展它。但是这种情况有点不同,因为 ISR 锁定的阈值比进程小。重点是,超时是一个重载的概念。通常不同的子系统有不同的延迟要求。更高优先级的soft modem任务阻塞2s可以吗? GUI任务阻塞2s可以吗?低优先级磁盘碎片整理可以阻塞2s吗?
  • 我使用了 WDIOC_SETTIMEOUT 标志,但是。我无法设置看门狗的超时时间。 ioctl(fd,WDIOC_SETTIMEOUT,&timeout) 的输出非零。所以默认设置了 10 秒的超时时间。
  • 很有可能。正如我所说,某些硬件不支持更改超时。有时,引导加载程序可能已经激活了看门狗,并且无法取消激活或更改超时;但这是特定于硬件的。你有 Linux 版本并且知道看门狗设备的名称吗?您可以通过更新驱动程序以使用工作队列等来延长超时,这将比固定频率快一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多