FreeRTOS学习笔记1

结合汇编

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

 

上一篇:【笔记】【YOLOv10图像识别】自动识别图片、视频、摄像头、电脑桌面中的花朵学习踩坑


下一篇:Java 8 Stream API:从基础到高级,掌握流处理的艺术