Проблемы отладки LPC17xx в Eclipse / OCD - PullRequest
0 голосов
/ 27 июня 2011

Я постараюсь быть полным и конкретным:

NXP LPC1756 Cortex-M3. Eclipse Helios, использующий набор инструментов Codesourcery ARM вместе с OpenOCD для отладки. JTAG - это Olimex ARM-USB-OCD. ОС Windows 7 64-битная.

Полагаю, у меня уже есть проблема с загрузкой флэш-памяти. После программирования у меня есть скрипт, выполняющий dump_image, и полученное изображение выглядит примерно правильно. В настоящий момент у меня есть проблемы с проверкой, и мне нужно их решить, но на данном этапе кажется, что моя установка JTAG работает, и я успешно обмениваюсь данными с 1756.

Однако, когда я пытаюсь отладить, у меня возникают проблемы. Сначала мои cfg-файлы, начиная с cfg-файла моего целевого устройства:

# NXP LPC1756 Cortex-M3 with 256kB Flash and 32kB SRAM

debug_level 2

# LPC17xx chips support both JTAG and SWD transports.
# Adapt based on what transport is active.
#source [find swj-dp.tcl]

if { [info exists CHIPNAME] } {
    set  _CHIPNAME $CHIPNAME
} else {
    set  _CHIPNAME lpc1756
}

if { [info exists ENDIAN] } {
    set  _ENDIAN $ENDIAN
} else {
    set  _ENDIAN little
}

if { [info exists CCLK ] } {
    set _CCLK $CCLK
} else {
    set _CCLK 4000
}

if { [info exists CPUTAPID ] } {
    set _CPUTAPID $CPUTAPID
} else {
    set _CPUTAPID 0x4ba00477
}

jtag newtap $_CHIPNAME cpu -irlen 4 -expected-id $_CPUTAPID

set _TARGETNAME [format "%s.cpu" $_CHIPNAME]
target create $_TARGETNAME cortex_m3 -endian $_ENDIAN -chain-position $_TARGETNAME

$_TARGETNAME configure -work-area-phys 0x10000000 -work-area-size 0x8000
$_TARGETNAME configure -work-area-backup 0
#$_TARGETNAME configure -endian $_ENDIAN
#$_TARGETNAME configure -variant ARMv7

#delays on reset lines
adapter_nsrst_delay 200
jtag_ntrst_delay 200

#reset_config srst_only
#reset_config trst_and_srst srst_pulls_trst

# LPC1756 has 256kB of flash memory, managed by ROM code (including a
# boot loader which verifies the flash exception table's checksum).
# flash bank <name> lpc2000 <base> <size> 0 0 <target#> <variant> <clock> [calc checksum]
set _FLASHNAME $_CHIPNAME.flash
flash bank $_FLASHNAME lpc2000 0x0 0x40000 0 0 $_TARGETNAME \
    lpc1700 $_CCLK calc_checksum

# Run with *real slow* clock by default since the
# boot rom could have been playing with the PLL, so
# we have no idea what clock the target is running at.
jtag_khz 50

#$_TARGETNAME configure -event reset-init {
    # Do not remap 0x0000-0x0020 to anything but the flash (i.e. select
    # "User Flash Mode" where interrupt vectors are _not_ remapped,
    # and reside in flash instead).
    #
    # See Table 612. Memory Mapping Control register (MEMMAP - 0x400F C040) bit description
    # Bit Symbol Value Description Reset
    # value
    # 0 MAP Memory map control. 0
    # 0 Boot mode. A portion of the Boot ROM is mapped to address 0.
    # 1 User mode. The on-chip Flash memory is mapped to address 0.
    # 31:1 - Reserved. The value read from a reserved bit is not defined. NA
    #
    # http://ics.nxp.com/support/documents/microcontrollers/?scope=LPC1768&type=user
    #MEMMAP - set user mode
#   mww 0x400FC040 0x01
#}

$_TARGETNAME configure -event reset-init {
    # Force target into ARM state
    #armv4_5 core_state arm
    #do not remap 0x0000-0x0020 to anything but the flash
    #mwb 0xE01FC040 0x01
    mwb 0x400FC040 0x01
    #mwb 0xE000ED08 0x00
}

Теперь мой файл отладки cfg:

#define our ports
#telnet_port 4444
#gdb_port 3333

#commands specific to the Olimex ARM-USB-OCD
interface ft2232
ft2232_device_desc "Olimex OpenOCD JTAG A"
ft2232_layout "olimex-jtag"
ft2232_vid_pid 0x15BA 0x0003

if { [info exists CHIPNAME] } {
    set  _CHIPNAME $CHIPNAME
} else {
    set  _CHIPNAME lpc1756
}

if { [info exists CPUTAPID ] } {
    set _CPUTAPID $CPUTAPID
} else {
    set _CPUTAPID 0x4ba00477
}

if { [info exists CCLK ] } {
    set _CCLK $CCLK
} else {
    set _CCLK 4000
}

