[Перевод] Intel System Studio for Microcontrollers 2015: подробности о разработке и отладке

Мы уже рассказывали о том, как начать работу в Intel System Studio for Microcontrollers 2015 (ISSM) и создавать программы для Intel Quark D1000. Сегодня поговорим о том, как модифицировать в IDE Eclipse простую прошивку из примеров к ISSM. Так же рассмотрим работу с эталонной платой для проведения технических испытаний D1000 (Customer Reference Board, CRB). А именно, пользуясь JTAG-подключением, задействуем OpenOCD для того, чтобы прошить созданный нами образ в микроконтроллер и отладить код.

f2bb33ab88bc5a1888cbd07b11b5ba23.png


Среда разработки для Intel Quark D1000


Intel System Studio for Microcontrollers включает в себя C/C++ компилятор, основанный на LLVM (в его состав входят ассемблер, компоновщик и библиотеки времени выполнения C/C++), GDB-отладчик и внутрисхемный отладчик OpenOCD. ISSM можно использовать как самостоятельный набор инструментальных средств, но в нём есть и плагины для интеграции с IDE Eclipse.

Открываем проект прошивки в ISSM


Прежде чем создавать проект для Intel Quark D1000, нужно установить необходимое программное обеспечение. А именно: IDE Eclipse для C/C++ разработчиков, ISSM, Putty и Zadig. Инсталлируя программы, старайтесь внимательно следовать руководствам, которые можно найти в директории установки ISSM, в папке «docs». Здесь мы так же предполагаем, что вы разобрались с примерами «Hello World» и «FW» для IDE Eclipse. Если это не так, пожалуйста обратитесь к разделу руководства пользователя «Using the Eclipse IDE». Его тоже можно найти в вышеупомянутой папке «docs».
После того, как всё будет готово к работе, запустите Eclipse, воспользовавшись командным файлом «runEclipse.bat», указав в качестве аргумента ту папку, в которую установлена Eclipse. Затем откройте проект прошивки, в нашем случае это «FW-D1000», и выполните его сборку. Ошибок быть не должно.

После того, как прошивку удалось успешно собрать, найдите файл «FW-D1000.elf», который находится в папке проекта «Binaries». Его содержимое будет таким же, как на рисунке ниже. Если вам не удаётся увидеть разделы образа с информацией о символах, нужно проверить, установлена ли на компьютере утилита «objdump». Если она действительно не установлена, обратитесь к разделу «Viewing GNU Elf and Map Files» руководства пользователя для того, чтобы установить «objdump» и настроить путь к ней на компьютере.

713a47d866f71833b4c419d934db1bd2.png


Дамп объекта в файле FW-D1000.elf

Передача данных из обработчика аппаратного прерывания


После того, как стало ясно, что пример «FW-D1000» нормально компилируется, его можно изменить под собственные нужды. Здесь мы собираемся поменять строку, которую выводит в окно терминала программа «PushButton» из примера «FW-D1000».

Перейдите в папку «Applicaition» проекта «FW-D1000». В ней имеется 10 приложений-примеров для Intel Quark D1000. Просмотрите файл «AppConfig.h» для того, чтобы выяснить, какое именно приложение будет интегрировано в проект, и, при необходимости, измените файл так, чтобы этим приложением было «PUSH_BUTTON_TEST». Вот как выглядит файл, в котором включена интеграция в готовый проект того, что нам нужно.

//#define MAN_DECODING
//#define POWER_MANAGEMENT_TEST
#define PUSH_BUTTON_TEST
//#define ADC2SPI_TEST
//#define ADC2GPIO_TEST
//#define DDS_TEST
//#define OSCILLATOR_RE_TRIM
//#define PWM_TESTING
//#define MOTOR_CTRL
//#define UART_WAKE


Теперь перейдите в начальный файл приложения, «PushButton.c», который находится в папке «Applications», и слегка отредактируйте код. В результате, когда программа запустится устройстве, вы точно поймёте, что исполняется именно её изменённый вариант. Здесь мы подправили строку «rts_interrupt_msg». Эта строка будет выводиться каждую секунду по прерыванию часов реального времени (Real Time Clocl, RTC).

