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

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> IAR и запись в EEPROM, Вопрос по реализации записи в eeprom в IAR
Rash
сообщение Feb 13 2008, 12:48
Сообщение #31


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



Цитата(IgorKossak @ Feb 13 2008, 16:26) *
Это в Сишном файле??? Так и должно ругаться. В ассемблерном всё в порядке.

У меня такого не наблюдается.


поэтому и прошу пример. а ошибки следующие

в файле eeprom.s90 ошибка в 1-ой же строке
Код
    MODULE  ?EEPROM_8

Error[Pe077]: this declaration has no storage class or type specifier D:\...\eeprom.s90 31
Error[Pe065]: expected a ";" D:\...\eeprom.s90 31
т.е. нехватает точки запятой , значит воспринимаеться как Си а не ассемблер

в моём файле
Код
__eeprom volatile int           ee_iDelayHS    = 200;

Warning[Pe012]: parsing restarts here after previous syntax error D:\Program AVR\IAR\Kommytator_17_04_2007\InNumber.c 62
наверное из-за ошибки в eeprom.s90
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 13 2008, 13:20
Сообщение #32


Шаман
******

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



Цитата(Rash @ Feb 13 2008, 14:48) *
поэтому и прошу пример.

Приаттачте лучше в архиве свой проект, если он не секретный.
Разберусь, скажу в чём дело.
Go to the top of the page
 
+Quote Post
Rash
сообщение Feb 13 2008, 13:30
Сообщение #33


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



вложил

Сообщение отредактировал Rash - Feb 13 2008, 14:04
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 13 2008, 13:56
Сообщение #34


Шаман
******

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



Цитата(Rash @ Feb 13 2008, 15:30) *
вложил

Первое, что бросилось в глаза.
eeprom.s90 это исходный файл на асме, который нужно добавить в проект через Project->Add Files..., а не включать в Сишный файл при помощи #include
После такой манипуляции всё собралось без ошибок
Go to the top of the page
 
+Quote Post
Rash
сообщение Feb 13 2008, 14:03
Сообщение #35


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



Цитата(IgorKossak @ Feb 13 2008, 17:56) *
Первое, что бросилось в глаза.
eeprom.s90 это исходный файл на асме, который нужно добавить в проект через Project->Add Files..., а не включать в Сишный файл при помощи #include
После такой манипуляции всё собралось без ошибок


спасибо большое, теперь будем знать beer.gif
Go to the top of the page
 
+Quote Post
Baser
сообщение Feb 17 2008, 23:22
Сообщение #36


Просто 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

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

 


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


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