Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывания
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Allregia
Если я правильно понял, приоритет прерываний в МСП фиксированный и поменять его нельзя.
У меня в программе используются несколько прерываний - от вотчдога, дух таймеров, УАРТов и АЦП.
Но (!) - прерывание от одного из таймеров должно быть самым приоритетным, остальные не важно, подождут.
Правильно ли будет для этого в процедуре обработки прерывания этого таймера запретить глобально прерывания вообще, а при выходе разрешить? Или в этом есть "подводные камни" ?

т.е.:
Код
#pragma vector=TIMERB0_VECTOR          
__interrupt void TIMERB0_interrupt(){
      __disable_interrupt();

     .........  тут остальной код обработчика прерывания

     __enable_interrupt();
}
MrYuran
Если я чего-то не путаю, вложенные прерывания по умолчанию и так запрещены.
Их можно разрешить внутри прерывания.

Однако, это никак не влияет на приоритет данного прерывания относительно других.
Allregia
Да, я не совсем правильно выразился. Интересует именно "вложенность" а не абсолютный приоритет.
Т.е. во время этого прерывания никакие другие не должны его прервать.

Пойду почитаю еще доки, если прерывания действительно запрещены в обработчике автоматически, то я напрасно переживаю.
VAI
А при обработке прерываний глобальные прерывания и так запрещены. А в Вашем случае, при обработке менее значимых для Вас прерываний, можно разрешить вложенные прерывания ( __enable_interrupt(); ).
Тогда, при обработке менее значимых для Вас прерываний, если придёт другое прерывание, оно обра начнет обрабатываться.
Только стек увеличте.
Allregia
Всем спасибо.
Allregia
Еще небольшой вопрос: я привык (по работе с другими МК), все глобальные переменные, используемые в прерывании, всегда обьявлять volatile.
Но IAR не дает обявить "volatile bool".
Или здесь это не нужно ?
MrYuran
Цитата(Allregia @ Sep 9 2009, 10:46) *
IAR не дает обявить "volatile bool".

А bool volatile ?
Должен.
Это нужно, если необходимо.
zltigo
Цитата(Allregia @ Sep 9 2009, 08:46) *
переменные, используемые в прерывании, всегда обьявлять volatile.

Все огульно? Глупость явная sad.gif
Цитата
Но IAR не дает обявить "volatile bool".

bool это вообще отдельная песня и на большинстве платформ (не имеющих битово-адресуемой памяти)никакой пользы окромя вреда от bool нет.
Dog Pawlowa
Цитата(MrYuran @ Sep 9 2009, 09:56) *
А bool volatile ?
Должен.

А почему это должен? От того, что редактор среды его выделяет ? smile.gif
В версии 410, например, нет такого типа и нужны в нем действительно нет, компилятор совершенно свободно использует bis/bic когда нужно.
MrYuran
Цитата(Dog Pawlowa @ Sep 9 2009, 11:36) *
В версии 410, например, нет такого типа и нужны в нем действительно нет, компилятор совершенно свободно использует bis/bic когда нужно.

У меня версия 3.40 и там есть такой тип, нужно только stdbool.h подключить
А там вот что:
Цитата
#ifndef __cplusplus

#define bool _Bool
#define true 1
#define false 0

#define __bool_true_false_are_defined 1
Allregia
Цитата(zltigo @ Sep 9 2009, 10:00) *
Все огульно? Глупость явная sad.gif


Если переменная, используется и в прерывании и в программе, то если она не volatile, то при ее использовании в программе могут быть (и часто бывают) глюки.

bool volaltile тоже не работает. Но чуть поразмыслив, я подумал что для битовых это и не нужно.

Цитата
bool это вообще отдельная песня и на большинстве платформ (не имеющих битово-адресуемой памяти)никакой пользы окромя вреда от bool нет.


Мы кажется, говорим здесь об одной, конкретной платформе.
zltigo
Цитата(Allregia @ Sep 9 2009, 16:37) *
...в программе могут быть (и часто бывают) глюки.

