Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

#includes in C files for processor specific implementations

I'm working on a 'C' code base that was written specifically for one type of embedded processor. I've written generic 'psuedo object-oriented' code for things like LEDs, GPIO lines and ADCs (using structs, etc). I have also written a large amount of code that utilizes these 'objects' in a hardware/target agnostic manner.

We are now tossing another processor type into the mix, and I'd like to keep the current code structure so I can still make use of the higher level libraries. I do, however, need to provide different implementations for the lower level code (LEDs, GPIO, ADCs).

I know #includes in .C files are generally looked down upon, but in this case, is it appropriate? For example:

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

If this is inappropriate, what is a better implementation?

Thanks!

like image 609
Arsinio Avatar asked Mar 03 '26 15:03

Arsinio


1 Answers

Since the linker doesn't care what the name of a source file actually is (it only cares about exported symbols), you can change your linker command line for each target to name the appropriate implementation module (led_avr.c or led_pic.c).

A common way to manage multiple platform source files is to put each set of platform implementation files in their own directory, so you might have avr/led.c and pic/led.c (and avr/gpio.c and pic/gpio.c, etc).

like image 72
Greg Hewgill Avatar answered Mar 05 '26 04:03

Greg Hewgill