В проектах AVR Studio + AVR GCC (из пакета WinAVR) часто используют Makefile, в котором задается тип микроконтроллера AVR. В тексте программы бывает нужно с помощью препроцессора проверить, какой сейчас задан тип процессора, и в зависимости от этого выбрать нужный текст для компиляции.
Обычно тип процессора задается в Makefile таким способом:
#MCU = atmega8
MCU = atmega16
#MCU = atmega48
...
COMMON = -mmcu=$(MCU)
CFLAGS = $(COMMON)
CFLAGS += -Wall -gdwarf-2 -DF_CPU=16000000UL -fsigned-char
...
## Compile
main.o: ../main.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<
Чтобы задать тип процессора, раскомментируют одну из строчек "MCU = ..", и потом тип процессора передается компилятору через переменную мейк-файла CFLAGS и опцию -mmcu. В тексте программы необходимо включить файл avr/io.h, который проверяет тип процессора и в зависимости от него включает нужные заголовочные файлы.
Чтобы в программе самому проверить тип микроконтроллера с помощью препроцессора avr-gcc, нужно добавить код наподобие следующего:
#if defined (__AVR_ATmega8__)
//тут код для ATmega8
..
#elif defined (__AVR_ATmega16__)
//тут код для ATmega16
..
#elif defined (__AVR_ATmega48__)
//тут код для ATmega48
..
#else
#error "device type not defined"
#endif
Имена макросов типа __AVR_ATmega8__, __AVR_ATmega16__ и т. д. можно подсмотреть в файле c: \ WinAVR-20090313 \ avr \ include \ avr \ io.h. Имена макросов жестко вшиты в исполняемый файл avr-gcc (см. c: \ WinAVR-20090313 \ libexec \ gcc \ avr \ 4.3.2 \ cc1.exe, cc1obj.exe, cc1plus.exe), прочитать про их использование можно в файле c: \ WinAVR-20090313 \doc \avr-libc \avr-libc-user-manual \ using_tools.html.
Для Atmel Toolchain (используется в Atmel Studio 6) файл io.h находится в папке c: \ Program Files \ Atmel \ Atmel Studio 6.0 \ extensions \ Atmel \ AVRGCC \ 3.3.2.31 \ AVRToolchain \ avr \ include \ avr.
[Ссылки]
1. avr-gcc: как в Makefile задавать и препроцессором проверять тактовую частоту. 2. Как устроен Makefile и что это такое? 3. Магия makefile на простых примерах. |