7902|22

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

wince 如何实现ISR和线程通信 [复制链接]

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

此帖出自WindowsCE论坛

最新回复

结果很奇怪啊,你的int类型有没有被重定义过。 试试用0x80020000+0x20000000(uncached)看看。  详情 回复 发表于 2010-2-24 10:47
点赞 关注
 

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我怎么找不到wince6的isr。在什么目录下。文件名是什么。搜也搜不到
此帖出自WindowsCE论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
可以考虑2种方法
1,seteventdata()
2,在driverglobals中添加共享变量
此帖出自WindowsCE论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

4
 
共同访问一个变量比较好
此帖出自WindowsCE论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 veabol 的回复:
共同访问一个变量比较好


同意楼上的,简单方便。
此帖出自WindowsCE论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 3 楼 veabol 的回复:
共同访问一个变量比较好

具体怎么实现共同访问一个变量呢?isr在oal层。驱动里可以访问吗?再说他们也不在一个文件里啊。
能用代码说明下吗
此帖出自WindowsCE论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
内存共享
此帖出自WindowsCE论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
wince 6 的isr目录在什么地方。我找不到啊。
OEMInterruptHandler搜不到文件。
wince6+arm9(2440)
此帖出自WindowsCE论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 jiereliyi 的回复:
wince 6 的isr目录在什么地方。我找不到啊。
OEMInterruptHandler搜不到文件。
wince6+arm9(2440)

应该是在src\Common\Intr\intr.c
此帖出自WindowsCE论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

10
 
在内存中预留一段,OAL和驱动都可以通过内存映射访问到,就能实现OAL和驱动中变量的共享。
这效果就类似于你可以在OAL中操作一个GPIO,也可以在驱动中操作它。只不过在这里,操作的不是CPU内存的寄存器,而是你预留的内存中的一段而已。
此帖出自WindowsCE论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

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中。
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 9 楼 sunrain_hjb 的回复:
在内存中预留一段,OAL和驱动都可以通过内存映射访问到,就能实现OAL和驱动中变量的共享。
这效果就类似于你可以在OAL中操作一个GPIO,也可以在驱动中操作它。只不过在这里,操作的不是CPU内存的寄存器,而是你预留的内存中的一段而已。

mark
此帖出自WindowsCE论坛
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

13
 
我的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;

        }  
此帖出自WindowsCE论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

14
 
(*m_Coder1)++;
此帖出自WindowsCE论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

15
 
共享内存,之后中断发生后产生一个事件给线程,线程直接读取或者清空即可。
此帖出自WindowsCE论坛
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

16
 
串口输出信息:
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 的值根本不变!!!
此帖出自WindowsCE论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

17
 
引用 13 楼 rushonin 的回复:
(*m_Coder1)++;

这里我已经改了
此帖出自WindowsCE论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

18
 
   
  标记一下,正在做的项目中可能要用到
此帖出自WindowsCE论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

19
 
关注一下,方法应该是没问题。
此帖出自WindowsCE论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

20
 
还没有解决呢 还没有解决
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表