FreeRTOS——剖析静态创建任务内部实现

news2024/11/26 9:57:47

静态创建任务函数

TaskHandle_t xTaskCreateStatic
(
    TaskFunction_t pxTaskCode,      /*指向任务函数的指针*/
    const char *const pcName,       /*任务函数名*/
    const uint32_t ulStackDepth,    /*任务堆栈大小注意字为单位*/
    void *const pvParameters,       /*传递的任务函数参数*/    
    UBaseType_t uxPriority,         /*任务优先级*/
    StackType_t *const puxStackBuffer,/*任务堆栈,一般为数组,由用户分配*/
    StaticTask_t *const pxTaskBuffer,/*任务控制块指针,由用户分配*/
);
返回值描述
NULL用户没有提供相应的内存,任务创建失败
其他值任务句柄,任务创建成功

静态创建内部剖析

静态创建任务使用流程

        我们静态创建任务首先要进行宏configSUPPORT_STATIC_ALLOCATION置位,这个宏在FreeRTOSConfig.h中

在开启调度函数中如果我们置位了configSUPPORT_STATIC_ALLOCATION 

则我们需要定义下面两个函数为空闲任务和软件定时器任务分配内存,因为静态创建任务需要用户为创建的任务手动分配内存

 两个接口函数的实现:

需要定义任务控制块、任务栈、以及任务栈大小,将形参代入

如果我们要静态创建任务,可以到我们的task.h找静态创建的代码

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

前面五个参数一致,动态创建的第六个参数是定义的句柄,用来控制和管理任务,而静态创建的第五个和第六个参数分别是任务栈的空间(用一个数组来表示)和任务控制块指针,静态创建的任务句柄是静态创建函数的返回值。

开始任务的创建:

 宏定义任务参数以及声明任务函数

在开始任务创建task1、task2、task3:

 编写任务函数

 静态创建任务的任务栈以及任务控制块都是需要我们手动去分配内存的,比较麻烦,所以我们还是比较常用动态创建任务。

 静态创建任务其内部实现

右键静态创建任务函数的任务控制块类型,然后go to一下跳转到定义,就可以看到静态创建任务的TCB结构体定义,操作如下:

 

 与我们动态创建任务的TCB结构体是对应的,如下:

 (1)进入静态创建任务函数

与动态创建任务不同,静态创建需要判断我们是否为该任务分配了空间,如果没有分配直接返回NULL,如果分配了就在调用prvInitialiseNewTask时将定义的任务返回值作为实参传递,最终生成我们的任务句柄(指向任务控制块的指针),作为静态创建任务的返回值。

定义一个新的TCB结构体,然后调用两个API函数prvInitialiseNewTask和 prvAddNewTaskToReadyList

分别进行新创建函数的初始化和添加到就绪列表中

 剖析prvInitialiseNewTask

在创建任务函数里,给定义的TCB结构体分配空间,TCB结构体的第一个成员就是栈顶,然后调用 prvInitialiseNewTask,将任务创建传过来的各个参数赋值到TCB结构体的成员中,调用pxPortInitialiseStack函数初始化任务栈,将栈顶地址、任务函数指针、任务参数传递给任务栈初始化函数,将初始化好的任务栈首地址返回给栈顶,存储在TCB结构体的首成员中。

然后就是任务栈的初始化,静态创建和动态创建的初始化任务栈是一样的,都是向下生长

 初始化任务栈剖析

 剖析prvAddNewTaskToReadyList

 删除任务流程

1)当传入的参数为NULL,则代表删除任务本身(当前正在运行的任务)

2)空闲任务会负责释放被删除任务中由系统分配的内存,但是由用户在任务删除前申请的内存,则需要由用户在任务被删除前提前释放,否则将导致内存泄漏

注意:

1、在实际的应用中,动态创建任务是比较常用的,除非有特殊的要求,一般采用动态创建任务

2、动态创建相对简单,更为常用

3、静态创建:可将任务堆栈放置在特定的内存位置,并且无需关心对内存分配失败的处理

4、临界区保护,保护那些不想被我们打断的程序段,关闭freertos所管理的中断,中断无法打开,滴答中断和,Pandsv中断无法进行,不能实现任务调度(任务调度就是在PandSV中断中进行)

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

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

相关文章

数据处理中常见的归一化方法有哪些?为什么要对数据进行归一化?

🎁👉点击进入文心快码 Baidu Comate 官网,体验智能编码之旅,还有超多福利!🎁 🔍【大厂面试真题】系列,带你攻克大厂面试真题,秒变offer收割机! ❓今日问题&am…

Qt-系统QThread多线程介绍使用(62)

目录 描述 相关函数 使用 准备工作 重写run 发送信号 创建一个线程 启动线程 计时器运行流程 多线程运用场景 描述 qt多线程和Linux多线程类似 Linux有自己的一套多线程 API,Qt 也有着自己封装的多线程 API QT多线程参考了JAVA中的设计方式 QThread创建…

总结ES6—ES13新特性

目录 ES6let/const不同特性共同特性不能重复声明作用域提升问题暂时性死区( temporal dead zone)不添加window形成块级作用域 三者区别 模板字符串解构赋值数组的解构对象的解构 默认参数箭头函数展开运算符数值表示SymbolSetWeakSetMapWeakMapProxy 和 …

Linux Ubuntu dbus CAPI ---- #include<dbus.h>出现“无法打开源文件dbus/xxx.h“的问题

