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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> LPC17xx NVIC - Как заблокировать все IRQ с приоритетом ниже нужного?
GetSmart
сообщение Apr 25 2012, 17:07
Сообщение #1


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Всем привет.
Кто уже близко познакомился с этим NVIC?
Допустим я раздал всем своим прерываниям приоритеты. Некоторым даже одинаковые (нескольким уартам).
Возникла задача на короткое время запрещать все прерывания с приоритетом ниже (со значением выше...) некоторого, оставляя работать самые приоритетные. Что-то вроде имитации залёта в какое-то прерывание среднего уровня, когда блокируются прерывания с приоритетами ниже и равного текущему. Всё аналогично, но без залёта в прерывание и чисто программным путём. Да ещё так, чтобы никакая логика NVIC не сбивалась и никакие запросы не терялись, а только откладывались на попозже.

Вот. Кто подскажет?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 25 2012, 17:49
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Если не ошибаюсь, то нужно смотреть в описание Base Priority Mask Register.

Сообщение отредактировал IgorKossak - Apr 25 2012, 19:01
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 25 2012, 17:57
Сообщение #3


Универсальный солдатик
******

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



__set_BASEPRI(0x60); // Disable interrupts with priority 0x60-0xFF using CMSIS
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Apr 25 2012, 18:54
Сообщение #4


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Это могут быть не те приоритеты. Программно раздаваемые приоритеты насколько мне не изменяет память всего лишь пятибитовые.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 25 2012, 19:06
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(GetSmart @ Apr 25 2012, 22:54) *
Это могут быть не те приоритеты. Программно раздаваемые приоритеты насколько мне не изменяет память всего лишь пятибитовые.

А других нет sm.gif Разрядность приоритетов implementation defined, биты в поле задействуются от MSB вниз.
Go to the top of the page
 
+Quote Post
sysel
сообщение Apr 25 2012, 19:13
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 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", толклвая и понятным языком написана.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Apr 25 2012, 19:51
Сообщение #7


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Ладно, допустим BASEPRI то, что мне нужно. И устанавливать его нужно приоритетом, сдвинутым на 3. Хотя, довольно странно, т.к. функции из общего файла CMSIS.

А отменять фильтрацию приоритета как? Вот картинка из мануала LPC17xx, в которой написано, что запись 0 игнорируется. Если записать в BASEPRI значение 255, то 255 приоритет (255 & 0xf8 => 248) будет заблокирован. То есть это уже "криво".
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 25 2012, 20:07
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
KRS
сообщение Apr 25 2012, 20:39
Сообщение #9


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



есть еще полезный алиас
BASEPRI_MAX
запись в него позволяет только увеличить приоритет, т.е. запись значения больше чем есть BASEPRI игнорируется.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 26 2012, 04:29
Сообщение #10


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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. Сдвигов не видно.
Что это, если не косяк программистов? "Моя твоя не понимай?"
Go to the top of the page
 
+Quote Post
sysel
сообщение Apr 26 2012, 09:53
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 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-ке.
Go to the top of the page
 
+Quote Post
KRS
сообщение Apr 26 2012, 10:48
Сообщение #12


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(sysel @ Apr 26 2012, 13:53) *
На самом деле в ядре Cortex-M3 всё логично получается, просто небольшая путанка в CMSIS-ке.

поэтому лучше ее и не использовать! она скрывает некоторые особенности которые надо знать!
Причем сам CMSIS довольно низкий уровень и использовать на этом уровне непонятно чей код....



Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 26 2012, 10:50
Сообщение #13


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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 и ниже.

Поддерживаю предыдущего выступающего - использовать только заголовочный файл с описаниями регистров и битов, остальное писать самостоятельно, поглядывая на библиотеку (в крайнем случае, при затыках).
Go to the top of the page
 
+Quote Post
KRS
сообщение Apr 26 2012, 11:06
Сообщение #14


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(ViKo @ Apr 26 2012, 14:50) *
поглядывая на библиотеку (в крайнем случае, при затыках).

поглядывать полезно, потому что некоторые вещи в документации не сразу понятны! Но код смотреть стоит IMHO исключительно совместно с доками от ARM (DDI0403 arm architecture v7m reference manual и DDI0337 cortex m3 trm)
получается что эту библиотеку можно рассматривать как пример, и разобравшись написать свои функции более высокого уровня и с нормальными именами sm.gif


Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 11 2013, 09:29
Сообщение #15


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



А для CM0 есть механизм аналогичного ограничения приоритетов?

В файле CMSIS для CM0 нет упоминания Base Priority Mask Register.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 5th July 2025 - 04:03
Рейтинг@Mail.ru


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