FreeRTOS应用(参数,优先级,延时,钩子,任务,删除函数)

发布时间:2026/7/23 23:51:07

FreeRTOS应用(参数,优先级,延时,钩子,任务,删除函数)
1.任务参数使用2.任务的优先级3.相对延时函数4.绝对延时函数5.空闲钩子函数6.任务句柄7.删除任务函数一.任务参数使用1.void指针可以指向任意类型的数据既可以用任意类型的指针对void指针赋值。例如int *a; void *p; pa;如果将void指针p赋给其它类型的指针则需要强制转换例如a(int*)p2.在不同的标准中ANSI c标准中void不能进行算数运算因为void是无类型每次算数运算就不知道该操作几个字节。而在GNU中可以因为GNU认为void*和char*一样。sizeof(void*)sizeof(char*);3.应用①CubeMX的配置代码在FreeRTOS.c与main.c中加#include user_app.huser_app.h #ifndef __USER_APP_H__ #define __USER_APP_H__ #include usart.h #include stdio.h #include FreeRTOS.h #include task.h #include main.h #include cmsis_os2.h #include string.h void vTaskFunction(void *pvParameters); void vprintfString(const char *pcString); #endifuser_app.c #include user_app.h #define mainDELAY_LOOP_COUNT 0xffffff int fputc(int ch, FILE *f) { HAL_UART_Transmit (huart1 ,(uint8_t*)ch,1,0xffff); return ch; } void vprintfString(const char *pcString) { //临近保护 taskENTER_CRITICAL(); { printf(%s,pcString); } taskEXIT_CRITICAL(); } void vTaskFunction(void *pvParameters) { char *pcTaskName; volatile uint32_t ul; pcTaskName(char*)pvParameters; for(;;) { vprintfString(pcTaskName); for(ul0;ulmainDELAY_LOOP_COUNT ;ul) { //延时 } char cSectionStr1[]task1; char *pcRetPtrstrstr(pcTaskName,cSectionStr1); //对比pcTaskName与cSectionStr1是否一样 if(pcRetPtr !NULL) { HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); } else { HAL_GPIO_TogglePin(LED4_GPIO_Port, LED4_Pin); } } }二.任务的优先级1.优先级的介绍①调度器始终确保可以运行的最高优先级任务是被选中进入运行状态的任务。具有相同优先级的任务会依次进入和退出运行状态。② 用于创建任务的 xTaskCreate() API函数的uxPriority 参数为任务分配其初始优先级。vTaskPrioritySet() API函数在任务创建后改变其优先级。③ 最大优先级数量由FreeRTOSConfig.h 中定义的configMAX_PRIORITIES 编译时配置常量设置。较低的数值优先级表示低优先级任务其中优先级0是最低优先级。可以使用的优先级范围是从0到(configMAX_PRIORITIES – 1)。【建议configMAX_PRIORITIES的值保持在最小值减少RAM的开销和减少执行时间】扩展若将FreeRTOSConfig.h中的configUSE_PORT_OPTIMISED_TASK_SELECTION设置为 0 。如果没有定义configUSE_PORT_OPTIMISED_TASK_SELECTION 或者通用方法是为正在使用的FreeRTOS移植提供的唯一方法就会使用通用方法。在FreeRTOSConfig.h中将configUSE_PORT_OPTIMISED_TASK_SELECTION设置为1时就会使用架构优化的方法。注意并非所有的FreeRTOS移植都提供了架构优化方法。2.测量与滴答中断3.应用CubeMX的配置略代码在FreeRTOS.c与main.c中加#include user_app.huser_app.h #ifndef __USER_APP_H__ #define __USER_APP_H__ #include usart.h #include stdio.h #include FreeRTOS.h #include task.h #include main.h #include cmsis_os2.h #include string.h void vTaskFunction(void *pvParameters); void vprintfString(const char *pcString); #endifuser_app.c #include user_app.h #define mainDELAY_LOOP_COUNT 0xffffff int fputc(int ch, FILE *f) { HAL_UART_Transmit (huart1 ,(uint8_t*)ch,1,0xffff); return ch; } void vprintfString(const char *pcString) { //临近保护 taskENTER_CRITICAL(); { printf(%s,pcString); } taskEXIT_CRITICAL(); } void vTaskFunction(void *pvParameters) { char *pcTaskName; volatile uint32_t ul; pcTaskName(char*)pvParameters; for(;;) { vprintfString(pcTaskName); for(ul0;ulmainDELAY_LOOP_COUNT ;ul) { } char cSectionStr1[]task1; char *pcRetPtrstrstr(pcTaskName,cSectionStr1); if(pcRetPtr !NULL) { HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); } else { HAL_GPIO_TogglePin(LED4_GPIO_Port, LED4_Pin); } } }效果三.相对延时函数1.事件驱动型任务到目前为止创建的任务总是需要执行处理操作并且从未需要等待任何东西因此总是能够进入运行状态。 “连续处理”类型的任务用途有限任务只能在最低优先级下创建。如果这些任务以其他优先级运行就会阻止优先级更低的任务运行。必须将任务重新编写成事件驱动型的任务。事件驱动型的任务具有的不同优先级只有在触发事件发生后才有工作要执行在事件发生前不会进入运行状态。调度器始终选择可以运行的最高优先级任务。如果无法选择高优先级任务例如正在等待某个事件则调度器必须选择可以运行的优先级较低的任务。2.任务的阻塞状态正在等待事件的任务称为处于“阻塞”状态这是“非运行”状态的一个子状态。任务可以进入阻塞状态以等待两种不同类型的事件• 时间性事件这些事件发生在延迟期到期或达到绝对时间时。例如任务可能会进入阻塞状态以等待10毫秒过去。• 同步事件这些事件来自另一个任务或中断。例如任务可能会进入阻塞状态等待队列中的数据到达。同步事件涵盖了广泛的事件类型。队列、二进制/计数信号量、互斥量、递归互斥量、事件组、流缓冲区、消息缓冲区和直接任务通知都可以创建同步事件。任务也可以在同步事件上设置超时从而有效地同时阻塞两种类型的事件。3.挂起和就绪状态①挂起状态挂起状态也是非运行状态的一个子状态。处于挂起状态的任务对调度器不可用。进入挂起状态的唯一方法是调用vTaskSuspend() API函数。退出挂起状态的唯一方法是调用vTaskResume()或xTaskResumeFromISR() API函数。大多数应用程序不使用挂起状态。②就绪状态处于非运行状态且未阻塞或挂起的任务被称为处于就绪状态。它们可以运行因此准备运行但当前不在运行状态。4.vTaskDelay()函数5.应用CubeMX配置代码在FreeRTOS.c与main.c中加#include user_app.huser_app.h #ifndef __USER_APP_H__ #define __USER_APP_H__ #include usart.h #include stdio.h #include FreeRTOS.h #include task.h #include main.h #include cmsis_os2.h #include string.h void vTaskFunction(void *pvParameters); void vprintfString(const char *pcString); #endifuser_app.c #include user_app.h #define mainDELAY_LOOP_COUNT 0xffffff int fputc(int ch, FILE *f) { HAL_UART_Transmit (huart1 ,(uint8_t*)ch,1,0xffff); return ch; } void vprintfString(const char *pcString) { //临近保护 taskENTER_CRITICAL(); { printf(%s,pcString); } taskEXIT_CRITICAL(); } void vTaskFunction(void *pvParameters) { char *pcTaskName; const TickType_t xDelay250mspdMS_TO_TICKS (250); //注意把250ms转换为滴答数 pcTaskName(char*)pvParameters; for(;;) { vprintfString(pcTaskName); vTaskDelay (xDelay250ms ); char cSectionStr1[]task1; char *pcRetPtrstrstr(pcTaskName,cSectionStr1); if(pcRetPtr !NULL) { HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); } else { HAL_GPIO_TogglePin(LED4_GPIO_Port, LED4_Pin); } } }效果四.绝对延时函数CubeMX配置略代码在FreeRTOS.c与main.c中加#include user_app.h在FreeRTOS.c中user_app.h #ifndef __USER_APP_H__ #define __USER_APP_H__ #include usart.h #include stdio.h #include FreeRTOS.h #include task.h #include main.h #include cmsis_os2.h #include string.h void vContinuousProcessingTask(void *pvParameters); void vprintfString(const char *pcString); void vPeriodicTask(void* pvParameters); #endifuser_app.c #include user_app.h #define mainDELAY_LOOP_COUNT 0xfffff int fputc(int ch, FILE *f) { HAL_UART_Transmit (huart1 ,(uint8_t*)ch,1,0xffff); return ch; } void vprintfString(const char *pcString) { //临近保护 taskENTER_CRITICAL(); { printf(%s,pcString); } taskEXIT_CRITICAL(); } void vContinuousProcessingTask(void *pvParameters) { char *pcTaskName; volatile uint32_t ul; pcTaskName(char*)pvParameters ; for(;;) { vprintfString(pcTaskName); for(ul0;ulmainDELAY_LOOP_COUNT;ul) { } char*pcRetPtrstrstr(pcTaskName ,task1); if(pcRetPtr !NULL) { HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); } else { HAL_GPIO_TogglePin(LED4_GPIO_Port, LED4_Pin); } } } void vPeriodicTask(void* pvParameters) { TickType_t xLastWakeTime; const TickType_t xDelay250mspdMS_TO_TICKS (250UL); const char *a(char*) pvParameters; xLastWakeTime xTaskGetTickCount (); for(;;) { vprintfString(a); vTaskDelayUntil (xLastWakeTime ,xDelay250ms ); } }效果五.空闲钩子函数应用CubeMX的配置代码在FreeRTOS.c与main.c中加#include user_app.h在FreeRTOS中user_app.h #ifndef __USER_APP_H__ #define __USER_APP_H__ #include usart.h #include stdio.h #include FreeRTOS.h #include task.h #include main.h #include cmsis_os2.h #include string.h void vContinuousProcessingTask(void *pvParameters); void vprintfString(const char *pcString,uint32_t ulValue); #endifuser_app.c #include user_app.h #define mainDELAY_LOOP_COUNT 0xfffff uint32_t ulIdleCycleCount0; int fputc(int ch, FILE *f) { HAL_UART_Transmit (huart1 ,(uint8_t*)ch,1,0xffff); return ch; } void vprintfString(const char *pcString,uint32_t ulValue) { //临近保护 taskENTER_CRITICAL(); { printf(%s,pcString); printf(ulIdleCycleCount%d\n\r,ulValue); } taskEXIT_CRITICAL(); } void vContinuousProcessingTask(void *pvParameters) { char *pcTaskName; //volatile uint32_t ul; pcTaskName(char*)pvParameters ; const TickType_t xDelay250mspdMS_TO_TICKS (250); for(;;) { vprintfString(pcTaskName,ulIdleCycleCount); vTaskDelay (xDelay250ms ); char*pcRetPtrstrstr(pcTaskName ,task1); if(pcRetPtr !NULL) { HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); } else { HAL_GPIO_TogglePin(LED4_GPIO_Port, LED4_Pin); } } }效果六.任务句柄应用CubeMX的配置略代码在FreeRTOS.c与main.c中加#include user_app.huser_app.h #ifndef __USER_APP_H__ #define __USER_APP_H__ #include usart.h #include stdio.h #include FreeRTOS.h #include task.h #include main.h #include cmsis_os2.h #include string.h void vTask1(void *pvParameters); void vprintfString(const char *pcString); void vTask2(void* pvParameters); #endifuser_app.c #include user_app.h #define mainDELAY_LOOP_COUNT 0xfffff extern osThreadId_t Task1Handle; extern osThreadId_t Task2Handle; int fputc(int ch, FILE *f) { HAL_UART_Transmit (huart1 ,(uint8_t*)ch,1,0xffff); return ch; } void vprintfString(const char *pcString) { //临近保护 taskENTER_CRITICAL(); { printf(%s,pcString); // printf(ulIdleCycleCount%d\n\r,ulValue); } taskEXIT_CRITICAL(); } void vTask1(void *pvParameters) { UBaseType_t uxPriorityuxTaskPriorityGet(NULL); for(;;) { vprintfString(Task1 is Running\n\r); vprintfString (About to raise the Task2 priority\n\r); vTaskPrioritySet (Task2Handle,(uxPriority1)); //注意 HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); } } void vTask2(void* pvParameters) { UBaseType_t uxPriorityuxTaskPriorityGet(NULL); for(;;) { vprintfString(Task2 is Running\n\r); vprintfString (About to lower the Task2 priority\n\r); vTaskPrioritySet(NULL,(uxPriority -2)); //注意 HAL_GPIO_TogglePin(LED4_GPIO_Port, LED4_Pin); } }效果七.删除任务函数应用在FreeRTOS.c与main.c中加#include user_app.huser_app.h #ifndef __USER_APP_H__ #define __USER_APP_H__ #include usart.h #include stdio.h #include FreeRTOS.h #include task.h #include main.h #include cmsis_os2.h #include string.h void vTask1(void *pvParameters); void vprintfString(const char *pcString); void vTask2(void* pvParameters); #endifuser_app.c #include user_app.h TaskHandle_t xTask2Handle; extern osThreadId_t Task1Handle; extern osThreadId_t Task2Handle; int fputc(int ch, FILE *f) { HAL_UART_Transmit (huart1 ,(uint8_t*)ch,1,0xffff); return ch; } void vprintfString(const char *pcString) { //临近保护 taskENTER_CRITICAL(); { printf(%s,pcString); } taskEXIT_CRITICAL(); } void vTask1(void *pvParameters) { const TickType_t xDelay100mspdMS_TO_TICKS (100UL); for(;;) { vprintfString(Task1 is Running\n\r); xTaskCreate(vTask2,Task 2,1000,NULL,osPriorityLow1,xTask2Handle); } } void vTask2(void* pvParameters) { HAL_GPIO_TogglePin(LED4_GPIO_Port, LED4_Pin); vprintfString (Task2 is running and abut to delete itself\n\r); vTaskDelete (xTask2Handle ); }效果

