今天目标板终于进入到了WINCE桌面,值得纪念的一天!

事情经过是这样的,周末我反复琢磨到问题到底出在哪里并且对照源码假设了一种出错原因:MMU没有正确初始化,访问虚拟地址的时候出现了问题。为此我仔细阅读了BSP中和虚拟内存有关的代码,并没有发现什么异常。另外我还查阅了一些资料,知道了CE中和虚拟地址有关的一个关键数据结构OEMAddressTable,还有CACHED和UNCACHED虚拟内存区域。

 

今天的调试计划:

在死掉了语句后面了加了while(1);根据串口信息判断程序进入死循环以后,用AXD查看汇编代码。然后通过修改PC指针运行到后面的程序。

结果:

死循环后面的汇编代码看起来很奇怪,一点也不像函数调用,强行运行过去-》程序飞掉。用IDA PRO查看OBJ文件中的相应位置,发现即使在DEBUG模式下,编译器也优化掉了死循环之后的代码,囧啊。

不过这让我开始思考,到底调用的是哪里的InitClock。用PowerGrep搜索WINCE420目录,发现了多个InitClock,仔细看了看应该调用的是timerxsc1.c里面的InitClock(之前也在InitClock中加过Trace语句,但是很不幸加到了错误的InitClock中,于是造成了进入InitClock体之前程序即飞掉的假象)。既然找到了正确的文件,添加上TRACE语句,很快找到了程序死在哪里:

KernelStart
    ARMInit
        OEMInit
            InitClock
                RTC4531GetRealTime

由于GPIO还没有正确配置,死在这里也是情理之中的事情。试着改了改了GPIO,暂时没有搞定。干脆注释掉了这个函数调用,直接HARDCODE了一个时间结构体。Guess what,居然进入到桌面了:)

还存在的问题:

1)RTC4531还没有正确工作。

2)ADS7843还没有正确工作。

3)从FLASH启动还不正常。

posted on 2010-03-29 21:25  silentmj  阅读(337)  评论(0编辑  收藏  举报