gpt4 book ai didi

c - C 中设备驱动程序的程序组织

转载 作者:太空宇宙 更新时间:2023-11-04 01:26:07 25 4
gpt4 key购买 nike

假设我有两个设备驱动程序,我希望它们共享同一个接口(interface),这样调用者就不知道它正在与哪个驱动程序通信。我将如何在 C 中组织这个?我想到了几种方法:

首先:为具有相同接口(interface)的两个驱动程序创建一对.c/.h 文件,并在调用程序中创建一个开关:

//main.c:

#ifdef USING_DRIVER_1
#include "driver_1.h"
#else
#include "driver_2.h"
#endif // USING_DRIVER_1

第二:使用单个 header 并在驱动程序的源文件中创建一个文件长的开关,如下所示:

//driver_1.c:

#ifdef USING_DRIVER_1
#include "driver.h"

bool func(uint32_t var)
{
foo(var);
}
#endif // USING_DRIVER_1

//driver_2.c:

#ifndef USING_DRIVER_1
#include "driver.h"

bool func(uint32_t var)
{
bar(var);
}
#endif // !USING_DRIVER_1

第三:这个很像第二个,但不是在文件本身中使用 switch 语句,而是在 makefile 或 IDE 等价物中选择一个特定的驱动程序:

#makefile:

SRC = main.c
#SRC += driver_1.c
SRC += driver_2.c

我确信其中之一优于其他,并且可能还有一些我没有想到。它在实践中是如何实现的?

编辑:

关于我的特定系统的详细信息:我的目标是 ARM 微 Controller 和我的开发人员。环境是一个IDE。设备驱动程序适用于两个不同的修订版,绝不会同时使用,因此每个构建应仅包含一个版本。设备本身是通过 AT 命令运行的调制解调器。

最佳答案

这三种变体实际上都很有用。选择哪个取决于您的实际需要:

  1. 从调用方选择驱动程序会将两个驱动程序都添加到代码中。只有在运行时切换驱动程序才有意义。那么这将是(唯一的)方法。使用例如函数指针或两个相同的 const struct 提供接口(interface)(函数指针和可能的其他数据)。
  2. 全局开关非常丑陋,并且不可能跨函数和声明。更好的方法是使用 #if .. #elif#end 进行条件编译。如果这两个驱动程序只有很小的差异,例如不同的 SPI 接口(interface)(SPI1 与 SPI2 ...)。那么这就是要走的路。通过构建工具的一些努力,您甚至可以将其用于案例 1。(一个文件用于两个不同的驱动程序,但我不推荐)。
  3. 如果两个驱动程序在实现上有很大不同,但具有相同的接口(interface),则采用第三种方法,但使用单个 header 或两个驱动程序(见下文)。

请注意,除了第一种方法外,两种驱动程序都必须为应用程序提供相同的接口(interface)。第一种方法实际上允许存在差异,但这实际上需要用户代码将它们区别对待,而这可能不是您想要的。为两个驱动程序使用单个头文件(例如:“spi_memory.h”和“spi_flash.c”与“spi_eeprom.c”)确实确保应用程序看不到实际差异 - 只要驱动程序也 行为当然是一样的。界面中的变量(例如 extern size_t memory_size;)或函数(更好的方法)可以捕获细微差别。

关于c - C 中设备驱动程序的程序组织,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30683329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com