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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Макросы в IAR EWAVR, v5.40.1
ivainc1789
сообщение Feb 8 2010, 06:54
Сообщение #1


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

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



В девайсах ATtiny иногда приходится сильно экономить память программ и использовать макросы. Поначалу все получалось и вдруг наступил затык. Три раза проект компилировался нормально, а с четвертого вдруг началась ругань на один из макросов. Причем его строки однотипны, а ругается только с четвертой. Подскажите в чем причина? Использую IAR EWAVR.
Прикрепленное изображение
Go to the top of the page
 
+Quote Post
Палыч
сообщение Feb 8 2010, 07:05
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(ivainc1789 @ Feb 8 2010, 09:54) *
Подскажите в чем причина?
Наверное, в том, что между условием после if и else допустим только один оператор.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 8 2010, 08:19
Сообщение #3


Гуру
******

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



Цитата(ivainc1789 @ Feb 8 2010, 10:54) *
В девайсах ATtiny иногда приходится сильно экономить память программ и использовать макросы.

Непонятно, как именно вообще макросы могут сэкономить память программ (или вообще какую-нибудь память). И как ваши конкретные макросы её экономят.

1) Макросы - сокращение от макроподстановки. Они могут сэкономить только текст программы. То есть облегчить её написание либо восприятие.
2) Текст программы на Си не то же самое, что результирующий код. Иными словами более короткий текст программы может скомпилироваться в более длинную программу или менее эффективную.
3) Насколько я вижу ваши макросы наоборот сильно расходуют, а не экономят память программ. Хотя - может так задумывалось. Я не уверен, понимаете ли вы разницу в выборе на момент компиляции и на момент исполнения? Дело в том,что независимо от аргумента ваша фича скомпилируется в кучу операторов. Другое дело, что компилятор может часть убрать на этапе оптимизации. Тем не менее можно с помощью тех же макросов сделать запись более наглядной и, препроцессор сгенерит лишь один оператор (или часть).

Ну например:
Код
#if ADC_REFS == REF_VCC
#define ADC_REF_USE (0<<REFS0)
#elif ADC_REFS == REF_EXT
#define ADC_REF_USE (1<<REFS0)
....
#endif

....
....

ADMUX = ADC_REF_USE | TekChanal; // скомпилируется в 2 команды ldi-out
Go to the top of the page
 
+Quote Post
ivainc1789
сообщение Feb 8 2010, 20:03
Сообщение #4


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

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



Цитата
Непонятно, как именно вообще макросы могут сэкономить память программ (или вообще какую-нибудь память). И как ваши конкретные макросы её экономят.
Очень просто. Можно написать макрос как подпрограмму. Например, подпрограмма выбора Vref в ADC на основе всех возможных сочетаний. Это займет значительный кусок кода. Но потом выяснится, что применяется данная программа только один раз для установки Vref = 1v1. Ясное дело, это неэффективно. Если такую задачу решать с помощью макроса, то экономия памяти налицо. Вот почему для многих установок ADC полезно все же писать макросы, но для установки мультиплексора, возможно, подпрограмму (это зависит уже от конкретики задачи)...
Цитата
Дело в том,что независимо от аргумента ваша фича скомпилируется в кучу операторов.
С чего бы это? Какая куча? Скомпилируется только то, что соотв. условию по аргументу...
А посути-то есть что сказать? Если есть желание попробовать, прилагаю код...
Прикрепленные файлы
Прикрепленный файл  macro.rar ( 417 байт ) Кол-во скачиваний: 33
 
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 8 2010, 20:26
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(ivainc1789 @ Feb 8 2010, 23:03) *
А посути-то есть что сказать?

1) По сути... где фигурные скобки?!
2) Еще раз по сути ... ИАР имеет очень удобную фичу отладки макросов, которая заключается в выводе в файл текста после препроцессора.
3) И третий раз по сути ... Ваши общие рассуждения о расходе памяти программ в случае оформления фрагмента кода как подпрограммы без оговорок о оптимизации и "инлайнирование" неверны. Программист может (и, пожалуй, обязан) написать так, что в любом случае память программ будет расходоваться одинаково экономно.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
ivainc1789
сообщение Feb 8 2010, 21:21
Сообщение #6


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

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



