os_core.c

来源:互联网 发布:手机淘宝人工客服在哪 编辑:程序博客网 时间:2024/05/20 14:27

os_core.c  :OS的核心函数(例如:OSInit()初始化uC , OSSched()任务级别调度 , OSIntExit() 中断级别调度,pend,post,PendList,RdyList管理等)。


void  OSInit (OS_ERR  *p_err):
    调用初始化钩子函数  (设置中断使用的堆栈地址)
    初始化系统全局变量
    初始化Prio、ReadList

void  OSIntExit (void):
    在OS_CPU_SysTickHandler()中用到了,当中断处理完成之后,并且没有中断嵌套,查看是否有新的高优先级任务,如果有启动任务调度。
        
void  OSSched (void):
    在任务中调用,切换到更高优先级的任务。

void  OSSchedLock (OS_ERR  *p_err):
    当任务调度发生时,阻止任务调度,直到调用了OSSchedUnlock()。  主要是OSSchedLockNestingCtr++;

void  OSSchedUnlock (OS_ERR  *p_err):
    主要是OSSchedLockNestingCtr--;  当OSSchedLockNestingCtr > 0时表示调度器还锁着,*p_err = OS_ERR_SCHED_LOCKED; ==0调用OSSched()。


当启动了相同任务优先级时间片轮询(OS_CFG_SCHED_ROUND_ROBIN_EN==1 )
void  OSSchedRoundRobinCfg (CPU_BOOLEAN   en,
                            OS_TICK       dflt_time_quanta,
                            OS_ERR       *p_err):
    决定是否开启时间片轮询,设置任务的默认时间片时间(多少个SysTick),默认为OSCfg_TickRate_Hz / 10

void  OSSchedRoundRobinYield (OS_ERR  *p_err):
    当一个任务在给定的时间片之前完成了任务,可以调用此函数放弃CPU让给相同优先级的等待运行的任务。    
    个人感觉这个方法与uC不太相符,因为uC要求每个任务都要等待一个事件的发生,应该不会用到此函数。



void  OSStart (OS_ERR  *p_err):
    启动OS,获取最高优先级任务,调用OSStartHighRdy()(在os_cpu_a.asm中实现)。

void  OS_IdleTask (void  *p_arg):
    系统空闲任务。在while(true){}中执行OSIdleTaskCtr++;调用钩子函数OSIdleTaskHook(); 

void  OS_IdleTaskInit (OS_ERR  *p_err):
    创建空闲任务。使用最低优先级(OS_CFG_PRIO_MAX - 1),由于中断使用了自己的堆栈,如果没有实现钩子函数,可以将堆栈设置为最小(64Bytes)。

void  OS_Pend (OS_PEND_DATA  *p_pend_data,
               OS_PEND_OBJ   *p_obj,
               OS_STATE       pending_on,
               OS_TICK        timeout):
    OSxxxPend()调用
    配置当前任务TCB中的PendOn,PendStatus,PendDataTblEntries,PendDataTblPtr。
    将当前任务从ready list中移除,如果timeout > 0 添加到TickList中。
    初始化p_pend_data,并插入到p_obj->PendList 中。

void  OS_PendAbort (OS_PEND_OBJ  *p_obj,
                    OS_TCB       *p_tcb,
                    CPU_TS        ts):
    OSxxxPendAbort()调用,终止一个对象的等待。
    判断p_tcb->TaskState,
    如果为OS_TASK_STATE_RDY、OS_TASK_STATE_DLY、OS_TASK_STATE_SUSPENDED、OS_TASK_STATE_DLY_SUSPENDED不能终止。
    如果为OS_TASK_STATE_PEND、OS_TASK_STATE_PEND_TIMEOUT:
        设置TCB的MsgPtr、MsgSize、TS、TaskState、PendStatus、PendOn。如果p_tcb等待多个任务调用OS_PendAbort1 (),否则依次将p_tcb->PendDataTblPtr中的p_pend_data从其对应的对象中的PendList中删除。将p_tcb从TickList中删除,如果p_tcb没有被挂起将p_tcb添加的ready_list中。
    如果为OS_TASK_STATE_PEND_SUSPENDEDOS_TASK_STATE_PEND_TIMEOUT_SUSPENDED
        设置TCB的MsgPtr、MsgSize、TS、TaskState、PendStatus、PendOn。如果p_tcb等待多个任务调用OS_PendAbort1 (),否则依次将p_tcb->PendDataTblPtr中的p_pend_data从其对应的对象中的PendList中删除。将p_tcb从TickList中删除。
    
