购物车0种商品
IC邮购网-IC电子元件采购商城
51单片机能实现中断自身嵌套吗
(2011/10/31 9:52:00)
能有方法实现吗,哪位大虾指点一把

网友评论:中断是不可重入的

网友评论:终审判决:自身中断是不能嵌套的.
可以认为同一中断源是同一优先级,则不能打断前一中断响应,等前一中断响应完成后再响应后一次中断请求.
本判决为终审判决,不可上诉.
本贴讨论到此为止

网友评论:免得误导别人

网友评论:dengm大虾的方法甚妙!可以看作是中断嵌套!

网友评论:dengm和prcxf两位没有理解"嵌套"的含义吧,dengm那不是中断嵌套,也不可以看成是嵌套,只是在中断服务程序里的一个跳转语句而已,跟本贴讨论的"同一中断的嵌套"没有干系
正确答案在27楼
28楼说我不懂在误导别人,你自以为很懂的话总是回答和楼主的问题不相关的话,人家既然问自身嵌套你就不要说其它嵌套很容易,也不要你管它为什么要自身嵌套、有没有必要嵌套?你只管回答行还是不行,并给出理由就行了,还说楼主新手错误问题,表达错误,想法错误,哼哼,懂点皮毛就不得了了,看你的积分排名和你说的话不相称

网友评论:终审

终审判决:自身中断是不能嵌套的.
可以认为同一中断源是同一优先级,则不能打断前一中断响应,等前一中断响应完成后再响应后一次中断请求.
本判决为终审判决,不可上诉.
本贴讨论到此为止



网友评论:31楼的conwh朋友叫我来回答什么叫中断是什么意思?莫非又是一个"高手"来考验我这个"新手"?中断定义:中断是指计算机暂时停止原程序的执行转而为外部设备服务(执行中断服务程序),并在服务完成后自动返回原程序执行的过程.
不知conwh朋友是否满意我的解释

网友评论:51可以完成类似RISC的中断(只是响应中断功能时不能自动关中断),当然也要编程实现,一般的书是不会介绍的,INTEL的8051用户手册上有介绍,但RISC不能完成51的中断嵌套功能(通过软件编程也不能完全实现)...
51的中断优先级方式是科学的...
RISC的中断处理方法主要是考虑降低硬件的复杂性...

网友评论:虽然没用过,据说很费RAM的,建议你再想别的思路,不行就换片子吧,别难为51了,普通的51就256个寄存器,除了其他用途的,能有多少剩余的?

网友评论:不要用这种办法

网友评论:程序重入还必须考虑现场数据的保护,否则只是一个玩意而已。


网友评论:我在27楼难到对"中断"的概念有什么不妥的说法?先撇开27楼对"能否自身嵌套"问题的说法是否正确,依conwh朋友的语气好象我在27楼里还有对"中断"这个概念的错误表述和认识,请conwh朋友明确的指出错误所在?
[我猜测conwh朋友的意思可能是指我27楼所表述的"不能打断前一中断"所以不叫中断,所以说我没理解中断的概念.如果他是这个意思的话,那么在高优先级的中断服务在执行时发生了低优先级中断请求,那么是否也不能称这个低优先级的中断为"中断"呢?照此推下去书上全错了,因为几乎所有单片机的书上都有这样的描述:“如果新来的中断其优先级比正在服务的优先级低,则CPU必须等到现有中断服务完成以后才会自动响应新来的中断请求”(第211页,胡汉才,单片机原理及其接口技术,北京:清华大学出版社,2004)不知我对conwh朋友的意思的猜测是否正确,还请conwh朋友自己明确的把自己的意思表达出来]

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

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


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

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

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

