硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3678|回复: 9
收起左侧

[ThreadX全家桶] 请教App_Printf打印问题

[复制链接]

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 2020-9-6 16:32:32 | 显示全部楼层 |阅读模式
请问下App_Printf底层是如何通过串口打印出来的?谢谢
printf是如何调串口驱动的,没怎么看明白
static  void  App_Printf(const char *fmt, ...)
{
    char  buf_str[200 + 1]; /* 特别注意,如果printf的变量较多,注意此局部变量的大小是否够用 */
    va_list   v_args;


    va_start(v_args, fmt);
   (void)vsnprintf((char       *)&buf_str[0],
                   (size_t      ) sizeof(buf_str),
                   (char const *) fmt,
                                  v_args);
    va_end(v_args);

        /* 互斥操作 */
    tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);

    printf("%s", buf_str);

    tx_mutex_put(&AppPrintfSemp);
}
回复

使用道具 举报

5

主题

15

回帖

30

积分

新手上路

积分
30
发表于 2020-9-6 21:42:16 | 显示全部楼层
你重定义了fputc这个函数了,这个函数调用了串口的发送
回复

使用道具 举报

79

主题

712

回帖

949

积分

金牌会员

积分
949
发表于 2020-9-6 23:35:05 | 显示全部楼层
printf会调用fputc这个函数,所以你只需要在代码里面重定义这个函数,就可以输出到任何显示地方,就看你怎么重定义你的fputc。
不过你既然用了vsnprintf来格式化了数据,干嘛还使用printf
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107442
QQ
发表于 2020-9-7 01:43:26 | 显示全部楼层
庄永 发表于 2020-9-6 23:35
printf会调用fputc这个函数,所以你只需要在代码里面重定义这个函数,就可以输出到任何显示地方,就看你怎 ...

vsnprintf可以设置缓冲大小,防止内存异常,然后printf仅大小字符串。
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2020-9-7 07:13:42 | 显示全部楼层
谢谢各位的耐心解答
回复

使用道具 举报

613

主题

3067

回帖

4926

积分

至尊会员

积分
4926
发表于 2020-9-7 10:11:21 | 显示全部楼层
我的是这样使用的
static __attribute__((section (".RAM_D4"))) char buf_str[256];     //最多一次能够输出 256 个字符
void  App_Printf(char *format, ...)
{
        uint32_t _i, _strCnt;
        va_list   v_args;

        va_start(v_args, format);
        (void)vsnprintf((char       *)&buf_str[0],
                                                                         (size_t      ) sizeof(buf_str),
                                                                         (char const *) format,
                                                                                v_args);
        va_end(v_args);

        _strCnt =         strlen(buf_str);       
                                                                         

        /* 互斥信号量 */
        if(OSStatRdy  == TRUE)//系统已经运行
        {
                tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);

                for(_i=0; _i<_strCnt; _i++)       
                {
                        USART1->TDR = (int)buf_str[_i];

                        /* 等待发送结束 */
                        while((USART1->ISR & USART_ISR_TC) == 0)
                        {}
                }               

                tx_mutex_put(&AppPrintfSemp);       
        }
        else
        {
                for(_i=0; _i<_strCnt; _i++)       
                {
                        USART1->TDR = (int)buf_str[_i];

                        /* 等待发送结束 */
                        while((USART1->ISR & USART_ISR_TC) == 0)
                        {}
                }       
        }
}

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107442
QQ
发表于 2020-9-7 10:49:39 | 显示全部楼层
hpdell 发表于 2020-9-7 10:11
我的是这样使用的
static __attribute__((section (".RAM_D4"))) char buf_str[256];     //最多一次能够 ...

谢谢分享
回复

使用道具 举报

79

主题

712

回帖

949

积分

金牌会员

积分
949
发表于 2020-9-7 19:49:38 | 显示全部楼层
eric2013 发表于 2020-9-7 01:43
vsnprintf可以设置缓冲大小,防止内存异常,然后printf仅大小字符串。

用vsnprintf格式化字符串了,得到的就已经是字符串,可以直接用串口发出去。没有必要在将得到的字符串通过printf输出,这类标准函数在嵌入式系统里面始终是不安全的。还影响系统实时性。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107442
QQ
发表于 2020-9-8 01:08:16 | 显示全部楼层
庄永 发表于 2020-9-7 19:49
用vsnprintf格式化字符串了,得到的就已经是字符串,可以直接用串口发出去。没有必要在将得到的字符串通 ...

1、首先这个打印功能是仅在调试阶段使用的,实际工程就不会在使用了。
2、然后就是我们直接调用printf,简单省事些。
回复

使用道具 举报

79

主题

712

回帖

949

积分

金牌会员

积分
949
发表于 2020-9-8 17:18:37 | 显示全部楼层
了解了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-1 03:18 , Processed in 0.182548 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表