• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > LPC2292的偽中斷與偽中斷處理

    LPC2292的偽中斷與偽中斷處理

    作者: 時間:2012-05-02 來源:網絡 收藏

    引言

    本文引用地址:http://www.czjhyjcfj.com/article/171536.htm

    工業以太網具有比現場總線更好的性能,正處于不斷發展完善當中,因此研制基于工業以太網的設備具有很好的市場前景。本文設計的嵌入式控制器采用了基于ARM7TDMIS的微控制器[12]??刂破鞯牡讓优c現場總線CAN相連,向上與Ethernet/IP工業以太網相連。為提高可靠性,應用了冗余控制技術,備有一個一模一樣的冗余控制器。通過LVDS接口,控制器與冗余控制器相連,并相互在線監測。同時,本文采用了嵌入式實時操作系統μC/OS-II[3]。

    嵌入式控制器采用高性能的32位單片機。但是在正常工作中存在產生偽的可能性。如果不進行正確的話,可能產生嚴重的后果。本文對此進行了全面的分析,針對不同的情況,靈活地進行了;最后徹底解決了偽問題,消除了嵌入式控制器中的隱患。

    本文用到的LPC2292的資源有看門狗、定時器TIMIER0、UART0、UART1、CAN1,通過外部總線與以太網控制器芯片RTL8019AS相連。把CAN1的接收數據Rx設為快,它是唯一的快中斷。UART1與LVDS芯片相連,UART0通過RS232轉換芯片與外部設備進行通信。

    1 偽中斷產生的原因

    由于異步中斷,偽中斷可能出現在基于ARM7TDMIS 的微控制器LPC2292中。如果不進行正確處理,有可能引起嚴重的后果。中斷處理的異步特性來源于內核和向量中斷控制器(VIC)的相互作用。如果在內核中檢測到中斷和內核真正開始處理中斷的過程中VIC 的狀態發生改變,則產生中斷的異步特性[4]。

    應用中可能經過以下步驟:

    ① VIC 判斷是否有IRQ 中斷。若有,則向內核發送IRQ 信號。

    ② 內核保存IRQ 狀態。

    ③ 執行流水線的多個周期的處理。

    ④ 內核從VIC 中裝入IRQ 地址。

    如果在執行到步驟③時向量中斷控制器的狀態有所改變,那么就要發生偽中斷。所以,在以下兩種情況下會發生偽中斷。

    ◆ 在步驟③時執行了關中斷指令。

    ◆ 向向量中斷控制器發送IRQ信號的中斷的中斷標志丟失。當UART0/UART1的RDA/CTI中斷允許時就可能發生這種情況[5]。

    進入偽中斷時,VIC 不能清楚地識別產生中斷請求的中斷,最后只能返回到VicDefVectAddr (0xFFFFF034)默認中斷進行處理。因此,如果不正確處理偽中斷,就可能導致嚴重的后果。

    2 偽中斷的處理

    本控制器中,可能出現偽中斷的地方是:關中斷、喂看門狗、UART0通信和UART1通信。本文的設計思路是:盡量避免產生偽中斷;實在避不開的話,則寫好相應的處理程序。

    2.1 關中斷指令的處理

    μC/OS-II中的關中斷指令OS_ENTER_CRITICAL()不采用直接關中斷,而是先進入管理模式中,設置好寄存器SPSR,退出時關掉IRQ中斷。這樣就消除了由關中斷而引起偽中斷的可能性。

    2.2 看門狗的處理

    喂看門狗時必須先關閉IRQ和FIQ,否則可能發生意外的復位,導致控制器不能工作。在周期性的時鐘節拍中斷程序中第一件事就是喂看門狗。如果在進入時鐘節拍中斷時IRQ已關閉,就可避免偽中斷的出現。當然,在喂狗指令前必須先關閉FIQ,喂狗指令后再打開FIQ。關閉FIQ是不會引起偽中斷的[1]。

    2.3 UART0和UART1的處理

    在UART0中(UART1同理),當UART0 Rx FIFO到達寄存器U0FCR7∶6 所定義的觸發點(比如接收4個字符)時,發生RDA 中斷。當UART0 Rx FIFO 的深度低于觸發點時,RDA 中斷標志被清除。

    當UART0 Rx FIFO 包含至少1 個字符,且在接收3.5~4.5 字符的時間內沒有發生UART0 Rx FIFO 動作時,產生CTI中斷。當UART0 Rx FIFO 的任何動作(讀或寫UART0 RSR)都將清除CTI中斷標志。

    CTI偽中斷是這樣發生的:比如UART0 Rx FIFO已接收2字符,且超過了3.5~4.5 字符的時間,發生CTI中斷;但是這時又有字符進來,于是CTI中斷標志被清除。向量中斷控制器無法識別是誰產生了中斷,偽中斷就發生了。

    RDA偽中斷是這樣發生的:以接收4字符發生RDA中斷為例,比如UART0 Rx FIFO已接收3字符,且超過了3.5~4.5 字符的時間,發生CTI中斷。在系統正確處理CTI中斷時,恰好有一個字符進來,使得UART0 Rx FIFO中的字符數正好為4,于是發生RDA中斷。但是由于先處理CTI中斷,CTI中斷程序先讀取了其中的字符,使UART0 Rx FIFO內的字符數小于4,因此RDA中斷標志就被清除了。等到系統處理RDA中斷時,偽中斷就發生了。

    可以看出,CTI中斷的存在是產生UART0和UART1偽中斷的罪魁禍首。UART1與LVDS接口相連,用于控制器和冗余控制器的在線互相監測。采用每次只發一個字符的方法,使得CTI中斷不可能發生,這樣就徹底消除了UART1產生偽中斷的可能性。

    本控制器只在UART0中斷中存在產生偽中斷的可能性。發生偽中斷時,系統會把默認中斷地址寄存器VICDefVectAddr中的地址拷貝到向量地址寄存器VICVectAddr中,系統執行該地址處的程序。所以,要編寫相應的處理偽中斷程序,把其首地址放入VICDefVectAddr中。在處理偽中斷的程序中,要盡快讀出UART0 Rx FIFO中的字符,以免丟失[5]。

    參考文獻

    [1] NXP Semiconductors. LPC2292 USER MANUAL, 2004.

    [2] NXP Semiconductors. LPC2292 ERRATA SHEET, 2006.

    [3] Labrosse Jean J. 嵌入式實時操作系統μC/OS-II[M]. 邵貝貝,等譯. 北京:北京航空航天大學出版社, 2003.

    [4] 廣州周立功單片機發展有限公司. PHILIPS 單片16/32 位微控制器——LPC2292/LPC2294,2005.

    [5] NXP Semiconductors. Handling of spurious interrupts in the LPC2000, 2006.

    張斌(碩士研究生),主要研究方向為單片機與嵌入式控制系統。



    關鍵詞: 中斷 處理 LPC2292

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 合川市| 清远市| 寻甸| 吉水县| 苏尼特左旗| 西吉县| 海门市| 保康县| 福贡县| 兴山县| 平遥县| 隆尧县| 沈丘县| 武城县| 福海县| 綦江县| 赤城县| 儋州市| 黄山市| 克拉玛依市| 商水县| 新平| 澳门| 陵川县| 思南县| 玉山县| 广宗县| 清水县| 信宜市| 江门市| 兴化市| 高邑县| 葵青区| 汤原县| 大兴区| 桃江县| 泰安市| 邛崃市| 石景山区| 章丘市| 枝江市|