Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запрещение/разрешение прерываний
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
dimanisu
Здравствуйте!
Возник следующий вопрос

Для организаций критических секций в msp430 используются конструкции _BIС_SR и _BIS_SR. Как поведет себя программа, когда в такой критической секции будет вызвана функция тоже использующая крит секцию. Пример

CODE

_BIC_SR(GIE);
func();
// тут делаем еще чего нибудь
_BIS_SR(GIE);

void func (void)
{
_BIC_SR(GIE);
// тут делаем еще чего нибудь
_BIS_SR(GIE);
}



НЕ будут ли при выходе из этой функции разрешены прерывания (чего очень бы не хотелось)?
Это вообще нормальный подход, или нужно иначе организовывать крит секции?

С уважением.
Pavel V.
Да, при выходе из функции прерывания будут разрешены. Для чего вы используете запрет прерываний?
dimanisu
Цитата
Да, при выходе из функции прерывания будут разрешены. Для чего вы используете запрет прерываний?


Если переменные из основной программы используются и в прерываниях.

А как тогда грамотно организовать крит секцию в такой ситуации?

Просто я раньше работал с С51 и там использовал такую конструкцию:

Код
#define DISABLE_INTERRUPTS(ea_bit)    ea_bit = 1; if (!_testbit_(EA))    ea_bit = 0
#define ENABLE_INTERRUPTS(ea_bit)            if (ea_bit)    EA = 1


//вызов в программе:

bit ea_bit;

DISABLE_INTERRUPTS(ea_bit);
    func();
ENABLE_INTERRUPTS(ea_bit);


Справка:

Функция _testbit_ выполняет инструкцию процессора JBC в сгенерированном коде программы, что позволяет одновременно проверить бит b и очистить его. Эта функция может использоваться только с прямо адресуемыми битовыми переменными, и неприменима к любым другим типам выражений. Эта функция реализована в виде встроенной функции. Весь генерируемый код вставляется непосредственно в месте вызова функции, вместо использования обычного вызова подпрограммы.
Kurt
в начале "критической секции" значение флага разрешения прерываний нужно считать и сохранить, а в конце его восстановить.
в IAR есть intrinsics функции для работы с флагом.

Код
istate_t int_state = __get_interrupt_state();
__disable_interrupt();
// critical section code...
__set_interrupt_state(int_state);


или использовать спецификатор __monitor для функции (см. хелп). В этом случае генерируется оптимальный код типа
Код
  push.w SR
  dint
  nop
  ...
  pop.w SR
  reta
dimanisu
Kurt, спасибо за информацию. Посмотрю. Правда я пользуюсь code composer studio 4.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.