28 января 2014 г.

Среда Разработки Code::Blocks для AVR, язык Си

Сейчас мы расскажем, как как создавать приложения для микроконтроллеров AVR программируя на языке Си, с помощью среды разработки Code::Blocks.




Знакомство со средой

Code::Blocks – свободная кроссплатформенная интегрированная среда разработки приложений. В ее основе лежит архитектура подключаемых модулей, что дает возможность неограниченно расширять возможности среды. 
Среди возможностей среды хотелось бы особо выделить следующие:
  • подсветка синтаксиса, которую можно настраивать по своему усмотрению и дополнять;
  • сворачивание блоков текста программы;
  • настраиваемое дополнение кода и обозреватель классов;
  • гибкая обработка отступов;
  • поддержка различных стилей форматирования исходного текста, причем их можно настраивать по своему усмотрению.
Code::Blocks поддерживает множество компиляторов, в том числе целый ряд компиляторов для микропроцессоров:
  • GNU ARM GCC Compiler
  • GNU AVR GCC Compiler
  • SDCC (Small device C compiler)
Code::Blocks работает непосредственно в операционной системе, не требуя каких-либо интерпретаторов, отсюда легкость и быстрота этой IDE.
Кроме того, ее легко можно использовать совместно с GDB для отладки программ.

Code::Blocks ориентирована на разработку приложений на языках C и C++ и входит в состав всех современных популярных дистрибутивов Linux. Официальная версия 8.02 (на ноябрь 2009).

Вам наверное известно, что для создания AVR-приложений необходимо, чтобы были установлены три основных пакета из комплекта AVR GCC:
- avr-gcc (компилятор и ассемблер),
- avr-binutils (компоновщик и ряд полезных инструментов)
- avr-libc (стандартная библиотека С для процессоров Atmel AVR).

Современные популярные дистрибутивы Linux содержат пакеты AVR GCC в своих репозиториях. Теперь, когда установлены и Code::Blocks, и AVR GCC, можно приниматься за дело.



Первый запуск

