欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

RTX5 | 时间延时

发布时间:2025/3/15 38 豆豆
生活随笔 收集整理的这篇文章主要介绍了 RTX5 | 时间延时 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

  • 一、前言
  • 二、API
    • 2.1、osDelay()
    • 2.2、osDelayUntil()

一、前言


RTX5提供两个延时API函数:

  • 相对延时osDelay(uin32_t ticks)
  • 绝对延时osDelayUntil(uint32_t ticks)
  • 无论哪一种时间延迟方式都难以避免线程被延时执行。当各个线程的优先级不一样时,RTX5执行可剥夺型线程管理。某个线程的延时时间到达时,很有可能有其他更高优先级的线程处于就绪态,或者产生ISR中断回调处理,此时线程就会被推迟执行。线程被推迟的时间肯定会波动的,比如某一次延时时间达到时,系统上并没有优先级更高的线程正处于就绪态,或者也没有ISR中断回调需要执行,这个理想的条件下,线程不会被推迟执行。所以,要计算每一次线程被推迟的时间比较困难。

    两种延时方式也许看不出区别,但实际上两者是不同的。绝对延时OsDelayUntil()需要与另一个API函数osKernelGetTickCount()配合使用。相对延时osDelay()非常简单,在需要延时的地方直接调用它即可。相对延时osDelay()在系统负荷较重时有可能会少一个节拍,RTX5官方手册也有说明。使用绝对延时osDelayUntil()也很难避免被推迟,但它总会和预期的“匹配值”同步(osKernelGetTickCount()获取),因此,一般推荐使用“绝对延时”来实现长时间运行的周期性延时。比如,线程A在CPU上电时就被创建,创建之后一直以5ms的周期运行,永不停止。

    二、API


    2.1、osDelay()


    总的来说,当调用osDelay()时,当前线程进入WAIT_DELAY(BLOCKED)状态,调度器将运行下一个已经处于就绪态(READY)的线程。当计时时间到达,调用osDelay()的线程从WAIT_DELAY(BLOCKED)状态切换到就绪态(READY),如果没有其他更高优先级的线程,那么当前线程就直接进入运行态(RUNNING),继续执行下面的代码。

    #include "cmsis_os2.h"void Thread_1 (void *arg) { // 线程函数osStatus_t status; delayTime = 1000U; // 延时1000个Systick while(1){..... //其他代码.....status = osDelay(delayTime); // 延时} }

    使用举例:

    2.2、osDelayUntil()


    总的来说,osDelayUntil()基于一个绝对时间来延时,这个绝对时间来自osKernelGetTickCount()。调用osDelayUntil()使线程进入阻塞态(BLOCKED)并立刻进行上下文切换,当计时时间达到时,线程从阻塞态(BLOCKED)切换到准备态(READY),如果当前没有更高优先级的其他线程的话,那么线程直接进入运行态(RUNNING)。

    #include "cmsis_os2.h"void Thread_1 (void *arg) { // 线程函数uint32_t tick;tick = osKernelGetTickCount(); // 获取当前系统的时间while(1){tick += 1000U; // 绝对延时1000个SystickosDelayUntil(tick);// ...} }

    总结

    以上是生活随笔为你收集整理的RTX5 | 时间延时的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。