FreeRTOS(软件定时器)

news/2024/11/28 3:28:24/

一、什么是定时器

简单可以理解为闹钟,到达指定一段时间后,就会响铃。 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 */
}


http://www.ppmy.cn/news/979246.html

相关文章

用C++实现老鹰捉小鸡的小游戏之一

今天突发奇想&#xff0c;让文心一言生成老鹰捉小鸡的游戏代码。麻烦它真的给实现出来了。具体如下 #include <iostream> #include <string>using namespace std;// 游戏角色类 class Role { public:Role(string n) : name(n) {}virtual void protect() 0;void sa…

zeppelin spark kerberos 使用过程遇到的问题

参考配置教程: Configure Zeppelin for a Kerberos-Enabled Cluster zeppelin spark kerberos 使用过程遇到的问题 ambari创建zeppelin时,会创建Kerberos account and keytab /etc/security/keytabs/zeppelin.server.kerberos.keytab interpreter配置 keytab Interpreter Ke…

Android adb shell 查看App内存(java堆内存/vss虚拟内存/详细的内存状况/内存快照hprof)和系统可用内存

1.adb shell 获取app 进程的pid adb shell "ps|grep com.xxx包名"根据某个渠道包&#xff0c;去查询对应的pid&#xff0c;如下所示&#xff1a; 2.通过adb shell 查看设备的java dalvik 堆内存的最大值 执行命令行&#xff1a; adb shell getprop dalvik.vm.h…

Autosar MCAL-S32K324Dio配置-基于EB

文章目录 DioPost Build Variant UsedConfig VariantDioConfigDioPortDioChannelDioChannelGroupDioConfigDio Development Error DetectSIUL2 IP Dio Development Error DetectDio Version Info ApiDio Reverse Port BitsDio Flip Channel ApiDio Rea

【考研英语语法及长难句】小结

【 考场攻略汇总 】 考点汇总 考场攻略 #1 断开长难句只看谓语动词&#xff0c;不考虑非谓语动词先找从句&#xff0c;先看主句 考场攻略 #2 抓住谓语动词&#xff0c;抓住句子最核心的表述动作或内容通过定位谓语动词&#xff0c;找到复杂多变的主语通过谓语动词的数量&…

【ruby on rails】M1遇到的一些安装问题

1. homebrew位置变了 原来的Cellar Homebrew Caskroom 都是在 /usr/local/下面 M1在/opt/homebrew下面 2. 装ruby M1电脑安装ruby&#xff0c;装不上的问题 RUBY_CFLAGS"-w" rbenv install 2.7.43. 装puma报错 gem install puma -v 5.5.2 -- --with-openssl-dir…

算法leetcode|64. 最小路径和(rust重拳出击)

文章目录 64. 最小路径和&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 64. 最小路径和&#xff1a; 给定一个包含非负整数的 m x n 网…

el-tabel导出excel表格

1、安装插件 npm install file-saver --save npm install xlsx --save 2、引入插件 import FileSaver from "file-saver"; import * as XLSX from xlsx; 3、在tabel中添加ref属性和导出方法 4、添加方法 exportExcel (excelName) {try {const $e this.$refs[repo…