Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Порты AVR и компиляция
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2
Сергей Борщ
Цитата(singlskv @ Sep 30 2007, 01:36) *
а если не пропустит, то это говорит о том что типы которые придумал IAR(__eeprom xxx), Эээ... ну мягко говоря не являются таки типами..., по крайней мере в понимании С.
Это является расширением языка. Нормальные типы, ибо поддерживают все операции над данными - арифметику, присваивание, взятие адреса, обращение по указателю. Указатели на эти типы полностью аналогичны указателям на данные с __attribute__(("progmem")) и __attribute__(("EEPROM")), против которых (так получается) вы нас агитируете. Причем последние, в отличие от ИАРовских, не являются полноценными типами, ибо поддерживают только операцию взятия адреса и арифметику указателей.
Цитата(singlskv @ Sep 30 2007, 01:36) *
Упс..., это где это я агитировал за использование eeprom_write_byte() ?
Ну, раз вы агитируете за WinAVR и доступ функциями, раз вы нигде до этого не упомянули, что вами используется закат солнца вручную - телепатически я сделал вывод, что вы агитиреуте за реализованный в avr-libc метод.
Цитата(singlskv @ Sep 30 2007, 01:36) *
Если Вас не затруднит ответьте таки конкретно на 2 моих вопроса из поста №37.
Вопросов я там нашел два: 1)Где там использовать встроенные функции. Да, согласен, я не обратил внимание на 200-500 мкс, что меньше, чем время записи. Согласен, что в этом случае надо использовать самописные функци. Но, извините, а вы эти данные только пишете, и никогда не читаете? Если все же читаете, то что мешает использовать простые и удобные встроенные возможности компилятора?
Ваш вопрос номер два - про ресурс. Мне кажется, я на него ответил исчерпывающе - если ресурса хватает с запасом (а это наиболее частый случай, как в примере - при хранении конфигурации) то не имеет смысла тратить усилия на его экономию. Если он важен - можно сделать побайтовую запись с анализом.
Цитата(singlskv @ Sep 30 2007, 01:36) *
Все равно не понимаю в чем Вы пытаетесь меня убедить.
В том, что встроенная поддержка данных в eeprom и flash не вредное (как вы утверждаете), а напротив очень полезное и удобное (первое вытекает из второго) расширение компилятора.
Цитата(singlskv @ Sep 30 2007, 01:36) *
Я НЕ пользуюсь ни IARовским ни каким другим вариантом доступа к EEPROM.У меня есть свой хорошо работающий автомат записи.
Так я же и писал, что бывают случаи, когда надо работать головой и использовать нештатные решения. Но это не повод отказываться от удобных возможностей в остальных случаях.
Qwertty
Цитата(Сергей Борщ @ Sep 30 2007, 11:59) *
Вопросов я там нашел два: 1)Где там использовать встроенные функции. Да, согласен, я не обратил внимание на 200-500 мкс, что меньше, чем время записи. Согласен, что в этом случае надо использовать самописные функци.

Собственно об этом и речь. Простое присваивание не заостряет на себе внимание, в отличии от вызова функции, и ведет к ошибкам от банальной невнимательности. Понятно, что в результате оба метода, и в ИАРе и в ГЦЦ одинаково эффективны. Но все же работа с ЕЕПРОМ у ГЦЦ больше напоминает обращение к внешней памяти, с ее неизбежными задержками, что помогает избегать глупых ошибок. Но тут уж видимо вопрос вкуса. Меня встроенные функции avr-libs вполне устраивают. Но вот никто почему-то не говорит о лицензионной чистоте используемого программного продукта....
Proton
Цитата(Qwertty @ Sep 30 2007, 19:13) *
Но вот никто почему-то не говорит о лицензионной чистоте используемого программного продукта....

А зачем об этом говорить если это не влияет на функциональность и качество компиляции?
singlskv
Цитата(defunct @ Sep 30 2007, 03:56) *
Если речь идет о задаче-драйвере записи eeprom, то что мешает внутри нее использовать уже готовые механизмы компиляторов, e.g.:
Воспользовался Вашим советом:
Код
__eeprom unsigned char a=1;
unsigned char b;

void SomeFunc()
{
  b=2;
}

