Raspberry RP2040: gestione del secondo core

Raspberry RP2040

Il seguente codice mostra come avviare il secondo core presente nell’RP2040 permettendo quindi di eseguire due operazioni contemporaneamente. Nell’esempio il pin 25 viene utilizzato per far lampeggiare il LED presente sulla scheda ogni 500 ms mentre il pin 27 per un ipotetico lampeggio ogni 2.000 ms. Rispetto agli esempi presenti in rete o sui testi, il codice è stato semplificato e non gestisce a pieno i FIFO dei rispettivi core. Nonostante ciò è comunque possibile avviare il secondo core, ma questo aspetto è da tenere presente in quanto potrebbe creare dei malfunzionamenti nel momento in cui si vuole gestire diversamente i core attraverso il FIFO.

.global main

.thumb_func

main:
    BL  set_pins
    BL  avvia_core1
    
main_core0:
    LDR R0, siobase
    MOV R1, #0x01
    LSL R1, R1, #25
loop_core0:    
    STR R1, [R0, #0x14]   @ GPIO_OUT_SET
    BL  delay_500ms_start
    STR R1, [R0, #0x18]   @ GPIO_OUT_CLR
    BL  delay_500ms_start
    B   loop_core0

.thumb_func

main_core1:
    LDR R0, siobase
    MOV R1, #0x01
    LSL R1, R1, #27
loop_core1:
    STR R1, [R0, #0x14]    @ GPIO_OUT_SET
    BL  delay_2000ms_start
    STR R1, [R0, #0x18]    @ GPIO_OUT_CLR
    BL  delay_2000ms_start
    B   loop_core1

set_pins:
    MOV R1, #0x05
    LDR R0, pin25ctrl
    STR R1, [R0]        @ GPIO25_CTRL
    LDR R0, pin27ctrl
    STR R1, [R0]        @ GPIO27_CTRL
    LSL R1, R1, #25
    LDR R0, siobase
    STR R1, [R0, #0x24] @ GPIO_OE_SET
    BX  LR
delay_500ms_start:
    LDR R7, valore500ms
delay_500ms_ciclo:
    SUB R7, R7, #1
    CMP R7, #0
    BNE delay_500ms_ciclo
    BX  LR
delay_2000ms_start:
    LDR R7, valore2000ms
delay_2000ms_ciclo:
    SUB R7, R7, #1
    CMP R7, #0
    BNE delay_2000ms_ciclo
    BX  LR

avvia_core1:
    @ per avviare il core1, scrivere le seguenti informazioni
    @ nel FIFO del core1: 0, 0, 1, ivt, stack, routine
    PUSH {LR}
    MOV R0, #0
    BL  fifo_push
    MOV R0, #0
    BL  fifo_push
    MOV R0, #1
    BL  fifo_push
    LDR R2, ppbbase
    LDR R1, vtor_offset
    ADD R2, R1
    LDR R0, [R2]
    BL  fifo_push
    LDR R0, =stack_core1_end
    BL  fifo_push
    LDR R0, =main_core1
    BL  fifo_push
    POP {PC}
fifo_push:
    @ inserisce dati nel FIFO del core1
    LDR R1, siobase
    STR R0, [R1, #0x54] @ SIO_FIFO_WR_OFFSET
    SEV
    BX  LR

.align 4
pin25ctrl: .word 0x400140cc
pin27ctrl: .word 0x400140dc
siobase: .word 0xd0000000 @ SIO_BASE
ppbbase: .word 0xe0000000 @ PPB_BASE
vtor_offset: .word 0x0000ed08 @ M0PLUS_VTOR_OFFSET
valore500ms: .word 0x00fdad66
valore2000ms: .word 0x03f6b598
.data
stack_core1: .fill 0x800, 1, 0x0 @ repeat[, size[, value]]
stack_core1_end: .word 0x0