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

 
 
> Порты AVR и компиляция
allexmor
сообщение Sep 26 2007, 15:26
Сообщение #1





Группа: Участник
Сообщений: 12
Регистрация: 19-05-07
Пользователь №: 27 828



Очень долго работал с разными МК(51, в основном ARM) решил попробовать AVR вопросы:
У этих AVR что нет удобного побитового доступа к портам?
Какой компилятор делает наиболее красивый код?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Sep 27 2007, 20:02
Сообщение #2


Гуру
******

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



Есть ещё один момент для WinAvr. Только за последних пару лет его пересобирали раз десять. Регулярно что-то меняли в том числе координальное. Так что насчёт совместимости и большого количества проектов это не вся правда. Править придётся. То там то тут выскакивают сообщения - пересобрал - неработает. Работать с ним отнюдь не легче чем с IARом. Хотя и IAR к числу лёгких в освоении пакетов не относится. Документация разбросана по всему интернету. Никакой упорядоченности. Что-то надо - полез искать. Чаще всего если и найдёшь, то в каком нибудь FAQе.

Короче очень геморойная вещь. Ясно что если освоил, то тогда нормально.

Выпад по поводу данных в EEPROM и FLASH - явно бредовый. Удобная вещь - она всегда удобная.

Зачем мне для обращения к Flash переменной обращаться ч/з подпрограмму? А если у меня в одной формуле/операторе используются переменные Flash и RAM? Например знакогенератор в видеоозу вывожу. IAR отличный код генерит и прекрасно оптимизирует такие места. А чтобы по ошибке не использовать переменные EEPROM, выход простой. defunct его фактически указал. Обзавите переменную eeMyInt. И всё для вас будет ясно.

Это просто яркий пример как можно всё с ног на голову поставить.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 28 2007, 22:37
Сообщение #3


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(SasaVitebsk @ Sep 28 2007, 00:02) *
Выпад по поводу данных в EEPROM и FLASH - явно бредовый. Удобная вещь - она всегда удобная.

Зачем мне для обращения к Flash переменной обращаться ч/з подпрограмму?

Это просто яркий пример как можно всё с ног на голову поставить.
Давайте посмотрим, на Вашем любимом IAR:
Код
#include <string.h>

__eeprom char eeString[]="Prived !";
char String[10]="ABCDEFGHIJ";

int main(void)
{
  memcpy(String,  (void const *)eeString, 10);
  memcpy((void *)eeString, String, 10);
  return 0;
}

Скомпилируйте этот код и пройдитесь по нему отладчиком,
я думаю что результат Вас сильно порадует, особенно второй memcpy biggrin.gif

P.S Тока не нужно мне рассказывать что этот пример высосан из пальца...
Прямое преобразование типов конечно вставлено специально,
тока где и когда Вы наткнетесь на такой результат в реальной программе будете знать
тока Вы и Ваш доктор в дурке (после отладки такого кода) smile.gif
Go to the top of the page
 
+Quote Post
defunct
сообщение Sep 29 2007, 11:54
Сообщение #4


кекс
******

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



Цитата(singlskv @ Sep 29 2007, 01:37) *
P.S Тока не нужно мне рассказывать что этот пример высосан из пальца...
Прямое преобразование типов конечно вставлено специально,
тока где и когда Вы наткнетесь на такой результат в реальной программе будете знать
тока Вы и Ваш доктор в дурке (после отладки такого кода) smile.gif

Ок, аналогичный пример:
Код
char Str[]="Hello";
char SomeChar;
int main(void)
{
     memcpy( (void *)SomeChar, Str, sizeof(Str));
}

Проблема здесь та же самая что и в вашем примере, и даже без переменных в eeprom.
Поэтому можете также вместе с доктором ковырять и этот код. Ибо когда нет понимания, что происходит в программе и что может происходить - забудьте про (void *).
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 29 2007, 17:21
Сообщение #5


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(defunct @ Sep 29 2007, 15:54) *
Ок, аналогичный пример:
Код
....................

Проблема здесь та же самая что и в вашем примере, и даже без переменных в eeprom.
Ну все таки не совсем одно и тоже, я свой пример показал только с точки зрения
потенциально проблемной части в использовании __eeprom, а в вашем примере просто
нарисован баг который из-за преобразования типов не смог поймать компилятор.

Насколько я знаю, в стандарте С вобще нет такого типа void __eeprom * smile.gif

А вот теперь представьте себе:
Код
__eeprom char eeString[]="Prived !";
char String[10]="ABCDEFGHI";
int Int=1;
long Long=2;

typedef struct
{
    void *ptr;
    int  size;
} SomeData;

