|
楼主 |
发表于 2010-5-11 10:01:06
|
显示全部楼层
979 //初始化任务控制块TCB(优先级指针、栈顶指针、栈底指针、任务标志符、堆栈容量、扩展指针、选择项)
980 INT8U OS_TCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size,
981 void *pext, INT16U opt)
982 {
983 #if OS_CRITICAL_METHOD == 3 //中断函数被设定为模式3
984 OS_CPU_SR cpu_sr;
985 #endif
OS_TCB *ptcb; //定义一个PCB变量
987
988
989 OS_ENTER_CRITICAL(); //关闭中断
990 ptcb = OSTCBFreeList; //分配一个空任务控制块给ptcb
991 if (ptcb != (OS_TCB *)0) { //如果缓冲池有空余TCB,这个TCB被初始化
992 OSTCBFreeList = ptcb->OSTCBNext; //指向TCB的双向链接的后链接
993 OS_EXIT_CRITICAL(); //打开中断
994 ptcb->OSTCBStkPtr = ptos; //指向当前TCB的栈顶指针(输入的数据)
995 ptcb->OSTCBPrio = (INT8U)prio; //保存当前TCB的优先级别(输入的数据)
996 ptcb->OSTCBStat = OS_STAT_RDY; //设定当前TCB的状态字(内容为(准备完毕))
997 ptcb->OSTCBDly = 0; //允许任务等待的最大字节节拍为0
998
999 #if OS_TASK_CREATE_EXT_EN > 0 //允许生成OSTaskCreateExt()函数
1000 ptcb->OSTCBExtPtr = pext; //指向用户定义的任务控制块(扩展指针)
1001 ptcb->OSTCBStkSize = stk_size; //设定堆栈的容量
1002 ptcb->OSTCBStkBottom = pbos; //指向指向栈底的指针
1003 ptcb->OSTCBOpt = opt; //保存OS_TCB的选择项
1004 ptcb->OSTCBId = id; //保存任务标志符
1005 #else //否则使用旧的参数
1006 pext = pext; //扩展指针
1007 stk_size = stk_size; //堆栈的容量
1008 pbos = pbos; //栈底的指针
1009 opt = opt; //选择项
1010 id = id; //任务标志符
1011 #endif
1012
1013 #if OS_TASK_DEL_EN > 0 //允许生成 OSTaskDel() 函数代码函数
1014 ptcb->OSTCBDelReq = OS_NO_ERR; //如果可以删除任务本身,可以从每个
1015 //OS_TCB中节省出一个布尔量
1016 #endif
1017 //对一些参数提前运算,为了节省CPU的操作事件
1018 ptcb->OSTCBY = prio >> 3;
1019 ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
1020 ptcb->OSTCBX = prio & 0x07;
1021 ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];
1022
1023 #if OS_EVENT_EN > 0 //如果不打算在应用程序中使用各类事件
1024 ptcb->OSTCBEventPtr = (OS_EVENT *)0; //OS_TCB中OSTCBEventPt就不会出现
1025 #endif //针对的事件为信号量,互斥型信号量、消息邮箱、消息队列
1026 //当满足 版本大于2.51 且 事件标志允许 且 有最大事件标志 及 允许删除任务
1027 #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0) && (OS_TASK_DEL_EN > 0)
1028 ptcb->OSTCBFlagNode = (OS_FLAG_NODE *)0;//则向事件标志节点的指针被初始化为空指针
1029 #endif
1030
1031 #if (OS_MBOX_EN > 0) || ((OS_Q_EN > 0) && (OS_MAX_QS > 0))
1032 ptcb->OSTCBMsg = (void *)0; //满足以上条件,指向传递给任务的消息指针为0空指针
1033 #endif
1034
1035 #if OS_VERSION >= 204 //如果版本大于2.04
1036 OSTCBInitHook(ptcb); //允许使用OSTCBInitHook(ptcb)函数,可对其加代码
1037 #endif //主要增加OS_TCB扩展,浮点运算、MMU寄存器、与任务相关内容,调用此程序时中断开着的
1038
1039 OSTaskCreateHook(ptcb); //调用户建立任务钩子程序
1040 //该函数能够扩展[OSTaskCreate()或OSTaskCreateExt()函数]
1041 //当OS_CPU_HOOKS_EN为1时,OSTaskCreateHook()可以在OS_CPU.C中定义
1042 //若OS_CPU_HOOKS_EN为0时,则可以在任何其它地方定义
1043 //调用此程序时中断开着的。
1044 OS_ENTER_CRITICAL();////////////////////////////////////////////////
1045 OSTCBPrioTbl[prio] = ptcb;
1046 ptcb->OSTCBNext = OSTCBList;
ptcb->OSTCBPrev = (OS_TCB *)0;
1048 if (OSTCBList != (OS_TCB *)0) {//这中间理解不了,觉得是任务控制块链表太多了,不知道结构如何的,被弄晕了
1049 OSTCBList->OSTCBPrev = ptcb; //HelpHelpHelpHelpHelpHelpHelpHelpHelpHelpHelpHelpHelpHelpHelpHelp
1050 }
1051 OSTCBList = ptcb; //让该任务进入就绪态/////////////////////////////
1052 OSRdyGrp |= ptcb->OSTCBBitY;
1053 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
1054 OS_EXIT_CRITICAL(); //打开中断
1055 return (OS_NO_ERR); //调用成功,最后让此函数返回到调用函数[OSTaskCreate()或
1056 } //OSTaskCreateExt()函数],返回值表示分配到任务控块,并初始化了
1057 OS_EXIT_CRITICAL(); //打开中断
1058 return (OS_NO_MORE_TCB); //没有更多的任务控制块被分配,将无法创建新的任务
1059 } |
|