相关新闻

EIP低代码平台介绍

EIP低代码平台介绍

2026/7/23 23:51:07

EIP低代码平台 🔥 自研可视化表单引擎 拖拽流程引擎双核心,基于.NET 10 Vue2 Redis MySQL 分层模块化架构,完整 RBAC 权限、多渠道消息推送、全链路运维监控、企业微信 / 钉钉原生集成,开箱即用企业级私有化后台解决方案 开源…

北京四合院的味道,怎么“搬”进墓园?

北京四合院的味道,怎么“搬”进墓园?

2026/7/23 23:51:07

北京桃峰园“京韵华章” 做了一件很“北京”的事:把四合院、门扣、花窗、印玺、玉璧等京韵文化元素,深度萃取进墓园设计。 项目总占地2600㎡,遵循“五进礼序”空间格局,规划了京安苑、京禅苑、京福苑、京和苑、京华苑五大主题苑区…

生物医学大模型技术解析与应用实践

生物医学大模型技术解析与应用实践

2026/7/23 23:41:06

1. 生物医学大模型的现状与突破过去三年里,生物医学领域正在经历一场由大模型引发的技术革命。2023年Nature Medicine的一篇综述显示,全球已有超过47个专门针对生物医学领域训练的大模型,参数量从亿级到千亿级不等。这些模型正在改变从基础研…

