Wie kann man in gcc Inline Assembler ein Register nochmals zuweisen? So geht es nicht, weil natürlich das zweite Mal eine Re-Definition ist. Aber wie dann? register int _r0 __asm ("r0") = val11; register int _r1 __asm ("r1") = val12; _asm_ ("swi " GPIO_WriteMode); register int _r0 __asm ("r0") = val21; register int _r1 __asm ("r1") = val22; _asm_ ("swi " GPIO_WriteData); Man könnte natürlich jedesmal neue Namen für die Register verwenden, das wäre aber unübersichtlich. Zur Info: Hier sollen vor einem Software-Interrupt jeweils die Register bestückt werden.
Kannst du nicht einfach die Variable neu zuweisen?
1 | _r0 = val21; |
Oder halt 1 Syscall/SWI pro Funktion, ggf. eh sauberer. Die SWI-Instruktion wurde übrigens nach SVC umbenannt
Lothar schrieb: > Wie kann man in gcc Inline Assembler ein Register nochmals zuweisen? So > geht es nicht, weil natürlich das zweite Mal eine Re-Definition ist. > Aber wie dann? > > register int _r0 __asm ("r0") = val11; > register int _r1 __asm ("r1") = val12; > _asm_ ("swi " GPIO_WriteMode); > > register int _r0 __asm ("r0") = val21; > register int _r1 __asm ("r1") = val22; > _asm_ ("swi " GPIO_WriteData); > > Man könnte natürlich jedesmal neue Namen für die Register verwenden, das > wäre aber unübersichtlich. > > Zur Info: Hier sollen vor einem Software-Interrupt jeweils die Register > bestückt werden. Dazu gibt es was, das nennt sich Scope. Geschweifte Klammer drum und die Variablen _r<n> existieren nur innerhalb. Es ist auch nicht gut diese Register-Reservierung zu weitreichend und zu umfangreich (auf Vorrat) zu machen, denn irgendwann gehen dem Compiler die Register aus. Und da die Aufrufkonventionen bei ARM (erkennbar am SWI) genau so aussehen, erste 4 bis zu 32Bit große Parameter in r0..3, kann man auch einfach für jede "SWI-Funktion" eine naked-(inline-)Funktionen, die die richtigen Parameter hat und nur aus SWI besteht. Dann ist die ganze Register-Magic überflüssig.
In der Praxis kann man sich das z.B. im NRF SDK ansehen - NordicSemi nutzt das für die Kommunikation App <-> binärer Blob der RADIO Steuerung. Siehe: https://github.com/NordicSemiconductor/nRF5-SDK-for-Mesh/blob/2db8b0c80e7c9877a9b5adc14786b43789b7c5f2/external/softdevice/s132_5.0.0/s132_nrf52_5.0.0_API/include/nrf_svc.h#L61 Verwendung des SVCALL Macros siehe: https://github.com/NordicSemiconductor/nRF5-SDK-for-Mesh/blob/2db8b0c80e7c9877a9b5adc14786b43789b7c5f2/external/softdevice/s132_5.0.0/s132_nrf52_5.0.0_API/include/ble_gap.h#L1296
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.