реклама на сайте
подробности

 
 
> IAR, AVR Studio, WinAVR, вопрос чайника
pitter_3
сообщение Mar 1 2010, 12:06
Сообщение #1





Группа: Участник
Сообщений: 10
Регистрация: 18-02-10
Пользователь №: 55 554



Здравствуйте.

Решил пересесть с 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. Принимаю любые советы.

Спасибо;
Go to the top of the page
 
+Quote Post
5 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 67)
MrYuran
сообщение Mar 1 2010, 12:13
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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

PS; не за что... biggrin.gif


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Xenia
сообщение Mar 1 2010, 12:32
Сообщение #3


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(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 тоже есть подобная разница. А вы что хотели? Компиляция языка высокого уровня на низкий не может быть определена однозначно.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Mar 1 2010, 12:43
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



IAR пишет компиляторы для всех платформ (практически).
Следовательно, освоив ИАР для AVR, вы легко перейдете на какую-нибудь другую платформу.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 1 2010, 13:31
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(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
Или перейдете с винды на линух (а вот ИАРа под линух нет). Стоит отметить, что качество кода у ИАР выше. Но и стоимость соответствующая. Причем перейдя на новую платформу вам придется покупать ИАР под новую платформу заново.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
smac
сообщение Mar 2 2010, 05:01
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003



Цитата(Xenia @ Mar 1 2010, 15:32) *
Коды, генерируемые разными компиляторами, всегда разнятся. Между AVR Studio и WinAVR тоже есть подобная разница. А вы что хотели? Компиляция языка высокого уровня на низкий не может быть определена однозначно.


Так к AVR Studio как раз WinAVR и подключается в качестве компилятора, нет у студии своего сишного, есть только ассемблеры первый и второй.
Go to the top of the page
 
+Quote Post
pitter_3
сообщение Mar 4 2010, 08:44
Сообщение #7





Группа: Участник
Сообщений: 10
Регистрация: 18-02-10
Пользователь №: 55 554



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

1.А вопрос такой: каким образом шить через IAR (я у него такой опции не нашел), или ему нужен посредник типа PonyProg или т.п.?
2.Как AVRStudio заставить шить через STK200+/300?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 4 2010, 08:55
Сообщение #8


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



1) Шить можно из дебаггера (Project->Debug), либо внешним средством (настраивается в Tools->Configure Tools)
2) Про студию не скажу, лет 10 её не видел


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
pitter_3
сообщение Mar 4 2010, 10:01
Сообщение #9





Группа: Участник
Сообщений: 10
Регистрация: 18-02-10
Пользователь №: 55 554



Цитата(MrYuran @ Mar 4 2010, 11:55) *
1) Шить можно из дебаггера (Project->Debug)


А каким образом настроить программатор, где его выбрать?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 4 2010, 11:15
Сообщение #10


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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

Насчёт AVR точно не скажу, разровнял недавно sad.gif
Вот для MSP430 (в принципе не должен сильно отличаться) это в настройках проекта Project->Options, раздел Debugger


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Kabron
сообщение Mar 4 2010, 18:09
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 2-02-05
Из: Москва
Пользователь №: 2 365



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

А ведь вы таким образом: вопрос- ответ доооолго сабж осваивать будете, да и местным надоест, пошлют, забанят по новой.
Не проще ли к хелпу и поиску оборотиться.

Сообщение отредактировал Kabron - Mar 4 2010, 18:10
Go to the top of the page
 
+Quote Post
Dmitro25
сообщение Mar 18 2010, 13:24
Сообщение #12


Участник
*

Группа: Свой
Сообщений: 60
Регистрация: 4-04-07
Пользователь №: 26 770



Начинаю осваивать IAR for AVR, раньше использовал CodeVisionAVR.
Подскажите, как в IAR узнать размер кода, который получился после компиляции? В CodeVision при компиляции появлялось окошко с информацией, а в IAR пишет только: "Linking", а затем "Total number of errors/warnings".
Go to the top of the page
 
