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

 
 
> 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
 
Start new topic
Ответов
ViKo
сообщение Apr 26 2012, 04:29
Сообщение #2


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

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


Знающий
****

Группа: Свой
Сообщений: 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
ViKo
сообщение Apr 26 2012, 10:50
Сообщение #4


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

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


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

Группа: Модераторы
Сообщений: 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   LPC17xx NVIC - Как заблокировать все IRQ с приоритетом ниже нужного?   Apr 25 2012, 17:07
- - _Артём_   Если не ошибаюсь, то нужно смотреть в описание Bas...   Apr 25 2012, 17:49
- - ViKo   __set_BASEPRI(0x60); // Disable interrupts with pr...   Apr 25 2012, 17:57
- - GetSmart   Это могут быть не те приоритеты. Программно раздав...   Apr 25 2012, 18:54
|- - aaarrr   Цитата(GetSmart @ Apr 25 2012, 22:54) Это...   Apr 25 2012, 19:06
|- - sysel   Цитата(GetSmart @ Apr 25 2012, 22:54) Это...   Apr 25 2012, 19:13
- - GetSmart   Ладно, допустим BASEPRI то, что мне нужно. И устан...   Apr 25 2012, 19:51
|- - aaarrr   Цитата(GetSmart @ Apr 25 2012, 23:51) А о...   Apr 25 2012, 20:07
- - KRS   есть еще полезный алиас BASEPRI_MAX запись в него ...   Apr 25 2012, 20:39
|- - KRS   Цитата(sysel @ Apr 26 2012, 13:53) На сам...   Apr 26 2012, 10:48
- - GetSmart   А для CM0 есть механизм аналогичного ограничения п...   Jul 11 2013, 09:29
|- - _Артём_   Цитата(GetSmart @ Jul 11 2013, 12:29) А д...   Jul 11 2013, 10:30
|- - GetSmart   Цитата(_Артём_ @ Jul 11 2013, 16:30) Нет ...   Jul 11 2013, 11:42
- - GetSmart   Мало того, в доке на LPC11xx (CM0) LPC81x (CM0+) о...   Jul 11 2013, 15:00
- - _Артём_   Цитата(GetSmart @ Jul 11 2013, 18:00) ...   Jul 11 2013, 16:45
- - GetSmart   Цитата(_Артём_ @ Jul 11 2013, 22:45) Прер...   Jul 11 2013, 17:44


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 12:52
Рейтинг@Mail.ru


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