Chinaunix首页 | 论坛 | 博客
  • 博客访问: 431588
  • 博文数量: 103
  • 博客积分: 1455
  • 博客等级: 上尉
  • 技术积分: 1380
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-15 22:17
文章分类

全部博文(103)

文章存档

2013年(4)

2012年(99)

我的朋友

分类: LINUX

2012-11-05 09:43:28

在完成就绪表和TCB空链表的初始化之后,系统机型ECB事件控制块链表的初始化
 

点击(此处)折叠或打开

  1. /*
  2. *********************************************************************************************************
  3. * INITIALIZATION
  4. * INITIALIZE THE FREE LIST OF EVENT CONTROL BLOCKS
  5. *
  6. * Description: This function is called by OSInit() to initialize the free list of event control blocks.
  7. *
  8. * Arguments : none
  9. *
  10. * Returns : none
  11. *********************************************************************************************************
  12. */

  13. static void OS_InitEventList (void)
  14. {
  15. #if OS_EVENT_EN && (OS_MAX_EVENTS > 0)
  16. #if (OS_MAX_EVENTS > 1)
  17.     INT16U i;
  18.     OS_EVENT *pevent1;
  19.     OS_EVENT *pevent2;


  20.     OS_MemClr((INT8U *)&OSEventTbl[0], sizeof(OSEventTbl)); /* Clear the event table */
  21.     pevent1 = &OSEventTbl[0];
  22.     pevent2 = &OSEventTbl[1];
  23.     for (i = 0; i < (OS_MAX_EVENTS - 1); i++) { /* Init. list of free EVENT control blocks */
  24.         pevent1->OSEventType = OS_EVENT_TYPE_UNUSED;
  25.         pevent1->OSEventPtr = pevent2;
  26. #if OS_EVENT_NAME_SIZE > 1
  27.         pevent1->OSEventName[0] = '?'; /* Unknown name */
  28.         pevent1->OSEventName[1] = OS_ASCII_NUL;
  29. #endif
  30.         pevent1++;
  31.         pevent2++;
  32.     }
  33.     pevent1->OSEventType = OS_EVENT_TYPE_UNUSED;
  34.     pevent1->OSEventPtr = (OS_EVENT *)0;
  35. #if OS_EVENT_NAME_SIZE > 1
  36.     pevent1->OSEventName[0] = '?';
  37.     pevent1->OSEventName[1] = OS_ASCII_NUL;
  38. #endif
  39.     OSEventFreeList = &OSEventTbl[0];
  40. #else
  41.     OSEventFreeList = &OSEventTbl[0]; /* Only have ONE event control block */
  42.     OSEventFreeList->OSEventType = OS_EVENT_TYPE_UNUSED;
  43.     OSEventFreeList->OSEventPtr = (OS_EVENT *)0;
  44. #if OS_EVENT_NAME_SIZE > 1
  45.     OSEventFreeList->OSEventName[0] = '?'; /* Unknown name */
  46.     OSEventFreeList->OSEventName[1] = OS_ASCII_NUL;
  47. #endif
  48. #endif
  49. #endif
  50. }

ECB的主要功能是:一个任务或者一个中断子程序可以通过事件控制块来向另外的任务发出信号,这里所有的信号都被看成是事件,一个任务还可以等待事件的发生,但中断服务子程序是不能等待事件的。
对于事件的等待还可以设定最长等待时间,以避免无限制的等待。
 
EBC的数据结构为

点击(此处)折叠或打开

  1. /*
  2. *********************************************************************************************************
  3. * EVENT CONTROL BLOCK
  4. *********************************************************************************************************
  5. */

  6. #if OS_EVENT_EN && (OS_MAX_EVENTS > 0)
  7. typedef struct os_event {
  8.     INT8U OSEventType; /* Type of event control block (see OS_EVENT_TYPE_xxxx) */
  9.     void *OSEventPtr; /* Pointer to message or queue structure */
  10.     INT16U OSEventCnt; /* Semaphore Count (not used if other EVENT type) */
  11. #if OS_LOWEST_PRIO <= 63
  12.     INT8U OSEventGrp; /* Group corresponding to tasks waiting for event to occur */
  13.     INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; /* List of tasks waiting for event to occur */
  14. #else
  15.     INT16U OSEventGrp; /* Group corresponding to tasks waiting for event to occur */
  16.     INT16U OSEventTbl[OS_EVENT_TBL_SIZE]; /* List of tasks waiting for event to occur */
  17. #endif

  18. #if OS_EVENT_NAME_SIZE > 1
  19.     INT8U OSEventName[OS_EVENT_NAME_SIZE];
  20. #endif
  21. } OS_EVENT;
  22. #endif

里面包含的主要数据有
OSEventType:事件的类型

点击(此处)折叠或打开

  1. /*
  2. *********************************************************************************************************
  3. * OS_EVENT types
  4. *********************************************************************************************************
  5. */
  6. #define OS_EVENT_TYPE_UNUSED 0u
  7. #define OS_EVENT_TYPE_MBOX 1u
  8. #define OS_EVENT_TYPE_Q 2u
  9. #define OS_EVENT_TYPE_SEM 3u
  10. #define OS_EVENT_TYPE_MUTEX 4u
  11. #define OS_EVENT_TYPE_FLAG 5u

  12. #define OS_TMR_TYPE 100u /* Used to identify Timers ... */
  13.                                             /* ... (Must be different value than OS_EVENT_TYPE_???) */

有这么几种类型,没有用类型,massage box 类型 消息队列类型 sem信号量类型 和 互斥体和标志位
 
void    *OSEventPtr;指向消息队列或者massage box(邮箱)的无类型指针
 
INT16U   OSEventCnt;信号量计数器,当事件是信号量时有用
 
INT8U    OSEventGrp;  OSEventTbl[OS_EVENT_TBL_SIZE];利用字节索引机制;等待列表的优先级选择类似于任务优先级选择列表,由上级8位OSEventGrp;确定头3位,再在列表中查找对应位置1或者清零或者读取
 
初始化ECB列表OSEventTbl[]利用两个指针和一个for循环将每一个元素设置为type=unused
将name=“?\0” 将OSEventPtr指向下一个元素(ECB)
最后将数组OSEventTbl[]的地址赋值给OSEventFreeList (指向ECB类型的指针!)
最后系统得到的就是OSEventFreeList这样一个指向事件列表的指针
 
 
在OS_MAX_EVENTS = 1的情况下只初始化OSEventTbl[0]就可以了。
 
 
 
阅读(2571) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~