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