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

 
 
> Запрещение/разрешение прерываний, использование _BIS_SR и _BIС_SR
dimanisu
сообщение Apr 6 2010, 06:51
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 4-10-07
Пользователь №: 31 055



Здравствуйте!
Возник следующий вопрос

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

CODE

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

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



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

С уважением.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
Pavel V.
сообщение Apr 6 2010, 07:09
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 3-06-06
Пользователь №: 17 742



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


--------------------
Good News Everyone!
Go to the top of the page
 
+Quote Post
dimanisu
сообщение Apr 6 2010, 07:23
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 4-10-07
Пользователь №: 31 055



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


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

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

Просто я раньше работал с С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 и очистить его. Эта функция может использоваться только с прямо адресуемыми битовыми переменными, и неприменима к любым другим типам выражений. Эта функция реализована в виде встроенной функции. Весь генерируемый код вставляется непосредственно в месте вызова функции, вместо использования обычного вызова подпрограммы.
Go to the top of the page
 
+Quote Post
Kurt
сообщение Apr 6 2010, 09:03
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 16-06-04
Из: Россия, Уфа
Пользователь №: 31



в начале "критической секции" значение флага разрешения прерываний нужно считать и сохранить, а в конце его восстановить.
в 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
Go to the top of the page
 
+Quote Post
dimanisu
сообщение Apr 6 2010, 09:21
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 4-10-07
Пользователь №: 31 055



Kurt, спасибо за информацию. Посмотрю. Правда я пользуюсь code composer studio 4.
Go to the top of the page
 
+Quote Post

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

 


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


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