FreeRTOS(软件定时器)

文章介绍了STM32硬件定时器和软件定时器的概念,强调了硬件定时器的精度和多功能性,而软件定时器则具有成本低、可创建多个的特点,但精度较低。FreeRTOS的软件定时器由定时器服务任务管理,通过配置相关参数如优先级和堆栈大小来满足不同需求。文章还列举了创建、启动、停止和改变定时器的API函数,并给出实验示例,创建了一个周期定时器和一个单次定时器的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么是定时器

简单可以理解为闹钟,到达指定一段时间后,就会响铃。 STM32 芯片自带硬件定时器,精度较高,达到定时时间后会触发中断,也可以生成 PWM 、输入 捕获、输出比较,等等,功能强大,但是由于硬件的限制,个数有限。 软件定时器也可以实现定时功能,达到定时时间后可调用回调函数,可以在回调函数里处理信 息。

二、软件定时器优缺点

优点: 1. 简单、成本低; 2. 只要内存足够,可创建多个;

缺点: 精度较低,容易受中断影响。在大多数情况下够用,但对于精度要求比较高的场合不建议使用。

三、软件定时器原理

定时器是一个可选的、不属于 FreeRTOS 内核的功能,它是由定时器服务任务来提供的。

在调用函数 vTaskStartScheduler() 开启任务调度器的时候,会创建一个用于管理软件定时器的任 务,这个任务就叫做软件定时器服务任务。

  • 负责软件定时器超时的逻辑判断
  • 调用超时软件定时器的超时回调函数
  • 处理软件定时器命令队列

FreeRTOS提供了很多定时器有关的API函数,这些API函数大多都使用FreeRTOS的队列发送命令给 定时器服务任务。这个队列叫做定时器命令队列。定时器命令队列是提供给FreeRTOS的软件定时 器使用的,用户不能直接访问

 四、软件定时器相关配置

软件定时器有一个定时器服务任务和定时器命令队列,这两个东西肯定是要配置的,相关的配置 也是放到文件FreeRTOSConfig.h中的,涉及到的配置如下:

configUSE_TIMERS

  • 如果要使用软件定时器的话宏configUSE_TIMERS一定要设置为1,当设置为1的话定时器服务任务 就会在启动FreeRTOS调度器的时候自动创建。

configTIMER_TASK_PRIORITY

  • 设置软件定时器服务任务的任务优先级,可以为0~(configMAX_PRIORITIES-1)。优先级一定要根 据实际的应用要求来设置。如果定时器服务任务的优先级设置的高的话,定时器命令队列中的命 令和定时器回调函数就会及时的得到处理。

configTIMER_QUEUE_LENGTH

  • 此宏用来设置定时器命令队列的队列长度。

configTIMER_TASK_STACK_DEPTH

  • 此宏用来设置定时器服务任务的任务堆栈大小。

单次定时器和周期定时器

单次定时器: 只超时一次,调用一次回调函数。可手动再开启定时器;

周期定时器: 多次超时,多次调用回调函数

五、软件定时器相关API函数

1. 创建软件定时器 

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

参数:

  • pcTimerName:软件定时器名称
  • xTimerPeriodInTicks:定时超时时间,单位:系统时钟节拍。宏 pdMS_TO_TICKS() 可用于将以毫秒为单位指定的时间转换为以 tick 为单位指定的时间。
  • uxAutoReload:定时器模式, pdTRUE:周期定时器, pdFALSE:单次定时器
  • pvTimerID:软件 定时器 ID,用于多个软件定时器公用一个超时回调函数
  • pxCallbackFunction:软件定时器超时回 调函数

返回值:

成功:定时器句柄

失败:NULL

2. 开启软件定时器

BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xBlockTime );

参数:

  • xTimer:待开启的软件定时器的句柄
  • xTickToWait:发送命令到软件定时器命令队列的最大等待时 间 返回值: pdPASS:开启成功 pdFAIL:开启失败

3. 停止软件定时

BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xBlockTime );

参数与返回值同上。

4. 复位软件定时器

BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xBlockTime );

参数与返回值同上。 该功能将使软件定时器的重新开启定时,复位后的软件定时器以复位时的时刻作为开启时刻重新 定时。

5. 更改软件定时器定时时间

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

  • xNewPeriod:新的定时超时时间,单位:系统时钟节拍。

其余参数与返回值同上

六、实验

实验需求

创建两个定时器:

定时器1,周期定时器,每1秒打印一次 zyf handsome

定时器2,单次定时器,启动后 2 秒打印一次 lirb beautiful

cubeMX配置