void  OS_PendAbort1 (OS_PEND_OBJ  *p_obj,
                     OS_TCB       *p_tcb,
                     CPU_TS        ts):
    当一个任务等待多个对象时,其中一个对象被终止时调用,更新p_obj在p_tcb->PendDataTblPtr中对应OS_PEND_DATA的RdyObjPtr、RdyTS。
        
void  OS_PendDataInit (OS_TCB        *p_tcb,
                       OS_PEND_DATA  *p_pend_data_tbl,
                       OS_OBJ_QTY     tbl_size):
    系统调用时tbl_size == 1,pend multi没有用到这个方法。只有OS_Pend()中被调用。
    初始化p_pend_data的(NextPtr、PrevPtr、RdyObjPtr、RdyMsgPtr、RdyMsgSize、RdyTS、TCBPtr)。

void  OS_PendListChangePrio (OS_TCB   *p_tcb,
                             OS_PRIO   prio_new):
    修改p_tcb的Prio为prio_new,依次将p_tcb->PendDataTblPtr中的p_pend_data从其对应的对象中的PendList中删除,然后根据prio_new重新插入。

void  OS_PendListInit (OS_PEND_LIST  *p_pend_list):
    初始化p_pend_list的HeadPtr、TailPtr、NbrEntries。

void  OS_PendListInsertHead (OS_PEND_LIST  *p_pend_list,
                             OS_PEND_DATA  *p_pend_data):
    将p_pend_data插入到p_pend_list的开头。

void  OS_PendListInsertPrio (OS_PEND_LIST  *p_pend_list,
                             OS_PEND_DATA  *p_pend_data):
    根据p_pend_data所在的tcb的优先级将p_pend_data插入到p_pend_list中。
    
void  OS_PendListRemove (OS_TCB  *p_tcb):
    依次将p_tcb->PendDataTblPtr中的p_pend_data从其对应的对象中的PendList中删除。

void  OS_PendListRemove1 (OS_PEND_LIST  *p_pend_list,
                          OS_PEND_DATA  *p_pend_data):
    将p_pend_data从p_pend_list中删除。最后将p_pend_data的NextPtr、PrevPtr设为0。

void  OS_PendObjDel (OS_PEND_OBJ  *p_obj,
                     OS_TCB       *p_tcb,
                     CPU_TS        ts):
    删除一个对象。
    判断p_tcb->TaskState,
    如果为OS_TASK_STATE_RDY、OS_TASK_STATE_DLY、OS_TASK_STATE_SUSPENDED、OS_TASK_STATE_DLY_SUSPENDED这种状态不应该发生。
    如果为OS_TASK_STATE_PEND、OS_TASK_STATE_PEND_TIMEOUT:
        设置TCB的MsgPtr、MsgSize、TS、TaskState、PendStatus、PendOn。如果p_tcb等待多个任务调用OS_PendObjDel1 (),否则依次将p_tcb->PendDataTblPtr中的p_pend_data从其对应的对象中的PendList中删除。将p_tcb从TickList中删除,如果p_tcb没有被挂起将p_tcb添加的ready_list中。
    如果为OS_TASK_STATE_PEND_SUSPENDEDOS_TASK_STATE_PEND_TIMEOUT_SUSPENDED
        设置TCB的MsgPtr、MsgSize、TS、TaskState、PendStatus、PendOn。如果p_tcb等待多个任务调用OS_PendObjDel1 (),否则依次将p_tcb->PendDataTblPtr中的p_pend_data从其对应的对象中的PendList中删除。将p_tcb从TickList中删除。

void  OS_PendObjDel1 (OS_PEND_OBJ  *p_obj,
                      OS_TCB       *p_tcb,
                      CPU_TS        ts):
    当一个任务等待多个对象时,其中一个对象要被删除,更新p_obj在p_tcb->PendDataTblPtr中对应OS_PEND_DATA的RdyObjPtr、RdyTS。

