体育资讯网

您现在的位置是:首页 > 分类10 > 正文

分类10

wince盘点源码(wince盘点软件)

hacker2022-07-18 21:53:44分类1086
本文目录一览:1、WINCE中如何快速定位问题2、

本文目录一览:

WINCE中如何快速定位问题

跟踪一个BUG的过程中,发现一个BUG的真正原因有时甚至比找出问题的解决方法更为重要,更麻烦.WINCE是一个很庞杂的系统,很多问题一开始根本无从下手,而一旦找到问题的本质,BUG也就迎刃而解了.

首先,我们需要对WINCE系统各个模块的功能,相互关系有一个基本的认识.例如,存储系统包括块设备的驱动程序,文件系统及分区管理模块.块设备驱动程序只负责读取/写入数据,对数据的内容一概不闻不问,在这个意义上讲如果应用程序读取一个文件与读取一个目录时的表现不一致,则应该先检查文件系统,而不是查驱动程序.我知道一个BUG,在WINCE4.2上,CDROM中无法读取一个子目录下的内容,即属于这个问题,根据我对CE存储系统的理解,很快就找出了问题所在. 但有时,我们不能太过相信经验,比如,我查过一个BUG,我的系统在从网络共享中拷贝文件时很慢,所以我测试了FTP,后者很正常,据此我认为是CE自身的问题,但后来跟踪的结果是我的网卡驱动引发的.但我认为,先检查FTP的状况这个做法本身没有问题,问题在于我没有继续深入调查.

其次,我们要利用调试工具,KITL就是很不错的一个,如果我们的硬件在某种情况下对时序要求并不是很严格,就可以使用KITL,比如硬盘,当DRQ信号产生以后,在数据读完之前,DRQ一直存在,数据不会丢失,串口就不是很适合这种方法,当FIFO underrun中断发生时,如果我们不及时处理,还在用KITL单步跟踪,接下来的传输就会步法大乱.

还有,要注意每一个细节,尤其是调试信息,我们可以在代码中一次多找印一些信息,这样就能比较快的找出问题,更重要的是要注意系统输出的信息.一旦看到一个不知何处输出的信息时,不用紧张,我们可以搜索一下它在哪个文件中,一般可以先根据我们所调试的模块而大概确定那些代码在什么地方,如果对WINCE的源码结构不是很清楚也没关系,实在不行,我们可以在WINCE的根目录下搜索.

最后,注意输出信息,output窗口的信息也极为重要

管家婆 ERP V3 8.21 的数据采集器 程序 谁有啊 盘点机系统 WINCE 5.0

我有。可以百度Hi我。 或者把鼠标移动到我的名字上面会显示我的联系方式。

WinCE 6.0系统启动流程详解?

Windows CE6.0启动过程分析

在Windows CE 6.0中wince盘点源码,内核(Kenerl)和OEM代码被分成oal.exe、kernel.dll和kitl.dll三个部分,其中启动代码(startup)和 OAL层wince盘点源码的实现部分不再与内核链接生成NK.exe,取而代之的是启动代码(startup)和硬件相关且独立于内核的OAL层的实现部分编译成 oal.exe,而与内核相关且独立于硬件的OAL层代码包含在kernel.dll中;内核无关传输层(KITL)的支持代码从OAL层分离出来编译成 kitl.dll。

从表面上看,好像只是代码重新组合wince盘点源码了一下,从帮助 文档中BSP的移植过程看好像也是这么一回事,实际上,整个Windows CE 6.0内核布局发生了很大的改变。Windows CE 6.0的启动过程也是如此,如果wince盘点源码你想按照Windows CE 5.0的启动顺序去分析Windows CE 6.0的启动顺序,可能会走到一个死胡同。主要是因为Windows CE 6.0在启动过程中调用了kernel.dll和kitl.dll两个动态链接库的原因,而且Windows CE6.0不再编译生成KernKitlProf.exe内核文件。

从Windows CE 6.0的帮助文档可以看出,WinCE6.0的启动只与oal.exe和kernel.dll有关,至于kitl.dll,只有将操作系统编译成具有 KITL功能时才用到。分析Windows CE 6.0的启动过程实际上找到编译oal.exe和kernel.dll的源码位置。