Вот, ключевое слово "глюки", его употребляют именно тогда, когда не ведают, что творят и вместо этого стучат в бубен и уповают на волшебные слова типа volatile:
Цитата
переменные, используемые в прерывании, всегда обьявлять volatile.

Ну ненужно ВСЕГДА нужно только тогда, когда действительно нужно. Не нужно, когда переменная используется исключительно в обработчике прерывания. Не поможет (а то и помешает) и тогда, когда хоть некая переменная декларирована как volatile к ней несколько раз обращаются за пределами прерывания - волшебное изменение по ходу развития алгоритма тоже не подарок - тут volatile давить и прикрываться, например, критическими секциями.
Цитата
Мы кажется, говорим здесь об одной, конкретной платформе.

Да, ну и как у MSP430 c битовоадресуемой памятью? Зачем ему bool?
Allregia
Цитата(zltigo @ Sep 9 2009, 18:42) *
Вот, ключевое слово "глюки", его употребляют именно тогда, когда не ведают, что творят и вместо этого стучат в бубен и уповают на волшебные слова типа volatile:


Помоему, отчего происходят такие глюки - совершенно очевидно.
Цитата
Ну ненужно ВСЕГДА нужно только тогда, когда действительно нужно. Не нужно, когда переменная используется исключительно в обработчике прерывания.


Да, это так - если переменная используется ТОЛЬКО в прерывании - можно и не volatile, но если она статик, то того что ее сделать volatile - хуже не будет, зато не надо будет если захочется ее в программе использовать.

Конечно если переменная не статическая и используется только в прерывании, то volaltile не нужно.

Цитата
Не поможет (а то и помешает) и тогда, когда хоть некая переменная декларирована как volatile к ней несколько раз обращаются за пределами прерывания - волшебное изменение по ходу развития алгоритма тоже не подарок


Volatile в т.ч. и для этого и придумана.

Цитата
- тут volatile давить и прикрываться, например, критическими секциями.


Критические секции - это когда и в програме и в прерывании используются многобайтные переменные (long для 16-битных, или int для 8-битных). Тоже по понятным причинам.

Цитата
Да, ну и как у MSP430 c битовоадресуемой памятью? Зачем ему bool?


Я в основном для флагов использую. А что, надо целый int для каждого флага отводить? Я привых к ОЗУ в МК относиться бережно, второй ведь по значимости ресурс после I/O, IMHO.

P.S. И плиз, не надо тут устраивать фидошного цепляния к словам, типа "всегда volaltile", тут не ру.эмбеддед и не с.х.азерс.
Я ведь вопрос задал другой, и ответ на него уже есть.
zltigo
Цитата(Allregia @ Sep 9 2009, 17:57) *
то того что ее сделать volatile - хуже не будет

Будет хуже. Совершенно лишние обращения к памяти, вместо регистровой работы.
Цитата
Volatile в т.ч. и для этого и придумана.

Не для этого - от volatile в описаном случае может быть только еще хуже.
Цитата
Критические секции - это когда и в програме и в прерывании используются многобайтные переменные (long для 16-битных, или int для 8-битных).

Отнюдь не только это.
Цитата
Я в основном для флагов использую. А что, надо целый int для каждого флага отводить?

Посмотрите, сколько отводится bool в MSP430. Нужны флаги? Отлично, вот и описывайте отдельные биты в int и пользуйте.
Цитата
P.S. И плиз, не надо тут устраивать фидошного цепляния к словам, типа "всегда volaltile"....

Ну оставаться в неведении это так сказать Ваши проблемы, а вот попутно, походя, дезинформировать нетвердо знающих, коих здесь немало sad.gif, нельзя.
rezident
Цитата(Allregia @ Sep 9 2009, 21:57) *
Я в основном для флагов использую. А что, надо целый int для каждого флага отводить? Я привых к ОЗУ в МК относиться бережно, второй ведь по значимости ресурс после I/O, IMHO.
sizeof(bool) дает результат 1. В 8-ми битный char (байт) можно 8 флагов напихать, а в 16-и битный int - 16. Где же тут экономия? laughing.gif
Allregia
Цитата(zltigo @ Sep 9 2009, 19:05) *
Будет хуже. Совершенно лишние обращения к памяти, вместо регистровой работы.