SomeData* MassivHrenZnaetSKakimiDannimy[10];
......................
  {
    MassivHrenZnaetSKakimiDannimy[0].ptr = eeString;
    MassivHrenZnaetSKakimiDannimy[0].size = sizeof(eeString);
    MassivHrenZnaetSKakimiDannimy[1].ptr = String;
    MassivHrenZnaetSKakimiDannimy[1].size = sizeof(String);
    MassivHrenZnaetSKakimiDannimy[2].ptr = &Int;
    MassivHrenZnaetSKakimiDannimy[2].size = sizeof(Int);
    MassivHrenZnaetSKakimiDannimy[3].ptr = &Long;
    MassivHrenZnaetSKakimiDannimy[3].size = sizeof(Long);
.............................
.............................
.............................
    memcpy(KudatoTam,  MassivHrenZnaetSKakimiDannimy[x].ptr, MassivHrenZnaetSKakimiDannimy[x].size);
..........................
..........................
  }

Хрен знает какие данные оказались не совсем хрен знает какими, а все по тому что
кое кто придумал свой новый тип данных... __eeprom xxx
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 29 2007, 22:09
Сообщение #6


Гуру
******

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



Цитата(singlskv @ Sep 29 2007, 20:21) *
Насколько я знаю, в стандарте С вобще нет такого типа void __eeprom * smile.gif
Мы не обсуждали портируемость. В других компиляторах нет eeprom_write_byte();, а в некоторых процессорах нет eeprom wink.gif
Цитата(singlskv @ Sep 29 2007, 20:21) *
А вот теперь представьте себе:
Код
    MassivHrenZnaetSKakimiDannimy[0].ptr = eeString;
Получаем ошибку компилятора о несоответствии типов. Ту самую, которую в предыдущем примере вы задавили явным приведением к (void *). Ту самую, которую вы получите в WinAVR, если попытаетесь присвоть (void *) переменную типа (void EEMEM *) или prog_void.
Цитата(singlskv @ Sep 29 2007, 21:42) *
Где в этой проге можно написать cfg_EE = cfg_RAM ?
Не поверите - именно там, где надо сохранить данные. Компилятор подставит для каждого байта вызов __eeput8_16, в котором именно там, где это необходимо будет запрет/разрешение прерываний. Поверьте, код будет практически идентичен eeprom_write_byte(), за которую вы агитируете. Для очень редких случаев есть вариант *((uint8_t *)&cfg_EE.Config.ParamA)[2] = byte; Что касается ресурса eeprom, то я не случайно взял конфиг - как наиболее общий случай, когда ресурса хватит даже самому пытливому пользователю. И не пытайтесь меня убедить, что я должен потратить лишнее время чтобы экономить ресурс там, где его и так с запасом - это все равно что агитировать писать на асме (со всеми вытекающими недостатками), чтобы втиснуть програму в 2к памяти при 8к на борту. Если же есть какие-либо специальные требования (ресурс, необходимость отслеживать окончание по прерыванию) - думать головой никто не отменял.

Цитата(SergeiCh @ Sep 29 2007, 10:05) *
Но лучше (надеюсь, грамотные люди со мной согласятся) для конкретной задачи шевеления ногой писать макросы или online функции типа led_busy_on(), led_busy_off() и в коде использовать уже их. led_busy = 1, IMHO, хуже, разве что led_busy = ON smile.gif ...
Почти согласен. Но писать для каждой ноги xxx_on(), xxx_off() - да, конечно так и делал раньше. Но теперь - on(LED); off(FLASH_CS); if(signal(KEY)) - тоже абсолютно портируемо на любой С-компилятор. И сгенеренный код будет идентичен тому, который надо написать вручную для xxx_on(); xxx_off();


--------------------
На любой вопрос даю любой ответ
"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
Непомнящий Евген...
сообщение Oct 1 2007, 10:38
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 1 2007, 11:16
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
defunct
сообщение Oct 1 2007, 11:36
Сообщение #9


кекс
******

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



Цитата(Сергей Борщ @ Oct 1 2007, 14:16) *
Конечно, если пользоваться только С++, то можно реализовать то же самое при помощи static inline функций, но пропадет универсальность в виде совместимости с С.

