STM32F1与STM32CubeIDE编程实例-CMSIS-RTOS v2-延时

延时

CMSIS-RTOS v2 (CMSIS-RTOS2) 为基于 Arm® Cortex® 处理器的设备提供通用 RTOS 接口。 它为需要 RTOS 功能的软件组件提供标准化 API,从而为用户和软件行业带来巨大的好处。

本文将详细介绍,在CMSIS-RTOS V2中如何使用延时。

CMSIS-RTOS V2提供两个延时函数,分别是:

  • osStatus_t osDelay (uint32_t ticks)
  • osStatus_t osDelayUntil (uint32_t ticks)

1、osDelay函数

函数 osDelay 等待内核节拍中指定的时间段。 对于值 1,系统将等待直到下一个计时器滴答(tick)发生。 实际的时间延迟最多可能比指定的计时器小一个节拍,即在下一个系统节拍发生之前调用 osDelay(1) 立即重新调度线程。

延迟的线程被置于 BLOCKED 状态并立即发生上下文切换。 在给定数量的滴答声过去后,线程会自动回到 READY 状态。 如果线程在 READY 状态下具有最高优先级,它将立即被调度。

  • 参数ticks表示等待的滴答数。
  • 函数返回状态码osStatus_t ,指示函数的执行状态。其返回值可能如下:
    • osOK:延时执行。
    • osErrorParameter:时间无法处理(零值)。
    • osErrorISR:无法从中断服务程序调用 osDelay。
    • osError: osDelay 无法执行(内核未运行或不存在 READY 线程)。

简单的示例如下:

1
2
3
4
5
6
7
8
9
10
#include "cmsis\_os2.h"

void Thread_1 (void \*arg) { // Thread function
osStatus_t status; // capture the return status
uint32_t delayTime; // delay time in milliseconds

delayTime = 1000U; // delay 1 second
status = osDelay(delayTime); // suspend thread execution
}

2、osDelayUntil函数

函数 osDelayUntil 一直等待,直到达到一个绝对时间(在内核节拍中指定)。

内核滴答计数器溢出的极端情况由 osDelayUntil 处理。 因此,提供一个低于当前刻度值的值是绝对合法的,即由 osKernelGetTickCount 返回。 通常,在用户端不必关心溢出问题。 但是必须记住的唯一限制是最大延迟限制为 (231)-1 个滴答声。

延迟的线程被置于 BLOCKED 状态并立即发生上下文切换。 当达到给定时间时,线程会自动回到 READY 状态。 如果线程在 READY 状态下具有最高优先级,它将立即被调度。

  • 参数ticks滴答中的绝对时间
  • 函数返回状态码osStatus_t ,指示函数的执行状态。其返回值可能如下:
    • osOK:延时执行。
    • osErrorParameter:时间无法处理(越界)。
    • osErrorISR:无法从中断服务例程调用 osDelayUntil。
    • osError: osDelayUntil 无法执行(内核未运行或不存在 READY 线程)。

简单示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include "cmsis\_os2.h"

void Thread_1 (void \*arg) { // Thread function
uint32_t tick;

tick = osKernelGetTickCount(); // retrieve the number of system ticks
for (;;) {
tick += 1000U; // delay 1000 ticks periodically
osDelayUntil(tick);
// ...
}
}

文章来源: https://iotsmart.blog.csdn.net/article/details/124631241