28 января 2014 г.

Разработка приложений в среде Eclipse, язык Си

В данной статье мы расскажем, как можно создавать приложения для микроконтроллеров AVR с использованием среды Eclipse и комплекта AVR-GCC. Этот материал будет полезен разработчикам, желающим освоить новую для себя среду, значительно упрощающую написание программ на C/C++.



Eclipse  – интегрированная среда разработки (IDE), первоначально предназначавшаяся для разработки Java-приложений. Однако благодаря развитой поддержке подключаемых модулей сфера ее применения стала существенно шире. Добавление модуля C/C++ Development Tools превратило Eclipse в полнофункциональную среду разработки программ на С/С++. 
Eclipse входит в состав всех популярных дистрибутивов Linux. Помимо среды разработки, нам потребуется модуль CDT.
При необходимости Eclipse и CDT можно загрузить с сайта проекта  и установить их в системе в соответствии с имеющимися инструкциями. Для работы Eclipse также потребуется инсталлировать среду исполнения Java (например,отсюда).


В состав репозиториев многих дистрибутивов GNU/Linux входит комплект программ AVR-GCC. Основу комплекта составляют программы avr-binutils, avr-gcc и avr-libc. Их можно дополнить утилитами  для внутрисхемного программирования (uisp, avrdude), моделирования процессора (simulavr) и отладки (avr-gdb и avarice).
Краткое описание программ:
avr-gccКомпилятор и ассемблер
avr-binutilsКомпоновщик и несколько полезных инструментов
avr-libcСтандартная библиотека C, предназначенная для совместного использования с GCC на микроконтроллерах Atmel AVR
avr-gdbОтладчик для AVR
uispУтилита для загрузки программ в процессоры AVR и считывания из них
avrdudeУтилита, во многом аналогичная uisp.
avariceСредство сопряжения avr-gdb с устройством AVR JTAG ICE
Для создания AVR-приложений необходимо установить хотя бы первые три пакета из этой таблицы.



Если вы хотите использовать Eclipse для разработки avr-приложений, то можно пойти двумя разными путями. Первый способ – ручная настройка проекта. При таком подходе в стандартном проекте C/C++ параметры для вызова GCC заменяются настройками для AVR-GCC. Второй путь – использование готового модуля расширения, специально предназначенного для разработки AVR-проектов в среде Eclipse. В статье мы рассмотрим оба варианта.
Достоинства ручной настройки проекта C/C++ для работы с AVR в Eclipse очевидны – независимость от сторонних подключаемых модулей позволяет сконфигурировать установленные на любой платформе Eclipse и CDT для работы с AVR-приложением (лишь бы для данной среды имелся набор программ AVR-GCC). Более того, знание необходимых команд и параметров дает возможность собрать приложение даже при отсутствии IDE в системе.
Недостаток также очевиден – нужно помнить все параметры настройки и затратить некоторое время на подготовку при создании нового проекта.
Рассмотрим ручную настройку по шагам (здесь и далее используются снимки экрана, сделанные на русифицированной версии Eclipse, пакет для локализации входит в состав Eclipse начиная с версии 3.1.1).
  1. Создайте стандартный С или С++ проект. Для этого выберите в меню Файл >Создать >Проект (рисунок 1).

    Рисунок 1. Создание нового стандартного C/C++ проекта
    Рисунок 1. Создание нового стандартного C/C++ проекта
  2. В открывшемся окне с мастерами настройки выберите C или C++ в зависимости от используемого в проекте языка и раскройте выбранную папку. Затем нужно выбрать «C++ Project» (или «С Project») и нажать кнопку «Далее >» (рисунок 2).

    Рисунок 2. Выбор мастера проекта
    Рисунок 2. Выбор мастера проекта

    В прежних версиях CDT было два отдельных типа проекта: «Managed make» (makefile создается автоматически) и «Standard make» (для сборки требовалось предоставить собственный makefile). Начиная с версии CDT 4.0 выбор типа проекта определяет, какая система сборки будет использоваться.
    В поле «Project name» введите имя проекта (например, «test»), в поле «Project type» выберите тип «Executable», «Empty Project» и нажмите кнопку «Готово» (рисунок 3).


    Рисунок 3. Выбор типа проекта
    Рисунок 3. Выбор типа проекта

    Это приведет к созданию пустого (без исходных файлов) проекта с двумя стандартными конфигурациями сборки «Debug» и «Release», причем активной конфигурацией по умолчанию является «Debug». Если вместо кнопки «Готово» нажать кнопку «Далее >», то в открывшемся окне можно отключить ненужную конфигурацию сборки (например, «Debug»).
  3. Перейдем к настройкам проекта: нужно выбрать в списке папку проекта и открыть окно параметров. Это можно сделать с помощью меню «Проект->Свойства», либо нажав правую кнопку мыши на папке и выбрав в выпадающем меню пункт «Свойства». Далее по пути «C/C++ Build->Settings», вкладка «Tool Settings», переходим к настройкам компилятора и компоновщика (рисунок 4).

    Рисунок 4. Окно с настройками компилятора
    Рисунок 4. Окно с настройками компилятора

    Раздел «GCC C++ Compiler».
    В поле «Command» вместо gcc необходимо вписать avr-g++ -mmcu=atmega128 (здесь нужно указать процессор из приведенного в документации на avr-libcи (EN) списка).
    «Directories»: в поле «Include Paths» потребуется ввести путь к заголовочным файлам, /usr/avr/include (если используется отличная от общепринятой сборка avr-libc, то путь может быть другим).
    Разделы «Debugging» и «Optimization» уже содержат приемлемые параметры в зависимости от выбранной конфигурации сборки («Debug» или «Release»). Если нужен, например, флаг оптимизации «-Os», то его можно вписать в поле «Other optimization flags».
    Если в проекте используется не С++, а просто С, то нужно аналогичным образом заполнить ветку «GCC C Compilator» за исключением поля «Command», куда требуется вписать avr-gcc -mmcu=atmega128 (тип процессора указан для примера).
    Раздел «GCC-C-Linker».
    В поле «Command»: gcc меняем на avr-gcc -mmcu=atmega128.
    «Libraries»: здесь в поле «Library Search Path» необходимо вписать /usr/avr (этот путь тоже может отличаться в некоторых сборках).
    «Miscellaneous»: в поле «Linker Flags» пишем -Wl,-Map,test.map (test – имя проекта). Это дает нам возможность получить карту памяти.
    Раздел «GCC Assembler».
    В поле «Command»: as меняем на avr-as -mmcu=atmega128.
    Настройки индексирования можно оставить стандартные.
    Для получения приложения в формате Intel-hex, пригодном для загрузки в avr-устройство, нужно перейти на вкладку «Build steps» и вписать в поле «Post-build steps», «Command» такую команду:
    avr-objcopy -j .text -j .data  -O ihex test.elf test.hex
    

    Для получения дизассемблерного листинга можно добавить в это поле через точку с запятой еще одну полезную команду:
    avr-objdump -h -S test.elf >test.lss

    Если в проекте используется инициализация переменных, хранящихся в eeprom, то нужно добавить еще одну команду:
    avr-objcopy -j .eeprom --change-section-lma .eeprom=0 -O ihex test.elf test.eep
    

    Все команды для удобства (если это кому-то действительно кажется удобным) можно записать в отдельный скрипт, например, так:
    #!/bin/sh
    avr-objcopy -j .text -j .data  -O ihex test.elf test.hex
    avr-objdump -h -S test.elf >test.lss
    #avr-objcopy -j .eeprom --change-section-lma .eeprom=0 -O ihex test.elf test.eep
    

    и вместо длинного перечня вписать в поле «Post-build steps», «Command» только имя этого скрипта.
    При наличии программатора можно настроить загрузку полученного hex-файла в AVR-устройство. Это делается следующим образом:
    «Проект->Свойства->C/C++ Build->Build Steps->Pre-Build-Step->Command» – здесь нужно вписать команду:
    uisp -dprog=stk200 -dserial=/dev/ttyS0 -dpart=atmega128 —erase, 
    

    где stk200 – тип используемого программматора, /dev/ttyS0 – последовательный порт, к которому он подключен, atmega128 – тип процессора. Приведенная команда стирает память процессора.
    Для загрузки hex-файла в процессор и проверки записанных данных, в поле
  4. «Проект->Свойства->C/C++ Build->Build Steps->Post-build steps->Command» вносим команду:
    uisp -dprog=stk200 -dserial=/dev/ttyS0 -dpart=atmega128 --upload if=test.hex —verify
    
