c语言os内核思路,ucosIII内核文件分析-os_core.c

Suspend时挂起的意思,是task主动调用使自己挂起,并且是无条件的挂起;

而pend时系统让task等待信号量或事件时阻塞的。

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

*********************************           OS_Pend         ************************************

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

1 OS_Pend //应用程序不会调用这个函数。

OSxxxPend()会调用OS_Pend,在OS_Pend中调用

OS_Pend

OS_TaskBlock

OS_TickListInsert//如果设置了超时,此函数被调用,详见note1

p_tcb->TickCtrMatch = OSTickCtr + time; //OSTickCtr当前的时间计数

p_tcb->TickRemain   = time;//time为设定的超时时间

OS_RdyListRemove //从就绪队列中删除

OS_PendDataInit

OS_PendListInsertPrio //安装优先级的顺序,将tcb插入到等待链表中,详见note2

//优先级高的在链表前面

note1: struct  os_tick_spoke {

OS_TCB              *FirstPtr;                          /* Pointer to list of tasks in tick spoke                 */

OS_OBJ_QTY           NbrEntries;                        /* Current number of entries in the tick spoke            */

OS_OBJ_QTY           NbrEntriesMax;                     /* Peak number of entries in the tick spoke               */

};

typedef  struct  os_tick_spoke       OS_TICK_SPOKE;

OSCfg_TickWheelSize=17; #define OS_CFG_TICK_WHEEL_SIZE 17;

OS_TICK_SPOKE  OSCfg_TickWheel[OS_CFG_TICK_WHEEL_SIZE];

0818b9ca8b590ca3270a3433284dd417.png

OSCfg_TickWheel每个元素中的FirstPtr都指向一个链表,链表中前一个tcb结点都比后一个结点的tick

要早OS_CFG_TICK_WHEEL_SIZE个tick.

note2    struct  os_pend_list {

OS_PEND_DATA        *HeadPtr;

OS_PEND_DATA        *TailPtr;

OS_OBJ_QTY           NbrEntries;

};

把等待同一个OS_PEND_OBJ的任务组成一个等待队列

同一个task也可以等待多个OS_PEND_OBJ,前提必须设置一个OS_PEND_DATA数组,

数组中的每个OS_PEND_DATA对应指向自己等待的OS_PEND_OBJ。TCBPtr-->PendDataTblPtr

指向OS_PEND_DATA数组的第一个元素。TCBPtr-->PendDataTblEntries指向OS_PEND_DATA数组的大小

OS_PEND_OBJ

0818b9ca8b590ca3270a3433284dd417.png /***********************************************************************************************

*********************************         OS_PendAbort        **********************************

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

2 OS_PendAbort //应用程序不会调用这个函数。

//called by OSxxxPendAbort() functions to abort pending on an event.

如果一个任务等待多个OS_PEND_OBJ,OS_PendAbort会从所有的等待链表当中把这个task清除

OS_PendAbort

如果没有强制suspend

OS_PendAbort1  //将期望取消的OS_PEND_OBJ取消掉

OS_PendListRemove //将task从所有的等待队列链表中清除,如果task等待多个OS_PEND_OBJ

OS_TaskRdy

OS_TickListRemove //从time tick list中删除task

OS_RdyListInsert  //并且task插入到ready列表中,如果task的优先级和当前的优先级

//一样,就插入到ready链表的尾部,不一样就插入到对应ready链表

//的头部,下一次可以优先执行了。

如果任务在pend的同时,也被强制suspend

OS_PendAbort1  //将期望取消的OS_PEND_OBJ取消掉

OS_PendListRemove //将task从所有的等待队列链表中清除,如果task等待多个OS_PEND_OBJ

OS_TickListRemove //从time tick list中删除task

p_tcb->TaskState  = OS_TASK_STATE_SUSPENDED; //设置task的状态

note1:OS_RDY_LIST也是一个数组,默认64个元素,每个元素对应不同的优先级

0818b9ca8b590ca3270a3433284dd417.png /*********************************************************************************************** *****************************         OS_PendListChangePrio       ****************************** ************************************************************************************************/ 改变pend链表中的某一个tcb的优先级,优先级改变后,同时必须调整该tcb在pendlist中的位置 /*********************************************************************************************** ********************************         OS_PendObjDel        ********************************** ************************************************************************************************/ OS_PendObjDel和OS_PendAbort功能差不多,都是使pendlist中的tcb从链表中清除,只不过两个函数的调用 场合不同,前面被调用时会删除对应的OS_PEND_OBJ对象。 /*********************************************************************************************** ***********************************         OS_Post        ************************************* ************************************************************************************************/ OS_Post和OS_PendAbort的功能差不多,只不过前者使任务ready的同时,还传递消息。 OS_Post1用于等待多个对象 /*********************************************************************************************** **********************************         OS_Sched0        ************************************ ************************************************************************************************/ OS_Sched0 /*********************************************************************************************** ********************************         OS_PendAbort1        ********************************** ************************************************************************************************/ 当一个任务在等待OS_TASK_PEND_ON_MULTI时,希望取消等待中的某个object,此函数被调用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值