當(dāng)你看到操作系統(tǒng)的多任務(wù)并行的時(shí)候,你是否覺的很神奇呢?你是否想過那些任務(wù)的時(shí)間片輪轉(zhuǎn)是怎么實(shí)現(xiàn)的呢?這個時(shí)間片輪轉(zhuǎn)的秘密是什么呢?相信很多單片機(jī)初學(xué)者都會對這個問題感興趣。
當(dāng)你查看單片機(jī)的匯編指令的時(shí)候,你是否留意過中斷返回指令的操作過程?如果你留意過這個操作過程的話,你一定會發(fā)現(xiàn)它通過堆棧復(fù)原PC指針的過程。也就是說:當(dāng)單片機(jī)產(chǎn)生中斷的時(shí)候,它會把當(dāng)前程序正在運(yùn)行的PC指針保存在堆棧當(dāng)中;然后當(dāng)中斷程序運(yùn)行完畢的時(shí)候,程序執(zhí)行中斷返回指令,把堆棧中保存的PC指針再返回出來。
這個是單片機(jī)運(yùn)行的正常情況,但是如果在單片機(jī)的中斷中修改了堆棧中的PC指針值,那么是不是中斷就返不回來原來的程序地址?如果還是這個地址是我故意設(shè)定的值那么他是不是執(zhí)行完這個中斷就跳到我的設(shè)定的這個地址上去了?
如果這個地址又是另外一個任務(wù)的地址的時(shí)候不是正好實(shí)現(xiàn)了從一個任務(wù)的死循環(huán)中跳到了另外一個任務(wù)的死循環(huán)中去了?對了!沒錯!多任務(wù)并行運(yùn)行、時(shí)間片輪轉(zhuǎn)的秘密就是:在定時(shí)中斷中修改堆棧,使保存在中斷中PC指針按照預(yù)定的方式改變從而讓PC指針在幾個任務(wù)地址中不停的跳轉(zhuǎn)。
如果你有空去看UCOS的移植代碼的時(shí)候,你會發(fā)現(xiàn)切換任務(wù)的asm函數(shù)就是在修改堆棧的內(nèi)容。當(dāng)然了,真正的任務(wù)的切換過程不僅僅是修改PC指針的堆棧內(nèi)容,同時(shí)也修改了單片機(jī)所用到的所有可能被用到的寄存器的內(nèi)容。