разработка и программирование электронных устройств

Программный симулятор микроконтроллеров ARM в Eclipse

Нередко в практике разработчика возникают ситуации, когда программное обеспечение (ПО) для микроконтроллера
приходится писать в отсутствии под рукой аппаратной платформы.

Например, печатная плата устройства отдана на подготовку к производству, а времени ждать
готовое устройство для тестирования на нем программного обеспечения нет.

В таких случаях для оценки работоспособности ПО можно воспользоваться программным симулятором целевого микроконтроллера.

Для интегрированной среды разработки Eclipse CDT в качестве программного симулятора микроконтроллеров ARM можно использовать симулятор (или виртуальную машину,если быть точным) qemu-arm с интерфейсом командной строки.

Сразу хочу обрадовать пользователей операционной системы Linux( Fedora Electronic Lab ) – этот симулятор уже установлен в базовой версии FEL. Проверить наличие симулятора в Вашей Linux-системе, а заодно и просмотреть список поддерживаемых микроконтроллеров, можно следующим образом:

$qemu-arm -cpu ?

В ответ на эту команду симулятор выдаст на экран список поддерживаемых микроконтроллеров:

Available CPUs:
  arm926
  arm946
  arm1026
  arm1136
  arm1136-r2
  arm11mpcore
  cortex-m3
  cortex-a8
  cortex-a9
  ti925t
  pxa250
  pxa255
  pxa260
  pxa261
  pxa262
  pxa270
  pxa270-a0
  pxa270-a1
  pxa270-b0
  pxa270-b1
  pxa270-c0
  pxa270-c5
  any

Многих, возможно, этот список может разочаровать, поскольку в нем нету ядра arm7. Поспешу обрадовать, что для ядра ARM7TDMI также
есть возможность использовать программную симуляцию, но об этом мы вспомним чуть позже в данной статье.

Итак, сначала рассмотрим механизм подключения симулятора к Eclipse.Он принципиально ничем не отличается от механизма подключения FTDI JTAG адаптера.Коротко напомню, что при подключении адаптера FTDI JTAG мы запускали программный сервер OpenOCD, который непосредственно управлял адаптером.

Клиенсткую часть ПО представлял отладчик arm-none-eabi-gdb,который с одной стороны имел программный интерфейс с OpenOCD, а с другой – интерфейс с плагином отладки Eclipse. Тестирование связки OpenOCD + arm-none-eabi-gdb мы проводили из коммандной строки (в Linux и Windows).

Так вот при использовании симулятора структура взаимодействия компонентов системы отладки остается абсолютна та же.
Вместо программного сервера OpenOCD при симуляции используется виртуальная машина
qemu-arm.

Для проверки симулятора нам понадобится готовый образ ПО для микроконтроллера STM32F103(elf-файл).
Возмем этот образ из каталога /out проекта CMSIS_example.
Можно просто перейти в этот каталог:

$su
password
#cd /root/workspace/CMSIS_example/out

Далее запустим виртуальную машину с образом нашей программы:

#qemu-arm -cpu cortex-m3 -B 0x08000000 -g 1234 CMSIS_example.out

Программа после запуска будет ожидать соединения с arm-none-eabi-gdb на порту номер 1234.

Следующим шагом для нас будет запуск клиентской части – отладчика arm-none-eabi-gdb. Для его запуска откроем новое окно терминала и получим права root:

$su
password
#cd /root/workspace/CMSIS_example/out
#arm-none-eabi-gdb CMSIS_example.out
(gdb) target remote localhost:1234
(gdb) break main
(gdb) continue
(gdb) step
(gdb) info all-registers

В результате выполнения последней команды на экран будет выведено содержание внутренних регистров ядра микроконтроллера STM32F103:

r0             0x0	0
r1             0x3807f024 0x940044324
r2             0x20000158 0x536871256
r3             0x20000158 0x536871256
r4             0x0	0
r5             0x0	0
r6             0x0	0
r7             0x3807ee48 0x940043848
r8             0x0	0
r9             0x0	0
r10            0x20000000 0x536870912
r11            0x0	0
r12            0x0	0
sp             0x3807ee48 0x3807ee48
lr             0xcd	205
pc             0xb8	0xb8 [init_all+4]
cpsr           0x60000030	0x1610612784

После успешной проверки работы симулятора в командной строке выполним настройку и запуск в интегрированной среде разработки Eclipse.
Аналогично настройке OpenOCD настроим запуск внешней по отношению к Eclipse программы qemu-arm. Для этого зайдем в пункт меню Run->
External Tools-> External Tools Configurations… и выполним настройки, как показано на следующем рисунке.

