线程创建
线程创建的伪代码
void ThreadCreate(adr_t A)
{
tcb = create_tcb(); //创建tcb并且初始化,分配内存
stack = create_task_stack();//创建任务的栈并且分配内存
stack.push(A); //往栈中压入任务A的起始地址
tcb.esp = stack //任务tcb中esp关联到刚创建的栈
}
线程切换
线程切换的伪代码
从右边线程切换到左边线程 只需调用下面这个yield函数:
- CPU的esp保存右边线程的esp现场
- esp切到左边线程tcb记录的栈上
- 通过}右括号,即跳出yield函数后,弹栈左边线程的栈顶
- 回到左边线程yield的下一行代码
void Yield()
{
//... //压入现场操作
cur_tsk_tcb.esp = esp; //esp放在当前任务的tcb中
Next(); //调度函数
esp = next_tsk_tcb.esp; //调度到的下个任务的tcb中拿到esp赋值给cpu的esp
}