Как заставить утверждать печатать в UART? STM32 newlib nano - PullRequest
1 голос
/ 22 апреля 2020

Контекст: STM32, newlib nano, G CC -ARM, C / C ++, FreeRTOS

Я бы хотел, чтобы мои утверждения assert печатались в UART. printf работает отлично. Я также могу получить утверждение напечатать сообщение об ошибке в UART, но только если я сделаю отпечаток (stderr, "\ n") перед любым утверждением. Тем не менее, мне нужно сделать это один раз для потока, или первая запись в stderr ничего не делает.

Обратите внимание, что этот первый fprintf ("\ n") на самом деле никогда ничего не печатает и не вызывает _write_r, но любой следующий fprintf делает!

Есть ли у кого-нибудь советы о том, как правильно перехватить эти вызовы, поэтому мне не нужно делать fprintf ("\ n") в каждом новом потоке? У меня есть следующие переопределенные функции newlib nano слабых:

size_t _write(FILE* instance, const char* bp, size_t n)
{
    return UARTWrite(gDbgUARTHndl, bp, n);
}

int _write_r(void *reent, int fd, char *ptr, size_t len)
{
    return _write((FILE*)fd, ptr, len);
}

void someFunc(void)
{
    // If this function is the first called (on a particular thread) it doesn't print the assertion
    assert(false); 
}


void someOtherFunc(void)
{
    // If this function is the first called (on a particular thread) it DOES print the assertion (bot not the first "\n")
    fprintf(stderr, "\n");
    assert(false); 
}

ПРИМЕЧАНИЕ: _write вызывается любым printf или вызывает. _write_r вызывается assert ( через __assert_fun c с вызовом fprintf ).

...