IAR & static_cast<>
I’m trying to use FreeRTOS together with C++.
I’m using IAR AVR compiler.
All of FreeRTOS source files are compiled using the C compiler and my own code using Extended Embedded C++ compiler. All the code are compiled and linked togther without errors.
Inspired by a richard_damon post I’ve made a Runable class, see below.
Running my code I get an RStack warning (JTAGICE mkII)
Wed Jun 04 11:49:06 2008: Target reset
Wed Jun 04 11:49:16 2008: Program exit reached.
Wed Jun 04 11:49:17 2008: The stack ‘RStack’ is filled to 100% (32 bytes used out of 32). The warning threshold is set to 90.%
I’ve traced it down to being this static_cast causing the trouble.
(static_cast<Runable*>(parm))->Run();
If I comment the static_cast and uncomment the loop causing a led to flash everything works fine.
I have tried the same code using winavr c++ compiler and it works. Using the winavr compiler I compile everything using the c++ compiler. Therefore I have to change some cast here and there in the FreeRTOS code in order to satisfy the c++ compiler. When using IAR I can compile a "clean" FreeRTOS (without changing anything) using C compiler and my own code using C++. My guess is that its the reason for my troubles.
Can someone give me an explanation or even a way to fix it?
/Thomas
// runable.c
#include "runable.h"
//*****************************************************
Runable::Runable(unsigned priority, unsigned stacksize)
{
#if INCLUDE_vTaskDelayUntil
lastWakeTime = NULL;
#endif
xTaskCreate(&run, "", stacksize, this, priority, &handle);
}
//*****************
Runable::~Runable()
{
#if INCLUDE_vTaskDelete
vTaskDelete(handle);
#endif
}
#if INCLUDE_vTaskSuspend
//*********************
void Runable::Suspend()
{
vTaskSuspend(handle);
}
//********************
void Runable::Resume()
{
vTaskResume(handle);
}
#endif
#if INCLUDE_vTaskDelay
//*************************************
void Runable::Sleep(portTickType delay)
{
vTaskDelay(delay);
}
#endif
#if INCLUDE_vTaskDelayUntil
//**********************************************
void Runable::SleepUntil(portTickType increment)
{
if (lastWakeTime == NULL)
lastWakeTime = xTaskGetTickCount();
vTaskDelayUntil(&lastWakeTime, increment);
}
#endif
//***************************
void Runable::run(void* parm)
{
(static_cast<Runable*>(parm))->Run();
/*
for(;;)
{
PORTA = (PORTA & ~0x01) | (~PORTA & 0x01);
vTaskDelay( 100 );
}
*/
}
IAR & static_cast<>
So the problem seems to be when linking C with C++ code. Is this correct? Can you compile the whole thing as C++ as when using the WinAVR compiler?
Regards.
IAR & static_cast<>
I managed to figure it out. I had some errors in my port causing the stack to be currupt.