CMSIS2000  0.0.7
 Указатель Структуры данных Файлы Функции Переменные Определения типов Перечисления Элементы перечислений Макросы Группы Страницы
Отладка ARM приложений c OpenOCD

Для отладки вам понадобятся:

  • плата с микроконтроллером (target board)
  • аппаратный отладчик JTAG
  • сервер отладки
  • клиент отладки с текстовым интерфейсом (GNU DEBUGER)
  • клиент отладки с графическим интерфейсом(Codeblocks или Eclipce)
  • скомпилированное приложение (elf файл)

Схема работы отладчика проста:

dot_inline_dotgraph_1.png

Следуюшие разделы описывают работы представленной схемы с низу вверх.

Аппаратная часть.

Сначала следует присоединить к плате все необходимые узлы и отладчик с помощью разъёма JTAG. Следует помнить о некоторых электрических особенностях данного процесса:

  • корпус ПК имеет связь с сетью через конденсаторы, то есть, если он не заземлён, то на нём присутствует 110В, иногда не существует гальванической развязки между платой и ПК через UART, USB, или JTAG.
  • отладчик, будучи не активированным программным обеспечением выставляет RESET для МК, однако и сама плата тоже может выставить данный сигнал, что препятствует запуску МК.

Далее следует включить отладчик, соединив его USB кабелем с ПК, и в последнюю очередь можно подавать питание на плату. Аппаратный сброс отладчика можно производить путём отключения его от шины USB.

С точки зрения OC ПК отладчик представляет из себя устройство с COM портом. Драйвера для отладчика реализуют интерфейс ком порта. Есть две программные реализации драйверов:

  • libusb (например им пользуется openOCD)
  • ftdi (например им пользуется JLink)

После включения отладчика в компьютере должно появится соответствующее устройство. Далее необходимо запустить сервер отладки.

Работа с OpenOCD

OpenOCD является сервером отладки. Сервер ждёт gdb TCP/IP соединение на порту 3333, и telnet соединение на порту 4444 (см рисунок). Однако сервер отладки может быть запущен в других режимах которые в данном руководстве не рассматриваются (com порт, stdio). Команды для сервера могут быть переданы с gdb если они начинаются со слова monitor, а также с консоли отладки.

В основном необходимости работать непосредственно с самим сервером OpenOCD нет, всё нужно делать через клиента отладки, тем не менее, в CodeBlocks например отсутствует кнопка сброса, также в консоли удобно наблюдать за появлением некоторых других сообщений, которые могут возникнуть в случае обрыва питания и прочего.

См. также
Часто используемые команды для OpenOCD

Запуск OpenOCD

Запуск OpenOCD осуществляется командой:

openocd -d2 -f interface/olimex-arm-usb-ocd.cfg -f target/lpc2478.cfg

где,

  • -d2 уровень вывода отладочных сообщений,
  • -f interface/olimex-arm-usb-ocd.cfg указывает на тип отладчика
  • -f target/lpc2478.cfg на тип микроконтроллера.

Пример запуска openOCD:

>openocd -d2 -f interface/olimex-arm-usb-ocd.cfg -f target/lpc2478.cfg
Open On-Chip Debugger 0.4.0 (2010-02-22-19:05)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.berlios.de/doc/doxygen/bugs.html
debug_level: 2
jtag_nsrst_delay: 100
jtag_ntrst_delay: 100
trst_and_srst srst_pulls_trst srst_gates_jtag trst_push_pull srst_open_drain
RCLK - adaptive
Info : RCLK (adaptive clock speed) not supported - fallback to 500 kHz
Info : JTAG tap: lpc2478.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf
1f0, ver: 0x4)
Info : Embedded ICE version 7
Error: EmbeddedICE v7 handling might be broken
Info : lpc2478.cpu: hardware has 2 breakpoint/watchpoint units

Запуск консоли отладки

По умолчанию, на 4444 порту openOCD ожидает telnet соединение. Если к нему подключится с помощью любого telnet клиента, то можно командовать сервером.

Подойдут putty или Realterm.

putty_local_host_4444.jpg
["Запуск Putty"]
putty_with_openOCD.png
["пример работы Putty с openOCD"]

Часто используемые команды для OpenOCD

справка по всем используемым командам доступна в консоли

например:

> help speed
jtag_khz [khz]
      With an argument, change to the specified maximum jtag speed.  Pass 0
      to require adaptive clocking. With or without argument, display
      current setting. (command valid any time)
jtag_rclk [fallback_speed_khz]
      With an argument, change to to use adaptive clocking if possible;
      else to use the fallback speed.  With or without argument, display
      current setting. (command valid any time)

Пуск/стоп

  • halt – остановить отладку
  • soft_reset_halt – остановить отладку, сбросить регистры

Работа с регистрами

  • arm reg – список регистров ядра arm
  • reg – список всех регистров
  • reg pc 0 – установить pc в 0 (сбросить программу)

