打印

51单片机能实现中断自身嵌套吗

[复制链接]
楼主: betterhui
手机看帖
扫描二维码
随时随地手机跟帖
41
conwh| | 2007-5-17 13:39 | 只看该作者 回帖奖励 |倒序浏览

你说的没有错误,就是这个意思。

你也不需要引举经典,我不是在34楼中明确说明你在33楼中回答准确吗?
可是你看的书是指,“在撤消中断标志之前”才有“如果新来的中断其优先级比正在服务的优先级低,则CPU必须等到现有中断服务完成以后才会自动响应新来的中断请求”。如果高级的中断发生了,并且在中断中间(先甭管它是否有意义)交出了中断级别,那么这是较低级的中断也可以照样发生和执行的。书是应该活着看,如果把它看死了,那看书就没有什么意义了。你说我说的对否。

使用特权

评论回复
42
myfaith| | 2007-5-17 18:22 | 只看该作者

我就知道你有这个意思

“如果高级的中断发生了,并且在中断中间(先甭管它是否有意义)交出了中断级别,那么这是较低级的中断也可以照样发生和执行的。”你的这句话是对的,可是你有没有看清楚我在27楼说的“可以认为同一中断源是同一优先级,则不能打断前一中断响应,等前一中断响应完成后再响应后一次中断请求”这句话?我的前提是“同一中断源”,是同一中断源请问就算在中断服务中交出优先权是否还会如你所说能被自己再次打断???书的确是死的,但你活着看也不要把一匹死马也被你看得活起来了,这样的活看比死看更无意义。你说我说的对否。

使用特权

评论回复
43
conwh| | 2007-5-17 20:04 | 只看该作者

你再看看清楚为什么同一中断源,不能在前一次响应完毕前

不能响应第二次响应?按照你的原话是:
我的前提是“同一中断源”,是同一中断源请问就算在中断服务中交出优先权是否还会如你所说能被自己再次打断???
问题是越来越清楚了,答案就是:当然可以。
不知道你知道否,有个系统:就是分时系统,它就利用时间将各个进程给分割开,然后就是利用不同的状态对各个进程进行连接,在表面看各个任务是独立、并行完成,可实际就是时间割裂各进程单独完成的。

使用特权

评论回复
44
myfaith| | 2007-5-17 22:29 | 只看该作者

事实是这样子的吗

我认为,多任务系统的时分复用不属于"自身嵌套"之列,它的分时复用时在一个中断中执行同一中断也不能称为是像通常那样的是在中断服务中执行新的中断请求,因为分时割裂进程这种情况在实际上并不是被同一中断源打断
    再编辑加一句话:欢迎LS继续辩驳,这两天有事不来上网,过几天再来聆听高论!

使用特权

评论回复
45
conwh| | 2007-5-17 23:29 | 只看该作者

欢迎随时讨论

所以说:中断是可以重复的,但不能是相同功能(自身)重复中断。

使用特权

评论回复
46
xwj| | 2007-5-17 23:41 | 只看该作者

唉,这个灯笼怎么总是点不破呢?

邓喵的程序你到底仔细看了没有?
我换种方式跟你解释吧:
首先
         ORG 0023H          ; INT FOR UART串口中断入口,进入后本级中断优先级被占用,也就是说不能响应本级或更低的中断了,对吧?(1)
....     ;中断程序
....
....
INT_RET:     RETI   ; 执行RETI,退出本中断并释放本级的中断优先级占用,这时就能再响应本级优先级的中断了,对吧?(2)

好,那再看下面的代码:
;当前执行的程序段B
...
...
...
...
              ACALL 标号    ;执行到这一句,程序会把下一条指令地址压栈,并跳转到标号执行程序段A,对吧?(3)
NEXT:
....
....

;放在别的地方的另外一段程序
标号:                   ;程序段A
....
....
              RET       ;到这一句时,会把当前堆栈的2字节(之前ACALL压栈的2字节)弹出到PC+1指针,下一条指令会接着执行ACALL 标号的下一句(NEXT标号处的指令)以及后面的程序,对吧?(4)

