Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FreeRTOS and CPP
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
k155la3
Есть проект, писаный на CPP (IAR/MSP430).
Как правильно прикрутить проект к FreeRTOS ?

По-сути, прокт ++ не использует, только структуры и расширения синтаксиса.
В таком случае может следует переписать все с CPP на C ?
haker_fox
QUOTE (k155la3 @ Dec 15 2015, 21:25) *
В таком случае может следует переписать все с CPP на C ?

Переписывать ничего не нужно.
Сначала полезные статьи Курниц А. Операционная система FreeRTOS, а здесь про FreeRTOS и Си++.

Моё видение следующее: добавить директорию с ОС к проекту. В настройках компилятора указать компиляцию по расширению файлов. Таким образом ОС компилируется сишным, а всё остальное си++-ным компилятором. Возможно, что можно и всё компилировать под Си++. Но у меня валится пара ошибок, разбираться не хочется. Далее. Вы создаёте задачи, и которых вызвыаете Си++ код. В этом коде можете вызывать сервисы ОС. Единственное, что при вызове кода Си++ из Си могут возникать проблемы, тогда нужно делать как-то так
CODE
В хидере
extern "C" int cSysClockWrapper( TSysClockType source );

В c++ коде
int cSysClockWrapper( TSysClockType source )
{
    return CSysClock::init( source );
}
haker_fox
Ах, да.. забыл... нужно что-то решать с динамическим выделением памяти, если оно используется в проекте на си++. Яимею в виду new и delete. Т.к. менеджер кучи у FreeRTOS свой. Кстати, сразу рекомендую найти менеджер кучи, любезно выложенный zltigo. Над стандартным (я имею в виду из ОСи) он имеет некоторые преимущества.
den_po
Цитата(haker_fox @ Dec 16 2015, 04:49) *
Ах, да.. забыл... нужно что-то решать с динамическим выделением памяти, если оно используется в проекте на си++. Яимею в виду new и delete.

а что там, собственно, решать?
Код
void* operator new(size_t sz)
{
    return pvPortMalloc(sz);
}
void* operator new[](size_t sz)
{
    return pvPortMalloc(sz);
}
void operator delete(void* p)
{
    vPortFree(p);
}
void operator delete[](void* p)
{
    vPortFree(p);
}
void* operator new(size_t size, void* p)
{
    (void)size;
    return p;
}
void* operator new[](size_t size, void* p)
{
    (void)size;
    return p;
}
void operator delete(void*, void*)
{
}
void operator delete[](void*, void*)
{
}
haker_fox
QUOTE (den_po @ Dec 16 2015, 12:30) *
а что там, собственно, решать?

На данном этапе я этого не знал. Но приведённый вами код - скорее всего решение всех проблем, в том числе и моих (сам занимаюсь этим вопросом).


Сомневаюсь, что только конструкторы объектов будут выполняться.
den_po
Будут
k155la3
haker_fox, den_po спасибо за инф. и ссылки.
Курница док читаю, хорошо расписано, только мало.
Будем попробовать.
haker_fox
QUOTE (k155la3 @ Dec 17 2015, 15:02) *
haker_fox, den_po спасибо за инф. и ссылки.
Курница док читаю, хорошо расписано, только мало.
Будем попробовать.

Пожалуйста! rolleyes.gif Если не сложно, отпишитесь, пожалуйста, о результатах. Ибо сейчас на этом пути сам. Опыт добываю. Может быть что-то полезное для себя узнаю.

Но в целом у Курница объёмная статья. Самый полный и свежий материал только на офсайте rolleyes.gif
Непомнящий Евгений
haker_fox, о результатах чего? Если freertos + c++ - все хорошо, полет нормальный. Собственно иное было бы странно, с и с++ без проблем уживаются вместе sm.gif
haker_fox
QUOTE (Непомнящий Евгений @ Dec 18 2015, 13:18) *
haker_fox, о результатах чего? Если freertos + c++ - все хорошо, полет нормальный. Собственно иное было бы странно, с и с++ без проблем уживаются вместе sm.gif

Я в этом не сомневался!
k155la3
Цитата(haker_fox @ Dec 16 2015, 09:36) *
На данном этапе я этого не знал. Но приведённый вами код - скорее всего решение всех проблем, в том числе и моих (сам занимаюсь этим вопросом).


Сомневаюсь, что только конструкторы объектов будут выполняться.


Сомнения, до определенной степени, крайне полезны.
Проверить отработку конструкторов можно "оттрасировав" через дебагер стартап-код, который для CPP.
В (IAR) опциях проекта/дебагера надо заменить стандартную метку (которая соотв-ет main), на метку стартап-кода.
Но это занятие для интелектуалов - вызовы конструкторов (насколько я понял) идут косвено-таблично-списком sm.gif

По результатам оперативно не отчитаюсь, тк. сейчас надо выгонять функциональную-прикладную часть проекта ( на С)

Цитата(Непомнящий Евгений)
(Непомнящий Евгений @ Dec 18 2015, 13:18)
haker_fox, о результатах чего? Если freertos + c++ - все хорошо, полет нормальный. Собственно иное было бы странно, с и с++ без проблем уживаются вместе

В общем-то, ДА.

Судя по включениям в h-файлы freeRTOS
Код
#ifdef __cplusplus
extern "C" {
#endif











den_po
Цитата(k155la3 @ Dec 20 2015, 12:42) *
Сомнения, до определенной степени, крайне полезны.
Проверить отработку конструкторов можно "оттрасировав" через дебагер стартап-код, который для CPP.

Это если речь о конструкторах глобальных объектов или статических членов классов. А выше разговор шёл об использовании new.

Цитата(k155la3 @ Dec 20 2015, 12:42) *
В (IAR) опциях проекта/дебагера надо заменить стандартную метку (которая соотв-ет main), на метку стартап-кода.

Обычно достаточно снять галочку возле "main"
haker_fox
QUOTE (den_po @ Dec 20 2015, 17:55) *
Обычно достаточно снять галочку возле "main"

Или в конструктор вставить printf, т.к. у меня нет дебаггера, если имеется в виду железный rolleyes.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.