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

 
 
> Работа с опреативной памятью в AVR ASM
HoboTech
сообщение Jan 18 2011, 09:56
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 27-09-10
Из: Харьков
Пользователь №: 59 762



Здравствуйте, так получилось, что на C/С++ для АВРов начал писать раньше, чем на АСМе. Теперь не совсем понятно как корректно работать с переменными в SRAM.
Если на С задачу копирования адреса я решал так:
Код
unsigned char *ptr1, *ptr2;

ptr2 = ptr1;


и копирование значения (как вариант):
Код
unsigned char *ptr1, *ptr2;

*ptr2 = *ptr1;


то как такие задачи решаются на АСМе?

если написан следующий код:
Код
Tmp1:  .byte 1
Tmp2:  .byte 1

.....

lds r16,SPDR ;для примера взят регистр SPI
st Z+,r16

lds Tmp1,ZH
lds Tmp2,ZL


то что значат последние две строки кода: что я копирую значения старшего и младшего байтов регистра Z или что я копирую новый адрес ячейки памяти, на которую указывает Z после постинкремента?
Вобщем хотелось бы знать как в АСМе скопировать адрес и как скопировать значение.

Надеюсь корректно описал вопрос.
Go to the top of the page
 
+Quote Post
3 страниц V   1 2 3 >  
Start new topic
Ответов (1 - 42)
ILYAUL
сообщение Jan 18 2011, 10:38
Сообщение #2


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Код
lds Tmp1,ZH
lds Tmp2,ZL

Вы считывете в Tmp1- значение расположенное по адресу находящегося ZH и соответсвенно в Tmp2 в ZL т.е не понятно откуда

Скопировать значение mov TMP1,TMP2
Скопировать адрес MOVW X,Z


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
HoboTech
сообщение Jan 18 2011, 11:52
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 27-09-10
Из: Харьков
Пользователь №: 59 762



Цитата(ILYAUL @ Jan 18 2011, 12:38) *
Вы считывете в Tmp1- значение расположенное по адресу находящегося ZH и соответсвенно в Tmp2 в ZL т.е не понятно откуда

предполагается, что ранее в программе в Z что-то заносилось

Цитата(ILYAUL @ Jan 18 2011, 12:38) *
Скопировать значение mov TMP1,TMP2
Скопировать адрес MOVW X,Z

спасибо, буду пробовать

Вообще, наверно, проще будет описать задачу:
есть буффер из 50 элементов и в него заносятся последовательно байты; есть две байтовых переменных, в которых должна хранится high и low часть адреса следующего элемента, который будет записан (по аналогии с индексом массива в С/С++). В обработчике прерывания я заношу в буффер байт, инкрементирую регистр Z и нужно этот новый адрес записать для того, чтобы в следующем прерывании уже записывать новый элемент

реализация на С для IAR простенького кольцевого буффера:
Код
#include <ioavr.h>
#define EVER;;
#define BUFF_SIZE 50

typedef unsigned char BYTE;

BYTE Buff[BUFF_SIZE];
BYTE index;

void main()
{
     USART_Init();    //к примеру будем забирать из УСАРТа байты

     for(EVER)
    {
        
    }

#pragma vector=USART0_RXC_vect
  __interrupt void usart_rxc(void)
{
      BYTE sym;

      sym = UDR0;
      Buff[index++] = sym;
      index = index % BUFF_SIZE;
}
}

как написать подобное на АСМе?

пробовал написать следующее:
Код
...

.DSEG
USART_Index_H:  .byte 1
USART_Index_L:  .byte 1
USART_BUFF:  .byte 50

...
;инициализации и все такое
...

USART0_RXC:
  push ZH
  push ZL
  push r16

;грузим адрес нового элемента, полученный в предыдущем прерывании
  lds ZH,USART_Index_H
  lds ZL,USART_Index_L
        
  lds r16,UDR0
  st Z+,r16

;сохраняем новый адрес
  lds USART_Index_H,ZH
  lds USART_Index_L,ZL
  reti


но, полагаю, это работать не будет...

Забыл дописать
Код
...
;инициализация
lds ZH,high(USART_BUFF)
lds ZL,low(USART_BUFF)
sts USART_Index_H,ZH
sts USART_Index_L,ZL
...
;и забыл в конце прерывания дописать
pop r16
pop ZL
pop ZH


