Цитата(ViKo @ Mar 13 2018, 15:25)

Поначалу функцию имел следующую:
__asm void HardFault_Handler(void)
Ну - у меня тоже обработчик fault-ов на асм написан. Только он в несколько десятков раз больше.
Защёлкивает содержимое всех важных регистров, кадра стека, разной информации о fault-е и сохраняет в структуру в памяти.
И расположен он в асм-файле. А потом оттуда - переход на си-функцию, которая эту всю инфу уже использует (выплёвывает в UART в аналог "синего окна смерти" или пишет в журнал событий и перегружает МК).
А вот атомарные операции с эксклюзивным доступом я написал на си, с помощью intrinsic-функций, типа (атомарная операция "сравнение и обмен"):
Код
inline u32 AtomicCmpSwp(u32 volatile *ptr, u32 newVal, u32 cmpVal)
{
u32 i, i1;
do {
i = __LDREX(ptr);
if (i == cmpVal) i1 = __STREX(newVal, ptr);
} while (i == cmpVal && i1 == 1);
return i;
}
Аналог виндовой InterlockedCompareExchange()...
PS: Если автору "важно быть уверенным во времени исполнения участка" - нужно для минимизации времени запрета прерываний внутри критической секции, то использование подобных операций эксклюзивного доступа даёт возможность обойтись вообще без запретов прерывания. Если уж так хочется.