Как уже говорилось, основной недостаток ручной настройки Eclipse CDT для AVR-проектов состоит в том, что нужно помнить множество параметров и при создании нового проекта тратить некоторое время на подготовку.
Эти проблемы легко решаются с помощью подключаемого модуля AVR Eclipse Plugin. Он упрощает и ускоряет подготовку проекта к разработке, поскольку содержит хорошо продуманные параметры настройки. Ниже приведен перечень основных достоинств AVR Eclipse Plugin:
  • выбор целевого процессора из списка;
  • создание hex-файлов для загрузки в AVR-процессор;
  • специальное средство просмотра информации по выбранному AVR-процессору;
  • удобный редактор специальных битов процессора;
  • поддержка avrdude для загрузки приложения в целевой процессор.
Кроме того, нет необходимости вручную редактировать параметры команд для сборки проекта.
Модуль прошел довольно длинный путь развития. Томас Холланд (Thomas Holland) написал первую версию AVR Eclipse Plugin в середине 2007 года, пытаясь усовершенствовать модуль Питера Винтера (Peter Winter), который был впервые опубликован летом 2005 года.
За такое большое время AVR Eclipse Plugin вобрал в себя множество предложений и замечаний от использовавших его разработчиков, поэтому теперь он может считаться зрелым продуктом.
Основной его недостаток – возможное несоответствие версии AVR Eclipse Plugin версиям установленных Eclipse и CDT. При обновлении Eclipse или CDT может возникнуть ситуация, когда AVR Plugin перестанет работать. Кроме того, иногда требуется продолжить работу над существующим проектом в другой системе, где в Eclipse не установлен используемый AVR Plugin. Тогда при открытии проекта возникнут странные сообщения об ошибках, источник которых не вполне очевиден.
Еще один недостаток является следствием достоинств AVR Plugin – пользуясь им, разработчик теряет навыки работы с комплектом AVR-GCC, и в результате полностью зависит от подключаемого модуля.
Инсталляцию модуля можно произвести двумя способами: через систему обновлений программного обеспечения Eclipse и путем непосредственной загрузки пакета и установки его вручную. Рассмотрим по шагам первый вариант:
  1. Откройте диалог обновлений программного обеспечения («Справка>Software Updates...»).
  2. Выберите вкладку «Available Software», нажмите кнопку «Add Site...», расположенную справа, и введите адрес сайта обновлений: http://avr-eclipse.sourceforge.net/updatesite/ (EN)
  3. Затем нажмите OK. Теперь адрес этого сайта будет виден в списке сайтов обновлений. Выберите "AVR Eclipse Plugin" и нажмите кнопку «Install...» в верхнем правом углу (рисунок 5).

    Рисунок 5. Установка подключаемого модуля
    Рисунок 5. Установка подключаемого модуля
  4. Через некоторое время модуль установится и вам будет предложено перезапустить Eclipse.
Если вы не хотите использовать средства обновления Eclipse, то можно непосредственно загрузить модуль с sourceforge и установить его самостоятельно.
Для этого зайдите на страницу загрузок и скачайте последнюю версию пакета.
Затем распакуйте полученный файл в свой домашний каталог ~/.eclipse (обратите внимание, что для каждой версии Eclipse там создается свой подкаталог) или в общесистемный (например, /usr/share/eclipse, потребуются права root) и перезапустите Eclipse.
Если установка прошла успешно, то в «Справка>Оглавление справки» можно увидеть документ «Avr Plugin», а в мастере проектов "New C Project" и "New C++ Project" появятся записи «AVR Cross Target Application» и «AVR Cross Target Static Library» (рисунок 6).

