Узнаем, как проект на языке Си, созданный с помощью STM32CubeMX, преобразовать в проект объектно-ориентированного языка C++.
Предыдущий урок Список уроков Следующий урок
Опять подготовительный урок, опять не пишем программу, опять не про кнопки. Хотел затронуть эту тему мимоходом, затем решил выделить в отдельный урок. Задачу конвертации проекта придется решать всем. А искать тему, как раздел в уроке намного сложнее, чем найти отдельный урок.
С помощью пакета STM32CubeMX мы создали проект. Но это оказался проект для классического языка Си, не объектно-ориентированного языка. Если мы в любой из наших учебных проектов попробуем вставить описание класса, то при компиляции получим сообщение об ошибке. Ключевое слово class компилятор не понимает.
Но мы собираемся использовать возможности объектно-ориентированного языка. Конечно, Ардуино несколько злоупотребляет классами, но во многих случаях без них не обойтись.
Надо конвертировать наш проект в проект Си++. Насколько я знаю, не существует программ, способных это сделать автоматически. Но это несложно. Необходимо выполнить несколько формальных действий.
В папке Lesson я создал папку Lesson11 и скопировал туда учебный проект Lesson9_1.
В этом проекте используются функции библиотек HAL и LL. Проверим обе библиотеки.
Переименовываем его в Lesson11_1.
Откроем проект в IDE Atollic TrueStudio. Там он у нас все равно отображается, как Lesson9_1.
Нажмем на имя проекта правой кнопкой мыши, выберем Rename (Переименовать) и зададим новое имя Lesson11_1.
Получится проект C с новым именем Lesson11_1.
Его мы будем преобразовывать в проект C++.
Надо выполнить 3 действия.
- Переименовать файлы с расширением .c в папке Src в файлы с такими же именами, но расширением .cpp.
Сделать это проще всего также, как мы переименовали весь проект. А именно, нажатием на имя файла в проекте правой кнопкой мыши и выбором пункта Rename.
В нашем проекте это 4 файла.
- Любым текстовым редактором открываем в проекте файл .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.
Затем Tool Settings.
Выбираем в левом столбце C Compilier -> Symbols.
Выделяем и копируем настройки в буфер (Ctrl+Insert).
Нажимаем в левом столбце C++ Compilier -> Symbols и копируем настройки в окно для C++ (Shift+Insert).
Тоже самое делаем для C Compilier -> 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;
Компиляция происходит без ошибок. Можно заниматься объектно-ориентированным программированием.
Вот ссылка на полный проект:
Еще раз последовательность действий:
- Переименовать C-файлы (.c) с исходным текстом в C++ файлы (.cpp).
- Добавить строчку в файл .project.
- Продублировать настройки для C-проекта в настройки проекта C++.
Если компилятор выдаст ошибку о дублировании определения функций (redefinition), то может потребоваться добавить модификатор extern.
К сожалению, изменение конфигурации с помощью STM32CubeMX уже невозможно. Это придется делать вручную. STM32CubeMX будет изменять файл main.c.
Надеюсь, в следующем уроке займемся обработкой сигнала кнопки.
Спасибо за совет, как я могу Вас отблагодарить?
Всего 25 руб. в месяц за доступ ко всем ресурсам сайта
и как это сделать?
Здравствуйте!
Зарегистрируйтесь на сайте, нажмите на любую ссылку оплатить … После этого все ссылки будут открытыми. Конечно, если вы войдете на сайт под своим логином.
Создал новый проект в кубе. С 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;
}
Если удалить эту функцию, тогда компилируется. Но так же нельзя…
Хотя удалил файл из проекта совсем. Компилируется.
Создал новый проект в кубе. С 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;
}
Если удалить эту функцию, тогда компилируется. Но так же нельзя…
Такой же вопрос. Как правильно решить это недоразумение???
Собирал в CubeMX Version 5.2.1
Добрый день. Сделал все как написано, код компилируется, но при прошивке выдает ошибку
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.
чтобы заработало классы в keil нужно тыкнуть на main.c в окне project. далее options for file там выбрать file Type C++
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
а как исправить данную ошибку ??? Здравствуйте
Здравствуйте.
у меня в Project -> Build Settings -> Tool Settings
нету вкладки C++ Compilier.
Atollic TrueSTUDIO® for STM32, Built on Eclipse Neon.1a.
Version: 9.3.0
Build id: 20190212-0734
Привет! Такая же проблема была. Установил версию 9.0.0 и там все как в уроке.
В новой версии Atollic 9.3 надо сначала сделать преобразование
выбрать проект левым кликом, нажать правой кнопкой по проекту -> New -> Convert to a C/C++ Project (Adds C/C++ Nature) будет выбран радиобутон C++, жмем Finish.
Результат появляется в -> Project -> Build Settings -> Tool Settings вкладка C++ Compilier в которой будут копии вкладки C Compilier .
В Symbols добавляете первые две строчки как у Эдуарда.
остальное как в уроке только в файл syscalls.c не добавляете плюсовое расширение.
Владислав, не знаю когда была проблема, но когда сделал проект новый, то C++ Compilier появился, а когда просто папки копировал — нету.
Но зато потом выдась ошибка в файле syscalls.cpp и в нём функция:
int _link(char *old, char *new)
{
errno = EMLINK;
return -1;
}
Я этот файл просто удаляю из проекта в Атолик и все работает нормально. Я обратил внимание, что в моем проекте, который мне создает Кьюб Микс этого файла нет в папке проекта, но он появляется в директории проекта в среде разработки. В готовом проекте, скачанном на сайте, этот файл присутствует.
В С++ new — ключевое слово. Если в параметрах функции заменить new на New все компилируется.
Во-первых хотел поблагодарить за уроки.
А во-вторых хотел сказать, что в среде CubeIDE есть возможность как создать проект изначально на плюсах, так и делать преобразования в процессе программирования просто нажатием кнопки Convert to C/C++. При этом из самой среды доступен к открытию файл *.ioc, т.е. можно без использования Cube настраивать тактирование, выводы и порты прямо в этой IDE.
А можно по подробнее ?
Где эта кнопка находится в кубеИДЕ ?
а потом при генерации проекта из КУБИДЕ не собьётся обратно в С?
Добрый вечер, сделал всё как в уроке. Атолик выдаёт шесть предупреждений о том, что не может найти путь:
Invalid project path: Include path not found (Lesson11_1\#undef __ARM_FEATURE_FMA). Lesson11_1
Здравствуйте!
Попробуйте запустить мой проект.
Внимательно по шагам выполните то, что написано в уроке.
Пошёл чуть дальше: начал выполнять урок 13. Всё собралось нормально.
Оказывается, что предупреждения о не найденном пути возникают после: «Добавить строчку в файл .project.» Пока не разобрался почему в уроке 13 такого не происходит.
надо менять название файлов .с только в папке scr или во всем проекте?
только в папке scr
а как это сделать в Cube IDE?
Создаешь проект, язык выбираешь C++.
Нужно переименовать все файлы кроме syscalls.c и все.
У меня все работает
В STM32CubeIDE 1.10.1 также нужно оставить syscalls.c без изменения.
В cube ide оказалось проще. Переименовал файл мэин, остальные трогать не нужно если это не другие ваши библиотеки с с++ кодом. и на проекте кликнул мышкой выбрав «преобразовать проект в с++» и всё, не нужно заходить в настройки компилятора и копировать параметры. PS я долго пытался установить аттолик но кум мх не видит эту ide да же если я устанавливаю с начала аттолик без всего остального.
В кубиде после того как нажимаю девайс конфигурэшн тул создается новый main.c файл, при этом main.cpp программа не видит.
В STM32CubeIDE 1.10.1 конвертация происходит путем выбора пункта контекстного меню (правой кнопкой мыши на проекте) проекта «Convert to C++». Затем необходим изменить расширение файла main. После этого компиляция выполняется без ошибок.