在以uC/OS為操作系統(tǒng)的項(xiàng)目中,系統(tǒng)可能要處理各種不同的中斷請求,如果某個(gè)中斷處理程序需要調(diào)用uC/OS的各種Post函數(shù)向任務(wù)發(fā)出消息,那么uC/OS建議中斷服務(wù)程序的寫法是: 如果在中斷處理中沒有調(diào)用各種Post函數(shù)的話,則可以用一般的、象原來沒有操作系統(tǒng)時(shí)的寫法: 在uC/OS系統(tǒng)中,每個(gè)任務(wù)都要定義獨(dú)立的?臻g,一個(gè)?臻g的使用包括5個(gè)部分: 在這些使用的部分中,1,2,3,4的內(nèi)存占用量是比較容易估算的,最精確和保險(xiǎn)的確定方法是:查看由C生成的asm文件,并計(jì)算各個(gè)函數(shù)的棧使用量。但是第5部分的棧空間使用量是隨中斷嵌套的深度而不斷增加的,是不確定的,一般的方法只能定義一個(gè)充分大的?臻g,使之不會溢出。 為每個(gè)任務(wù)都定義一個(gè)充分大的?臻g,這在某些內(nèi)存稀缺的小項(xiàng)目中是非常痛苦的,有時(shí)不得不增擴(kuò)內(nèi)存,這就會使成本增加。 我深入研究了uC/OS后,認(rèn)為,可以將所有任務(wù)棧空間使用的第5部分合并,這樣將會大大的降低整個(gè)系統(tǒng)對內(nèi)存的需求。 uC/OS的任務(wù)調(diào)度是靠OS_Sched和OSIntExit來完成的,這兩個(gè)函數(shù)中都要先判斷一個(gè)叫 OSIntNesting的系統(tǒng)變量,如果OSIntNesting不為0,則不進(jìn)行任務(wù)切換。也就是說:在OSIntNesting為1(當(dāng)前只有一個(gè)中斷在處理中,并且沒有嵌套的中斷)時(shí)起,如果發(fā)生了嵌套的中斷(不管嵌套的層數(shù)有深),那么在所有嵌套的中斷一層一層地都返回直到 OSIntNesting再次為1時(shí)止,任務(wù)棧是不會切換的(棧指針都在一個(gè)任務(wù)的?臻g中變化)。 據(jù)此,我們可以這樣改動:設(shè)置一個(gè)緩沖區(qū)OSInterruptStk,作為嵌套中斷的?臻g,由所有任務(wù)共享,中斷服務(wù)程序改為: 并且要修改OSIntCtxSw函數(shù),原始的OSIntCtxSw函數(shù)的寫法是: 新的寫法只需將原寫法中的1,2去掉即可,因?yàn)?,2步只是保存舊任務(wù)的棧指針,而新的寫法中,這些步被移到了“中斷服務(wù)程序”中的2.2。 以上的修改已在我的項(xiàng)目中驗(yàn)證通過了 |