社区
C语言
帖子详情
请问在中断函数中,加入printf()函数,是不是不可以?
icegrape
2006-07-28 03:06:00
在编串口程序,用tc2.0,结果程序调试总是不成功,去掉中断处理子程序中的printf函数,会少一些错误,这是为什么呢,请高手多多指点哦^_^
...全文
1195
11
打赏
收藏
请问在中断函数中,加入printf()函数,是不是不可以?
在编串口程序,用tc2.0,结果程序调试总是不成功,去掉中断处理子程序中的printf函数,会少一些错误,这是为什么呢,请高手多多指点哦^_^
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
gerald_xiao
2006-07-31
打赏
举报
回复
如果printf是中断实现的,由于中断常常不能嵌套,所以会有问题。
根据我的经验:在中断中用printf来打印,如果在移植OS的过程中,printf是基于中断的,那么你的程序有时候可能会死掉,但不是每次必现。后来,我们将printf都改成任务级别,也就是在中断中仅仅向一个任务发一个打印消息过去,后来就运行的非常稳定。欢迎大家一起讨论
yifanernei
2006-07-30
打赏
举报
回复
呵呵,全局变量具体我也记不清是什么了,我只给你个大概的意思,因为很久没有摸过这些东西了,比如说errno就是全局变量
加不加disable()和能不能用printf没有关系的不是吗?
但是加了disable()不是就不会再发生中断了吗?
非要改变中断寄存器的话也是可以的,这在串行通讯应该有相应的功能调用的,可以用int86x()来处理吧应该
http://www.gjwtech.com/ 写串行通讯的程序,这个网站你不应该没有看过吧,上面的知识点应该比我讲的清很多的,你可以去看一下
yifanernei
2006-07-29
打赏
举报
回复
这里你可以用一个全局变量来防止重入
即
void interrupt prc()
{
if (1 == bIn)
{
return ;
}
bIn = 1;
//....
bIn = 0;
}
不知道这样是不是和你的意思
防止再次中断发生可以也可以在进入中断函数前用
disable()来关中断,在你的函数执行结束前用enable()来打开中断
icegrape
2006-07-29
打赏
举报
回复
printf函数有可能在执行过程中被打断而进入中断函数
-------------------------------------------------------
可是我的中断处理子程序的开始用了disable(),你的意思是说这样就可以用printf吗?
可是好像不可以把
icegrape
2006-07-29
打赏
举报
回复
“printf要用到一些全局的变量”
------------------------------------------------
这个全局变量是指什么呢?是指要显示的变量吗,如果printf显示的并不是全局变量呢?
还是说printf函数本身要用到一些全局变量,是指系统编译器的值吗?
icegrape
2006-07-29
打赏
举报
回复
我的意思是可不可以再中断处理子函数中,改变中断控制寄存器的值,这样可以吗?比如我在处理modem状态变化的中断处理子函数中改变中断控制寄存器的值,使其禁止下次modem中断,可是此时我的modem中断处理子函数并没有执行完,这样可以吗?
bombwang
2006-07-28
打赏
举报
回复
学习学习学习...
icegrape
2006-07-28
打赏
举报
回复
能再问个关于中断的问题吗?
可以在中断处理子程序中改变中断控制寄存器的值吗?
比如在串口中在产生modem中断后,我在modem中断处理子程序中,禁止下次再产生modem中断,可以吗?是不是这个是不允许的呢?
m_nNightmire
2006-07-28
打赏
举报
回复
学习学习学习...
yifanernei
2006-07-28
打赏
举报
回复
中断函数中是不可以调用printf函数的,这样是为了防止函数的重入
即,printf要用到一些全局的变量,但printf函数有可能在执行过程中被打断而进入中断函数
中断函数中再调用printf函数会造成函数重入,有可能导致不能回到正常流程中去
还有一些函数也是同样的道理,只是记不住名字了,pritnf最引人注目了
m_nNightmire
2006-07-28
打赏
举报
回复
应该是可以的
把你的错误信息贴一些出来吧
最好也贴一些代码
为什么在
中
断
服务
函数
中
不能使用
printf
函数
如果在
中
断
服务
函数
中
调用
printf
来打印调试信息,可能会发生以下结果: 1.打印不完整或者根本无法打印 2.程序能执行,但是行为异常 3.程序无法执行 此时此刻,我只想问一句,为什么?为什么?为什么? 需要分各种情况讨论。【按照
中
断
函数
的行为】有些
中
断
函数
为了防止
中
断
嵌套,会将
中
断
临时禁用【按照
printf
的实现方式】,有些会通过轮询方式实现,优先会通过串口
中
断
方式实现。 如果
中
断
函数
中
禁用了
中
断
如果调用的
printf
依赖
中
断
打印,会造成
printf
无法打印 如果调用的
printf
通过轮询方式实现,打印
为何stm32
中
断
处理
函数
里不能调用
printf
?
背景: 末日在用stm32h750XBHx系列芯片测试其串口的接收
中
断
时候,想在接收
中
断
函数
中
加入
printf
函数
,发现程序运行后,如果串口不断接收到数据,pc端的串口助手仅仅出现一次
printf
的打印信息,怀疑自己的程序
是不是
有问题? 后来在网上搜了一下,发现很多人遇到这个问题,主要原因:有一条非常经典的戒律:
中
断
服务程序里,不能调用
printf
,malloc
函数
。大致理解就是,
printf
放在
中
断
里,相当于
中
断
中
嵌入
中
断
,这样的
函数
可能被阻塞,
中
断
中
不能调用有可能被阻塞的
函数
。 ...
UART通信
中
断
函数
中
不要使用
printf
printf
函数
执行过程
中
,主
中
断
可能会再次被触发,从而再次调用
printf
,造成
printf
函数
的重新进入。而很多
printf
函数
由于调用了全局资源,是不支持可重新进入的,会造成灾难性后果。【按照
中
断
函数
的行为】有些
中
断
函数
为了防止
中
断
嵌套,会将
中
断
临时禁用【按照
printf
的实现方式】,有些会通过轮询方式实现,优先会通过串口
中
断
方式实现。如果调用的
printf
通过轮询方式实现,打印一段字符的时间过长,大大降低
中
断
处理效率,而且在
中
断
禁用期间可能会错失很多其它
中
断
。1.如果
中
断
函数
中
禁用了
中
断
。
在
中
断
中
使用
printf
函数
导致
中
断
异常
Q:
中
断
中
使用
printf
函数
导致
中
断
异常 A:
printf
函数
是不可重入
函数
,包含了全局变量的使用以及大量循环的使用, 而嵌入式
中
的触发
中
断
执行的优先级很高, 会随时触发和打断现有代码运行顺序, 那么加载不可重入
函数
,会导致
中
断
函数
异常, Q:如何在stm32
中
使用
printf
函数
打印串口信息 A:重新编写arm库
中
的fputs
函数
(该
函数
会被
printf
调用。),使其能够通过串口输出, ...
为什么不能在
中
断
中
使用
printf
--不可重入
函数
前言 前两天在笔试的时候遇到了关于能否在
中
断
中
使用
printf
的问题,当时有点蒙,笔试结束后查阅了资料,这里进行以下总结 可重入
函数
和不可重入
函数
printf
不能在
中
断
中
被调用的原因是它是一个不可重入
函数
,而在
中
断
中
要避免调用不可重入
函数
,首先我们先说说什么是可重入
函数
,什么是不可重入
函数
简单说来,区分一个
函数
是否可重入就是看这个
函数
能否在未返回的时候再次被调用。而造成一个
函数
不可重入的原因往...
C语言
70,021
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章