FreeRTOS Support Archive
The FreeRTOS support forum is used to obtain active support directly from Real
Time Engineers Ltd. In return for using our top quality software and services for
free, we request you play fair and do your bit to help others too! Sign up
to receive notifications of new support topics then help where you can.
This is a read only archive of threads posted to the FreeRTOS support forum.
The archive is updated every week, so will not always contain the very latest posts.
Use these archive pages to search previous posts. Use the Live FreeRTOS Forum
link to reply to a post, or start a new support thread.
[FreeRTOS Home] [Live FreeRTOS Forum] [FAQ] [Archive Top] [July 2016 Threads] Creating a FreeRTOS Static LibraryPosted 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 LibraryPosted 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 LibraryPosted 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 LibraryPosted 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 LibraryPosted 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 );
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.
|