您的位置 首页 FPGA

自己写单片机操做体系3-使命创建和调度

如果存在两个或以上的任务调度就需要将栈保CPU的寄存器了。这个地方就是各个MCU不同的地方了。这个要看MCU进入中断的流程才能知道栈需要怎

假如存在两个或以上的使命调度就需求将栈保CPU的寄存器了。这个当地便是各个MCU不同的当地了。

这个要看MCU进入中止的流程才干知道栈需求怎样维护。

OS_STK* InitStkBuff(VOID_FUN_PTR task,OS_STK* pstk)
{
pstk–;
*pstk = (U16)(((U32)task) >> 8);存要履行的函数
pstk–;
*pstk = 0xFFFF;//IY存y寄存器
(pstk)–;
*pstk = 0x1111;//IX存x寄存器
pstk–;
*pstk = 0xAA;//A;存A
((U8*)pstk)–;A和B都是8位的在寄存器中是一同放在一个16位中的、
*pstk = 0xBB;//B存B
((U8*)pstk)–;//在中止中需求多保存一次page页,所以需求留一个空间出来
return pstk;
}
void CreatTask(VOID_FUN_PTR task,OS_STK *pStk,U8 stkSize,U8 osPior)
{
OsTaskObjTbl[osPior].Task = task;
OsTaskObjTbl[osPior].TaskSp = pStk;
OsTaskObjTbl[osPior].stkSize = stkSize;
OsTaskObjTbl[osPior].taskDly = 0;
OsTaskObjTbl[osPior].taskState = TASK_STATE_READY;
OsTaskObjTbl[osPior].nextTask = IdelTask;
OsTaskObjTbl[osPior].TaskSp = InitStkBuff(task,pStk);将修改后的sp给到使命的sp中
}
使命调度函数

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();发动软件中止进入中止调度
}
__interrupt VectorNumber_Vswi void OSCtxSw(void) //4为SWI中止
{
DisableInterrupts; //关中止
//PTP = 0xAA;
asm{
ldaa $30 //保存页面寄存器,单片机16位最大的flash只能是64k。可是128k需求经过页面寄存器切换
psha
STS Sp_bf将当时的sp赋值给sp_bf
}
OldTask->TaskSp = Sp_bf;保存sp-bf
Sp_bf = HeadTask->TaskSp; 取出sp的地址。
asm{
LDS Sp_bf将sp-bf给SP
pula
staa $30 将页面寄存器康复
}
EnableInterrupts; //开中止
}
这样一个使命就调度出来了、

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/fpga/317435.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部