vApplicationIdleHook in a C++ application
I am using ZYNQ on a MicroZed
My application is defined as a C++ application !
Below is the absolute minimum program
void vApplicationIdleHook( void );
void MyTask(void* param)
{
for(;;){
print(“blah blahn”);
vTaskDelay(100);
}
}
void vApplicationIdleHook( void )
{
int i=0;
for(;;){
i++; //In my application will never be called
}
int main()
{
xTaskCreate( MyTask, “MyTask”, 1024, NULL, 2, NULL);
vTaskStartScheduler();
for(;;)
return 0;
}
FreeRTOS provides an idle task function called
void vApplicationIdleHook( void ) attribute((weak)); //in portZynq7000.c
To enable the idle function you must
define configUSEIDLEHOOK 1 //in FreeRTOSConfig.h
Since the idle hook function is declared as “weak”, I should be able to override
it inside my own application simply by declaring and defining it again like usual
This works just fine in C and the linker will give me NO error, but it does not work when the main application was created as a C++ application like main.cc The overridden function will not be called, but instead the weak function in portZynq7000.c will be called.
Does anybody know a simple trick to make this work in a simple manner?
Thanks
Kurt
vApplicationIdleHook in a C++ application
Does anybody know a simple trick to make this work in a simple manner?No, I don’t, but sure the C++ folks here will have a more knowledgeable answer….that said, is portZynq7000.c being compiled as C or C++? If it were compiled as C, or extern “C” were used, then maybe it would work?
vApplicationIdleHook in a C++ application
For FreeRTOS callback functions yoou need to define them something like:
extern “C” {
void vApplicationIdleHook( void );
}
To force name mangling off for the function. You can either include the full defintion of the function inside the extern “C” block or just a forward decleration.
vApplicationIdleHook in a C++ application
Thanks Richard (both of them)
this actually does work
Kurt