void EEPROM_Run()
{
  if (EECR & (1<<EEWE)) return;
  if (a != b) a=b;
}

int main(void)
{
  SomeFunc();
  EEPROM_Run();

  return 0;
}


IAR, получил 81 такт на выполнение EEPROM_Run().
Написал тоже самое(по функциональности) "ручками", скомпилировал на WinAvr и на IAR,
и там и там получил 33 такта. (во всех случаях использовалась максимальная оптимизация)

Если Вас устраивает такой оверхед - пользуйтесь, меня не устраивает.

У меня для этого автомата максимальное время каждой стадии его работы чуть боле 100 тактов,
при этом поддерживается запись в два блока памяти(копии) и попутно подсчет/сравнение
СRC16 c уведомлением основной проги если были ошибки...

Цитата
Если вы даже не удосужились посмотреть и разобраться с кодом eeprom_read_byte()/eeprom_write_byte() пакета в котором работаете, и начали сразу городить что-то свое, то спорить с вами о возможностях IAR просто бесполезная трата времени.
Вы знаете, именно так и поступаю, сначала ознакомление со штатными средствами,
если меня устраивает, пользуюсь штатными, если нет, пишу свою реализацию.
Кстати вот вам и примерчик:
CRC16 и CRC8
CRC16 - пользуюсь встроенным, поскольку после изучения кода стало понятно что я просто ничего
не смогу выиграть.
CRC8 - очень медленно (для моих задач) , пользуюсь своим вариантом, причем их 2 на выбор,
если памяти много - табличный, мало - другой быстрый вариант.

Цитата
Порой глупо из-за какого-то принципа не пользоваться уже имеющимися механизмами.
К тому же они нисколько не помешали бы вашему автомату, а наоборот сделали бы его более прозрачным/читаемым.
Понятнее...,но в 2,5 раза медленнее 07.gif
Принципы здесь не при чем.

Цитата(Сергей Борщ @ Sep 30 2007, 11:59) *
Ну, раз вы агитируете за WinAVR и доступ функциями, раз вы нигде до этого не упомянули, что вами используется закат солнца вручную - телепатически я сделал вывод, что вы агитиреуте за реализованный в avr-libc метод.
Согласен, нужно было не расчитывать на телепатию собеседников и чуть
пораньше объяснить что я имею в виду.
А "закат солнца вручную" иногда очень эфективный метод smile.gif
Цитата
Это является расширением языка. Нормальные типы, ибо поддерживают все операции над данными - арифметику, присваивание, взятие адреса, обращение по указателю. Указатели на эти типы полностью аналогичны указателям на данные с __attribute__(("progmem")) и __attribute__(("EEPROM")), против которых (так получается) вы нас агитируете. Причем последние, в отличие от ИАРовских, не являются полноценными типами, ибо поддерживают только операцию взятия адреса и арифметику указателей.
ИМХО, это не нормальные типы, и мои примеры это показали.
Невозможность автоматического приведения указателя на такой тип к void* говорит
именно о том что тип неполноценен.
Считаю подход WinAvr(Gcc) в данном случае просто более честным.
Цитата
Но, извините, а вы эти данные только пишете, и никогда не читаете?
Чаще конечно пишу, чтение в основном при первоначальной загрузке параметров.
Но иногда нужно и чтение в процессе работы, поэтому чтение тоже интегрированно в
этот автомат.
Цитата
Если все же читаете, то что мешает использовать простые и удобные встроенные возможности компилятора?
Когда нужно быстро, пользоваться своим, а когда нужно медленно, то пользоваться библиотекой ?
А зачем мне плодить сущности и увеличивать код ?
Цитата
Так я же и писал, что бывают случаи, когда надо работать головой и использовать нештатные решения. Но это не повод отказываться от удобных возможностей в остальных случаях.
У меня такие случаи в каждом первом проекте. smile.gif
Всегда нужно чего-нить писать во время основной работы...
Dog Pawlowa
Цитата(Сергей Борщ @ Sep 30 2007, 01:09) *
Но писать для каждой ноги xxx_on(), xxx_off() - да, конечно так и делал раньше. Но теперь - on(LED); off(FLASH_CS); if(signal(KEY)) - тоже абсолютно портируемо на любой С-компилятор. И сгенеренный код будет идентичен тому, который надо написать вручную для xxx_on(); xxx_off();

