Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR, AVR Studio, WinAVR
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Страницы: 1, 2
pitter_3
Здравствуйте.

Решил пересесть с CVAVR на что-нибудь другое. Т.к. тамашний Си весьма ограничен и не только.
Не зная с чего начать, скачал всё, что под руку попалось:
AVR Studio V4.18 Build 684; IAR 5.30; WinAVR 20100110;

Уж не серчайте на мои вопросы, но я действительно только знакомлюсь с этими программами.


1. Правильно ли я понял, что IAR это только компилятор, который компилит либо .d90 либо hex, в зависимости от проекта. И сам по себе шить МК он не умеет?

2. Для того, что бы прошить МК кодом, который получился в IAR либо отладить его, этот код нужно открыть (например) через AVR Studio и также этот код можно прошить тоже средствами AVR Studio?

3. Нужен ли вообще IAR, ведь AVR Studio сам может компилировать, делать hex и шить? (компилировать С при помощи WinAVR)

4. Или лучше работать в связке IAR и AVR Studio. Как я понял очень большое количество исходников для AVR написаны под IAR.

5. Разве существует большая разница в коде написанным под IAR и кодом написанным чито средствами AVR Studio и WinAVR ?

6. Принимаю любые советы.

Спасибо;
MrYuran
1. Неправда. Умеет не только шить, но и отлаживать.
Кстати, выходных форматов у ИАРа очень много.
2. Прошивайте, чем больше нравится. PonyProg, Real, AVRdude...
3. Вам виднее rolleyes.gif
4. Под WinAVR (и вообще GCC) тоже немало написано.
5. Разница есть. Может и небольшая, но без адаптации текст из одной системы в другой скомпилировать не получится.

PS; не за что... biggrin.gif
Xenia
Цитата(pitter_3 @ Mar 1 2010, 15:06) *
1. Правильно ли я понял, что IAR это только компилятор, который компилит либо .d90 либо hex, в зависимости от проекта.

В проекте можно выбрать кодировку выходного файла по своему вкусу. Там кроме d90 и hex есть еще несколько десятков форматов.

Цитата(pitter_3 @ Mar 1 2010, 15:06) *
И сам по себе шить МК он не умеет?

Да, умеет. Например, через JTAGICE mkII. И отлаживать через JTAG тоже. Но есть оговорка - в зависимости от версии. У совсем старых отладчик не поддерживался.

Цитата(pitter_3 @ Mar 1 2010, 15:06) *
2. Для того, что бы прошить МК кодом, который получился в IAR либо отладить его, этот код нужно открыть (например) через AVR Studio и также этот код можно прошить тоже средствами AVR Studio?

Зачем прошивать через AVR Studio, если IAR может это сделать сам?

Цитата(pitter_3 @ Mar 1 2010, 15:06) *
3. Нужен ли вообще IAR, ведь AVR Studio сам может компилировать, делать hex и шить? (компилировать С при помощи WinAVR)

Отвечу вопросом на вопрос: "Нужна ли вообще AVR Studio, ведь IAR сам может компилировать, делать hex и шить?"

Цитата(pitter_3 @ Mar 1 2010, 15:06) *
4. Или лучше работать в связке IAR и AVR Studio. Как я понял очень большое количество исходников для AVR написаны под IAR.

Связка не нужна, достаточно освоить что-то одно.

Цитата(pitter_3 @ Mar 1 2010, 15:06) *
5. Разве существует большая разница в коде написанным под IAR и кодом написанным чисто средствами AVR Studio и WinAVR ?

Коды, генерируемые разными компиляторами, всегда разнятся. Между AVR Studio и WinAVR тоже есть подобная разница. А вы что хотели? Компиляция языка высокого уровня на низкий не может быть определена однозначно.
DpInRock
IAR пишет компиляторы для всех платформ (практически).
Следовательно, освоив ИАР для AVR, вы легко перейдете на какую-нибудь другую платформу.
Сергей Борщ
Цитата(pitter_3 @ Mar 1 2010, 14:06) *
1. Правильно ли я понял, что IAR это только компилятор, который компилит либо .d90 либо hex, в зависимости от проекта. И сам по себе шить МК он не умеет?
Про прошивку тут уже ответили, по выходным форматам: добавлением нужных ключей в команду вызова линкера можно генерить выходные файлы в нескольких форматах одновременно. Как в IAR так и в avr-gcc (WinAVR)

Цитата(DpInRock @ Mar 1 2010, 14:43) *
IAR пишет компиляторы для всех платформ (практически).
Следовательно, освоив ИАР для AVR, вы легко перейдете на какую-нибудь другую платформу.
gcc существует под все платформы (практически). Следовательно, освоив avr-gcc вы легко перейдете на какую-нибудь другую платформу. smile.gif
Или перейдете с винды на линух (а вот ИАРа под линух нет). Стоит отметить, что качество кода у ИАР выше. Но и стоимость соответствующая. Причем перейдя на новую платформу вам придется покупать ИАР под новую платформу заново.
smac
Цитата(Xenia @ Mar 1 2010, 15:32) *
Коды, генерируемые разными компиляторами, всегда разнятся. Между AVR Studio и WinAVR тоже есть подобная разница. А вы что хотели? Компиляция языка высокого уровня на низкий не может быть определена однозначно.


