Перейти к содержанию
    

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

Друзья, пока не дописал в 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);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

также надо чтобы была строчка 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);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...