并行任务与调度详解
1. 任务创建
当系统运行时,除了正在运行的任务,其他所有任务都处于等待状态。这意味着完整的栈帧会被保存到栈底,栈指针则存储在控制块中,供调度器恢复每个进程时使用。
新创建的任务会在上下文切换过程中首次唤醒。此时,任务应保留其 CPU 寄存器的先前状态,但显然新任务没有这样的状态。在创建栈时,会将一个伪造的栈帧压入栈的末尾,这样当任务恢复时,存储的值会被复制到系统寄存器中,任务就能从其入口点继续执行。
UBTL@DSFBUF函数依赖于栈初始化函数UBTL@TUBDL@JOJU,该函数会为系统寄存器压入初始值以恢复任务,并将存储的栈指针移动到额外帧的开头,该额外帧可以不进行初始化。为了方便访问栈帧中存储的寄存器,我们声明了TUBDL@GSBNF结构和FYUSB@GSBNF结构:
TUSVDU TUBDL@GSBNF { VJOU32@U S0, S1, S2, S3, S12, LR, PC, xPSR; }; TUSVDU FYUSB@GSBNF { VJOU32@U S4, S5, S6, S7, S8, S9, S10, S11; };以下是栈初始化函数的代码:
TUBUJD WPJE UBTL@TUBDL@JOJU(TUSVDU UBTL@CMPDL *U) { TUSVDU TUBDL@GSBNF *UG;