Creating a FreeRTOS Static Library

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

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