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

全部博文(103)

文章存档

2013年(4)

2012年(99)

我的朋友

分类: LINUX

2012-11-06 10:13:55

(OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
当满足如上条件时,即版本大于251,FLAG使能,最大FLAG值大于0时,开启FLAG初始化
FLAG相关的函数全都放在OS_FLAG.C的文件中,其功能和信号量等类似,是用来任务间通信的
代码如下

点击(此处)折叠或打开

  1. /*
  2. *********************************************************************************************************
  3. * INITIALIZE THE EVENT FLAG MODULE
  4. *
  5. * Description: This function is called by uC/OS-II to initialize the event flag module. Your application
  6. * MUST NOT call this function. In other words, this function is internal to uC/OS-II.
  7. *
  8. * Arguments : none
  9. *
  10. * Returns : none
  11. *
  12. * WARNING : You MUST NOT call this function from your code. This is an INTERNAL function to uC/OS-II.
  13. *********************************************************************************************************
  14. */

  15. void OS_FlagInit (void)
  16. {
  17. #if OS_MAX_FLAGS == 1
  18.     OSFlagFreeList = (OS_FLAG_GRP *)&OSFlagTbl[0]; /* Only ONE event flag */
  19.     OSFlagFreeList->OSFlagType = OS_EVENT_TYPE_UNUSED;
  20.     OSFlagFreeList->OSFlagWaitList = (void *)0;
  21.     OSFlagFreeList->OSFlagFlags = (OS_FLAGS)0;
  22. #if OS_FLAG_NAME_SIZE > 1
  23.     OSFlagFreeList->OSFlagName[0] = '?';
  24.     OSFlagFreeList->OSFlagName[1] = OS_ASCII_NUL;
  25. #endif
  26. #endif

  27. #if OS_MAX_FLAGS >= 2
  28.     INT16U i;
  29.     OS_FLAG_GRP *pgrp1;
  30.     OS_FLAG_GRP *pgrp2;


  31.     OS_MemClr((INT8U *)&OSFlagTbl[0], sizeof(OSFlagTbl)); /* Clear the flag group table */
  32.     pgrp1 = &OSFlagTbl[0];
  33.     pgrp2 = &OSFlagTbl[1];
  34.     for (i = 0; i < (OS_MAX_FLAGS - 1); i++) { /* Init. list of free EVENT FLAGS */
  35.         pgrp1->OSFlagType = OS_EVENT_TYPE_UNUSED;
  36.         pgrp1->OSFlagWaitList = (void *)pgrp2;
  37. #if OS_FLAG_NAME_SIZE > 1
  38.         pgrp1->OSFlagName[0] = '?'; /* Unknown name */
  39.         pgrp1->OSFlagName[1] = OS_ASCII_NUL;
  40. #endif
  41.         pgrp1++;
  42.         pgrp2++;
  43.     }
  44.     pgrp1->OSFlagType = OS_EVENT_TYPE_UNUSED;
  45.     pgrp1->OSFlagWaitList = (void *)0;
  46. #if OS_FLAG_NAME_SIZE > 1
  47.     pgrp1->OSFlagName[0] = '?'; /* Unknown name */
  48.     pgrp1->OSFlagName[1] = OS_ASCII_NUL;
  49. #endif
  50.     OSFlagFreeList = &OSFlagTbl[0];
  51. #endif
  52. }
OSFlagTbl[0]这是一个由数据结构

点击(此处)折叠或打开

  1. typedef struct os_flag_grp { /* Event Flag Group */
  2.     INT8U OSFlagType; /* Should be set to OS_EVENT_TYPE_FLAG */
  3.     void *OSFlagWaitList; /* Pointer to first NODE of task waiting on event flag */
  4.     OS_FLAGS OSFlagFlags; /* 8, 16 or 32 bit flags */
  5. #if OS_FLAG_NAME_SIZE > 1
  6.     INT8U OSFlagName[OS_FLAG_NAME_SIZE];
  7. #endif
  8. } OS_FLAG_GRP;

构成的数组,这个数据结构构成一个OS_FLAG_GRP
包含 OSFlagType这个标志类型
void *OSFlagWaitList指针指向flag的等待任务队列的头
OSFlagFlags;这个是OS_FLAG的比特位设置,可以设置为8-16-32位。
OSFlagName[OS_FLAG_NAME_SIZE]字符串可以设置为标志名。
 
初始化的流程:如果最大标志值为1那么只初始化一个节点,一个OS_FLAG_GRP数据结构的初始化就完成了
如果标志位最大值大于等于2,那么就用到两个指针来初始化每一个节点。
 
先设置两个指向数据结构OS_FLAG_GRP的指针,分别指向下标为0和1的节点,对第一个进行初始化
将第一个指针指向的等待队列指针赋值下一个节点的地址,就构成了一个链表。
但是为什么使用指针不使用下标呢?
 
附加一个常用的内存初始化函数

点击(此处)折叠或打开

  1. /*
  2. *********************************************************************************************************
  3. * CLEAR A SECTION OF MEMORY
  4. *
  5. * Description: This function is called by other uC/OS-II services to clear a contiguous block of RAM.
  6. *
  7. * Arguments : pdest is the start of the RAM to clear (i.e. write 0x00 to)
  8. *
  9. * size is the number of bytes to clear.
  10. *
  11. * Returns : none
  12. *
  13. * Notes : 1) This function is INTERNAL to uC/OS-II and your application should not call it.
  14. * 2) Note that we can only clear up to 64K bytes of RAM. This is not an issue because none
  15. * of the uses of this function gets close to this limit.
  16. * 3) The clear is done one byte at a time since this will work on any processor irrespective
  17. * of the alignment of the destination.
  18. *********************************************************************************************************
  19. */

  20. void OS_MemClr (INT8U *pdest, INT16U size)
  21. {
  22.     while (size > 0) {
  23.         *pdest++ = (INT8U)0;
  24.         size--;
  25.     }
  26. }

内存的初始化也是用指针实现的,有一些函数如ralloc是否可以代替?有什么不同?
 
阅读(2515) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~