Я пытаюсь получить доступ к аппаратной сторожевой панели на процессоре Linux. Это то, чего я никогда не делал раньше, так что моих знаний очень мало. Ссылка для руководства пользователя RTD: http://www.rtd.com/NEW_manuals/hardware/cpumodules/CMV34M_BDM610000077A.pdf (см. Стр. 64 для информации сторожевого таймера) и мою небольшую примерную программу, которую я нашел в Интернете и отредактировал. Я включил регистрацию Watchdog Setup в BIOS и запустил подключенную программу. Программа запускается и не выводит никаких ошибок, но, похоже, ничего не делает, поскольку моя система не сбрасывается (как и должно быть, если вы не «пинаете собаку»), хотя я предоставляю сторожевому псору записи 1s. Надеюсь, кто-то может понять, что я делаю неправильно.Запись/доступ к устройству порта ввода-вывода watchdog register linux
#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);
}
Документ для 'ioperm' говорит: * Если turn_on отличен от нуля, вызывающий поток должен быть привилегированным (CAP_SYS_RAWIO). * Выполнено ли это условие? Кроме того, ваш вызов 'outb (1, BASEPORT)' просто устанавливает 'BASEPORT'' 0x01', а не «все высокие», как говорит ваш комментарий. Если вы хотите «все высоко», вам нужно «outb (0xFF, BASEPORT)». – lurker
Вы правы, мне нужно было использовать 0xFF, а не 1. Исправлена проблема. СПАСИБО!!! – user2494298
Прохладный. Я разместил его как «ответ». – lurker