簡體   English   中英

使用C中的設備驅動程序進行程序組織

[英]Program organization with device drivers in C

假設我有兩個設備驅動程序,並且我希望它們共享相同的接口,以便呼叫者不知道它正在與哪個驅動程序通信。 我將如何用C組織這個? 我想到了幾種方法:

首先:使用相同的界面為兩個驅動程序創建一對.c / .h文件,並在調用方中創建一個開關:

//main.c:

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

第二:使用單個標頭,並在驅動程序的源文件中創建一個文件長的開關,如下所示:

//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

第三:這與第二個非常相似,但是在文件本身或等效的IDE中選擇了特定的驅動程序,而不是在文件本身中使用switch語句:

#makefile:

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

我敢肯定,其中之一優於其他,並且可能有些我沒想到。 在實踐中如何完成?

編輯:

有關我的特定系統的詳細信息:我的目標是ARM微控制器,而我的開發人員。 環境是一個IDE。 設備驅動程序適用於兩個不同的修訂版,並且永遠不會同時使用,因此每個版本只能包含一個版本。 設備本身就是通過AT命令運行的調制解調器。

我建議使用指向函數的指針。 例如:

struct driver_api {
    bool (*pFunc)(uint32_t);
} DriverApi;
void initializeApi(struct driver_api *pApi);

// driver1.c:
void initializeApi(struct driver_api *pApi)
{
    pApi->pFunc = bar;
}
// driver2.c:
void initializeApi(struct driver_api *pApi)
{
    pApi->pFunc = foo;
}

您可能要考慮的另一件事是從源文件中刪除#ifndef USING_DRIVER_1檢查。 使用構建系統(例如make)並指定項目中應包含哪些源文件。 然后,基於某些編譯時選項(例如命令行參數)包括driver1.cdriver2.c ,但不要同時包含兩者。

指針的“優勢”在於您可以編譯兩個API,然后在運行時進行決定(無論出於何種原因,甚至在運行時都進行更改)。

這三個變體實際上都是有用的。 選擇哪種取決於您的實際需求:

  1. 從調用者中選擇驅動程序會將兩個驅動程序都添加到代碼中。 僅在運行時切換驅動程序才有意義。 那么這將是(唯一的)方法。 使用例如提供接口的函數指針或兩個相同的const struct (函數指針以及可能的其他數據)。
  2. 全局切換很丑陋,不可能在函數和聲明之間進行。 更好的方法是使用#if .. #elif #end進行條件編譯。 如果兩個驅動器之間只有很小的差異,例如不同的SPI接口(SPI1與SPI2 ...),那是有道理的。 這就是要走的路。 在構建工具上稍作努力,您甚至可以在情況1中使用它(一個文件用於兩個不同的驅動程序,但不是我的建議)。
  3. 如果兩個驅動程序的實現都大不相同,但是具有相同的接口,則采用第三種方法,但使用單個標頭或兩個驅動程序(請參見下文)。

請注意,除第一種方法外,所有驅動程序都必須為應用程序提供相同的接口 第一種方法實際上允許差異,但這實際上需要用戶代碼將它們區別對待,而這可能不是您想要的。 為兩個驅動程序使用單個頭文件(例如:“ spi_memory.h”和“ spi_flash.c”與“ spi_eeprom.c”)可以確保應用程序看不到實際的差異-只要驅動程序的行為相同,當然。 接口中的變量(例如extern size_t memory_size; )或函數(更好的方法)可以捕獲較小的差異。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM