嵌入式大杂烩周记 第 8 期:AMetal

大家好,我是杂烩君。

嵌入式大杂烩周记主要是一些实用项目学习分享,每周一篇,每篇一个主题。

https://gitee.com/zhengnianli/EmbedSummary

上周,有位小伙伴推荐了AMetal :

本期主角:AMetal

AMetal 是芯片级的裸机软件包,定义了跨平台的通用接口,使得不同厂商、型 的 MCU外设都能以通用接口操作。

AMetal 为用户提供了与具体芯片无关、仅与外设功能相关的通用接口,屏蔽了不同芯片底层的差异性。

AMetal 的特点 :

  • 外设功能标准化,提供了一系列跨平台 API,使应用程序可以跨平台复用;
  • 不依赖于操作系统服务;
  • 开放外设所有功能;
  • 独立的命名空间 am_,可以避免与其它软件包冲突;
  • 能独立运行,提供工程模板与 demo,用户在此基础上快速开发应用程序;
  • 封装时将效率和变化部分放在第一位,用户不看手册也能使用;
  • 上层系统基于 AMetal 开发外设驱动,无需针对各种繁杂外设分别开发驱动;
  • AMetal 仓库链接:

    链接:https://github.com/zlgopen/ametal

    AMetal 配套书籍电子版:

    https://www.zlg.cn/ametal/down/index.html

    license:LGPL-2.1。

    关于开源软件协议相关文章:常用的开源协议有哪些?

    AMetal的学习

    其中,AMetal_Sel.exe为AMetal的分包软件。AMetal源码中包含了许多与具体芯片相关的源码,比如board、examples、soc文件夹下的代码都按芯片进行分类,每一类有对应的文件夹。

    AMetal目前支持的芯片如下:

    board是自定义的,则可以将芯片对应的任意一个board作为模板,稍作改动即可使用。

    通过分包软件,我们可以提取出只包含某一款芯片的AMetal源码,方便我们进行学习。比如,我们提取出stm32f103rbt6 SDK开发包:

    提取得到:

    这也是一个完整的基于AMetal的stm32f103工程,我们想要基于AMetal进行STM32的应用开发,则在这个工程上进行修改即可。

    下面我们基于stm32f103rbt6 SDK开发包来学习AMetal。

    AMetal的板级工程提供了eclipse及keil5工程。此处,我们使用keil5工程。

    AMetal_stm32f103rbt6_core的keil5工程文件在如下路径:

    AMetal_stm32f103rbt6_coreboardstm32f103rbt6_coreproject_exampleprojects_keil5

    user_code就是放我们的应用代码,基于AMetal来开发应用,用户主函数是 am_main

    am_main函数被真正的main函数(user_config/am_prj_config.c文件)调用,如:

    下面我们从一个简单的led demo来了解AMetal的抽象出来的服务。接着上面的 am_main 函数一层一层往下看:

    可以看到,这个demo实现了一个led的闪烁。控制led使用了如下接口:

  • am_led_on
  • am_led_off
  • 这也是AMetal高度抽象出来的接口,屏蔽了硬件相关的操作,我们应用开发不用关心底层,调用这些高度抽象的接口真正实现了应用与硬件分离。

    下面看一下AMetal的架构图:

    AMetal 共分为 3 层, 硬件层、驱动层和标准接口层 。

  • 硬件层:对芯片外设寄存器操作进行封装。
  • 驱动层:驱动层在硬件层的基础上,进一步封装,简化外设操作。根据外设是否特殊,分为标准驱动与非标准驱动。
  • 标准接口层:这一层是是AMetal高度抽象出来的一套接口,使用这一套接口可以更好地实现应用与硬件分离。
  • 硬件外设的作用是为系统提供某种功能,AMetal基于外设的共性,对同一类外设功能进行了高度的抽象,由此形成了“服务”的抽象概念,即各种硬件外设可以为系统提供某种服务 。

    服务是抽象的,不与具体硬件绑定。同时,为了使应用程序使用这些服务,AMetal还定义了一系列标准化的软件接口,即AMetal地标准接口层。

    由于服务是对某一类功能高度抽象的结果,与具体芯片、外设、器件及实现方式均无关。即使底层硬件千变万化,都可以使用一套简洁的接口使用相应的外设。

    比如,上面的led demo就是使用了标准接口层的api函数对led进行操作。

    简要分析:

    led例程入口函数中,其操控了LED0:

    LED0宏只是简单的数字标 ,怎么知道对应着哪个引脚呢?

    其实引脚也是需要我们用户自己指定的,在user_config/am_hwconf_led_gpio.c文件中:

    这里定义了两个LED,引脚分别为PC9、PA8。

    总结下来就是,我们需要使用某个硬件设备时,我们需要在user_config文件夹对该硬件进行一些简单的设备信息初始化即可很方便地使用这个设备。因为调用了高度抽象地标准接口层API函数,即使更换硬件平台,应用也不需要修改。

    AMetal的标准设备服务接口有很多类:

    具体的使用说明可查阅其API参考手册。

    以上就是本次关于AMetal的简要分享。AMetal不仅仅给我们的应用开发提供了一个有效的开发框架,同时,其也是一手很好的学习资料,从中,可以学习到很多编程思想与编程技巧。后续,我们也抽取一些模块来剖析学习、分享。

    以上就是本次的分享,文章如有错误,欢迎指出,谢谢!

    咱们下期见~

    猜你喜欢:

    嵌入式大杂烩周记 第 7 期:zlog

    嵌入式大杂烩周记 第 6 期:FlexibleButton

    嵌入式大杂烩周记 第 5 期:SmartLink

    嵌入式大杂烩周记 第 4 期:cola_os

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2022年2月25日
    下一篇 2022年2月25日

    相关推荐