이 질문은 AVR 프로그래밍 자체 와 관련이 있습니다 .
프로젝트 정보 :
ATMEGA644P를 사용하는 배터리 전원 제품이 있습니다. 애플리케이션은 영구적으로 휴면 모드로 실행되며 1 초에 한 번 (RTC) 또는 두 개의 외부 인터럽트 라인 중 하나가 트리거 될 때만 웨이크 업됩니다.
이 장치에는 RS232 인터페이스 IC를 사용하여 UART를 통해 통신하는 매우 간단한 부트 로더가 있습니다. 하드웨어 ISP 프로그래머가 필요하지 않도록 펌웨어를 업데이트하는 편리한 방법입니다. (부트 로더는 체크섬 보안 텔레 그램을 기대합니다)
이 장치는 전력 소비를 두 배로 늘리고 긴 배터리 수명이 필수적이기 때문에 내부 브라운 아웃 비활성화로 설계되었습니다 (재 설계가 작동중인 외부 브라운 아웃 감지를 사용해야 함).
문제 :
몇 달에 한 번 장치 작동이 중지되고 해당 장치에서 펌웨어 업데이트가 수행되지 않았습니다. 그러나 추가 검사 후 해당 장치의 플래시 내용이 손상된 것 같습니다. 또한 일부 장치의 배터리는 여전히 좋았지 만 어떤 종류의 저전압 상황을 배제하고 싶지 않습니다.
원본 플래시 내용 (왼쪽)과 손상된 내용 (오른쪽)을 비교 한 것입니다.
일부 관찰 :
- 손상된 블록은 항상 하나 이상의 플래시 페이지 (256 바이트)로 구성되며 페이지 정렬됩니다. 다시 말해, 단일 바이트가 아닌 전체 페이지 만 영향을받습니다.
- 손상된 콘텐츠는 대부분 0xFF를 읽지 만 다른 값을 포함하거나 완전히 "무작위"일 수도 있습니다.
- 이미지 왼쪽의 작은 막대에는 영향을받는 모든 영역이 표시됩니다. 이 장치의 경우 총 플래시 내용의 약 10 분의 1입니다.
- 한 페이지 만 영향을받는 장치가 하나있었습니다.
플래시 메모리를 쓰는 동안 저전압 상태가 플래시 내용을 손상시킬 수 있다는 것은 그럴듯합니다. 그러나 이는 일부 플래시 감지 명령어를 실행해야 함을 의미합니다.
저전압으로 인해 컨트롤러가 임의로 재시작되고 부트 로더 코드가이 시간 동안 완전히 예측할 수없는 상태 일 수 있습니다. 저전압에 관한 다른 포럼에서 어떤 사람을 인용하려면 :
"플래시가 실행되는 임의의 명령 일뿐만 아니라 임의의 명령 기간 (플래시의 코드가 올바르게 읽히고 해석 될 것이라는 보장은 없습니다). 이와 함께 MCU의 다른 부분은 보호 기능을 포함하여 설계된대로 동작하지 않을 수 있습니다. 메커니즘. "
질문 : "전압 부족 상태에서 임의의 동작을 수행하고 플래시 페이지에서 데이터를 변경하는 일부 명령을 실행하는 중"
이라고 생각하십니까 ? 이 경우 일부 소프트웨어 문제 (스택 오버플로, 잘못된 포인터)의 원인으로 이러한 종류의 오류가 항상 발생하지 않는 이유는 무엇입니까?
이런 종류의 부패를 일으킬 수있는 다른 아이디어가 있습니까? EMI / ESD로 인해 발생할 수 있습니까?