Analyse de frameworks légers pour systèmes embarqués

Introduction à la bibliothèque mr

mr-library  est un framework léger pour les systèmes embarqués. Il fournit un modèle de périphérique pilote sous-jacent unifié et des fonctions de service de base. Il présente les caractéristiques de conception modulaire, de configurabilité et d'évolutivité, et peut aider les développeurs à créer rapidement des applications embarquées.

Le  framework mr-library prend en charge les fonctions de base du noyau telles que les verrous mutex et la gestion des objets. Intégrez un cadre asynchrone basé sur les événements (événement), un minuteur logiciel de base multi-temps (soft-timer) et d'autres services. Fournissez des modèles de périphériques de pilotes pour les périphériques courants tels que les ports série, SPI, I2C, ADC/DAC, etc., accédez aux périphériques matériels sous-jacents via une interface de pilote unifiée (ouverture, fermeture, ioctl, lecture, écriture) et découplez les pilotes et applications sous-jacents. .

Scénarios d'application

  • Pilote de bas niveau développé par MCU.

  • Framework de plug-in pour le système d'exploitation en temps réel RTOS (utilisé comme framework de périphérique pilote).

  • Développement rapide de divers produits IoT et matériels intelligents.


cadre de périphérique pilote

Les développeurs peuvent accéder aux périphériques de manière orientée objet, simplifiant ainsi le processus de développement de la logique du pilote. Le framework implémente des modèles de pilotes universels pour les périphériques couramment utilisés, et les développeurs peuvent rapidement les porter sur différentes plates-formes matérielles.

La structure des périphériques pilotes prend en charge les interfaces communes pour les périphériques communs, le contrôle automatique des périphériques de bus et la prise en charge des interruptions de plusieurs périphériques.

Interface du périphérique d'entraînement

Le cadre du pilote de périphérique fournit une interface d'opération unifiée. Toutes les opérations du périphérique doivent être implémentées via les interfaces suivantes :

interface décrire
mr_device_add Ajouter un appareil
mr_device_find Rechercher un appareil
mr_device_open Allumez l'appareil
mr_device_close Éteignez l'appareil
mr_device_ioctl dispositif de contrôle
mr_device_read Lire les données de l'appareil
mr_device_write Écrire des données sur l'appareil

Exemple d'utilisation d'un appareil SPI :

/* 定义SPI设备 */
#define SPI_DEVICE0_CS_PIN              10
#define SPI_DEVICE1_CS_PIN              20
struct mr_spi_device spi_device0, spi_device1;

/* 添加SPI设备 */
mr_spi_device_add(&spi_device0, "spi10", SPI_DEVICE0_CS_PIN);
mr_spi_device_add(&spi_device1, "spi11", SPI_DEVICE1_CS_PIN);

/* 查找SPI设备 */
mr_device_t spi0_device = mr_device_find("spi10");
mr_device_t spi1_device = mr_device_find("spi11");

/* 挂载总线 */
mr_device_ioctl(spi0_device, MR_CTRL_ATTACH, "spi1");
mr_device_ioctl(spi1_device, MR_CTRL_ATTACH, "spi1");

/* 以可读可写的方式打开SPI设备 */
mr_device_open(spi0_device, MR_OPEN_RDWR);
mr_device_open(spi1_device, MR_OPEN_RDWR);

/* 发送数据 */
char buffer0[] = "hello";
char buffer1[] = "world";
mr_device_write(spi0_device, 0, buffer0, sizeof(buffer0) - 1);
mr_device_write(spi1_device, 0, buffer1, sizeof(buffer1) - 1);

/* 读取数据 */
mr_device_read(spi0_device, 0, buffer0, sizeof(buffer0) - 1);
mr_device_read(spi1_device, 0, buffer1, sizeof(buffer1) - 1);

/* 关闭设备 */
mr_device_close(spi0_device);
mr_device_close(spi1_device);

cadre de services

Le framework mr-library  intègre un framework de services léger pour créer des services d'application dans le développement embarqué, prenant en charge la surveillance des événements asynchrones, les minuteries logicielles de base multi-temporelles, etc. Le cadre de service est utilisé pour compléter le découplage des différentes applications dans la couche application, obtenant ainsi une modularisation et une personnalisation des applications, une logique métier claire, un développement rapide et une réutilisation élevée du code.

service événementiel

Le service d'événements est un mécanisme de traitement d'événements asynchrone qui peut améliorer efficacement les capacités de traitement asynchrone, le découplage et l'évolutivité du système grâce à la distribution d'événements et aux rappels.

Le service d'événements se compose de deux parties : le serveur d'événements et les événements.

  • Le serveur d'événements est utilisé pour recevoir et distribuer des événements. Il gère une file d'attente d'événements en interne pour stocker les événements en attente et une liste d'événements pour stocker les événements créés.

  • Les événements doivent être créés sur le serveur d'événements et fournir une fonction de rappel.

Lorsqu'un événement se produit, le serveur d'événements insère l'événement dans la file d'attente des événements pour la mise en cache. Le serveur d'événements supprimera périodiquement les événements de la file d'attente des événements pour les distribuer et trouvera le rappel d'événement correspondant pour le traitement des événements.

Interface d'exploitation du service d'événements
interface décrire
mr_event_server_find Rechercher un serveur d'événements
mr_event_server_add Ajouter un serveur d'événements
mr_event_server_remove Supprimer le serveur d'événements
mr_event_server_handle Traitement du serveur d'événements
mr_event_create Créer un évènement
mr_event_delete Supprimer l'événement
mr_event_notify Notifier l'occurrence d'un événement
mr_event_trigger événement déclencheur
Exemple d'utilisation du service d'événements :
/* 定义事件 */
#define EVENT1                          1
#define EVENT2                          2
#define EVENT3                          3

/* 定义事件服务器 */
struct mr_event_server event_server;

mr_err_t event1_cb(mr_event_server_t server, void *args)
{
    printf("event1_cb\r\n");
    
    /* 通知事件服务器事件2发生 */
    mr_event_notify(EVENT2, server);
    return MR_ERR_OK;
}

mr_err_t event2_cb(mr_event_server_t server, void *args)
{
    printf("event2_cb\r\n");

    /* 通知事件服务器事件3发生 */
    mr_event_notify(EVENT3, server)
    return MR_ERR_OK;
}

mr_err_t event3_cb(mr_event_server_t server, void *args)
{
    printf("event3_cb\r\n");
    return MR_ERR_OK;
}

int main(void)
{
    /* 添加事件服务器到内核容器 */
    mr_event_server_add(&event_server, "server", 4);
    
    /* 创建事件到服务器 */
    mr_event_create(EVENT1, event1_cb, MR_NULL, &event_server);
    mr_event_create(EVENT2, event2_cb, MR_NULL, &event_server);
    mr_event_create(EVENT3, event3_cb, MR_NULL, &event_server);
    
    /* 通知事件服务器事件1发生 */
    mr_event_notify(EVENT1, &event_server);
    
    while (1)
    {
        /* 事件服务器处理 */
        mr_event_server_handle(&event_server);
    }
}

Phénomène:

event1_cb
event2_cb
event3_cb

Service de minuterie logicielle

La minuterie logicielle est un mécanisme qui implémente des fonctions de synchronisation au niveau logiciel. Grâce à la minuterie logicielle, des événements spécifiques peuvent être déclenchés à des moments ou à des intervalles spécifiques. Les minuteries logicielles sont souvent utilisées pour implémenter des fonctions telles que les tâches périodiques, le traitement des délais d'attente et les interruptions de minuterie.

Les minuteries logicielles contiennent deux composants principaux : les serveurs de synchronisation et les minuteries.

  • Le serveur de synchronisation est utilisé pour la gestion du temps et le traitement du minuteur.

  • Le minuteur est utilisé pour gérer un traitement de délai d'attente spécifique. Il doit être enregistré auprès du serveur de synchronisation et fournir une fonction de rappel.

Interface d'exploitation du service de minuterie logicielle

interface décrire
mr_soft_timer_server_find Trouver un serveur de synchronisation
mr_soft_timer_server_add Ajouter un serveur de synchronisation
mr_soft_timer_server_remove Supprimer le serveur de synchronisation
mr_soft_timer_server_update Mise à jour du signal de la base de temps du serveur de synchronisation
mr_soft_timer_server_handle Traitement du serveur de synchronisation
mr_soft_timer_add Ajouter une minuterie
mr_soft_timer_remove Supprimer la minuterie
mr_soft_timer_start Démarrer la minuterie
mr_soft_timer_stop Minuterie de pause
mr_soft_timer_add_then_start Ajouter une minuterie et démarrer

Exemple d'utilisation du service de minuterie logicielle :

/* 定义定时服务器和定时器 */
struct mr_soft_timer_server server;
struct mr_soft_timer timer1, timer2, timer3;

mr_err_t timer1_callback(mr_soft_timer timer, void *args)
{
    printf("timer1_callback\r\n");
    return MR_ERR_OK;
}

mr_err_t timer2_callback(mr_soft_timer timer, void *args)
{
    printf("timer2_callback\r\n");
    return MR_ERR_OK;
}

mr_err_t timer3_callback(mr_soft_timer timer, void *args)
{
    printf("timer3_callback\r\n");
    mr_soft_timer_stop(timer);
    return MR_ERR_OK;
}

int main(void)
{
    /* 添加定时服务器 */
    mr_soft_timer_server_add(&server, "soft-timer");

    /* 添加定时器并启动 */
    mr_soft_timer_add_then_start(&timer1, 5, timer1_callback, MR_NULL, &server);
    mr_soft_timer_add_then_start(&timer2, 10, timer2_callback, MR_NULL, &server);
    mr_soft_timer_add_then_start(&timer3, 15, timer3_callback, MR_NULL, &server);

    while (1)
    {
        /* 更新定时服务器时钟 */
        mr_soft_timer_server_update(&server, 1);
        
        /* 定时服务器处理(放在哪里,回调就将在哪里被调用) */
        mr_soft_timer_server_handle(&server);
    }
}

Répertoire de codes

 La structure du répertoire de code de mr-library est présentée dans le tableau suivant :

nom décrire
bsp Forfait de soutien au conseil d’administration
appareil fichier de périphérique
document document
conducteur fichier de pilote
inclure fichier d'en-tête de bibliothèque
module Composants
emballer progiciel
src Fichiers sources de la bibliothèque
  • Couche noyau :  partie centrale de mr-library  , qui implémente la gestion des objets, le contrôle des périphériques, les interfaces de service, etc.

  • Couche périphérique : fournit une interface de périphérique unifiée pour connecter les périphériques au noyau.

  • Couche pilote : fournit le pilote matériel sous-jacent pour le périphérique. Lorsque le matériel est remplacé, seule la couche pilote doit être modifiée.

  • Couche de composants : implémentez différentes fonctions via l'API fournie par le framework. Y compris, mais sans s'y limiter, les systèmes de fichiers virtuels, les modules de capteurs universels, les infrastructures réseau, etc.

  • Progiciel : un progiciel pouvant être utilisé de manière indépendante et ne comportant aucune dépendance.

Texte original : https://gitee.com/MacRsh/mr-library

Guess you like

Origin blog.csdn.net/weixin_41114301/article/details/133200290