西门子 Eigen 落地中国带来行业启示:工业 AI 智能体腾飞,底层实时操作系统成关键基石

西门子 Eigen 落地中国带来行业启示:工业 AI 智能体腾飞,底层实时操作系统成关键基石

2026/7/24 1:41:11

2026 世界人工智能大会期间,西门子正式面向中国市场首发工业自动化工程 AI 智能体 Eigen,迅速成为工业智能化赛道焦点产品。作为全球为数不多可自主完成全链路自动化工程任务的工业 AI 系统,Eigen 跳出传统 AI 工具仅提供参考建议的局限&…

2025-2026计算机类期刊推荐:从顶刊到“保底”,选对期刊少走弯路

2025-2026计算机类期刊推荐:从顶刊到“保底”,选对期刊少走弯路

2026/7/24 1:41:11

对于计算机专业的学生和研究者来说,论文写出来只是第一步,往哪投才是真正的难题。选错期刊,轻则被拒后反复转投浪费半年时间,重则投到预警期刊直接“白干”。今天这篇文章,帮你梳理2025-2026年计算机类期刊的最新格局—…

深入解析ADS7851EVM-PDK:高精度ADC评估套件的硬件设计与性能测试实战

深入解析ADS7851EVM-PDK:高精度ADC评估套件的硬件设计与性能测试实战

