uC/OS-II的任务同步与通信

2023-05-16

在多任务合作过程中的,操作系统应解决两个问题:一是各任务之间应具有一种互斥关系,即对于某个共享资源的共享,如果一个任务正在使用,则其他任务只能等待,等到该任务释放该资源以后,等待的任务之一才能使用它;二是相关的任务在执行上要有先后次序,一个任务要等其伙伴发来通知或建立了某个条件后才能继续执行,否则只能等待。

      任务之间的这种制约性的合作运行机制叫做任务间的同步

 

事件

      通信就要依赖中间媒介。在uC/OS-II中,使用信号量,邮箱(消息邮箱)和消息队列这些数据结构来作为中间媒介。由于这些数据结构将要影响到任务的程序流程,所以它们也被称为事件

      把信息发送到事件上的操作叫做发送事件,读取事件的操作叫做请求事件,或者叫做等待事件

信号量

      信号量是一类用来进行任务间通信的最基本事件。由于二值事件可以实现共享资源的独占式占用,所以叫做互斥型信号量。计数式的信号叫做信号量

      给等待信号量的任务设置一个等待时限。若等待信号量的任务因等待时间已超过这个时限却还未等到这个信号,则令该任务脱离等待状态而继续运行,这样就不会出现死机现象。

      在严格按照优先级别进行调度的可剥夺内核中,优先级别决定了任务能否获得处理器的使用权,而能否获得信号量则决定它能否被运行。也就是说,在使用了信号量进行同步的任务中,制约任务能否运行的条件有两个:一个是它的优先级别;另一个是它是否获得了它正在等待的信号量。正是这个事实,产生了不得不想办法解决的优先级反转问题;也正是这个事实,使得操作系统的C/S结构得以实现。

 

消息邮箱

      在多任务操作系统中,常常需要通过传递一个数据(这种数据叫做消息)的方式来进行任务之间的通信。为了达到这个目的,可以在内存中创建一个存储空间作为该数据的缓冲区。如果把这个缓冲区叫做消息缓冲区,那么在任务间传递数据(消息)的一个最简单的方法就是传递消息缓冲区。于是,用来传递消息缓冲区指针的数据结构(事件)就叫做消息邮箱。

     

消息队列

      上面的消息邮箱不仅可用来传递一个消息,而且也可以定义一个指针数组。让数组的每个元素都存放一个消息缓冲区指针,那么任务就可以通过传递这个指针数组指针的方法来传递多个消息了。这种可以传递多个消息的数据结构叫做消息队列。

 

事件的等待任务列表

      作为功能完善的事件,应有对这些等待任务具有两方面的管理功能:一是要对等待事件的所有任务进行记录并排序;二是允许任务有一定的等待时限

      对于等待事件任务的记录和排序,uC/OS-II采用了与任务就绪表类似的方法,定义一个INT8U类型的数组OSEventTbl[]作为记录等待事件任务的记录表,这个表叫做等待任务表。也定义一个INT8U的变量OSEventGrp来表示等待任务表中的任务组。

      至于等待任务的等待时限,则记录在等待任务的任务控制块TCB的成员OSTCBDly中,并在每个时钟节拍中断服务程序中对该数据进行维护。每当有任务的等待时限已到时,则将该任务事件等待任务表中删除,并使它进入就绪状态。

 

事件控制块

      uC/OS-II把事件等待任务表和与事件相关的其它信息组合起来定义一个叫做事件控制块ECB的数据结构。这样在uC/OS-II中统一采用ECB来描述注入信号量,邮箱(消息邮箱)和消息队列这些事件。

      uC/OS-II.H中,使劲按控制块的定义如下:

      #if (OS_MAX_EVENTS >= 2)

typedef struct {

    void   *OSEventPtr;                /* Pointer to message or queue structure                    */

    INT8U   OSEventTbl[OS_EVENT_TBL_SIZE]; /* List of tasks waiting for event to occur                 */

    INT16U  OSEventCnt;             /* Count of used when event is a semaphore                  */

    INT8U   OSEventType;           /* OS_EVENT_TYPE_MBOX, OS_EVENT_TYPE_Q or OS_EVENT_TYPE_SEM */

    INT8U   OSEventGrp;              /* Group corresponding to tasks waiting for event to occur  */

} OS_EVENT;

#endif

成员OSEventTbl[OS_EVENT_TBL_SIZE]是一个数组,与任务就绪表的格式一样。应用程序中的所有任务按照优先级别各自在表中占据一个二进制位,并用该位的值是1还是0来表示该位对应的任务是否为正在等待事件的任务,这个表被叫做任务等待表。

     

