在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32 uCOS_II 實(shí)踐 之 消息對(duì)列

            STM32 uCOS_II 實(shí)踐 之 消息對(duì)列

            作者: 時(shí)間:2016-12-03 來源:網(wǎng)絡(luò) 收藏
            首先消息隊(duì)列類似與計(jì)數(shù)信號(hào)量,可以對(duì)異步事件進(jìn)行保存,但是計(jì)數(shù)信號(hào)量保存的是狀態(tài)量,他只是在一個(gè)變量里進(jìn)行狀態(tài)觸發(fā)數(shù)目的累加,而消息隊(duì)列可以把發(fā)送來的數(shù)據(jù)進(jìn)行保存,同時(shí)消息隊(duì)列同消息郵箱有相同的屬性,它本身并不傳送數(shù)據(jù),只是傳遞內(nèi)存中已有數(shù)據(jù)的地址值即數(shù)據(jù)指針,這就帶來了一個(gè)關(guān)鍵特性就是被傳遞的每一個(gè)數(shù)據(jù)都是要有獨(dú)立地址的,不然沒有被處理的數(shù)據(jù)就會(huì)被新數(shù)據(jù)給覆蓋掉,造成了數(shù)據(jù)的丟失。

            對(duì)于消息隊(duì)列,需要?jiǎng)?chuàng)建一個(gè)隊(duì)列,這個(gè)隊(duì)列有先入先出的特性即FIFO,所以一旦數(shù)據(jù)被使用在隊(duì)列里這個(gè)數(shù)據(jù)就不再出現(xiàn)了,他最終會(huì)被新的數(shù)據(jù)覆蓋掉。

            本文引用地址:http://www.biyoush.com/article/201612/325155.htm

            如上面介紹,消息隊(duì)列里所有的數(shù)據(jù)都以數(shù)據(jù)指針的形式在一個(gè)列表里排隊(duì),這個(gè)指針的形式可以是多樣的,可以是一個(gè)變量的指針,也可以是一個(gè)結(jié)構(gòu)類型的指針等等。所以隊(duì)列的個(gè)數(shù)是有限的,在設(shè)計(jì)過程中要保證其大小合適不然很容易隊(duì)列溢出,造成數(shù)據(jù)丟失。同時(shí)消息隊(duì)列傳輸?shù)臄?shù)據(jù)是無(wú)限制的,只要保證消耗數(shù)據(jù)與發(fā)送數(shù)據(jù)的吞吐量保證合適就不會(huì)造成隊(duì)列溢出。

            使用消息隊(duì)列有5個(gè)步驟:

            步驟1:聲明一個(gè)指針變量,這個(gè)指針的作用和消息郵箱一樣,為了保存對(duì)應(yīng)事件控制塊的指針。

            void *MboxQ_Task_LED1;

            步驟2:聲明一個(gè)指針數(shù)組,這個(gè)數(shù)組就是用來排隊(duì)的隊(duì)列。

            void *MboxQ_Table[10];

            步驟3:對(duì)消息隊(duì)列初始化,初始化函數(shù)有兩個(gè)參數(shù),第一個(gè)參數(shù)為隊(duì)列的頭指針,指明由哪里開始排隊(duì),第二個(gè)參數(shù)是隊(duì)列的數(shù)目,即隊(duì)列的深度。該函數(shù)也是對(duì)事件控制塊進(jìn)行初始化,并且把其指針賦值給步驟1聲明的指針變量。

            MboxQ_Task_LED1 = OSQCreate(&MboxQ_Table[0],10);

            步驟4:在任務(wù)中設(shè)置消息等待函數(shù),此處和消息郵箱一致。參數(shù)有3個(gè),第一個(gè)參數(shù)指等待的是哪個(gè)消息隊(duì)列,第二個(gè)參數(shù)是指等待時(shí)間,單位為系統(tǒng)心跳,0為始終等待無(wú)時(shí)間限制,第三個(gè)參數(shù)指函數(shù)的返回結(jié)果。

            num = *(unsigned char *)OSQPend(MboxQ_Task_LED1,0,&err);

            步驟5:在任務(wù)里設(shè)置消息發(fā)送函數(shù),此處和消息郵箱一致。參數(shù)有2個(gè),第一個(gè)參數(shù)為發(fā)送大哪個(gè)消息隊(duì)列里,第二個(gè)參數(shù)是指具體的數(shù)據(jù)地址發(fā)送出去。

            OSQPost(MboxQ_Task_LED1,(void *)&DataTable[cc++]);

            下面是具體的代碼:
            步驟3和步驟4:

            void Task_LED1(void* p_arg)
            {
            unsigned char num ;
            static unsigned char pp ;
            (void) p_arg ;

            MboxQ_Task_LED1 = OSQCreate(&MboxQ_Table[0],10); // 創(chuàng)建消息隊(duì)列,棧數(shù)目為10
            while(1)
            {
            num = *(unsigned char *)OSQPend(MboxQ_Task_LED1,0,&err); // 等待郵箱的消息
            pp = num ;

            if(pp == 1)
            { LED1_HIGH; }
            if(pp == 2)
            { LED2_HIGH; }
            if(pp == 3)
            { LED3_HIGH; }
            if(pp == 4)
            { LED1_HIGH;LED2_HIGH; }
            if(pp == 5)
            { LED1_HIGH;LED3_HIGH; }

            OSTimeDlyHMSM(0,0,5,0);
            LED1_LOW;LED2_LOW;LED3_LOW;
            }
            }


            步驟5:

            void Interrupt_Handle_KEY3(void)
            {
            OSIntEnter();

            // 在中斷服務(wù)函數(shù)里如果調(diào)用ucos系統(tǒng)函數(shù)的話就必須加上進(jìn)中斷系統(tǒng)函數(shù)出去的時(shí)候要加上出中斷系統(tǒng)函數(shù)

            OSQPost(MboxQ_Task_LED1,(void *)&DataTable[cc++]);

            // 發(fā)送郵箱消息,這個(gè)函數(shù)并不會(huì)引起系統(tǒng)調(diào)度,所以中斷服務(wù)函數(shù)一定要簡(jiǎn)潔。
            EXTI_ClearITPendingBit(EXTI_Line3); // 清除標(biāo)志位

            OSIntExit();
            }

            對(duì)于數(shù)據(jù)在發(fā)送的時(shí)候轉(zhuǎn)換成無(wú)定義變量的指針,在接受的時(shí)候轉(zhuǎn)換成它本來的數(shù)據(jù)類型,這點(diǎn)和消息郵箱是相同的。
            值得注意的是在ucos里有自己的內(nèi)存管理函數(shù),如果你不用那個(gè)的話就只能自己建立一個(gè)數(shù)據(jù),并且保證每個(gè)發(fā)送出去的數(shù)據(jù)都有他的地址。
            如果需要代碼請(qǐng)留下郵箱,有不對(duì)的地方請(qǐng)大家批評(píng)指正,轉(zhuǎn)載請(qǐng)注明出處。


            關(guān)鍵詞: STM32uCOSII消息對(duì)

            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