FreeRTOS学习笔记1

devtools/2024/10/18 16:27:04/

结合汇编

ldr r3, =pxCurrentTCB
ldr r2  

R3 value=0x20000054,R2 value=0x2002B950

pxCurrentTCB  020028950

pxTopOfStsck   0x2002B8FC   

解释这些寄存器的值是怎么变化的

1. ldr r3, =pxCurrentTCB
  • 这一行指令将 全局变量 pxCurrentTCB 的地址加载到寄存器 r3 中。
  • pxCurrentTCB 是 FreeRTOS 中一个指向当前任务控制块(TCB)的全局变量,它保存当前正在执行任务的 TCB 地址。
  • 比如:假设 pxCurrentTCB 存储在内存地址 0x20000054,这意味着 ldr r3, =pxCurrentTCB 执行后,r3 的值将是 0x20000054
2. ldr r2, [r3]
  • 这一行指令是从 r3 中存储的地址(即 pxCurrentTCB 的地址)处读取值,并将这个值存储到寄存器 r2 中。
  • 具体来说,这个值就是当前任务控制块(TCB)的地址。
    • 在你的情况中,pxCurrentTCB 的值是 0x2002B950(即当前任务 TCB 的地址)。
  • 这意味着执行 ldr r2, [r3] 之后,r2 的值将是 0x2002B950,也就是当前任务控制块的地址。

总体流程解释

  1. 第一行:ldr r3, =pxCurrentTCB

    • pxCurrentTCB 这个全局变量的地址加载到寄存器 r3 中。
    • 假设 pxCurrentTCB 位于内存地址 0x20000054,则 r3 的值是 0x20000054
  2. 第二行:ldr r2, [r3]

    • r3 指向的地址(pxCurrentTCB 的地址)处读取值,也就是当前任务控制块的地址。
    • 假设 pxCurrentTCB 的值是 0x2002B950,因此执行后 r2 中的值是 0x2002B950

如何联系 pxTopOfStack

  • pxCurrentTCB 是指向当前任务的 TCB 结构的指针,而每个任务的 TCB 结构中包含多个字段,其中之一是 pxTopOfStack,它存储了任务栈顶的指针。
  • 在这个例子中,当我们加载了 pxCurrentTCB 的值到 r2 后,r2 就指向了当前任务的 TCB 结构。
  • pxTopOfStack 是存储在 TCB 结构中的一个字段,它的值是栈顶指针。具体来说,pxTopOfStack = 0x2002B8FC

因此,ldr r2, [r3] 这条指令将当前任务的 TCB 地址(0x2002B950)加载到了寄存器 r2,接下来就可以通过访问 r2 中的 TCB 结构来获取其他字段的值,例如 pxTopOfStack

任务切换场景

  1. ldr r3, =pxCurrentTCB:加载 pxCurrentTCB 的地址到 r3(假设 0x20000054)。
  2. ldr r2, [r3]:从 pxCurrentTCB 中读取当前任务的 TCB 地址(0x2002B950),加载到 r2 中。
  3. 后续操作:可以使用 r2 访问当前任务的 TCB 结构中的字段(如 pxTopOfStack = 0x2002B8FC),用于保存或恢复任务的上下文。

两个地址的区别

  1. 0x20000054pxCurrentTCB 的地址

    • pxCurrentTCB 是一个全局变量,它的作用是保存当前任务控制块(TCB)的指针。这个全局变量本身存储在内存地址 0x20000054 处。
    • 换句话说,0x20000054pxCurrentTCB 这个变量的位置,也就是它的地址
  2. 0x2002B950 是当前任务的 TCB 地址

    • pxCurrentTCB 存储的值是当前任务控制块(TCB)的地址。这个地址指向当前正在运行的任务的 TCB 结构体。
    • 在你的例子中,pxCurrentTCB 的值是 0x2002B950,这意味着当前任务的 TCB 结构体存储在内存的 0x2002B950 处。

具体的工作原理

  1. pxCurrentTCB 的地址 0x20000054

    • pxCurrentTCB 是一个变量,存储在内存中的某个位置,在你的例子中它位于 0x20000054
  2. pxCurrentTCB 的值 0x2002B950

    • 这个全局变量(pxCurrentTCB)的值是当前任务的 TCB 的地址。在你的情况中,当前任务的 TCB 位于 0x2002B950 处。
