首页 > 其他分享 >FreeRTOS深入教程(任务的引入及栈的作用)

FreeRTOS深入教程(任务的引入及栈的作用)

时间:2023-10-23 20:32:56浏览次数:35  
标签:tmp 教程 R0 FreeRTOS r2 pa 及栈 寄存器 R1

(文章目录)


前言

本篇文章开始带大家深入学习FreeRTOS,带大家学习什么是任务,并且深入学习栈的作用。

一、任务的引入

在 FreeRTOS 中,任务(Task)是一个基本的执行单元,它代表了一个并行执行的工作单元。FreeRTOS 是一个实时操作系统,允许你创建多个任务,每个任务都有自己的代码、堆栈和优先级。这些任务可以独立运行,以实现多任务并发。

以下是关于 FreeRTOS 任务的一些关键概念:

任务的特点:

每个任务都有自己的独立堆栈,用于保存任务的局部变量和上下文信息。

任务可以具有不同的优先级,操作系统根据任务的优先级来调度它们的执行。

任务可以是无限循环的,也可以在完成其工作后自行删除。

每个任务都有一个唯一的任务句柄,可以用于管理和控制任务。

二、深入理解C语言函数的调用

1.ARM架构

在我们看来执行a+b是一件非常简单的事情,但是在CPU的内部却做了非常多的操作。

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

  • 把内存a的值读入CPU寄存器R0
  • 把内存b的值读入CPU寄存器R1
  • 把R0、R1累加,存入R0
  • 把R0的值写入内存a 在这里插入图片描述

2.基础汇编指令

LDR(Load Register):

