寻求裸机下newlib的printf()或puts()函数调用串口重定向过程解答



  • 在SDK中syscalls.c文件的sys_write()和handle_syscall()函数如何与newlib中putc()或者其他输出函数粘合,从而使得printf和putc直接调用串口输出?这一过程如何实现?



  • 如何实现printf()输出串口数据浅见

    newlib库中printf()函数最底层实现函数为_wirte(),位于riscvnewlib/libgloss/riscv/sys_write.c
    _write()调用syscall_errno(),该函数具体实现位于internal_syscall.h,调用RISCV的scall指令,猜想过程类似中断号调用系统函数。

    项目文件夹 lib/bsp/syscalls.c 设置了系统调用函数实例,sys_write()被内部设置为系统调用向量表中的一员, 并在crt0.s中将系统向量表设置到相应位置。确保系统调用能成功调用。
    printf()函数调用了 printf()-->__vfprintf_r()-->__sprint_r()-->__sfvwrite_r()-->_wirte()

    希望大家一起讨论,予以指正