|
Прерывания |
|
|
|
Sep 8 2009, 04:36
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Если я правильно понял, приоритет прерываний в МСП фиксированный и поменять его нельзя. У меня в программе используются несколько прерываний - от вотчдога, дух таймеров, УАРТов и АЦП. Но (!) - прерывание от одного из таймеров должно быть самым приоритетным, остальные не важно, подождут. Правильно ли будет для этого в процедуре обработки прерывания этого таймера запретить глобально прерывания вообще, а при выходе разрешить? Или в этом есть "подводные камни" ? т.е.: Код #pragma vector=TIMERB0_VECTOR __interrupt void TIMERB0_interrupt(){ __disable_interrupt(); ......... тут остальной код обработчика прерывания
__enable_interrupt(); }
|
|
|
|
|
Sep 9 2009, 06:56
|

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

|
Цитата(Allregia @ Sep 9 2009, 10:46)  IAR не дает обявить "volatile bool". А bool volatile ? Должен. Это нужно, если необходимо.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Sep 9 2009, 07:00
|

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

|
Цитата(Allregia @ Sep 9 2009, 08:46)  переменные, используемые в прерывании, всегда обьявлять volatile. Все огульно? Глупость явная  Цитата Но IAR не дает обявить "volatile bool". bool это вообще отдельная песня и на большинстве платформ (не имеющих битово-адресуемой памяти)никакой пользы окромя вреда от bool нет.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 9 2009, 07:45
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 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 =)
|
|
|
|
|
Sep 9 2009, 14:37
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(zltigo @ Sep 9 2009, 10:00)  Все огульно? Глупость явная  Если переменная, используется и в прерывании и в программе, то если она не volatile, то при ее использовании в программе могут быть (и часто бывают) глюки. bool volaltile тоже не работает. Но чуть поразмыслив, я подумал что для битовых это и не нужно. Цитата bool это вообще отдельная песня и на большинстве платформ (не имеющих битово-адресуемой памяти)никакой пользы окромя вреда от bool нет. Мы кажется, говорим здесь об одной, конкретной платформе.
|
|
|
|
|
Sep 9 2009, 15:42
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Sep 9 2009, 15:57
|
Профессионал
    
Группа: Свой
Сообщений: 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", тут не ру.эмбеддед и не с.х.азерс. Я ведь вопрос задал другой, и ответ на него уже есть.
|
|
|
|
|
Sep 9 2009, 16:05
|

Гуру
     
Группа: Свой
Сообщений: 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".... Ну оставаться в неведении это так сказать Ваши проблемы, а вот попутно, походя, дезинформировать нетвердо знающих, коих здесь немало  , нельзя.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 9 2009, 19:11
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(zltigo @ Sep 9 2009, 19:05)  Будет хуже. Совершенно лишние обращения к памяти, вместо регистровой работы. Я там выше упомянул "статическую". Статическую переменную в регистрах?! Код #pragma vector= WDT_VECTOR __interrupt void WDT_interrupt(){ static int counter; Если этот счетчик будет " регистрах", пора переквалифицироваться в управдомы.... Цитата Не для этого - от volatile в описаном случае может быть только еще хуже.
Отнюдь не только это.
Посмотрите, сколько отводится bool в MSP430. Нужны флаги? Отлично, вот и описывайте отдельные биты в int и пользуйте. Привычка идет с других компиляторов  Цитата sizeof(bool) дает результат 1. В 8-ми битный char (байт) можно 8 флагов напихать, а в 16-и битный int - 16. Где же тут экономия? Это говорит только о низком качестве компилятора. Hi-Tech, к примеру, группирует битовые пеерменный в байты. Т.е. 10 битовых переменных будут занимать 2 байта а не 10. В ИАР это тоже сделать можно, но "ручками".
|
|
|
|
|
Sep 9 2009, 19:59
|

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

|
Цитата(Allregia @ Sep 9 2009, 21:11)  Я там выше упомянул "статическую". Статическую переменную в регистрах?! .... пора переквалифицироваться в управдомы.... Да, видимо да, раз нет понятия о базовых понятиях, в частности, что количество команд работы с памятью и их функциональность ограничена. Посему так или иначе при сколь-нибудь сложных действиях производится перегрузка и быстрая работа с переменной в ргегистрах. volatile этому изрядно не способствует. Цитата Привычка идет с других компиляторов  Компилятор тут ни причем - сама возможность определяется архитектурой контроллера. Полагаясь на такой "сервис" получаем жесткую платформенную зависимость - короче, как уже писал, вреда больше чем пользы.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 9 2009, 21:07
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(Dog Pawlowa @ Sep 9 2009, 23:29)  Это говорит о низком знании препроцессора. Группировка флагов в байт/слово занимает пару строчек, но обеспечивает независимость от платформы. Это говорит о невнимательности, при чтении сообщений. О том, что это "можно сделать ручками" - я писал выше. Или может надо было явно упомянуть "используя препроцессор" ?
|
|
|
|
|
Sep 10 2009, 06:25
|

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

|
Цитата(Allregia @ Sep 9 2009, 23:07)  О том, что это "можно сделать ручками" - я писал выше. Это говорит о том, что если "ручками", Вам кажется сложнее, нежели через непереносимый хайтековский typedef bit bool, то видимо, надо изучать возможности представляемые препроцессором более широко.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 10 2009, 06:43
|

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

|
Я флаги так делаю: Описываю Код 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 - почаще смотрите асм-листинг, который генерит компилятор...
--------------------
Если зайца бить, его можно и спички научить зажигать Сколько дурака не бей - умнее не будет. Зато опытнее
|
|
|
|
|
Sep 12 2009, 10:24
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Кстати о препроцессоре, хотя это немного не в тему - вот на другом форуме нашел полезное, для работы с двоичными константами: Код Можно так: #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); Может кому пригодится.
|
|
|
|
|
Sep 12 2009, 14:04
|

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

|
Цитата(Allregia @ Sep 12 2009, 15:44)  А также во всех других случаях, когда двоичное удобнее шестнадцатеричной, десятичной или восьмеричной. Только таких случаев нет, это я, как человек отдавший многие годы ASM и по неопытности раньше пользовавший всякие 'b', говорю. То, Вы привели в примере именования, это просто глупость, ибо неименованы именно биты и/или их группы. Кстати, в своей 'удобной' записи, поминая ее два раза, оба раза ошиблись  Цитата Использование: k = BIN8(0x11001010);
#define PORT0DIR BIN8(0b1001100) Вот такое само за себя говорящее 'удобство'  P.S. Использование Цитата #define byte unsigned char вместо typedef это дополнительный признак неведения, что творите.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 12 2009, 15:03
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(zltigo @ Sep 12 2009, 17:04)  Только таких случаев нет, это я, как человек отдавший многие годы ASM и по неопытности раньше пользовавший всякие 'b', говорю. То, Вы привели в примере именования, это просто глупость, ибо неименованы именно биты и/или их группы. Кстати, в своей 'удобной' записи, поминая ее два раза, оба раза ошиблись  Во 1-х, она не моя, говорил же - это подсмотрено на другом форуме. Во 2-х - да, там ошибка, х вместо b. Цитата Использование
вместо typedef это дополнительный признак неведения, что творите. См. выше. Мелкие недочеты можно и исправить.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|