마이크로 컨트롤러가 예기치 않게 재설정되는 원인은 무엇입니까?


26

마이크로 프로세서 제어 시스템에서 특히 자극적 인 다양한 버그 중 하나는 마이크로 프로세서가 예기치 않게 재설정되는 것입니다. 이러한 종류의 문제를 디버깅하기위한 중요한 도구는 가능한 원인 목록입니다. 마이크로 컨트롤러가 예기치 않게 재설정되는 원인은 무엇입니까?


1
여기에 대한 답변 중 일부가 도움이 될 수 있습니다. electronics.stackexchange.com/questions/30430/… 어떤 종류의 마이크로 컨트롤러를 사용하고 있습니까?
Jon L

나는 일반적으로 dsPIC을 사용합니다. 그러나 현재 잠재적 인 문제의 참조 목록을 컴파일하여 특정 항목을 디버깅하려고하지 않습니다.
Stephen Collings

2
이것은 숙제 질문입니까?
old_timer

1
@dwelch 어딘가 다른 사람에게는 가능하지만 나나 내 학생에게는 해당되지 않습니다.
Stephen Collings

1
@Vorac은 Atmel이 URL을 안정적으로 유지할 수 없다는 것을 반드시 읽어야합니다.
Kaz

답변:


51

PIC 및 dsPIC 칩에서 예기치 않은 재설정이 발생하는 원인은 다음과 같습니다.

하드웨어:

  • 리셋 핀 구동 로우 또는 플로팅. 명백한 것을 먼저 확인하십시오!
  • 리셋 핀에 ESD 커플 링. 나는 완전히 관련이없는 장비가 같은 책상에서 켜질 때 이런 일이 발생하는 것을 보았습니다. 리셋 핀에 충분한 용량이 있는지 확인하십시오 (최대 1uF).
  • 프로세서의 다른 핀에 ESD 결합. 스코프 프로브는 특히 안테나 역할을하며 잡음을 칩에 결합하고 홀수 리셋을 유발할 수 있습니다. "유효하지 않은 opcode"재설정 코드에 대한보고를 들었습니다.
  • 솔더 조인트 / 간헐 브리지가 잘못되었습니다. 프로세서 또는 보드의 다른 곳에서 전원 레일이 손실되거나 단락 될 수 있습니다.
  • 파워 레일 글리치 / 소음. 손상된 레귤레이터 또는 업스트림 공급 장치의 급강하를 포함하여 여러 외부 문제로 인해 발생할 수 있습니다. 프로세서에 공급되는 전원 레일이 안정적인지 확인하십시오. 어딘가에 더 많은 캡이 필요할 수 있습니다. 아마도 프로세서에서 캡을 직접 분리 할 수 ​​있습니다.
  • 일부 마이크로 컨트롤러에는 Vcap 핀이 있으며 Vcap 핀은 VDD에 연결해서는 안되며 공통 커패시터가 있어야합니다. 이 핀을 올바르게 연결하지 않으면 예기치 않은 결과가 발생할 수 있습니다.
  • 아날로그 입력 음수를 일정 한도를 초과하면 RCON으로보고되는 브라운 아웃과 같은 재설정이 발생합니다. 디지털 입력에서도 마찬가지입니다.
  • 근처의 전력 변환기에서 dV / dt가 매우 높으면 브라운 아웃 리셋이 발생할 수 있습니다. ( 이 질문을 참조하십시오 .) 나는 두 가지 경우에 이것을 보았고, 하나는 용량 성 결합으로 추적 할 수있었습니다. IGBT는 100-200 amp를 스위칭하고 있었고, 일부 피드백 회로는 3.3V 프로세서에서 2V에서 8V 이상으로 몇 마이크로 초의 잡음을보고있었습니다. 해당 피드백 레일에서 필터 캡을 늘리면 재설정이 중지되었습니다. 트랜지스터를 가로 질러 dV / dt 필터를 추가하면 비슷한 효과가있을 수 있습니다.

