社区
C语言
帖子详情
在中断处理函数中使用printf()为什么不正常?
csdnzzy
2004-08-18 10:20:32
为串口接收建立的一个interrupt,其中使用了printf()函数,每次一触发进入该中断就死机,去掉printf()就正常了。编译器模式为Huge。盼高手指点迷津!
...全文
2227
17
打赏
收藏
在中断处理函数中使用printf()为什么不正常?
为串口接收建立的一个interrupt,其中使用了printf()函数,每次一触发进入该中断就死机,去掉printf()就正常了。编译器模式为Huge。盼高手指点迷津!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
17 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
BluntBlade
2004-09-02
打赏
举报
回复
使用缓冲区保存输出信息是比较好的做法。
kb
2004-09-02
打赏
举报
回复
厉害,这些东西怎么书本上都查不到呢。
想顺便问以下,如果在中断里面,进行读写文件会不会出问题呢?
line() , lineto() 这些函数是不是也是不可重入函数呢。
我已经被这些问题折磨了3个星期了。
blh
2004-08-24
打赏
举报
回复
Because printf call is a type of I/O operation, and I/O operation will be implemented via interruption of I/O hardware device.
FoxMale007
2004-08-24
打赏
举报
回复
在中断里,我的建议是采用直接写屏输出
这样就OK了
printf是调用中断的,可能在中断中调用其它中断好象有问题?尤其对于时间中断?
csdnzzy
2004-08-23
打赏
举报
回复
终于发现了一个治标的解决办法:把出问题的文件代码中所有的getchar()函数去掉,就可以在中断中正常使用printf()了。幸好getchar()只是调试时用。
仍然不很明白这个问题的根本原因,望各位高手朋友继续多指点,我一直想会不会和编译器(TurboC2.0和3.0)的设置有关系。
huangyang88
2004-08-21
打赏
举报
回复
这些都是底层开发的吗
LoveCreatesBeauty
2004-08-21
打赏
举报
回复
学习
Areslee
2004-08-21
打赏
举报
回复
在这里最关键的问题不是不可重入--虽然它是一个重要的原因
更关键的是在中断中应该减少对栈的使用,否则很可能因为当前客户程序没有提供足够的栈空间引起崩溃
csdnzzy
2004-08-18
打赏
举报
回复
由于还涉及到多个按键的响应,而且主体程序已定形,改用在主循环中查询的办法太困难了。
以前在时钟/定时器的CTC0中断中使用printf()也是不行,后来发现把编译器模式改为Huge就好了,不知道这次怎么不行了。
wwwooowww
2004-08-18
打赏
举报
回复
长见识。这些东西在哪里了解?
柯本
2004-08-18
打赏
举报
回复
DOS 是不持重入的,改用int 10 或直接硬件屏幕输出
cputs或cprintf应可以
sekelon
2004-08-18
打赏
举报
回复
比如在中断中只是将串口中接收到的字符串存入缓冲buffer中,再将接收标志置为真,在主循环中判断接收标志为真时显示buffer中的内容就可以了
sekelon
2004-08-18
打赏
举报
回复
不要在中断中使用这些函数,中断函数内的操作尽可能的短小和简单,类似于一些标志量的置位等赋值操作就可以了,至于printf等显示处理的话在大循环中通过判断表质量的方式来完成
北极猩猩
2004-08-18
打赏
举报
回复
“DOS 是不持重入的”
就是因为这个。
因为printf的实现是使用了DOS中断int 13的功能,因此,它是不能在中断处理函数中使用的。
KingI
2004-08-18
打赏
举报
回复
学习
北极猩猩
2004-08-18
打赏
举报
回复
"DOS 是不持重入的"
问题就在这里,因为printf的实现使用了DOS中断的功能,因此在中断处理函数中使用就会导致中断重入,因而造成问题
ma100
2004-08-18
打赏
举报
回复
不可重入函数是指这样的一类函数,不可以在它还没有返回就再次被调用。例如printf,malloc,free等都是不可重入函数。因为信号可能在任何时候发生,例如在printf执行过程中,因此不能在信号处理函数里调用printf,否则printf将会被重入。
函数不可重入大多数是因为在函数中引用了全局变量。例如,printf会引用全局变量stdout,malloc,free会引用全局的内存分配表。
STM32--多通道ADC
STM32F10x系列ADC的
使用
(二)——多通道ADC
中
断
处理函数
注意事项
中
断
服务函数由硬件触发,因此不能获得参数,也无法返回值;另一方面,在
中
断
服务函数
中
使用
不可重入的函数,往往会导致问题。
使用
printf
为什么要重定向,为什么可以重定向?
困惑多年,为什么
printf
可以重定向?(转知乎鱼鹰谈单片机,再次记录一下,防止以后忘记)
使用
printf
为什么要重定向,为什么可以重定向? **一、要重定向是因为:**
printf
是一个库函数,用户不知道其源代码是什么?因此当比如输出到 LCD、串口1、串口2,我们不可能去修改标准库的源码。因此我们需要重新重定向一个 二、为什么可以重定向:因为_attribute__((weak)) 很多人在用
printf
函数进行串口打印的时候,都会被告知需要重定向fputc函数(别的平台可能不是这个函数),让字符串
中
断
处理程序不能
使用
printf
的本质
转自https://blog.csdn.net/mao0514/article/details/32700835 vxworks
中
断
处理程序之所以不用
printf
,本质在于
printf
是将信息输出到标准输出设备(STDOUT)
中
, 整个标准输出设备是一个全局变量,由于有semTake操作,那么就会发生阻塞,vxworks属于硬实时操作系统,不能在规定的时间内完成操作即会死机或复位。所以vxw...
中
断
上半部不建议
使用
printf
函数
在
中
断
的上半部分,最好不要
使用
printf
函数进行输出。因此,在
中
断
上半部分
中
最好只执行非常简单、高效的操作,并将更复杂的操作推迟到下半部分
中
执行。如果需要输出调试信息,可以
使用
专门为
中
断
处理设计的日志函数或者记录缓冲区等方式。在
中
断
上下文
中
使用
printf
函数可能会引起死锁,这是因为
printf
函数需要对输出进行缓冲和同步处理。当
中
断
处理程序执行
printf
函数时,该函数会将输出数据写入内核的输出缓存区。
C语言
70,038
社区成员
243,245
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章