Урок 11. Конвертирование проекта для STM32 на языке C в проект C++.

Уроки STM32

Узнаем, как проект на языке Си, созданный с помощью STM32CubeMX, преобразовать в проект объектно-ориентированного языка C++.

Предыдущий урок     Список уроков     Следующий урок

Опять подготовительный урок, опять не пишем программу, опять не про кнопки. Хотел затронуть эту тему мимоходом, затем решил выделить в отдельный урок. Задачу конвертации проекта придется решать всем. А искать тему, как раздел в уроке намного сложнее, чем найти отдельный урок.

 

С помощью пакета STM32CubeMX мы создали проект. Но это оказался проект для классического языка Си, не объектно-ориентированного языка. Если мы в любой из наших учебных проектов попробуем вставить описание класса, то при компиляции получим сообщение об ошибке. Ключевое слово class компилятор не понимает.

Но мы собираемся использовать возможности объектно-ориентированного языка. Конечно, Ардуино несколько злоупотребляет классами, но во многих случаях без них не обойтись.

Надо конвертировать наш проект в проект Си++. Насколько я знаю, не существует программ, способных это сделать автоматически. Но это несложно. Необходимо выполнить несколько формальных действий.

 

В папке Lesson я создал папку Lesson11 и скопировал туда учебный проект Lesson9_1.

Исходное имя

В этом проекте используются функции библиотек HAL и LL. Проверим обе библиотеки.

Переименовываем его в Lesson11_1.

Новое имя

Откроем проект в IDE Atollic TrueStudio. Там он у нас все равно отображается, как Lesson9_1.

Atollic TrueStudio

Нажмем на имя проекта правой кнопкой мыши, выберем Rename (Переименовать) и зададим новое имя Lesson11_1.

Получится проект C с новым именем Lesson11_1.

Atollic TrueStudio

Его мы будем преобразовывать в проект C++.

Надо выполнить 3 действия.

  • Переименовать файлы с расширением .c в папке Src в файлы с такими же именами, но расширением .cpp.

Сделать это проще всего также, как мы переименовали весь проект. А именно, нажатием на имя файла в проекте правой кнопкой мыши и выбором пункта Rename.

IDE

В нашем проекте это 4 файла.

IDE

  • Любым текстовым редактором открываем в проекте файл .project

Папка

и между тегами <nature >добавляем в него строку:

<nature>org.eclipse.cdt.core.ccnature</nature>

Должно получиться:

<natures>
    <nature>org.eclipse.cdt.core.cnature</nature>
    <nature>org.eclipse.cdt.core.ccnature</nature>
    <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
    <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
</natures>

Я копировал верхнюю строку и добавил одну букву c.

  • Остается копировать настройки C проекта в проект C++.

Выбираем в верхнем меню Project -> Build Settings.

Build Settings

Затем Tool Settings.

Tool Settings

Выбираем в левом столбце C Compilier -> Symbols.

Symbols

Выделяем и копируем настройки в буфер (Ctrl+Insert).

Нажимаем в левом столбце C++ Compilier -> Symbols и копируем настройки в окно для C++ (Shift+Insert).

Копирование настроек

Тоже самое делаем для  C Compilier -> Directories.

Directories

Компилируем. Ошибок нет.

Давайте для проверки объявим в программе класс.

Откроем файл main.cpp и добавим в него описание класса tst и создадим экземпляр класса tst1.

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

class tst{
    public:
        int x;
    private:
        int y;
};

tst tst1; // экземпляр класса tst

Можно в функции main() присвоить значение свойству класса.

/* USER CODE BEGIN 1 */

    tst1.x = 15;

Компиляция происходит без ошибок. Можно заниматься объектно-ориентированным программированием.

Вот ссылка на полный проект:

  Зарегистрируйтесь и оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!  

Еще раз последовательность действий:

  • Переименовать C-файлы (.c) с исходным текстом в C++ файлы (.cpp).
  • Добавить строчку в файл .project.
  • Продублировать настройки для C-проекта в настройки проекта C++.

Если компилятор выдаст ошибку о дублировании определения функций (redefinition), то может потребоваться добавить модификатор extern.

К сожалению, изменение конфигурации с помощью STM32CubeMX уже невозможно. Это придется делать вручную. STM32CubeMX будет изменять файл main.c.

 

Надеюсь, в следующем уроке займемся обработкой сигнала кнопки.

Предыдущий урок     Список уроков     Следующий урок

0

Автор публикации

не в сети 1 неделя

Эдуард

165
Комментарии: 1603Публикации: 161Регистрация: 13-12-2015

