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

 
 
> 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
KRS
сообщение Apr 26 2012, 10:48
Сообщение #4


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

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

Сообщений в этой теме
- 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
|- - ViKo   Цитата(sysel @ Apr 26 2012, 12:53) Как ра...   Apr 26 2012, 10:50
|- - KRS   Цитата(ViKo @ Apr 26 2012, 14:50) погляды...   Apr 26 2012, 11:06
- - 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 Текстовая версия Сейчас: 25th July 2025 - 21:26
Рейтинг@Mail.ru


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