初始化事件列表
3.1.1信号量,互斥信号量,消息邮箱,消息队列,,信号量集,内存块。初始化创建链表,
static void OS_InitEventList (void)
{
INT16U i;
#if (OS_MAX_EVENTS > 1)
OS_EVENT *pevent1;
OS_EVENT *pevent2;
Pevent1 = &OSEventTbl[0];
Pevent2 = &OSEventTdl[1];
OS_MemClr((INT8U *)&OSEventTbl[0], sizeof(OSEventTbl))
For(i=0;i<(OS_MAX_EVENTS -1);i++)
{
Pevent1->OSEventType = OS_EVENT_TYPE_UNUSED;
Pevent1->OSEventPtr = pevent2;
Peven1++;
Pevent2++;
}
pevent1->OSEventType = OS_EVENT_TYPE_UNUSED;
pevent1->OSEventPtr = (OS_EVENT *)0;
OSEventFreeList = &OSEventTbl[0];
#else //整个链表只有一个元素
{
OSEventFreeList = &OSEventTbl[0];
OSEventFreeList->OSEventType = OS_EVENT_TYPE_UNUSED;
OSEventFreeList->OSEventPtr = (OS_EVENT *)0;
}
}
其中OSEventType的取值是:
OS_EVENT_TYPE_SEM
OS_EVENT_TYPE_MUTEX
OS_EVENT_TYPE_MBOX
OS_EVENT_TYPE_Q
注意在初始化链表的时候,这里的初始化,只对消息,信号量,互斥信号,以及一部分消息队列起作用:对信号量集,和内存的链表的初始化,就不是很有用。
对消息队列的初始化。
Void OS_QInit(void)
{
#if OS_MAX_QS == 1;
OSQFreeList = &OSQTbl[0];
OSQFreeList –> OSQPtr = (OS_Q*)0;
#endif
#if OS_MAX_QS > 1;
INT16U i;
OS_Q *pq1;
OS_Q *pq2;
pq1 = &OSQTbl[0];
pq2 = &OSQTbl[1];
for (i = 0; i < (OS_MAX_QS - 1); i++) {
pq1->OSQPtr = pq2;
pq1++;
pq2++;
}
pq1->OSQPtr = (OS_Q *)0;
OSQFreeList = &OSQTbl[0];
#endif
}
对信号量集的表的初始化:信号量集虽然有两个结构体但是只对其中的一个建立链表。
void OS_FlagInit (void)
{
#if OS_MAX_FLAGS == 1
OSFlagFreeList = (OS_FLAG_GRP *)&OSFlagTbl[0]; OSFlagFreeList->OSFlagType = OS_EVENT_TYPE_UNUSED;
OSFlagFreeList->OSFlagWaitList = (void *)0;
OSFlagFreeList->OSFlagFlags = (OS_FLAGS)0;
#if OS_FLAG_NAME_SIZE > 1
OSFlagFreeList->OSFlagName[0] = '?';
OSFlagFreeList->OSFlagName[1] = OS_ASCII_NUL;
#endif
#endif
#if OS_MAX_FLAGS >= 2
INT16U i;
OS_FLAG_GRP *pgrp1;
OS_FLAG_GRP *pgrp2;
OS_MemClr((INT8U *)&OSFlagTbl[0], sizeof(OSFlagTbl));
pgrp1 = &OSFlagTbl[0];
pgrp2 = &OSFlagTbl[1];
for (i = 0; i < (OS_MAX_FLAGS - 1); i++) {
pgrp1->OSFlagType = OS_EVENT_TYPE_UNUSED;
pgrp1->OSFlagWaitList = (void *)pgrp2;
#if OS_FLAG_NAME_SIZE > 1
pgrp1->OSFlagName[0] = '?';
pgrp1->OSFlagName[1] = OS_ASCII_NUL;
#endif
pgrp1++;
pgrp2++;
}
pgrp1->OSFlagType = OS_EVENT_TYPE_UNUSED;
pgrp1->OSFlagWaitList = (void *)0;
#if OS_FLAG_NAME_SIZE > 1
pgrp1->OSFlagName[0] = '?';
pgrp1->OSFlagName[1] = OS_ASCII_NUL;
#endif
OSFlagFreeList = &OSFlagTbl[0];
#endif
}
void OS_MemInit (void)
{
#if OS_MAX_MEM_PART == 1
OS_MemClr((INT8U *)&OSMemTbl[0], sizeof(OSMemTbl));
OSMemFreeList = (OS_MEM *)&OSMemTbl[0];
#if OS_MEM_NAME_SIZE > 1
OSMemFreeList->OSMemName[0] = '?'; OSMemFreeList->OSMemName[1] = OS_ASCII_NUL;
#endif
#endif
#if OS_MAX_MEM_PART >= 2
OS_MEM *pmem;
INT16U i;
OS_MemClr((INT8U *)&OSMemTbl[0], sizeof(OSMemTbl));
pmem = &OSMemTbl[0];
for (i = 0; i < (OS_MAX_MEM_PART - 1); i++) {
pmem->OSMemFreeList = (void *)&OSMemTbl[i+1];
#if OS_MEM_NAME_SIZE > 1
pmem->OSMemName[0] = '?'; pmem->OSMemName[1] = OS_ASCII_NUL;
#endif
pmem++;
}
pmem->OSMemFreeList = (void *)0;
#if OS_MEM_NAME_SIZE > 1
pmem->OSMemName[0] = '?'; pmem->OSMemName[1] = OS_ASCII_NUL;
#endif
OSMemFreeList = &OSMemTbl[0];
#endif
}
重点在创建链表的时候一定要注意是:链表头和链表尾的赋值
B、信号量集的初始化
Void OS_FlagInit(void)
{
#if OS_MAX_FLAGS == 1
OSFlagFreeList = (OS_FLAG_GRP *)&OSFlagTbl[0];
OSFlagFreeList->OSFlagType = OS_EVENT_TYPE_UNUSED;
OSFlagFreeList->OSFlagWaitList = (void *)0;
OSFlagFreeList->OSFlagFlags = (OS_FLAGS)0;
#if OS_FLAG_NAME_SIZE > 1
OSFlagFreeList->OSFlagName[0] = '?';
OSFlagFreeList->OSFlagName[1] = OS_ASCII_NUL;
#endif
#endif
#if OS_MAX_FLAGS >= 2
INT16U i;
OS_FLAG_GRP *pgrp1;
OS_FLAG_GRP *pgrp2;
OS_MemClr((INT8U *)&OSFlagTbl[0], sizeof(OSFlagTbl));
pgrp1 = &OSFlagTbl[0];
pgrp2 = &OSFlagTbl[1];
for (i = 0; i < (OS_MAX_FLAGS - 1); i++)
{
pgrp1->OSFlagType = OS_EVENT_TYPE_UNUSED;
pgrp1->OSFlagWaitList = (void *)pgrp2;
#if OS_FLAG_NAME_SIZE > 1
pgrp1->OSFlagName[0] = '?'; pgrp1->OSFlagName[1] = OS_ASCII_NUL;
#endif
pgrp1++;
pgrp2++;
}
pgrp1->OSFlagType = OS_EVENT_TYPE_UNUSED;
pgrp1->OSFlagWaitList = (void *)0;
#if OS_FLAG_NAME_SIZE > 1
pgrp1->OSFlagName[0] = '?';
pgrp1->OSFlagName[1] = OS_ASCII_NUL;
#endif
OSFlagFreeList = &OSFlagTbl[0];
#endif
}
}
建立好的空的链表的格式
重点在创建链表后OSFlagWaitList他最后指向的是等待任务链表的表头OS_FlAG_NODE;