FreeRTOS api库函数之Software Timers(软件定时器)

TimerHandle_t xTimerCreate
                 (const char * const pcTimerName,
                   const TickType_t xTimerPeriod,
                   const UBaseType_t uxAutoReload,
                   void * const pvTimerID,
                   TimerCallbackFunction_t pxCallbackFunction);

创建一个新的软件计时器实例并返回一个句柄,通过该句柄可以引用计时器。

要使此RTOS API函数可用:

  1. 在FreeRTOSConfig.h中, configUSE_TIMERS和configSUPPORT_DYNAMIC_ALLOCATION都必须设置为1(configSUPPORT_DYNAMIC_ALLOCATION也可以保留未定义,在这种情况下,默认为1)。
  2. FreeRTOS / Source / timers.c C源文件必须包含在构建中。

每个软件定时器都需要少量的RAM来保存定时器的状态。如果使用xTimerCreate()创建计时器,则会自动从FreeRTOS堆分配此RAM 。如果使用xTimerCreateStatic()创建软件定时器, 那么RAM由应用程序编写者提供,这需要一个额外的参数,但允许在编译时静态分配RAM。有关详细信息,请参阅Static Vs Dynamic allocation页面。

定时器在休眠状态下创建。所述xTimerStart() , xTimerReset() , xTimerStartFromISR() , xTimerResetFromISR() , xTimerChangePeriod()和 xTimerChangePeriodFromISR() API函数都可以被用于转换的定时器成为激活状态。

参数:

pcTimerName  分配给计时器的人类可读文本名称。这完全是为了协助调试。RTOS内核本身只通过其句柄引用计时器,而不是通过其名称引用计时器。
xTimerPeriod  计时器的时间段。周期以刻度表示,宏pdMS_TO_TICKS()可用于将以毫秒为单位指定的时间转换为刻度中指定的时间。例如,如果计时器必须在100个滴答之后到期,则只需将xTimerPeriod设置为100.或者,如果计时器必须在500ms后过期,则将xTimerPeriod设置为pdMS_TO_TICKS(500)。仅当configTICK_RATE_HZ小于或等于1000时,才能使用pdMS_TO_TICKS() 。
uxAutoReload  如果uxAutoReload设置为pdTRUE,则计时器将以xTimerPeriod参数设置的频率重复到期。如果uxAutoReload设置为pdFALSE,则计时器将是一次性的,并在它到期后进入休眠状态。
pvTimerID  分配给正在创建的计时器的标识符。通常,这将用于计时器回调函数,以识别将同一回调函数分配给多个计时器时过期的计时器,或者与 vTimerSetTimerID() 和pvTimerGetTimerID() API函数一起在定时器调用之间保存值。回调函数。
pxCallbackFunction  定时器到期时调用的函数。回调函数必须具有TimerCallbackFunction_t定义的原型,即:
void vCallbackFunction(TimerHandle_t xTimer);

返回:

如果成功创建计时器,则返回新创建的计时器的句柄。如果由于剩余的FreeRTOS堆不足以分配定时器结构,或者定时器周期设置为0,则无法创建定时器,则返回NULL。

 

TimerHandle_t xTimerCreateStatic
                 (const char * const pcTimerName,
                   const TickType_t xTimerPeriod,
                   const UBaseType_t uxAutoReload,
                   void * const pvTimerID,
                   TimerCallbackFunction_t pxCallbackFunction
                   StaticTimer_t * pxTimerBuffer);

创建一个新的软件计时器实例并返回一个句柄,通过该句柄可以引用计时器。

要使此RTOS API函数可用:

  1. 在FreeRTOSConfig.h中, configUSE_TIMERS和configSUPPORT_STATIC_ALLOCATION都必须设置为1。
  2. FreeRTOS / Source / timer.c C源文件必须包含在构建中。

每个软件定时器都需要少量的RAM来保存定时器的状态。如果使用xTimerCreate()创建计时器,则会 从FreeRTOS堆自动分配所需的RAM 。如果使用xTimerCreateStatic()创建软件定时器,那么RAM由应用程序编写者提供,这需要一个额外的参数,但允许在编译时静态分配RAM。有关详细信息,请参阅Static Vs Dynamic allocation页面。

定时器在休眠状态下创建。所述xTimerStart() , xTimerReset() , xTimerStartFromISR() , xTimerResetFromISR() , xTimerChangePeriod()和 xTimerChangePeriodFromISR() API函数都可以被用于转换的定时器成为激活状态。

参数:

pcTimerName  分配给计时器的人类可读文本名称。这完全是为了协助调试。RTOS内核本身只通过其句柄引用计时器,而不是通过其名称引用计时器。
xTimerPeriod  计时器的时间段。周期以刻度表示,宏pdMS_TO_TICKS()可用于将以毫秒为单位指定的时间转换为刻度中指定的时间。例如,如果计时器必须在100个滴答之后到期,则只需将xTimerPeriod设置为100.或者,如果计时器必须在500ms后过期,则将xTimerPeriod设置为pdMS_TO_TICKS(500)。仅当configTICK_RATE_HZ小于或等于1000时,才能使用pdMS_TO_TICKS() 。
uxAutoReload  如果uxAutoReload设置为pdTRUE,则计时器将以xTimerPeriod参数设置的频率重复到期。如果uxAutoReload设置为pdFALSE,则计时器将是一次性的,并在它到期后进入休眠状态。
pvTimerID  分配给正在创建的计时器的标识符。通常,这将用于计时器回调函数,以识别将同一回调函数分配给多个计时器时过期的计时器,或者与 vTimerSetTimerID() 和pvTimerGetTimerID() API函数一起在定时器调用之间保存值。回调函数。
pxCallbackFunction  定时器到期时调用的函数。回调函数必须具有TimerCallbackFunction_t定义的原型,即:
void vCallbackFunction(TimerHandle_t xTimer);
pxTimerBuffer  必须指向StaticTimer_t类型的变量,然后用于保存计时器的状态。

返回:

如果成功创建计时器,则返回新创建的计时器的句柄。如果pxTimerBuffer为NULL,则不会创建计时器并返回NULL。

 

BaseType_t xTimerIsTimerActive(TimerHandle_t xTimer);

查询软件计时器以查看它是处于活动状态还是处于休眠状态。

如果出现以下情况,计时器将处

  1. 它已创建但尚未启动,或
  2. 这是一个尚未重启的过期一次性计时器。

定时器在休眠状态下创建。所述xTimerStart() , xTimerReset() , xTimerStartFromISR() , xTimerResetFromISR() , xTimerChangePeriod()和 xTimerChangePeriodFromISR() API函数都可以被用于转换的定时器成为激活状态。

参数:

xTimer  要查询的计时器。

返回:

如果计时器处于休眠状态,将返回pdFALSE。如果计时器处于活动状态,则将返回pdFALSE以外的值。

 

BaseType_t xTimerStart(TimerHandle_t xTimer,
                            TickType_t xBlockTime);

软件计时器功能由计时器服务/守护程序任务提供。许多公共FreeRTOS计时器API函数通过称为计时器命令队列的队列向计时器服务任务发送命令。timer命令队列对RTOS内核本身是私有的,并且不能直接访问应用程序代码。timer命令队列的长度由configTIMER_QUEUE_LENGTH配置常量设置。

xTimerStart()启动以前使用xTimerCreate() API函数创建的计时器 。如果计时器已经启动并且已经处于活动状态,则xTimerStart()具有与xTimerReset() API函数等效的功能。

启动计时器可确保计时器处于活动状态。如果定时器未在同一时间内停止,删除或复位,则在调用xTimerStart()之后,与定时器关联的回调函数将被称为“n”滴答,其中“n”是定时器定义的时间段。