Например, чтобы искусственно перейти к нужному участку кода необходимо в регистр pc занести значение адреса инструкции – пишем reg pc 0x40000000, если работаем в CodeBlocks-е пишем monitor reg pc 0x40000000

Отладка приложений в SDRAM

Отладка приложений в SDRAM самая быстрая и удобная, однако она может не запуститься с первого раза, из-за того что SDRAM не активирована. Для активизации SDRAM загружаете что нибудь работающее с SDRAM в ПЗУ – например U-Boot или пример работы с SDRAM от NXP, далее подключаете отладчик, загружаете проект с вашей программой с помощью CODEBLOCKS, но вместо обычной комбинации пишете в консоли

monitor reg pc 0

Далее жмёте Start/Continue , ждёте пару секунд пока приложение с ПЗУ активизирует память SDRAM, далее снова грузите своё приложение в SDRAM

load

Теперь оно в SDRAM делаете запуск его командой

monitor reg pc ADRESS вашей программы в SDRAM

Дальнешая актвизация SDRAM не требуется, можно сколько угодно раз загружать и останваливать процесс отладки. Работа с RAM позволяет устанавливать любое число точек останова так как они программные, в отличие от аппаратных точек останова во FLASH.

Стабильность и скорость работы OpenOCD

Тише едешь – дальше будешь. Следует поиграть с со следующими опциями OpenOCD для увеличения стабильности или увеличения скорости работы.

monitor jtag_khz [100 | 500 | 1500 | и так далее]
monitor arm7_9 dcc_downloads enable | disable
monitor arm7_9 fast_memory_access enable | disable

Работа с точками останова

  • bp address length ['hw'] в общем точки останова нужно ставить через CodeBlocks, но из-за проблем иногда точки останова ''не доходят до openOCD' для того чтобы убедиться, что точки останова установились можно вызвать bp без параметров, что выведет их список

Установка CodeBlocks

Сначала необходимо установить Codebloks версии 10.2 при установке следует выбрать все плагины, чтобы он не ''ругался'', что их нет. Далее следует установить последнюю версию Codeblocks из ветки Debug поверх установленной, например файл CB_20100912_rev6583_DEBUGGER_BRANCH_win32.7z надо распаковать поверх существующей директории. Версии из ветки Debug собираются автоматически несколько раз в месяц и выкладываются на форуме CodeBlocks.

Настройка GDB в CodeBlocks

необходимо установить ещё две настройки в CodeBlocks, настройки находятся в Settings-> Compiler and Debugger -> Debugger Settings

  • Display the debugger log – данная опция позволит Вам видеть те команды, которыми обмениваются между собой GDB и CodeBlocks, это также позволит вводить напрямую команды GDB
  • DO not run the debugee – позволит не запускать программу, что позволит установить точки останова в приложении до запуска программы.
gdb_codeblocks.png
["подстройка CodeBlocks под GDB"]

Запуск GNU DEBUGER из CodeBlocks

Если проект в CodeBlocks настроен как проект под ARM, то запуск GNU DEBUGER происходит автоматически.

Настройка GDB в CodeBlocks

Запус GDB осуществляется CODEBLOCKS. При запуске CODEBLOCKS передаёт GDB параметры настройки. Основные параметры:

  • тип соединения (TCP)
  • адрес и порт сервера отладки (127.0.0.1:3333)
gdb_working_params_net.png
["основные настройки GDB"]

Дополнительные команды(ADDITINAL GDB COMMANDS): здесь следует указать команды связанные со спецификой отладчика и платы. Команды следует поместить в файл .gdbinit. А в поле ``After Connection'' ввести ``source .gdbinit''.

Например рабочие параметры для GDB под LPC для отладки в RAM такие:

set mem inaccessible-by-default off
set remote memory-write-packet-size 1024
monitor arm7_9 dcc_downloads disable
monitor arm7_9 fast_memory_access disable
set remote hardware-watchpoint-limit 2
set remote hardware-breakpoint-limit 2
monitor reset init
monitor halt
monitor soft_reset_halt
file RTOSDemo.elf
load
monitor soft_reset_halt

Также содержимое файла .gdbinit можно ввести прямо в поле ``After Connection'' как на рисунке.

gdb_working_params.png
["дополнительные настройки GDB"]

Параметры начинающиеся на monitor передаются серверу отладки то есть команда monitor reset init передаётся как reset init

См. также
Работа с OpenOCD.

Запуск отладки в CodeBlocks через GDB

Для запуска отладки в CodeBlocks через GDB необходимо чтобы:

  • проект был откомпилирован в *.elf файл и настроен под GDB;
  • был запущен сервер отладки;
  • рабочий проект не должен лежать в директории имеющей в своей имени пробелы, поэтому Рабочий стол не подходит для размещения проектов так как лежит в папке C:\Documents and Settings\....

После открытия проекта нужно запустить Debug\Start and Continue, что приведёт к запуску процесса компиляции и отладки.

codeblocks_with_gdb.png
["работа CodeBlocks c GDB"]