При первом же запуске Code::Blocks становится понятно, что интерфейс вцелом достаточно знаком по работе с другими средами разработки. Привычные пункты меню, панель просмотра проектов, дерево файлов, окно вывода компилятора и отладчика, кнопки на панели инструментов, см. рис.1.
Слева расположена панель «Management», три вкладки которой так или иначе имеют отношение к проекту. На первой вкладке, «Projects», приводится список открытых в рабочем пространстве проектов и файлов этих проектов. Файлы автоматически разделяются на три секции: «Sources» («исходные тексты»), «Headers» («заголовочные файлы» и «Others» («другие»). Двойное нажатие на имени файла открывает его в редакторе. На вкладке “Symbols” приводятся все функции, переменные, перечисления, директивы препроцессора и классы, существующие в проекте. Двойное нажатие на любом из этих элементов приведет к перемещению на него курсора в редакторе.
Окно сообщений «Logs & others», расположенное внизу, служит для вывода сообщений (в этом окне также несколько вкладок). На вкладке “Code::Blocks” выводятся сообщения среды, здесь можно получить информацию о возникновении в ней проблем. Вкладка “Build log” показывает команды, выполняемые в процессе сборки приложения. И последняя вкладка “Build messages” предназначена для вывода ошибок и предупреждений компилятора (в сообщения включаются имя файла и номер строки, где найдена ошибка).
Рис.1. Общий вид Code::Blocks
Рисунок 1. Общий вид Code::Blocks

Создание проекта

Если еще ни одного проекта в рабочем пространстве не создано, то после запуска Code::Blocks в центральной панели активна только вкладка «Start here». Для создания нового проекта нужно выбрать команду «Create a new project» или пункт меню «File->New->Project». В любом случае откроется окно выбора шаблона будущего проекта, в котором мы указываем шаблон «AVR Project» и нажимаем кнопку «Go».
Появится приветственное окно мастера создания AVR-проекта. Нажмите кнопку «Next» и в открывшемся диалоговом окне введите название проекта и каталог, в котором он будет находиться. На основании этих данных программа автоматически предложит пользователю имя файла проекта с расширением *.cbp и каталог проекта, который будет создан. Далее следует нажать кнопку «Next».
В следующем окне предлагается выбрать конфигурации сборки, которые будут использоваться в проекте. По умолчанию активны обе конфигурации: Debug и Release. Компилятор «GNU AVR GCC Compiler» указан заранее. Также здесь можно изменить стандартные каталоги для скомпилированных файлов конфигураций.
В следующем окне мы указываем тип целевого процессора, выбрав его из выпадающего списка (позже это можно сделать в параметрах компиляции). Если в проекте используется внешняя память, стоит указать ее параметры. Далее следует задать значение глобальной переменной проекта F_CPU, указав тактовую частоту процессора в герцах. По умолчанию включено создание файла карты символов (.map) и hex-файлов, а также файла дизассемблерного листинга (.lss). Еще полезно включить параметр «Run avr-size after build» – тогда в конце журнала сборки проекта появится информация о том, сколько места будет занято в памяти программ и в оперативной памяти. По какой-то причине включение параметра создания листинга не оказывает никакого действия при создании проекта, и нужно вручную добавить соответствующую команду в «Pre/post build steps». Нажмите кнопку «Finish» (рисунок 2).
Рисунок 2. Последнее окно мастера создания AVR-проекта
Рисунок 2. Последнее окно мастера создания AVR-проекта
Проект создан, и в него автоматически добавлен первый файл – main.c.

Настройка проекта и среды разработки

Если проект создан с помощью шаблона AVR-проекта, то практически сразу можно перейти к программированию. Тем не менее, мы пройдемся по основным параметрам, чтобы убедиться, что все настроено правильно.
  1. Выберите пункт меню «Project->Build options». Откроется окно настроек параметров сборки (рисунок 3). В левой панели находится дерево целей сборки. На самом верхнем его уровне – настройки сборки для всего проекта. Удобнее всего сначала указать параметры для всего проекта, а уже затем добавлять что-то в отдельных вариантах сборки.
    Рисунок 3. Параметры сборки проекта
    Рисунок 3. Параметры сборки проекта
    Прежде всего нужно убедиться в том, что в поле «Selected Compiler» выбран «GNU AVR GCC Compiler». Ниже, на вкладке «Compiler Flags», приводятся флаги компилятора. По умолчанию здесь уже включен полезный флаг «Enable all compiler warnings». Также стоит убедиться в том, что мы правильно выбрали тип процессора, для которого разрабатывается проект.
    На вкладке «#defines» показано значение переменной F_CPU, если оно было задано при создании проекта.
    На вкладке «Linker Options» в панели «Other linker options» видно, что компоновщику задан правильный параметр -mmcu, а в левой панели «Link libraries» нужно указать необходимые для проекта библиотеки, если они есть.
    Перейдите к вкладке «Search directories». Ниже, на вкладке «Compiler», нужно вставить путь к заголовочным файлам, например, /usr/avr/include/. Для этого воспользуйтесь кнопкой «Добавить» и впишите правильный путь. Аналогично, на вкладке «Linker» указываем путь к библиотекам AVR GCC, например, /usr/avr/lib.
    Вкладка «Pre/post build steps». В поле «Post-build steps» можно увидеть команды для запуска утилит avr-size, avr-objcopy, avr-objdump. Например, для получения листинга (поскольку включение параметра «Create extended listing file» в мастере создания проекта не производит нужного эффекта, по крайней мере в версии 8.02) добавляем такую команду:
    avr-objdump -h -S $(TARGET_OUTPUT_FILE) > $(TARGET_OUTPUT_FILE).lss
    Если теперь с параметров всего проекта переключиться на более конкретные цели сборки, например, Debug или Release, то можно внести некоторые изменения в параметры сборки. При этом обратите внимание на то, что стал доступен параметр «Policy». Его стандартное значение – «Append target options to project options», т.е. к общим параметрам проекта добавляются параметры для конкретной цели сборки. Есть и другие варианты объединения настроек разных уровней. Это позволяет гибко настраивать проект, не повторяя уже введенные общие параметры.
    Стандартные настройки предусматривают автоматическое включение создания отладочной информации в цели Debug (параметр «-g») и оптимизацию размера полученной программы в цели Release (параметр «-Os»).
  2. Выберите пункт меню «Project->Properties». Здесь стандартные настройки вполне подходят, чтобы начать работать с проектом, ничего в них не меняя. Стоит обратить внимание на вкладку «Build targets». Для каждой цели сборки (по умолчанию: Debug и Release) указывается, куда записываются получаемые объектные файлы, а в поле «Build target files» можно задавать, какие исходные файлы участвуют в данной сборке (рисунок 4).
    Рисунок 4. Настройки целей сборки
    Рисунок 4. Настройки целей сборки
    При желании можно свой настроенный проект сохранить как шаблон для будущих проектов. Для этого нужно выбрать команду меню «File->Save project as user template...» и ввести имя шаблона. В дальнейшем, при создании нового проекта, можно выбрать желаемый шаблон в категории «User templates» (рисунок 5). После этого потребуется задать пустой каталог, где будет создан новый проект, а затем отредактировать имя проекта.
    Рисунок 5. Выбор пользовательского шаблона
    Рисунок 5. Выбор пользовательского шаблона
    Можно даже изменить существующий стандартный шаблон. Для этого в окне выбора шаблонов нажмите правую кнопку мыши на нужном шаблоне и воспользуйтесь опцией «Edit this script» в появившемся меню.
  3. Перед тем как что-нибудь собирать, нужно еще заглянуть в глобальные настройки компилятора. Это делается через главное меню: «Settings->Compiler an debugger settings». В открывшемся окне левой панели нажмите на значок «Global compiler settings». На самом верху правой панели в верхнем поле «Selected compiler» выберите «GNU AVR GCC compiler» (рисунок 6).
    Рисунок 6. Глобальные пути для заголовочных файлов
    Рисунок 6. Глобальные пути для заголовочных файлов
    На вкладке «Compiler settings» вряд ли стоит что-либо менять: эти параметры станут стандартными для всех AVR-проектов. А вот на вкладках «Search directories->Compiler» и «Search directories->Linker» в моем случае уже стояли стандартные пути /usr/include и /usr/lib соответственно, что было неверно. Можно тут указать правильные пути (например, /usr/avr/include и /usr/avr/lib), а в настройках проекта удалить эти же пути, я же просто очистил эти поля кнопками «Clear», потому что параметры проекта к этому моменту уже были настроены.
    На вкладке «Toolchain executables» проверяем, правильно ли указаны имена исполняемых файлов из комплекта AVR GCC и пути к ним. С помощью кнопки «autodetect» можно попробовать автоматически определить все эти значения. Если же что-то получилось не так (например, дистрибутив AVR GCC оказался с экзотическими именами и каталогами для размещения), то это как раз место, где все можно исправить вручную. На рисунке 7 в поле «Compiler's installation directory» должно быть указано «/usr», если программы AVR GCC размещаются в каталоге /usr/avr/.
    Рисунок 7. Имена файлов из пакета AVR GCC
    Рисунок 7. Имена файлов из пакета AVR GCC
    И последнее. На вкладке «Other settings» есть поле «Compiler logging». В нем можно задать режим журналирования процесса компиляции. Рекомендуется установить здесь значение «Full command line». Это позволит подробно проследить команды, используемые при сборке.
Теперь Code::Blocks готов к сборке проекта!

Использование собственного makefile для своего проекта

Всегда может возникнуть нестандартная ситуация, когда процесс сборки проекта нужно взять под свой полный контроль. Для этого в Code::Blocks предусмотрена возможность работы с собственным файлом сборки. Чтобы воспользоваться ею, необходимо создать пустой проект и сохранить его. Теперь нужно указать, что используется собственный makefile:
  1. Выберите пункт меню «Project -> Properties».
  2. Перейдите на вкладку "Project Settings".
  3. Поставьте галочку в поле "This is a custom makefile".
  4. Убедитесь, что указано правильное имя файла в поле «Makefile:».
  5. Теперь на вкладке «Build targets» нужно изменить или добавить цели сборки в соответствии с имеющимся makefile, например:
    all
    cleanall
При использовании собственного makefile следует проверить, какие команды имеются на вкладке «Make Commands» в пункте меню «Project ->Build Options».

Пробная программа

Во вновь созданном по AVR-шаблону проекте уже имеется файл main.c, который содержит заготовку модуля main для программы на С. Напишем новую программу на С++.
Воспользуйтесь опцией меню «File->New->File...» , выберите «C++ source» и нажмите кнопку «Go». Появится приветственное окно мастера создания нового исходного файла. Нажмите кнопку «Next» и в следующем окне выберите язык программирования для этого файла: С++. Далее укажите имя файла (например, sample.cpp) и полный путь к этому файлу, для чего нажмите кнопку «...» справа от поля с именем файла. Затем нужно указать, в каких целях сборки этот файл будет присутствовать, для чего можно просто нажать кнопку «All». Нажмите кнопку «Finish».
В созданный пустой файл впишите простейшую C++ программу:
int main(void)
{
    const int some_size = 1000;

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

    return 0; // никогда не дойдет сюда
}
Сохраните файл, нажав клавиши Ctrl+S. Файл main.c нам не нужен, его можно удалить из проекта, нажав на его имени правую кнопку мыши и выбрав из появившегося меню команду «Remove file from project» (рисунок 8).
Рисунок 8. Выбор шаблона для нового файла
Рисунок 8. Выбор шаблона для нового файла
При вводе комментариев на русском языке я то и дело натыкался на досадный сбой в работе редактора: иногда он отказывается вводить кириллицу. По всей видимости, это связано с работой в Unicode. Временно решить проблему можно, введя лишний пробел, после этого текст нормально пишется. Затем этот пробел можно удалить.
Скомпилируем программу. Для этого нужно выбрать команду меню «Build->Build» или нажать знакомую многим комбинацию клавиш Ctrl+F9, также можно использовать кнопку с голубой шестеренкой в панели инструментов. Программа будет скомпилирована, а окно сообщений внизу экрана автоматически переключится на вкладку «Build messages», где будет сказано, что сборка закончена, получилось 0 ошибок и одно предупреждение: в строке 8 неиспользованная переменная «a».

Немного об отладке

Подход к отладке AVR-приложений в значительной степени зависит от используемого оборудования. При наличии устройства AVR JTAG ICE можно производить внутрисхемную отладку, подключаясь с его помощью к процессору, используя для этого утилиту avarice. Если такого устройства нет, воспользуйтесь имитатором процессора simulavr. К сожалению, этот проект уже несколько лет не развивается, но разработчики продолжают выпускать исправления.
Чтобы настроить отладку в Code::Blocks, нужно открыть свойства проекта «Project->Properties» и перейти на вкладку «Debugger». Здесь в поле «Select target» выбираем «Debug». Для этой конфигурации на вкладке «Remote connection» указываются параметры подключения avr-gdb к удаленной цели отладки:
  • «Connection type» : TCP.
  • «IP address» : localhost, если устройство отладки (или имитатор) подключено к этому же компьютеру.
  • «Port»: например, 1212.
Теперь на вкладке «Additional commands» в поле «After connection» нужно вписать следующие команды для отладчика:
load
break main
Первая команда загрузит программу в цель отладки (микропроцессор или имитатор), а вторая вставит точку останова на функции main.
Перед отладкой нужно запустить в терминале simulavr:
simulavr -g -p 1212 -d atmega128
(для процессора atmega128), получится примерно такой вывод:
$ simulavr -g -p 1212 -d atmega128 
Simulating a atmega128 device. 
...
main.c:415: MESSAGE: Simulating clock frequency of 8000000 Hz 
Waiting on port 1212 for gdb client to connect...
Если устройство подключено к последовательному порту /dev/ttyS0, запуск avarice можно произвести такой командой:
avarice -j /dev/ttyS0 -P atmega128 :1212
Теперь можно запускать отладку в Code::Blocks при помощи команды меню «Debug->Start». В окне, где запущен simulavr, добавятся примерно такие сообщения:
Connection opened by host 127.0.0.1, port -14999. 
decoder.c:737: MESSAGE: BREAK POINT: PC = 0x00000068: clock = 34
При этом в редакторе Code::Blocks будет загружен исходный текст, содержащий функцию main, и курсор отладчика остановится на этой функции, как это показано на рисунке 9. Теперь можно пользоваться удобными кнопками для управления отладчиком в панели инструментов, просматривать значения переменных и так далее. Более подробно об отладке можно узнать в документации на gdb, simulavr или avarice.
Рисунок 9. Отладка
Рисунок 9. Отладка

Заключение

Итак, мы рассказали, как, затратив минимум усилий и времени, не обращаясь к документации и руководствам, быстро приступить к разработке AVR-приложений с использованием замечательной и быстро развивающейся среды разработки Code::Blocks. В настоящее время интерфейс среды переведен на множество языков и, возможно, скоро локализованные файлы войдут в состав основной ветви разработки.
В следующей статье нам предстоит познакомиться с использованием Eclipse для сборки приложений для широкого спектра микропроцессоров с небольшим размером оперативной памяти, для которых предназначен открытый компилятор SDCC.



Ресурсы



___

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

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