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

shimeitang 2012-08-23 07:32:27
加精
在项目开发时碰到这样一个比较奇怪的问题:应用的某个子线程中调用printf向debug串口输出log,当串口连接到PC的时候,没有问题,一旦串口线与PC串口断开,则在一定时间内,该子线程会阻塞,但只要串口线一连接上PC,阻塞解除。初步估计可能是因为printf导致buffer满了以后阻塞此调用,因为printf输出内容很多时,很快就阻塞,而printf内容较少时,这个时间要长一些。 这里我只是猜测,请教下论坛里的达人,有谁知道原因,谢谢,在线等~~~
...全文
6272 51 打赏 收藏 转发到动态 举报
写回复
用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)
Linux系统提供了各种系统调用API用于进程之间的通信:    无名管道PIPE    命名管道FIFO    消息队列    共享内存    信号量    文件锁    信号signal....其中还包括system V和POSIX 两种接口标准,除此之外,Linux系统自身还扩展了自己的一套API接口用于进程间通信,比如signalfd、timerfd、eventfd等。本视频教程为《Linux系统编程》第05期,本期课程将带领大家学习Linux下将近15种进程间通信IPC工具的使用,了解它们的通信机制、编程实例、使用场景、内核中的实现以及各自的优缺点。本课程提供PDF版本的PPT课件和代码,学员购买课程后可到课程主页自行下载嵌入式自学路线指导图:------------------------------------------------------------------------------------------------------                   《嵌入式工程师自我修养》嵌入式自学系列教程                                          作者:王利涛------------------------------------------------------------------------------------------------------一线嵌入式工程师精心打造,嵌入式学习路线六步走: 第 1 步:Linux三剑客零基础玩转Linux+UbuntuGit零基础实战:Linux开发技能标配vim从入门到精通基础篇:零基础学习vim基本命令vim从入门到精通定制篇:使用插件打造嵌入式开发IDEmakefile工程实践基础篇:从零开始一步一步写项目的Makefilemakefile工程实践第2季:使用Autotools自动生成Makefile软件调试基础理论printf打印技巧Linux内核日志与打印使用QEMU搭建u-boot+Linux+NFS嵌入式开发环境第 2 步:C语言嵌入式Linux高级编程第1期:C语言进阶学习路线指南第2期:计算机架构与ARM汇编程序设计第3期:程序的编译、链接和运行原理第4期:堆栈内存管理第6期:数据存储与指针第7期:嵌入式数据结构与Linux内核的OOP思想第8期:C语言的模块化编程第9期:CPU和操作系统入门      搞内核驱动开发、光C语言是不行的!      你还需要学习的有很多,包括:计算机体系架构、ARM汇编、程序的编译链接运行原理、CPU和操作系统原理、堆栈内存管理、指针、linux内核中的面向对象思想、嵌入式系统架构、C语言的模块化编程.....第 3 步:Linux系统编程第00期:Linux系统编程入门第01期:揭开文件系统的神秘面纱第02期:文件I/O编程实战第03期:I/O缓存与内存映射第04期:打通进程与终端的任督二脉第05期:进程间通信-------------------we are here!‍    第 4 步:Linux内核编程‍    练乾坤大挪移,九阳神功,是一道坎。搞驱动内核开发,懂不懂内核也是一道坎。第 5 步:嵌入式驱动开发    芯片原理、datasheet、硬件电路、调试手段、总线协议、内核机制、框架流程....第 6 步:项目实战    嵌入式、嵌入式人工智能、物联网、智能家居...

21,595

社区成员

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

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