Freertos任务管理

一.任务状态理论讲解

正在执行的任务状态是running,其他执行的等待执行的任务状态是ready 

1.修改间隔时间

2.任务状态 

  

处于各个状态的任务是怎样被管理起来的:链表 

3.代码

TaskHandle_t xHandleTask1;
TaskHandle_t xHandleTask3;static int task1flagrun = 0;
static int task2flagrun = 0;
static int task3flagrun = 0;void Task1Function(void * param)
{TickType_t tStart = xTaskGetTickCount();TickType_t t;int flag = 0;while (1){t = xTaskGetTickCount();task1flagrun = 1;task2flagrun = 0;task3flagrun = 0;printf("1");if (!flag && (t > tStart + 10)){vTaskSuspend(xHandleTask3);flag = 1;}if (t > tStart + 20){vTaskResume(xHandleTask3);}}
}void Task2Function(void * param)
{while (1){task1flagrun = 0;task2flagrun = 1;task3flagrun = 0;printf("2");vTaskDelay(10);}
}void Task3Function(void * param)
{while (1){task1flagrun = 0;task2flagrun = 0; task3flagrun = 1;printf("3");}
}/*-----------------------------------------------------------*/StackType_t xTask3Stack[100];
StaticTask_t xTask3TCB;StackType_t xIdleTaskStack[100];
StaticTask_t xIdleTaskTCB;/** The buffers used here have been successfully allocated before (global variables)*/
void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,StackType_t ** ppxIdleTaskStackBuffer,uint32_t * pulIdleTaskStackSize )
{*ppxIdleTaskTCBBuffer = &xIdleTaskTCB;*ppxIdleTaskStackBuffer = xIdleTaskStack;*pulIdleTaskStackSize = 100;
}int main( void )
{#ifdef DEBUGdebug();
#endifprvSetupHardware();printf("Hello, world!\r\n");xTaskCreate(Task1Function, "Task1", 100, NULL, 1, &xHandleTask1);xTaskCreate(Task2Function, "Task2", 100, NULL, 1, NULL);xHandleTask3 = xTaskCreateStatic(Task3Function, "Task3", 100, NULL, 1, xTask3Stack, &xTask3TCB);/* Start the scheduler. */vTaskStartScheduler();/* Will only get here if there was not enough heap space to create theidle task. */return 0;
}

 

 二.vTaskDelay和vTaskDelayUntil

vTaskDelay:至少等待指定个数的Tick Interrupt才能变为就绪状态

xTaskDelayUntil

  • 返回pdTRUE表示确实延迟了,返回pdFALSE表示没有发生延迟(因为延迟的时间点早就过了)

  • 等待到指定的绝对时刻,才能变为就绪态。

代码1 vTaskDelay

TaskHandle_t xHandleTask1;
TaskHandle_t xHandleTask3;static int task1flagrun = 0;
static int task2flagrun = 0;
static int task3flagrun = 0;static int rands[]={3,56,23,5,59};void Task1Function(void * param)
{TickType_t tStart = xTaskGetTickCount();int i=0;int j=0;while (1){		task1flagrun = 1;task2flagrun = 0;task3flagrun = 0;for( i= 0; i < rands[j] ; i++)printf("1");j++;if ( j == 5)j = 0;vTaskDelay(20);}
}void Task2Function(void * param)
{while (1){task1flagrun = 0;task2flagrun = 1;task3flagrun = 0;printf("2");}
}void Task3Function(void * param)
{while (1){task1flagrun = 0;task2flagrun = 0; task3flagrun = 1;printf("3");}
}/*-----------------------------------------------------------*/StackType_t xTask3Stack[100];
StaticTask_t xTask3TCB;StackType_t xIdleTaskStack[100];
StaticTask_t xIdleTaskTCB;/** The buffers used here have been successfully allocated before (global variables)*/
void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,StackType_t ** ppxIdleTaskStackBuffer,uint32_t * pulIdleTaskStackSize )
{*ppxIdleTaskTCBBuffer = &xIdleTaskTCB;*ppxIdleTaskStackBuffer = xIdleTaskStack;*pulIdleTaskStackSize = 100;
}int main( void )
{#ifdef DEBUGdebug();
#endifprvSetupHardware();printf("Hello, world!\r\n");xTaskCreate(Task1Function, "Task1", 100, NULL, 2, &xHandleTask1);xTaskCreate(Task2Function, "Task2", 100, NULL, 1, NULL);xHandleTask3 = xTaskCreateStatic(Task3Function, "Task3", 100, NULL, 1, xTask3Stack, &xTask3TCB);/* Start the scheduler. */vTaskStartScheduler();/* Will only get here if there was not enough heap space to create theidle task. */return 0;
}

 可以看到任务1执行的时间不一样,但是进入delay休眠的时间是一样的,都是20ms。

 

