MrYuran 17 7 февраля, 2018 Опубликовано 7 февраля, 2018 · Жалоба В общем, в проект, созданный кубом и допиленный ручками, нужно вставить С++ функционал. Преобразование main.c в срр и добавление ключа --сpp вываливает кучу ошибок в файлах HAL-FreeRTOS Вопрос, что я делаю не так. И что надо делать, чтобы так. Желательно с возможностью перегенерации хала и вставки в проект минимальной кровью. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 7 февраля, 2018 Опубликовано 7 февраля, 2018 · Жалоба Так --cpp11 добавьте к нужному файлу, а не всему проекту. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 17 7 февраля, 2018 Опубликовано 7 февраля, 2018 · Жалоба Вроде что-то получилось путем расставления разных галочек (ох уж эта обманчивая красота подобных систем) осталось вот что: /* 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 7 февраля, 2018 Опубликовано 7 февраля, 2018 · Жалоба Либо все сишные хедеры добавить #ifdef __cplusplus extern "C" { #endif - должно полегчать. Либо во всех cpp файлах инклуды из С обрамлять: #ifdef __cplusplus extern "C" { #endif #include "..." #ifdef __cplusplus } #endif Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 17 7 февраля, 2018 Опубликовано 7 февраля, 2018 · Жалоба Все, заработало. применил галочки --сpp и __cplusplus к freertos.c, который кубом сгенерен, и все получилось. Осталось залить и проверить, что ничего не сломалось (исходник пока чисто сишный, но на class уже не ругается) UPD Все OK, всем спасибо (на сегодня) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 28 июня, 2018 Опубликовано 28 июня, 2018 · Жалоба Вопрос знатокам от телезрителей :biggrin: Есть С++ проект для ARM. Есть стартап файл на ассемблере. Там определены обработчики прерываний-заглушки (вечный цикл ), которые можно переопределить в своём коде на С или С++ (те, что с [WEAK]). Но есть один нюанс. Кейл требует, чтобы эти самые переопределённые в моём коде обработчики были в стандарте С. Т.е. обработчик я должен писать используя лишь синтаксис и средства С. В своих обработчиках я не могу применять средства С++, не являющиеся подмножеством С. А именно: - булевый тип данных; - вызов методов классов; - пергружаемые функции; - ряд спецификаторов/квалификаторов - может ещё что-то пропустил или не вспомнил В связи с этим вопрос: есть ли способ как-то уговорить Кейл разрешить использовать синтаксис и возможности С++ в переопределённых обработчиках прерываний? Или это принципиально невозможно? Такое вот принципиальное ограничение Кейла? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 40 28 июня, 2018 Опубликовано 28 июня, 2018 · Жалоба Можете посмотреть https://www.numworks.com/ там всё на С++ сделано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 29 июня, 2018 Опубликовано 29 июня, 2018 · Жалоба . . . использовать синтаксис и возможности С++ в переопределённых обработчиках прерываний? Или это принципиально невозможно? . . . может #ifdef __cplusplus extern "C" { #endif Проект CPP, с использованием модулей на C. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 29 июня, 2018 Опубликовано 29 июня, 2018 · Жалоба Либо во всех cpp файлах инклуды из С обрамлять:А зачем внутри .cpp проверять #ifdef __cplusplus? Он же там будет по определению. Кейл требует, чтобы эти самые переопределённые в моём коде обработчики были в стандарте СКейл тут ни при чем. Искажение имен (name mangling) - штатное поведение любого компилятора C++. Обходится элементарно: extern "C" void DMA1_Stream6_IRQHandler() { GSM_serial.tx_dma_handler(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 29 июня, 2018 Опубликовано 29 июня, 2018 · Жалоба может #ifdef __cplusplus extern "C" { #endif Проект CPP, с использованием модулей на C. Именно так сейчас и написано. Вот только в коде такой функции (внутри блока extern "C" { }) нельзя применять синтаксис С++. Только С. Мой вопрос - как обойти это ограничение. Кейл тут ни при чем. Искажение имен (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(); Тогда и лишнего вложения функций не произойдёт, внутренняя просто подставится в обработчик прерывания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 29 июня, 2018 Опубликовано 29 июня, 2018 · Жалоба Именно так сейчас и написано. Вот только в коде такой функции (внутри блока extern "C" { }) нельзя применять синтаксис С++. Только С.Нет, тут вы не правы. extern "C" в любой форме никак не влияет на содержимое функции. Он только определяет тип связывания (linkage). Так что никто не мешает внутри нее использовать любые допустимые для плюсов конструкции, кроме перегрузки имен (для которой как раз и придумано искажение имен). Т.е. нельзя создать две extern "C" функции с одинаковым именем, отличающиеся только лишь списком параметров. Что я и показал - в голых Сях нет функций-членов, поэтому вызов функции-члена - это самый настоящий плюсовый код. Без extern "C" имя функции в объектном файле будет искажено и редактор связей (линкер) просто не сможет связать искаженное имя из плюсового объектного файла с неискаженным именем из сишного. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 30 июня, 2018 Опубликовано 30 июня, 2018 · Жалоба Нет, тут вы не правы. extern "C" в любой форме никак не влияет на содержимое функции. Он только определяет тип связывания (linkage). Так что никто не мешает внутри нее использовать любые допустимые для плюсов конструкции, кроме перегрузки имен (для которой как раз и придумано искажение имен). Спасибо за подробное разъяснение. А то я подумал, что С++ код внутри функции, определённой со спецификатором extern "C" работать не будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться