osTimerStart() / xTimerStart() / xTimerChangePeriod()

在嵌入式实时操作系统(RTOS)中的 osTimerStart() 函数参数通常包含以下信息:

  1. 定时器句柄(Timer Handle):它是一个指向已经创建的定时器的指针或标识符。通过定时器句柄,函数可以找到对应的定时器并进行启动操作。

  2. 延迟时间(Delay Time):它表示定时器启动后第一次触发的延迟时间。延迟时间指定了定时器从启动到第一次触发的时间间隔。这个参数是一个以毫秒为单位的时间值。

例如,使用 FreeRTOS 的定时器功能时,osTimerStart() 函数的参数可以是以下形式:

osStatus_t osTimerStart(osTimerId_t timer, uint32_t millisec);

  • timer 是一个指向已创建的定时器的指针或标识符。
  • millisec 是一个以毫秒为单位的时间值,表示定时器启动后第一次触发的延迟时间。

需要根据具体的 RTOS 版本和实现来确定函数参数的具体含义。可以查阅相应的 RTOS 文档或参考相关函数的定义文档,以获得准确的参数解释和用法说明

xTimerChangePeriod() 是 FreeRTOS 中用于修改定时器周期的函数。以下是该函数的原型和参数解释:

BaseType_t xTimerChangePeriod(TimerHandle_t xTimer, TickType_t xNewPeriod, 
                                TickType_t xTicksToWait);
  • xTimer:指向要修改周期的定时器的句柄(Timer Handle)。定时器句柄可以通过调用 xTimerCreate() 创建定时器后返回得到。

  • xNewPeriod:新的定时器周期,以时钟节拍为单位表示。时钟节拍是 FreeRTOS 内部用于计时和调度任务的时间单位。

  • xTicksToWait:可选参数,表示在修改定时器周期之前等待的节拍数。如果当前定时器正在运行且不希望立即生效,可以设置一个等待时间。

返回值是一个 BaseType_t 类型的值,表示函数执行的结果。如果定时器句柄无效或发生错误,返回 pdFAIL;否则,返回 pdPASS 表示成功修改了定时器周期。

需要注意的是,在调用 xTimerChangePeriod() 函数之前,要确保定时器已经创建并且正在运行。否则,可能会导致意外的行为或错误的结果。

使用 xTimerChangePeriod() 函数可以动态地修改定时器的周期,使其在运行时适应不同的时间间隔需求。这对于需要动态调整定时器触发频率的应用场景非常有用。

xTimerStart() 是 FreeRTOS 中用于启动定时器的函数。以下是该函数的原型和参数解释:

BaseType_t xTimerStart(TimerHandle_t xTimer, TickType_t xTicksToWait);
  • xTimer:指向要启动的定时器的句柄(Timer Handle)。定时器句柄可以通过调用 xTimerCreate() 创建定时器后返回得到。

  • xTicksToWait:可选参数,表示在启动定时器之前等待的节拍数。如果希望在启动定时器之前有一个延迟,可以设置一个等待时间。

返回值是一个 BaseType_t 类型的值,表示函数执行的结果。如果定时器句柄无效或发生错误,返回 pdFAIL;否则,返回 pdPASS 表示成功启动了定时器。

需要注意的是,在调用 xTimerStart() 函数之前,要确保定时器已经创建并且已配置好相关参数。否则,可能会导致意外的行为或错误的结果。

使用 xTimerStart() 函数可以使定时器开始计时,并按照预设的时间间隔触发定时器的回调函数。一旦定时器启动,它会按照设定的时间间隔循环触发,直到被停止或删除。

此外,如果需要在定时器启动后立即触发一次定时器回调函数,可以先调用 xTimerReset() 函数重置定时器,然后再调用 xTimerStart() 启动定时器。

总结起来,xTimerStart() 的作用是启动一个已经创建的定时器,使其开始计时并按照预设的时间间隔触发定时器的回调函数。

xTimerChangePeriod()xTimerStart() 是 FreeRTOS 定时器库中的两个函数,

它们的使用方法和区别如下:

  1. 使用方法:

    • xTimerChangePeriod():用于修改定时器的周期。该函数将定时器的触发时间间隔更改为指定的值,并可选择性地使定时器自动重新启动。
    • xTimerStart():用于启动定时器。该函数开始定时器的计时,并在指定的初始延迟时间后触发定时器。
  2. 区别:

    • xTimerChangePeriod() 修改定时器的周期,即定时器触发的时间间隔,而不会影响定时器的状态(启动/停止)或引起定时器重启。
    • xTimerStart() 启动定时器,并且可以设置一个初始延迟时间。它会启动定时器的计时,并在初始延迟时间后触发定时器。如果定时器之前已经启动过,则定时器将按照上次停止时的状态继续计时。