2026/7/24 1:41:11

1. 项目概述:深入解析ADS7851EVM-PDK评估套件在数据采集、工业自动化、医疗仪器和高端测试测量领域,高精度、高速的模数转换器(ADC)是系统性能的基石。作为一名长期与各类ADC打交道的硬件工程师,我深知在项目初期&…

探秘 `malloc`:超量分配背后的内存分配器难题与技术权衡!

探秘 `malloc`:超量分配背后的内存分配器难题与技术权衡!

2026/7/24 1:41:11

深入探究:为何 malloc 超量分配?实现内存分配器竟有这么多难题!2026 年 7 月 20 日,阅读时长 11 分钟。几乎所有人在编写“安全”的 C 程序时都见过这样一行代码:void *p malloc(13); 我们知道这行代码的作用&#xf…

电力系统故障分类:小波变换与图注意力网络融合模型

电力系统故障分类:小波变换与图注意力网络融合模型

2026/7/24 1:41:11

1. 项目背景与核心挑战电力系统故障分类是智能电网运行维护中的关键环节。同步相量测量单元(PMU)以每秒30-120帧的频率采集电网各节点的电压电流信号,这些毫秒级数据流中蕴含着系统运行状态的完整信息。当发生发电机跳闸、负荷切除或短路故障时,信号波形…