Сообщение отредактировал HoboTech - Jan 18 2011, 11:53
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jan 18 2011, 13:17
Сообщение #4


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Что бы понять до конца задачу - прерывания идут последовательно ? Т.е. 1, 2, 1, 2,1, 2 или нет 1111, 2, 11 ,2 и тд



--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
HoboTech
сообщение Jan 18 2011, 13:51
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 27-09-10
Из: Харьков
Пользователь №: 59 762



Цитата(ILYAUL @ Jan 18 2011, 15:17) *
Что бы понять до конца задачу - прерывания идут последовательно ? Т.е. 1, 2, 1, 2,1, 2 или нет 1111, 2, 11 ,2 и тд


в общем задача сводится к тому, чтобы по приходу символа в USART заносить его последовательно в буфер
прерывание одно - USART0_RXC:
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jan 18 2011, 15:02
Сообщение #6


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Код
.def R16,temp
.def R17,count
.def R4,SaveSREG
... Инициализация

.DSEG
USART_BUFF:  .byte 50

SAVE_INDEX_Z: byte 2
          SaveZL =0
          SaveZH=1


MAIN:
ldi ZH,HIGH(USART_BUFF)
ldi ZL,LOW(USART_BUFF)
ldi count,50
.........................

USART0_RXC:
         in  SaveSREG,SREG
         push SaveSREG
         push temp
                                 push ZL
                                 push ZH
                                 lds  ZL,SAVE_INDEX_Z+SaveZL
                                 lds  ZH,SAVE_INDEX_Z+SaveZH
         lds  temp,UDR0
         st   Z+,temp
         dec count
         brne END_RX
         ldi ZH,HIGH(USART_BUFF)
         ldi ZL,LOW(USART_BUFF)
         ldi count,50
END_RX:
                                 sts  SAVE_INDEX_Z+SaveZL,ZL
                                 sts  SAVE_INDEX_Z+SaveZH,ZH
                                 pop ZH
                                 pop ZL
                     pop temp
                     pop SaveSREG
                     out SREG,SAVESREG
reti


Но лучше использовать регисты X или Y вместо Z- через Z идёт обращение к памяти програм и Eeprom и он чаще используется и соответственно его надо отслеживать и при необходимости
PUSH и POP


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
HoboTech
сообщение Jan 18 2011, 15:39
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 27-09-10
Из: Харьков
Пользователь №: 59 762



Я так понял Ваш код будет работать только в случае, когда в основном теле программы не изменяется содержимое ZH и ZL.
Меня интересует именно сохранение адреса, на который указывает регистровая пара Z после постинкремента, в переменную
Если, конечно, такое возможно

Сообщение отредактировал HoboTech - Jan 18 2011, 15:40
Go to the top of the page
 
+Quote Post
Дмитрий Ветра
сообщение Jan 18 2011, 16:31
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 6-12-07
Из: Рига, Латвия
Пользователь №: 33 036



Цитата(HoboTech @ Jan 18 2011, 17:39) *
Я так понял Ваш код будет работать только в случае, когда в основном теле программы не изменяется содержимое ZH и ZL.
Меня интересует именно сохранение адреса, на который указывает регистровая пара Z после постинкремента, в переменную
Если, конечно, такое возможно

Есть два варианта:


- сохраняем в ОЗУ;
.equ ZH_save 0x0100
.equ ZL_save 0x0101

sts ZH_save,ZH
sts ZL_ save,ZL

- копируем регистровую пару;

movw r3:r2,ZH:ZL

в целом:

lds ZH, ZH_save ; восстанавливаем указатель
lds ZL, ZL_save

in r16, UDR ; записываем принятый байт
st Z+, r16

sts ZH_save, ZH ; сохраняем указатель
sts ZL_save, ZL

Сообщение отредактировал Дмитрий Ветра - Jan 18 2011, 16:34
Go to the top of the page
 
+Quote Post
HoboTech
сообщение Jan 18 2011, 17:04
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 27-09-10
Из: Харьков
Пользователь №: 59 762



Цитата(Дмитрий Ветра @ Jan 18 2011, 18:31) *
Есть два варианта:


- сохраняем в ОЗУ;
.equ ZH_save 0x0100
.equ ZL_save 0x0101