소프트웨어:

  • 워치 독 타이머. 특히 EEPROM 쓰기와 같이 실행하는 데 시간이 오래 걸릴 수있는 코드 분기에서 워치 독 타이머가 자주 지워지도록하십시오. 워치 독을 비활성화하여 문제가 해결되는지 확인하십시오.
  • 0으로 나눕니다. 당신이 수행하는 경우 어떤 코드에서 분할 동작을 확인 제수가 0이 될 수 없다합니다. 나누기 전에 바운드 검사를 추가하십시오. 이것은 모듈로 연산 에도 적용된다는 것을 잊지 마십시오 .
  • 스택 오버플로. 중첩 된 함수 호출이 너무 많으면 시스템에 스택의 동적 메모리가 부족하여 코드 실행시 비정상적인 지점에서 충돌이 발생할 수 있습니다.
  • 스택 언더 플로. 어셈블러에서 프로그래밍하는 경우 실수로 CALL을 실행 한 것보다 더 많은 RETURN을 실행할 수 있습니다.
  • 존재하지 않는 인터럽트 루틴. 인터럽트가 활성화되었지만 인터럽트 루틴이 정의되지 않은 경우 프로세서가 재설정 될 수 있습니다.
  • 존재하지 않는 트랩 루틴. 인터럽트 루틴과 비슷하지만 충분히 상이합니다. 무작위로 재설정되는 dsPIC 30F4013을 사용하는 두 개의 별도 프로젝트를 보았으며 원인은 호출되었지만 정의되지 않은 트랩으로 추적되었습니다. 물론, 이제 실리콘 오류를 포함하여 여러 가지 일 수있는 트랩이 처음에 호출되는 이유에 대한 질문이 있습니다. 그러나 모든 트랩 처리기를 정의하는 것은 설명 할 수없는 재설정을 진단하는 좋은 초기 단계 일 것입니다.
  • 함수 포인터 오류. 함수 포인터가 유효한 위치를 가리 키지 않으면 포인터를 역 참조하고 지정된 함수를 호출하면 재설정 될 수 있습니다. 이것의 재미있는 원인 중 하나는 NULL (함수 포인터) 및 -1 (int)의 연속 값으로 구조를 초기화 할 때였습니다. 쉼표가 잘못 입력되어 함수 포인터가 실제로 NULL-1로 초기화되었습니다. CONST이기 때문에 유효한 값을 포함해야한다고 가정하지 마십시오!
  • 유효하지 않은 음수 배열 색인. 적용 가능한 경우 상한 하한 모두의 모든 배열 인덱스에 대해 경계 검사를 수행해야합니다 .
  • 프로그램 메모리에서 프로그램 메모리의 가장 큰 섹션보다 큰 데이터 배열을 만듭니다. 컴파일 오류가 발생하지 않을 수도 있습니다.
  • 구조체의 주소를 다른 유형에 대한 포인터로 캐스트하고, 해당 포인터를 역 참조하고, 참조되지 않은 포인터를 명령문에서 LVALUE로 사용하면 충돌이 발생할 수 있습니다. 이 질문을 참조하십시오 . 아마도 이것은 정의되지 않은 다른 행동에도 적용됩니다.

일부 dsPIC에서 RCON 레지스터는 재설정 원인을 나타내는 비트를 저장합니다. 디버깅 할 때 매우 유용합니다.


1
@ 리셋 핀 : 플로팅 리셋 핀은 스퓨리어스 리셋으로 알려져 있습니다. 항상 저항을 통해 Vcc에 연결하십시오.
jippie

4
이것은 엄청나게 철저한 목록입니다. 나는 AVR에 대한 경험에서 대부분의 동일한 상황이 예기치 않은 결과 또는 재설정을 유발할 수 있다고 생각합니다.
HL-SDK

4
어셈블러 언어 프로그래밍을위한 또 하나를 추가해 보도록하겠습니다. 스택에서 PUSH와 POP가 일치하지 않는 레지스터입니다.
Michael Karas

2
몇 가지 더 : 하드웨어, 브라운 아웃 리셋. 소프트웨어에서 소프트웨어 재설정 명령. 둘 다 여러 마이크로 컨트롤러에서 사용할 수 있습니다.
tcrosley

2
또 다른 목록 : 케이블 근처에 휴대 전화를 놓으면 약하게 구동되는 회선에 놀라 울 정도로 많은 양의 전압이 유도 될 수 있습니다. 케이블을 통과하는 재설정 회선이있는 경우 (예 : 한 보드가 다른 보드를 강제로 재설정 할 수있는 경우) 케이블 근처의 휴대폰이 전화를받는 경우 재설정을 트리거 할 수 있습니다.
supercat

7

