0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机开发过程中5种延迟代码执行的技术

科技观察员 来源:英锐恩 作者:英锐恩 2023-07-10 10:43 次阅读

单片机项目开发过程中,经常会出现一个有趣的问题,即弄清楚如何延迟代码执行。有时,[单片机开发]人员可能只是希望有10微秒的延迟,以使I/O线在读取之前稳定下来,或者可能希望在两次读取之间指定的时间间隔使它反跳。在本文中,我们将探讨五种延迟代码执行的技术。

一、条件循环

第一种技术是使用条件循环(可能是最常用和最简单的)。条件循环延迟通常会使用for、while或do

while循环重复执行无操作(NOP)指令。例如:

for(int i = 0; i < 100000; i++)

{

__NOP();

}

条件延迟在紧要关头可能会很有用,但很难准确或有效。如果开发人员要针对其他操作模式(例如低功耗操作)调整时钟频率,则延迟时间将完全不同。另外,总会有一个问题,那就是到底有多长时间?有人可能会认为这是100000条指令,但是每次通过循环时,都会有其他指令来检查循环变量并递增i。这些时序循环对于在任何生产代码中使用来说都是不可预测的。

二、使用计时器

可以使用的第二种技术是利用单片机内置的硬件计时器。通常有几种不同的硬件计时器可用于跟踪系统时间,生成波形,捕获输入和通用。如果开发人员需要延迟(例如10微秒),则可以向硬件计时器加载表示10微秒的计数值。在这种情况下,计时器将设置为单次计时器。该代码将启动计时器并等待计时器溢出标志被设置,然后该标志将指示时间已过。

该代码类似于以下内容:

Timer_Reload

(DELAY_VALUE );