Так к AVR Studio как раз WinAVR и подключается в качестве компилятора, нет у студии своего сишного, есть только ассемблеры первый и второй.
pitter_3
Извиняюсь, за то, что не поблагодарил за ответы и вообще в теме не появлялся, хотя у меня и были ещё вопросы, но просто меня забанили. Разумеется ни за что, ну впрочем, как и всех, ну впрочем, как и всегда.

1.А вопрос такой: каким образом шить через IAR (я у него такой опции не нашел), или ему нужен посредник типа PonyProg или т.п.?
2.Как AVRStudio заставить шить через STK200+/300?
MrYuran
1) Шить можно из дебаггера (Project->Debug), либо внешним средством (настраивается в Tools->Configure Tools)
2) Про студию не скажу, лет 10 её не видел
pitter_3
Цитата(MrYuran @ Mar 4 2010, 11:55) *
1) Шить можно из дебаггера (Project->Debug)


А каким образом настроить программатор, где его выбрать?
MrYuran
Цитата(pitter_3 @ Mar 4 2010, 13:01) *
А каким образом настроить программатор, где его выбрать?

Насчёт AVR точно не скажу, разровнял недавно sad.gif
Вот для MSP430 (в принципе не должен сильно отличаться) это в настройках проекта Project->Options, раздел Debugger
Kabron
Цитата(pitter_3 @ Mar 4 2010, 13:01) *
А каким образом настроить программатор, где его выбрать?

А ведь вы таким образом: вопрос- ответ доооолго сабж осваивать будете, да и местным надоест, пошлют, забанят по новой.
Не проще ли к хелпу и поиску оборотиться.
Dmitro25
Начинаю осваивать IAR for AVR, раньше использовал CodeVisionAVR.
Подскажите, как в IAR узнать размер кода, который получился после компиляции? В CodeVision при компиляции появлялось окошко с информацией, а в IAR пишет только: "Linking", а затем "Total number of errors/warnings".
МП41
У меня после F7 пишет там, где warning'и, вроде ещё пишет в листингах, если они включены.
Сергей Борщ
Цитата(Dmitro25 @ Mar 18 2010, 15:24) *
Подскажите, как в IAR узнать размер кода, который получился после компиляции?
Tools->Options->Messages->Show build messages выбрать all.
А еще можно включить генерацию .map - файла (Project->Options->Linker->Listing) и в нем посмотреть детально - какая функция сколько заняла и куда попала. То же и по переменным.
Dmitro25
2Сергей Борщ:
Спасибо, всё заработало.
Dmitro25
Ещё возник вопрос про IAR:
Я в настройках проекта в "General Options" наткнулся на параметры RSTACK и CSTACK. Первый предназначен, как я понял, для хранения адресов возврата из вызываемых функций или прерываний. Второй - для хранения параметров, передаваемых в функции, а также для хранения локальных переменных.
Для интереса я решил установить оба параметра в 0 и посмотреть, что скажет компилятор. На моё удивление, ни ошибок, ни предупреждений компилятор не выдал, однако выходной файл отличался по содержимому от скомпилированного с "родными" значениями RSTACK и CSTACK.
Отсутствие предупреждений со стороны компилятора - это довольно странно - ведь с нулевыми значениями объёмов стеков программа будет однозначно неработоспособна.
И непонятно, как оценивать требуемый программе объём стека. Если для RSTACK его можно прикинуть по максимальной глубине вложенности функций, то с CSTACK вообще непонятно: кто его знает, как оптимизирует компилятор вызов функций, сколько параметров передаст через регистры, а сколько - через стек, то же самое и про локальные переменные.
Нет ли в компиляторе IAR способа автоматически оценить требуемый объём стека? Просто раньше я компилировал проекты с помощью CodeVisionAVR, там компилятор выдавал прогнозируемый объём стека данных, анализируя самую длинную цепочку вложенных вызовов функций с учётом прерываний. В случае, если рассчитанный объём стека превышал указанный в настройках проекта, выдавалось предупреждение. Понятно, что этот метод не учитывает рекурсию, вложенных вызов прерываний, но всё-таки это уже что-то.
Сергей Борщ
Цитата(Dmitro25 @ Mar 19 2010, 10:03) *
Отсутствие предупреждений со стороны компилятора - это довольно странно - ведь с нулевыми значениями объёмов стеков программа будет однозначно неработоспособна.
Ничего удивитального. Она может быть неработоспособна с любыми значениями. Компилятор определеить потребный размер стека не может, а генерить ошибку единственно в случае заданного размера 0 - какой смысл? Ну кому придет в голову ставить размер стека 0, ведь "программа будет однозначно неработоспособна".
Цитата(Dmitro25 @ Mar 19 2010, 10:03) *
И непонятно, как оценивать требуемый программе объём стека. Если для RSTACK его можно прикинуть по максимальной глубине вложенности функций, то с CSTACK вообще непонятно: кто его знает, как оптимизирует компилятор вызов функций, сколько параметров передаст через регистры, а сколько - через стек, то же самое и про локальные переменные.
Я изменял скрипт линкера так, чтобы под CSTACK оказывалась доступной вся свободная память. RSTACK, как вы сами заметили, можно легко прикинуть, а CSTACK ставил произвольный - все равно фактически ему доступна вся свободная память. Для этого я копировал в проект скрипт линкера из папок компилятора и изменял в нем строчки
Код
-Z(DATA)RSTACK+_..X_RSTACK_SIZE=_..X_SRAM_BASE-_..X_SRAM_END
-Z(DATA)CSTACK+_..X_CSTACK_SIZE=_..X_SRAM_BASE-_..X_SRAM_END
на
Код
-Z(DATA)RSTACK+_..X_RSTACK_SIZE#_..X_SRAM_BASE-_..X_SRAM_END
-Z(DATA)CSTACK+_..X_CSTACK_SIZE#_..X_SRAM_BASE-_..X_SRAM_END

