|
Порты 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, 19:47
|

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

|
Цитата(singlskv @ Sep 29 2007, 20:21)  Ну все таки не совсем одно и тоже, я свой пример показал только с точки зрения потенциально проблемной части в использовании __eeprom, а в вашем примере просто нарисован баг который из-за преобразования типов не смог поймать компилятор. В вашем примере баг абсолютно такой же как и в моем. Ибо нефиг несовместимый тип приводить к PVOID. Цитата Хрен знает какие данные оказались не совсем хрен знает какими, а все по тому что кое кто придумал свой новый тип данных... __eeprom xxx В AVR три адресных пространства. Насколько это удобно или неудобно не вам судить, и не мне. Они просто есть, IAR дает нам простой инструмент доступа к этим адресным пространствам, если вам такой способ доступа не подходит - пользуйтесь другим, более сложным. Цитата для меня например значительно более понятным при работе с EEPROM является или прямой вызов функций записи в него, или просто запуск записи с последующей проверкой что запись уже закончилась. Кому что.. Меня как правило интересует конечный результат, если воспользовавшись фичей X я смогу добиться конечного результата меньшим числом строк кода и не в ущерб наглядности, читабельности программы и скорости испольнения, то обязательно ей воспользуюсь (по крайней мере подумаю об ее использовании). Минусом будет только "Портируемость" внутри семейства и на другие многоадресные семейства МК, а на "протируемость" на одноадресные МК (напр ARM) оно вообще никак не повлияет. Да и палку вы здесь перегибаете. Что может быть понятнее присваивания? x = y;
|
|
|
|
|
Sep 29 2007, 20:15
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(defunct @ Sep 29 2007, 23:47)  Да и палку вы здесь перегибаете. Что может быть понятнее присваивания? x = y; Хорошо, будем говорить тока за себя, лично мне очень не нравится ситуация когда x=y; выполняется несколько сот наносекунд, а e=k; (где e - eeprom) выполняется несколько миллисекунд. Ну и остальные отрицательные стороны использования EEPROM как переменных я уже описал выше.
|
|
|
|
|
Sep 29 2007, 20:20
|

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

|
Цитата(singlskv @ Sep 29 2007, 23:15)  e=k; (где e - eeprom) выполняется несколько миллисекунд. Ну и остальные отрицательные стороны использования EEPROM как переменных я уже описал выше. Ну и что?! У eeprom еще и ресурс ограничен, такова уж особенность этой памяти. 100k раз запишете дальше пойдут сбои. Какое это имеет отношение к удобному механизму обращения к этой памяти? Не нравится медленный внутренний eeprom используйте RAM или ставте быстрый внешний FRAM, но удобного способа доступа к нему средствами компилятора уже не будет, придется писать драйвер.
|
|
|
|
|
Sep 29 2007, 20:30
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(defunct @ Sep 30 2007, 00:20)  Ну и что?! У eeprom еще и ресурс ограничен, такова уж особенность этой памяти. 100k раз запишете дальше пойдут сбои. Какое это имеет отношение к удобному механизму обращения к этой памяти? Похоже Вы невнимательно читаете мои посты, перечитайте пожалуйста №37, и если Вас не затруднит, ответьте на 2 поставленных мной вопроса, продублирую их на всякий случай: НО, объясните мне как Вы будете пользоваться такими присвоениями в следующей ситуации: Есть прога: - все события(опросы) синхронизированны(системный тик) например с тактом 200-500мкс - есть одно или несколько прерываний которые получают данные - есть основной цикл который ведет обработку полученных в прерывании данных - НУЖНО, не прерывая обработку, писать некоторые изменения соcтояния проги в EEPROM
Где в этой проге можно написать cfg_EE = cfg_RAM ?....................... Как Вы думаете, в среднем, какой вариант общения с EEPROM будет более быстрым и более надежным(в смысле ресурса EEPROM) ?
|
|
|
|
|
Sep 29 2007, 20:40
|

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

|
Цитата(singlskv @ Sep 29 2007, 23:30)  [i]НО, объясните мне как Вы будете пользоваться такими присвоениями в следующей ситуации: Есть прога: - все события(опросы) синхронизированны(системный тик) например с тактом 200-500мкс - есть одно или несколько прерываний которые получают данные - есть основной цикл который ведет обработку полученных в прерывании данных - НУЖНО, не прерывая обработку, писать некоторые изменения соcтояния проги в EEPROM Для этой задачи я поставлю исключительно внешний eeprom либо NVRAM и не буду даже морочиться с внутренним, которого судя по условию задачи просто не хватит для хранения какого либо существенного объема статистики. Внутренний eeprom лично я использую только для: хранения параметров конфигурации устройства, хранения информации о рестартах + дамп критических структур в случае перезагрузки по WDT. Цитата Как Вы думаете, в среднем, какой вариант общения с EEPROM будет более быстрым и более надежным(в смысле ресурса EEPROM) ? Я думаю, что вариант общения должен быть обдуманным, т.е. надо минимизировать число записей. При этом инструмент которым непосредственно производится запись/чтение может быть каким угодно, но желательно простым, что нам и дает IAR.
|
|
|
|
Сообщений в этой теме
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         singlskv Цитата(defunct @ Sep 30 2007, 00:40) Для ... Sep 29 2007, 20:58    Сергей Борщ Цитата(singlskv @ Sep 29 2007, 20:21) Нас... Sep 29 2007, 22:09     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     Непомнящий Евгений to Сергей Борщ
Подскажите, а зачем нужна обвязка и... Oct 1 2007, 10:38      Сергей Борщ Цитата(Непомнящий Евгений @ Oct 1 2007, 13... Oct 1 2007, 11:16       defunct Цитата(Сергей Борщ @ Oct 1 2007, 14:16) К... Oct 1 2007, 11:36        Сергей Борщ Цитата(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
|
|
|