底层day3作业

news2024/12/23 23:51:37

思维导图

 作业:
1.总结任务的调度算法,把实现代码再写一下

算法:抢占式调度+时间片轮转
1.抢占式调度:任务优先级高的可以打断任务优先级低的执行(适用于不同优先级)

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

//先定义出创建任务需要的属性和变量
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);
  }
void StartTask03(void *argument)
{
    for(;;)
    {
        printf("StartTask03 is running\r\n");
        osDelay(500);
    }
}

时间片轮转:

    int i = 0;
  for(;;)
  {
        printf("StartDefaultTask is start\r\n");
        for(i = 0; i < 9000000; i++)
        {
            //模拟消耗时间片
            ;
        }
        printf("StartDefaultTask is end\r\n");
    osDelay(500);
  }

 

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

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

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

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

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

怎么样进行转换:

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

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

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

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

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

总结:
 

1.什么是FreeRTOS

FreeRTOS是一个实时操作系统(RTOS),专注于提供可预测的、低延迟的任务调度和执行。它适用于对任务执行时间有严格要求的嵌入式系统

FreeRTOS设计简单,内存占用较小,适合于资源有限的嵌入式系统。FreeRTOS提供了基本的任务管理、内存管理和同步机制等基本功能,适用于简单的嵌入式系统。

FreeRTOS通常用于嵌入式系统、嵌入式控制器、传感器网络、汽车控制单元等需要实时性和低功耗的应用领域

2.为什么要引入FreeRTOS

引入操作可以提高CPU的运行效率

3.FreeRTOS和Linux操作系统的区别

实时性

FreeRTOS是一个实时操作系统(RTOS),专注于提供可预测的、低延迟的任务调度和执行。它适用于对任务执行时间有严格要求的嵌入式系统。

Linux是一个通用的操作系统,对实时性能要求相对较低。虽然有一些实时扩展如PREEMPT-RT,但Linux的实时性能不如FreeRTOS那么可预测。

内存占用

FreeRTOS设计简单,内存占用较小,适合于资源有限的嵌入式系统。

Linux拥有更多的功能和驱动程序支持,但相应地需要更多的内存和处理器资源。

功能和复杂性

FreeRTOS提供了基本的任务管理、内存管理和同步机制等基本功能,适用于简单的嵌入式系统。

Linux提供了丰富的功能,包括多任务管理、网络支持、文件系统等,适用于复杂的嵌入式系统和桌面服务器等环境。

应用领域

FreeRTOS通常用于嵌入式系统、嵌入式控制器、传感器网络、汽车控制单元等需要实时性和低功耗的应用领域。

Linux广泛应用于服务器、网络设备、桌面计算机、嵌入式系统(通常是更强大的嵌入式系统,如嵌入式 Linux)等领域。

4.STM32Cubemx配置FreeRTOS工程的步骤

FreeRTOS初始化

开启调度器,线程开始运行

调度器接管程序,不会在运行到while1

5.任务的概念

任务 == 线程

在FreeRTOS中,任务(Task)是并发执行的基本单元,它是一段独立执行的代码,可以被操作系统调度执行。

6.任务的优先级

任务的优先级就是代表任务执行的先后顺序。

数值越大任务的优先级越高

任务优先级越高任务越先执行

7.任务的创建方法

动态创建和静态创建

区别:

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

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

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

8.任务的状态

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

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

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

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

9.任务的删除方法

删除自己

void osThreadExit (void)

删除其他任务

 osStatus_t osThreadTerminate (osThreadId_t thread_id)

10.任务的调度算法

算法:抢占式调度+时间片轮转
1.抢占式调度:任务优先级高的可以打断任务优先级低的执行(适用于不同优先级)

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

11.空闲任务和空闲任务钩子函数

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

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

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

钩子函数是通过钩子函数可以在FreeRTOS插入我们自己的代码。

开启空闲任务的钩子函数   钩子函数调用     实现函数主体

