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

 
 
6 страниц V  « < 2 3 4 5 6 >  
Reply to this topicStart new topic
> Порты AVR и компиляция
singlskv
сообщение Sep 29 2007, 21:26
Сообщение #46


дятел
*****

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



Цитата(sensor_ua @ Sep 30 2007, 01:05) *
такую операцию нельзя прерывать независимо от компилятора - это АППАРАТНОЕ ограничение.
Не очень понял что Вы хотели этим сказать.
Мои варианты/предположения:
- нельзя прервать потому что нельзя smile.gif
- нельзя прерывать потому что кто-то еще захочет записать в EEPROM (из прерывания например) smile.gif
- нельзя прерывать потому что запись в EEPROM требует остановки всех процессов smile.gif
.....................
.....................
- нельзя пользоваться таким вариантом записи в EEPROM (поддерживаю!)
Цитата
Если это не понимать, то знание особенностей использования диалекта языка и компилятора не помогут.
Вы бы уточнили о каких АППАРАТНЫХ ОГРАНИЧЕНИЯХ идет речь...
Если Вы о необходимости вот этого:
asm("cli");
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
asm("sei");
то там речь идет о паре тактов проца... и при грамотном проектировании проги даже эти
cli и sei не понадобятся.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 29 2007, 22:09
Сообщение #47


Гуру
******

Группа: Модераторы
Сообщений: 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
singlskv
сообщение Sep 29 2007, 22:36
Сообщение #48


дятел
*****

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



Цитата(Сергей Борщ @ Sep 30 2007, 01:57) *
Получаем ошибку компилятора о несоответствии типов. Ту самую, которую в предыдущем примере вы задавили явным приведением к (void *). Ту самую, которую вы получите в WinAVR, если попытаетесь присвоть (void *) переменную типа (void EEMEM *) или prog_void.
Я даже и не сомневался что именно Вы укажите на это несоответствие smile.gif,
этот код я даже и не пытался скомпилировать потому что очевидно одно из двух,
если компилятор пропустит такой код, то все очень плохо и пользоваться __eeprom
просто нельзя ни при каких обстоятельствах, а если не пропустит, то это говорит
о том что типы которые придумал IAR(__eeprom xxx), Эээ... ну мягко говоря не
являются таки типами..., по крайней мере в понимании С.
Цитата
Не поверите - именно там, где надо сохранить данные. Компилятор подставит для каждого байта вызов __eeput8_16, в котором именно там где это необходимо будет запрет/разрешение прерываний. Поверьте, код будет практически идентичен eeprom_write_byte(), за которую вы агитируете.
Упс..., это где это я агитировал за использование eeprom_write_byte() ?
Я этим ни разу не пользовался smile.gif У меня свои функции.
Если Вас не затруднит ответьте таки конкретно на 2 моих вопроса из поста №37.



