Нередко в практике разработчика возникают ситуации, когда программное обеспечение (ПО) для микроконтроллера
приходится писать в отсутствии под рукой аппаратной платформы.
Например, печатная плата устройства отдана на подготовку к производству, а времени ждать
готовое устройство для тестирования на нем программного обеспечения нет.
В таких случаях для оценки работоспособности ПО можно воспользоваться программным симулятором целевого микроконтроллера.
Для интегрированной среды разработки Eclipse CDT в качестве программного симулятора микроконтроллеров ARM можно использовать симулятор (или виртуальную машину,если быть точным) qemu-arm с интерфейсом командной строки.
Сразу хочу обрадовать пользователей операционной системы Linux( Fedora Electronic Lab ) — этот симулятор уже установлен в базовой версии FEL. Проверить наличие симулятора в Вашей Linux-системе, а заодно и просмотреть список поддерживаемых микроконтроллеров, можно следующим образом:
1 |
$qemu-arm -cpu ? |
В ответ на эту команду симулятор выдаст на экран список поддерживаемых микроконтроллеров:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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.
Можно просто перейти в этот каталог:
1 2 3 |
$su password #cd /root/workspace/CMSIS_example/out |
Далее запустим виртуальную машину с образом нашей программы:
1 |
#qemu-arm -cpu cortex-m3 -B 0x08000000 -g 1234 CMSIS_example.out |
Программа после запуска будет ожидать соединения с arm-none-eabi-gdb на порту номер 1234.
Следующим шагом для нас будет запуск клиентской части — отладчика arm-none-eabi-gdb. Для его запуска откроем новое окно терминала и получим права root:
1 2 3 4 5 6 7 8 9 |
$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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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() следующим образом :
1 2 3 4 5 6 7 |
__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». Откроем окно терминала и выполним следующие команды.
1 2 3 4 5 6 7 8 9 10 |
$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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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-систем. Можно начать исследование с готовых образов, предоставляемых производителями микроконтроллеров.
Например, с сайта https://www.at91.com/linux4sam/bin/view/Linux4SAM/ есть возможность загрузить образ Linux-системы для микроконтроллеров AT91SAM9 компании Atmel.
Viewed 66200 times by 14488 viewers