一、确保已安装dbus库和CAPI sudo apt-get install libdbus-1-dev 二、在c_cpp_properties.json的includePath中是否配置了dbus库依赖文件所在的路径 三、编译一个简单的dbus代码,在编译过程中只要出现.h文件找不到的情况,就使用下列命令找到.h文件路径…

【2024最新】基于springboot+vue的体质数据分析及可视化lw+ppt

作者:计算机搬砖家 开发技术:SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:Java精选实战项…

【设计模式】揭秘Spring框架:设计模式如何驱动代码重用与扩展性的最佳实践

作者:后端小肥肠 🍇 我写过的文章中的相关代码放到了gitee,地址:xfc-fdw-cloud: 公共解决方案 🍊 有疑问可私信或评论区联系我。 🥑 创作不易未经允许严禁转载。 姊妹篇: 【设计模式】万字详解…

大数据毕业设计选题推荐-招聘信息数据分析系统-Python数据可视化-Hive-Hadoop-Spark

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

02.07.链表相交 最简方法之一

面试题 02.07. 链表相交 已解答 简单 相关标签 相关企业 提示 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链…

大家用 Flutter 做什么?Getx 遥遥领先!

大家用 Flutter 做什么?Getx 遥遥领先! 视频 https://youtu.be/hXRgZwqdWzI https://www.bilibili.com/video/BV1VDHhedETz/ 前言 原文 大家用 Flutter 做什么? Reddit 上的一个关于 flutter 社区投票,询问大家用 flutter 做什…

STM32—W25Q64

1.W25Q64简介 W25Oxx系列是一种低成本、小型化、使用简单的非易失性存储器 易失性存储器 般就是SRAM、DRAM等非易失性存储器 般就是E2PROM、Flash等常应用于数据存储、字库存储、固件程序存储等场景存储介质:Nor Flash(闪存)时钟频率:80MHz / 160MHz(…

PyTorch中Tensor的存储结构

PyTorch中Tensor的存储结构 Tensor数据的类型 Tensor 中数据主要有下面两种类型: meta data:元数据,也就是描述数据特征的数据,例如 shape、dtype、device、stride等等raw data:数据本身,我们可以通过 t…

【漏洞复现】SpringBlade menu/list SQL注入漏洞

》》》产品描述《《《 致远互联智能协同是一个信息窗口与工作界面,进行所有信息的分类组合和聚合推送呈现。通过面向角色化、业务化、多终端的多维信息空间设计,为不同组织提供协同门户,打破组织内信息壁垒,构建统一协同沟通的平台。 》》》漏洞描述《《《 致远互联 FE协作办公…

【尚硅谷】FreeRTOS学笔记(更新中更新时间2024.10.12)

在网上看到的一段很形象的描述,放在这里给大家娱乐一下。 裸机开发:n个人拉屎,先进去一个拉完,下一个再来。看门狗:如果有人拉完屎还占着,茅坑刷视频,把他拖出去中断系统:n个人拉屎&…

Qt基础对话框QDialog

模态显示对话框 调用exec方法可以使得对话框模态显示,但是一个阻塞函数 [virtual slot] int QDialog::exec() 对话框的三个槽函数 accept [virtual slot] void QDialog::accept(); reject [virtual slot] void QDialog::reject() done [virtual slot] void QDia…

搭建mongodb单机部署-认证使用

搭建mongodb单机部署-认证使用 实现思路 先将配置文件配置好,使用不用认证的启动命令启动docker,然后创建账号并制定角色。在使用开启认证的命令重新启动容器就好。 这里我并没有说先停止容器,删掉容器重新创建容器。是因为我的启动命令中…

libaom 源码分析系列:noise_model.c 文件

libaom libaom 是 AOMedia(开放媒体联盟)开发的一个开源视频编解码器库,它是 AV1 视频压缩格式的参考实现,并被广泛用于多种生产系统中。libaom 支持多种功能,包括可扩展视频编码(SVC)、实时通信(RTC)优化等,并定期进行更新以提高压缩效率和编码速度 。 libaom 的一些…

豆包MarsCode体验有京东卡和现金

https://www.marscode.cn/events/s/iBpts1oT/ 先登录注册 然后到VSCODE里,在最左侧导航栏处看到EXTEBSIONS点一下(快捷键CtrlShiftX),然后搜索MarsCode,并安装插件。 安装后登录体验一次问答即可。然后回到活动页即…

电瓶车的无钥匙启动功能为用户带来了极大的便利

电瓶车智能钥匙一键启动系统是一种依赖智能钥匙和一键启动按钮的启动方式。 智能钥匙和一键启动系统的结合使用提高了车辆的安全性,防止了未经授权的启动。 携带智能钥匙进入车辆,按下一键启动按钮,车辆通过感应智能钥匙存在而启动。 一键…

数据结构-C语言顺序栈功能实现

栈 栈&#xff1a;类似于一个容器&#xff0c;如我们生活中的箱子&#xff0c;我们向箱子里放东西&#xff0c;那么最先放的东西是最后才能拿出来的 代码实现 #include <stdio.h> #include <stdlib.h>#define MAX_SIZE 100typedef struct {int* base; // 栈底指针…

【亲测可行】ubuntu根目录空间不够,将其它盘挂载到/opt

文章目录 &#x1f315;缘起&#x1f315;从其它盘压缩出一个未分配的空间&#x1f319;从windows系统中压缩出个未分配的空间&#x1f319;从linux系统中压缩出个未分配的空间 &#x1f315;右键点击未分配的盘新建分区&#x1f315;查看分区&#x1f315;先将新分区挂载到/mn…