cz_nikita 0 2 декабря, 2008 Опубликовано 2 декабря, 2008 · Жалоба Как запрерить прерывания в STM32F10x? Ну, и как разрешить прерывания в STM32F10x? Нужно, для выполнения атомарной операции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ssergy 0 2 декабря, 2008 Опубликовано 2 декабря, 2008 · Жалоба В Кейле есть инструкции: __disable_fiq(); __disable_irq(); __enable_fiq(); __enable_irq(); и их ASM варианты. Иногда полезно использовать SWI режим. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 2 декабря, 2008 Опубликовано 2 декабря, 2008 · Жалоба save_sr: mrs r0, PRIMASK cpsid I bx lr restore_sr: msr PRIMASK, r0 bx lr Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iShustov 0 3 декабря, 2008 Опубликовано 3 декабря, 2008 · Жалоба В Кейле есть инструкции: __disable_fiq(); __disable_irq(); __enable_fiq(); __enable_irq(); и их ASM варианты. Иногда полезно использовать SWI режим. Учите матчасть, в кортексе нет ни fiq, ни swi Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 1 29 декабря, 2008 Опубликовано 29 декабря, 2008 · Жалоба Учите матчасть, в кортексе нет ни fiq, ни swi Однако эти инструкции: __disable_fiq(); __disable_irq(); __enable_fiq(); __enable_irq(); с таким-же успехом применяются для управления прерываниями и в кортексе. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 29 декабря, 2008 Опубликовано 29 декабря, 2008 · Жалоба Как запрерить прерывания в STM32F10x? Ну, и как разрешить прерывания в STM32F10x? В примерах использования библиотек есть макросы ENTR_CRT_SECTION() и EXT_CRT_SECTION(). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 1 30 декабря, 2008 Опубликовано 30 декабря, 2008 · Жалоба В примерах использования библиотек есть макросы ENTR_CRT_SECTION() и EXT_CRT_SECTION(). А можно подробнее - в каких библиотеках и где? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость MALLOY2 30 декабря, 2008 Опубликовано 30 декабря, 2008 · Жалоба Разрешение прерываний : asm("CPSIE i"); Запрещение прерываний: asm("CPSID i"); Если компилятор IAR подлючаем "intrinsics.h " и юзаем функции __disable_interrupt(void); __enable_interrupt(void); unsigned long __get_PRIMASK( void ); void __set_PRIMASK( unsigned long ); unsigned long __get_FAULTMASK( void ); void __set_FAULTMASK(unsigned long); unsigned long __get_BASEPRI( void ); void __set_BASEPRI( unsigned long ); Если программа работает без операционки то атомарность нужно соблюдать относительно 1 какогото прерывания и лучше его запрещать/разрешать в NVIC. inline void EntrCritSection(void) { if(CriticalSecCntr == 0) { asm("CPSID i"); } // avoid lost of one count in case of simultaneously calling from both places ++CriticalSecCntr; } inline void ExtCritSection(void) { if(--CriticalSecCntr == 0) { asm("CPSIE i"); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 30 декабря, 2008 Опубликовано 30 декабря, 2008 · Жалоба scmRTOS содержит прекрасный класс-обертку на С++, реализующий вход/выход в/из критической секции. То, что выше приведено, это не критическая секция, а просто запрет/разрешение прерываний. Кардинальное отличие - при входе в критическую секцию вы запоминаете текущее состояние прерываний, запрещаете прерывания, а при выходе - восстанавливаете исходное состояние, которое изначально может быть и "запрещено". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 30 декабря, 2008 Опубликовано 30 декабря, 2008 · Жалоба А можно подробнее - в каких библиотеках и где? Да, я ошибся по памяти, почему-то подумал, что в библиотеках от STM32, но это в файле arm_comm.h от IAR. " ** Common definition for IAR EW ARM ..." Определения, приведенные MALLOY2, оттуда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость MALLOY2 30 декабря, 2008 Опубликовано 30 декабря, 2008 · Жалоба scmRTOS содержит прекрасный класс-обертку на С++, реализующий вход/выход в/из критической секции. То, что выше приведено, это не критическая секция, а просто запрет/разрешение прерываний. Кардинальное отличие - при входе в критическую секцию вы запоминаете текущее состояние прерываний, запрещаете прерывания, а при выходе - восстанавливаете исходное состояние, которое изначально может быть и "запрещено". Если запрещены прерывания тогда зачем критическая секция ? ведь программу нично прервать не может ? Если используется операционка то там они всегда разрешены, и достаточно счетчика как в выше приведенном примере... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 30 декабря, 2008 Опубликовано 30 декабря, 2008 · Жалоба Если запрещены прерывания тогда зачем критическая секция ? ведь программу нично прервать не может ? Если используется операционка то там они всегда разрешены, и достаточно счетчика как в выше приведенном примере... Если прерывания глобально запрещены (т.е. не используются), то и критическая секция,естественно, не нужна. А если у вас используются, например, вложенные прерывания? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 31 декабря, 2008 Опубликовано 31 декабря, 2008 · Жалоба ...А если у вас используются, например, вложенные прерывания? А объясните плз, что за неатомарные операции в 32-разрядном контроллере? Это еще нужно извратиться, чтобы проблема возникла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex B._ 0 31 декабря, 2008 Опубликовано 31 декабря, 2008 · Жалоба А объясните плз, что за неатомарные операции в 32-разрядном контроллере? Это еще нужно извратиться, чтобы проблема возникла. При чем тут 32-бита? А не атомарные - любое чтение-модификация-запись. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 31 декабря, 2008 Опубликовано 31 декабря, 2008 · Жалоба При чем тут 32-бита? А не атомарные - любое чтение-модификация-запись. Да не любое. Банальная передача флага от одного "процесса" другому не требует атомарности. Ну опросит второй процесс флаг после чтения переменной из памяти первым процессом ? - ничего не изменится. А вот инкремент переменной - требует. Поэтому разрядность влияет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться