2

我正在尝试从 Linux 访问/写入 CPU 上的硬件看门狗。这是我以前从未做过的事情,所以我的知识很少。RTD 用户手册的链接是http://www.rtd.com/NEW_manuals/hardware/cpumodules/CMV34M_BDM610000077A.pdf(看门狗定时器信息见第 64 页)和我在互联网上找到并编辑的小示例程序。我在 BIOS 中启用了看门狗设置寄存器,并运行了附加的程序。程序运行并且不输出任何错误,但似乎实际上并没有做任何事情,因为我的系统没有重置(如果你不“踢狗”,它应该这样做),即使我通过编写启用看门狗1秒。希望也许有人会对我做错了什么有所了解。

#include <stdio.h>
#include <unistd.h>
#include <sys/io.h>
#include <stdlib.h>

#define BASEPORT 0x985

int main()
{
  /* Get access to the ports */
  if (ioperm(BASEPORT, 3, 1)) {perror("ioperm"); exit(1);}

  /* Set the data signals (D0-7) of the port to all high (1) */
  outb(1, BASEPORT);

  /* Sleep for a while (100 ms) */
  usleep(100000);

  /* Read from the status port (BASE+1) and display the result */
  printf("status: %d\n", inb(BASEPORT + 1));

  /* We don't need the ports anymore */
  if (ioperm(BASEPORT, 3, 0)) {perror("ioperm"); exit(1);}

  exit(0);
}
4

3 回答 3

2

在您的命令之前尝试iopl(3) 。并不是一个真正的“好”和可移植的命令,但我成功地将它用于类似的看门狗问题。outb()iopl()

于 2014-01-05T21:55:58.863 回答
1

如果您正在考虑使用watchdog timer,您可能希望通过显示界面的正常方式来执行此操作,然后使用支持多个系统范围测试以及简单地让狗喂食的 。writing a driver for that bit of hardware/dev/watchdogwatchdog daemon

可以在此处找到现有看门狗驱动程序代码的示例:

http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/drivers/watchdog/

关于看门狗守护进程的操作信息(以及我自己的实验版本)可以在这里找到:

http://www.sat.dundee.ac.uk/~psc/watchdog/Linux-Watchdog.html

于 2013-09-19T15:33:09.813 回答
1

文档ioperm说,如果turn_on非零,则调用线程必须是特权 ( CAP_SYS_RAWIO)。您需要确保满足此条件。此外,您的电话outb(1, BASEPORT)只是设置BASEPORT0x01,而不是您的评论所说的“全部高”。如果你想要“全高”,你需要outb(0xFF, BASEPORT).

于 2013-09-04T18:27:00.907 回答