UCOS-II嵌入式实时操作系统 在任务切换时,单片机压入堆栈和出栈结构图
由于51系列单片机要求堆栈必须设置在片内RAM(IDATA)中,而这种处理器的片内RAM非常有限,不可能把应用程序中的所有任务的任务堆栈都设置在片内RAM中,所以就只能把应用程序中各个任务堆栈的内容存放在片外RAM,只在片内RAM中设置一个公用的堆栈(即片内RAM只存放将要执行的任务堆栈)。在任务切换时,CPU先把当前的任务压入系统堆栈,再把系统堆栈的任务复制到片外堆栈中保存起来,最后再从片外堆栈把将要运行的任务堆栈映像复制到系统堆栈中。
51单片机的外部RAM中设置任务堆栈映像,其最低地址空间用来存放用户堆栈的长度,并使该任务的TCB中的OSTCBStkPtr指针变量指向该地址。
51单片机的堆栈指针SP总是先加1再存数据,因此,SP初始时指向系统堆栈起始地址(OSStack)减1处(OSStkStart)。所以系统堆栈的长度为SP~OSStkStart。
在任务切换时,应先把当前任务在系统堆栈的内容复制保存到该任务堆栈映像中。也就是计算SP~OSStkStart得出堆栈的长度,并将其写入任务堆栈映像最低地址空间中;然后以其为长度,以任务堆栈映像最低地址为目标起始地址,以OSStkStart为源起始地址,由系统堆栈向任务堆栈映像复制数据。反之,由任务堆栈映像向系统堆栈复制数据,则相反便是。