ldr r3, =pxCurrentTCB
ldr r2, [r3]
  • ldr r3, =pxCurrentTCB

    • 这行代码把 pxCurrentTCB 这个全局变量的地址加载到了 r3 寄存器中。
    • 在你的情况中,pxCurrentTCB 存储在 0x20000054,所以这条指令执行后,r3 的值是 0x20000054
  • ldr r2, [r3]

    • 这行代码读取 r3 指向的内存地址中的内容。因为 r3 的值是 0x20000054,这个地址存放的是 pxCurrentTCB 的值。
    • pxCurrentTCB 的值是 0x2002B950,也就是当前任务 TCB 的地址。因此,执行这条指令后,r2 的值就变成了 0x2002B950,即当前任务的 TCB 地址

 谈下我的理解:地址0x20000054存储了pxCurrentTCB即当前任务控制块的地址 ,当提取地址0x20000054的值也就是提取当前任务控制块的地址,这个地址指向了0x2002B950,也就是任务真正的任务控制块的地址,当读取任务控制块的首个字段为栈顶指针,所以当读取TCB结构时首先得到的是栈顶指针的地址0x2002B8FC

简而言之:

  • 0x20000054 存储的是 pxCurrentTCB,它是当前任务控制块(TCB)的指针。
  • 当从 0x20000054 处读取值时,获取的是当前任务的 TCB 地址,也就是 0x2002B950
  • 然后,读取 TCB 结构的首个字段,该字段指向栈顶指针 pxTopOfStack,其值为 0x2002B8FC

 


http://www.ppmy.cn/devtools/126762.html

相关文章

【H2O2|全栈】更多关于HTML(2)HTML5新增内容

目录 HTML5新特性 前言 准备工作 语义化标签 概念 新内容 案例 多媒体标签 音频标签audio 视频标签 video 新增部分input表单属性 预告和回顾 后话 HTML5新特性 前言 本系列博客是对入门专栏的HTML知识的补充,并伴随一些补充案例。 这一期主要介绍H…

太速科技-628-基于VU3P的双路100G光纤加速计算卡

基于VU3P的双路100G光纤加速计算卡 一、板卡概述 基于Xilinx UltraScale16 nm VU3P芯片方案基础上研发的一款双口100 G FPGA光纤以太网PCI-Express v3.0 x16智能加速计算卡,该智能卡拥有高吞吐量、低延时的网络处理能力以及辅助CPU进行网络功能卸载的能力…

Ansible自动化工具

一、Ansible概述 1.1 什么是Ansible Ansible 是一个开源的自动化工具,用于配置管理、应用程序部署和任务自动化。它让你可以通过编写简单的 YAML 文件(剧本,Playbooks),轻松管理和配置多个服务器。Ansible 的特点是无…

鸿蒙ArkTS实用开发技巧: 提高效率的关键知识点

ArkTS作为鸿蒙系统的核心开发语言,为开发者提供了强大的工具来创建跨设备、高性能的应用。本文将重点介绍一些实用的ArkTS开发技巧和知识点,帮助开发者提高开发效率和应用质量。 1. 高效的状态管理 ArkTS提供了多种状态装饰器,用于不同场景的状态管理: Entry Component struc…

C#中Task.ContinueWith如何使用

Task.ContinueWith 方法是 Task 类的一个成员,它允许你为一个任务添加一个延续操作。这个延续操作会在任务完成时执行,无论是成功完成、发生异常还是被取消。你可以使用这个方法来执行一些清理工作,或者基于前一个任务的结果来启动另一个任务…

STM32—PWR电源控制

1.PWR简介 PWR(Power Control)电源控制PWR负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能可编程电压监测器(PVD)可以监控VDD电源电压,当VDD下降到PVD阀值以下或上升到PVD阀…

路由器原理

路由器原理 路由器:能够将数据转发到正确的目标,而在这一转发过程中选中最佳路径 路由器原理:根据IP地址转发 路由表:记录的转发的路径 路由表生成: 手动配置路由器自己学习 路由器基础命令: 含义指令查看路由表di…

spark统一内存模型 详解

Apache Spark 是一个用于大规模数据处理的分布式计算框架,它支持多种处理模型(如批处理、流处理、SQL、机器学习等)。为了高效地在分布式环境中处理这些多样化的工作负载,Spark 在 2.x 版本后引入了统一内存管理模型,以…