Цитата(Dmitro25 @ Mar 19 2010, 10:03) *
Нет ли в компиляторе IAR способа автоматически оценить требуемый объём стека?
Как-то можно было получить в .map дерево вызовов с оценкой глубины стека. Но как - не помню. Может кто-то другой подскажет.
Dmitro25
Спасибо Вам за ответ, Сергей.
Всё-таки меня смутило то, что IAR не помогает пользователю оценить размер стека.
Информацию о размере стека, который используется каждой функцией, можно, как оказалось получить из *.LST - файла. В конце его содержится таблица "Maximum stack usage in bytes". Там для текущего модуля проекта содержится список его функций с указанием используемого данной функцией размера CStack и RStack, а также список подфункций, которые вызываются из каждой функции модуля.

Чтобы вычислить максимальный требуемый размер каждого из стеков необходимо просмотреть все пути вызовов и выбрать максимальный по каждому из стеков.
Поскольку вручную это делать не очень удобно, я написал программу, которая находит максимальные пути автоматически.
Она приложена к данному сообщению.
Для использования необходимо в опциях проекта включить генерацию *.LST-файлов. Программу нужно скопировать в папку "List" текущей конфигурации. После запуска программа анализирует все *.LST файлы в текущей папке, ищет максимальные пути для вычисления максимальных значений для CStack и RStack. Также программа пытается детектировать процедуры прерываний и анализирует максимальные пути для них отдельно. В качестве результата выводится сумма путей для прерываний и для обычных функций. По идее эти значения могут использоваться для задания параметров CStack и RStack компилятора.

На чём мог, я её оттестировал. Замечания и предложения приветствуются.
proggy
Здравствуйте! Недавно скачал ИАР написал программу всё компилируется---warnings 0 errors 0 (версия ИАР 5.20.1),но rolleyes.gif выходной файл у ИАРа .а90 или .д90, а STK500 не понимает и отказывается шить--нужен .hex laughing.gif , PonyProg шьёт но неправильно в итоге программа
в железе не работает! Как научить ИАР делать НЕХ?

Программа рабочая я её проверял другим компилятором КодеВижн
Сергей Борщ
Цитата(proggy @ Mar 29 2010, 19:57) *
Как научить ИАР делать НЕХ?
выбрать в настройках линкера формат Intel Extended. Или так. Расширение по умолчанию будет a90, но его можно поменять в соответствующем поле настроек.
Цитата(proggy @ Mar 29 2010, 19:57) *
Программа рабочая я её проверял другим компилятором КодеВижн
А вот это не показатель. Оптимизатор у CV похуже, некоторые ошибки (часто связанные с отсутствием ключевого слова volatile) могут в нем не проявиться.
Stanislav_S
Зайти в Project\Options\Linker\Output\Format - Other - intel - standart, название и расширение файла выставляем по вкусу.
Nikkolaj
Здравствуйте.
Я тоже раньше работал в Code Vision, а вчера установил IAR.
Естественно, вопросов по работе с ним много.
Code Vision я осваивал по книге Лебедева "Пособие для начинающих Code Vision AVR",
где нашёл ответы почти на все свои вопросы.
Подскажите, существует ли подобное описание работы в IAR ?
Что почитать начинающему осваивать IAR ?
zltigo
QUOTE (Nikkolaj @ Aug 31 2010, 10:12) *
Что почитать начинающему осваивать IAR ?

Просто документацию идущую в комплекте. Она совсем не плоха.
muravei
Цитата(zltigo @ Aug 31 2010, 11:26) *
Просто документацию идущую в комплекте.

Есть еще интернет. Например.
Nikkolaj
Цитата(zltigo @ Aug 31 2010, 10:26) *
Просто документацию идущую в комплекте. Она совсем не плоха.


Да, информации там действительно много, попробую разобраться.
Спасибо.


Цитата(muravei @ Aug 31 2010, 11:41) *
Есть еще интернет. Например.


Спасибо, ссылка для меня полезная.
Nikkolaj
Подскажите пожалуйста, как в ИАР работать с битовыми переменными.
В Code Vision это было просто, используешь ключевое слово bit и объявляешь переменную.
Компилятор сам отводит для неё место, начиная с R2.0.
Дальше работаешь с ней как с обычной переменной.
Например
bit b1;
b1 = 0;
....
Как это делать в ИАР ?
SasaVitebsk
Цитата(Nikkolaj @ Sep 19 2010, 18:38) *
...
В Code Vision это было просто, используешь ключевое слово bit и объявляешь переменную.
....
Как это делать в ИАР ?

Ну если учить не CV, а просто язык Си, то оказывается, что это просто сделать в любом компиляторе. Причём программа потом перенесётся для любого другого компилятора (возможно даже и для CV). Кроме того можно работать даже с битовыми полями.

Итак согласно стандарта языка Си.

Код
struct
{
  char

