내 프로그램에서 하드웨어 감시견에게 하트 비트를 보낼 수 있습니까?


14

Steve Robillard가 제공 한 질문과 훌륭한 답변에 따르면 다음과 같습니다.

Raspberry Pi를 하드 리셋하려면 어떻게해야합니까?

Linux 워치 독 데몬 대신 내 프로그램에서 BCM2708의 하드웨어 워치 독으로 하트 비트 신호를 보내려면 어떻게해야합니까? 즉, 전체 시스템이 정지되었을 때뿐만 아니라 내 프로그램이 실행 중이 아닌 경우 (시작시 실행) RPi를 재설정하고 싶습니다.

감사.


답변:


7

당신은 할 수 있고 아주 쉽습니다. RPi에는 표준 Linux 워치 독 API를 구현하는 Linux 모듈이 있습니다. 이 문서는 여기에서 찾을 수 있습니다 .

당신이 읽는다면 이제, 당신이라는 특별한 장치 파일이 있음을 알 수 /dev/watchdog사용하기 위해 그리고 watchdog이 파일을 열고 (한 바이트 일부 데이터를 작성해야합니다, 그것은 쓰기 'V'가 아닌 다른 I '에 최선 m 나중에 설명). 이 파일에 오랫동안 아무 것도 쓰지 않으면 watchdog재부팅이 트리거됩니다. 여기 에서 예제 프로그램 (매우 간단)을 찾을 수 있습니다 .

정상적인 상황에서, 당신은 닫으면 것을 참고 /dev/watchdog, watchdog비활성화 할 수 있습니다. RPi 드라이버에 의해 구현 된 것으로 보이는 '매직 닫기 기능'이라는 특수 모드가 있지만 AFAIK는 기본 커널 구성에서 활성화되지 않습니다 (CONFIG_WATCHDOG_NOWAYOUT 옵션). 이 경우 /dev/watchdog앱을 종료하기 직전에 'V'를 쓰지 않으면 닫아도 재부팅이 트리거 됩니다.

실제로 비활성화되어 있는지 테스트해야합니다 (지금 테스트 할 RPi가 없습니다). 그렇지 않으면 좋지 않습니다. 응용 프로그램이 충돌하면 감시 장치 파일이 닫히고 재부팅이 트리거되지 않으므로 원하는 것입니다. 이 상황에서 커널 구성을 변경하고 다시 구성하거나 주 응용 프로그램이 작동하는지 모니터링 할 사용자 지정 응용 프로그램을 작성할 수 있습니다 (예 : 일부 IPC 방법 사용).

또한 ioctl API를 통해 더 많은 작업을 수행 할 수 있습니다 watchdog. 예를 들어 WDIOC_SETTIMEOUT을 사용하는 IOCTL (RPI 드라이버가 지원하는 것으로 간주)을 다른 시간 초과로 설정하거나 WDIOC_GETTIMEOUT을 사용하여 IOCTL (시간이 초과 된 IOCTL)도 설정할 수 있습니다. 기본 시간 초과 (10 초)를 수정하는 데 사용할 수 있습니다. 그러나 16 초로 제한이 있습니다. 예를 들면 다음과 같습니다.

int timeout = 15;
int fd = open("/dev/watchdog", O_WRONLY);
ioctl(fd, WDIOC_SETTIMEOUT, &timeout);

원하는 경우 문자를 작성하는 대신 WDIOC_KEEPALIVE와 함께 IOCTL을 사용할 수도 있습니다. 두 방법 모두 유효합니다.


아, 그리고 잊어 버렸습니다. 실제로 watchdogd를 사용할 수 있습니다. 시스템 상태를 확인하고보고하는 외부 프로그램 호출을 지원합니다. 에서 "진 검사"읽기 이 사람 페이지
르지 아담 스키

감사. 나는 그것을 작동시켰다! bcm2708_wdog을 / etc / modules에 추가 한 후 간단한 VB.NET 테스트 앱을 만들어 이해를 확인했습니다. Dim fs As New System.IO.FileStream (fn, IO.FileMode.Open) 타이머 실행을 시작하고 fs.WriteByte ( H) 그런 다음 fs.Flush ()를 사용하여 하트 비트를 보냅니다. 잘 작동합니다!
Guy

WDIOC_KEEPALIVE의 숫자 표현은 무엇입니까? 어디서나 찾을 수 없습니다.
Flash Thunder

@FlashThunder : 여기에 정의되어 있습니다 : lxr.free-electrons.com/source/include/uapi/linux/watchdog.h#L29 정확한 값을 찾으려면 몇 단계의 매크로를 해결해야합니다. 더 좋은 방법은 간단한 C 프로그램을 작성하여 값을 인쇄하는 것입니다. <linux / watchdog.h> 만 포함하십시오. 내 시스템에서는0x80045705
Krzysztof Adamski
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.