+Quote Post
МП41
сообщение Mar 18 2010, 13:39
Сообщение #13


4 синих кубика
****

Группа: Участник
Сообщений: 526
Регистрация: 19-09-08
Из: полупроводника, металла и стекла
Пользователь №: 40 326



У меня после F7 пишет там, где warning'и, вроде ещё пишет в листингах, если они включены.


--------------------
p-n-p-p-n-p-n-n-p-n-p структура однако очень эффективна
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 18 2010, 14:14
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Dmitro25 @ Mar 18 2010, 15:24) *
Подскажите, как в IAR узнать размер кода, который получился после компиляции?
Tools->Options->Messages->Show build messages выбрать all.
А еще можно включить генерацию .map - файла (Project->Options->Linker->Listing) и в нем посмотреть детально - какая функция сколько заняла и куда попала. То же и по переменным.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Dmitro25
сообщение Mar 19 2010, 04:46
Сообщение #15


Участник
*

Группа: Свой
Сообщений: 60
Регистрация: 4-04-07
Пользователь №: 26 770



2Сергей Борщ:
Спасибо, всё заработало.
Go to the top of the page
 
+Quote Post
Dmitro25
сообщение Mar 19 2010, 08:03
Сообщение #16


Участник
*

Группа: Свой
Сообщений: 60
Регистрация: 4-04-07
Пользователь №: 26 770



Ещё возник вопрос про IAR:
Я в настройках проекта в "General Options" наткнулся на параметры RSTACK и CSTACK. Первый предназначен, как я понял, для хранения адресов возврата из вызываемых функций или прерываний. Второй - для хранения параметров, передаваемых в функции, а также для хранения локальных переменных.
Для интереса я решил установить оба параметра в 0 и посмотреть, что скажет компилятор. На моё удивление, ни ошибок, ни предупреждений компилятор не выдал, однако выходной файл отличался по содержимому от скомпилированного с "родными" значениями RSTACK и CSTACK.
Отсутствие предупреждений со стороны компилятора - это довольно странно - ведь с нулевыми значениями объёмов стеков программа будет однозначно неработоспособна.
И непонятно, как оценивать требуемый программе объём стека. Если для RSTACK его можно прикинуть по максимальной глубине вложенности функций, то с CSTACK вообще непонятно: кто его знает, как оптимизирует компилятор вызов функций, сколько параметров передаст через регистры, а сколько - через стек, то же самое и про локальные переменные.
Нет ли в компиляторе IAR способа автоматически оценить требуемый объём стека? Просто раньше я компилировал проекты с помощью CodeVisionAVR, там компилятор выдавал прогнозируемый объём стека данных, анализируя самую длинную цепочку вложенных вызовов функций с учётом прерываний. В случае, если рассчитанный объём стека превышал указанный в настройках проекта, выдавалось предупреждение. Понятно, что этот метод не учитывает рекурсию, вложенных вызов прерываний, но всё-таки это уже что-то.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 19 2010, 10:36
Сообщение #17


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(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 дерево вызовов с оценкой глубины стека. Но как - не помню. Может кто-то другой подскажет.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Dmitro25
сообщение Mar 23 2010, 07:07
Сообщение #18


Участник
*

Группа: Свой
Сообщений: 60
Регистрация: 4-04-07
Пользователь №: 26 770



Спасибо Вам за ответ, Сергей.
Всё-таки меня смутило то, что IAR не помогает пользователю оценить размер стека.
Информацию о размере стека, который используется каждой функцией, можно, как оказалось получить из *.LST - файла. В конце его содержится таблица "Maximum stack usage in bytes". Там для текущего модуля проекта содержится список его функций с указанием используемого данной функцией размера CStack и RStack, а также список подфункций, которые вызываются из каждой функции модуля.

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

На чём мог, я её оттестировал. Замечания и предложения приветствуются.
Прикрепленные файлы
Прикрепленный файл  Stack.zip ( 40.08 килобайт ) Кол-во скачиваний: 65
 
Go to the top of the page
 
+Quote Post
proggy
сообщение Mar 29 2010, 17:57
Сообщение #19





Группа: Новичок
Сообщений: 1
Регистрация: 29-03-10
Пользователь №: 56 279



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

Программа рабочая я её проверял другим компилятором КодеВижн
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 29 2010, 18:44
Сообщение #20


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(proggy @ Mar 29 2010, 19:57) *
Как научить ИАР делать НЕХ?
выбрать в настройках линкера формат Intel Extended. Или так. Расширение по умолчанию будет a90, но его можно поменять в соответствующем поле настроек.
Цитата(proggy @ Mar 29 2010, 19:57) *
Программа рабочая я её проверял другим компилятором КодеВижн
А вот это не показатель. Оптимизатор у CV похуже, некоторые ошибки (часто связанные с отсутствием ключевого слова volatile) могут в нем не проявиться.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Stanislav_S
сообщение Mar 29 2010, 18:57
Сообщение #21


извечный пессимист
*****

Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125



Зайти в Project\Options\Linker\Output\Format - Other - intel - standart, название и расширение файла выставляем по вкусу.


--------------------
Slaves are those of this world
Given freedom to lay chains upon The Master
The wolf is no longer free
Release the chains and come for me
Go to the top of the page
 
+Quote Post
Nikkolaj
сообщение Aug 31 2010, 07:12
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 25-09-08
Пользователь №: 40 467



Здравствуйте.
Я тоже раньше работал в Code Vision, а вчера установил IAR.
Естественно, вопросов по работе с ним много.
Code Vision я осваивал по книге Лебедева "Пособие для начинающих Code Vision AVR",
где нашёл ответы почти на все свои вопросы.
Подскажите, существует ли подобное описание работы в IAR ?
Что почитать начинающему осваивать IAR ?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 31 2010, 07:26
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Nikkolaj @ Aug 31 2010, 10:12) *
Что почитать начинающему осваивать IAR ?

