Forum: Compiler & IDEs STM32F429 StartupCode assembler


von W. M. (muhh)


Lesenswert?

Hallo Leute,

ich bin beim Programmieren des STM32F429 auf den StartupCode und das 
LinkerScript gestoßen. Ich würde gerne versuchen, eigenen Code und ein 
LinkerScript zu schreiben. Dazu belese ich mich im Moment mit allen 
möglichen Tutorials, Reference Manuals, etc. und versuche nebenbei den 
Assembler-StartupCode zu verstehen, den mir STM CubeMx für die MDK-Arm 
toolchain ausgespuckt hat. Dabei verwirrt mich z.B. folgender Code:
1
; Vector Table Mapped to Address 0 at Reset
2
                AREA    RESET, DATA, READONLY
3
                EXPORT  __Vectors
4
                EXPORT  __Vectors_End
5
                EXPORT  __Vectors_Size
6
7
__Vectors       DCD     __initial_sp               ; Top of Stack
8
                DCD     Reset_Handler              ; Reset Handler
9
                DCD     NMI_Handler                ; NMI Handler
10
                DCD     HardFault_Handler          ; Hard Fault Handler
11
                DCD     MemManage_Handler          ; MPU Fault Handler
12
                DCD     BusFault_Handler           ; Bus Fault Handler
13
                DCD     UsageFault_Handler         ; Usage Fault Handler
14
                DCD     0                          ; Reserved
15
                DCD     0                          ; Reserved
16
                DCD     0                          ; Reserved
17
                DCD     0                          ; Reserved
18
                DCD     SVC_Handler                ; SVCall Handler
19
                DCD     DebugMon_Handler           ; Debug Monitor Handler
20
                DCD     0                          ; Reserved
21
                DCD     PendSV_Handler             ; PendSV Handler
22
                DCD     SysTick_Handler            ; SysTick Handler
23
24
                ; External Interrupts
25
                DCD     WWDG_IRQHandler                   ; Window WatchDog                                        
26
                DCD     PVD_IRQHandler                    ; PVD through EXTI Line detection                        
27
                DCD     TAMP_STAMP_IRQHandler             ; Tamper and TimeStamps through the EXTI line            
28
                DCD     RTC_WKUP_IRQHandler               ; RTC Wakeup through the EXTI line                       
29
                DCD     FLASH_IRQHandler                  ; FLASH                                           
30
                DCD     RCC_IRQHandler                    ; RCC event
31
32
                ...
33
34
                DCD     I2C3_ER_IRQHandler                ; I2C3 error                                             
35
                DCD     OTG_HS_EP1_OUT_IRQHandler         ; USB OTG HS End Point 1 Out                      
36
                DCD     OTG_HS_EP1_IN_IRQHandler          ; USB OTG HS End Point 1 In                       
37
                DCD     OTG_HS_WKUP_IRQHandler            ; USB OTG HS Wakeup through EXTI                         
38
                DCD     OTG_HS_IRQHandler                 ; USB OTG HS                                      
39
                DCD     DCMI_IRQHandler                   ; DCMI  
40
                DCD     0                          ; Reserved                                      
41
                DCD     HASH_RNG_IRQHandler               ; Hash and Rng
42
                DCD     FPU_IRQHandler                    ; FPU
43
                DCD     UART7_IRQHandler                  ; UART7
44
                DCD     UART8_IRQHandler                  ; UART8
45
                DCD     SPI4_IRQHandler                   ; SPI4
46
                DCD     SPI5_IRQHandler                   ; SPI5
47
                DCD     SPI6_IRQHandler                   ; SPI6
48
                DCD     SAI1_IRQHandler                   ; SAI1
49
                DCD     LTDC_IRQHandler                   ; LTDC
50
                DCD     LTDC_ER_IRQHandler                ; LTDC error
51
                DCD     DMA2D_IRQHandler                  ; DMA2D
52
                                         
53
__Vectors_End

Was passiert bei
1
__Vectors

und
1
__Vectors_End
???

Wird dort die momentane Adresse des PC gespeichert?

Viele Grüße
Willy

von ist halt so (Gast)


Lesenswert?

Da wird die interrupt Vektortabelle deklariert. Die steht immer am 
Anfang. Und da det Cortex immer ein Stack braucht, steht als aller 
erster Eintrag die Adresse vom Stackpointer. Das ist immer so, das hat 
ARM so gemacht.

von Detlef K. (adenin)


Lesenswert?

Willy M. schrieb:
> Was passiert bei
> __Vectors
>
> und
> __Vectors_End
> ???
>
> Wird dort die momentane Adresse des PC gespeichert?

Nein, wird sie nicht.
Das sind zwei Labels, die die Anfangsadresse und die Endadresse der 
Tabelle für die Interruptvektoren representieren.

Mit momentaner des PC meinst Du sicher sowas
1
loop               b       loop  ;Endlosschleife 
2
3
                   b       .     ;Endlosschleife mit "momentaner Adresse des PC"

von W. M. (muhh)


Lesenswert?

Detlef Kunz schrieb:
> Das sind zwei Labels, die die Anfangsadresse und die Endadresse der
> Tabelle für die Interruptvektoren representieren.

Okay, danke, sowas hatte ich gemeint :)

Ich hätte da noch eine Frage:

Warum müssen die Interrupt Routinen IRQHandler heißen? Ich habe die HAL 
Treiber von ST durchsucht, aber nur die Nummerierung der Interrupts 
(xxxIRQn) gefunden, nicht jedoch die IRQHandler.

So wie ich das verstehe könnte ich da auch a,b,c,.. als namen vergeben 
oder?

von Detlef K. (adenin)


Lesenswert?

Willy M. schrieb:
> Detlef Kunz schrieb:
>> Das sind zwei Labels, die die Anfangsadresse und die Endadresse der
>> Tabelle für die Interruptvektoren representieren.
>
> Okay, danke, sowas hatte ich gemeint :)
>
> Ich hätte da noch eine Frage:
>
> Warum müssen die Interrupt Routinen IRQHandler heißen? Ich habe die HAL
> Treiber von ST durchsucht, aber nur die Nummerierung der Interrupts
> (xxxIRQn) gefunden, nicht jedoch die IRQHandler.
>
> So wie ich das verstehe könnte ich da auch a,b,c,.. als namen vergeben
> oder?

Im Prinzip kannst Du die Namen so anpassen, wie Du es willst.

von W. M. (muhh)


Lesenswert?

Ich hätte da schon die nächste Frage:

In einem Linkerscript wird z.B. das MEMORY-mapping festgelegt aber auch 
alle Eingangsdaten (die verschieden object-Files) zu einer Ausgangsdatei 
zusammengeführt.

Ich hatte gelesen, dass die Output-Section .text immer den Programmcode 
enthält, .rodata konstante Daten wie defines etc.

.bss enthält alle uninitialisierten Variablen.

erstellt der Compiler beim Kompilieren z.B. einer C-Datei automatisch 
solche .text, .rodata, .data, .bss sections und das für jede Datei die 
kompiliert wird?

EDIT: Ich habe gerade im LinkerScript Manual gelesen das man mit objdump 
-h die sections für o-Files auslesen kann. Tatsächlich erstellt der 
compiler unter anderem die sections .text[.*] .data und .bss

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.