2014-09-12 1 views
0

지금 TM4C1231H6PZ 용 펌웨어를 작성하고 있습니다. 얼마 전에 IDE와 toolchain을 설정하는데 도움을주었습니다. 이것은 내 프로젝트를위한 깔끔하고 작동 가능한 바이너리를 ~ 8 kB 크기로 생성하는 데 도움이되었습니다. 그 후, 나는 같은 디렉터리에서 다른 프로젝트로 옮겨 갔다. (같은 디렉토리에서 전체 프로젝트 디렉터리를 복원했다.) 이진 520Mb를 생성하는데, 이는 분명히 잘못되었다.ARM 용 Eclipse 및 Codesourcery가 매우 큰 바이너리를 생성합니다.

새로운 바이너리를 살펴보면 00000000에서 0000079b까지의 코드가 있고 그 다음에는 NULL 만 있고 20000000에서 2000002b까지의 코드가 있다는 것을 알 수 있습니다. 나는 그것이 SRAM을위한 몇 가지 코드가되어야한다고 생각하지만, 나는 그것으로 무엇을 해야할지 모른다. 20000000에서 시작하는 코드를 삭제하려고했지만 결과 바이너리가 MCU에서 작동하지 않습니다.

누가 제 IDE + toolchain을 복구하여 이전과 같이 정상적인 바이너리를 생성하도록 도울 수 있습니까?

Eclipse Toolbox (ARM-2013.11-24-arm-none-eabi.exe 설치 프로그램) 용 Eclipse Kepler 2.0.2, Codesourcery Lite 및 TivaWare (SW-TM4C-2.1.0.12573.exe)를 사용합니다.

MEMORY 
{ 
    FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 16K 
    SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 32K 
} 

SECTIONS 
{ 
    .text : 
    { 
     _text = .; 
     KEEP(*(.isr_vector)) 
     *(.text*) 
     *(.rodata) 
     *(.rodata*) 
     _etext = .; 
    } > FLASH 

    /* C++ initialization and finalization data */ 
    .preinit_array : 
    { 
     PROVIDE_HIDDEN (__preinit_array_start = .); 
     KEEP (*(.preinit_array*)) 
     PROVIDE_HIDDEN (__preinit_array_end = .); 
    } >FLASH 
    .init_array : 
    { 
     PROVIDE_HIDDEN (__init_array_start = .); 
     KEEP (*(SORT(.init_array.*))) 
     KEEP (*(.init_array*)) 
     PROVIDE_HIDDEN (__init_array_end = .); 
    } >FLASH 
    .fini_array : 
    { 
     PROVIDE_HIDDEN (__fini_array_start = .); 
     KEEP (*(.fini_array*)) 
     KEEP (*(SORT(.fini_array.*))) 
     PROVIDE_HIDDEN (__fini_array_end = .); 
    } >FLASH 

    .data : AT(ADDR(.text) + SIZEOF(.text) + SIZEOF(.preinit_array) + SIZEOF(.init_array) + SIZEOF(.fini_array)) 
    { 
     . = ALIGN(4); 
     _data = .; 
     *(.data) 
     *(.data*) 
     . = ALIGN(4); 
     _edata = .; 
    } > SRAM 

    . = ALIGN(4); 
    .bss : 
    { 
     _bss = .; 
     *(.bss*) 
     *(COMMON) 
     . = ALIGN(4); 
     _ebss = .; 
    } > SRAM 
} 
+0

지도 파일을 생성하고 주소 0000000의 기호가 무엇인지 확인하십시오. '외계인'섹션이나 알 수없는 오브젝트 파일을 도입했습니다. 링커 파일에 이전에 절대 오브젝트 경로가있을 수 있습니다. –

+0

링커 스크립트 파일을 보여주십시오. –

+0

바이너리 형식의 파일을 만들었습니다. elf를 사용하는 대신 크기가 0x20000000 바이트 인 파일과 예상되는 결과를 조금 더한 것입니다. 이진 이미지로 작성하지 말고 elf 나 coff 또는 intel hex 또는 srec 등으로 작성하십시오. –

답변

0

어딘가에 코드가 RAM에 배치되는 초기 값 또는 프로그램 코드를 포함

여기 내 링커 스크립트 파일입니다. 이 세그먼트의 이름을 확인하려면 링커 맵 파일을 확인해야합니다.

은 링커 스크립트에

*(.data) 
*(.data*) 
*(.ramfunc) <-- this line 

를 추가하여 당신은 당신의 .DATA 세그먼트에이 섹션을 추가해야이 경우

.ramfunc 0x123 
    0x20000000 

을 찾을 수 있습니다,의가 있다고 가정 해 봅시다.

main()이 호출되기 전에 데이터 세그먼트가 플래시에 배치되고 초기화 코드에 의해 RAM에 복사됩니다.

관련 문제