RTOS(6)任务

news2024/11/26 6:54:39

重点:

一、FreeRtos任务的API调用

1.创建任务(静态、动态创建)

动态创建:

①先写任务函数

②定义函数的handle指针

③调用动态创建任务的API:xTaskCreate(任务函数,任务名称,栈深度,参数,优先级,handle指针)

静态创建:

①事先分配好任务控制块
事先提供好栈

②调用APIxTaskStaticCreate();

配置项

实现函数

2.删除任务

vTaskDelete(xHandlerTask1); //在任务中杀死其他任务
vTaskDelete(NULL); //在任务中自杀

vTaskDelete不会释放TCB和栈,而是在空闲任务中进行清理。不断创建和删除会导致内存耗光。

TASK1的栈,TASK2的栈
malloc在分配的时候,头部+buffer;

内存增长方向:

超出的话会破坏掉头部和TCB;

二、任务状态

任务切换的基础:tick中断
有哪些任务状态?

一共有四个状态:

①创建完任务之后,任务处于Ready状态;

②当启动调度器的时候,会挑一个任务进行运行Running;

③任务可以主动休息也可以让别的任务休息,调用vTaskSuspend(NULL / Task_handler)

④任务也可以等待某些事情:时间事情或者同步事件 在等到之前处于阻塞状态;

时间事情:可以等待一段时间

同步事件:这事件由别的任务,或者是中断程序产生

同步事件的来源有很多:队列,信号量,互斥量,事件组等等等(后面章节会讲解)


怎么管理不同状态的任务?放入不同的链表

三、Delay函数

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

vTaskDelayUntil:等待到指定的绝对时刻,才能变为就绪态。
周期性执行:周期性的开始和结束;周期里面,任务执行完就delay,每隔一段固定时间就重新开始执行;
vTaskDelayUntil (& xLastWakeTime , xDelay50ms );

四、空闲任务和钩子函数

为什么必须要有空闲任务?一个良好的程序,它的任务都是事件驱动的:平时大部分时间处于阻塞状态。有可能我们自己创建的所有任务都无法执行,但是调度器必须能找到一个可以运行的任务:所以,我们要提供空闲任务。在使用 vTaskStartScheduler() 函数来创建、启动调度器时,这个函数内部会创建空闲任务:
1.空闲任务优先级为 0 :它不能阻碍用户任务运行
2.空闲任务要么处于就绪态,要么处于运行态,永远不会阻塞

空闲任务(Idle 任务)的另一个作用:释放被删除的任务的内存;

钩子函数:空闲任务的循环每执行一次,就会调用一次钩子函数
作用:
1.执行一些低优先级的、后台的、需要连续执行的函数
2.测量系统的空闲时间:空闲任务能被执行就意味着所有的高优先级任务都停止了,所以测量空闲任务占据的时间,就可以算出处理器占用率。
3.让系统进入省电模式:空闲任务能被执行就意味着没有重要的事情要做,当然可以进入省电模式了。
使用前提:

五、调度算法

正常来说是:高优先级先运行,同优先级交替运行,但还有一些细节需要确认;

三个配置项

configUSE_PREEMPTION:是否抢占
configUSE_TIME_SLICING:是否时间片轮转
configIDLE_SHOULD_YIELD:空闲任务是否让步

可否抢占?
可抢占:高优先级任务就绪了马上就运行
不可抢占:高优先级任务也不能马上运行,只能等待任务主动让出cpu资源;

轮转执行?
是:同优先级交替执行
否:当前任务一直执行,直到主动放弃、被高优先级任务抢占

空闲任务是否让步?
是:空闲任务低人一等,每循环执行一次,就主动让步给用户任务
否:跟用户任务一样,大家轮流执行,没有谁更特殊;

Idle_Task()
{
    while(1)
    {
        xxx;
        钩子函数();
        if(YIELD)//循环一次之后就会调度,让步给用户任务
            调度
        endif
    }
}

六、内部细节

创建任务

从上到下是:任务函数,任务名称,栈深度,参数,优先级,handle指针

TCB结构体

请回答下列三个问题:

①任务函数去哪了? ②栈去哪了? ③参数又去哪了?

调度机制

高优先级先运行,同优先级交替运行;

那怎么取出要运行的任务呢?

找到最高优先级的运行态/就绪态任务,运行它;

如果大家平级,轮流执行:排队,前面的先运行,运行一个tick后到链表尾部排队

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

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

相关文章

【css3】01-css3新特性样式篇

目录 1 背景 1.1 设置背景图片的定位 1.2 背景裁切-规定背景的绘制区域 1.3 设置背景图片尺寸 2 边框 2.1 盒子阴影box-shadow 2.2 边框图片border-image 3 文本 -文字阴影text-shadow 1 背景 1.1 设置背景图片的定位 background-origin:规定背景图片的定位…

遇到了导师放养,该怎么坚持?

最近收到学生读者的留言,抱怨科研的困难。导师忙碌且学生众多,自己只是众多学生之一,常常处于放养状态。除了每周的组会外,几乎无法接触到导师。在这种状态下,缺乏方向和动力,非常担心无法顺利毕业&#xf…

Llama模型家族之使用 Supervised Fine-Tuning(SFT)微调预训练Llama 3 语言模型(三)通过web页面方式微调

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…

【Linux】自己实现一个bash进程

bash就是命令行解释器,就是Linux操作系统让我们看到的,与用户进行交互的一种外壳(shell),当然了bash也是一个进程,它有时候就是通过创建子进程来执行我们输入的命令的。这无疑就离不开我们上篇博客所说的进…

如何解决链游中可能出现的延迟或网络拥堵问题?

