UCOS+时间片轮转调度算法详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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); //返回错误信息
/*
********************************************************************* */