在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>單片機(jī)編程>

單片機(jī)RTOS隨想曲

大小:56 人氣: 2010-02-22 需要積分:0
ejlwj的空間

用戶級(jí)別:注冊(cè)會(huì)員

貢獻(xiàn)文章:

貢獻(xiàn)資料:

單片機(jī)RTOS隨想曲
??? 本文標(biāo)為隨想曲,是說明這不是一篇結(jié)構(gòu)嚴(yán)謹(jǐn)?shù)奈恼?而是想到哪寫到哪,希望讀者能喜歡這種風(fēng)格。以下為本文正文:
??? 對(duì)于搞單片機(jī)的特別用8051系列工程師來說,談到單片機(jī)的RTOS,很多時(shí)候會(huì)問一句:“為什么要用RTOS?單片機(jī)就這一點(diǎn)資源,使用RTOS能保證效率嗎?”
??? 對(duì)于這個(gè)問題,我會(huì)反問:“你用單片機(jī)的目的是什么?是為了用單片機(jī)的C編程,單片機(jī)的匯編編程甚至于用單片機(jī)的二進(jìn)制指令編程?”上個(gè)世紀(jì)80年代,工程師用二進(jìn)制指令給Z80編程,現(xiàn)在還有誰(shuí)在用?現(xiàn)在還有人死抱著匯編不放,但越來越多的人工程師使用C編程(我起初也是使用匯編的),為什么?因?yàn)槲覀兊哪康氖窃谟邢薜臅r(shí)間甚至是不充足的時(shí)間內(nèi)把項(xiàng)目保質(zhì)保量的完成!使用是么工具和方法是次要的(如果你的項(xiàng)目以成本放在第一位,則另當(dāng)別論,這時(shí),也是要考慮開發(fā)時(shí)間的)。時(shí)間就是金錢啊,一個(gè)產(chǎn)品在單片機(jī)上增加些許成本是可以接受的。況且,使用8051系列單片機(jī)時(shí),單片機(jī)資源也常有富余,CPU一般情況也只是空轉(zhuǎn),這就為它使用RTOS創(chuàng)造了條件。
??? 那么,使用RTOS的好處呢?我舉一個(gè)例子吧。假設(shè)我們編一個(gè)串行通訊程序,通訊協(xié)議如下:
??? 數(shù)據(jù)包長(zhǎng)度為NBYTE,起始字節(jié)為STARTBYTE1,STARTBYTE2,最后一個(gè)字節(jié)為檢驗(yàn)和,中間字節(jié)不可能出現(xiàn)連續(xù)出現(xiàn)STARTBYTE1,STARTBYTE2。
??? 第一種方法,在中斷中處理協(xié)議:

unsigned char Buf[NBYTE-2];
bit GetRight=0;
??????? void comm(void) interrupt 4
//"串行口中斷"
{
??? static unsigned char Sum,Flag=0,i;
??? unsigned char temp;

??? if(RI==1)
??? {
??????? RI=0;
??????? temp=SBUF;
??????? switch(Flag)
??????? {
??????????? case 0:
??????????????? if(temp==STARTBYTE1)
??????????????? {
??????????????????? Flag=1;
??????????????? }
??????????????? break;
??????????? case 1:
??????????????? if(temp==STARTBYTE2)
??????????????? {
??????????????????? Sum=STARTBYTE1+STARTBYTE2;
??????????????????? i=0;
??????????????????? Flag=2;
??????????????????? break;
??????????????? }
??????????????? if(temp==STARTBYTE1) break;
??????????????? Flag=0;
??????????????? break;
??????????? case 2:
??????????????? if(temp==STARTBYTE1)
??????????????? {
??????????????????? Flag=3;
??????????????????? break;
??????????????? }
??????????????? Sum+=temp;
??????????????? if((i>=(NBYTE-3))&&Sum==0)
??????????????? {
??????????????????? GetRight=1;
??????????????????? Flag=0;
??????????????????? break;
??????????????? }
??????????????? Buf[i++]=temp;
??????????????? break;
??????????? case 3:
??????????????? if(temp==STARTBYTE2)
??????????????? {
??????????????????? Sum=STARTBYTE1+STARTBYTE2;
??????????????????? Flag=2;
??????????????????? i=0;
??????????????????? break;
??????????????? }
??????????????? Sum+=STARTBYTE1;
??????????????? if((i>=(NBYTE-3))&&Sum==0)
??????????????? {
??????????????????? GetRight=1;
??????????????????? Flag=0;
??????????????????? break;
??????????????? }
??????????????? Buf[i++]=STARTBYTE1;
??????????????? if(temp==STARTBYTE1)
??????????????? {
??????????????????? break;
??????????????? }
??????????????? Sum+=temp;
??????????????? if((i>=(NBYTE-3))&&Sum==0)
??????????????? {
??????????????????? GetRight=1;
??????????????????? Flag=0;
??????????????????? break;
??????????????? }
??????????????? Buf[i++]=temp;
??????????????? Flag=2;
??????????????? break;
??????? }
??? }
}

