Вот моя шпаргалка на тему вымучивания HPE+FreeRTOS которую себе
написал храню в FreeRTOSConfig.h
/*
qkv4f реализовано три бита приоритетов
Interrupt Priority and Priority Threshold Registers (PFIC_IPRIOR<0-7>/PFIC_ITHRESDR)
xxx00000 значение приоритет приоритет приоритет приоритет
в регистре intsysc_t::preemption_level8 intsysc_t::preemption_level4 intsysc_t::preemption_level2 intsysc_t::preemption_level0
-------------------------------------------------------------------------------------------------------------------------------------------------------
000 0x00 0 0:0 0:0 0:0
001 0x20 1 0:1 0:1 0:1
010 0x40 2 1:0 0:2 0:2
011 0x60 3 1:1 0:3 0:3
100 0x80 4 2:0 1:0 0:4
101 0xa0 5 2:1 1:2 0:5
110 0xc0 6 3:0 1:3 0:6
111 0xe0 7 3:1 1:4 0:7
в данный момент crt устанавливает intsysc_t::preemption_level4 то есть 3 HPE + 1 обычное прерывание
для обеспечения гарантрованного использования HPE без переполнения буфера контекста
будем использовать только 3 уровня приоритетов
xxx00000 приоритет
в регистре intsysc_t::preemption_level4
----------------------------------------------------------
000 0x00 0:0 ** запрещен к использованияю **
001 0x20 0:1 ** запрещен к использованияю **
010 0x40 1:0 приоритетные (1+) обработчики не вызывабщие api freertos
011 0x60 1:1 приоритетные (1-) обработчики не вызывабщие api freertos
маскирование freertos pfic_t::priority_threshold_t 0x60
100 0x80 2:0 обработчики (2+) вызывающие api freertos
101 0xa0 2:1 sys_tick (2-) должден иметь возможность вытеснить software
110 0xc0 3:0
111 0xe0 3:1 software (3-)
*/
static constexpr uint8_t freertos_port_min_non_api_interrupt_priority = 0x80 ; /* маскирование прерываний с приоритетом ниже 0x80 ( 0xa0,0xc0,0xe0), в которых допускается использование api ...from_isr() */
static constexpr uint8_t freertos_port_systick_interrupt_priority = 0xc0 ; /* самый низкий из возможных,но болше чем software_irq, обработка системного тика */
static constexpr uint8_t freertos_port_software_interrupt_priority = 0xe0 ; /* самый низкий из возможных */