|
|
  |
Порты AVR и компиляция |
|
|
|
Oct 1 2007, 05:17
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата EEMEM, PROGMEM я типами данных просто не считаю. Это, по моему мнению, просто те расширения компилятора которые позволяют отводить/инициализировать область в eeprom/flash. + взятие адреса для выяснения куда писать. Потому и руками допиливаются обычные функции и из них появляются особенные - так кроме int printf(const char *__fmt, ...); имеем int printf_P(const char *__fmt, ...); ЗЫ. Я пробую каждую свежую версию WinAVR и могу заметить, что семимильными шагами движется он в сторону IAR. Проекты под портируемость сразу протачиваем. Но пока это "утомительное застирывание".
--------------------
aka Vit
|
|
|
|
|
Oct 1 2007, 10:38
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
to Сергей БорщПодскажите, а зачем нужна обвязка из do/while? Код #define _clrL(port,bit) do { port |= (1 << bit); } while(0) Почему не так? Код #define _clrL(port,bit) port |= (1 << bit)
|
|
|
|
|
Oct 1 2007, 11:16
|

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

|
Цитата(Непомнящий Евгений @ Oct 1 2007, 13:38)  to Сергей БорщПодскажите, а зачем нужна обвязка из do/while? Код #define _clrL(port,bit) do { port |= (1 << bit); } while(0) Почему не так? Код #define _clrL(port,bit) port |= (1 << bit) В данном конкретном случае она не нужна. Сила привычки. Началось с того, что увидел такую обвязку в исходниках линукса и задал такой же вопрос в ru.embedded. ReAl мне там ответил, что если внутри макроса будет более одной команды, то их придется заключать в {} чтобы такой макрос можно было использовать как единое выражение в циклах или в конструкциях if(условие) macros(); И все будет работать до тех пор, пока не появится желание сделать if(условие) macros(); else something; - получим ошибку компиляции. Обрамление же в do {}while(0) позволяет использовать такой макрос в любом месте, где допустим вызов обычной функции и не несет никаких дополнительных накладных расходов - сам цикл выбрасывается оптимизатором, остается только его тело. Ну а здесь я их обрамил по привычке, на случай если вдруг придется добавить внутрь еще одно или несколько выражений. Кончно, если пользоваться только С++, то можно реализовать то же самое при помощи static inline функций, но пропадет универсальность в виде совместимости с С.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 1 2007, 11:55
|
Частый гость
 
Группа: Участник
Сообщений: 99
Регистрация: 22-03-07
Из: Novosibirsk
Пользователь №: 26 415

|
Цитата(Сергей Борщ @ Sep 30 2007, 05:09)  on(LED); off(FLASH_CS); if(signal(KEY)) - тоже абсолютно портируемо на любой С-компилятор. И сгенеренный код будет идентичен тому, который надо написать вручную для xxx_on(); xxx_off(); Действительно удобное решение.
|
|
|
|
|
Oct 2 2007, 11:39
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(Rst7 @ Oct 2 2007, 09:42)  Ээээ... А с Вашей? Я оцениваю это положительно. Сам до такого не додумался. А мне кстати бы не помешало такое решение. И вообще - всё что сделано - остаётся на годы. Тут вообще, на мой взгляд бессмыслено оценивать. Раз Вы сделали - значит Вам это понадобилось и для Вас это оказалось удобным. Соответственно моя оценка или оценка другим человеком Вашего труда - будет весьма субъективной. Я считаю, что фактически, это разработка какой-то базы под себя. И это позволит Вам следующий раз сделать проект быстрее. Соответственно это очень положительное качество. С годами Вы, возможно, переработаете детали и вылижите что-то. Или вообще что-то измените, но наверняка наработанные знания и опыт останутся с Вами навсегда.
|
|
|
|
|
Oct 2 2007, 11:57
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата(SasaVitebsk @ Oct 2 2007, 14:39)  Я оцениваю это положительно. Сам до такого не додумался. А мне кстати бы не помешало такое решение. А вообще, жалко, что нет штатных средств компилятора для создания таких адресных пространств под собственные нужды. Иногда очень бы упростило код и добавило бы красоты. Через епром - это конечно костыль, однако, с другой стороны, достаточно легко переносимый на другие платформы. В принципе была еще одна идея, но это уже злой хак  Как известно, ИАР умеет компилировать для моделей памяти с озу >64К. Была идея патчить кодегенератор, дабы он делал не OUT в RAMP?, а out в нужный порт. В результате, можно было бы увеличивать объем озу просто навесив дополнительные адреса на какой-либо порт и не думая о том, как выполнить этот маппинг програмно, все бы на себя взял компилятор. Правда, идея до реализации не дошла (уже не помню почему, кажется, отпала надобность).
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Oct 2 2007, 14:18
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата Была идея патчить кодегенератор, дабы он делал не OUT в RAMP?, а out в нужный порт. Пытался. Используются несуществующие регистры RAMPx. Проблема (сомневаюсь, что показалось) нерешаема.
--------------------
aka Vit
|
|
|
|
|
Oct 2 2007, 18:06
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Rst7 @ Oct 1 2007, 17:41)  Кстати, между прочим, переделав eeprom.s90 например на работу с 24xxx получаем удобный инструмент хранения переменных во внешней епромке. Кстати, структуры там тоже отлично хранятся... и массивы... Rst7, А как Вы считаете, встраивание возможности чтения EEPROM перед ее записью(или не записью, если там ничего не изменилось) в свой код(или библиотеку) является правильным/нужным (для увеличения ресурса EEPROM) ? Время от времени на электрониксе возникают темы типа: Как сохранить текущую конфигурацию прибора при пропадании питания. Обычно(чаше всего) обсуждение ведется в русле того, что нужно аппаратными средствами обеспечить работу контроллера еще какое-то время для того, чтобы успеть записать эту самую конфигурацию. Может все-таки стоит в подобных ситуациях озаботиться возможностью "ВСЕГДА" иметь правильную конфигурацию в EEPROM ? Правда для этого(часто) придется написать свой код общения с EEPROM.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|