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

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

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

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

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

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

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

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

Многих, возможно, этот список может разочаровать, поскольку в нем нету ядра 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.
Можно просто перейти в этот каталог:

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

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

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

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

После успешной проверки работы симулятора в командной строке выполним настройку и запуск в интегрированной среде разработки 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() следующим образом :

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

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

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

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








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


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

Viewed 1880 times by 710 viewers

Leave a Reply

You must be logged in to post a comment.