Спасибо за примерчик. Я по старинке пишу ON_LED; без скобок, чтобы помнить, что это макрос. Не особенно нравится, но вот думаю, а стоит ли менять?
Я даже стараюсь писать unsigned int вместо uint или word, как это теперь обычно делается. Пока кнопочки жамкаешь, голова и работает (или отдыхает, что тоже неплохо). biggrin.gif
Не загоняем ли мы себя в угол, раскручивая конвейер? smile.gif
singlskv
Цитата(Dog Pawlowa @ Sep 30 2007, 22:38) *
Не загоняем ли мы себя в угол, раскручивая конвейер? smile.gif
Вы имеете в виду IAR vs Gcc ?
SasaVitebsk
Цитата(singlskv @ Sep 30 2007, 21:32) *
Воспользовался Вашим советом:
....
IAR, получил 81 такт на выполнение EEPROM_Run().
Написал тоже самое(по функциональности) "ручками", скомпилировал на WinAvr и на IAR,
и там и там получил 33 такта. (во всех случаях использовалась максимальная оптимизация)

Если Вас устраивает такой оверхед - пользуйтесь, меня не устраивает.


Об этом говорят вам все. Я, defunct, Сергей Борщ. IAR не запрещает работать вам так, как вы желаете. О чём и свидетельствуют написанные вами строчки. Другое дело если бы кроме как ч/з __eeprom компилятор не позволил бы добраться по другому к данной памяти. Но это к счастью не так.

Если вам так тяжело пережить эти спецификаторы, то рассматривайте их как факультативные и не используйте их.


По поводу "оверхеда".
Оптимизацию целесообразно делать там, где она даст желаемый эффект. Если привести доступный пример, то целесообразно вылизывать п/программу которая вызывается 1000 раз в секунду и совершенно не целесообразно если она вызывается 1 раз во время старта программы. По скольку EEPROM используется, как правило для хранения конфига и т.п., читается редко а записывается ещё реже (иначе используют внешнюю память, доступ к которой будет быстрее в разы), то для меня __eeprom является преимуществом. Использую я его где надо и по назначению и никаких проблем это у меня не вызывает.


В ближайшее время пойдёт xmega. Как уже объявлено, там будет память EEPROM в общем адресном пространстве. Я думаю IAR сохранит __eeprom. Таким образом портируемость программ у тех, кто использовал __eeprom - не пострадает.


Цитата(Dog Pawlowa @ Sep 30 2007, 21:38) *
Не особенно нравится, но вот думаю, а стоит ли менять?
Я даже стараюсь писать unsigned int вместо uint или word, как это теперь обычно делается. Пока кнопочки жамкаешь, голова и работает (или отдыхает, что тоже неплохо). biggrin.gif
Не загоняем ли мы себя в угол, раскручивая конвейер? smile.gif


Давайте всёже не забывать что мы с однокристалками работаем.

С одной стороны uint8_t это тоже стандарт
ISO/IEC 9899:1999 7.18 Integer types <stdint.h>

С другой стороны приведу пример. Я сделал проект на m640. Сейчас планирую перенести его на LPC2106. У меня там большое количество структур и указателей. И представьте себе если бы там стоял стандартный "int" вместо int16_t. Это же лопатить не перелопатить.

Ну а если глобально подходить, то да. Человечество давно само себя загоняет в угол по всем направлениям.
Долой машины - дорога к счастью - назад на деревья. biggrin.gif
Сергей Борщ
Цитата(singlskv @ Sep 30 2007, 21:32) *
А "закат солнца вручную" иногда очень эфективный метод smile.gif
Согласен, если выбора нет. А если он есть - смотря какой именно из парамеров оптимизировать smile.gif
Цитата(singlskv @ Sep 30 2007, 21:32) *
Невозможность автоматического приведения указателя на такой тип к void* говорит именно о том что тип неполноценен.
Не готов сразу ответить. "Чистый" С вообще не знает про разные адресные пространства. Да и как вы физически представляете приведение указателя на одно адресное пространство к указателю на другое? Только используя __generic указатели, что хоть и влечет дикий оверхед, но тем не менее реализовано в IAR.
Цитата(singlskv @ Sep 30 2007, 21:32) *
Считаю подход WinAvr(Gcc) в данном случае просто более честным.
На самом деле он просто не доделан wink.gif А пока он не только не честный, но как раз наоборот:
Код
uint8_t EEMEM EE_data;
uint8_t PROGMEM Const[] = "Tipa test";
void Test()
{
    uint8_t Tmp;
    Tmp = Const[0];
    EE_data = Tmp;
}
На фоне того, что такое компилируется молча и без ошибок тот факт, что на самом деле копирование происходит из ОЗУ в ОЗУ по совпадающим адресам кажется несущественным. Допустить такую ошибку гораздо проще (сам наступал), чем нарваться на случай, когда критично время записи в eeprom или ее ресурс. Тут четко видна недоделанность, ибо попытка присвоить что-либо Const все же вызывает сообщение об ошибке "попытка записи в read-only".
Цитата(singlskv @ Sep 30 2007, 21:32) *
Чаще конечно пишу, чтение в основном при первоначальной загрузке параметров.
И при этом данные, которые вы читаете, всегда представляют набор байтов? Не int, long, float, структуры, а именно голые байты? Если же данные осмысленны, то почему не воспользоваться предоставляемыми компилятором средствами?
Цитата(singlskv @ Sep 30 2007, 21:32) *
Когда нужно быстро, пользоваться своим, а когда нужно медленно, то пользоваться библиотекой ?
Честно говоря, так бы и поступил. Ибо встроенные методы дают более читаемый код. И чем больше читаемого кода в программе, тем меньше вероятность ошибки.
Цитата(singlskv @ Sep 30 2007, 21:32) *
А зачем мне плодить сущности и увеличивать код ?
Ну хорошо, наэкономите 40 байт памяти, а смысл, если ее все равно осталось полкило а то и больше? Читаемость упала, возможностей оптимизации у компилятора меньше. Ясное дело, если утаптываем, то резать придется везде.
Цитата(singlskv @ Sep 30 2007, 21:32) *
У меня такие случаи в каждом первом проекте. smile.gif Всегда нужно чего-нить писать во время основной работы...
"У каждого есть свои маленькие недостатки" (с)"В джазе только девушки".biggrin.gif


Цитата(SasaVitebsk @ Sep 30 2007, 22:17) *
В ближайшее время пойдёт xmega. Как уже объявлено, там будет память EEPROM в общем адресном пространстве. Я думаю IAR сохранит __eeprom. Таким образом портируемость программ у тех, кто использовал __eeprom - не пострадает.
Даже если не сохранит - портируемость достигнется добавлением строчки #define __eeprom
singlskv
Цитата(Сергей Борщ @ Sep 30 2007, 23:30) *
На самом деле он просто не доделан wink.gif А пока он не только не честный, но как раз наоборот:[code] EEMEM
PROGMEM
На фоне того, что такое компилируется молча и без ошибок тот факт, что на самом деле копирование происходит из ОЗУ в ОЗУ по совпадающим адресам кажется несущественным. Допустить такую ошибку гораздо проще (сам наступал), чем нарваться на случай, когда критично время записи в eeprom или ее ресурс. Тут четко видна недоделанность, ибо попытка присвоить что-либо Const все же вызывает сообщение об ошибке "попытка записи в read-only".
Здесь мы видимо принципиально по разному подходим к вопросу.
EEMEM, PROGMEM я типами данных просто не считаю.
Это, по моему мнению, просто те расширения компилятора которые позволяют
отводить/инициализировать область в eeprom/flash. + взятие адреса для выяснения куда писать.
Все. Собственно в описании к avr-lib их тока так и предполагается использовать.
Цитата
И при этом данные, которые вы читаете, всегда представляют набор байтов? Не int, long, float, структуры, а именно голые байты?
Автомат оперирует на уровне блока байтов + CRC.
Цитата
Если же данные осмысленны, то почему не воспользоваться предоставляемыми компилятором средствами?Честно говоря, так бы и поступил.
Ну хорошо, наэкономите 40 байт памяти, а смысл, если ее все равно осталось полкило а то и больше? Читаемость упала, возможностей оптимизации у компилятора меньше. Ясное дело, если утаптываем, то резать придется везде.
Ну видимо у нас все-таки сильно разные задачки...
Цитата
Даже если не сохранит - портируемость достигнется добавлением строчки #define __eeprom
Кстати о портируемости smile.gif , мой вариант кода эквивалентный коду из поста №54
скомпилировался без вопросов и на Gcc и на IAR laughing.gif
defunct
Цитата(Dog Pawlowa @ Sep 30 2007, 21:38) *
Я даже стараюсь писать unsigned int вместо uint или word, как это теперь обычно делается. Пока кнопочки жамкаешь, голова и работает (или отдыхает, что тоже неплохо).