Рисунок 6. Справка по AVR Plugin
Рисунок 6. Справка по AVR Plugin 
Для того чтобы создать новый AVR-проект, необходимо сделать следующие шаги:
  1. Выберите в меню «Файл->Создать->Проект».
  2. В появившемся окне выберите, какой проект вы собираетесь создать. Например, разверните папку «C++», выберите «С++ Project» и нажмите кнопку «Далее >» (рисунок 7).

    Рисунок 7. Выбор мастера нового проекта
    Рисунок 7. Выбор мастера нового проекта

    Откроется окно выбора типа проекта. AVR Plugin предлагает два варианта:
    • «AVR Cross Target Application» – для создания приложения, которое может быть загружено в AVR-процессор;
    • «AVR Cross Target Static Library» – для создания библиотек часто используемых функций, которые потом можно скомпоновать с программами.
  3. Выберите «AVR Cross Target Application>Empty Project» и введите имя проекта. Нажмите кнопку «Далее >» (рисунок 8).

    Рисунок 8. Выбор типа проекта
    Рисунок 8. Выбор типа проекта
  4. Теперь можно выбрать автоматически создаваемые конфигурации сборки, которые позволяют собирать проект из одних и тех же исходных файлов, но с разными параметрами и настройками. По умолчанию предлагаются два набора настроек:
    • «Debug» – настройки основываются на предположении, что предстоит отладка приложения;
    • «Release» – с этими настройками сразу создаются hex-файлы, которые можно загрузить в реальный процессор (рисунок 9).


    Рисунок 9. Выбор конфигураций сборки
    Рисунок 9. Выбор конфигураций сборки

    Если воспользоваться кнопкой «Advanced settings...», то можно перейти к созданию дополнительных конфигураций сборки (например, с использованием другого процессора), но все это можно сделать и позже, когда проект уже создан.
  5. Нажмите «Далее >», и появится окно выбора типа процессора и его тактовой частоты. Тип процессора потом будет подставляться в параметры компилятора и компоновщика, а таковая частота используется только для определения переменной F_CPU, которая может быть использована в приложении (рисунок 10).

    Рисунок 10. Выбор процессора и его тактовой частоты
    Рисунок 10. Выбор процессора и его тактовой частоты
  6. Нажмите «Готово».
    Ваш новый проект появится в списке проектов на вкладке C/C++ Projects, а также в навигаторе. Просмотреть и изменить его настройки можно, нажав правую кнопку мыши в списке проектов и выбрав «Свойства» из выпадающего меню.
Проект получился пустой, потому что ни одного файла в него еще не добавлено. Чтобы создать новый файл, проделайте следующие операции:
  1. В окне просмотра проектов нажмите правую кнопку мыши на папке test и выберите в выпадающем меню «New->Source File». Можно пойти по пути «New->File from Template»; тогда, в соответствии со стандартным шаблоном, в начало файла добавится название файла, дата его создания, а также имя пользователя.
  2. В поле «Source File» напишите имя файла: main.cpp.
  3. Нажмите кнопку «Готово».
  4. Теперь можно написать текст программы, например, такой:
int main(void)
{
 const int some_size = 1000;

 while(true)
  {
  for (int i = 0; i < some_size; i++)
   int a = 3; // какое-нибудь действие
  }

 return 0; // никогда не дойдет сюда
}

Теперь, когда создан проект и в нем есть С++ программа, можно этот проект собрать. Обратите внимание на параметр «Проект->Автоматическая компоновка». Если он включен, то при сохранении любого файла будет произведена сборка проекта. Для больших проектов этот параметр лучше отключить, чтобы не ждать слишком долго завершения сборки после каждого сохранения. В таком случае разумно будет сделать, чтобы Eclipse автоматически сохраняла все открытые файлы. Для этого нужно открыть настройки («Окно->Параметры...») и перейти к вкладке «Общие->Рабочая область», затем можно включить параметр «Автоматически сохранять перед компоновкой» (рисунок 11).

Рисунок 11. Настройка автоматического сохранения
Рисунок 11. Настройка автоматического сохранения 
Проект будет собран с использованием конфигурации сборки Debug, потому что она является активной по умолчанию. Журнал процесса сборки выводится в окно Console (в нижней части окна Eclipse):
**** Build of configuration Debug for project test ****

make all 
Building file: ../main.cpp
Invoking: AVR C++ Compiler
avr-g++ -Wall -g2 -gstabs -O0 -fpack-struct -fshort-enums -funsigned-char
  -funsigned-bitfields -fno-exceptions -mmcu=atmega128 -DF_CPU=11059200UL
  -MMD -MP -MF"main.d" -MT"main.d" -c -o"main.o" "../main.cpp"
../main.cpp: In function 'int main()':
../main.cpp:8: warning: unused variable 'a'
Finished building: ../main.cpp
 
Building target: test.elf
Invoking: AVR C++ Linker
avr-g++ -Wl,-Map,test.map,--cref -mmcu=atmega128 -o"test.elf"  ./main.o   
Finished building target: test.elf
 
Invoking: AVR Create Extended Listing
avr-objdump -h -S test.elf  >"test.lss"
Finished building: test.lss
 
Invoking: Print Size
avr-size --format=berkeley -t test.elf
   text    data     bss     dec     hex filename
    272       0       0     272     110 test.elf
    272       0       0     272     110 (TOTALS)
Finished building: sizedummy
 

**** Build of configuration Release for project test ****

