HI,
I’m not sure if doing this is OK, possible or downright dumb. (or all 3)
I want to build FreeRTOS into a static library such that I can call it from a C++ application in IAR/EWARM. Besides the FreeRTOS files I usually set up in EWARM, what else is required?
I set up an EWARM project and included all the source C files, the heap2.c, portasm.s, and port.c
(from the FreeRTOSV8.2.0FreeRTOSSourceportableIARARM_CM4F directory) so there are 9 files. It builds OK into a lib file (.a) and I can add it into my C++ project. The FreeRTOS headers are enclosed in the C++ file as:
.#ifdef __cplusplus
extern “C”
{
.#endif
.#include “FreeRTOS.h”
.#include “task.h”
.#include “semphr.h”
.#ifdef __cplusplus
}
.#endif
On build, I am getting an error that is telling me applicationTickHook isn’t defined, but the function is in my C++ file.
*Error[Li005]: no definition for “vApplicationTickHook” [referenced from tasks.o(FreeRTOSLIB.a)] *
When I build the static lib, do I need a “main.c” file with applicationTickHook included in there? Or, if not, what am I missing?
Thanks,
Gary
Creating a FreeRTOS Static Library
Creating a FreeRTOS Static Library
Try placing the “vApplicationTickHook” prototype in an extern “C” block as it is called from C code.
Creating a FreeRTOS Static Library
Well, that makes perfect sense (after the fact) and it works. Now that I’ve done that, I can see the other C calls needing to be set up this way.
Thanks!
Creating a FreeRTOS Static Library
All seemed to have gone well, until I uncommented the call to start the scheduler. Now I am getting this error:
Error[Li005]: no definition for “vPortEnableVFP” [referenced from port.o(FreeRTOSLIB.a)]
Error[Li005]: no definition for “vPortStartFirstTask” [referenced from port.o(FreeRTOSLIB.a)]
This one I cannot see, because I do not know where these functions exist. I should mention that I am using Richard Damon’s C++ wrapper, but this shouldn’t make any difference as it seems to create the task OK – from his TaskCPP.h file:
Task taskTCB(“Task”, taskfun, TaskPrioLow, configMINIMALSTACK_SIZE);
void taskfun( void *parm )
{
while(1)
{
vTaskDelay(1);
printf(“having funn”);
}
}
Any suggestions as to what the linker errors are caused by?
Thanks again, always appreciate the great help on thios forum.
Gary
Creating a FreeRTOS Static Library
In the IAR port both vPortEnableVFP() and vPortStartFirstTask() are
called from a C file (port.c), but implemented in an asm file
(portasm.s). Their prototypes are in the C file, not in a header file,
so I’m guessing you need to add extern “C” around their prototypes too.
Currently the prototypes appear in the C file as:
/* * Start first task is a separate function so it can be tested in isolation. */ extern void vPortStartFirstTask( void ); /* * Turn the VFP on. */ extern void vPortEnableVFP( void );