分享一个轻量级的嵌入式设计框架.docx
现在嵌入式设计的要求,比以前要求更高了,这个时候还是建议大家要掌握一套或多食软件框架,以使随时派上用场。今天就来分享一个开源的轻量级的嵌入式设计框架:11>r-1.ibrary.1.ibrary简介MR框架是专为战入式系统设计的轻舒级框架.充分考虑了嵌入式系统在资源和性能方面的衢求.通过提供标准化的设备管理接极大简化了嵌入式应用开发的难度,帮助开发者快速构建嵌入式应用程序。框架为开发者提供了标准化的开启(open)、关闭(c1.ose)、控制(ioct1.)、读(read)、写(xritc)等接口。它将应用程序与底层硬件飘动进行解糖。应用程序无需了解第动的实现细节.当硬件发生改变时,只需要适配底层卵动,应用程序就Ur以无缱迁移到新顽件上。这大大提高了软件的可乖用性和应对新硬件的可扩屣性.mr-1.1.brary!iiro)-JI0)E1.-IX1.I1.IsI1.*»H8IIqI1.IhIH-I项目结构图 标准化的设招访问接口 应用程序和驱动开发解耦 简化底层出动和应用程序开发 轻鼠易上手,资源占用低 模块化设计,各部分解耦台井独立开发,极低的硬件迁移成本 支持在裸机环境和操作系统环境下使用要蛆 设备框架:提供设备访问标准接口 内存管理:动态内存管理 工具:链衣、队列、平衡树等常用数据结构 各类功能组件准化设备接口设备的所有操作都可通过以卜接口实现:接口描述mr_devregister注册设备mr_devopen打开设备mr_dev_c1.ose关闭设备mr_dev_ioct1.控制设蔷接口描述mrdevread从设备读取数据mrdevwrite向设备写入数据示例:structnr_spi_devspi_dev;IntJia1.n(VO1.d)(注册SPneiSJfrcs饪电平有效)spii总线上”,r-.5pi.dev-register(Sspidev,'*spi1.spi1.,j,MR_SPI_CS_ACT1.VE_1.0W);/*打开SPn总线下的SPneiQ备*/intds=mr_dev_openCspi1./sp1.1.0MR_0F1.AG_RDkK);/发送数据/Uint1.tMbufJ-GxG1.48x02,8x03,×4);nr_dev_Mrite(ds,WrJnJf,SfZeof(.rj>uf);/ui11t8-trd-buf4j-);nr-dev-read(ds,rd_buf,sizeo÷(rd-bu÷);/“关闭设备/<rdev-c1.ose(ds);MR提供Kconig可视化配置1.具,开发者无需深入了解源代码即可进行配置.KConfig会根据闻置文件自动生成配置选项界面.开发者UJ以通过简单的操作来选择猫要启用的功能组件和设置相关参数.配置工具配置工具1通过修改参数,快速裁剪所猫功能.配置完成后通过Pyts脚本自动生成礼置文件.目录结名称描述bsp板级支持包components组件device设符文件document文档driver驱动文件inc1.ude库头文件source库源文件Kconfig配置文件kconfig.py自动配置脚本1.ICENSE许可证始使用配置Kconfig环境注:KCoefig并非必须的,但是推荐使用(安装和配置非常快捷,后续教程也是以应用KCOnfig为例).1. Si1.安装PVthOn环境.1*行Python-versiontftPython版本(KCOnfig依敕于python,若无PythOn环境请自行安装).2. 在命令行中使用所示命令安装KConfig3. python-mPiPinsta1.1.windows-cursespython-mpipinsta1.1.kconfig1.ib4. C命令行中运行menuconfig-h验证安装是否成功.将框架导入工程1.从GiteesJiGithub仓库下载加板;思仍到本地.将源码导入到您工程所在的13录.以STM32工程为例:名称修改日照大小Core2023/10/1418:14文件集Drivers2023/10/1418:14文健MDK-ARM2023/10/171527文住mr-1.ibcary2023/10/141822文件夹.mxproject2023/10/1712:45MXPROJEeT文件IOKBmxmr-1.ibrary.k)c2023/10/1712:45STM32CubeMX6KB工程目录如使用的芯片已经做了BSP适配请参考芯片对应B5P中的配置教程,完成BSP配置。移除不要的文件bsp、document、modu1.e目录(如不需娈GIT也可以移除.git文件删除).完成后,目录结构如下所示:籍S日2大G,*2WV1110H6女”夷Mdevke2023/11/3011X>6drerWMIVWMXW文gwide202V1130117女央tourerWV11/301106如也KCOn69他切1/2915:16IKBEKogpy20?W1.1.A81&2MtfirmPyOw.2KBUCtFmW11216c5912KBREADM1.md2023/11/301(X44M«kdo«*n4KBMADM1.JNmd20?V1.1/2914:11MerkckmviSKI工程目录1将文件加入到IDE中(大部分IDE都能自动识别工程路径下的文件.无需进行此步骤).以kei1.为例:工程目录Kei1.添加SOUrCe、device、driver目录下的所有文件。配置菜单选项在r-1.fbrary目录下打开命令行工具.运行menuConfig进行菜单配置.工程目录2注:当添加对应芯片驱动的后.将显示DeViCeCOnfigUre和DriVerconfigure.对应DriVerconfigure请参考BSP下教程。选中DeV1.CeConfigUre回车进入菜单,按照.需要闻置功能.tnAw(«3tw1.w>1.1.WA工程目录3配置完成后.按Q退出菜单配&界面,按Y保存配置.生成配置文件1.在mr1.ibrary目录下打开命令行工具,运行PythonkConfig.py,ER配置文件mr-config.h.添加包含路径在编译器中添加mr-1.ibrary的包含路径,以kei1.为例:'1R1.ir三/Ia32T-工程目录4配置自动初始化(GCC环境),自找您工程下以.Id为后缀的连接脚本文件(通常为Iink1.d).在脚本文件中添加代码:注:如果您的是在kei】等,能够自动生成於接脚木的环境下,请跳过此步9以*mr-1.ibraryautoinit*/.=A1.IGN(4);mrautoinitstart-.KEEP(SORT(.auto-inif)mrautoinitend=.示例:51SECTIONS.init:(sinit-.;."A1.IGN(4);KEEP(*<SORTNOHE<.in1.t) =A1.IGN(47;init-.;>F1.ASHAT>F1.ASH.vector:( (.vector> A1.IGN(64);)>FISHAT>FTSH.text:.-A1.IGN(4);*<.text>4(.text.*) (.rodata)*(.rodata) (.gnu.1inkonce.t.*) =A1.IGN(4);amr-1.ibraryautoinit/.-A1.IGN(4);KEEP(a(SORT<嬴)I>F1.ASHAT>F1.ASH工程目录鼠置GNU语法。如果您使用的是非GCC*译器,请使能GNU语法,以kci1.为例:ACS:APKX向热CQ-一IWI=sw*u三*H,1.anguage/CodeGeneratcnBdECodtOptfwonO13FIJi(TIneOPemUbOnSptbMddorMJt<FOneE1.FSecbperRncbonC«n<«1.9fn1.t工程目录6H)pt)om1orTarget'mrfary,DvicT«r(«tOatput1.iitincVierCC(A06)Aa1.inktrPV>cIUtiIiH”Prt¢rocec<d<gnu99-4arge(rm-fm<weeab<cpuoo*iMMfPU如VydI6,oabi4wd<4no<tt1.4ungd<hrhht<rmZihoetwcMrorSywbcDwSE.HA1.DRIVER.STM32F41IxEIwrfrejWawg:IAC54MWEngB5g>oeCg¾9MXJ1.TunW«Tingeno&m1.gUeC-:fc033"P1.anOwsSgnedPShoKerra¼d>arReX6yPstoonIndependertueRT11ReddMKePMcnhdependertFNoAutohdudeXOmhc/OvtrvSTM步4ei_HA1._DrbV7M/DrwSTM32F4三x.HA1.J>yhcU9cy工程目录7在您的工程中引入#inc1.ude"inc1.ude/mr_1.ib.h",在main函数中添加mr_auto,nit();白动初始化函数.来点个灯吧"inc1.ude"inc1.ude/eire1.ib.h"/定义1.ED引抑<PC13)/Udefine1.ED_PIN_NUKBER45Inta1.n(void)(/,自动初始化/三r-autoi11it();/打开P1.N设各/Intds=mr_dev_open(*pin-,MR_OF1.AG_RDXR);设置到1.ED引脚*/fir_dev_1.oct1.(ds,MR_CT1._PIN_SET_NUKfiER,«r_makeJoca1.(it,1.EJP1.NJaMBER);/-1.ED没脚为推挽输为横式/fir_dev_10Ct1.(ds,MR_CT1._P1N_SET_MOoE,GJmake_】Oca1.CnaMR_PIN_MOOE_OUTPUT);Whi1.e(I)(*点先IED/mr-dev-write(ds,11rmake-1.oca1.(uint8tjMR-PIN-HIGH-1.EV1.)jsizeof(ui11t8-t);mr_de1.ay_ms(500);mr-dev-write(ds,11r-make-1.oca1(uint8tjMR_PINjBOW_1.EVEI),sizeof(uint8-t);mr_de1.ay_fis(5);)Ie1.1.oIor1."inc1.ude,*inc1.uder-1.ib.hi11tnain(void)(r自动初始化/fir_auto_init();打开se4air设法/i11tds-mr-dev-open("seria1.1,jMR-OF1.AG-RCWR);将出He1.1.OWor1.d/r-dev,Mrite(ds,"He1.1.oWor1.dr11*,sizeof(',He1.1.oWor1.drn);WhiIe(1);