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

|
Очень долго работал с разными МК(51, в основном ARM) решил попробовать AVR вопросы: У этих AVR что нет удобного побитового доступа к портам? Какой компилятор делает наиболее красивый код?
|
|
|
|
|
 |
Ответов
|
Sep 28 2007, 22:37
|
дятел
    
Группа: Свой
Сообщений: 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 P.S Тока не нужно мне рассказывать что этот пример высосан из пальца... Прямое преобразование типов конечно вставлено специально, тока где и когда Вы наткнетесь на такой результат в реальной программе будете знать тока Вы и Ваш доктор в дурке (после отладки такого кода)
|
|
|
|
|
Sep 29 2007, 11:54
|

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

|
Цитата(singlskv @ Sep 29 2007, 01:37)  P.S Тока не нужно мне рассказывать что этот пример высосан из пальца... Прямое преобразование типов конечно вставлено специально, тока где и когда Вы наткнетесь на такой результат в реальной программе будете знать тока Вы и Ваш доктор в дурке (после отладки такого кода)  Ок, аналогичный пример: Код char Str[]="Hello"; char SomeChar; int main(void) { memcpy( (void *)SomeChar, Str, sizeof(Str)); } Проблема здесь та же самая что и в вашем примере, и даже без переменных в eeprom. Поэтому можете также вместе с доктором ковырять и этот код. Ибо когда нет понимания, что происходит в программе и что может происходить - забудьте про (void *).
|
|
|
|
|
Sep 29 2007, 17:21
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(defunct @ Sep 29 2007, 15:54)  Ок, аналогичный пример: Код .................... Проблема здесь та же самая что и в вашем примере, и даже без переменных в eeprom. Ну все таки не совсем одно и тоже, я свой пример показал только с точки зрения потенциально проблемной части в использовании __eeprom, а в вашем примере просто нарисован баг который из-за преобразования типов не смог поймать компилятор. Насколько я знаю, в стандарте С вобще нет такого типа void __eeprom *  А вот теперь представьте себе: Код __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 = ∬ MassivHrenZnaetSKakimiDannimy[2].size = sizeof(Int); MassivHrenZnaetSKakimiDannimy[3].ptr = &Long; MassivHrenZnaetSKakimiDannimy[3].size = sizeof(Long); ............................. ............................. ............................. memcpy(KudatoTam, MassivHrenZnaetSKakimiDannimy[x].ptr, MassivHrenZnaetSKakimiDannimy[x].size); .......................... .......................... } Хрен знает какие данные оказались не совсем хрен знает какими, а все по тому что кое кто придумал свой новый тип данных... __eeprom xxx
|
|
|
|
|
Sep 29 2007, 22:09
|

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

|
Цитата(singlskv @ Sep 29 2007, 20:21)  Насколько я знаю, в стандарте С вобще нет такого типа void __eeprom *  Мы не обсуждали портируемость. В других компиляторах нет eeprom_write_byte();, а в некоторых процессорах нет eeprom  Цитата(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  ... Почти согласен. Но писать для каждой ноги 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)
|
|
|
|
|
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)
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|