硬汉嵌入式论坛

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

[其它] stdout_putchar和fputc

[复制链接]

22

主题

196

回帖

262

积分

高级会员

积分
262
发表于 2024-12-6 22:05:04 | 显示全部楼层 |阅读模式
stdout_putchar和fputc啥区别,不用microlib,printf不是线程安全的吧,用stdout_putchar好像可以
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-12-7 08:46:57 | 显示全部楼层
1、使用C标准库要重定向stdout_putchar

使用MDK RTE可以方便的随意切换微库和C标准库
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=100641

2、printf要做互斥,以RTX为例是专门做了支持

RTX5自带C库API多任务安全调用处理
https://forum.anfulai.cn/forum.php? ... d=118667&fromuid=58
(出处: 硬汉嵌入式论坛)



回复

使用道具 举报

22

主题

196

回帖

262

积分

高级会员

积分
262
 楼主| 发表于 2024-12-7 17:17:41 | 显示全部楼层
eric2013 发表于 2024-12-7 08:46
1、使用C标准库要重定向stdout_putchar

使用MDK RTE可以方便的随意切换微库和C标准库

microlib的printf是线程安全的是吧
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-12-8 08:55:07 | 显示全部楼层
yuanzhongda 发表于 2024-12-7 17:17
microlib的printf是线程安全的是吧

printf本身是线程安全的,但他的底层调用putc等不是,所以要做处理。
回复

使用道具 举报

22

主题

196

回帖

262

积分

高级会员

积分
262
 楼主| 发表于 2024-12-8 10:55:12 | 显示全部楼层
eric2013 发表于 2024-12-8 08:55
printf本身是线程安全的,但他的底层调用putc等不是,所以要做处理。

fputc错误应该是数据乱序,我遇到个现象是多线程同时printf导致外设中断关闭了,fputc里只有一个串口发送
回复

使用道具 举报

22

主题

196

回帖

262

积分

高级会员

积分
262
 楼主| 发表于 2024-12-8 10:59:50 | 显示全部楼层
yuanzhongda 发表于 2024-12-8 10:55
fputc错误应该是数据乱序,我遇到个现象是多线程同时printf导致外设中断关闭了,fputc里只有一个串口发送

用的是标准库
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-12-9 08:52:34 | 显示全部楼层

自己封装控制下吧。省事。

/* 创建互斥信号量 */
    tx_mutex_create(&AppPrintfSemp,"AppPrintfSemp",TX_INHERIT);

/*
*********************************************************************************************************
*        函 数 名: App_Printf
*        功能说明: 线程安全的printf方式                                            
*        形    参: 同printf的参数。
*             在C中,当无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表
*        返 回 值: 无
*********************************************************************************************************
*/
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);                                         
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 00:52 , Processed in 0.042672 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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