2011-11-03 3 views
14

사용자 정의 Cortex-M3 기반 장치에서 작업 중이며 JTAG없이 장치 펌웨어를 업데이트 할 수 있도록 인앱 프로그래밍 (IAP) 메커니즘을 구현해야합니다 (대신 TFTP 또는 HTTP를 사용합니다).). ST 마이크로 일렉트로닉스에서 제공하는 IAP 관련 코드 예제는 충분히 명확하지만 재 플래시가 어떻게 작동하는지 실제로 이해하지 못합니다.ARM (Cortex M3)의 인앱 (in-application) 프로그래밍은 어떻게 작동합니까?

내가 이해하는 한, 지침은 ICode 버스 (물론 프리 페치 블록)를 통해 플래시에서 CPU로 가져온다. 그래서, 여기 내 바보 같은 질문 : 실행중인 프로그램이 다시 깜박일 때 (즉, 실행중인 플래시 메모리를 변경하는) 실행중인 프로그램이 손상되지 않는 이유는 무엇입니까?

답변

9

일반적인 해결책은 실제 깜박이는 프로그램이 저장되는 플래시의 작은 예약 영역을 갖는 것입니다. 새로운 펌웨어가 다운로드되면이 영역의 코드로 점프하십시오.

물론이 작은 영역은 펌웨어를 플래싱 할 때 덮어 쓰지 않으며 다른 수단 (예 : JTAG)으로 만 수행 할 수 있습니다. 그래서이 깜박이는 프로그램이 잘 작동하는지 확인하십시오. :)

+0

아 - 하 ... 맞아, 나는 코드를 공부하는 동안 그 부분을 놓쳤다! –

+1

예. 그러나 많은 장치에서 플래시를 프로그래밍하는 동안 RAM에서 실제로 실행해야하므로 프로그래밍 프로세스의 짧은 블록을 RAM으로 복사하고 실제 프로그래밍을 수행해야합니다. 플래시의 예약 된 부분에 코드. –

+0

고려해야 할 많은 실패 시나리오가 있습니다. 그렇지 않으면 시스템이 브릭 업 될 수 있습니다.IAP는 f/w 개발의 모퉁이 돌이며 특히 손실이 많은 네트워크를 통해 올바르게 수행하는 것은 까다로운 작업 일 수 있습니다. – Amit

6

STM 구현에는 익숙하지 않지만 NXP 칩에서는 IAP 루틴이 사용자 코드에 의해 지워지지 않는 분리 된 예약 ROM 영역에 저장됩니다.

직접 HW 레지스터를 사용하여 직접 플래시 쓰기 코드를 구현하는 경우 실행중인 섹터를 만지지 않도록하거나 RAM에서 실행해야합니다.

1

이제 IAP를 지원하는 많은 마이크로 컨트롤러가있어 동일한 플래시에서 프로그램 실행 중에 플래시 메모리를 프로그래밍 할 수 있습니다.

IAP의 경우 플래시의 프로그램 메모리는 실행 부분 & 다른 백업 부분의 두 부분으로 나눌 수 있습니다.

일반적으로 펌웨어 버전이 0.01 인 JTAG을 통해 플래시 메모리를 위치 (예 : part-1)에 프로그래밍합니다. IAP의 경우, 코드가 실행되는 동안 다른 부분 (2 부)에 플래시를 프로그래밍하십시오. 해당 API는 플래시 부분 2를 프로그래밍하는 데 도움이되는 펌웨어 버전 0.01에서 제공되어야합니다. 프로그래밍 완료 후 펌웨어 버전이 성공적으로 이루어집니다. 0.02로 업데이트되었습니다. 프로세서를 다시 시작하면 초기화시 펌웨어 버전을 확인하여 프로그램 실행이 최신 펌웨어로 이동합니다.

펌웨어가 실행되는 부분을 실행 부분이라고하며, 다른 부분은 백업입니다. 왜 그것이 백업 수단이라고 불리우는 지, 프로그래밍 도중 펌웨어 손상이있을 경우, 펌웨어 버전이 다시 시작될 때 &을 업데이트하지 않는다고 가정하면 프로그램 번호는 버전 번호를 확인한 후 자동으로 백업 펌웨어로 돌아갑니다.

0

또 다른 좋은 방법은 맞춤형 부트 로더를 사용하는 것입니다. 그러나 STM IAP는 플래시에 저장되지 않으므로 자체적으로 덮어 쓸 수 없습니다. 일반적으로 사람들이하는 일은 플래시를 두 부분으로 쏟아내는 것입니다. 하나는 맞춤 제작 된 부트 로더 용이고 다른 하나는 응용 프로그램 용입니다. 부트 로더는 자신이 할당 된 영역에 기록하지 않도록합니다. 부트 로더는 JTAG을 통해 프로그래밍 될 수 있으며, 나중에 애플리케이션은 부트 로더를 활용하여 자체 프로그래밍 할 수 있습니다.

관련 문제