реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Keil ARM c project => c++, Желательно не трогая автокод CubeMX HAL + FreeRTOS
MrYuran
сообщение Feb 7 2018, 12:12
Сообщение #1


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



В общем, в проект, созданный кубом и допиленный ручками, нужно вставить С++ функционал.
Преобразование main.c в срр и добавление ключа --сpp вываливает кучу ошибок в файлах HAL-FreeRTOS

Вопрос, что я делаю не так.
И что надо делать, чтобы так.

Желательно с возможностью перегенерации хала и вставки в проект минимальной кровью.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 7 2018, 13:16
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Так --cpp11 добавьте к нужному файлу, а не всему проекту.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 7 2018, 13:19
Сообщение #3


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Вроде что-то получилось путем расставления разных галочек (ох уж эта обманчивая красота подобных систем)

осталось вот что:
Код
/* DMA memory to memory transfer handles -------------------------------------*/
extern void _Error_Handler(char*, int);


и ошибка
Цитата
../Inc/dma.h(62): error: #337: linkage specification is incompatible with previous "_Error_Handler" (declared at line 80 of "../Inc/main.h")


Кажись, дошло.. сейчас проверю.

Точно. Добавил скобки
Код
#ifdef __cplusplus
extern "C" {
#endif


в main.h

Все скомпилилось, но теперь проблема в линкере

Цитата
Error: L6218E: Undefined symbol MX_FREERTOS_Init() (referred from main.o).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Feb 7 2018, 13:45
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Либо все сишные хедеры добавить
Цитата
#ifdef __cplusplus
extern "C" {
#endif
- должно полегчать.
Либо во всех cpp файлах инклуды из С обрамлять:
Цитата
#ifdef __cplusplus
extern "C" {
#endif
#include "..."
#ifdef __cplusplus
}
#endif
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 7 2018, 13:46
Сообщение #5


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Все, заработало.
применил галочки --сpp и __cplusplus к freertos.c, который кубом сгенерен, и все получилось.

Осталось залить и проверить, что ничего не сломалось (исходник пока чисто сишный, но на class уже не ругается)

UPD
Все OK, всем спасибо (на сегодня)


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Professor Chaos
сообщение Jun 28 2018, 19:32
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 25-08-17
Пользователь №: 98 970



Вопрос знатокам от телезрителей biggrin.gif
Есть С++ проект для ARM.
Есть стартап файл на ассемблере. Там определены обработчики прерываний-заглушки (вечный цикл ), которые можно переопределить в своём коде на С или С++ (те, что с [WEAK]). Но есть один нюанс. Кейл требует, чтобы эти самые переопределённые в моём коде обработчики были в стандарте С. Т.е. обработчик я должен писать используя лишь синтаксис и средства С. В своих обработчиках я не могу применять средства С++, не являющиеся подмножеством С. А именно:
- булевый тип данных;
- вызов методов классов;
- пергружаемые функции;
- ряд спецификаторов/квалификаторов
- может ещё что-то пропустил или не вспомнил

В связи с этим вопрос: есть ли способ как-то уговорить Кейл разрешить использовать синтаксис и возможности С++ в переопределённых обработчиках прерываний? Или это принципиально невозможно? Такое вот принципиальное ограничение Кейла?
Go to the top of the page
 
+Quote Post
x893
сообщение Jun 28 2018, 20:29
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Можете посмотреть https://www.numworks.com/
там всё на С++ сделано.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 29 2018, 07:34
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Professor Chaos @ Jun 28 2018, 22:32) *
. . . использовать синтаксис и возможности С++ в переопределённых обработчиках прерываний? Или это принципиально невозможно? . . .

может
Код
#ifdef __cplusplus
extern "C" {
#endif
Проект CPP, с использованием модулей на C.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 29 2018, 08:10
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Kabdim @ Feb 7 2018, 16:45) *
Либо во всех cpp файлах инклуды из С обрамлять:
А зачем внутри .cpp проверять #ifdef __cplusplus? Он же там будет по определению.

QUOTE (Professor Chaos @ Jun 28 2018, 22:32) *
Кейл требует, чтобы эти самые переопределённые в моём коде обработчики были в стандарте С
Кейл тут ни при чем. Искажение имен (name mangling) - штатное поведение любого компилятора C++. Обходится элементарно:
CODE
extern "C" void DMA1_Stream6_IRQHandler()
{
    GSM_serial.tx_dma_handler();
}


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Professor Chaos
сообщение Jun 29 2018, 19:07
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 25-08-17
Пользователь №: 98 970



Цитата(k155la3 @ Jun 29 2018, 10:34) *
может
Код
#ifdef __cplusplus
extern "C" {
#endif
Проект CPP, с использованием модулей на C.

Именно так сейчас и написано. Вот только в коде такой функции (внутри блока extern "C" { }) нельзя применять синтаксис С++. Только С. Мой вопрос - как обойти это ограничение.

Цитата(Сергей Борщ @ Jun 29 2018, 11:10) *
Кейл тут ни при чем. Искажение имен (name mangling) - штатное поведение любого компилятора C++. Обходится элементарно:
Код
extern "C" void DMA1_Stream6_IRQHandler()
{
    GSM_serial.tx_dma_handler();
}

Т.е. внутри С функции-обработчика вызвать С++ функцию? Просто и гениально!
А вложенную С++ функцию можно объявить как
Код
GSM_class GSM_serial;
inline void GSM_class::tx_dma_handler();

Тогда и лишнего вложения функций не произойдёт, внутренняя просто подставится в обработчик прерывания.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 29 2018, 20:54
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Professor Chaos @ Jun 29 2018, 22:07) *
Именно так сейчас и написано. Вот только в коде такой функции (внутри блока extern "C" { }) нельзя применять синтаксис С++. Только С.
Нет, тут вы не правы. extern "C" в любой форме никак не влияет на содержимое функции. Он только определяет тип связывания (linkage). Так что никто не мешает внутри нее использовать любые допустимые для плюсов конструкции, кроме перегрузки имен (для которой как раз и придумано искажение имен). Т.е. нельзя создать две extern "C" функции с одинаковым именем, отличающиеся только лишь списком параметров. Что я и показал - в голых Сях нет функций-членов, поэтому вызов функции-члена - это самый настоящий плюсовый код. Без extern "C" имя функции в объектном файле будет искажено и редактор связей (линкер) просто не сможет связать искаженное имя из плюсового объектного файла с неискаженным именем из сишного.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Professor Chaos
сообщение Jun 30 2018, 07:24
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 25-08-17
Пользователь №: 98 970



Цитата(Сергей Борщ @ Jun 29 2018, 23:54) *
Нет, тут вы не правы. extern "C" в любой форме никак не влияет на содержимое функции. Он только определяет тип связывания (linkage). Так что никто не мешает внутри нее использовать любые допустимые для плюсов конструкции, кроме перегрузки имен (для которой как раз и придумано искажение имен).

Спасибо за подробное разъяснение.
А то я подумал, что С++ код внутри функции, определённой со спецификатором extern "C" работать не будет.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th April 2024 - 20:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01478 секунд с 7
ELECTRONIX ©2004-2016