首先看一下将WinCE6.0编译成诸如 WinCE5.0所说的基本内核情况,即kern.exe。对于oal.exe源码位置比较容易找到,因为oal.exe是启动代码与硬件相关的OAL层 实现文件编译而成,所以只需在BSP的OAL目录中便能找到。而对于kernel.dll,在BSP目录结构中,基本上无法找到kernel.dll的编 译文件,所以必须从其wince盘点源码他方面着手。

下面为WinCE 6.0的编译日志输出文件:makeimg.out在文件复制过程的一部分:

Copying E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\oal.exe to E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\nk.exe for debugger Copying E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\kern.dll to E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\kernel.dll for debugger

从日志输出文件可以看出,在文件复制过程 中,WinCE6.0编译器将oal.exe更名为nk.exe,而将kern.dll文件更名为kernel.dll,也就是说,kern.dll文件 的实现部分就是kernel.dll的实现体。根据前面的分析,oal.exe是与硬件相关独立于内核的OAL层的实现部分,而kernel.dll为内 核相关独立于硬件的OAL层的实现部分。同样可以从最后整合后的二进制配置文件ce.bib文件中看出端倪。

; @CESYSGEN IF CE_MODULES_NK

nk.exe E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\oal.exe NK SHZ

kitl.dll E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\kitl.dll NK SHZ

kernel.dll E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\kern.dll NK SHZ

; @CESYSGEN ENDIF

而kern.dll动态库在整个Windows CE6.0中没有显式编译过程,即没有一个sources文件有kern.dll的编译过程,所以只能从操作系统的编译文件Makefile中寻找其编译 过程。下面看一下$(_PUBLICROOT)\common\CESYSGEN\makefile中的部分内容:

nk::$(NK_COMPONENTS) $(NK_REPLACE_COMPONENTS)

@copy $(SG_INPUT_LIB)\oemstub.pdb $(SG_OUTPUT_OAKLIB)

@copy $(SG_INPUT_LIB)\oemstub.lib $(SG_OUTPUT_OAKLIB)

set TARGETTYPE=DYNLINK

set TARGETNAME=kern

set RELEASETYPE=OAK

set DLLENTRY=NKStartup

set DEFFILE=NO_DEF_FILE

set TARGETLIBS=

set SOURCELIBS=%%NKLIBS%% $(SG_INPUT_LIB)\nkmain.lib $(SG_INPUT_LIB)\fulllibc.lib

$(MAKECMD) /NOLOGO NOLIBC=1 kern.dll

从上述代码中可以发现,原来kern.dll动态库是从oemstub.lib编译而来,而且与nkmain.lib有关。

在理顺了上述文件的相互之间的关系之后,再来分析Windows CE 6.0的启动过程可能就比较容易啦。

在理清了上述文件的关系之后,便可以分析任意一款基于ARM微处理器的Windows CE 6.0的启动过程,现在以深圳亿道电子技术有限公司开发的基于PXA270 ARM开发平台为例,分析Windows CE 6.0操作系统启动过程。

1、Startup函数:

从Windows CE 6.0的帮助文档可以看出,WinCE6.0的启动只与oal.exe和kernel.dll有关,至于kitl.dll,只有将操作系统编译成具有 KITL功能时才用到。分析Windows CE 6.0的启动过程实际上找到编译oal.exe和kernel.dll的源码位置。

oal.exe的通过Startup函数完成硬件 的初始化。Startup.s代码与该硬件平台的Bootloader启动代码共用,其中PreInit函数主要完成将ARM处理器工作模式切换到管理员 模式、同时关闭MMU,并检测系统启动原因,如果是热启动、即在该函数调用之前已经启动了Bootloader程序,相当基本硬件初始化已经完成,则直接 跳转到OALStartUp函数中;否则需要进行硬件中断屏蔽、内存、系统时钟频率、电源管理等硬件的基本初始化过程。(具体过程见代码的分析)

$(_PLATFORMROOT)\xsbase270\src\common\Startup\Startup.s

LEAF_ENTRY StartUp

bl PreInit

tst r10, #RCSR_HARD_RESET

beq OALStartUp

tst r10, #RCSR_GPIO_RESET

bne Continue_StartUp

bl xlli_mem_init ;初始化内存控制器

ldr r0, =xlli_PMRCREGS_PHYSICAL_BASE;