while(Timer_Expired ()== false

{

__NOP ();

}

这种技术比条件循环要强大得多。它还具有更高的灵活性,并且可以更轻松地针对所需的延迟时间进行调整。实际上,可以在整个代码中重用该API,以允许单个计时器用于所需的任何数量的延迟。

三、使用系统刻度(HAL示例)

在某些情况下,可能没有专用的硬件计时器。在这种情况下,单片机开发人员可以利用板载系统时钟来创建延迟。即使是裸机系统,通常也具有作为系统时钟的后台计时器,以便从单片机启动的那一刻起,软件就具有时间参考。通常,在典型系统中,将这些系统时钟设置为每1或10毫秒发生一次。

系统通常使用一些API,这些API允许开发人员访问当前的系统刻度,例如SysTick_Get()。开发人员可以利用此延迟来创建类似于以下内容的延迟:

TimeStart =

SysTick_Get();

do

{

TimeNow = SysTick_Get();

TimeDelta = TimeNow – TimeStart;

}while(TimeDelta < DelayTime);

单片机开发人员只需要确保如果他们这样做,就不会陷入计算问题或其他潜在问题中,因此应检查边界条件。

四、使用RTOS产量函数

在使用实时操作系统(RTOS)的更高级的系统中,开发人员可以利用内置的RTOS

API调用来产生创建延迟的任务。例如,如果开发人员正在使用FreeRTOS,则在他们的任务中他们可以使用如下代码:

VTaskDelay

(1);

此延迟功能将使任务产生一个RTOS滴答声的当前任务。取决于配置,RTOS滴答可以设置为1毫秒或10。使用这样的延迟机制可能会出现问题,因为任务将在该时间段内产生CPU,但不能保证一旦系统滴答时间到期,该任务将是最高优先级的任务!如果任务是准备运行的最高优先级任务,则该任务仅在延迟后立即运行,因此延迟时间可能会有些抖动。

五、使用RTOS对象

使用RTOS对象来延迟时间。如果你仔细查看自己喜欢的RTOS中的对象(例如信号量、互斥对象和队列)的API,你会注意到大多数等待等待的API调用还将包含延迟时间。此延迟时间也可导致应用程序延迟。

与RTOS对象相关的是,大多数RTOS都还包含软定时器。这些是基于软件的计时器,是从运行中的硬件计时器触发的。然后,可以将与上面第一、二点中显示的技术相似的技术与这些软计时器一起使用,以在代码执行中产生延迟。

单片机开发人员想要延迟代码执行,可以使用多种不同的技术,使用的技术将取决于系统中可用的软件和硬件资源。然后,开发人员可以决定他们要使用的解决方案的复杂程度。总之,肯定有很多种机制可以帮助将代码执行延迟一定的时间。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620848
  • 单片机开发
    +关注

    关注

    2

    文章

    458

    浏览量

    19541
收藏 人收藏

    评论

    相关推荐

    单片机开发过程以及应用

    1-4VCD谍影托盘进出单片机软件开发是指为单片机编写程序,使单片机在程序的控制下,接收输入端送入的信号的信号并发出相应的控制信号,驱动硬
    发表于 07-06 11:13

    单片机开发过程中的常见问题

    单片机在组装与开发过程中总是会出现一些问题,导致过程不是那么顺利的完成。今日分享一些单片机常见问题的解决办法1.单片机EN8F609兼容PI
    发表于 09-11 16:33

    求大神指点在Linux下怎样去开发avr单片机环境?

    在Linux下怎样去开发avr单片机环境?开发过程中可能会遇到哪些问题?又如何去解决这些问题呢?
    发表于 07-07 06:00

    开发单片机过程中有哪些步骤

    就两个步骤,程序代码的编写与程序的烧录(将单片机程序写入开发板的ROM),分别在以下两款软件实现:Keil
    发表于 07-13 09:18

    请问atmel32单片机开发过程中常见的问题有哪些?

    请问atmel32单片机开发过程中常见的问题有哪些?
    发表于 09-18 06:43

    单片机开发过程中按键处理函数的实现方法

    **.**单片机开发过程中按键处理函数的实现​**.**方法一​ 这种方法在单片机处理反应不够好,当按键交替按时,会表现的不够好​voidKey_Scan(void){uint8_t
    发表于 11-22 06:03

    HC32L176KATA开发过程中地问题

    最近用华大 HC32L176KATA开发过程中发现一个问题,引脚PC11控制LED指示灯,调用函数Gpio_WriteOutputIO(GpioPortC, GpioPin11, x&
    发表于 12-06 06:50

    单片机开发过程中的Flash

    Flash在我们生活无处不在,比如:U盘、固态硬盘、SD卡、内存卡等。同时,在单片机开发过程中也会遇到各种各样的Flash,...
    发表于 12-09 08:00

    32位ARM处理器开发过程中调试技术的研究与分析

    32位ARM嵌入式处理器的调试技术摘要:针对32位ARM处理器开发过程中调试技术的研究,分析了目前比较流行的基于JTAG的实时调试技术,介绍了正在发展的嵌入式调试标准,并展望期趋势。关
    发表于 12-14 09:08

    谈一下在单片机开发过程中使用过的几种调试方案

    单片机开发过程中,有一个好的调试系统可以极大地提高开发效率。举个例子,做平衡系统时调节PID参数,你会选择 修改参数–>编译–>烧录–>运行–>修改…,还是做一个功能可以一边
    发表于 01-14 08:25

    单片机开发过程中怎样使用定时器进行定时及超时处理呢

    单片机开发过程中怎样使用定时器进行定时及超时处理呢?
    发表于 01-21 07:33

    单片机开发过程中硬件调试技巧

    本文结合作者在单片机开发过程中体会,讨论硬件调试的技巧。当硬件设计从布线到焊接安装完成之后,就开始进入硬件调试阶段
    发表于 06-01 16:09 1.4w次阅读

    单片机的主要作用_单片机开发过程

    本文首先介绍了单片机的主要作用,其次阐述了单片机的应用,最后介绍了单片机开发过程
    发表于 08-26 09:44 1.3w次阅读

    .单片机开发过程中按键处理函数的实现

    **.**单片机开发过程中按键处理函数的实现​ **.**方法一​ 这种方法在单片机处理中反应不够好,当按键交替按时,会表现的不够好​void Key_Scan(void
    发表于 11-13 12:36 16次下载
    .<b class='flag-5'>单片机</b><b class='flag-5'>开发过程中</b>按键处理函数的实现

    基于Energia的MPS430单片机开发过程中的问题

    基于Energia的MPS430单片机开发过程中的问题
    发表于 11-19 17:21 9次下载
    基于Energia的MPS430<b class='flag-5'>单片机</b><b class='flag-5'>开发过程中</b>的问题