社区
C语言
帖子详情
在中断处理函数中使用printf()为什么不正常?
csdnzzy
2004-08-18 10:20:32
为串口接收建立的一个interrupt,其中使用了printf()函数,每次一触发进入该中断就死机,去掉printf()就正常了。编译器模式为Huge。盼高手指点迷津!
...全文
2221
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在
使用
DMA
中
断
时的情况,验证了DMA
中
断
不会干扰主程序执行。通过在DMA
中
断
中
调用
printf
()并在主函数
中
再次调用,结果显示主函数的
printf
()能正常运行。因此,避免在主函数
中
使用
延迟函数以防止
中
断
执行的干扰。对于ADC数据处理,推荐
使用
中
断
方式,因为
中
断
能及时响应ADC转换,而阻塞式方法可能因延迟导致处理不及时。
中
断
处理的效率和实时性优于阻塞式函数。
中
断
处理函数
注意事项
本文探讨了
中
断
处理函数
的设计原则,包括无返回值和形参、避免
使用
浮点运算和标准库函数如
printf
、malloc等,以及保持函数短小有效。详细解释了为何在
中
断
服务函数
中
改变全局变量需
使用
volatile关键字,以及浮点运算和标准库函数不可重入的原因。
使用
printf
为什么要重定向,为什么可以重定向?
本文探讨了
printf
函数如何通过弱属性(weak)实现重定向,以适应不同输出设备如LCD、串口的需求。弱属性允许在没有标准库源码的情况下,不修改原有函数实现新的功能。通过分析fputc函数,展示了如何在不拥有标准库源码时,通过自定义实现达到输出重定向。同时,该属性也在
中
断
处理函数
中
应用,使得在多个文件
中
定义相同函数名成为可能,但最终只会链接一个。
中
断
处理程序不能
使用
printf
的本质
本文探讨了VxWorks操作系统
中
使用
printf
函数的问题,特别是在
中
断
处理程序
中
的
使用
。由于
printf
涉及对全局变量的操作并可能引发阻塞,这与VxWorks的实时特性冲突。文章还区分了线程安全和可重入函数的概念。
中
断
上半部不建议
使用
printf
函数
在
中
断
处理程序
中
不应
使用
printf
,因为这可能导致死锁或占用过多堆栈空间。
中
断
处理应快速且高效,可以
使用
专为
中
断
设计的日志函数。
printf
的内核输出缓存可能导致竞争条件,特别是在多
中
断
环境。避免
使用
需要缓冲同步的函数是防止此类问题的关键。
C语言
70,038
社区成员
243,247
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章