【FreeRtos内部机制-韦东山(更新中)】

2023-05-16

在这里插入图片描述

1 任务的引入_ARM框架

任务:**一段代码;运行位置;运行环境----------------->即运行起来的函数**

补充ARM架构,以F103为例;数据保存在内存,代码保存在Flash
在这里插入图片描述

**  内存四区**

> 堆区(heap):一般由程序员手动分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回收。
> 栈区(stack):由编译器自动分配释放,**存放函数的形参、局部变量**等。当函数执行完毕时自动释放。 
> 全局区(global /stack):用于存放全局变量和静态变量, 里面细分有一个常量区,一些常量存放在此。该区域是在程序结束后由操作系统释放。 
> 代码区(code/ text):用于存放程序代码,字符串常量也存放于此。 ————————————————

在这里插入图片描述

> 内存四区原文链接:https://blog.csdn.net/weixin_44966641/article/details/120456141

1.1 探究 代码执行流程

a=a+b;

1.1.1 读变量,读到哪里去—寄存器

在这里插入图片描述

**CPU运行时,先去Flash上取得指令,再执行指令:

* 把内存a的值读入CPU寄存器R0
* 把内存b的值读入CPU寄存器R1
* 把R0、R1累加,存入R0
* 把R0的值写入内存a

** CPU内部有R0、R1、……、R15共16个寄存器
  * R13,别名SP,栈寄存器,保存着栈的地址
  * R14,别名LR,返回地址,保存着函数的返回地址
  * R15,别名PC,程序计数器,也就是当期程序运行到哪了

在这里插入图片描述

1.1.2 常用汇编指令补充

在这里插入图片描述

