UCOS+时间片轮转调度算法详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

UCOS 时间片轮转调度算法详解2009年8月4日

能使信号量代码产生||能使互斥量代码产生 */

OS_EVENT *OSTCBEventPtr; /*指向事件控制块的指针*/

#endif

#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)

void *OSTCBMsg; /* Message received from OSMboxPost() or OSQPost() 指向传递给任务的消息的指针*/

#endif

#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0) #if OS_TASK_DEL_EN > 0 /*OS版本大于等于251&&能使事件标志代码

产生&&最大标志数大于零*/

OS_FLAG_NODE *OSTCBFlagNode; /*指针指向事件标志节点*/

#endif

OS_FLAGS OSTCBFlagsRdy; /* Event flags that made task ready to run

事件标志使任务准备运行*/

#endif

INT16U OSTCBDly; /* 任务等待的时限*/

INT8U OSTCBStat; /* 任务的当前状态标志 */

INT8U OSTCBPrio; /* 任务优先级 (0 == highest, 63 == lowest) */ /*以下四行语句用于快速访问就绪表的数据*/

INT8U OSTCBX; /* Bit position in group corresponding to task priority (0..7) */

INT8U OSTCBY; /* Index into ready table corresponding to task priority */

INT8U OSTCBBitX; /* Bit mask to access bit position in ready table */

INT8U OSTCBBitY; /* Bit mask to access bit position in ready group */

#if OS_TASK_DEL_EN > 0

BOOLEAN OSTCBDelReq; /* Indicates whether a task needs to delete itself */

#endif

/*

*********************************************************************

* 以下代码是我自己加的:

********************************************************************* */

#ifdef OS_TIME_SCHEDULE

struct os_tcb *OSTSnext;

struct os_tcb *OSTSprev;

INT8U OSTSLen; /*记录了该进程占用多少个时间片*/

INT8U OSTSCurLen; /*记录的是该进程现在还剩下多少个时间片时间可以用*/

#endif

/*

********************************************************************* */

} OS_TCB;

三.进程创建

进程创建的主要目的是跳过原代码中的优先级占用检查,并在这里加入FIFO 进程创建。

文件在OS_TASK.C中:

INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos,

INT8U prio,INT16U id, INT8U TSlen)

{

#if OS_CRITICAL_METHOD == 3 /* 为CPU状态寄存器分配存储空间*/ OS_CPU_SR cpu_sr;//CPU状态字是十六位 cpu_sr为OS_CPU_SR型变

#endif

OS_STK *psp; //创建一个指向数据类型为OS_STK的指针和一个8

位的整型数

INT8U err;

#if OS_ARG_CHK_EN > 0

if (prio > OS_LOWEST_PRIO) { /*保证优先级在允许范围内 */

return (OS_PRIO_INVALID);

}

#endif

OS_ENTER_CRITICAL(); /*OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()为定义的宏,用来关闭、打开CPU 的中断。*/ if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /*保证优先级没有被其它任

务占用 */

/*

********************************************************************* * if you want run the FIFO mask this code

OSTCBPrioTbl[prio] = (OS_TCB *)1; /* Reserve the priority to prevent others from doing ... */

/* ... the same thing until task is created. */

//那就是说有一个任务存在了,不再是 Nul

/*

********************************************************************* */

OS_EXIT_CRITICAL();

psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, 0); /* 初始化任务堆栈,即建立任务堆栈*/

err = OS_TCBInit(prio, psp, (OS_STK *)0, id, 0, (void *)0, 0, TSlen);

/*初始化任务控制块,从空闲的OS_TCB缓冲池中获得并初始化一个任务控制块*/

if (err == OS_NO_ERR) { //如果初始化没有错

OS_ENTER_CRITICAL();//进入临界状态

OSTaskCtr++; /*任务数量加一*/

OS_EXIT_CRITICAL();

if (OSRunning == TRUE) { /* 如果多任务开始,寻找最高优先级任务*/ OS_Sched();

}

} else { //如果初始化任务控制块有错

OS_ENTER_CRITICAL();

OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others 把这一优先级给其它任务*/

OS_EXIT_CRITICAL();

}

return (err); //返回错误信息

/*

********************************************************************* */

相关文档
最新文档