3

我正在研究专门为一种嵌入式处理器编写的“C”代码库。我已经为 LED、GPIO 线和 ADC(使用结构等)编写了通用的“伪面向对象”代码。我还编写了大量代码,以与硬件/目标无关的方式利用这些“对象”。

我们现在正在混合使用另一种处理器类型,我想保留当前的代码结构,以便我仍然可以使用更高级别的库。但是,我确实需要为较低级别的代码(LED、GPIO、ADC)提供不同的实现。

我知道 .C 文件中的#includes 通常被看不起,但在这种情况下,它合适吗?例如:

// led.c
#ifdef TARGET_AVR
#include "led_avr.c"
#elseifdef TARGET_PIC
#include "led_pic.c"
#else
#error "Unspecified Target"
#endif

如果这是不合适的,那么更好的实现是什么?

谢谢!

4

3 回答 3

3

由于链接器并不关心源文件的实际名称(它只关心导出的符号),因此您可以更改每个目标的链接器命令行以命名适当的实现模块(led_avr.cled_pic.c)。

管理多个平台源文件的常用方法是将每组平台实现文件放在它们自己的目录中,这样您可能会有avr/led.cand pic/led.c(and avr/gpio.candpic/gpio.c等)。

于 2010-10-03T22:23:01.163 回答
2

这很好。您可以使用其他技巧,例如:

#ifdef PROC1
#define MULTI_CPU(a,b) (a)
#else
#define MULTI_CPU(a,b) (b)
#endif
于 2010-10-03T22:22:53.797 回答
0

更常见的方法是更改​​构建系统(不管它是什么)来编译或不编译那些特定的 C 文件,而不是包含 C 文件。

于 2010-10-03T22:23:22.757 回答