博客專欄

        EEPW首頁 > 博客 > 推薦一個輕量級的嵌入式系統框架

        推薦一個輕量級的嵌入式系統框架

        發布人:xiaomaidashu 時間:2023-09-21 來源:工程師 發布文章
        mr-library簡介

        mr-library 是一個面向嵌入式系統的輕量級框架,提供統一的底層驅動設備模型以及基礎服務功能,具有模塊化設計、可配置性和擴展性的特點, 可幫助開發者快速構建嵌入式應用程序。

        mr-library 框架支持互斥鎖、對象管理等基礎內核功能。集成異步事件驅動框架(event)、多時基軟件定時器(soft-timer) 等服務。提供串口、SPI、I2C、ADC/DAC等常見外設的驅動設備模型,通過統一的驅動接口(open、close、ioctl、read、write)訪問底層硬件設備,解耦底層驅動和應用。

        應用場景
        • MCU開發的低層驅動程序。
        • RTOS實時操作系統的外掛框架(作為驅動設備框架使用)。
        • 各類IoT和智能硬件產品的快速開發。

        驅動設備框架

        開發者能以面向對象的方式訪問外設,簡化驅動邏輯的開發流程??蚣軐崿F了常用外設的通用驅動模板,開發者可以快速移植到不同的硬件平臺。

        驅動設備框架支持普通設備的通用接口、總線設備自動總線控制、多種設備的中斷接管。

        驅動設備接口

        設備驅動框架提供統一的操作接口,設備的所有操作都需要通過以下接口實現:

        接口描述
        mr_device_add添加設備
        mr_device_find查找設備
        mr_device_open打開設備
        mr_device_close關閉設備
        mr_device_ioctl控制設備
        mr_device_read從設備讀取數據
        mr_device_write向設備寫入數據
        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);

        服務框架

        mr-library 框架集成了輕量級的服務框架,用于構建嵌入式開發中的應用服務,支持異步事件監聽,多時基軟件定時器等。通過服務框架完成對應用層不同應用間的解耦,實現應用程序的模塊化,可裁剪,業務邏輯清晰,開發快速,代碼高度復用。

        事件服務

        事件服務是一種異步事件處理機制,它通過事件分發和回調的方式,可以有效地提高系統的異步處理能力、解耦性和可擴展性。

        事件服務包含兩個部分:事件服務器和事件。

        • 事件服務器用于接收和分發事件,其內部維護一個事件隊列用于存儲待處理事件和一個事件列表用于存儲已創建事件。
        • 事件需要創建到事件服務器并提供一個回調函數。

        當事件發生時,事件服務器會將事件插入到事件隊列中進行緩存。事件服務器會周期性地從事件隊列中取出事件進行分發,找到對應的事件回調進行事件處理。

        事件服務操作接口接口描述
        mr_event_server_find查找事件服務器
        mr_event_server_add添加事件服務器
        mr_event_server_remove移除事件服務器
        mr_event_server_handle事件服務器處理
        mr_event_create創建事件
        mr_event_delete移除事件
        mr_event_notify通知事件發生
        mr_event_trigger觸發事件
        事件服務使用示例:
        /* 定義事件 */
        #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_cbrn");
            
            /* 通知事件服務器事件2發生 */
            mr_event_notify(EVENT2, server);
            return MR_ERR_OK;
        }
        mr_err_t event2_cb(mr_event_server_t server, void *args){
            printf("event2_cbrn");
            /* 通知事件服務器事件3發生 */
            mr_event_notify(EVENT3, server)
            return MR_ERR_OK;
        }
        mr_err_t event3_cb(mr_event_server_t server, void *args){
            printf("event3_cbrn");
            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);
            }
        }

        現象:

        event1_cb
        event2_cb
        event3_cb
        軟件定時器服務

        軟件定時器是一種在軟件層面實現計時功能的機制,通過軟件定時器,可以在特定時間點或時間間隔觸發特定的事件。軟件定時器常用于實現周期性任務、超時處理、定時器中斷等功能。

        軟件定時器包含兩個主要組件:定時服務器和定時器。

        • 定時服務器用于時間管理和定時器處理。
        • 定時器用于處理特定的超時處理,它需要注冊到定時服務器并提供一個回調函數。
        軟件定時器服務操作接口接口描述
        mr_soft_timer_server_find查找定時服務器
        mr_soft_timer_server_add添加定時服務器
        mr_soft_timer_server_remove移除定時服務器
        mr_soft_timer_server_update定時服務器時基信號更新
        mr_soft_timer_server_handle定時服務器處理
        mr_soft_timer_add添加定時器
        mr_soft_timer_remove移除定時器
        mr_soft_timer_start啟動定時器
        mr_soft_timer_stop暫停定時器
        mr_soft_timer_add_then_start添加定時器并啟動
        軟件定時器服務使用示例:
        /* 定義定時服務器和定時器 */
        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_callbackrn");
            return MR_ERR_OK;
        }
        mr_err_t timer2_callback(mr_soft_timer timer, void *args){
            printf("timer2_callbackrn");
            return MR_ERR_OK;
        }
        mr_err_t timer3_callback(mr_soft_timer timer, void *args){
            printf("timer3_callbackrn");
            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);
            }
        }

        代碼目錄

        mr-library 的代碼目錄結構如下表所示:

        名稱描述
        bsp板級支持包
        device設備文件
        document文檔
        driver驅動文件
        include庫頭文件
        module組件
        package軟件包
        src庫源文件
        • 內核層: mr-library 的核心部分,實現對象管理,設備控制,服務接口等。
        • 設備層: 提供統一的設備接口,將設備接入到內核中。
        • 驅動層: 為設備提供底層硬件驅動,當硬件更換時僅需修改驅動層。
        • 組件層: 通過框架提供的API實現不同的功能。包括但不限于虛擬文件系統、通用傳感器模塊、網絡框架等。
        • 軟件包: 可獨立使用,無依賴的軟件包。

        來源:https://gitee.com/MacRsh/mr-library

        轉自公眾號:嵌入式大雜燴

        版權聲明:本文來源網絡,版權歸原作者所有。版權問題,請聯系刪除。


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: 嵌入式系統框架

        技術專區

        關閉
        主站蜘蛛池模板: 孟津县| 叙永县| 正镶白旗| 璧山县| 砚山县| 鲁山县| 满洲里市| 红原县| 二连浩特市| 治县。| 绥棱县| 巴中市| 府谷县| 宝应县| 宜阳县| 新干县| 汶上县| 揭东县| 隆安县| 安溪县| 赫章县| 罗定市| 县级市| 肃南| 宜兰市| 攀枝花市| 通山县| 漳浦县| 四子王旗| 沿河| 中方县| 屏东县| 定安县| 育儿| 巫溪县| 墨江| 牙克石市| 兰考县| 北流市| 石棉县| 尼玛县|