我试图理解这个Assembly宏,它将堆栈指针设置为RTOS的任务堆栈的位置。 有一些我不知道的装配命令 在哪里我找不到那么多的信息。
此代码将用户堆栈指针指向Micrium任务(uC / OS III RTOS)的堆栈。 但是这些任务只允许放在近乎内存中,这可能是因为这些汇编函数。
这就是我试图找出这里到底发生了什么的原因。为什么堆栈只能在近存储器中。 之后我想知道我是否可以重写它以支持近存储器之外的任务堆栈。
此汇编代码在XE169芯片(C166系列)上运行:
LOAD_USRSTK_PTR .MACRO
EXTP #PAG _OSTCBHighRdyPtr,#02h ; R4/R5 = OSTCBHighRdyPtr
MOV R4,POF _OSTCBHighRdyPtr
MOV R5,POF (_OSTCBHighRdyPtr+2)
EXTP R5,#01h ; user stack ptr = OSTCBHighRdyPtr->OSTCBStkPtr
MOV R15,[R4]
.ENDM
这是我发现每行代码的作用有多远:
LOAD_USRSTK_PTR .MACRO
使用名称LOAD_USRSTK_PTR
启动宏EXTP #PAG _OSTCBHighRdyPtr,#02h
开始扩展页面序列,接下来的2条指令是扩展页面序列的一部分
此指令中的#PAG _OSTCBHighRdyPtr部分是什么意思,这是否会获得OSTCBHighRdyPtr所指向的地址的Page部分。
MOV R4,POF _OSTCBHighRdyPtr
将_OSTCBHighRdyPtr写入寄存器4. POF在该指令中的含义是什么,它是否获得指针的值并将其存储在寄存器4中?
MOV R5,POF (_OSTCBHighRdyPtr+2)
将2个地址的值进一步写为OSTCBHighRdyPtr的地址到寄存器5。 POF在本说明书中的含义是什么 在这种情况下是否复制ExtPtr地址?因为这个地址长4个字节,寄存器只有2个字节?
EXTP R5,#01h ; user stack ptr = OSTCBHighRdyPtr->OSTCBStkPtr
开始扩展页面序列。下一条指令是扩展页面序列的一部分。 R5 =寄存器5该寄存器的确切操作
MOV R15,[R4]
将寄存器4的值移动到寄存器15,R15是用户堆栈指针
.ENDM
宏的结束
_OSTCBHighRdyPtr是一个结构的指针,这个结构的(开头)如下所示:
struct os_tcb {
CPU_STK *StkPtr; /* Pointer to current top of stack */
void *ExtPtr; /* Pointer to user definable data for TCB extension */
CPU_CHAR *NamePtr; /* Pointer to task name */
CPU_STK *StkLimitPtr; /* Pointer used to set stack 'watermark' limit */
....
}
CPU_STK是unsigned short __near的typedef。
此结构中项目的大小为:
StkPtr = 2 bytes (in near memory thus 2 bytes is enough)
ExtPtr = 4 bytes
NamePtr = 4 bytes
StkLimitPtr = 2 bytes (in near memory thus 2 bytes is enough)