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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> AVR ATmega32 прерывания
demiurg_spb
сообщение Sep 22 2011, 09:12
Сообщение #16


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

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



Цитата(zombi @ Sep 22 2011, 12:31) *
Или я что то не догоняю?
Не знаю чего вы не догоняете.
Но чтобы не делать 100 раз push и потом 100 pop, ручками сдвигаем вершину стека (резервируя без инициализации на стеке N байт), что гораздо эффективнее со всех сторон.
Потом используем этот участок памяти как нам заблагорассудится. Действительно просто.


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


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(kolobok0 @ Sep 22 2011, 11:48) *
Ваш апоннент говорит о чистке стэка вызывающей программой.

Опять не понял. Где конкретно об этом говорится?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Sep 22 2011, 09:34
Сообщение #18


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

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



QUOTE (demiurg_spb @ Sep 22 2011, 12:02) *
Именно! Главное при выходе из процедуры отмотать стек обратно! Таким макаром достигается реентерабельность функций в противовес методу:
Это конечно же не я придумал, а много-много лет назад мужики с бородами до пупаsm.gif

Ничего не могу на это ответить , пока не попробую. Обычно я предполагаю или точно знаю сколько потребуется буфера. Но , конечно запомнил подход. Спасибо!

MKdemiurg
QUOTE
Что будет если на вход внешнего прерывания( по срезу) прийдут два импульса с разницей в несколько мс( а может и меньше - прерывание от RTS - будильника ичасов) . Одно из прерываний пропадёт ?
Просто непонятно ....

каким образом такая ситуация может возникнуть? Часы и будильник - строго как-то привязаны к секундам , часы с мигами , да и ещё с установкой на них будильника , я пока не встречал.
Считывайте с RTC статусный регистр и проверяйте флаги


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

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


Знающий
****

Группа: Свой
Сообщений: 624
Регистрация: 15-06-10
Из: Россия
Пользователь №: 57 939



Цитата(ILYAUL @ Sep 22 2011, 12:34) *
MKdemiurg

каким образом такая ситуация может возникнуть? Часы и будильник - строго как-то привязаны к секундам , часы с мигами , да и ещё с установкой на них будильника , я пока не встречал.
Считывайте с RTC статусный регистр и проверяйте флаги


PCF8563 - можно запустить RTC и таймер. При совпадении будильника или конца счёта таймера - получаете прерывание. Можно активировать оба прерывания. Оба дадут спад в "0". Восстанавливается программно. Теоретически совпасть могут с точностью до миллисекунд. Если я в обработчике установку таймера сделаю...

Я вот уже и подумал. Даже если прерывание "пропадёт" я просто в обработчике считаю флаги... Насколько я понял флаг прерывания обнуляется при входе в обработчик. Значит если придёт импульс во время обработки , то после выхода опять сработает прерывание... Как то так...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 22 2011, 11:01
Сообщение #20


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

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



Цитата(zombi @ Sep 22 2011, 13:16) *
Опять не понял. Где конкретно об этом говорится?
Нигде. Он видимо попутал.
Выделение и освобождение памяти на стеке-ли, на куче-ли происходит в нормальной ситуации ИМХО в одном контексте.
Касаемо стека:
в случае передачи/возвращения структур - снаружи (call-ret),
в случае локального временного буфера - внутри (call-ret).


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


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(demiurg_spb @ Sep 22 2011, 12:12) *
Не знаю чего вы не догоняете.
Но чтобы не делать 100 раз push и потом 100 pop, ручками сдвигаем вершину стека (резервируя без инициализации на стеке N байт), что гораздо эффективнее со всех сторон.
Потом используем этот участок памяти как нам заблагорассудится. Действительно просто.

Т.е. гланая программа перед вызовом процедуры резервирует для неё Nбайт в области стека путём уменьшения указателя.
После выполнения процедуры главная программа длжна восстановить указатель.

Это ж обычный метод передачи параметров в функцию.
Что здесь нового?
И причем здесь прерывания?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 22 2011, 11:21
Сообщение #22


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

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



