Меня во всех найденных в сети реализациях (несколько лет назад) не
устраивало в первую очередь то, что всем им требовался большой
буфер в ОЗУ. И если вызывать printf из разных задач (RTOS), то
память начинала заканчиваться... А поскольку весь вывод направлялся
в UART, причём не в один, напрашивалось написание свого варианта,
чтобы первым параметром передавался указатель на функцию вывода
байта. И внутренний буфер удалось ограничить 16 байтами - по
максимальной длине строки, в которой формируется выводимое число.