2010-11-29 2 views
4

ARM7 마이크로 컨트롤러 (AT91SAM7S64) 용 어셈블러 언어로 작성된 간단한 프로그램을 디버깅하는 데 문제가 있습니다. gcc, gdb 및 OpenOCD를 사용합니다. 내 프로그램이 제대로 표적으로로드되고 잘 작동합니다 (LED가 깜박입니다). 하지만 gdb는 'next'명령을 호출 할 때 특정 소스 코드 라인을 건너 뜁니다. 여기 Gdb가 ARM7 마이크로 컨트롤러 용 어셈블러 프로그램을 디버깅하는 동안 소스 코드 라인을 건너 뜁니다.

소스 코드의 단편이다

Reset_Handler: 

       LDR  R0, =0x0100 
       LDR  R1, =PIOA_PER 
       STR  R0, [R1] 

       LDR  R1, =PIOA_OER 
       STR  R0, [R1] 
uuu: 
       bl  wait; 
       LDR  R1, =PIOA_SODR 
       STR  R0, [R1] 
uuu1: 
       bl  wait; 
       LDR  R2, =PIOA_CODR 
       STR  R0, [R2] 
       b  uuu; 
@ one second delay 
wait: 
    ............. 
    ............. 

     .end 

은 GDB 출력 (아래 참조)를 얻으려면 내가 아닌 실제 타겟의 "SIM 타겟팅"을 사용했지만 rusults는 exaclty 동일하다.

(gdb) target sim 
Connected to the simulator. 
(gdb) load 
Loading section .text, size 0xc8 vma 0x100000 
Start address 0x100000 
Transfer rate: 1600 bits in <1 sec. 
(gdb) b Reset_Handler 
Breakpoint 1 at 0x100064: file main.s, line 59. 
(gdb) run 
Starting program: C:\Arm\Projects\Asm/./main.elf 

Breakpoint 1, Reset_Handler() at main.s:60 
60          LDR    R1, =PIOA_PER 
(gdb) n 
61          STR    R0, [R1] 
(gdb) n 
63          LDR    R1, =PIOA_OER 
(gdb) n 
64          STR    R0, [R1] 
(gdb) n 
uuu() at main.s:66 
66          bl    wait; 
(gdb) n 
67          LDR    R1, =PIOA_SODR 
(gdb) n 
68          STR    R0, [R1] 
(gdb) n  <<<<<--------- Here the problem begins 
67          LDR    R1, =PIOA_SODR 
(gdb) n 
68          STR    R0, [R1] 
(gdb) n 
67          LDR    R1, =PIOA_SODR 
(gdb) n 
68          STR    R0, [R1] 
(gdb) stepi <<<<<------ Doing a 'stepi' command allows to pass below 'uuu1' label 
uuu1() at main.s:70 
70          bl    wait; 
(gdb) n 
71          LDR    R2, =PIOA_CODR 
(gdb) n 
72          STR    R0, [R2] 
(gdb) n 
73          b    uuu; 
(gdb) n  <<<<<--------- Here the problem begins again 
71          LDR    R2, =PIOA_CODR 
(gdb) n 
72          STR    R0, [R2] 
(gdb) n 
73          b    uuu; 
(gdb) n 
71          LDR    R2, =PIOA_CODR 
(gdb) where 
#0 uuu1() at main.s:71 
#1 0x00100084 in uuu1() at main.s:70 
Backtrace stopped: previous frame identical to this frame (corrupt stack?) 
(gdb) 

gdb가 'uuu1'을 별도의 함수로 가정하고 어떤 이유로 건너 뜁니다. 'uuu1'레이블을 삭제하면 문제가 사라집니다. 이 레이블은 어디에서도 사용되지 않지만 gdb의 동작은 매우 이상하게 보입니다. 나는 오랜 시간 동안 어떤 해결책을 찾으려고 노력했지만 중요한 결과를 얻고있다. gcc 옵션을 사용하면 '-fomit-frame-pointer'가 도움이되지 않습니다. 무엇을 할 수 있습니까? GDB와 GCC의

버전 :

arm-none-eabi-gdb --version 
GNU gdb (GDB) 7.1 
.......... 
This GDB was configured as "--host=i686-pc-mingw32 --target=arm-none-eabi". 

arm-none-eabi-gcc --version 
arm-none-eabi-gcc (GCC) 4.5.1 

내 메이크 : 사전에 어떤 도움

TRGT = arm-none-eabi- 
CC = $(TRGT)gcc 
CP = $(TRGT)objcopy 
AS = $(TRGT)gcc -x assembler-with-cpp 
#AS = $(TRGT)as 
LD = $(TRGT)ld 
OBJDUMP = $(TRGT)objdump 
LD_SCRIPT = main.ld 
MCU  = arm7tdmi 

#DEBUG = stabs 
DEBUG = dwarf-2 
ASFLAGS = -mcpu=$(MCU) -g$(DEBUG) 
LDFLAGS = -T $(LD_SCRIPT) 

all: main.elf main.lss 
    @echo Done! 

main.elf : main.o 
    @echo Linking $< 
    $(CC) -nostartfiles $(LDFLAGS) $< -o [email protected] 

main.o : main.s 
    @echo Compiling $< 
    $(AS) -c $(ASFLAGS) $< -o [email protected] 

감사합니다!

답변

1

문제 코드 조각에서 n 대신 "si"를 사용하십시오.

"n"은 다음 문장 일 것이며 "si"는 다음 asm 명령어입니다.

asm의 디버그 코드가 올바르지 않은 경우 "si"는이 경우 "statement"및 "assembler"레벨이 동일하다는 사실을 이용하여이를 수행 할 수 있습니다.

+0

예, 작동합니다 (위의 gdb 로그에있는 내 의견 참조). 그러나 작품은 "발걸음"대신 "발걸음"으로 간주됩니다. gdb가 66 단계에서와 같은 방식으로 'wait'프로 시저를 넘겨주고 싶습니다. Eclipse에서 gdb를 사용할 계획이며 이것은 나에게 매우 성가신 효과입니다. – Romario

+0

왜 'asm 조각을위한 디버그 코드'가 정확하지 않을 수 있습니까? 어쩌면 gdb 나 gcc에 대한 "마법"호환성 인수가있을 수 있습니까? – Romario

+0

gcc의 버그 겠지요. 디버그 정보가 회선과 동기화되지 않습니다. 드워프를 강요하려고 할 수 있습니다. –

0

어셈블러 지침을 통해 step 대신 nextsi 대신 ni을 사용하십시오.

0

나는 이것이 다소 오래되었음을 알고 있지만 컴파일러에 -O0 플래그를 추가해야합니다. 나는 당신이 가진 것과 같은 문제로 이어질 수있는 최적화를하는 gcc를 막는다.

관련 문제