STM32 unterschiedliche startup_stm32f303

OP #7495952
Lesenswert?

Hallo,

beide Startup Dateien sind mit STM Tools erzeugt worden

startup_stm32f303rctx.s hier wird die SystemInit vor einer Initialisierung der Variablen aufgerufen

1
  * Copyright (c) 2016 STMicroelectronics.
2
  * All rights reserved.
3
  *
4
  * This software is licensed under terms that can be found in the LICENSE file
5
  * in the root directory of this software component.
6
  * If no LICENSE file comes with this software, it is provided AS-IS.
7

8
...
9

10
Reset_Handler:
11
  ldr   sp, =_estack    /* Atollic update: set stack pointer */
12
  
13
/* Call the clock system initialization function.*/
14
    bl  SystemInit

startup_stm32f303xc.s hier wird die SystemInit nach der Initialisierung der Variablen aufgerufen bevor __libc_init_array und main

1
  * <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.
2
  * All rights reserved.</center></h2>
3
  *
4
  * This software component is licensed by ST under BSD 3-Clause license,
5
  * the "License"; You may not use this file except in compliance with the
6
  * License. You may obtain a copy of the License at:
7
  *                        opensource.org/licenses/BSD-3-Clause
8

9

10
...
11

12
LoopFillZerobss:
13
  cmp r2, r4
14
  bcc FillZerobss
15

16
/* Call the clock system intitialization function.*/
17
    bl  SystemInit
18
/* Call static constructors */
19
    bl __libc_init_array
20
/* Call the application's entry point.*/
21
  bl  main

ansonsten sind beide gleich. War es ein Bugfix? Kann man aus dem Dateinamen etwas ableiten? startup_stm32f303xc.s startup_stm32f303rctx.s

Welche sollte ich weiterverwenden?

Gruß, Daniel

OP #7495960
Lesenswert?

Hi Ali,

im CubeMX wurde als Ziel toolchain Makefile/GCC gewählt

Von Compiler Optionen sollte es nicht abhängig sein. CubeIDE ändert nicht seine startup.s, wenn die Compiler Optionen geändert werden.

Für was könnten die Buchstaben RCTX hinter dem Dateinamen stehen?

OP #7495974
Lesenswert?

startup_stm32f303xc.s diese kam vom CubeMX

startup_stm32f303rctx.s diese kam vom CubeIDE

in der CubeIDE steht MCU Reference STM32F303RCTx daher vermutlich der Name

da SystemInit nicht auf vorinitialisierte globale Variablen zugreift, spielt es an sich keine Rolle wann diese aufgerufen wird

1
void SystemInit(void)
2
{
3
/* FPU settings --------------------------------------------------------------*/
4
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
5
  SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
6
#endif
7

8
  /* Configure the Vector Table location -------------------------------------*/
9
#if defined(USER_VECT_TAB_ADDRESS)
10
  SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
11
#endif /* USER_VECT_TAB_ADDRESS */
12
}

hat sich dann geklärt

#7495994
Lesenswert?

Wenn man es weiß, ist es egal.

Laut C/C++-Standard werden Objekte mit static-Storage vor dem Betreten von main() initialisiert.

SystemInit() wird aber außerhalb von main() aufgerufen. Damit ist das - ähnlich wie ISR-Handler - außerhalb des C/C++-Standards. Man sollte sich also nicht darauf verlassen, dass die Objekte mit static-storage initialisiert sind.

Um aber das Verhalten "näher" an den C/C++-Standard zu bringen, hat man das wohl sinnvollerweise geändert.

#7496525
Lesenswert?

Stefan F. schrieb:

Normalerweise wird SystemInit() vor dem Initialisieren der Variablen aufgerufen, damit man dort den Systemtakt hoch setzen kann und dann die Variablen schneller initialisiert werden können.

Zumindest CubeMX macht es eben andersherum, was ich auch sinnvoll finde (s.o.). Ob das Startup nun 1ms oder 1.1ms dauert wird wohl egal sein.

Zudem werden die meisten wohl die HAL benutzen, und da findet die Clock-Config erst von main() aus statt.

Außerdem wird SystemInit() eigentlich nur benutzt, um bspw. die FPU zu aktivieren, wenn der Compiler FPU-Instruktionen verwendet.

Gast #7496869
Lesenswert?

Wilhelm M. schrieb:

Außerdem wird SystemInit() eigentlich nur benutzt, um bspw. die FPU zu aktivieren, wenn der Compiler FPU-Instruktionen verwendet.

Da habe ich mal ganz dumm geguckt, als mein Programm schon vor main() abstürzte. Mir war danals nicht bewusst dass die FPU bereits vor dem Einstieg in die erste abhängige Funktion aktiviert sein muss.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren