嵌入式系统架构浅谈:编程设计模式 (一)-------访问硬件的设计模式

2020/12/15 12:47
阅读数 204

这系列开始谈软件上面的设计,对设计模式在面向对象里面应该各位都知道,或许你在实际开发当中用到,也或许你见过别人的代码中用到。当你程序的代码足够庞大的时候,你会发现维护寸步难行,牵一发而动全身,这个时候你就能够理解在开发初期对程序架构的搭建重要性。而架构最基本熟知的其中就是设计模式,使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。尝试去研究优秀的开源代码,你会惊叹别人对程序的掌控,这时你会稍稍明白架构的目的所在。

文章基于《C嵌入式编程设计模式》这本书,英文是Design Patterns for Embedded Systems in C。主要是做个笔记,添加一点个人的理解,分享出来与各位探讨。比较针对嵌入式系统,单片机,程序已C语言为主,尽管是面向过程,但不妨碍我们使用面向对象的思维来开发。


1. 访问硬件的设计模式

嵌入式系统,特别单片机最明显的是对硬件的直接访问。基础硬件不仅有CPU,内存,键盘,传感器,通讯RS232等这样的设备。做单片机的不得不对硬件进行控制,读,写操作,而这篇文章已解决管理和操作这些硬件通常的一个模式。或许对你来说并不陌生,但是是否能够系统的,详细的表达出来这就不仅仅只是了解就能达到的。

下面讨论的设计模式已经在操作硬件上的到证明是可靠有效的。简单总结说,硬件代理模式是以封装详细信息为目的的硬件抽象的一个原型模式,它有可能改变提供给硬件或来自硬件的信息处理方法。硬件适配器模式扩展硬件代理模式,以提供支持不同硬件接口的能力。中介者支持多种硬件设备的协调,实现系统级行为。观察者模式是发布遥感数据到需要的软件元素的方法。去抖动模式和中断模式是硬件设备接口简单重用的方法。定时器模式扩展中断定时器为嵌入式系统提供精确时序。

1.1 硬件代理模式

硬件代理模式概念是对访问硬件接口的封装,限制客户直接访问硬件造成问题。

1.1.1 模式结构

模式结构非常简单,可能客户会有多个,但是每个硬件设备仅有一个硬件代理,客户只能访问代理接口,无法直接访问硬件就是这个模式的目的。

1.1.2 角色

1.1.2.1 硬件设备(HardwareDevice)

硬件设备可以是各种,内存,传感器等,包含了端口地址,内存地址,寄存器地址等等元素。与硬件代理的关联是通过软件寻址方式,对硬件的读写操作。

1.1.2.2 硬件代理(HardwareProxy)

这个是系统中的主功能。给上层应用提供的硬件访问接口,上层应用无须详细关心硬件的具体实现。基本上通常每个代理都有initialize()、configure()和disable()函数。大部分还会有对设备的值读取访问,或者写访问接口。但是一般不能随意读写,会详细到读取到最终的值。

函数包括:

access():从设备返回一个特殊值。大多数情况下,代理会对每个来自设备单独的信息提供单独的函数。例如返回传感器的温度,湿度值。

configure():提供硬件配置的方法。一般会有参数列表,通过传入参数来配置正确的工作状态。

disable()、enable():提供设备的安全禁用或开启的方法。

initialize():用于第一次启动时候的初始化硬件。

mutate():用于向设备写入数据,通常总是有一个或更多的输入参数。

marshal()、unmarshal():这两个为私有函数,用于把客户数据格式转为硬件所需格式,后者相反,把硬件原始数据格式转换为客户格式。常用于加密解密,压缩解压缩等。

deviceAddr:是一个私有变量,提供底层直接访问硬件的地址。必须隐藏在代理中,不能给客户访问的机会,所以特别注意到一些接口,是否会通过了指针把该变量暴露出去。

1.1.2.3 代理客户(ProxyClient)

客户代码调用硬件代理服务来访问硬件设备。

1.1.3 效果

该模式非常普遍并且具有封装硬件接口以及编码系统的所有优点。这为不对客户端进行任何改变而从根本上改变实际硬件接口提供了灵活性。基本上所有的硬件设备都能用此模式搭建,注意的是不能暴露细节,只能返回一个最后的结果,特别在读写操作,否则就不具备有封装性了。

1.2 适配器模式

硬件适配器模式提供一种方法,使已经存在硬件接口能适用应用期望。可以说是在硬件代理模式基础上,为了能够适应底层不同的硬件设备,在中间增加一层适配器。比如在通讯上面在硬件上都存在RS232,RS485,程序需要在不同情况下使用232通讯或485通讯,而适配器可以提供统一的接口给客户层,通过指针指向所需通讯,则可以实现。最大的特点是在运行中选择,相比使用宏定义需要生成不同执行程序,可以在程序中实现自适应的功能。

1.2.1 模式结构

 

1.2.2 角色

1.2.2.1 硬件适配器(HardwareAdapter)

硬件适配器在客户和硬件代理之间执行匹配。客户告知适配器所需的硬件设备,适配器执行客户的请求。

1.2.2.2 客户硬件接口(HardwareInterfaceToClient)

客户的硬件接口表示客户期望硬件代理提供的一组服务和参数列表。仅仅作为接口,并没有实现,是通过是适配器提供硬件实现。

2.2.2.3 硬件设备(HardwareDevice)

与硬件代理模式中描述一致。

2.2.2.4 硬件代理(HardwareProxy)

与硬件代理模式中描述一致。

1.2.3 效果

该模式允许使用各种硬件代理,并且在不同的应用中使用与它们相关的硬件设备,同时亦有的应用使用不同的硬件设备时不需要做改变。我个人理解有点类似是面向对象语言中的多态概念。


未完待续

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部