    bZum600                : 1,
   bit1xxx  :1,
   bit3       : 3;
} Flag;
...
Flag.bZum600 = TRUE;
...
if(Flag.bZum600) Flag.bit3 = 5;
...
Flag.bit3++;
_Pasha
Порядок назначения битов в этом случае - от младшего к старшему. Слыхал, что так может быть не всегда. Кто - нить может привести пример компилятора, который назначает биты в обратном порядке?
Сергей Борщ
Цитата(_Pasha @ Sep 19 2010, 20:48) *
Кто - нить может привести пример компилятора, который назначает биты в обратном порядке?
IAR.
Цитата
By default, the compiler places bitfield members from the least significant to the most significant bit in the container type.
By using the directive #pragma bitfields=reversed, the bitfield members are placed from the most significant to the least significant bit.

_Pasha
Спасибо, я имел ввиду неперестраиваемый вариант - тупо от MSB к LSB.
Про иар понятно - оне охватывают все возможные варианты.
Nikkolaj
Спасибо за подробный ответ.

Компилятор обязательно разместит данные битовые поля в РОН, или может разместить их и в ОЗУ ?
Существует ли возможность задать компилятору условие, распологать данные битовые поля в регистре ?
SasaVitebsk
Цитата(Nikkolaj @ Sep 21 2010, 21:35) *
Компилятор обязательно разместит данные битовые поля в РОН, или может разместить их и в ОЗУ ?
Существует ли возможность задать компилятору условие, распологать данные битовые поля в регистре ?


Ответ для IAR.
Компилятор разместит данные битовые поля так, как посчитает нужным. Например если флаги будут локальными, то, скорее всего разместит в регистре. Если вы примените static, то в памяти. Если вы объявите флаги глобальными, то - в памяти.
Основная ошибка начинающих - не надо с этим бороться. Попробуйте доверится компилятору, по крайней мере до того момента, когда сами начнёте соображать лучше. Автоматическое распределение памяти - одно из преимуществ языка более высокого уровня чем ассемблер.

Тем не менее, естественно, вы можете директивно указать размещение флагов в регистре. Для этого в опциях проекта надо запретить использование компилятором одного или нескольких регистров и явно указать адрес. Всё это описано в документации на компилятор.
_Bill
Цитата(Nikkolaj @ Sep 21 2010, 22:35) *
Спасибо за подробный ответ.

Компилятор обязательно разместит данные битовые поля в РОН, или может разместить их и в ОЗУ ?
Существует ли возможность задать компилятору условие, распологать данные битовые поля в регистре ?

Такая возможность имеется, если использовать регистры, выделенные под глобальные переменные (__regvar).
Nikkolaj
Спасибо за ответы.
Наверное Вы правы, действительно не с этого мне надо было начинать освоение ИАРа.
Но раз уже влез в этот вопрос, то хочется в нём разобраться.
Всё что я хотел, это получить 32 глобальных битовых переменных, размещённых в 4 регистрах общего назначения.
В опциях проекта я запретил использование компилятором 4х регистров, ИАР указал R15, R14, R13, R12.
Размещать в них регистровые переменные, явно указывая адрес , получается нормально ( по __regvar ).
А разместить в этих регистрах флаги, явно указывая адрес, ( по struct ) у меня так и не получилось.
Хотя пробовал по разному, задавая тип переменной и char, и __regvar.
В документации на компилятор нашёл описание, где задаются отдельные биты для регистра ввода/вывода, адрес регистра указывается явно.
В результате можно работать как с отдельным битом, так и со всем регистром.
Попробовал сделать аналогчно, всё равно, не получилось.
Если не трудно, напишите пожалуйста, как явно указать адрес для флагов, размещённых, например в регистре R15.

SasaVitebsk
Цитата
struct ff32
{
uint32_t
bit0 : 1,
bit1 : 1,
bit2 : 1,
bit3 : 1,
bit4 : 1;
};

volatile __regvar __no_init struct ff32 Flag @12;


Цитата
-------------------------------------------------------------------------
REGVAR_AN
Relative segment, address: DATA 0000000C - 0000000F (0x4 bytes), align: 0
Segment part 17. ROOT. Intra module refs: main
ENTRY ADDRESS REF BY
===== ======= ======
Flag 0000000C


Забавно, кстати. Несмотря на то что объявил volatile, пока в тексте не используешь, всё равно выкидывает переменную. Хотя, если подумать это и правильно. Скорее всего просто регистры резервирует.
skef
smile3046.gif
начал изучать winavr, написал программу (по книге шпака), не компилируется...
CODE
#include <avr/io.h>
#include <avr/delay.h>
void pause (int ms)
{
PORTD=0xFF; //все светодиоды отключены
delay_loop_2 (ms); //задержка
}
//================================
void P (void)
{
PORTD = 0; //включаем все светодиоды
delay_loop_2(5); //короткая задержка
pause (5); //пауза с погасшими светодиодами
}
//================================
void D (void)
{
PORTD = 0;
delay_loop_2 (20);
pause (5);
}
/================================
int main (void)
{
DDRD = 0xFF;
while (1)
{
P(); P(); P();
D(); D(); D();
P(); P(); P();
pause (100);
}
}

