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

4147

被折叠的 条评论
为什么被折叠?



