mr-library簡介
MR 框架是專為嵌入式系統設計的輕量級框架。充分考慮了嵌入式系統在資源和性能方面的需求。通過提供標準化的設備管理接口,極大簡化了嵌入式應用開發的難度,幫助開發者快速構建嵌入式應用程序。
框架為開發者提供了標準化的開啟(open)、關閉(close)、控制(ioctl)、讀(read)、寫(write)等接口。它將應用程序與底層硬件驅動進行解耦。應用程序無需了解驅動的實現細節。
當硬件發生改變時,只需要適配底層驅動,應用程序就可以無縫遷移到新硬件上。這大大提高了軟件的可重用性和應對新硬件的可擴展性。
項目結構圖
關鍵特性
標準化的設備訪問接口
應用程序和驅動開發解耦
簡化底層驅動和應用程序開發
輕量易上手,資源占用低
模塊化設計,各部分解耦合并獨立開發,極低的硬件遷移成本
支持在裸機環境和操作系統環境下使用
主要組成
設備框架:提供設備訪問標準接口
內存管理:動態內存管理
工具:鏈表、隊列、平衡樹等常用數據結構
各類功能組件
標準化設備接口
設備的所有操作都可通過以下接口實現:
?
接口 | 描述 |
---|---|
mr_dev_register | 注冊設備 |
mr_dev_open | 打開設備 |
mr_dev_close | 關閉設備 |
mr_dev_ioctl | 控制設備 |
mr_dev_read | 從設備讀取數據 |
mr_dev_write | 向設備寫入數據 |
?
示例:
?
?
struct?mr_spi_dev?spi_dev; int?main(void) { ????/*?注冊SPI10設備(CS低電平有效)到SPI1總線上?*/ ????mr_spi_dev_register(&spi_dev,?"spi1/spi10",?0,?MR_SPI_CS_ACTIVE_LOW); ????/*?打開SPI1總線下的SPI10設備?*/ ????int?ds?=?mr_dev_open("spi1/spi10",?MR_OFLAG_RDWR); ???? ????/*?發送數據?*/ ????uint8_t?wr_buf[]?=?{0x01,?0x02,?0x03,?0x04}; ????mr_dev_write(ds,?wr_buf,?sizeof(wr_buf)); ???? ????/*?接收數據?*/ ????uint8_t?rd_buf[4]?=?{0}; ????mr_dev_read(ds,?rd_buf,?sizeof(rd_buf)); ???? ????/*?關閉設備?*/ ????mr_dev_close(ds); }
?
?
配置工具
MR 提供 Kconfig 可視化配置工具,開發者無需深入了解源代碼即可進行配置。
Kconfig 會根據配置文件自動生成配置選項界面。開發者可以通過簡單的操作來選擇需要啟用的功能組件和設置相關參數。
配置工具
配置工具1
通過修改參數,快速裁剪所需功能。配置完成后通過 Python 腳本自動生成配置文件。
目錄結構
?
名稱 | 描述 |
---|---|
bsp | 板級支持包 |
components | 組件 |
device | 設備文件 |
document | 文檔 |
driver | 驅動文件 |
include | 庫頭文件 |
source | 庫源文件 |
Kconfig | 配置文件 |
kconfig.py | 自動配置腳本 |
LICENSE | 許可證 |
?
開始使用
配置 Kconfig 環境
注:Kconfig 并非必須的,但是推薦使用(安裝和配置非常快捷,后續教程也是以應用 Kconfig 為例)。
驗證系統是否安裝Python環境。在命令行中運行 python --version 檢查Python版本(Kconfig 依賴于 python,若無 python環境請自行安裝)。
在命令行中使用所示命令安裝 Kconfig:
?
?
python -m pip install windows-curses python -m pip install kconfiglib
?
?
在命令行中運行 menuconfig -h 驗證安裝是否成功。
將框架導入工程
從 Gitee 或 Github 倉庫下載最新版本源碼到本地。
將源碼導入到您工程所在的目錄。以STM32工程為例:
工程目錄
如使用的芯片已經做了 BSP 適配請參考芯片對應 BSP 中的配置教程,完成 BSP 配置。
移除不需要的文件 bsp、document、module 目錄(如不需要GIT也可以移除.git文件刪除)。完成后,目錄結構如下所示:
工程目錄1
將文件加入到IDE中(大部分IDE都能自動識別工程路徑下的文件,無需進行此步驟)。以 keil 為例:
工程目錄Keil
添加 source、device、driver 目錄下的所有文件。
配置菜單選項
在 mr-library 目錄下打開命令行工具,運行 menuconfig 進行菜單配置。
工程目錄2
注:當添加對應芯片驅動的后,將顯示 Device configure 和 Driver configure。對應 Driver configure 請參考 BSP 下教程。
選中 Device configure 回車進入菜單,按照需要配置功能。
工程目錄3
配置完成后,按 Q 退出菜單配置界面,按Y 保存配置。
生成配置文件
在 mr-library 目錄下打開命令行工具,運行 python kconfig.py,自動生成配置文件 mr_config.h。
添加包含路徑
在編譯器中添加 mr-library 的包含路徑,以 keil 為例:
工程目錄4
配置自動初始化(GCC環境),查找您工程下以 .ld 為后綴的連接腳本文件(通常為 link.ld),在腳本文件中添加代碼:注:如果您的是在 keil 等,能夠自動生成鏈接腳本的環境下,請跳過此步驟。
?
?
/*?mr-library?auto?init?*/ .?=?ALIGN(4); _mr_auto_init_start?=?.; KEEP(*(SORT(.auto_init*))) _mr_auto_init_end?=?.;
?
?
示例:
工程目錄5
配置GNU語法。如果您使用的是非 GCC 編譯器,請使能GNU語法。以 keil 為例:
AC5:
工程目錄6
AC6:
工程目錄7
在您的工程中引入 #include "include/mr_lib.h"。
在 main 函數中添加 mr_auto_init(); 自動初始化函數。
先來點個燈吧
?
?
#include?"include/mr_lib.h" /*?定義LED引腳(PC13)*/ #define?LED_PIN_NUMBER??????????????????45 int?main(void) { ????/*?自動初始化?*/ ????mr_auto_init(); ????/*?打開PIN設備?*/ ????int?ds?=?mr_dev_open("pin",?MR_OFLAG_RDWR); ????/*?設置到LED引腳?*/ ????mr_dev_ioctl(ds,?MR_CTL_PIN_SET_NUMBER,?mr_make_local(int,?LED_PIN_NUMBER)); ????/*?設置LED引腳為推挽輸出模式?*/ ????mr_dev_ioctl(ds,?MR_CTL_PIN_SET_MODE,?mr_make_local(int,?MR_PIN_MODE_OUTPUT)); ????while(1) ????{ ????????/*?點亮LED?*/ ????????mr_dev_write(ds,?mr_make_local(uint8_t,?MR_PIN_HIGH_LEVEL),?sizeof(uint8_t)); ????????mr_delay_ms(500); ????????mr_dev_write(ds,?mr_make_local(uint8_t,?MR_PIN_LOW_LEVEL),?sizeof(uint8_t)); ????????mr_delay_ms(500); ????} }
?
?
Hello World
?
?
#include?"include/mr_lib.h" int?main(void) { ????/*?自動初始化?*/ ????mr_auto_init(); ????/*?打開Serial-1設備?*/ ????int?ds?=?mr_dev_open("serial1",?MR_OFLAG_RDWR); ????/*?輸出Hello?World?*/ ????mr_dev_write(ds,?"Hello?World ",?sizeof("Hello?World ")); ???? ????while(1); } 審核編輯:黃飛
?
?
?
評論