如果你觉得问题(1)(2)(3)(4)的答案都是对的,那么继续往下看:
我们在上面的程序中加几句代码,如下:
         ORG 0023H          ; INT FOR UART串口中断入口,进入后本级中断优先级被占用,也就是说不能响应本级或更低的中断了,对吧?(1)
SUB_TX:
....
            ACALL INT_RET   ;执行到这一句,程序会把下一条指令地址压栈,并跳转到INT_RET:,对吧?(3)
                            ;好,那我们跳到后面的INT_RET标号继续跟踪程序
NEXT:                       ;ACALL INT_RET的下一句,为了好找我们做个记号
....     ;中断程序
....
....
INT_RET:     RETI   ; 执行RETI,退出本中断并释放本级的中断优先级占用,这时就能再响应本级优先级的中断了,对吧?(2)
                            ;INT_RET只有一句话:RETI,那这是会执行RETI,对吧?
                            ;执行RETI的话,释放本级的中断优先级占用,并执行类似RET的功能把当前堆栈的2字节(之前ACALL压栈的2字节)弹出到PC+1指针,下一条指令会接着执行ACALL INT_RET的下一句(NEXT标号处的指令)以及后面的程序,对吧?(4)
                            ;这时原来的中断程序是不是还能照样执行,一直到RETI呢?
                            ;是的话,那么这时再发生本级优先级的中断请求,会不会响应呢??
                            ;这时如果再有串口中断请求,那么会不会再次响应呢?会不会再从     ORG 0023H  ; INT FOR UART串口中断入口  进入串口中断呢???
                            ;如果会的话那这时是否嵌套了呢???

                            ;如果你非要说不是什么“自嵌套”,那好,我在NEXT号后面加一句SETB RI或SETB TI,那会发生什么事呢????
                            ;那就会不停的进中断0023H,变成死循环了:-)        当然,这是不允许的了:-)

你有耐心的话一个一个的做判断题吧,判断完了也就会有答案了...

使用特权

评论回复
47
high| | 2007-5-18 00:07 | 只看该作者

老deng玩汇编的玩出花样来了

不过我觉得已经不是嵌套了.我想嵌套该是满足FILO.否则何以称"嵌套",顶多是重入.要想真正的嵌套需要找到其他途径突破 35楼说的硬件优先级判断.

此外,我很同意xwj的观点 -- 原则上根本不该有这样的设计.我没能想出需要这个的理由.

大家歇歇气.

使用特权

评论回复
48
myfaith| | 2007-5-18 00:24 | 只看该作者

你在想当然了

 xwj 你是不是有点想当然了?没有发现你程序中RETI指令使用错误吗?还正在暗自得意是吧?现在是深夜12:33我要睡觉了,明天一大早出去有事大后天才会回来,现在必须睡觉了所以对于你的错误我这里只提醒你就不详细指出了,等大后天回来再给你细细道来.希望你自己能够自己悟出并改正

使用特权

评论回复
49
hotpower| | 2007-5-18 01:20 | 只看该作者

哈哈~~~我现在已能背出邓苗的套路来了~~~

使用特权

评论回复
50
high| | 2007-5-18 01:50 | 只看该作者

老邪也是来捡便宜来了.哈哈.

我也偷偷背了一遍.比起"前后台"是有些优势,但还是属于非典作风.

使用特权

评论回复
51
computer00| | 2007-5-18 01:58 | 只看该作者

倒塌了~~~~~快睡觉去.......

使用特权

评论回复
52
hotpower| | 2007-5-18 02:04 | 只看该作者

哈哈~~~我准备和51说拜拜~~~

使用特权

评论回复
53
xwj| | 2007-5-18 02:20 | 只看该作者

唉,27楼自己不开窍,你自己有空就去研究研究邓喵13楼的写

我45楼的贴只是为了让你便于理解,自然不能说得太复杂,照那样写一次中断自然会执行两次RETI,真要实用自然是有办法考虑到的,就不用你提醒了

中断重入、如何可靠软复位, 这可以说是用的不能再用、讨论的不想再讨论的话题了,所以我前面都是一笔带过了

