《分享一个轻量级的嵌入式设计框架.docx》由会员分享,可在线阅读,更多相关《分享一个轻量级的嵌入式设计框架.docx(13页珍藏版)》请在课桌文档上搜索。
1、现在嵌入式设计的要求,比以前要求更高了,这个时候还是建议大家要掌握一套或多食软件框架,以使随时派上用场。今天就来分享一个开源的轻量级的嵌入式设计框架:11r-1.ibrary.1.ibrary简介MR框架是专为战入式系统设计的轻舒级框架.充分考虑了嵌入式系统在资源和性能方面的衢求.通过提供标准化的设备管理接极大简化了嵌入式应用开发的难度,帮助开发者快速构建嵌入式应用程序。框架为开发者提供了标准化的开启(open)、关闭(c1.ose)、控制(ioct1.)、读(read)、写(xritc)等接口。它将应用程序与底层硬件飘动进行解糖。应用程序无需了解第动的实现细节.当硬件发生改变时,只需要适配底
2、层卵动,应用程序就Ur以无缱迁移到新顽件上。这大大提高了软件的可乖用性和应对新硬件的可扩屣性.mr-1.1.brary!iiro)-JI0)E1.-IX1.I1.IsI1.*H8IIqI1.IhIH-I项目结构图 标准化的设招访问接口 应用程序和驱动开发解耦 简化底层出动和应用程序开发 轻鼠易上手,资源占用低 模块化设计,各部分解耦台井独立开发,极低的硬件迁移成本 支持在裸机环境和操作系统环境下使用要蛆 设备框架:提供设备访问标准接口 内存管理:动态内存管理 工具:链衣、队列、平衡树等常用数据结构 各类功能组件准化设备接口设备的所有操作都可通过以卜接口实现:接口描述mr_devregister
3、注册设备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);/发送数据/
4、Uint1.tMbufJ-GxG1.48x02,8x03,4);nr_dev_Mrite(ds,WrJnJf,SfZeof(.rjuf);/ui11t8-trd-buf4j-);nr-dev-read(ds,rd_buf,sizeo(rd-bu);/“关闭设备/6drerWMIVWMXW文gwide202V1130117女央tourerWV11/301106如也KCOn69他切1/2915:16IKBEKogpy20?W1.1.A81&2MtfirmPyOw.2KBUCtFmW11216c5912KBREADM1.md2023/11/301(X44Mkdo*n4KBMADM1.JNmd20?V
5、1.1/2914:11MerkckmviSKI工程目录1将文件加入到IDE中(大部分IDE都能自动识别工程路径下的文件.无需进行此步骤).以kei1.为例:工程目录Kei1.添加SOUrCe、device、driver目录下的所有文件。配置菜单选项在r-1.fbrary目录下打开命令行工具.运行menuConfig进行菜单配置.工程目录2注:当添加对应芯片驱动的后.将显示DeViCeCOnfigUre和DriVerconfigure.对应DriVerconfigure请参考BSP下教程。选中DeV1.CeConfigUre回车进入菜单,按照.需要闻置功能.tnAw(3tw1.w1.1.WA工程
6、目录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-.KE
7、EP(SORT(.auto-inif)mrautoinitend=.示例:51SECTIONS.init:(sinit-.;.A1.IGN(4);KEEP(*SORTNOHEF1.ASHATF1.ASH.vector:( (.vector; A1.IGN(64);)FISHATFTSH.text:.-A1.IGN(4);*4(.text.*) (.rodata)*(.rodata) (.gnu.1inkonce.t.*) =A1.IGN(4);amr-1.ibraryautoinit/.-A1.IGN(4);KEEP(a(SORTF1.ASHATF1.ASH工程目录鼠置GNU语法。如果您使用的
8、是非GCC*译器,请使能GNU语法,以kci1.为例:ACS:APKX向热CQ-一IWI=sw*u三*H,1.anguage/CodeGeneratcnBdECodtOptfwonO13FIJi(TIneOPemUbOnSptbMddorMJtFOneE1.FSecbperRncbonCncIUtiIiH”Prtrocecdgnu99-4arge(rm-fmweeabcpuoo*iMMfPU如VydI6,oabi4wd4nott1.4ungdhrhhtoeCg9MXJ1.TunWTingeno&m1.gUeC-:fc033P1.anOwsSgnedPShoKerradarReX6yPstoon
9、IndependertueRT11ReddMKePMcnhdependertFNoAutohdudeXOmhc/OvtrvSTM步4ei_HA1._DrbV7M/DrwSTM32F4三x.HA1.JyhcU9cy工程目录7在您的工程中引入#inc1.udeinc1.ude/mr_1.ib.h,在main函数中添加mr_auto,nit();白动初始化函数.来点个灯吧inc1.udeinc1.ude/eire1.ib.h/定义1.ED引抑PC13)/Udefine1.ED_PIN_NUKBER45Inta1.n(void)(/,自动初始化/三r-autoi11it();/打开P1.N设各/Int
10、ds=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(ui1
11、1t8-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);