DualCore_Handler

system
system/DualCore_Handler.h
system

Méthodes publiques

Méthode Description Paramètres Retour
getInstance()
getInstance() {
// /** // * @brief Accès à l'instance unique du gestionnaire DualCore. // * // * @return Référence vers l'instance unique. // */ Référence
start()
start(CoreTask task) {
// /** // * @brief Lance l'exécution d'une tâche sur le cœur 1. // * // * @details // * - Disponible uniquement sur RP2040 / RP2350. true
multicore_launch_core1()
multicore_launch_core1(_core1_entry);
send()
send(uint32_t value) {
// /** // * @brief Envoie une valeur vers l'autre cœur via la FIFO. // * // * @param value Valeur 32 bits à transmettre. // */
multicore_fifo_push_blocking()
multicore_fifo_push_blocking(value);
read()
read() {
// /** // * @brief Lit une valeur depuis la FIFO inter-cœurs. // * // * @return Valeur reçue. // */ Valeur
multicore_fifo_pop_blocking()
multicore_fifo_pop_blocking();
available()
available() const {
// /** // * @brief Indique si une donnée est disponible dans la FIFO. // * // * @return true si une donnée est disponible. // * @return false sinon ou si non supporté. true
multicore_fifo_rvalid()
multicore_fifo_rvalid();
running()
running() const {
// /** // * @brief Indique si le cœur 1 est en cours d'exécution. // * // * @return true si le cœur 1 est actif. // */ true

Méthodes privées


            _core1_entry() {;
getInstance();;
if (self._task) {;
_task();;
while (true) {;
tight_loop_contents();;

                    

Variables membres


            DualCore_Handler instance;
return instance;
return false;
return true;
return false;
return 0;
return false;
return _running;

                    

Code source


        // #pragma once
// // DualCore_Handler.h

// #include <Arduino.h>

// #if defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_ARCH_RP2350)
// #include "pico/multicore.h"
// #endif

// /**
//  * @namespace crepp::system
//  * @brief Espace de noms système de la bibliothèque CREPP.
//  */
// namespace crepp::system {

// /**
//  * @class DualCore_Handler
//  * @brief Gestionnaire du fonctionnement multi-cœur.
//  *
//  * @details
//  * Cette classe fournit une interface simple pour exploiter
//  * le second cœur des microcontrôleurs RP2040 / RP2350.
//  *
//  * Fonctionnalités :
//  * - lancement d'une tâche sur le cœur 1,
//  * - communication inter-cœurs via FIFO matérielle,
//  * - abstraction portable (désactivée sur architectures mono-cœur).
//  *
//  * Implémentation basée sur le pattern Singleton.
//  */
// class DualCore_Handler {
// public:
//     /**
//      * @brief Type alias pour une tâche exécutée sur le cœur 1.
//      */
//     using CoreTask = void (*)();

//     /**
//      * @brief Accès à l'instance unique du gestionnaire DualCore.
//      *
//      * @return Référence vers l'instance unique.
//      */
//     static DualCore_Handler& getInstance() {
//         static DualCore_Handler instance;
//         return instance;
//     }

//     /**
//      * @brief Lance l'exécution d'une tâche sur le cœur 1.
//      *
//      * @details
//      * - Disponible uniquement sur RP2040 / RP2350.
//      * - Le cœur 1 exécute la fonction passée en paramètre
//      *   dans une boucle infinie sécurisée.
//      *
//      * @param task Fonction à exécuter sur le cœur 1.
//      * @return true si le cœur 1 a été lancé avec succès.
//      * @return false si déjà lancé, tâche invalide ou architecture non supportée.
//      */
//     bool start(CoreTask task) {
// #if defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_ARCH_RP2350)
//         if (_running || task == nullptr) return false;

//         _task = task;
//         multicore_launch_core1(_core1_entry);
//         _running = true;
//         return true;
// #else
//         (void)task;
//         return false;
// #endif
//     }

//     /**
//      * @brief Envoie une valeur vers l'autre cœur via la FIFO.
//      *
//      * @param value Valeur 32 bits à transmettre.
//      */
//     inline void send(uint32_t value) {
// #if defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_ARCH_RP2350)
//         multicore_fifo_push_blocking(value);
// #else
//         (void)value;
// #endif
//     }

//     /**
//      * @brief Lit une valeur depuis la FIFO inter-cœurs.
//      *
//      * @return Valeur reçue.
//      */
//     inline uint32_t read() {
// #if defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_ARCH_RP2350)
//         return multicore_fifo_pop_blocking();
// #else
//         return 0;
// #endif
//     }

//     /**
//      * @brief Indique si une donnée est disponible dans la FIFO.
//      *
//      * @return true si une donnée est disponible.
//      * @return false sinon ou si non supporté.
//      */
//     inline bool available() const {
// #if defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_ARCH_RP2350)
//         return multicore_fifo_rvalid();
// #else
//         return false;
// #endif
//     }

//     /**
//      * @brief Indique si le cœur 1 est en cours d'exécution.
//      *
//      * @return true si le cœur 1 est actif.
//      */
//     inline bool running() const { return _running; }

// private:
//     /**
//      * @brief Constructeur privé (Singleton).
//      */
//     DualCore_Handler() = default;

//     /**
//      * @brief Constructeur de copie supprimé.
//      */
//     DualCore_Handler(const DualCore_Handler&) = delete;

//     /**
//      * @brief Opérateur d'affectation supprimé.
//      */
//     DualCore_Handler& operator=(const DualCore_Handler&) = delete;

// #if defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_ARCH_RP2350)
//     /**
//      * @brief Point d'entrée du cœur 1.
//      *
//      * @details
//      * Exécute la tâche utilisateur puis entre dans
//      * une boucle infinie sécurisée.
//      */
//     static void _core1_entry() {
//         auto& self = getInstance();
//         if (self._task) {
//             self._task();
//         }

//         // Sécurité : ne jamais sortir du cœur 1
//         while (true) {
//             tight_loop_contents();
//         }
//     }
// #endif

//     /**
//      * @brief Tâche exécutée sur le cœur 1.
//      */
//     CoreTask _task = nullptr;

//     /**
//      * @brief Indique si le cœur 1 est actif.
//      */
//     volatile bool _running = false;
// };

// } // namespace crepp::system