【小黑嵌入式系统第十二课】μC/OS-III程序设计基础(二)——系统函数使用场合、时间管理、临界区管理、使用规则、互斥信号量

上一课:
【小黑嵌入式系统第十一课】μC/OS-III程序设计基础(一)——任务设计、任务管理(创建&基本状态&内部任务)、任务调度、系统函数

文章目录

    • 一、系统函数使用场合
      • 1.1 时间管理
        • 1.1.1 控制任务的执行周期
        • 1.1.2 控制任务的运行节奏
        • 1.1.3 状态查询
      • 1.2 资源同步
        • 1.2.1 “资源同步”图解
        • 1.2.2 “资源同步” 实现方式
      • 1.3 行为同步
        • 1.3.1 行为同步
        • 1.3.2 数据通信
    • 二、时间管理
      • 2.1 概述
      • 2.2 `OSTimeDly()`
      • 2.3 `OSTimeDlyHMSM()`
      • 2.4 `OSTimeDlyResume()`
      • 2.5 `OSTimeGet()`、`OSTimeSet()`
    • 三、临界区管理
      • 3.1 进入然后退出临界区
      • 3.2 禁止然后允许调度
    • 四、事件的一般使用规则
      • 4.1 相似性
      • 4.2 先创建后使用
      • 4.3 配对使用
      • 4.4 在ISR中使用
    • 五、互斥信号量
      • 5.1 简介
      • 5.2 资源同步


一、系统函数使用场合

1.1 时间管理

1.1.1 控制任务的执行周期

在任务函数的代码中可以通过插入延时函数来控制任务周期性运行,定时闲置CPU一段时间,供其它任务使用。

在这里插入图片描述

注意:延时函数OSTimeDly()是以系统节拍数为参数,而延时函数OSTimeDlyHMSM()是以实际时间值为参数,但在执行过程中仍然转换为系统节拍数。如果实际时间不是系统节拍的整数倍,将进行四舍五入处理。设系统节拍为50毫秒,调用OSTimeDly(20)的效果是延时1秒钟,调用OSTimeDlyHMSM(0,1,27,620)的实际时间是延时1分27秒600毫秒。


1.1.2 控制任务的运行节奏

在任务函数的代码中也可以通过插入延时函数来控制任务的运行节奏。

在这里插入图片描述


1.1.3 状态查询

查询过程是一个无限循环过程,只有当希望的状态出现以后才能退出这个无限循环,这种情况在实时操作系统管理下是不允许的,它将剥夺低优先级任务的运行机会。解决这个问题的办法是“用定时查询代替连续查询” 。

在这里插入图片描述


1.2 资源同步

1.2.1 “资源同步”图解

在这里插入图片描述


1.2.2 “资源同步” 实现方式
  1. 使用关中断:通过调用禁止中断函数OS_CRITICAL_ENTER()和允许中断函数OS_CRITICAL_EXIT()实现的。
  2. 使用关调度:通过调用禁止任务调度函数OSSchedLock()和允许任务调度函数OSSchedUnlock()实现的,因为禁止调度违背了多任务的初衷,所以不建议用户使用。
  3. 使用信号量与互斥信号量:通过等待信号量和发送信号量实现共享资源的独享。

1.3 行为同步

1.3.1 行为同步

一个任务的运行过程需要和其它任务的运行配合,才能达到预定的效果,任务之间的这种动作配合和协调关系称为“行为同步”。

在这里插入图片描述


1.3.2 数据通信

在这里插入图片描述
注意:尽管指针可能是局部变量,但只要指针指向的变量是全局变量,操作指针指向的变量时也需要当作全局变量来处理。


二、时间管理

2.1 概述

μC/OS-III提供了若干个时间管理服务函数,可以满足任务在运行过程中对时间管理的需求。在使用时间管理服务函数时,必须十分清楚一个事实:时间管理服务函数是以系统节拍为处理单位的,实际的时间与希望的时间是有误差的,最坏的情况下误差接近一个系统节拍。因此时间管理服务函数只能用在对时间精度要求不高的场合,或者时间间隔较长的场合。