Просто документацию идущую в комплекте. Она совсем не плоха.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
muravei
сообщение Aug 31 2010, 08:41
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591



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

Есть еще интернет. Например.
Go to the top of the page
 
+Quote Post
Nikkolaj
сообщение Sep 6 2010, 17:21
Сообщение #25


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 25-09-08
Пользователь №: 40 467



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


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


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


Спасибо, ссылка для меня полезная.
Go to the top of the page
 
+Quote Post
Nikkolaj
сообщение Sep 19 2010, 15:38
Сообщение #26


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 25-09-08
Пользователь №: 40 467



Подскажите пожалуйста, как в ИАР работать с битовыми переменными.
В Code Vision это было просто, используешь ключевое слово bit и объявляешь переменную.
Компилятор сам отводит для неё место, начиная с R2.0.
Дальше работаешь с ней как с обычной переменной.
Например
bit b1;
b1 = 0;
....
Как это делать в ИАР ?
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 19 2010, 17:42
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(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++;
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Sep 19 2010, 17:48
Сообщение #28


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Порядок назначения битов в этом случае - от младшего к старшему. Слыхал, что так может быть не всегда. Кто - нить может привести пример компилятора, который назначает биты в обратном порядке?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 19 2010, 21:50
Сообщение #29


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(_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.



--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Sep 20 2010, 05:26
Сообщение #30


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Спасибо, я имел ввиду неперестраиваемый вариант - тупо от MSB к LSB.
Про иар понятно - оне охватывают все возможные варианты.
Go to the top of the page
 
+Quote Post
Nikkolaj
сообщение Sep 21 2010, 18:35
Сообщение #31


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 25-09-08
Пользователь №: 40 467



Спасибо за подробный ответ.

Компилятор обязательно разместит данные битовые поля в РОН, или может разместить их и в ОЗУ ?
Существует ли возможность задать компилятору условие, распологать данные битовые поля в регистре ?
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 22 2010, 15:47
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



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


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

Тем не менее, естественно, вы можете директивно указать размещение флагов в регистре. Для этого в опциях проекта надо запретить использование компилятором одного или нескольких регистров и явно указать адрес. Всё это описано в документации на компилятор.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Sep 23 2010, 04:38
Сообщение #33


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Nikkolaj @ Sep 21 2010, 22:35) *
Спасибо за подробный ответ.

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

Такая возможность имеется, если использовать регистры, выделенные под глобальные переменные (__regvar).
Go to the top of the page
 
+Quote Post
Nikkolaj
сообщение Oct 1 2010, 09:57
Сообщение #34


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 25-09-08
Пользователь №: 40 467



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

Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 1 2010, 17:03
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата
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, пока в тексте не используешь, всё равно выкидывает переменную. Хотя, если подумать это и правильно. Скорее всего просто регистры резервирует.
Go to the top of the page
 
+Quote Post
skef
сообщение Oct 11 2010, 08:35
Сообщение #36


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 29-10-09
Из: брежнев
Пользователь №: 53 292



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мгц,
писал программу в аврстудио...


--------------------
на любой элемент найдется мощность, которая его сожжет.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Oct 11 2010, 08:41
Сообщение #37


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Вам же чёрным по английски написали:
warning "This file has been moved to <util/delay.h>."
Вот и подключайте util/delay.h

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

А ещё лучше - документацию по avr-libc


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
tazik
сообщение Oct 11 2010, 08:56
Сообщение #38


Частый гость
**

Группа: Свой
Сообщений: 195
Регистрация: 13-05-07
Из: Норильск
Пользователь №: 27 691



'delay_loop_2' - нет такой функции в delay.h. Есть '_delay_loop_2'
Go to the top of the page
 
+Quote Post
skef
сообщение Oct 11 2010, 09:49
Сообщение #39


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 29-10-09
Из: брежнев
Пользователь №: 53 292



Спасибо! Запустилось!

Сообщение отредактировал skef - Oct 11 2010, 10:33


--------------------
на любой элемент найдется мощность, которая его сожжет.
Go to the top of the page
 
+Quote Post
Allregia
сообщение Oct 17 2010, 13:08
Сообщение #40


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Подскажите пожалуйста - ИАР 5.50 "с таблэткой" работает с JTAFICE MkII ?
Взял с работы JTAG домой поработать, скачал с этого фтп ИАР, поставил (под ХР), драйвер на JTAG со второго пинка установился (сначала ему не понравился слишком длинный USB шнурок). В менеджере устройств Jungo и JTAG видны и "зелененькие".

Запускаю ИАР, компилирую проект, жму ^D и получаю "Failed to communicate with JTAGICE MkII".
На работе этот же JTAG с "честным" ИАРом прекрасно работает. Может таблэтка не до конца лечит?
Go to the top of the page
 
+Quote Post
Xenia
сообщение Oct 17 2010, 20:59
Сообщение #41


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Allregia @ Oct 17 2010, 17:08) *
На работе этот же JTAG с "честным" ИАРом прекрасно работает. Может таблэтка не до конца лечит?

