プラットフォームPYNQ-Z2
機能を実現
ここでpynqとEMIOアクセスボタンボタンIRQ割り込みを達成
ハードウェアEMIO 54ピックbtn0は、入力を介して、GICに、割込み#52をトリガ
SPIによって、割り込み操作や他のCPUレジスタは、トリガを指定したIRQ
ハードウェア設計
btn0にGPIO_0_0_tri_io規律リードのEMIO
制約
set_property -dict { PACKAGE_PIN D19 IOSTANDARD LVCMOS33 } [get_ports { GPIO_0_0_tri_io }]; #IO_L4P_T0_35 Sch=btn[0]
ソフトウェア設計
#include <stdio.h>
#include "platform.h"
#include "xgpiops.h"
#include "xgpiops_hw.h"
#include "XSCUGIC.H"
#include "XSCUGIC_HW.H"
#include "sleep.h"
#define ICCPMR *(volatile unsigned int *) 0xf8f00104
//printf(" ICCPMR = %0X @ line = %d \n", ICCPMR ,__LINE__ );
//(__FILE__, __LINE__);
#define GPIO_NO 54
static void GpioHandler(void *CallBackRef, int Bank, u32 Status)
{
static int i = 0;
if (Status ==0 ) return ;
XGpioPs* pGpioPs=(XGpioPs*)CallBackRef;
XGpioPs_IntrDisablePin(pGpioPs,GPIO_NO);
printf("Gpio Handler %d...\n\r",i++);
// while (1 == XGpioPs_ReadPin( pGpioPs , GPIO_NO )) ;
usleep(100*1000);
XGpioPs_IntrClearPin(pGpioPs,GPIO_NO);
XGpioPs_IntrEnablePin(pGpioPs,GPIO_NO);
}
int main()
{
XGpioPs Gpio;
XGpioPs_Config *ConfigPtr;
printf(" ICCPMR = %0X @ line = %d \n", ICCPMR ,__LINE__ );
ConfigPtr = XGpioPs_LookupConfig(0);
XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);
//初始化GPIO的输入以及中断。
XGpioPs_SetDirectionPin(&Gpio,GPIO_NO,0x0);
XGpioPs_SetIntrTypePin(&Gpio,GPIO_NO,XGPIOPS_IRQ_TYPE_EDGE_RISING);
XGpioPs_SetCallbackHandler(&Gpio, (void *)&Gpio, GpioHandler);
XGpioPs_IntrEnablePin(&Gpio,GPIO_NO);
XScuGic ScuGic;
XScuGic_Config* pScuGicCfg;
pScuGicCfg=XScuGic_LookupConfig(XPAR_SCUGIC_SINGLE_DEVICE_ID);
XScuGic_CfgInitialize(&ScuGic,pScuGicCfg,pScuGicCfg->CpuBaseAddress);
XScuGic_Connect(&ScuGic, 52,
(Xil_ExceptionHandler)XGpioPs_IntrHandler,
(void *)&Gpio);
XScuGic_SetPriorityTriggerType(&ScuGic,52,0xa0,0x01);//优先级阈值f0
XScuGic_Enable(&ScuGic,52);
Xil_ExceptionInit();
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,&ScuGic);
Xil_ExceptionEnable();
printf("Intr test: \n\r");
while(1)
{
}
}
結果
ボタン
ICCICR(IC CPU IC REG) - >
ICDDC R(UCディストリビュータC REG) - >
GPIO割り込み機能解析ライブラリ
void XGpioPs_SetCallbackHandler(XGpioPs *InstancePtr, void *CallBackRef,
XGpioPs_Handler FuncPointer)
XGpioPs_SetCallbackHandler(&Gpio, (void *)&Gpio, GpioHandler);
XGpioPs_Handler関数ポインタ
割り込み
周辺ハードウェアデバイスの速度とプロセッサ速度は、ハードウェアにリクエストを送信するためにコアプロセッサを取り、その後、明らかにコア効率が低下し、応答するために特別な方法を待つそうならば、大きさの順に、多くの場合ではありません。
したがって、私たちまでは、必要なときに、これは開閉機構である(カーネルのハードウェアを変更するには、アクティブイニシアチブ)信号を送る再びハードウェアのカーネルのためのメカニズムを提供します。
別の割り込みに対応した異なるデバイスは、それぞれが独自のデジタルIDによる中断します。
例えば、オペレーティング・システムは割込みを区別し、割り込みを生成したハードウェアデバイスを知ることができるように、ハードディスクからの割り込みの割り込みキーボードは異なっています。ハンドラ割り込み異なる別の割り込みを提供するために、このようにして、オペレーティングシステム。
それがプログラムを実行すると、別のイベントがある場合(ユーザーがプログラムを開いているなど)ので、時間によって、あなたがに対処するためのコンピュータシステムの割り込み機構に必要であることを起こります。
ハードウェア割り込みメカニズムを含みます中断手段そして、オペレーティングシステム割り込みサービスルーチン。
必要なときに、ハードウェアのカーネルは再び合図してみましょう。
初期のコンピュータシステム割り込みがハードウェア識別コードによって生成呼び出され(割り込みソースの識別、最初の割込みサービス・ルーチンの対応する割り込みサービス・ルーチンのエントリ・アドレスまたは格納アドレスを形成するために使用することができます)割り込みベクタアドレス割り込み変数
割り込みベクタテーブル:テーブル番号と割込みハンドラを対応する割り込みソース・エントリ・アドレスのタイプとの間の接続の割り込み;
_vector_table:
B _boot
B Undefined
B SVCHandler
B PrefetchAbortHandler
B DataAbortHandler
NOP /* Placeholder for address exception vector*/
B IRQHandler
B FIQHandler
割り込みサービスルーチン:送信割り込み実行されるコードを破ります
編集
IRQHandler: /* IRQ vector handler */
stmdb sp!,{r0-r3,r12,lr} /* state save from compiled code*/
#if FPU_HARD_FLOAT_ABI_ENABLED
vpush {d0-d7}
vpush {d16-d31}
vmrs r1, FPSCR
push {r1}
vmrs r1, FPEXC
push {r1}
#endif
#ifdef PROFILING
ldr r2, =prof_pc
subs r3, lr, #0
str r3, [r2]
#endif
bl IRQInterrupt /* IRQ vector */
C
/*****************************************************************************/
/**
*
* This is the C level wrapper for the IRQ interrupt called from the vectors.s
* file.
*
* @param None.
*
* @return None.
*
* @note None.
*
******************************************************************************/
void IRQInterrupt(void)
{
XExc_VectorTable[XIL_EXCEPTION_ID_IRQ_INT].Handler(XExc_VectorTable[
XIL_EXCEPTION_ID_IRQ_INT].Data);
}
#if !defined (__aarch64__)
REF
https://blog.csdn.net/qq_18077275/article/details/89304215?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
Zynqブレーク
三つのカテゴリーSPI、PPI、96割り込みID番号のSGIの合計に分割源
ブレークは、複数の割り込みハンドラ割り込みハンドラは、次の手順を実行した後、
-
STEP 1、IRQサービス・ルーチンをオンにする割り込みベクタにジャンプする最初。これは、関数に対応します
-
STEP 2は、IRQ(ID番号96)を生成する方法の数十がありますので、我々はIRQ割り込み割り込み番号が起こった起こった、具体的かを知る必要があります。見つかった場合に対応するには、適切なハンドラを呼び出します。
-
ステップに対応する、特定の割り込みID番号を検索STEP 3は、細分化されなければならない再処理することである
(例えば、118に、52 GPIOは、特定のいずれかを決定するために、割り込みを生成することができます)。ならびに他の適切なプロセス。