Creating a FreeRTOS Static Library

Posted by groger57 on July 7, 2016

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

Posted by rtel on July 7, 2016

Try placing the "vApplicationTickHook" prototype in an extern "C" block as it is called from C code.


Creating a FreeRTOS Static Library

Posted by groger57 on July 7, 2016

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

Posted by groger57 on July 7, 2016

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

Posted by rtel on July 8, 2016

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 );