Цитата(Dog Pawlowa @ Feb 8 2010, 23:26) *
1) По сути... где фигурные скобки?!
2) Еще раз по сути ... ИАР имеет очень удобную фичу отладки макросов, которая заключается в выводе в файл текста после препроцессора.
3) И третий раз по сути ... Ваши общие рассуждения о расходе памяти программ в случае оформления фрагмента кода как подпрограммы без оговорок о оптимизации и "инлайнирование" неверны. Программист может (и, пожалуй, обязан) написать так, что в любом случае память программ будет расходоваться одинаково экономно.
По всем трем пунктам большое спасибо. Писал все это под утро, уж на автопилоте. Только это что-то мало помогло. Решил упростить все до безобразия и вот... Что же еще упускаю?
Прикрепленное изображение


2) если вы про пояснения в листинге, то там то же, что и в окне Build
Цитата
3) Программист может (и, пожалуй, обязан) написать так
То есть вы считаете, что программист заранее ОБЯЗАН знать, что лучше применить макросы или подпрограммы? По-моему, это не так тривиально и возможно только когда окончательно устаканится код... Лично меня как-то все время больше "тянет" на подпрограммы и уже позже, начинаю замечать, что вызовов не так много и возможно макросы отработают лучше...
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 8 2010, 21:21
Сообщение #7


;
******

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



Пример, заменяющий первую половину использованной Вами ахинеи, место которой вот здесь
Код
#define ADC_REF_VCC 1
#define ADC_REF_EXT  0
#define ADC_REF_1V1  3
#define ADC_REF_2V56 2
#define SET_ADC_CHANNEL(refn, chsel) ADMUX = (refn << REFS0) | (chsel)

Вопрос, а нафига оно нужно, плодить новояз, добавляющий еще один уровень понятий между терминами, определенными производителем микросхем и человеком, читающим текст программы, задавать не буду.
Лучше о хорошем поговорим. Например
Код
#define ADPS_DIV2 1

ни о чем не говорит, а вот с привязкой к F_CPU
Код
#define ADPS_dv(val) ((val >= (F_CPU / 250000)) && (val <= (F_CPU / 50000)))
#if ADPS_dv(2)
#define STD_ADPS 1
#elif ADPS_dv(4)
#define STD_ADPS 2
#elif ADPS_dv(8)
#define STD_ADPS 3
#endif

получаем некоторую свободу от пересчета делителя.
Такие дела.
Go to the top of the page
 
+Quote Post
ivainc1789
сообщение Feb 8 2010, 21:44
Сообщение #8


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

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



Цитата(_Pasha @ Feb 9 2010, 00:21) *
Пример, заменяющий первую половину использованной Вами ахинеи....
Дело не в том, как написано, а в том, что синтаксису это удовлетворяет (теперь), а компилятор выдает ошибку. То, что Вы и прочие специалисты можете написать проще и нагляднее мне совершенно понятно. Могу и я написать. Но почему не работает то, что вроде бы должно?
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 8 2010, 22:14
Сообщение #9


;
******

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



Цитата(ivainc1789 @ Feb 9 2010, 00:44) *
Но почему не работает то, что вроде бы должно?

Потому что перед отмеченной красным строкой символ "\" не является последним в строке.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 9 2010, 01:54
Сообщение #10


Гуру
******

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



Цитата(ivainc1789 @ Feb 9 2010, 01:44) *
То, что Вы и прочие специалисты можете написать проще и нагляднее мне совершенно понятно. Могу и я написать.

Да дело не в простоте и наглядности. И не в красоте. Это все вещи субъективные.

Давайте проведите простой эксперимент. Поставьте свой макрос и выключите оптимизацию. После чего - листинг выложите постом ниже. Вот и будет простой и объективный ответ вам.

Пост ведь называется "макросы". Далее вы указываете "что применяется данная программа только один раз для установки Vref = 1v1". Значит задачу я понимаю правильно. Сами указываете, что "с целью экономии кода".
Подытоживая всё это, как я понимаю надо средствами препроцессора сделать текст проги красивым и наглядным, но, как минимум не в ущерб памяти программ. Сами вы ставите более серьёзную задачу - сэкономить.

На самом деле я вижу, что препроцессор здесь проходит лётом и вся ваша конструкция - достаётся компилятору. Компилятор учитывая что значение условия - есть константа, конечно должен соптимизировать, но простите, вы не упрощаете ему работу, а усложняете.
Именно об этом я и указал.

Проверьте сами и выложите здесь. А то ветка для начинающих, и кто-нибудь из таковых, не разобравшись, вооружится вашими макросами. Да ещё вставит их в CV. А тот уже ему наэкономит будь здоров.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 9 2010, 09:33
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(ivainc1789 @ Feb 9 2010, 01:21) *
То есть вы считаете, что программист заранее ОБЯЗАН знать, что лучше применить макросы или подпрограммы?

Ну нет же! Вы воюете с ветряными мельницами, выискивая несуществующую разницу.
Про pragma inline=forced Вы слышали? Она позволяет сделать так, что содержимое функции будет вставлено в текст программы. Потом, после оптимизации Вы получите код, идентичный написанному с использованием макросов.
Все одно, разница только в синтаксисе.
У Вас SETBIT() - это макрос, а у меня SetPin() - это функция, а компилируются они одинаково.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 9 2010, 10:27
Сообщение #12


Гуру
******

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



+1.
Не считаю себя профессионалом в данном вопросе, но также хочу отметить один вопрос. Сам его где-то прочитал на форуме - осмыслил - оценил - и теперь стараюсь неукоснительно следовать. Не то чтобы вам советую, просто отмечаю.
Все макроопределения в программе пишу большими буквами. А ф-ции и переменные малыми или смешанными. Это позволяет сразу понять - что есть ф-ция, а что макрос. Для меня - очень удобно.
Go to the top of the page
 
+Quote Post
ivainc1789
сообщение Feb 9 2010, 15:23
Сообщение #13


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

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



Цитата(_Pasha @ Feb 9 2010, 01:14) *
Потому что перед отмеченной красным строкой символ "\" не является последним в строке.
Извините, но не поленился сделать простой проект в IAR. Могу я покорнейше узнать, почему эта ошибка все еще присутствует? У вас компилируется нормально или с той же ошибкой?
Цитата
...выискивая несуществующую разницу. Про pragma inline=forced Вы слышали? У Вас SETBIT() - это макрос, а у меня SetPin() - это функция, а компилируются они одинаково...
Хорошо. Спрошу проще: вы оформили SetPin() как функцию сознательно по каким-либо существенным мотивам или "просто так сложилось"? Т. е. для вас есть существенная разница как написать данную функцию для девайса со всего лишь 4к флеша? Вот что в хелпе нашел:
Цитата
The compiler is capable of inlining functions. This means that instead of calling a
function, the compiler inserts the content of the function at the location where the
function was called. The result is a faster, but often larger, application. Also,
inlining may enable further optimizations. The compiler often inlines small
functions declared static. The use of the #pragma inline directive and the C++
keyword inline gives you fine-grained control, and it is the preferred method
compared to the traditional way of using preprocessor macros.
This feature can be
disabled using the --no_inline command line option.

Но инлайнить нужно не всегда. И, тем более, когда "...это компилер решает...". Т.е. управлять этой прагмой все равно должен пользователь и встает вопрос - не проще ли макрос написать? Почему "gives you fine-grained control" пока не догоняю...
Я не спец по С, прошу уж сильно то не пинать )))), учитывая название раздела для данной темы....
Прикрепленное изображение

Прикрепленные файлы
Прикрепленный файл  proj.rar ( 6.38 килобайт ) Кол-во скачиваний: 14
 
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 9 2010, 15:38
Сообщение #14


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(ivainc1789 @ Feb 9 2010, 20:23) *
Извините, но не поленился сделать простой проект в IAR. Могу я покорнейше узнать, почему эта ошибка все еще присутствует?

Потому что
Цитата(_Pasha @ Feb 9 2010, 03:14) *
Потому что перед отмеченной красным строкой символ "\" не является последним в строке.


Уберите пробел в конце строки
Код
  if (Value == 4)   ADCSRA &= 0x07;else\


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ivainc1789
сообщение Feb 9 2010, 16:32
Сообщение #15


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

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



Цитата(AHTOXA @ Feb 9 2010, 18:38) *
Уберите пробел в конце строки
Ок, спасибо! Была установлена опция в IAR IDE Tools/Options/Editor/Enable virtual space, т. е. курсор можно было поставить в любое место строки... а я как-то сразу и не сообразил ))) ...
Go to the top of the page
 
+Quote Post

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

 


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


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