C 如何将断言打印到UART?STM32 newlib纳米

C 如何将断言打印到UART?STM32 newlib纳米,c,stm32,newlib,C,Stm32,Newlib,上下文:STM32、newlib nano、GCC-ARM、C/C++、FreeRTOS 我希望我的断言语句打印到UART。printf工作得很好。我还可以让assert将错误消息打印到UART,但前提是我在任何断言之前执行fprint(stderr,“\n”)。但是,我需要在每个线程中执行一次,否则第一次写入stderr什么也不做 请注意,第一个fprintf(“\n”)实际上从不打印任何内容,也不调用_write_r,但后面的任何fprintf都可以 是否有人对如何正确地挂接这些调用有任何提

上下文:STM32、newlib nano、GCC-ARM、C/C++、FreeRTOS

我希望我的断言语句打印到UART。printf工作得很好。我还可以让assert将错误消息打印到UART,但前提是我在任何断言之前执行fprint(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或put调用调用_write\u r由assert()调用。

@somanyquestions-您添加了一条回复帖子,实际上是一条评论(由于您的权限有限),说“我没有遇到这个特殊问题。但我使用STM32,并想知道:(a)您是否检查了UART设置?是否有什么限制?(b)您是否在调试模式下运行并取出所有换行符打印,强制执行某个命令,将其置于调试模式并查看发生了什么情况?“您是否考虑过启动UART外壳输出的任务与实际UART传输之间是否存在争用条件?谢谢您的评论。UART配置良好,任何应用程序代码中都没有竞争条件。从未调用过_write函数,因此从未对UART进行过写入。我猜这是newlib nano fprintf的一些微妙之处。我已经在newlib源代码中查找过了,但找不到不调用_write的任何原因。为了澄清这一点,只有当assert语句是每个线程打印输出的第一件事时,才会出现此问题。如果printf是第一件事,那么就没有问题,下面的断言可以打印出来。@somanyquestions-您添加了一个回复帖子,实际上是一条评论(由于您的权限有限),说“我没有遇到这个特殊问题。但是我使用STM32,并且想知道:(a)您是否碰巧检查了UART设置?是否有什么限制?(b)您是否在调试模式下运行并取出所有换行符打印,强制执行特定的顺序,将其置于调试模式并查看发生了什么?“您是否考虑过启动UART外壳输出的任务之间是否存在竞争条件,还有实际的UART传输?谢谢你的评论。UART配置良好,任何应用程序代码中都没有竞争条件。从未调用过_write函数,因此从未对UART进行过写入。我猜这是newlib nano fprintf的一些微妙之处。我已经在newlib源代码中查找过了,但找不到不调用_write的任何原因。为了澄清这一点,只有当assert语句是每个线程打印输出的第一件事时,才会出现此问题。如果printf是第一件事,那么就没有问题,下面的断言可以很好地打印。