|
Еще одни грабли от IAR AVR, на этот раз касабельно EEPROM |
|
|
|
 |
Ответов
|
Jul 21 2006, 20:29
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
Цитата(IgorKossak @ Jul 21 2006, 12:30)  Судя по всему, никто из отвечавших здесь не заглянул сюда. Уже заглянул  . Действительно нечто похожее уже обсуждали и в прикрепленном файле грабли были убраны. Цитата Что касается компилятора, то он и не должен строить предположения насчёт прерываний. Для него EEPROM и система прерываний - две разные сути. Если пользователю вдруг захотелось эти сути объединить в своей задаче (требованиях), то пусть он (пользователь) этим и займётся, причём тут компилятор. Там суть в глобальных ресурсах - сохраняет-же он при входе в прерывание SREG, так чем EEAR и EEDR хуже? Цитата(TomaT @ Jul 21 2006, 13:46)  Выдержка из атмеловского даташита: Caution: An interrupt between step 5 and step 6 will make the write cycle fail, since the EEPROM Master Write Enable will time-out. If an interrupt routine accessing the EEPROM is interrupting another EEPROM access, the EEAR or EEDR Register will be modified, causing the interrupted EEPROM access to fail. It is recommended to have the Global Interrupt Flag cleared during all the steps to avoid these problems.Тем более IAR-овцы должны были на эту выдержку обратить внимание  .
Сообщение отредактировал ArtemKAD - Jul 21 2006, 20:30
|
|
|
|
|
Jul 22 2006, 10:03
|

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

|
Цитата(ArtemKAD @ Jul 21 2006, 23:29)  Цитата Что касается компилятора, то он и не должен строить предположения насчёт прерываний. Для него EEPROM и система прерываний - две разные сути. Если пользователю вдруг захотелось эти сути объединить в своей задаче (требованиях), то пусть он (пользователь) этим и займётся, причём тут компилятор. Там суть в глобальных ресурсах - сохраняет-же он при входе в прерывание SREG, так чем EEAR и EEDR хуже? Поразительное упорство. А регисты таймера, портов, UARTa, АЦП и прочей периферии компилятор не должен сохранять при входе в прерывание? Нет? А чем они лучше чем EEAR, EEDR? Цитата(ArtemKAD @ Jul 21 2006, 23:29)  Цитата(TomaT @ Jul 21 2006, 13:46)  Выдержка из атмеловского даташита:  Тем более IAR-овцы должны были на эту выдержку обратить внимание  . Да не надо валить с больной головы на здоровую. Вам пять человек пытаются объяснить, что компилятор тут не при чем. Это не ИАРовцы, а Вы должны были прочитать эту выдержку и обратить на нее внимание. Ибо только Вам известно где Вы работаете с EEPROM - в прерывании, в основном цикле или и там и там. В двух случаях из упомянутых трех никаких "срадств защиты" на которых Вы настаиваете не требуется. И только в третьем случае нужно предохраняться. Но компилятор не имеет _никакой_ возможности определить какой метод пользуете Вы в своей программе. А поскольку обычно (грамотно) используют первые два подхода, то нет никакого резона перестраховываться и генерить лишний код на случай если кому-то придет в голову поизвращаться.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 22 2006, 10:42
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
Цитата(Сергей Борщ @ Jul 22 2006, 13:03)  Цитата(ArtemKAD @ Jul 21 2006, 23:29)  Там суть в глобальных ресурсах - сохраняет-же он при входе в прерывание SREG, так чем EEAR и EEDR хуже?
Поразительное упорство.  Я знаю Цитата А регисты таймера, портов, UARTa, АЦП и прочей периферии компилятор не должен сохранять при входе в прерывание? Нет? А чем они лучше чем EEAR, EEDR? Тем, что с этой самой переферией приходится работать самому. Т.е. ее в программе рассматриваешь как набор этих самых регистров. Т.е. в программе таймер ты видишь не как таймер, а как регистры. А ЕЕPROM компилятор представляет как ПАМЯТЬ в которую можно писать и из которой можно читать. Использование "потрохов" для работы с EEPROM для корректной работы выглядит как-то странно. По сути похожий пример - при вызове библиотечной процедуры ей КАК-ТО передаются параметры и она что-то куда-то возвращает. А теперь представь, как-бы ты посмотрел на IAR, если-бы вызов процедуры в прерывании разрушал параметры вызова этой-же процедуры в основном цикле.
Сообщение отредактировал ArtemKAD - Jul 22 2006, 10:42
|
|
|
|
|
Jul 22 2006, 11:14
|

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