2.2 OSTimeDly()

系统延时函数OSTimeDly()调用图解:

在这里插入图片描述

下面我们设计一个任务,让一个LED以50个时钟节拍为单位闪烁,说明OSTimeDly()函数的用途。由于篇幅关系,只给出任务主要处理代码。

在这里插入图片描述

注意:上面的设计是OSTimeDly() 控制任务的周期性执行,还可以用它来控制任务的运行节拍。


2.3 OSTimeDlyHMSM()

μC/OS-III提供了OSTimeDlyHMSM()系统延时函数,这个函数是以小时(H)、分(M)、秒(S)和毫秒(m)四个参数来定义延时时间的,函数在内部把这些参数转换为时钟节拍,再通过单次或多次调用OSTimeDly()进行延时和任务调度,所以延时原理和调用延时函数OSTimeDly()是一样的。

为了说明OSTimeDlyHMSM()函数的使用方法,下面我们设计一个任务,让一个LED以2Hz的频率闪烁。下面给出任务主要处理代码。

在这里插入图片描述

注意:上面的设计是**OSTimeDlyHMSM()**控制任务的周期性执行,还可以用它来控制任务的运行节拍。


2.4 OSTimeDlyResume()

µC/OS-III允许用户结束任务正处于的延时期,延时的任务可以不等待延时期满,而是通过其它任务取消其延时来使其处于就绪态,通过调用OSTimeDlyResume()和指定要恢复的任务来完成。

在这里插入图片描述

为了说明OSTimeDlyResume()函数的使用方法,我们设计一个系统。TaskLED任务让一个LED以0.5Hz的频率闪烁;按键任务处理按键事件,每按键一次,LED状态立即翻转一次。下面是两个任务的处理流程。

在这里插入图片描述
TaskLED任务代码如下:

在这里插入图片描述
TaskKEY任务的代码如下:

在这里插入图片描述


2.5 OSTimeGet()OSTimeSet()

无论时钟节拍何时发生,µC/OS-III都会将一个32位的计数器加1,这个计数器在用户调用OSStart()初始化多任务时和4,294,967,295个节拍执行完一遍的时候从0开始计数。

在这里插入图片描述

用户可以通过调用OSTimeGet()来获得该计数器的当前值, OSTimeGet()的详细信息见下表。

在这里插入图片描述
在这里插入图片描述

用户可以通过调用OSTimeSet()来改变计数器的值,OSTimeSet()的详细信息见下表。

在这里插入图片描述
在这里插入图片描述

为了说明OSTimeGet()函数的使用方法,我们设计一个任务,计算两次按键的时间间隔放在全局变量ktime中。下面是任务的处理流程。

在这里插入图片描述
TaskKEY任务代码如下:

在这里插入图片描述


三、临界区管理

3.1 进入然后退出临界区

进入然后退出临界段是“资源同步”的方法之一,能够在访问共享资源时保障信息的可靠性和完整性。

在这里插入图片描述

为了说明它在”资源同步”时的使用,我们设计一个系统,假设有两个任务,它们都对全局变量sum1和sum2操作。低优先级任务让这两个变量始终相等,并不断在计数;高优先级任务不断的判断这两个变量是否相等,不相等则点亮LED,下面是两个任务的处理流程。

在这里插入图片描述
TaskLED任务代码如下:

在这里插入图片描述

TaskAdd任务代码如下:

在这里插入图片描述


3.2 禁止然后允许调度

给调度器上锁OSSchedlock()函数用于禁止任务调度,直到任务完成后调用给调度器开锁OSSchedUnlock()函数为止。使用它有3点需要注意。

  1. OSSchedlock()OSSchedUnlock()必须成对使用,也可以嵌套使用;
  2. OSSchedlock()只是禁止了任务的调度,而没有禁止中断,此时如果允许中断,中断到来时还是会执行对应的中断服务程序;
  3. 调用OSSchedLock()以后,用户的应用程序不得使用任何能将现行任务挂起的系统调用,直到配对的OSSchedUnlock()调用为止。

