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