|
楼主 |
发表于 2009-6-16 00:14:24
|
显示全部楼层
to 楼上:
OS_Start(); 是一个死循环,永远不会返回。
---------------------------------------------
代码改一下,就能让他返回。
你后面的while(1){}永远都会不会执行,就算你强行使用JMP指令跑到while(1){}里了,系统也会因为堆栈被破坏而崩溃
------------------------------------------------------------------------------------------------------------
为何要强行JMP,这显然不行。
实际上,记录一下主函数断点,让系统调度自动切换回来就行了。
我自己写的voidtask,作用相当于OS_Start();
void TSK_Start(void) //任务开始调度
{
TTask *Task;
CRITICAL()
{
VTCurrentTask=NULL; //当前是NULL,即当前是Main
Task=TSK_Get(&VTTaskReadyQueue); //从就绪队列取出任务
}
TSK_SwapTo(Task); //切换到任务Task
}
// TContext * volatile pContext1, * volatile pContext2;
void TSK_SwapTo( TTask *ToTask) //切换到任务Task(Task为NULL,回到主函数)
{
TContext ** ppContext1, ** ppContext2;
CRITICAL()
{
if(VTCurrentTask!=NULL)
{
if(VTCurrentTask->Queue==NULL)
{
obj_prio_put(&VTTaskReadyQueue,(void *)VTCurrentTask); //使任务就绪
}
if(ToTask!=NULL ) //Task切换到Task
{
ppContext1=&VTCurrentTask->pContext;
ppContext2=&ToTask->pContext;
VTCurrentTask=ToTask;
CTX_Swap(ppContext1,ppContext2);
}
else //Task切换到Main
{
ppContext1=&VTCurrentTask->pContext;
ppContext2=&VTpMainContext;
VTCurrentTask=NULL;
CTX_Swap(ppContext1,ppContext2);
}
}
else
{
if(ToTask!=NULL) //Main切换到Task
{
ppContext1=&VTpMainContext;
ppContext2=&ToTask->pContext;
VTCurrentTask=ToTask;
CTX_Swap(ppContext1,ppContext2);
}
else //Main切换到Main,不用切换
{
}
}
}
}
移植UCOS;
void OSStart (void)
{
INT8U y;
INT8U x;
if (OSRunning == FALSE) {
y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */
x = OSUnMapTbl[OSRdyTbl[y]];
OSPrioHighRdy = (INT8U)((y << 3) + x);
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
OSTCBCur = OSTCBPrioTbl[OS_IDLE_PRIO];
CRITICAL()
{
OSRunning=1;
OSCtxSw();
}
}
} |
|