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)