51单片机interrupt和using使用详解_每日播报

2023-04-30 21:15:08 来源: 哔哩哔哩


(资料图片)

51单片机中的中断中出现了using 1,这是什么意思?我也是查了几天资料,终于弄明白了,给大家分享一下,using n是工作寄存器组切换开关,工作寄存器组与BANK是一个概念;

51的工作寄存器R0-R7共有4组,分别是BANK0、BANK1、BANK2、BANK3,在任何时刻,只有一个工作组生效!这4个组在RAM中的位置分别是[00H,07H]、[08H,0FH]、[10H,17H]、[18H,1FH],换句话说,RAM中的00H地址、08H地址、10H地址、18H地址,这四个地址的名字都叫R0,那么,在汇编中,我们经常看到类似MOV R0,#07这样的语句,这个#07到底别放到了RAM的哪个地址中去了呢?00H?08H?10H?18H?到底是这4个中的哪一个,取决于51的PSW寄存器的RS1和RS0两个位,若PSW.RS=2就意味着第二组工作寄存器生效,R0的地址就是10H。

51在上电后,PSW的RS两个位默认为0,也即51默认使用的工作寄存器组BANK 0,在默认状态下,对于普通的C语言函数,其传参、申请局部变量、导出函数的返回值等功能,keil将其翻译成汇编后,肯定要使用R0-R7;对于51的中断服务函数,虽然没有形参,也不用返回值,但是一般肯定有局部变量,这时就需要用到R0-R7了;试想,在执行普通函数时,默认工作寄存器组BANK 0 的R0-R7已经被使用了,在执行普通函数时,一旦发生中断,而中断函数也需要使用R0-R7,怎么办?

我们能想得到是,在执行中断服务函数前把R0-R7入栈,中断服务完成后再把R0-R7出栈恢复现场,这样工作量很大;

普通函数的执行过程中,正在使用BANK0的R0-R7,执行过程中,突然发生了中断,而中断函数也想使用R0-R7,在执行中断服务函数前,我们切换工作寄存器组,切换的具体方法就是直接修改PSW的RS两个比特位,而不必把BANK0入栈,本文开头的例子中using 2 就是说,在进入外部中断0的服务函数前,先入栈CPU寄存器,再把工作寄存器组由0切换成2,在退出中断服务后,先由BANK2切换回BANK0,并弹出CPU寄存器,由于BANK0和BANK2处在不同的RAM空间,互不干扰,切换回BANK0之后,就把那个普通函数的现场给恢复了。

标签:

Copyright   2015-2022 大众家电网版权所有   备案号:豫ICP备20014643号-14   联系邮箱: 905 14 41 07@qq.com