注意:对于用户来说,极少使用禁止然后允许调度的方法。不过,很多操作系统内部和驱动程序使用它来减少中断响应时间。


四、事件的一般使用规则

4.1 相似性

事件管理函数是μC/OS-III中最多的系统函数,而且每种事件具有的管理函数数目不同。但是所有的事件都有类似的4个函数,它们是所有事件的基本功能,其函数名类似,使用方法也类似,详细函数见下表。

在这里插入图片描述


4.2 先创建后使用

任何一个事件,必须先创建后使用。创建事件是通过调用函数OS???Create()实现的,其中???为事件的类型。创建事件可以在main()函数中,但更多的是在任务初始化部分。使用方法如下。

在这里插入图片描述

一般来说,在嵌入式系统中,事件是静态使用的,即创建后永远不删除。但有时候需要动态使用,即根据需要创建和删除事件,此时创建事件就是在任务的事件执行代码中,使用方法如下。

在这里插入图片描述


4.3 配对使用

下面给出一个示例,假设Task0为高优先级任务,Task1为低优先级任务。 Task0代码如下。

在这里插入图片描述
Task1代码如下:

在这里插入图片描述


4.4 在ISR中使用

要掌握事件函数在中断服务程序中的调用规则,我们必须清楚中断服务有哪些特点。

  • 中断与所有的任务异步
  • 中断服务程序总体是顺序结构
  • 中断服务程序需要尽快退出
  • 中断服务程序不能等待

下面给出事件在中断服务程序中使用方法,假设Task0任务接收ISR发送的消息,任务代码如下。

在这里插入图片描述
ISR中的代码如下:

在这里插入图片描述

注意:

  1. 中断服务程序一般不会调用建立和删除事件函数,否则要么没有起到事件的作用,要么程序很复杂;
  2. 中断服务程序不能调用等待事件的函数,否则可能造成程序崩溃。

五、互斥信号量

5.1 简介

在日常生活中,出租车是一种常用的共享资源,当出租车载客时,从外面可以看到标识为载客;当空闲时,标识为空车。这样等车的人就可以根据标识知道出租车的当前状态,判断是否能够座上这辆车。这个标识牌就是一个二值信号量。由于这种二值信号量可以实现对共享资源的独占式处理,所以叫做互斥信号量。

在这里插入图片描述

互斥信号量也称为mutex,专用于资源同步。互斥信号量具有一些特性:占用一个空闲优先级,以便解决优先级反转问题。

假设任务1和任务3共享一个资源,任务2为优先级介于任务1和任务3之间的一个与该共享资源无关任务,分析优先级反转问题。

在这里插入图片描述

此时,只要任务3没有释放共享资源,即使任务1比任务2优先级更高,但却在任务2之后运行,这种现象就是优先级反转。
并且在任务1等待共享资源期间,任务2就绪时可剥夺任务3的运行,导致额外增加了任务1的等待时间,这被称为无界优先级反转,因任何一个(介于任务1、3之间的)中等优先级的任务都可以延长任务1的等待时间。

假设任务1和任务3共享一个资源,使用互斥信号量进行资源同步,任务2为优先级介于任务1和任务3之间的一个与该共享资源无关任务,通过互斥信号量解决优先级反转问题。

在这里插入图片描述

此时,任务2无法在任务1之前得到运行,不发生优先级反转

综上所述,可以说能防止优先级反转现象的信号就是互斥信号量。

使用互斥信号量有以下3点需要注意:

  1. 在嵌入式系统中,经常使用互斥信号量访问共享资源来实现资源同步。而用来实现资源同步的互斥信号量在创建时初始化,这是由OSMutexCreate ()函数来实现的;

  2. OSMutexPost ()发送互斥信号量函数与OSMutexPend ()等待互斥信号量函数必须成对出现在同一个任务调用的函数中,因此我们需要编写一个公共的库函数,因为有多个任务可能调用这个函数 ;

  3. 信号量最好在系统初始化的时候创建,不要在系统运行的过程中动态地创建和删除。在确保成功地创建信号量之后,才可对信号量进行接收和发送操作。


