深度解剖~ FreeRtos阅读笔记2 任务创建

FreeRTOS源码解析 -> xTaskCreate() signed portBASE_TYPE xTaskGenericCreate( pdTASK_CODE pxTaskCode, const signed char * const pcName, unsigned short usStackDepth, void *pvParameters, unsigned portBASE_TYPE uxPriority, xTaskHandle *pxCr 阅读详情

2.任务创建

开始源码阅读,这里我使用了TI cc3200 cortex m4的学习板,由TI提供移植后的freertos。

xTaskGenericCreate 函数用来创建一个新任务,在调度器启动前和启动后都可以创建。Freertos在调度器启动后至少会有一个任务在运行,即使开发者不去创建任务。源码中使用TCB结构体存放一个任务的所有信息,控制了某个TCB便是控制一个任务的运行状态。一个TCB将会根据需要在不同链表内重复插入和移除,比如等待被调度的任务插在readylist中,被taskDelay等函数睡过的任务则乖乖的放入xDelayedTaskList1或xDelayedTaskList2中,这两个链表有点意思,它们解决了systick变量溢出的问题,不过今天它不是主角,以后再细细说来。

先贴一些结构体图片(//亿图画的,绘画水平勉强能看。。。)

(TCB)

一个TCB中有两个链表节点,链表本身和节点并不完全相同,链表只保留了几个指针,其它元素根本使用不到,所以被叫做mini_list_item:


(LIST)


看清楚了任务及链表结构体组成,开始主流程分析。

(任务创建流程图)

2.1 prvAllocateTCBAndStack函数: 创建TCB 

Freertos在堆上分配一块TCB大小的空间,分配成功后便给任务分配一块任务栈空间,大小由开发者参数决定。注意栈分配时具有判断:

vPortMallocAligned( x,puxStackBuffer)(((puxStackBuffer)==NULL)?(pvPortMalloc((x))):(puxStackBuffer ))

表示开发者可以自己给出任务栈地址,也可以填入NULL选择让freertos分配(分配大小为栈深度*StackType_t)


2.2 prvInitialiseTCBVariables 、prvInitialiseTaskLists:负责初始化

栈指针对齐后便开始初始化该TCB上的一些链表节点prvInitialiseTCBVariables()。

如果是第一次创建任务还会初始化所有链表prvInitialiseTaskLists()。这些链表变量是task.c中的全局变量。链表中的一些值如MAX_DELAY一般会充当哨兵,当某个节点要按照升序或降序插入时查到该值freertos就认为这条链表已经遍历到尾部或头部了。

初始化后一些指针会做更改,还是贴一张图吧,有图有真相:



(链表及TCB初始化后)

不止这些,task.c中的全局变量还有很多,估计这些全局变量将会成为学习的难点。换我老师的话他肯定会说:恶心死人家了~。嗯 他是个男的。

2.3  pxPortInitialiseStack 执行”压栈”

看源码时这里困扰了我好久,真是玩手游的时间都用上了,任务都没做!。还好葵花宝典上有答案,神书!引用M3权威指南上一句翻译:响应异常的第一个步骤是保存现场,硬件自动压栈,压栈后内存分布:


再对比看下pxPortInitialiseStack源码:

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

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

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


2.4插入链表

一个TCB创建并初始化完成后便开始插入readylist等待被调度。Readylist是一个数组,优先级最大数决定它的大小,一个TCB在插入时是按照优先级作为索引插入的,这里说TCB插入不太准确,应该是TCB上的链表节点插入链表。

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


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

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


简略图:

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

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

图解:

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

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


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


FreeRTOS内核单步调试与源码分析:从黑盒到白盒的深度实践 实时操作系统(RTOS)是嵌入式开发中实现多任务管理的核心技术,其内核调度机制直接影响系统的实时性和稳定性。理解RTOS的工作原理,尤其是任务调度、链表管理和中断处理等核心机制,对于调试复杂时序问题和优化系统性能至关重要。通过单步调试内核源码,开发者可以直观观察任务状态转换、就绪链表更新及上下文切换等底层过程,从而将RTOS从“黑盒”变为“白盒”。本文以FreeRTOS为例,详细介绍了如何搭建可调试的工程环境,配置关键参数(如禁用端口优化和Tickless模式),并利用Trace功能可视化内核事件。通过结合 阅读详情

相关推荐

嵌入式秋招核心攻略:STM32与FreeRTOS项目实战与面试深挖

嵌入式系统开发是连接硬件与软件的关键技术领域,其核心在于对微控制器、实时操作系统及底层驱动的深入理解。从原理层面看,它涉及计算机体系结构、中断机制、任务调度与内存管理等基础概念,这些构成了嵌入式设备高效可靠运行的基石。其技术价值体现在能够实现对物理世界的精准感知与控制,广泛应用于物联网、工业自动化、消费电子等场景。对于开发者而言,掌握如STM32这类主流MCU平台和FreeRTOS实时操作系统,是构建复杂嵌入式应用的必备技能。在工程实践中,**项目深挖**能力和对**技术栈**的透彻理解尤为重要,这直接决定

weixin_33804582的博客 413

FreeRTOS 源码注释(xTaskGenericCreate)

FreeRTOS 是个轻量级的实时操作系统,功能还不错。最近花了些时间研究了一下,代码写的很严谨,值得学习。鉴于国内介绍资料非常少,因此,准备做一个系列笔记,将其主要功能代码做个注释,主要是方便自己查找。也希望能给对这个操作系统感兴趣的国内同行一点参考。 xTaskGenericCreate 用来建立一个任务,实际上 xTaskCreate 也是对 xTaskGenericCreate 的包装。

Ivan 的专栏 6668

STM32H747双核项目架构拆解:从工程目录到RTOS任务设计的五步分析法

在嵌入式系统开发中,理解复杂项目的架构设计是提升工程能力的核心。模块化与分层设计是软件工程的基础原则,通过将系统划分为高内聚、低耦合的组件,并结合硬件抽象层(如HAL库),能有效管理代码复杂性并提升可维护性。其技术价值在于实现代码复用、团队协作以及系统的长期可扩展性。在实时操作系统(如FreeRTOS)的应用场景下,这些原则通过任务划分、优先级调度及进程间通信机制,确保了系统的实时性与可靠性。本文以STM32H747双核MCU的企业级实战项目为具体载体,系统演示如何运用“五步拆解法”快速剖析其工程结构、启动

weixin_30735745的博客 311

freertos内核走读2——task任务调度机制(二)

freertos 任务调度机制,任务的创建删除delay,调度器的开启终止暂停和恢复等。

jorhai的博客 5095

STM32F103C8T6上MPU6050 DMP移植深度指南

DMP(数字运动处理器)是嵌入式姿态解算的核心技术,其本质是在传感器内部协处理器上运行的微码,需通过I²C与主控协同完成固件加载、FIFO数据流管理与中断驱动解析。理解DMP原理的关键在于区分‘调用库函数’与‘跨芯片协作’——它依赖精确时序、寄存器级配置和硬件资源约束。在STM32F103C8T6这类Flash仅64KB、RAM仅20KB的资源受限平台,HAL库默认行为(如I²C自动重试、DMA介入)极易破坏DMP原子操作,导致初始化失败或FIFO错位。本文聚焦DMP固件加载校验、FIFO包结构解析、HAL

weixin_33804582的博客 422

STM32F103经典例程深度拆解:从最小系统到FreeRTOS与USB CDC

嵌入式开发中,芯片外设驱动与固件设计是工程师的基本功。理解时钟树、GPIO模式、中断与DMA等底层机制,才能让代码稳定运行。STM32F103作为经典MCU,其例程覆盖了从最小系统到复杂应用的完整路径。通过剖析PWM+DMA驱动高精度时序、多通道ADC采集、低功耗停机模式、掉电保存以及FreeRTOS任务调度等场景,可以掌握外设初始化顺序、DMA映射关系、Flash擦写策略等关键知识。这些技术广泛应用于工业控制、物联网终端和便携设备。本文以STM32F103例程为线索,串联嵌入式开发中的高频难点与避坑经验,

weixin_28717683的博客 290

Freertos初始化任务堆栈

调用函数pxPortInitialiseStack()初始化任务堆栈,并将最新的栈顶指针赋值给任务TCB的pxTopOfStack字段。 调用函数pxPortInitialiseStack()后,相当于执行了一次系统节拍时钟中断:将一些重要寄存器入栈。虽然任务还没开始执行,也并没有中断发生,但看上去就像寄存器已经被入栈了,并且部分堆栈值被修改成了我们需要的已知值。对于不同...

似水流年的专栏 5157

Android安全支付(1)-整体架构-keymint

(1)接口定义hardware/interfaces/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl。keymint是keymaster v4之后的替代设计。所以android 15上最好采用keymint的接口进行硬件功能的对接。同时,我们会集成一款紫光的芯片。3.可以用keyStore.getKey()来获取存储在keyStore中的数据进行加密和解密。四、关于keymint的接口定义和具体实现。

Android系统开发-VR OS-系统安全隐私 1767

freertos 任务创建 xTaskCreate xTaskGenericCreate 源代码分析

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34419326的博客 555

基于51单片机语音识别智能台灯设计

智能台灯;语音识别;STC89C52RC单片机

Benso_H的博客 5842

电子技术设计——16×16点阵汉字显示设计

同时,设计还应注重提升显示品质,以保证汉字的稳定展示和观感舒适。本设计的目的是构建一个能够准确在LED点阵上展示汉字的系统,并允许用户通过输入设备来选择所需的汉字,我们将验证设计方案的实际操作性和效果,以确保其满足设计目标。在LED点阵显示和汉字信息处理技术的结合下,研究者们着手研究如何在LED点阵上有效地显示汉字,并提出了一系列显示算法和优化策略,旨在实现清晰且易于阅读的汉字显示效果。首先,你需要准备16×16的LED点阵面板,通常这些点阵是8×8点阵的两倍,因此可以由两个8×8的点阵组合而成。

weixin_68094467的博客 1533

深度解剖~ FreeRtos阅读笔记2 任务创建、内核链表初始化

2.FREERTOS任务创建、内核链表初始化 硬件环境:cortex m4 FreeRTOS版本:v8.0.1 今天开始阅读freertos,阅读同时做下笔记,等哪天碰到移植问题再翻出来看看。 2.1 任务、链表结构体 源码中使用tskTCB来存储一个任务的所有信息,xLI...

chixi8127的博客 685

西门子S7-1200与FUNUC机器人MODBUS TCP通信

PLC与机器人通讯

Illusssion的博客 1万+

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

2.FREERTOS任务创建、内核链表初始化硬件环境:cortex m4FreeRTOS版本:v8.0.1今天开始阅读freertos,阅读同时做下笔记,等哪天碰到移植问题再翻出来看看。2.1 任务、链表结构体源码中使用tskTCB来存储一个任务的所有信息,xLIST存储内核链表数据。一个系统最基本的功能是它的任务调度,在任务切换时最重要的则是内核链表,用图描述下这两个结构体,这样看起来比代码更清...

weixin_39860123的博客 906

【农业生产系统模型】基于R语言APSIM模型进阶应用与参数优化、批量模拟实践技术

APSIM模型有Classic和Next Generation两个系列模型,能模拟几十种农作物、牧草和树木的土壤-植物-大气过程,被广泛应用于精细农业、水肥管理、气候变化、粮食安全、土壤碳周转、环境影响、农业可持续性、农业生态等诸多与农业生产和科研有关的领域。R语言是一门应用场景广泛、简单易学的程序语言,APSIM模型开发了许多R语言辅助包,在APSIM模型的气候、土壤、管理措施等数据准备,自动化模拟,参数优化和结果分析上都发挥着重要的作用。案例一:APSIM模型输入参数和土壤文件的制备。

2303_79243743的博客 1046

实战指南 | 利用TSMaster的C小程序实时监控DBC报文发送周期

本文提供了一份利用TSMaster的C小程序实时监控DBC报文发送周期的实战指南。通过创建用户变量、编写C小程序核心逻辑并关联图形模块,工程师可以直观地可视化关键报文(如ID 0x64)的发送间隔,从而快速发现周期异常,提升汽车电子开发和测试中总线问题定位的效率与实时性。

weixin_29178069的博客 417

freertos实时内核实用指南_深度解剖~ FreeRtos阅读笔记2 任务创建、内核链表初始化...

2.FREERTOS任务创建、内核链表初始化硬件环境:cortex m4FreeRTOS版本:v8.0.1今天开始阅读freertos,阅读同时做下笔记,等哪天碰到移植问题再翻出来看看。2.1 任务、链表结构体源码中使用tskTCB来存储一个任务的所有信息,xLIST存储内核链表数据。一个系统最基本的功能是它的任务调度,在任务切换时最重要的则是内核链表,用图描述下这两个结构体,这样看起来比代码更清...

weixin_33954874的博客 371

16. SAP Fiori Elements 应用里图片字段(Image)的显示原理介绍

很多朋友向我反映,学习了 一段时间的 SAP Fiori Elements 开发,但是感觉整套体系对于自己来说还是个黑盒子,很多技术点,看了 SAP 官方帮助文档后,觉得自己懂了,但是一旦需要自己动手做一些东西出来时,又觉得一片茫然。 其实笔者自己也经历过这个过程。究其原因,还是大家对 Fiori Elements 一些技术细节没有理解,对 SAP 官方的知识点仅仅停留在记忆,甚至是死记硬背上面。 不过没有关系,本教程笔者会刻意设置一些练习,让大家动手,在实战中逐渐熟悉 Fiori Elements 这

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 754

freertos 编译c++失败_深度解剖~ FreeRtos阅读笔记1

上帝不仅给了我一颗低频的cpu还送了个劣质的晶振,可悲可叹!无奈在家休养,不然的话晶振偷停我可就驾鹤西去了。。。不过这也是个好机会,在家靠着窗户晒着太阳,偶尔读读源码,都很好。就是工资没了~接连几个项目都使用了freertos,作为刚刚毕业一张白纸的我只能先去摸索一些api怎么去调用,需要填入哪些参数,才能达到自己的目的。程序不出问题就完事大吉了,不过稍有异常出现例如某个任务莫名奇妙的被挂起,超出...

weixin_36319938的博客 432

基于ESP32 蓝牙游戏手柄设计

介绍使用 ESP32 并通过 BLE 通信的 设计手持游戏手柄,包含原理图与代码

DT程序员的博客 2164

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

深度解剖~ FreeRtos阅读笔记5 FreeRtos内存管理详解

5 Freertos 内存管理 芯片中最为稀缺珍贵的往往是存储资源,为了更好的利用它们,开发者不得不变得吝啬分配、斤斤计较到每一个字节。 FreeRtos V8.0.1针对动态内存分配提供了四种方案,分别放在heap1、heap2、heap3、heap4文件中。 5.1 分配方式 heap1 heap1分配方法最为简单,代码量也相对较小,heap1只能申请不能回收,适合任务、队列等不需要执行删除操作的工程。 ucHeap占据的整块内存既为可申请的堆空间,空间大小由configTOTAL_H..

Yangquot的博客 540

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

深度解剖~ FreeRtos阅读笔记1

上帝不仅给了我一颗低频的cpu还送了个劣质的晶振,可悲可叹!无奈在家休养,不然的话晶振偷停我可就驾鹤西去了。。。不过这也是个好机会,在家靠着窗户晒着太阳,偶尔读读源码,都很好。就是工资没了~ 接连几个项目都使用了freertos,作为刚刚毕业一张白纸的我只能先去摸索一些api怎么去调用...

chixi8127的博客 258

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深度解剖~ FreeRtos阅读笔记3 freertos调度器启动、中断优先级管理、中断优先级分组

3. freertos调度器启动、中断优先级管理、中断优先级分组 永远不要小看不起眼的东西,哪怕是短短的一行代码! 某些图片分辨率过大显示不清楚,保存到本地或点击放大会回复原状。 原本认为几分钟能搞定的vTaskStartScheduler函数结果一不小心弄到了中秋,还好有葵花宝典(CM3权威指南)在,不然中秋节就抱着一堆代码度过了。 很多例程将vTaskStartScheduler函

Yangquot的博客 2659

深度解剖~ FreeRtos阅读笔记3 freertos调度器启动、中断优先级管理、中断优先级分组...

3. freertos调度器启动、中断优先级管理、中断优先级分组 永远不要小看不起眼的东西,哪怕是短短的一行代码! (某些图片分辨率过大显示不清楚,保存到本地或拖动可放大)。 很多例程将vTaskStartScheduler函数作为main执行的最后一行代码,因为执行了vT...

chixi8127的博客 881

【FreeRTOS实战汇总】RTOS学习实战快速进阶之路(持续更新)

打算把这段时间系统学习RTOS的文章统一整理到这里,另外本文会给出一些参考性资料和指导性建议; 本文宗旨

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 1万+
下一篇: 深度解剖~ FreeRtos阅读笔记3 freertos调度器启动、中断优先级管理、中断优先级分组
橘子x
博客等级 码龄14年 320粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值