ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
15 июня
1591618 Топик полностью
klen (Сегодня, 19:50, просмотров: 23) ответил Nikolay_Po на CAUTON: Не используйте HPE с FreeRTOS. Путём долгих страданий, выяснил, что HPE не совместим с существующим шаблонным механизмом сохранения, а, главное, восстановления контекста. Причём выяснил это не сразу. Не давала покоя жажда оптимизаций и выжимки скорости.
Вот моя шпаргалка на тему вымучивания 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 ; /* самый низкий из возможных */