sts ZH_save,ZH
sts ZL_ save,ZL

- копируем регистровую пару;

movw r3:r2,ZH:ZL

в целом:

lds ZH, ZH_save ; восстанавливаем указатель
lds ZL, ZL_save

in r16, UDR ; записываем принятый байт
st Z+, r16

sts ZH_save, ZH ; сохраняем указатель
sts ZL_save, ZL


Спасибо, а то я разбаловался языками верхнего уровня, а на уровне "кирпичиков" топчусь как лось на одном месте sm.gif
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jan 18 2011, 17:26
Сообщение #10


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(HoboTech @ Jan 18 2011, 18:39) *
Я так понял Ваш код будет работать только в случае, когда в основном теле программы не изменяется содержимое ZH и ZL.
Меня интересует именно сохранение адреса, на который указывает регистровая пара Z после постинкремента, в переменную
Если, конечно, такое возможно

всё верно . Если Вы предполагаете изменять ZL ZH , то хотя бы напишите , что именно будет происходить в основной программе . Тогда будет понятно , каким образом сохранять Z . Толи записывать его в регистры хранения , толи в SRAM, а может будет достаточно push и pop

Я Вам переписал предыдущий пост- сохранив Вам Z для прерывания и для MAIN


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
HoboTech
сообщение Jan 21 2011, 11:19
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 27-09-10
Из: Харьков
Пользователь №: 59 762



И все таки туго что-то до меня доходит работа с адресами...
что означает следующий код:
Код
.DSEG
tmp: .byte 1

...

lds ZL,tmp

что я заношу в регистр ZL значение байта, который находился в памяти по адресу tmp или что я записываю значение младшего байта самого адреса? sad.gif
Go to the top of the page
 
+Quote Post
V_G
сообщение Jan 21 2011, 12:22
Сообщение #12


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

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Это вы байт загружаете.
Адрес - другой командой (двумя для полного адреса):

LDI ZL, low(tmp)
LDI ZH,high(tmp)

Я подобные частые действия оформляю макросами, чтобы в одну строчку было
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jan 21 2011, 13:26
Сообщение #13


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(V_G @ Jan 21 2011, 15:22) *
Это вы байт загружаете.....

...... из SRAM в регистр ( Sorry V_G) так по понятнее будет. А про макросы наверное рановато


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
V_G
сообщение Jan 21 2011, 13:50
Сообщение #14


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

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Как это в SRAM?
LDS - загрузка ИЗ SRAM в регистр (LoaD from Sram - мнемоники вполне работают)
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jan 21 2011, 14:28
Сообщение #15


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(V_G @ Jan 21 2011, 16:50) *
Как это в SRAM?
LDS - загрузка ИЗ SRAM в регистр (LoaD from Sram - мнемоники вполне работают)

Конечно , конечно - это я уже ,в конце недели зарапортовался. Поправил


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jan 22 2011, 06:06
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(HoboTech @ Jan 21 2011, 15:19) *
И все таки туго что-то до меня доходит работа с адресами...
что означает следующий код:
Код
.DSEG
tmp: .byte 1

...

lds ZL,tmp

что я заношу в регистр ZL значение байта, который находился в памяти по адресу tmp или что я записываю значение младшего байта самого адреса? sad.gif

В регистр ZL загружается содержимое ячейки памяти с адресом tmp. Если вы хотите загрузить в ZL адрес ячейки, используйте команду LDI. Все ваши проблемы возникают от того, что вы путаете различные методы адресации. В ассемблере AVR различные методы адресации определяются с помощью различных мнемоник.
Код
    ldi   r16, 5    ; Непосредственная (immediate) адресация - загрузка числа 5
    lds  r16, 5        ; Прямая (direct) адресация - загрузка в регистр r16 содержимого ячейки по адресу 5
    ld    r16, Z    ; Косвенная (indirect) адресация - загрузка в регистр r16 через указатель Z
    ld    r16, Z+     ; Автоинкрементная (post increment) адресация через указатель Z
    ld    r16, Z-      ; Автодекрементная (pre decrement) адресация через указатель Z
    ldd  r16, z+5    ;  Косвенная со смещением (inditect with displscement) адресация через указатель Z
                        ; адрес ячейки памяти определяется как сумма содержимого указателя Z и числа 5

