rt-thread完整版printf函数的映射

在使用rt-thread nano版本的时候,我们只使用了rt-thread的内核,所以串口函数都是自己写的,但在使用完整版的时候,串口是挂载在设备上面的,那么怎么将打印函数映射到自己想要的串口上呢。

在创建工程的时候我们默认将打印串口设置的是uart2,如下图所示
在这里插入图片描述
而rt-thread所有的打印都默认使用了这一串口,如果想要更改串口设置,只要在这里更改uart2为其他的串口就行了,前提是进行过了初始化。

但这明显不是我想要的,我想要的是将不同的打印函数映射到不同的串口上面,rt_kprintf函数好说,只需要一步步去查看调用就能找到最终在那个串口进行打印的,但printf函数明显是调用的库函数,这个不太好查找。
最终查到在rt-thread studio下面,函数使用的好像不是fput这个映射函数,而是_write_r,我不确定这个是不是标准C语言库里的,看着好像是另一个库,因为我使用fput进行重映射却发现根本没有用。

_ssize_t _write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes)
{
#ifdef DFS_USING_POSIX
    _ssize_t rc;
#endif /* DFS_USING_POSIX */

    if (fd == STDOUT_FILENO || fd == STDERR_FILENO)
    {
#if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE)
        rt_device_t console;

        console = rt_console_get_device();
       
        if (console)
            return rt_device_write(console, -1, buf, nbytes);
#else
        ptr->_errno = ENOTSUP;
        return -1;
#endif /* defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE) */
    }
    else if (fd == STDIN_FILENO)
    {
        ptr->_errno = ENOTSUP;
        return -1;
    }

#ifdef DFS_USING_POSIX
    rc = write(fd, buf, nbytes);
    return rc;
#else
    LOG_W("%s: %s", __func__, _WARNING_WITHOUT_FS);
    ptr->_errno = ENOTSUP;
    return -1;
#endif /* DFS_USING_POSIX */
}

这里是库里面实现的代码,文件的位置在/rt-thread/components/libc/compliers/newlib文件夹下,名字是syscalls.c
这里使用了 console = rt_console_get_device();来确定查找的是哪一个设备,

rt_device_t rt_console_get_device(void)
{
    return _console_device;
}

返回的值就是之前设置里面的uart2,当然里面的查找过程有些复杂,而要改变这个值就会改变其他打印函数的打印口,所以这里使用console = rt_device_find(“uart1”);这个函数就可以通过字符uart1查找到串口1的设备了,当然前提还是串口1进行初始化挂载到设备树上了。
更改后的代码:

_ssize_t _write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes)
{
#ifdef DFS_USING_POSIX
    _ssize_t rc;
#endif /* DFS_USING_POSIX */

    if (fd == STDOUT_FILENO || fd == STDERR_FILENO)
    {
#if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE)
        rt_device_t console;

//        console = rt_console_get_device();
        console = rt_device_find("uart1");
        if (console)
            return rt_device_write(console, -1, buf, nbytes);
#else
        ptr->_errno = ENOTSUP;
        return -1;
#endif /* defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE) */
    }
    else if (fd == STDIN_FILENO)
    {
        ptr->_errno = ENOTSUP;
        return -1;
    }

#ifdef DFS_USING_POSIX
    rc = write(fd, buf, nbytes);
    return rc;
#else
    LOG_W("%s: %s", __func__, _WARNING_WITHOUT_FS);
    ptr->_errno = ENOTSUP;
    return -1;
#endif /* DFS_USING_POSIX */
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

k-kun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值