安卓游戏软件开发-话题引出咬金,你平时写单片机程序有抽象出硬件抽象层吗?
1、聊一聊
今天跟大家推荐一首bug菌常听的歌曲>,歌曲的旋律一定是你熟悉的。歌名"Yellow"不要想Y了,Yellow表示颜色是黄色的意思,但也可表示胆怯、内敛,热情的。
在之前的文章中bug菌有提到过stm32的HAL层,而该层与安卓的硬件抽象层却迥然不同,相对而言stm32的HAL层更像是每个外设的驱动程序,所以这里bug菌把安卓HAL层的思想引到MCU中来跟大家聊聊!
2、话题引出
咬金,你平时写单片机程序有考虑抽象出硬件抽象层吗?
硬件抽象层 ? 你是说像stm32的HAL库那样子吗?
。。。,不是啦,stm32的HAL库我感觉还只能算个驱动程序吧,真正的HAL层得要像安卓那样。
安卓?
有点高大上呀,不敢碰!
没你想得那么可怕,知识都是互通的呀,最近接触这些东西感觉收获颇丰。而且现在MCU越来越强大,需要学习更多的设计思路了。
你真是个狠人呀!那你学的HAL层的思想大致跟我讲讲呗,让我也学习一下。
行,那我就露两手给你瞧瞧~
1
什么是HAL层 ?
1
Hal简介
HAL层又叫硬件抽象层,英文全名为(Hardware Abstraction Layer),从名字上就觉得高大上,就像字面意思这个层面会把所有的硬件都进行抽象,它就像一款万能的遥控器,可以操作所有的旧彩电、冰箱、洗衣机、空调、热水器......(怎么感觉像收废品的)。
(上图安卓框架源于网络)
上图是经典的安卓架构图,然而HAL层的提出最早并不是在Linux中出现,而是由Microsoft公司为确保WindowsNT的稳定性和兼容性而提出的,Microsoft发现直接操作硬件不仅会带来软件上的不兼容,而且对系统稳定性也是不利因素,所以就有了类似于虚拟机这样的HAL层。
2
win VS 安卓
Windows下的HAL层是位于物理硬件设备之上的,也就是说该HAL层直接操作底层寄存器,从而形成一套统一的HAL层接口给上层操作系统使用的,那么所编写的硬件驱动都需要满足HAL层的规范才能够被使用。
而对于安卓系统所实现的HAL却与win有所差异,大家可以看看前面安卓系统层次图,其HAL层位于操作系统内核和驱动程序之上,且位于用户空间。
那么为什么会形成如此的差异呢?
2
安卓HAL层实现思路
这里不会详细的讲解每一步是如何实现的,仅仅把系统的结构理顺一下,并且把关键的调用关系理一理,让系统HAL层设计的思想为我们所用,所以这里我们只分析三层与C程序关联更多的部分安卓游戏软件开发,HAL层以上均认为是应用层,如下图所示 :
1
应用层-->HAL层
2
HAL层-->底层寄存器
HAL层三大结构体 :
然而,从上面看来HAL层仅仅只是对硬件进行了抽象,并且其操作的还是系统调用,然而要操作具体的寄存器还需要通过系统调用进入到Linux内核以Open/Write/Read/Ioctl等等接口来进行操作,这一块又是操作平时的cdev和file_Operation结构套路了。
所以在HAL可以实现大部分的逻辑和命令处理,而对应的驱动程序相对比较单一,简单的配置和发送数据等即可,所以安卓的HAL层的最终目的中不仅仅满足了厂家驱动不想开源的想法,而且还达到了抽象底层硬件的目的。
3
HAL层在单片机上的应用
虽然在单片机中没有所谓的用户态和内核态,大部分情况也不需要动态加载,但是相关的抽象思想是完全可以模仿的,比如用C实现面向对象的继承方式;把系统抽象为模块和设备,比如一类音频模块包括USB音频设备,蓝牙音频设备等等;平台相关驱动和逻辑分离等等。
如上的module层可以认为是HAL层,我们可以在MCU中引入HAL的三大结构体,从而实现设备接口上的统一和抽象,当我们驱动层发生了变化,只需要重新编写出满足HAL层接口即可。
666,好像有点东西,我得再看一篇!
哈哈安卓游戏软件开发,慢慢啃吧!
3、结束语
文本到这里就结束了,单片机仅仅只是一个工具,思维的高度才会能决定代码的质量!
好了,这里是公众号:“最后一个bug”,一个为大家打造的技术知识提升基地,如果你喜欢交流可以添加下方bug菌微信,我拉你加入公众号技术交流群。
推荐好文点击蓝色字体即可跳转
☞
☞
☞
☞