FreeRTOS 任务创建分析

FreeRTOS 任务创建分析

  • Fang XS.
  • 1452512966@qq.com
  • 如果有错误,希望被指出,学习技术的路难免会磕磕绊绊

FreeRTOS

  • FreeRTOS快速上手教程
  • FreeRTOS之任务优先级设置
  • TCB 即任务控制块。FreeRTOS中使用TCB来进行任务管理,用来储存任务状态,任务栈顶指针,列表项,任务优先级,任务名称等重要信息;

动态任务创建源码分析

  • 以STM32F103为例:
  • 注:
    使用该函数需使能宏configSUPPORT_DYNAMIC_ALLOCATION
    FreeRTOS\portable\RVDS\ARM_CM3\portmacro.h中定义了 #define portSTACK_GROWTH ( -1 )也就是堆栈增长方向为高地址向低地址增长;
  • 函数原型
 BaseType_t xTaskCreate( 	TaskFunction_t pxTaskCode,					/* 任务函数 */const char * const pcName, 					/* 任务名称 */const configSTACK_DEPTH_TYPE usStackDepth,	/* 任务堆栈大小 */void * const pvParameters,					/* 传入给任务函数的参数 */UBaseType_t uxPriority,						/* 任务优先级 */TaskHandle_t * const pxCreatedTask );		/* 任务句柄 */
  • 该函数做了如下工作
  1. 申请任务堆栈内存和TCB内存
    pxStack = pvPortMallocStack( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) );
    usStackDepth 就是调用API时填入的形参,即任务堆栈大小,StackType_t 在FreeRTOS\portable\RVDS\ARM_CM3\portmacro.h中定义为uint32_t就是4字节;
    即:申请的内存是(usStackDepth * 4)字节,这个任务栈内存是当发生任务切换时用来储存当前任务函数中的变量和上下文信息等的,一般会申请稍大于任务函数中变量占用内存之和的量;
    任务堆栈申请成功后执行 pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) );来申请TCB内存,如果申请不成功就释放申请过的任务堆栈内存,并返回errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;
    可以看到FreeRTOS中包含大量安全性检测:
	// 这个框架在linux中也广泛使用xxx = malloc(n);if(xxx != NULL){// 成功处理}else{// 错误处理}
  1. 初始化该任务
    任务堆栈和TCB都申请成功后,调用了prvInitialiseNewTask( pxTaskCode, pcName, ( uint32_t ) usStackDepth, pvParameters, uxPriority, pxCreatedTask, pxNewTCB, NULL );来初始化一个任务,这个函数是针对TCB的初始化,做了以下重要工作:
    • 把整个任务栈填充为0xa5,用户就可以通过调用FreeRTOS中uxTaskGetStackHighWaterMark函数来获取任务堆栈的内存余量,来确定是否需要增加或减小任务堆栈,任务堆栈设置过大就浪费内存了,过小有溢出的可能,这一机制可以更方便的设置任务堆栈为合理的大小;
    • 然后依照任务堆栈大小和栈增长方向确定栈定地址
    • 储存任务名称,任务优先级到TCB
    • 初始化列表项,设置列表项的owner
  2. 添加该任务到任务就绪列表
    任务TCB初始化完成后,调用了 prvAddNewTaskToReadyList( pxNewTCB );这个函数做了以下重要工作:
    • 当前总任务数+1
    • 如果 是第一个创建的任务,就初始化任务列表
    • 否则
      • 如果当前运行的任务优先级小于新任务,当前TCB指针指向新任务
      • 将新任务TCB添加到就绪列表
    • 如果 调度器正在运行且当前任务优先级小于新创建任务,触发主动任务切换,运行新创建任务
  • 这一机制,挺适合用一个任务来创建其他任务,只要新创建的任务优先级高,于创建任务就切换到新创建的任务运行,等新创建的任务阻塞了,再创建下一个任务…,也就是正点原子用的任务创建方法。

任务创建方法

  • 一共2种:
  1. 创建一个用来创建其他任务的任务,开启调度器;
    • 这种方式有一个需要注意的点:
      • 内存管理方案heap_1只分配不回收,所以使用这种方式创建任务,推荐的内存管理方案是heap_4.
    • 比如正点原子例程:
      在这里插入图片描述
    • 在这个任务里创建需要的任务,等任务创建完成再删除任务创建任务
      在这里插入图片描述
  2. 创建好所有任务再开启调度器
    • 这种方式适合所有内存管理方案
    • 一般情况下,创建的任务和信号量,队列等内核对象都是有用的,不需要删除。
    • 个人比较喜欢内存管理方案heap_1
    • 创建好所有任务后,开启调度器让调度器依照任务创建时指定的优先级等参数来决定运行那个任务
    • 例如:
      在这里插入图片描述
  • 这两种方法,在实际应用都比较常用。
  • RT-Thread中把main函数也当作一个线程,默认就是第一种方式创建任务。

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

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

相关文章

【C语言】指针笔试题解析