Все равно не понимаю в чем Вы пытаетесь меня убедить.
Цитата(sensor_ua @ Sep 30 2007, 02:21) *
Код
/* Wait for completion of previous write */
while(EECR & (1<<EEWE));
В том что я обязан висеть в этом цикле пока не закончится запись ?
У меня это выглядит примерно так:
Код
//==============================================================
// Автомат записи в EEPROM
//==============================================================
void EepromRun()
{

  if (EECR & (1<<EEWE)) return;                // идет запись ? да, тогда отваливаем (другие дела)

  if (CurrState == EE_FREE)
  {
     ...................................
     ...................................

}

Цитата
Запись заканчивается не сразу после засылки адреса и данных

а после АППАРАТНОЙ записи - для мега16 это 8.5 ms типовое значение. Или Вы хотите сказать, что, буквы EEMEM автоматом вдруг делают неожидающей встроенную функцию
static inline void __attribute__ ((always_inline))
eeprom_write_byte (uint8_t *addr,uint8_t value);
? (Может, она случайноwink.gif и неожидающая, но тогда ею пользоваться низзя) А не пробовали посмотреть, во что раскладывается аналогичная операция у IAR? Дык тоже инлайновый вариант.
Если не используем встроенные функции или модификаторы, а боремся за отсутствие ожиданий при работе с EEPROM, то пример задачи не к месту - в обоих случаях нужно писать СВОЁ.

Я НЕ пользуюсь ни IARовским ни каким другим вариантом доступа к EEPROM.
У меня есть свой хорошо работающий автомат записи.
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Sep 29 2007, 23:01
Сообщение #49


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата
Я НЕ пользуюсь ни IARовским ни каким другим вариантом доступа к EEPROM.

Обчитался после, что Вы не используете встроенные возможности и удалил пост нафиг.
Если Вы предлагаете для всех случаев применения EEPROM не использовать встроенные функции/модификаторы, то это не повод рассказывать, что они не годятся. Аргументы, ИМХО, сомнительны.
Задачи, конечно, разные бывают. Сам для записи во внешнюю последовательную память целую артиллерию из очередей выстраиваю, но константы, хранимые во __flash никуда не деваются и удобно используютсяwink.gif. Встроенную EEPROM у нас юзают исключительно как описывал defunct, потому как реально для наших логов (архивов) маловато будет - для хранилищ обычно ставим FRAM и DataFlash.


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
defunct
сообщение Sep 29 2007, 23:56
Сообщение #50


кекс
******

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



Цитата(singlskv @ Sep 30 2007, 01:36) *
Упс..., это где это я агитировал за использование eeprom_write_byte() ?
Я этим ни разу не пользовался smile.gif У меня свои функции.

Если речь идет о задаче-драйвере записи eeprom, то что мешает внутри нее использовать уже готовые механизмы компиляторов, e.g.:

Код
void EEPROM_Dispatch(void)
{
    if (EECR & (1<<EEWE))
        return;
    ....
    if (*(__eeprom U8 *)адрес != data to write)
        *(__eeprom U8 *)адрес = data to write;
}


Если вы даже не удосужились посмотреть и разобраться с кодом eeprom_read_byte()/eeprom_write_byte() пакета в котором работаете, и начали сразу городить что-то свое, то спорить с вами о возможностях IAR просто бесполезная трата времени.

Цитата
Я НЕ пользуюсь ни IARовским ни каким другим вариантом доступа к EEPROM.
У меня есть свой хорошо работающий автомат записи.

Порой глупо из-за какого-то принципа не пользоваться уже имеющимися механизмами.
К тому же они нисколько не помешали бы вашему автомату, а наоборот сделали бы его более прозрачным/читаемым.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 30 2007, 07:59
Сообщение #51


Гуру
******

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



Цитата(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.У меня есть свой хорошо работающий автомат записи.
Так я же и писал, что бывают случаи, когда надо работать головой и использовать нештатные решения. Но это не повод отказываться от удобных возможностей в остальных случаях.


--------------------
На любой вопрос даю любой ответ
"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
Qwertty
сообщение Sep 30 2007, 12:13
Сообщение #52


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(Сергей Борщ @ Sep 30 2007, 11:59) *
Вопросов я там нашел два: 1)Где там использовать встроенные функции. Да, согласен, я не обратил внимание на 200-500 мкс, что меньше, чем время записи. Согласен, что в этом случае надо использовать самописные функци.

Собственно об этом и речь. Простое присваивание не заостряет на себе внимание, в отличии от вызова функции, и ведет к ошибкам от банальной невнимательности. Понятно, что в результате оба метода, и в ИАРе и в ГЦЦ одинаково эффективны. Но все же работа с ЕЕПРОМ у ГЦЦ больше напоминает обращение к внешней памяти, с ее неизбежными задержками, что помогает избегать глупых ошибок. Но тут уж видимо вопрос вкуса. Меня встроенные функции avr-libs вполне устраивают. Но вот никто почему-то не говорит о лицензионной чистоте используемого программного продукта....
Go to the top of the page
 
+Quote Post
Proton
сообщение Sep 30 2007, 12:42
Сообщение #53


Частый гость
**

Группа: Свой
Сообщений: 185
Регистрация: 3-08-05
Из: Новосибирск
Пользователь №: 7 334



Цитата(Qwertty @ Sep 30 2007, 19:13) *
Но вот никто почему-то не говорит о лицензионной чистоте используемого программного продукта....

А зачем об этом говорить если это не влияет на функциональность и качество компиляции?


--------------------
Всяк хорошая мысля к нам приходит опосля.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 30 2007, 18:32
Сообщение #54


дятел
*****

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



Цитата(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
Всегда нужно чего-нить писать во время основной работы...
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Sep 30 2007, 18:38
Сообщение #55


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Сергей Борщ @ 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


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 30 2007, 18:44
Сообщение #56


дятел
*****

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



Цитата(Dog Pawlowa @ Sep 30 2007, 22:38) *
Не загоняем ли мы себя в угол, раскручивая конвейер? smile.gif
Вы имеете в виду IAR vs Gcc ?
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 30 2007, 19:17
Сообщение #57


Гуру
******

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



Цитата(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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 30 2007, 19:30
Сообщение #58


Гуру
******

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



Цитата(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


--------------------
На любой вопрос даю любой ответ
"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
singlskv
сообщение Sep 30 2007, 20:04
Сообщение #59


дятел
*****

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



Цитата(Сергей Борщ @ 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
Go to the top of the page
 
+Quote Post
defunct
сообщение Sep 30 2007, 22:44
Сообщение #60


кекс
******

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



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

Напрасно, т.к. int это платформено-зависимый тип, который подходит сугубо для возврата кода ошибки и то не всегда.
Go to the top of the page
 
+Quote Post

6 страниц V  « < 2 3 4 5 6 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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