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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Прерывания
Allregia
сообщение Sep 8 2009, 04:36
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



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

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

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

     __enable_interrupt();
}
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 8 2009, 04:48
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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

Однако, это никак не влияет на приоритет данного прерывания относительно других.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Allregia
сообщение Sep 8 2009, 04:52
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



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

Пойду почитаю еще доки, если прерывания действительно запрещены в обработчике автоматически, то я напрасно переживаю.
Go to the top of the page
 
+Quote Post
VAI
сообщение Sep 8 2009, 05:06
Сообщение #4


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



А при обработке прерываний глобальные прерывания и так запрещены. А в Вашем случае, при обработке менее значимых для Вас прерываний, можно разрешить вложенные прерывания ( __enable_interrupt(); ).
Тогда, при обработке менее значимых для Вас прерываний, если придёт другое прерывание, оно обра начнет обрабатываться.
Только стек увеличте.


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
Allregia
сообщение Sep 8 2009, 06:42
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Всем спасибо.
Go to the top of the page
 
+Quote Post
Allregia
сообщение Sep 9 2009, 06:46
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Еще небольшой вопрос: я привык (по работе с другими МК), все глобальные переменные, используемые в прерывании, всегда обьявлять volatile.
Но IAR не дает обявить "volatile bool".
Или здесь это не нужно ?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 9 2009, 06:56
Сообщение #7


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Allregia @ Sep 9 2009, 10:46) *
IAR не дает обявить "volatile bool".

А bool volatile ?
Должен.
Это нужно, если необходимо.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 9 2009, 07:00
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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

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

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Sep 9 2009, 07:36
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(MrYuran @ Sep 9 2009, 09:56) *
А bool volatile ?
Должен.

А почему это должен? От того, что редактор среды его выделяет ? smile.gif
В версии 410, например, нет такого типа и нужны в нем действительно нет, компилятор совершенно свободно использует bis/bic когда нужно.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 9 2009, 07:45
Сообщение #10


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Allregia
сообщение Sep 9 2009, 14:37
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



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


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

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

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


Мы кажется, говорим здесь об одной, конкретной платформе.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 9 2009, 15:42
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Allregia @ Sep 9 2009, 16:37) *
...в программе могут быть (и часто бывают) глюки.

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

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

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Allregia
сообщение Sep 9 2009, 15:57
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(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", тут не ру.эмбеддед и не с.х.азерс.
Я ведь вопрос задал другой, и ответ на него уже есть.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 9 2009, 16:05
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Allregia @ Sep 9 2009, 17:57) *
то того что ее сделать volatile - хуже не будет

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

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

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

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

Ну оставаться в неведении это так сказать Ваши проблемы, а вот попутно, походя, дезинформировать нетвердо знающих, коих здесь немало sad.gif, нельзя.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 9 2009, 16:55
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Allregia @ Sep 9 2009, 21:57) *
Я в основном для флагов использую. А что, надо целый int для каждого флага отводить? Я привых к ОЗУ в МК относиться бережно, второй ведь по значимости ресурс после I/O, IMHO.
sizeof(bool) дает результат 1. В 8-ми битный char (байт) можно 8 флагов напихать, а в 16-и битный int - 16. Где же тут экономия? laughing.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 19:01
Рейтинг@Mail.ru


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