大家好,我是苏貝,本篇博客带大家了解指针和数组笔试题解析,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 1. 下面程序的结果是什么? int main() {int a[5] { 1, 2, 3, 4, 5 };i…

Nginx负载均衡详解

一、负载均衡介绍 1、负载均衡的定义 单体服务器解决不了并发量大的请求,所以,我们可以横向增加服务器的数量(集群),然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多…

React useRequest解读

源码结构: 可以看到虽然是一个hooks(具有一定功能且具备状态的单一函数) 但是各种文件功能分得也是很细的,方便抽离和复用 useRequest.ts 抽离的原则还是单一功能原则 可以看出 真正的hooks实现是在Implement里 对于类型type的引…

【前端面试题】浏览器面试题

文章目录 前言一、浏览器面试问题1.cookie sessionStorage localStorage 区别2.如何写一个会过期的localStorage,说说想法2.如何定时删除localstorage数据2.localStorage 能跨域吗2.memory cache 如何开启2.localstorage的限制2.浏览器输入URL发生了什么2.浏览器如何…

孙哥Spring源码第25集

第25集、处理代理中获取代理进行方法调用 0、问题所在 1、实现ApplicationContextAware接口实现代理 它的处理是在ApplicationContextAware中处理的 2、ExposeProxy分析 整体 分析 如何设置成了false就会有下面的问题 3、使用EnableAspectJAutoProxy解决代理问题 4、到底如何…

WEB使用VUE3实现地图导航跳转

我们在用手机查看网页时可以通过传入经纬度去设置目的地然后跳转到对应的地图导航软件,如果没有下载软件则会跳转到下载界面 注意: 高德地图是一定会跳转到一个新网页然后去询问用户是否需要打开软件百度和腾讯地图是直接调用软件的这个方法有缺陷&…

JavaScript中的代理对象(proxy)

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 创建代理对象⭐ 使用代理对象⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友…

【车载开发系列】ECU Application Software程序刷新步骤

【车载开发系列】ECU Application Software程序刷新步骤 ECU Application Software程序刷新步骤 【车载开发系列】ECU Application Software程序刷新步骤一. Boot Software(引导软件)1)boot manager(启动管理器)2&…

ElasticSearch(二)

1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据,…

挂件板死机刷固件

用ESP32-DevKitC_V4刷固件的工具flash_download_tool_3.9.5.exe 挂件板子端口接线依次为V(接3V3)、R(接TXD)、T(接RXD)、G(接GND)、L(悬空) 1.选择ESP8266&…

springboot 捕获数据库唯一索引导致的异常

在一些业务场景中,需要保证数据的唯一性,一般情况下,我们会先到数据库中去查询是否存在,再去判断是否可以插入新的数据.如果是在高并发的情况下,可能还是会出现重复的情况.这时候可能就需要用到锁.也可以在数据库中设置唯一索引. 如果使用唯一索引,在插入相同数据的情况下会抛出…

大二毕设.3-网盘系统

目录 技术选型: 功能概括: 基本演示: 实现讲解: 技术选型: 前端: Vue3 Element Plus后端: SpringBoot Mybatis-Plus MySQL Redis Caffeine FastDFS/OSS SpringCloud Stream RocketMQ Zookeeper 功能概括&…

【李沐深度学习笔记】基础优化方法

课程地址和说明 基础优化方法p2 本系列文章是我学习李沐老师深度学习系列课程的学习笔记,可能会对李沐老师上课没讲到的进行补充。 基础优化方法 在讲具体的线性回归实现之前,要先讲一下基础的优化模型的方法 梯度下降 当模型没有显示解&#xff08…

【操作系统笔记二】链接阶段ELF文件

链接阶段&#xff1a;符号解析 链接阶段主要包含&#xff1a; 符号解析重定位 一般情况下&#xff0c;每个 C 文件可以看成一个程序模块&#xff0c;比如下边的main.c就是一个程序模块 #include <stdio.h>extern int shared; int sum(int *a, int n); int array[2] …

三维模型轻量化引擎HOOPS纹理技术概览

随着计算机图形学和虚拟现实技术的飞速发展&#xff0c;大规模三维模型的应用领域不断扩展&#xff0c;如游戏开发、建筑设计、工程模拟等。然而&#xff0c;这些大规模模型往往具有复杂的几何结构和高分辨率的纹理&#xff0c;导致文件大小庞大&#xff0c;不利于在线传输和实…

Stellar Toolkit for MySQL 9.0 Crack 3in1

面向数据库管理员的 MySQL 工具包 Stellar Toolkit for MySQL是一款三合一软件套件&#xff0c;用于修复损坏的 MySQL 和 MariaDB 数据库、从 MySQL 数据库的 InnoDB 和 MyISAM 表恢复数据以及分析 MySQL 数据库日志文件。该软件还可以以最高的安全性和完整性相互转换 MySQL/Ma…

面试官:你了解axios的原理吗?有看过它的源码吗?

面试官&#xff1a;你了解axios的原理吗&#xff1f;有看过它的源码吗&#xff1f; 一、axios的基本使用 关于 axios 的基本使用&#xff0c;上篇文章已经有所涉及&#xff0c;这里再稍微回顾一下&#xff1a; 发送请求 import axios from axios;axios(config) // 直接传入…

Java内存模型介绍

文章目录 Java内存模型前言Java内存模型基本介绍指令重排相关概念主存和本地内存相关介绍JMM中的8种同步规则和8种同步操作happens-before 原则内存屏障总结 Java内存模型 前言 本文主要介绍一下JMM中的一些常见概念&#xff0c;通过本文让你能够快速的对JMM有一个大致的了解 …

如何看待Unity新的收费模式?

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

在uniapp中使用 秋云ucharts图表,运行到小程序

步骤一&#xff1a;通过使用 HBuilderX 直接导入项目&#xff08;uni_modules 版本&#xff09; 步骤二&#xff1a;在uCharts官网 - 秋云uCharts跨平台图表库 演示中&#xff0c;先弄个demo试着运行&#xff0c; 步骤三&#xff1a;查看自己需要的配置&#xff0c; 下面是我的…