|
Доступ к EEPROM в IAR, ЗАпрещены ли прерывания в программе на момент чтения EEPROM в IAR |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 24)
|
Jan 26 2006, 10:43
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Цитата(Sergio66 @ Jan 26 2006, 13:07)  Подскажите, пожалуйста, на время доступа к переменным в EEPROM IARовский компиллятор запрещает прерывания или нет??? Проблема в том, что в программе, когда работает основной ее цикл, каким то образом портится одна и та же ячейка памяти в EEPROM. При этом, программа только читает EEPROM. В том числе и данную ячейку. Нет об этом Вы должны заботиться сами: 'C' - __disable_interrupt(); __enable_interrupt(); asm - CLI; SEI
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
Jan 26 2006, 11:33
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 29-08-05
Из: С-Петербург
Пользователь №: 8 055

|
Компиллер от IAR при обращении к переменным которые втиснуты в EEPROM всавляет свои процедуры. т.е. если написать a = 5; он вызовет поппрограмку на асме которая в момент записи запретит прерывания а поосле окончания разрешит их. проверить это можно получив ассемблерный листинг своей программы ! Тоько вот забыл как компиллеру указать что переменная 'а' находится в EEPROM. Но это можно узнать почитав доку !
|
|
|
|
|
Jan 26 2006, 12:51
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 29-08-05
Из: С-Петербург
Пользователь №: 8 055

|
Дык каков размер CSTACK, сколько байт ?
|
|
|
|
|
Jan 26 2006, 13:06
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 29-08-05
Из: С-Петербург
Пользователь №: 8 055

|
Если вложенных прерываний не городили ! То такого размера должно хватить ! Кстати ! Если при чтении или записи в EEPROM не запрещать прерывания, а впрерываниях есть ещё место где есть обращение к EEPROM или FLASH то данные в EEPROM могут слететь, даже если идёт только чтение ! Ко FLASH есно по записи !
|
|
|
|
|
Jan 26 2006, 14:01
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Цитата(GxOST @ Jan 26 2006, 14:34)  Во-первых, там все учтено. По крайней мере, в версиях 4.xx. То есть, никаких дополнительных ухищрений с запрещением прерываний делать не нужно.
Во-вторых, все процедуры работы с eeprom можно поменять, подключив к проекту собственный файл, изменив тот, который лежит вот тут: \avr\src\lib\eeprom.s90
И учтите одну вещь: если будете делать как сказал BVU, огребете глюков по полной программе (особенно если есть обращение к EEPROM из обработчиков прерываний). Сколько времени работаю с 'IAR Embedded Workbench 4.10B' и никаких проблем не возникало... Незнаю, как Вы работаете с EEPROM, а я предпочитаю не мудрить и использовать чтение/запись, как к обычным переменным объявленные в EEPROM. Просто посмотрите свой ассемблерный код после компиляции и все станет ясно, что на 'автомате' запрещение и разрешение прерываний там не генерируется. А в прерываниях на которые Вы сетуете необходимо учитывать автоматическое запрещение при входе в прерывание.
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
Jan 26 2006, 14:16
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 29-08-05
Из: С-Петербург
Пользователь №: 8 055

|
"Сколько времени работаю с 'IAR Embedded Workbench 4.10B' и никаких проблем не возникало... Незнаю, как Вы работаете с EEPROM, а я предпочитаю не мудрить и использовать чтение/запись, как к обычным переменным объявленные в EEPROM. Просто посмотрите свой ассемблерный код после компиляции и все станет ясно, что на 'автомате' запрещение и разрешение прерываний там не генерируется. А в прерываниях на которые Вы сетуете необходимо учитывать автоматическое запрещение при входе в прерывание."
Да ну ! Насколько я помню аж в 2.28 ну может в 3.10 при таком способе общения с EEPROM компиллер вставляет вызов подпрограмки (встроенной) в которой он и запрещает прерывания !
|
|
|
|
|
Jan 26 2006, 15:11
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Цитата(miv @ Jan 26 2006, 17:16)  "Сколько времени работаю с 'IAR Embedded Workbench 4.10B' и никаких проблем не возникало... Незнаю, как Вы работаете с EEPROM, а я предпочитаю не мудрить и использовать чтение/запись, как к обычным переменным объявленные в EEPROM. Просто посмотрите свой ассемблерный код после компиляции и все станет ясно, что на 'автомате' запрещение и разрешение прерываний там не генерируется. А в прерываниях на которые Вы сетуете необходимо учитывать автоматическое запрещение при входе в прерывание."
Да ну ! Насколько я помню аж в 2.28 ну может в 3.10 при таком способе общения с EEPROM компиллер вставляет вызов подпрограмки (встроенной) в которой он и запрещает прерывания ! Согласен, ошибался...  нашел 'злачное место' в коде: \ ?Subroutine23: \ 00000000 94F8 CLI \ 00000002 2D07 MOV R16, R7 \ 00000004 .... LDI R20, LOW(e_pressure) \ 00000006 .... LDI R21, (e_pressure) >> 8 \ 00000008 .... RCALL __eeput8_16 \ 0000000A 9478 SEI \ 0000000C 9508 RET но как я понимаю эта процедура лишь для записи в eeprom...
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
Jan 27 2006, 07:44
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(Sergio66 @ Jan 26 2006, 17:29)  А если представить ситуацию, при которой происходит следующее: Программа читает данные из EEPROM, в случайный момент времени, когда процесс получения данных еще не закончен, возникает прерывание, в теле которого происходит также доступ к EEPROM, однако уже к другим переменным. Что в итоге???? Возможна порча данных или нет? Порча данных в самом EEPROM не возможна! А вот полученные данные могут быть не праивльными если между записью адреса в EEAR, установкой бита в EECR и чтением EEDR возникло прерывание, в которм есть чтение EEPROM, вы просто получите байт данных с другого адреса Но сами данные в EEPROM портится не должны.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|