1. 程式人生 > >嵌入式外部中斷控制編程方法論—比較CC2541(51核)和S5PV210(ARM核)

嵌入式外部中斷控制編程方法論—比較CC2541(51核)和S5PV210(ARM核)

中斷 那些事 water 嵌入式linux 框圖 可能 跳轉 red 底層

這是一篇闡述怎樣對嵌入式SOC外部中斷進行控制編程的方法論文章。希望讀者理解本篇文章後。能夠具備對市場上全部已經面世和將來面世的嵌入式芯片的外部中斷進行控制編程的能力。

筆者原創的技術分享一直都恪守下面原則:

從需求的角度去理解嵌入式各種軟件和硬件模塊的作用和組成。並從芯片系統設計的角度去闡述怎樣進行控制編程。

前者對於理解復雜的系統(如linux的各個子系統)是非常有效的;後者所講的是代表一個芯片設計project師的視覺,芯片模塊由他負責設計,他對於該模塊的控制編程自然是最有發言權的。

筆者還想傳遞給讀者一個重要的嵌入式控制理論的觀點:

不同SOC芯片中的相似功能模塊(比如51內核?集成的

TIMER和ARM內核集成的TIMER)的設計理念是基本一致的,雖然各家集成電路廠商的制程工藝、總線技術標準、功耗等技術不一樣,但對於編程人員來說,相似功能模塊呈現的硬件接口(即寄存器編程)是基本一致的。不管是基於高級ARM核、MIPS核。還是基於簡單的51核。各個核所集成的時鐘控制、GPIO、中斷、TIMER等模塊的設計都是相仿的。當中最重要的原因就是。目標模塊所完畢的目標功能(能夠理解為硬件需求)都是一樣的,即ARM核的中斷和51核的中斷,其完畢的功能是一樣的,GPIO完畢控制功能也是一樣的。

所以,筆者希望從系統設計的角度來闡述GPIO外部中斷的控制編程。使讀者能夠跳開某個詳細芯片而掌握全部芯片的GPIO外部中斷的控制編程。


一、 中斷綜述

細細數來,筆者已經針對中斷寫了三篇文章了。

每篇篇幅都非常大。闡述的重點都不一樣。這裏給出參考。大家如有時間能夠先系統地看完這三篇文章。再來閱讀本文。

《軟件和硬件都是對生活的高度抽象---論中斷控制(ARM體系編程)》, 摘要是:硬件模塊設計又是高度抽象於現實需求。非常多時候,X86、ARM和MIPS僅僅有底層寄存器和指令級別的差異,對於軟件驅動基本是一致的。本文論及ARM體系的中斷控制。以基於Cortex-A8的S5PV210為例。中斷是一種異步工作機制,也是嵌入式處理器的一個核心工作機制,對於實時操作系統來說不可缺少。

《從需求的角度去理解Linux之二:Linux中斷全然分析》, 摘要是:學習本文將能夠對linux中斷有全面而又深刻的認識。本文對Linux中斷所涉及的需求、管理機制、中斷實現、中斷接口(上半部和下半部)、驅動使用進行全然分析。

《體系編程、SOC編程那些事兒》, 摘要是:筆者將從芯片IC的系統設計的角度去詮釋怎樣掌握體系編程和SOC編程。筆者有超過10年的嵌入式研發經驗,作為架構師多次主導過多媒體SOC研發並成功量產案例,在高端處理器體系編程和嵌入式Linux方面有豐富的教學經驗,希望本文能給嵌入式學習者和從業者有較深刻的指引。

二、 外部中斷控制設計框圖

外部中斷控制是在中斷控制模塊上接入GPIO,外部中斷就是GPIO中斷控制。外部中斷控制的核心是中斷支持GPIO邊沿觸發、電平觸發。設計框圖例如以下,該圖是TI藍牙單芯片CC2541的中斷控制框圖局部,CC2541基於8051內核。

技術分享

從之前的參考文章,我們能夠知道,要完畢中斷控制功能,必須下面組成部分:

  1. 中斷源。中斷源索引。
  2. 優先級寄存器(priority)。優先級高的中斷會先響應。

  3. 中斷屏蔽寄存器(mask)。或者稱為選通寄存器(enable)。芯片的上電狀態往往是屏蔽全部中斷源。除了對某個中斷源進行屏蔽外,一般都會有一個全局中斷開關。
  4. 中斷狀態寄存器(pending),中斷發生後。相應bit會置1。中斷運行後應該軟件對其清0.
  5. 中斷向量地址,中斷發生後。PC會從該地址開始運行。中斷服務程序的第一條指令應該設置在該處。並跳轉到中斷服務子程序。

三、 外部中斷控制設計分析

針對以上框圖。我們來進行解構分析。

1.中斷分級

曾記得,8位單片機鼻祖80251的外部僅僅有2個引腳。中斷控制僅僅有一級。那麽這裏為什麽要分兩級呢?那是由於80251僅僅有簡單的外部中斷、timer中斷等中斷源,而藍牙單芯片不僅集成timer,還有串口,DMA、射頻、PWM等等,並且GPIO P0,P1,P2大部分引腳都能夠復用為中斷引腳,因此中斷源有非常多。而8位單片機的中斷指示pending寄存器就僅僅有8個bit,怎麽能夠表述那麽多中斷源呢?僅僅有中斷分級來解決,將中斷源分為一級中斷和二級中斷。


