发现问题:
YC的BSP,WINCE启动开始输出如下信息:
Windows CE Kernel for ARM (Thumb Enabled) Built on Feb 8 2007 at 23:36:51
ProcessorType=0920 Revision=0
sp_abt=ffff5000 sp_irq=ffff2800 sp_undef=ffffc800 OEMAddressTable = 8c2013bc
Windows CE Firmware Init
INFO: Initializing system interrupts...
INFO: Initializing system clock(s)...
INFO: Initializing driver globals area...
LCD OUTPUT MODE 800*480.
OEMInit Done...
在smdk2440/KERNEL/HAL/CFW.C文件里发现
void OEMInit()
{
volatile IOPreg *s2440IOP = (IOPreg *)IOP_BASE;
// Instead of calling OEMWriteDebugString directly, call through exported
// function pointer. This will allow these messages to be seen if debug
// message output is redirected to Ethernet or the parallel port. Otherwise,
// lpWriteDebugStringFunc == OEMWriteDebugString.
lpWriteDebugStringFunc(TEXT("/nWindows CE Firmware Init/r/n"));
#ifdef MODULE_CERTIFY
pOEMLoadInit = OEMLoadInit;
pOEMLoadModule = OEMLoadModule;
InitPubKey(g_bSignPublicKeyBlob,sizeof(g_bSignPublicKeyBlob));
#endif
idleconv = 1;
// Initialize interrupts.
//
lpWriteDebugStringFunc(TEXT("INFO: Initializing system interrupts.../r/n"));
OEMInitInterrupts();
lpWriteDebugStringFunc(TEXT("INFO: Initializing system clock(s).../r/n"));
InitClock();
// Initialize driver globals area.
//
lpWriteDebugStringFunc(TEXT("INFO: Initializing driver globals area.../r/n"));
memset((PVOID)DRIVER_GLOBALS_ZEROINIT_START, 0, DRIVER_GLOBALS_ZEROINIT_SIZE);
lpWriteDebugStringFunc(TEXT("OEMInit Done.../r/n"));
分析问题:
操作系统内核在启动之前需要初始化硬件,包括中断,时钟,LCD等等,显然硬件的初始化时靠首先调用OEMInit() 函数来实现的。
在调用OEMInit()这个函数的时候,操作系统显然没有启动,只是在做启动前的硬件初始化,串口输出打印是靠lpWriteDebugStringFunc()实现的