mr-library簡介
mr-library?是一個面向嵌入式系統(tǒng)的輕量級框架,提供統(tǒng)一的底層驅(qū)動設(shè)備模型以及基礎(chǔ)服務(wù)功能,具有模塊化設(shè)計、可配置性和擴展性的特點, 可幫助開發(fā)者快速構(gòu)建嵌入式應(yīng)用程序。
mr-library?框架支持互斥鎖、對象管理等基礎(chǔ)內(nèi)核功能。集成異步事件驅(qū)動框架(event)、多時基軟件定時器(soft-timer) 等服務(wù)。提供串口、SPI、I2C、ADC/DAC等常見外設(shè)的驅(qū)動設(shè)備模型,通過統(tǒng)一的驅(qū)動接口(open、close、ioctl、read、write)訪問底層硬件設(shè)備,解耦底層驅(qū)動和應(yīng)用。
應(yīng)用場景
MCU開發(fā)的低層驅(qū)動程序。
RTOS實時操作系統(tǒng)的外掛框架(作為驅(qū)動設(shè)備框架使用)。
驅(qū)動設(shè)備框架
開發(fā)者能以面向?qū)ο蟮姆绞皆L問外設(shè),簡化驅(qū)動邏輯的開發(fā)流程??蚣軐崿F(xiàn)了常用外設(shè)的通用驅(qū)動模板,開發(fā)者可以快速移植到不同的硬件平臺。
驅(qū)動設(shè)備框架支持普通設(shè)備的通用接口、總線設(shè)備自動總線控制、多種設(shè)備的中斷接管。
驅(qū)動設(shè)備接口
設(shè)備驅(qū)動框架提供統(tǒng)一的操作接口,設(shè)備的所有操作都需要通過以下接口實現(xiàn):
| 接口 | 描述 |
|---|---|
| mr_device_add | 添加設(shè)備 |
| mr_device_find | 查找設(shè)備 |
| mr_device_open | 打開設(shè)備 |
| mr_device_close | 關(guān)閉設(shè)備 |
| mr_device_ioctl | 控制設(shè)備 |
| mr_device_read | 從設(shè)備讀取數(shù)據(jù) |
| mr_device_write | 向設(shè)備寫入數(shù)據(jù) |
SPI設(shè)備使用示例:
?
/*?定義SPI設(shè)備?*/ #define?SPI_DEVICE0_CS_PIN??????????????10 #define?SPI_DEVICE1_CS_PIN??????????????20 struct?mr_spi_device?spi_device0,?spi_device1; /*?添加SPI設(shè)備?*/ mr_spi_device_add(&spi_device0,?"spi10",?SPI_DEVICE0_CS_PIN); mr_spi_device_add(&spi_device1,?"spi11",?SPI_DEVICE1_CS_PIN); /*?查找SPI設(shè)備?*/ 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設(shè)備?*/ mr_device_open(spi0_device,?MR_OPEN_RDWR); mr_device_open(spi1_device,?MR_OPEN_RDWR); /*?發(fā)送數(shù)據(jù)?*/ 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); /*?讀取數(shù)據(jù)?*/ mr_device_read(spi0_device,?0,?buffer0,?sizeof(buffer0)?-?1); mr_device_read(spi1_device,?0,?buffer1,?sizeof(buffer1)?-?1); /*?關(guān)閉設(shè)備?*/ mr_device_close(spi0_device); mr_device_close(spi1_device);
?
服務(wù)框架
mr-library?框架集成了輕量級的服務(wù)框架,用于構(gòu)建嵌入式開發(fā)中的應(yīng)用服務(wù),支持異步事件監(jiān)聽,多時基軟件定時器等。通過服務(wù)框架完成對應(yīng)用層不同應(yīng)用間的解耦,實現(xiàn)應(yīng)用程序的模塊化,可裁剪,業(yè)務(wù)邏輯清晰,開發(fā)快速,代碼高度復(fù)用。
事件服務(wù)
事件服務(wù)是一種異步事件處理機制,它通過事件分發(fā)和回調(diào)的方式,可以有效地提高系統(tǒng)的異步處理能力、解耦性和可擴展性。
事件服務(wù)包含兩個部分:事件服務(wù)器和事件。
事件服務(wù)器用于接收和分發(fā)事件,其內(nèi)部維護(hù)一個事件隊列用于存儲待處理事件和一個事件列表用于存儲已創(chuàng)建事件。
事件需要創(chuàng)建到事件服務(wù)器并提供一個回調(diào)函數(shù)。
當(dāng)事件發(fā)生時,事件服務(wù)器會將事件插入到事件隊列中進(jìn)行緩存。事件服務(wù)器會周期性地從事件隊列中取出事件進(jìn)行分發(fā),找到對應(yīng)的事件回調(diào)進(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ā)事件 |
事件服務(wù)使用示例:
?
/*?定義事件?*/
#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_cb
");
????
????/*?通知事件服務(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_cb
");
????/*?通知事件服務(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_cb
");
????return?MR_ERR_OK;
}
int?main(void)
{
????/*?添加事件服務(wù)器到內(nèi)核容器?*/
????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);
????}
}
?
現(xiàn)象:
?
event1_cb event2_cb event3_cb
?
軟件定時器服務(wù)
軟件定時器是一種在軟件層面實現(xiàn)計時功能的機制,通過軟件定時器,可以在特定時間點或時間間隔觸發(fā)特定的事件。軟件定時器常用于實現(xiàn)周期性任務(wù)、超時處理、定時器中斷等功能。
軟件定時器包含兩個主要組件:定時服務(wù)器和定時器。
定時服務(wù)器用于時間管理和定時器處理。
定時器用于處理特定的超時處理,它需要注冊到定時服務(wù)器并提供一個回調(diào)函數(shù)。
軟件定時器服務(wù)操作接口
| 接口 | 描述 |
|---|---|
| mr_soft_timer_server_find | 查找定時服務(wù)器 |
| mr_soft_timer_server_add | 添加定時服務(wù)器 |
| mr_soft_timer_server_remove | 移除定時服務(wù)器 |
| mr_soft_timer_server_update | 定時服務(wù)器時基信號更新 |
| mr_soft_timer_server_handle | 定時服務(wù)器處理 |
| mr_soft_timer_add | 添加定時器 |
| mr_soft_timer_remove | 移除定時器 |
| mr_soft_timer_start | 啟動定時器 |
| mr_soft_timer_stop | 暫停定時器 |
| mr_soft_timer_add_then_start | 添加定時器并啟動 |
軟件定時器服務(wù)使用示例:
?
/*?定義定時服務(wù)器和定時器?*/
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
");
????return?MR_ERR_OK;
}
mr_err_t?timer2_callback(mr_soft_timer?timer,?void?*args)
{
????printf("timer2_callback
");
????return?MR_ERR_OK;
}
mr_err_t?timer3_callback(mr_soft_timer?timer,?void?*args)
{
????printf("timer3_callback
");
????mr_soft_timer_stop(timer);
????return?MR_ERR_OK;
}
int?main(void)
{
????/*?添加定時服務(wù)器?*/
????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)
????{
????????/*?更新定時服務(wù)器時鐘?*/
????????mr_soft_timer_server_update(&server,?1);
????????
????????/*?定時服務(wù)器處理(放在哪里,回調(diào)就將在哪里被調(diào)用)?*/
????????mr_soft_timer_server_handle(&server);
????}
}
?
代碼目錄
mr-library?的代碼目錄結(jié)構(gòu)如下表所示:
| 名稱 | 描述 |
|---|---|
| bsp | 板級支持包 |
| device | 設(shè)備文件 |
| document | 文檔 |
| driver | 驅(qū)動文件 |
| include | 庫頭文件 |
| module | 組件 |
| package | 軟件包 |
| src | 庫源文件 |
內(nèi)核層:?mr-library?的核心部分,實現(xiàn)對象管理,設(shè)備控制,服務(wù)接口等。
設(shè)備層: 提供統(tǒng)一的設(shè)備接口,將設(shè)備接入到內(nèi)核中。
驅(qū)動層: 為設(shè)備提供底層硬件驅(qū)動,當(dāng)硬件更換時僅需修改驅(qū)動層。
組件層: 通過框架提供的API實現(xiàn)不同的功能。包括但不限于虛擬文件系統(tǒng)、通用傳感器模塊、網(wǎng)絡(luò)框架等。
軟件包: 可獨立使用,無依賴的軟件包。
審核編輯:湯梓紅
電子發(fā)燒友App








評論