FreeRTOSConfig.h文件是FreeRTOS功能的总管文件,需要开启对应或者是关闭对应的功能,设置对应的宏开关就行了

适用场合:

1.空闲任务钩子是在空闲任务被调用的时候被调用

2.systick滴答定时器,在滴答定时器的中断被调用

3.在分配和申请内存失败的时候调用内存分配失败钩子函数

4.守护任务开启时调用

5.当栈溢出的时候使用

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

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

相关文章

react的diff源码

react 的 render 阶段&#xff0c;其中 begin 时会调用 reconcileChildren 函数&#xff0c; reconcileChildren 中做的事情就是 react 知名的 diff 过程 diff 算法介绍 react 的每次更新&#xff0c;都会将新的 ReactElement 内容与旧的 fiber 树作对比&#xff0c;比较出它们…

电脑小问题:Windows更新后黑屏

Windows 更新后黑屏解决方法 在 Windows 更新后&#xff0c;伴随了一个小问题&#xff0c;电脑启动后出现了桌面黑屏。原因可能是火绒把 explorer.exe 当病毒处理了。 下面讲解 Windows 更新后黑屏的解决方法&#xff0c;步骤如下&#xff1a; 1. 按 ctrl alt delete 组合键…

基于Python3的数据结构与算法 - 12 数据结构(列表和栈)

目录 一、引入 二、分类 三、列表 1. C语言中数组的存储方式 2. Python中列表的存储方式 四、栈 1. 栈的应用 -- 括号匹配问题 一、引入 定义&#xff1a;数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。简单来说&#x…

portainer管理远程docker和docker-swarm集群

使用前请先安装docker和docker-compose&#xff0c;同时完成docker-swarm集群初始化 一、portainer-ce部署 部署portainer-ce实时管理本机docker&#xff0c;使用docker-compose一键拉起 docker-compose.yml version: 3 services:portainer:container_name: portainer#imag…

Docker上部署LPG(loki+promtail+grafana)踩坑复盘

Docker上部署LPG&#xff08;lokipromtailgrafana&#xff09;踩坑复盘 声明网上配置部署踩坑 声明 参考掘金文章&#xff1a;https://juejin.cn/post/7008424451704356872 版本高的用docker compose命令&#xff0c;版本低的用docker-compose 按照文章描述&#xff0c;主要准备…

UVA378 Intersecting Lines 题解

UVA378 Intersecting Lines 题解 怎么这么多点斜式邪教啊。 解法 在计算几何中&#xff0c;我们应该尽可能地避免使用浮点数的计算&#xff0c;尽可能地使用向量计算。 本篇题解默认读者具有向量基础。 为了方便讲解&#xff0c;我们将输入的四个点分别记作 A , B , C , …

本鲸多方位助力创业者高效对接创新创业机遇

在科技创新的浪潮中&#xff0c;创业者们不断探索着新的商业机会&#xff0c;寻求着创新创业的道路。然而&#xff0c;面对复杂多变的市场环境和激烈的竞争压力&#xff0c;如何高效对接创新创业机遇成为了摆在创业者面前的重要课题。 本鲸依托海南本鲸投资有限公司和重庆本鲸…

关于Vivado的实施过程、SDC和XDC约束支持、Vivado实施子流程、Tcl API支持脚本

关于Vivado的实施过程 AMD Vivado™设计套件可实现以下AMD设备体系结构&#xff1a;AMD Versal™自适应计算加速平台&#xff08;自适应SoC&#xff09;&#xff0c;AMDUltraScale™、AMD UltraScale™和AMD 7系列FPGA。各种设计来源如下支持&#xff0c;包括&#xff1a; •…

WebGPU vs. 像素流

在构建 Bzar 之前&#xff0c;我们讨论过我们的技术栈是基于在云上渲染内容的像素流&#xff0c;还是基于使用设备自身计算能力的本地渲染技术。 由于这种选择会极大地影响项目的成本、可扩展性和用户体验&#xff0c;因此在开始编写一行代码之前&#xff0c;从一开始就采取正确…