void  OS_Post (OS_PEND_OBJ  *p_obj,
               OS_TCB       *p_tcb,
               void         *p_void,
               OS_MSG_SIZE   msg_size,
               CPU_TS        ts):
    被OSxxxPost()调用。
    判断p_tcb->TaskState,
    如果为OS_TASK_STATE_RDY、OS_TASK_STATE_DLY、OS_TASK_STATE_SUSPENDED、OS_TASK_STATE_DLY_SUSPENDED不能Post。
    如果为OS_TASK_STATE_PEND、OS_TASK_STATE_PEND_TIMEOUT:
        设置TCB的TaskState、PendStatus、PendOn。如果p_tcb等待多个任务调用OS_Post1 (),否则设置TCB的MsgPtr、MsgSize、TS。然后依次将p_tcb->PendDataTblPtr中的p_pend_data从其对应的对象中的PendList中删除。将p_tcb从TickList中删除,如果p_tcb没有被挂起将p_tcb添加的ready_list中。
    如果为OS_TASK_STATE_PEND_SUSPENDEDOS_TASK_STATE_PEND_TIMEOUT_SUSPENDED
        设置TCB的TaskState、PendStatus、PendOn。如果p_tcb等待多个任务调用OS_Post1 (),否则设置TCB的MsgPtr、MsgSize、TS。然后依次将p_tcb->PendDataTblPtr中的p_pend_data从其对应的对象中的PendList中删除。将p_tcb从TickList中删除。

void  OS_Post1 (OS_PEND_OBJ  *p_obj,
                OS_TCB       *p_tcb,
                void         *p_void,
                OS_MSG_SIZE   msg_size,
                CPU_TS        ts):
    当一个任务等待多个对象时,其中一个对象被Post,更新p_obj在p_tcb->PendDataTblPtr中对应OS_PEND_DATA的RdyObjPtr、RdyMsgPtr、RdyMsgSize、RdyTS。

RdyList

void  OS_RdyListInit (void):
    将OSRdyList[] 初始化成如上图所示。

void  OS_RdyListInsert (OS_TCB  *p_tcb):
    将p_tcb的prio对应的bitmap中的位置1,如果等于OSPrioCur,OS_RdyListInsertTail(p_tcb);,否则OS_RdyListInsertHead(p_tcb);

void  OS_RdyListInsertHead (OS_TCB  *p_tcb):
    将p_tcb插入到对应的优先级的列表的开头。

void  OS_RdyListInsertTail (OS_TCB  *p_tcb):
    将p_tcb插入到对应的优先级的列表的最后。

void  OS_RdyListMoveHeadToTail (OS_RDY_LIST  *p_rdy_list):
    将p_rdy_list最前面的TCB移到最后面。(时间片轮询时用到)

void  OS_RdyListRemove (OS_TCB  *p_tcb):
    将p_tcb从ready list中移除。


void  OS_Sched0 (void):
    当OS_CFG_ISR_POST_DEFERRED_EN > 0时,系统从OS_CRITICAL_EXIT时OSIntQNbrEntries>0时调用(在锁住调度器的过程中有任务往Interrupt Queue中插入),切换到OSIntQTask。

void  OS_SchedLockTimeMeasStart (void)
void  OS_SchedLockTimeMeasStop (void):
    测量调度器锁住的峰值时间。当OS_CFG_ISR_POST_DEFERRED_EN > 0时,在OS_CRITICAL_ENTER、OS_CRITICAL_EXIT中调用。

void  OS_SchedRoundRobin (OS_RDY_LIST  *p_rdy_list):
    每一个tick都会判断是否有相同优先级的新任务要执行。
    如果当前任务的TimeQuantaCtr减到0,则调用OS_RdyListMoveHeadToTail(),将当前任务移到ready list的最后,并取出当前开头的任务设置TimeQuantaCtr。

void  OS_TaskBlock (OS_TCB   *p_tcb,
                    OS_TICK   timeout):
    如果timeout > 0 ,将p_tcb插入到TickList中,设置p_tcb->TaskState,将p_tcb从ready list 中删除。

void  OS_TaskRdy (OS_TCB  *p_tcb):
    将p_tcb从TickList中删除,如果p_tcb没有被挂起则将其插入到RdyList中。


0 0
原创粉丝点击