单片机硬件和软件延时、RTOS相对延时和绝对延时

news2024/11/24 6:57:49

已剪辑自: https://mp.weixin.qq.com/s/-RPLQn4KO9Aqu1fpfZeOKA

前不久有个读者在问关于延时的问题,大概就是问:软件延时和硬件延时是啥意思?做项目时他俩有什么区别?
今天就来讲讲关于硬件延时和软件延时的内容,以及它们的区别。

延时的种类很多,先给大家普及一下延时相关概念和分类。

指利用具有计数功能的硬件进行延时。

比如:定时器(Timer)、 实时时钟(RTC)、 系统滴答定时器(SysTick)等具有计数功能的硬件。

相对硬件延时而言,软件延时就是写一段软件代码,通过消耗CPU时间进行延时。

比如软件延时函数:

void Delay(uint32_t Cnt){  uint32_t i;
  while(Cnt--)  {    for(i=0; i<0x80000; i++);  }}

实际应用中,延时分阻塞和非阻塞延时。

指CPU一直停留阻塞,不去做其它事情,直到延时结束结束。

像上面那个软件延时(Delay)就是一个典型的阻塞延时,一直消耗CPU,直到延时结束。

指在延时期间,没有阻塞CPU,也就是说CPU在延时期间可以执行其它代码。

比如:利用定时器中断延时,只需要开启定时器,在中断(计数)到来之前,CPU可以执行其它代码。

a.利用定时器也能实现阻塞延时,比如STM32的HAL自带的阻塞延时:

__weak void HAL_Delay(uint32_t Delay){  uint32_t tickstart = HAL_GetTick();  uint32_t wait = Delay;
  /* Add a freq to guarantee minimum wait */  if (wait < HAL_MAX_DELAY)  {    wait += (uint32_t)(uwTickFreq);  }
  while ((HAL_GetTick() - tickstart) < wait)  {  }}

b.利用RTOS自带的系统延时实现非阻塞延时,这个实现原理实际是利用了硬件延时(系统滴答定时器)。

当然,这个延时的原理(延时函数代码)相对比较复杂,对于普通用户只需要知道如何调用以及简单原理即可,感兴趣的老铁可以自行研究一下。

通常在一些RTOS的(Demo)例子的任务中都有系统延时,比如ucos非阻塞延时:

OSTimeDly(10);

图片

再比如FreeRTOS非阻塞延时:

vTaskDelay(10);

图片

关于RTOS的延时,这里额外拓展一下关于RTOS中的相对延时和绝对延时的内容,请移步至文章《RTOS中相对延时和绝对延时的区别

通过以上分析,其实不难得出,硬件延时相对软件延时更普遍。

1.软件相对硬件延时精度更差;

2.软件延时为阻塞延时,硬件延时可阻塞,也可非阻赛延时;

3.硬件延时应用更灵活、更广泛;


已剪辑自: https://mp.weixin.qq.com/s?__biz=MzI4MDI4MDE5Ng==&mid=2247513149&idx=2&sn=90586ddd99a0871745e5e57c3a6b1cfb&chksm=ebb819d6dccf90c008aeb35e6de7eb24f9ec39c8d7ae27b8613f89822a626f942fb8d3482c3d&scene=21#wechat_redirect

嵌入式软件代码中延时是很常见的,只是延时种类有很多,看你用什么延时。

**问题:**周期性(固定一个时间)去处理某一件事情。你会通过什么方式去实现?

比如:间隔10ms去采集传感器的数据,然后通过一种算法计算出一个结果,最后通过串口发送出去。

可能对于很多习惯裸机编程的读者,首先想到的是:利用定时器,定时10ms中断,在中断里面处理。
中断函数适合处理简单数据,不适合算法、通信等需要长时间占用CPU的处理。
对计时精度要求比较高的地方适合定时器,像本章节说的周期性采集传感器数据,要求不适合很高,那么就引入本文说的绝对延时。
在实时操作系统FreeRTOS任务中,利用vTaskDelayUntil绝对延时即可完美解决这个问题。

本文拿FreeRTOS中相对延时函数vTaskDelay,绝对延时函数vTaskDelayUntil来说明。

**相对延时:**指每次延时都是从执行函数vTaskDelay()开始,直到延时指定的时间(参数:滴答值)结束。

**绝对延时:**指每隔指定的时间(参数:滴答值),执行一次调用vTaskDelayUntil()函数的任务。

文字描述可能不够直观理解,下面章节结合代码例子、延时值(IO高低变化波形)、任务执行图来详细讲述一下他们的区别。

以实际代码为例说明:一个任务中,添加一个10ms系统延时,然后,在执行任务(耗时1ms左右,例子以延时代替)。
相对延时代码:图片
绝对延时代码:****图片
**1.**TestDelay这个延时函数仅仅用于测试(延时1ms),用于代替采集、算法、发送等耗时时间。
**2.**两个代码唯一区别在于系统延时不同,一个vTaskDelay(10);,一个vTaskDelayUntil(&xLastWakeTime, 10);
**3.**系统时钟频率为1000,也就是上面系统延时10个滴答,即10ms。
**看到代码,你想到了他们输出结果的差异吗?来看下结果的差异:用PA0这个引脚输出的高低电平,得出延时时间。
相对延时结果:图片

绝对延时结果:图片****结果为:**相对延时的周期为系统延时10ms + 执行任务1ms的时间,总共11ms时间。绝对延时的周期即为10ms时间.
如果上面的区别还没明白,再来讲一个更容易理解的区别,通过文字 + 任务执行图来说明。

1.相对延时先看任务执行图,按照上面代码的方式呈现:图片这里会牵涉到操作系统任务切换、高优先级任务抢占等一些原理,若不了解,请转移直到了解再回来。
上电,TEST任务进入延时(阻塞)状态,此时系统执行其他就绪任务。FreeRTOS内核会周期性的检查TEST任务的阻塞是否达到,如果阻塞时间达到,则将TEST任务设置为就绪状态,如果就绪任务中TEST任务的优先级最高,则会抢占CPU,再次执行任务主体代码,不断循环。
TEST任务每次系统延时都是从调用延时函数vTaskDelay()开始算起的,所以叫相对延时。

**从上图可以看出:**如果执行TEST任务的过程中发生中断,或者具有更高优先级的任务抢占了,那么TEST任务执行的周期就会变长,所以使用相对延时函数vTaskDelay(),不能周期性的执行TEST任务。

2.绝对延时**图片**代码中定义的变量xLastWakeTime,其实是用来保存上一次的系统计数器值(方便检测下一个延时时间是否到来)。
和上面相对延时程序执行图比较,可以看出,系统延时的时间包含了程序执行的时间。即时中途有中断,或更高优先级任务打断,不会影响下一次执行的时间(也就是这个周期不会变,当然,打断时间不能超过系统延时值)。

**提示:**图片中添加了一段话:一般来说,程序执行时间要小于总间隔时间(10ms)。
如果打断时间太长,回来之后延时都超过了,则会立马执行程序,不会再延时(任务不会再阻塞延时)。

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

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

相关文章

[GitHub]将本地文件上传远程仓库(安装,创建SSHKey,上传远程仓库)

目录 什么是GitHub 注册账户以及创建仓库 安装Git 配置Git ​编辑 将本地项目上传远程仓库 创建本地仓库 创建远程仓库 克隆远程仓库到本地 什么是GitHub github是一个基于git的代码托管平台&#xff0c;付费用户可以建私人仓库&#xff0c;我们一般的免费用户只能使用公共…

Android 动画实现 从基础到自定义

1. 基础使用 由于是继承了ValueAnimator类 所以使用的方法十分类似&#xff1a;XML 设置 / Java设置1.1 Java设置 ObjectAnimator animator ObjectAnimator.ofFloat(Object object, String property, float ....values); // Object object&#xff1a;需要操作的对象 // Str…

【SpringCloud负载均衡】【源码+图解】【二】LoadBalancer配置

【SpringCloud负载均衡】【源码图解】【一】LoadBalancer的HelloWorld体验 目录2. LoadBalancer的配置2.1 config.LoadBalancerAutoConfiguration2.2 BlockingLoadBalancerClientAutoConfiguration2.3 LoadBalancerEurekaAutoConfiguration2.4 loadbalancer.LoadBalancerAutoCo…

[附源码]Python计算机毕业设计SSM建筑材料采购管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

引擎入门 | Unity UI简介–第2部分(5)

本期我们继续为大家进行Unity UI简介&#xff08;第二部分&#xff09;的后续教程 本篇内容 9.设置动画对话框 文章末尾可免费获取教程源代码 本篇本篇Unity UI简介&#xff08;第二部分&#xff09;篇幅较长&#xff0c;分为八篇&#xff0c;本篇为第五篇。 9.设置动画对…

css:css属性pointer-events实现点击穿透

文档 https://developer.mozilla.org/zh-CN/docs/Web/CSS/pointer-events pointer-events CSS 属性指定在什么情况下 (如果有) 某个特定的图形元素可以成为鼠标事件的 target 常用属性 /* Keyword values */ pointer-events: auto; /* 与pointer-events属性未指定时的表现效…

jsp+servlet+mysql实现的学生签到考勤请假管理系统源码+教程

今天给大家演示一下由jsp servlet mysql实现的一款学生签到管理系统&#xff0c;系统主要分管理员、学生、辅导员、教师等角色登录&#xff0c;实现学生发起请假、教师辅导员审批等动作&#xff0c;该项目不仅源码完整&#xff0c;还带有完整的论文文档&#xff0c;数据库设计说…

Linux下普通用户(非root用户)安装Java,Java程序能编译不能运行的原因

