Gdb пропускает строки исходного кода при отладке ассемблерной программы для микроконтроллера ARM7 - PullRequest
4 голосов
/ 30 ноября 2010

У меня проблема с отладкой простой программы, написанной на языке ассемблера для микроконтроллера ARM7 (AT91SAM7S64).Я использую gcc, gdb и OpenOCD.Моя программа загружена правильно и работает нормально (мигает светодиод).Но GDB пропускает определенные строки исходного кода, когда я вызываю команду «next».

Вот фрагмент исходного кода:

    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 (см. Ниже), я использовал"целевой сим" вместо реальной цели, но результаты точно такие же.

(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

Мой MakeFile:

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 $@

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

Заранее благодарен за любую помощь!

Ответы [ 3 ]

1 голос
/ 01 декабря 2010

попробуйте использовать "si" вместо n в проблемной части кода.

«n» - более или менее следующий оператор, «si» - следующая инструкция asm.

если код отладки для фрагмента asm неверен, «si» может все же позволить вам выполнить его, используя тот факт, что в этом случае уровни «Statement» и «ассемблер» совпадают. *

0 голосов
/ 16 июня 2015

Я знаю, что это немного устарело, но вы должны попытаться добавить флаг -O0 в компилятор.Я запрещаю gcc проводить какую-либо оптимизацию, которая может привести к проблемам, подобным тем, которые вы получили.

0 голосов
/ 25 мая 2011

Используйте ni вместо next и si вместо step в инструкциях на ассемблере.

...