if { [info exists ENDIAN ] } {
    set _ENDIAN $ENDIAN
} else {
    set _ENDIAN little
}

debug_level 3
jtag_khz 100

#delays on reset lines
adapter_nsrst_delay 200
jtag_ntrst_delay 200
#reset_config srst_only
reset_config trst_and_srst srst_pulls_trst

jtag newtap $_CHIPNAME cpu -irlen 4 -expected-id $_CPUTAPID

#target cortex_m3 little 0 armv7

set _TARGETNAME [format "%s.cpu" $_CHIPNAME]
target create $_TARGETNAME cortex_m3 -endian $_ENDIAN -chain-position $_TARGETNAME
#
$_TARGETNAME configure -work-area-phys 0x10000000 -work-area-size 0x8000
$_TARGETNAME configure -work-area-backup 0
#working_area 0 0x10000000 0x8000 nobackup

set _FLASHNAME $_CHIPNAME.flash
flash bank $_FLASHNAME lpc2000 0x0 0x40000 0 0 $_TARGETNAME lpc1700 $_CCLK calc_checksum

$_TARGETNAME configure -event reset-init {
    # Force target into ARM state
    #armv4_5 core_state arm
    #do not remap 0x0000-0x0020 to anything but the flash
    mwb 0xE01FC040 0x01
    mwb 0x400FC040 0x01
    mwb 0xE000ED08 0x00
}

gdb_flash_program enable

init

#fast enable
jtag_khz 100
debug_level 1

В Eclipse я вызываю этот инструмент с флагами:

-f arm-usb-ocd.cfg -f debug.cfg

Кажется, это работает нормально (по крайней мере, я не вижу никаких ошибок в консоли). Теперь наступает момент, когда у меня возникают проблемы:

Я создал конфигурацию отладки в Eclipse (Run> Debug Configurations ...) в разделе «Отладка оборудования GDB». Соответствующие параметры:

Main:
    C/C++ Application: output\project_UT1.elf
Debugger: 
    C:\CodeSourcery\bin\arm-none-eabi-gdb.exe
Startup:
    Reset and Delay checked (2-seconds)
    Halt checked
    Initialization commands:
        target remote localhost:3333
        monitor flash device = LPC1756
        monitor flash download = 1
        monitor flash breakpoints = 1
        monitor endian little
        monitor speed 100
        monitor speed auto
        monitor reset halt
        monitor writeu32 0x400FC040 = 0x00000001
        monitor clrbp

    Load image: not checked
    Load symbols: checked
    Runtime options: none of Set program counter, set breakpoint or resume checked
    Run commands:
        monitor reg sp = 0x10001ffc
        monitor reg pc = 0x00001278
        continue
Using "Standard GDB Hardware Debugging Launcher"

(ПРИМЕЧАНИЕ: у меня установлен компьютер на 0x00001278, так как это был адрес моего Reset_Handler; я знаю, что это должен быть 0x00000004, но я экспериментировал; когда это было 0x00000004, у меня были те же проблемы ...)

Когда я пытаюсь выполнить отладку, используя эту настройку, я получаю сообщение «Аппаратная отладка GDB приостановлена», кажется, что компьютер находится в загрузчике 0x1FFF0080, и мой отладчик больше не подключен. В консоли я вижу такие вещи, как:

.
.
.
target remote localhost:3333
0x1fff0080 in ?? ()
.
.
.
continue

Program received signal SIGINT, Interrupt.
0x1fff0080 in ?? ()

Например, в окне дизассемблирования я могу искать и находить такие вещи, как "main" или "Reset_Handler", но дизассемблирование - это все "movs r0, r0" - в основном все нули. Я не могу сделать один шаг (очевидно, приостановлено ...) Даже на 0x1fff0080 он отображает "" movs r0, r0 ". Мне кажется, я могу читать регистры процессора (например, sp показывает 0x10001ffc, а компьютер показывает 0x1fff0081 так возможно, интерфейс JTAG не умер ...)

Предполагается, что мое перепрошитое изображение имеет размер 0x00000000 (то есть таблицу векторов там). Когда я делаю dump_image, кажется, что устройство запрограммировано , и записи в таблице векторов выглядят правильно. Защита кода? Если так, как я могу сделать очевидно успешный "dump + image"?

Однако даже подключение устройства без подключения JTAG не приводит к каким-либо операциям. Я видел сообщения, похожие на это для LPC1768, но не нашел ничего, что мне подходит. Любые советы или предложения с благодарностью.

1 Ответ

1 голос
/ 28 июня 2011

Обработчик reset-init в вашем debug.cfg выполняет слишком много бесполезных mwb инструкций.Вы должны выполнить только mwb 0x400FC40 1, так как при этом будет переназначена векторная таблица с размером 0x0000 из ПЗУ во Flash.

В вашей конфигурации отладчика вы делаете monitor reset halt - измените ее на monitor reset init.

Тогда это читает Load image: not checked: Вы действительно забыли включить загрузку?Это приведет к тому, что GDB не загрузит ваше изображение во флэш-память.

...