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

 
 
> AVR ATmega32 прерывания
MmX12345
сообщение Jun 14 2011, 11:28
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 13-03-11
Пользователь №: 63 572



Добрый день.
Подскажите, пожалуйста, как будет вести себя микроконтроллер в вледущей ситуации:

...
+000000A8: 94F8 CLI Global Interrupt Disable - запретить прерывания
(Установка флага прерывания...)
+000000A9: BF9E OUT 0x3E,R25 Out to I/O location - запись старшего байта в указателя стека
+000000AA: BE0F OUT 0x3F,R0 Out to I/O location - восстановить SREG
+000000AB: BF8D OUT 0x3D,R24 Out to I/O location - запись младшего байта в указателя стека
...

Вопрос вот в чем. Какая будет последовательность выполнения команд.
Выполнятся ли все три инструкции до прерывания, или может быть такое, что выполнятся только 2 и затем произойдет переброс в прерывание?

Заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
element
сообщение Sep 21 2011, 13:20
Сообщение #2





Группа: Новичок
Сообщений: 8
Регистрация: 23-01-09
Пользователь №: 43 859



при доступе к CPU_SPL проц аппаратно запрещает прерывания на 4 такта, никаких CLI не нужно. и атомарность тут непричём (stack pointer не имеет никаких временных внутренних регистров, и последовательность SPL/SPH не важна).

для вашего случая достаточно так:

OUT CPU_SPL,R24
OUT CPU_SPH,R25

Читайте внимательно даташит,
раздел 3 AVR CPU, подраздел 3.8 Stack pointer:

To prevent corruption when updating the Stack Pointer from software, a write to SPL will automatically
disable interrupts for up to 4 instructions or until the next I/O memory write.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Sep 21 2011, 15:16
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(element @ Sep 21 2011, 17:20) *
Читайте внимательно даташит

Людей в заблуждение не вводите!
В этом топике речь шла о ATmega32. Вы же привели цитату из документации на xmega...
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Sep 21 2011, 15:42
Сообщение #4


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

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



QUOTE (Палыч @ Sep 21 2011, 19:16) *
Людей в заблуждение не вводите!
В этом топике речь шла о ATmega32. Вы же привели цитату из документации на xmega...

+1
to element :
Вообщем-то ,в зависимости от модели, mega требуется разное время для перехода в обработчик прерывания MEGA64 - 4 такта, Mega164P - 5
(если только не спать) , но Вы забыли на что оно тратится . В том числе ( и в первую очередь ) на запись в стек PC+1 адрес (адрес возврата в основную программу) ,а в PC - адрес перехода. При этом никаких других инструкций (комманд) не выполняется!! Если логически подумаете , то поймёте почему.
MmX12345
И вообще мне не понятно , что Вы делаете со стеком, зачем Вам менять его вершину в основной программе


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

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


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

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



Цитата(ILYAUL @ Sep 21 2011, 19:42) *
И вообще мне не понятно , что Вы делаете со стеком, зачем Вам менять его вершину в основной программе
А как по вашему стековый фрейм для локальных переменных функции организовывается? (для тех переменных что не влезли в регистры или обращение к которым происходит по указателю). Попробуйте объявить не статический локальный массив байт эдак на 10. И посмотрите что там компилятор нагенерит. А потом добавьте массиву квалификатор static и снова посмотрите.
Видите разницу и в размере программы и в скорости её выполнения?
Поэтому некоторые компиляторы (IAR и ImageCraft например) используют софтовый стек, тем самым выигрывают по накладным расходам, но проигрывают по кол-ву свободных регистров общего пользования.
И вторая мысль: иногда в особо критичных местах выгоднее объявлять статические локальные массивы, даже если они таковыми по идеологии быть не должны...


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


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

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



QUOTE (demiurg_spb @ Sep 22 2011, 09:36) *
А как по вашему стековый фрейм для локальных переменных функции организовывается? (для тех переменных что не влезли в регистры или обращение к которым происходит по указателю). Попробуйте объявить не статический локальный массив байт эдак на 10. И посмотрите что там компилятор нагенерит. А потом добавьте массиву квалификатор static и снова посмотрите.
Видите разницу и в размере программы и в скорости её выполнения?
Поэтому некоторые компиляторы (IAR и ImageCraft например) используют софтовый стек, тем самым выигрывают по накладным расходам, но проигрывают по кол-ву свободных регистров общего пользования.
И вторая мысль: иногда в особо критичных местах выгоднее объявлять статические локальные массивы, даже если они таковыми по идеологии быть не должны...

Ну это понятно для языков высокого уровня. Но здесь asm , где необходимые данные для сохоанения ты выбираешь сам. И достаточно часто , кроме SREG и регистра temp , в прерываниях сохранять в стеке ничего не нужно


