RTL8195AM, RTL871xAx — написание прошивки и отладка в Visual Studio 2015

Эта статья-мануал будет постепенно наполняться и правиться, публикую, скорее, как большую шпаргалку, чтобы удобно было подсмотреть, что да как, ибо многое нашлось или решилось (или не решилось…) далеко не сразу.

B36-0.jpg

Понравились мне эти SoC как набором периферии, так и доступной ценой, но вот досада, написание прошивки производителем советуется в IAR (адурино вариант не рассматриваем) или благодаря пользователям (с форума esp8266.ru) можно делать в Eclipse. Я же привык к Keil uVision и Visual Studio, хотя после Visual Studio, запуская Keil, чувствуешь себя не уютно. А вот Eclipse (пробовал Neon и Oxygen версии) мне не очень нравится, ну как-то всё там совсем не так всё. :) Дело вкуса, конечно, поэтому обсуждать достоинства и недостатки здесь не будем, а рассмотрим на основе опыта такого нуба в этом, как я, как же прикрутить arm-none-eabi, MinGW, Msys к Visual Studio 2015 Update 3 БЕЗ платных плагинов и расширений.

Установка необходимого ПО

Собственно, помимо Visual Studio 2015 (использовал последнюю Update 3. Новая Visual Studio 2017 не поддерживается необходимым для отладки расширением!), нам потребуется (всё необходимое так же есть по ссылкам в конце статьи в виде портативных вариантов):

  • arm-none-eabi v.6-2017-q2 — ставим по короткому пути, без кириллицы и лучше без пробелов;
  • MinGW + Msys — так же ставим по короткому пути, без кириллицы и лучше без пробелов (в конце статьи ссылки на портативную версию);
  • JLink v6.20b (или более ранняя версия) — ставим драйвера для программатора-отладчика, также в комплекте идёт JLink GDB Server (в качестве самого J-Link используется перепрошитый клон ST-Link v2).

В моём случае J-Link я установил в общую папку рабочего ПО (C:\Data\), т. к. он используется и с другим ПО, а остальное распаковал в папку для работы с Realtek SoC (C:\RTL\) и последняя выходит портативной почти со всем необходимым.

Настройка ОС

Теперь необходимо пути к установленному ранее софту прописать в пользовательском PATH.

B36-1.png

У меня пользовательский PATH выглядит так:

B36-2

Для работы я добавил следующие пути:

  • C:\Data\JLink_V618с
  • C:\RTL\6-2017-q2\bin
  • C:\RTL\msys\1.0\bin
  • C:\RTL\mingw\mingw64\bin

Расширения Visual Studio

Чтобы работала отладка посредством GDB, нам потребуется расширение Visual C++ for IoT Development. Если отладка не так важна или не требуется, то можно его не ставить, т. к. оно сделано универсальным (Android, iOS, Linux, MCU) и тянет за собой немалый по занимаемому объему места на диске список (если не установлены следующие компоненты, то оно не установится! Их можно доустановить, просто запустив тот же дистрибутив VS и выбрав пункт Modify, указать эти компоненты к установке.) :

  • Programming Languages -> Visual C++ -> Common Tools for Visual C++
  • Cross Platform Mobile Development -> Visual C++ Mobile Development
  • Cross Platform Mobile Development -> Microsoft Visual Studio Emulator for Android
  • Common Tools -> Visual Studio Extensibility Tools

Более подробно об этом расширении можно прочитать тут — Announcing the VS GDB Debugger extension.

Пока изучал информацию по расширению выше, нашел ещё одно, только опенсорсное — MIEngine, не сильно вникал в MIEngine, но не увидел, что оно поддерживает bare-metal вариант, т.е. отладку голого MCU (или плохо вник?).

Также советую поставить расширение Indent Guides, которое добавляет настраиваемые линии отступов как в Visual Studio 2017. Наглядно и удобно, пример кода с этим расширением ниже:

B36-14.png

Настройка External Tools

Для отладки и дополнительных полезностей потребуется настроить в меню Tools -> External Tools в Visual Studio всё, что нам пригодиться при работе с SoC. Пока это меню у меня выглядит так:

B36-3.PNG

Здесь опишу все необходимые параметры External Tools, что приведены выше:

Имя Команда Аргументы Начальная директория Примечание
[RTL] Run in RAM mingw32-make.exe -s runram $(ProjectDir) Стоит галочка Use Output Window
[RTL] Flash WEB Image mingw32-make.exe -s flashwebfs $(ProjectDir) Стоит галочка Use Output Window
[RTL] Flash and Run mingw32-make.exe -s flashburn $(ProjectDir) Стоит галочка Use Output Window
[RTL] Reset CPU mingw32-make.exe -s reset $(ProjectDir) Стоит галочка Use Output Window
[RTL] Start J-Link GDB Server M3 JLinkGDBServer.exe -select USB -device Cortex-M3 -if SWD -speed 1000 -ir $(ProjectDir) Можно вызывать JLinkGDBServerCL.exe — это консольный вариант сервера и не будет дополнительного окна на заднем фоне