在RTOS调度程序启动之前调用xTimerStart()是有效的,但是当完成此操作时,定时器在RTOS调度程序启动之前实际上不会启动,并且定时器到期时间将相对于RTOS调度程序启动时的时间,与调用xTimerStart()时无关。

必须将configUSE_TIMERS配置常量设置为1才能使xTimerStart()可用。

 

参数:

xTimer  正在启动/重启计时器的句柄。
xBlockTime  如果在调用xTimerStart()时队列已满,则以tick为单位指定调用任务应保持在Blocked状态以等待start命令成功发送到timer命令队列的时间。如果在启动RTOS调度程序之前调用xTimerStart(),则忽略xBlockTime。

返回:

如果即使在xBlockTime ticks通过后仍无法将start命令发送到timer命令队列,将返回pdFAIL。如果命令已成功发送到计时器命令队列,则将返回pdPASS。当实际处理命令时,将取决于计时器服务/守护程序任务相对于系统中其他任务的优先级,尽管计时器到期时间与实际调用xTimerStart()的时间相关。计时器服务/守护程序任务优先级由configTIMER_TASK_PRIORITY配置常量设置。

 

 BaseType_t xTimerStop(TimerHandle_t xTimer,
                           TickType_t xBlockTime);

软件计时器功能由计时器服务/守护程序任务提供。许多公共FreeRTOS计时器API函数通过称为计时器命令队列的队列向计时器服务任务发送命令。timer命令队列对RTOS内核本身是私有的,并且不能直接访问应用程序代码。timer命令队列的长度由configTIMER_QUEUE_LENGTH配置常量设置。

xTimerStop()停止以前使用 xTimerStart(), xTimerReset(), xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod()和 xTimerChangePeriodFromISR() API函数启动的计时器

停止计时器可确保计时器不处于活动状态。

必须将configUSE_TIMERS配置常量设置为1才能使xTimerStop()可用。

 

参数:

xTimer  定时器的手柄停止。
xBlockTime  如果在调用xTimerStop()时队列已满,则以tick为单位指定调用任务应保持在Blocked状态以等待stop命令成功发送到timer命令队列的时间。如果在启动RTOS调度程序之前调用xTimerStop(),则忽略xBlockTime。

返回:

如果即使在xBlockTime ticks通过后仍无法将stop命令发送到timer命令队列,将返回pdFAIL。如果命令已成功发送到计时器命令队列,则将返回pdPASS。实际处理命令时,将取决于计时器服务/守护程序任务相对于系统中其他任务的优先级。计时器服务/守护程序任务优先级由configTIMER_TASK_PRIORITY配置常量设置。

 

BaseType_t xTimerChangePeriod(TimerHandle_t xTimer,
                                   TickType_t xNewPeriod,
                                   TickType_t xBlockTime);

软件计时器功能由计时器服务/守护程序任务提供。许多公共FreeRTOS计时器API函数通过称为计时器命令队列的队列向计时器服务任务发送命令。timer命令队列对RTOS内核本身是私有的,并且不能直接访问应用程序代码。timer命令队列的长度由configTIMER_QUEUE_LENGTH配置常量设置。

xTimerChangePeriod()更改先前使用xTimerCreate() API函数创建的计时器的周期。

可以调用xTimerChangePeriod()来更改活动或休眠状态计时器的周期。更改休眠计时器的周期也将启动计时器。

必须将configUSE_TIMERS配置常量设置为1才能使xTimerChangePeriod()可用。

 

参数:

xTimer  正在更改周期的计时器的句柄。
xNewPeriod  xTimer的新时期。定时器周期在滴答周期中指定,因此常量portTICK_PERIOD_MS可用于转换已指定的时间(以毫秒为单位)。例如,如果定时器必须在100个滴答之后到期,则xNewPeriod应设置为100.或者,如果定时器必须在500ms后过期,则xNewPeriod可以设置为(500 / portTICK_PERIOD_MS),前提是configTICK_RATE_HZ小于或等于1000 。
xBlockTime  如果在调用xTimerChangePeriod()时队列已满,则指定调用任务应保持在阻塞状态以等待更改周期命令成功发送到计时器命令队列的时间(以时钟周期为单位)。如果在启动RTOS调度程序之前调用xTimerChangePeriod(),则忽略xBlockTime。

