飞思卡尔DG128-OS(第一版任务切换)完成切换功能
第一次自己写mcu的os。目前实现两个任务的切换。需要任务主动释放cpu控制权。1.两个任务:
void FunTask2(void) {
int i;
while(1)
{
for(i = 0;i < 8;i++)
{
PTP = 0x55;
DelayTime(2000);
PauseTask(2);
ResumTask(1);
Os_Schel();
}
}
}
void FunTask1(void) {
int i;
while(1)
{
for(i = 0;i < 8;i++)
{
PTP = 0xAA;
DelayTime(2000);
PauseTask(1);
ResumTask(2);
Os_Schel();
}
}
}
2.任务的释放和恢复函数
void PauseTask(U8 taskprio)
{
OsTaskObjTbl.taskState = TASK_STATE_DLY;
}
void ResumTask(U8 taskprio)
{
OsTaskObjTbl.taskState = TASK_STATE_READY;
}
3.栈的初始化:
OS_STK* InitStkBuff(VOID_FUN_PTR task,OS_STK* pstk)
{
pstk--;
*pstk = (U16)(((U32)task) >> 8);
pstk--;
*pstk = 0xFFFF; //IY
(pstk)--;
*pstk = 0x1111; //IX
pstk--;
*pstk = 0xAA;//A;
((U8*)pstk)--;
*pstk = 0xBB; //B
((U8*)pstk)--; //在中断中需要多保存一次page页,所以需要留一个空间出来
return pstk;
}
4.任务调度
通过汇编触发软件中断swi控制切换。
void Os_Schel(void)
{
U8 i;
OldTask = HeadTask;
for(i = 0;i < TASK_SIZE;i++)
{
if(OsTaskObjTbl.taskState == TASK_STATE_READY)
{
HeadTask = &OsTaskObjTbl;
break;
}
}
if(i == TASK_SIZE)
{
HeadTask = IdelTask;
}
OS_TASK_SW();
}
目前只是完成了第一步,还需要继续努力啊。。。
上代码:
页:
[1]