<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                【83.1 累計主循環的“非阻塞”。】 上一節提到,當Delay的“阻塞”時間超過1ms并且被頻繁調用的時候,由于Delay做“獨占式無用功”而消耗的延時太長,會影響其它任務的并行處理,整個系統給人的感覺非常卡頓不流暢。為了解決此問題,本節引入累計主循環的“非阻塞”,同時,希望通過此例子,讓大家第一次感受到switch語句在多任務并行處理時候的優越性。switch的精髓在于“根據某個判斷條件實現步驟之間的靈活跳轉”,這個思路是以后做所有大項目的框架性思路。 為什么“累計主循環”可以兼顧到其它任務的并行處理?因為單片機進入main函數以后,在一個主循環里要掃描N個任務,從頭到尾,把N個任務掃描一遍,每掃描一遍算“一次主循環”,每一次“主循環”都是要消耗一點時間,累計的“主循環”次數越多,所要消耗的時間就越長,但是跟Delay唯一的差別是,Delay做延時的時候沒有辦法掃描其它任務,而“累計主循環”內部本身就是在不斷掃描其它任務,產生時間越長掃描其它任務的次數就越多,兩者是完全相互促進而沒有矛盾的。具體內容,請看下面的例子。 【83.2 累計主循環“非阻塞”的一個例子。】 現在利用“累計主循環非阻塞”編寫一個練習程序,讓一個LED燈閃爍。例子如下: ![](https://img.kancloud.cn/73/34/7334d9d189f0de190e15939b9fff75d9_214x279.png) 圖83.2.1 灌入式驅動8個LED \#include "REG52.H" \#define CYCLE\_SUM 5000 //累計主循環次數的設定閥值,該值決定了LED閃爍頻率 sbit P0\_0=P0^0; //利用sbit和符號“^”的組合,把變量名字P0\_0與P0.0引腳關聯起來 unsigned char Gu8CycleStep=0; //switch的跳轉步驟 unsigned long Gu32CycleCnt=0; //累計主循環的計數器 void main() { while(1) { switch(Gu8CycleStep) { case 0: Gu32CycleCnt++; //這里就是累計main函數內部的主循環while(1)的次數 if(Gu32CycleCnt>=CYCLE\_SUM) //累計的次數達到設定值CYCLE\_SUM就跳到下一步驟 { Gu32CycleCnt=0; //及時清零計數器,為下一步驟的新一輪計數準備 P0\_0=0; //LED燈亮。 Gu8CycleStep=1; //跳到下一步驟 } break; case 1: Gu32CycleCnt++; //這里就是累計main函數內部的主循環while(1)的次數 if(Gu32CycleCnt>=CYCLE\_SUM) //累計的次數達到設定值CYCLE\_SUM就返回上一步驟 { Gu32CycleCnt=0; //及時清零計數器,為返回上一步驟的新一輪計數準備 P0\_0=1; //LED燈滅。 Gu8CycleStep=0; //返回到上一個步驟 } break; } } } 【83.3 累計主循環的不足。】 上述83.2例子中,“累計主循環次數”實現時間延時是一個不錯的選擇。這種方法能勝任多任務處理的程序框架,但是本身也有一個小小的不足,比如“閥值CYCLE\_SUM到底應該取多少才能產生多長的時間”是沒有標準的,只能依靠不斷上機實驗來拿到一個你所需要的數值,這種“不規范”,當程序要移植到其它單片機平臺上的時候就特別麻煩,需要重新修正閥值CYCLE\_SUM。除此之外,哪怕在同樣的一個單片機里,隨著主函數里任務量的增加,累計一次主循環所消耗的時間長度也會發生變化,意味著靠“累計主循環次數”所獲得的時間也會發生變化而導致不準確,此時,為了保證延時時間的準確性,必須要做的就是再一次修正“設定累計主循環次數”的閥值CYCLE\_SUM,這樣顯然給我們帶來了一絲不便,怎么辦?假設單片機沒有“定時中斷”這個資源,那么這種“累計主循環次數”在多任務處理中確實是不二之選,但是,因為現在幾乎所有的單片機內部都有“定時中斷”這個資源,所以,大家不用為這個“不足”而煩惱,我們只要用上本節的switch思路,再外加一個“定時中斷”,就可以輕松解決此問題,下一節就跟大家講“定時中斷”的內容。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看