2.一級中斷控制

一級中斷的中斷源一般以子模塊為單位,即串口1給出一個中斷源,串口2給出一個中斷源,P1(8個引腳)給出一個中斷源。TIMER0給出一個中斷源,TIMER1給出一個中斷源。

每一個中斷源都相應下面寄存器或者寄存器位:

一級pending位,代表該中斷產生中斷(僅僅是中斷產生,CPU並不一定響應)。

一級mask選通位,選通該位才同意中斷。

全局中斷mask位,這個bit是全局中斷開關,必須要同意才幹使用CPU的中斷控制。

一級中斷矢量寄存器。代表中斷後PC跳轉的地址。

一級優先級位,當多個中斷源同一時候產生時,CPU將選擇最高優先級的中斷源相應的中斷矢量地址進行PC跳轉響應。

從中,我們看出,一級pending位在中斷響應裏面要主動去清零,否則中斷會反復產生。


3.二級中斷控制

二級中斷的中斷源以子模塊內部的子功能為單位。如串口1的接收中斷、發送中斷,P1的8個引腳P1.0。P1.1。…P1.7的引腳中斷。

這些中斷源都會接入到相應的或電路。並輸出一個中斷源,作為一級中斷源。

各個二級中斷源相同相應下面寄存器或者寄存器位:

二級pending位,代表該中斷產生中斷(僅僅是中斷產生,CPU並不一定響應)。

二級mask選通位,選通該位才同意中斷。

對於GPIO外部中斷來說,還須要配置下面寄存器:

二級邊沿觸發位,每一個引腳都要配置相應的觸發方式,上升沿。下降沿還是高低電平觸發。

此外。我們還須要謹記,在《體系編程、SOC編程那些事兒》提到,CLOCK和引腳復用是SOC各模塊的公共組成部分。所以模塊都須要先配置這兩個模塊。對於GPIO來說,時鐘一般按上電默認設置就可以。但引腳的復用設置通常是普通的GPIO。而不是中斷功能。

因此,我們還須要對GPIO的中斷進行配置,將其設置為中斷功能。

相同,中斷響應裏面須要對二級pending位清0,否則會反復中斷。


4.中斷響應

一般在有操作系統的固件中,中斷都有一個統一的入口,然後按優先級查詢一級pending位。以做出響應服務。假設要進一步提高中斷響應速度,將各個詳細的中斷服務程序入口直接放到相應中斷矢量地址上。

記得清一級pending和二級pending。


四、 外部中斷控制編程方法

理解了以上外部中斷控制的設計框圖。進行控制編程應該是非常easy的。各種不同SOC的中斷控制的設計都是一致的。不同的是代表各部分的寄存器的命名是不一樣的。一般的方法過程是:

1. 找出各個詳細的SOC datasheet的中斷控制框圖。

2. 分別找出中斷控制框圖中的代表各部分的寄存器或者寄存器位。並依據datasheet的指示值進行配置控制。

3. 對於GPIO中斷控制來說,包含一級中斷、二級中斷、引腳復用配置。這對全部SOC都是一致的。


五、51核CC2541外部中斷編程

我們依照以上方法找到分別相應的寄存器,假設我們先要對P1.2進行下降沿觸發控制。

1. 一級中斷

技術分享

一級pending

技術分享

一級mask選通

技術分享

二級pending位

技術分享

二級mask選通位

技術分享

二級邊沿觸發

技術分享

GPIO引腳復用,P1.2要設置為1,選擇為中斷功能。

技術分享

六、ARM核S5PV210外部中斷控制編程

請參考《軟件和硬件都是對生活的高度抽象---論中斷控制(ARM體系編程)》。


七、不同SOC外部中斷控制的可能差異

以上我們闡述了外部中斷控制的設計和編程。當中強調的一致性。接下來。我們說說不同SOC中斷控制的可能差異。這些差異跟SOC的應用場景有關。

1. 低端SOC的中斷源少,可能僅僅有一級中斷。

2. 低端SOC使用8位核或者16位核,一個pending位最多表示8個或者16個中斷源,而中斷源可能超過16個。因此一級中斷源可能由多個寄存器來表達。CC2541即是這樣。

3. 高級SOC的中斷更強調快遞響應,特別針對某一類對時間要求特別高的中斷源。提供高速中斷響應模式。一般的場景則使用普通中斷響應。即有FIQ和IRQ方式。基於ARM核的SOC即是這樣。我們都知道在中斷響應裏面,中斷上下文要先保存用戶態上下文,而FIQ高速中斷響應則不須要保存用戶態上下文,由於在FIQ狀態有單獨的一組寄存器供服務程序使用。這組寄存器跟用戶態上下文的寄存器組是無關的。

4. 在統一的中斷服務入口裏面,可能會依照pending的優先級來查詢並響應,但假設硬件能夠自己主動判別最高優先級。那麽響應裏面就能夠直接讀這個寄存器的值來跳轉就可以,避免for循環遍歷,以提高響應性能。

S5PV210的中斷響應即支持這樣的機制。

怎樣。有信心以不變應萬變了嗎?


很多其它嵌入式和物聯網原創技術分享請關註微信公眾號:嵌入式企鵝圈

技術分享

嵌入式外部中斷控制編程方法論—比較CC2541(51核)和S5PV210(ARM核)