Надеюсь, что немного прояснил ситуацию. Или нет?

Сообщение отредактировал _Bill - Jan 22 2011, 06:07
Go to the top of the page
 
+Quote Post
HoboTech
сообщение Jan 24 2011, 08:42
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 27-09-10
Из: Харьков
Пользователь №: 59 762



Про lds и ldi я понял, спасибо. Не понял что именно загружается (значение или адрес) в этих строках:
Цитата(_Bill @ Jan 22 2011, 08:06) *
ld r16, Z ; Косвенная (indirect) адресация - загрузка в регистр r16 через указатель Z
ld r16, Z+ ; Автоинкрементная (post increment) адресация через указатель Z
ld r16, Z- ; Автодекрементная (pre decrement) адресация через указатель Z
ldd r16, z+5 ; Косвенная со смещением (inditect with displscement) адресация через указатель Z
; адрес ячейки памяти определяется как сумма содержимого указателя Z и числа 5[/code]


P.S. Мануалы честно читал, но когда дошло до практической реализации - запнулся.

Сообщение отредактировал HoboTech - Jan 24 2011, 08:44
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 24 2011, 09:20
Сообщение #18


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(HoboTech @ Jan 24 2011, 12:42) *
P.S. Мануалы честно читал, но когда дошло до практической реализации - запнулся.

Вы считаете это чем-то из ряда вон, что при освоении нового материала надо приложить некоторые усилия?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 24 2011, 09:57
Сообщение #19


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(HoboTech @ Jan 24 2011, 11:42) *
Не понял что именно загружается (значение или адрес) в этих строках:

Для AVR в строках где нет никаких цифирей происходит косвенное обращение к данным (чтение или запись).
Адрес сидит внутри регистровой пары и его в коде операции не видно - поэтому такой тип адресации и называется косвенным (через индексные регистры X,Y,Z).
Смею предположить, что без такого способа адресации программирования, как мы его сегодня знаем, не существовало.
Так что изучите это очень внимательно! Основа основ как-никак:-)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jan 24 2011, 11:08
Сообщение #20


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(_Bill @ Jan 22 2011, 09:06) *
В регистр ZL загружается содержимое ячейки памяти с адресом tmp. Если вы хотите загрузить в ZL адрес ячейки, используйте команду LDI. Все ваши проблемы возникают от того, что вы путаете различные методы адресации. В ассемблере AVR различные методы адресации определяются с помощью различных мнемоник.
Код
        ld    r16, Z-    ; Автодекрементная (pre decrement) адресация через указатель Z
Просто правка  LD R16 ,-Z


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jan 24 2011, 12:35
Сообщение #21


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(HoboTech @ Jan 24 2011, 12:42) *
Про lds и ldi я понял, спасибо. Не понял что именно загружается (значение или адрес) в этих строках:


P.S. Мануалы честно читал, но когда дошло до практической реализации - запнулся.

Методы адресации - это один из трех китов, на которых держится архитектура любого процессора (AVR в том числе). Так что стоит затратить время, чтобы разобраться с адресацией. В дальнейшем эти знания скорее всего вам понадобятся. Что касается семейства AVR, то советую внимательнее почитать сей документ Система команд AVR
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jan 24 2011, 13:42
Сообщение #22


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Можно , так же открыть Ефремова . Почитать главу "Способы адресации памяти данных"


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
HoboTech
сообщение Jan 24 2011, 14:06
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 27-09-10
Из: Харьков
Пользователь №: 59 762



Спасибо за ответы. Еще почитаю, наверняка возникнут вопросы, задам их тут.
Go to the top of the page
 
+Quote Post
нечитатель
сообщение Jan 26 2011, 00:54
Сообщение #24


Местный
***

Группа: Участник
Сообщений: 235
Регистрация: 20-11-10
Пользователь №: 61 032



Не считая полезным занятием переписывание собственными словами документа "AVR Instruction Set", обратил бы внимание на:
Код
ldi XH, high(addr)
ldi XL, low(addr)
cli                                  ; !!!
ld R16, X+
ld R17, X
sei                                  ; !!!

В том смысле, что если после ld R16, X+ произойдёт прерывание - после возврата из него XH и (или?) XL испортятся. Даже если попытано их сохранять/восстановлять в процедуре обработки прерывания.

Где-то умнее излагается о, но ссылку либо название затрудняюсь.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jan 26 2011, 04:02
Сообщение #25


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(нечитатель @ Jan 26 2011, 04:54) *
Не считая полезным занятием переписывание собственными словами документа "AVR Instruction Set", обратил бы внимание на:
Код
ldi XH, high(addr)
ldi XL, low(addr)
cli                                 ; !!!
ld R16, X+
ld R17, X
sei                                 ; !!!

В том смысле, что если после ld R16, X+ произойдёт прерывание - после возврата из него XH и (или?) XL испортятся. Даже если попытано их сохранять/восстановлять в процедуре обработки прерывания.

Где-то умнее излагается о, но ссылку либо название затрудняюсь.

Это как?! 05.gif
Go to the top of the page
 
+Quote Post
V_G
сообщение Jan 26 2011, 05:01
Сообщение #26


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

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(нечитатель @ Jan 26 2011, 10:54) *
если после ld R16, X+ произойдёт прерывание - после возврата из него XH и (или?) XL испортятся. Даже если попытано их сохранять/восстановлять в процедуре обработки прерывания.

Где-то умнее излагается о, но ссылку либо название затрудняюсь.

Если бы так было, это следовало бы писать красными большими буквами 32 кегля во всех документах, а Атмел давно бы заклевали конкуренты. Так что ссылку в студию, начнем клевать...

Может, вы спутали с загрузкой 2-байтных регистров с использованием внутренних защелок и жесткими требованиями к таймингам? Это есть, и во всех pdf-ках есть отдельный параграф про работу с 16-разрядными регистрами.
Go to the top of the page
 
+Quote Post
OlegNZH
сообщение Jan 26 2011, 05:04
Сообщение #27


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 19-11-08
Пользователь №: 41 782



Цитата(нечитатель @ Jan 26 2011, 03:54) *
В том смысле, что если после ld R16, X+ произойдёт прерывание - после возврата из него XH и (или?) XL испортятся. Даже если попытано их сохранять/восстановлять в процедуре обработки прерывания.

Где-то умнее излагается о, но ссылку либо название затрудняюсь.


sm.gif ну во-первых , после ld R16, X+ прерывание не может произойти , а во-вторых-что за диверсант будет портить регистр X ?

upd.Аааааа - V_G понял откуда ноги растут... sm.gif

Цитата...
Доступ к 16-разрядным регистрам

Регистры TCNTn, OCRnA/B/C и ICRn являются 16-разрядными, поэтому, доступ к ним через 8-разр. шину данных AVR ЦПУ может быть осуществлен с помощью двух инструкций чтения или записи. У каждого 16-разр. таймера имеется свой 8-разр. регистр для временного хранения старшего байта данных. Поэтому, во время доступа к 16-разр. регистрам одного таймера используется один и тот же временный регистр...

...Не все 16-разрядные регистры используют временный регистр для копирования старшего байта. Чтение 16-разр. регистров OCRnA/B/C не связано с использованием временного регистра...

...При этом следует обратить внимание на проблему, которая связана с необходимостью выполнения двух инструкций для получения доступа к 16-разр. регистру. Если после выполнения первой инструкции доступа 16-разр. регистра происходит прерывание и в процедуре обработки прерывания также происходит обновление этого же или другого регистра, но относящегося к тому же таймеру, то по завершении обработки прерывания изменяется содержимое временного регистра и выполнение второй инструкции приведет к некорректному результату. Таким образом, когда и в основной программе и в прерываниях происходит обновление временного регистра, то в основной программе перед инициацией доступа к 16-разр. регистру необходимо запретить прерывания...
Конец Цитаты.

Сообщение отредактировал OlegNZH - Jan 26 2011, 05:44
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jan 26 2011, 05:46
Сообщение #28


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(OlegNZH @ Jan 26 2011, 09:04) *
sm.gif ну во-первых , после ld R16, X+ прерывание не может произойти , а во-вторых-что за диверсант будет портить регистр X ?

upd.Аааааа - я понял откуда ноги растут...

Ну, во-первых, прерывание может произойти когда угодно, но переход к прерыванию начинается только после выполнения текущей инструкции. Что касается доступа к 16-разрядным портам ВВ, то это совсем другая история.