24 комментария на «Урок 11. Конвертирование проекта для STM32 на языке C в проект C++.»

    • Здравствуйте!
      Зарегистрируйтесь на сайте, нажмите на любую ссылку оплатить … После этого все ссылки будут открытыми. Конечно, если вы войдете на сайт под своим логином.

      0
  1. Создал новый проект в кубе. С LL драйверами. Переделал по этому уроку. Компилирую и получаю ошибку:
    ..\Src\syscalls.cpp:188:28: error: expected ‘,’ or ‘…’ before ‘new’
    int _link(char *old, char *new)
    ^~~
    В этой строчке:
    int _link(char *old, char *new)
    {
    errno = EMLINK;
    return -1;
    }
    Если удалить эту функцию, тогда компилируется. Но так же нельзя…

    0
  2. Создал новый проект в кубе. С LL драйверами. Переделал по этому уроку. Компилирую и получаю ошибку:
    ..\Src\syscalls.cpp:188:28: error: expected ‘,’ or ‘…’ before ‘new’
    int _link(char *old, char *new)
    ^~~
    В этой строчке:
    int _link(char *old, char *new)
    {
    errno = EMLINK;
    return -1;
    }
    Если удалить эту функцию, тогда компилируется. Но так же нельзя…

    Такой же вопрос. Как правильно решить это недоразумение???

    0
  3. Добрый день. Сделал все как написано, код компилируется, но при прошивке выдает ошибку

    This is a bug, please report it. For instructions, see:
    ./home/build/gcc-arm-none-eabi-6-2017-q1-update/src/gdb/gdb/cp-namespace.c:343: internal-error: cp_search_static_and_baseclasses: Assertion `name[prefix_len + 1] == ‘:» failed.
    A problem internal to GDB has been detected,
    further debugging may prove unreliable.
    Quit this debugging session? (y or n) [answered Y; input not from terminal]

    /home/build/gcc-arm-none-eabi-6-2017-q1-update/src/gdb/gdb/cp-namespace.c:343: internal-error: cp_search_static_and_baseclasses: Assertion `name[prefix_len + 1] == ‘:» failed.
    A problem internal to GDB has been detected,
    further debugging may prove unreliable.

    0
  4. чтобы заработало классы в keil нужно тыкнуть на main.c в окне project. далее options for file там выбрать file Type C++

    0
  5. Description Resource Path Location Type
    undefined reference to `Debounce::Debounce(GPIO_TypeDef*, unsigned short, unsigned long)’ main.cpp /Lesson_Debounce/Src line 66 C/C++ Problem
    а как исправить данную ошибку ??? Здравствуйте

    0
  6. Здравствуйте.

    у меня в Project -> Build Settings -> Tool Settings
    нету вкладки C++ Compilier.

    Atollic TrueSTUDIO® for STM32, Built on Eclipse Neon.1a.
    Version: 9.3.0
    Build id: 20190212-0734

    0
    • Привет! Такая же проблема была. Установил версию 9.0.0 и там все как в уроке.

      0
  7. Владислав, не знаю когда была проблема, но когда сделал проект новый, то C++ Compilier появился, а когда просто папки копировал — нету.

    Но зато потом выдась ошибка в файле syscalls.cpp и в нём функция:

    int _link(char *old, char *new)
    {
    errno = EMLINK;
    return -1;
    }

    0
    • Я этот файл просто удаляю из проекта в Атолик и все работает нормально. Я обратил внимание, что в моем проекте, который мне создает Кьюб Микс этого файла нет в папке проекта, но он появляется в директории проекта в среде разработки. В готовом проекте, скачанном на сайте, этот файл присутствует.

      0
  8. Во-первых хотел поблагодарить за уроки.
    А во-вторых хотел сказать, что в среде CubeIDE есть возможность как создать проект изначально на плюсах, так и делать преобразования в процессе программирования просто нажатием кнопки Convert to C/C++. При этом из самой среды доступен к открытию файл *.ioc, т.е. можно без использования Cube настраивать тактирование, выводы и порты прямо в этой IDE.

    0
    • А можно по подробнее ?
      Где эта кнопка находится в кубеИДЕ ?
      а потом при генерации проекта из КУБИДЕ не собьётся обратно в С?

      0
  9. Добрый вечер, сделал всё как в уроке. Атолик выдаёт шесть предупреждений о том, что не может найти путь:

    Invalid project path: Include path not found (Lesson11_1\#undef __ARM_FEATURE_FMA). Lesson11_1

    0
      • Пошёл чуть дальше: начал выполнять урок 13. Всё собралось нормально.
        Оказывается, что предупреждения о не найденном пути возникают после: «Добавить строчку в файл .project.» Пока не разобрался почему в уроке 13 такого не происходит.

        0
    • Создаешь проект, язык выбираешь C++.
      Нужно переименовать все файлы кроме syscalls.c и все.
      У меня все работает

      0

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

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

Нажимая кнопку "Отправить" Вы даёте свое согласие на обработку введенной персональной информации в соответствии с Федеральным Законом №152-ФЗ от 27.07.2006 "О персональных данных".