Для настройки конфигурации gdb заходим в меню Run-> Debug Configurations… и заполняем необходимые пункты в соответствии со следующими
рисунками.








Теперь все готово к запуску отладки программы с помощью программного симулятора. Выполняем сначала запуск qemu-arm нажатием Run->External Tools->qemu-arm-config, потом жмем Run->Debug(F11) для запуска отладчика arm-none-eabi-gdb.

Программа начнет выполнение(точнее симуляцию работы) с функции main(),поскольку мы поставили точку останова на входе в эту функцию. Далее можно выполнить пошаговое выполнение нажатием на клавишу «Step Info» на панели отладки или на функциональную клавишу F5.

«Дошагав» до функции LED_Config() буквально через пару шагов симуляция закончиться ошибкой. Ошибка эта связана с ображением к внутренним регистрам периферии микроконтроллера STM32F103RB, о которой наш симулятор совершенно ничего не знает.

Вспомните, ведь мы задали в опции -mcu cortex-m3, тоесть для отладки доступны лишь регистры ядра микроконтроллера STM32F103RB.
Одним из вариантов того, как можно обойти данную ситуацию является использование возможностей препроцессора.
Например , модифицируйте код функции LED_Config() следующим образом :

__INLINE static void LED_Config( void )
{
#ifndef DEBUG
  RCC-\APB2ENR |=  ( 1 \\ 4 )
  CRH |= 0x00050000;		
#endif/*DEBUG*/
}/* LED_Config */

Во время выполнения отладки укажите в Makefile в опциях компилятора -DDEBUG или же в иходном(заголовочном) файле пропишите #define DEBUG.
В результате этого весь код, зависимый от оборудования конктретной модели микроконтроллера, будет исключен при отладке. Мерцание светодиода можно заменить установкой/сбросом программного флага.

Настало время вернутся к вопросу об использовании симуляции микроконтроллеров ARM7TDMI. На самом деле с этой задачей запросто справляется сам arm-none-eabi-gdb. Как и в предыдущем случае для начала исследуем симуляцию из командной строки. Для этого будем использовать elf-файл проекта ARM7_project, описанного во второй части статьи «Программирование AVR и ARM микроконтроллеров в Eclipse». Откроем окно терминала и выполним следующие команды.

$su
password
# cd /root/workspace/ARM7_project
# arm-none-eabi-gdb main.out
(gdb) target sim
(gdb) load
(gdb) break main
(gdb) run
(gdb) step
(gdb) info registers-all

В результате выполнения последней команды на экране появится содержимое внутренних регистров ядра ARM7.

r0             0x0	0
r1             0x0	0
r2             0x0	0
r3             0x40000000	1073741824
r4             0x0	0
r5             0x0	0
r6             0x0	0
r7             0x0	0
r8             0x0	0
r9             0x0	0
r10            0x10c	268
r11            0x40000364	1073742692
r12            0x0	0
sp             0x40000364	0x40000364
lr             0x118	280
pc             0x1c8	0x1c8 [port_init+8]
f0             0	(raw 0x000000000000000000000000)
f1             0	(raw 0x000000000000000000000000)
f2             0	(raw 0x000000000000000000000000)
f3             0	(raw 0x000000000000000000000000)
f4             0	(raw 0x000000000000000000000000)
f5             0	(raw 0x000000000000000000000000)
f6             0	(raw 0x000000000000000000000000)
f7             0	(raw 0x000000000000000000000000)
fps            0x0	0
cpsr           0x600000df	1610612959

Настройки Eclipse для использования симуляции микроконтроллеров ARM7TDMI выглядят следующим образом.








Запускаем отладку Run->Debug и наблюдает окно отладчика, дальше процесс отладки происходит привычным для нас образом. Но опять
же не стоит забывать, что встретив на своем пути неизвестные названия внутренних регистров микроконтроллера, симулятор растеряется и заплачет вывалится с ошибкой.


P.S.: Интересным применением виртуальной ARM-машины может стать запуск на ней собранных Linux-образов для встраиваемых в микроконтроллеры Linux-систем. Можно начать исследование с готовых образов, предоставляемых производителями микроконтроллеров.
Например, с сайта http://www.at91.com/linux4sam/bin/view/Linux4SAM/ есть возможность загрузить образ Linux-системы для микроконтроллеров AT91SAM9 компании Atmel.

Leave a Reply

You must be logged in to post a comment.