2014-01-15 8 views
2

내 부트 로더가 인터럽트 벡터를 사용해야하지만 내 응용 프로그램도 그렇습니다. 상위 벡터는 주소 0x08에서 시작하고 하위 벡터는 주소 0x18에서 시작합니다.부트 로더에서 인터럽트를 어떻게 처리합니까?

부트 로더와 다운로드 한 응용 프로그램에서 별도의 인터럽트 기능을 사용할 수 있도록 인터럽트 벡터를 공유하려면 어떻게해야합니까? 나는 PIC18F87J11과 MPLAB XC8 컴파일러를 사용하고 있습니다.

+2

부트 로더가 정말 인터럽트를 필요로하거나 당신이 그것을 구현하는 일이 어떻게이다합니까? 부작용을 해결하기 전에 원인을 조사하십시오. –

+0

지금은 그렇지 않습니다. 부트 로더 코드에서 모든 인터럽트를 제거했습니다. – Ammar

답변

3

나는 내 작업에서 비슷한 문제에 직면 해있다.

STM32에서 런타임시 벡터 테이블의 위치를 ​​변경할 수 있으므로 좋았습니다.

PIC18에서 부트 로더에서 인터럽트를 사용하지 않기로 선택 했으므로 0x08 및 0x18의 인터럽트 벡터는 GOTO 명령어를 사용하여 응용 프로그램 섹션의 해당 위치로 무조건 리디렉션 할 수 있습니다. 부트 로더에서 인터럽트를 사용해야합니까?

인터럽트가 정말로 필요한 경우 런타임에 응용 프로그램이 실행 중인지 또는 부트 로더가 실행 중인지를 알려주어 올바른 위치로 리디렉션 할 수있는 유용한 방법이 필요하다고 생각합니다. 간단하게하기 위해 STATUS 레지스터 나 RAM의 다른 부분에 영향을주지 않고 테스트 할 수 있기를 원합니다.

RAM의 특수 바이트, 아마도 액세스 뱅크의 최상위 바이트를 예약하는 것이 좋습니다.

unsigned char inBootloader @ 0x5F; 

불행하게도,이 부트 로더에 의해로드 된 모든 응용 프로그램이이 규칙을 알고 있어야하고,이 같은 변수를 정의 : XC8은 (는 버그가되지 않은 경우) 당신이 할 수 있도록, 절대적 변수를 배치 할 수 있습니다 같은 자리. 또는 적어도 메모리에 그 위치에 쓰는 것을 피하고 부트 로더 코드가 변수의 상태를 유지하도록해야합니다. 는 0x08에서 귀하의 인터럽트 벡터에 그런

및 올바른 위치로 리디렉션 몇 가지 간단한 논리를 넣어 0x18 :

btfss inBootloader, 0 
goto 0x4008 ; go to application high vector 
goto bootloaderHighIsr 
+0

부트 로더에서 인터럽트를 사용하는 것을 피할 것이지만 다른 경로를 사용해야 할 경우 귀하의 답을 이해합니다. – Ammar

+2

STM32의 벡터 테이블 재배치는 STM32가 아닌 모든 ARM Cortex-M3/4 코어 장치의 기능입니다. – Clifford

+0

맞아요, Clifford, 제 대답에 Cortex-M3을 말해야했습니다. –