|
第一次自己写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[taskprio].taskState = TASK_STATE_DLY;
}
void ResumTask(U8 taskprio)
{
OsTaskObjTbl[taskprio].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[i].taskState == TASK_STATE_READY)
{
HeadTask = &OsTaskObjTbl[i];
break;
}
}
if(i == TASK_SIZE)
{
HeadTask = IdelTask;
}
OS_TASK_SW();
}
目前只是完成了第一步,还需要继续努力啊。。。
上代码:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|