6605|15

59

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

WinCE依据什么来调用同名但是不同功能的的函数 [复制链接]

在WinCE当中定义了很多函数,它们具有一些特定的功能。但是在各个厂商的BSP当中也有定义很多同名的函数,提供了针对该平台的一些特定功能。那么WinCE到底靠什么来确定该调用那个函数了。比喻说在在在InterruptInitialize()调用OEMInterruptEnable()然后再去调用BSP的OALInterruptEnable(),但是在EP9315的BSP当中它却是没有OALInterruptEnable()函数,只有一个和微软同名的OEMInterruptEnable()函数去完成了OALInterruptEnable()函数功能,那么WinCE是依据什么来区分调用这些函数了。

最新回复

有些函数是微软写好了,并且名字也和BSP里面的一样,可是在编译进NK的时候没有引用他的lib ,那么就不会妨碍的。  详情 回复 发表于 2010-6-4 23:05
点赞 关注

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
关注楼主的问题
帮顶
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
怎么没有人回贴,难道是问题太简单了!
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(初级)

4
 
根据代码怎么写来区分~楼主为什么说OEMInterruptEnable()和OALInterruptEnable()是同名的函数?
 
 
 

回复

93

帖子

0

TA的资源

一粒金砂(初级)

5
 
可能我表述有误,用图片可能解释得更清楚!D:\123.JPEG
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(初级)

6
 
D:\123.JPG
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

7
 
在上图中,WINce中自带的s3c2410BSp中在中断程序调用InterruptInitialize()时,会经过以上流程,最调用s3c2410BSpBSP当中OALIntrEnableIrqs()。上图当中OEMIteeruputEnable()函数是WinCE实现的,它相当于没有做什么针对S3c2410具体配置寄存器的工作,。而在EP9315中断程序中调用InterruptInitialize()时就直接去调用它自己BSP当中实现的OEMIteeruputEnable()函数去完成了s3c2410BSP当中OALIntrEnableIrqs()相对应的任务,这不是关键问题,关键是Wince怎么去区分InterruptInitialize()函数到底是去调用自己的OEMIteeruputEnable()而后去调用OALIntrEnableIrqs(),还是去直接去调用BSP当中定义实现的OEMIteeruputEnable()。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

8
 
根据链接的库不同,就调用不同的函数了
OAL 需要实现一些固定的函数,并且链接到kern.exe即nk.exe中(wince5)
如果使用PQOAL架构,这些函数微软都实现为不包含实际硬件操作的"空"函数,其中再调用bsp中的实际函数
如果不使用PQOAL架构,就可以在bsp中直接实现这些函数
区别的仅仅是链接到kern.exe中的库不同,如果使用PQOAL需要链接PQOAL的库,不使用直接在代码中实现就不需要连接库,链接了就会发生函数重名错误
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 
“根据链接的库不同,就调用不同的函数了”,不太理解,Reallyyu能否解释仔细一点,谢谢!
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

10
 
我已经解释的很详细了...
你所说的是在不同bsp里的情况
其实wince要求OAL层必须实现 OEMInit() 等等以OEM开头的若干函数
至于你使用ms帮你写好的框架,还是自己在bsp里面实现这些函数都是可以了
如果要用ms的框架就需要链接ms提供的库
具体你看两个bsp下 kernel.exe 的source文件就知道了
这纯粹是个编译链接的问题
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

11
 
看不见图~~~
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

12
 
一般都是根据引用lib的路径,

还有BSP 是可以自己修改的嘛,各家稍有差异正常,比如人家在OEMIteeruputEnable 函数实现了,也可以,或者去写个函数被OEMIteeruputEnable调用实现也是同样的道理嘛,
我是这么理解的,不知道是否对了。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

13
 