А вы проверьте - возьмите с работы "честную" лицензию и предъявите ее в "IAR Systems License Manager". Если заработает, то виновата таблетка. Или на работе таким же способом скормите менеджеру таблеточный ключ и проверьте на работоспособность.
Я же с IAR через JTAFICE MkII не работаю, а потому ответить на вас вопрос не могу.
Go to the top of the page
 
+Quote Post
Allregia
сообщение Oct 17 2010, 21:57
Сообщение #42


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Отбой.
Оно и с AVRStudio не работало - винда девайс видела, но при попытке апгрейда фирмваре студия кричала "не могу соединиться".
Проблема оказалась в USB шнурке! Взял другой - и все заработало, и в Студии и в ИАРе.
Go to the top of the page
 
+Quote Post
Nikkolaj
сообщение Nov 16 2010, 06:33
Сообщение #43


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 25-09-08
Пользователь №: 40 467



Цитата(SasaVitebsk @ Oct 1 2010, 21:03) *
Забавно, кстати. Несмотря на то что объявил volatile, пока в тексте не используешь, всё равно выкидывает переменную. Хотя, если подумать это и правильно. Скорее всего просто регистры резервирует.




Спасибо за ответ.
Извините что не ответил сразу, не было возможности.
Go to the top of the page
 