代码2 vTaskDelayUntil

BaseType_t xTaskDelayUntil( TickType_t * const pxPreviousWakeTime,const TickType_t xTimeIncrement ) ;
// 1  延迟直到 *pxPre+xTime
// 2  *pxPre=*pxPre+xTime
TaskHandle_t xHandleTask1;
TaskHandle_t xHandleTask3;static int task1flagrun = 0;
static int task2flagrun = 0;
static int task3flagrun = 0;static int rands[]={3,56,23,5,59};void Task1Function(void * param)
{TickType_t tStart = xTaskGetTickCount();int i=0;int j=0;while (1){		task1flagrun = 1;task2flagrun = 0;task3flagrun = 0;for( i= 0; i < rands[j] ; i++)printf("1");j++;if ( j == 5)j = 0;
#if 0vTaskDelay(20);
#elsexTaskDelayUntil(&tStart,20);
#endif}
}void Task2Function(void * param)
{while (1){task1flagrun = 0;task2flagrun = 1;task3flagrun = 0;printf("2");}
}void Task3Function(void * param)
{while (1){task1flagrun = 0;task2flagrun = 0; task3flagrun = 1;printf("3");}
}/*-----------------------------------------------------------*/StackType_t xTask3Stack[100];
StaticTask_t xTask3TCB;StackType_t xIdleTaskStack[100];
StaticTask_t xIdleTaskTCB;/** The buffers used here have been successfully allocated before (global variables)*/
void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,StackType_t ** ppxIdleTaskStackBuffer,uint32_t * pulIdleTaskStackSize )
{*ppxIdleTaskTCBBuffer = &xIdleTaskTCB;*ppxIdleTaskStackBuffer = xIdleTaskStack;*pulIdleTaskStackSize = 100;
}int main( void )
{#ifdef DEBUGdebug();
#endifprvSetupHardware();printf("Hello, world!\r\n");xTaskCreate(Task1Function, "Task1", 100, NULL, 2, &xHandleTask1);xTaskCreate(Task2Function, "Task2", 100, NULL, 1, NULL);xHandleTask3 = xTaskCreateStatic(Task3Function, "Task3", 100, NULL, 1, xTask3Stack, &xTask3TCB);/* Start the scheduler. */vTaskStartScheduler();/* Will only get here if there was not enough heap space to create theidle task. */return 0;
}

以每20ms周期性的执行 

三.空闲任务及钩子函数 

实验1

执行任务1,任务1的任务是创建任务2,当任务2创建成功,任务2的优先级更高,直接执行任务2。任务2的任务是打印一个2,然后进入阻塞,任务1运行删除任务。

extern void Task2Function(void * param);void Task1Function(void * param)
{TaskHandle_t xHandleTask2;BaseType_t xReturn;while (1){printf("1");xReturn=xTaskCreate(Task2Function, "Task2", 1024, NULL, 2, &xHandleTask2);if(xReturn!=pdPASS){printf("xTaskCreate err\r\n");}vTaskDelete(xHandleTask2);}
}void Task2Function(void * param)
{while (1){printf("2");vTaskDelay(2);}
}/*-----------------------------------------------------------*/int main( void )
{TaskHandle_t xHandleTask1;#ifdef DEBUGdebug();
#endifprvSetupHardware();printf("Hello, world!\r\n");xTaskCreate(Task1Function, "Task1", 100, NULL, 1, &xHandleTask1);/* Start the scheduler. */vTaskStartScheduler();/* Will only get here if there was not enough heap space to create theidle task. */return 0;
}

