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