모든 트랩을 항상 정의해야합니까?


18

정의되지 않은 트랩으로 인해 컨트롤러가 재설정되는 dsPIC 30F4013의 두 가지 사례를 보았습니다. 왜 이런 함정들이 처음에 생겨 났는가는 여전히 미스터리이지만, 그것은 나의 즉각적인 질문이 아닙니다. 트랩이 발생하지 않아야 할지라도 항상 모든 트랩을 정의 하는 것이 좋은 프로그래밍 관행이라고 생각하기 시작했습니다 . 따라서 무작위 재설정 대신 적어도 명확한 오류 메시지가 나타납니다. 이것이 내가 모르는 표준 관행입니까? 이 연습에 고려해야 할 단점이 있습니까?


4
귀하의 질문에 대한 답변은 아니지만 얼마 전에 dsPIC 및 PIC24 시스템에서 이러한 종류의 증상으로 어려움을 겪었습니다. 필자의 경우 트랩은 16 비트 값에 대한 포인터를 역 참조하는 코드 비트에서 비롯 되었으며이 포인터는 원형 통신 버퍼를 가리 키기 때문에 홀수 (짝수) 값을 가졌으며 이전에는 없었습니다. 16 비트 값이 홀수 또는 짝수 경계에서 시작하는지 알 수 있습니다. XC16 컴파일러는 여기서 하드웨어의 끊김으로부터 사용자를 보호하지 않습니다. 나는이 기능을 위해 래퍼 매크로를 작성하여 2 8 비트 포인터 디 레프를 강제했습니다.
brhans

답변:


13

비공식 규칙은 다음과 같습니다.

  1. 인터럽트가 활성화 된 경우이를 처리하는 코드가 있어야합니다.
  2. 인터럽트 코드를 작성하지 않으면 비활성화하십시오.
  3. 비활성화 할 수 없으면 코드를 작성하십시오.

그러나 그 규칙이 없어도 데이터 시트는 귀하의 질문에 명시 적으로 답변합니다.

트랩 오류 조건이 발생하는 경우 사용자가 수정 조치를 취하지 않으려면 이러한 벡터에 RESET 명령이 포함 된 기본 핸들러의 주소가로드되어야합니다. 반면에 유효하지 않은 주소를 포함하는 벡터 중 하나가 호출되면 주소 오류 트랩이 생성됩니다.

( 출처 , 섹션 8.3, 첫 번째 참고)

트랩을 마스킹 할 수 없으면 처리 해야 합니다. 특정 방식으로 트랩을 처리하지 않으려는 경우 적절한 방법은 RESET명령 을 실행하는 것 입니다.


예. 모든 트랩을 대상으로하는 표준 모듈이 있습니다.
Olin Lathrop

16

예, 좋은 생각입니다. 유일한 단점은 약간의 추가 코드 크기이며, 트랩으로 수행 할 작업을 결정해야합니다 (직렬 포트에서 메시지를 내보내거나 "FAILED"표시등을 켜거나 자동으로 다시 부팅 하시겠습니까? 등). )


4
나는 보통 프로세서를 무한 NOP / GOTO 루프에서 실행합니다. 그렇게하면 스택에서 스택이 손상되지 않았으며 디버깅 할 때 스택을 풀고 무슨 일이 있었는지 알아낼 수 있습니다. 나는 종종 함정을 얻지 못하지만 80 %의 시간은 이상한 주소 함정입니다. 일반적으로 쓰레기가 포인터로로드되기 때문입니다. 때때로 스택 포인터가 손상되어 홀수 주소 트랩이 생성됩니다. 스택이 더 이상 없기 때문에 디버깅하기가 더 어렵습니다. 다행히도, 그것은 매우 드 rare니다.
Olin Lathrop
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.