并没有执行我们想要的清理工作。

我们进行的清理工作(内存回收工作)是放在空闲任务里面的。

实验2 

执行自杀操作

extern void Task2Function(void * param);void Task1Function(void * param)
{TaskHandle_t xHandleTask2;BaseType_t xReturn;while (1){printf("1");xReturn=xTaskCreate(Task2Function, "Task2", 1024, NULL, 2, &xHandleTask2);if(xReturn!=pdPASS){printf("xTaskCreate err\r\n");}//vTaskDelete(xHandleTask2);}
}void Task2Function(void * param)
{while (1){printf("2");vTaskDelay(2);vTaskDelete(NULL);//执行自杀操作}
}/*-----------------------------------------------------------*/int main( void )
{TaskHandle_t xHandleTask1;#ifdef DEBUGdebug();
#endifprvSetupHardware();printf("Hello, world!\r\n");xTaskCreate(Task1Function, "Task1", 100, NULL, 1, &xHandleTask1);/* Start the scheduler. */vTaskStartScheduler();/* Will only get here if there was not enough heap space to create theidle task. */return 0;
}

执行自杀操作应该由空闲任务帮你执行清理工作

配置钩子函数

在main函数里面创建任务1,优先级是0,任务1里面创建任务2,任务2优先级更高执行完之后就自杀。之后任务1和任务0可以交替执行

 

四.任务调度算法

static int task1flagrun = 0;
static int task2flagrun = 0;
static int task3flagrun = 0;
static int taskidleflagrun = 0;void Task1Function(void * param)
{//volatile char buf[500];//int i;while (1){task1flagrun = 1;task2flagrun = 0;task3flagrun = 0;taskidleflagrun = 0;printf("1");}
}void Task2Function(void * param)
{int i = 0;while (1){task1flagrun = 0;task2flagrun = 1;task3flagrun = 0;taskidleflagrun = 0;printf("2");}
}void Task3Function(void * param)
{const TickType_t xDelay5ms=pdMS_TO_TICKS(5UL);while (1){task1flagrun = 0;task2flagrun = 0; task3flagrun = 1;taskidleflagrun=0;printf("3");//如果不休眠的化,其他任务无法得到执行vTaskDelay(xDelay5ms);}
}void vApplicationIdleHook()
{task1flagrun = 0;task2flagrun = 0; task3flagrun = 0;taskidleflagrun=1;
}int main( void )
{#ifdef DEBUGdebug();
#endifprvSetupHardware();printf("Hello, world!\r\n");xTaskCreate(Task1Function, "Task1", 1000, NULL, 0, NULL);xTaskCreate(Task2Function, "Task2", 1000, NULL, 0, NULL);xTaskCreate(Task3Function, "Task3", 1000, NULL, 2, NULL);//优先级最高的任务3先执行/* Start the scheduler. */vTaskStartScheduler();/* Will only get here if there was not enough heap space to create theidle task. */return 0;
}

1.可以抢占

这个宏定义是否可以抢占

 任务3优先级最高,先执行执行完阻塞5ms,其他任务执行。执行任务1,任务2,任务1,任务2,任务0,任务1。5ms到了立刻执行任务3...

A.时间片轮转

  任务3优先级最高,先执行执行完阻塞5ms,其他任务执行。执行任务1,任务2,任务1,任务2,任务0,任务1。5ms到了立刻执行任务3...

B.时间片不轮转

 任务3优先级最高先执行,执行完进入休眠,任务1执行直到任务3休眠结束,任务3执行结束,就接着让任务2执行....

 

2.不可以抢占

 

任务3执行完了进入阻塞,任务1一直执行。如果需要让出CPU资源还是需要自己去主动进入休眠。 

3.空闲任务是否让步于用户任务

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/202166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6个实用又好用的交互原型工具!

在 UI/UX 设计中&#xff0c;原型设计是至关重要的一步。正如用户体验中的其它环节一样&#xff0c;有无数的交互原型工具可以帮助你完成原型设计。市场上有太多的交互原型工具&#xff0c;如果你不知道选择哪一种&#xff0c;那么我们将为你介绍 6 个实用又好用的交互原型工具…

Multidimensional Scaling(MDS多维缩放)算法及其应用

在这篇博客中&#xff0c;我将与大家分享在流形分析领域的一个非常重要的方法&#xff0c;即多维缩放MDS。整体来说&#xff0c;该方法提供了一种将内蕴距离映射到显性欧氏空间的计算&#xff0c;为非刚性形状分析提供了一种解决方案。当初就是因为读了Bronstein的相关工作【1】…

智能优化算法应用:基于鼠群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鼠群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鼠群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鼠群算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

6页手写笔记总结信号与系统常考知识大题知识点

题型一 判断系统特性题型二 求系统卷积题型三 求三大变换正反变换题型四 求全响应题型五 已知微分方程求系统传递函数题型六 已知系统的传递函数求微分方程题型七 画出系统的零极点图&#xff0c;并判断系统的因果性和稳定性 &#xff08;笔记适合快速复习&#xff0c;可能会有…

2023 年最新 FPV 套件评测

FPV 飞行是近年来非常流行的一种新兴运动。它可以让您在第一人称视角下体验飞行的乐趣。FPV 套件可以分为多种类型&#xff0c;根据您的需求和预算&#xff0c;您可以选择合适的套件。 下面我们将对 2023 年最新的几款 FPV 套件进行评测&#xff0c;帮助您选择合适的产品。 Sp…

InST论文复现

论文地址&#xff1a;https://arxiv.org/abs/2211.13203 论文git&#xff1a;https://github.com/zyxElsa/InST 遇到的问题&#xff1a; 1.requests.exceptions.SSLError: HTTPSConnectionPool(hosthuggingface.co, port443): Max retries exceeded with url: /openai/clip-…

一个容器中填值,值太多不换行,而是调小字体大小和行高

<!-- clampLineHeight 重计算行高 --> <!-- clampTextSize 重计算字体大小 --> <!-- 这里的div高8mm, 宽6cm, 文本为text --> <div style"height:8mm;width:6cm;text-align:left"><span :style"{ fontSize: clampTextSize(text, 6cm…

用python测试网络上可达的网络设备

用python测试网络上可达的网络设备 之前使用的os在python中执行ping测试网络中可达的目标&#xff0c;但是他在执行ping命令时脚本会将系统执行ping时的回显内容显示出来&#xff0c;有时这些回显并不是必要的。如果用脚本一次性ping成百上千台网络设备或者URL时会影响美观和阅…

MySQL中的索引①——索引介绍、结构、分类、语法、SQL性能分析

目录 目录 索引概述--> 介绍---> 优缺点---> 索引结构--> ​编辑 存储引擎支持情况---> BTree---> BTree---> Hash---> Hash特点---> 思考题 索引分类--> InnoDB存储引擎中---> 聚集索引---> 二级索引---> 执行过程--…

SpringBootAdmin

SpringBootAdmin 文章目录 SpringBootAdmin创建SpringBootAdmin服务端创建SpringBootAdmin客户端启动应用 总结 github地址 https://github.com/codecentric/spring-boot-admin 可以查到所有的版本号 创建SpringBootAdmin服务端 创建springBoot项目的时候&#xff0c;在ops选项…

外贸平台获客技巧分享!(个人经历)

作为一名从事外贸行业多年的专业人士&#xff0c;我深知在竞争激烈的市场中获取客户的重要性&#xff0c;今天&#xff0c;我想与大家分享一些我在外贸平台上获客的技巧和经验&#xff0c;希望能够帮助到需要的人。 首先&#xff0c;我们需要明确一点&#xff0c;外贸平台是一…

一键抠图|3个智能AI抠图软件实现抠图自由!

听说你对如何利用AI抠图技术去除白色背景感兴趣&#xff1f;设想一下&#xff0c;你有一张某人站在白色背景前的照片&#xff0c;而你只希望能留下这个人物。在过去&#xff0c;你可能需要花费大量时间和精力手动进行抠图。但现在&#xff0c;AI技术来拯救你了&#xff01;AI可…

2024年MCM/ICM美国大学生数学建模竞赛备战指南

01 2024美赛基本要求 1.关于时间&#xff08;北京时间&#xff09; 比赛开始时间&#xff1a; 2024年2月2日6:00至 2024年2月6日9:00 提交截止时间&#xff1a;2024年2月6日10:00 结果发布时间&#xff1a;结果将于2024年5月31日或之前发布 2.关于规则 完整的解决方案现…

Redis应用-缓存

目录 什么是缓存 使用redis作为缓存 缓存的更新策略 通用的淘汰策略 redis内置的淘汰策略 缓存预热 缓存穿透 缓存雪崩 缓存击穿 什么是缓存 缓存(cache)是计算机中一个经典的概念,在很多的场景中都会涉及到. 核心思路就是把一些常用的数据放到触手可及(访问速度更快…

用OpenCV与MFC写一个图像格式转换及简单处理程序

打开不同格式的图形文件&#xff0c;彩色装灰度图像、锐化、高斯滤波、边界检测及将其存储为需求格式是图像处理的最基本的操作。如果单纯用MFC编程&#xff0c;是一个令人头痛的事情&#xff0c;有不少的代码量。可用OpenCV与MFC编程就变得相对简单。下面来详细演示这一编程操…

敏捷:应对软件定义汽车时代的开发模式变革

随着软件定义汽车典型应用场景的落地&#xff0c;汽车从交通工具转向智能移动终端的趋势愈发明显。几十年前&#xff0c;一台好车的定义主要取决于高性能的底盘操稳与动力系统&#xff1b;几年前&#xff0c;一台好车的定义主要取决于智能化系统与智能交互能否满足终端用户的用…

五肽-13|提亮肤色,美白肌肤

五肽-13 INCI名称&#xff1a;五肽-13 说明&#xff1a; 五肽-13是一种合成肽&#xff0c;由丙氨酸、精氨酸、赖氨酸、脯氨酸和缬氨酸组成 功能&#xff1a; 五肽-13起到增白剂的作用 应用程序&#xff1a; 提亮和美白

Unity渲染Stats分析

文章目录 前言一、Stats二、我们主要看渲染状态分析1、FPS2、其他状态信息3、DrawCall4、Batch5、Setpass Call6、在Unity中弱化了DrawCall的概念&#xff0c;我们主要看 Batch 和 Setpass Call 三、使用 Batching&#xff08;合批&#xff09; 降低 Batch &#xff08;渲染批次…

【c】杨辉三角

下面介绍两种方法 1.利用上面性质的第五条&#xff0c;我们可以求各行各列的组合数 2.利用上面性质的第7条&#xff0c;我们可以用数组完成 下面附上代码 1. #include<stdio.h> void fact(int n ,int m )//求组合数 {long long int sum11;long long int sum21;int a…

LTD254次升级 | 订单批打印 • 官网搭“抖音“ • 合伙人添权益

1、 商城订单支持打印功能&#xff1b; 2、 H5/小程序商城新增一款首页样式&#xff1b; 3、 社区中视频支持抖音方式浏览&#xff1b; 4、 极速官微优化管理页面布局、优化海报分享样式&#xff1b; 5、 新增一款轮播模块&#xff1b; 6、 已知问题修复与优化&#xff1b; 01 …