Forum: Mikrocontroller und Digitale Elektronik [ARM] AArch64 Startup Code


von Johannes K. (krjdev)


Lesenswert?

Hallo Community!

Möchte mich gerne in die AArch64 Architektur einlernen. Als 
Entwicklungsplattform möchte ich gerne das PINE64 ROCK64 (Cortex-A53) 
Board verwenden.

Mein derzeitiges Zwischenziel ist einfach nur ein simples "Hello World" 
Programm. Also einen String auf der seriellen Schnittstelle ausgeben. 
Als Loader für die (Bare-Metal) Anwendung verwende ich U-Boot. Habe 
schon erfolgreich für die ARMv7 Architektur (genauer Cortex-A9) 
Anwendungen geschrieben. Aber auch nur derzeit simple Testprogramme.

Als Startupcode für den Cortex-A9 habe ich folgendes verwendet:
1
#include <asm.h>
2
3
IMPORT_C(kern_main)
4
5
.text
6
7
ENTRY(_start)
8
    /* Make sure CPU0 executes main only; wait forever for other CPU's */
9
    mrc p15, 0, r0, c0, c0, 5
10
    and r0, r0, #0xF
11
    cmp r0, #0
12
    beq L1
13
L0:
14
    wfe
15
    b L0
16
L1:
17
    ldr r0, =_kern_stack_s
18
    mov sp, r0
19
    b kern_main
20
L2:
21
    /* Schould never be reached; wait forever */
22
    wfe
23
    b L2
24
25
.end

Dieser Code ist recht simpel. Er macht eigentlich nur, dass er beim 
Coprozessor die Prozessor ID ausliest und verhindert das andere Kerne 
außer CPU0 kern_main ausführt. Danach wird lediglich nur ein Stack im 
aktuellen Modus gesetzt und später auf kern_main gesprungen.

Die Frage was ich jetzt habe, wie ist dieser (simple) Code anzupassen, 
dass er auch auf einen Cortex-A53 läuft? Hat dazu wer ein Beispiel? Kann 
auch gerne ausführlicher sein.

Beitrag #6289748 wurde von einem Moderator gelöscht.
Beitrag #6289764 wurde von einem Moderator gelöscht.
von Johannes K. (krjdev)


Lesenswert?

Hab den Code für AArch64 umgeschrieben.

Kann bitte mal wer kurz darüber schauen, ob das funktionieren würde?
Der Compiler meckert jedenfalls nicht mehr:

1
#include <asm.h>
2
3
IMPORT_C(kern_main)
4
5
.text
6
7
ENTRY(_start)
8
    mrs x0, MPIDR_EL1
9
    and x0, x0, #0x3
10
    cmp x0, #0
11
    beq L1
12
L0:
13
    wfe
14
    b L0
15
L1:
16
    ldr x0, =_kern_stack_e
17
    mov sp, x0
18
    b kern_main
19
L2:
20
    wfe
21
    b L2
22
23
.end

Kann es leider noch nicht testen...

von Johannes K. (krjdev)


Angehängte Dateien:

Lesenswert?

So, habe es geschafft.

Falls es jemand interessiert...
Hab mein jetziges Ergebnis in ein ZIP File gepackt.

Macht eigentlich nicht viel.
Gibt nur ein paar Strings auf der UART aus und resettet das System wenn 
eine bestimmter Buchstabe über die Schnittstelle empfangen wird.

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.