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

 
 
> Уровни приоритетов прерываний, Cortex-M3...
adnega
сообщение Nov 2 2011, 12:49
Сообщение #1


Гуру
******

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



Друзья, пока не дописал в main()

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4)

долго мучился с очередями и прерываниями.

Насколько это "не красиво"?

PS.:
CODE

FreeRTOSConfig.h:

#define configKERNEL_INTERRUPT_PRIORITY (0xF0)
#define configMAX_SYSCALL_INTERRUPT_PRIORITY (0xC0)

init-usart:

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = (uint8_t)(configKERNEL_INTERRUPT_PRIORITY >> 4);
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
1kvi1
сообщение Nov 4 2011, 11:32
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 5-12-10
Пользователь №: 61 414



Можно более подробно - про уровни приоритетов прерываний? Как правильно инициализировать?

Сделал как в примерах, но ничего не помогает...
Который день мучаюсь с прерываниями первого последовательного порта в STM32L.
Go to the top of the page
 
+Quote Post
diwil
сообщение Nov 4 2011, 19:18
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107



Цитата(1kvi1 @ Nov 4 2011, 14:32) *
Можно более подробно - про уровни приоритетов прерываний? Как правильно инициализировать?

Сделал как в примерах, но ничего не помогает...
Который день мучаюсь с прерываниями первого последовательного порта в STM32L.


значится так - для кортекса м3 -
у котрекса наименьшему число соответствует больший приоритет. Приоритеты прерываний проца ось не использует. Поэтому
если надо,чтобы прерывания использовали средства оси, то NVIC_IRQChannelPreemptionPriority должно быть больше max syscal prio оси сдвинутого на 4, ибо используются только старшие 4 бита значения. эти прерывания будут запрещаться осью.
сли не надо - то меньше. эти прерывания не будут запрещаться осью, но и средства оси они использовать не могут, иначе ось виснет (я об это спотыкался).

также надо чтобы была строчка NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4), чтобы не сильно менять определения приоритетов порта.

Например у меня определено max syscal prio как 0xb0. Таймерные прерывания не используют средств оси, а лишь запускают SPI, поэтому у него NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0a. А SPI по окончании передачи шлет сообщение из прерывания, что данные приняты. Поэтому у него приоритет == 13

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

Go to the top of the page
 
+Quote Post
Altair
сообщение Dec 7 2011, 02:47
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 71
Регистрация: 8-07-05
Из: Омск
Пользователь №: 6 644



Цитата(diwil @ Nov 4 2011, 23:18) *
также надо чтобы была строчка NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4), чтобы не сильно менять определения приоритетов порта.


Я вот так сделал:

Код
    #define AIRCR_VECTKEY_MASK    ((uint32_t)0x05FA0000)
     /* Ensure that all 4 interrupt priority bits are used as the pre-emption
     priority. */
     SCB->AIRCR = (AIRCR_VECTKEY_MASK | SCB_AIRCR_PRIGROUP_0 |SCB_AIRCR_PRIGROUP_1);


--------------------
Время не придет. Время уходит.
Go to the top of the page
 
+Quote Post

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

 


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


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