在使用时,您可以根据需要选择使用这两个函数:

  • 如果需要更改定时器的触发时间间隔,可以使用 xTimerChangePeriod() 函数。
  • 如果需要启动一个定时器并指定初始延迟时间,可以使用 xTimerStart() 函数。

需要注意的是,在使用这两个函数之前,您需要先创建一个定时器,并获取其句柄。定时器的创建可以使用 xTimerCreate() 函数来完成。

间。

xTimerChangePeriod()xTimerStart() 函数中,它们的第二个参数有不同的含义:

  1. xTimerChangePeriod() 函数的第二个参数是新的定时器周期。它指定了定时器的新的触发时间间隔。这个参数是一个以时钟节拍为单位的时间值(Ticks)。时钟节拍的长度由 FreeRTOS 的配置文件确定,可以使用 pdMS_TO_TICKS() 宏将毫秒转换为时钟节拍。

  2. xTimerStart() 函数的第二个参数是定时器的初始延迟时间。它指定了定时器启动后第一次触发的时间。这个参数也是一个以时钟节拍为单位的时间值(Ticks)。

尽管这两个参数都表示时间,但它们的作用不同:

  • xTimerChangePeriod() 的第二个参数用于更改定时器的周期,即定时器触发的时间间隔。这个参数是设置定时器新周期的依据。
  • xTimerStart() 的第二个参数用于设置定时器启动后的初始延迟时间,即定时器第一次触发的时间点。

需要注意的是,在调用这两个函数时,传入的时间参数应该根据具体应用的需求进行合理的设定,并使用正确的时间单位(时钟节拍)。

20230805

### 如何在FreeRTOS中设置和配置定时器作为系统中断源 #### 定义与初始化定时器 为了使定时器能够适合作为系统中的中断源,在创建定时器时需注意其属性设定。可以通过`xTimerCreate()`来创建一个软件定时器实例,此过程涉及定义回调函数,这决定了当定时事件触发时应执行的操作[^1]。 ```c // 创建定时器并指定回调函数 const char *pcTimerName = "SysTick"; const portTickType xTimerPeriodInTicks = pdMS_TO_TICKS(100); // 设置周期时间为100ms转换成tick数 void vTimerCallbackFunction(TimerHandle_t pxTimer); StaticTimer_t xTimerBuffer; uint32_t ulStackDepthWords = configTIMER_TASK_STACK_DEPTH; TimerHandle_t xTimer = xTimerCreate( pcTimerName, /* 名字 */ xTimerPeriodInTicks, /* 周期 */ pdTRUE, /* 自动重载 */ ( void * ) 0, /* 参数传递给回调函数 */ vTimerCallbackFunction /* 回调函数指针 */ ); if(xTimer != NULL){ // 启动定时器前先确认调度器已启动 } ``` 对于上述代码片段而言,`vTimerCallbackFunction`即是每当计时期满就会被调用的方法;而`pdTRUE`参数表明这是一个自动重启型的定时器,意味着一旦到期它会再次开始倒计时直到下一次溢出发生为止。 #### 配置定时器行为 要让定时器成为有效的中断源之一,则需要确保几个方面: - **选择合适的分组模式**:在移植FreeRTOS到具体硬件平台的过程中,针对ARM Cortex-M系列MCU来说,推荐采用分组4的方式来进行优先级分配策略的选择,从而满足实时响应的需求[^3]。 - **正确处理超时时间**:当调用`osTimerStart()`接口去激活一个已经构建好的静态或动态定时器对象的时候,“millisec”参数代表期望等待的时间长度(以ticks表示)。需要注意的是,只有在RTOS内核已经开始运行之后这一数值才有效果[^4]。 #### 使用API控制定时器状态 利用如下所示的一些API可以方便地操控定时器的状态变化,比如启动(`xTimerStart`)、停止(`xTimerStop`)或是改变它的间隔(`xTimerChangePeriod`)等操作均能通过相应的库函数完成。特别强调一点就是所有的这些动作最终都是经由内部维护的一个专用消息队列——即所谓的“定时器命令队列”,间接传达给了专门负责管理所有活动着的timer的服务线程去做进一步处理[^2]。 ```c // 开始/重新开始定时器 BaseType_t result_start = xTimerStart(xTimer, 0); // 修改定时器周期而不影响当前是否正在运行 BaseType_t result_change_period = xTimerChangePeriod(xTimer, new_period_ticks, 0); // 如果不再需要定时功能可将其关闭 BaseType_t result_stop = xTimerStop(xTimer, 0); ``` 以上便是围绕如何基于FreeRTOS框架搭建起一套可靠的软定时机制,并使其具备充当系统级别IRQ源头的能力所涉及到的关键知识点概述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值