Рассказываю.
Когда возникает исключение, часть регистров автоматически запихивается в стек. В том числе адрес следующей инструкции для выполнения после возврата (это к вопросу Сергея про "Как же он узнает, куда ему возвращаться"). Кроме того, в регистр LR заносится специальное значение exc_return, в котором сохраняются флажки, описывающие используемый стек и режим привилегий прерываемого процесса. (В M4F там ещё есть флажок активности FPU). При возврате из исключения из этого exc_return восстанавливается режим работы процессора. (Возврат из исключения происходит при записи в PC значения exc_return. У него все старшие биты единички, и по этой маске процессор определяет, что нужно возвращаться).
Конкретно надо поменять вот что:
1. Добавить строчку POP {LR} после строчки BL os_context_switch_hook
2. Заменить строчку POP {PC} на BX LR
Блин!

Написал, и понял, что всё было правильно. Отбой воздушной тревоги
Если бы я знал, что такое электричество...