////////////////////////////////////////////////////////////////////////////////
// это функция обратного вызова для прерывания часов реального времени
////////////////////////////////////////////////////////////////////////////////
char rtc_interrupt_msg[] = "\r\nSean RTC interrupt!";
void rtc_callback_function_PB(void)
{
 PUSH_UART(rtc_interrupt_msg,sizeof(rtc_interrupt_msg),0,0);
 rtc_callback(rtc_callback_function_PB); // повторно регистрируем функцию обратного вызова
}


Изменив файл, сохраните его. Теперь всё готов к компиляции и прошивке образа на устройство.

Компиляция и прошивка образа на D1000


Для того, чтобы прошить скомпилированный образ на D1000, нужно установить JTAG-соединение с платой. В подробностях это описано в разделе руководства пользователя «Starting Debugging Session». Прежде чем открыть перспективу OpenOCD в Eclipse, проверьте, удалось ли OpenOCD успешно прочитать код «IdCode» целевого CPU, совпадает ли он с ожидаемым («Expected») кодом процессора.

В этом примере мы подключились по JTAG к D1000 и установили OpenOCD-соединение до запуска Eclipse. Иногда Eclipse не может прочитать «IdCode» и показывает вместо кода нули. Если это произошло, нажмите кнопку перезагрузки и посмотрите, удалось ли OpenOCD верно определить «IdCode». После того, как всё определилось, и вы дождались появления сообщений, вроде тех, что приведены на рисунке ниже, можно прошивать изменённый образ на D1000.

b985b5569bf26ca62079c12537fa4db3.png


Консоль OpenOCD при подключении к эталонной плате D1000

После того, как удалось установить JTAG-соединение с платой D1000, соберите проект «FW-D1000» в IDE Eclipse. Если в ходе сборки ошибок не обнаружится, в папке «Binaries» появится файл образа «FW-D1000.elf». Его можно будет прошить на устройство, воспользовавшись отладочной перспективой «Debug» в Eclipse, которая настроена на использование GDB через OpenOCD.

ef1e748e562120276a0e04202ca08636.png


Настройка отладчика для работы с эталонной платой D1000 с использованием OpenOCD

После прошивки образа появится сообщение об успешном завершении операции в консоли OpenOCD (взгляните на рисунок с консолью выше). В данном примере нужно, чтобы отладчик остановил процесс в функции «main» для пошагового исполнения.

На следующем рисунке показано, как задать точку останова на входе в «main». Отладчик, после завершения прошивки и загрузки образа, остановит процессор в начале функции и будет готов к пошаговому исполнению программы.

fe8c89ddd2864c3695d6fb3f5184cd01.png


Задаём точку останова в функции «main»

Теперь откроем консоль последовательного порта с помощью Putty. Нужно это для того, чтобы видеть UART-сообщения, которые будут выводиться, когда программа отправляет заданное сообщение по аппаратному событию прерывания часов реального времени (RTC) или при нажатии на кнопку (ButtonPress).

При подключении к плате D1000 в нашем распоряжении будут два USB-устройства. А именно, одно — это Dual RS232 HS, которое используется для JTAG-соединения OpenOCD, а второе — это USB-интерфейс к последовательному порту. Перед запуском приложения «PushButton» нужно открыть подключение к последовательному порту, используя клиент Putty со следующими настройками: Baudrate-19200, Flow Control-XON/XOFF.

Отладка: пошаговое исполнение кода


Когда завершится прошивка образа, начнётся отладка кода, с самого начала функции «main», как показано на рисунке ниже. В этом примере программа «PushButton» запускается, а затем отладчик ожидает вызова функции «PushButton», главной функции приложения. Тут же можно просматривать код, написанный на языке высокого уровня, а так же — машинные команды в окне «Disassembly», в котором подсвечивается инструкция текущего указателя команд.

Теперь можно приступать к отладке, выполнять шаги с обходом процедур (step over), шаги с заходом в процедуры (step into), возобновлять (resume) исполнение программы.

eea0ec5250713ef863978d006020520f.png


Отладчик остановил процессор в начале функции «main»

Здесь мы выполняем шаг с заходом в процедуру, затем видим исходный код входной функции «PushButton», отладчик открывает «PushButton.c» для того, чтобы указать на следующую исполняемую функцию.

8d396cd26c4184fcd2c7ec28a9b29ffe.png


Шаг с заходом в процедуру, выполненный из «main»

Запуск примера на D1000


В итоге, мы можем возобновить исполнение программы, она будет работать в обычном режиме. Если теперь взглянуть на окно терминала Putty, можно увидеть журнал сообщений от D1000. Сообщения, содержащие именно ту строку, которую мы выше модифицировали в коде примера, выводятся по прерываниям часов реального времени.

2400085c9896371bc252d3ead957e76b.png


Тестовый вывод программы, выполняемой на D1000

Об аппаратном обеспечении


Эталонная плата для проведения технических испытаний (CRB V2) содержит следующие компоненты:

  • Микроконтроллер Intel Quark D1000.
  • Акселерометр.
  • Флэш-память SPI.
  • Адаптер Bluetooth LE.
  • Модуль последовательного порта для WiFi.
  • Конвертер последовательного порта для USB и JTAG.
  • Модуль электропитания.
  • Цепь зарядки батареи.


Микроконтроллер Intel Quark D1000


У контроллера имеется 24 вывода GPIO, многие из которых многофункциональны (подробности о них смотрите в таблице). CRB V2 обеспечивает подключение этих выводов к контактным площадкам монтажной платы, которая очень напоминает Arduino, но не полностью совместима с этим стандартом. Стоит отметить, что несколько выводов, кроме того, подключены к периферийным устройствам, размещённым на плате. В некоторых случаях их нельзя использовать в роли многофункциональных выводов. Они отмечены в таблице и в описании аппаратных компонентов платы, которое приведено ниже. А именно, при описании выводов приведены их названия для микроконтроллера D1000, для Arduino и для платы CRB V2. Обратите внимание на то, что интерфейс SPI применяется для связи со всеми встроенными в плату периферийными устройствами с использованием следующих контактов:

  • MST_M2SC (выход сигнала синхронизации передачи данных SPI, Arduino — D13, CRB v2 — XPB5).
  • MST_M2SD (выход последовательной передачи данных (MOSI) SPI, Arduino — D11, CRB v2 — XPB3).
  • MST_S2MD (вход последовательного приёма данных (MISO) SPI, Arduino — D12, CRB v2 — XPB4).


Подключение выводов Intel Quark D1000 к CRB v2

6f8b2b0d5edddea6b7560ca26567256d.png

Плата CRB V2, кроме того, включает в себя некоторые другие компоненты, поведением которых нельзя управлять с помощью микроконтроллера D1000.

  • FTDI FT2232H — микросхема конвертера последовательного порта для USB и JTAG. Она используется для обеспечения консольного (UART) подключения к D1000, для программирования и отладки с использованием интерфейса JTAG. Светодиоды D6 (жёлтый) и D7 (зелёный) подключены к FTDI FT2232H, они мигают, когда устройство принимает или отправляет данные.
  • Контроллеры Linear Technologies LTC4414, Texas Instruments BQ24080, Maxim Integrated MAX8869 применяются для организации электропитания и зарядки батареи. Светодиоды D10 и D11 подключены к BQ24080 и служат для индикации состояния заряда батареи.


f2bb33ab88bc5a1888cbd07b11b5ba23.png


Схема платы Intel Quark D1000 CRB v2

Выводы


Теперь вы знаете, как работать с прошивками для Intel Quark D1000 в IDE Eclipse. Вы умеете их редактировать, записывать на устройство, тестировать и отлаживать код. Так же мы рассказали об эталонной плате для проведения технических испытаний (CRB V2), которая, помимо Quark D1000, включает в себя набор дополнительных компонентов. Здесь и здесь вы можете найти подробности об Intel Quark D1000, а вот тут — об ISSM.

© Habrahabr.ru