1. 程式人生 > >嵌入式實時作業系統small RTOS51原理及應用 ----筆記 前言 緒論

嵌入式實時作業系統small RTOS51原理及應用 ----筆記 前言 緒論

圍繞 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:如果資料來得太快,命令處理程式來不及處理,丟棄資料