Pend Lists

本文详细介绍了FreeRTOS中挂起对象的数据结构,包括OS_PEND_DATA、OS_PEND_LIST和OS_PEND_OBJ的定义及作用。挂起列表用于管理等待对象的任务,而OS_PEND_OBJ则封装了挂起列表,并被用在信号量、互斥锁、标志组和队列等对象中。此外,还讨论了如何修改任务优先级、初始化挂起列表以及插入和删除挂起任务的相关函数。


typedef  struct  os_pend_data        OS_PEND_DATA;    //在等待对象任务的堆栈中分配  即OSxxxPend()所在任务
typedef  struct  os_pend_list        OS_PEND_LIST;       //被封装到OS_PEND_OBJ中
typedef  struct  os_pend_obj         OS_PEND_OBJ;

struct  os_pend_data {
    OS_PEND_DATA        *PrevPtr;
    OS_PEND_DATA        *NextPtr;
    OS_TCB              *TCBPtr;
    OS_PEND_OBJ         *PendObjPtr;
    OS_PEND_OBJ         *RdyObjPtr;
    void                *RdyMsgPtr;
    OS_MSG_SIZE          RdyMsgSize;
    CPU_TS               RdyTS;
};

struct  os_pend_list {
    OS_PEND_DATA        *HeadPtr;
    OS_PEND_DATA        *TailPtr;
    OS_OBJ_QTY           NbrEntries;      //等待队列中的个数,每个
};

struct  os_pend_obj {
    OS_OBJ_TYPE          Type;
    CPU_CHAR            *NamePtr;
    OS_PEND_LIST         PendList;                          /* List of tasks pending on object                        */
#if OS_CFG_DBG_EN > 0u
    void                *DbgPrevPtr;
    void                *DbgNextPtr;
    CPU_CHAR            *DbgNamePtr;
#endif
};



OS_PEND_LIST被封装到  OS_PEND_OBJ  被封装到  OS_SEM、OS_MUTEX、OS_FLAG_GRP、OS_Q
OS_PEND_LIST指针指向  OS_PEND_DATA



下图为在Pending On Multiple Objects中的截图。




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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值