특수한 유형의 플래시 메모리가있는 Cortex M3 부품이 있습니다. 파트는이 FLASH에서 부팅되지만 FLASH의 속도를 최적화하는 함수를 실행해야합니다. 이를 수행하는 유일한 방법은 RAM으로 점프하고 거기에서 해당 기능을 수행하는 것입니다 (FLASH에서 실행되는 경우 함수가 최적화됨에 따라 최적화됩니다).플래시를 램에서 cm3 어셈블리 코드로 옮기기
ARM은 스 캐터 로딩을 허용합니다. 이것은 RAM에 함수를 넣고 main에 도착하면 실행할 수있는 솔루션입니다. 하지만 최적화되지 않은 플래시를 사용하여 모든 스 캐터 로딩을 수행하고 싶지는 않습니다. 그래서 리셋 핸들러 또는 리셋 핸들러에서 호출되는 SystemInit을 의미하는 main 전에 함수를 실행하고 싶습니다.
ROM에있는 일부 어셈블리 함수를 작성했습니다. 부팅 할 때 필자는 내가 작성한 재배치 함수를 호출하고 다른 함수를 RAM에 복사 한 다음 점프합니다. 이것은 작동 중입니다.
내 질문은 :
- 이 소리가 미친합니까? 스 캐터 로딩을 기다리지 않고이 작업을 수행하는 더 쉬운 방법이 있습니까?
.s 파일에는 재배치 할 기능이 있습니다. 이러한 재배치 된 함수를 사용하려면 PROC 레이블을로드 한 다음 (FLASH - RAM)의 오프셋을 뺍니다. 이것은 휴대 할 수 없다. 재배치 된 함수에 대한 올바른 PROC 주소를 계산하는 또 다른 방법이 있습니까? 예를 들어 :
foo PROC ... ... ENDP
푸 0x24000000에서 ROM에서 시작하고, 나는 0x8000을에서 RAM으로 이동해야합니다. ROM에 저장해야한다고하더라도 foo가 0x8000에 있다고 선언 할 수있는 방법이 있습니까? 또는 foo_reloc을 0x8000에 선언하도록 선언하는 방법이 있습니까? 이것은 THUMB 코드에도 적용됩니다. foo는 0x24000001에서 시작하고 0x8001에서 호출되어야합니다.
감사합니다, Nachum
내 기능을 이동 한 후 밖으로 뛰어 무기 분산 로딩에 후크가 없습니다. Keil 도구를 사용하고 있으며 스 캐터 로딩이 자동으로 수행됩니다. 스 캐터 로딩이 없으면 필자가 작성한 어셈블리 함수를 작성하는 더 좋은 방법이 있습니까? 오프셋을 계산하는 대신 어셈블러에게 procs를 재배치한다고 알려주는 방법일까요? 누구든지 예제가 있습니까? – nachum
필자는 수동으로 스 캐터 로딩을 수행하는 방법에 대한 세부 정보로 내 대답을 업데이트했습니다. –