Jump to content

    
Sign in to follow this  
k155la3

FreeRTOS and CPP

Recommended Posts

Есть проект, писаный на CPP (IAR/MSP430).

Как правильно прикрутить проект к FreeRTOS ?

 

По-сути, прокт ++ не использует, только структуры и расширения синтаксиса.

В таком случае может следует переписать все с CPP на C ?

Edited by k155la3

Share this post


Link to post
Share on other sites
В таком случае может следует переписать все с CPP на C ?

Переписывать ничего не нужно.

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

 

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

В хидере
extern "C" int cSysClockWrapper( TSysClockType source );

В c++ коде
int cSysClockWrapper( TSysClockType source )
{
    return CSysClock::init( source );
}

Share this post


Link to post
Share on other sites

Ах, да.. забыл... нужно что-то решать с динамическим выделением памяти, если оно используется в проекте на си++. Яимею в виду new и delete. Т.к. менеджер кучи у FreeRTOS свой. Кстати, сразу рекомендую найти менеджер кучи, любезно выложенный zltigo. Над стандартным (я имею в виду из ОСи) он имеет некоторые преимущества.

Share this post


Link to post
Share on other sites
Ах, да.. забыл... нужно что-то решать с динамическим выделением памяти, если оно используется в проекте на си++. Яимею в виду 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*)
{
}

Share this post


Link to post
Share on other sites
а что там, собственно, решать?

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

 

 

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

Share this post


Link to post
Share on other sites
haker_fox, den_po спасибо за инф. и ссылки.

Курница док читаю, хорошо расписано, только мало.

Будем попробовать.

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

 

Но в целом у Курница объёмная статья. Самый полный и свежий материал только на офсайте :rolleyes:

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
haker_fox, о результатах чего? Если freertos + c++ - все хорошо, полет нормальный. Собственно иное было бы странно, с и с++ без проблем уживаются вместе :)

Я в этом не сомневался!

Share this post


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

 

 

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

 

Сомнения, до определенной степени, крайне полезны.

Проверить отработку конструкторов можно "оттрасировав" через дебагер стартап-код, который для CPP.

В (IAR) опциях проекта/дебагера надо заменить стандартную метку (которая соотв-ет main), на метку стартап-кода.

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

 

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

 

(Непомнящий Евгений @ Dec 18 2015, 13:18)

haker_fox, о результатах чего? Если freertos + c++ - все хорошо, полет нормальный. Собственно иное было бы странно, с и с++ без проблем уживаются вместе

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

 

Судя по включениям в h-файлы freeRTOS

#ifdef __cplusplus
extern "C" {
#endif

 

 

 

 

 

 

 

 

 

 

 

Share this post


Link to post
Share on other sites
Сомнения, до определенной степени, крайне полезны.

Проверить отработку конструкторов можно "оттрасировав" через дебагер стартап-код, который для CPP.

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

 

В (IAR) опциях проекта/дебагера надо заменить стандартную метку (которая соотв-ет main), на метку стартап-кода.

Обычно достаточно снять галочку возле "main"

Share this post


Link to post
Share on other sites
Обычно достаточно снять галочку возле "main"

Или в конструктор вставить printf, т.к. у меня нет дебаггера, если имеется в виду железный :rolleyes:

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this