推薦一個(gè)輕量級的嵌入式系統框架
mr-library 是一個(gè)面向嵌入式系統的輕量級框架,提供統一的底層驅動(dòng)設備模型以及基礎服務(wù)功能,具有模塊化設計、可配置性和擴展性的特點(diǎn), 可幫助開(kāi)發(fā)者快速構建嵌入式應用程序。
mr-library 框架支持互斥鎖、對象管理等基礎內核功能。集成異步事件驅動(dòng)框架(event)、多時(shí)基軟件定時(shí)器(soft-timer) 等服務(wù)。提供串口、SPI、I2C、ADC/DAC等常見(jiàn)外設的驅動(dòng)設備模型,通過(guò)統一的驅動(dòng)接口(open、close、ioctl、read、write)訪(fǎng)問(wèn)底層硬件設備,解耦底層驅動(dòng)和應用。
應用場(chǎng)景- MCU開(kāi)發(fā)的低層驅動(dòng)程序。
- RTOS實(shí)時(shí)操作系統的外掛框架(作為驅動(dòng)設備框架使用)。
- 各類(lèi)IoT和智能硬件產(chǎn)品的快速開(kāi)發(fā)。
驅動(dòng)設備框架
開(kāi)發(fā)者能以面向對象的方式訪(fǎng)問(wèn)外設,簡(jiǎn)化驅動(dòng)邏輯的開(kāi)發(fā)流程??蚣軐?shí)現了常用外設的通用驅動(dòng)模板,開(kāi)發(fā)者可以快速移植到不同的硬件平臺。
驅動(dòng)設備框架支持普通設備的通用接口、總線(xiàn)設備自動(dòng)總線(xiàn)控制、多種設備的中斷接管。
驅動(dòng)設備接口設備驅動(dòng)框架提供統一的操作接口,設備的所有操作都需要通過(guò)以下接口實(shí)現:
mr_device_add | 添加設備 |
mr_device_find | 查找設備 |
mr_device_open | 打開(kāi)設備 |
mr_device_close | 關(guān)閉設備 |
mr_device_ioctl | 控制設備 |
mr_device_read | 從設備讀取數據 |
mr_device_write | 向設備寫(xiě)入數據 |
/* 定義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"); /* 掛載總線(xiàn) */ mr_device_ioctl(spi0_device, MR_CTRL_ATTACH, "spi1"); mr_device_ioctl(spi1_device, MR_CTRL_ATTACH, "spi1"); /* 以可讀可寫(xiě)的方式打開(kāi)SPI設備 */ mr_device_open(spi0_device, MR_OPEN_RDWR); mr_device_open(spi1_device, MR_OPEN_RDWR); /* 發(fā)送數據 */ 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); /* 關(guān)閉設備 */ mr_device_close(spi0_device); mr_device_close(spi1_device);
服務(wù)框架
mr-library 框架集成了輕量級的服務(wù)框架,用于構建嵌入式開(kāi)發(fā)中的應用服務(wù),支持異步事件監聽(tīng),多時(shí)基軟件定時(shí)器等。通過(guò)服務(wù)框架完成對應用層不同應用間的解耦,實(shí)現應用程序的模塊化,可裁剪,業(yè)務(wù)邏輯清晰,開(kāi)發(fā)快速,代碼高度復用。
事件服務(wù)事件服務(wù)是一種異步事件處理機制,它通過(guò)事件分發(fā)和回調的方式,可以有效地提高系統的異步處理能力、解耦性和可擴展性。
事件服務(wù)包含兩個(gè)部分:事件服務(wù)器和事件。
- 事件服務(wù)器用于接收和分發(fā)事件,其內部維護一個(gè)事件隊列用于存儲待處理事件和一個(gè)事件列表用于存儲已創(chuàng )建事件。
- 事件需要創(chuàng )建到事件服務(wù)器并提供一個(gè)回調函數。
當事件發(fā)生時(shí),事件服務(wù)器會(huì )將事件插入到事件隊列中進(jìn)行緩存。事件服務(wù)器會(huì )周期性地從事件隊列中取出事件進(jìn)行分發(fā),找到對應的事件回調進(jìn)行事件處理。
事件服務(wù)操作接口mr_event_server_find | 查找事件服務(wù)器 |
mr_event_server_add | 添加事件服務(wù)器 |
mr_event_server_remove | 移除事件服務(wù)器 |
mr_event_server_handle | 事件服務(wù)器處理 |
mr_event_create | 創(chuàng )建事件 |
mr_event_delete | 移除事件 |
mr_event_notify | 通知事件發(fā)生 |
mr_event_trigger | 觸發(fā)事件 |
/* 定義事件 */ #define EVENT1 1 #define EVENT2 2 #define EVENT3 3 /* 定義事件服務(wù)器 */ struct mr_event_server event_server; mr_err_t event1_cb(mr_event_server_t server, void *args){ printf("event1_cbrn"); /* 通知事件服務(wù)器事件2發(fā)生 */ mr_event_notify(EVENT2, server); return MR_ERR_OK; } mr_err_t event2_cb(mr_event_server_t server, void *args){ printf("event2_cbrn"); /* 通知事件服務(wù)器事件3發(fā)生 */ 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){ /* 添加事件服務(wù)器到內核容器 */ mr_event_server_add(&event_server, "server", 4); /* 創(chuàng )建事件到服務(wù)器 */ 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); /* 通知事件服務(wù)器事件1發(fā)生 */ mr_event_notify(EVENT1, &event_server); while (1) { /* 事件服務(wù)器處理 */ mr_event_server_handle(&event_server); } }
現象:
event1_cb event2_cb event3_cb軟件定時(shí)器服務(wù)
軟件定時(shí)器是一種在軟件層面實(shí)現計時(shí)功能的機制,通過(guò)軟件定時(shí)器,可以在特定時(shí)間點(diǎn)或時(shí)間間隔觸發(fā)特定的事件。軟件定時(shí)器常用于實(shí)現周期性任務(wù)、超時(shí)處理、定時(shí)器中斷等功能。
軟件定時(shí)器包含兩個(gè)主要組件:定時(shí)服務(wù)器和定時(shí)器。
- 定時(shí)服務(wù)器用于時(shí)間管理和定時(shí)器處理。
- 定時(shí)器用于處理特定的超時(shí)處理,它需要注冊到定時(shí)服務(wù)器并提供一個(gè)回調函數。
mr_soft_timer_server_find | 查找定時(shí)服務(wù)器 |
mr_soft_timer_server_add | 添加定時(shí)服務(wù)器 |
mr_soft_timer_server_remove | 移除定時(shí)服務(wù)器 |
mr_soft_timer_server_update | 定時(shí)服務(wù)器時(shí)基信號更新 |
mr_soft_timer_server_handle | 定時(shí)服務(wù)器處理 |
mr_soft_timer_add | 添加定時(shí)器 |
mr_soft_timer_remove | 移除定時(shí)器 |
mr_soft_timer_start | 啟動(dòng)定時(shí)器 |
mr_soft_timer_stop | 暫停定時(shí)器 |
mr_soft_timer_add_then_start | 添加定時(shí)器并啟動(dòng) |
/* 定義定時(shí)服務(wù)器和定時(shí)器 */ 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){ /* 添加定時(shí)服務(wù)器 */ mr_soft_timer_server_add(&server, "soft-timer"); /* 添加定時(shí)器并啟動(dòng) */ 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) { /* 更新定時(shí)服務(wù)器時(shí)鐘 */ mr_soft_timer_server_update(&server, 1); /* 定時(shí)服務(wù)器處理(放在哪里,回調就將在哪里被調用) */ mr_soft_timer_server_handle(&server); } }
代碼目錄
mr-library 的代碼目錄結構如下表所示:
bsp | 板級支持包 |
device | 設備文件 |
document | 文檔 |
driver | 驅動(dòng)文件 |
include | 庫頭文件 |
module | 組件 |
package | 軟件包 |
src | 庫源文件 |
- 內核層: mr-library 的核心部分,實(shí)現對象管理,設備控制,服務(wù)接口等。
- 設備層: 提供統一的設備接口,將設備接入到內核中。
- 驅動(dòng)層: 為設備提供底層硬件驅動(dòng),當硬件更換時(shí)僅需修改驅動(dòng)層。
- 組件層: 通過(guò)框架提供的API實(shí)現不同的功能。包括但不限于虛擬文件系統、通用傳感器模塊、網(wǎng)絡(luò )框架等。
- 軟件包: 可獨立使用,無(wú)依賴(lài)的軟件包。
來(lái)源:https://gitee.com/MacRsh/mr-library
轉自公眾號:嵌入式大雜燴
版權聲明:本文來(lái)源網(wǎng)絡(luò ),版權歸原作者所有。版權問(wèn)題,請聯(lián)系刪除。
*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。