這2天在已有空就看信號量,本來沒頭緒的,查了資料也沒找到有用的東西,不過在例子中找到了感覺。于是重新把書那章看了看,然后親自調(diào)試代碼,終于摸到了頭緒。
首先我很膜拜下大師。首先不說這個操作系統(tǒng)的有多復(fù)雜,大師寫的代碼這么規(guī)范,是我自嘆不如的,大師的代碼層次分明注釋詳細(xì),可以看出大師是個十分嚴(yán)謹(jǐn)?shù)娜恕>凸膺@點(diǎn)讓人不得不佩服。然后是操作系統(tǒng),雖然大師也是從ucos 2那里學(xué)到得,不過大師愿意把自己寫的用于51的操作系統(tǒng)分享給大家,這點(diǎn)更加的崇敬。
現(xiàn)在回到正題,本來是想理解深透了再寫的,但是怕自己忙著進(jìn)一步的研究,沒時間更新這邊的文章。首先信號量是個什么?信號量就象交通燈一樣,它告訴控制了汽車的流動。信號量控制了程序的同步運(yùn)行。誰拿到了信號就可以享用CPU的時間片,沒有信號則任務(wù)被掛起。OSSemCreate 創(chuàng)建信號量,實(shí)際上是初始化信號量數(shù)組。OSSemPend()等待一個信號量
這里首先在任務(wù)里初始化信號量,然后在使用等待信號量的函數(shù),一旦有信號量,則立刻返回OS_SEM_OK,取得信號可以做下一步操作,如果取不到信號,則任務(wù)被掛起,在掛起之前,必須把局部變量存放到堆棧中,這也是書上說的為了保證重入性。
SP++;
*((uint8 data *)SP) = Index;
上面則把信號量的索引保存到堆棧中。然后清任務(wù)標(biāo)志再切換到其他任務(wù)中,在這里有必要一提的事,在任務(wù)運(yùn)行中,切到其他任務(wù)中只有幾種方式,1,中斷 2.通過系統(tǒng)睡眠函數(shù) OSWait() 3.任務(wù)切換函數(shù)OSSched() 。 在OSSemPend()這個函數(shù)里開了臨界區(qū),所以中斷不存在,睡眠函數(shù)也沒有,那么任務(wù)就一致運(yùn)行直到OSSched() 函數(shù)的出現(xiàn),吧CPU交給其他任務(wù),同時正在運(yùn)行的任務(wù)由于清掉了就緒的標(biāo)志位,它的恢復(fù)有2種情況 1.超時時間到了,中斷吧時間片切給它繼續(xù)運(yùn)行 2.OSSemPost()它調(diào)用OSSemintPost()會把等待信號量的表中吧最高優(yōu)先級的任務(wù)的就緒表置1,然后切換并給與信號量,相當(dāng)于等待到信號量并繼續(xù)未完成的工作。
時間不早了,下回更新吧,我睡覺了。
雖然頭又點(diǎn)疼,但還是吧文章更新完再說吧。好像上面已經(jīng)把信號量說完了。當(dāng)又信號就OSSemPend會返回得到信號的標(biāo)志于是就進(jìn)行對某個硬件的處理,如果沒得到則掛起任務(wù),時間片留給其他任務(wù),由于清掉了任務(wù)就緒表的標(biāo)志所以掛起的任務(wù)只有等到超時或者某個中斷處理中發(fā)送了信號,喚醒等待該信號量的任務(wù)。 大體就是這樣子。至于調(diào)試嗎,在EN_OS_SEM 宏定義開啟,然后就可以使用信號量的函數(shù)了。你可以設(shè)置個全局變量,然后在2個任務(wù)中對他賦值,然后給他們控制信號量來達(dá)到測試目的。本人寫的代碼還有點(diǎn)問題,我掛起的任務(wù)喚醒,發(fā)現(xiàn)PC走錯地址了,知道哪有問題,但一時頭疼,無法繼續(xù)。消息隊列下回再更新。