+Quote Post
ALFAcaRUS
сообщение Jan 14 2011, 13:04
Сообщение #44





Группа: Новичок
Сообщений: 2
Регистрация: 14-01-11
Пользователь №: 62 229



Помогите пожалуйста. Пишу в 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


Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 14 2011, 13:19
Сообщение #45


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ALFAcaRUS
сообщение Jan 14 2011, 14:17
Сообщение #46





Группа: Новичок
Сообщений: 2
Регистрация: 14-01-11
Пользователь №: 62 229



суть в том чтоя уже откомпилировал до этого 2 или 3 программы используя этот Makefile
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 14 2011, 19:46
Сообщение #47


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ALFAcaRUS @ Jan 14 2011, 20:17) *
суть в том чтоя уже откомпилировал до этого 2 или 3 программы используя этот Makefile
Угадал все буквы и даже слова, а смысл прежложения не постиг.
Для каждой программы (вернее для каждого проекта) всегда пишут свой собственный Makefile (не будем вдаваться в подробности и рассматривать случай включения Makefile'ов).


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 14 2011, 20:55
Сообщение #48


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (ALFAcaRUS @ Jan 14 2011, 19:17) *
суть в том чтоя уже откомпилировал до этого 2 или 3 программы используя этот Makefile
А потом установили на комп какой-то компилятор имени борланда?
Вы можете убеждать меня или себя сколько угодно, но makefile для WinAVR написан под gnu make. Если вы не верите, что синтаксис Borland make и GNU make отличается - чем же мы можем помочь?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 14 2011, 21:24
Сообщение #49


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Сергей Борщ @ Jan 14 2011, 18:19) *
или снести борланда wink.gif

bb-offtopic.gif
Что я и сделал при первой же возможности (для этого dll-ки для дельфийской программы на mingw32-gcc переделал).


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 15 2011, 10:20
Сообщение #50


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Товарищ видимо не совсем понял, что make.exe есть и в каталоге Builder'a и в WinAVR. Хоть эти файлы и имеют одинаковое название, но по сути это две совершенно разные программы несовместимые друг с другом. И в path прописаны пути к им обоим, но путь к WinAVR имеет более низкий приоритет, т.к. инсталляция borlanda была позднее и добавила свои пути до путей WinAVR. Чтобы исправить ситуацию надо поместить пути WinAVR раньше buildera.
(наберите в справке windows "переменные среды окружения или системные переменные")


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
cyb
сообщение Oct 4 2011, 13:23
Сообщение #51


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 29-08-11
Из: Киев
Пользователь №: 66 910



Напишу здесь чтобы не создавать ещё одну тему.
Есть такая "хитрая" загвоздка с AVR Studio (версия 4.18). В общем работаю в IARe 5.51, а дебаг программный делаю в студии и всё всегда работало. Однако есть проект массивный, где такая связка не работает и не знаю почему. Вроде всё как всегда линковщик настроен на ubrof8, всё линкуется, открываю файл в студии .dbg, но он врубает десасемблер, а на С не хочет. Что только не делал, все настройки проверял не в какую. Тут же открываю другой проект, всё тоже самое и там работает.

П.С. Этот проект был перенесён со старой версии ИАРа 4.20, но в новом всё компилится, в общем должно быть всё норм по идее. У кого-нибудь такое было?

