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

 
 
> IAR и запись в EEPROM, Вопрос по реализации записи в eeprom в IAR
arttab
сообщение May 16 2006, 07:27
Сообщение #1


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



В моей проге есть запись по команде в еепром:
1. посылаю команду
2. Байтики принемает уарт и они вне прерывания обрабатываются функцией приемника
3. При получении нужной команды в еепром пишется байт (пишется средствами IAR) и отсылаеются байтики о выполнении. Отсылается не дожидаясь окончания записи (флаг не проверяю).

Задержка между окончанием приема команды на запись до отправки ответа около 7.5 мсек. если не пишу, а отвечаю сразу, то 0,3мсек.
Вопрос: чем вызвана такая большая задержка? Кварц 8 МГц. Время записи одного байта должно быть 1 мсек. МЕГА8

Это не просто любопытство - есть проблемы при записи в еепром в других частях проги. Пытаюсь разобраться.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
arttab
сообщение May 18 2006, 08:53
Сообщение #2


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Копаться в чужом тексте дело не благодарное. Жаль что нет описания изменений, но все равно спасибо.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 18 2006, 11:31
Сообщение #3


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(arttab @ May 18 2006, 11:53) *
Копаться в чужом тексте дело не благодарное.

Ну я же дал себе труд покопаться в иаровском тексте. И нисколько не жалею. Надо же как-то квалификацию поднимать.
Цитата(arttab @ May 18 2006, 11:53) *
Жаль что нет описания изменений, но все равно спасибо.

А описание можно свести к двум пунктам:
1) любая критическая работа с ЕЕПРОМ (за исключением кристаллов AT86RF401), требующая непрерываемости, обрамлена в обёртку типа:
сохранить SREG
CLI
критическая работа с ЕЕПРОМ
восстановить SREG
2) исправлена ошибка в подпрограмме записи в ЕЕПРОМ 64-битных чисел.
Go to the top of the page
 
+Quote Post
Baser
сообщение Feb 17 2008, 23:22
Сообщение #4


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Решил я тут разобраться с тем, как ИАР реализовал свои функции работы с EEPROM, потому что раньше применял свои функции, а теперь решил применить ИАРовские. Почитал документы, поизучал исходники, посмотрел конференцию. Нашел сообщения и файл коллеги IgorKossak который он всем рекомендует. И как-то из последних сообщений выходит, что у ИАРа библиотеки неправильные.
Решил я поэтому опубликовать свои выводы, поскольку получается, что библиотеки то правильные (здесь я не говорю об их ошибке с записью long long - ошибка она и есть ошибка), просто границы применимости у них различные.
Возмем, к примеру, чтение и запись char в eeprom, размером более 256 байт.

Оригинальная библиотека ИАР АВР 4.21А (если убрать все лишние переходы):
Код
?eewait:
        SBIC    EECR,EEWE
        RJMP    ?eewait
        RET

__eeget8_16:
        RCALL   ?eewait
        OUT     EEARL,r20
        OUT     EEARH,r21
        SBI     EECR,EERE
        IN      r16,EEDR
        RET

__eeput8_16:
        IN      r0,SREG
        RCALL   ?eewait
        OUT     EEDR,r16
        OUT     EEARL,r20
        OUT     EEARH,r21
        CLI
        SBI     EECR,EEMWE
        SBI     EECR,EEWE
        OUT     SREG,r0
        RET

Анализируя этот код можно определить область применимости этих процедур:
Эти функции можно применять (без дополнительного запрещения прерываний) только в одном потоке, т.е. или в main или в прерываниях одного уровня. Применение даже только чтения и в основном цикле и в прерывании периодически будет приводить к краху чтения. Дополнительное ограничение - функцию записи нельзя применять при наличии самопрограммирования флеша (команд SPM) в другом потоке.

Возмем теперь исправленный вариант от IgorKossak. Исправления следующие:
Цитата(IgorKossak @ May 18 2006, 13:31) *
описание (исправлений) можно свести к двум пунктам:
1) любая критическая работа с ЕЕПРОМ (за исключением кристаллов AT86RF401), требующая непрерываемости, обрамлена в обёртку типа:
сохранить SREG
CLI
критическая работа с ЕЕПРОМ
восстановить SREG
2) исправлена ошибка в подпрограмме записи в ЕЕПРОМ 64-битных чисел.

Код
?eewait:
        CLI
        SBIS    EECR,EEWE
        RET
        OUT     SREG,r0
        RJMP    ?eewait

__eeget8_16:
        PUSH    r0
        IN      r0,SREG
        RCALL   ?eewait
        OUT     EEARL,r20
        OUT     EEARH,r21
        SBI     EECR,EERE
        IN      r16,EEDR
        OUT     SREG,r0
        POP     r0
        RET

__eeput8_16:
        IN      r0,SREG
        RCALL   ?eewait
        OUT     EEDR,r16
        OUT     EEARL,r20
        OUT     EEARH,r21
        SBI     EECR,EEMWE
        SBI     EECR,EEWE
        OUT     SREG,r0
        RET