如果要使用软件定时器的话宏configUSE_TIMERS一定要设置为1,当设置为1的话定时器服务任务 就会在启动FreeRTOS调度器的时候自动创建

 

代码实现

void MX_FREERTOS_Init(void) {
  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* USER CODE BEGIN RTOS_MUTEX */
  /* add mutexes, ... */
  /* USER CODE END RTOS_MUTEX */

  /* USER CODE BEGIN RTOS_SEMAPHORES */
  /* add semaphores, ... */
  /* USER CODE END RTOS_SEMAPHORES */

  /* Create the timer(s) */
  /* definition and creation of myTimer01 */
  osTimerDef(myTimer01, Callback01);
  myTimer01Handle = osTimerCreate(osTimer(myTimer01), osTimerPeriodic, NULL);

  /* definition and creation of myTimer02 */
  osTimerDef(myTimer02, Callback02);
  myTimer02Handle = osTimerCreate(osTimer(myTimer02), osTimerOnce, NULL);

  /* USER CODE BEGIN RTOS_TIMERS */
  /* start timers, add new ones, ... */
  /* USER CODE END RTOS_TIMERS */

  /* USER CODE BEGIN RTOS_QUEUES */
  /* add queues, ... */
  /* USER CODE END RTOS_QUEUES */

  /* Create the thread(s) */
  /* definition and creation of defaultTask */
  osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
  defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);

  /* USER CODE BEGIN RTOS_THREADS */
  /* add threads, ... */
  /* USER CODE END RTOS_THREADS */

}

/* USER CODE BEGIN Header_StartDefaultTask */
/**
  * @brief  Function implementing the defaultTask thread.
  * @param  argument: Not used
  * @retval None
  */
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN StartDefaultTask */
	osTimerStart(myTimer01Handle,1000);
	//xTimerChangePeriod(myTimer01Handle, pdMS_TO_TICKS(1000), 0);
	osTimerStart(myTimer02Handle,2000);
  /* Infinite loop */
  for(;;)
  {
		
    osDelay(1);
  }
  /* USER CODE END StartDefaultTask */
}

/* Callback01 function */
void Callback01(void const * argument)
{
  /* USER CODE BEGIN Callback01 */
	
	printf("zyf handsome!\r\n");
	
  /* USER CODE END Callback01 */
}

/* Callback02 function */
void Callback02(void const * argument)
{
  /* USER CODE BEGIN Callback02 */
	printf("lirb beautiful!\r\n");
  /* USER CODE END Callback02 */
}

### ComfyUI Florence-2-base 模型使用指南 #### 模型安装路径 将下载好的 `Florence-2-base` 模型文件放置到指定目录下即可完成安装。具体路径为 `ComfyUI_windows_portable\ComfyUI\models\checkpoints` 文件夹中[^1]。 #### 模型特性概述 `Florence-2-base` 是一种基于图像反推提示词的模型,其特点是速度快、显存占用,并且能够提供与 JoyCaption 类似的高质量结果[^3]。该模型的基础版本(Base 版本)大小约为 1GB,在运行时仅需约 0.7GB 的显存资源。 #### 下载地址指引 虽然未直接提及具体的官方下载链接,通常情况下可以访问以下途径获取相关资源: 1. **GitHub 官方仓库**:许多开源项目会发布在其 GitHub 页面上,建议查找 ComfyUIFlorence-2 相关项目的主页。 2. **社区论坛**:例如 Discord 社区或 Reddit 论坛中的 ComfyUI 用户群组可能会分享最新的模型文件和教程。 3. **第三方托管平台**:Hugging Face Models 平台可能也会存在对应的预训练权重文件。 #### 插件工作流配置 对于希望利用插件实现自动化流程的用户来说,可以通过加载特定的工作流来简化操作过程。以下是关于如何设置 `Florence-2-X-PromptGen-v1.5` 工作流的相关说明[^2]: 1. 将所需节点拖入界面并连接好输入输出端口; 2. 调整参数以匹配目需求,比如分辨率调整或者风格化选项设定; 3. 执行生成任务后观察最终成果是否满足预期效果。 ```python import comfyui # 初始化环境变量 comfyui.initialize() # 加载基础版佛罗伦萨模型 model_path = r"ComfyUI_windows_portable\ComfyUI\models\checkpoints\Florence-2-base" base_model = comfyui.load_checkpoint(model_path) # 设置推理条件 input_image = "example.jpg" output_prompts = base_model.generate(input_image, batch_size=4) print(output_prompts) ``` 上述代码片段展示了通过 Python API 接口调用已部署完毕的 Base Model 进行批量处理图片元数据提取的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值