Я там выше упомянул "статическую".
Статическую переменную в регистрах?!

Код
#pragma vector= WDT_VECTOR  
__interrupt void  WDT_interrupt(){
static int counter;


Если этот счетчик будет " регистрах", пора переквалифицироваться в управдомы....

Цитата
Не для этого - от volatile в описаном случае может быть только еще хуже.

Отнюдь не только это.

Посмотрите, сколько отводится bool в MSP430. Нужны флаги? Отлично, вот и описывайте отдельные биты в int и пользуйте.


Привычка идет с других компиляторов sad.gif

Цитата
sizeof(bool) дает результат 1. В 8-ми битный char (байт) можно 8 флагов напихать, а в 16-и битный int - 16. Где же тут экономия?


Это говорит только о низком качестве компилятора.
Hi-Tech, к примеру, группирует битовые пеерменный в байты.
Т.е. 10 битовых переменных будут занимать 2 байта а не 10.
В ИАР это тоже сделать можно, но "ручками".
zltigo
Цитата(Allregia @ Sep 9 2009, 21:11) *
Я там выше упомянул "статическую".
Статическую переменную в регистрах?!
....
пора переквалифицироваться в управдомы....

Да, видимо да, раз нет понятия о базовых понятиях, в частности, что количество команд работы с памятью и их функциональность ограничена. Посему так или иначе при сколь-нибудь сложных действиях производится перегрузка и быстрая работа с переменной в ргегистрах. volatile этому изрядно не способствует.
Цитата
Привычка идет с других компиляторов sad.gif

Компилятор тут ни причем - сама возможность определяется архитектурой контроллера. Полагаясь на такой "сервис" получаем жесткую платформенную зависимость - короче, как уже писал, вреда больше чем пользы.
Dog Pawlowa
Цитата(Allregia @ Sep 9 2009, 22:11) *
Это говорит только о низком качестве компилятора.
Hi-Tech, к примеру, группирует битовые пеерменный в байты.

Это говорит о низком знании препроцессора.
Группировка флагов в байт/слово занимает пару строчек, но обеспечивает независимость от платформы.
Allregia
Цитата(Dog Pawlowa @ Sep 9 2009, 23:29) *
Это говорит о низком знании препроцессора.
Группировка флагов в байт/слово занимает пару строчек, но обеспечивает независимость от платформы.


Это говорит о невнимательности, при чтении сообщений.
О том, что это "можно сделать ручками" - я писал выше.
Или может надо было явно упомянуть "используя препроцессор" ?
zltigo
Цитата(Allregia @ Sep 9 2009, 23:07) *
О том, что это "можно сделать ручками" - я писал выше.

Это говорит о том, что если "ручками", Вам кажется сложнее, нежели через непереносимый хайтековский typedef bit bool, то видимо, надо изучать возможности представляемые препроцессором более широко.
VAI
Я флаги так делаю:
Описываю
Код
enum on_off               { OFF, ON, POH = OFF };

typedef struct              // самый первый - самым младшим битом
{ unsigned Start_motor   : 1;
  unsigned m_prtcl       : 1;
  unsigned redirect      : 1;
  unsigned enable_fuzzy0 : 1;
  unsigned enable_fuzzy1 : 1;
  unsigned enable_test_Ux: 1;
  unsigned enable_myrg   : 1;
  unsigned rst_measure   : 1;
  unsigned yes_measure   : 1;
  unsigned cls_ind       : 1;
  unsigned cursor_on     : 1;
  unsigned lcd_busy      : 1;
  unsigned power_pressed : 1;
  unsigned to_calibration: 1;
  unsigned error_print   : 1;
  unsigned debug_ind     : 1;
  unsigned debug         : 1;
  unsigned in_align      : 1;
} FLAG;

Объявляю в файле с глобальными переменными
Код
volatile FLAG flag;

Для других файлов
Код
extern volatile FLAG flag;

Примеры использования:
Код
flag.cls_ind = ON;

if ( flag.enable_fuzzy1 == OFF )
  T1_duty = 0;


2 Allregia - почаще смотрите асм-листинг, который генерит компилятор...
Dog Pawlowa
Цитата(Allregia @ Sep 10 2009, 00:07) *
Это говорит о ...

Ручки ручкам рознь, и использование препроцессора тоже бывает разным.
Allregia
Кстати о препроцессоре, хотя это немного не в тему - вот на другом форуме нашел полезное, для работы с двоичными константами:

Код
Можно так:
#define byte unsigned char

#define _bitset(bits)\
  ((byte)(\
  (bits%010)|\
  (bits/010%010)<<1|\
  (bits/0100%010)<<2|\
  (bits/01000%010)<<3|\
  (bits/010000%010)<<4|\
  (bits/0100000%010)<<5|\
  (bits/01000000%010)<<6|\
  (bits/010000000%010)<<7))

#define BIN8(bits)   _bitset(0##bits)
#define BIN16(bitsH,bitsL)  (unsigned(BIN8(bitsL)) + unsigned((BIN8(bitsH)<<8)))

Использование:
k = BIN8(0x11001010);


Может кому пригодится.
zltigo
Цитата(Allregia @ Sep 12 2009, 12:24) *
Может кому пригодится.

Такой полный мрак? Нет! Тем более, что использование неименованных констант, даже если они не бинарнообразные, само по себе верный путь к ошибкам.
Allregia
Можно использовать и как именнованные:

#define PORT0DIR BIN8(0b1001100)

smile.gif

А также во всех других случаях, когда двоичное удобнее шестнадцатеричной, десятичной или восьмеричной.
zltigo
Цитата(Allregia @ Sep 12 2009, 15:44) *
А также во всех других случаях, когда двоичное удобнее шестнадцатеричной, десятичной или восьмеричной.

Только таких случаев нет, это я, как человек отдавший многие годы ASM и по неопытности раньше пользовавший всякие 'b', говорю. То, Вы привели в примере именования, это просто глупость, ибо неименованы именно биты и/или их группы.
Кстати, в своей 'удобной' записи, поминая ее два раза, оба раза ошиблись sad.gif
Цитата
Использование:
k = BIN8(0x11001010);

#define PORT0DIR BIN8(0b1001100)

Вот такое само за себя говорящее 'удобство' smile.gif
P.S.
Использование
Цитата
#define byte unsigned char

вместо typedef это дополнительный признак неведения, что творите.
Allregia
Цитата(zltigo @ Sep 12 2009, 17:04) *
Только таких случаев нет, это я, как человек отдавший многие годы ASM и по неопытности раньше пользовавший всякие 'b', говорю. То, Вы привели в примере именования, это просто глупость, ибо неименованы именно биты и/или их группы.
Кстати, в своей 'удобной' записи, поминая ее два раза, оба раза ошиблись sad.gif


Во 1-х, она не моя, говорил же - это подсмотрено на другом форуме.
Во 2-х - да, там ошибка, х вместо b.
Цитата
Использование

вместо typedef это дополнительный признак неведения, что творите.


См. выше. Мелкие недочеты можно и исправить.
zltigo
Цитата(Allregia @ Sep 12 2009, 17:03) *
Во 1-х, она не моя, говорил же - это подсмотрено на другом форуме.
Во 2-х - да, там ошибка, х вместо b.

Я сказал ОБА раза smile.gif c 'b' - тоже неправильно sad.gif.
Allregia
Согласен, с тем макросом должно быть просто BIN8(1001100), без 0b.

0b - это в High Tech
AHTOXA
Всё больше утверждаюсь во мнении, что High Tech (да и PIC вообще) уродует мозги людям smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.