Forum: Mikrocontroller und Digitale Elektronik STM32 unterschiedliche startup_stm32f303


von Daniel -. (root)


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

von Ali K. (teddy50)


Lesenswert?

Es müsste dennoch vom Compiler und Linker eins von beiden ausgewählt 
werden. Sonst würde drr Linker meckern

von Daniel -. (root)


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?

von Daniel -. (root)


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

von Wilhelm M. (wimalopaan)


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.

von Stefan F. (Gast)


Lesenswert?

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.

von Wilhelm M. (wimalopaan)


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.

von Stefan F. (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.