C166; Стек разрешен только в ближайшей памяти

Я пытаюсь понять этот макрос сборки, который устанавливает указатель стека на расположение стека задач ОСРВ. Есть несколько команд на ассемблере, которые я не знаю, и где я не могу найти столько информации.

Этот код указывает указатель стека пользователя на стек задачи Micrium (ОСР ОС uC/OS III). Но эти задачи разрешены только в ближайшей памяти, и это, вероятно, из-за этих функций сборки.

Вот почему я пытаюсь выяснить, что именно здесь происходит. И почему стек может быть только в ближней памяти. После этого я хотел бы узнать, могу ли я переписать это для поддержки стеков задач за пределами ближней памяти.

Этот код сборки выполняется на чипе 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.

Итак, биты 23-14 указателя. При взгляде на изображение ниже:

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

Начните расширенную последовательность страниц. Следующая 1 инструкция является частью расширенной последовательности страниц. 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 - это определение типа неподписанного короткого __near.

Размеры элементов в этой структуре:

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 ответов

Другие вопросы по тегам