Um repositório com exemplos práticos de como utilizar os dois núcleos (dual-core) do processador ARM Cortex-M0+ no Raspberry Pi Pico (RP2040). Aprenda a executar tarefas em paralelo, comunicar e sincronizar os núcleos de forma segura usando o Pico-SDK em C.
- ⚡ Paralelismo Real: Aprenda a lançar o segundo núcleo com
multicore_launch_core1
para dividir o trabalho e melhorar a performance. - 💬 Comunicação Segura com FIFO: Exemplo detalhado de como o Core 0 pode enviar dados para o Core 1 de forma assíncrona e segura usando o FIFO inter-core e interrupções.
- 🔒 Sincronização com Lockout: Demonstração de como proteger seções críticas e evitar condições de corrida ao acessar variáveis compartilhadas, pausando um núcleo a partir do outro.
- 💡 Três Níveis de Aprendizagem:
- Básico: Comunicação insegura via variável global (para fins didáticos).
- Intermediário: Sincronização com o sistema de
lockout
. - Avançado: Comunicação robusta e reativa usando
FIFO
.
- Raspberry Pi Pico ou Pico W
- (Opcional para os exemplos) Botão e LED -> Integrados à BitDogLab
- Pico C/C++ SDK configurado.
- ARM GCC Toolchain
- CMake
git clone [https://github.com/LabirasIFPI/bitdoglab_multicore.git](https://github.com/LabirasIFPI/bitdoglab_multicore.git)
cd bitdoglab_multicore
Cada exemplo está em um diretório separado. Navegue até o exemplo desejado e compile-o.
# Exemplo para compilar o projeto de FIFO
cd ex3_fifo_comms/
mkdir build
cd build
cmake ..
make
- Pressione e segure o botão
BOOTSEL
no seu Pico e conecte-o ao computador. - Ele aparecerá como um dispositivo de armazenamento USB.
- Arraste o arquivo
.uf2
gerado na pastabuild
para dentro do Pico.
A placa irá reiniciar. Abra um monitor serial para ver a interação entre os dois núcleos em tempo real! 👀
-
ex1_global_variable_unsafe
:- O que faz: O Core 0 lê um botão e o Core 1 acende um LED.
- Conceito: A forma mais simples (e insegura) de compartilhar dados. Ótimo para entender o conceito básico de paralelismo.
-
ex2_lockout_sync
:- O que faz: Ambos os núcleos incrementam um contador, mas o Core 0 usa
lockout
para pausar o Core 1 antes de ler e modificar o valor. - Conceito: Acesso seguro a recursos compartilhados para evitar corrupção de dados (condição de corrida).
- O que faz: Ambos os núcleos incrementam um contador, mas o Core 0 usa
-
ex3_fifo_comms
:- O que faz: O Core 0 envia o estado de um botão para o Core 1 via FIFO. O Core 1 usa uma interrupção para reagir instantaneamente à chegada de novos dados.
- Conceito: O método mais robusto e recomendado para comunicação entre núcleos.
Explore o poder do processamento dual-core do RP2040 e eleve o nível dos seus projetos embarcados! 🌐