Перейти к содержанию
    

Здравствуйте... скажите пожалуйста почему EXTI_IMR, к примеру, называется Mask Registеr? почему регистр масок ?  о каких масках идет речь?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

34 minutes ago, Arlleex said:

Маска от слова маскировка, а не для лица которая.

можно подробнее и посерьезнее? что маскируется и для чего?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

52 minutes ago, do_not_know_Linux said:

что маскируется и для чего?

Для скрытного проникновения в расположение противника.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, do_not_know_Linux сказал:

почему регистр масок ?  о каких масках идет речь?

А о каких регистрах идёт речь вас  почему не интересует? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 hours ago, do_not_know_Linux said:

Здравствуйте... скажите пожалуйста почему EXTI_IMR, к примеру, называется Mask Registеr? почему регистр масок ?  о каких масках идет речь?

Уж назвали так назвали ))))

А вы раздел External interrupt/event controller (EXTI) целиком прочитали или только описание регистров ?

 EXTI_IMR это своего рода регистр разрешения прерываний в периферийном модуле EXTI.

Чтобы обработчик прерываний сработал, надо произвести два разрешения - в контроллере прерываний (NVIC) и в периферийном модуле. В данном случае периферийный модуль это ETXI.

В том же разделе есть картинка поясняющая. На ней показано как включены логические элементы, по которым проходит сигнал события, вызывающего прерывание.

image.thumb.png.667cebbd4e94b6902e203828f5f46ca8.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, dimka76 said:

В том же разделе есть картинка поясняющая.

так а почему регистр масок?  что на что накладывается?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30 minutes ago, do_not_know_Linux said:

что на что накладывается?

Отсутствие знаний накладывается на отсутствие желания их получить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, x893 said:

Отсутствие знаний

а у вас знание о том почему EXTI_IMR называется регистром масок видимо присутсвтует. Тогда объясните пожалуйста. Может еще кому понадобится в этом разобраться и вместо всякой ереси что вы пишите человек  действительно наткнется на содержательный пост.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

53 minutes ago, do_not_know_Linux said:

Тогда объясните пожалуйста

Красным обведено выше двумя постами.

А также

http://easyelectronics.ru/arm-uchebnyj-kurs-vneshnie-preryvaniya.html#:~:text=EXTI_IMR — Регистр масок прерываний.,После сброса там нули.

 

http://www.rotr.info/electronics/mcu/stm32f100/stm32_exti.htm

 

Надо заставлять себя читать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

42 minutes ago, x893 said:

Надо заставлять себя читать.

что ж, неважно каким способом, но вы натолкнули на ответ почему регистра EXTI_IMR называется  регистром маски я кажется понял. Спасибо вам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"Латентность" EXTI?

 

Чтобы не создавать новую тему по мелочному вопросу, решила написать в эту тему, поскольку в ее заглавии есть и название моего контроллера (STM32F103), и EXTI, на которую у меня есть жалоба 🙂.

Слово "латентность" забрала в кавычки, потому что латентностью обычно называют временную задержку между фронтом входного импульса и срабатыванием обработчика прерывания в ответ на него. Тогда как у меня несколько другая ситуация.

Расскажу по порядку. Взялась я определять, с какой предельной скоростью можно считать импульсы по прерыванию (т.е. когда на активный пин контроллера подается заданная частота/меандр, а в обработчике прерывания EXTI к какой-то переменной/счетчику прибавляется единица). Один раз в секунду (чтобы число на счетчике численно равнялось частоте в Гц) счетчик подвергается ревизии, а переменная, в которой шло накопление, занулялась. Пока частота входного меандра не превышала 16 КГц, результат счета полностью совпадал с частотой входного сигнала. Но выше частоты 16 КГц начинались потери импульсов: при частоте 18 КГц терялось около 5-ти импульсов, при 20 КГц - около сотни, и т.д. по нарастающей.

Казалось бы, этот эффект легко объясним латентностью прерывания (в ее обычном значении) и временем работы обработчика прерывания, где помимо полезной работы могут присутствовать еще и операции по сохранению и восстановлению рабочих регистров, неявно добавляемые компилятором. Но каково же было мое удивление, когда, запустив параллельно точно такой же счет по другому пину, получила всё те же 16 КГц безупречного счета на обоих! Запустила параллельно счет сразу на трех пинах - тот же самый результат: до 16 КГц безупречно, а выше начинаются потери. Как такое может быть? Ведь если потери импульсов происходят из-за "медлительности" системы прерываний на этом контроллере (72 МГЦ тактовая), то по идее прерывания по соседним пинам (EXTI1, EXTI2, EXTI3, ...) должны тормозить друг друга, но это почему-то не происходит. Более того, подав на один из трех пинов достаточно высокую частоту, чтобы счетчик "захлебнулся" (100 КГц), обнаружила что, вопреки ожиданиям, остальные два счетчика по-прежнему безупречно вели счет на частоте 16 КГц, хотя "захлебнувшийся"счетчик пропускал импульсы уже тысячами.

Конкретика: все три прерывания были организованы единообразно и имели одинаковый приоритет:

  HAL_NVIC_SetPriority(EXTI1_IRQn, 4, 0);
  HAL_NVIC_EnableIRQ(EXTI1_IRQn);

  HAL_NVIC_SetPriority(EXTI2_IRQn, 4, 0);
  HAL_NVIC_EnableIRQ(EXTI2_IRQn);

  HAL_NVIC_SetPriority(EXTI3_IRQn, 4, 0);
  HAL_NVIC_EnableIRQ(EXTI3_IRQn);

void EXTI1_IRQHandler(void)
{   counter1++;
    __HAL_GPIO_EXTI_CLEAR_IT( GPIO_PIN_1);
}

void EXTI2_IRQHandler(void)
{   counter2++;
    __HAL_GPIO_EXTI_CLEAR_IT( GPIO_PIN_2);
}

void EXTI3_IRQHandler(void)
{   counter3++;
    __HAL_GPIO_EXTI_CLEAR_IT( GPIO_PIN_3);
}

Входные меандры с заданной частотой генерировала тем же контроллером с помощью таймеров 1, 3 и 4 (здесь всё тривиально). Больше вроде бы никакой специфики у меня не было.

Моё личное впечатление - как будто после выхода из прерывания это прерывание какое-то время "отдыхает", пропуская вперед остальные два процесса. А потому его "захлеб" работе остальных двух процессов не мешает. Но ведь такого не может быть! Т.к. хорошо известно, что порой приходится добавлять в обработчик задержку (я не добавляла), чтобы он не сработал дважды.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32 минуты назад, Xenia сказал:

Как такое может быть?

Элементарно: у Cortex-Mx механизм входа/выхода из прерываний имеет кое-какие особенности для ускорения обработки запросов, следующих друг за другом: tail-chaining и late arrival. Гуглится легко, в том числе на сайте ARM:wink:

P.S. Сброс флагов запроса лучше всегда переносить в начало обработчика.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...