Jump to content

    
Sign in to follow this  
adnega

Уровни приоритетов прерываний

Recommended Posts

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

 

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4)

 

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

 

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

 

PS.:

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);

Share this post


Link to post
Share on other sites

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

 

Сделал как в примерах, но ничего не помогает...

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

Share this post


Link to post
Share on other sites
Можно более подробно - про уровни приоритетов прерываний? Как правильно инициализировать?

 

Сделал как в примерах, но ничего не помогает...

Который день мучаюсь с прерываниями первого последовательного порта в 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

 

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

 

 

Share this post


Link to post
Share on other sites
также надо чтобы была строчка 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);

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this