1. 程式人生 > >PYNQ上手筆記 | ④Zynq中斷應用

PYNQ上手筆記 | ④Zynq中斷應用

在實際玩Zynq中斷之前,先扯一扯中斷這個神奇的東西~

實時性是一個嵌入式系統很重要的效能,實時性體現在一個系統對外部事件的響應能力和處理能力上,而CPU對一個事件的響應及處理主要依託於 —— 中斷
通俗的來說,中斷的一個基本過程就是:當一個事件發生時(比如按鍵按下),產生一個可以傳送到CPU的中斷訊號(上升沿或下降沿無所謂,是個訊號就行),當CPU接收到這個中斷訊號後,對這個中斷訊號所表示的事件進行處理(跳轉去執行中斷服務程式,對按鍵按下這個事件進行處理)。
對這個基本過程抽象出來一箇中斷系統模型如圖所示:

在上圖中只是一箇中斷訊號,那麼當這個系統中存在很多中斷訊號

時,群龍無首,整個系統就會亂套,CPU會像一隻無頭蒼蠅一樣到處去執行中斷服務程式,結果可想而知,最後CPU肯定什麼也幹不了~
為了解決這個問題,需要派一個領導去管理這些各種各樣的中斷,這個管理者就是 —— 中斷管理單元!所以,它只有一個功能 —— 管理這些中斷訊號!比如使能與失能 —— 讓哪個中斷訊號通過或者讓哪些訊號不通過;“優先順序” —— 誰先通過誰後通過,改進模型如下圖:

這樣一來,CPU永遠只能接收到一箇中斷訊號,所以CPU可以很舒服的去做他該做的事情了~
總結一下中斷的程式設計思路:

  • 配置外設可以產生中斷訊號
  • 配置中斷管理單元,使能訊號通過,( 配置訊號優先順序 )
  • 配置中斷服務程式 ,確保CPU接收到中斷訊號可以及時處理

接下來依託這個抽象的中斷模型玩一玩Zynq的中斷,具體化這個模型~

1.實驗目的

探索Zynq中PL->PS的中斷,按下按鍵產生一箇中斷,這個中斷被通用中斷管理單元所處理,然後傳遞給Zynq PS,將變數值遞增然後將值顯示在led上。

2.實驗步驟

2.1.新建基於Pynq-Z2的工程

2.2.建立硬體塊設計

2.2.1.新增所用ip並自動連線

新增兩個AXI_GPIOip核,一個連線板載4個按鈕,一個連線板載4個led

2.2.2.配置AXI_GPIO使能中斷

這裡因為4個按鍵是連線在axi_gpio_0上的,所以雙擊axi_gpio_0 ip核進行配置,如圖,選擇使能中斷:

可以看到與未配置中斷的axi_gpio_1有區別:

2.2.2.配置Zynq PS系統接收中斷請求

在配置之前需要對Zynq中的中斷訊號有個大致的瞭解,其中PS和PL之間的中斷訊號如表所示:

根據上圖,雙擊zynq ip核進行配置,因為這裡需要接收的按鍵中斷是從PL端到PS端的,首先選中Fabric Interrupts中斷組織,然後選中IRQ_F2P[15:0]使能16-bit的PL->PS共享中斷埠,以便於來自PL端的中斷可以連線到PS的中斷控制器上:

2.2.3.連線AXI_GPIO的中斷請求和PS的中斷埠

手動進行連線:

2.3.驗證設計,建立HDL檔案,生成Bitstream,匯出硬體設計檔案

至此,中斷訊號的硬體資料通路構建完成,接下來是軟體中配置中斷管理單元和中斷服務程式。

2.4.過渡到SDK上的軟體設計

2.4.1.Launch SDK

2.4.2.新建一個空的應用工程

2.4.3.匯入已有C檔案

因為在實際專案中需要分工協作,所以這裡選擇匯入隨書附帶的C檔案:

2.4.4.配置執行設定,板級驗證

執行即可觀察到現象。