<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32 uCOS_II 實(shí)踐 之 事件標(biāo)識(shí)組

          STM32 uCOS_II 實(shí)踐 之 事件標(biāo)識(shí)組

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

          在這里ucos的運(yùn)行過(guò)程應(yīng)該都有一定的了解了,對(duì)信號(hào)量傳遞的過(guò)程可以查看另外一個(gè)帖子,這里只關(guān)注事件標(biāo)識(shí)組本身。

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

          首先運(yùn)用事件標(biāo)識(shí)組需要四個(gè)步驟:

          1. 聲明一個(gè)標(biāo)識(shí)組指針變量,

            void *SemGrp_Task_LED1;

            這個(gè)里面存放的是事件控制塊的指針,并且是一個(gè)全局的變量,需要在對(duì)應(yīng)的頭文件里進(jìn)行全局聲明(extern),在對(duì)標(biāo)識(shí)組進(jìn)行初始化的時(shí)候,也就是對(duì)事件控制塊的初始化,事件控制塊是管理和調(diào)配這個(gè)資源的模塊;
          2. 初始化事件標(biāo)識(shí)組,

            SemGrp_Task_LED1 = OSFlagCreate(0,&err);

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

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

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

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

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

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

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

          void Interrupt_Handle_KEY2(void)
          {
          OSIntEnter();

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

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

          OSIntExit();
          }

          void Interrupt_Handle_KEY3(void)
          {
          OSIntEnter();

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

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

          OSIntExit();
          }

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


          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();