结合汇编
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
,也就是当前任务控制块的地址。
总体流程解释
-
第一行:
ldr r3, =pxCurrentTCB
- 将
pxCurrentTCB
这个全局变量的地址加载到寄存器r3
中。 - 假设
pxCurrentTCB
位于内存地址0x20000054
,则r3
的值是0x20000054
。
- 将
-
第二行:
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
。
任务切换场景
ldr r3, =pxCurrentTCB
:加载pxCurrentTCB
的地址到r3
(假设0x20000054
)。ldr r2, [r3]
:从pxCurrentTCB
中读取当前任务的 TCB 地址(0x2002B950
),加载到r2
中。- 后续操作:可以使用
r2
访问当前任务的 TCB 结构中的字段(如pxTopOfStack = 0x2002B8FC
),用于保存或恢复任务的上下文。
两个地址的区别
-
0x20000054
是pxCurrentTCB
的地址:pxCurrentTCB
是一个全局变量,它的作用是保存当前任务控制块(TCB)的指针。这个全局变量本身存储在内存地址0x20000054
处。- 换句话说,
0x20000054
是pxCurrentTCB
这个变量的位置,也就是它的地址。
-
0x2002B950
是当前任务的 TCB 地址:pxCurrentTCB
存储的值是当前任务控制块(TCB)的地址。这个地址指向当前正在运行的任务的 TCB 结构体。- 在你的例子中,
pxCurrentTCB
的值是0x2002B950
,这意味着当前任务的 TCB 结构体存储在内存的0x2002B950
处。
具体的工作原理
-
pxCurrentTCB
的地址0x20000054
:pxCurrentTCB
是一个变量,存储在内存中的某个位置,在你的例子中它位于0x20000054
。
-
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
。