Java生态下的企业级AI开发实践与优化

Java生态下的企业级AI开发实践与优化

2026/7/24 1:31:11

1. 为什么Java团队需要关注AI开发?在传统印象中,AI开发似乎是Python的专属领域,但实际情况正在发生变化。作为企业级应用开发的主力军,Java生态正在快速拥抱AI技术栈。我最近主导的几个企业级AI项目落地案例表明,Java团…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/23 3:40:08

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/23 4:40:05

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵(连锁便利店/商超标准配置) 自助收银Kiosk一体机:顾客结算、自助核销优惠券、商品素材预览;运营折叠平板:店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/23 1:54:13

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…

Django毕设项目:基于 Django 的 智能化学生综合素质测评审核系统 校园学生评优评奖综合管理系统(源码+文档,讲解、调试运行,定制等)

Django毕设项目:基于 Django 的 智能化学生综合素质测评审核系统 校园学生评优评奖综合管理系统(源码+文档,讲解、调试运行,定制等)

2026/7/24 0:01:07

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

[具身智能-634]:Python 封装的地平线 VIO 多媒体库:libsrcampy库详解

[具身智能-634]:Python 封装的地平线 VIO 多媒体库:libsrcampy库详解

2026/7/24 0:01:07

srcampy /libsrcampy 名称释义先明确结论: 官方文档没有公布标准化英文全称,是地平线内部项目缩写;行业公认拆解如下:srcampy Source Amplifier Python bindingsrc Source(图像源:MIPI Sensor、视频源&am…

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

2026/7/24 0:01:07

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…