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

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

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


  1. ploop
    13.11.2015 12:16
    +2

    Делал подобное, только давно и под Ubuntu


    1. r44083
      13.11.2015 12:59

      Да, в том и плюс: всё ПО в статье — кроссплатформенное.


  1. IamKarlson
    13.11.2015 12:49

    Адрес отладки нужно каждый раз указывать?


    1. 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": "",
      

      Если удастся это сделать, то можно вообще будет организовать всё на хоткеях: отдельно построение, отдельно прошивку и отдельно отладку.


      1. vadim_ig
        14.11.2015 00:14

        Ну вон же выше ploop дал ссылку на статью, где необходимая настройка описывается — в разделе «Отладка»


        1. r44083
          14.11.2015 00:53

          Вижу, а как это в одном файле проекта описать? Без создания дополнительных файлов конфига для GDB?


  1. abusalimov
    13.11.2015 16:58
    +1

    Позволю себе прорекламировать плагин C Improved на случай, если вы собираетесь писать много кода на C/C++.

    Исправляет многие косяки стандартного синтаксиса, например, ломающие подсветку макросы, глюки Goto Definition вроде неспособности индексировать typedef struct, а также немного улучшает подсветку синтаксических ошибок в коде.


  1. Ramkosh
    14.11.2015 13:09

    Спасибо большое за статью!
    Как раз вчера на работе начал настраивать Sublime для STM32 под Windows и Ubuntu (приходится работать на обоих платформах).
    Единственный вопрос: действительно ли нужно подменять драйвера с помощью Zadig? Такая необходимость возникала при работе с FTDI-устройствами, но у меня, насколько помню, openocd под windows работает со стандартными драйверами ST-Link.
    В понедельник уточню, сейчас под рукой, увы, нет STM.