LDR 指令用于将数据从内存加载到寄存器中。 典型的 LDR 指令的语法:LDR Rd, [Rn, #Offset],其中 Rd 是目标寄存器,Rn 是基址寄存器,Offset 是偏移量。 举例:LDR R0, [R1, #4] 表示将存储在地址 (R1 + 4) 处的数据加载到 R0 寄存器中。

STR(Store Register):

STR 指令用于将寄存器中的数据存储到内存中。 典型的 STR 指令的语法:STR Rd, [Rn, #Offset],其中 Rd 是源寄存器,Rn 是基址寄存器,Offset 是偏移量。 举例:STR R0, [R1, #4] 表示将 R0 寄存器中的数据存储到地址 (R1 + 4) 处。

ADD(Add):

ADD 指令用于将两个操作数相加,并将结果存储在目标寄存器中。 典型的 ADD 指令的语法:ADD Rd, Rn, Operand2,其中 Rd 是目标寄存器,Rn 是第一个操作数寄存器,Operand2 是第二个操作数。 举例:ADD R0, R1, #10 表示将 R1 寄存器中的值与 10 相加,并将结果存储在 R0 中。

POP:

POP 指令用于从栈中弹出多个寄存器的值。 POP 指令的操作是根据栈指针(通常是 SP 寄存器)从栈中弹出值,同时更新栈指针。 通常用于函数返回时,以恢复之前保存的寄存器状态。

POP {R3, PC} 在这里插入图片描述

PUSH:

PUSH 指令用于将多个寄存器的值推送(压入)到栈上。 PUSH 指令的操作是根据栈指针(通常是 SP 寄存器)将值压入栈中,同时更新栈指针。 通常用于函数调用时,以保存当前寄存器状态。

PUSH {R3, LR} 在这里插入图片描述

3.函数运行流程分析

在keil5中编写一个加法函数:

/* a = a + b */
void add_val(int *pa, int *pb)
{
	//*pa = *pa + *pb;

	volatile int tmp;

	tmp = *pa;
	tmp = tmp + *pb;
	*pa = tmp;
	
}

int a = 1;
int b = 2;

add_val(&a, &b);	

汇编代码:

在这里插入图片描述 汇编代码分析:

首先执行PUSH	{r3,lr}命令
将r3寄存器的值和lr返回地址保存到了栈中。
r3就是局部变量tmp的值。

在这里插入图片描述 tmp = *pa;

LDR      r2,[r0,#0x00]   读取r0的值到r2中,也就是将*pa读取到r2中。
STR      r2,[sp,#0x00]   将r2的值保存到sp+0x00地址处也就是将*pa保存到tmp中。
			完成tmp = *pa;赋值语句

tmp = tmp + *pb;

LDR	     r2,[r1, #0x00] 读取r1的值到r2中,也就是将*pb读取到r2中
LDR		 r3,[sp,#0x00] 读取sp+0x00的值到r3中,也就是将tmp读取到r3中
ADD	 	 r2,r2,r3 将r2+r3的和保存到r2中,也就是将*pb + tmp的值保存到r2中
STR		 r2,[sp,#0x00] 将r2的值保存到sp中也就是tmp = *pb + tmp

*pa = tmp;

LDR    r2,[sp,#0x00] 读取sp+0x00的值保存到r2中,也就是将tmp保存到r2中
STR	   r2,[r0,#0x00] 将r2的值保存到r0中,也就是*pa = tmp

POP {r3,lr}

出栈将lr的值返回给pc寄存器,执行下一条指令。

三.保存现场的几种情况

1.函数调用

当函数调用时R0,R1,R2通常被用来传递参数故不需要保存这几个寄存器的值。

void funA(void)
{
	.........
	funB(a, b);
}

2.中断处理

被中断打断时硬件会帮我们保存R0,R1,R2寄存器,其他寄存器需要通过软件来保存。

void funA(void)
{
	->被中断打断
}

3.任务切换

当任务切换时需要保存所有的寄存器,因为任务并不知道会使用到哪些寄存器。

总结

本篇文章主要引入了任务及说明了栈在这里的作用。

标签:tmp,教程,R0,FreeRTOS,r2,pa,及栈,寄存器,R1
From: https://blog.51cto.com/u_16153875/7993823

相关文章

  • 无涯教程-Clojure - 日期&时间
    由于Clojure框架是从Java类派生的,因此可以使用Clojure中Java中可用的日期时间类,以下是可用于日期时间类的方法。java.util.Date这用于在Clojure中创建日期对象。java.util.Date.以下程序显示了有关如何使用它的示例。(nsexample)(defnExample[](defdate(.toStrin......
  • 无涯教程-Clojure - 正则表达式
    正则表达式是一种用于在文本中查找子字符串的模式,正则表达式用于各种编程语言中,并在LISP类型的编程语言中使用很多。以下是正则表达式的示例。//d+上面的正则表达式用于查找字符串中数字的另一个出现。//字符用于确保字符"d"和"+"用于表示正则表达式。以下方法可用于正则......
  • 无涯教程-Clojure - 序列
    序列是在"seq"命令的帮助下创建的。以下是一个简单的序列创建示例。(nsclojure.examples.example(:gen-class));;ThisprogramdisplaysHelloLearnfk(defnExample[](println(seq[123])))(Example)上面的程序产生以下输出。(123)以下是可用于序列的......
  • URP渲染管线实战教程系列3
    1.3 URP渲染管线光照核心机制剖析 上一节通过剖析URP摄像机了解摄像机的机制,本节来分析URP的光照的主要机制,并通过与内置的向前渲染管线做对比,来比较它们的与不同。  1:URP渲染管线重新定义了光源 不出意外,UPR渲染管线重新定义了光源组件, 接下来看下相比向前渲染......
  • URP渲染管线实战教程系列2
    1.2 URP渲染管线摄像机核心机制剖析 上一节从项目的目录结构与示例场景的内容分析了UPR渲染管线项目的基本组成,接下来分析URP的主要机制,并通过与内置的向前渲染管线做对比,来比较它们的与不同。按照先后顺序本节首先来分析URP渲染管线的摄像机的策略。  1:URP渲染管线重......
  • URP渲染管线实战教程系列1
    1.1 URP渲染管线实战解密(一) 现在越来越多的手游开发都采用URP渲染管线,来代替之前Unity引擎默认的向前渲染管线,本节通过一下几个方面来阐述URP渲染管线,对URP渲染管线有个全面认识。 (1)为什么使用URP渲染管线;(2)如何创建一个URP渲染管线的项目;(3)基于URP渲染管线的......
  • 无涯教程-Clojure - 文件I/O
    使用I/O时,Clojure提供了许多辅助方法。读取文件(Readingfiles)写入文件(Writingtofiles)查看文件是文件还是目录让我们探讨Clojure提供的一些文件操作。读取内容如果要以字符串形式获取文件的全部内容,可以使用clojure.core.slurp方法。slurp命令打开文件并读取其所有......
  • AutoCAD2023软件安装教程及安装包下载
    由“Autodesk”公司研发推出的AutoCAD202364位简体中文版已于2022年3月已经正式发布,AutoCAD是一款全球领先的计算机辅助设计(CAD)软件,全新的2023版本拥有着非常强大的渲染、绘图和三维打印功能,还提供了动态块、文本设定、数据提取、三维导航、截面平面、DWG比较、云存储连接......
  • 草图大师(SketchUp)2022安装图文教程
    草图大师(SketchUp)是一个非常受欢迎并且易于使用的3D设计软件,它被比喻为电子设计中的“铅笔”。它的主要特点就是使用简便,人人都可以快速上手。并且可以将使用SketchUp创建的3D模型直接输出至GoogleEarth里。下载草图大师2022版并解压缩【rjqjf.com】二、双击进入解压缩后的“草图......
  • AutoCAD Civil3D 2023安装图文教程及下载
    Civil3D设计软件是土木工程师的首选软件,也是民用大众领域的综合解决方案,同时Civil3D提供了AutoCAD和AutoCADMap3D的功能,该软件使用基于模型的环境,以便做出更好的设计决策并提高项目质量,通过以设计为导向的计划生产方法简化文档编,利用BIM(建筑信息模型)的强大功能,实现更好的设计......