Sublime Text как IDE для ARM на примере STM32

от автора

image

В этой статье будет изложена инструкция по созданию сборки 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 файл в корне каталога со сборкой. Должно получится примерно так:

image

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 и видим лог построения.

image

Так же видим, что в каталоге проекта заново создался каталог «out», и в нём в соответствующих каталогах лежат файлы прошивки, листинга и объектные файлы.

Прошивка:

Прошивать микроконтроллер мы будем с помощью openOCD. Тут существует особенность: openOCD не работает со стандартными драйверами программатора ST-LINK. По умолчанию ST-LINK определяется как «Запоминающее устройство для USB», то есть нам надо заменить драйвер USBSTOR на WinUSB с помощью программы Zadig. Скачиваем, запускаем, в опциях выбираем «List All Devices», выбираем устройство «STM32 STLink» и нажимаем на кнопку «Replace Driver».

image

image

Готово! Что бы прошить микроконтроллер, нужно подключить программатор, открыть терминал в папке с makefile и выполнить «make program» (можно прямо в Sublime Text выделить папку с проектом и нажать Ctrl+Shift+T для быстрого открытия терминала).

image

Для использования другого программатора, нужно изменить соответствующие строки в makefile.
Не всегда удобно, но если вы хотите, что бы микроконтроллер прошивался автоматически при построении проекта, нужно в makefile раскомментировать строку:

#	$(MAKE) program 

Итак, осталось разобраться с отладкой.

Отладка:

Запускаем GDB-сервер: открываем терминал в каталоге с makefile и выполняем в нём «make debug»

image

Теперь в Sublime Text просто нажимаем F5 (можно менять в настройках SublimeGDB), откроется интерфейс плагина SublimeGDB и в командной строке плагина вводим:
target remote localhost:3333

image

Готово. Теперь можно пользоваться отладкой. Тут стоит уточнить: на данный момент доступны для просмотра только регистры самого яда ARM, но не периферии. Я нахожусь в поиске решения этого вопроса, а также приведения значений регистров ядра к нормальному виду. Все горячие клавиши для отладки можно менять в настройках плагина SublimeGDB.

image

Для окончания отладки в 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 с дополнительными программами.

Ссылка для скачивания тестового проекта, рассмотренного в этой статье.

ссылка на оригинал статьи http://habrahabr.ru/post/270789/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *