Quality RTOS & Embedded Software

 Real time embedded FreeRTOS RSS feed 
Quick Start Supported MCUs PDF Books Trace Tools Ecosystem TCP & FAT




Loading

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


[ Back to the top ]    [ About FreeRTOS ]    [ Sitemap ]    [ ]




Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.

Latest News

FreeRTOS kernel V10 is available for immediate download. Now MIT licensed.


FreeRTOS Partners

ARM Connected RTOS partner for all ARM microcontroller cores

IAR Partner

Microchip Premier RTOS Partner

RTOS partner of NXP for all NXP ARM microcontrollers

STMicro RTOS partner supporting ARM7, ARM Cortex-M3, ARM Cortex-M4 and ARM Cortex-M0

Texas Instruments MCU Developer Network RTOS partner for ARM and MSP430 microcontrollers

OpenRTOS and SafeRTOS