RETI =RET指令+告诉CPU中止服务已完毕。
最近在依据51单片机编程的进程中呈现了个很古怪的问题“程序履行中在寄存器EA=1,ET0=1,TR0=1条件下,单TF0=1时并没有履行中止”。在有过单片机中止编程阅历者都知道当EA=1,ET0=1的条件下,满意TF0=1时,假如在此期间没有更高优先级的中止履行的情况下定时器中止0必定会发生中止呼应。而在我所编写的程序中仅使用了定时器中止0,一个中止也就谈不上存在优先级问题。通过我对自己程序的查看并对各教材中止程序比照发现我的程序中的一个问题:因为中止的不行控性决议其跳出中止回来主程序的不确定,而因为程序需求中止跳出后能跳到指定的地址。为了处理这个问题我在中止完毕的当地直接用了无条件跳转指令“LJMPADR16”其间ADR16是我想在中止完毕后程序所运转的地址,而没有通过指令“RETI”。问题找到了这就意味着我的程序和其他程序不同的当地便是没有履行“RETI”而直接跳出。
为了处理问题所在我查阅了许多单片机方面的材料,教材。简直全部的教材对指令“RETI”的效果千人一面都是:“中止程序完成后,一定要履行一条RETI指令,履行这条指令后,CPU将会把仓库中保存着的地址取出,送回PC,那么程序就会从主程序的中止处持续往下履行了。”假如“RETI”的效果只是在于“把仓库中保存着的地址取出送回PC”;那么我用指令“POPDPH”和“POPDPL”两条指令替代其做用不就能够到达相同的推出地址的效果么?这样能够处理因为只要进仓库指令(硬件主动生成)没有出仓库所导致的仓库溢出过错,可是并不能处理文章开端所说到的“进不了中止”问题。这让我愈加信任书上所介绍的关于指令“RETI”效果并不彻底。通过查阅各种材料文献,我发现了个以往在介绍单片机硬件,以及寄存器上教材,教师,没有提及的“‘优先级收效’触发器“的概念。材料指出“依据8051的结构特色,其中止体系中含有两个不行寻址的“优先级收效”触发器。一个用于指出CPU是否正在履行高优先级的中止服务程序,这个触发器为1时,体系将屏蔽全部的中止请求;另一个则指出CPU是否正在履行低优先级中止服务程序,该触发器为1时,将阻挠除高优先级以外的全部中止请求。由此可见,若要呼应同级乃至是初级中止请求,有必要使得该“优先级收效”触发器清零。但该触发器又是不行寻址的,所以无法用软件直接清零。”问题是不是在这里呢?而“优先级收效”触发器清零进程是怎样履行的呢?是在硬件主动履行的那么是在什么时候履行的呢?带着问题我去处理问题。假定我能够将程序满意跳出中止后跳到自己本来指定地址“ADR16”又满意履行指令“RETI”。通过重复考虑我用“DEC SP”;“DEC SP”;“MOVDPTR,#ADR16”;“PUSHDPL”;“PUSHDPL”“PUSHDPH”四条指令替代,问题得到了处理。
总结:中止指令“RETI”做为中止跳出指令除了将仓库中保存着的地址取出,送回PC;使程序从主程序的中止处持续往下履行。的效果外还有将“优先级收效”触发器清零。自己做的程序也是呈现了这个过错,因为对“优先级收效”触发器清零,导致第2次进不了中止(相当于同优先级请求)。