MULTI BIN的问题请看看还有哪位朋友能把debug的信息给我看看么(要KernelInit之后的 谢谢)
[复制链接]
我用的是三星的BSP,MULTI BIN方式的(wince5.0)我的问题现象如下:
Windows CE Kernel for ARM (Thumb Enabled) Built on Jun 24 2004 at 18:21:58
ProcessorType=0926 Revision=5
sp_abt=ffff5000 sp_irq=ffff2800 sp_undef=ffffc800 OEMAddressTable = 80080ab4
>> PLL Setting values
>> FCLK:169344000
>> HCLK:84672000
>> PCLK:84672000
DCache: 64 sets, 4 ways, 32 line size, 8192 size
ICache: 64 sets, 4 ways, 32 line size, 8192 size
+OALIntrInit.
+BSPIntrInit.
Enable IRQ_USBH
+ConfigureGPIO.
+InitDisplay.
FoxLink LCD Init...
+Call KITL.
+SetCLKforDevices
MPLLCON[80002000h]
UPLLCON[80040070h]
CLKCON[1fffffffh]
CLKSRC[30h]
CLKDIVN[61h]
-SetCLKforDevices
[MSMDD: IN] ++MSMDDInit()
[MSMDD:INF] pdwXIPLoc=0x82000000, dwDontUseChain=0x1
[MSMDD:INF] XIP chain location not fixed up
[MSMDD:OUT] --MSMDDInit()
Call uesr_test()
--------------------------------------
User_test() start.
- BANKCFG:48904h.
- BANKCON1:94000040h.
- BANKCON2:9c003fh.
- BANKCON3:80000032h.
- REFRESH:41dh.
- TIMEOUT:0h.
MISCCR:330h
User_test() end.
--------------------------------------
-OEMInit
Using Paging Pool, size = 0x00200000, Addr = 0x8c23a000, gpPoolArr = 0x8c43a000
Error Reporting Memory Reserved, dump size = 00020000
Booting Windows CE version 5.00 for (ARM)
&pTOC = 80049c1c, pTOC = 801ddad4, pTOC->ulRamFree = 8c23a000, MemForPT = 00202000
Old or invalid version stamp in kernel structures - starting clean!
Configuring: Primary pages: 6561, Secondary pages: 0, Filesystem pages = 3280
Booting kernel with clean memory configuration:
Memory Sections:
[0] : start: 8c43d000, extension: 00002000, length: 019a1000
Sp=ffffc7cc
ARMInit done.
Windows CE KernelInit------------挂在这里
以上是debug版本的输出信息,我很奇怪为什么程序挂在这里了
因为内核跑起来之后会首先调用wince private目录下的mdarm.c文件中的ARMInit函数,这个应该是正常的 因为串口信息已经输出ARMInit done了,之后应该是去调用KernelInit函数了 第一句就是lpWriteDebugStringFunc(TEXT("Windows CE KernelInit\r\n"));我也有输出
问题就是在这里了 之后呢????????为什么会这样?为什么会挂在这里
我的config.bib是这样的
MEMORY
#define CHAIN_ADDRESS 82000000
#define CHAIN_LENGTH 00001000
;------------------------------------
; page pool
#define PAGINGPOOLSIZE 00200000
pdwXIPLoc 00000000 82000000 FIXUPVAR
dwDontUseChain 00000000 00000001 FIXUPVAR
cbNKPagingPoolSize 00000000 $(PAGINGPOOLSIZE) FIXUPVAR
XIPKERNEL 80040000 001C0000 RAMIMAGE
NK 80200000 01E00000 RAMIMAGE
CHAIN 82000000 00004000 RESERVED
RESERVE 8df00000 00080000
RAM 8c200000 01C00000 RAM
;------------------------------------
; Common RAM areas
AUD_DMA 8C002000 00002000 RESERVED
TEMPS 8C010000 00010000 RESERVED
ARGS 8C020000 00000800 RESERVED
DBGSER_DMA 8C022000 00002000 RESERVED
SER_DMA 8C024000 00002000 RESERVED
IR_DMA 8C026000 00002000 RESERVED
SLEEP 8C028000 00002000 RESERVED
EDBG 8C030000 00020000 RESERVED
DISPLAY 8C100000 00100000 RESERVED
CONFIG
COMPRESSION=ON
KERNELFIXUPS=ON
;------------------------------------
; Multi-Region
AUTOSIZE=ON ;; AUTOSIZE is used to enable the following flags.
RAM_AUTOSIZE=OFF
ROM_AUTOSIZE=OFF ;; Modified by LEK... OFF->ON -> OFF
DLLADDR_AUTOSIZE=ON
XIPSCHAIN=$(CHAIN_ADDRESS)
AUTOSIZE_ROMGAP=10000
AUTOSIZE_DLLADDRGAP=0
AUTOSIZE_DLLDATAADDRGAP=0
AUTOSIZE_DLLCODEADDRGAP=0
地址映射 这里有点想不通,为什么不映射成一大块??
DCD 0x80000000, 0x33E00000, 2 ; 64 MB DRAM BANK 6
DCD 0x8C000000, 0x30000000, 30 ; 64 MB DRAM BANK 6
我的流程是这样的
编译之后生成XIPKERNEL.bin(现在是10K左右),nk.bin,chain.bin三个文件,之后修改ce.bib文件
将
nk.exe
coredll.dll
filesys.exe
binfs.dll
fsdmgr.dll
mspart.dll
boot.hv
default.hv
user.hv
都有NK 改为XIPKERNEL 这里有个问题 我在release下没有问题 debug下就有问题了
调用romimage ce.bib 重新生成XIPKERNEL.bin(现在是1M左右了),nk.bib,chain.bin三个文件
之后将三个文件利用eboo烧到nand中(MBR,BINFS都可以的)
之后读镜像,看了一下bsp中的源码,读镜像的时候只读了XIPKERNEL.bin这个文件的内容之后执行,程序就跑到了Windows CE KernelInit这里 这段代码应该是微软的代码应该是没有错误的
接下来应该执行Kwin32.c中的KernelInit函数了
SystemAPISets[SH_WIN32] = &cinfWin32;
SystemAPISets[SH_CURTHREAD] = &cinfThread;
SystemAPISets[SH_CURPROC] = &cinfProc;
SystemAPISets[SH_CURTOKEN] = &cinfToken;
SystemAPISets[HT_EVENT] = &cinfEvent;
SystemAPISets[HT_MUTEX] = &cinfMutex;
SystemAPISets[HT_SEMAPHORE] = &cinfSem;
SystemAPISets[HT_APISET] = &cinfAPISet;
SystemAPISets[HT_FILE] = &CinfFile;
SystemAPISets[HT_FIND] = &CinfFind;
SystemAPISets[HT_DBFILE] = &CinfDBFile;
SystemAPISets[HT_DBFIND] = &CinfDBFind;
SystemAPISets[HT_SOCKET] = &CinfSocket;
SystemAPISets[HT_FSMAP] = &cinfMap;
SystemAPISets[HT_WNETENUM] = &CinfWnetEnum;
KInfoTable[KINX_APISETS] = (DWORD)SystemAPISets;
RETAILMSG(TRUE, (TEXT("HeapInit\n"))); //我 加的 没有作用
HeapInit();
RETAILMSG(TRUE, (TEXT("InitMemoryPool\n")));//我 加的 没有作用
InitMemoryPool();
RETAILMSG(TRUE, (TEXT("ProcInit\n")));//我 加的 没有作用
ProcInit();
RETAILMSG(TRUE, (TEXT("SchedInit\n")));//我 加的 没有作用
SchedInit();
这些都么有执行啊???
再退一步说程序应该进入HeapInit();后里面第一句的循环语句中就有一个输出语句都没有执行
void
HeapInit(void)
{
int loop;
KInfoTable[KINX_KHEAP] = (long)heapptr;
/* Find the smallest size of block. */
SmallestSize = heapptr[0].size;
for (loop = 0; loop < NUMARENAS; loop++) {
DEBUGMSG(ZONE_MEMORY,(TEXT("HeapInit: Entry %2.2d, size %4.4d\r\n"),loop, heapptr[loop].size));////这里应该有输出吧!!!!!
DEBUGCHK((heapptr[loop].size & 3) == 0);
if (heapptr[loop].size < SmallestSize)
SmallestSize = heapptr[loop].size;
}
KInfoTable[KINX_HEAP_WASTE] = 0;
}
目前这个现象就是这样了,请大家帮我看看,另外我发现在OEMInit中有在LCD上显示一副图片,我这里是有显示的,但是一到KernelInit这个函数中,LCD就黑了,(我的实验在OEMInit中的最后一句加了一个while(1) 图片还在)
我猜测目前我是刚刚内核启动,是不是因为我读到ram的数据太少了??应该不会啊,如果太少 内核应该根本就不起来啊
还有我现在对muilt bin方式还是不太理解,将XIPKERNEL.bin读了之后,之后程序的流程如何向下进行的呢?一句chain.bin的内容么,在程序中的哪里有判断呢??
另外请各位朋友能把debug的信息给我看看吧尤其是KernelInit之后的信息 谢谢
请各位帮帮忙,看看我的问题出在哪里了 请指点一下 谢谢