已剪辑自: 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)。
如果打断时间太长,回来之后延时都超过了,则会立马执行程序,不会再延时(任务不会再阻塞延时)。

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

  1. 单片机硬件和软件延时是啥意思?

    软件延时和硬件延时是啥意思?做项目时他俩有什么区别? 今天就来讲讲关于硬件延时和软件延时的内容,以及它们的区别. 硬件和软件延时 延时的种类很多,先给大家普及一下延时相关概念和分类. 1.硬件延时 指 ...

  2. 软件与计算机硬件加密,51单片机程序进行软件加密和硬件解密的方法

    由于固化在片外EPROM 里的单片机程序容易复制,所以,如不在技术上采取保护措施,则程序中所采用的处理方法易被他人分析仿制.对单片机程序进行加密是一种有效的保护措施,也是一项实用的技术.虽然本身带有E ...

  3. _nop_在c语言里什么作用,单片机c语言中nop函数的使用方法和延时计算

    原标题:单片机c语言中nop函数的使用方法和延时计算 标准的C语言中没有空语句.但在 的C语言编程中,经常需要用几个空指令产生短延时的效果. 这在汇编语言中很容易实现,写几个nop就行了. 在C51中 ...

  4. 51单片机——硬件基础

    单片机--硬件基础知识 宗旨:技术的学习是有限的,分享的精神是无限的. 1.单片机内部资源 STC89C52:8KFLASH.512字节RAM.32个IO口.3个定时器.1个UART.8个中断源 (1 ...

  5. 按键消抖及原理(硬件和软件方法详解)

    在设计单片机按键输入的时候,进行按键消抖是防止按键输入被CPU误读多次的必要手段. 一.按键抖动 按键接法 抖动时间的长短由按键的机械特性决定,一般为5ms-10ms.这是一个很重要的时间参数,在很多 ...

  6. 单片机——硬件基础知识

    单片机--硬件基础知识 宗旨:技术的学习是有限的,分享的精神是无限的. 1.单片机内部资源 STC89C52:8KFLASH.512字节RAM.32个IO口.3个定时器.1个UART.8个中断源 (1 ...

  7. 腾讯云总裁邱跃鹏:新基建最大的改变是从硬件到软件的转变

    9月10日,腾讯副总裁.腾讯云总裁邱跃鹏在2020腾讯全球数字生态大会演讲中表示,未来经济呈现出三个趋势:新基建.新产业.新城市. 随着"新基建"进入爆发期,将进一步释放数字经济的 ...

  8. 《计算机组成与设计:硬件、软件接口》阅读笔记

    分享一些初次阅读时的记录,本文原是导图,我直接粘在了这 可读性一般,需要导图的朋友可以私,希望可以帮到大家快速搭起这本书的知识结构. 计算机组成与设计:硬件.软件接口####计算机概要与技术**引言* ...

  9. 算力和硬件的关系_硬件与软件:躯体与灵魂

    原标题:硬件与软件:躯体与灵魂 前言: 前一段时间特斯拉可付费在线激活后排座椅加热功能又叒叕上了全网热搜,许多人都称之为软件定义汽车的又一次科普.软件定义汽车这个论断已经开始深入人心! 那么未来汽车真 ...

最新文章

  1. 你的房东可能正用AI筛查你的犯罪记录,决定要不要租房给你
  2. SAP WM Storage Type下不允许负库存的设置
  3. 什么是REST?以及RESTful的实现之二
  4. hide subscribers is a good approach if you have a very limited subscribers
  5. 计算机组成原理 第四章 指令系统
  6. 51单片机的篮球计分器设计
  7. uniapp显示服务器请求超时,uniapp发布H5连接服务器超时
  8. 2020版本kali安装
  9. Apple个人开发者账号相关问题
  10. 重装系统(超详细教程)----大白菜教程
  11. 资料员培训建筑八大员培训建筑工程施工资料管理中存在的问题
  12. 双重检测加锁为什么要使用volitail_volitail关键字
  13. 2021四川省赛A,B,D,H,K
  14. ios上架图片在线制作_iOS、Windows 值得下载的 12 个新 App
  15. mysql数据库显示unknown option '-d' 错误的处理办法
  16. 有十个台阶,一步或两步走,上楼梯有几种上法?
  17. 新装电脑系统,会自动安装乱七八糟的软件问题处理法
  18. 12.郝斌C语言笔记——枚举
  19. 机械硬盘和固态硬盘的缓存是一样的吗?
  20. Multithreading C++ Out of Core Sotring for Massive Data|多线程C++的大规模数据外部排序

热门文章

  1. 网页 变黑白网页(灰色)
  2. LINQ编程之LINQ to SQL
  3. 地震地图告诉你,地震带离你家有多远?危险指数最高的城市竟然是……
  4. 女巫煎蛋(omelette for a witch)
  5. 对于程序员:如何处理干扰和打扰
  6. 如何在github的README中增加Badge标识
  7. android ftp 链接不上去,安卓手机无法连接电脑上的ftp(vsftpd)服务器
  8. 我对2021年前端团队的规划
  9. 创意十足的多媒体沙盘展示,为企业品牌宣传效果锦上添花
  10. HTML——超文本标记语言