新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32 uCOS_II 實踐 之 事件標識組

        STM32 uCOS_II 實踐 之 事件標識組

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

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

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

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

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

          void *SemGrp_Task_LED1;

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

          SemGrp_Task_LED1 = OSFlagCreate(0,&err);

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

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

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

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

          總共有四個參數,第一個參數為標識組指針,說明你是發到哪個標識組里的;第二個參數說明你操作的是第幾位,在等待函數里設置了具體的有效位,在發送函數里說明你發送的這一位是等待函數里的第幾位,代碼例子里是發送的最低位;第三個參數是設置置一還是清零,OS_FLAG_SET為置一,OS_FLAG_CLR為清零;第四個參數是錯誤類型。
        =====================================================================================
        下面是在系統內部實際的代碼:
        步驟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函數,分別在外部中斷服務函數里:

        void Interrupt_Handle_KEY2(void)
        {
        OSIntEnter();

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

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

        OSIntExit();
        }

        void Interrupt_Handle_KEY3(void)
        {
        OSIntEnter();

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

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

        OSIntExit();
        }

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


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 土默特右旗| 莆田市| 棋牌| 攀枝花市| 大新县| 东丽区| 岳普湖县| 双流县| 宝丰县| 五家渠市| 巴彦县| 富顺县| 秦安县| 娱乐| 鄂温| 邯郸县| 承德市| 肥乡县| 大竹县| 琼中| 五指山市| 日喀则市| 东兰县| 开化县| 古交市| 蒲城县| 德安县| 连山| 霍邱县| 叶城县| 雷州市| 大名县| 文登市| 离岛区| 永泰县| 增城市| 安平县| 阿拉善右旗| 交城县| 海口市| 永川市|