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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> NVIC Cortex-M процов, Группы приоритетов прерываний
Golikov A.
сообщение May 7 2015, 09:49
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Всем привет!

Есть регистр Application Interrupt and Reset Control Register, в котором задается поле PRIGROUP, то есть разбитие прерываний на группы и подгруппы по приоритетам.
Вопрос нафига оно надо, чисто для удобства?

допустим у нас 16 групп и 16 подгрупп, прерывание из 5 группы, 0 уровня, 5.0 (значение в поле приоритета 0x50 = 80) имеет приоритет выше прерывания 6.0 (значение в поле приоритета 0x60 = 96). Но так и прерывание 80 имеет приоритет выше 96.

То есть разбитие на группы получается чисто для человека, удобства чтения, что ли...

Более того это поле вынесено в другие регистра, а не в группу NVIC, который вроде как является частью всех кортексов. И как я понимаю его вообще не интересуют группы, ему нужен конечный номер, да еще с числом используемых им в реализации бит или же я ошибаюсь?
в NVIC прерывание с высшим приоритетом всегда прервет текущее, а с тем же или более низким будет ждать окончание текущего, не зависимо от группы, или это не так? И прерываться будут только подгруппы? А внутри одной группы прерывания не будут друг друга прерывать?
Go to the top of the page
 
+Quote Post
Uuftc
сообщение May 7 2015, 09:56
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 3-10-04
Из: Кукуево-Дальнее
Пользователь №: 767



Цитата(Golikov A. @ May 7 2015, 12:49) *
И прерываться будут только подгруппы? А внутри одной группы прерывания не будут друг друга прерывать?

Именно так
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 7 2015, 09:59
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



А внутри группы будет запускаться первым прерывание с большим приоритетом?
А прерывания с одним приоритетом группы и подгруппы, первым запускается с меньшим номером по счету?
Так?
Go to the top of the page
 
+Quote Post
scifi
сообщение May 7 2015, 10:01
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



К примеру, у STM32 есть только 4 бита для приоритета - не разгуляешься. Так что 16 групп и 16 подгрупп - это вы оптимистично заявили. Поэтому возможность поделить эти биты на группы и подгруппы нужным образом может быть вполне полезной.

Цитата(Golikov A. @ May 7 2015, 12:59) *
А внутри группы будет запускаться первым прерывание с большим приоритетом?
А прерывания с одним приоритетом группы и подгруппы, первым запускается с меньшим номером по счету?
Так?

А мануал на что? Лень пару предложений почитать?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 7 2015, 10:07
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Я всегда работал в 0 режиме, когда все биты - это номер группы, и потому всегда считал что прерывание с меньшим номером в регистре приоритета прервет больший номер. А оказывается вытеснение происходит по группам, и внутри группы прерывания не будут друг друга вытеснять.

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

у вас талант находить ответы на их сайте.
LPC это все вообще в мануал к процу пишут. STM просто упоминает, после этого я уже понял надо искать на сайте ARM. Но я честно через поиск на сайте не фига не могу найти, я реально чаще нахожу ответы через гугл, который дает ссылку на их сайт. А через их окошко прям беда....

хотя вот сейчас думаю что дело в том что лезу через arm.com, а надо через infocentr сразу, наверное...

Спасибо за потраченное время)
Go to the top of the page
 
+Quote Post
scifi
сообщение May 7 2015, 10:12
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Golikov A. @ May 7 2015, 13:03) *
Хотя опять же не очень понятно становиться номер в подгрупе, только для определения какой из прерываний запуститься первым при одновременном их появлении...

Мануал. Ну нельзя же так неуважительно относиться к мануалописателям. Они старались, а юзвери пренебрежительно плюют в их сторону. Стыдно!
Я даже цитату приведу для тех, у кого палец не поворачивается клацнуть на ссылку:
Цитата
If multiple pending interrupts have the same group priority, the subpriority field determines the order in which they are processed.


Цитата(Golikov A. @ May 7 2015, 13:07) *
у вас талант находить ответы на их сайте.

Чтобы быстро находить ответы на вопросы, требуется некий уровень владения предметом. Знать наизусть все мануалы от корки до корки не требуется, но что-то знать всё равно надо. Гугель ещё не научился телепатии.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 7 2015, 10:12
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Мануал. Ну нельзя же так неуважительно относиться к мануалописателям. Они старались, а юзвери пренебрежительно плюют в их сторону. Стыдно!
Я даже цитату приведу для тех, у кого палец не поворачивается клацнуть на ссылку:

не то имел ввиду.
Просто пытаюсь прикинуть ситуацию когда важно что запустить 1 прерывание а не 2 в одной группе, и может ли так быть что это не решиться разносом их просто в разные группы...

Цитата
Чтобы быстро находить ответы на вопросы, требуется некий уровень владения предметом. Знать наизусть все мануалы от корки до корки не требуется, но что-то знать всё равно надо. Гугель ещё не научился телепатии.

буду через инфоцентр лазить, уже понял, спасибо...
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 7 2015, 11:00
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Golikov A. @ May 7 2015, 16:12) *
буду через инфоцентр лазить, уже понял, спасибо...