Еще немного о функциональности AVR Plugin.
В свойствах проекта («Проект->Свойства->C/C++ Build->Settings») есть раздел «Additional Tools in Toolchain», в котором можно включить параметры «Generate HEX file for Flash memory» (создание прошивки для памяти программ процессора) и «Generate HEX file for EEPROM» (создание прошивки для энергонезависимой памяти данных). В конфигурации сборки Release эти параметры включены (рисунок 12).

Рисунок 12. Включение создания hex-файлов
Рисунок 12. Включение создания hex-файлов 

Рисунок 13. Параметры avrdude
Рисунок 13. Включение создания hex-файлов 
AVR Plugin может работать со множеством программаторов, для этого используется утилита avrdude. В разделе настроек «Проект->Свойства->AVR->AVRDude» есть возможность выбора типа программатора и режима его работы. Кроме того, здесь настраивается прошивка битов безопасности и конфигурационных битов. Если программатор настроен, то собранную программу из Eclipse можно загрузить в процессор, для чего в главном меню есть пункт: «AVR->Upload Project to Target Device».

Рисунок 14. Включение средства просмотра информации по процессору
Рисунок 14. Включение средства просмотра информации по процессору 
AVR Plugin предоставляет специальное средство просмотра информации по выбранному AVR-процессору. Она строится на основе соответствующего заголовочного файла, поэтому в некоторых случаях может оказаться неполной. И все-таки, когда нужно оперативно узнать правильное название какого-нибудь регистра или вектора прерывания, эта информация окажется полезной. Чтобы открыть окно просмотра, выберите «Окно-> Показать панель->Прочие...», найдите «AVR», выберите «AVR Device Explorer» и нажмите OK. Окно появится в нижней части экрана (рисунок 15).

Рисунок 15. Окно просмотра информации по выбранному процессору
Рисунок 15. Окно просмотра информации по выбранному процессору 
Подробную инструкцию по работе с AVR Plugin можно найти в документации, которая находится в справочной системе Eclipse: «Справка->Оглавление справки->AVR Plugin».



Отладку AVR-программ в Eclipse можно производить с использованием как avarice, так и simulavr, при этом первая утилита предназначена для внутрисхемной отладки, а вторая служит для моделирования процессора. Собственно отладчиком является avr-gdb, он связывается с avarice или simulavr через TCP-сокеты с помощью специального последовательного протокола gdb. Этот протокол дает возможность avr-gdb посылать команды типа «установить/удалить точку останова» и «читать/записать память».
Avarice преобразует команды в протокол Atmel, используемый для управления устройством AVR JTAG ICE, подключенным к последовательному порту, которое и обеспечивает внутрисхемную отладку микроконтроллера AVR Atmel.
Поскольку avr-gdb и avarice общаются между собой через TCP-сокеты, они могут быть запущены на разных компьютерах, что повышает удобство процесса отладки.
Запуск simulavr:
simulavr -g -p 1212 -d atmega128 -P simulavr-disp

Запуск avarice:
avarice -j /dev/ttyS0 -P atmega128 :1212

Обе утилиты работают как серверы, слушающие порт 1212 и выполняющие команды отладки.
Необходимо создать новую цель отладки, для чего нужно перейти в свойства проекта «Проект->Свойства->Run/Debug Settings» и нажать кнопку «New» (рисунок 16).

Рисунок 16. Создание цели отладки
Рисунок 16. Создание цели отладки 
Далее следует выбрать «C/C++ Local application» и внести следующие изменения в настройки:
  • на вкладке «Debugger»;
  • в поле «Debugger» выбрать «gdbserver Debugger»;
  • в поле «Main->GDB debugger» указать путь к avr-gdb (/usr/bin/avr-gdb);
  • включить «Verbose console mode»;
  • вкладка «Connection»: TCP, localhost, port 1212 (см. вызов simulavr/avarice).
В случае работы с simulavr необходимо предусмотреть возможность загрузки скомпилированного elf-файла в avr-gdb, а уже из avr-gdb он будет загружен в simulavr. Это делается с помощью файла .gdbinit, расположенного в каталоге проекта. Файл должен содержать следующие команды:
file link.elf
targ rem :1212
load


Мы узнали, как можно быстро начать разрабатывать AVR-приложения в удобной и многофункциональной кроссплатформенной среде Eclipse. Однако программирование микроконтроллеров Atmel AVR слишком широкая тема, чтобы ее можно было уместить в узкие рамки одной статьи. В дальнейшем мы еще будем возвращаться к данной теме, а также рассказывать о среде разработки Eclipse.


___

Комментариев нет:

Отправить комментарий