Вообще-то, это совершенно штатная ситуация, когда в системе работает только процесс Idle - бездействие. То есть, нет готовых к исполнению процессов, все они находятся в состоянии "приостановлен".
А
void os_idle_demon (void) - тут могут размещаться действия, выполняемые в состоянии Idle - например, монитор ресурсов. Именно так вы получаете на обычном компе сообщение "загрузка ЦПУ: 25%", то есть, длительность нахождения в Idle за некоторый отрезок времени.
Либо, именно здесь может быть остановлен МК (wfi) для снижения потребления.
То, что вы в ту функцию попадаете после приема скольки-то байтов, означает, что система ожидает приема следующего байта и у нее нет других активных процессов.
В другом проекте такого не было? Значит, там постоянно что-то выполнялось, как минимум, один процесс был в состоянии готовности к выполнению.
То, что вы называете exeption - исключением, на деле исключением не является.
При возникновении какой-то внештатной ситуации, если она произошла на уровне ядра МК, вы попадете в один из обработчиков исключений ядра. HardFault - один из них. и вы вылетите вообще из "зоны ответственности" ОС.
Если внештатная ситуация произошла на уровне ядра РТОС, вы должны разобраться с ней в функции
void os_error (uint32_t error_code). Обычно эти ошибки связаны с переполнением стека, буферов очередей, выделенной памяти для ОС.
При прочих ненормальностях работы вы должны самостоятельно контролировать и разруливать ошибки.
PS/ - мануал с объяснениями:
https://www.keil.com/pack/doc/CMSIS/...3726d2860282e4
гуглоперевод:
"
Функция os_idle_demon выполняется ядром RTX, когда другие потоки не готовы к запуску. По умолчанию эта задача представляет собой пустой цикл без конца, который ничего не делает. Он только ждет, пока другая задача будет готова к запуску. Вы можете изменить код функции os_idle_demon, чтобы включить CPU в энергосберегающий или режим ожидания."