事件控制块的基本函数操作

      uC/OS-II4个对事件控制块进行基本操作的函数(定义在文件OS_CORE.C),以供操作信号量,消息邮箱,消息队列等事件的函数来调用。

1)           事件控制块的初始化函数

#if  (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN

void  OSEventWaitListInit (OS_EVENT *pevent)//指向事件控制块的指针

该函数将在任务调用OS***Create()函数创建事件时,被OS***Create()函数所调用。这里***代表SemMutexMboxQ

2)           使一个任务进入等待状态的函数

把一个任务置于等待状态要调用OSEventTaskWait()函数

#if  (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN

void  OSEventTaskWait (OS_EVENT *pevent)

该函数将在任务调用函数OS***Pend()请求一个事件时,被OS***Pend()所调用。

3)           使一个正在等待任务进入就绪状态的函数

调用函数OSEventTaskRdy(),把调用这个函数的任务在任务等待表中的位置清0(解除等待状态)后,再把任务在任务就绪表中的对应位置1,然后引发一次任务调度。

#if  (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN

void  OSEventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)

该函数将在任务调用函数OS***Post()发送一个事件时,被函数OS***Post()调用。

4)           使一个等待超时的任务进入就绪状态的函数

如果一个正在等待事件的任务已经超过了等待的时间,却仍由于么有获取事件等原因而具备可以运行的条件,却又要使它进入就绪状态,这时要调用函数OSEventTO()

#if  (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN

void  OSEventTO (OS_EVENT *pevent)

该函数将在任务调用OS***Pend()请求一个事件时,被OS***Pend()所调用。

空事件控制块链表

      与管理任务控制块的方法类似,uC/OS-II把事件控制块也组织成为两条链表来管理

      uC/OS-II初始化时,系统会在初始化函数OSInit()中按照应用程序使用事件的总数OS_MAX_EVENTS(OS_CFG.H),创建OS_MAX_EVENTS个空事件块,并借用成员OSEventPtr作为链接指针,组成单向链表

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

