2016-10-25 3 views
0

mbed-os (RTX RTOS) 프로젝트를 arm-none을 통합 한 mbed-cli 툴 체인을 사용하여 컴파일 된 CC2538 (ARM Cortex M3)에 이식하려고합니다. -eabi-gcc. MCU 부팅을 시도 할 때 시작시 하드 오류 오류가 발생합니다.__lib_init_array의 CC2538 (Cortex m3) 시작시 Hardfault

00202678 <__libc_init_array>: 
    202678:  b570   push {r4, r5, r6, lr} 
    20267a:  4e0f   ldr  r6, [pc, #60] ; (2026b8 <__libc_init_array+0x40>) 
    20267c:  4d0f   ldr  r5, [pc, #60] ; (2026bc <__libc_init_array+0x44>) 
    20267e:  1b76   subs r6, r6, r5 
    202680:  10b6   asrs r6, r6, #2 
    202682:  bf18   it  ne 
    202684:  2400   movne r4, #0 
    202686:  d005   beq.n 202694 <__libc_init_array+0x1c> 
    202688:  3401   adds r4, #1 
    20268a:  f855 3b04  ldr.w r3, [r5], #4 
    20268e:  4798   blx  r3 
    202690:  42a6   cmp  r6, r4 
    202692:  d1f9   bne.n 202688 <__libc_init_array+0x10> 
    202694:  4e0a   ldr  r6, [pc, #40] ; (2026c0 <__libc_init_array+0x48>) 
    202696:  4d0b   ldr  r5, [pc, #44] ; (2026c4 <__libc_init_array+0x4c>) 
    202698:  f004 fec2  bl  207420 <_etext> 
    20269c:  1b76   subs r6, r6, r5 
    20269e:  10b6   asrs r6, r6, #2 
    2026a0:  bf18   it  ne 
    2026a2:  2400   movne r4, #0 
    2026a4:  d006   beq.n 2026b4 <__libc_init_array+0x3c> 
    2026a6:  3401   adds r4, #1 
    2026a8:  f855 3b04  ldr.w r3, [r5], #4 
    2026ac:  4798   blx  r3 
    2026ae:  42a6   cmp  r6, r4 
    2026b0:  d1f9   bne.n 2026a6 <__libc_init_array+0x2e> 
    2026b2:  bd70   pop  {r4, r5, r6, pc} 
    2026b4:  bd70   pop  {r4, r5, r6, pc} 
    2026b6:  bf00   nop 

내가 마지막 단계의 PC는 지금이 순간에

2026a4:  d006   beq.n 2026b4 <__libc_init_array+0x3c> 

다음

2026b4:  bd70   pop  {r4, r5, r6, pc} 

을 실행되는 코드의 흐름을 추적있어, PC는 0 값을 얻을, 다음을 0x00000000를 해결하기 위해 점프 및 하드 오류 오류가 발생했습니다.

CPU 후 CPU 전에

202678:  b570   push {r4, r5, r6, lr} 

[register] 
R0 =00000000 
R1 =00000001 
R2 =00000000 
R3 =00000002 
R4 =00000000 
R5 =00000000 
R6 =00000000 
R7 =00000000 
R8 =00000000 
R9 =00000000 
R10=00000000 
R11=00000000 
R12=00200F51 
SP =200019F0 
LR =00200A77 
PC =0020267A 
[memory] 
200019b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
200019c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
200019d0: f0 09 00 20 00 00 00 00 00 00 00 00 04 0a 00 20 
200019e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
200019f0: 00 00 00 00 00 00 00 00 00 00 00 00 77 0a 20 00 
20001a00: 00 00 00 00 5d 0c 20 00 00 04 00 00 01 01 00 00 

2026b4:  bd70   pop  {r4, r5, r6, pc} 

디버거 덤프 수행,

0
[register] 
R0 =00000000 
R1 =00000001 
R2 =00000000 
R3 =00000002 
R4 =00000000 
R5 =00000000 
R6 =00000000 
R7 =00000000 
R8 =00000000 
R9 =00000000 
R10=00000000 
R11=00000000 
R12=00200F51 
SP =200019C0 
LR =0020269D 
PC =002026B4 
[memory] 
200019b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
200019c0: 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
200019d0: 00 00 00 00 9d 26 20 00 02 00 00 00 00 00 00 00 
200019e0: 00 00 00 00 00 00 00 00 00 00 00 00 9d 26 20 00 
200019f0: 00 00 00 00 00 00 00 00 00 00 00 00 77 0a 20 00 
20001a00: 00 00 00 00 5d 0c 20 00 00 04 00 00 01 01 00 00 
내가 수동으로 0x200019f0에 StackPointer를 수정하면

및 POP 레지스터 명령은 __libc_init_array에서 실행될 때. 그리고 결국 성공적으로 main()으로 점프 할 것입니다. 문제가 해결 된 것 같습니다. 제 질문은 왜 스택 컨트롤이 __libc_init_array()에서 잘못 되었습니까? mbed-os 전체 프로젝트에서 __libc_init_array() 함수의 구현 소스 코드를 찾을 수 없습니다.


MEMORY 
{ 
    FLASH_FW (rx) : ORIGIN = 0x00200000 + 0, 
        LENGTH = (0x00200000 + (((((0) << 0 | (512) << 4 | (32) << 16 | ((1) ? 0x01000000 : 0) | ((1) ? 0x02000000 : 0)) & 0x0000FFF0) >> 4) << 10) - 0x0000002C) - (0x00200000 + 0) 
    FLASH_CCA (RX) : ORIGIN = (0x00200000 + (((((0) << 0 | (512) << 4 | (32) << 16 | ((1) ? 0x01000000 : 0) | ((1) ? 0x02000000 : 0)) & 0x0000FFF0) >> 4) << 10) - 0x0000002C), LENGTH = 0x0000002C 
    NRSRAM (RWX) : ORIGIN = 0x20000000, LENGTH = 0 
    FRSRAM (RWX) : ORIGIN = (((((((0) << 0 | (512) << 4 | (32) << 16 | ((1) ? 0x01000000 : 0) | ((1) ? 0x02000000 : 0)) & 0x00FF0000) >> 16) << 10) - ((((((((0) << 0 | (512) << 4 | (32) << 16 | ((1) ? 0x01000000 : 0) | ((1) ? 0x02000000 : 0)) & 0x00FF0000) >> 16) << 10)) < (16384)) ? ((((((0) << 0 | (512) << 4 | (32) << 16 | ((1) ? 0x01000000 : 0) | ((1) ? 0x02000000 : 0)) & 0x00FF0000) >> 16) << 10)) : (16384))) ? 0x20000000 : 0x20004000), LENGTH = (((((0) << 0 | (512) << 4 | (32) << 16 | ((1) ? 0x01000000 : 0) | ((1) ? 0x02000000 : 0)) & 0x00FF0000) >> 16) << 10) 
} 

/* Linker script to place sections and symbol values. Should be used together 
* with other linker script that defines memory regions FLASH and RAM. 
* It references following symbols, which must be defined in code: 
* Reset_Handler : Entry of reset handler 
* 
* It defines following symbols, which code can use without definition: 
* __exidx_start 
* __exidx_end 
* __etext 
* __data_start__ 
* __preinit_array_start 
* __preinit_array_end 
* __init_array_start 
* __init_array_end 
* __fini_array_start 
* __fini_array_end 
* __data_end__ 
* __bss_start__ 
* __bss_end__ 
* __end__ 
* end 
* __HeapLimit 
* __StackLimit 
* __StackTop 
* __stack 
*/ 
ENTRY(flash_cca_lock_page) 

SECTIONS 
{ 
    .text : 
    { 
     _text = .; 
     *(.vectors) 
     *(.text*) 
     *(.rodata*) 
     _etext = .; 
    } > FLASH_FW= 0 
    .socdata (NOLOAD) : 
    { 
     *(.udma_channel_control_table) 
    } > FRSRAM 
    .data : ALIGN(4) 
    { 
     _data = .; 
     *(.data*) 
     _edata = .; 
    } > FRSRAM AT > FLASH_FW 
    _ldata = LOADADDR(.data); 
    .ARM.exidx : 
    { 
     *(.ARM.exidx*) 
    } > FLASH_FW 
    .bss : 
    { 
     _bss = .; 
     *(.bss*) 
     *(COMMON) 
     _ebss = .; 
    } > FRSRAM 

    .heap : 
    { 
     __end__ = .; 
     end = __end__; 
     *(.heap*) 
     __HeapLimit = .; 
    } > RAM 

    .stack (NOLOAD) : 
    { 
     *(.stack) 
    } > FRSRAM 
    _heap = .; 
    _eheap = ORIGIN(FRSRAM) + LENGTH(FRSRAM); 
    .nrdata (NOLOAD) : 
    { 
     _nrdata = .; 
     *(.nrdata*) 
     _enrdata = .; 
    } > NRSRAM 
    .flashcca : 
    { 
     *(.flashcca) 
    } > FLASH_CCA 
} 
+0

'__libc_init_array()'는 이름에서 알 수 있듯이 C 라이브러리의 일부이므로 예, 프로젝트에서 해당 소스를 찾을 수 없습니다. 이는 또한 문제의 원인이 될 가능성이 거의 없음을 의미하며 단지 증상 일뿐입니다. 이 코드의 아무 것도 프롤로그와 에필로그 사이의 스택이나 SP를 다루지는 않지만 SP가 변경되었을뿐만 아니라 현재 프레임의 스택 내용이 완전히 변경되어 훨씬 더 걱정 스럽습니다. 스택/힙/데이터/등이 가능한 것처럼 링커 스크립트는 어떤 모습입니까? 섹션이 중복되어 있습니까? – Notlikethat

+0

회신 해 주셔서 감사합니다. 감사합니다. 방금 질문 끝에 cc2538.ld 콘텐츠를 첨부했습니다. 나는이 섹션들이 겹쳐 있는지 아닌지 잘 모르겠다. – Janshiue

답변

0

@notlikethat 잘되는 .ld 파일을 첨부, 문제는 링크 스크립트 파일이지만, 근본 원인은 부분 중복되지 않습니다. 나는 위에 게시합니다. 이 시간에 __libc_init_array()

202678:  b570   push {r4, r5, r6, lr} 

에, 0x200019F0 포인터 포인트를 쌓아하지만, 일부 IT는 하드 폴트 오류가 발생하는 방법을 때 팝업 작업 0x200019C0에 스택 포인터 포인트합니다. 나는 내가이 함수는 스택을 통해 포인터의 원인이 있다는 궁금하네요

00207420 <_init>: 
    207420:  b5f8   push {r3, r4, r5, r6, r7, lr} 
    207422:  bf00   nop 

00207424 <_fini>: 
    207426:  b5f8   push {r3, r4, r5, r6, r7, lr} 
    207428:  bf00   nop 

는 메모리에 그 모습이다

202698:  f004 fec2  bl  207420 <_etext> 

에서 섹션 <_init>으로 이동합니다, __libc_init_array()에, 코드의 흐름을 추적 카운트, 왜냐하면 <_init> 섹션은 push 명령어 만 보여 주지만 pop 명령어는 보여주지 않습니다. <_init> 섹션에 대한 웹 검색을 더 많이하고 2 가지 지침 만 있으면 안된다는 것을 확인하십시오. 링커 파일에 의해 영향을받습니다.

이전 링커 파일에서 나는 .init & .fini 섹션을 신경 쓰지 않았습니다. 그리고는 좀 수정했던, 그리고

.text : 
{ 
    _text = .; 
    *(.vectors) 
    *(.text*) 

    KEEP(*(.init)) 
    KEEP(*(.fini)) 

    /* .ctors */ 
    *crtbegin.o(.ctors) 
    *crtbegin?.o(.ctors) 
    *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) 
    *(SORT(.ctors.*)) 
    *(.ctors) 

    /* .dtors */ 
    *crtbegin.o(.dtors) 
    *crtbegin?.o(.dtors) 
    *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) 
    *(SORT(.dtors.*)) 
    *(.dtors) 

    *(.rodata*) 

    KEEP(*(.eh_frame*)) 

    _etext = .; 
} > FLASH_FW= 0 
.socdata (NOLOAD) : 

같은 다음> & < _fini> 섹션 < _init이 다음과 같이 변경 컴파일 후 보인다.

00207040 <_init>: 
    207040:  b5f8   push {r3, r4, r5, r6, r7, lr} 
    207042:  bf00   nop 
    207044:  bcf8   pop  {r3, r4, r5, r6, r7} 
    207046:  bc08   pop  {r3} 
    207048:  469e   mov  lr, r3 
    20704a:  4770   bx  lr 

0020704c <_fini>: 
    20704c:  b5f8   push {r3, r4, r5, r6, r7, lr} 
    20704e:  bf00   nop 
    207050:  bcf8   pop  {r3, r4, r5, r6, r7} 
    207052:  bc08   pop  {r3} 
    207054:  469e   mov  lr, r3 
    207056:  4770   bx  lr 
    207058:  6465626d  .word 0x6465626d 
    20705c:  73736120  .word 0x73736120 
    207060:  61747265  .word 0x61747265 
    207064:  6e6f6974  .word 0x6e6f6974 
    207068:  69616620  .word 0x69616620 
    20706c:  3a64656c  .word 0x3a64656c 
    207070:  2c732520  .word 0x2c732520 
    207074:  6c696620  .word 0x6c696620 
    207078:  25203a65  .word 0x25203a65 

으로 변경 한 다음 main()으로 점프합니다.

관련 문제