返回:

如果更改周期命令无法发送到计时器命令队列,即使已经过了xBlockTime ticks,也将返回pdFAIL。如果命令已成功发送到计时器命令队列,则将返回pdPASS。实际处理命令时,将取决于计时器服务/守护程序任务相对于系统中其他任务的优先级。计时器服务/守护程序任务优先级由configTIMER_TASK_PRIORITY配置常量设置。

 

BaseType_t xTimerDelete(TimerHandle_t xTimer,
                             TickType_t xBlockTime);

软件计时器功能由计时器服务/守护程序任务提供。许多公共FreeRTOS计时器API函数通过称为计时器命令队列的队列向计时器服务任务发送命令。timer命令队列对RTOS内核本身是私有的,并且不能直接访问应用程序代码。timer命令队列的长度由configTIMER_QUEUE_LENGTH配置常量设置。

xTimerDelete()删除以前使用xTimerCreate() API函数创建的计时器 。

必须将configUSE_TIMERS配置常量设置为1才能使xTimerDelete()可用。

 

参数:

xTimer  计时器的句柄被删除。
xBlockTime  如果在调用xTimerDelete()时队列已满,则以tick为单位指定调用任务应保持在Blocked状态以等待delete命令成功发送到timer命令队列的时间。如果在启动RTOS调度程序之前调用xTimerDelete(),则忽略xBlockTime。

返回:

如果删除命令无法发送到计时器命令队列,即使已经过了xBlockTime ticks,也将返回pdFAIL。如果命令已成功发送到计时器命令队列,则将返回pdPASS。实际处理命令时,将取决于计时器服务/守护程序任务相对于系统中其他任务的优先级。计时器服务/守护程序任务优先级由configTIMER_TASK_PRIORITY配置常量设置。

 

BaseType_t xTimerReset(TimerHandle_t xTimer,
                            TickType_t xBlockTime);

软件计时器功能由计时器服务/守护程序任务提供。许多公共FreeRTOS计时器API函数通过称为计时器命令队列的队列向计时器服务任务发送命令。timer命令队列对RTOS内核本身是私有的,并且不能直接访问应用程序代码。timer命令队列的长度由configTIMER_QUEUE_LENGTH配置常量设置。

xTimerReset()重新启动先前使用xTimerCreate() API函数创建的计时器 。如果计时器已经启动并且已经处于活动状态,那么xTimerReset()将使计时器重新计算其到期时间,以便它与调用xTimerReset()时相对。如果计时器处于休眠状态,则xTimerReset()具有与xTimerStart() API函数等效的功能。

重置计时器可确保计时器处于活动状态。如果定时器未同时停止,删除或复位,则在调用xTimerReset()后,与定时器关联的回调函数将被调用为'n',其中'n'是定时器定义的周期。

在RTOS调度程序启动之前调用xTimerReset()是有效的,但是当完成此操作时,定时器将不会实际启动,直到RTOS调度程序启动,并且定时器到期时间将相对于RTOS调度程序启动时,与调用xTimerReset()时无关。

必须将configUSE_TIMERS配置常量设置为1才能使xTimerReset()可用。

 

参数:

xTimer  定时器的手柄被重置/启动/重启。
xBlockTime  如果在调用xTimerReset()时队列已满,则以tick为单位指定调用任务应保持在Blocked状态以等待reset命令成功发送到timer命令队列的时间。如果在启动RTOS调度程序之前调用xTimerReset(),则忽略xBlockTime。

返回:

如果复位命令无法发送到计时器命令队列,即使已经过了xBlockTime ticks,也将返回pdFAIL。如果命令已成功发送到计时器命令队列,则将返回pdPASS。实际处理命令时,将取决于计时器服务/守护程序任务相对于系统中其他任务的优先级,尽管计时器到期时间与实际调用xTimerReset()的时间相关。计时器服务/守护程序任务优先级由configTIMER_TASK_PRIORITY配置常量设置。

 

