18.0-uC/OS-III挂起内核对象
任务等待多个对象。然而, uC/OS-III只允许同时等待多个信号量和
消息队列。换句话说,不能同时等待多个事件标志组或mutex。
1.任务可以同时等待多个信号量和消息队列。 任务接收到一个信号量或消息就会被就绪。
任务通过调用OSPendMulti()等待多个对象,并可使设置等待时限。这个时限对应于所有的对象。
当在这个时限内没有收到一个对象,任务就会返回一个错误代号表示等待超时。

2.OSPendMulti()的原 型

( 1)OSPendMulti的第一个参数: 数据类型为OS_PEND_DATA的数组。 数组的大小决定了任务所等待的内核对象数。
例如, 如果任务要等待3个信号量和2个消息,那么数组的大小为5。
数据类型为OS_PEND_DATA的数组:

每个数组元素中的.PendObjPtr都要被初始化、指向所等待的对象。
3.当OSPendMulti()被调用,它首先确认数组中所有的元素是否为OS_SEM或OS_Q。
如果不是,就返回对应的错误代号。OSPendMulti()先遍历数组,查看其中的对象是否已经被提交。
如果有, OSPendMulti()就在表中该索引中填入相应的值: RdyObjPtr,RdyMsgPtr,.RdyMsgSize, .RdyTs。
.RdyObjPtr 指向已经被提及的对象。
.RdyMsgPtr 如果表中该索引等待的是消息队列,且有消息被接收,那么该指针指向消息
.RdyMsgSize 如果表中该索引等待的是消息队列,且有消息被接收,那么该值为消息中数据的大小。
.RdyTS 存放着对象被提交时的时间戳。
4.如果没有对象被提交, OSPendMulti()就会将任务放入所有对象的挂起队列中,
这是一个复杂的操作因为其它任务也可能在这些对象中等待。
5.当任务或ISR发送消息给等待该消息的任务,OSPendMulti()返回。
表示OS_PEND_DATA表中有对象被提交,这些通过在表中相应索引
中填入对应值实现。

6.当任务等待5个内核对象时, 且在任务调用OSPendMulti()之前已经有一个对象就绪,
那么表中结构将会是:

如果没有已提交的对象, OSPendMulti()就会将任务放入所有对象的挂起队列中。当有一个对象
被提交时OSPendMulti()就会返回。这这种情况下, OSPendMulti()会标记哪个对象已被提交。
OSPendMulti()是一个复杂的函数,可能会导致长临界段。
18.0-uC/OS-III挂起内核对象的更多相关文章
- uc/os iii移植到STM32F4---IAR开发环境
也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...
- uC/OS - III 移植 IAR平台
关于移植uC/OS-III 网上已经有很多教程了此处只是做个记录 首先下载源码然后解压得到下面的文件: 然后在模版工程里新建各种文件夹: 最后全部都添加进工程: OK了,编译一下,惊呆了,竟然 0错误 ...
- μC/OS-III---I笔记9---任务等待多个内核对象和任务内建信号量与消息队列
在一个任务等待多个内核对象在之前,信号量和消息队列的发布过程中都有等待多个内核对象判断的函数,所谓任务等待多个内核对象顾名思义就是一任务同时等待多个内核对象而被挂起,在USOC-III中一个任务等待多 ...
- 异步设备IO OVERLAPPED结构(设备内核对象 事件内核对象 可提醒IO)
同步IO是指:线程在发起IO请求后会被挂起,IO完成后继续执行. 异步IO是指:线程发起IO请求后并不会挂起而是继续执行.IO完毕后会得到设备驱动程序的通知. 一.异步准备与OVERLAPPED结构 ...
- Windows核心编程学习九:利用内核对象进行线程同步
注:源码为学习<Windows核心编程>的一些尝试,非原创.若能有助于一二访客,幸甚. 1.程序框架 #include "Queue.h" #include <t ...
- Windows核心编程&内核对象
1. 一个进程在初始化时,系统将会他分配一个空的句柄表,这个句柄表仅供内核对象使用,不供用户对象和GDI对象使用.进程在首次 初始化时,该句柄表为空.句柄表是一个由数据结构组成的数组,包含一个内核对象 ...
- 基于μC/OS—III的CC1120驱动程序设计
基于μC/OS—III的CC1120驱动程序设计 时间:2014-01-21 来源:电子设计工程 作者:张绍游,张贻雄,石江宏 关键字:CC1120 嵌入式操作系统 STM32F103ZE ...
- uC/OS II原理分析及源码阅读(一)
uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...
- 关于uC/OS的简单学习(转)
1.微内核 与Linux的首要区别是,它是一个微内核,内核所实现的功能非常简单,主要包括: 一些通用函数,如TaskCreate(),OSMutexPend(),OSQPost()等. 中断处理函数, ...
随机推荐
- Mssql Server2005中更改sa的用户名的多种方法
mssql安装上去时默认就是sa用户,大多数用户都会一直使用sa这个用户,这样数据库就存在很大的安全问题了,如果我们能把sa用户名修改,这样安全级别又高了一层哦,下面我们来看修改sa用户名的办法. ...
- CentOS 7.5 安装KVM虚拟机(Windows)
一.KVM环境搭建1.检测系统是否支持cat /proc/cpuinfo | egrep 'vmx|svm' KVM是基于x86虚拟化扩展(Intel VT 或者 AMD-V)技术的虚拟机软件,所以查 ...
- 关于java多线程中异常捕获的理解
在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked e ...
- 使用Markdown写作
简介 Markdown是一种轻量级标记语言,创始人为约翰·格鲁伯(John Gruber).它允许人们"使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档&qu ...
- Sword 内核队列一
1.gfifo概述 gfifo是一个First In First Out数据结构,它采用环形循环队列的数据结构来实现:它提供一个无边界的字节流服务,最重要的一点是,它使用并行无锁编程技术,即当它用于只 ...
- Houdini技术体系大纲
Houdini for UE4 Pipeline的系列教程,前言等想好再写吧
- 使用cnpm 安装vue.js
前提已经安装了node.js 一.临时使用 1.npm install -g cnpm --registry=https://registry.npm.taobao.org 2.cnpm instal ...
- Springboot多数据源配置--数据源动态切换
在上一篇我们介绍了多数据源,但是我们会发现在实际中我们很少直接获取数据源对象进行操作,我们常用的是jdbcTemplate或者是jpa进行操作数据库.那么这一节我们将要介绍怎么进行多数据源动态切换.添 ...
- Qt OpenGL 鼠标拾取实现
在之前的文章中讲到了OpenGL鼠标拾取操作的例子,工作中需要在Qt中实现,下面的程序演示了QT中opengl的拾取例子. 本例子在Qt5.12和Qt Creator4.8.0上测试,使用的是QOpe ...
- 关于Kafka producer管理TCP连接的讨论
在Kafka中,TCP连接的管理交由底层的Selector类(org.apache.kafka.common.network)来维护.Selector类定义了很多数据结构,其中最核心的当属java.n ...