硬汉嵌入式论坛

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

[其它] stdio函数的重入问题

[复制链接]

14

主题

62

回帖

104

积分

初级会员

积分
104
发表于 2021-6-24 11:43:15 | 显示全部楼层 |阅读模式
printf 由于使用了硬件,重入会导致数据混乱。 像sprintf, snprintf这种使用局部buffer的函数可重入吗? 这些函数内部是否使用了编译器隐藏的全局变量?
回复

使用道具 举报

19

主题

373

回帖

430

积分

高级会员

积分
430
发表于 2021-6-24 15:17:59 | 显示全部楼层
貌似_get()函数,驱动用MUTEX保护
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2021-6-24 16:39:46 | 显示全部楼层
MDK的线程安全说明如下:

回复

使用道具 举报

14

主题

62

回帖

104

积分

初级会员

积分
104
 楼主| 发表于 2021-6-25 11:22:04 | 显示全部楼层
eric2013 发表于 2021-6-24 16:39
MDK的线程安全说明如下:

上面写printf是个线程安全函数,我不理解的是,字符打印过程中发生任务切换,新任务也使用了printf的话,打印数据应该是混乱的,怎么会是安全的呢?

对于sprintf 的描述, “if you change locale in mid-session, you must ensure that these functions are not affected”,这个怎么理解,怎么确定不被影响呢,具体指的是哪些操作会影响哪些内容?

关于部分_mutex_保护的函数,那个初始化貌似是在main之前调用的,需要一些更改,一些RTOS在初始话前可能是不允许调用API的。另外这些函数必须加used属性才能生效。我是这样改的:
  1. /********************************************************************************
  2. *
  3. *        name : c library surport
  4. *        file : c_lib_mutex.c
  5. ********************************************************************************
  6. */

  7. #include "stdint.h"
  8. #include "osObjects.h"
  9. #include "sys_init.h"

  10. /*******************************************************************************
  11. * @brief  bsp_delay_init
  12. * \param[in] none
  13. * \retval: none
  14. *******************************************************************************/
  15. static rt_mutex_t c_sid;
  16. static volatile char c_mutex_init = 0;

  17. OBJ_USED int _mutex_initialize(rt_mutex_t *sid)
  18. {
  19.         c_mutex_init = 0;

  20.     return 1;
  21. }

  22. OBJ_USED void _mutex_acquire(rt_mutex_t *sid)
  23. {
  24.         if(c_mutex_init)
  25.         {
  26.                 rt_mutex_take(c_sid, 10000);
  27.         }
  28. }

  29. OBJ_USED void _mutex_release(rt_mutex_t *sid)
  30. {
  31.     /* Release the semaphore. */
  32.         if(c_mutex_init)
  33.         {
  34.                 rt_mutex_release(c_sid);
  35.         }
  36. }

  37. OBJ_USED void _mutex_free(rt_mutex_t *sid)
  38. {
  39.     /* Free the semaphore. */
  40. }

  41. void c_lib_init_user(void)
  42. {
  43.         c_sid = rt_mutex_create("c lib", RT_IPC_FLAG_PRIO);
  44.         c_mutex_init = 1;
  45. }
复制代码


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2021-6-25 11:37:32 | 显示全部楼层
apleilx 发表于 2021-6-25 11:22
上面写printf是个线程安全函数,我不理解的是,字符打印过程中发生任务切换,新任务也使用了printf的话, ...

printf没有被重定向之前是线程安全的,但是一旦做了串口重定向,你的串口代码是不支持多线程的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-17 07:21 , Processed in 0.157327 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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