我正在尝试从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);
}
答案 0 :(得分:2)
在iopl
命令之前尝试使用outb()
(3)。 iopl()
并不是一个“好”的便携式命令,但是我成功地将它用于类似的看门狗问题。
答案 1 :(得分:1)
ioperm
的文档说明,如果turn_on
非零,则调用线程必须具有特权(CAP_SYS_RAWIO
)。您需要确保满足此条件。另外,您的来电outb(1, BASEPORT)
只会将BASEPORT
设置为0x01
,而不会像您的评论所说的那样将“全部设置为高”。如果您想要“全高”,则需要outb(0xFF, BASEPORT)
。
答案 2 :(得分:1)
如果您考虑使用watchdog timer
,可能需要writing a driver for that bit of hardware
显示/dev/watchdog
界面的普通方式,然后使用watchdog daemon
支持几个系统范围的测试,以及简单地保持狗喂养。
现有看门狗驱动程序代码的示例可在此处找到:
http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/drivers/watchdog/
有关看门狗守护程序操作(以及我自己的实验版本)的信息可以在这里找到:
http://www.sat.dundee.ac.uk/~psc/watchdog/Linux-Watchdog.html