|
LPC17xx NVIC - Как заблокировать все IRQ с приоритетом ниже нужного? |
|
|
|
Apr 25 2012, 19:13
|

Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 3-07-07
Пользователь №: 28 852

|
Цитата(GetSmart @ Apr 25 2012, 22:54)  Это могут быть не те приоритеты. Программно раздаваемые приоритеты насколько мне не изменяет память всего лишь пятибитовые. В Cortex-M3 могут быть реализованы 3 - 8 бит (старших) приоритетов (в зависимости от производителя). В LPC17xx производителем реализованы 5 бит (старших). Т.е. когда Вы задаёте приоритет "NVIC_SetPriority (SPI_IRQHandler, 3)", в регистр приоритета прерывания SPI записывается значение "3 << (8-5)", т.е. 0x18. (см. реализацию NVIC_SetPriority в файте core_cm3.h). А когда Вы пишите в регистр BASEPRI, нужно самому делать эти "3 << (8-5)". Т.е. чтобы запретить прерывания приоритетом ниже или равным 3, нужно вызвать __set_BASEPRI(0x18). Советую прочесть книжку "The definitive guide to the ARM CORTEX-M3 second editition", толклвая и понятным языком написана.
|
|
|
|
|
Apr 25 2012, 20:07
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(GetSmart @ Apr 25 2012, 23:51)  А отменять фильтрацию приоритета как? Вот картинка из мануала LPC17xx, в которой написано, что запись 0 игнорируется. Записью нуля как раз. Лучше обратиться к первоисточнику: Цитата When this register is cleared to 0, it has no effect on the execution priority.
|
|
|
|
|
Apr 26 2012, 04:29
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Из той же книжки: BASEPRI A register of up to 8 bits (depending on the bit width implemented for priority level). It defines the masking priority level. When this is set, it disables all interrupts of the same or lower level (larger priority value). Higher priority interrupts can still be allowed. If this is set to 0, the masking function is disabled (this is the default).
Насчет сдвигов, по-моему, sysel не прав, и ничего сдвигать не нужно (потому и работает на любом процессоре, независимо от количества битов в регистрах приоритета): As with other priority-level registers, the formatting of the BASEPRI register is affected by the number of implemented priority register widths. For example, if only 3 bits are imple- mented for priority-level registers, BASEPRI can be programmed as 0x00, 0x20, 0x40 … 0xC0, and 0xE0
Посмотрел core_cm3.h на функции работы с приоритетами прерываний. Действительно, приоритеты записываются со сдвигом. Посмотрел в core_cm3.c на функции работы с BASEPRI. Сдвигов не видно. Что это, если не косяк программистов? "Моя твоя не понимай?"
|
|
|
|
|
Apr 26 2012, 09:53
|

Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 3-07-07
Пользователь №: 28 852

|
Цитата(ViKo @ Apr 26 2012, 08:29)  Насчет сдвигов, по-моему, sysel не прав, и ничего сдвигать не нужно (потому и работает на любом процессоре, независимо от количества битов в регистрах приоритета): As with other priority-level registers, the formatting of the BASEPRI register is affected by the number of implemented priority register widths. For example, if only 3 bits are imple- mented for priority-level registers, BASEPRI can be programmed as 0x00, 0x20, 0x40 … 0xC0, and 0xE0 Как раз в этом примете "0x00, 0x20, 0x40 … 0xC0, and 0xE0" и получаем 3 бита приоритета сдвинуты на 5 влево. т.е. значение "0x60" регистра BASEPRI будет соответствовать значению 0x03 в NVIC_SetPriority(). Посмотрите реализацию "NVIC_SetPriority()". Они там сдвигают аргумента на (8 - __NVIC_PRIO_BITS) влево. Из файла LPC17xx.hКод #define __NVIC_PRIO_BITS 5 /*!< Number of Bits used for Priority Levels */ Из файла core_cm3.hКод static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) { if(IRQn < 0) { SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */ else { NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */ } На самом деле в ядре Cortex-M3 всё логично получается, просто небольшая путанка в CMSIS-ке.
|
|
|
|
|
Apr 26 2012, 10:50
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(sysel @ Apr 26 2012, 12:53)  Как раз в этом примете "0x00, 0x20, 0x40 … 0xC0, and 0xE0" и получаем 3 бита приоритета сдвинуты на 5 влево. т.е. значение "0x60" регистра BASEPRI будет соответствовать значению 0x03 в NVIC_SetPriority(). ... На самом деле в ядре Cortex-M3 всё логично получается, просто небольшая путанка в CMSIS-ке. В том и путаница, что разные числа нужно задавать для задания приоритета и для маскирования. По мне логично было бы задавать приоритет 0x60 и маскировать приоритет 0x60 и ниже. Поддерживаю предыдущего выступающего - использовать только заголовочный файл с описаниями регистров и битов, остальное писать самостоятельно, поглядывая на библиотеку (в крайнем случае, при затыках).
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|