BaseType_t xTimerStartFromISR
               (
                  TimerHandle_t xTimer,
                  BaseType_t * pxHigherPriorityTaskWoken
               );

可以从中断服务例程调用 的xTimerStart()版本。

 

参数:

xTimer  正在启动/重启计时器的句柄。
pxHigherPriorityTaskWoken  计时器服务/守护程序任务的大部分时间都处于阻塞状态,等待消息到达计时器命令队列。调用xTimerStartFromISR()会将消息写入计时器命令队列,因此有可能将计时器服务/守护程序任务转换为阻塞状态。如果调用xTimerStartFromISR()导致计时器服务/守护程序任务退出阻塞状态,并且计时器服务/守护程序任务的优先级等于或大于当前正在执行的任务(被中断的任务),则* pxHigherPriorityTaskWoken将获得在xTimerStartFromISR()函数内部设置为pdTRUE。如果xTimerStartFromISR()将此值设置为pdTRUE,则应在中断退出之前执行上下文切换。

返回:

如果无法将start命令发送到timer命令队列,则将返回pdFAIL。如果命令已成功发送到计时器命令队列,则将返回pdPASS。实际处理命令时,将取决于计时器服务/守护程序任务相对于系统中其他任务的优先级,尽管计时器到期时间与实际调用xTimerStartFromISR()的时间相关。计时器服务/守护程序任务优先级由configTIMER_TASK_PRIORITY配置常量设置。

 

BaseType_t xTimerStopFromISR
             (
                 TimerHandle_t xTimer,
                 BaseType_t * pxHigherPriorityTaskWoken
             );

可以从中断服务例程调用 的xTimerStop()版本。

 

参数:

xTimer  定时器的手柄停止。
pxHigherPriorityTaskWoken  计时器服务/守护程序任务的大部分时间都处于阻塞状态,等待消息到达计时器命令队列。调用xTimerStopFromISR()会将消息写入计时器命令队列,因此有可能将计时器服务/守护程序任务转换为阻塞状态。如果调用xTimerStopFromISR()导致计时器服务/守护程序任务退出阻塞状态,并且计时器服务/守护程序任务的优先级等于或大于当前正在执行的任务(被中断的任务),那么* pxHigherPriorityTaskWoken将获得在xTimerStopFromISR()函数内部设置为pdTRUE。如果xTimerStopFromISR()将此值设置为pdTRUE,则应在中断退出之前执行上下文切换。

返回:

如果无法将stop命令发送到timer命令队列,则将返回pdFAIL。如果命令已成功发送到计时器命令队列,则将返回pdPASS。实际处理命令时,将取决于计时器服务/守护程序任务相对于系统中其他任务的优先级。计时器服务/守护程序任务优先级由configTIMER_TASK_PRIORITY配置常量设置。

 

BaseType_t xTimerChangePeriodFromISR
           (
              TimerHandle_t xTimer,
              TickType_t xNewPeriod,
              BaseType_t * pxHigherPriorityTaskWoken
           );

可以从中断服务例程调用 的xTimerChangePeriod()版本。

 

参数:

xTimer  正在更改周期 的软件计时器的句柄。
xNewPeriod  xTimer的新时期。定时器周期在滴答周期中指定,因此常量portTICK_PERIOD_MS可用于转换已指定的时间(以毫秒为单位)。例如,如果定时器必须在100个滴答之后到期,则xNewPeriod应设置为100.或者,如果定时器必须在500ms后过期,则xNewPeriod可以设置为(500 / portTICK_PERIOD_MS),前提是configTICK_RATE_HZ小于或等于1000 。
pxHigherPriorityTaskWoken  计时器服务/守护程序任务的大部分时间都处于阻塞状态,等待消息到达计时器命令队列。调用xTimerChangePeriodFromISR()会将消息写入计时器命令队列,因此有可能将计时器服务/守护程序任务转换为阻止状态。如果调用xTimerChangePeriodFromISR()导致计时器服务/守护程序任务退出阻塞状态,并且计时器服务/守护程序任务的优先级等于或大于当前正在执行的任务(被中断的任务),那么* pxHigherPriorityTaskWoken将获得在xTimerChangePeriodFromISR()函数内部设置为pdTRUE。如果xTimerChangePeriodFromISR()将此值设置为pdTRUE,则应在中断退出之前执行上下文切换。

