시스템이 어떻게 작동합니까? 나는 항상 소프트웨어와 하드웨어 워치 독 (watchdogs)의 조합을 사용한다. 설명해 드리죠 ...
필자의 예제에서는 선점 형 실시간 커널로 작업하고 있고 CPU/마이크로 컨트롤러에서 워치 독 지원을한다고 가정합니다. 이 워치 독은 일정 시간 동안 걷지 않으면 리셋을 수행합니다.
1) 주기적 시스템 타이머 ("RTOS clock")가 실행 중입니다 (그렇지 않은 경우 "sleep"과 같은 기능이 더 이상 작동하지 않고 시스템을 사용할 수 없음).
2) 모든 스레드는 적당한 시간 동안 실행할 수 있습니다.
내 RTOS (www.lieron.be/micror2k)는 RTOS 클럭 인터럽트 처리기에서 코드를 실행할 수있는 가능성을 제공합니다. 이것은 하드웨어 워치 독을 새로 고치는 유일한 장소이므로 시계가 항상 실행되고 있는지 확인합니다 (워치 독이 시스템을 재설정하지 않는 경우).
(항상 최저 우선 순위로 실행되는) 유휴 스레드에서 "소프트웨어 워치 독"이 새로 고쳐집니다. 이것은 단순히 변수를 특정 값 (예 : 1000)으로 설정하는 것입니다. RTOS 클럭 인터럽트 (하드웨어 워치 독을 걷어차는 곳)에서이 값을 감소시키고 확인합니다. 0에 도달하면 유휴 스레드가 1000 clock tick 동안 실행되지 않았고 시스템을 재부팅합니다 (하드웨어 워치 독 재부팅을 위해 인터럽트 핸들러 내부를 무한 루프로 반복하여 수행 할 수 있음).
이제 원래의 질문입니다. 시스템 시계가 계속 실행되는 것으로 가정하므로 시스템을 재설정하는 소프트웨어 워치 독이됩니다. RTOS 클럭 인터럽트 처리기에서 소프트웨어 워치 독 상황이 발생할 경우에 대비하여 "통계 수집"을 수행 할 수 있습니다. 시스템을 재설정하는 대신 문제가 발생한 후 각 클록 틱에서 실행중인 스레드를 확인하고 진행 상황을 파악할 수 있습니다. 이상적이지는 않지만 도움이 될 것입니다.
또 다른 옵션은 서로 다른 우선 순위의 여러 소프트웨어 감시기를 추가하는 것입니다. 유휴 스레드가 VariableA를 1000으로 설정하고 중간 우선 순위 스레드가 변수 B를 설정하도록하십시오. RTOS 클럭 인터럽트 처리기에서 두 변수를 모두 확인합니다. 이 정보를 사용하면 루핑 스레드의 우선 순위가 "중간"또는 "중간"보다 높은지 여부를 알 수 있습니다. 원하는 경우 3 번째 또는 4 번째 또는 원하는 소프트웨어 워치 독을 몇 개 추가 할 수 있습니다. 최악의 경우, 사용되는 각 우선 순위에 대해 소프트웨어 워치 독을 추가하십시오 (추가 스레드가 필요함).
출처
2009-06-09 11:14:47
Ron
문제는 B가 A보다 우선 순위가 높다는 것입니다. B는 잠겨 있지만 A는 워치 독을 걷어 내지 않습니다. A는 B의 유치장에 대한 비난을받습니다. – Robert