We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
When I use a local struct variable of type RCC_ClocksTypeDef (part of the ST peripheral library) and I call the RCC_GetClocksFreq() function passing the local struct as the parameter, for some reason the compiler increments the address by 4 so the data is all misaligned. However, if I use a global variable of the same type, the compiler handles this ok.
The issue only occurs with compiler optimization level of 0 or 1.
I'm using Keil MDK-Arm 4.13a and targeting the STM32F103. Using the simulator for now. I have the latest version of the ST peripheral library. My code snip in 'C' looks like:
..... RCC_ClocksTypeDef grcc_clocks; int main(void) { RCC_ClocksTypeDef rcc_clocks; RCC_GetClocksFreq(&rcc_clocks); RCC_GetClocksFreq(&grcc_clocks); }
So with the code optimization set to Level 0 or 1, where the code does not result in the expected result, here is the asm:
106: RCC_ClocksTypeDef rcc_clocks; 0x0800357C B086 SUB sp,sp,#0x18 107: RCC_GetClocksFreq(&rcc_clocks); 0x0800357E A801 ADD r0,sp,#0x04 0x08003580 F7FEFCBC BL.W RCC_GetClocksFreq (0x08001EFC) 108: RCC_GetClocksFreq(&grcc_clocks); 109: 0x08003584 4842 LDR r0,[pc,#264] ; @0x08003690 0x08003586 F7FEFCB9 BL.W RCC_GetClocksFreq (0x08001EFC)
So now with the code optimized to 2 or 3, THIS code works properly:
106: RCC_ClocksTypeDef rcc_clocks; 0x0800332C B086 SUB sp,sp,#0x18 107: RCC_GetClocksFreq(&rcc_clocks); 0x0800332E 4668 MOV r0,sp 0x08003330 F7FEFD88 BL.W RCC_GetClocksFreq (0x08001E44) 108: RCC_GetClocksFreq(&grcc_clocks); 109: 0x08003334 4842 LDR r0,[pc,#264] ; @0x08003440 0x08003336 F7FEFD85 BL.W RCC_GetClocksFreq (0x08001E44)
So the issue seems to be this line:
0x0800357E A801 ADD r0,sp,#0x04
Is this a compiler error?