登录站点

用户名

密码

 中断的现场保护问题

1已有 1204 次阅读  2009-09-15 16:48   标签中断的现场保护问题 
   中断现场的保护是中断技术中一个很重要的环节。在进入中断服务程序期间,只有返回地址,即程序计数器 PC的值被自动压入堆栈。若需要保留其他寄存器的内容,就得由程序员另想办法。由于 PIC单片机的指令系统中没有像其他单片机那样的 PUSH(入栈)和 POP(出栈)之类的指令,所以要用 1段用户程序来实现类似的功能。因为是用 1段程序来实现现场保护,而程序的执行有可能会影响到W寄存器和 STATUS寄存器,所以,首先应该把这2个寄存器保护起来,然后再去保存其他用户认为有必要保护的寄存器。并且在 PIC单片机中,中断现场数据不是保留到芯片的堆栈存储区中,而是保留在用户自己选择的一些文件寄存器(即RAM数据存储器单元)中,当然一般应该选择通用寄存器来保护现场。下面给出的是1段原厂家最新提供的实现保护中断现场的范例程序片段。   
;将W、STATUS和 PCLATH寄存器的内容保存到临时备份寄存器中 
  [1]MOVWFW_TEMP    ;复制W到它的临时备份寄存器 W_TEMP中 
  [2]SWAPFSTATUS,W ;将 STATUS寄存器高低半字节交换后放入 W 
  [3]CLRFSTATUS ;不管当前处在哪个体,都设置体 0作当前体 
  [4]MOVWFSTATUS_TEMP ;保存 STATUS到体0上的临时寄存器STATUS_TEMP 
  [5]MOVF PCLATH, W ;把寄存器 PCLATH内容复制到 W中 
  [6]MOVWFPCLATH_TEMP ;经W将 PCLATH内容转到临时寄存器PCLATH_TEMP 
  [7]CLRFPCLATH ;不管当前处在哪页,都把 PCLATH设置成指向页0 ( 中断服务程序的核心部分) 
  [8]MOVFPCLATH_TEMP, W ;经过W转移 
  [9]MOVWFPCLATH ;恢复 PCLATH内容 
  [10]SWAPFSTATUS_TEMP,W ;将 STATUS_TEMP寄存器高低半字节交换后放入 W 
  [11]MOVWFSTATUS ;把W内容移动到 STATUS寄存器,(同时也把当前体恢复到原先的体上) 
  [12]SWAPFW_TEMP,F ;将 W_TEMP内容高低半字节交换后放回 
  [13]SWAPFW_TEMP,W ;再次将 W_TEMP内容高低半字节交换后放入 W 
    这段程序适用于 PIC16CXX系列中各款型号的单片机。在这段例程之前,假设预先对于待保留的各个寄存器都分别定义了相应的临时备份寄存器。用后缀“_TEMP”表示临时备份寄存器,例如“W”的临时备份寄存器记为“W_TEMP”。对于这些临时备份寄存器究竟需要定义多少个,定义在通用寄存器区域中的哪个位置,都是值得考究的问题。并且单片机的型号不同,其内部的通用寄存器区域的分布也不同,因此这就使得临时备份寄存器定义的数量和位置也不能相同。

没有了 下一篇: 造成电能表潜动的原因

分享 举报