|
AVR ATmega32 прерывания |
|
|
|
Sep 22 2011, 09:12
|

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

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

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

|
QUOTE (demiurg_spb @ Sep 22 2011, 12:02)  Именно! Главное при выходе из процедуры отмотать стек обратно! Таким макаром достигается реентерабельность функций в противовес методу: Это конечно же не я придумал, а много-много лет назад мужики с бородами до пупа  Ничего не могу на это ответить , пока не попробую. Обычно я предполагаю или точно знаю сколько потребуется буфера. Но , конечно запомнил подход. Спасибо! MKdemiurgQUOTE Что будет если на вход внешнего прерывания( по срезу) прийдут два импульса с разницей в несколько мс( а может и меньше - прерывание от RTS - будильника ичасов) . Одно из прерываний пропадёт ? Просто непонятно .... каким образом такая ситуация может возникнуть? Часы и будильник - строго как-то привязаны к секундам , часы с мигами , да и ещё с установкой на них будильника , я пока не встречал. Считывайте с RTC статусный регистр и проверяйте флаги
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Sep 22 2011, 10:12
|
Знающий
   
Группа: Свой
Сообщений: 624
Регистрация: 15-06-10
Из: Россия
Пользователь №: 57 939

|
Цитата(ILYAUL @ Sep 22 2011, 12:34)  MKdemiurg каким образом такая ситуация может возникнуть? Часы и будильник - строго как-то привязаны к секундам , часы с мигами , да и ещё с установкой на них будильника , я пока не встречал. Считывайте с RTC статусный регистр и проверяйте флаги PCF8563 - можно запустить RTC и таймер. При совпадении будильника или конца счёта таймера - получаете прерывание. Можно активировать оба прерывания. Оба дадут спад в "0". Восстанавливается программно. Теоретически совпасть могут с точностью до миллисекунд. Если я в обработчике установку таймера сделаю... Я вот уже и подумал. Даже если прерывание "пропадёт" я просто в обработчике считаю флаги... Насколько я понял флаг прерывания обнуляется при входе в обработчик. Значит если придёт импульс во время обработки , то после выхода опять сработает прерывание... Как то так...
|
|
|
|
|
Sep 22 2011, 11:01
|

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

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

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

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

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

|
Цитата(zombi @ Sep 22 2011, 15:07)  Т.е. гланая программа перед вызовом процедуры резервирует для неё Nбайт в области стека путём уменьшения указателя. После выполнения процедуры главная программа длжна восстановить указатель. Нет не так. Не об этом говорим, а о локальном стековом фрейме функции. Цитата Это ж обычный метод передачи параметров в функцию Это другое. Цитата Что здесь нового? А где про новизну-то вообще упоминается? Скорее наоборот я подчеркнул ранее что всё это придумали ещё во времена динозавров. Цитата И причем здесь прерывания? При том что на AVR8 нужно их блокировать на время модификации SPL+SPH. Какие ещё вопросы будут? Вы тему от начала меедленно перечитайте и не будет столько вопросов мимо кассы  Цитата(MKdemiurg @ Sep 22 2011, 11:12)  Чтоб не создавать новую тему спрошу тут( всё равно ТС уже давно пропал) Это зря вы так решили...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Sep 22 2011, 11: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 Установлены оба - значит считаете часы и звените.
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Sep 22 2011, 11:26
|

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

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

Гуру
     
Группа: Свой
Сообщений: 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)  Тут фишка не в том что вы знаете размер буфера наперёд, а в реентерабельности. Ваши процедуры нельзя вызывать из нескольких потоков одновременно и зачастую рекурсивно тоже... А зачем может понадобиться реентерабельность обработчика прерываний?
|
|
|
|
|
Sep 23 2011, 04:48
|

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

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

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

|
Цитата(demiurg_spb @ Sep 23 2011, 07:48)  Хороший вопрос! Я ждал его! (С) из х/ф "День радио" Цитата(demiurg_spb @ Sep 23 2011, 07:48)  Обычно не зачем, но варианты возможны. Например одна и та же функция вызывается и в фоне и в обработчике, являясь по сути его телом. Ага, теперь понятно. Т.о. вызываемая процедура "наглым образом" производит самозахват памяти в области стека, пользует её как хочет а перед выходом (вволю наигавшись) освобождает. Жаль что у меня нет задач чтоб это использовать. Цитата(demiurg_spb @ Sep 23 2011, 07:48)   PS: Я где-то говорил о реентерабельность обработчика прерываний? Нигде, мне просто было интересно Ваше мнение.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|