Запрещение прерываний на все время работы функций вместе и изящным решением "прозрачного" для прерываний ожидания готовности. Расширение границ применяемости налицо. Теперь работу с EEPROM можно производить в нескольких параллельных потоках. То, что при этом может происходить "замирание" обработки прерывания на время ожидания готовности - дело программиста: применять или нет.
Теперь любой, кому придет в голову эта бредовая идея, может писать EEPROM в прерываниях без фатальных последствий для своей программы smile.gif
А вот проверки готовности флеша (от SPM) тут тоже нет. И это нужно помнить.

Так что применять можно все, только нужно хорошо понимать что делаешь smile.gif


з.ы. меня сначала смутил тот момент, что сохранение регистра r0, IgorKossak добавил только в __eeget8_16 07.gif
Но при проверке оказалось, что компилятор не проверяет asm файл с текстом неоригинальной программы, а тупо смотрит на имя функции. Если в прерывании есть __eeput8_16, то сохраняет r0, хотя вы его в своей функции можете и не применять, а применять кучу других регистров, которые компилятор и не подумает сохранить. А если видит __eeget8_16, то r0 не сохраняет (в оригинальной функции его нет).
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- arttab   IAR и запись в EEPROM   May 16 2006, 07:27
- - KRS   А почему вы думаете что время записи 1 ms? уже дав...   May 16 2006, 07:43
- - arttab   Кое что дошло. для МЕГИ8 время записи байта в еепр...   May 16 2006, 08:43
|- - BVU   Цитата(arttab @ May 16 2006, 12:43) Кое ч...   May 16 2006, 08:57
- - arttab   Спасибо всем! IAR сам не запрещает прорывания ...   May 16 2006, 09:15
|- - _Bill   Цитата(arttab @ May 16 2006, 12:15) Спаси...   May 23 2006, 12:16
- - KRS   Запрещать прерывания нужно только что бы биты EEM...   May 16 2006, 10:31
- - arttab   Спасибо KRS. Замечание ценное, но не для моего слу...   May 17 2006, 01:33
- - IgorKossak   Посмотрите также здесь. Это я когда-то выкладывал ...   May 17 2006, 12:41
|- - arttab   Цитата(IgorKossak @ May 17 2006, 19:41) П...   May 18 2006, 02:01
|- - IgorKossak   Цитата(arttab @ May 18 2006, 05:01) Этим ...   May 18 2006, 06:22
- - arttab   Спасибо. Парадокс: чтобы сделать хорошо и быстро н...   May 19 2006, 01:46
- - arttab   ЦитатаА зачем так сложно? Гораздо проще объявить п...   May 24 2006, 02:01
|- - aleksey_g   ЦитатаЯ так тоже думал... Пришлось самому прерыван...   May 25 2006, 12:35
- - arttab   у меня IAR 3.10C   May 26 2006, 01:43
|- - _Bill   Цитата(arttab @ May 26 2006, 04:43) у мен...   May 26 2006, 07:56
- - arttab   Спорить не буду. пес отключен. при получении коман...   May 26 2006, 08:56
- - CSB   ЦитатаПосмотрите также здесь. Это я когда-то выкла...   Jun 25 2006, 18:36
|- - IgorKossak   Цитата(CSB @ Jun 25 2006, 21:36) Цитата П...   Jun 26 2006, 06:30
- - arttab   пока не подключал. переносимось проекта теряется. ...   Jun 26 2006, 01:27
- - arttab   Если кто дернет файл с из проекта или не подключит...   Jun 26 2006, 09:01
|- - IgorKossak   Цитата(arttab @ Jun 26 2006, 12:01) Если ...   Jun 26 2006, 09:38
- - arttab   Подключил. вылетает ошибка: Error[2]: Failed to op...   Jun 26 2006, 09:13
- - arttab   спасиба. разобрался. код на 2 байта вырос   Jun 27 2006, 08:21
- - Rash   Цитата(CSB @ Jun 25 2006, 22:36) Как подк...   Feb 13 2008, 09:26
|- - IgorKossak   Цитата(Rash @ Feb 13 2008, 11:26) Ни как ...   Feb 13 2008, 12:06
- - Rash   Цитата(IgorKossak @ Feb 13 2008, 16:06) P...   Feb 13 2008, 12:15
|- - IgorKossak   Цитата(Rash @ Feb 13 2008, 14:15) Это я с...   Feb 13 2008, 12:26
- - Rash   Цитата(IgorKossak @ Feb 13 2008, 16:26) Э...   Feb 13 2008, 12:48
|- - IgorKossak   Цитата(Rash @ Feb 13 2008, 14:48) поэтому...   Feb 13 2008, 13:20
- - Rash   вложил   Feb 13 2008, 13:30
|- - IgorKossak   Цитата(Rash @ Feb 13 2008, 15:30) вложил ...   Feb 13 2008, 13:56
- - Rash   Цитата(IgorKossak @ Feb 13 2008, 17:56) П...   Feb 13 2008, 14:03


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 12:39
Рейтинг@Mail.ru


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