mr-library 是一個面向嵌入式系統的輕量級框架,提供統一的底層驅動設備模型以及基礎服務功能,具有模塊化設計、可配置性和擴展性的特點, 可幫助開發者快速構建嵌入式應用程序。
mr-library 框架支持互斥鎖、對象管理等基礎內核功能。集成異步事件驅動框架(event)、多時基軟件定時器(soft-timer) 等服務。提供串口、SPI、I2C、ADC/DAC等常見外設的驅動設備模型,通過統一的驅動接口(open、close、ioctl、read、write)訪問底層硬件設備,解耦底層驅動和應用。
開發者能以面向對象的方式訪問外設,簡化驅動邏輯的開發流程。框架實現了常用外設的通用驅動模板,開發者可以快速移植到不同的硬件平臺。
驅動設備框架支持普通設備的通用接口、總線設備自動總線控制、多種設備的中斷接管。
設備驅動框架提供統一的操作接口,設備的所有操作都需要通過以下接口實現:
| 接口 | 描述 |
|---|---|
| mr_device_add | 添加設備 |
| mr_device_find | 查找設備 |
| mr_device_open | 打開設備 |
| mr_device_close | 關閉設備 |
| mr_device_ioctl | 控制設備 |
| mr_device_read | 從設備讀取數據 |
| mr_device_write | 向設備寫入數據 |
/*?定義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_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);
????}
}
現象:
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_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);
????}
}
mr-library 的代碼目錄結構如下表所示:
| 名稱 | 描述 |
|---|---|
| bsp | 板級支持包 |
| device | 設備文件 |
| document | 文檔 |
| driver | 驅動文件 |
| include | 庫頭文件 |
| module | 組件 |
| package | 軟件包 |
| src | 庫源文件 |
來源:https://gitee.com/MacRsh/mr-library
轉自公眾號:嵌入式大雜燴
版權聲明:本文來源網絡,版權歸原作者所有。版權問題,請聯系刪除。
?GPIO基礎知識的概括!(最全資料)
?神器來了!一鍵提升嵌入式代碼質量
?指甲大小芯片,如何裝下數百億晶體管?