返回:

如果无法将更改定时器周期的命令发送到定时器命令队列,则将返回pdFAIL。如果命令已成功发送到计时器命令队列,则将返回pdPASS。实际处理命令时,将取决于计时器服务/守护程序任务相对于系统中其他任务的优先级。计时器服务/守护程序任务优先级由configTIMER_TASK_PRIORITY配置常量设置。

 

 BaseType_t xTimerResetFromISR
                (
                   TimerHandle_t xTimer,
                   BaseType_t * pxHigherPriorityTaskWoken
                );

可以从中断服务例程调用 的xTimerReset()版本。

 

参数:

xTimer  要启动,重置或重新启动的计时器的句柄。
pxHigherPriorityTaskWoken  计时器服务/守护程序任务的大部分时间都处于阻塞状态,等待消息到达计时器命令队列。调用xTimerResetFromISR()会将消息写入计时器命令队列,因此有可能将计时器服务/守护程序任务转换为阻塞状态。如果调用xTimerResetFromISR()导致计时器服务/守护程序任务退出阻塞状态,并且计时器服务/守护程序任务的优先级等于或大于当前正在执行的任务(被中断的任务),则* pxHigherPriorityTaskWoken将获得在xTimerResetFromISR()函数内部设置为pdTRUE。如果xTimerResetFromISR()将此值设置为pdTRUE,则应在中断退出之前执行上下文切换。

返回:

如果无法将reset命令发送到timer命令队列,则将返回pdFAIL。如果命令已成功发送到计时器命令队列,则将返回pdPASS。实际处理命令时,将取决于计时器服务/守护程序任务相对于系统中其他任务的优先级,尽管计时器到期时间与实际调用xTimerResetFromISR()的时间相关。计时器服务/守护程序任务优先级由configTIMER_TASK_PRIORITY配置常量设置。

 

void * pvTimerGetTimerID(TimerHandle_t xTimer);

返回分配给软件计时器的ID 。

使用用于创建计时器的xTimerCreate()调用的pvTimerID参数将ID分配给 计时器。

创建计时器时,标识符(ID)将分配给计时器,并且可以使用vTimerSetTimerID() API函数随时更改。

如果为多个计时器分配了相同的回调函数,则可以在回调函数内检查计时器标识符,以确定哪个计时器实际到期。

定时器标识符还可用于在定时器的回调函数调用之间在定时器中存储数据。

 

参数:

xTimer  要查询的计时器。

返回:

分配给要查询的计时器的ID。

 

void vTimerSetReloadMode(TimerHandle_t xTimer,
                           const UBaseType_t uxAutoReload);

软件定时器的“模式”更新为自动重载定时器或单次定时器。

自动重新加载计时器每次到期时都会自行重置,导致计时器定期到期(从而执行其回调)。

单次触发计时器不会自动重置,因此除非手动重启,否则只会到期(因此执行其回调)。

仅当FreeRTOS / Source / timers.c源文件包含在构建的项目中时,此API函数才可用。

参数:

xTimer  更新计时器的句柄。句柄将从 用于创建计时器的xTimerCreate() 或xTimerCreateStatic()调用返回。
uxAutoReload  

将uxAutoReload设置为pdTRUE以将计时器设置为自动重新加载模式,或将pdfALSE设置为单次模式。

 

void vTimerSetTimerID(TimerHandle_t xTimer,void * pvNewID);