Сообщение отредактировал _Bill - Jan 26 2011, 05:47
Go to the top of the page
 
+Quote Post
OlegNZH
сообщение Jan 26 2011, 06:02
Сообщение #29


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 19-11-08
Пользователь №: 41 782



Цитата(_Bill @ Jan 26 2011, 08:46) *
Ну, во-первых, прерывание может произойти когда угодно, но переход к прерыванию начинается только после выполнения текущей инструкции. Что касается доступа к 16-разрядным портам ВВ, то это совсем другая история.

Вообще-то я- про конкретную конструкцию говорил
cli ; !!!
ld R16, X+
А регистры XYZ к прерываниям никаким боком...Здесь речь может идти только о регистрах ВВ.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jan 26 2011, 06:12
Сообщение #30


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(OlegNZH @ Jan 26 2011, 10:02) *
Вообще-то я- про конкретную конструкцию говорил
cli ; !!!
ld R16, X+

На целостность выполнения инструкции ld R16, X+ запрет или разрешение прерываний никоим образом не повлияют. С таким же успехом можно использовать и такую конструкцию
Код
     sei                            ; !!!
     ld     R16, X+


Сообщение отредактировал _Bill - Jan 26 2011, 06:14
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jan 26 2011, 06:15
Сообщение #31


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(OlegNZH @ Jan 26 2011, 09:02) *
Вообще-то я- про конкретную конструкцию говорил
cli ; !!!
ld R16, X+
А регистры XYZ к прерываниям никаким боком...Здесь речь может идти только о регистрах ВВ.

А где Вы в этом коде нашли регистры ВВ?


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 26 2011, 06:53
Сообщение #32


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(нечитатель @ Jan 26 2011, 03:54) *
произойдёт прерывание - после возврата из него XH и (или?) XL испортятся. Даже если попытано их сохранять/восстановлять в процедуре обработки прерывания.

Это было 100 лет назад. До крызыса sm.gif Сейчас уже такой баги нетути.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jan 26 2011, 06:57
Сообщение #33


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(_Pasha @ Jan 26 2011, 10:53) *
Это было 100 лет назад. До крызыса sm.gif Сейчас уже такой баги нетути.

Я что-то вообще о такой баге не слышал, да и встречать не приходилось. Или я не там ходил?
Go to the top of the page
 
+Quote Post
OlegNZH
сообщение Jan 26 2011, 07:13
Сообщение #34


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 19-11-08
Пользователь №: 41 782



Bill Да причём тут целостность инструкции! Уже второй пост.Кому вы что об'ясняете? Речь шла о том, что после постинкремента - уход по прерыванию , и сколько X не пушируй , он всё равно "сломается". И было указано , что с мерами предосторожностями нужно работать только с 16-ти битными регистрами ВВ , а не с XYZ.


Цитата(нечитатель @ Jan 26 2011, 03:54) *
Не считая полезным занятием переписывание собственными словами документа "AVR Instruction Set", обратил бы внимание на:
Код
ldi XH, high(addr)
ldi XL, low(addr)
cli                                ; !!!
ld R16, X+
ld R17, X
sei                                ; !!!

В том смысле, что если после ld R16, X+ произойдёт прерывание - после возврата из него XH и (или?) XL испортятся. Даже если попытано их сохранять/восстановлять в процедуре обработки прерывания.

Где-то умнее излагается о, но ссылку либо название затрудняюсь.


Сообщение отредактировал OlegNZH - Jan 26 2011, 07:18
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jan 26 2011, 07:15
Сообщение #35


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(OlegNZH @ Jan 26 2011, 11:13) *
Bill Да причём тут целостность инструкции! Уже второй пост.Кому вы что об'ясняете? Речь шла о том, что после постинкремента - уход по прерыванию , и сколько X не пушируй , он всё равно "сломается".

Что значит "сломается"?
Go to the top of the page
 
+Quote Post
OlegNZH
сообщение Jan 26 2011, 07:44
Сообщение #36


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 19-11-08
Пользователь №: 41 782



Цитата(_Bill @ Jan 26 2011, 10:15) *
Что значит "сломается"?

