Creating a FreeRTOS Static Library

groger57 wrote on Thursday, July 07, 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.0\FreeRTOS\Source\portable\IAR\ARM_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

rtel wrote on Thursday, July 07, 2016:

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

groger57 wrote on Thursday, July 07, 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!

groger57 wrote on Thursday, July 07, 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, TaskPrio_Low, configMINIMAL_STACK_SIZE);
void taskfun( void *parm )
{
while(1)
{
vTaskDelay(1);
printf(“having fun\n”);
}
}

Any suggestions as to what the linker errors are caused by?

Thanks again, always appreciate the great help on thios forum.
Gary

rtel wrote on Friday, July 08, 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 );