Да, для удобства можно на External Tools назначить горячие клавиши. Я, к примеру, [RTL] Run in RAM назначил на F7, и теперь после компиляции на F6 легко рядом нажать на F7 для быстрой заливки прошивки. Более подробно о назначении своих горячих клавиш можно прочесть здесь — Настройка сочетания клавиш. Список всех горячих клавиш Visual Studio — keyboard shortcuts.

Создание и настройка проекта

А вот тут много рутинной работы… создаём Makefile Project:

B36-4

В итоге должен получится Solution + совсем голый Project (если было установлено расширение Visual C++ for IoT Development, то в проекте уже будут содержаться дополнительные вещи для отладки).

Копируем в папку проекта исходные файлы USDK и проекта. В окошке Solution Explorer делаем папки (тут они называются Filter, т.к. это не реальная структура папок проекта, а произвольная) для необходимых файлов и добавляем, что надо для работы (но не для компиляции проекта, т.е. весь USDK нет  необходимости добавлять, только если отлаживаться и писать код более удобно со всеми ссылками и объявлениями). В итоге должно получиться нечто подобное:

B36-5.png

По-хорошему надо сделать или утилиту или расширение, чтобы автоматом рекурсивно добавляло по указанному пути папки и файлы в них, как это сделано в расширении VisualGDB, но это расширение платное и нет поддержки RTL чипов…

Далее заходим в свойства проекта и по порядку правим.

Вкладка General — тут правим папки для бинарников и указываем, где хранить лог:

B36-6.png

Вкладка Debugging (присутствует при наличии расширения Visual C++ for IoT Development и создании проекта из его шаблона), здесь одно из мест, где у меня не заработал относительный путь с использованием %PATH%, хотя в пользовательском %PATH% прописан путь к тулчейну, пришлось указывать абсолютный путь к GDB серверу:

B36-7

Возможно, что-то не так пробовал, и более компетентные люди в этом, надеюсь, подскажут в комментариях или сам найду-таки, как правильно это сделать.

Далее вкладка VC++ Directories — здесь нас интересует по большей части только Include Directories, это список всех директорий, которые нужно парсить IntelliSense (подсветка кода, функций и всё такое). Этот список реально огромен может быть, если хочется смотреть прям всё-всё…

B36-9.png

Здесь, опять же, вначале есть абсолютные пути — это Include папка из тулчейна, остальное независимо от расположения проекта.

И последняя вкладка — NMake, тут прописаны команды для исполнения (стандартные Build, Rebuild и Clean, для Rebuild я пока не делал отдельную команду, по хорошему надо там просто прописать полную очистку и просто дальнейшую компиляцию) и обьявления для всего проекта в случае проверки его IntelliSence, т.к. IntelliSence не подхватывает обьявления из project.mk, sdkset.mk и т.п., то их необходимо здесь вручную прописать в Preprocessor Definitions.

B36-10.png

Preprocessor Definitions в моём случае вышли такими:

B36-11

Про определения можно прочитать здесь — Predefined Macros. В итоге список определений стал таким (на скриншоте выше старый):

  • CONFIG_PLATFORM_8195A=1
  • GCC_ARMCM3
  • M3
  • F_CPU=166666666L
  • __STDC__
  • __extension__=

В конце статьи есть ссылка на тестовый проект, в котором поправлены многие пути, чуть исходники и он полностью компилируется и работает. В качестве исходного проекта был взят RTL00_WEB от 2017.09.27.

Компиляция проекта

Перед компиляцией рекомендую изменить одну настройку в Options среды:

B36-12

Убрать галочку с Always show Error List if build finishes with errors — т. к. ошибки показываются из внешнего тулчейна как обычный текст в Outputs, то авто переключение на Error List (от IntelliSence) не очень-то помогает.

Нажимаем F6 или Build и компиляция пройдёт успешно (здесь я намеренно опускаю довольно немало работы с makefile и сопутствующими файлами, в чём можно самостоятельно разобраться, изучив тестовый проект):

B36-13

Прошивка и отладка

С прошивкой всё легко, а вот с отладкой хоть и довольно просто, но в тоже время пока не очень удобно.

Для работы нам потребуется запустить GDB сервер командой [RTL] Start J-Link GDB Server M3, и если J-Link успешно подключается к SoC, то на заднем фоне у нас появляется и не закрывается окно GDB сервера (для не консольного варианта, если выбран консольный вариант, то лог выводится в Outputs):

B36-15.png

Теперь можно прошивать основную прошивку или образ файловой системы для WEB сервера, запускать прошивку из RAM или запускать отладку.