uC/OS-II的任务同步与通信 的相关文章

  • 项目启动会应该注意的几点

    摘要 xff1a 开个好头 xff0c 万事不难 项目启动会作为项目建设生命周期的开始 xff0c 其意义和难度不言而喻 作为项目管理办公室的负责人 xff0c 需要特别重视项目启动会的召开 xff0c 杜绝走过场 xff0c 避免虽然知道
  • 飞机的航班代码/航班号码的编号规则

    以下内容来源于网络 xff0c 并整理而得 一 国内航班 中国国内航班号的编号规则 xff1a 航空公司的两字代码 43 4位数字 其中 xff0c 后面四位数字的第一位代表航空公司的基地所在地区 第二位代表航班基地外终点所在地区 xff0
  • 机场生产运行数据统计指标-第四篇-机场运行保障类

    机场运行保障类 1 民航航班正常统计 1 1 统计说明 xff08 1 xff09 统计范围的相关说明 xff1a 1 民航航班正常统计范围 xff1a 国内外运输航空公司执行的客货运航班 xff0c 包括正班 加班 包机 港澳台地区及国际
  • STM32CubeMAX入门篇

    要求使用单片机STM32F407IGT6 1 时钟配置 STM32F407外部高速晶振为25MHz xff0c 分别连接到PH0和PH1引脚 2 SWD配置 STM32F407仿真接口SWD分别连接到PA13和PA14引脚 xff01 开始
  • 无人机仿真XTDrone学习一:Mavros基础知识与作用

    XTDrone等无人机仿真平台 xff0c 利用ROS 43 Gazbo 43 PX4进行SITL xff08 软件在环仿真 xff09 xff0c 主要利用PX4飞控的offboard模式 xff0c 在此模式下上位机程序发布期望运动 x
  • 无人机仿真XTDrone学习二:常用的mavros消息类型

    mavros用于无人机通信 xff0c 可以将飞控与主控的信息进行交换 本次记录常用的mavros消息类型 官方Wiki最正确 xff0c 如有疑问首先查阅Wiki mavros wiki CSDN参考 常用话题 数传 用于查看数传状态 x
  • 无人机仿真XTDrone学习三:MAVRos功能包在offboard模式控制例程

    本教程介绍了使用 Gazbo SITL 中模拟的四轴飞行器 Offboard 控制缓慢起飞到2米的高度 61 61 注意 xff1a 61 61 使用 Offboard 模式来控制无人机有危险性的 如果你是在一个真正的实物平台上进行试验 x
  • 无人机仿真XTDrone学习四:XTDrone键盘控制无人机程序分析(MAVRos)一

    在XTDrone安装完成后 xff0c 运行一个键盘控制无人机程序测试XTDrone安装是否存在问题 通过分析该例程 xff0c 理解ROS对无人机的控制方法与控制过程 XTDrone键盘控制无人机例程仿真 XTDrone键盘控制无人机例程
  • 无人机仿真XTDrone学习五:XTDrone键盘控制无人机indoor1.launch程序分析二

    launch程序如下 这个文件启动了Gazebo仿真环境 xff0c 配置MAVROS功能包和PX4 SITL功能包 span class token prolog lt xml version 61 34 1 0 34 gt span s
  • 接收机灵敏度的计算公式推导和分析

    接收机灵敏度定义的接收机能够接收到的并且还能正常工作的最低电平强度 接收机灵敏度跟很多东西有关 xff0c 如噪声系数 信号带宽 解调信噪比等 xff0c 灵敏度一般来说越高 xff08 数值越低 xff09 xff0c 说明其接收微弱信号
  • 无人机仿真XTDrone学习六:XTDrone键盘控制无人机multirotor_communication.py程序分析三

    multirotor communication py程序 这个程序是实现对无人机控制的主要程序 xff0c 需要重点分析 可以实现对无人机的位置 xff0c 速度 xff0c 加速度的控制 主要节点 xff1a sys span clas
  • 无人机仿真XTDrone学习七:XTDrone键盘控制无人机 multirotor_keyboard_control.py程序分析四

    multirotor keyboard control py 该程序可以通过键盘对一个或者多个无人机进行速度或者加速度的控制并更改无人机或领导者无人机飞行状态 这个脚本通过发布状态命令和速度命令话题与通讯脚本进行通讯 xff0c 通讯脚本进
  • XTDrone仿真平台与Prometheus仿真平台

    常见的无人机仿真平台大都是用于对底层飞控算法的仿真与调试 xff0c XTDrone仿真平台与Prometheus仿真平台可以针对无人机上层算法进行仿真或者进行编队仿真 xff0c 这两者都采用ROS 43 PX4 43 Gazebo开源平
  • ROS中功能包二进制安装改为源码安装

    在学习XTDrone的二维路径规划时需要使用navigation功能包 xff0c 使用文档安装方式为二进制安装 sudo apt install span class token operator span y ros span clas
  • 2016晚安 2017你好

    不知不觉开通CSDN账号已有三年多的时间 xff0c 三年多以前抱着学习坚持的态度想要在CSDN上记录自己学习的点滴 结果三年多过去了 xff0c 2016年也随着过去了 xff0c 回顾2016年主要的三件事情就是 xff1a 1 从大学
  • Python入门学习--环境配置

    工作将近两年了 xff0c 做过B S结构的项目 xff0c 也做过android xff0c 也做过C S结构的项目 xff0c 相信无论是那种项目都是基于Java 学习运用Java也已经好多年了 xff0c 虽然也接触过C C 43 4
  • Python入门学习-数据类型

    一 类型的概念 首先 xff0c 对于一个数据1011100 xff0c 改怎么解释呢 xff1f 同Java等变成语言类型 xff0c 首先我们要明确数据的类型 xff0c 程序设计语言不允许语法歧义 xff0c 因此需要明确数据的类型
  • 流年似水 启航2019

    凌晨1点无意间看到一个演讲视频 感谢你给我机会上场 xff0c 很久之前的一个演讲视频 xff0c 看完除了羡慕还是羡慕吧 xff0c 也许就是一句话吧 xff0c 开挂的人生不需要解释 30多年的生活他做了很多事 xff0c 也做成了很多
  • Matplotlib 可视化必备神书,附pdf下载

    出品 xff1a Python数据之道 大家好 xff0c 我是阳哥 大家知道 xff0c 在利用Python进行数据可视化过程中 xff0c 基本上是很难绕开 Matplotlib 的 xff0c 因为 不少其他的可视化库多多少少是建立在