但是在OEM开头的一系列函数是微软自己实现的了的,在wince5.0它的目录是
D:\WINCE500\PLATFORM\COMMON\SRC\COMMON\INTR\COMMON
贴一段它的代码
BOOL OEMInterruptEnable(DWORD sysIntr, LPVOID pvData, DWORD cbData)
{
    BOOL rc = FALSE;
    const UINT32 *pIrqs;
    UINT32 count;

    OALMSG(OAL_INTR&&OAL_VERBOSE,
        (L"+OEMInterruptEnable(%d, 0x%x, %d)\r\n", sysIntr, pvData, cbData
    ));

    // SYSINTR_VMINI & SYSINTR_TIMING are special cases
    if (sysIntr == SYSINTR_VMINI || sysIntr == SYSINTR_TIMING) {
        rc = TRUE;
        goto cleanUp;
    }

    // Obtain the SYSINTR's underlying IRQ number
    if (!OALIntrTranslateSysIntr(sysIntr, &count, &pIrqs)) {
        // Indicate invalid SysIntr
        OALMSG(OAL_ERROR, (
            L"ERROR: OEMInterruptEnable: IRQs are undefined for SysIntr %d\r\n",
            sysIntr
        ));
        goto cleanUp;
    }

    // Enable the interrupt
    rc = OALIntrEnableIrqs(count, pIrqs);

cleanUp:   
    OALMSG(OAL_INTR&&OAL_VERBOSE, (L"-OEMInterruptEnable(rc = 1)\r\n"));
    return rc;
}
这个函数明显的是去调用了具体的BSP当中OOALIntrEnableIrqs函数吗!
而我想要说的,在EP9315当中,它自己也有定义了OEMInterruptEnable(DWORD sysIntr, LPVOID pvData, DWORD cbData),在这里面它直完成了对应的任务,不需要去实现OAL函数。按PQOAL概念,如果是ep9315的BSP,系统启动后,不是要出错了吗!因为EP9315当中根本就没有实现OALOALIntrEnableIrqs函数,反而是有一个和WINCE定义的相同的函数OEMInterruptEnable()
BOOL OEMInterruptEnable(DWORD idInt, LPVOID pvData, DWORD cbData)
{   
    BOOL    bRet = TRUE;
    ULONG   ulIntMask1, ulIntMask2;


    bRet = SysIntrNumToInterruptMask(idInt, &ulIntMask1, &ulIntMask2);
  
    INTERRUPTS_OFF();


    if(ulIntMask1)
    {
        *VIC1_INTENABLE     = ulIntMask1;
        gdwInterruptMask1   |= ulIntMask1;
    }

    if(ulIntMask2)
    {
        *VIC2_INTENABLE     = ulIntMask2;
        gdwInterruptMask2   |= ulIntMask2;
    }

    if(idInt ==SYSINTR_SPI)
    {
        fPS2Int             = 0;
    }

    if((idInt == SYSINTR_PIO_PLAYBACK) && (cbData == sizeof(PIOBufferParameters)) )
    {
        PIOBufferParameters *pPIO = (PIOBufferParameters *)pvData;

        sPlayBack.pulPosition   = sPlayBack.pulBuffer = pPIO->pulBuffer = gulTransmitBuffer;
        sPlayBack.ulBufferSize  = pPIO->ulBufferSize;
        sPlayBack.pulBufferEnd  = sPlayBack.pulBuffer + (sPlayBack.ulBufferSize>>2);
        sPlayBack.pulBufferHalf = sPlayBack.pulBuffer + (sPlayBack.ulBufferSize>>3);
        sPlayBack.bEnabled
}
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

14
 
看看wince\platform\common\src\Inc\oal_ioctl_tab.h
或许你会明白了
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

15
 
看了许久,好像没有发现这张表有什么特别的,它只是在驱动或者应用程序调用KernelIO,内核就去调用OEMIOControl函数,OEMIOControl依据表中的命令定义的命令去作出相应的操作。不理解和我问题有可关系,还请高人指点。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

16
 
有些函数是微软写好了,并且名字也和BSP里面的一样,可是在编译进NK的时候没有引用他的lib ,那么就不会妨碍的。
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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