打印
[MCU]

能否允许中断里再产生同一个中断

[复制链接]
3067|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cm398515912|  楼主 | 2014-9-8 18:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
比如串口中断处理函数
void Uart_Isr() interrupt 4
{
        if(RI)
        {
                RI = 0;
                UartSendString("hello");
        }
        if(TI)  TI = 0;
}

UartSendString是串口发送字符串函数,中断里头会不会再次触发中断,如果会有什么影响,怎么解决?

相关帖子

沙发
lnulibin| | 2014-9-8 19:07 | 只看该作者
同一中断优先级的中断,不可能产生嵌套。

UartSendString("hello");
函数发送完成引起的TI标志置位。
可能在本次中断处理函数中随后被清零,也可能在本次中断处理函数执行完成后,再次引发的中断处理函数中被清零。
我认为问题不大,没发现隐患。
呵呵,存属个人见解,不权威。可能运行时间长了。会有不易察觉的问题。

使用特权

评论回复
板凳
cm398515912|  楼主 | 2014-9-8 19:24 | 只看该作者
lnulibin 发表于 2014-9-8 19:07
同一中断优先级的中断,不可能产生嵌套。

UartSendString("hello");

感谢指导 实际运行会在发送h字符后卡住不动。。。

使用特权

评论回复
地板
wangch_sh| | 2014-9-8 19:32 | 只看该作者
波特率多少?会不会波特率太高?

使用特权

评论回复
5
cm398515912|  楼主 | 2014-9-8 19:50 | 只看该作者
wangch_sh 发表于 2014-9-8 19:32
波特率多少?会不会波特率太高?

不会啊 9600bps  
问一个问题,51单片机如果在串口通信前将P3^0 P3^1置低,能正常收发数据吗

使用特权

评论回复
6
wangch_sh| | 2014-9-8 19:53 | 只看该作者
你置低干吗?

使用特权

评论回复
7
cm398515912|  楼主 | 2014-9-8 20:02 | 只看该作者
wangch_sh 发表于 2014-9-8 19:53
你置低干吗?

实际需要啊  这2个IO口复用的 正常用作普通IO 会经常拉高拉低的  

使用特权

评论回复
8
ayb_ice| | 2014-9-9 08:06 | 只看该作者
同一中断是不可以的,也没有这个必要

使用特权

评论回复
9
ayb_ice| | 2014-9-9 08:37 | 只看该作者
如果非要这么做,技术上也是可以的,但很难保证不会产生意想不到的事情

比如51在中断里调用个函数,什么也不做,仅执行RETI中断返回指令,那么后面的同级中断就可以执行了


        org                00bh
        jmp                isr_t0



isr_t0:
        call        proc_reti        ; 释放同级中断

        push        ...

        call        user_code

        pop                ...
        ret


proc_reti:
        reti

user_code:
        ...
        ret

使用特权

评论回复
10
xbyu520| | 2014-9-9 09:01 | 只看该作者
cm398515912 发表于 2014-9-8 19:24
感谢指导 实际运行会在发送h字符后卡住不动。。。

你是想接受一个或者一系列字符后,电脑返回一个“hello”??????你可以接收采用“中断”的方法接收字符,然后在接收ISR中采用查询TI标志位的方法来发送反馈字符。仅供参考,欢迎反馈试验效果。

使用特权

评论回复
11
xbyu520| | 2014-9-9 09:02 | 只看该作者
本帖最后由 xbyu520 于 2014-9-9 10:10 编辑

void Uart_Isr() interrupt 4
{
        if(RI)
        {
                RI = 0;
                UartSendString("hello");
        }
//       if(TI)  TI = 0;//屏蔽掉这段代码
}
// UartSendString("hello");此发送函数采用查询法(非中断)来发送数据。

或者把此函数UartSendString("hello");放到主程序中 ,不要放到这里。接收处理服务程序中只用一个软件标记。。。。。。。然后在主程序中判断这个软件标记后进行处理。菜鸟意见,仅供参考。欢迎大侠来指正!!


另外。你目前只能返回一个字符‘“h”  是因为只是第一次进入中断ISR时发送了“h”     第二次、第三次......第N次进入中断ISR无法执行到  UartSendString("hello"); 单步调试可以看出来。菜鸟意见,仅供参考。欢迎大侠来指正!!欢迎你反馈实际调试结论。。。。

使用特权

评论回复
12
原野之狼| | 2014-9-9 12:00 | 只看该作者
若无必要  勿增实体   奥**剃刀法则

使用特权

评论回复
13
原野之狼| | 2014-9-9 12:01 | 只看该作者
Keep  simple, but not too simple.   老爱法则

使用特权

评论回复
14
cm398515912|  楼主 | 2014-9-9 21:26 | 只看该作者
xbyu520 发表于 2014-9-9 09:02
void Uart_Isr() interrupt 4
{
        if(RI)

实测正常了  在主函数中查询RI运行UartSendString能正常发送接收了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

93

主题

128

帖子

2

粉丝