專利名稱:中斷程序的分時(shí)運(yùn)行方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種單片機(jī)中斷程序的分時(shí)運(yùn)行方法。
背景技術(shù):
隨著技術(shù)和工藝的發(fā)展,嵌入式系統(tǒng)的應(yīng)用越來越廣泛,在嵌入式系統(tǒng)應(yīng)用中,有兩種情況的程序段必須放到中斷程序里面執(zhí)行一種是時(shí)時(shí)響應(yīng)的程序段,另一種是具有嚴(yán)格時(shí)序的程序段。但是由于實(shí)際設(shè)計(jì)要求的不同,中斷程序的執(zhí)行時(shí)間是有限的。隨著程序段的增加以及程序運(yùn)行時(shí)間的加長(zhǎng),CPU在大多數(shù)中斷里面運(yùn)行時(shí)間很短,而在某些時(shí)間點(diǎn),所有中斷程序的執(zhí)行時(shí)間會(huì)超過中斷時(shí)間,造成中斷溢出,系統(tǒng)產(chǎn)生異?;蛩罊C(jī)現(xiàn)象,影響設(shè)備的正常運(yùn)轉(zhuǎn),甚至?xí)斐山?jīng)濟(jì)損失或人身傷害,后果非常嚴(yán)重。
現(xiàn)有通用的中斷程序interrupt c_int如下所示void interrupt c_int() //100us中斷周期{isr_ticker++;Program1(); //運(yùn)行時(shí)間11usif(isr_ticker>=10) //1ms周期{isr_ticker=0;GUI_P5ms++;Program2(); //運(yùn)行時(shí)間8us
Program3(); //運(yùn)行時(shí)間17usif(GUI_P5ms>=5) //5ms周期{GUI_P5ms=0;GUI_P10ms++;Program4(); //運(yùn)行時(shí)間25usProgram5(); //運(yùn)行時(shí)間5usProgram6(); //運(yùn)行時(shí)間11usif(GUI_P10ms>=2)//10ms周期{GUI_P10ms=0;Program7(); //運(yùn)行時(shí)間7usProgram8(); //運(yùn)行時(shí)間15usProgram9(); //運(yùn)行時(shí)間23us} //End 10ms} //End 5ms} //End 1ms} //End interrupt c_int以下是對(duì)上述描寫的說明1、Program1~Program9是中斷程序里面的9個(gè)不同的功能程序段;2、isr_ticker是1ms定時(shí)計(jì)數(shù)器;GUI_P5ms是5ms定時(shí)計(jì)數(shù)器;GUI_P10ms是10ms定時(shí)計(jì)數(shù)器由以上通用中斷程序可以看出1、程序段Program1每隔100us執(zhí)行一次,程序段Program2和Program3和每隔1ms執(zhí)行一次,程序段Program4、Program5和Program6和每隔5ms執(zhí)行一次,程序段Program7、Program8和Program9和每隔10ms執(zhí)行一次;2、在1ms時(shí)間點(diǎn),程序段Program1、Program2和Program3在同一個(gè)中斷時(shí)間(100us)內(nèi)執(zhí)行,執(zhí)行時(shí)間約為36us;3、在5ms時(shí)間點(diǎn),程序段Program1、Program2、Program3、Program4、Program5和Program6在同一個(gè)中斷時(shí)間(100us)內(nèi)執(zhí)行,執(zhí)行時(shí)間約為77us;4、在10ms時(shí)間點(diǎn),程序段Program1~Program9都在同一個(gè)中斷時(shí)間(100us)內(nèi)執(zhí)行,執(zhí)行時(shí)間約為122us,中斷已經(jīng)溢出(超過100us);因此用這種方法編寫的中斷程序,中斷溢出是不可避免的,而且CPU的運(yùn)行負(fù)荷是非常不平均的,在10ms時(shí)間點(diǎn)的中斷周期里,CPU已經(jīng)超負(fù)荷(122%負(fù)荷)運(yùn)行,而在其它100us中斷周期,CPU只執(zhí)行程序段Program1,CPU運(yùn)行時(shí)間(11us)非常短,這樣也會(huì)增加CPU的故障率。
發(fā)明內(nèi)容
本發(fā)明需要解決的技術(shù)問題是提供了一種中斷程序的分時(shí)運(yùn)行方法,旨在解決上述的缺陷。
為了解決上述技術(shù)問題,本發(fā)明是通過以下步驟實(shí)現(xiàn)的以運(yùn)行間隔最長(zhǎng)的時(shí)間間隔為計(jì)數(shù)周期10ms計(jì)數(shù)周期可以轉(zhuǎn)化為100個(gè)100us中斷周期,因此計(jì)數(shù)器isr_ticker的計(jì)數(shù)范圍0~99;isr_ticker是1ms定時(shí)計(jì)數(shù)器;isr_ticker為任意值時(shí)都執(zhí)行Program1;isr_ticker=1/11/21/31/41/51/61/71/81/91時(shí)執(zhí)行Program2;isr_ticker=2/12/22/32/42/52/62/72/82/92時(shí)執(zhí)行Program3;isr_ticker=3/53時(shí)執(zhí)行Program4;isr_ticker=4/54時(shí)執(zhí)行Program5;isr_ticker=5/55時(shí)執(zhí)行Program6;
isr_ticker=6時(shí)執(zhí)行Program7;isr_ticker=7時(shí)執(zhí)行Program8;isr_ticker=8時(shí)執(zhí)行Program9;其中運(yùn)行周期是Program1每隔100us運(yùn)行一次;Program2和Program3每隔1ms運(yùn)行一次;Program4、Program5和Program6每隔5ms運(yùn)行一次;Program7、Program8和Program9每隔10ms運(yùn)行一次;Program1、Program2、Program3、Program4、Program5、Program6、Program7、Program8、Program9運(yùn)行時(shí)間分別是11us、8us、17us、25us、5us、11us、7us、15us、23us。
與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是既可以滿足各個(gè)程序的運(yùn)行時(shí)序、很好的解決這種累計(jì)時(shí)間產(chǎn)生的中斷溢出問題,而且還可以使CPU的有一個(gè)比較平穩(wěn)的運(yùn)行負(fù)荷,從而減少CPU的故障率。
具體實(shí)施例方式
本發(fā)明是通過以下步驟實(shí)現(xiàn)的以運(yùn)行間隔最長(zhǎng)的時(shí)間間隔為計(jì)數(shù)周期10ms計(jì)數(shù)周期可以轉(zhuǎn)化為100個(gè)100us中斷周期,因此計(jì)數(shù)器isr_ticker的計(jì)數(shù)范圍0~99;isr_ticker是1ms定時(shí)計(jì)數(shù)器;isr_ticker為任意值時(shí)都執(zhí)行Program1;isr_ticker=1/11/21/31/41/51/61/71/81/91時(shí)執(zhí)行Program2;isr_ticker=2/12/22/32/42/52/62/72/82/92時(shí)執(zhí)行Program3;isr_ticker=3/53時(shí)執(zhí)行Program4;isr_ticker=4/54時(shí)執(zhí)行Program5;isr_ticker=5/55時(shí)執(zhí)行Program6;isr_ticker=6時(shí)執(zhí)行Program7;isr_ticker=7時(shí)執(zhí)行Program8;isr_ticker=8時(shí)執(zhí)行Program9;
其中運(yùn)行周期是Program1每隔100us運(yùn)行一次;Program2和Program3每隔1ms運(yùn)行一次;Program4、Program5和Program6每隔5ms運(yùn)行一次;Program7、Program8和Program9每隔10ms運(yùn)行一次;Program1、Program2、Program3、Program4、Program5、Program6、Program7、Program8、Program9運(yùn)行時(shí)間分別是11us、8us、17us、25us、5us、11us、7us、15us、23us。
本發(fā)明的分時(shí)運(yùn)行的中斷程序interrupt c_intl的代碼如下所示void interrupt c_intl() //100us中斷周期{isr_ticker++;if(isr_ticker>=100){isr_ticker=0;}Program1(); //運(yùn)行時(shí)間11usswitch(isr_ticker){case 1:
case 11:
case 21:
case 31:
case 41:
case 51:
case 61:
case 71:
case 81:
case 91://1ms執(zhí)行1次Program2(); //運(yùn)行時(shí)間8us
break;case 2:
case 12:
case 22:
case 32:
case 42:
case 52:
case 62:
case 72:
case 82:
case 92://1ms執(zhí)行1次Program3(); //運(yùn)行時(shí)間17usbreak;case 3:
case 53://5ms執(zhí)行1次Program4(); //運(yùn)行時(shí)間25usbreak;case 4:
case 54://5ms執(zhí)行1次Program5(); //運(yùn)行時(shí)間5usbreak;case 5:
case 55://5ms執(zhí)行1次Program6(); //運(yùn)行時(shí)間11usbreak;case 6: //10ms執(zhí)行1次Program7(); //運(yùn)行時(shí)間7us
break;case 7: //10ms執(zhí)行1次Program8(); //運(yùn)行時(shí)間15usbreak;case 8: //10ms執(zhí)行1次Program9(); //運(yùn)行時(shí)間23usbreak;default break;} //End switch} //End interrupt c_int由以上分時(shí)運(yùn)行中斷程序可以看出1、各個(gè)獨(dú)立的程序段的執(zhí)行時(shí)間和執(zhí)行時(shí)序還和原來相同程序段Program1每隔100us執(zhí)行一次,程序段Program2和Program3和每隔1ms執(zhí)行一次,程序段Program4、Program5和Program6和每隔5ms執(zhí)行一次,程序段Program7、Program8和Program9和每隔10ms執(zhí)行一次;每個(gè)中斷周期只執(zhí)行兩個(gè)程序段,CPU運(yùn)行時(shí)間比較平均。
2、Program2~Program9這8個(gè)程序段分別在8個(gè)不同的中斷周期執(zhí)行,因此最大執(zhí)行時(shí)間為36us(Program1的執(zhí)行時(shí)間11us+Program4的執(zhí)行時(shí)間25us),遠(yuǎn)遠(yuǎn)小于中斷時(shí)間(100us),中斷不會(huì)溢出。
3、中斷程序執(zhí)行的最小時(shí)間為16us(Program1的執(zhí)行時(shí)間11us+Program5的執(zhí)行時(shí)間5us),因此CPU的利用率在16%~36%,負(fù)荷比較平穩(wěn),CPU故障率相對(duì)較低。
在本發(fā)明中,雖然采用了9個(gè)程序段、中斷周期為100us、以及程序段執(zhí)行的時(shí)間間隔為1ms、5ms、10ms;但以此為思路設(shè)計(jì)成多于或少于9個(gè)程序段、中斷周期多于或少于100us以及時(shí)間間隔為其它值都在本發(fā)明的保護(hù)范圍內(nèi)。
權(quán)利要求
1.一種中斷程序的分時(shí)運(yùn)行方法,是通過以下步驟實(shí)現(xiàn)的以運(yùn)行間隔最長(zhǎng)的時(shí)間間隔為計(jì)數(shù)周期10ms計(jì)數(shù)周期可以轉(zhuǎn)化為100個(gè)100us中斷周期,因此計(jì)數(shù)器isr_ticker的計(jì)數(shù)范圍0~99;isr_ticker是1ms定時(shí)計(jì)數(shù)器;isr_ticker為任意值時(shí)都執(zhí)行Program1;isr_ticker=1/11/21/31/41/51/61/71/81/91時(shí)執(zhí)行Program2;isr_ticker=2/12/22/32/42/52/62/72/82/92時(shí)執(zhí)行Program3;isr_ticker=3/53時(shí)執(zhí)行Program4;isr_ticker=4/54時(shí)執(zhí)行Program5;isr_ticker=5/55時(shí)執(zhí)行Program6;isr_ticker=6時(shí)執(zhí)行Program7;isr_ticker=7時(shí)執(zhí)行Program8;isr_ticker=8時(shí)執(zhí)行Program9;其中運(yùn)行周期是Program1每隔100us運(yùn)行一次;Program2和Program3每隔1ms運(yùn)行一次;Program4、Program5和Program6每隔5ms運(yùn)行一次;Program7、Program8和Program9每隔10ms運(yùn)行一次;Program1、Program2、Program3、Program4、Program5、Program6、Program7、Program8、Program9運(yùn)行時(shí)間分別是11us、8us、17us、25us、5us、11us、7us、15us、23us。
全文摘要
本發(fā)明涉及一種中斷程序的分時(shí)運(yùn)行方法,是通過以下步驟實(shí)現(xiàn)的以運(yùn)行間隔最長(zhǎng)的時(shí)間間隔為計(jì)數(shù)周期10ms計(jì)數(shù)周期可以轉(zhuǎn)化為100個(gè)100us中斷周期,因此計(jì)數(shù)器isr_ticker的計(jì)數(shù)范圍0~99;isr_ticker是1ms定時(shí)計(jì)數(shù)器;isr_ticker為任意值時(shí)都執(zhí)行Program1;isr_ticker=1/11/21/31/41/51/61/71/81/91時(shí)執(zhí)行Program2;isr_ticker=2/12/22/32/42/52/62/72/82/92時(shí)執(zhí)行Program3;isr_ticker=3/53時(shí)執(zhí)行Program4;isr_ticker=4/54時(shí)執(zhí)行Program5;isr_ticker=5/55時(shí)執(zhí)行Program6;isr_ticker=6時(shí)執(zhí)行Program7;isr_ticker=7時(shí)執(zhí)行Program8;isr_ticker=8時(shí)執(zhí)行Program9;其中運(yùn)行周期是Program1每隔100us運(yùn)行一次;Program2和Program3每隔1ms運(yùn)行一次;Program4、Program5和Program6每隔5ms運(yùn)行一次;既可以滿足各個(gè)程序的運(yùn)行時(shí)序、很好的解決這種累計(jì)時(shí)間產(chǎn)生的中斷溢出問題,而且還可以使CPU的有一個(gè)比較平穩(wěn)的運(yùn)行負(fù)荷,從而減少CPU的故障率。
文檔編號(hào)G06F9/46GK101021803SQ200710036289
公開日2007年8月22日 申請(qǐng)日期2007年1月9日 優(yōu)先權(quán)日2007年1月9日
發(fā)明者金辛海, 王春祥, 馬建雄, 馬瑞俠 申請(qǐng)人:上海新時(shí)達(dá)電氣有限公司