0412
来源:互联网 发布:淘宝费列罗真假 编辑:程序博客网 时间:2024/06/04 18:30
建立一个消息队列,OSQCreate()
- 程序清单 L6.21是OSQCreate()函数的源代码。该函数需要一个指针数组来容纳指向各个消息的指针。该指针数组必须声名为void类型。
- OSQCreate()首先从空闲事件控制块链表中取得一个事件控制块(见图F6.3)[L6.21(1)],并对剩下的空闲事件控制块列表的指针做相应的调整,使它指向下一个空闲事件控制块[L6.21(2)]。接着,OSQCreate()函数从空闲队列控制块列表中取出一个队列控制块[L6.21(3)]。如果有空闲队列控制块是可以的,就对其进行初始化[L6.21(4)]。然后该函数将事件控制块的类型设置为OS_EVENT_TYPE_Q [L6.21(5)],并使其.OSEventPtr指针指向队列控制块[L6.21(6)]。OSQCreate()还要调用OSEventWaitListInit()函数对事件控制块的等待任务列表初始化[见6.01节,初始化一个事件控制块,OSEventWaitListInit()] [L6.21(7)]。因为此时消息队列正在初始化,显然它的等待任务列表是空的。最后,OSQCreate()向它的调用函数返回一个指向事件控制块的指针[L6.21(9)]。该指针将在调用OSQPend(),OSQPost(),OSQPostFront(),OSQFlush(),OSQAccept()和OSQQuery()等消息队列处理函数时使用。因此,该指针可以被看作是对应消息队列的句柄。值得注意的是,如果此时没有空闲的事件控制块,OSQCreate()函数将返回一个NULL指针。如果没有队列控制块可以使用,为了不浪费事件控制块资源,OSQCreate()函数将把刚刚取得的事件控制块重新返还给空闲事件控制块列表 [L6.21(8)]。
- 另外,消息队列一旦建立就不能再删除了。试想,如果有任务正在等待某个消息队列中的消息,而此时又删除该消息队列,将是很危险的。
- 程序清单 L6.21 建立一个消息队列
- OS_EVENT *OSQCreate (void **start, INT16U size)
- {
- OS_EVENT *pevent;
- OS_Q *pq;
- OS_ENTER_CRITICAL();
- pevent = OSEventFreeList; (1)
- if (OSEventFreeList != (OS_EVENT *)0) {
- OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr; (2)
- }
- OS_EXIT_CRITICAL();
- if (pevent != (OS_EVENT *)0) {
- OS_ENTER_CRITICAL();
- pq = OSQFreeList; (3)
- if (OSQFreeList != (OS_Q *)0) {
- OSQFreeList = OSQFreeList->OSQPtr;
- }
- OS_EXIT_CRITICAL();
- if (pq != (OS_Q *)0) {
- pq->OSQStart = start; (4)
- pq->OSQEnd = &start[size];
- pq->OSQIn = start;
- pq->OSQOut = start;
- pq->OSQSize = size;
- pq->OSQEntries = 0;
- pevent->OSEventType = OS_EVENT_TYPE_Q; (5)
- pevent->OSEventPtr = pq; (6)
- OSEventWaitListInit(pevent); (7)
- } else {
- OS_ENTER_CRITICAL();
- pevent->OSEventPtr = (void *)OSEventFreeList; (8) OSEventFreeList = pevent;
- OS_EXIT_CRITICAL();
- pevent = (OS_EVENT *)0;
- }
- }
- return (pevent); (9)
- }
0 0
- 0412
- 0412rainbow 回来啦!
- 第十七天总结0412
- 0412-css背景
- 0412python中文处理小记
- java0408-0412 进制转换
- 前端开源项目周报0412
- 0412-css id和类选择器
- thinking in java——0412学习笔记
- 【小阅读^大脑袋】0412 NO.352 按此在新窗口浏览图片
- 基于visual Studio2013解决C语言竞赛题之0412水仙花数
- 教你用DiskGenius 3.1.0412 Beta3打开虚拟机vmdk文件
- Json转换利器Gson之实例二-Gson注解和GsonBuilder
- centos 7 安装django 简单脚本
- [置顶] 建造者模式——办理手机套餐
- mysql数据库常用操作命令集合
- Rikka with Tree HDU
- 0412
- 使用libcurl以Post方式向HTTP服务器提交数据
- effective java摘抄(一)
- “大数据可视化技术与应用”培训
- 557. Reverse Words in a String III
- 利用四元数,欧拉角进行空间向量旋转
- 友元函数
- Json转换利器Gson之实例三-Map处理(上)
- Android网络编程ConnectivityManager和NetworkInfo详解