Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > [avr] Получить две прошивки из одной программы


Автор: UniBomb 27.10.2010, 14:01
Добрый день. Есть два прибора, которые одинаковые на 98 процентов. Оставшиеся два процента - это небольшие изменения в схемотехнике и в логике работы. Из-за 98 процентов я не хочу создавать две отдельные программы, т.к. это всё равно потребует вдвое больше усилий, нежели одна программа. Вся разница в прошивках заключается в изменении нескольких строчек в разных частях программы. Ну что-то типа такого:

Код

#if defined dev1
    //some code
#elif defined dev2
    //some else code
#endif


Так вот, можно ли после компиляции проекта получить два разных файлы прошивки, в одном из которых было бы определено dev1, во втором соответственно dev2.

Использую WinAVR.

Автор: xvr 27.10.2010, 17:17
Можно. Ключ командной строки для gcc -Ddev1 и -Ddev2. Прописать в makefile'е, или 2 раза звать make, передавая с командной строки:

Код

CPPOPTS = -D$(DEV) ...
OUTDIR = build/$(DEV)
...

$(OUTDIR)/*.o: *.c
   gcc-avr $(CPPOPTS) -c $< -o $@

...


Вызов:
Код

make DEV=dev1
make DEV=dev2

Автор: UniBomb 27.10.2010, 17:50
xvr, спасибо  smile 

Я правильно понимаю, что следующий код:

Код

PASS1 = dev1
PASS2 = dev2

$(build/$(PASS1))/%.o : %.c
    gcc-avr -c $(PASS1) $< -o $@ 

$(build/$(PASS2))/%.o : %.c
    gcc-avr -c $(PASS2) $< -o $@ 


позволит за один проход создать сразу два файла прошивки?

Автор: xvr 27.10.2010, 20:45
Цитата(UniBomb @  27.10.2010,  17:50 Найти цитируемый пост)
позволит за один проход создать сразу два файла прошивки?
Почти, если поправить синтаксис и добавить кое что smile

Код

PASS1 = dev1
PASS2 = dev2

all: build/$(PASS1)/outfile.hex build/$(PASS2)/outfile.hex 

build/$(PASS1)/%.o : %.c
    gcc-avr -c -D$(PASS1) $< -o $@ 

build/$(PASS2)/%.o : %.c
    gcc-avr -c -D$(PASS2) $< -o $@ 
Но лучше так не делать - т.к. придется отдублировать все правила в makefile'е. Лучше сделать рекурсивный запуск, так:
Код


all:
  $(MAKE) PASS=dev1 hex_file
  $(MAKE) PASS=dev2 hex_file

hex_file: build/$(PASS)/real_hex_file.hex

build/$(PASS)/%.o: %.c
  gcc-avr -c -D$(PASS) $< -o $@

Ну и для build/$(PASS)/real_hex_file.hex конечно написать правило


Автор: UniBomb 28.10.2010, 08:48
xvr, спасибо большое  smile За столько лет программирования впервые понадобилось править мейкфайл, надо будет изучить вопрос в ближайшее время  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)