freertos3

CMSIS的作用:
1.提供了接口标准,便于移植和管理。
2.提供了很多第三方固件,便于业务开发。
3.因为统一了接口,使底层硬件和上层应用耦合降低,更换硬件平台时只需开发人员改变底层硬件的驱动即可,上层业务应用程序无需做改动。

创建任务函数:

osThreadId_t osThreadNew (osThreadFunc_t func, void *argument, const osThreadAttr_t *attr)

osThreadFunc_t func:任务的入口函数 原型:void (*osThreadFunc_t) (void *argument)

void *argument:传递给任务的参数

const osThreadAttr_t *attr:任务的属性

osThreadId_t:任务的ID,找到对应的任务

任务的优先级:

任务的优先级就是代表任务执行的先后顺序。数值越大任务的优先级越高:

osDelay函数的单位是ms。

挂起一个任务:

osStatus_t osThreadSuspend (osThreadId_t thread_id)

osStatus_t:是否挂起成功

osThreadId_t thread_id:要挂起的任务

恢复一个任务:

osStatus_t osThreadResume (osThreadId_t thread_id)

osStatus_t:是否恢复成功

osThreadId_t thread_id:要恢复的任务

动态创建任务和静态创建任务的区别:

1.动态创建任务不需要手动提供栈,栈会由系统自动创建,静态创建任务需要自己提供栈,栈一般由数组来表示。

2.动态创建适用于需要随时创建和删除任务的场景,静态创建任务适用于任务数量确定的场景。

3.动态创建任务需要消耗的资源会比较多,静态创建任务需要消耗的资源比较少。

任务的删除:

删除自己:void osThreadExit (void)

当有任务调用到这个函数时就会被删除。

删除其他任务:osStatus_t osThreadTerminate (osThreadId_t thread_id)

osThreadId_t thread_id:指定要删除哪一个任务

osStatus_t:是否删除成功

使用vTaskDelete函数进行任务的删除,当传递的参数是NULL的时候就是删除自己,当传递的参数是任务的ID的时候就是删除其他的任务。

空闲任务是在系统中没有其他任务在执行的时候执行的一个特殊任务。

空闲任务的作用:

1.空闲任务会监测是否有任务把自己删除了,如果有的话那么就释放他的资源。

2.防止CPU进行空转状态,浪费CPU资源。

如何确定一个任务的栈要设置为多大?

1.确定局部变量的大小

2.任务中函数的调用有关(函数的内部也会使用到局部变量)

如何使用钩子函数:

1.首先在FreeRTOSConfig.h文件中开启空闲钩子的宏,实现空闲任务钩子函数

2.首先在FreeRTOSConfig.h文件中开启滴答钩子的宏,实现滴答任务钩子函数

FreeRTOS中默认的调度算法是 :抢占式调度+时间片轮转。

1.抢占式调度:任务优先级高的可以打断任务优先级低的执行(适用于不同优先级)。

2.时间片轮转:每一个任务拥有相同的时间片(1ms),保证任务执行的公平性,当一个任务的时间片耗尽时任务就必须退出(适用于相同优先级)。

3.协作式调度:使用osdelay休眠函数进行协作式调度。

抢占式调度:

osThreadId_t myTask03Handle;
const osThreadAttr_t myTask03_attributes = {.name = "myTask03",.stack_size = 128 * 4,.priority = (osPriority_t) osPriorityNormal1,
};void StartTask03(void *argument);void StartDefaultTask(void *argument)
{/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */for(;;){printf("StartDefaultTask is start\r\n");//判断ID是否为空,为空的话就将任务创建出来if(myTask03Handle == NULL){//创建任务3,任务3的优先级比任务2要高myTask03Handle = osThreadNew(StartTask03, NULL, &myTask03_attributes);}printf("StartDefaultTask is end\r\n");osDelay(500);}/* USER CODE END StartDefaultTask */
}void StartTask03(void *argument)
{for(;;){printf("StartTask03 is running\r\n");osDelay(500);}
}

时间片轮转:

void StartDefaultTask(void *argument)
{/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */int i = 0;for(;;){printf("StartDefaultTask is start\r\n");for(i = 0; i < 9000000; i++){//模拟消耗时间片;}printf("StartDefaultTask is end\r\n");osDelay(500);}/* USER CODE END StartDefaultTask */
}

作业:

1、总结任务的调度算法

2、总结任务的状态以及是怎样进行转换的

Ready:就绪态,在创建任务后会进入就绪态。

Running:运行态,任务正在运行。

Blocked:阻塞态,因为等待某一个事件进入了休眠的状态(时间,互斥锁,信号量)。

Suspended:挂起态,将任务挂起后任务还是存在的,可以进行恢复。

Running->Suspnded:使用vTaskSuspend将任务挂起。

Ready->Suspnded:使用vTaskSuspend将任务挂起,使用vTaskResume将任务恢复。

Running->Blocked:使用休眠函数或者是被信号量,互斥锁等阻塞。

Blocked->Suspnded:使用vTaskSuspend将任务挂起。

Blocked->Ready:当休眠完成后或者是当等待到信号量,互斥锁等进行就绪态。

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

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

相关文章

【《高性能 MySQL》笔记】性能优化

学习知识最快最好的方式就是问对问题。 本文将通过“问正确的问题”的方式循序渐进地深入总结性能优化相关知识。 性能优化基础 Q1:什么是“性能”? 即响应时间(RT,Response Time),完成某个任务所需要的时间度量。 Q2:什么是“性能优化”? 性能优化为在一定工作负…

Jmeter+Ant+Git/SVN+Jenkins实现持续集成接口测试,一文精通(一)

前言 Jmeter&#xff0c;Postman一些基本大家相比都懂。那么真实在项目中去使用&#xff0c;又是如何使用的呢&#xff1f;本文将一文详解jmeter接口测试 一、接口测试分类 二、目前接口架构设计 三、市面上的接口测试工具 四、Jmeter简介&#xff0c;安装&#xff0c;环境…

opencv解析系列 - 基于DOM提取大面积植被(如森林)

Note&#xff1a;简单提取&#xff0c;不考虑后处理&#xff08;填充空洞、平滑边界等&#xff09; #include <iostream> #include "opencv2/imgproc.hpp" #include "opencv2/highgui.hpp" #include <opencv2/opencv.hpp> using namespace cv…

深入理解React中的useReducer:管理复杂状态逻辑的利器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【机器学习】神经网络 | 神经网络基础知识全梳理,神经网络组成,优化及其常见的神经网络

文章目录 1 神经网络组成2 神经网络的优化2.1 反向传播算法 BP算法2.2 梯度下降算法2.3 训练中可能会遇到的问题2.3.1 如何避免过拟合&#xff1f;2.3.2 如何避免到局部最小&#xff1f;2.3.3如何避免梯度消失和梯度爆炸 &#xff1f; 3 常见的一些神经网络3.1 感知机&#xff…

​​​​​​​ARCGIS API for Python进行城市区域提取

ArcGIS API for Python主要用于Web端的扩展和开发&#xff0c;提供简单易用、功能强大的Python库&#xff0c;以及大数据分析能力&#xff0c;可轻松实现实时数据、栅格数据、空间数据等多源数据的接入和GIS分析、可视化&#xff0c;同时提供对平台的空间数据管理和组织管理功能…

Mac提示Could not set environment: 150如何进入恢复模式

原因是系统集成保护 (SIP) 的 macOS 安全功能会影响磁盘权限和操作&#xff0c;需要访问 macOS 恢复窗口以输入一组命令并禁用 SIP。 如何关闭SIP&#xff1f; Intel芯片 1、重启电脑并常摁commandR&#xff0c;直到看到APPLE图标 2、从菜单栏转到Utilities > Terminal。…

docker-compose这下会用了吗?

概要 默认的模板文件是 docker-compose.yml&#xff0c;其中定义的每个服务可以通过 image 指令指定镜像或 build 指令&#xff08;需要 Dockerfile&#xff09;来自动构建。 注意如果使用 build 指令&#xff0c;在 Dockerfile 中设置的选项(例如&#xff1a;CMD, EXPOSE, V…

LeetCode 2044.统计按位或能得到最大值的子集数目

给你一个整数数组 nums &#xff0c;请你找出 nums 子集 按位或 可能得到的 最大值 &#xff0c;并返回按位或能得到最大值的 不同非空子集的数目 。 如果数组 a 可以由数组 b 删除一些元素&#xff08;或不删除&#xff09;得到&#xff0c;则认为数组 a 是数组 b 的一个 子集…

vue如何优化首页加载速度

优化 Vue.js 应用的首页加载速度是提升用户体验的关键之一。以下是一些优化 Vue.js 应用首页加载速度的常见方法&#xff1a; 代码分割&#xff08;Code Splitting&#xff09;&#xff1a; 将应用代码拆分成多个小块&#xff0c;并按需加载。可以使用 Vue Router 的懒加载功能…

ElasticSearch 与java的结合使用(一)

引入依赖 <dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.15.2</version><exclusions><!-- 排除自带的logback依赖 --><exclusion><groupId>org.apac…

docker的安装与使用

1.打开启动或关闭windows功能 2.勾选Hyper-V、适用于Linux的Windows子系统&#xff0c;虚拟机平台三项 若没有Hyper-V&#xff0c;以管理员身份执行以下文件 创建Hyper-V Installer.cmd&#xff0c;然后写入 pushd "%~dp0" dir /b %SystemRoot%\servicing\Package…

51单片机基础篇系列-51单片机基础开发流程和基本I/O口

&#x1f308;个人主页: 会编程的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” 51开发平台的组成 单片机应用系统&#xff08;也叫目标系统&#xff09; 硬件&#xff1a; 用户可以自己设计制作&#xff0c;也可以采用现成的开发板快捷搭建 软件&#xff1a; …

扁平数据转树形结构,让数据管理更清晰

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

LangChain原理深度解析:构建高效语言模型应用的关键框架

LangChain原理介绍 摘要&#xff1a; 本文将详细介绍LangChain的基本原理&#xff0c;包括其设计思路、核心组件、工作流程以及在语言模型应用开发中的应用。通过通俗易懂的语言&#xff0c;本文旨在让读者对LangChain有一个全面的了解。 关键词&#xff1a; LangChain&#…

1.初学docker

这是在centos7上的基本操作用法。 一、基本操作 # 安装yum源 yum install -y yum-utils # 配置yum源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装docker yum install -y docker-ce-cli containerd.io docker-buildx-plu…

数学计算器

1 问题 该代码提供了一个简单的数学计算器&#xff0c;可以让用户输入一个数学表达式并计算结果。这个计算器可以用于执行各种基本数学运算&#xff0c;如加法、减法、乘法、除法、幂运算等&#xff0c;也可以处理更复杂的表达式&#xff0c;如三角函数、对数、指数等。 2 方法…

C语言——函数指针——函数指针数组 (详解)

函数指针数组 函数指针数组的作用 函数指针数组是一个数组&#xff0c;其中的每个元素都是一个函数指针。函数指针是指向函数的指针变量&#xff0c;可以用来调用相应的函数。函数指针数组的作用是可以根据需要动态地选择并调用不同的函数。 函数指针数组的使用场景有很多&…

MIT 6.858 计算机系统安全讲义 2014 秋季(四)

译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 污点跟踪 注意&#xff1a; 这些讲座笔记是从 2014 年 6.858 课程网站上发布的笔记上稍作修改的。 安卓安全策略 这篇论文试图解决什么问题&#xff1f; 应用程序可以外泄用户的私人数据并发送到某个服务器。 高层次…

Linux bzip2命令教程:文件压缩与解压缩实战(附案例详解和注意事项)

Linux bzip2命令介绍 bzip2是一个基于命令行的文件压缩器&#xff0c;它使用Burrows-Wheeler块排序文本压缩算法和哈夫曼编码来进行压缩。它的主要功能是压缩和解压缩文件&#xff0c;将多个文件绑定成一个单一的文件&#xff0c;这样可以减少原始文件所占用的存储空间。 Lin…