嵌入式编程设计模式——硬件代理模式

硬件代理模式主要是通过创建某一软件单元来负责对嵌入式系统中某一特定硬件进行操作。
硬件代理模式使用类或结构体封装所有对硬件设备的操作,将硬件的寄存器地址、通信方式等进行封装,只提供对硬件进行读写以及初始化、配置等接口。
一般每个硬件只有一个硬件代理,硬件代理可以被多个应用访问。
硬件代理模式主要有以下两个角色:
1.硬件设备
表示实际的硬件,可以是单片机的片上外设(如ADC、DAC等)也可以是通过外设连结的其他芯片(如扩展的EEPROM)、电机及电机驱动等,这些硬件都可以通过设置寄存器及中断、使用总线通信或通过IO控制等方式被软件操作。对于一些较为复杂、需要通过通信等方式控制的硬件,一般会在代理之前先实现对硬件的基本读写,再由代理完成参数的配置及数据的读取等工作。
2.硬件代理
这个是该模式中的主要功能。它有为当前硬件定制的数据和函数,通常每个硬件代理都会有initialize、configure、enable等函数。另外可能会包含对硬件当前参数、数据的读取和设置等。
类的主要功能应该包括:
access()
这个公有方法从设备返回某个参数对应的值。
可以根据情况当设备的参数较少时,每个参数单独使用一个函数返回,如:
unsigned int MotorProxy_aceessMotorState(MotorProxy* const me)
unsigned int MotorProxy_accessMotorSpeed(MotorProxy* const me)
也可以根据函数的输入参数,返回对应参数所需要的值,如:
unsigned char MotorProxy_aceessMotorRegister(MotorProxy* const me,unsigned char RegisterAddr)
一般这个操作会在返回值之前调用unmarshal()方法
mutate()
这个公有方法向设备写入数据。与access()类似。
一般会在写入数据之前调用marshal()操作
configure()
这个公有方法提供配置设备的方法。可以通过直接输入配置参数或通过配置参数结构体或提前写好的参数列表来将参数传入函数中以实现参数的配置。
initialize()
这个公有方法在第一次使用之前启动并初始化设备。
deviceaddr
这个私有变量提供底层对硬件的直接访问。它可以是CPU映射的内存地址或寄存器地址,也可以是封装了串口或网络访问的外围设备的类。应用一般不能直接访问到这个变量
marshal()
这个私有方法从各种其他的方法中获取参数,并且执行数据提取、转换、封装、位操作等将应用层的数据格式转换为硬件需要的格式。
软件容易操控的数据形式“拆收”或“表示格式”转换为设备所需求的“封装数据”(或叫做“本地格式”)。
unmarshal()
该私有方法在将数据以表示格式返回给应用层之前将设备的封装数据转换为表示格式。

在STM32HAL库中也使用了类似的方法,对于串口、DMA等外设的初始化等配置,HAL库会先对对应外设的数据结构体内的数值进行初始化,之后通过HAL_UART_Init(&huart1)等函数进行初始化,从而减少了对寄存器的直接访问

你可能感兴趣的:(嵌入式设计模式)