我想在ISR中计算中断次数,然后在另一个线程中读取隔一段时间读取这个数值然后清零,如何实现。
希望详解。有些地方还是没有接触过。
我怎么找不到wince6的isr。在什么目录下。文件名是什么。搜也搜不到
可以考虑2种方法
1,seteventdata()
2,在driverglobals中添加共享变量
引用: 引用 3 楼 veabol 的回复:
共同访问一个变量比较好
具体怎么实现共同访问一个变量呢?isr在oal层。驱动里可以访问吗?再说他们也不在一个文件里啊。
能用代码说明下吗
wince 6 的isr目录在什么地方。我找不到啊。
OEMInterruptHandler搜不到文件。
wince6+arm9(2440)
引用: 引用 7 楼 jiereliyi 的回复:
wince 6 的isr目录在什么地方。我找不到啊。
OEMInterruptHandler搜不到文件。
wince6+arm9(2440)
应该是在src\Common\Intr\intr.c
在内存中预留一段,OAL和驱动都可以通过内存映射访问到,就能实现OAL和驱动中变量的共享。
这效果就类似于你可以在OAL中操作一个GPIO,也可以在驱动中操作它。只不过在这里,操作的不是CPU内存的寄存器,而是你预留的内存中的一段而已。
To pass data between an ISR and an IST
Reserve physical memory for the ISR in your Config.bib file.
Config.bib contains several examples of reserving physical memory for the serial and debug drivers.
Use the reserved memory in your ISR call.
Because the ISR runs in kernel mode, the ISR can access the reserved memory to buffer data.
Call the MmMapIoSpace function in your IST to map the physical memory to a virtual address.
我上面说的就是这个意思,一般都是这么用,楼主可以试试看。
WinCE6.0中断处理的ISR一般是在bsp目录SRC\OAL\OALLIB的oalintr.c中。
我的config.bib文件如下:
MEMORY
NK 80200000 01e00000 RAMIMAGE
RAM 82000000 01e00000 RAM
; FLASH 92000000 00100000 RESERVED
; Common RAM areas
AUD_DMA 80002000 00000800 RESERVED
SDIO_DMA 80010000 00010000 RESERVED
RES 80020000 00000800 RESERVED
ARGS 80020800 00000800 RESERVED
DBGSER_DMA 80022000 00002000 RESERVED
SER_DMA 80024000 00002000 RESERVED
IR_DMA 80026000 00002000 RESERVED
SLEEP 80028000 00002000 RESERVED
EDBG 80030000 00020000 RESERVED
DISPLAY 80080000 00180000 RESERVED
红色的是我自己添加的。我看到很多介绍文章中说的这个表最好是连续的,但是我找到了一个间隙,就加到了这里0x800(2K)的空间。不知可以吗?
AUD_DMA 段为什么从0x80002000开始而不是从0x80000000开始?
这里我还可以用的空间有多少?
然后我在intr.c文件中这样定义了两个变量
volatile int * m_Coder1 = (int *)0x80020000;
volatile int * m_Coder2 = (int *)0x80020004;
在OEMInterruptHandler()函数中。添加红色代码,并输出信息。可是为什么m_Coder1 ,m_Coder2变量内容乱变,没有规律。?不知道这样行吗?
if (irq == IRQ_EINT4_7 || irq == IRQ_EINT8_23) { // 4 or 5
// Find external interrupt number
mask = INREG32(&g_pPortRegs->EINTPEND);
mask &= ~INREG32(&g_pPortRegs->EINTMASK);
mask = (mask ^ (mask - 1)) >> 5;
irq2 = IRQ_EINT4;
while (mask != 0) {
mask >>= 1;
irq2++;
}
irq3 = INREG32(&g_pIntrRegs->EINTPEND);
if((irq3 & 0x00002000) == 0x00002000)// 13
{
*m_Coder1++;
RETAILMSG(1,(TEXT("m_Coder1 m_Coder1 = %d \r\n",*m_Coder1)));
}
RETAILMSG(1,(TEXT("m_Coder1 = %d \r\n",*m_Coder1)));
if((irq3 & 0x00000100) == 0x00000100 )// 8
{
*m_Coder2++;
RETAILMSG(1,(TEXT("m_Coder2 m_Coder2 = %d \r\n",*m_Coder2)));
}
RETAILMSG(1,(TEXT("m_Coder2 = %d \r\n",*m_Coder2)));
// Mask and clear interrupt
mask = 1 << (irq2 - IRQ_EINT4 + 4);
//
SETREG32(&g_pPortRegs->EINTMASK, mask);
OUTREG32(&g_pPortRegs->EINTPEND, mask);
// Clear primary interrupt
mask = 1 << irq;
OUTREG32(&g_pIntrRegs->SRCPND, mask);
OUTREG32(&g_pIntrRegs->INTPND, mask);
// From now we care about this irq
irq = irq2;
}
共享内存,之后中断发生后产生一个事件给线程,线程直接读取或者清空即可。
串口输出信息:
m_Coder1 m_Coder1 = -1319108608
m_Coder1 = 17104898
m_Coder2 = 17104898
coder::int13------------
m_Coder1 m_Coder1 = -1319108608
m_Coder1 = 46465026
m_Coder2 = 46465026
coder::int13------------
m_Coder1 m_Coder1 = -1319108608
m_Coder1 = 33816578
m_Coder2 = 33816578
coder::int13------------
m_Coder1 m_Coder1 = -1319108608
m_Coder1 = 17104898
m_Coder2 = 17104898
coder::int13------------
m_Coder1 的值根本不变!!!