你如果觉得这样用RETI不正确,那么恭喜你,你是个很按规矩办事的人!
但是,我也可以告诉你,我们公司十几年前的程序中就有这样的应用,而且可以说这么多年来都是可靠运行的。
而且,你去研究研究别人的OS代码,你也会发现很多的这种应用的


非典的设计能实现很多看似不能或想象不到的功能,但也要做好承受代价的准备--稍有考虑不周就可能出些你意想不到的问题:-)
--虽然我很不赞成这种编程风格,一般都尽量避免,但在必要时也不会拒绝这种写法


PS:这些都是很基础的问题,我不觉得有什么好得意的地方,也不知道我哪里让你觉得我“自鸣得意”了,

而且,最近我现在也确实很忙,白天基本上都很少灌水了,这帖子都是半夜爬起来码的字,所以很多问题都是三言两语指出关键避免走入弯路就没管了,相信有心学习、乐于思考的人自己能找出答案的。

我不是21ic的版主,但我回答的问题比很多版主都多得多,但一直有个基本原则:不懂的决不说,只说对的!

比起直接给出答案,我更觉得提供线索、方向,让疑问者自己去思考出答案应该能得到更多的收获:-)


也只有碰到实在点不破的灯笼或可能误导新人的问题,才会详细解答

使用特权

评论回复
54
xwj| | 2007-5-18 02:20 | 只看该作者

睡觉了...

使用特权

评论回复
55
HotPower| | 2007-5-18 06:42 | 只看该作者

早起来了1个小时了~~~

不过新手要先研究通邓苗同志的写法后再应用,否则可能要伤身体的~~~

使用特权

评论回复
56
dengm| | 2007-5-18 07:31 | 只看该作者

可能要伤身体的, 但设计的好的话,mcu or uart 的利用率可>90%

使用特权

评论回复
57
xwj| | 2007-5-18 07:38 | 只看该作者

对于串口,不觉得能增加什么“利用率”

使用特权

评论回复
58
dengm| | 2007-5-18 12:27 | 只看该作者

这个写法叫 “中断优先级扩展的软件模拟”

“中断服务” 在未结束前,降低自己的优先级。
如不要嵌套可这样写:
       ORG 0023H
          JBC RI, SUB_RX
          JBC TI, SUB_TX
INT_RET:
             IRET  
             NOP
;---------------------
       ORG 0050H
sub_rx:    ;不要嵌套 的
            MOV BUF_SBUF, SBUF
            CLR ES           ; 停本中断源, 不要嵌套
            ACALL INT_RET    ; 降低自己的优先级
                             ; “中断服务”还继续。。。。。
            
            XCH A, R1
            ANL A, #1FH
            ORL A, #60H      ; IN_BUF: 60H -7FH   
            XCH A, R1
            XCH A, BUF_SBUF                  
            MOV @R1, A
            INC R1
            INC IN_LEN
            MOV A, BUF_SBUF
            
            SETB ES    ; 开本中断源
    ; 中断相关指令,下一 "ret" 之前不会被中断打断,
            RET        ; (在就是Intel的高明!!!)及时出栈
;------------------------------------------------------------
SUB_TX:   ;下面为 嵌套 的
         ACALL INT_RET    ; 降低自己的优先级
         XCH A, OUT_LEN
         JZ SUB_TX_EX
;--------------------------
         XCH  A, OUT_INDEX
         ANL A, #1FH
         ORL A, #40H  ;  OUT_BUF:  40H TO 5FH
         XCH A, R0
         XCH A, @R0
         MOV SBUF, A
         MOV A, @R0
         XCH A, R0
         INC A
         XCH A, OUT_INDEX
         DEC A
SUB_TX_EX:
         XCH A, OUT_LEN
         RET
;----------------------------

        

           

使用特权

评论回复
59
80572892| | 2007-5-18 14:25 | 只看该作者

自己能中断自己吗?

自己能中断自己吗?都是用一个中断啊,是同一个中断优先级,
我感觉不行   
高手来说说,,看看能行不?//

使用特权

评论回复
60
xwj| | 2007-5-18 18:31 | 只看该作者

LS,拜托先看完贴再来问

你的问题前面已经说了答案了...

使用特权

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

本版积分规则