📄 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 + -