[Из песочницы] Sublime Text как IDE для ARM на примере STM32

image

В этой статье будет изложена инструкция по созданию сборки Sublime Text c дополнительными программами, которую можно будет использовать как среду разработки для микроконтроллеров, в частности STM32F10x. Итак, перед нами стоит задача сделать при помощи Sublime Text — IDE, которая включает в себя: статический анализ и автодополнение кода в момент его написания, систему построения проекта с помощью makefile, компилятор, линковщик, прошивку микроконтроллера и отладку. К тому же сборка будет работать без установки.


Для начала нужно будет скачать необходимые программы:

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

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

© Habrahabr.ru