esp32 怎么分配freertos 堆栈大小_深度解剖~ FreeRtos阅读笔记2 任务创建、内核链表初始化...

2.FREERTOS任务创建、内核链表初始化

硬件环境:cortex m4

FreeRTOS版本:v8.0.1

今天开始阅读freertos,阅读同时做下笔记,等哪天碰到移植问题再翻出来看看。

2.1 任务、链表结构体

源码中使用tskTCB来存储一个任务的所有信息,xLIST存储内核链表数据。一个系统最基本的功能是它的任务调度,在任务切换时最重要的则是内核链表,用图描述下这两个结构体,这样看起来比代码更清晰。(TCB中有省略成员)

a9592d3ad0afba73da43551e8d919297.png

(TCB结构体)

-------------------------------------------------分割线----------------------------------------------------

10157102c57c5444163fc48ea3fb13ba.png

(LIST结构体)

一个TCB中包含了两个xLIST_ITEM作为链表节点,操作xLIST_ITEM中的指针指向既为控制一个任务进出某个链表。相比xLIST_ITEM,在xLIST中使用了精简版的结点xMINI_LIST_ITEM。

2.2 xTaskGeneEricCreate 任务创建流程分析

xTaskGeneEricCreate 函数用来创建一个新任务,在调度器启动前和启动后都可以创建。

Freertos在调度器启动后至少会有一个任务(IDLE)处于准备调度状态,即使开发者不去创建自己的任务。

xTaskGeneEricCreate源码流程:(拖动可以放大图片)

6493a5f2569190813e3c1941d68e84d8.png

(任务创建流程图)

2.2.1 prvAllocateTCBAndStack 分配空间

Freertos使用pvPortMalloc在堆上分配一块TCB大小的内存空间,分配成功后还要使用pvPortMalloc分配一块内存,当做任务运行所需要的栈空间。这些空间直到任务被删除时才会得到释放。

在栈分配时有参数判断,若创建任务时有传入的栈地址则放弃分配。

分配的栈内存总大小为栈深度(传入参数)与栈宽度乘积。

2.2.2 prvInitialiseTCBVariables 执行初始化

prvInitialiseTCBVariables函数中主要执行了任务名字拷贝、优先级保存、两个链表节点初始化。

下图表示TCB中节点和链表初始化后指针指向

7ce0818b670ddbe9ff66c75792e4b577.png

(链表及TCB初始化后)

2.2.3 pxPortInitialiseStack 执行”压栈”

pxPortInitialiseStack函数执行的代码非常奇特,一开始完全无法理解,还好在葵花宝典找到了da案,神书!引用M3权威指南上一句翻译:响应异常的第一个步骤是保存现场,硬件自动压栈,压栈后内存分布:

4dd1f6ee8fdbd9e614ddc1b6d2cdb834.png

再对比看下pxPortInitialiseStack源码:

89f40b3a471eb14167ec4d081e386381.png

对比下两者动作,这个函数是对任务栈进行了一些处理,并且是模仿异(中断)常发生时所产生的动作。为什么一定要模仿异常进行压栈,首先扯一下freertos任务调度工作的大致流程:

当一个任务在运行时,还有一个内部定时器(systick)在一直计数,它的计数值和时钟频率比值可以看成为时间片。时间片到,中断产生,中断里进行上下文切换也就是pxReadyTasksLists中的任务被依次调度。硬件进入中断时便会自动压栈,不需要我们处理。中断处理完成后到中断返回时硬件还会自动出栈,还原进入异常前的状态。进中断时压入的那些寄存器值都被一一出栈 如:PC、R0、等寄存器。这样pxPortInitialiseStack函数就好理解了,它先对新创建的任务进行手动压栈,还多包括了R4-R11,那么在调度中断结束后这些手动压入的值将被自动出栈,进而使新任务运行起来。

PC位置是传入的任务主程序句柄地址,也就是我们要任务执行的主要程序,LR(返回寄存器)的位置是prvTaskExitError函数地址,这个函数里是一个for死循环加错误信息打印,也就是一个任务永远不应从它的主程序中跳出,如果跳出则进入prvTaskExitError函数打印错误。一般任务句柄里都会用for(;;)把它写死永远循环执行,需要退出时要将该任务delete掉。

2.3 pxReadyTasksLists链表

一个TCB创建并初始化完成后便开始插入pxReadyTasksLists等待被调度。pxReadyTasksLists链表是一个数组,优先级最大数决定它的大小。一个处于空闲状态的TCB(准备好被调度)在插入时是an照优先级作为索引插入的,这里说TCB插入不太准确,应该是TCB上的链表节点插入链表。