Сообщение отредактировал cyb - Oct 4 2011, 13:25
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 4 2011, 14:19
Сообщение #52


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (cyb @ Oct 4 2011, 16:23) *
открываю файл в студии .dbg, но он врубает десасемблер, а на С не хочет.
Посмотрите на вкладке Output компилятора, стоит ли галочка "Generate debug information".


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
defunct
сообщение Oct 4 2011, 21:15
Сообщение #53


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(demiurg_spb @ Jan 15 2011, 13:20) *
Чтобы исправить ситуацию надо поместить пути WinAVR раньше buildera.
(наберите в справке windows "переменные среды окружения или системные переменные")

Или, есть вариант проще:
переименовать каталог куда был установлен Borland в _Borland, на время работы с gnu make.
Go to the top of the page
 
+Quote Post
cyb
сообщение Oct 5 2011, 07:51
Сообщение #54


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 29-08-11
Из: Киев
Пользователь №: 66 910



Цитата(Сергей Борщ @ Oct 4 2011, 17:19) *
Посмотрите на вкладке Output компилятора, стоит ли галочка "Generate debug information".

Точно, сработало, спасибо за совет rolleyes.gif .
Go to the top of the page
 
+Quote Post
Smoky
сообщение May 23 2012, 16:27
Сообщение #55


Местный
***

Группа: Свой
Сообщений: 401
Регистрация: 7-05-10
Из: Оренбург
Пользователь №: 57 135



Не смог обнаружить в WinAVR функции или макросы преобразования двоичного кода в двоично-десятичный. Имеются ли в нём таковые, или кроме printf() ничего нет и нужно создавать свои?


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post
alexeyv
сообщение May 24 2012, 03:36
Сообщение #56


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Создай свои - не так уж и сложно.
Использование printf() - слишком уж тормозной и memory-потребляющий способ.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 24 2012, 06:07
Сообщение #57


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (alexeyv @ May 24 2012, 06:36) *
Использование printf() - слишком уж тормозной и memory-потребляющий способ.
С printf в avr-libc недавно разбирались - не слишком memory-потребляющий, около 20 байт на стеке. Неспешный, это да. А, еще по размеру кода может быть великоват.

дымок: В avr-libc есть функции ltoa(), itoa(), utoa, ultoa(). Вы можете вычесть из каждого символа результата по '0' и сложить полученные числа парами в тетрады. Или писать свою функцию - поддержка BCD-кода как-то не слишком распространена в языках программирования.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Smoky
сообщение May 24 2012, 16:14
Сообщение #58


Местный
***

Группа: Свой
Сообщений: 401
Регистрация: 7-05-10
Из: Оренбург
Пользователь №: 57 135




Спасибо. Я так и думал, что придётся делать самому.


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post
alexeyv
сообщение May 25 2012, 03:38
Сообщение #59


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Цитата
А, еще по размеру кода может быть великоват.

Я это и имел ввиду. Забыл уточнить тип памяти
Go to the top of the page
 
+Quote Post
ReAl
сообщение May 25 2012, 09:08
Сообщение #60


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Грубо от 1.5 до 2.5 килобайта в зависимости от версии форматтера (поддержка разных вариантов ширин полей и float).


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Smoky
сообщение May 31 2012, 16:33
Сообщение #61


Местный
***

Группа: Свой
Сообщений: 401
Регистрация: 7-05-10
Из: Оренбург
Пользователь №: 57 135



Коллеги, объясните что это за опрерация и применима ли она в WinAVR?
TWCR=((1<<TWEN)+(1<<TWINT)+(1<<TWSTO))


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 31 2012, 16:45
Сообщение #62


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(дымок @ May 31 2012, 19:33) *
Коллеги, объясните что это за опрерация и применима ли она в WinAVR?
TWCR=((1<<TWEN)+(1<<TWINT)+(1<<TWSTO))