创建计时器时, 标识符(ID)被分配给软件计时器,并且可以使用vTimerSetTimerID()API函数随时更改。

如果为多个计时器分配了相同的回调函数,则可以在回调函数内检查计时器标识符,以确定哪个计时器实际到期。

定时器标识符还可用于在定时器的回调函数调用之间在定时器中存储数据。

 

参数:

xTimer  计时器正在更新。
pvNewID  将设置计时器标识符的句柄。

 

TaskHandle_t xTimerGetTimerDaemonTaskHandle(void);
		

返回:

返回与软件计时器守护程序(或服务)任务关联的任务句柄。如果在FreeRTOSConfig.h中将configUSE_TIMERS设置为1,则在启动RTOS调度程序时会自动创建计时器守护程序任务。

 

BaseType_t xTimerPendFunctionCall(
                            PendedFunction_t xFunctionToPend,
                            void * pvParameter1,
                            uint32_t ulParameter2,
                            TickType_t xTicksToWait);

用于将函数执行挂起到RTOS守护程序任务(计时器服务任务,因此此函数预先使用'Timer'进行修复)。

可以延迟到RTOS守护程序任务的函数必须具有以下原型:

void vPendableFunction(void * pvParameter1,uint32_t ulParameter2);

该pvParameter1和ulParameter2提供了应用程序代码中使用。

必须将INCLUDE_xTimerPendFunctionCall()和configUSE_TIMERS都设置为1才能使xTimerPendFunctionCall()可用。

 

参数:

xFunctionToPend  从计时器服务/守护程序任务执行的函数。该函数必须符合PendedFunction_t原型,如上所示。
pvParameter1  回调函数的第一个参数的值。该参数具有void *类型,以允许它用于传递任何类型。例如,整数类型可以转换为void *,或者void *可以用于指向结构。
ulParameter2  回调函数的第二个参数的值。
xTicksToWait  调用此函数将导致将消息发送到队列上的计时器守护程序任务。xTicksToWait是调用任务应该保持在阻塞状态(因此不使用任何处理时间)的时间量,如果发现队列已满,则可以在定时器队列上使用空间。队列的长度由FreeRTOSConfig.h中configTIMER_QUEUE_LENGTH的值设置。

返回:

如果消息已成功发送到RTOS计时器守护程序任务,则返回pdPASS,否则返回pdFALSE。

 

BaseType_t xTimerPendFunctionCallFromISR(
                       PendedFunction_t xFunctionToPend,
                       void * pvParameter1,
                       uint32_t ulParameter2,
                       BaseType_t * pxHigherPriorityTaskWoken);

从应用程序中断服务程序中使用,将函数的执行推迟到RTOS守护程序任务(计时器服务任务,因此该函数在timers.c中实现,并以'Timer'为前缀)。

理想情况下,中断服务例程(ISR)保持尽可能短,但有时ISR要么有很多处理要做,要么需要执行不确定的处理。在这些情况下,xTimerPendFunctionCallFromISR()可用于将函数处理延迟到RTOS守护程序任务。

提供了一种机制,允许中断直接返回到随后将执行挂起功能的任务。这允许回调函数在中断时连续执行 - 就像回调已经在中断本身中执行一样。

可以延迟到RTOS守护程序任务的函数必须具有以下原型:

void vPendableFunction(void * pvParameter1,uint32_t ulParameter2);

该pvParameter1和ulParameter2提供了应用程序代码中使用。

必须将INCLUDE_xTimerPendFunctionCall()和configUSE_TIMERS都设置为1才能使xTimerPendFunctionCallFromISR()可用。

 

参数:

xFunctionToPend  从计时器服务/守护程序任务执行的函数。该函数必须符合PendedFunction_t原型,如上所示。
pvParameter1  回调函数的第一个参数的值。该参数具有void *类型,以允许它用于传递任何类型。例如,整数类型可以转换为void *,或者void *可以用于指向结构。
ulParameter2  回调函数的第二个参数的值。
pxHigherPriorityTaskWoken  如上所述,调用xTimerPendFunctionCallFromISR()将导致将消息发送到RTOS计时器守护程序任务。如果守护程序任务的优先级(使用 FreeRTOSConfig.h中的configTIMER_TASK_PRIORITY设置 )高于当前运行任务的优先级(中断中断的任务),则* pxHigherPriorityTaskWoken将在xTimerPendFunctionCallFromISR()中设置为pdTRUE,表示在中断退出之前应该请求上下文切换。因此,必须将* pxHigherPriorityTaskWoken初始化为pdFALSE。请参阅下面的示例代码。

返回:

如果消息已成功发送到RTOS计时器守护程序任务,则返回pdPASS,否则返回pdFALSE。

 

const char * pcTimerGetName(TimerHandle_t xTimer);

返回软件计时器的人类可读文本名称。

使用用于创建计时器的xTimerCreate() 调用的pcTimerName参数将文本名称分配给 计时器。

 

参数:

xTimer  要查询的计时器。

返回:

指向计时器文本名称的指针,作为标准的NULL终止C字符串。

 

TickType_t xTimerGetPeriod(TimerHandle_t xTimer);

返回软件计时器的周期。期间以刻度指定。

最初使用用于创建计时器的xTimerCreate()调用的xTimerPeriod参数来设置计时器的周期 。然后可以使用xTimerChangePeriod() 和xTimerChangePeriodFromISR() API函数更改它 。

 

参数:

xTimer  要查询的计时器。

返回:

计时器的周期,以刻度表示。

 

TickType_t xTimerGetExpiryTime(TimerHandle_t xTimer);

返回软件计时器到期的时间,即计时器的回调函数执行的时间。

如果xTimerGetExpiryTime()返回的值小于当前时间,那么定时器将在滴答计数溢出并回绕到0后到期。溢出在RTOS实现本身中处理,因此定时器的回调函数将在正确的时间执行时间是在滴答计数溢出之前还是之后。

 

参数:

xTimer  要查询的计时器。

返回:

如果xTimer引用的计时器处于活动状态,则返回计时器下次到期的时间(可能是在当前计时器数溢出后,请参阅上面的注释)。

如果xTimer引用的计时器未处于活动状态,则返回值未定义。

 

FreeRTOS 中,软件定时器和硬件定时器是两种不同的定时器实现方式,用于实现任务的定时调度和时间管理。 1. 软件定时器Software Timer): 软件定时器FreeRTOS 提供的一种基于软件定时器机制,通过 FreeRTOS 内核的任务调度器进行管理。软件定时器主要由 `xTimerCreate()`、`xTimerStart()`、`xTimerStop()` 等 API 函数来创建、启动、停止和删除。软件定时器适用于需要在任务中使用的相对较低频率的定时操作。 通过软件定时器,可以创建多个定时器以满足不同任务的需求,并且可以在定时器到期时触发回调函数来执行特定的操作。软件定时器使用 FreeRTOS 的任务调度器进行管理,因此,如果有其他高优先级任务需要执行,软件定时器会在适当的时机被暂停,并在下一个合适的时间点继续执行。 2. 硬件定时器(Hardware Timer): 硬件定时器是嵌入式系统中的硬件设备,可由硬件芯片提供。硬件定时器通常由专用寄存器和计数器组成,可用于生成精确的时间延迟或周期性触发中断。在 FreeRTOS 中,可以将硬件定时器软件定时器结合使用,以提供更精确和高频率的定时操作。 使用硬件定时器需要根据硬件平台和具体的芯片手册进行配置和初始化。一旦硬件定时器设置完成,可以在中断服务程序中处理定时器中断,并在中断处理程序中触发所需的操作。 需要根据具体的应用场景和需求来选择使用软件定时器还是硬件定时器软件定时器适用于相对较低频率和较少精度要求的任务调度,而硬件定时器适用于高频率和精确性要求较高的定时操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值