diwil 0 2 февраля Опубликовано 2 февраля · Жалоба Я прошу прощения у тех, кому это уже надоело, НО! Я с этими прерываниями лет 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)); Заранее спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 2 февраля Опубликовано 2 февраля · Жалоба Зайдите на FreeRTOS.org - и полистайте мануал. Там кагбе всё разъяснено на этот счет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
diwil 0 3 февраля Опубликовано 3 февраля · Жалоба Это я вкурил. Но получается, если я ставлю SPI приоритет 7, а уарту 3, то у уарта выше прерывание и оно перехватывается. А можно ли сделать так. чтобы было наоборот? Т.е.маскировались прерывания выше некоторого числа? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 45 3 февраля Опубликовано 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, //<<<<<<<<<<< .... Как правильно задать наименьший приоритет для планировщика? Вопрос связан с тем, в прерывании от систика возбуждается прерывание для обслуживания планировщика. Поясните, пожалуйста, этот нюанс. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 3 февраля Опубликовано 3 февраля · Жалоба 7 часов назад, diwil сказал: ставлю SPI приоритет 7, а уарту 3 Вы ставите приоритет NVIC, и он работает согласно приоритетам ARM - чем меньше число, тем выше приоритет. И тут есть еще одна закавыка - группы приоритетов ARM. Прочтите мануал от ARM по этому поводу. 56 минут назад, tonyk_av сказал: Как правильно задать наименьший приоритет для планировщика? Я так пронимаю, что нужно указать низший приоритет для таймера, от которого запитан системный тик. По умолчанию для таймера SysTick он так и устанавливается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 3 февраля Опубликовано 3 февраля · Жалоба Что касается приоритетов в файле когфига РТОС, то: configMAX_PRIORITIES - число приоритетов задач. Не влияет на прерывания NVIC и относится только к задачам RTOS. configLIBRARY_LOWEST_INTERRUPT_PRIORITY - номер низшего приоритета NVIC (чем больше число, тем ниже приоритет). configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY - значение приоритета NVIC, выше которого (меньше этого числа) не разрешено в прерываниях использовать любые функции API RTOS. Да, во всей этой байде много путаницы. Ничего не поделаешь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 45 3 февраля Опубликовано 3 февраля · Жалоба 18 minutes ago, EdgeAligned said: По умолчанию для таймера SysTick он так и устанавливается. А для xPortPendSVCHanddler? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 3 февраля Опубликовано 3 февраля · Жалоба А надо? Если да, то изменить приоритет прерывания PendSV в NVIC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 45 4 февраля Опубликовано 4 февраля · Жалоба 13 hours ago, EdgeAligned said: А надо? Не знаю, думаю, как правильней. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться