Я использую функцию из xprintf для вывода лога из разных потоков в
проекте с scmRTOS в качестве ОС. На scmRTOS перешел с FreeRTOS
из-за жесткого дефицита места в флэше. Поэтому оптимизация по
размеру включена на максимум. С проблемами не сталкивался. Функции
из xprintf заняли 544 байта. Аналогичная функция из SEGGER_RTT
занимает около 1.5 килобайта. Формирование строки лога не требует использования разделяемых ресурсов, это можно делать там, где такая потребность возникает. А вот доступ к UART должны делить между собой разные потоки. Поэтому, на мой взгляд, разумно сделать работу с UART в отдельном потоке, а данные он будет брать из очереди, которую будут заполнять остальные потоки.