5.2 资源同步

为了说明使用互斥信号量访问共享资源实现资源同步,设计两个任务,它们在不同的音符按键按下期间让DAC输出不同的音符声音,要求这两个任务不会互相干扰。下面是两个任务的处理流程。

在这里插入图片描述

为了实现资源同步,我们需要保证OSMutexPost()OSMutexPend()成对出现在同一个任务函数中,所以我们编写一个库函数DAC()供两个任务调用,代码如下。

在这里插入图片描述

下面给出两个DAC任务的主要处理代码:

在这里插入图片描述

使用互斥信号量做共享资源的管理,可参考示例程序:“Micrium_CY8CKIT-050B_uCOS-III-LCDMutex_GNU(PSoC Creator 4.0).rar”

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS新手入门笔记整理:CSS3弹性盒模型

特点 子元素宽度之和小于父元素宽度,所有子元素最终的宽度就是原来定义的宽度。子元素宽度之和大于父元素宽度,子元素会按比例来划分宽度。在使用弹性盒子模型之前,必须为父元素定义“display:flex;”或“display:inline-flex;”。 弹性盒子…

一款基于.NET Core的快速开发框架、支持多种前端UI、内置代码生成器

前言 经常看到有小伙伴在技术群里问有没有什么好用且快速的开发框架推荐的,今天就给大家分享一款基于MIT License协议开源、免费的.NET Core快速开发框架、支持多种前端UI、内置代码生成器、一款高效开发的利器:WalkingTec.Mvvm框架(简称WTM…

CyclicBarrier实战应用——实现异步多线程业务处理,异常情况回滚全部子线程

😊 作者: 一恍过去 💖 主页: https://blog.csdn.net/zhuocailing3390 🎊 社区: Java技术栈交流 🎉 主题: CyclicBarrier实战应用——实现异步多线程业务处理,异常情况…

Linux笔记本电脑投屏到电视,用网页浏览器就能投屏到电视!

Linux系统的电脑如果要投屏到安卓电视屏幕上,可以使用投屏工具AirDroid Cast的网页版和TV版一起实现。 首先,在Linux系统的电脑里用chrome浏览器或edge浏览器打开网址webcast.airdroid.com。这个网址就是AirDroid Cast的网页版。你可以看到中间白色框框的…

Canal使用详解

Canal介绍 Canal是阿里巴巴开发的MySQL binlog增量订阅&消费组件,Canal是基于MySQL二进制日志的高性能数据同步系统。在阿里巴巴集团中被广泛使用,以提供可靠的低延迟增量数据管道。Canal Server能够解析MySQL Binlog并订阅数据更改,而C…

cilium原理之ebpf尾调用与trace

背景 在深入剖析cilium原理之前,有两个关于epbf的基础内容需要先详细介绍一下: 1. ebpf尾调用 尾调用类似于程序之间的相互跳转,但它的功能更加强大。 2. trace 虽然之前使用trace_printk输出日志,但这个函数不能多用&#x…

使用StableDiffusion进行图片Inpainting原理

论文链接:RePaint: Inpainting using Denoising Diffusion Probabilistic Models代码链接:RePaint Inpainting任务是指在任意一个二进制的掩码指定的图片区域上重新生成新的内容,且新生成的内容需要和周围内容保持协调。当前SOTA模型用单一类…

高级算法设计与分析(四) -- 贪心算法

系列文章目录 高级算法设计与分析(一) -- 算法引论 高级算法设计与分析(二) -- 递归与分治策略 高级算法设计与分析(三) -- 动态规划 高级算法设计与分析(四) -- 贪心算法 高级…

FATFS文件系统

文件系统是为了存储和管理数据,而在存储设备上建立的一种组织结构。 Windows常用的文件系统: 1、FAT12 2、FAT16 3、FAT32 4、exFAT 5、NTFS FAT:File Alloction Table 文件分配表 在小型的嵌入式存储设备大多…

Ubuntu 常用命令之 ping 命令用法介绍

📑Linux/Ubuntu 常用命令归类整理 ping命令是一种网络诊断工具,用于测试主机之间网络的连通性。它发送ICMP Echo Request消息到指定的网络主机,并等待接收ICMP Echo Reply。通过这种方式,我们可以知道两台主机之间的网络是否畅通…

pycharm修改项目文件夹名称

目录 1 修改项目文件夹名称 2 修改代码中的项目名称 1 修改项目文件夹名称 选中项目文件夹,右键,选择refactor-rename。 选择rename project: 然后输入新的项目名称。 此时进入资源管理器,修改项目文件夹的名字,完成…

IntelliJ IDEA 2023.3 新功能介绍

IntelliJ IDEA 2023.3 在众多领域进行了全面的改进,引入了许多令人期待的功能和增强体验。以下是该版本的一些关键亮点: IntelliJ IDEA mac版下载 macappbox.com/a/intellij-idea-for-mac.html 1. AI Assistant 的全面推出 IntelliJ IDEA 2023.3 中&am…

ES-mapping

类似数据库中的表结构定义,主要作用如下 定义Index下的字段名( Field Name) 定义字段的类型,比如数值型、字符串型、布尔型等定义倒排索引相关的配置,比如是否索引、记录 position 等 index_options 用于控制倒排索记录的内容,有如…

钓鱼与木马实践(仅供参考不可实践)

声明:内容仅供学习,请勿违法使用,违者后果自负 一.部署云服务器 购买一台云服务器,Windows( 中文 )版本即可 华为云官网:https://www.huaweicloud.com/ 登录后进入控制台购买完成后远程登录云服务器 二.部署WEB运行…

QQ群发邮件的技巧?QQ邮箱邮件群发怎么发?

QQ群发邮件怎么设置?QQ邮件群发必备利器有哪些? QQ群发邮件,作为当下最流行的通讯方式之一,已经被广大网友所熟知。但是,要想真正掌握QQ群发邮件的技巧,却不是一件容易的事情。下面,就让蜂邮ED…

【Linux笔记】系统信息

🍎个人博客:个人主页 🏆个人专栏:Linux学习 ⛳️ 功不唐捐,玉汝于成 目录 前言 命令 1. uname - 显示系统信息 2. hostname - 显示或设置系统主机名 3. top - 显示系统资源使用情况 4. df - 显示磁盘空间使用情…

Qt通用属性工具:随心定义,随时可见(一)

一、开胃菜&#xff0c;没图我说个DIAO 先不BB&#xff0c;给大家上个效果图展示下&#xff1a; 上图我们也没干啥&#xff0c;几行代码&#xff1a; #include "widget.h" #include <QApplication> #include <QObject> #include "QtPropertyEdit…

pmp到底是什么?

一、PMP是什么 PMP 是项目管理的入门级证书&#xff0c;全称是项目管理专业人士资格认证&#xff0c;由美国项目管理协会&#xff08;PMI&#xff09;举办的&#xff0c;从1999 年到现在已经有20多年发展历史了。 顾名思义&#xff0c;PMP考试就是一场评估应试者是否具备专业…

React学习计划-React16--React基础(五)脚手架创建项目、todoList案例、配置代理、消息订阅与发布

一、使用脚手架create-react-app创建项目 react脚手架 xxx脚手架&#xff1a;用来帮助程序员快速创建一个基于xxx库的模板项目 包含了所有需要的配置&#xff08;语法检查、jsx编译、devServe…&#xff09;下载好了所有相关的依赖可以直接运行一个简单的效果 react提供了一个…

红队打靶练习:DIGITALWORLD.LOCAL: MERCY V2

目录 信息收集 1、arp 2、netdiscover 3、nmap 4、nikto 5、whatweb 6、总结 目录探测 1、gobuster 2、dirsearch WEB enum4linux枚举工具 smbclient工具 knock工具 CMS 文件包含漏洞 Tomcat 提权 系统信息收集 本地提权 get root 信息收集 1、arp ┌──…