uCOSIII实时操作系统 二 同步与通信

目录

同步概念:

互斥概念:

临界区概念:

任务时间概念:

信号量概念: 

互斥信号量概念:

事件标志组概念:

消息邮箱和消息梯队概念:

内存管理概念:

如何从裸机开发转跳到OS编程:

轮询系统:

前后台系统:

多任务系统:


同步概念:

任务是独立的。有时候一个任务完成的前提是需要另一个任务给出一个结果,任务之间的这种制约性的合作运行机制叫做任务间的同步

怎么来同步呢?
首先,信号量初始化成0(用来实现同步机制),接着,B任务开始就请求信号量,但是此时信号量的值为0,只能等待。然后A任务在完成任务后在输出信号量,B接受到信号量开始执任务。
如果内核支持计数式信号量,信号量的值表示尚未得到处理的事件数。请注意,可能会有一个以上的任务在等待同一事件的发生,则这种情况下内核会根据以下原则之一发信号给相应的任务:

  1. 发信号给等待事件发生的任务中优先级最高的任务,或者
  2. 发信号给最先开始等待事件发生的那个任务

根据不同的应用,发信号以标识事件发生的中断服务或任务也可以是多个

互斥概念:

互斥条件:实现任务之间通讯最简单的办法就是使用任务共享数据结构(类似于裸机的全局变量)。特别是当所有的任务都在一个单一的地址空间下,使用全局变量、指针、缓冲区、链表、循环缓冲区等,使用共享数据结构就容易理解。虽然共享数据区法简化了任务之间的信息交换,但是必须保证每一个任务在处理共享数据时候的排他性,以避免竞争和数据破坏。

与共享资源打交道时,使用满足互斥条件的一般方法有:

  • 关中断
  • 禁止任务切换
  • 利用信号量

临界区概念:

代码的临界段也成为临界区,指处理时不可分割的代码。例如:每个任务中访问共享资源部分代码。这一部分一旦执行,则不允许任何中断打断,因为共享资源的访问是互斥的。在临界区不允许任务切换,这是最基本的原则。

为确保临界代码的执行,在进入临界区访问共享资源之前,采用关中断给调度器上锁,使用信号量等方式,达到互斥的目的。而在代码执行后要立即开启,中断,解锁以及释放信号量。

任务时间概念:

事件(Event)就是在操作系统运行过程中发生的事情。例如任务被挂起、唤醒、创建等。 μC/OS操作系统在处理任务的同步和通信等环节,大量的使用了事件这一概念,创建了事件控制块这样的数据结构以进行事件的管理。

信号量概念: 

在一个时刻有些共享资源只可以被一个任务所占用,而有些可以被N多个任务所占用,前一种共享资源就好比有一把钥匙,钥匙发出去了,得到钥匙的任务可以访问共享资源,其他请求该资源的任务必须等得到钥匙的任务把钥匙归还。后者则可以有N把钥匙,如果N把钥匙都发完了,第N+1个请求访问共享资源的任务就必须等待。这些钥匙就可以用信号量(semaphore)来表示。

信号量标志了共享资源的有效可被访问数量,于是要获得共享资源的访问权,就首先要得到信号量这把钥匙。

信号量的三种操作:

1、建立(create)

建立并初始化信号量,执行的是给资源配置钥匙的操作。

2、请求(pand):

请求信号,如果还有钥匙(信号量大于0)就去领一把钥匙(信号量)执行下去,如果没有就把自己堵塞。

3、释放(post):

访问资源的操作完成之后就要把钥匙(信号量)交回,这时,如果有等待该钥匙的任务就绪,并比当前任务有更高的优先级,就执行任务调度。否则原任务在释放信号量后继续执行。

见图:

要与同一共享数据打交道的任务调用等待信号量函数OSSemPend()。处理完共享数据以后再调用释放信号量函数OSSemPost()。

在使用信号量之前,一定要对该信号量做初始化。作为互斥条件,信号量初始化为1。使用信号量处理共享数据不增加中断延迟时间,如果中断服务程序或当前任务激活了一个高优先级的任务,高优先级的任务立即开始执行。

伪代码:

