cancel
Showing results for 
Search instead for 
Did you mean: 

STM32F1, CubeMX and FreeRTOS: undefined reference to pxCurrentTCB and vTaskSwitchContext

Posted on March 29, 2016 at 19:33

Hi,

I'm trying to build an ''empty'' project generated by CubeMX using FreeRTOS and gcc for STM32F103xB.

I'm using the latest CubeMX (4.14.0) and latest HAL (1.3.1).

I've successfully built projects using CubeMX, HAL, gcc that work, I just get errors when I'm trying to use FreeRTOS.

I've added to the include path (-I)

FreeRTOS/Source/CMSIS_RTOS

FreeRTOS/Source/include

FreeRTOS/Source/porteble/GCC/ARM_CM3

I've included in the build:

FreeRTOS/

FreeRTOS/Source

FreeRTOS/Source/CMSIS_RTOS

FreeRTOS/Source/portable/GCC/ARM_CM3

FreeRTOS/Source/portable/MemMang/heap_4.c

+ all the other stuff needed to make a CubeMX/HAL project works.

but I get

undefined reference to `pxCurrentTCB'    port.c

undefined reference to `vTaskSwitchContext'    port.c

BTW if anyone from ST is listening it would be nice if you didn't include in the main.c template the cmsis_rtos stuff so one would be free to chose to use FreeRTOS directly or not without having to edit main.c every time.

#stm32f1 #cubemx #freertos #gcc
10 REPLIES 10
Nesrine M_O
Lead II
Posted on March 30, 2016 at 17:13

Hi borgonovo.ivan_sergi,

?You don?t need to add the freeRTOS manually, you can enable it through MX :as in the figure bellow

0690X00000604uCQAQ.png

?I recommend you to have a look to the

http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00105262.pdf

User manual about developing applications on STM32Cube with RTOS.

-Syrine-

Posted on April 05, 2016 at 15:34

Hi and thanks for the reply,

I'm using Eclipse + ARM plugin not the SW4STM32 IDE.

I'm using make managed build in Eclipse.

The problem seems to be at linking stage.

This compile successfully:

arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -flto -fno-move-loop-invariants -Wunused -Wuninitialized -Wall -Wextra -Wmissing-declarations -Wconversion -Wpointer-arith -Wpadded -Wshadow -Wlogical-op -Waggregate-return -Wfloat-equal  -g3 -D__weak=''__attribute__((weak))'' -D__packed=''__attribute__((__packed__))'' -DUSE_HAL_DRIVER -DSTM32F103xB -DARM_MATH_CM3 -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Drivers/BSP/STM3210E_EVAL -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Drivers/BSP/Adafruit_Shield -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Drivers/BSP/STM32F1xx_Nucleo -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Drivers/BSP/STM3210C_EVAL -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Drivers/BSP/STM32VL-Discovery -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Drivers/BSP/Components/Common -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Drivers/BSP/Components/stlm75 -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Drivers/BSP/Components/ak4343 -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Drivers/BSP/Components/st7735 -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Drivers/BSP/Components/lis302dl -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Drivers/BSP/Components/spfd5408 -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Drivers/BSP/Components/ili9325 -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Drivers/BSP/Components/hx8347d -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Drivers/BSP/Components/cs43l22 -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Drivers/BSP/Components/ili9320 -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Drivers/BSP/Components/stmpe811 -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Drivers/STM32F1xx_HAL_Driver/Inc -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Drivers/STM32F1xx_HAL_Driver/Inc/Legacy -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Drivers/CMSIS/Device/ST/STM32F1xx/Include -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Drivers/CMSIS/Include -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Utilities/Log -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Utilities/Fonts -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Utilities/CPU -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/Third_Party/FreeRTOS/Source/include -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3 -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/Third_Party/FatFs/src -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/Third_Party/FatFs/src/drivers -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/Third_Party/LwIP/test/unit -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/Third_Party/LwIP/test/unit/tcp -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/Third_Party/LwIP/test/unit/etharp -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/Third_Party/LwIP/test/unit/core -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/Third_Party/LwIP/test/unit/udp -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/Third_Party/LwIP/system/arch -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/Third_Party/LwIP/system/noOS -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/Third_Party/LwIP/system/OS -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/Third_Party/LwIP/src/netif/ppp -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/Third_Party/LwIP/src/include/ipv4/lwip -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/Third_Party/LwIP/src/include/netif -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/Third_Party/LwIP/src/include/posix -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/Third_Party/LwIP/src/include/posix/sys -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/Third_Party/LwIP/src/include/ipv6/lwip -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/Third_Party/LwIP/src/include/lwip -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/ST/STM32_USB_Device_Library/Class/Template/Inc -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/ST/STM32_USB_Device_Library/Class/HID/Inc -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/ST/STM32_USB_Device_Library/Class/DFU/Inc -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/ST/STM32_USB_Device_Library/Class/CustomHID/Inc -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/ST/STM32_USB_Device_Library/Class/AUDIO/Inc -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/ST/STM32_USB_Device_Library/Core/Inc -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/ST/STM32_USB_Host_Library/Class/Template/Inc -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Inc -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/ST/STM32_USB_Host_Library/Class/CDC/Inc -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/ST/STM32_USB_Host_Library/Class/MTP/Inc -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/ST/STM32_USB_Host_Library/Class/AUDIO/Inc -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/ST/STM32_USB_Host_Library/Core/Inc -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/ST/STemWin/Config -I/usr/local/src/STM32Cube_FW_F1_V1.3.0/Middlewares/ST/STemWin/inc -I''/home/ivan/Documents/workspace/stm32f1/STCube/Inc'' -std=gnu11 -Wmissing-prototypes -Wstrict-prototypes -Wbad-function-cast -MMD -MP -MF''STCube/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.d'' -MT''STCube/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.o'' -c -o ''STCube/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.o'' ''../STCube/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c''