* 读内存:Load,LDR
* 写内存:Store,STR
* 加法:ADD
* 入栈:PUSH,实质上就是写内存STR
* 出栈:POP,实质上就是读内存LDR
* LDR R0, [R1, #0x00]
  * 源地址:R1+0x00,注意:不是读R1,是把R1的值当做内存的地址
  * 目的:R0,CPU的寄存器
  * 长度:4字节,LDR指令就是读4字节,LDRH是读2字节,LDRB是读1字节



要写内存:写内存哪个地址?从哪里得到数据?写多少字节?

* STR R0, [R1, #0x00]
  * 目的地址:R1+0x00,注意:不是写R1,是把R1的值当做内存的地址
  * 源:R0,CPU的寄存器
  * 长度:4字节,STR指令就是读4字节,STRH是读2字节,STRB是读1字节



入栈:把CPU的寄存器的值,写到内存上

* PUSH {R3, LR}

  * 源:CPU的寄存器R3、LR的值
  * 目的:内存,内存哪里?使用CPU的SP寄存器指定内存地址
  * 长度:大括号里所有寄存器的数据长度,每个寄存器4字节
  * 注意:低编号的寄存器,保存在内存的低地址处

出栈:把内存中的数值,写到CPU的寄存器

* POP {R3, PC}
  * 源:内存,内存哪里?使用CPU的SP寄存器指定内存地址
  * 目的:CPU的寄存器R3、PC的值
  * 长度:大括号里所有寄存器的数据长度,每个寄存器4字节
  * 注意:内存的低地址处的数据,写到CPU低编号的寄存器

1.2 栈的作用

1.2.1 代码运行汇编分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2.2 栈与现场

> ① 什么是现场?
> 
> 			暂且认为现场就是:当前被打断瞬间所有寄存器的值
> 
> ②  怎么保存现场?  		
> 		保存现场 :保存在内存里 ③ 内存在哪里?  	 16个寄存器保存在栈里
> 
>      任务:函数+保存现场(栈)==运行中的函数

③ 保存现场的几种场景

任务切换:
			保存所有寄存器的值	
	函数调用:
			保存某些寄存器
			传参--不用保存
	中断处理:
				硬件:保存一部分----栈
				软件处理中断:保存一些用到的寄存器

2 创建函数任务

2.1 创建任务的函数简析

在这里插入图片描述

xTaskCreate函数原型:

在这里插入图片描述

> xTaskCreate函数: 
> 					pxTaskCode:函数
> 					pcName: 任务名
> 					usStackDepth:栈大小,malloc 分配
> 					pvParameters:参数
> 					uxPriority:优先级
> 					pxCreatedTask:TCB结构体

2.2 创建任务的内部细节

2.2.1 TCB结构体

参数详解:
* 分配了TCB结构体
* 分配了栈
* 在栈里写入了函数地址、参数




```c
> 启用vTask函数:**往PC里放入函数地址,R0寄存器放入参数**

结构体成员
在这里插入图片描述

栈的大小分配

> 从哪里分配?
>1个巨大数组划分一部分内存用作栈,如下图,起始地址保存在TCB的pxSTACK里。 			
> 分配多大?
> 局部变量和调用深度

在这里插入图片描述
在这里插入图片描述

2.2 任务的调度机制与任务切换

2.2.1 优先级与状态

1 优先级不同

>   高优先级的任务,优先执行,可以抢占低优先级的任务 
>   高优先级的任务不停止,低优先级的任务永远无法执行 
>   同等优先级的任务,轮流执行:时间片轮转

2 状态

>    运行态:running   
>    就绪态:ready  
>    阻塞:blocked,等待某件事(时间、事件)   
>    暂停:suspend,休息去了

2.2.2 任务调度

3 怎么取出要运行的任务

>  找到最高优先级的运行态、就绪态任务,运行它
>  
>  如果大家平级,轮流执行:排队,链表前面的先运行,运行1个tick后乖乖地去链表尾部排队
>  
>  

在这里插入图片描述

4 谁进行调度?

>  * TICK中断-----即定时器中断
  

在这里插入图片描述

2.2.3 任务状态的切换

在这里插入图片描述不同的链表来维护不同状态的任务。

高优先级的任务3完成后从就绪ready链表进入delay链表,----->任务12得以执行
空闲任务:IdleTask: 清理工作
五个tick 后再次进入ready链表,继续统治

2.3 任务调度深入探讨

通过链表深入理解调度机制

* 可抢占:高优先级的任务先运行

* 时间片轮转:同优先级的任务轮流执行

* 空闲任务礼让:如果有同是优先级0的其他就绪任务,空闲任务主动放弃一次运行机会

在这里插入图片描述

3 消息队列(queue)

在这里插入图片描述

3.1 多任务系统中的互斥引入

在这里插入图片描述
在这里插入图片描述

定义全局变量a,多任务系统:A,B函数,均进行a++;--------------a=1
如何引入互斥机制,保证数据的可控性?
使用队列,用已经写好的API函数,关中断---写数据----开中断。

3.2 队列 好处

在这里插入图片描述

在这里插入图片描述

3.3 环形缓冲区

在这里插入图片描述

队列核心是:关中断、环形缓冲区、链表

3.4 队列结构体

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4.1 队列读流程

在这里插入图片描述

3.4.2 队列写流程

在这里插入图片描述

4 信号量和互斥量

4.1 信号量操作流程

信号量核心: 计数值; 
int count; list;

 **1 获取信号量: Take 操作**
	 a 关中断
	 b if (count>0){
	 	count--;
	 	return ok;
	 }
	 c else {1return Error;//不等待2)休眠:
	 			a):放入SemaphoreList
	 			b):ReadList[]--->DelayList
 	
 	d 被唤醒:
 		count--;
	 	return ok;

 	 **2 释放信号量: Give 操作** 
 		 a 关中断
 		 b count++;
 		 c SemaphoreList非空?有任务等待? wake up它。

在这里插入图片描述

4.2 互斥量

在这里插入图片描述
在这里插入图片描述

互斥量就是特殊的队列。

互斥量更是特殊的信号量,

互斥量实现了优先级继承。

低优先级任务获得互斥量,此时高优先级任务索取互斥量----->失败休眠。
HPTask提升低优先级的等级(优先级继承),使其快速搞定释放互斥量,然后恢复自己卑劣的地位,并唤醒HPTask;

在这里插入图片描述

5 事件组

在这里插入图片描述

1 创建
2 等待(哪些位? 与/或,timeout)
	a 关调度器
	b 当前事件变量uxEventBits是否满足需要
		满足;
		不满足:返回Err
				休眠:放入 event_group; readlist---->delayedList
				
	
3 设置事件
	a 设置事件:	uxEventBits
	b 唤醒xTaskWatingForBits队列上“所有”满足条件的任务			
	
事件组为什么不关中断?
事件中的中断不会设置“值”,只是触发/唤醒“守护任务”

6 任务通知的内部机制

### 8.1 核心: 通知状态、通知值

#### 8.1.1 通知状态

一个任务的"通知状态"有三种:

- taskNOT_WAITING_NOTIFICATION:任务没有在等待通知
- taskWAITING_NOTIFICATION:任务在等待通知
- taskNOTIFICATION_RECEIVED:任务接收到了通知,也被称为 pending(有数据了,待处理)  



一个任务想等待别人发来通知,可以调用`ulTaskNotifyTake  `或`xTaskNotifyWait  `:

- 可能别人早就发来通知:"通知状态"为taskNOTIFICATION_RECEIVED,那么函数立刻返回
- 可能别人还没发来通知:这些函数把"通知状态"从taskNOT_WAITING_NOTIFICATION
- 改为taskWAITING_NOTIFICATION,然后休眠



别的任务可以使用`xTaskNotifyGive`或`xTaskNotify `给某个任务发通知:

- 会马上唤醒对方
- 无条件唤醒对方,不管对方期待什么数据

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【FreeRtos内部机制-韦东山(更新中)】 的相关文章

  • Test Case Framework (TCF) tcf 刷机/AC/KVM 基本使用(一)

    移除属于我的机器 tcf alloc rm tcf alloc ls q u self 查看机器版本 tcf ls vv targetname 串口log tcf console read spr40s01 c log flash bios
  • 多线程CompletableFuture之常用方法示例

    文章目录 前期准备1 runAsync2 supplyAsync3 thenRunAsync4 thenAcceptAsync5 runAfterBothAsync6 thenCombineAsync7 exceptionally8 han
  • 算法题解-- stl

    周末舞会 题目描述 假设在周末舞会上 xff0c X 名男士和 Y 名女士进入舞厅时 xff0c 各自排成一队 xff0c 并分别按顺序编号 跳舞开始时 xff0c 依次从男队和女队的队头上各出一人配成舞伴 规定每个舞曲只能有一对跳舞者 跳
  • 简说spring 的设计模式

    spring 的设计模式 xff08 23种 xff08 面试题 xff09 说说BeanFactory和FactoryBean的实现原理和区别 xff1f spring 中你还知道哪些设计模式 xff1f xff1f 1 简单工厂模式 实
  • 【转载】MathGL中报错:undefined reference to `mgl_create_graph‘的解决方法

    概述 xff1a 在环境 xff1a ubuntu 20 04 中 成功下载好了mathGL xff0c 但是最后编译却报错 undefined reference to 96 mgl create graph 39 如下 xff1a 各种
  • 第十三届蓝桥杯 C/C++ 大学B组 题解

    第十三届蓝桥杯 C C 43 43 大学B组 题解 A 进制计算简单模拟 span class token macro property span class token directive hash span span class tok
  • Android12系统源码目录简单分析

    在这里插入图片描述 https img blog csdnimg cn 07a0627ec4754074b5b621cb3e4dae4d png 上面这么多文件夹 xff0c 有些是一直不需要去理会的 xff0c 比如说接触较多的文件夹 x
  • 应用层与内核层的区别

    应用层 xff1a 主要操作用户空间 xff0c 主要编写逻辑 xff0c 打印信息调用标准库里面的printf函数 内核层 xff1a 主要操作内核空间 xff0c 实现五大管理 xff1a 进程管理 xff0c 内存管理 xff0c 文
  • ubuntu软件:录制视频和截图工具,压缩视频

    1 自带录制视频工具 xff1b 使用方式 xff1a 无需下载 开始录屏 结束录屏 xff1a Ctrl 43 Alt 43 Shift 43 r 当看到 Ubuntu 桌面的右上方多了一个红色的小圆点 xff0c 代表正在录制 注意 x
  • Eth-trunk :LACP模式链路聚合实战

    Eth trunk LACP模式链路聚合实战 需求描述 PC1和PC3数据vlan10 xff0c 网段为192 168 10 0 24PC2和PC4数据vlan20 xff0c 网段为192 168 20 0 24确保设备之间互联互通 x
  • Test Case Framework (TCF) tcf itp 基本使用(二)

    查看机器是否支持itp tcf ls v interfaces power itp0 instrument
  • PDF发送短信2

    SMS是由Esti 所制定的一个规范 xff08 GSM 03 40 和 GSM 03 38 xff09 有两种方式来发送和接收SMS消息 xff1a 文本模式或者PDU xff08 protocol description unit xf
  • maven 打包资源文件需要注意的问题

    初衷 我写这篇博客的目的是想让大家了解一些 maven 项目的结构以及打包后是什么样子的 xff0c 方便大家在实际项目中去排查问题 比如 xff1a 我明明在 src main java 下把 mybatis 的 xml 写上了 xff0
  • Linux服务器Ubuntu上搭建Jenkins+Pytest+Gitee+Allure自动化

    一 安装Jenkins和Java Jenkins 是一个开源自动化服务器 xff0c 它可以自动执行软件持续集成和交付中涉及的重复性技术任务 Jenkins 易于安装且基于 Java xff0c 此外 xff0c 可以使用 Web 界面轻松
  • Python Cookbook学习总结

    第一章 xff1a 数据结构和算法 任何序列 xff08 可迭代的对象 xff09 都可以通过一个简单的赋值操作来分解为单独的变量 xff0c 唯一的要求是变量的总数和结构要与序列相吻合 xff08 比如对于存储二维坐标等的二维数组 xff
  • FreeRTOS入门——STM32下完成一个基于FreeRTOS的多任务程序

    文章目录 一 什么是FreeRTOS二 裸机系统与多任务系统1 裸机系统2 多任务系统3 系统之间的对比 三 实验要求四 实验准备五 在KEIL新建 FreeRTOS 工程1 新建本地工程文件夹2 使用 KEIL 新建工程3 在 KEIL
  • natnet/vrpn_cliernt环境配置

    vrpn sdk的频率上限就是60hz xff0c 想要提高频率可以使用natnet client进行话题接收 1 basalt vrpn client src下需要的其他package vrpn catkin glog catkin ca
  • 无人机集群学习

    natnet sdk4 0 学习 中文介绍 xff1a NatNet SDK Wiki 示例工程 xff1a NatNet Sample Projects NaturalPoint Product Documentation Ver 2 2
  • Nginx证书管理

    一 下载证书到本地 Nginx服务器上传 管理SSL证书 xff0c 将SSL证书压缩包下载到本地后 xff0c 加压Nginx服务器证书的压缩包文件 cert file name pem PEM格式的证书文件 xff0c PEM格式的证书
  • 【ESP32】arduino中的ESP32实时系统FreeRTOS使用教程(一)

    ESP32 FreeRTOS 任务的状态任务的优先级 创建任务传递给任务函数的参数结构体多参数传递互斥量MutexESP32的双核心固定频率运行任务软件定时器 简单的本节略过 xff0c 详细的可以看视频 xff1a 单片机ESP32上的F

随机推荐

  • Linux系统下GDB调试及opencv的使用

    Linux系统下GDB调试及opencv的使用 一 GDB的简介二 GDB的作用三 GDB的使用1 GDB调试举例2 段错误调试3 内存出错的gdb调试 四 安装opencv 3 4 11 下载opencv 3 4 12 解压3 编译4 配
  • Linux下vscode的配置与使用、proteus仿真运行stm32程序、Altium Designer18绘制STM32最小系统原理图

    Linux下vscode的配置与使用 proteus仿真运行stm32程序 Altium Designer18绘制STM32最小系统原理图 一 Linux下vscode的配置与使用1 安装vscode2 安装c 43 43 插件3 配置4
  • stm32f103核心板串口通信入门

    stm32f103核心板串口通信入门 一 基于寄存器与基于固件库编程方式的差异二 stm32串口通信1 前期准备硬件软件连接 2 编写程序并烧录设计程序烧录程序 三 总结 一 基于寄存器与基于固件库编程方式的差异 使用固件库 xff0c 目
  • Requirement already satisfied 的解决办法

    问题描述 xff1a 安装的时候出现Requirement already satisfied xff1a areadly exist 公司环境是需要dfmanager创建一个python36虚拟环境 xff0c 当在虚拟环境中使用pyth
  • 基于FreeRTOS的STM32多任务程序

    基于FreeRTOS的STM32多任务程序 一 材料准备二 FreeRTOS移植FreeRTOS是什么FreeRTOS移植到STM32上 MDK开发环境 1 下载FreeRTOS源代码2 前期准备3 手动移植RreeRTOS 程序的编写运行
  • STM32实现基于I2C的AHT20温湿度采集

    STM32实现基于I2C的AHT20温湿度采集 I2C通信协议软件I2C与 硬件I2C代码实现烧录硬件连接烧录并运行 参考 I2C通信协议 I2C协议简介 IC Inter Integrated Circuit xff09 总线是一种由 P
  • 计算机网络中Wireshark的简单使用与分析

    Wireshark应用实验 数据链路层网络层传输层TCP 和 UDP 段结构分析 TCP 建立和释放连接 应用层 数据链路层 熟悉 Ethernet 帧结构 其中 xff1a ff ff ff ff ff ff 接受计算机的MAC地址 xf
  • 计算机网络CPT简单应用

    计算机网络CPT简单应用 直接连接两台 PC 构建 LAN用交换机构建 LAN交换机接口地址列表生成树协议 xff08 Spanning Tree Protocol xff09 路由器配置初步 直接连接两台 PC 构建 LAN 将两台 PC
  • HTML入门学习

    HTML入门学习 一 软件准备及配置二 HTML入门学习1 HTML2 HTML文件结构及分析3 标题及文本格式4 超链接 图片与文件路径5 表格 列表及表单6 区块元素 内联元素 预设格式及特殊字符 三 总结与心得 一 软件准备及配置 所
  • CSS初步学习

    CSS初步学习 一 CSS二 CSS语法及生效方式三 三种样式 amp 颜色 尺寸与对齐四 BOX amp 边框与边距五 定位 amp 溢出六 浮动 amp 设置不透明度七 组合选择器 amp 伪类和伪元素八 总结 使用CSS需用到VS C
  • 《通信软件开发与应用》课程结业报告

    正在写 xff0c 12点之前肯定提交 xff0c 不要急 xff0c 老师 xff08 坚定的目光 xff09
  • printf函数的重定向

    为什么要重定向printf函数 xff1f printf函数是底层函数 xff0c 含于stdio h头文件 因为在C语言中printf函数已经定义为默认输出到显示器的 xff0c 若要想在串口上显示 xff0c 那就需要重定向printf
  • 利用蜂鸣器播放音乐

    我们知道 xff0c 蜂鸣器可分为有源蜂鸣器和无源蜂鸣器 xff0c 有源蜂鸣器内置了频率发生电路 xff0c 因此其通电就能够发出声音 xff0c 但是其频率是固定的 xff0c 而无源蜂鸣器内部没有频率发生电路 xff0c 需要外界给予
  • 关于Ubuntu18.04虚拟机连不上网的问题

    1 问题详情 尝试过桥接模式和NAT模式的设置但并没有解决问题 2 问题原因 网络设置过程有问题 3 解决问题 1 关闭当前虚拟机 xff0c 并按照下列截图在虚拟机设置里打开网络适配器 点击确认 2 选择编辑下的虚拟网络编辑器 3 重新开
  • WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.

    出现以下问题 解决办法 python m 会指定你当前使用的python版本 python m pip install pyreadline xff08 包名 xff09 安装成功 xff01
  • 大疆M3508电机分电板PCB及打板记录

    1 所需物品 已经完成的电路板4个xt30的航模公头接口1个xt60的航模母头接口1个xt60的航模公头接口5个GH1 25立贴母座 xff08 2Pin xff09 关于PCB文件转成G文件的方法 1 可以使用AD自带的转G文件的方法 x
  • ubuntu18.04下opencv的安装配置以及不同版本opencv的切换

    一 安装OpenCV3 4 1 如果是要跑ORB SLAM2 xff0c 建议用OpenCV 3 4 1 版本 xff0c 不然之后会很麻烦 xff0c 会出现不兼容问题 xff09 xff08 1 xff09 下载OpenCV 3 4 1
  • Docker基础使用篇

    一 什么是docker xff0c 项目中使用docker的目的是什么 xff1f 1 什么是docker xff1f 1 Docker 是一个开源的应用容器引擎 xff0c 让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中 xff
  • 基于Python_opencv的车牌识别系统

    基于python opencv的车牌识别系统 一 说明 根据现有的车牌识别系统 xff0c 本人对代码进行了优化 xff0c 原有功能 xff1a 1 对图片中的车牌号进行识别 xff0c 并对车牌所属地可视化 2 将识别出的车牌号 车牌所
  • 【FreeRtos内部机制-韦东山(更新中)】

    1 任务的引入 ARM框架 任务 xff1a span class token operator span span class token operator span 一段代码 xff1b 运行位置 xff1b 运行环境 span cla