Интеграция IDE Code::Blocks с программным комплексом Altera Quartus II. Часть I.

Наша недавняя дискуссия с vga на тему сред разработки [1] оказалась не такой уж бесполезной, как я думал сначала — она придала мне направляющий пинок в сторону повышения удобства разработки устройств на базе ПЛИС. Вообще-то я и раньше задумывался над тем, что это надо бы сделать, но никаких реальных шагов по выяснению, как именно это сделать я не предпринимал, а после той беседы я нашёл немного времени на то, что бы поковыряться в потрохах квартуса и сделать себе более менее удобное окружение. Собственно, об этом я и хочу поведать. Товарищ vga, правда, просил ещё написать о прикручивании иара и использовании AVR-симулятора/дебаггера, но я этим всем добром не пользуюсь, по-этому интереса к сему делу не имею (про второе, кстати, статьи где-то были, можно раскопать).
Logo
Внимание! В статье беспорядочно перемешаны кишки двух весьма мощных и замороченных систем. Слабонервным просьба под кат не ходить!

1. Пара слов о Code::Blocks
Для начала постараюсь объяснить, чего ради всё это затевалось.
Буду банальным — для продуктивного программирования очень важное значение имеет текстовый редактор. Нет, я конечно и сам с удовольствием при необходимости пишу демоны непосредственно на удалённом сервере через ssh в vim, но это только благодаря моей любви к этому гениальному редактору. Вторая по важности составляющая рабочего окружения программиста — возможность эффективно автоматизировать различные задачи. Разработка прошивки для ПЛИС с использованием языков описания аппаратуры в этом плане ничем не отливается от классического программирования. Все современные среды разработки стараются решить эти две задачи, но не у всех это получается одинаково хорошо.
Quartus очень мощная среда разработки для ПЛИС, но текстовый редактор у него не очень далеко ушёл от блокнота. Да и инструментов для работы с исходниками там не наблюдается. Со средствами автоматизации, к счастью, получше, но из GUI получить доступ к ним не так-то просто: даже запустить собранную прошивку простым нажатием комбинации клавиш на клавиатуре нельзя — нужно переключаться на окно программатора.
В общем, вполне очевидно встаёт вопрос поиска альтернативной IDE, имеющей хороший тестовый редактор с подсветкой синтаксиса HDL и развитыми средствами автоматизации/кастомизации. Таких, на самом деле, много, но сравнительный обзор я делать не собираюсь — меня вполне устраивает то, чем я пользуюсь сейчас.
Code::Blocks — это весьма функциональная IDE, рассчитанная на разработку программного обеспечения на языках C/C++ с использованием различных компиляторов. Попытаюсь кратко описать основные достоинства и недостатки среды, которые наиболее актуальный лично мне:
  • Среда является не просто бесплатной, а OpenSource со всеми вытекающими.
  • Написана на чистом C++ с использованием wxWidgets => сочетание кроссплатформенности, малой ресурсоёмкости и высокой скорости работы.
  • Использование Scintilla [2] — самый мощный и удобный текстовый контрол, который я когда-либо видел. Правда, им сейчас никого особо не удивишь — его используют очень многие софтины, вопрос только в том, насколько интенсивно задействованы его возможности. С другой стороны, большие и серьёзные IDE всё ещё предпочитают изобретать велосипеды.
    • подсветка выделенного слова по всему документу
      Подсветка выделенного слова
    • поддержка «документирующих комментариев» — выделение специально отформатированных комментариев отдельными цветами (правда, к сожалению, определено только для C/C++ и ещё пары языков)
    • наличие режима блочного (прямоугольного) выделения — удобно комментарить/раскомментаривать много строк одновременно, редактировать форматирование и выполнять ещё некоторые действия.
    • возможность вводить/редактировать текст в нескольких местах документа одновременно (с зажатым ctrl, нужно включить в настройках)
      Редактирование нескольких мест одновременно
    • возможность разделить редактор на два по горизонтали/вертикали и смотреть/редактировать один и тот же файл в двух разных местах, при этом изменения, вносимые в одной половине сразу же отображаются и во второй (кстати, фреймворк, используемый для построения GUI, позволяет разделять рабочее пространство и, соответственно, смотреть одновременно на разные документы)
      Разделение редактора
    • подсветка на полях строк, изменённых с момента открытия файла и его последнего сохранения
    • подсветка парных/непарных скобок
    • удобные indentation guides — линии, показывающие глубину вложенности кода
    • большое число преддефайненных клавиатурных комбинаций для управления контролом с клавы, включая такие как дублирование выделенного текста, перемещение строк и зуммирование текста (подробнее см. [3])
    • перетаскивание выделенного фрагмента текста мышкой
    • копипаст выделенного фрагмента текста средней кнопкой мыши без использования буфера обмена
  • Поддержка воркспейсов (наборов проектов, открытых одновременно).
  • Большое число настроек, позволяющих гибко подстроить среду под себя.
  • Использование Squirrel [4] — простой и мощный скриптовый язык, значительно проще в использовании и освоении, чем, например, Lua.
  • Очень гибкая система плугинов — если надо сделать что-то что нельзя сделать на скриптах, почти наверняка можно реализовать в плугине.
  • Кучка полезных и не очень плугинов в комплекте. Перечислю наиболее интересные мне.
    • Несколько разных систем поиска/замены в файлах. Пожалуй даже многовато, встроенный поиск можно бы и выкинуть в принципе — для поиска в текущем документе очень удобен IncrementalSearch, который позволяет улучшить читаемость открытого файла за счёт подсветки определённых идентификаторов, а для поиска по файлам есть ThreadSearch — режим отображения деревом и окно предпросмотра рулят однозначно.
      IncrementalSearch и ThreadSearch
    • ToolsPlus, заменяющий стандартное меню Tools, позволяет очень просто цеплять вызовы внешних прог к IDE.

    • KeyBinder — позволяет повесть любое действие, которое вызывается из меню на почти любую комбинацию клавиш. Правда иногда подглючивает.
    • Autosave и AutoVersioning весьма полезные штуки.
    • Source Exporter — умеет делать из исходников раскрашенный HTML (или PDF/ODT/RTF)
    • HexEditor — весьма функциональный, хоть и не очень красивый/удобный, HEX/BIN редактор. Жалко только, что он слабо интегрирован с самой IDE.
    • Плугин AStyle позволяет привести код к единому виду, иногда пригождается.
    • EditorTweaks лечит детскую болезнь CB — общие настройки редактора для всех вкладок, жалко только, что живёт только в меню, тулбар бы ему не помешал, зато наличие пунктов меню позволяет повесить переключение режимов на горячие кнопки KeyBinder`ом.
    • ToDo List — список заметок на будущее, записанных в исходниках в специальным образом оформленных комментариях.
  • Кучка мелких фич, повышающих юзабилити, например:
    • Пункты контекстного меню Find declaration/implementation/occurrences of … позволяют быстро искать информацию по идентификатору (в полной мере, понятно дело, работает только для C/C++).
    • Переключение между исходником и его заголовком по кнопке F11 (разумеется, тоже C/C++).

    • Кое-какая обработка неактиных веток #if/#ifdef (ну да, туда же), надеюсь, в будущем доведут до ума.
    • Инструменты для закомментирования выделенного текста разными способами.
Ну вот, вроде, основное перечислил, теперь о недостатках:
  • изначальная заточенность под C/C++ со всеми вытекающими неудобствами для работы с другими языками;
  • не шибко продвинутый и слегка глючноватый, хотя и постоянно развивающийся, CodeCompletion (опять таки, C/C++ only, для других языков только дополнение кейвордов);
  • несколько замороченная система добавления файлов подсветки для нестандартных языков;
  • режим прямоугольного выделения слабо функционален (кто юзал UltraEdit поймёт)
  • отсутствие встроенных средств для записи макросов, заявлен плугин для этого, но в комплекте его нет, толкового реестра плугинов, кстати, тоже нет;
  • аналогичная ситуация с интеграцией с VCS;
  • изначально не до конца продуманная система файлов проектов (им самим приходится держать отдельные файлы проектов для WIN и для NIX);
  • не гибкая система описания компиляторов (что бы добавить новый компилятор надо писать плугин, а если хочется нестандартного — вообще убиться можно);
  • плохо переваривает ситуацию, когда один файл включен в несколько открытых проектов;
  • документации много, но она совершенно не систематизирована, да и всё равно не полная;
  • маленькая команда разработчиков — всего около десятка человек;
  • абсолютное нежелание разработчиков формировать релизы (вытекает из предыдущего пункта, много времени это занимает всё-таки).

Будем считать, что беглый обзор среды мы сделали, теперь перейдём к делу.

2. Приближение первое. Разведка боем.
Что бы соорудить интеграцию с чем-то надо сначала понять, как этим чем-то управлять. Посмотрим, что у нас есть. Идём в [AlteraDir]/quartus/bin и тыкаем во все подряд экзешники. Кроме того, можно попытаться почитать документацию, например второй том хендбука, раздел 1.2 — Command-Line Scripting. Как видно, в квартусе нету традиционного CLI-компилятора с кучей опций на все случаи жизни, зато его можно заставить скомпилировать свой проект, что нам, собственно говоря, даже лучше в чём-то — меньше возни. Нам ведь не надо перетаскивать весь функционал в нашу IDE, только наиболее часто используемое.
Итак, что полезного для нас есть
  • quartus <file_name>.qpf запустить квартус и открыть проект
  • qppl.exe <file_name>.qpf — запустить пинпланнер
  • qmegawiz — мастер настройки мегафункций
  • quartus_*- набор утилит, реализующих различные подсистемы квартуса, в том числе:
    • quartus_cmd — командная строка для запуска скриптов, в числе прочего может запустить одной командой полный цикл синтеза
    • quartus_sh — примерно тоже самое, только немножко другое
    • quartus_cpf — утилита конвертирования файлов прошивок
    • quartus_pgm — консольный программатор
    • quartus_staw — запуск ГУИ TimeQuest Timing Analyzer
    • quartus_stpw — запуск ГУИ SignalTap II
(кстати, обратите внимание, что все имена исполняемых файлов я указываю без расширений — это обусловлено тем, что в линукс версии квартуса они называются именно так, а виндуз позволяет опускать расширения исполняемых файлов)

Для начала этого списка вполне хватит. Как я уже сказал, квартус не может работать с россыпью файлов — все действия производятся над проектом. Дальше интереснее — проект сам по себе практически ничего не описывает, он только содержит список «ревизий». А вот ревизия уже содержит информацию о списке исходников, чипе, под который синтезируется проект, ассигментах и так далее. Как правило, несложные проекты содержат только одну ревизию и называется она так же, как и сам проект. Ряд команд хотят кушать и имя проекта и имя ревизии, например так:

  • quartus_cmd project_name -c revision_name
Кстати говоря, почти все программы, входящие в состав квартуса, хотят работать в корневой директории проекта, так что надо либо указывать полный путь к исполняемым файлам, либо внести каталог quartus\bin в переменную PATH.

Теперь, для первого приближения, предположим, что у нас уже есть проект среды Quartus II, над которым мы работаем и что у нас есть программатор USB Blaster, которым мы заливаем прошивки в ПЛИС. Проект включает несколько HDL исходников, которые мы редактируем в C::B. Создадим инструментарий для удобной компиляции и заливки этого проекта. Собственно, выполнять нужно две команды — запуск полной компиляции и запуск прошивальщика. На самом деле, если внимательно изучать выхлопы квартуса, то можно проследить, что, с какими ключами и в какой последовательности он вызывает, но пока что будем считать, что это его личные заботы, которые нас не интересуют. Зато нас интересуют некоторые вспомогательные команды, которые могут нам пригодиться в процессе работы.
В среде Code::Blocks идём в меню Tools+ (или Tools, в зависимости от предпочтений) и добавляем инструменты (AlteraDir — каталог, куда установился квартус, ProjectDir — корневой каталог проекта, proj_name — имя проекта)

  1. Tool Name: QuartusII Compile
    Command line: [AlteraDir]\quartus\bin\quartus_cmd proj_name -c proj_name
    Working Directory: [ProjectDir]
    Output to: Code::Blocks Console
  2. Tool Name: QuartusII Programm
    Command line: [AlteraDir]\quartus\bin\quartus_pgm -c USB-Blaster -m JTAG -o P;proj_name.sof
    Working Directory: [ProjectDir]
    Output to: Code::Blocks Console
  3. Tool Name: QuartusII PinPlanner
    Command line: [AlteraDir]\quartus\bin\qppl proj_name.qpf
    Working Directory: [ProjectDir]
    Output to: Code::Blocks Console
  4. Tool Name: QuartusII Megafunction Wizard
    Command line: [AlteraDir]\quartus\bin\qmegawiz
    Working Directory: [ProjectDir]
    Output to: Code::Blocks Console
  5. Tool Name: QuartusII SignalTap II
    Command line: [AlteraDir]\quartus\bin\quartus_stpw proj_name.qpf
    Working Directory: [ProjectDir]
    Output to: Code::Blocks Console
  6. Tool Name: Run QuartusII
    Command line: [AlteraDir]\quartus\bin\quartus proj_name.qpf
    Working Directory: [ProjectDir]
    Output to: Code::Blocks Console
Ну и в том же стиле, по необходимости.

Далее лезем в настройки Settings->Editor...->Keyboard shortcuts назначаем горячие кнопки на первые два пункта (остальные не часто нужны, можно и из меню вызывать). Я, например, назначил Alt+F9 и Alt+F10, что бы было в меру привычно и не конфликтовало с другими комбинациями. Сохраняем настройки. Теперь уже можно нормально работать над одним проектом — исправил исходник, сохранил (Ctrl+S), скомпилировал (Alt+F9) и зашил (Alt+F10).


3. Приближение второе. Проектное задание.
Работать всю жизнь над одним проектом как-то не очень интересно. Изменять каждый раз имена и рабочие директории всех тулсов при переходе от одного проекта к другому тоже, тем более, что это ещё и чревато косяками, связанными со склерозом ;). Надо эту задачу переложить на IDE — на то она и придумана. Что бы объяснить системе, что мы работаем с разными проектами квартуса нужно сделать, соответственно, разные проекты Code::Blocks, а что бы объяснить квартусу, над каким именно проектом мы сейчас работаем нужно подправить тулсы так, что бы они сами подставляли нужные пути и имена. Соответственно, чем сейчас и займёмся.
Все настройки проекта Code::Blocks хранит в файле с расширением .cbp. Обычно рядом расположено ещё несколько файлов вспомогательного характера, но они нам совершенно не нужны. Внутри .cbp файл — это простой XML, который содержит информацию о проекте. С его структурой можно ознакомится здесь [5]. Из всего этого добра нам, по сути, нужно только перечисление файлов, входящих в проект. Выглядеть файл проекта может как-то так:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
	<FileVersion major="1" minor="6" />
	<Project>
		<Option title="my_proj" />
		<Unit filename="root.v" />
		<Unit filename="test.v" />
		<Unit filename="netest.v" />
		<Extensions>
			<envvars />
		</Extensions>
	</Project>
</CodeBlocks_project_file>

Этого вполне достаточно для наших целей. C::B правда не догадывается о том, что проекты бывают без компилятора и дебаггера, по-этому при первой же попытке модифицировать проект (например, добавить новый файл, или удалить существующий) он накидает туда мусора. Впрочем, этот мусор нам особо не помешает, пусть будет.
Далее вновь идём в меню Tools/Tools+ и заменяем везде proj_name на ${PROJECT_NAME} и ProjectDir на ${PROJECT_DIR}. Теперь правильные пути сами будут дописываться в команды.

Часть I — Часть IIЧасть III

Ссылки
  1. Моя очередь мигать диодиками — статья на we.easyelectronics.ru
  2. Scintilla — статья в wikipedia
  3. Дефолтовые кейбиндинги в сцинцилле
  4. Squirrel — статья в wikipedia
  5. Файлы проектов Code::Blocks — официальное wiki Code::Blocks
  6. Squirrel programming language — документация на официальном сайте
  7. Раздел о скриптовании — официальное wiki Code::Blocks
  8. Code::Blocks SDK
  9. Документация на wxWidgets
  10. Инструкция по скачиванию исходников Code::Blocks из VCS
  11. Описание основных функций, использующихся для создания визардов — официальное wiki Code::Blocks
  12. Описание формата ресурсов XRC
  13. Сравнение различных RAD для wxWidgets
  14. События, генерируемые системой при работе визарда — официальное wiki Code::Blocks
  15. Вводная в написание собственных визардов — официальное wiki Code::Blocks
  16. Adding support for non C/C++ files to the build system — официальное wiki Code::Blocks
  17. Регулярные_выражения — статья в wikipedia

Приложенный архив



PS: статья состоит из трех частей только потому, что злобный фильтр не дал её запостить одним куском, так что просьба считать эти три куска одной статьёй =)
  • +3
  • 30 мая 2011, 10:42
  • Alatar

Комментарии (10)

RSS свернуть / развернуть
Нравится:)
А GCC там искаропки? (т.е. скажем WinAVR заведётся сразу или тоже надо допиливать?)
зы. Одну тока часть на конкурс выставляеш? хм
0
Биндинг к avr-gcc из коробки, WinAVR находит автоматом, атмеловский тулчейн, может быть понадобится путь руками показать. Но нет запуска программатора по Run и прикрутить без правки исходников не получится, так что тоже через Tools вешать приходится.
зы. Места на конкурс мало осталось, так что, что бы не занимать лишнее прошу считать все три части одной статьёй — пусть другим тоже останется =)
0
Ясн. И у NetBeans такая же шляпа. WinAVR находит сразу но binutils и программатор приходится самому прикручивать. Кроме того с мейком из WinAVR не дружит и приходится юзать мейк из cygwin'а.
Да не заметил сразу твой p.s. )
0
в смысле, бинутилс прикручивать?
Я под атмеловским тулчейном имел в виду тот, что с AvrStudio идёт (у них своя сборка, ставится куда-то в программфайлс).
Мейк CB по умолчанию вообще не использует, но можно включить. У меня с ним проблем не возникло, но я не знаю, откуда именно он сам make брал — у меня много разных перемешано =)
0
Под binutils я имел в виду avr-objcopy) Чтобы .hex создать.
0
avr-objcopy и прочие avr-size дописываются в post-build визардом из комплекта поставки =)
0
Понятно. Стоит попробовать эту иде:)
Радует заточенность под Си а не под яву.
0
Интересная статья, спасибо.

Однако, небольшое замечание:

#pragma spellcheck=ON

На скриншотах есть английское слово «делитель». Так вот, оно пишется divider.

Никого не хочу обидеть, просто наблюдение.
0
Если эта оболочка умеет рефакторинг, можно поправить в пару кликов)
Хм, а умеет ли?
0
Упс, слажал… =)
Что ж, пардон за мой французкий +)

Рефакторинга, вроде, не умеет, так что Ctrl+R…
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.