我用LPC2214设计,扩展了FLASH 39vf3201(4M,ZLG用的是1601),RAM ISSI102416ALL(4M,ZLG用的是PSRAM,8M),另外我没有扩展NAND FLASH。用H-JTAG,我可以找的ARM,FLASH,用ADS进行一般的程序仿真也没问题。我感觉硬件设计应该没问题了。
但是,我参照ZLG的例程进行了UCOS-II多任务移植。在SMART2200开发板上,UCOS的多任务程序(跑马灯、蜂鸣器)可以运行,但在我的板子上,只能运行TASK0(点亮一盏灯),而TASK1不能执行(熄灭灯)。我跟踪调试了一下,程序一直在TASK0里面兜。在OS_Sched()函数中,其中有个变量OSLockNesting总是值为6,if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Sched. only if all ISRs done & not locked */
y = OSUnMapTbl[OSRdyGrp]; /* Get pointer to HPT ready to run */
OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
OSCtxSwCtr++; /* Increment context switch counter */
OS_TASK_SW(); /* Perform a context switch */
}
由于OSLockNesting 不等于0,就不能进入任务切换。不知道是不是这样。但是这个例程在ZLG的SMART2200开发板是可以正常运行的。在我的板子上调试就不能正常工作。
我还发现OSTimeDly(OS_TICKS_PER_SEC)的问题。开发板执行这个函数延时1秒,但在我的板子上使用时,指示灯不是1秒亮1秒灭,而是飞快的闪烁。软件应该没问题,我感觉应该是此例程和我设计的板子,不匹配,但那里不对我说不清楚。TIMER0也初始化了,OSTimeTick()也调用了。只能怀疑是时间片的问题,但又不知道出在那里。
void Timer0_Exception(void)
{
T0IR = 0x01;
VICVectAddr = 0; //interrupt close 通知中断控制器中断结束
OSTimeTick();
}
没办法,只能跟各位大虾求助了。先谢过!
我的EMAIL :danieldhg@sohu.com 多交流。