Там можно скачать документ на конкретное ядро в виде обычного pdf.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 7 2015, 12:59
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



я знаю, спасибо.
Просто искать на arm.com и infocetr.arm.com по результатам, получается по разному, не понятно почему...
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение May 8 2015, 06:45
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(Golikov A. @ May 7 2015, 13:59) *
я знаю, спасибо.

Мои 5 копеек: во всех моих программах я вызываю:

Код
void NVIC_Basic_Config(void)
{
#if defined(__TARGET_CPU_CORTEX_M3) || defined(__TARGET_CPU_CORTEX_M4)
    NVIC_SetPriorityGrouping(0x03);
#endif    
}

и получаю 16 уровней приоритетов 16-ти подгрупп.
При инициализации прерывания периферии я подгруппы не использую (всегда 0), только лишь раскидываю периферии по 16-ти приоритетам, чего, по моему мнению, более чем достаточно. По опыту хватило бы и 8-ми.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение May 8 2015, 07:08
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Golikov A. @ May 7 2015, 12:49) *
А внутри одной группы прерывания не будут друг друга прерывать?

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

Цитата(KnightIgor @ May 8 2015, 09:45) *
По опыту хватило бы и 8-ми.


Хм. Уважаю Ваш опыт.
По моему опыту хватило бы и двух-трёх.
Go to the top of the page
 
+Quote Post
adnega
сообщение May 8 2015, 07:18
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата
Внутри группы при одновременном поступлении сигналов прерывания

Одновременно прерывания наступить не могут, поэтому эту фразу нужно понимать так:
во время выполнения более приоритетного прерывания пришли запросы от нескольких менее приоритетных прерываний.

Цитата
Возможно в какой-то задаче это и может быть важным. Не знаю

Никто не запрещает взводить pending-битики в прерывании.
Установив несколько таких битиков в более приоритетном прерывании для нескольких менее приоритетных, но равных по приоритету прерываний,
за счет sub-приоритетов можно задать рекомендуемый порядок выполнения.
Например.

Кто сказал, что вытесняющие прерывания это однозначно хорошо? Раньше не работал с вытеснением - не знал головной боли с синхронизацией.
Go to the top of the page
 
+Quote Post
scifi
сообщение May 8 2015, 07:34
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(KnightIgor @ May 8 2015, 09:45) *
и получаю 16 уровней приоритетов 16-ти подгрупп.

Какой МК, если не секрет?
Я как бы намекаю, что, например, в STM32 всего 4 бита приоритета, а в LPC - вообще 3. Поэтому это ваше щедрое деление 8 бит на 4 и 4 - это возможно только в очень богатом МК.

Цитата(adnega @ May 8 2015, 10:18) *
Одновременно прерывания наступить не могут

Не прерывания, а запросы на прерывание. И не одновременно, а в пределах одного такта. Очень даже могут. Но очень редко. И на этот случай есть механизм разруливания коллизии, и он описан в мануале.
Go to the top of the page
 
+Quote Post
adnega
сообщение May 8 2015, 08:03
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(scifi @ May 8 2015, 10:34) *
И не одновременно, а в пределах одного такта. Очень даже могут. Но очень редко.

Обсуждение ведется в части целесообразности sub-приоритетов.
Есть мнение, что это лишнее. Мол, отработать в природе они не смогут, т.к. событие очень редкое - должны придти запросы в пределах одного такта.
Я же привел пример, как повысить вероятность "работы" sub-приоритетов.

Вот скажите, если приоритетное прерывание работает (PRIO-1), возникает запрос на прерывание от менее приоритетного (PRIO-2.2), а затем
через 1000 тактов возникает запрос на прерывание от другого источника с таким же низким приоритетом (PRIO-2.1).
Можно считать, что нет разницы когда возникли несколько менее приоритетных прерываний, т.к. анализировать NVIC их будет в момент окончания
более приоритетного прерывания? Кста, победит PRIO-2.1 именно за счет sub-приоритета.
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 8 2015, 08:18
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(scifi @ May 8 2015, 13:34) *
Я как бы намекаю, что, например, в STM32 всего 4 бита приоритета, а в LPC - вообще 3. Поэтому это ваше щедрое деление 8 бит на 4 и 4 - это возможно только в очень богатом МК.

Это в каком LPC, интересно? По-крайней мере для LPC17xx вроде 5 бит для задания приоритета. Параграф 34.4.2.7 UM:
The IPR0-IPR27 registers provide a 5-bit priority field for each interrupt.

Цитата(scifi @ May 8 2015, 13:34) *
Не прерывания, а запросы на прерывание. И не одновременно, а в пределах одного такта. Очень даже могут. Но очень редко. И на этот случай есть механизм разруливания коллизии, и он описан в мануале.

Зависит от архитектуры ПО. Может быть и не редко. Не обязательно даже чтобы запросы поступили в одном такте. Достаточно чтобы они поступили во время обслуживания более приоритетного прерывания.
Тогда, после его завершения, и будет использована подгруппа.
Хотя я тоже подгруппы никогда не использую: всегда выставляю PRIGROUP так, чтобы получить макс. кол-во групп.
Go to the top of the page
 
+Quote Post

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

 


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


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