Цитата(zombi @ Sep 22 2011, 15:07) *
Т.е. гланая программа перед вызовом процедуры резервирует для неё Nбайт в области стека путём уменьшения указателя.
После выполнения процедуры главная программа длжна восстановить указатель.
Нет не так. Не об этом говорим, а о локальном стековом фрейме функции.
Цитата
Это ж обычный метод передачи параметров в функцию
Это другое.
Цитата
Что здесь нового?
А где про новизну-то вообще упоминается? Скорее наоборот я подчеркнул ранее что всё это придумали ещё во времена динозавров.
Цитата
И причем здесь прерывания?
При том что на AVR8 нужно их блокировать на время модификации SPL+SPH.
Какие ещё вопросы будут? Вы тему от начала меедленно перечитайте и не будет столько вопросов мимо кассыsad.gif

Цитата(MKdemiurg @ Sep 22 2011, 11:12) *
Чтоб не создавать новую тему спрошу тут( всё равно ТС уже давно пропал)
Это зря вы так решили...


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


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

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



QUOTE (MKdemiurg @ Sep 22 2011, 14:12) *
PCF8563 - можно запустить RTC и таймер. При совпадении будильника или конца счёта таймера - получаете прерывание. Можно активировать оба прерывания. Оба дадут спад в "0". Восстанавливается программно. Теоретически совпасть могут с точностью до миллисекунд. Если я в обработчике установку таймера сделаю...

Я вот уже и подумал. Даже если прерывание "пропадёт" я просто в обработчике считаю флаги... Насколько я понял флаг прерывания обнуляется при входе в обработчик. Значит если придёт импульс во время обработки , то после выхода опять сработает прерывание... Как то так...

Обнуляется флаг Вашего прерывания (MCU) а , данные которые Вы считаете с RTC - останутся до тех пор пока сами не обнулите.
Да сработает , если Вы успеете сбросить предыдущее в самой микросхеме , на это у Вас есть секунда т.к если Вы установили , что пришло время прочитать часы , а флага будильника нет , то он может появится только спустя секунду.
Вот Ваши биты :
QUOTE
Table 9 . Value descriptions for bits AF and TF

Установлены оба - значит считаете часы и звените.


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

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


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

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



Цитата(ILYAUL @ Sep 22 2011, 13:34) *
Ничего не могу на это ответить , пока не попробую. Обычно я предполагаю или точно знаю сколько потребуется буфера.
Тут фишка не в том что вы знаете размер буфера наперёд, а в реентерабельности.
Ваши процедуры нельзя вызывать из нескольких потоков одновременно и зачастую рекурсивно тоже...
Цитата
Но , конечно запомнил подход. Спасибо!
Всегда пожалуйста!


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


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(demiurg_spb @ Sep 22 2011, 14:21) *
Нет не так. Не об этом говорим, а о локальном стековом фрейме функции.

Ну так я об этом и думал но мне пишут:
Цитата(kolobok0 @ Sep 22 2011, 11:48) *
Ваш апоннент говорит о чистке стэка вызывающей программой.



Цитата(demiurg_spb @ Sep 22 2011, 14:26) *
Тут фишка не в том что вы знаете размер буфера наперёд, а в реентерабельности.
Ваши процедуры нельзя вызывать из нескольких потоков одновременно и зачастую рекурсивно тоже...

А зачем может понадобиться реентерабельность обработчика прерываний?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 23 2011, 04:48
Сообщение #26


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

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



Цитата(zombi @ Sep 22 2011, 16:21) *
А зачем может понадобиться реентерабельность обработчика прерываний?
Хороший вопрос! Я ждал его! (С) из х/ф "День радио"
Обычно не зачем, но варианты возможны. Например одна и та же функция вызывается и в фоне и в обработчике, являясь по сути его телом.
sad.gif PS: Я где-то говорил о реентерабельность обработчика прерываний?


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


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(demiurg_spb @ Sep 23 2011, 07:48) *
Хороший вопрос! Я ждал его! (С) из х/ф "День радио"

biggrin.gif biggrin.gif biggrin.gif
Цитата(demiurg_spb @ Sep 23 2011, 07:48) *
Обычно не зачем, но варианты возможны. Например одна и та же функция вызывается и в фоне и в обработчике, являясь по сути его телом.

Ага, теперь понятно.
Т.о. вызываемая процедура "наглым образом" производит самозахват памяти в области стека, пользует её как хочет а перед выходом (вволю наигавшись) освобождает.
Жаль что у меня нет задач чтоб это использовать.

Цитата(demiurg_spb @ Sep 23 2011, 07:48) *
sad.gif PS: Я где-то говорил о реентерабельность обработчика прерываний?

Нигде, мне просто было интересно Ваше мнение.
Go to the top of the page
 
+Quote Post

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

 


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


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