09.03.2014, 06:37
|
|
Прописка
Регистрация: 14.04.2009
Сообщений: 103
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 10 сообщении(ях)
|
Вложенность прерываний в Cortex-M
Столкнулся с такой проблемой в STM32F407.
Есть два прерывания, от DMA, редко вызывается, достаточно длительная обработка и от TIM (по переполнению), вызывается чаще, обработка быстрая.
Инициализация этих прерываний:
Код:
|
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriori ty =0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init (&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriori ty = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); |
Естественно после вызова прерывания флаг прерывания сразу сбрасывается.
Проблема вот в чем, как бы не игрался параметрами IRQChannelPreemptionPriority и IRQChannelSubPriority, прерывания идут только друг за другом, т.е. пока не обработается DMA2_Stream0_IRQn,
TIM4_IRQn не происходит, а надо, что бы и в работе DMA2_Stream0_IRQn происходили TIM4_IRQn. По описанию такое возможно, я понял, что это достигается раскидывание по группам,, на деле нет эффекта.
Как настроить вложенность прерываний? Как сделать, что бы Sys_Tick прерывания были самым приоритетным и вложенным в другие от периферии?
|
|
|
|
09.03.2014, 08:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Вложенность прерываний в Cortex-M
Ну так у тебя сейчас у обоих прерываний стоит одинаковый и максимальный приоритет = 0. Поэтому сейчас выполняются в порядке очереди расположения в таблице векторов
|
|
|
|
09.03.2014, 09:06
|
|
Прописка
Регистрация: 14.04.2009
Сообщений: 103
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 10 сообщении(ях)
|
Re: Вложенность прерываний в Cortex-M
Так я писал, что игрался значениями IRQChannelPreemptionPriority, IRQChannelSubPriority, без эффекта. Похоже чего то не хватает.
|
|
|
|
09.03.2014, 09:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Вложенность прерываний в Cortex-M
Попробуй
void NVIC_SetPriority (IRQn_t IRQn, uint32_t priority)
Это работает, с шагом 0х10
Хотя лично я предпочитаю тупо писать константы в NVIC_IPR
Так компактней получается, хотя хомячки за такое здесь заклюют
|
|
|
|
09.03.2014, 09:51
|
|
Прописка
Регистрация: 14.04.2009
Сообщений: 103
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 10 сообщении(ях)
|
Re: Вложенность прерываний в Cortex-M
Пробовал, то же самое, сейчас попробовал шаг 0х10, нет эффекта.
|
|
|
|
09.03.2014, 11:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Вложенность прерываний в Cortex-M
А если максимальные значения - 0хFF и 0х00? Тоже не работает?
|
|
|
|
09.03.2014, 13:35
|
|
Прописка
Регистрация: 14.04.2009
Сообщений: 103
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 10 сообщении(ях)
|
Re: Вложенность прерываний в Cortex-M
niXto, поставил NVIC_SetPriority (DMA2_Stream0_IRQn,0xFF);, и ЗАРАБОТАЛО!
прерывания от TIM4 стали вызываться внутри обработки от DMA!
Спасибо.
Стал пробовать разные значения от 0х01, тоже работает, странно...
Но такой фокус с Sys_Tick не прошел ((
|
|
|
|
09.03.2014, 15:28
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: Вложенность прерываний в Cortex-M
Сообщение от makser1
|
Но такой фокус с Sys_Tick не прошел ((
|
Вы фокусами занимаетесь или программированием?
Приоритет прерывания SysTick определяется другими регистрами: System Handler Priority Registers. Описаны они в мануале на ядро в пунктах посвящённых System Control Block.
Или вызывайте функцию NVIC_SetPriority с нужным для Systick параметром.
Код:
|
static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
{
if(IRQn ‹ 0) {
SCB-›SHP[_SHP_IDX(IRQn)] = (SCB-›SHP[_SHP_IDX(IRQn)] & ~(0xFF ‹‹ _BIT_SHIFT(IRQn))) |
(((priority ‹‹ (8 - __NVIC_PRIO_BITS)) & 0xFF) ‹‹ _BIT_SHIFT(IRQn)); }
else {
NVIC-›IPR[_IP_IDX(IRQn)] = (NVIC-›IPR[_IP_IDX(IRQn)] & ~(0xFF ‹‹ _BIT_SHIFT(IRQn))) |
(((priority ‹‹ (8 - __NVIC_PRIO_BITS)) & 0xFF) ‹‹ _BIT_SHIFT(IRQn)); }
} |
Видите, для системных обработчиков(IRQn‹0) свои регистры.
Последний раз редактировалось _Артём_; 09.03.2014 в 15:42.
|
|
|
|
09.03.2014, 15:58
|
|
Прописка
Регистрация: 14.04.2009
Сообщений: 103
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 10 сообщении(ях)
|
Re: Вложенность прерываний в Cortex-M
Да, странно, ведь пробовал раньше NVIC_SetPriority(), а теперь без проблем.
Код:
|
NVIC_SetPriority (SysTick_IRQn,0x00);
NVIC_SetPriority (DMA2_Stream0_IRQn,0x01); |
Зачем только инициализация
Код:
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriori ty =0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; |
если она не работает.
Последний раз редактировалось makser1; 09.03.2014 в 16:02.
|
|
|
|
09.03.2014, 17:00
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: Вложенность прерываний в Cortex-M
Сообщение от makser1
|
Да, странно, ведь пробовал раньше NVIC_SetPriority(), а теперь без проблем.
|
Бывает...
Сообщение от makser1
|
Код:
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriori ty =0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; |
если она не работает.
|
Так прямо и не работает. Что именно не работает?
Чему у вас равен регистр SCB-›AIRCR? Он отвечает за количество приоритетов.
P.S. Попробуйте вызвать прерывания программно для проверки работает ли у вас вложенность.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
ARM Cortex M3 + Linux
|
SiMiLya |
Микроконтроллеры, АЦП, память и т.д |
10 |
17.06.2011 17:20 |
ATMega & TWI в режиме прерываний
|
nerozero |
Микроконтроллеры, АЦП, память и т.д |
13 |
07.12.2010 17:24 |
Обработка прерываний UART ADuC7026
|
korel_one |
Микроконтроллеры, АЦП, память и т.д |
0 |
01.04.2010 10:44 |
Как очистить очередь прерываний в ATMega8535?
|
greafuger |
Микроконтроллеры, АЦП, память и т.д |
4 |
04.06.2008 23:03 |
Обработка прерываний.
|
Tibo |
Микроконтроллеры, АЦП, память и т.д |
12 |
13.07.2007 17:22 |
Часовой пояс GMT +4, время: 13:34.
|
|