but at linking stage I get:

undefined reference to pxCurrentTCB

undefined reference to vTaskSwitchContext

Curiously

a) none of those symbol are included in any header rather they are defined in tasks.c

b) they are referenced in port.c in inline asm

Maybe this is confusing Eclipse make managed build.

I'm going to investigate.

Automatic tools have pros and cons.

One of the cons is you've to figure out what they actually did.

I'll install SW4STM32 to just see how it is configured to try to replicate the setup on ''plain'' Eclipse but I'd be glad if anyone can spot the problem before I start this adventure.

I already read UM1722 but unfortunately it is not going to help with this issue.

I'm going to reiterate my suggestion. It would be nice if the CubeMX main.c wouldn't depend on cmsis_rtos or at least in a way that could be overridden.

/me going to check if I can have automatic notification by email from the forum.

thanks again

Nesrine M_O
Lead II
Posted on April 05, 2016 at 16:15

Hi borgonovo.ivan_sergi,

1.I do the test with SW4STM32 and I don’t face any issue 

2.Me going to check if I can have automatic notification by email from the forum: go to Actions > Alert Me 

-Syrine-

Posted on April 05, 2016 at 16:44

Hi,

that's exactly the point, I'm not using SW4STM32 but ''plain'' Eclipse + the more generic ARM eclipse plugin.

I did try to use the ''internal'' builder in spite of make managed build but I get the same errors at link time.

At least now I noticed it is a link issue and not a compile time issue.

Still a bit puzzled since all the sources are there, all the (-I) include are specified, all the modules get compiled, there is no change in the HAL + FW code still Eclipse can't link the files.

Finding some clue in the compilation log + symbols in the generated objects will take me some time before I can come up with some interesting news.

Thank you for moral support. Now that I've a vague idea about where to look for the problem I hope to get beck with a solution or at least with some really helpful clue.

Would you be so kind to post a successful compile log of an ''empty'' CubeMX/FreeRTOS project somewhere so I could spot the differences?

thanks

Hi borgonovo.ivan_sergi,

1.I do the test with SW4STM32 and I don’t face any issue 

2.Me going to check if I can have automatic notification by email from the forum: go to Actions > Alert Me 