Вот и я про то-же.(Вы шуток не понимаете sm.gif ) . В оригинале:
"...В том смысле, что если после ld R16, X+ произойдёт прерывание - после возврата из него XH и (или?) XL испортятся..."
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jan 26 2011, 07:49
Сообщение #37


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(OlegNZH @ Jan 26 2011, 10:13) *
Bill Речь шла о том, что после постинкремента - уход по прерыванию

Насколько понятно из Ваших слов это после этого
Код
ld R16, X+


Тогда не прокатывает вторая часть фразы-
Цитата
уход по прерыванию

Никуда он там не уйдёт , пока не выполнит
Код
ld R17, X
sei


И как же надо написать обработчик прерывания , что бы убить не только регистры XL и XH , но и найти в стеке ячейки с их даными и там их maniac.gif krapula.gif


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
OlegNZH
сообщение Jan 26 2011, 08:31
Сообщение #38


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 19-11-08
Пользователь №: 41 782



О,господи..... Вы мой пост #27 прочитайте. (и #26 V_G)

Сообщение отредактировал OlegNZH - Jan 26 2011, 08:33
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jan 26 2011, 09:51
Сообщение #39


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(OlegNZH @ Jan 26 2011, 12:31) *
О,господи..... Вы мой пост #27 прочитайте. (и #26 V_G)

Прошу прощения. Сразу не понял. Случай из жизни (немного не в тему).
Как-то, еще во время учебы в институте, стоим на перемене, разговариваем, анекдоты травим. Рассказали анекдот, все посмеялись, звонок, все вернулись в аудиторию. Идет занятие. Вдруг по середине занятия раздается громкое "Гы-гы-гы!". Мы все дружно оглядываемся и удивленно-вопросительно смотрим на гогочущего. Тот удовлетворенно - "Дошло!". После этого заржали все остальные. Естественно, преподаватель так ничего и не понял.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jan 26 2011, 13:01
Сообщение #40


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(OlegNZH @ Jan 26 2011, 11:31) *
О,господи..... Вы мой пост #27 прочитайте. (и #26 V_G)

Прочёл:
Цитата
ну во-первых , после ld R16, X+ прерывание не может произойти
На что Вам правда уже ответитли - может
К тому же эта фраза отличается от
Цитата
Речь шла о том, что после постинкремента - уход по прерыванию
на которую Вам я и ответил


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
нечитатель
сообщение Jan 26 2011, 19:52
Сообщение #41


Местный
***

Группа: Участник
Сообщений: 235
Регистрация: 20-11-10
Пользователь №: 61 032



Цитата(_Pasha @ Jan 26 2011, 09:53) *
Это было 100 лет назад. До крызыса :) Сейчас уже такой баги нетути.
С этого места заинтересовало. Бага была в чём конкретно и в какой момент перестала быть?

Популярное развлечение в плане для себя лично: забыть cli + sei вокруг её, танцевать с бубном на ровном месте.
Если не забыть - тогда и не танцевать, но после крызиса это как-то иначе теперь решать прилично мало ли вдруг.

Теоретические рассуждения читать интересно (особенно писать, наверное), а литературным языком описание так и не вспомнил я где.

---
К выступающим есть предложение не стараться делать так. Оно даже и в правилах отдельной строкой прописано.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 27 2011, 04:32
Сообщение #42


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(нечитатель @ Jan 26 2011, 23:52) *
С этого места заинтересовало. Бага была в чём конкретно и в какой момент перестала быть?

Первые эрраты на АТ90S2313 что-то подобное содержали, но это было так давно, что не помню, касалось ли это LD/ST , но LDS/STS - однозначно, типо такая конструкция
Код
sbrc  r0,0
lds   r1, ADDR

с разрешенными прерываниями, является багонеустойчивой
Go to the top of the page
 
+Quote Post
OlegNZH
сообщение Jan 27 2011, 09:19
Сообщение #43


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 19-11-08
Пользователь №: 41 782



Цитата(_Pasha @ Jan 27 2011, 07:32) *
Первые эрраты на АТ90S2313 что-то подобное содержали, но это было так давно, что не помню, касалось ли это LD/ST , но LDS/STS - однозначно, типо такая конструкция
Код
sbrc  r0,0
lds   r1, ADDR

с разрешенными прерываниями, является багонеустойчивой


Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post

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

 


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


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