2020.12.2
学习到了更进一步的驱动设计的思想:
- 面对对象
- 分层
- 分离
面向对象部分:
字符设备驱动程序抽象出一个 file_operations 结构体
我们写的程序针对硬件部分抽象出 led_operations 结构体
其实也就是将所谓的事件给抽象出一个结构体,然后对这些结构体定义进我们需要的内容,来对这个事件进行控制,达到我们想要的效果,这部分在上一篇笔记里有。
分层的思想:
和上一篇笔记中所写的一样,初步分为两层:
控制层、硬件层
控制层表示做什么,怎么做;硬件层表示让谁做。我想要用单板A来点灯,现在换成单板B,我只需要修改硬件层即可。优秀的点灯工程师必备素质。
分离的思想:
就算是同一块单板,同一块芯片,说到底就是操作引脚或是操作各种寄存器,我们原本的分层是对不同单板做区分,便于修改,现在就是对于不同的引脚做区分,便于修改。
以面向对象的思想,在 board_A_led.c 中实现 led_resouce 结构体,它定义“资源”──要用哪一个引脚。仍实现 led_operations 结构体,它要写得更完善,支持所有 GPIO。
从代码来看:
*根据示例代码来看,也就是说在led_resource.h里定义一个led_resource结构体来存放引脚信息,并且通过对地址的宏定义来让地址的修改更加方便。
#define GROUP(x) (x>>16)
#define PIN(x) (x&0xFFFF)
#define GROUP_PIN(g,p) ((g<<16) | (p))
然后在board_A_led.c里填充这个结构体,也就是指定我们要的所谓"资源"。
#include "led_resource.h"
static struct led_resource board_A_led = {
.pin = GROUP_PIN(3,1),
};
struct led_resource *get_led_resouce(void)
{
return &board_A_led;
}
最后在chio_dome_gpio.c里实现这个操作,将单板层面的修改和芯片引脚层面的修改都做到了进步
struct led_operations *get_board_led_opr(void)
{
return &board_demo_led_opr;
}
有时间画个图梳理一下(逃