Запись в TWCR байта с установленными (равными 1) битами TWEN, TWINT и TWSTO.
Чаще пишут TWCR=((1<<TWEN)|(1<<TWINT)|(1<<TWSTO)) . Но результат тот же.
Go to the top of the page
 
+Quote Post
Smoky
сообщение May 31 2012, 17:03
Сообщение #63


Местный
***

Группа: Свой
Сообщений: 401
Регистрация: 7-05-10
Из: Оренбург
Пользователь №: 57 135



Цитата(_Артём_ @ May 31 2012, 22:45) *
Запись в TWCR байта с установленными (равными 1) битами TWEN, TWINT и TWSTO.
Чаще пишут TWCR=((1<<TWEN)|(1<<TWINT)|(1<<TWSTO)) . Но результат тот же.


Спасибо. Меня смущает только то что в одной функции одновременно одна и таже операция записана по разному: так как привёл я и так как привели вы. Весьма странно.


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 31 2012, 17:57
Сообщение #64


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(дымок @ May 31 2012, 20:03) *
Спасибо. Меня смущает только то что в одной функции одновременно одна и таже операция записана по разному: так как привёл я и так как привели вы. Весьма странно.

Записать то можно по разному - всё равно это константа
Код
#define TWI_BYTE 0x94

TWCR=TWI_BYTE; // тот же результат


Код
22:           TWCR=((1<<TWEN)|(1<<TWINT)|(1<<TWSTO));
+00000070:   E984        LDI       R24,0x94       Load immediate
+00000071:   93800074    STS       0x0074,R24     Store direct to data space

Может почему-то автору так было удобней в тот момент.
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Jun 1 2012, 03:59
Сообщение #65


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Цитата
Может почему-то автору так было удобней в тот момент.

Ага,клавиша "+" располагается удобнее на клавиатуре, или клавишу "|" заело.
Go to the top of the page
 
+Quote Post
Smoky
сообщение Jun 6 2012, 17:15
Сообщение #66


Местный
***

Группа: Свой
Сообщений: 401
Регистрация: 7-05-10
Из: Оренбург
Пользователь №: 57 135



Помогите, не могу понять:
#define CH 0x07
temp=I2C_Rx(NOT_ACK);
if(temp&(1<<CH)) - что за операция здесь происходит?


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post
Marto
сообщение Jun 6 2012, 17:36
Сообщение #67


Частый гость
**

Группа: Свой
Сообщений: 103
Регистрация: 17-05-09
Из: Ижевск
Пользователь №: 49 190



Цитата(дымок @ Jun 6 2012, 23:15) *
Помогите, не могу понять:
#define CH 0x07
temp=I2C_Rx(NOT_ACK);
if(temp&(1<<CH)) - что за операция здесь происходит?


единичка сдвигается на семь битов (0x07) и поразрядно складывается с переменной temp.
Если седьмой бит переменной temp равен единице, то их побитовая (поразрядная) сумма будет больше нуля, а если значение в скобках if больше нуля, то выполнится соотвествующий код. в противном случае выполнение перейдет на else
1<<CH = 1<<0x07 = 10000000
допустим значение переменной temp = 11011100, тогда
11011100
& 10000000
____________
10000000

или temp = 01110000

01110000
&10000000
____________
00000000


--------------------
Шизоидный холерик
Go to the top of the page
 
+Quote Post
Smoky
сообщение Jun 7 2012, 16:39
Сообщение #68


Местный
***

Группа: Свой
Сообщений: 401
Регистрация: 7-05-10
Из: Оренбург
Пользователь №: 57 135



Цитата(Marto @ Jun 6 2012, 23:36) *
единичка сдвигается на семь битов (0x07) и поразрядно складывается с переменной temp.


Большое спасибо, теперь всё ясно. Я то думал что 0х07 сдвигается на один бит, получался полный ступор.


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post

5 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 06:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.02293 секунд с 7
ELECTRONIX ©2004-2016