wince 如何实现ISR和线程通信

hbxgyjs   2010-2-4 10:33 楼主
我想在ISR中计算中断次数,然后在另一个线程中读取隔一段时间读取这个数值然后清零,如何实现。
希望详解。有些地方还是没有接触过。

回复评论 (22)

我怎么找不到wince6的isr。在什么目录下。文件名是什么。搜也搜不到
点赞  2010-2-4 11:02
可以考虑2种方法
1,seteventdata()
2,在driverglobals中添加共享变量
点赞  2010-2-4 11:16
共同访问一个变量比较好
点赞  2010-2-4 12:05
引用: 引用 3 楼 veabol 的回复:
共同访问一个变量比较好


同意楼上的,简单方便。
点赞  2010-2-4 12:18
引用: 引用 3 楼 veabol 的回复:
共同访问一个变量比较好

具体怎么实现共同访问一个变量呢?isr在oal层。驱动里可以访问吗?再说他们也不在一个文件里啊。
能用代码说明下吗
点赞  2010-2-4 13:00
内存共享
点赞  2010-2-4 13:03
wince 6 的isr目录在什么地方。我找不到啊。
OEMInterruptHandler搜不到文件。
wince6+arm9(2440)
点赞  2010-2-4 13:33
引用: 引用 7 楼 jiereliyi 的回复:
wince 6 的isr目录在什么地方。我找不到啊。
OEMInterruptHandler搜不到文件。
wince6+arm9(2440)

应该是在src\Common\Intr\intr.c
点赞  2010-2-4 13:44
在内存中预留一段,OAL和驱动都可以通过内存映射访问到,就能实现OAL和驱动中变量的共享。
这效果就类似于你可以在OAL中操作一个GPIO,也可以在驱动中操作它。只不过在这里,操作的不是CPU内存的寄存器,而是你预留的内存中的一段而已。
点赞  2010-2-4 20:11
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中。
点赞  2010-2-4 20:14
引用: 引用 9 楼 sunrain_hjb 的回复:
在内存中预留一段,OAL和驱动都可以通过内存映射访问到,就能实现OAL和驱动中变量的共享。
这效果就类似于你可以在OAL中操作一个GPIO,也可以在驱动中操作它。只不过在这里,操作的不是CPU内存的寄存器,而是你预留的内存中的一段而已。

mark
点赞  2010-2-4 22:05
我的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;

        }  
点赞  2010-2-5 08:28
(*m_Coder1)++;
点赞  2010-2-5 11:20
共享内存,之后中断发生后产生一个事件给线程,线程直接读取或者清空即可。
点赞  2010-2-5 12:37
串口输出信息:
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 的值根本不变!!!
点赞  2010-2-5 13:36
引用: 引用 13 楼 rushonin 的回复:
(*m_Coder1)++;

这里我已经改了
点赞  2010-2-5 14:07
   
  标记一下,正在做的项目中可能要用到
点赞  2010-2-14 19:49
关注一下,方法应该是没问题。
点赞  2010-2-15 18:44
还没有解决呢 还没有解决
点赞  2010-2-16 10:36
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复