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

 
 
> Макросы в 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
 
Start new topic
Ответов
_Pasha
сообщение Feb 8 2010, 21:21
Сообщение #2


;
******

Группа: Участник
Сообщений: 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
Сообщение #3


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

Группа: Свой
Сообщений: 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
Сообщение #4


;
******

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



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

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


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

Группа: Свой
Сообщений: 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
Dog Pawlowa
сообщение Feb 9 2010, 20:54
Сообщение #6


Гуру
******

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



Цитата(ivainc1789 @ Feb 9 2010, 19:23) *
вы оформили SetPin() как функцию сознательно по каким-либо существенным мотивам или "просто так сложилось"?
Т. е. для вас есть существенная разница как написать данную функцию для девайса со всего лишь 4к флеша? ...
не проще ли макрос написать?


1) У меня система описания портов посложнее. Поскольку на одной плате реализовано несколько разноплановых проектов, я поставил задачу определять порты в отдельном файле в виде:
Код
  OUTPUT  (   PulseWdt        ,   A  , 0x01    )
  OUTPUT  (   Backlight       ,   A  , 0x02    )
  OUTPUT  (   EmptyError    ,   A  , 0x04    )
  INPUT    (   SdaIn           ,   B  , 0x01    )

и в общем то решил эту задачу с помощью функций. С макросами как-то не получалось. Не помню уже, почему.

2) если что макрос, что функция занимают одинаково места, то при чем тут размер памяти? Да, без оптимизации моя программа не поместится в память, но я никогда не компилирую без оптимизации. Компилятору нужно доверять.

3) Может и проще, но не такие, как у Вас smile.gif
Писал я подобные макросы. Основной их недостаток - плохая читаемость. А будете работать с тремя-четырьмя семействами контроллеров одновременно, крыша съедет. Мое мнение такое - или макросы должны быть простейшие, или уж система макросов должна надежно поддерживать логичную структуру описания объектов.
От проекта к проекту я так и делаю то одно, то другое, не используя Ваши промежуточные подходы, когда нужно помнить всю эту логику "макросизации".

Эта тема обсуждалась на форуме пару раз, может есть смысл поискать.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ivainc1789   Макросы в IAR EWAVR   Feb 8 2010, 06:54
- - Палыч   Цитата(ivainc1789 @ Feb 8 2010, 09:54) По...   Feb 8 2010, 07:05
- - SasaVitebsk   Цитата(ivainc1789 @ Feb 8 2010, 10:54) В ...   Feb 8 2010, 08:19
- - ivainc1789   ЦитатаНепонятно, как именно вообще макросы могут с...   Feb 8 2010, 20:03
|- - Dog Pawlowa   Цитата(ivainc1789 @ Feb 8 2010, 23:03) А ...   Feb 8 2010, 20:26
|- - ivainc1789   Цитата(Dog Pawlowa @ Feb 8 2010, 23:26) 1...   Feb 8 2010, 21:21
|- - Dog Pawlowa   Цитата(ivainc1789 @ Feb 9 2010, 01:21) То...   Feb 9 2010, 09:33
||- - AHTOXA   Цитата(ivainc1789 @ Feb 9 2010, 20:23) Из...   Feb 9 2010, 15:38
|||- - ivainc1789   Цитата(AHTOXA @ Feb 9 2010, 18:38) Уберит...   Feb 9 2010, 16:32
|- - SasaVitebsk   Цитата(ivainc1789 @ Feb 9 2010, 01:44) То...   Feb 9 2010, 01:54
- - SasaVitebsk   +1. Не считаю себя профессионалом в данном вопросе...   Feb 9 2010, 10:27
- - rezident   На последнем скриншоте из сообщения #13 в макросах...   Feb 9 2010, 17:26
- - ivainc1789   Цитата(rezident @ Feb 9 2010, 20:26) На п...   Feb 9 2010, 19:09
- - rezident   Цитата(ivainc1789 @ Feb 10 2010, 00:09) И...   Feb 9 2010, 20:50


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 22:55
Рейтинг@Mail.ru


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