Подробнее можно? Почему пропадет совместимость, если в C тоже допускаются static inline функции.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- allexmor   Порты AVR и компиляция   Sep 26 2007, 15:26
- - defunct   Цитата(allexmor @ Sep 26 2007, 18:26) У э...   Sep 26 2007, 16:01
- - Marian   Цитата(allexmor @ Sep 26 2007, 18:26) Оче...   Sep 26 2007, 16:38
|- - kv_addr   Цитата(Marian @ Sep 26 2007, 19:38) CVAVR...   Sep 27 2007, 20:15
- - sensor_ua   Цитататакого гонива как потребность применять 2 ко...   Sep 26 2007, 16:48
|- - defunct   Цитата(sensor_ua @ Sep 26 2007, 19:48) Wr...   Sep 26 2007, 22:19
|- - allexmor   Цитата(defunct @ Sep 27 2007, 02:19) Ну.....   Sep 27 2007, 04:51
- - bodja74   Зато сразу IOPIN=0x5555AAAA;   Sep 26 2007, 17:32
- - sensor_ua   Фаворит IAR. WinAVR вполне юзабилен, но когда нужн...   Sep 27 2007, 05:04
|- - allexmor   Цитата(sensor_ua @ Sep 27 2007, 09:04) Фа...   Sep 27 2007, 05:08
|- - alexander55   Цитата(allexmor @ Sep 27 2007, 09:08) Где...   Sep 27 2007, 05:49
- - mdmitry   WinAvr(gcc)+Eclipse - хорошая бесплатная связка дл...   Sep 27 2007, 06:27
|- - IJAR   IMHO: После IAR другие компиляторы даже пробовать...   Sep 27 2007, 06:51
|- - defunct   Цитата(IJAR @ Sep 27 2007, 09:51) IMHO: ...   Sep 27 2007, 08:56
|- - Qwertty   Цитата(defunct @ Sep 27 2007, 12:56) Ну п...   Sep 27 2007, 12:58
|- - defunct   Цитата(Qwertty @ Sep 27 2007, 15:58) Ну д...   Sep 27 2007, 13:10
||- - singlskv   Цитата(defunct @ Sep 27 2007, 17:10) Вы х...   Sep 27 2007, 14:48
|||- - defunct   Цитата(singlskv @ Sep 27 2007, 17:48) А к...   Sep 27 2007, 15:14
|||- - singlskv   Цитата(defunct @ Sep 27 2007, 19:14) Отли...   Sep 27 2007, 15:27
|||- - defunct   Цитата(singlskv @ Sep 27 2007, 18:27) eeC...   Sep 27 2007, 15:33
|||- - singlskv   Цитата(defunct @ Sep 27 2007, 19:33) Это ...   Sep 27 2007, 16:32
||- - Qwertty   Цитата(defunct @ Sep 27 2007, 17:10) Вы х...   Sep 27 2007, 16:23
|- - Сергей Борщ   Цитата(Qwertty @ Sep 27 2007, 15:58) Ну д...   Sep 27 2007, 14:23
|- - Qwertty   Цитата(Сергей Борщ @ Sep 27 2007, 18:23) ...   Sep 27 2007, 16:36
|- - singlskv   Цитата(Qwertty @ Sep 27 2007, 20:36) Знач...   Sep 27 2007, 17:49
|- - Сергей Борщ   Цитата(Qwertty @ Sep 27 2007, 19:36) Ну-н...   Sep 28 2007, 08:27
|- - Marian   Цитата(Сергей Борщ @ Sep 28 2007, 11:27) ...   Sep 28 2007, 15:16
- - GDI   В CodeVision можно сделать несколько файлов в прое...   Sep 27 2007, 09:09
||- - defunct   Цитата(singlskv @ Sep 29 2007, 20:21) Ну ...   Sep 29 2007, 19:47
|||- - singlskv   Цитата(defunct @ Sep 29 2007, 23:47) Да и...   Sep 29 2007, 20:15
|||- - defunct   Цитата(singlskv @ Sep 29 2007, 23:15) e=k...   Sep 29 2007, 20:20
|||- - singlskv   Цитата(defunct @ Sep 30 2007, 00:20) Ну и...   Sep 29 2007, 20:30
|||- - defunct   Цитата(singlskv @ Sep 29 2007, 23:30) [i]...   Sep 29 2007, 20:40
|||- - singlskv   Цитата(defunct @ Sep 30 2007, 00:40) Для ...   Sep 29 2007, 20:58
||- - singlskv   Цитата(Сергей Борщ @ Sep 30 2007, 01:57) ...   Sep 29 2007, 22:36
|||- - defunct   Цитата(singlskv @ Sep 30 2007, 01:36) Упс...   Sep 29 2007, 23:56
||||- - singlskv   Цитата(defunct @ Sep 30 2007, 03:56) Если...   Sep 30 2007, 18:32
||||- - SasaVitebsk   Цитата(singlskv @ Sep 30 2007, 21:32) Вос...   Sep 30 2007, 19:17
||||- - Сергей Борщ   Цитата(singlskv @ Sep 30 2007, 21:32) А ...   Sep 30 2007, 19:30
||||- - singlskv   Цитата(Сергей Борщ @ Sep 30 2007, 23:30) ...   Sep 30 2007, 20:04
|||- - Сергей Борщ   Цитата(singlskv @ Sep 30 2007, 01:36) а е...   Sep 30 2007, 07:59
|||- - Qwertty   Цитата(Сергей Борщ @ Sep 30 2007, 11:59) ...   Sep 30 2007, 12:13
|||- - Proton   Цитата(Qwertty @ Sep 30 2007, 19:13) Но в...   Sep 30 2007, 12:42
||- - Dog Pawlowa   Цитата(Сергей Борщ @ Sep 30 2007, 01:09) ...   Sep 30 2007, 18:38
|||- - singlskv   Цитата(Dog Pawlowa @ Sep 30 2007, 22:38) ...   Sep 30 2007, 18:44
||||- - Dog Pawlowa   Цитата(singlskv @ Sep 30 2007, 21:44) Вы ...   Oct 1 2007, 11:56
|||- - defunct   Цитата(Dog Pawlowa @ Sep 30 2007, 21:38) ...   Sep 30 2007, 22:44
|||- - Сергей Борщ   Цитата(defunct @ Oct 1 2007, 14:36) Подро...   Oct 1 2007, 11:51
||- - SergeiCh   Цитата(Сергей Борщ @ Sep 30 2007, 05:09) ...   Oct 1 2007, 11:55
|- - Сергей Борщ   Цитата(singlskv @ Sep 29 2007, 01:37) Пря...   Sep 29 2007, 12:46
|- - singlskv   Цитата(Сергей Борщ @ Sep 29 2007, 16:46) ...   Sep 29 2007, 18:42
- - mdmitry   Увы! Началась религиозная война! По поводу...   Sep 27 2007, 20:51
- - SasaVitebsk   Преимущества они и в Африке преимущества. Вы пре...   Sep 28 2007, 23:06
|- - SergeiCh   Если хочется писать PORTB_0 = 1, это можно сделать...   Sep 29 2007, 07:05
- - sensor_ua   ЦитатаIAR дает нам простой инструмент доступа Заме...   Sep 29 2007, 19:56
- - sensor_ua   ЦитатаГде в этой проге можно написать cfg_EE = cfg...   Sep 29 2007, 21:05
|- - singlskv   Цитата(sensor_ua @ Sep 30 2007, 01:05) та...   Sep 29 2007, 21:26
- - sensor_ua   ЦитатаЯ НЕ пользуюсь ни IARовским ни каким другим ...   Sep 29 2007, 23:01
- - sensor_ua   ЦитатаEEMEM, PROGMEM я типами данных просто не счи...   Oct 1 2007, 05:17
- - Rst7   Кстати, между прочим, переделав eeprom.s90 наприме...   Oct 1 2007, 13:41
|- - SasaVitebsk   Цитата(Rst7 @ Oct 1 2007, 16:41) Кстати, ...   Oct 1 2007, 18:04
||- - Rst7   Цитата(SasaVitebsk @ Oct 1 2007, 21:04) ...   Oct 2 2007, 06:42
||- - SasaVitebsk   Цитата(Rst7 @ Oct 2 2007, 09:42) Ээээ... ...   Oct 2 2007, 11:39
||- - Rst7   Цитата(SasaVitebsk @ Oct 2 2007, 14:39) Я...   Oct 2 2007, 11:57
|- - singlskv   Цитата(Rst7 @ Oct 1 2007, 17:41) Кстати, ...   Oct 2 2007, 18:06
|- - Непомнящий Евгений   Цитата(singlskv @ Oct 2 2007, 22:06) Може...   Oct 3 2007, 04:22
- - sensor_ua   ЦитатаБыла идея патчить кодегенератор, дабы он дел...   Oct 2 2007, 14:18
|- - Rst7   Цитата(sensor_ua @ Oct 2 2007, 17:18) Пыт...   Oct 3 2007, 05:38
- - sensor_ua   ЦитатаМожет все-таки стоит в подобных ситуациях оз...   Oct 2 2007, 19:38
|- - singlskv   Цитата(sensor_ua @ Oct 2 2007, 23:38) А ...   Oct 2 2007, 20:08
- - sensor_ua   ЦитатаКак сохранить текущую конфигурацию прибора п...   Oct 2 2007, 20:32
|- - singlskv   Цитата(sensor_ua @ Oct 3 2007, 00:32) Оза...   Oct 2 2007, 20:56
|- - defunct   Цитата(singlskv @ Oct 2 2007, 23:56) Если...   Oct 2 2007, 21:44
|- - sensor_ua   Цитата(singlskv @ Oct 2 2007, 23:56) Я и ...   Oct 3 2007, 05:16
- - sensor_ua   Цитатаон генерирует комманду записи в RAMPx, ее мо...   Oct 3 2007, 06:58


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

 


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


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