嵌入式實時作業系統small RTOS51原理及應用 ----筆記 前言 緒論
阿新 • • 發佈:2018-11-10
圍繞 DP-51 微控制器模擬實驗儀的硬體電路,
闡述Small RTOS51 作業系統的設計原理。
詳細的介紹了RS232 ,I2C,USB1.1和CANBUS等一系列外圍器件及其功能部件的應用設計。
本書的原理篇,以Small RTOS V1.12.1版本為基礎,
微型嵌入式實時作業系統的網址為: http://www.smallrtos.org/
資料包長度為NBYTE,起始位元組為STARTBYTE1,
STARTBYTE2,最後一個位元組為校驗和,中間位元組,不可能連續出現,STARTBYTE1,STARTBYTE2.
第一種方法---- 在中斷中處理協議.
程式清單 0.1
#define NBYTE 20 unsigned char Buf[NBYTE-2]; unsigned char GetRight = 0 ; #define STARTBYTE1 0xAA #define STARTBYTE2 0x77 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 ; } } }
第2種方法 ,使用佇列
void comm(void) interrupt 4 { //串列埠中斷 if(RI ==1){ RI = 0 ; SBUF_In ;//SBUF 入隊 } } unsigned char Buf[NBYTE -2]; unsigned char ReadSerial(unsigned char *cp) { unsigned char i ; unsigned char temp ,Sum ; temp = 佇列中資料個數 ; if(temp < (NBYTE)){ return 0; } SBUF 出佇列 ; if(temp != STARTBYTE1){ return 0 ; } temp = 佇列首位元組; if(temp != STARTBYTE2){ return 0; } ....... }
第3種方法:
void comm(void ) interrupt 4
{
//串列埠中斷
OS_INT_ENTER();
if(RI == 1){
RI = 0 ;
OSIntSendSignal(RECIVE_TASK_ID);
}
OSIntExit();
}
void Receive(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 ;
OSWait(K_SIG,0);
temp = SBUF ;
for(i=0;i<NBYTE -3 ;i++){
OSWait(K_SIG,0);
temp1 = SBUF;
if((temp == STARTBYTE1)&&(temp1 == STARTBYTE2)){
OSWait(K_SIG,0);
temp = SBUF;
i = -1 ;
Sum = STARTBYTE1 + STARTBYTE2 ;
continue ;
}
Buf[i] = temp ;
Sum += temp ;
temp = temp1 ;
}
Sum += temp1 ;
if(Sum == 0 ){
OSSendSignal("命令解釋任務ID");
}
}
}
為啥要用佇列
情況1:接收超時處理
情況2:如果資料來得太快,命令處理程式來不及處理,丟棄資料