随着区块链技术的不断发展和普及,链游(基于区块链的游戏)作为新兴的娱乐形式,正逐渐走进大众的视野。然而,与传统游戏相比,链游在运行过程中可能会遇到一些特有的问题,其中最为突出的就是延迟和…

Windows hook介绍与代码演示

Windows Hook 是一种机制,允许应用程序监视系统或处理特定事件。它可以拦截和更改消息,甚至可以插入到其他应用程序的消息处理机制中。Windows 提供了多种挂钩类型,例如键盘挂钩、鼠标挂钩、消息挂钩等。 hook代码实现 下面是一个使用 Wind…

微服务架构下的‘黑带’安全大师:Spring Cloud Security全攻略!

深入探讨了微服务间的安全通信、安全策略设计以及面对经典安全问题的应对策略。无论你是微服务的新手还是资深开发者,都能在本文中找到提升安全功力的秘籍。让我们一起成为微服务架构下的‘黑带’安全大师! 文章目录 1. 引言微服务安全挑战与重要性Sprin…

【软件工程】【23.04】p1

关键字: 软件模型、提炼、加工表达工具、通信内聚、访问依赖、边界类交互分析、RUP核心工作流、首先测试数据流、软件验证过程、CMMI过程域分类工程类; 软件工程目的、功能需求是需求的主体、结构化方法、耦合、详细设计工具、类、类图、RUP采用用例技…

rk3568_mutex

文章目录 前言1、什么是mutex?1.1mutex互斥体API函数二、实验2.1实验目的2.2源码2.3结果图前言 本文记录的是rk3568开发板基础上做的mutex实验 1、什么是mutex? mutex是互斥体,它是比信号量semaphore更加专业的机制。 在我们编写Linux驱动的时候遇到需要互斥的地方建议使用…

Nginx企业级负载均衡:技术详解系列(12)—— 深入解析root、alias及location

你好,我是赵兴晨,97年文科程序员。 在生产服务器的Nginx配置中,我们总会遇到形形色色的配置方案。你是否曾注意到root和alias指令的巧妙应用?是否对那些五花八门的location匹配规则感到好奇? 今天,咱们来聊…

微服务架构-分支微服务设计模式

微服务架构-分支微服务设计模式 这种模式是聚合器模式的扩展,允许同时调用两个微服务链 分支微服务设计模式是一种用于构建大型系统的微服务架构模式,其核心思想是 将复杂的业务逻辑拆解为多个小的、相互独立的子系统,每个子系统由一个或多…

家政项目day2 需求分析(模拟入职后熟悉业务流程)

目录 1 项目主体介绍1.1 项目背景1.2 运营模式1.3 项目业务流程 2 运营端需求2.1 服务类型管理2.2 服务项目(服务)管理2.3 区域管理2.4 区域服务管理2.5 相关数据库表的管理2.6 设计工程结构2.7 测试接口(接口断点查看业务代码) 1…

SQL学习小记(三)

SQL学习小记(三) 功能实现思路代码部分名词解释 代码打包为可执行文件 功能说明:使用python代码,将数据库database1中的表格table1同步到数据库database2中 功能实现 思路 #mermaid-svg-R1pWrEWA799M299a {font-family:"tre…

Redis 中 List 数据结构详解

目录 List 用法 1. 增 2. 删 3. 查 内部编码 应用场景 前言 Redis 中的 List 和 Set 数据结构各有特点,适用于不同的应用场景。List 提供了有序的列表结构,适合用于消息队列和任务列表等场景;Set 提供了无序且不重复的集合结构&#…

【全开源】旅游系统源码(Uniapp+FastAdmin+ThinkPHP)

一款基于UniappFastAdminThinkPHP开发的旅游系统,包含消费者端(手机端)、机构工作人员(手机端)、机构端(PC)、平台管理端(PC)。机构可以发布旅游线路、景点项目&#xff…

Wpf 使用 Prism 实战开发Day27

首页汇总和数据动态显示 一.创建首页数据汇总数据接口 汇总:待办事项的总数已完成:待办事项里面有多少条完成的待办完成比例:已完成和汇总之间的比例备忘录:显示备忘录的总数待办事项:显示待办事项未完成的集合备忘录&…

Java实现对PDF、纵向、横向页面添加自定义水印功能

Java实现对PDF、纵向、横向页面添加自定义水印 效果图 -- 纵向 页面PDF使用到JAR Maven依赖版本效果图 -- 横向页面PDF 效果图 – 纵向 页面PDF 代码如下&#xff1a; 使用到JAR Maven依赖版本 <dependency><groupId>org.apache.pdfbox</groupId><artifa…

视频监控平台AS-V1000 的场景管理,一键查看多画面视频的场景配置、调用、管理(一键浏览多路视频)

目录 一、场景管理的定义 二、场景管理的功能和特点 1、功能 &#xff08;1&#xff09;场景配置 &#xff08;2&#xff09;实时监控 &#xff08;3&#xff09;权限管理 2、特点 三、AS-V1000的场景配置和调用 1、场景配置 &#xff08;1&#xff09;实时视频预览 …

【Linux】Linux的权限_2 + Linux环境基础开发工具_1

文章目录 三、权限3. Linux权限管理修改文件的拥有者和所属组 4. 文件的类型5. 权限掩码 四、Linux环境基础开发工具1. yumyum 工具的使用 未完待续 三、权限 3. Linux权限管理 修改文件的拥有者和所属组 在上一节我们讲到如何更改文件的访问权限&#xff0c;那我们需要更改…

在VS Code中进行Java的单元测试

在VS Code中可以使用 Test Runner for Java扩展进行Java的测试执行和调试。 Test Runner for Java的功能 Test Runner for Java 结合 Language Support for Java by Red Hat 和 Debugger for Java这两个插件提供如下功能&#xff1a; 运行测试&#xff1a; Test Runner for …