Напрасно, т.к. int это платформено-зависимый тип, который подходит сугубо для возврата кода ошибки и то не всегда.
sensor_ua
Цитата
EEMEM, PROGMEM я типами данных просто не считаю.
Это, по моему мнению, просто те расширения компилятора которые позволяют
отводить/инициализировать область в eeprom/flash. + взятие адреса для выяснения куда писать.

Потому и руками допиливаются обычные функции и из них появляются особенные - так кроме
int printf(const char *__fmt, ...);
имеем
int printf_P(const char *__fmt, ...);
ЗЫ. Я пробую каждую свежую версию WinAVR и могу заметить, что семимильными шагами движется он в сторону IAR. Проекты под портируемость сразу протачиваем. Но пока это "утомительное застирывание".
Непомнящий Евгений
to Сергей Борщ
Подскажите, а зачем нужна обвязка из do/while?
Код
#define _clrL(port,bit)         do { port |= (1 << bit); } while(0)

Почему не так?
Код
#define _clrL(port,bit)         port |= (1 << bit)
Сергей Борщ
Цитата(Непомнящий Евгений @ 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 функций, но пропадет универсальность в виде совместимости с С.
defunct
Цитата(Сергей Борщ @ Oct 1 2007, 14:16) *
Конечно, если пользоваться только С++, то можно реализовать то же самое при помощи static inline функций, но пропадет универсальность в виде совместимости с С.

Подробнее можно? Почему пропадет совместимость, если в C тоже допускаются static inline функции.
Сергей Борщ
Цитата(defunct @ Oct 1 2007, 14:36) *
Подробнее можно? Почему пропадет совместимость, если в C тоже допускаются static inline функции.
В C99. Но, к сожалению, не все компиляторы его поддерживают sad.gif В С89 inline нет, а если и есть - это расширение конкретного компилятора. В общем "Это работает - не трогай!" smile.gif
SergeiCh
Цитата(Сергей Борщ @ Sep 30 2007, 05:09) *
on(LED); off(FLASH_CS); if(signal(KEY)) - тоже абсолютно портируемо на любой С-компилятор. И сгенеренный код будет идентичен тому, который надо написать вручную для xxx_on(); xxx_off();

Действительно удобное решение.
Dog Pawlowa
Цитата(singlskv @ Sep 30 2007, 21:44) *
Вы имеете в виду IAR vs Gcc ?

Нет, я имел ввиду конвейер головного мозга. Это я так, философствую... Можно стремиться проще и короче выражать свои мысли, но действительно ли их так много, что это нужно делать?
Я только себя имел ввиду. И вообще - проехали smile.gif
Rst7
Кстати, между прочим, переделав eeprom.s90 например на работу с 24xxx получаем удобный инструмент хранения переменных во внешней епромке. Кстати, структуры там тоже отлично хранятся... и массивы...
SasaVitebsk
Цитата(Rst7 @ Oct 1 2007, 16:41) *
Кстати, между прочим, переделав eeprom.s90 например на работу с 24xxx получаем удобный инструмент хранения переменных во внешней епромке. Кстати, структуры там тоже отлично хранятся... и массивы...

smile.gif
С точки зрения singlskv это неудобный неиструмент, который может ввести тебя в заблуждение при написании программы и привести десяткам ... нет сотням ошибок. Трудно вылавливаемых ошибок.
Rst7
Цитата(SasaVitebsk @ Oct 1 2007, 21:04) *
smile.gif
С точки зрения singlskv это неудобный неиструмент, который может ввести тебя в заблуждение при написании программы и привести десяткам ... нет сотням ошибок. Трудно вылавливаемых ошибок.


Ээээ... А с Вашей?
SasaVitebsk
Цитата(Rst7 @ Oct 2 2007, 09:42) *
Ээээ... А с Вашей?

smile.gif
Я оцениваю это положительно. Сам до такого не додумался. А мне кстати бы не помешало такое решение.
И вообще - всё что сделано - остаётся на годы.

Тут вообще, на мой взгляд бессмыслено оценивать. Раз Вы сделали - значит Вам это понадобилось и для Вас это оказалось удобным. Соответственно моя оценка или оценка другим человеком Вашего труда - будет весьма субъективной.

Я считаю, что фактически, это разработка какой-то базы под себя. И это позволит Вам следующий раз сделать проект быстрее. Соответственно это очень положительное качество. С годами Вы, возможно, переработаете детали и вылижите что-то. Или вообще что-то измените, но наверняка наработанные знания и опыт останутся с Вами навсегда.
Rst7
Цитата(SasaVitebsk @ Oct 2 2007, 14:39) *
Я оцениваю это положительно. Сам до такого не додумался. А мне кстати бы не помешало такое решение.


А вообще, жалко, что нет штатных средств компилятора для создания таких адресных пространств под собственные нужды. Иногда очень бы упростило код и добавило бы красоты. Через епром - это конечно костыль, однако, с другой стороны, достаточно легко переносимый на другие платформы.

В принципе была еще одна идея, но это уже злой хак smile.gif Как известно, ИАР умеет компилировать для моделей памяти с озу >64К. Была идея патчить кодегенератор, дабы он делал не OUT в RAMP?, а out в нужный порт. В результате, можно было бы увеличивать объем озу просто навесив дополнительные адреса на какой-либо порт и не думая о том, как выполнить этот маппинг програмно, все бы на себя взял компилятор. Правда, идея до реализации не дошла (уже не помню почему, кажется, отпала надобность).
sensor_ua
Цитата
Была идея патчить кодегенератор, дабы он делал не OUT в RAMP?, а out в нужный порт.

Пытался. Используются несуществующие регистры RAMPx. Проблема (сомневаюсь, что показалось) нерешаема.
singlskv
Цитата(Rst7 @ Oct 1 2007, 17:41) *
Кстати, между прочим, переделав eeprom.s90 например на работу с 24xxx получаем удобный инструмент хранения переменных во внешней епромке. Кстати, структуры там тоже отлично хранятся... и массивы...

Rst7, А как Вы считаете, встраивание возможности чтения EEPROM перед ее записью(или
не записью, если там ничего не изменилось) в свой код(или библиотеку) является
правильным/нужным (для увеличения ресурса EEPROM) ?

Время от времени на электрониксе возникают темы типа:
Как сохранить текущую конфигурацию прибора при пропадании питания.

Обычно(чаше всего) обсуждение ведется в русле того, что нужно аппаратными
средствами обеспечить работу контроллера еще какое-то время для того,
чтобы успеть записать эту самую конфигурацию.

Может все-таки стоит в подобных ситуациях озаботиться возможностью
"ВСЕГДА" иметь правильную конфигурацию в EEPROM ?
Правда для этого(часто) придется написать свой код общения с EEPROM. smile.gif
sensor_ua
Цитата
Может все-таки стоит в подобных ситуациях озаботиться возможностью
"ВСЕГДА" иметь правильную конфигурацию в EEPROM ?

smile.gif А давайте вспомним обычную файловую операцию - сохранение файла. Чтобы записываемый файл не убил ещё целый оригинал, нужно писать в другое место. Далее возникают остальные вопросы - как разгребаться с мусоркой и т.п. Файловые системы типа JFFS и новомодная ZFS именно то же делают -записывают на свободное место, а потом разбираются с мусоркой (в JFFS - garbage collection). Но оказывается задачи подобного рода - гарантированная запись некоего блока данных - возникали и раньше, например, в бесконтактных фискальных системах (карточки Mifare). Дык там это не пальцы загибать, а денюжки хранить. ЧТо придумывать будем?wink.gif))
singlskv
Цитата(sensor_ua @ Oct 2 2007, 23:38) *
smile.gif А давайте вспомним обычную файловую операцию - сохранение файла. Чтобы записываемый файл не убил ещё целый оригинал, нужно писать в другое место. Далее возникают остальные вопросы - как разгребаться с мусоркой и т.п. Файловые системы типа JFFS и новомодная ZFS именно то же делают -записывают на свободное место, а потом разбираются с мусоркой (в JFFS - garbage collection). Но оказывается задачи подобного рода - гарантированная запись некоего блока данных - возникали и раньше, например, в бесконтактных фискальных системах (карточки Mifare). Дык там это не пальцы загибать, а денюжки хранить.
Не очень понял как это касается темы спора
встроенные vs собственные средства работы с EEPROM ?
Если вы о том что нужно таки аппаратными средствами обеспечить запись в eeprom,
Цитата
ЧТо придумывать будем?wink.gif))
то придумывать ничего нового не будем, уже все придумано.
Транзакция считается законченой когда записано обе копии данных в EEPROM.

