C166;堆栈仅允许在近内存中

时间:2018-03-26 06:53:49

标签: assembly infineon

我试图理解这个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部分。

指针的第23-14位。查看下图时: enter image description here

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)

0 个答案:

没有答案