以下是 FreeRTOS 线程切换时,用汇编获取线程栈地址的示意图:
portASM.S):
LDR X0, pxCurrentTCBConst
LDR X1, [X0]
LDR X0, [X1]
MOV SP, X0
可见,第一次访存得到 &pxCurrentTCB,第二次访存得到 pxCurrentTCB 的值,第三次访存得到 pxTopOfStack,即线程栈地址。
PS: 之前误认为
pxCurrentTCBConst: .dword pxCurrentTCB`
定义的 pxCurrentTCBConst 保存的是 pxCurrentTCB 的值。但实际上从汇编无法获得 C 变量的值,只能先获取变量地址,再通过地址间接访问得到变量值。 所以实际上定义的 pxCurrentTCBConst 并不是保存 pxCurrentTCB 的值,而是保存了 pxCurrentTCB 的地址。
结论 #
汇编无法获得 C 变量的值,只能先获取变量地址,再通过地址间接访问得到变量值