RESET 핀은 과전압 / 과소 전압을 모니터링하고 충분히 긴 리셋 신호를 생성하는 리셋 회로에 의해 올바르게 구동되어야합니다. 이를 염두에두고 제어되지 않은 하드웨어 재설정에 대한 나의 경험은 다음과 같습니다.

  • 스위칭 라인에서 RESET 핀 / 라인으로의 누화 (단축)
  • 외부 고전류 부하 켜기 / 끄기로 인한 접지 시프트 / 루프
  • 전원 공급 장치에서 전압 스파이크를 필터링하지 않고 적절한 RESET을 활성화하기에는 너무 짧습니다.
  • 마이크로 컨트롤러로 외부 부하 전환 위의 문제 발생 (주로 모터 온 / 오프, 릴레이 또는 오래된 램프와 같은 유도 성 부하 (돌입 전류))
  • 마이크로 컨트롤러 핀의 전압 / 전류 스파이크 (오실레이터가 최악 임)는 역전 류를 유발할 수 있으며 내부 레지스터 (공급 라인의 전압 스파이크와 동일)를 전환 할 수 있습니다. 일반적으로 일종의 산업 환경과 인터페이스 할 때는주의를 기울여야합니다 (자세한 내용은 http://www.ichaus.biz/wp1_mcu_interface 참조 ). IO의 레벨 시프 팅, 입력 필터링 및 소프트 스위칭 출력을 고려해야합니다. 공급 라인을 깨끗하게하는 것이 하드웨어 측면에서 최우선입니다. 그런 다음 RESET 및 발진기 핀, IO 라인. -mm

1
지면 이동은 저를 물었습니다. 필자의 경우, 일반적인 네트의 특정 부분에 ~ 100 amp를 전달했습니다. 마이크로 컨트롤러는 두꺼운 트레이스의 한쪽을 기준으로했지만 마이크로 컨트롤러가 구동하는 일부 회로는 다른 쪽 끝을 기준으로합니다. 트레이스는 3mOhm에 불과했지만 100Amp로 마이크로와 주변 ​​장치 사이에서 300mV의 차이를 얻을 수 있습니다. 컨트롤러와 같은 트레이스의 끝에 공통으로 주변 장치를 다시 라우팅했습니다. 이러한 전류에서 노드와 같은 것은 없습니다.
Stephen Collings

4

이 목록에서 보지 못한 또 다른 가능성은 ICSP를 지원하는 장치입니다. 회로 직렬 프로그래밍 모드에서 트리거되는 라인에 풀업이 충분하지 않은 경우 해당 모드로 임의로 들어갈 수있는 경우가 있습니다. 이로 인해 프로그램 업데이트가 지정된 직렬 수신기 라인으로 전송되지 않을 때 잠시 후에 재설정됩니다. ICSP가 시작되고 프로그래밍 데이터가 전송되지 않으면 내부 감시 타이머가 강제로 재설정되는 것 같습니다. 이것은 내가 저지른 실수이며 16F876로 많은 시간을 보냈습니다.


3

회로에서 CMOS 또는 TTL 로직 칩을 사용중인 경우 Vdd 및 접지 (일반적으로 0.1 uF)에 적절한 디커플링 커패시터가 있는지 확인하십시오. CD4021을 디자인에 사용하고 있었을 때 마이크로 프로세서가 다시 시작되게하는 약간의 스파이크를 일으켰습니다. 그런 다음 사이클이 반복됩니다. 따라서 코드 시작시 LED 테스트를 몇 번 켜고 끄는 것과 같이 테스트 시퀀스를 명확하게 설정하여 마이크로 프로세서가 작동하고 코드를 실행하고 있는지 확인하는 것이 좋습니다.


2

이것은 드물게 나타날 수있는 것 중 하나입니다.

나는 마이크로 컨트롤러와 관련된 프로젝트를 가지고 있었고 산발적으로 재설정되었습니다. 간단히 말해 일부 옵션을 활성화 또는 비활성화해야하는 것으로 나타났습니다. 그렇지 않으면 재설정이 발생할 수 있습니다. 나는 다른 모든 것을 포기한 후에 정오표를 읽음으로써 이것을 발견했습니다.

이제 칩을 사용하여 내가 무엇을 받고 있는지, 내가 관리 할 수있는 것이 무엇인지 알기 전에 정오표를 읽는 습관을들이십시오. 불행히도, 졸업 후, 나는 실제 연습에 대해 많은 사람들에게 저에게 교육을 해줄 사람이 없었습니다. 그래서 많은 실제 학습은 실패와 좌절을 통해 이루어졌습니다.


나는이 질문이 오래되었고 이미 답변이 제공되었음을 알지 못했습니다. 죄송합니다.
efox29
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.