Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Разместить мнемонику по заданному адресу?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
a9d
Мне нужно отключить гобальные прерывания сразу после срабатывания прерывания. MCU 8051

Если написать в самом начале обработчика EA=0, то после сборки я вижу, что сначала в программный стек сохраняются регистры а уже потом выполняется EA=0. Т.е. есть риск вытеснения.

На каждый вектор выделяется по 8байт. Я подумал, что можно сделать конструкцию вида
clr EA
jmp Interrupt

Но я могу двигать только "jmp Interrupt" и все. Компилятор не разрешает вносить изменения в секцию INTVEC.

Как выкрутиться??

Программа минимум. Это выключать прерывание первой инструкцией в обработчике.
Программа максимум. Сдвинуть jmp на обработчик и вставить сброс флага.
ReAl
А там атрибут функции monitor не складывается с interrupt ?
Он же и разрешит прерывания в самом конце.
a9d
Я пробовал. Это приводит к генерированию шапки

Код
000A31  C0 E0           PUSH  A
000A33  74 F2           MOV   A,#0xF2
000A35  12 01 DD        LCALL ?INTERRUPT_ENTER_XSP
000A38  C0 A8           PUSH  IEN0                                                 <-- соxраняем EA
000A3A  C2 AF           CLR   IEN0.7                                               <-- сбрасываем
000A3C  74 FF           MOV   A,#0xFF
000A3E  12 00 E0        LCALL ?ALLOC_XSTACK8
  OS::scmRTOS_ISRW_TYPE ISR;


Вероятность вытеснения всеравно остается.

Нашел ответ!

Код
COMMON INTVEC
        ORG WDT_VECTOR
        CLR   IEN0.7


Для всех прерывайний. А дальше делаем редефайн всех векторов на новые адреса.
_Артём_
Думаю надо копать в сторону написания обработчика прерывания на ассемблере. Должна же быть такая возможность...
На IARAVR вроде что-то такое делал.
Код
Timer_ISR:
    cli
    call Timer_ISR_C; вызов Сишного обработчика
    sei
    reti

Но у АВР нет 8 байт флеша на каждый вектор и некоторые вектора при такой конструкции уже нельзя использовать.

Тем более для схемы на программном прерывании переключения контекста тоже нужно разобраться как писать свой ассемблерный обработчик и вызывать из него Сишную функцию.
a9d
Я уже исправил. Теперь первая команда не джам а сброс флага.
С_Ч
На ассемблере это делается "на раз". Одна команда CLR EA и все прерывания запрещены. Если нужно максимально быстро запретить прерывния, то эта команда пишется в таблицу прерываний, а за ней jmp... Но тогда мы жертвуем следующим по списку прерыванием. И что бы не было непредсказуемых глюков пожертвованное прерывание надо запретить при настройке системы. А можно сначала выполнить jmp... а затем запрет прерываний. Тогда ничем жертвовать на надо, но запрет пойдет после джампа. После обработки нужно снять запрет прерывания командой SETB EA. Еще можно посмотреть и назначить приоритет прерываний. Насколько я помню, при обработке прерываний возможно прерывание только более высокого уровня. Мож и запрещать ничего не надо.
scifi
Цитата(С_Ч @ Nov 12 2012, 10:55) *
Еще можно посмотреть и назначить приоритет прерываний. Насколько я помню, при обработке прерываний возможно прерывание только более высокого уровня. Мож и запрещать ничего не надо.

+1. С этого надо было начинать. ИМХО, запрещение прерываний в обработчике никогда не сможет гарантировать отсутствие вытеснения, так как второе прерывание может произойти между первым и началом работы обработчика.
a9d
Я эту проблему решил давно.

Код
+1. С этого надо было начинать. ИМХО, запрещение прерываний в обработчике никогда не сможет гарантировать отсутствие вытеснения, так как второе прерывание может произойти между первым и началом работы обработчика.


гмм. Это как выключенные прерывания могут, что-то вытеснить?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.