Zynq的uart中斷處理函式對映

2021-09-24 17:04:56 字數 1239 閱讀 1897

中斷處理函式對映說法是否正確不敢保證,意思就是將中斷處理函式的位址與引數放入中斷向量表中(_vector_table)中。

早期運用的arm晶元規模較小,在晶元上直接有uart的中斷服務函式位址暫存器,直接將中斷服務函式的位址寫入暫存器就搞定了。然後zynq似乎比較複雜,中斷也比較。在zynq中有個scu(snoop control unit窺探控制單元,也是arm所有的)專門控制中斷處理。vivado sdk中提供了scugic驅動來處理相關的操作。下面具體說一下,中斷hook的過程。

xscugic_lookupconfig 找到scugic的定義實體;

xscugic_cfginitialize 初始化scugic實體;

xil_exceptioninit(); 異常處理初始化

xil_exceptionregisterhandler(xil_exception_id_irq_int,

(xil_exceptionhandler)xscugic_interrupthandler,

pscugic);

這一步基本是固定的,中斷觸發之後統一由xscugic_interrupthandler先處理,然後在handlertable中查詢相應的處理函式。這個handlertable陣列的長度為95個,包含了所有的中斷id。

xil_exceptionenable(); 異常處理使能

xscugic_connect( pscugic,xpar_ps7_uart_1_intr, (xil_interrupthandler)zuartps_interrupthandler , (void*)puart1inst);

這才是將我們定義的中斷服務函式位址對映到handlertable中。也可以使用uartps驅動中包含的中斷處理函式。

xscugic_enable( pscugic, xpar_ps7_uart_1_intr); 使能uart對應的中斷id。

xuartps_setinterruptmask( puart1inst, xuartps_ixr_rxovr | xuartps_ixr_txempty /*| xuartps_ixr_tnful*/ ); 這應用程式中開啟接收緩衝fifo中斷與傳送為空中斷。

這時uart接收到資料,則會自動跳入中斷處理函式zuartps_interrupthandler中。向傳送硬fifo中寫入資料,在資料發空後,也會跳入中斷處理函式zuartps_interrupthandler中。兩者根據不同中斷狀態暫存器中的標識進行相應的處理。

關於uart中斷接收與中斷傳送資料說明見。。。。。

第六節,ZYNQ的UART

zynq的uart zynq的串列埠模組是乙個全雙工的非同步接收和傳送器,支援寬範圍廣的軟體可程式設計模組,支援程式設計配置波特率和資料格式,同時提供自動的奇偶校驗和錯誤檢測方案,此外,還為apu提供了接收和傳送fifo。zynq有兩個uart器件,具有以下特性 可程式設計波特率傳送器 64個位元組...

基於ZYNQ的uart傳輸任意長度的資料

ug585 網路筆記 參考 zynq高階之路14 ps端uart串列埠接收不定長資料 參見上一次實驗 基於zynq 的uart中斷實驗之串列埠寫資料到ddr3中 基於zynq 的uart中斷實驗,這裡在上一次實驗的基礎上將傳送固定的資料改為可以傳送不定的資料。建立工程,設定並初始化串列埠中斷,在執行...

時鐘中斷處理函式

以前的中斷處理函式只做為測試用,其實問題還很多,我把它放到了乙個專門的檔案中,kernel system call.s 如下 globl timer interrupt timer interrupt incl jiffies movb 0x20,al outb al,0x20 call do ti...