2012-11-21 2 views
3

특수한 유형의 플래시 메모리가있는 Cortex M3 부품이 있습니다. 파트는이 FLASH에서 부팅되지만 FLASH의 속도를 최적화하는 함수를 실행해야합니다. 이를 수행하는 유일한 방법은 RAM으로 점프하고 거기에서 해당 기능을 수행하는 것입니다 (FLASH에서 실행되는 경우 함수가 최적화됨에 따라 최적화됩니다).플래시를 램에서 cm3 어셈블리 코드로 옮기기

ARM은 스 캐터 로딩을 허용합니다. 이것은 RAM에 함수를 넣고 main에 도착하면 실행할 수있는 솔루션입니다. 하지만 최적화되지 않은 플래시를 사용하여 모든 스 캐터 로딩을 수행하고 싶지는 않습니다. 그래서 리셋 핸들러 또는 리셋 핸들러에서 호출되는 SystemInit을 의미하는 main 전에 함수를 실행하고 싶습니다.

ROM에있는 일부 어셈블리 함수를 작성했습니다. 부팅 할 때 필자는 내가 작성한 재배치 함수를 호출하고 다른 함수를 RAM에 복사 한 다음 점프합니다. 이것은 작동 중입니다.

내 질문은 :

  1. 이 소리가 미친합니까? 스 캐터 로딩을 기다리지 않고이 작업을 수행하는 더 쉬운 방법이 있습니까?
  2. .s 파일에는 재배치 할 기능이 있습니다. 이러한 재배치 된 함수를 사용하려면 PROC 레이블을로드 한 다음 (FLASH - RAM)의 오프셋을 뺍니다. 이것은 휴대 할 수 없다. 재배치 된 함수에 대한 올바른 PROC 주소를 계산하는 또 다른 방법이 있습니까? 예를 들어 :

    foo  PROC 
         ... 
         ... 
         ENDP 
    

푸 0x24000000에서 ROM에서 시작하고, 나는 0x8000을에서 RAM으로 이동해야합니다. ROM에 저장해야한다고하더라도 foo가 0x8000에 있다고 선언 할 수있는 방법이 있습니까? 또는 foo_reloc을 0x8000에 선언하도록 선언하는 방법이 있습니까? 이것은 THUMB 코드에도 적용됩니다. foo는 0x24000001에서 시작하고 0x8001에서 호출되어야합니다.

감사합니다, Nachum

답변

5
  1. 없음이 미친하지 없습니다.
  2. 링커가 재배치에 대해 걱정하지 마십시오. 링커가 모든 것을 처리해야합니다.

플래시 구성 기능을 스 캐터 파일의 별도 실행 영역에 넣으십시오. 그런 다음 스 캐터 로딩 코드를 수정하여 먼저 플래시 구성 함수의 실행 영역을 설정 한 다음 호출 한 다음 다른 영역의 스 캐터 로딩을 계속하십시오.

$a 
!!!main 
__main 
    0x00000000: eb000000 .... BL  __scatterload ; 0x8 
    0x00000004: eb000028 (... BL  __rt_entry ; 0xac 

당신은 "마법"링커 기호를 사용하여 자신의 scatterloader을 작성할 수 있습니다

LR 0x0 
{ 
    ROM 0x0 
    { 
     * (+RO) 
     * (+RW,+ZI) 
    } 

    RAM 0x18000 0x8000 
    { 
     foo.o (*) 
    } 
} 

당신은 다음과 같은 뭔가 시작하는 이미지를 얻을해야합니다

이 같은 분산 파일을 사용하여 RO, RW 및 ZI의로드를 손으로 수행하려면 (예 : 기본 스 캐터 로더를 무시하기 위해 링커 명령 행에서 사용자 고유의 "입력"기호를 설정하는 것) "__rt_entry"를 호출하면됩니다 (예 : "Image $$ RAM $$ Base").

Keil 도구는 실제로 ARM 도구이므로 여기에서 자세한 정보를 볼 수 있습니다.

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.kui0101a/armlink_chdcgbjd.htm

+0

내 기능을 이동 한 후 밖으로 뛰어 무기 분산 로딩에 후크가 없습니다. Keil 도구를 사용하고 있으며 스 캐터 로딩이 자동으로 수행됩니다. 스 캐터 로딩이 없으면 필자가 작성한 어셈블리 함수를 작성하는 더 좋은 방법이 있습니까? 오프셋을 계산하는 대신 어셈블러에게 procs를 재배치한다고 알려주는 방법일까요? 누구든지 예제가 있습니까? – nachum

+0

필자는 수동으로 스 캐터 로딩을 수행하는 방법에 대한 세부 정보로 내 대답을 업데이트했습니다. –