-Syrine-

AvaTar
Lead
Posted on April 06, 2016 at 13:02

> Still a bit puzzled since all the sources are there, all the (-I) include are specified, all the modules get compiled, there is no change in the HAL + FW code still Eclipse can't link the files.

 

Obviously some source is missing - if I remember correctly, those ''missing references'' are data structures of FreeRTOS.

If the respective source file is actually included in the build (as stated above), perhaps the definition of those items is enclosed in

#ifdef

s, and drop out because of a missing

#define

.

Posted on April 06, 2016 at 22:42

I don't have that much linking FU, pardon my naiveness.

To recap:

pxCurrentTCB (a ptr to a struct) and vTaskSwitchContext (a function) are defined in tasks.c (and not declared anywhere else, there is no header declaring them) and they are used in port.c in inline asm.

tasks.c is part of the ''common'' code of FreeRTOS, port.c is a specialization for Cortex-m3 CPU.

The correct port.c get compiled (GCC/ARM_CM3).

let alone pxCurrentTCB, tasks.o get compiled and:

$ arm-none-eabi-objdump -t tasks.o | grep vTaskSwitchContext

00000000 l    d  .gnu.lto_vTaskSwitchContext.e526ddf3dbf0a904    00000000 .gnu.lto_vTaskSwitchContext.e526ddf3dbf0a904

So I assume the symbol vTaskSwitchContext should be available at linking time.

Looking at the build log, linker output:

LOAD ./STCube/Middlewares/Third_Party/FreeRTOS/Source/tasks.o

...

/tmp/ccXrr7NF.ltrans0.ltrans.o: In function `PendSV_Handler':

                                                  ./ldscripts/startup_stm32f103xb.o

/home/ivan/Documents/workspace/stm32f1/Debug/../STCube/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c:444: undefined reference to `vTaskSwitchContext'

TIM3_IRQHandler                                   /tmp/ccXrr7NF.ltrans0.ltrans.o

...

vTaskSwitchContext                                ./STCube/Middlewares/Third_Party/FreeRTOS/Source/tasks.o (symbol from plugin)

                                                  /tmp/ccXrr7NF.ltrans0.ltrans.o

So somehow the symbol is there, tasks.o get loaded by the linker, but seems to be ignored.

PendSV_Handler is actually

./STCube/Inc/FreeRTOSConfig.h:#define xPortPendSVHandler PendSV_Handler

AvaTar
Lead
Posted on April 07, 2016 at 07:36

You might have a kind of circular reference here.

I would try the --start-group...--end-group linker options, e.g. described

http://linux.die.net/man/1/ld

.

This tells the linker to search the named archives/objects multiple times, until all references are resolved.

Say, something like --start-grouptasks.o--end-group.

Posted on April 10, 2016 at 18:44

Hi,

thanks for pointing me to something that may help to solve or at least understand the problem, but it didn't help.

Adding tasks.o and/or port.o to the group just adds several ''multiple definition of ...'' errors.

If people have been able to compile FreeRTOS with HAL in SW4STM32 IDE, that should be substantially Eclipse + a dfferent set of plugins than ARM Eclipse plugin, there should be something simpler in the Eclipse settings or ''code setup'' to solve the problem.

But I'm still missing it.

CubeMX substantially generate a .cproject and .project file for Eclipse.

Source code is the same as in the ST framework.

I've added all the include -I related to FreeRTOS as the one generated by CubeMX in my project.

Even the -D define are the same.

I'll install SW4STM32 IDE and see if I can actually get a successful build for STM32F1.

Then I'll see if I can get rid of all the CubeMX FreeRTOS related things and just use CubeMX for HW initialization, add an upstream copy of FreeRTOS and get a successful build.

But this just out of desperation since if people have been able to successfully compile a CubeMX generated project with FreeRTOS for STM32F1 it should be just a matter of some Eclipse setup I'm missing.

Posted on April 11, 2016 at 20:35

[SOLVED]

the difference seems to be in the -flto option. Skipping that option now I got it compiling.

thanks