UCOSii事件总结2

                                                                        初始化事件列表

 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_QInitvoid

{

  #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_FlagInitvoid

   {

     #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;

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值