?? pcinterrupt.c
字號:
// GPIO.c : 模擬 GPIO
// 或者模擬所有的外圍設備寄存器.
//通過地址來定位.
/******************************************************************/
#define _HW_MEMMAP_H
#include "include.h"
#include "hw_interrupt.h"
#include "..\..\peripheral\pcgpio.h"
/******************************************************************/
extern void IrqCHandler(void);
extern INTR_HANDLER irq_vector_table[INTC_MAX_IRQ]; // IRQ controller interrupt handle vector table
/*
仿真 中斷 說明:
1. 防止 只需要 兩個標志 : INTC_IECR:中斷注冊和允許 標志.
INTC_ISR : 中斷發生標志. INTC_IMR: 中斷標志.0:一次,1:循環.
2. 中斷分為 一次性中斷和 定時器中斷. 定時器中斷 由 TIMER 發生.
*/
/******************************************************************/
//代碼調度的堆空間
void PCIGenerateIRQ(int irq)
{
REGISTER cpsr ;
REGISTER Intc_IECR ;
read_creg(cpsr, cpsr);
if (cpsr & (0x0001 << PC_ARMREG_BITIRQ))
return;
//READ IRQ ENABLE FLAG.
Intc_IECR = read_mem32(INTC_IECR);
if ((Intc_IECR&(0x1 << irq)))
{
DECLARE_CUP_SR;
write_mem32(INTC_ISR , irq); //set irq flag.
PCCEnterCritical();
ENTER_CRITICAL();
OSIntEnter();
IrqCHandler();
OSIntExit();
//由于 中斷之后可能任務要切換,因此必須首先 EXIT_CRITICAL 才能進行任務調度.
if (OSPrioHighRdy != OSPrioCur)
{
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
EXIT_CRITICAL();
PCCExitCritical();
OSIntCtxSw();
}
else
{
EXIT_CRITICAL();
PCCExitCritical();
}
}
}
void PCISetIrqData(INT32U irqIndex , INT32U irqData)
{
if (irqIndex < PCLIB_IRQIDX_MAX)
{
INT32U *pIrqData = (INT32U*) & gPcLibIrqData;
pIrqData[irqIndex] = irqData;
}
}
/***************************************************************/
//PC 模擬中斷!!
void Intr_PowerOnInit(void)
{
// irq enable
write_mem32(INTC_IECR, 0);
// irq gen flag.
write_mem32(INTC_ISR, 0);
// irq set mask
//write_mem32(INTC_IMR, 0);
}
InterruptHandler Intr_RegISR(int irq, InterruptHandler routine)
{
InterruptHandler ro = irq_vector_table[irq].routine;
irq_vector_table[irq].routine = routine;
// irq enable
write_mem32(INTC_IECR, read_mem32(INTC_IECR) | (0x1 << irq));
// irq set mask
// write_mem32(INTC_IMR, 0x1 << irq);
return ro;
}
int Intr_GetState(void)
{
return read_mem32(INTC_ISR);
}
void Intr_ClearFlag(int irq)
{
write_mem32(INTC_ISR, read_mem32(INTC_IECR)&(~(0x1 << irq)));
}
BOOL Intr_Enable(eIRQ_NUM_t irq)
{
// irq enable
write_mem32(INTC_IECR, read_mem32(INTC_IECR) | (0x1 << irq));
return TRUE;
}
BOOL Intr_Disable(eIRQ_NUM_t irq)
{
// irq enable
write_mem32(INTC_IECR, read_mem32(INTC_IECR)&(~(0x1 << irq)));
return TRUE;
}
/*--------------------------------------*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -