依托面向接口编程开发思想,聚焦LED通用设计.doc

上传人:白大夫 文档编号:3382313 上传时间:2019-08-20 格式:DOC 页数:5 大小:21.50KB
返回 下载 相关 举报
依托面向接口编程开发思想,聚焦LED通用设计.doc_第1页
第1页 / 共5页
亲,该文档总共5页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《依托面向接口编程开发思想,聚焦LED通用设计.doc》由会员分享,可在线阅读,更多相关《依托面向接口编程开发思想,聚焦LED通用设计.doc(5页珍藏版)》请在三一文库上搜索。

1、依托面向接口编程开发思想,聚焦LED通用设计周立功教授新书面向AMetal框架与接口的编程(上),对AMetal框架进行了详细介绍,通过阅读这本书,你可以学到高度复用的软件设计原则和面向接口编程的开发思想,聚焦自己的“核心域”,改变自己的编程思维,实现企业和个人的共同进步。第八章导读8.1 LED 通用接口 8.1.1 定义接口1 接口命名am_led_setam_led_onam_led_offam_led_toggle2 接口参数3 返回值 8.1.2 实现接口1 实现接口初探2 抽象的LED 设备类3 具体的LED 设备类前面定义的抽象LED 设备类中包含了两个抽象方法:pfn_led_

2、set 和pfn_led_toggle。为了使用户可以通过LED 通用接口操作LED,就必须根据实际硬件连接,实现两个抽象方法,然后将具体设备添加到系统设备链表中。下面分别以GPIO 控制LED 的驱动实现和HC595 控制LED 的驱动实现为例,阐述LED设备驱动开发的一般方法,如果后续有其它类型的LED 控制电路,可以按照此方法添加自定义的LED 驱动。(1) GPIO 控制LED 的驱动实现具体LED 设备的核心功能是实现抽象设备类中定义的方法,首先应该基于抽象设备类派生一个具体的设备类,其类图详见图8.3。图8.3 具体设备类(GPIO)可直接定义具体的LED 设备类。比如:am_le

3、d_gpio_dev_t 即为具体的LED 设备类。具有该类型后,即可使用该类型定义一个具体的LED 设备实例:在使用GPIO 控制LED 时,需要知道对应的引脚信息和LED 点亮的电平信息,为了便于修改配置,这些信息往往由用户传递给驱动。此外,还需要提供LED 设备的ID 信息,包含起始ID 和结束ID,以确定的为设备中的每个LED 分配一个唯一ID。基于此,可以将需要由用户提供的设备相关信息存放到一个新的结构体类型中,将其作为需要由用户提供的设备信息。即:对于AM824_Core 的两个板载LED 来说,若编号为01,则可以使用该类型定义其对应的设备实例信息如下为了便于通过设备直接找到对应

4、的设备信息,在设备类中往往直接维持一个指向设备信息的指针。即:显然,在使用GPIO 控制LED 前,引脚需要初始化为输出模式,此外,在完成初始化后,还需要将具体的LED 设备添加到系统中,便于使用通用接口操作LED。这些工作通常在驱动的初始化函数中完成,初始化函数的原型为:其中,p_dev 指向am_led_gpio_dev_t 类型的设备,p_info 为指向am_led_gpio_info_t 类型实例信息的指针,其调用形式如下:初始化函数的的实现详见程序清单8.12。程序清单8.12 初始化函数实现(GPIO 控制LED)程序中,首先通过LED 的起始编号和结束编号,得到了LED 的数目

5、,由于GPIO 的引脚数目与LED 数目相等,因此,也就得到了GPIO 引脚的数目。然后将所有引脚配置为了输出模式,并根据是否为低电平点亮,初始时使所有LED 处于熄灭状态。最后,通过am_led_dev_add()函数,将具体的LED 设备添加到了系统之中。在添加LED 设备时,LED 的 ID 信息直接使用了设备信息中的ID 信息,抽象方法的实现使用了_g_led_gpio_drv_funcs 中实现的方法(其定义详见程序清单8.4),p_cookie 直接设置为了指向设备自身的指针,正因为如此,在抽象方法的实现中,p_cookie 参数即为指向设备自身的指针,可以通过p_cookie 得

6、到具体设备相关的信息,如GPIO 信息等,进而实现LED 的相关操作,完善程序清单8.4 中实现的抽象方法,详见程序清单8.13。程序清单8.13 抽象方法的实现(GPIO 控制LED)在抽象方法的实现中,首先通过类型强制转换将p_cookie 转换为指向具体设备的指针。然后通过它找到相应的引脚信息,ive_low 不同时,则GPIO 输出1,恰好是异或关系。表8.3 GPIO 输出增值表为了便于查阅,如程序清单8.14 所示展示了LED 设备接口文件am_led_gpio.h 的内容。程序清单8.14 am_led_gpio.h 文件内容(2) HC595 控制LED 的驱动实现同样,首先基

7、于抽象设备类派生一个具体的设备类,其类图详见图8.4,可直接定义具体的LED 设备类:am_led_hc595_dev_t 为具体的LED 设备类,当具有该类型后,即可使用该类型定义一个具体的LED 设备实例:图8.4 具体设备类(HC595)在使用HC595 控制LED 时,需要知道LED 和HC595相关的信息,如LED 点亮的电平信息和HC595 的数目。虽然MiniPort-595 只有一个HC595,但作为一个通用的驱动,应考虑到这些基础的扩展,以便驱动可以尽可能的支持更多的硬件电路。特别地,HC595 的每次输出都是完整的输出,如对于单个HC595,其每次输出都只能输出完整的8 位

8、数据,不能单独输出1 位数据,而LED 的控制又是对单个LED 进行的,因此,为了在控制一个LED 时,不影响到其它LED,必须使其他位的输出保持不变,这就需要实时保存当前的输出,为了保存当前所有HC595 的输出信息,需要用户提供一个缓冲区,缓冲区的大小与HC595 的个数相等。此外,还需要提供包含起始ID 和结束ID 的ID 信息。基于此,可以将需要由用户提供的设备相关信息存放到一个新的结构体类型中,将其作为需要由用户提供的设备信息:对于使用MiniPort-595 和MiniPort-LED 联合使用的情况,共计8 个LED,若分配的编号为29,则可以使用该类型定义其对应的设备实例信息如

9、下:同理,在设备类中需要维持一个指向设备信息的指针。此外,由于使用HC595 驱动LED时,需要使用HC595 的句柄handle 来传输数据,因此,用户还需要提供一个595 的句柄。handle 需要保存到设备中:注意,由于句柄往往需要通过动态的调用实例初始化函数获得,比如,HC595 的句柄可通过如下语句获得:而设备信息往往在系统启动后不会改变,可以定义为常量,因此,handle 往往由用户单独提供,不存放在设备信息中。显然,在使用GPIO 控制LED 前,需要完成设备中各成员的赋值,并熄灭所有LED,此外,在初始化完成后,还需要将具体的LED 设备添加到系统中。这些工作通常在驱动的初始化

10、函数中完成,初始化函数的原型为:其中, p_dev 为指向am_led_hc595_dev_t 类型实例的指针, p_info 为指向am_led_hc595_info_t 类型实例信息的指针,其调用形式如下:初始化函数的的实现详见程序清单8.15。程序清单8.15 初始化函数实现(HC595 控制LED)首先将缓存中的值设置为使所有LED 熄灭的值,然后使用am_hc595_send()将缓存中的值输出,使所有LED 处于熄灭状态。最后,通过am_led_dev_add()函数,将具体的LED 设备添加到了系统之中。在添加LED 设备时,LED 的 ID 信息直接使用了设备信息中的ID 信息

11、,抽象方法的实现使用了_g_led_hc595_drv_funcs 中实现的方法(其定义详见程序清单8.5),p_cookie 直接设置为了指向设备自身的指针,正因为如此,在抽象方法的实现中,p_cookie 参数即为指向设备自身的指针,可以通过p_cookie 得到具体设备相关的信息,如HC595 句柄,HC595 缓存等,进而实现LED 的相关操作,完善程序清单8.5 中实现的抽象方法详见程序清单8.16。程序清单8.16 抽象方法的实现(HC595 控制LED)在抽象方法的实现中,首先通过类型强制转换将p_cookie 转换为指向具体设备的指针。然后通过它找到相关的信息,进而实现LED 的相关操作。为了便于查阅,如程序清单8.17所示展示了LED 设备接口文件am_led_hc595.h 的内容。程序清单8.17 am_led_hc595.h 文件内容

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1