社区
C语言
帖子详情
在中断处理函数中使用printf()为什么不正常?
csdnzzy
2004-08-18 10:20:32
为串口接收建立的一个interrupt,其中使用了printf()函数,每次一触发进入该中断就死机,去掉printf()就正常了。编译器模式为Huge。盼高手指点迷津!
...全文
2192
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会引用全局的内存分配表。
为什么在
中
断
服务函数
中
不能
使用
printf
函数
如果在
中
断
服务函数
中
调用
printf
来打印调试信息,可能会发生以下结果: 1.打印不完整或者根本无法打印 2.程序能执行,但是行为异常 3.程序无法执行 此时此刻,我只想问一句,为什么?为什么?为什么? 需要分各种情况讨论。【按照
中
断
函数的行为】有些
中
断
函数为了防止
中
断
嵌套,会将
中
断
临时禁用【按照
printf
的实现方式】,有些会通过轮询方式实现,优先会通过串口
中
断
方式实现。 如果
中
断
函数
中
禁用了
中
断
如果调用的
printf
依赖
中
断
打印,会造成
printf
无法打印 如果调用的
printf
通过轮询方式实现,打印
UART通信
中
断
函数
中
不要
使用
printf
printf
函数执行过程
中
,主
中
断
可能会再次被触发,从而再次调用
printf
,造成
printf
函数的重新进入。而很多
printf
函数由于调用了全局资源,是不支持可重新进入的,会造成灾难性后果。【按照
中
断
函数的行为】有些
中
断
函数为了防止
中
断
嵌套,会将
中
断
临时禁用【按照
printf
的实现方式】,有些会通过轮询方式实现,优先会通过串口
中
断
方式实现。如果调用的
printf
通过轮询方式实现,打印一段字符的时间过长,大大降低
中
断
处理效率,而且在
中
断
禁用期间可能会错失很多其它
中
断
。1.如果
中
断
函数
中
禁用了
中
断
。
在
中
断
中
使用
printf
函数导致
中
断
异常
Q:
中
断
中
使用
printf
函数导致
中
断
异常 A:
printf
函数是不可重入函数,包含了全局变量的
使用
以及大量循环的
使用
, 而嵌入式
中
的触发
中
断
执行的优先级很高, 会随时触发和打断现有代码运行顺序, 那么加载不可重入函数,会导致
中
断
函数异常, Q:如何在stm32
中
使用
printf
函数打印串口信息 A:重新编写arm库
中
的fputs函数(该函数会被
printf
调用。),使其能够通过串口输出, ...
为何stm32
中
断
处理函数
里不能调用
printf
?
背景: 末日在用stm32h750XBHx系列芯片测试其串口的接收
中
断
时候,想在接收
中
断
函数
中
加入
printf
函数,发现程序运行后,如果串口不断接收到数据,pc端的串口助手仅仅出现一次
printf
的打印信息,怀疑自己的程序是不是有问题? 后来在网上搜了一下,发现很多人遇到这个问题,主要原因:有一条非常经典的戒律:
中
断
服务程序里,不能调用
printf
,malloc 函数。大致理解就是,
printf
放在
中
断
里,相当于
中
断
中
嵌入
中
断
,这样的函数可能被阻塞,
中
断
中
不能调用有可能被阻塞的函数。 ...
为什么
中
断
处理函数
中
不能
使用
printf
语句
一个ISR应该避免调用不可重入函数。一些标准库函数是不可重入的,如经常实现的malloc和
printf
。因为
中
断
可能发生在执行任务
中
,因为任务可能是在“malloc”的函数调用
中
,如果ISR调用此相同的不可重入函数,由此产生的行为可能是灾难性的。 不可重入函数是指这样的一类函数,不可以在它还没有返回就再次被调用。例如
printf
,malloc,free等都是不可重入函数。因为信号可能在任何时
C语言
70,039
社区成员
243,247
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章