Если бы Вы внимательно читали мои посты, например пост №54 то Вы бы заметили что
мой автомат апдейтит две копии данных и по ходу для каждой из них
сохраняет/проверяет CRC.
sensor_ua
Цитата
Как сохранить текущую конфигурацию прибора при пропадании питания.
- я писал?
а это -
Цитата
Обычно(чаше всего) обсуждение ведется в русле того, что нужно аппаратными
средствами обеспечить работу контроллера еще какое-то время для того,
чтобы успеть записать эту самую конфигурацию.

Может все-таки стоит в подобных ситуациях озаботиться возможностью
"ВСЕГДА" иметь правильную конфигурацию в EEPROM ?

Озаботились кроме Вас ещё много людей и я Вам написал о том, что проблема не нова. И независимо от Вашего некоего "автомата" давно успешно решаема. Если Вы не знакомы с известными решениями, то это не повод рассказывать о том, что кроме Вашего решения (крохи которого Вы попытались громко показать) ничего иного нетwink.gif))
Цитата
транзакция считается законченой когда записано обе копии данных в EEPROM.

Если бы Вы внимательно читали мои посты,


Простите, но не заставляйте ассоциировать себя с героем старого анекдота "чукча не читатель - чукча писатель". Лучше всё-таки расскажите, чем отличается Ваше решение от общеизвестных, кроме как авторством кода и неприятием готовых решений от авторов компиляторов и сопутствующих библиотек.
singlskv
Цитата(sensor_ua @ Oct 3 2007, 00:32) *
Озаботились кроме Вас ещё много людей и я Вам написал о том, что проблема не нова. И независимо от Вашего некоего "автомата" давно успешно решаема. Если Вы не знакомы с известными решениями, то это не повод рассказывать о том, что кроме Вашего решения (крохи которого Вы попытались громко показать) ничего иного нетwink.gif))
Я и не пытаюсь себе присваивать пальму первенства, более того, я уверен что те
решения о которых я говорю применяются очень широко. Тока почему то на электрониксе
очень многим они не нравятся smile.gif
Цитата
Лучше всё-таки расскажите, чем отличается Ваше решение от общеизвестных, кроме как авторством кода и неприятием готовых решений от авторов компиляторов и сопутствующих библиотек.

