2016-09-02 10 views
0

부트 로더 (RTX가없는), RTX가있는 응용 프로그램 이미지의 두 부분으로 소프트웨어를 분할했습니다. 그러나 부트 로더가 RTX로 응용 프로그램 이미지를로드하지 못했습니다. 플래시 설정은 다음과 같습니다IAP 부트 로더가 RTX 응용 프로그램 이미지를로드하지 못했습니다.

 
-------------------------------------------------------------------- 
     start address  size 
IROM 1: 0x08000000   0x2800 - Bootloader (without RTX) 
IROM 2: 0x08002800   0xD000 - Application Image (with RTX) 

내가 시험 3 가지 방법이 있습니다 (1) RTX하지 않고 다른 응용 프로그램을 사용합니다. 부트 로더가 앱을 성공적으로로드 할 수 있습니다.

(2) RTX 프로젝트 IROM 설정으로 응용 프로그램을 변경하십시오. 응용 프로그램 프로젝트 IROM 시작 주소를 0x08002800에서 0x08000000으로 변경합니다. 그리고 주소 0x08000000에서 플래시로 응용 프로그램 이미지를 다운로드합니다. 이미지가 0x08000000에서 성공적으로 실행될 수 있습니다.

(3) 응용 프로그램 이미지 IROM 시작 주소 설정은 0x08002800입니다. 플래시에 부트 로더와 앱 이미지를 다운로드 한 후 Keil의 앱 프로젝트를 단계별로 디버깅합니다. "osTimerthread stack overflow"오류가 있음을 발견했습니다. 그런 다음 주 스레드 스택도 오버플로됩니다. 스택 크기를 늘리려고했지만 작동하지 않습니다. RTX 커널 전환에서 앱이 멈추는 것을 발견했습니다. 모든 스레드는 대기 중 상태이며 실행되지 않습니다.

Ps, Keil에서 디버깅 할 때 테스트 항목 (2)에도 커널 초기화 중에 스택 오버플로 오류가 있습니다. 아이템 (2)은 지금까지 잘 작동합니다. 그래서 나는 여기서 필요한 모든 정보를 넣었습니다.

이것은 (3) 항목의 디버깅 그림입니다. enter image description here

답변

0

당신은 실제로 부트 로더를 사용하거나 0x2800의 오프셋에서 (0x08000000에 연결) 응용 프로그램을로드 할 때 0x08002800에서 시작 연결하는 링커 스크립트를 변경하고 있습니까? 모든 심볼이 0x08000000 - 0x08002800 범위에 링크되어 있지 않은지 확인하기 위해 링크 된 출력을 두 번 확인하십시오 (맵 파일을보십시오).

또한 올바른 진입 점과 스택 포인터를 사용하고 있는지 확인하십시오. 응용 프로그램의 스택 포인터는 0x08002800이어야하며 리셋 벡터는 0x08002804입니다. 부트 로더는 응용 프로그램으로 점프하기 전에 올바른 스택 포인터로 MSP 레지스터를 설정해야합니다.

typedef void (*pFunction)(void); 
pFunction JumpToApplication; 
uint32_t JumpAddress; 

/* Jump to user application */ 
JumpAddress = *(__IO uint32_t*) (USBD_DFU_APP_DEFAULT_ADD + 4); 
JumpToApplication = (pFunction) JumpAddress; 

/* Initialize user application's Stack Pointer */ 
__set_MSP(*(__IO uint32_t*) USBD_DFU_APP_DEFAULT_ADD); 
JumpToApplication(); 

는 또한, 부트 로더는 응용 프로그램에 점프하기 전에 구성하는 방법 정도에 따라, 당신은 '구성 해제'특정 주변 장치를해야 할 수 있습니다 : 여기 ST의 USB DFU 부트 로더에서 몇 가지 예제 코드입니다. 예를 들어, 응용 프로그램으로 점프하기로 결정하기 전에 부트 로더에 시계를 설정 한 경우 시계가 기본 구성에 있다고 가정하면 응용 프로그램에서 문제가 발생할 수 있습니다. 부트 로더가 응용 프로그램으로 점프하기 전에 NVIC 및 SysTick을 사용하는 경우 NVIC 및 SysTick에서도 이와 비슷한 일이 발생할 수 있습니다.

마지막으로 이전 섹션과 같은 줄에서 주변 장치의 기본값 상태에 대한 가정을 응용 프로그램에서 수행하고 있지만 주변 장치 기본값이 올바른 것으로 가정하고있을 수도 있습니다. 예 : SCB->VTOR은 기본값 (나는 항상 0x00000000이라고 생각합니다)을 가지고 있으며, 이것은 벡터 테이블을 가리 킵니다. 부트 로더가 연결되어 해당 위치에 벡터 테이블이 있습니다. 응용 프로그램이 시작될 때 벡터 테이블의 실제 위치를 가리 키도록 VTOR 레지스터를 업데이트해야합니다.

이 섹션 중 하나를 사용하면 문제를 쉽게 파악할 수 있습니다.

+0

감사합니다. ** (1) ** 부트 로더가 시스템 클럭을 구성했습니다. 그것은 startup.s에서 할 첫 번째 일이기 때문에. 그리고 응용 프로그램의 startup.s도 그것을 다시 초기화합니다. ** (2) ** 그리고 내 게시물에서 RTX OS 커널이 실행 중이지만 무한 루프 전환 작업에 있습니다. 모든 작업은 "READY"상태 였지만 OS 커널은 그 중 하나를 "RUNNING"상태로 만들 수 없습니다. 따라서 주 스레드와 사용자 스레드를 호출 할 기회가 없었습니다. –