在线等,linux,printf会导致线程阻塞?

shimeitang 2012-08-23 07:32:27
加精
在项目开发时碰到这样一个比较奇怪的问题:应用的某个子线程中调用printf向debug串口输出log,当串口连接到PC的时候,没有问题,一旦串口线与PC串口断开,则在一定时间内,该子线程会阻塞,但只要串口线一连接上PC,阻塞解除。初步估计可能是因为printf导致buffer满了以后阻塞此调用,因为printf输出内容很多时,很快就阻塞,而printf内容较少时,这个时间要长一些。 这里我只是猜测,请教下论坛里的达人,有谁知道原因,谢谢,在线等~~~
...全文
6644 51 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
long22885528 2013-03-16
  • 打赏
  • 举报
回复
该问题的正在原因是串口线太长,PC端的没有接,就会变成一根天线。导致设备串口接收中断频繁触发,用户态线程得不到调度(此时频繁陷入中断处理)。可以通过/proc/interrupt 来确认。必然有每秒上万次的串口RX中断。
9527 2012-10-22
  • 打赏
  • 举报
回复
现身说法:
1)遇到过楼主的情况,调试线连接不好,整个开发板程序运行挂起
2)信号处理函数中使用printf函数造成程序挂起
等待高人进一步解释
LLR104 2012-09-04
  • 打赏
  • 举报
回复
应该不会的吧
shimeitang 2012-09-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

引用 5 楼 的回复:

printf可能会造成堆溢出


你确定printf会造成堆溢出?

本质上和printf函数没有任何关系,从上面你描述的现象来看,应该是串口的驱动有问题,linux下所有的东西都被抽象为文件,我初步怀疑是当只有写操作而没有读导致文件满了,当接上串口线此时有了读操作就不会有向你上面所说的阻塞了。对于当连接上串口线,打印的全是乱码,这个没研究过,估计与通……
[/Quote]

是的,直接来说,应该是读操作没有及时调用,现在项目紧在外出差没有时间弄这块先规避掉了,等回去后再查个水落石出。
pruitdream 2012-09-01
  • 打赏
  • 举报
回复
这问题等待大虾大虾!
cuifay 2012-08-31
  • 打赏
  • 举报
回复
http://download.csdn.net/download/chu1982/4358503
qingqire 2012-08-31
  • 打赏
  • 举报
回复
很不错的啊。。。。。。。。
dfasri 2012-08-29
  • 打赏
  • 举报
回复
大哥, linux下的printf, 有线程安全版和非线程安全版本的, 要加个什么宏来编译来选择的, 默认的版本好像是非线程安全版的.
zhenghn2010 2012-08-28
  • 打赏
  • 举报
回复
printf用到了中断了吗? 注意有的上下文里不能用printf
daviddb7 2012-08-28
  • 打赏
  • 举报
回复
估计是驱动的问题,与printf无关
iwangxiaodong 2012-08-28
  • 打赏
  • 举报
回复
我一直没有遇到过这种问题,你可以参考下:Linux开发专题
一叶知秋dong 2012-08-28
  • 打赏
  • 举报
回复
printf要访问硬件,势必会有全局锁和线程调度
刀鱼i足球 2012-08-28
  • 打赏
  • 举报
回复
printf太频繁,这个线程确实被阻塞。我在powerpc板子上debug时遇到过类似情况,debug打印的调试消息太多(每秒几百次以上),应用程序占的cpu明显高了10%~20%响应很慢,项目有二十个线程左右。于是我就搞个函数内的静态变量,计数,出错几百次printf一次调试信息。
qzh861130 2012-08-27
  • 打赏
  • 举报
回复
求解……
dingyansong168 2012-08-27
  • 打赏
  • 举报
回复
楼主的驱动看的怎么样了
woshi_ziyu 2012-08-27
  • 打赏
  • 举报
回复
printf不会造成串口堵塞

楼主的驱动看的怎么样了 有没有解决问题
gyxqq1067119296 2012-08-27
  • 打赏
  • 举报
回复
很好很强大,学习了
第二只蝴蝶 2012-08-27
  • 打赏
  • 举报
回复
虽然不懂 还是学习了
wjlsmail 2012-08-27
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]
大概串口打开时,配置了硬件流控,导致通信时必须检测RTS之类的信号。你查一下串口的配置看看,去掉硬件流控试试。
[/Quote]

同意,应该是串口设置问题。
Q780490338 2012-08-27
  • 打赏
  • 举报
回复
15:00操作策略
亚盘突破高点后一直维持高位横盘整理,在72——73有个支撑点,在这位置还没有进进多单的朋友可以进多单,止损1667不变,目标看1678.支撑一线在1小时10日均线位置,欧盘之前预计金价会有太大的变化,1672—1674一线在日内是个小支撑,没有下破1小时10日均线之前暂时不考虑做空,多单严格按操作策略执行。
加载更多回复(20)

21,616

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