当你看到操作系统的多任务并行的时候,你是否觉的很神奇呢?你是否想过那些任务的时间片轮转是怎么实现的呢?这个时间片轮转的秘密是什么呢?相信很多单片机初学者都会对这个问题感兴趣。
当你查看单片机的汇编指令的时候,你是否留意过中断返回指令的操作过程?如果你留意过这个操作过程的话,你一定会发现它通过堆栈复原PC指针的过程。也就是说:当单片机产生中断的时候,它会把当前程序正在运行的PC指针保存在堆栈当中;然后当中断程序运行完毕的时候,程序执行中断返回指令,把堆栈中保存的PC指针再返回出来。
这个是单片机运行的正常情况,但是如果在单片机的中断中修改了堆栈中的PC指针值,那么是不是中断就返不回来原来的程序地址?如果还是这个地址是我故意设定的值那么他是不是执行完这个中断就跳到我的设定的这个地址上去了?
如果这个地址又是另外一个任务的地址的时候不是正好实现了从一个任务的死循环中跳到了另外一个任务的死循环中去了?对了!没错!多任务并行运行、时间片轮转的秘密就是:在定时中断中修改堆栈,使保存在中断中PC指针按照预定的方式改变从而让PC指针在几个任务地址中不停的跳转。
如果你有空去看UCOS的移植代码的时候,你会发现切换任务的asm函数就是在修改堆栈的内容。当然了,真正的任务的切换过程不仅仅是修改PC指针的堆栈内容,同时也修改了单片机所用到的所有可能被用到的寄存器的内容。