Hi there,
I’m trying to compile a project using the STM32H743ZI2 Nucleo board with STM32CUBE Framework with FreeRTOS.
edit: The fix was that in my platform.ini file instead of:
extra_scripts = add_hardfloat.py
I did
extra_scripts = pre:add_hardfloat.py
The project can be found here:
Zafeer_FreeRTOSFromGroundUp/PlatformIO/17_WorkingWithQueueSets at main · ZafeerAbbasi/Zafeer_FreeRTOSFromGroundUp (github.com)
But basically, I’m using an extra script to add flags:
Import( “env” )
flags = [
“-mfloat-abi=hard”,
“-mfpu=fpv5-d16”,
“-mthumb”,
“-u _printf_float”,
“-mcpu=cortex-m7”,
“-DDEBUG -c -x assembler-with-cpp --specs=nano.specs”
]
env.Append(CCFLAGS=flags, LINKFLAGS=flags, ASFLAGS=flags)
However I keep getting the following errors:
…\Local\Temp\ccTwSuW0.s: Assembler messages:
…\Local\Temp\ccTwSuW0.s:330: Error: selected processor does not support vstmdbeq r0!,{s16-s31}' in Thumb mode ...\Local\Temp\ccTwSuW0.s:332: Error: instruction not allowed in IT block --
stmdb r0!,{r4-r11,r14}’
…\Local\Temp\ccTwSuW0.s:352: Error: selected processor does not support vldmiaeq r0!,{s16-s31}' in Thumb mode ...\Local\Temp\ccTwSuW0.s:354: Error: instruction not allowed in IT block --
msr psp,r0’
*** [.pio\build\nucleo_h743zi\libe54\Source\portable\GCC\ARM_CM4F\port.o] Error 1
The exact instructions can be found in port.c of FreeRTOS Kernel:
void xPortPendSVHandler( void )
{
/* This is a naked function. */
__asm volatile
(
" mrs r0, psp \n"
" isb \n"
" \n"
" ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */
" ldr r2, [r3] \n"
" \n"
" tst r14, #0x10 \n" /* Is the task using the FPU context? If so, push high vfp registers. */
" it eq \n"
" vstmdbeq r0!, {s16-s31} \n"
" \n"
" stmdb r0!, {r4-r11, r14} \n" /* Save the core registers. */
" str r0, [r2] \n" /* Save the new top of stack into the first member of the TCB. */
" \n"
" stmdb sp!, {r0, r3} \n"
" mov r0, %0 \n"
" msr basepri, r0 \n"
" dsb \n"
" isb \n"
" bl vTaskSwitchContext \n"
" mov r0, #0 \n"
" msr basepri, r0 \n"
" ldmia sp!, {r0, r3} \n"
" \n"
" ldr r1, [r3] \n" /* The first item in pxCurrentTCB is the task top of stack. */
" ldr r0, [r1] \n"
" \n"
" ldmia r0!, {r4-r11, r14} \n" /* Pop the core registers. */
" \n"
" tst r14, #0x10 \n" /* Is the task using the FPU context? If so, pop the high vfp registers too. */
" it eq \n"
" vldmiaeq r0!, {s16-s31} \n"
" \n"
" msr psp, r0 \n"
" isb \n"
" \n"
#ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata workaround. */
#if WORKAROUND_PMU_CM001 == 1
" push { r14 } \n"
" pop { pc } \n"
#endif
#endif
" \n"
" bx r14 \n"
" \n"
" .align 4 \n"
"pxCurrentTCBConst: .word pxCurrentTCB \n"
::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY)
);
}
After some more digging, it seems that the startup file produced by STM32CUBEMX works but the startup file which is automatically generated by PlatformIO does not work. So I guess now I will try to find out how to add custom startup files with PlatformIO
I’m not too experienced but any help would be greatly appreciated!