随机推荐

  • ubuntu学习笔记02

    1 sudo sh 与sudo bash sh区别 以超级用户身份运行 34 sh 34 xff0c sh实用程序是一个命令语言解释器 以超级用户身份运行 34 bash 34 xff0c Bash是shell或命令语言解释器 xff0c
  • 史上最浅显易懂的Git教程!

    从零起步的Git教程 xff0c 让你无痛苦上手世界上最流行的分布式版本控制系统Git xff01 既然号称史上最浅显易懂的Git教程 xff0c 那这个教程有什么让你怦然心动的特点呢 xff1f 首先 xff0c 本教程绝对面向初学者 x
  • 数据库死锁原因及解决办法

    死锁 xff08 Deadlock xff09 所谓死锁 xff1a 是指两个或两个以上的进程在执行过程中 xff0c 因争夺资源而造成的一种互相等待的现象 xff0c 若无外力作用 xff0c 它们都将无法推进下去 此时称系统处于死锁状态
  • spring和springmvc父子容器的关系

    大家都知道 xff0c 在spring的配置中要分开配置service层的注解扫描 xff0c 以及springmvc变现层的注解扫描 xff0c 如下 xff1a lt 扫描加载Service实现类 gt lt context compo
  • pageHelper分页插件实现原理及使用方法

    插件官方网站 xff1a https github com pagehelper Mybatis PageHelper tree master src main java com github pagehelper 实现原理 xff1a 使
  • 虚拟机Linux系统安装nginx服务器并启动的步骤

    工作前的准备 xff1a 1 装有Linux的虚拟机 2 nginx安装包 xff0c 注意是gz结尾的压缩文件 具体步骤1 xff1a 1 nginx安装环境 nginx是 C 语言开发 xff0c 建议在 linux 上运行 xff0c
  • 什么是反射机制,有什么作用

    1 反射机制定义 反射的概念是由Smith在1982年首次提出的 xff0c 主要是指程序可以访问 检测和修改其本身状态或行为的一种能力 在Java环境中 xff0c 反射机制允许程序在执行时获取某个类自身的定义信息 xff0c 例如熟悉和
  • 写给2016

    你不能期待着遇见怎样的自己 xff0c 但你可以选择成为怎样的自己 转眼16年就迎来了它的落幕 xff0c 不论怎样华丽的开场 xff0c 总有归于平静散场的结束 xff0c 不早不晚 xff0c 于清晨到傍晚 xff0c 于四季的轮回 x
  • 模块化建立项目流程(Maven聚合模块)

    先说项目使用Maven的好处 1 项目构建 Maven定义了软件开发的整套流程体系 xff0c 并进行了封装 xff0c 开发人员只需要指定项目的构建流程 xff0c 无需针对每个流程编写自己的构建脚本 2 依赖管理 除了项目构建 xff0
  • 如何在linux下判断web服务是否开启?

    对于web服务的开启的判断有以下几种常用方法 xff1a 1 端口查看 xff1a 本地 xff1a ss xff0c netstat xff0c lsof 1 2 3 4 5 6 7 8 9 10
  • git基本命令

    最近再写一些项目上传到github xff0c 所以要用到git命令 本地需要先安装git客户端 xff0c 然后指定一个git地址为本地仓库 然后右键git bash here打开git命令界面 首先服务端需要创建一个项目以便clone到
  • jps查看Java线程,jstack查看具体线程堆状态

    想要使用jps需要配置环境变量 xff0c 在classpath后在加一个指定Java bin目录 具体命令如下 t2挂起了 xff0c 堆里面显示t2为RUNNABLE xff0c suspend xff0c resume废弃使用 IBM
  • heap_1.c详解--------FreeRTOS内存管理

    heap 1源码分析 include lt stdlib h gt Defining MPU WRAPPERS INCLUDED FROM API FILE prevents task h from redefining all the A
  • 记录一个类加载变量引发的问题

    类加载变量导致的问题 类加载变量导致的问题 类加载变量导致的问题 因为项目需要 xff0c 银行要求使用weblogic部署并且启动所有项目 xff0c 不允许项目单独开服务启动一般都有这样的要求 xff0c 我所在的项目组有两个单独mai
  • Ubuntu16.04安装intel RealSense D435i驱动并在ROS中使用

    参考 xff1a https blog csdn net qq 43265072 article details 106437287https blog csdn net zhangfenger article details 849980
  • 【ROS】的单线程Spinning和多线程Spinning

    参考 xff1a https www cnblogs com feixiao5566 p 5288206 htmlhttps www freesion com article 9499126134 https blog csdn net y
  • Intel RealSense D435i 深度相机介绍

    参考 xff1a https www sohu com a 340984033 715754https www chiphell com thread 1945054 1 1 htmlhttps blog csdn net cherry y
  • 【ROS】rosnode信息命令

    参考 xff1a https www cnblogs com kay2018 p 10314741 html 一 概述 ROS信息命令用于识别话题 服务 节点和参数等信息 尤其是rostopic rosservice rosnode和ros
  • 【ROS】launch文件详解

    参考 xff1a https www cnblogs com fuzhuoxin p 12588402 html 在节点少 xff0c 程序小的情况下可以一个一个节点来启动 xff0c 测试运行效果 xff1b 但是当工程规模大 xff0c
  • uC/OS-II的任务同步与通信

    在多任务合作过程中的 xff0c 操作系统应解决两个问题 xff1a 一是各任务之间应具有一种互斥关系 xff0c 即对于某个共享资源的共享 xff0c 如果一个任务正在使用 xff0c 则其他任务只能等待 xff0c 等到该任务释放该资源