shiqx429
驱动牛犊
驱动牛犊
  • 注册日期2006-04-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分472分
  • 威望57点
  • 贡献值0点
  • 好评度55点
  • 原创分0分
  • 专家分0分
阅读:1533回复:10

MULTI BIN的问题请看看还有哪位朋友能把debug的信息给我看看么(要KernelInit之后的 谢谢)

楼主#
更多 发布于:2008-01-07 13:05
我用的是三星的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之后的信息 谢谢
请各位帮帮忙,看看我的问题出在哪里了 请指点一下 谢谢
shiqx429
驱动牛犊
驱动牛犊
  • 注册日期2006-04-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分472分
  • 威望57点
  • 贡献值0点
  • 好评度55点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-01-08 11:44
自己顶一下!!!!
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
板凳#
发布于:2008-01-08 13:21
private目录下的代码是不会编译进来的,所以你改也没用,那个是微软提供给你看的,不是给你修改的。
我怀疑是你的地址映射和内存空间配置那儿有不对,你确定82000000的地址是映射到DRAM上的?
DCD    0x80000000, 0x33E00000, 2      ; 64 MB DRAM BANK 6
      DCD    0x8C000000, 0x30000000, 30      ; 64 MB DRAM BANK 6
这里只映射了32M的空间,还有32M空间是怎么映射的,其实简单点,你改成
DCD    0x80000000, 0x02000000, 30      ; 64 MB DRAM BANK 6
DCD    0x8C000000, 0x30000000, 64      ; 64 MB DRAM BANK 6
直接映射64M的空间,然后你的config.bib可以参考我发的那个MULTI BIN实现的帖子来配置了。
注意EBOOT的boot.bib的配置,是否是从8C038000开始的,不是把它改到8C000000起始。
shiqx429
驱动牛犊
驱动牛犊
  • 注册日期2006-04-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分472分
  • 威望57点
  • 贡献值0点
  • 好评度55点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-01-08 14:03
谢谢楼上的兄弟 太感谢了 终于有人回答了
我的sdram就是32M的不是64M的
还有映射的问题是因为厂商给的bsp就是那种架构,就是分成两部分,你的文章我看了好几遍了,但是如果要是想你那样修改config.bib文件的话,我这边代码要改好多,毕竟给我的bsp就是这种架构,详细情况都在我帖子了说过了
shiqx429
驱动牛犊
驱动牛犊
  • 注册日期2006-04-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分472分
  • 威望57点
  • 贡献值0点
  • 好评度55点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-01-08 14:08
to zhengshijie:
不好意思 请问
注意EBOOT的boot.bib的配置,是否是从8C038000开始的,不是把它改到8C000000起始。
什么意思  我的boot.bib就是从8c038000开始的啊
ARGS     8C020800  00000800  RESERVED
    STACK    8C030000  00008000  RESERVED
    EBOOT    8C038000  00080000  RAMIMAGE
    RAM      8C0C0000  00040000  RAM
    DISPLAY  8C100000  00080000  RESERVED
    BINFS    8C180000  00400000  RESERVED
    FLSCACHE 8C800000  01800000  RESERVED

这样没有问题啊 挺正常的! 为什么呢?
fishly_0
驱动小牛
驱动小牛
  • 注册日期2005-09-10
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望466点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-01-08 15:00
你拷贝整个系统到ram中执行吗? 看样子,有可能是你只拷贝了一部分内核到ram中。
你是怎么实现xip的?我觉得分两步走会比较合适
1,先实现hive注册表,看看系统能否起来
2,修改config。bib, 打包相应的文件,实现xip

一步一步来比较容易找到错误。这是我的一点感受,仅供参考^_^
shiqx429
驱动牛犊
驱动牛犊
  • 注册日期2006-04-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分472分
  • 威望57点
  • 贡献值0点
  • 好评度55点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-01-09 09:45
谢谢 fishly_0  确实是拷贝了一部分内核再运行  我想问一下xip方式是不是就是只读一部分到ram中运行啊?? 谁在控制这个过程?
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
7楼#
发布于:2008-01-09 12:59
你总共只有32M的内存,那么你的配置里是访问不了80200000-82000000这段空间的,从80000000开始只映射了2M的内存空间,所以你只能访问80000000-802000000这段空间,那么你的这个配置都不对了:
NK            80200000 01E00000 RAMIMAGE
    CHAIN            82000000 00004000 RESERVED
都超出范围了,访问非法地址了,所以系统跑不起来,你得把NK,CHAIN的地址空间放在8C000000开始映射的30M空间中,大概可以这样:
#define    CHAIN_ADDRESS    8C200000
NK            8C210000 01AF0000 NANDIMAGE
CHAIN            8C200000 00004000 RESERVED
RAM            8c210000 01AF0000 RAM
pdwXIPLoc        00000000 8C200000 FIXUPVAR
shiqx429
驱动牛犊
驱动牛犊
  • 注册日期2006-04-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分472分
  • 威望57点
  • 贡献值0点
  • 好评度55点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2008-01-09 13:43
谢谢zhengshijie
我还有一个问题就是你是如何读镜像的呢??是将整个的BIN文件都读到ram中还是只读一部分到ram中
MMU映射那里应该注意什么呢?
DCD    0x80000000, 0x33E00000, 2
DCD    0x8C000000, 0x30000000, 30
shiqx429
驱动牛犊
驱动牛犊
  • 注册日期2006-04-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分472分
  • 威望57点
  • 贡献值0点
  • 好评度55点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2008-01-09 13:51
对了 还有一个问题
我这个bsp就是代理商给的啊,他们也应该是由三星给他们的啊,按道理来说三星应该是测试过了的,才会发出来,为什么会有我这种情况呢??(config.bib我一开始都没有修改过)
fishly_0
驱动小牛
驱动小牛
  • 注册日期2005-09-10
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望466点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2008-01-09 23:25
楼主,你这个地址映射确实比较奇怪
DCD    0x80000000, 0x33E00000, 2      ; 64 MB DRAM BANK 6
      DCD    0x8C000000, 0x30000000, 30      ; 64 MB DRAM BANK 6

你应该是的nGCS6接到SDRAM的片选吧,那么物理地址上应该是要连续的从0x30000000~
0x32000000才对。不明白为什么可以这样分。 虚拟地址可以分,但是物理地址按讲是不能这么分开的,就是说Bank6的0x32000000~0x38000000应该是空的才对。
还是修改下config.big,把地址重新整理下,试试看了。
游客

返回顶部