完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
说明
M-Arch的主要目标是实现同厂家不同M系列单片机之间的兼容,以及不同厂家M系列单片机之间的兼容,方便业务开发(尤其是更换MCU的场景)的软件框架。 所谓不同M系列,是指Cortex M0,M3,M4,M7等系列;所谓不同厂家,是指STM(意法半导体),GD(兆易创新),MM(灵动微),新唐等厂家,具体大家可以上网去查查。 就难度而言,很明显,不同厂家之间兼容性难度要高于同厂家不同M系列之间的差异,如果能够解决掉不同厂家之间的兼容性,同厂家不同M系列之间的兼容性是很容易搞定的。 花了点时间研究了下目前业界的M系列,厂家提供的封装库可分为2个流派:
本架构目前只提供了简单的定时器调度,不涉及嵌入式OS(指μ-Cos,RT-thread等)。 整体架构层次 整个架构的层次比较清晰,如下图所示: 对每一层的说明如下: 最底下一层是厂家提供库,包括驱动接口(.h,.c),启动文件(.s)以及必要的core库(core_cm3,core_cm4等);一般而言,这一层去厂家的官网上下载即可。 IO封装层的目标是屏蔽各厂家,不同M系列之间的差异性,对外提供统一的封装接口,保持不变,例如:GPIO读写,串口读写,CAN口读写等等。 IO抽象层的目标是屏蔽底层接口特性,方便业务层调用,本质上这一层属于业务层,例如:控制继电器动作(实际调用的是GPIO操作)。 业务层就没啥好说的了。 核心软件逻辑 这里主要讲一下IO封装层,其核心的软件设计思路如下图所示: 其中,IO.h是对外的调用头文件,其他模块只需要包含这一个头文件就行了。 IO.h中包含了各个资源的头文件(例如:io_system.h,io_gpio.h等,这些头文件中通过宏定义来体现差异性),它们的具体实现通过不同的文件来体现(例如:stm32的io_system.c就放在stm文件夹下,gd32的io_system.c就放在gd文件夹下面)。 需要说明的是MCU之间的差异性都是体现在编译时,而不是运行时,所以才可以通过宏(编译配置)以及文件组织来解决差异性。 宏的Keil编译配置如下: 目标文件的Keil配置如下(区分app和boot): IO的代码组织如下: 剩下的事情就是定义IO对外的接口,以及对应的代码实现了。 |
|
|
|
只有小组成员才能发言,加入小组>>
3319 浏览 9 评论
2997 浏览 16 评论
3495 浏览 1 评论
9065 浏览 16 评论
4088 浏览 18 评论
1186浏览 3评论
612浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
602浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2339浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1899浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 02:41 , Processed in 1.260660 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号