举个栗子,第一个任务插入空链表时的状况:

011f2143839343d8e6818f6ab6511ca8.png

看着有些凌乱的话再来张大意图:

ef6a7dcaef4d58ecd93315a5c555d3d6.png

如果此时又有一个相同优先级任务创建,链表变为:

aff677b541ebacfe5cbecad8117c7165.png

简略图:

20d7fbcf1e03ffc70710907bb07be751.png

链表将节点依次连接,组成TCB链,调度器运行时会an照需要遍历链表进而控制任务。

链表头部都带有index元素,一开始它指向链表本身,所以我们上面创建的任务都像是在尾插,事实上调度器运行起来时新节点插入的位置由index决定。

图解:

调度开始后index开始遍历readylist,它指向第一个TCB时,第一个TCB得到cpu资源开始运行,变为:

f4f935749eadb4514b6998cf5c014742.png

注意红色线条变化,此时如果动态创建了一个优先级相同的任务TCB3,应该把它插在哪里?如果插在TCB后面那对于TCB2来说是不公平的,因为人家排队等待cpu的时间肯定比TCB3长,其实仔细考虑下插在链表头部或尾部都是不规律的,只有利用index。Freertos将其插在TCB前面,以保证是当前链表最后一个得到cpu资源的位置:

89288d97369116eee7fc5e0b6c928628.png

新TCB进入链表,任务创建流程就快结束了。在程序尾部有些优先级判断,如果创建的任务比当前运行的任务优先级要高则使能PendSV中断。如果调度器是停止的则直接更改当前TCB指针。

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

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

相关文章

pandas用众数填充缺失值_7步搞定数据清洗-Python数据清洗指南

脏数据就是在物理上临时存在过,但在逻辑上不存在的数据。数据清洗是整个数据分析过程的第一步,就像做一道菜之前需要先择菜洗菜一样。数据分析师经常需要花费大量的时间来清洗数据或者转换格式,这个工作甚至会占整个数据分析流程的80%左右的时…

有盘和无盘服务器,网吧系统的终极解决之道:无盘系统+有盘(转)

1、效果好:系统启动飞速,玩大型游戏飞速,不会丢失账号,系统永远干净。2、不会中毒:系统文件从服务器上的镜像中读取,大型游戏从本地硬盘读取,本地硬盘全盘还原,游戏穿透更新。3、投资…

Sigma IDE现在支持Python无服务器Lambda函数!

想想无服务器,使用Pythonic –全部在您的浏览器中! (好吧,这则新闻已经过了几周了,但是仍然……) 如果您沉迷于整个无服务器的“事物”中 ,您可能已经注意到我们,一个在SLAppForge臭…

微信分享 ajax冲突,微信jssdk分享功能开发及解决ajax跨域的问题