网友评论:邓喵的程序你到底仔细看了没有?
我换种方式跟你解释吧:
首先
ORG0023H;INTFORUART串口中断入口,进入后本级中断优先级被占用,也就是说不能响应本级或更低的中断了,对吧?(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)的答案都是对的,那么继续往下看:
我们在上面的程序中加几句代码,如下:
ORG0023H;INTFORUART串口中断入口,进入后本级中断优先级被占用,也就是说不能响应本级或更低的中断了,对吧?(1)
SUB_TX:
....
ACALLINT_RET;执行到这一句,程序会把下一条指令地址压栈,并跳转到INT_RET:,对吧?(3)
;好,那我们跳到后面的INT_RET标号继续跟踪程序
NEXT:;ACALLINT_RET的下一句,为了好找我们做个记号
....;中断程序
....
....
INT_RET:RETI;执行RETI,退出本中断并释放本级的中断优先级占用,这时就能再响应本级优先级的中断了,对吧?(2)
;INT_RET只有一句话:RETI,那这是会执行RETI,对吧?
;执行RETI的话,释放本级的中断优先级占用,并执行类似RET的功能把当前堆栈的2字节(之前ACALL压栈的2字节)弹出到PC+1指针,下一条指令会接着执行ACALLINT_RET的下一句(NEXT标号处的指令)以及后面的程序,对吧?(4)
;这时原来的中断程序是不是还能照样执行,一直到RETI呢?
;是的话,那么这时再发生本级优先级的中断请求,会不会响应呢??
;这时如果再有串口中断请求,那么会不会再次响应呢?会不会再从ORG0023H;INTFORUART串口中断入口进入串口中断呢???
;如果会的话那这时是否嵌套了呢???

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

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


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

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

大家歇歇气.

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

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

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

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

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


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


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

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

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

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


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



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

网友评论:“中断服务”在未结束前,降低自己的优先级。
如不要嵌套可这样写:
ORG0023H
JBCRI,SUB_RX
JBCTI,SUB_TX
INT_RET:
IRET
NOP
;---------------------
ORG0050H
sub_rx:;不要嵌套的
MOVBUF_SBUF,SBUF
CLRES;停本中断源,不要嵌套
ACALLINT_RET;降低自己的优先级
;“中断服务”还继续。。。。。

XCHA,R1
ANLA,#1FH
ORLA,#60H;IN_BUF:60H-7FH
XCHA,R1
XCHA,BUF_SBUF
MOV@R1,A
INCR1
INCIN_LEN
MOVA,BUF_SBUF

SETBES;开本中断源
;中断相关指令,下一"ret"之前不会被中断打断,
RET;(在就是Intel的高明!!!)及时出栈
;------------------------------------------------------------
SUB_TX:;下面为嵌套的
ACALLINT_RET;降低自己的优先级
XCHA,OUT_LEN
JZSUB_TX_EX
;--------------------------
XCHA,OUT_INDEX
ANLA,#1FH
ORLA,#40H;OUT_BUF:40HTO5FH
XCHA,R0
XCHA,@R0
MOVSBUF,A
MOVA,@R0
XCHA,R0
INCA
XCHA,OUT_INDEX
DECA
SUB_TX_EX:
XCHA,OUT_LEN
RET
;----------------------------






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

网友评论:你的问题前面已经说了答案了...

网友评论:ISR:PUSHNext的地址

RETI;实际就是跳转到Next去运行,并且把中断标志清了
Next:
;做你要作的事
RET

搞定。

网友评论:xwj是其中之一,干着急,人家还死命要他醒悟,难办哦难办

网友评论:reti后,我认为中断就已经结束了。我想,这样的看法符合一个完整中断过程的定义。

所以不是降为平民,是偷偷退出了。
-----
这段时间我对降为平民比较敏感。哈哈!

网友评论:以后都叫你“白板”了

这个名字不错吧?比你那个“高潮”好吧?
相关链接:http://www.21icbbs.com/club/bbs/list.asp?boardid=7&t=2536231&tp=%u4E3A%u4E86%u7EAA%u5FF521ic%u6709%u53F2%u4EE5%u6765%u6700%u767D%u7684%u6591%u7AF9%uFF0C%u6211%u51B3%u5B9A%u4EE5%u540E%u90FD%u53EB%u7248%u4E3B%u201C%u767D%u677F%u201D%u4E86

网友评论:利用堆栈操作的技巧,偷偷更换了返回地址。其实已经返回了一次。

网友评论:应该可以的啊,可以做实验验证一下

浏览:(5812)| 评论( 1 )
博文评论
Alba:2012/12/3 23:43:00
Im irmpessed by your writing. Are you a professional or just very knowledgeable?

  • 昵 称:
  • 内 容:10~250个字符
  • 验证码: 验证码看不清楚?请点击刷新验证码
  •                      
  • 博文分类

    热点博文

    最新博文

    最新评论

    IC电子元件查询
    IC邮购网电子元件品质保障