typeorm-入门

简述 typeorm是一个数据库orm框架&#xff0c;在nestjs官网中有提到&#xff0c;可以充分发挥利用typescript的特性&#xff0c;当然也支持js其中涉及的概念包括 DataSource 数据源&#xff0c;Connection 连接数据库Entity 实体&#xff0c;实体类映射数据库表Relation 关系…

30个炫酷光效视频转场PR模板剪辑素材下载

视频转场Premiere模板&#xff0c;包含30个炫酷光效视频转场过渡效果PR项目模板下载。 适用软件&#xff1a;Premiere Pro 2023 | 分辨率&#xff1a;3840x2160 (4K) | 无需插件 | 文件大小&#xff1a;56.33MB 来自PR转场&#xff0c;下载地址&#xff1a;https://prmuban.com…

Windows下Node.js安装保姆级教程

一、Node.js 下载 访问Node.js官网&#xff0c;点击下载Node.js 下载完成后即可在下载文件中查看安装包 二、安装 一&#xff09;点击安装包开始安装&#xff0c;进入Weclcome界面点击Next 二&#xff09;勾选同意协议&#xff0c;点击Next 三&#xff09;根据需要选择安装路…

Neo4j安装 Linux:CentOS、openEuler 适配langchain应用RAG+知识图谱开发 适配昇腾910B

目录 Neo4j下载上传至服务器后进行解压运行安装JAVA再次运行在windows端打开网页导入数据 Neo4j下载 进入Neo4j官网下载页面 向下滑动找到 Graph Database Self-Managed 选择 社区版&#xff08;COMMUNITY&#xff09; 选择 Linux / Mac Executable Neo4j 5.17.0 (tar) 单机下…

Linux第72步_使用“新字符设备的一般模板”编写LED驱动

使用“新字符设备的一般模板”编写LED驱动&#xff0c;使用寄存器直接开关灯。 1、创建LED目录 输入“cd /home/zgq/linux/Linux_Drivers/回车” 切换到“/home/zgq/linux/Linux_Drivers/” 输入“ls回车”&#xff0c;查看“/home/zgq/linux/Linux_Drivers/” 输入“mkdi…

egg如何写单元测试

优秀的代码需要有单元测试进行质量保证&#xff0c;每个测试用例都给应用的稳定性提供了一层保障。 测试目录结构 我们约定 test 目录为存放所有测试脚本的目录&#xff0c;测试所使用到的 fixtures 和相关辅助脚本都应该放在此目录下。 测试文件的目录和我们需要测试的文件目…

unicloud where 使用

where介绍 在uniCloud中&#xff0c;WHERE是一个用于指定查询条件的关键字。它允许用户根据特定的条件来筛选和查询云数据库中的数据。WHERE语句的基本语法格式是WHERE condition&#xff0c;其中condition表示查询条件&#xff0c;可以是一个或多个逻辑表达式组成的条件。 在…

深入了解304缓存原理:提升网站性能与加载速度

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

探索HTTP协议:网络通信的基石

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

消息队列-kafka-消息发送流程(源码跟踪) 与消息可靠性

官方网址 源码&#xff1a;https://kafka.apache.org/downloads 快速开始&#xff1a;https://kafka.apache.org/documentation/#gettingStarted springcloud整合 发送消息流程 主线程&#xff1a;主线程只负责组织消息&#xff0c;如果是同步发送会阻塞&#xff0c;如果是异…

web基础04-flex布局

1.概述 Flexbox​ 是 ​flexible box​ 的简称&#xff08;注&#xff1a;意思是“​灵活的盒子容器​”&#xff09;&#xff0c;是 CSS3 引入的新的布局模式。 它决定了元素如何在页面上排列&#xff0c;使它们能在不同的屏幕尺寸和设备下可预测地展现出来。 它之所以被称…