ldr r0, [r0, #xlli_PSPR_offset];

mov r1, r10;

bl XllpPmValidateResumeFromSleep;

cmp r0, #0;

bne Failed_Sleep_Resume;

Sleep_Reset

ldr r0, =xlli_PMRCREGS_PHYSICAL_BASE;

ldr r0, [r0, #xlli_PSPR_offset];

mov r1, r10;

b XllpPmGoToContextRestoration;

Failed_Sleep_Resume

ldr r1, =xlli_RCSR_SMR

bic r10, r10, r1

Continue_StartUp

bl xlli_intr_init; ;初始化中断控制器

bl EnableClks; ;使能内核时钟(内存/OS定时器/FFART时钟之需)

bl OALXScaleSetFrequencies ;设置系统频率

bl xlli_mem_Topt

bl xlli_mem_restart ;复位内存,使其处于工作模式

bl xlli_ost_init ;初始化操作系统定时器

bl xlli_pwrmgr_init ;初始化电源管理

bl xlli_IMpwr_init ;初始化内部存储器

b

ENTRY_END

2、OALStartUp函数:

在系统硬件初始化完毕之后,Startup调用 OALStartUp函数,OALStartUp函数主要完成将OEMAddressTable表传递给内核;然后调用KernelStart函数跳转到 内核OEMAddressTable表的主要作用表的每一个入口都定义了一个内存中的物理位置、内存的大小以及映射这物理地址的静态虚拟地址;

◆静态虚拟内存地址被定义在缓冲存储器的范围之内;

◆内核可以创建非缓冲的内存地址指向到相同的物理地址;

◆对于同一物理地址,既有一个缓冲的虚拟内存地址,也有一个非缓冲的虚拟内存地址;

◆OEMAddressTable最后必须以0结尾;

◆对于MIPS和SHx类型的CPU,物理地址与虚拟地址的映射由CPU完成,无需创建OEMAddressTable

$(_PLATFORMROOT)\xsbase270\src\Inc\ Oemaddrtab_cfg.inc):

$(_PLATFORMROOT)\xsbase270\src\oal\OalLib\Startup.s

3、KernelStart函数主要作用:

◆完成OEMAddressTable表中的物理地址到虚拟地址和虚拟地址到物理地址之间的映射;

◆对存储器页表和内核参数区存储空间(RAM或DRAM)进行清零处理。

◆读出CPU的ID号,内核需要根据该ID决定ARM的MMU处理,因为ARMV6和ARMV6之前的ARM处理器的MMU处理过程有所区别;

◆设置并开启MMU和Cache,因为在Startup函数关闭MMU和Cache;

◆设置ARM处理器工作模式的SP指针,ARM处理器共用7种不同的工作模式 (USER、FIQ、IRQ、Supervisor、Abort、Undefined、System),除用户模式(USER)和系统模式 (System)之外,其他5种工作模式都有具有特定的SP指针寄存器(ARM处理器称其为影子寄存器);

◆读取内核启动所需要的KDataStruct结构体;

◆调用ARMInit函数重新定位Windows CE内核参数pTOC和初始化OEMInitGlobals全局变量;

◆利用mov pc, r12指令跳转到kernel.dll的入口位置,即NKStartup函数中。

$(_PRIVATEROOT)WINCEOS\COREOS\NK\LDR\ARM\armstart.s

4、ARMInit函数:

在ARMInit之前,系统仍无法使用全局变量, 因为系统的全局还在ROM区域,对于操作系统而言,出于安全考虑,只有XIP程序才有读取ROM区域数据的权利,对于大部分Windows CE 操作系统,只有将数据拷贝到RAM区域后才能进行读写,ARMInit函数中通过调用KernelRelocate函数对pTOC全局变量重新定位,定位 之后,对内核启动所需要的KDataStruct结构体进行初始化,其中OEMInitGlobals便是交换oal.exe和kernel.dll之间 的全局指针,ARMInit函数返回kernel.dll的入口位置。并在KernelStart函数最后利用mov pc, r12指令跳转到kernel.dll的入口位置,即NKStartup函数中。

$(_PRIVATEROOT)WINCEOS\COREOS\NK\LDR\ARM\arminit.c

5、NKStartup函数:

硬件平台初始化完成后,oal.exe的启动任务基本完成,余下的启动工作由内核相关且独立于内核的OAL层实现体kernel.dll接管。kernel.dll主要作用:

◆从结构体参数KDataStruct * pKData提取内核启动时所必须的全局变量,同时初始化内核全局变量;

◆定位对Windows CE 6.0特有的OEMGLOBAL结构体的初始化函数OEMInitGlobals地址,该结构体构建了内核和OAL层之间进行通信的桥梁。在 OEMGLOBAL结构体定义了OAL层所必须的函数,该结构体在oemglobal.c文件中被初始化,并被编译在OEMMain.lib和 OEMMain_StaticKITL.lib两个库中,如果OAL链接这两个库,则必须要有该结构体中函数实现体;

◆通过调用ARMSetup设置物理地址和非缓冲的虚拟内存地址的映射、ARM中断向量以及内核模式所需要的堆栈。

◆调用OEMInitDebugSerial函数初始化调试串口;

◆调用OEMInit进行平台初始化;

需要注意的时,NKStartup函数调用OEMInitDebugSerial和 OEMInit函数的过程与Windows CE 6.0之前的版本完全不同,这是因为在Windows CE 6.0以前的版本中,由于内核(kernel)、OAL和KITL编译在一个可执行的文件中,它们之间的共享变量只需简单利用extern关键字申明便可 相互之间进行访问,而在Windows CE 6.0中,由于内核(kernel)、OAL和KITL被编译成不同的可执行文件,变量之间的相互访问无法使用extern关键字实现共享,即内核无法使 用extern DWORD varX方法访问OAL层的变量varX,当然OAL层的实现体同样无法通过同样的方式访问内核变量。为实现内核和OAL访问共享信息,Windows CE 6.0定义了OEMGLOBAL和GLOBAL两个结构体。

在 Windows CE 6.0的内核启动时,OS找到OAL的入口位置,然后调用入口函数与全局块进行指针交换,这样内核才能使用OAL层中的信息,同样OAL层才能访问内核(kernel)导出的函数。

所以上述两个函数的调用实际上通过OEMGLOBAL结构体实现的。实际调用位置为$(_PRIVATEROOT)\winceos\coreos \nk\oemstub\oemstub.c中的OEMInitDebugSerial和OEMInit,这两个函数中通过OEMGLOBAL结构体指针 访问OAL层中的OEMInitDebugSerial和OEMInit。

首先看一下将WinCE6.0编译成诸如WinCE5.0所说的基本内核情况,即kern.exe。对于oal.exe源码位置比较容易找到,因为 oal.exe是启动代码与硬件相关的OAL层实现文件编译而成,所以只需在BSP的OAL目录中便能找到。而对于kernel.dll,在BSP目录结 构中,基本上无法找到kernel.dll的编译文件,所以必须从其他方面着手。

调用KernelFindMemory()函数分割RAM区域,在Windows CE操作系统中,RAM空间主要分为存储内存和程序内存,存储内存主要为文件的存储空间,包括内核文件和复制到系统中所有目标文件,程序内存为运行程序时所需要的存储空间。

◆KernelStart ()启动内核。

$(_PRIVATEROOT)\WINCEOS\COREOS\NK\KERNEL\ARM\mdarm.c

void NKStartup (struct KDataStruct * pKData)

{

。。。。

}

6、KernelSstart函数:

这里的KernelStart函数与前面的KernelStart函数的属于两个完全不 同的函数,NKStartup函数中调用的KernelStart函数为$(_PRIVATEROOT)\WINCEOS\COREOS\NK \KERNEL\ARM\armtrap.s文件中的KernelStart函数,主要完成调用内核初始化函数KernelInit,并跳转到操作系统的 第一个启动的任务。

LEAF_ENTRY KernelStart

ldr r4, =KData ; (r4) = ptr to KDataStruct

ldr r0, =APIRet

str r0, [r4, #pAPIReturn] ; set API return address

mov r1, #SVC_MODE

msr cpsr_c, r1 ; switch to Supervisor Mode w/IRQs enabled

CALL KernelInit ; initialize scheduler, etc.

mov r0, #0 ; no current thread

mov r1, #ID_RESCHEDULE

b FirstSchedule

ENTRY_END

7、KernelInit函数:

Windows CE 6.0的内核初始化函数同其他版本的内核初始化函数基本相近,主要完成在启动第一个线程前对内核进行初始化,主要包括API函数集初始化、堆的初始化、初始化内存池、进程初始化、线程初始化和文件映射初始化等操作。

void KernelInit (void)

。。。{

}

8、FirstSchedule:

FirstSchedule函数为Windows CE操作系统启动过程中最后无条件跳转的一个函数,windows CE进行第一个调度,实际为一个空闲线程,因为windows CE系统还没有完成启动,只有当windows CE完全启动并进入稳定状态,然后启动文件系统filesys.dll,设备管理device.dll,窗体图像子系统gews.dll和shell程序 explore.exe。

Wince5.0下用C#开发蓝牙打印程序源码

去下载这个软件

蓝牙软件 IVT BlueSoleil v6.4.249.0 多国语言中文破解版

我就是用这个上网的

很好操作

BlueSoleil是由IVT公司开发的蓝牙软件产品。BlueSoleil可以让您的计算机享受无线的便捷. 凭借每秒钟3M的数据交换量,用户可以畅听音质好的音乐并无线使用蓝牙鼠标和键盘.

凭借独特的蓝牙 AV/Mono数据频道协同工作方式, BlueSoleil支持用户同时通过普通的蓝牙立体声仿真耳机听音乐和打电话,或者倾动的转换这两种模式, 新加入的Skype 2.X程序可以方便的让您通过普通的蓝牙耳机接/打电话.

通过使用篮牙适配器wince盘点源码,BlueSoleil 可以实现多台电脑组网并且无线交互信息。BlueSoleil还可以实现电脑和其他篮牙设备快速稳定的连接,比如说移动手机, 头戴式耳机, 个人掌上电脑, 局域网接入设备,打印机,数码相机,电脑的外设设备等等.

安装及破解说明wince盘点源码

1、在安装此BlueSoleil 6最新版前,请拔下蓝牙设配器,卸载BlueSoleil的旧版本;

2、安装完毕,提示是否要重启,选择“否”,暂不要重启系统;

3、将破解补丁复制到程序安装目录下(如C:\Program Files\IVT Corporation\BlueSoleil\);

4、然后重启系统,插上USB蓝牙设配器,驱动自动安装完成。

5、如果已经运行了BlueSoleil程序(任务栏有图标显示),尚未破解,就需要关闭相应进程,或者进入安全模式,再次运行破解补丁

WinCE 源代码

WinCEwince盘点源码的开发环境里面自带的源码

比如WinCE5wince盘点源码,在你装PB5的时候wince盘点源码,会有选择装源码的(指内核的部分源码)

发表评论

评论列表

  • 痴者橙柒(2022-07-19 01:33:18)回复取消回复

    法找到kernel.dll的编译文件,所以必须从其他方面着手。调用KernelFindMemory()函数分割RAM区域,在Windows CE操作系统中,RAM空间主要分为存储内存和程序内存,

  • 颜于铃予(2022-07-19 02:56:05)回复取消回复

    在Windows CE 6.0中wince盘点源码,内核(Kenerl)和OEM代码被分成oal.exe、kernel.dll和kitl.dll三个部分,其中启动代码(startup)和 OAL层wince盘点源码的实现部分不再与内核链接生成

  • 笙沉嵶邸(2022-07-18 22:45:35)回复取消回复

    il是由IVT公司开发的蓝牙软件产品。BlueSoleil可以让您的计算机享受无线的便捷. 凭借每秒钟3M的数据交换量,用户可以畅听音质好的音乐并无线使用蓝牙鼠标和键盘.凭借独特的蓝牙 AV/Mono数据频道协同工作方式, BlueSolei

  • 俗野晴枙(2022-07-19 08:42:48)回复取消回复

    FirstScheduleENTRY_END7、KernelInit函数: Windows CE 6.0的内核初始化函数同其他版本的内核初始化函数基本相近,主要完成在启动第一个线程前对内核进行初始化,主要包括API函数集初始化、堆的初始化、初始化内存池、进程初始化、线程初始化和文件映射初

  • 辙弃慵挽(2022-07-19 09:45:02)回复取消回复

    KITL单步跟踪,接下来的传输就会步法大乱.还有,要注意每一个细节,尤其是调试信息,我们可以在代码中一次多找印一些信息,这样就能比较快的找出问题,更重要的是要注意系统输出的信息.一旦看到一个不知何处输出的信息时,