sem = 1;// 信号量初始化(建立)
任务函数(void)
{while(1){OSSemPend();//请求/*对共享数据进行处理*/OSSemPost();//释放}
}

我的理解是可以把信号量比作一个标志位,有它在其他任何中断不不能打断当前任务的执行。

互斥信号量概念:

互斥信号量是一种特殊的信号量,这不仅在于该信号量只用于互斥资源的访问,还在于使用互斥信号量管理需要解决的“优先级反转”问题。(优先级反转:CPU不去执行那些优先级高的任务反而去执行那些低优先级的任务。

假设有三个任务,优先级从高到底分别是任务H(high)M(middle)L(low)。

任务H和任务L使用互斥信号量访问同一临界资源,任务M不使用临界资源。

  1. L任务正在使用临界资源,(信号量加锁),H任务被唤醒,执行H任务,但此时L任务还没有执行完,此时的临界资源还没有被释放,(互斥信号量还处于加锁状态,即使优先级更高的任务也无法访问这个临界资源)。
  2. 这个时刻H任务也要对该临界资源进行访问,但L任务还未释放资源,由于保护机制,H任务进入阻塞态,L任务得以继续运行,此时已经发生了优先级翻转现象。
  3. 某个时刻M任务被唤醒,由于M任务的优先级高于工任务,M任务抢占了CPU的使用权,M任务开始运行,此时L任务尚未执行完,临界资源还没被释放。
  4. M任务运行结束,归还CPU使用权,L任务继续运行。
  5. L任务运行结東,释放临界资源(信号量解锁),H任务得以对资源进行访问,H任务开始运行。

那到底什么是优先级反转呢?

我的理解是在低优先级中还有高优先级需要运行的条件,所以就从高优先级退到低优先级中(个人理解)。

事件标志组概念:

在信号量和互斥信号量的管理中,任务请求资源,如果资源未被占用就可继续运行,否则只能阻塞,等待资源释放的事件发生。
这种事件是单一的事件。如果任务要等待多个事件的发生,或多个事件中的某一个事件的发生就可以继续运行,那么就应该采用事件标志组管理。 事件标志组管理的条件组合可以是多个事件都发生,也可以是多个事件中有任何一个事件发生。尤其特别的是,还可以是多个事件都没有发生或多个事件中有任何一个事件没有发生。

消息邮箱和消息梯队概念:

uCOSIII中已经没有了消息邮箱这个说法;

有时很需要任务间的或中断服务与任务间的通讯。这种信息传递称为任务间的通讯。任务间信息的传递有两个途径:通过全程变量或发消息给另一个任务。
用全程变量时,必须保证每个任务或中断服务程序独享该变量。如果两个任务共享某变量,各任务实现独享该变量的办法可以是关中断再开中断,或使用信号量(如前面提到的那样)。请注意,任务通过全程变量与中断服务程序通讯,而任务并不知道什么时候全程变量被中断服务程序修改了,除非中断程序以信号量方式向任务发信号或者是该任务以查询方式不断周期性地查询变量的值 。要避免这种情况,用户可以考虑使用邮箱或消息队列。

邮箱(MailBox)很明显是用于通信的,邮箱中的内容一般是信件。操作系统也通过邮箱来管理任务间的通信与同步,**发送和接收消息的任务约定,传递的消息实际上是传递的指针指向的内容**。意思就是邮箱中的内容却不是信件本身,而是指向消息内容的地址!这个指针是void类型的(指针占4个字节),可以指向任何的数据结构。因而这样的设计更经济,所发送的信息范围也就更宽,邮箱中可以容纳下任何长度的数据了。

消息队列(message queue)也用于给任务发消息,但是它是由多个消息邮箱组合形成的,是消息邮箱的集合实质上是消息邮箱的队列一个消息邮箱只能容纳一条消息。采用消息队列,一是可以容纳多条消息,二是消息是有序的 。通常,先进入消息队列的消息先传给任务,也就是说,任务先得到的是最先进入消息队列的消息,**即先进先出原则(FIFO)。然而μC/OS-Ⅱ也允许使
用后进先出方式(LIFO)。**像使用邮箱那样,当一个以上的任务要从消息队列接收消息时,每个消息队列有一张等待消息任务的等待列表(Waiting List)。如果消息队列中没有消息,即消息队列是空,等待消息的任务就被挂起并放入等待消息任务列表中,直到有消息到来。通常,内核允许等待消息的任务定义等待超时的时间。如果限定时间内任务没有收到消息,该任务就进入就绪态并开始运行,同时返回出错代码,指出出现等待超时错误。一旦一则消息放入消息队列,该消息将传给等待消息的任务中优先级最高的那个任务,或是最先进入等待消息任务列表的任务。

内存管理概念:

μC/OS-II中,采用分区的方式管理内存,即将连续的大块内存按照分区来管理,每个系统中有数个这样的分区, 每个分区又包含数个内存块,每个内存块的大小相同。这样,再分配内存的时候,根据需要从不同的分区中得到数个内存块,而在释放时,这些内存块重新释放回他们原来所在的分区。这样就不回产生内存越分越乱,没有整块连续分区的问题了。

如何从裸机开发转跳到OS编程:

裸机系统通常分成轮询系统和前后台系统

轮询系统:

轮询系统即是在裸机编程的时候,先初始化好相关的硬件,然后让主程序在一个死循环里面不断循环,顺序地做各种事情。最常用的应该就是while(1){};。轮询系统是一种非常简单的软件结构,通常只适用于那些只需要顺序执行代码且不需要外部事件来驱动的就能完成的事情。在代码清单 中,如果只是实现 LED 翻转,串口输出,液晶显示等这些操作,那么使用轮询系统将会非常完
美。但是,如果加入了按键操作等需要检测外部信号的事件,用来模拟紧急报警,那么整个系统的实时响应能力就不会那么好了。

//伪代码
int main ()
{//硬件相关初始化HardwareInit();while(1){Dosomething1();Dosomething2();Dosomething3();}}

假设DoSomething3 是按键扫描,当外部按键被按下,相当于一个警报,这个时候,需要立马响应,并做紧急处理,而这个时候程序刚好执行DoSomething1,要命的是 DoSomething1需要执行的时间比较久,久到按键释放之后都没有执行完毕,那么当执行到 DoSomething3的时候就会丢失掉一次事件。足见,轮询系统只适合顺序执行的功能代码,当有外部事件驱动时,实时性就会低。

前后台系统:

相比轮询系统,前后台系统是在轮询系统的基础上加入了中断。外部事件响应在中断里面完成,事件的处理还是回到轮询系统中完成,其中中断在这里我们称之为前台,main函数里边的无限循环我们称之为后台。并且把外部的紧急事件放到中断里处理。

多任务系统:

相比前后台系统,多任务系统的事件响应也是在中断中完成的,但是事件的处理是在任务中完成的(裸机是在中断中完成,操作系统在任务中完成由CPU去任务调度)。在多任务系统中,任务跟中断一样,也具有优先级,优先级高的任务回被优先的执行,当一个紧急的事件在中断被标记之后,如果事件对应的优先级足够高,就会立马响应。相比前后台系统,多任务系统的实时性又被提高了。

//伪代码(基本代码框架)
int flag  = 0;//全局变量
int main(void)//主函数
{init();//硬件初始化osinit();//操作系统OS初始化osstart();//开启操作系统OS
}void ISR1()//中断处理函数
{flag = 1;
}void task1(void)//任务函数
{Dosmoesting1();//任务实体
}void task2(void)//负责中断的任务
{while(1){if(flag=1)Dosmoesting2();//任务实体}
}

相比较前后台系统中后台顺序执行程序主体,在多系统中,根据程序的功能我们把程序主体分割成一个个独立的,无限循环并且不能返回的任务,每个任务都是独立的互不干扰的,且具备优先级,由操作系统调度管理。加入操作系统后,我们在编程的时候不需要精心地去设计程序的执行流不用担心每个功能模块之间是否存在干扰。整个系统随之带来的额外开销就是操作系统占据的那一丁点的 FLASH 和RAM。现如今,单片机的 FLASH 和 RAM 是越来越大,完全足以抵挡 RTOS 那点开销。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149493.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

矢量图形编辑软件illustrator 2023 mac特点介绍

illustrator 2023 mac是一款矢量图形编辑软件,用于创建和编辑排版、图标、标志、插图和其他类型的矢量图形。 illustrator mac软件特点 矢量图形:illustrator创建的图形是矢量图形,可以无限放大而不失真,这与像素图形编辑软件&am…

六、vpp 流表+负载均衡

草稿!!! vpp node其实就是三个部分 1、plugin init 2、set command 3、function 实现功能,比如这里的流表 今天我们再用VPP实现一个流表的功能 一、流表 1.1流表----plugin init VLIB_REGISTER_NODE 注册流表节点 // 注册流…

纯css实现3D鼠标跟随倾斜

老规矩先上图 为什么今天会想起来整这个呢?这是因为和我朋友吵架, 就是关于这个效果的,就是这个 卡片懸停毛玻璃效果, 我朋友认为纯css也能写, 我则坦言他就是在放狗屁,这种跟随鼠标的3D效果要怎么可能能用纯css写, 然后吵着吵着发现,欸,好像真能用css写哦,我以前还写过这种…

去雨去雪去雾数据集构建

在进行去雨去雪去雾算法的学习过程中,需要构建去雨去雪去雾数据集,本文参考Learning Multiple Adverse Weather Removal via Two-stage Knowledge Learning and Multi-contrastive Regularization: Toward a Unified Model论文中的数据集设定&#xff0c…

面试题 17.24. 最大子矩阵

链接: 面试题 17.24. 最大子矩阵 题解: 这样我们就将二维问题转化为了一维问题,现在另一个问题就是怎么把所有情况都遍历到呢? 我们以第i行为第一行,向下延申,设最后一行为第j行,我们就i在这么…

【AI视野·今日NLP 自然语言处理论文速览 第四十七期】Wed, 4 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 4 Oct 2023 Totally 73 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Contrastive Post-training Large Language Models on Data Curriculum Authors Canwen Xu, Corby Rosset, Luc…

手机或者电脑连接局域网内的虚拟机(网桥)

手机或者电脑连接局域网内的虚拟机(网桥) 手机软件:ConnectBot,Termius,JuiceSSH … 1.虚拟机vmware中添加桥接网卡 这里桥接网卡选择的是自动,是自动生成动态IP,如果不需要动态生成&#xff…

MySQL:数据库的物理备份和恢复-冷备份(3)

介绍 物理备份: 直接复制数据文件进行的备份 优点:不需要其他的工具,直接复制就好,恢复直接复制备份文件即可 缺点:与存储引擎有关,跨平台能力较弱 逻辑备份: 从数据库中导出数据另存而进行的备…

性能测试工具 - LoadRunner

什么是性能测试? 性能测试就是测试人员利用性能测试工具模拟系统在不同情况下的性能指标是否正常。 性能测试工具 - LoadRunner 接下来介绍LoadRunner的作用和使用。 LoadRunner 就是一个很常见的性能测试工具,它有三个部分组成: 这三个组…

【MyBatis-Plus】快速精通Mybatis-plus框架—快速入门

大家在日常开发中应该能发现,单表的CRUD功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。 因此,目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是…

Java实现微信支付

微信支付 小黄最在工作中对接需要对接微信支付,在此记录一下微信支付开发的相关流程,望能帮助到各位 前期准备 由于小黄是小程序端需要对接微信支付,需要注册小程序等,小黄会一一列举出来 小程序注册 所需文件 没有注册过微信…

私有云盘:lamp部署nextcloud+高可用集群

目录 一、实验准备: 二、配置mariadb主从复制 三台主机下载mariadb 1)主的操作 2)从的操作 3)测试数据是否同步 三、配置nfs让web服务挂载 1、安装 2、配置nfs服务器 3、配置web服务的httpd 4、测试 四、web 服务器 配…

排序篇(三)----交换排序

排序篇(三)----交换排序 1.冒泡排序 基本思想: ​ 通过不断地比较相邻的元素,将较大的元素往后移动,从而实现排序的目的。 具体的步骤如下: 从待排序的数组中选择相邻的两个元素进行比较,如果前一个元素大于后一个元素&#…

ParagonNTFSforMac_15.5.102中文版最受欢迎的NTFS硬盘格式读取工具

Paragon NTFS for Mac是一款可以为您轻松解决Mac平台上不能识别Windows通用的NTFS文件难题,这是一款强大的Mac读写工具,相信在很多时候,Mac用户需要对NTFS文件的移动硬盘进行写入,但是macOS系统默认是不让写入的,使用小…

Nginx与Spring Boot的错误模拟实践:探索502和504错误的原因

文章目录 前言502和504区别---都是Nginx返回的access.log和error.log介绍SpringBoot结合Nginx实战502 and 504准备工作Nginx配置host配置SpringBoot 502模拟access.logerror.log 504模拟access.logerror.log 500模拟access.logerror.log 总结 前言 刚工作那会,最常…

Jmeter基础篇

1.性能测试指标 【虚拟用户数】:线程用户 【并发数】:指在某一时间,一定数量的虚拟用户同时对系统的某个功能进行交互,一般通过集合点实现 【事务】:事务代表一个完整的功能,一个接口可以是事务,多个接口…

第八章 排序 三、希尔排序

目录 一、算法思想 二、例子 三、代码实现 五、验证 六、空间复杂度 七、时间复杂度 八、稳定性 一、算法思想 先追求表中元素部分有序,在逐渐逼近表中元素全部有序。 二、例子 1、我们要升序排列此表 2、取一个差值作为子表的划分的条件,希尔本…

医疗器械标准目录汇编2022版共178页(文中附下载链接!)

为便于更好地应用医疗器械标准,国家药监局医疗器械标准管理中心组织对现行1851项医疗器械国家和行业标准按技术领域,编排形成《医疗器械标准目录汇编(2022版)》 该目录汇编分为通用技术领域和专业技术领域两大类,通用…

【逐步剖C】-第十一章-动态内存管理

一、为什么要有动态内存管理 从我们平常的学习经历来看,所开辟的数组一般都为固定长度大小的数组;但从很多现实需求来看需要我们开辟一个长度“可变”的数组,即这个数组的大小不能在建立数组时就指定,需要根据某个变量作为标准。…

分词.join 保存txt

要求 分词.join 保存txt 第1种方法 分词.join 保存txt input多行文本 /storage/emulated/0/数据中心/txt没有就新建为什么会想到这么做 1. 是因为有分词文件📄要处理 2. 对各种词语和线索进行分类 3. 解释一下生活中不常见的现象,但是深刻的符合社会…