微信JS-SDK说明文档微信JS-SDK Demo我所要实现的分享功能要求:只要提供一段js代码给前端美工放置在静态页面等就可以实现分享功能。js代码如下:urllocation.href;$.ajax({type : "get",url : "http://域名/wx/test/jssdk.php?url"u…

idle不是python自带的开发工具_Python的开发工具

通常情况下,为了提高开发效率,需要使用相应的开发工具。进行Python开发也可以使用开发工具。下面将详细介绍Python自带的IDLE 一使用自带的IDLE 在安装Python后,会自动安装一个IDLE。它是一个Python shell(可以在打开的IDLE窗口的标题栏上看到…

合肥工业大学机器人技术期末_机器人技术第三次作业(HFUT)

第三次作业本人代码水平十分有限,仅供参考,有错误请指出java源码:package robathomework3;import java.lang.Math;//点类class point {double x 0;double y 0;point(double x, double y) {this.x x;this.y y;}void print() {System.out.p…

java se 导原码_Java SE 8新功能导览:Java开发世界中的重大变化

java se 导原码我很自豪,像其他专业团队成员一样,是采用OpenJDK的成员之一,但是从过去8个月就加入了,我们经历了Java SE 8 开发,编译,编码,讨论等各个阶段,直到将其付诸实践为止。 。…

linux将日期和日历信息追加到文件中_Linux任务调度

crontab 任务调度crontab 进行定时任务的设置概述 任务调度:是指系统在某个时间执行的特定的命令或程序。任务调度分类:1.系统工作:有些重要的工作必须周而复始地执行,如病毒扫描等 。2.个别用户工作:个别用户可能希望…

android sdk build-tools_从零开始仿写一个抖音App——视频编辑SDK开发(一)

本文首发于微信公众号——世界上有意思的事,搬运转载请注明出处,否则将追究版权责任。交流qq群:859640274。大家好久不见,又有一个多月没有发文章了。不知道还有哪些读者记得我的 从零开始仿写抖音App 的系列文章,这个…

爱默生E系列服务器机柜托盘,艾默生通信电源PS48300-3B/1800 一体化室内机柜

PS48300-3B/1800电源系统PS48300-3B/1800电源系统是艾默生网络能源集多年开发和网上运行经验,采用 DSP控制技术,为满足3G网络需求而设计的高可靠、高功率密度、高性能、全数 字化通信电源系统。根据交流配电和机柜高度。一、特点 1、休眠节能专利技术&am…

功能Java示例 第8部分–更多纯函数

这是第8部分,该系列的最后一部分称为“ Functional Java by Example”。 我在本系列的每个部分中发展的示例是某种“提要处理程序”,用于处理文档。 在上一期文章中,我们已经使用Vavr库看到了一些模式匹配,并且还将故障也视为数据…

tensorflow 小于_坐姿不对,屏幕就变模糊!教你用TensorFlow做一款“隐形背背佳”...

大数据文摘出品作为一个上班族,每天坐在电脑前那么久,难免出现腰酸背痛的情况,时间长了甚至脊柱都歪曲变形了,这可不行!一定要克制住自己的坐姿。这里有款“隐形背背佳”,要不要了解一下?一位名…

python处理csv文件列错位_CSV文件分割与列异常处理的python脚本

#codingutf-8 ‘‘‘脚本说明 用来解决csv文件的列异常问题(以逗号分隔符为例): csv文件有些列含有换行符、逗号等特殊符号,这就导致csv文件出现列异常的情况。 此脚本将csv文件输出成如下文件:源文件名-正确列-文件序…

文本分类和提取关键词算法_文本内容之间的关键词提取和相似度计算

文本分类和提取关键词算法背景 Web应用程序变得越来越智能。 从网站上使用服务的日子已经一去不复返了,用户不得不填写一个巨大的表格。 假设您有一个适合书迷的网站。 在Web 2.0之前,像这样的网站曾经以诸如年龄,阅读的书籍,喜欢…

python里随机抽取样本_概率分布和抽样分布基础知识及Python实现

本文主要介绍推论统计中的概率分布和抽样分布,本文结构如下: 一、概率分布 随机变量:在一定条件下,某件事情可能发生或者不发生,这个事件就叫随机事件。例如抛硬币哪面朝上。随机变量X就是用来量化随机事件的函数,是将随机事件每一个可能出现的结果映射到数值的一个函数。…

php 创建目录_使用SMB绕过PHP远程文件包含限制

译文声明本文是翻译文章,文章原作者mannulinux,文章来源:mannulinux.org 原文地址:http://www.mannulinux.org/2019/05/exploiting-rfi-in-php-bypass-remote-url-inclusion-restriction.html译文仅供参考,具体内容表达…

eas系统服务器地址,EAS7.0EAS7.5服务端及其客户端标准配置介绍

金蝶EAS是基于JavaEE的大型企业应用。目前服务端支持以下主流软硬件环境。适用版本:EAS7.0 EAS703 EAS7.51.金蝶EAS服务端支持的软硬件环境注:标志为部署支持的环境,可以正常安装配置,但是正式运行前需联系金蝶技术支持。2.客户端…

Java的Kafka:构建安全,可扩展的消息传递应用程序

使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 今天尝试Okta。 当今的用户希望可以通过其计算机,手机,平板电脑或任何其他设备访问您的应用程序! …

background复合属性顺序_CSS有哪些好用的字体属性?

本文创建于2020年9月,以下为正文:CSS中有哪些字体属性呢?font:复合属性。设置或检索对象中的文本特征。font-style:设置或检索对象中的字体样式。用于定义字体的风格,如:斜体(italic…

转译和编译_10个有趣又能编译为JavaScript的语言,你用过哪些?

点击上方“IT平头哥联盟”,选择“置顶或者星标”你的关注意义重大!来源:https://www.sitepoint.com/现代应用相比普通的网页有不同的要求。但是浏览器是一个有着一套(大部分)固定可用的技术的平台,JavaScript依然是web应用的核心语…