CODE
ADCReady:
        in        SaveSREG,SREG; SREG; Заталкиваем в стек
        push    SaveSREG
        push    temp        
                                lds        temp,ADCH; Считывание только старшего регистра
        add        mean0,temp; Вычисление среднего
        adc        mean1,zero; Вычисление среднего
        sbr        Flags,1<<fl_ADCReady; Устанавливаем флаг готовности среднего значения ADC
        pop        temp
        pop        SaveSREG
        out        SREG,SaveSREG; Выталкиваем из стека
        reti


Хотя и это прерывание можно значительно сократить оставив только

CODE
in        SaveSREG,SREG; SREG; Заталкиваем в стек
sbr        Flags,1<<fl_ADCReady; Устанавливаем флаг ADC
out        SREG,SaveSREG; Выталкиваем из стека


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

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


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

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



Вы не поняли. Нет разницы Cи или асм.
Нужен временный локальный буфер на 100 байт в процедуре. Ваши действия?
Другой пример: нужно передать в процедуру большую структуру по значению или вернуть структуру опять-же по значению а не по указателю.
Это бывает редко нужно, но всё же встречается.


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


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

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



QUOTE (demiurg_spb @ Sep 22 2011, 10:12) *
Вы не поняли. Нет разницы Cи или асм.
Нужен временный локальный буфер на 100 байт в процедуре. Ваши действия?

Так . Сейчас я для себя пойму задачу:
Я понял так - временный локальный буфер - срочно возникла необходимость сохранить 100 байт в области памяти , при этом заранее в .dseg он не был зарезервирован. И Вы предлагаете перенести вершину стека и просто затолкнуть туда данные? Правильно?


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

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


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

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



Цитата(ILYAUL @ Sep 22 2011, 10:23) *
Так . Сейчас я для себя пойму задачу:
Я понял так - временный локальный буфер - срочно возникла необходимость сохранить 100 байт в области памяти , при этом заранее в .dseg он не был зарезервирован. И Вы предлагаете перенести вершину стека и просто затолкнуть туда данные? Правильно?

Именно! Главное при выходе из процедуры отмотать стек обратно! Таким макаром достигается реентерабельность функций в противовес методу:
Цитата
заранее в .dseg ... зарезервирован

Это конечно же не я придумал, а много-много лет назад мужики с бородами до пупаsm.gif


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- MmX12345   AVR ATmega32 прерывания   Jun 14 2011, 11:28
- - _guardianangel   Всё зависит от того что в R0. Т.е. что было в SREG...   Jun 14 2011, 12:44
- - demiurg_spb   Цитата(MmX12345 @ Jun 14 2011, 15:28) CLI...   Jun 14 2011, 18:13
||- - ILYAUL   QUOTE (demiurg_spb @ Sep 22 2011, 12:02) ...   Sep 22 2011, 09:34
||- - demiurg_spb   Цитата(ILYAUL @ Sep 22 2011, 13:34) Ничег...   Sep 22 2011, 11:26
|- - zombi   Цитата(ILYAUL @ Sep 22 2011, 09:23) срочн...   Sep 22 2011, 08:31
|- - kolobok0   Цитата(zombi @ Sep 22 2011, 12:31) ...Не ...   Sep 22 2011, 08:48
||- - zombi   Цитата(kolobok0 @ Sep 22 2011, 11:48) Ваш...   Sep 22 2011, 09:16
||- - demiurg_spb   Цитата(zombi @ Sep 22 2011, 13:16) Опять ...   Sep 22 2011, 11:01
|- - demiurg_spb   Цитата(zombi @ Sep 22 2011, 12:31) Или я ...   Sep 22 2011, 09:12
|- - zombi   Цитата(demiurg_spb @ Sep 22 2011, 12:12) ...   Sep 22 2011, 11:07
|- - demiurg_spb   Цитата(zombi @ Sep 22 2011, 15:07) Т.е. г...   Sep 22 2011, 11:21
- - MKdemiurg   Чтоб не создавать новую тему спрошу тут( всё равно...   Sep 22 2011, 07:12
|- - Палыч   Цитата(MKdemiurg @ Sep 22 2011, 11:12) Чт...   Sep 22 2011, 08:53
- - MKdemiurg   Цитата(ILYAUL @ Sep 22 2011, 12:34) MKdem...   Sep 22 2011, 10:12
|- - ILYAUL   QUOTE (MKdemiurg @ Sep 22 2011, 14:12) PC...   Sep 22 2011, 11:23
- - zombi   Цитата(demiurg_spb @ Sep 22 2011, 14:21) ...   Sep 22 2011, 12:21
- - demiurg_spb   Цитата(zombi @ Sep 22 2011, 16:21) А заче...   Sep 23 2011, 04:48
- - zombi   Цитата(demiurg_spb @ Sep 23 2011, 07:48) ...   Sep 23 2011, 15:26


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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 13:34
Рейтинг@Mail.ru


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