Linux下普通用户&#xff08;非root用户&#xff09;安装Java1. 下载2. 解压缩3. 修改环境变量4. 验证5. 第一个Java程序1. 下载 根据自己的系统&#xff0c;从官网上直接下载即可。本文以jdk-8u202-linux-x64.tar.gz为例。 2. 解压缩 使用以下命令解压 tar -zxvf jdk-8u2…

【Python自然语言处理+tkinter图形化界面】实现智能医疗客服问答机器人实战(附源码、数据集、演示 超详细)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一、问答智能客服简介 QA问答是Question-and-Answer的缩写&#xff0c;根据用户提出的问题检索答案&#xff0c;并用用户可以理解的自然语言回答用户&#xff0c;问答型客服注重一问一答处理&#xff0c;侧重知识的推理。 …

Yolov5 中添加Network Slimming剪枝--稀疏训练部分

前言&#xff1a;Network Slimming剪枝过程让如下 1. 稀疏化 2. 剪枝 3. 反复迭代这个过程 一、稀疏化&#xff1a; 通过Network Slimming 的核心思想是:添加L1正则来约束BN层系数&#xff0c;从而剪掉那些贡献比较小的通道channel 原理如下&#xff1a;BN层的计算是这样的…

如何理解UML2.5.1(02篇)

为了避免使大家产生畏难情绪&#xff0c;本节先讲一个相对简单又相对普遍的问题。先看UML2.5.1中第13.2.3.5的如下内容&#xff1a; A Behavior shall be the method for no more than one BehavioralFeature, called its specification. 翻译过来就是&#xff1a; 一个行为应该…

[附源码]Python计算机毕业设计SSM家政服务系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

2093197-94-3,DBCO-BODIPY FL,二苯并环辛炔-BODIPY FL点击化学染料环辛炔

【中文名称】氟化硼二吡咯二苯并环辛炔&#xff0c;二苯并环辛炔-BODIPY FL 【英文名称】 DBCO-BODIPY FL&#xff0c;BDP FL DBCO 【结 构 式】 【CAS号】2093197-94-3 【分子式】C32H29BF2N4O2 【分子量】550.42 【基团部分】DBCO部分 【纯度标准】95% 【包装规格】5g&#x…

【校招VIP】线上实习 推推 书籍详情模块 产品脑图周最佳

【推推】主要是为校招设计的小说一更新就通知的项目&#xff0c;每个模块都具有亮点和难点&#xff0c;项目表现为手机网站应用&#xff0c;可嵌入小程序或APP中。 恭喜来自 太原理工大学 的 星晚&#x1f31f; 同学获得本周线上实习【推推】第一期 书籍详情模块 产品脑图设计…

kubernetes编排文件示例

kubernetes编排文件示例 编排文件生成网址&#xff1a;https://www.kubebiz.com/ mysql单机 需要一个配置文件,内容不会就用默认的即可 my.cnf [mysqld]pid-file /var/run/mysqld/mysqld.pid socket /var/run/mysqld/mysqld.sock datadir /var…

Python制作GUI学生管理系统,不会的看这里

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 欢迎观看本篇文章呀~不管你是学生还是工作人 我相信你进来了你就是想实现这个案例的 学会以后&#xff0c;还可以去接一些小小的外包&#xff0c;又是挣钱的一天~ 那么就开始实现吧&#xff01;python制作GUI 学生管理系…

Curve 块存储应用实践 -- iSCSI

Curve 是云原生计算基金会 (CNCF) Sandbox 项目&#xff0c;是网易数帆发起开源的高性能、易运维、云原生的分布式存储系统。 为了让大家更容易使用以及了解 Curve&#xff0c;我们期望接下来通过系列应用实践文章&#xff0c;以专题的形式向大家展示 Curve。 本篇文章是Curv…

activiti框架搭建及问题记录

activiti应用什么是activitiactiviti配置首先创建项目配置pom依赖配置文件那么审批&#xff08;流程&#xff09;怎么创建呢&#xff1f;流程启动任务处理activiti问题分享数据库创建问题activiti事件监听器没有对象的问题什么是activiti activiti是一个业务流程管理的框架&am…

LeetCode中等题之使括号有效的最少添加

题目 只有满足下面几点之一&#xff0c;括号字符串才是有效的&#xff1a; 它是一个空字符串&#xff0c;或者 它可以被写成 AB &#xff08;A 与 B 连接&#xff09;, 其中 A 和 B 都是有效字符串&#xff0c;或者 它可以被写作 (A)&#xff0c;其中 A 是有效字符串。 给定一…

开发工具系列IDEA:配置注释自动生成

一、类、接口、枚举配置&#xff0c;进入idea后&#xff0c;依次打开 File -> Settings -> Editor -> File and Code Templates -> Files /*** FileName: ${NAME}* Author: ${USER}* Date: ${DATE} ${TIME}* Description: ${DESCRIPTION}* History:* <aut…