Если Вас не убедило 33 такта против 81 на записи одного байта (да еще и в ситуации когда
цейтнот и питания осталось совсем мало), то я не смогу Вам объяснить чем мое решение лучше...

А если Вы действительно хотите разобраться со всеми нюансами сохранения правильной
конфигурации в EEPROM, то давайте это обсуждать, тока без вариантов типа в IAR это сделано
круто и ничего другого я знать не хочу,
и я думаю что тоже узнаю для себя что-то новое.
defunct
Цитата(singlskv @ Oct 2 2007, 23:56) *
Если Вас не убедило 33 такта против 81 на записи одного байта (да еще и в ситуации когда
цейтнот и питания осталось совсем мало), то я не смогу Вам объяснить чем мое решение лучше...

Да какая разница сколько тактов уйдет на sheduling записи одного байта. Операция записи длится 3-5ms, ответьте - сколько раз при этом будет осуществлен вызов вашего автомата и "отвал" по факту занятости eeprom, сколько тактов это сожрет? Не кажется ли вам, что разница 81-33 = 48 тактов просто мизерная и стремится к нулю на фоне постоянных накладных расходов автомата.
Кстати откуда 81 такт?
(eeprom char *)xxx = YY - это 14 инструкций с отключенной оптимизацией

Цитата
А если Вы действительно хотите разобраться со всеми нюансами сохранения правильной
конфигурации в EEPROM, то давайте это обсуждать

что тут обсуждать. три основных момента - залог успеха:
1. пакетная организация,
2. CRC обязательно.
3. Дублировать записи.
Цитата
тока без вариантов типа в IAR это сделано
круто и ничего другого я знать не хочу,

Вы то хоть поняли что в IAR сделано? И как то, что сделано в IAR кореллирует с тем, что выставляете вы? Уровни же разные совершенно, вы хотите сопоставить пакетный уровень, байт уровню? Типа - да начерта нам эти сигналы всякие, биты, байты, вот IE с http прекрасно работает..
Непомнящий Евгений
Цитата(singlskv @ Oct 2 2007, 22:06) *
Может все-таки стоит в подобных ситуациях озаботиться возможностью
"ВСЕГДА" иметь правильную конфигурацию в EEPROM ?
Правда для этого(часто) придется написать свой код общения с EEPROM. smile.gif


Если у меня правильная конфигурация (состояния автоматов) меняется примерно раз в минуту, то дырку я протру за 100К/60/24 = 70 дней. Если я растиражирую эту запись 10 раз - то за 700 дней. Правда, епром у меня используется впритык, и максимум, что я могу - это 3 копии. Т.е. 70*3 = 210 дней. Все равно мало. Поэтому приходится иметь парковку...

Кст, насчет спора собственные функции \ встроенные средства. Сам для епрома использую собственные - с автоматическим тиражированием, CRC и работающие в фоне. А вот для доступа к флэшу использую модификатор __flash. По моему, вполне удобно.
sensor_ua
Цитата(singlskv @ Oct 2 2007, 23:56) *
Я и не пытаюсь себе присваивать пальму первенства, более того, я уверен что те
решения о которых я говорю применяются очень широко. Тока почему то на электрониксе
очень многим они не нравятся smile.gif

Если Вас не убедило 33 такта против 81 на записи одного байта (да еще и в ситуации когда
цейтнот и питания осталось совсем мало), то я не смогу Вам объяснить чем мое решение лучше...

А если Вы действительно хотите разобраться со всеми нюансами сохранения правильной
конфигурации в EEPROM, то давайте это обсуждать, тока без вариантов типа в IAR это сделано
круто и ничего другого я знать не хочу,
и я думаю что тоже узнаю для себя что-то новое.

8.5 МИЛЛИСЕКУНД продолжается запись. Какие такты кого спасут? IMNHO, Вы путаете время записи адреса и данных для АППАРАТНОЙ записи с продолжительностью самой записи. И, кроме того, извините, но глядя на кусочек кода (вероятно это код Вашего автомата), не только у меня возникли сомнения в его корректности. Вопрос же о хранении и валидности данных касается более алгоритмов хранения, а не реализации их в конкретном драйвере, о котором кроме дифирамбов никакой инфы, кроме неиспользования штатных средств, толком и не было.
Rst7
Цитата(sensor_ua @ Oct 2 2007, 17:18) *
Пытался. Используются несуществующие регистры RAMPx. Проблема (сомневаюсь, что показалось) нерешаема.


Ну я в IDA размотал этот кусок, где он генерирует комманду записи в RAMPx, ее можно там заменить, пропатчив экзешник конечно, штатными средствами не получится. Только что-то меня остановило, уже не помню что.
sensor_ua
Цитата
он генерирует комманду записи в RAMPx, ее можно там заменить, пропатчив экзешник

Уже не помню, но кроме адресации по смещению какие-то нюансы с регистрами передачи параметров в функции были.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.