??? 第二種方法,使用隊(duì)列
??? 中斷函數(shù):
??????? void comm(void) interrupt 4
//"串行口中斷"
{
??? if(RI==1)
??? {
??????? RI=0;
??????? SBUF入隊(duì);
??? }
}

??? 主程序不斷調(diào)用的函數(shù):
unsigned char Buf[NBYTE-2];

??????? unsigned char ReadSerial(unsigned char *cp)
{
??? unsigned char i;
??? unsigned char temp,Sum;

??? temp=隊(duì)列中數(shù)據(jù)個(gè)數(shù);
??? if(temp<(NBYTE)) return 0;
??? 出隊(duì)temp;
??? if(temp!=STARTBYTE1) return 0;
??? temp=隊(duì)列首字節(jié);
??? if(temp!=STARTBYTE2) return 0;
??? 出隊(duì)temp;
??? sum=STARTBYTE1+STARTBYTE2;
??? for(i=0;i??? {
??????? temp=隊(duì)列首字節(jié);
??????? if(temp==STARTBYTE1)
??????? {
???????????? temp=隊(duì)列次首字節(jié);
???????????? if(temp==STARTBYTE2) return 0;
??????? }
??????? 出隊(duì)temp;
??????? *cp++=temp;
??????? Sum+=temp;
??? }
??? temp=隊(duì)列首字節(jié);
??? Sum+=temp;
??? if(Sum!=0) return 0;
??? 出隊(duì)temp;
??? return 1;
}

??? 第三種方法,使用RTOS
??? 中斷函數(shù):
??????? void comm(void) interrupt 4
//"串行口中斷"
{
??? OS_INT_ENTER();
??? if(RI==1)
??? {
??????? RI=0;
??????? OSIntSendSignal(RECIVE_TASK_ID);
??? }
??? OSIntExit();
}

?? ID為RECIVE_TASK_ID的任務(wù)
??? void Recuve(void)
{
??? unsigned char temp,temp1,Sum,i;

??? OSWait(K_SIG,0);
??? temp=SBUF;
??? while(1)
??? {
??????? while(1)
??????? {
??????????? OSWait(K_SIG,0);
??????????? temp1=SBUF;
??????????? if((temp==STARTBYTE1)&&(temp1==STARTBYTE2)) break;
??????????? temp=temp1;
??????? }
??????? Sum=STARTBYTE1+STARTBYTE2;

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?
      主站蜘蛛池模板: 二区三区在线 | 四虎影院免费观看视频 | 日韩色网| 香蕉免费在线视频 | 欧美影院 | 在线观看高清免费播放 | 午夜小片 | 男女爱爱免费视频 | 偷偷操不一样的久久 | 国产精品视频永久免费播放 | 不卡中文字幕在线 | 奇米网在线观看 | 国产精品伦理一区二区三区 | 丁香综合网 | 午夜视频日本 | 日日添天天做天天爱 | 欧美视频精品一区二区三区 | 女色专区 | 日本黄色大片免费 | 色视频2 | 丝袜紧身裙国产在线播放 | 九色视频在线播放 | 91激情在线| 中文字幕精品一区 | 国产精品影视 | 伊人精品久久久大香线蕉99 | 国产色婷婷免费视频 | 97久久天天综合色天天综合色 | 国产午夜人做人视频羞羞 | aⅴ天堂| 亚洲性视频网站 | 狠狠干网站 | 一本一本大道香蕉久在线精品 | 扒开双腿爽爽爽视频www | 精品国产_亚洲人成在线高清 | 国产精品资源手机在线播放 | 日日日天天射天天干视频 | 日本在线网址 | 视频在线观看一区二区三区 | 久久2017| 中国人黑人xxⅹ性猛 |