单片机中断系统应用须关注的问题

技术分类: 嵌入式系统  | 2006-08-06
来源:单片机与嵌入式系统应用 | 作者:河北省邮电学校 李学海


  另外,PIC单片机中采用的是硬件堆栈结构。其好处是既不占用程序存储器空间,也不占用数据存储器空间,同时也不需用户去操作堆栈指针;但此时也带来1个不可回避的弱点,即不具备像其他单片机指令系统中的压栈(PUSH)和出栈(POP)指令那样,实现中断现场的保护会麻烦一些,并且占用的处理时间也相应多一点。

  2 中断的现场保护问题

  中断现场的保护是中断技术中一个很重要的环节。在进入中断服务程序期间,只有返回地址,即程序计数器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”。对于这些临时备份寄存器究竟需要定义多少个,定义在通用寄存器区域中的哪个位置,都是值得考究的问题。并且单片机的型号不同,其内部的通用寄存器区域的分布也不同,因此这就使得临时备份寄存器定义的数量和位置也不能相同。

  例如,对于PIC16F873/874来说,要求寄存器W_TEMP必须在文件寄存器(即RAM数据存储器)的体0和体1上各定义1个,并且这2个W_TEMP寄存器单元必须具有相同的体内地址码(比如,在体0上把W_TEMP定义在20H单元,则在体1上就把另一个W_TEMP定义在A0H单元);而其他寄存器的临时备份寄存器(如STATUS_TEMP和PCLATH_TEMP)都仅仅需要在体0上定义1个即可。

  又例如,对于PIC16F87X子系列中的其他5款型号来说,情况有所不同。其文件寄存器各个体的顶端部分有16个地址空间,都会寻址到相同的16个物理单元上。这16个单元不需要体选寻址,或者说,寻址这16个单元与体选码无关,即与当前所处的体无关。因此,将各个临时备份寄存器都安排在这个位置(W_TEMP也只需要定义1个即可)最为合适。这样做可以使得现场保护和现场恢复变得非常容易。 中断是一种随机发生的事件。进入中断服务程序后,第1个要保存的应该是工作寄存器W。原因是PIC单片机没有在“不同寄存器”之间进行直接传递的指令,这样的功能得用W作中转(需要2条指令)才能实现,所以应该先把W寄存器腾空(对应程序中第1条指令)。急于腾空W寄存器,又不能破坏当前状态寄存器STATUS中的体选码,还不能影响当前状态寄存器STATUS内的标志位,可又无法确定主程序所处的RAM数据存储器当前体是哪一个,就只好在主程序所有可能选择到的每一个RAM数据存储器体上的相同位置,都定义1个W_TEMP临时备份寄存器。
0
0
(请您对文章做出评价)
1】【2】【3】【4】【5
加载中

对文章的评论

更多评论

剩余字数:  

相关在线研讨会

我要参加

电路设计中可预测和不可预测问题的调试技术

时间:2008-06-02 10:00:00-12:00:00
简介:在嵌入式系统设计中,经常会出现一些可预测和不可预测的问题或者低概率事件信号。快速有效地发现这些问题需要不同的技术。8月15日…

浏览该文章的用户还看过...

  • 文 章

  • 论 坛

  • 博 客

  • 小 组

设计资源与分销

  • 博客推荐

  • 论坛推荐

  • 在线研讨会