|
AVR ATmega32 прерывания |
|
|
|
Jun 14 2011, 11:28
|
Группа: Новичок
Сообщений: 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 и затем произойдет переброс в прерывание?
Заранее спасибо.
|
|
|
|
|
 |
Ответов
|
Sep 21 2011, 13:20
|
Группа: Новичок
Сообщений: 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.
|
|
|
|
|
Sep 21 2011, 15:42
|

Профессионал
    
Группа: Свой
Сообщений: 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И вообще мне не понятно , что Вы делаете со стеком, зачем Вам менять его вершину в основной программе
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Sep 22 2011, 05:36
|

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

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

Профессионал
    
Группа: Свой
Сообщений: 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; Выталкиваем из стека
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Sep 22 2011, 06:23
|

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

|
QUOTE (demiurg_spb @ Sep 22 2011, 10:12)  Вы не поняли. Нет разницы Cи или асм. Нужен временный локальный буфер на 100 байт в процедуре. Ваши действия? Так . Сейчас я для себя пойму задачу: Я понял так - временный локальный буфер - срочно возникла необходимость сохранить 100 байт в области памяти , при этом заранее в .dseg он не был зарезервирован. И Вы предлагаете перенести вершину стека и просто затолкнуть туда данные? Правильно?
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Sep 22 2011, 08:02
|

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

|
Цитата(ILYAUL @ Sep 22 2011, 10:23)  Так . Сейчас я для себя пойму задачу: Я понял так - временный локальный буфер - срочно возникла необходимость сохранить 100 байт в области памяти , при этом заранее в .dseg он не был зарезервирован. И Вы предлагаете перенести вершину стека и просто затолкнуть туда данные? Правильно? Именно! Главное при выходе из процедуры отмотать стек обратно! Таким макаром достигается реентерабельность функций в противовес методу: Цитата заранее в .dseg ... зарезервирован Это конечно же не я придумал, а много-много лет назад мужики с бородами до пупа
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|