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

FreeRTOS Приоритеты прерывания в Кортексах (извините, что опять)

Я прошу прощения у тех, кому это уже надоело, НО!

Я с этими прерываниями лет 10-15 назад разобрался и, вроде, все работало (версия оси - 3ххх).

Сейчас мне куб негенерил версию 10.3.1 и я опять запутался с прерываниями для кортекса.

Раньше там была путаница - у кортекса логический приоритет выше когда числовое значение меньше, а у оси - наоборот.

А что сейчас?

 

Итак конфиг:

#define configMAX_PRIORITIES                     ( 7 )

#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY   15

#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5

 

Насколько я понял первое - это приоритеты задач и к прерываниям отношения не имеет.

Второе - это типа значение прерывания ядра, таймера и т.д.

Третье - это порог, после которого ось не будет маскировать прерывание. Т.е. как я понимаю прерывания 0-4 осью маскируются, а 5 - 15 нет.

Или наоборот?

 

Так вот я сейчас в непонятках:

1. Если я, скажем в перываниях SPI использую вызовы оси, то какое число при вызове HAL_NVIC_SetPriority(SPI2_IRQn, ?, 0); вместо вопроса мне надо поставить?

Сейчас стоит 0 и я из прерывания отправляю xQueueSendFromISR(spiQueueHandle,&done, 0); и все чудесно доходит. Если я поставлю вместо '?' 5, то тоже все работает.

2 А вот если мне важно, чтобы ось их  (SPI) не блокировала, то какое число тогда? 

3. Как мне сделать так, чтобы прерывание неблокируемое SPI было приоритетнее прерывания UARTa, предполагая, что прерывания UARTa ось может блокировать?

Какое число присвоить прерыванию уарта?

 

Сейчас куб для всех прерываний нагенерил так:

NVIC_SetPriority(USART3_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0));

 

Заранее спасибо!

 

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


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

Зайдите на FreeRTOS.org -  и полистайте мануал. Там кагбе всё разъяснено на этот счет.

Снимок экрана 2024-02-02 230821.jpg

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


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

Это я вкурил.

Но получается, если я ставлю SPI приоритет 7, а уарту 3, то у уарта выше прерывание и оно перехватывается.

А можно ли сделать так. чтобы было наоборот? Т.е.маскировались прерывания выше некоторого числа?

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


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

6 hours ago, diwil said:

Т.е.маскировались прерывания выше некоторого числа?

А можно как-то с терминологией определиться? Есть ведь общеупотребительная терминология. Вы, похоже, сами запутались.

Есть прерывания процессора. Есть приоритет прерывания планировщика ОС. Отсюда и танцуйте. Исходя из свои представлений, у себя в программе я сделал так:

    //--------------------------------------------------------------------------
    // Настраиваемм приоритеты прерываний.

    NVIC_t
        *nvic = NVIC_t::getInstance();

    // Настраиваем все 4 приоритетных бита на PreemptPriority бит
    // и ни один из них на SubPriority бит. Это означает, что прерывание с более
    // высоким приоритетом, имеющее меньший номер, будет перебивать прерывание
    // с меньшим приоритетом, имеющее бОльший номер.
    nvic -> setPriorityGrouping( NVIC_PRIORITYGROUP_4 );

    // Устанавливает для планировщика, вызываемого из SysTick, самый низкий
    // приоритет.
    nvic -> setPriority( SysTick_IRQn, configLIBRARY_LOWEST_INTERRUPT_PRIORITY );

    // Учитывая настройки в "FreeRTOSConfig.h", получаем, что в обработчиках
    // прерываний с приоритетом 15..5 можно вызывать функции с суфиксом FromISR,
    // а в обработчиках с приоритетом 4..0- нельзя!

Попутно тут же задам вопрос по поводу назначения приоритетов для самой ОС.

Меня смущает вот что:

const intfunc
__vector_table[] __attribute__ ( ( section (".isr_vector_FLASH" ), used ) ) =
{
  (intfunc)&_estack ,
  &Reset_Handler,
  &NMI_Handler,
  &HardFault_Handler,
  &MemManage_Handler,
  &BusFault_Handler,
  &UsageFault_Handler,
  &Default_Handler,
  &Default_Handler,
  &Default_Handler,
  &Default_Handler,
  &vPortSVCHandler,
  &DebugMon_Handler,
  &Default_Handler,
  &xPortPendSVHandler,	//<<<<<<<<<<<
  &xPortSysTickHandler,	//<<<<<<<<<<<
....

Как правильно задать наименьший приоритет для планировщика? Вопрос связан с тем, в прерывании от систика возбуждается прерывание для обслуживания планировщика. Поясните, пожалуйста, этот нюанс.

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


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

7 часов назад, diwil сказал:

ставлю SPI приоритет 7, а уарту 3

Вы ставите приоритет NVIC, и он работает согласно приоритетам ARM - чем меньше число, тем выше приоритет. И тут есть еще одна закавыка - группы приоритетов ARM. Прочтите мануал от ARM по этому поводу.

56 минут назад, tonyk_av сказал:

Как правильно задать наименьший приоритет для планировщика?

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

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


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

Что касается приоритетов в файле когфига РТОС, то:
configMAX_PRIORITIES  -  число приоритетов задач. Не влияет на прерывания NVIC и относится только к задачам RTOS.
configLIBRARY_LOWEST_INTERRUPT_PRIORITY   - номер низшего приоритета NVIC (чем больше число, тем ниже приоритет).
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY - значение приоритета NVIC, выше которого (меньше этого числа) не разрешено в прерываниях использовать любые функции API RTOS.

Да, во всей этой байде много путаницы. Ничего не поделаешь.

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


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

18 minutes ago, EdgeAligned said:

По умолчанию для таймера SysTick он так и устанавливается.

А для xPortPendSVCHanddler?

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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