вылезают ошибки:
undefined reference to `delay_loop_2'
и предупреждения:
warning "This file has been moved to <util/delay.h>."
warning: implicit declaration of function 'delay_loop_2'
и ошибки, и предупреждения связаны с delay.h почему не компилируется???
предполагалось что программа для mega8, тактовая частота 8мгц,
писал программу в аврстудио...
MrYuran
Вам же чёрным по английски написали:
warning "This file has been moved to <util/delay.h>."
Вот и подключайте util/delay.h

Хотя, ошибку выдает линкер - скорее всего, библиотеки какой-то не хватает.
Почитайте delay.h - наверняка там должны быть разъяснения

А ещё лучше - документацию по avr-libc
tazik
'delay_loop_2' - нет такой функции в delay.h. Есть '_delay_loop_2'
skef
Спасибо! Запустилось!
Allregia
Подскажите пожалуйста - ИАР 5.50 "с таблэткой" работает с JTAFICE MkII ?
Взял с работы JTAG домой поработать, скачал с этого фтп ИАР, поставил (под ХР), драйвер на JTAG со второго пинка установился (сначала ему не понравился слишком длинный USB шнурок). В менеджере устройств Jungo и JTAG видны и "зелененькие".

Запускаю ИАР, компилирую проект, жму ^D и получаю "Failed to communicate with JTAGICE MkII".
На работе этот же JTAG с "честным" ИАРом прекрасно работает. Может таблэтка не до конца лечит?
Xenia
Цитата(Allregia @ Oct 17 2010, 17:08) *
На работе этот же JTAG с "честным" ИАРом прекрасно работает. Может таблэтка не до конца лечит?

А вы проверьте - возьмите с работы "честную" лицензию и предъявите ее в "IAR Systems License Manager". Если заработает, то виновата таблетка. Или на работе таким же способом скормите менеджеру таблеточный ключ и проверьте на работоспособность.
Я же с IAR через JTAFICE MkII не работаю, а потому ответить на вас вопрос не могу.
Allregia
Отбой.
Оно и с AVRStudio не работало - винда девайс видела, но при попытке апгрейда фирмваре студия кричала "не могу соединиться".
Проблема оказалась в USB шнурке! Взял другой - и все заработало, и в Студии и в ИАРе.
Nikkolaj
Цитата(SasaVitebsk @ Oct 1 2010, 21:03) *
Забавно, кстати. Несмотря на то что объявил volatile, пока в тексте не используешь, всё равно выкидывает переменную. Хотя, если подумать это и правильно. Скорее всего просто регистры резервирует.




Спасибо за ответ.
Извините что не ответил сразу, не было возможности.
ALFAcaRUS
Помогите пожалуйста. Пишу в WinAVR программу дла контроллера ATMega16 при попытке откомпилировать выдаёт синтаксические ошибки в Makefile. Перепробовал несколько вариантов всё равно не работает smile3046.gif
Ошибки:
MAKE Version 5.2 Copyright © 1987, 1998 Inprise Corp.
Error makefile 465: Command syntax error
Error makefile 466: Command syntax error
Error makefile 467: Command syntax error
Error makefile 468: Command syntax error
Error makefile 471: Command syntax error
Error makefile 472: Command syntax error
Error makefile 474: Command syntax error
Error makefile 475: Command syntax error
Error makefile 477: Command syntax error
Error makefile 479: Command syntax error
Error makefile 480: Command syntax error
Error makefile 535: Colon expected
Error makefile 544: Colon expected
Error makefile 566: Too many rules for target './%.o'
Error makefile 576: Too many rules for target '%.s'
Error makefile 583: Too many rules for target './%.o'
Error makefile 614: Command syntax error
*** 17 errors during make ***

> Process Exit Code: 1
> Time Taken: 00:00"


CODE
// код программы
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
DDRA = 0x00;
DDRD = 0xff;
while (1)
{
if (PORTA != 0x00)
{
PORTD = 0x60;
}
else
{
PORTD = 0x90;
}
}
}


содержимое makefile

CODE
# Hey Emacs, this is a -*- makefile -*-
#----------------------------------------------------------------------------
# WinAVR Makefile Template written by Eric B. Weddington, Jцrg Wunsch, et al.
#
# Released to the Public Domain
#
# Additional material for this makefile was written by:
# Peter Fleury
# Tim Henigan
# Colin O'Flynn
# Reiner Patommel
# Markus Pfaff
# Sander Pool
# Frederik Rouleau
# Carlos Lamas
#
#----------------------------------------------------------------------------
# On command line:
#
# make all = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF.
#
# make extcoff = Convert ELF to AVR Extended COFF.
#
# make program = Download the hex file to the device, using avrdude.
# Please customize the avrdude settings below first!
#
# make debug = Start either simulavr or avarice as specified for debugging,
# with avr-gdb or avr-insight as the front end for debugging.
#
# make filename.s = Just compile filename.c into the assembler code only.
#
# make filename.i = Create a preprocessed source file for use in submitting
# bug reports to the GCC project.
#
# To rebuild project do "make clean" then "make all".
#----------------------------------------------------------------------------


# MCU name
MCU = atmega16


# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency. You can then use this symbol in your source code to
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
# automatically to create a 32-bit value in your source code.
# Typical values are:
# F_CPU = 1000000
# F_CPU = 1843200
# F_CPU = 2000000
# F_CPU = 3686400
# F_CPU = 4000000
# F_CPU = 7372800
# F_CPU = 8000000
# F_CPU = 11059200
# F_CPU = 14745600
# F_CPU = 16000000
# F_CPU = 18432000
# F_CPU = 20000000
F_CPU = 8000000


# Output format. (can be srec, ihex, binary)
FORMAT = ihex


# Target file name (without extension).
TARGET = main


# Object files directory
# To put object files in current directory, use a dot (.), do NOT make
# this an empty or blank macro!
OBJDIR = .


# List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c


# List C++ source files here. (C dependencies are automatically generated.)
CPPSRC =


# List Assembler source files here.
# Make them always end in a capital .S. Files ending in a lowercase .s
# will not be considered source files but generated files (assembler
# output from the compiler), and will be deleted upon "make clean"!
# Even though the DOS/Win* filesystem matches both .s and .S the same,
# it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line.
ASRC =


# Optimization level, can be [0, 1, 2, 3, s].
# 0 = turn off optimization. s = optimize for size.
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
OPT = s


# Debugging format.
# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
# AVR Studio 4.10 requires dwarf-2.
# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
DEBUG = dwarf-2


# List any extra directories to look for include files here.
# Each directory must be seperated by a space.
# Use forward slashes for directory separators.
# For a directory that has spaces, enclose it in quotes.
EXTRAINCDIRS =


# Compiler flag to set the C Standard level.
# c89 = "ANSI" C
# gnu89 = c89 plus GCC extensions
# c99 = ISO C99 standard (not yet fully implemented)
# gnu99 = c99 plus GCC extensions
CSTANDARD = -std=gnu99


# Place -D or -U options here for C sources
CDEFS = -DF_CPU=$(F_CPU)UL


# Place -D or -U options here for ASM sources
ADEFS = -DF_CPU=$(F_CPU)


# Place -D or -U options here for C++ sources
CPPDEFS = -DF_CPU=$(F_CPU)UL
#CPPDEFS += -D__STDC_LIMIT_MACROS
#CPPDEFS += -D__STDC_CONSTANT_MACROS



#---------------- Compiler Options C ----------------
# -g*: generate debugging information
# -O*: optimization level
# -f...: tuning, see GCC manual and avr-libc documentation
# -Wall...: warning level
# -Wa,...: tell GCC to pass this to the assembler.
# -adhlns...: create assembler listing
CFLAGS = -g$(DEBUG)
CFLAGS += $(CDEFS)
CFLAGS += -O$(OPT)
CFLAGS += -funsigned-char
CFLAGS += -funsigned-bitfields
CFLAGS += -fpack-struct
CFLAGS += -fshort-enums
CFLAGS += -Wall
CFLAGS += -Wstrict-prototypes
#CFLAGS += -mshort-calls
#CFLAGS += -fno-unit-at-a-time
#CFLAGS += -Wundef
#CFLAGS += -Wunreachable-code
#CFLAGS += -Wsign-compare
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
CFLAGS += $(CSTANDARD)


#---------------- Compiler Options C++ ----------------
# -g*: generate debugging information
# -O*: optimization level
# -f...: tuning, see GCC manual and avr-libc documentation
# -Wall...: warning level
# -Wa,...: tell GCC to pass this to the assembler.
# -adhlns...: create assembler listing
CPPFLAGS = -g$(DEBUG)
CPPFLAGS += $(CPPDEFS)
CPPFLAGS += -O$(OPT)
CPPFLAGS += -funsigned-char
CPPFLAGS += -funsigned-bitfields
CPPFLAGS += -fpack-struct
CPPFLAGS += -fshort-enums
CPPFLAGS += -fno-exceptions
CPPFLAGS += -Wall
CFLAGS += -Wundef
#CPPFLAGS += -mshort-calls
#CPPFLAGS += -fno-unit-at-a-time
#CPPFLAGS += -Wstrict-prototypes
#CPPFLAGS += -Wunreachable-code
#CPPFLAGS += -Wsign-compare
CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
#CPPFLAGS += $(CSTANDARD)


#---------------- Assembler Options ----------------
# -Wa,...: tell GCC to pass this to the assembler.
# -adhlns: create listing
# -gstabs: have the assembler create line number information; note that
# for use in COFF files, additional information about filenames
# and function names needs to be present in the assembler source
# files -- see avr-libc docs [FIXME: not yet described there]
# -listing-cont-lines: Sets the maximum number of continuation lines of hex
# dump that will be displayed for a given single line of source input.
ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100


#---------------- Library Options ----------------
# Minimalistic printf version
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min

# Floating point printf version (requires MATH_LIB = -lm below)
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt

# If this is left blank, then it will use the Standard printf version.
PRINTF_LIB =
#PRINTF_LIB = $(PRINTF_LIB_MIN)
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)


# Minimalistic scanf version
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min

# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt

# If this is left blank, then it will use the Standard scanf version.
SCANF_LIB =
#SCANF_LIB = $(SCANF_LIB_MIN)
#SCANF_LIB = $(SCANF_LIB_FLOAT)


MATH_LIB = -lm


# List any extra directories to look for libraries here.
# Each directory must be seperated by a space.
# Use forward slashes for directory separators.
# For a directory that has spaces, enclose it in quotes.
EXTRALIBDIRS =



#---------------- External Memory Options ----------------

# 64 KB of external RAM, starting after internal RAM (ATmega128!),
# used for variables (.data/.bss) and heap (malloc()).
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff

# 64 KB of external RAM, starting after internal RAM (ATmega128!),
# only used for heap (malloc()).
#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff

EXTMEMOPTS =



#---------------- Linker Options ----------------
# -Wl,...: tell GCC to pass this to linker.
# -Map: create map file
# --cref: add cross reference to map file
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
LDFLAGS += $(EXTMEMOPTS)
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
#LDFLAGS += -T linker_script.x



#---------------- Programming Options (avrdude) ----------------

# Programming hardware: alf avr910 avrisp bascom bsd
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500
#
# Type: avrdude -c ?
# to get a full listing.
#
AVRDUDE_PROGRAMMER = stk200

# com1 = serial port. Use lpt1 to connect to parallel port.
AVRDUDE_PORT = lpt1

AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep


# Uncomment the following if you want avrdude's erase cycle counter.
# Note that this counter needs to be initialized first using -Yn,
# see avrdude manual.
#AVRDUDE_ERASE_COUNTER = -y

# Uncomment the following if you do /not/ wish a verification to be
# performed after programming the device.
#AVRDUDE_NO_VERIFY = -V

# Increase verbosity level. Please use this when submitting bug
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
# to submit bug reports.
#AVRDUDE_VERBOSE = -v -v

AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)



#---------------- Debugging Options ----------------

# For simulavr only - target MCU frequency.
DEBUG_MFREQ = $(F_CPU)

# Set the DEBUG_UI to either gdb or insight.
# DEBUG_UI = gdb
DEBUG_UI = insight

# Set the debugging back-end to either avarice, simulavr.
DEBUG_BACKEND = avarice
#DEBUG_BACKEND = simulavr

# GDB Init Filename.
GDBINIT_FILE = __avr_gdbinit

# When using avarice settings for the JTAG
JTAG_DEV = /dev/com1

# Debugging port used to communicate between GDB / avarice / simulavr.
DEBUG_PORT = 4242

# Debugging host used to communicate between GDB / avarice / simulavr, normally
# just set to localhost unless doing some sort of crazy debugging when
# avarice is running on a different computer.
DEBUG_HOST = localhost



#============================================================================


# Define programs and commands.
SHELL = sh
CC = avr-gcc
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SIZE = avr-size
AR = avr-ar rcs
NM = avr-nm
AVRDUDE = avrdude
REMOVE = rm -f
REMOVEDIR = rm -rf
COPY = cp
WINSHELL = cmd


# Define Messages
# English
MSG_ERRORS_NONE = Errors: none
MSG_BEGIN = -------- begin --------
MSG_END = -------- end --------
MSG_SIZE_BEFORE = Size before:
MSG_SIZE_AFTER = Size after:
MSG_COFF = Converting to AVR COFF:
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
MSG_FLASH = Creating load file for Flash:
MSG_EEPROM = Creating load file for EEPROM:
MSG_EXTENDED_LISTING = Creating Extended Listing:
MSG_SYMBOL_TABLE = Creating Symbol Table:
MSG_LINKING = Linking:
MSG_COMPILING = Compiling C:
MSG_COMPILING_CPP = Compiling C++:
MSG_ASSEMBLING = Assembling:
MSG_CLEANING = Cleaning project:
MSG_CREATING_LIBRARY = Creating library:




# Define all object files.
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)

# Define all listing files.
LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)


# Compiler flags to generate dependency files.
GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d


# Combine all necessary flags and optional flags.
# Add target processor to flags.
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)





# Default target.
all: begin gccversion sizebefore build sizeafter end

# Change the build target to build a HEX file or a library.
build: elf hex eep lss sym
#build: lib


elf: $(TARGET).elf
hex: $(TARGET).hex
eep: $(TARGET).eep
lss: $(TARGET).lss
sym: $(TARGET).sym
LIBNAME=lib$(TARGET).a
lib: $(LIBNAME)



# Eye candy.
# AVR Studio 3.x does not check make's exit code but relies on
# the following magic strings to be generated by the compile job.
begin:
@echo
@echo $(MSG_BEGIN)

end:
@echo $(MSG_END)
@echo


# Display size of file.
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
ELFSIZE = $(SIZE) --mcu=$(MCU) --format=avr $(TARGET).elf

sizebefore:
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
2>/dev/null; echo; fi

sizeafter:
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
2>/dev/null; echo; fi



# Display compiler version information.
gccversion :
@$(CC) --version



# Program the device.
program: $(TARGET).hex $(TARGET).eep
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)


# Generate avr-gdb config/init file which does the following:
# define the reset signal, load the target file, connect to target, and set
# a breakpoint at main().
gdb-config:
@$(REMOVE) $(GDBINIT_FILE)
@echo define reset >> $(GDBINIT_FILE)
@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
@echo end >> $(GDBINIT_FILE)
@echo file $(TARGET).elf >> $(GDBINIT_FILE)
@echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
ifeq ($(DEBUG_BACKEND),simulavr)
@echo load >> $(GDBINIT_FILE)
endif
@echo break main >> $(GDBINIT_FILE)

debug: gdb-config $(TARGET).elf
ifeq ($(DEBUG_BACKEND), avarice)
@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
@$(WINSHELL) /c pause

else
@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
$(DEBUG_MFREQ) --port $(DEBUG_PORT)
endif
@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)




# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
COFFCONVERT = $(OBJCOPY) --debugging
COFFCONVERT += --change-section-address .data-0x800000
COFFCONVERT += --change-section-address .bss-0x800000
COFFCONVERT += --change-section-address .noinit-0x800000
COFFCONVERT += --change-section-address .eeprom-0x810000



coff: $(TARGET).elf
@echo
@echo $(MSG_COFF) $(TARGET).cof
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof


extcoff: $(TARGET).elf
@echo
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof



# Create final output files (.hex, .eep) from ELF output file.
%.hex: %.elf
@echo
@echo $(MSG_FLASH) $@
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@

%.eep: %.elf
@echo
@echo $(MSG_EEPROM) $@
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0

# Create extended listing file from ELF output file.
%.lss: %.elf
@echo
@echo $(MSG_EXTENDED_LISTING) $@
$(OBJDUMP) -h -S $< > $@

# Create a symbol table from ELF output file.
%.sym: %.elf
@echo
@echo $(MSG_SYMBOL_TABLE) $@
$(NM) -n $< > $@



# Create library from object files.
.SECONDARY : $(TARGET).a
.PRECIOUS : $(OBJ)
%.a: $(OBJ)
@echo
@echo $(MSG_CREATING_LIBRARY) $@
$(AR) $@ $(OBJ)


# Link: create ELF output file from object files.
.SECONDARY : $(TARGET).elf
.PRECIOUS : $(OBJ)
%.elf: $(OBJ)
@echo
@echo $(MSG_LINKING) $@
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)


# Compile: create object files from C source files.
$(OBJDIR)/%.o : %.c
@echo
@echo $(MSG_COMPILING) $<
$(CC) -c $(ALL_CFLAGS) $< -o $@


# Compile: create object files from C++ source files.
$(OBJDIR)/%.o : %.cpp
@echo
@echo $(MSG_COMPILING_CPP) $<
$(CC) -c $(ALL_CPPFLAGS) $< -o $@


# Compile: create assembler files from C source files.
%.s : %.c
$(CC) -S $(ALL_CFLAGS) $< -o $@


# Compile: create assembler files from C++ source files.
%.s : %.cpp
$(CC) -S $(ALL_CPPFLAGS) $< -o $@


# Assemble: create object files from assembler source files.
$(OBJDIR)/%.o : %.S
@echo
@echo $(MSG_ASSEMBLING) $<
$(CC) -c $(ALL_ASFLAGS) $< -o $@


# Create preprocessed source for use in sending a bug report.
%.i : %.c
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@


# Target: clean project.
clean: begin clean_list end

clean_list :
@echo
@echo $(MSG_CLEANING)
$(REMOVE) $(TARGET).hex
$(REMOVE) $(TARGET).eep
$(REMOVE) $(TARGET).cof
$(REMOVE) $(TARGET).elf
$(REMOVE) $(TARGET).map
$(REMOVE) $(TARGET).sym
$(REMOVE) $(TARGET).lss
$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o)
$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst)
$(REMOVE) $(SRC:.c=.s)
$(REMOVE) $(SRC:.c=.d)
$(REMOVE) $(SRC:.c=.i)
$(REMOVEDIR) .dep


# Create object files directory
$(shell mkdir $(OBJDIR) 2>/dev/null)


# Include the dependency files.
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)


# Listing of phony targets.
.PHONY : all begin finish end sizebefore sizeafter gccversion \
build elf hex eep lss sym coff extcoff \
clean clean_list program debug gdb-config


Сергей Борщ
QUOTE (ALFAcaRUS @ Jan 14 2011, 18:04) *
MAKE Version 5.2 Copyright © 1987, 1998 Inprise Corp.
Это не GNU make, вероятно у них отличается синтаксис. Предполагаю, что ваш борланд стоит в path первым и вызывается его make. Как разрулить такую ситуацию - даже не подскажу. Вероятно можно поискать в студии установку вроде "команда вызова make" и прописать туда абсолютный путь к make. Или запускать студию из батника, который прописывает make от WinAVR в начало path и затем вызывает студию, или снести борланда wink.gif
ALFAcaRUS
суть в том чтоя уже откомпилировал до этого 2 или 3 программы используя этот Makefile
demiurg_spb
Цитата(ALFAcaRUS @ Jan 14 2011, 20:17) *
суть в том чтоя уже откомпилировал до этого 2 или 3 программы используя этот Makefile
Угадал все буквы и даже слова, а смысл прежложения не постиг.
Для каждой программы (вернее для каждого проекта) всегда пишут свой собственный Makefile (не будем вдаваться в подробности и рассматривать случай включения Makefile'ов).
Сергей Борщ
QUOTE (ALFAcaRUS @ Jan 14 2011, 19:17) *
суть в том чтоя уже откомпилировал до этого 2 или 3 программы используя этот Makefile
А потом установили на комп какой-то компилятор имени борланда?
Вы можете убеждать меня или себя сколько угодно, но makefile для WinAVR написан под gnu make. Если вы не верите, что синтаксис Borland make и GNU make отличается - чем же мы можем помочь?
ReAl
Цитата(Сергей Борщ @ Jan 14 2011, 18:19) *
или снести борланда wink.gif

bb-offtopic.gif
Что я и сделал при первой же возможности (для этого dll-ки для дельфийской программы на mingw32-gcc переделал).
demiurg_spb
Товарищ видимо не совсем понял, что make.exe есть и в каталоге Builder'a и в WinAVR. Хоть эти файлы и имеют одинаковое название, но по сути это две совершенно разные программы несовместимые друг с другом. И в path прописаны пути к им обоим, но путь к WinAVR имеет более низкий приоритет, т.к. инсталляция borlanda была позднее и добавила свои пути до путей WinAVR. Чтобы исправить ситуацию надо поместить пути WinAVR раньше buildera.
(наберите в справке windows "переменные среды окружения или системные переменные")
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.