在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,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首頁 > 嵌入式系統(tǒng) > 設計應用 > STM32 uCOS_II 實踐 之 事件標識組

            STM32 uCOS_II 實踐 之 事件標識組

            作者: 時間:2016-12-03 來源:網(wǎng)絡 收藏
            在中斷的那一章節(jié)里介紹了計數(shù)信號量,它可以有效的傳遞一個二值信號,而時間標識組是多個信號量運算后作用與一個任務的工具。主要應用場合是兩個以上的任務來同步一個任務。

            在這里ucos的運行過程應該都有一定的了解了,對信號量傳遞的過程可以查看另外一個帖子,這里只關注事件標識組本身。

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

            首先運用事件標識組需要四個步驟:

            1. 聲明一個標識組指針變量,

              void *SemGrp_Task_LED1;

              這個里面存放的是事件控制塊的指針,并且是一個全局的變量,需要在對應的頭文件里進行全局聲明(extern),在對標識組進行初始化的時候,也就是對事件控制塊的初始化,事件控制塊是管理和調配這個資源的模塊;
            2. 初始化事件標識組,

              SemGrp_Task_LED1 = OSFlagCreate(0,&err);

              參數(shù)0為最終邏輯運算的結果初始值為0,參數(shù)&err為錯誤信息;
            3. 在用戶任務里設置等待函數(shù),

              OSFlagPend( SemGrp_Task_LED1, // 標識組指針
              0x03, // 標識為后兩位
              OS_FLAG_WAIT_SET_ALL + OS_FLAG_CONSUME,// 設置與操作并且操作后清除標識
              0,&err // 無等待超時
              );

              總共有5個參數(shù),第一個參數(shù)設置標識組指針,說明等待的是哪個標識組;第二個參數(shù)是標識組里有哪些操作位,0x03就是說明有2個信號量參與這個組并且是一個字節(jié)的最低兩位;第三個參數(shù)是這些信號量由哪種組合方式來形成一個有效的信息,就兩種操作“與”和“或”,即所有單個信號量都為1時才觸發(fā)或者是只要有一個信號量發(fā)送1就觸發(fā),對應的還有一個操作關系就是在操作后對單個信號量進行清零;第四個參數(shù)是等待時間,單位是系統(tǒng)心跳數(shù),0就是指無時間限制的等待;第五個參數(shù)是錯誤類型。
            4. 在不同的用戶任務里或者觸發(fā)任務里設置發(fā)送信號量函數(shù),

              OSFlagPost(SemGrp_Task_LED1,0x01,OS_FLAG_SET,&err);// 置位組標志位的第一位

              總共有四個參數(shù),第一個參數(shù)為標識組指針,說明你是發(fā)到哪個標識組里的;第二個參數(shù)說明你操作的是第幾位,在等待函數(shù)里設置了具體的有效位,在發(fā)送函數(shù)里說明你發(fā)送的這一位是等待函數(shù)里的第幾位,代碼例子里是發(fā)送的最低位;第三個參數(shù)是設置置一還是清零,OS_FLAG_SET為置一,OS_FLAG_CLR為清零;第四個參數(shù)是錯誤類型。
            =====================================================================================
            下面是在系統(tǒng)內部實際的代碼:
            步驟2及步驟3
            void Task_LED1(void* p_arg)
            {
            (void) p_arg ;

            SemGrp_Task_LED1 = OSFlagCreate(0,&err);
            while(1)
            {
            OSFlagPend( SemGrp_Task_LED1, // 標識組指針
            0x03, // 標識為后兩位
            OS_FLAG_WAIT_SET_ALL + OS_FLAG_CONSUME, // 設置與操作并且操作后清除標識
            0,&err // 無等待超時
            );

            LED1_HIGH;
            OSTimeDlyHMSM(0,0,1,0);
            LED1_LOW;
            OSTimeDlyHMSM(0,0,1,0); // 延時,用來給其他任務留有運行的時間
            }
            }
            兩個 步驟4函數(shù),分別在外部中斷服務函數(shù)里:

            void Interrupt_Handle_KEY2(void)
            {
            OSIntEnter();

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

            OSFlagPost(SemGrp_Task_LED1,0x01,OS_FLAG_SET,&err); // 置位組標志位的第一位
            EXTI_ClearITPendingBit(EXTI_Line4); // 清除標志位

            OSIntExit();
            }

            void Interrupt_Handle_KEY3(void)
            {
            OSIntEnter();

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

            OSFlagPost(SemGrp_Task_LED1,0x02,OS_FLAG_SET,&err); // 置位組標志位的第二位
            EXTI_ClearITPendingBit(EXTI_Line3); // 清除標志位

            OSIntExit();
            }

            總結:
            對于事件標識組的操作,思路是非常簡單的,在一個最終結果的任務里添加等待函數(shù),系統(tǒng)運行到這里會把這個任務掛起,然后按照邏輯去等待各個單一的信號量,在其他的任務里有發(fā)送函數(shù),按照等待函數(shù)里設定好的操作位去把各個位去置高或者拉低,就能達到多個任務去同步一個任務的目的。


            評論


            技術專區(qū)

            關閉