在嵌入式系统开发中,一个良好的设备驱动框架可以大大提高代码的可维护性和可移植性。本文将介绍一个轻量级的MCU设备框架实现,该框架采用面向对象的思想,通过抽象设备接口,实现了设备管理的统一化和标准化。
首先在头文件device_framework.h
中定义核心数据结构:
struct device_ops {
int (*init)(void *private_data);
int (*read)(void *private_data, void *buf, size_t size);
int (*write)(void *private_data, const void *buf, size_t size);
int (*ioctl)(void *private_data, unsigned int cmd, void *arg);
int (*config)(void *private_data, void *cfg);
void (*deinit)(void *private_data);
};
struct device {
const char *name; // 设备名称
struct device_ops *ops; // 设备操作函数集
void *private_data; // 私有数据
struct device *next; // 链表下一节点
};
在device_framework.c
中实现框架的核心功能:
#include "device_framework.h"
#include
// 设备链表头
static struct device *device_list = NULL;
// 注册设备
int device_register(struct device *dev) {
if (!dev || !dev->name || !dev->ops) {
return -1;
}
// 检查设备是否已存在
if (device_find(dev->name)) {
return -1;
}
// 添加到链表头
dev->next = device_list;
device_list = dev;
return 0;
}
// 注销设备
void device_unregister(const char *name) {
struct device *dev = device_list;
struct device *prev = NULL;
while (dev) {
if (strcmp(dev->name, name) == 0) {
if (prev) {
prev->next = dev->next;
} else {
device_list = dev->next;
}
return;
}
prev = dev;
dev = dev->next;
}
}
// 查找设备
struct device* device_find(const char *name) {
struct device *dev = device_list;
while (dev) {
if (strcmp(dev->name, name) == 0) {
return dev;
}
dev = dev->next;
}
return NULL;
}
// 设备操作函数实现
int device_init(struct device *dev) {
if (!dev || !dev->ops || !dev->ops->init) {
return -1;
}
return dev->ops->init(dev->private_data);
}
int device_read(struct device *dev, void *buf, size_t size) {
if (!dev || !dev->ops || !dev->ops->read) {
return -1;
}
return dev->ops->read(dev->private_data, buf, size);
}
int device_write(struct device *dev, const void *buf, size_t size) {
if (!dev || !dev->ops || !dev->ops->write) {
return -1;
}
return dev->ops->write(dev->private_data, buf, size);
}
int device_ioctl(struct device *dev, unsigned int cmd, void *arg) {
if (!dev || !dev->ops || !dev->ops->ioctl) {
return -1;
}
return dev->ops->ioctl(dev->private_data, cmd, arg);
}
int device_config(struct device *dev, void *cfg) {
if (!dev || !dev->ops || !dev->ops->config) {
return -1;
}
return dev->ops->config(dev->private_data, cfg);
}
void device_deinit(struct device *dev) {
if (dev && dev->ops && dev->ops->deinit) {
dev->ops->deinit(dev->private_data);
}
}
框架提供了统一的设备操作接口:
// 定义UART设备操作函数
static struct device_ops uart_ops = {
.init = uart_init,
.read = uart_read,
.write = uart_write,
.ioctl = uart_ioctl,
.config = uart_config,
.deinit = uart_deinit
};
// 定义UART设备
static struct device uart_dev = {
.name = "uart1",
.ops = &uart_ops,
.private_data = NULL
};
// 注册设备
device_register(&uart_dev);
// 使用设备
struct device *dev = device_find("uart1");
if (dev) {
device_init(dev);
char buf[32];
device_read(dev, buf, sizeof(buf));
device_write(dev, "hello", 5);
}
这个设备框架虽然简单,但包含了设备驱动框架的基本要素:
通过这样的框架,可以大大提高驱动程序的可维护性和可复用性,使得MCU的设备管理更加规范和统一。
这个框架可以作为基础,根据实际项目需求进行扩展和完善。