Я ожидал советов от авторов операционки в духе "В ядре наиболее длинные крит. секции, пожалуй, в OS::channel. Если длина устраивает - можно тупо запрещать прерывания. BASEPRI не используется, потому что ...". А разговор "вот если бы у рыб была шерсть, то на ней были бы блохи" - повторюсь, в "общение". Спасибо.
Возвращаясь к теме. Класс TCritSect и enable/disable _context_switch() делают __set_BASEPRI() - ноль и (0xFE <<(8 - кол-во бит приоритета)).
Вроде б работает...
Также, на мой взгляд, правильнее INLINE void raise_context_switch() { SCB->ICSR = SCB_ICSR_PENDSVSET_Msk; } вместо INLINE void raise_context_switch() { *((volatile uint32_t*)0xE000ED04) |= 0x10000000; } ключевое отличие - просто запись вместо модификации.
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|