|
Цитата(ArtemKAD @ Jul 22 2006, 13:42)  Цитата(Сергей Борщ @ Jul 22 2006, 13:03)  Цитата(ArtemKAD @ Jul 21 2006, 23:29)  Там суть в глобальных ресурсах - сохраняет-же он при входе в прерывание SREG, так чем EEAR и EEDR хуже?
Поразительное упорство.  Я знаю  :-) Но все равно "не выйдет из тебя путёвого старика" :-) Цитата Цитата А регисты таймера, портов, UARTa, АЦП и прочей периферии компилятор не должен сохранять при входе в прерывание? Нет? А чем они лучше чем EEAR, EEDR? Тем, что с этой самой переферией приходится работать самому. Т.е. ее в программе рассматриваешь как набор этих самых регистров. Т.е. в программе таймер ты видишь не как таймер, а как регистры. А ЕЕPROM компилятор представляет как ПАМЯТЬ в которую можно писать и из которой можно читать. Да, но об особенностях работы с этой памятью ты должен позаботиться сам. Тебя не удивляет ведь, что компилятор не запрещает прерывания при доступе к многобайтовым volatile - переменным? А ведь прерывание может изменить эту переменную посередине чтения в основном цикле. Хочешь атомарный доступ - ручками. Не хочешь - тебе виднее. Когда компиляторы научатся бегать за пивом я уволюсь - ибо тогда программы они смогут писать без меня и подавно. Цитата По сути похожий пример - при вызове библиотечной процедуры ей КАК-ТО передаются параметры и она что-то куда-то возвращает. А теперь представь, как-бы ты посмотрел на IAR, если-бы вызов процедуры в прерывании разрушал параметры вызова этой-же процедуры в основном цикле. Попробуй вызвать таким манером библиотечную функцию strtok(). Получишь именно только что тобой описанное. Тебя это удивляет? Меня нет. Я знаю, что эта функция нереентерабельная (как и многие другие _библиотечные_ функции). Резюмирую: компилятор в твоих граблях не виноват. Он еще много чего не умеет делать сам ибо это в принципе не возможно. Потому-то к нему программист в комплекте должен быть.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
ArtemKAD Еще одни грабли от IAR AVR Jul 19 2006, 19:55 arttab Какая версия IAR? Jul 20 2006, 01:42 ArtemKAD Цитата(arttab @ Jul 20 2006, 04:42) Какая... Jul 20 2006, 09:04  Семён [quote name='ArtemKAD' date='Jul 20 20... Jul 20 2006, 09:15  Сергей Борщ Цитата(ArtemKAD @ Jul 20 2006, 12:04) Ком... Jul 20 2006, 09:32   ArtemKAD Цитата(Сергей Борщ @ Jul 20 2006, 12:32) ... Jul 20 2006, 10:58    Сергей Борщ Цитата(ArtemKAD @ Jul 20 2006, 13:58) Цит... Jul 20 2006, 11:17     ArtemKAD Цитата(Сергей Борщ @ Jul 20 2006, 14:17) ... Jul 20 2006, 11:49      Сергей Борщ Цитата(ArtemKAD @ Jul 20 2006, 14:49) Вы ... Jul 20 2006, 12:05       ArtemKAD Цитата(Сергей Борщ @ Jul 20 2006, 15:05) ... Jul 20 2006, 12:47    xemul Цитата(ArtemKAD @ Jul 20 2006, 14:58) Даж... Jul 20 2006, 11:35    TomaT Цитата(ArtemKAD @ Jul 20 2006, 14:58) ...... Jul 21 2006, 10:46  SasaVitebsk Цитата(ArtemKAD @ Jul 20 2006, 12:04) Вы ... Jul 23 2006, 20:44 Сергей Борщ Цитата(ArtemKAD @ Jul 19 2006, 22:55) При... Jul 20 2006, 07:26 Семён Цитата(ArtemKAD @ Jul 19 2006, 23:55) При... Jul 20 2006, 08:35 TomaT Может и бывает нужда такая, но я не очень понимаю ... Jul 20 2006, 09:12 xemul ЦитатаСудя по всему, никто из отвечавших здесь не ... Jul 21 2006, 10:44
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|