В этой статье будет изложена инструкция по созданию сборки Sublime Text c дополнительными программами, которую можно будет использовать как среду разработки для микроконтроллеров, в частности STM32F10x. Итак, перед нами стоит задача сделать при помощи Sublime Text — IDE, которая включает в себя: статический анализ и автодополнение кода в момент его написания, систему построения проекта с помощью makefile, компилятор, линковщик, прошивку микроконтроллера и отладку. К тому же сборка будет работать без установки.
Создание структуры каталогов и bat файла запуска:
Для начала нужно будет скачать необходимые программы:
1. Собственно сам Sublime Text 3 portable
2. Тулчейн GCC ARM Embedded (в архиве)
3. Clang (LLVM) для статического анализа кода
4. Make для автоматизации построения проекта, прошивки и отладки
5. OpenOCD для прошивки и отладки
Далее создаём каталог для нашей сборки и распаковываем каждую программу в заранее созданные каталоги. Для Clang, вначале нужно установить загруженный LLVM, а затем просто скопировать каталог с LLVM из пути установки в каталог нашей сборки.
Создаём bat файл в корне каталога со сборкой. Должно получится примерно так:
Bat файл нужен для того, что бы Sublime Text запускался с переменной PATH, содержащей пути дополнительных программ. В bat файле пишем следующее:
::определяем переменную DEVELOP_ROOT, которая хранит путь расположения (запуска) bat-файла
set DEVELOP_ROOT=%~dp0
::задаём временное значение переменной PATH
PATH %DEVELOP_ROOT%GCC ARM none eabi\bin;%DEVELOP_ROOT%LLVM\bin;%DEVELOP_ROOT%make;%DEVELOP_ROOT%openOCD\bin;%PATH%
::запускаем Sublime Text
start "" "%DEVELOP_ROOT%Sublime Text\sublime_text.exe"
Установка и настройка необходимых плагинов:
Устанавливаем Package Control: Запускаем Sublime Text, в браузере переходим на сайт Package Control Ссылка, вставляем строку установки Package Control в консоль (Ctrl+~) Sublime Text, перезагружаем Sublime Text.
В Sublime Text устанавливаем необходимые плагины (с помощью Ctrl+Shift+P, далее пишем Install Pakage):
- SublimeLinter
- SublimeLinter-contrib-clang
- SublimeGDB
- Terminal
- All Autocomplete
- ARM Assembly
All Autocomplete — плагин для автодополнения кода на лету. Предлагает подходящие комбинации из файлов, которые открыты во вкладках Sublime Text.
ARM Assembly — для подсветки синтаксиса ассемблера.
Далее необходимо прописать настройки для этих плагинов. Настройки находятся ниже:
Preferences->Package Settings->SublimeLinter->Settings — User:
{
"user": {
"debug": true,
"delay": 0.25,
"error_color": "D02000",
"gutter_theme": "Packages/SublimeLinter/gutter-themes/Default/Default.gutter-theme",
"gutter_theme_excludes": [],
"lint_mode": "background",
"linters": {
"clang": {
"@disable": false,
"args": [],
"excludes": [],
"extra_flags": "",
"include_dirs": []
}
},
"mark_style": "outline",
"no_column_highlights_line": false,
"passive_warnings": false,
"paths": {
"linux": [],
"osx": [],
"windows": []
},
"python_paths": {
"linux": [],
"osx": [],
"windows": []
},
"rc_search_limit": 3,
"shell_timeout": 10,
"show_errors_on_save": false,
"show_marks_in_minimap": true,
"syntax_map": {
"html (django)": "html",
"html (rails)": "html",
"html 5": "html",
"javascript (babel)": "javascript",
"php": "html",
"python django": "python"
},
"warning_color": "DDB700",
"wrap_find": true
}
}
Preferences->Package Settings->SublimeGDB->Settings — User:
{
"file_group": 0,
"session_group": 1,
"session_open": true,
"console_group": 1,
"console_open": true,
"variables_group": 1,
"variables_open": true,
"callstack_group": 2,
"callstack_open": true,
"registers_group": 2,
"registers_open": true,
"disassembly_group": 1,
"disassembly_open": true,
"threads_group": 3,
"threads_open": true,
"breakpoints_group": 3,
"breakpoints_open": true
}
Preferences->Package Settings->Terminal->Settings — User:
{
"terminal": "cmd"
}
Настройка файла проекта:
На этом этапе уже можно открыть тестовый проект для STM32F10x. Ниже привожу содержание файла тестового проекта (*.sublime-project):
{
"build_systems":
[
{
"cmd": ["make"],
"name": "ARM build",
"working_dir": "${project_path}",
"file_regex": "^(.*):(\\d+):(\\d+):\\s*(.*)$"
}
],
"folders":
[
{
"follow_symlinks": true,
"path": "."
}
],
// Настройки линтеров
"SublimeLinter":
{
"linters":
{
"clang":
{
// Каталоги, в которых находятся файлы, анализируемые линтером
"include_dirs":
[
"${project}/CMSIS",
"${project}/StdPeriphLib",
"${project}/user-code",
"${project}/user-code/FatFs"
],
// Дополнительные флаги Clang
"extra_flags":"-DSTM32F10X_MD_VL"
}
}
},
"settings":
{
"sublimegdb_workingdir": "${project_path:out/hex/}",
"sublimegdb_commandline": "arm-none-eabi-gdb --interpreter=mi *.elf"
}
}
Разберем этот файл подробнее. Определяем команду которая будет запускаться при построении проекта (Ctrl+B):
"cmd": ["make"]
Название build_system (может быть любое):
"name": "ARM build"
Рабочий каталог проекта, относительно этого пути, запускается команда в поле «cmd»:
"working_dir": "${project_path}"
Регулярное выражение для быстрых переходов по сообщениям в логе построения проекта (по F4, Shift+F4):
"file_regex": "^(.*):(\\d+):(\\d+):\\s*(.*)$"
Пути к каталогам проекта с исходным кодом написаны в makefile, но так как Clang не вынимает их из makefile, то в настройках проекта в разделе «SublimeLinter»->«linters»->«clang»->«include_dirs» — нужно прописать пути к этим каталогам, которые будут передаваться в Clang для анализа исходного кода. В противном случае получим ошибку от Clang вида «такой-то подключаемый заголовочный файл не найден».
То же касается и директив препроцессора, в нашем случае это "-DSTM32F10X_MD_VL". Эта директива написана в makefile, но нам всё равно необходимо её добавить в настройки проекта для Clang: «SublimeLinter»->«linters»->«clang»->«extra_flags». В противном случае Clang не сможет проверить код такого типа (в файле stm32f10x.h):
#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)
#error "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"
#endif
Далее в настройках проекта идет раздел «settings» — тут находятся настройки проекта для плагина SublimeGDB:
Путь к elf файлу прошивки:
"sublimegdb_workingdir": "${project_path:out/hex/}",
Команда для запуска отладчика:
"sublimegdb_commandline": "arm-none-eabi-gdb --interpreter=mi *.elf"
На данном этапе мы уже можем выполнить построение проекта. Нажимаем Ctrl+B и видим лог построения.
Так же видим, что в каталоге проекта заново создался каталог «out», и в нём в соответствующих каталогах лежат файлы прошивки, листинга и объектные файлы.
Прошивка:
Прошивать микроконтроллер мы будем с помощью openOCD. Тут существует особенность: openOCD не работает со стандартными драйверами программатора ST-LINK. По умолчанию ST-LINK определяется как «Запоминающее устройство для USB», то есть нам надо заменить драйвер USBSTOR на WinUSB с помощью программы Zadig. Скачиваем, запускаем, в опциях выбираем «List All Devices», выбираем устройство «STM32 STLink» и нажимаем на кнопку «Replace Driver».
Готово! Что бы прошить микроконтроллер, нужно подключить программатор, открыть терминал в папке с makefile и выполнить «make program» (можно прямо в Sublime Text выделить папку с проектом и нажать Ctrl+Shift+T для быстрого открытия терминала).
Для использования другого программатора, нужно изменить соответствующие строки в makefile.
Не всегда удобно, но если вы хотите, что бы микроконтроллер прошивался автоматически при построении проекта, нужно в makefile раскомментировать строку:
# $(MAKE) program
Итак, осталось разобраться с отладкой.
Отладка:
Запускаем GDB-сервер: открываем терминал в каталоге с makefile и выполняем в нём «make debug»
Теперь в Sublime Text просто нажимаем F5 (можно менять в настройках SublimeGDB), откроется интерфейс плагина SublimeGDB и в командной строке плагина вводим:
target remote localhost:3333
Готово. Теперь можно пользоваться отладкой. Тут стоит уточнить: на данный момент доступны для просмотра только регистры самого яда ARM, но не периферии. Я нахожусь в поиске решения этого вопроса, а также приведения значений регистров ядра к нормальному виду. Все горячие клавиши для отладки можно менять в настройках плагина SublimeGDB.
Для окончания отладки в Sublime Text нужно нажать Ctrl+F5 (также можно менять в настройках)
Создание нового проекта:
Что бы создать новый проект на основе имеющегося, нужно:
1. Скопировать с новым именем проекта имеющийся каталог проекта;
2. Переименовать файл проекта *.sublime-project на имя нового проекта;
3. В makefile изменить значение переменной TARGET на имя нового проекта:
# Имя программы:
TARGET = STM32-test2-FatFs
Если нужно изменить структуру каталогов проекта, то просто меняем значение переменной SRCDIR в makefile:
# Список каталогов с исходными файлами проекта:
SRCDIR = $(BASE)
SRCDIR += $(BASE)\CMSIS
SRCDIR += $(BASE)\StdPeriphLib
SRCDIR += $(BASE)\user-code
SRCDIR += $(BASE)\user-code\FatFs
И поле «include_dirs» в настройках проекта (*.sublime-project).
Видео поясняющее всё вышесказанное:
Ссылка для скачивания настроенного таким образом, готового Sublime Text с дополнительными программами.
Ссылка для скачивания тестового проекта, рассмотренного в этой статье.
Комментарии (8)
IamKarlson
13.11.2015 12:49Адрес отладки нужно каждый раз указывать?
r44083
13.11.2015 13:08На сколько я разобрался на данный момент — да. Но возможно это где-то в настройках плагина SublimeGDB меняется, так как документации мало, то пока не нашел. Там есть слабо описанное поле «sublimegdb_arguments»: "", — но я так и не смог сделать так, что бы не нужно было каждый раз писать target remote localhost:3333. Может кто-нибудь это реализует.
// Arguments for the program. // Example: to run "./executable foo bar" // "arguments": "foo bar" // To provide user input (stdin) use // "arguments": "< input.dat" "arguments": "",
Если удастся это сделать, то можно вообще будет организовать всё на хоткеях: отдельно построение, отдельно прошивку и отдельно отладку.
abusalimov
13.11.2015 16:58+1Позволю себе прорекламировать плагин C Improved на случай, если вы собираетесь писать много кода на C/C++.
Исправляет многие косяки стандартного синтаксиса, например, ломающие подсветку макросы, глюки Goto Definition вроде неспособности индексировать typedef struct, а также немного улучшает подсветку синтаксических ошибок в коде.
Ramkosh
14.11.2015 13:09Спасибо большое за статью!
Как раз вчера на работе начал настраивать Sublime для STM32 под Windows и Ubuntu (приходится работать на обоих платформах).
Единственный вопрос: действительно ли нужно подменять драйвера с помощью Zadig? Такая необходимость возникала при работе с FTDI-устройствами, но у меня, насколько помню, openocd под windows работает со стандартными драйверами ST-Link.
В понедельник уточню, сейчас под рукой, увы, нет STM.
ploop
Делал подобное, только давно и под Ubuntu
r44083
Да, в том и плюс: всё ПО в статье — кроссплатформенное.