подниму старую тему, быстрым поиском по форуму решил, что эта тема наиболее подходящая для вопроса.
Раньше обходился простым вызовом printf, а сейчас появилось желание использовать разделение потока: fpintf(stdout, ...) и fprintf(stderr, ...)
Функции вполне себе стандартные, в конечном счёте всё сводится к вызову fputs(pStr, pStream). Если поток stdout, я использую класс и асинхронные очереди сообщений (неблокирующая передача). Если поток stderr, то передаю сообщение напрямую в UART полностью без прерываний:
Код
signed int fputs(const char *pStr, FILE *pStream) {
signed int num = 0;
if (pStream == stdout) {
console_uart.puts(pStr);
} else if (pStream == stderr) {
NVIC_DisableIRQ(USART1_IRQn);
while (*pStr != 0) {
USART1_SendData(*pStr);
num++;
pStr++;
}
NVIC_EnableIRQ(USART1_IRQn);
} else {
num = -1;
};
return num;
}
signed int fprintf(FILE *pStream, const char *pFormat, ...) {
va_list ap;
signed int result;
// Forward call to vfprintf
va_start(ap, pFormat);
result = vfprintf(pStream, pFormat, ap);
va_end(ap);
return result;
}
signed int printf(const char *pFormat, ...) {
va_list ap;
signed int result;
// Forward call to vprintf
va_start(ap, pFormat);
result = vprintf(pFormat, ap);
va_end(ap);
return result;
}
Суть в том, что все вызовы функции printf(...) всегда работают нормально (используется stdout).
Но функция fprintf(pStream, ...) может либо нормально отработать, либо привести к зависанию МК, независимо от используемого pStream.
Например, такой вызов приведёт к зависанию на fprintf:
printf("line 1\r\n");
fprintf(stdout, "line 2\r\n");
А такой вызов всё отработает нормально:
printf("line 1\r\n");
for (i=0;i<5;i++) fprintf(stdout, "line %г\r\n", i);
Начал копать, - зависание происходит на fputs. Я вообще не понимаю, как такое возможно, ведь printf и fprintf в итоге используют одну и ту же функцию fputs, почему тогда она в одном случае зависает???