Для заливки основной прошивки запускаем команду [RTL] Flash and Run и в Outputs будет выводится ход заливки.

Для заливки образа файловой системы запускаем команду [RTL] Flash WEB Image, которая вначале обновляет образ WEB-диска в соответствии с файлами в %Project%\WEBFiles и затем заливает его во flash, ход заливки так же выводится в Outputs.

Для быстрого запуска прошивки из RAM есть команда [RTL] Run in RAM, в разы быстрее обычного процесса заливки прошивки, но новая прошивка сохраняется до переключения питания или сброса по WatchDog к примеру.

B36-18
Watch_Dogs 2 X__X

И отладка. Для отладки компилируем прошивку, заливаем:

B36-16

И жмём OCD GDB Debugger:

B36-17

Если всё подключилось без ошибок, можно ставить точки остановки (бряки). И при установке любой бряки появляется диалог:

B36-18.png

При нажатии на Break в котором выполнение прошивки ставится на паузу в том месте, где она сейчас выполняется, а если, к примеру, нужно посмотреть что-то в самом начале выполнения прошивки, то приходится поставить бряку и потом сбросить SoC командой [RTL] Reset CPU, что несколько не удобно. Возможно, я что-то делаю не так…

При отладке же можно смотреть всё, что душа пожелает (нажмите для увеличения):

Или добавлять что необходимо в окно Watch для удобного просмотра (нажмите для увеличения):

Дальше пока не вникал…

Вывод

Неоднозначный опыт получился. Вроде и удобно работать в Visual Studio — удобный редактор с богатыми возможностями по написанию кода\рефакторингу, но в тоже время предварительная подготовка требуется немалая + сам IntelliSence почему-то на *.c файлах довольно-таки подтупливает иногда (вроде бы больше затупливания стало, когда добавил Preprocessor Definitions). Может, сказывается обилие файлов, т. к. я добавил большую часть из USDK + пользовательские, но это всё-равно странно, т. к. большие проекты на C# при этом прекрасно парсятся и таких проблем не возникает (уже не говоря про Eclipse, там-то этот же проект парсится вполне нормально, хоть иногда и подсвечивает несуществующие ошибки, что тоже досадно… возможно, что-то надо ещё настроить или я просто пропустил). Но опыт действительно очень интересный, и благодаря этому я разобрался значительно лучше в самом проекте и его компиляции (это моё первое значительное продвижение в этом направлении, т. к. ранее с почти голыми Makefile проектами дела практически не имел и использовал почти готовое решение для написания прошивок в виде Keil uVision).

Ссылки

Arm-none-eabi, MinGW, Msys необходимых версий и сам тестовый проект можно скачать ниже. Установка не требуется, только прописывание пути в пользовательский PATH:

На этом пока всё. Ещё много вопросов осталось, как и недоделанных вещей, постараюсь и дальше дополнять эту статью по мере появления материала. Есть замечания или знаете как сделать лучше ? Пишите в комментариях, буду рад!

 

UPD 2017.10.31:

Обновлены Preprocessor Definitions.

UPD 2017.11.01:

Обновлены Preprocessor Definitions. После добавления последних двух объявлений почти все несуществующие ошибки перестали подсвечиваться, и значительно лучше работает IntelliSense. Остались только ошибки с объявлениями вида:

 #define DBG_TRACE(fmt, args...) 

Ругается на многоточие…

Также обновлен проект (с горстью рабочего хлама-примера по работе с MPU6050 и отправке по UDP), добавлена ссылка на последний вариант проекта.

Реклама

2 Comments »

  1. Отличный пост, то чего не хватало с момента появления RTL’ок. Мои действия:
    1) Созданный новый проект в MVS не имел вообще ничего -> закрыл, открыл «Тестовый проект (Первый вариант)».
    2) Линкеру указал только папки Incude у тулчейна. Ибо брать тот гигантский список негде, да и без списка ищет хорошо.
    3) В userset.mk поменял SDK_PATH на абсолютный ибо не работал сброс (что первое нажал), но потом вернул относительный и проблемы как и не было(магия), и Jlink путь на свой.
    4) Заработало. (не полностью -> какой-то страницы достаточно)
    5) A_D респект.

    Нравится

    • Честно говоря не ожидал, что кто-то еще захочет пойти таким же путём, рад что пригодились записки моего опыта! ;)
      И да, сейчас перенёс последние изменения с репозитория pvvx — там довольно важные изменения произошли с загрузчиком и появилась возможность загружать прошивку с SDRAM (а не только с SRAM) — позже опубликую порт.

      Так же заметил, что удобно добавлять в проект WEBFiles и её содержимое, VS прекрасно парсит HTML и JS файлы и удобно заниматься созданием WEB интерфейса (ранее почти не имел опыта в этом направлении).

      Нравится

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

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s