<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                【82.1 “阻塞”與“非阻塞”。】 做項目寫程序,大框架大思路上就是在“阻塞”與“非阻塞”這兩種模式下不斷切換。“阻塞”可以理解成“單任務處理”模式,“非阻塞”可以理解成“多任務并行處理”模式。“阻塞”的優點是它全神貫注不分心地專注于當下這一件事,它等待某個事件的響應速度是最快的,同時省去了“來回切換、反復掃描”的額外開銷,而且在編程思路上不用太費腦力只需“記流水賬式”的編程即可,但是它的缺點是當下只能干一件事,其它事情無法兼顧,做不到多任務并行處理。而“非阻塞”恰恰相反,它的有優點就是“阻塞”的缺點,它的缺點就是“阻塞”的優點,對于“非阻塞”本節暫時不多講。在實際項目中,有時候“大 阻塞”中分支了N個“小 非阻塞”,也有時候“大 非阻塞”中分支了N個“小 阻塞”。能在“阻塞”與“非阻塞”之間運用自如者,謂之神。 “阻塞等待”是指單片機在某個死循環里(比如“while(1)”這類)一直不斷循環地在等待某個標志變量的狀態,如果這個標志變量滿足條件才會跳出這個死循環然后才能干其它的事情,否則一直在死循環里死等,給人一種全神貫注心無旁騖的感覺, “阻塞延時”是指單片機在產生“延時時間”的時候做不了別的事,延時多久它就要被“阻塞”多久,只有延時過后它才能解脫去干別的事。比如,在編程上,常用for循環產生N個空指令來達到產生“延時時間”的目的,這種編程方式就是最常見的“阻塞延時”。 【82.2 Delay阻塞延時的一個例子。】 現在利用“Delay阻塞延時”編寫一個練習程序,讓一個LED燈閃爍。例子如下: ![](https://img.kancloud.cn/73/34/7334d9d189f0de190e15939b9fff75d9_214x279.png) 圖82.2.1 灌入式驅動8個LED \#include "REG52.H" void Delay(unsigned long u32DelayTime); //函數的聲明 sbit P0\_0=P0^0; //利用sbit和符號“^”的組合,把變量名字P0\_0與P0.0引腳關聯起來 void Delay(unsigned long u32DelayTime) //產生“阻塞延時”的延時函數 { static unsigned long i; //函數在頻繁調用時,加static可以省去一條額外的初始化語句的開銷。 for(i=0;i<u32DelayTime;i++); } void main() { while(1) { //第(1)步 P0\_0=0; //LED燈亮。 //第(2)步 Delay(5000); //這里就是阻塞延時,時間就越長,“亮”持續的時間就越長。 //第(3)步 P0\_0=1; //LED燈滅。 //第(4)步 Delay(5000); //這里就是阻塞延時,時間就越長,“滅”持續的時間就越長。 //第(5)步:這里已經觸碰到主循環while(1)的“底線”,所以接著跳轉到第(1)步繼續循環 } } 【82.3 累加型和累減型的兩種Delay函數,哪家強?】 上述82.2例子中,用到一個Delay函數,該函數內部的for循環用的是“累加型”的,比如: void Delay(unsigned long u32DelayTime) { static unsigned long i; //“累加型”函數內部多開銷了一個變量i。 for(i=0;i<u32DelayTime;i++); //因為這里的“i++”是加法運算,所以稱為“累加型”。 } 現在在跟大家分享一種“累減型”的Delay函數,例子如下: void Delay(unsigned long u32DelayTime) { //“累減型”函數內部節省了一個變量i。 for(;u32DelayTime>0;u32DelayTime--); //“u32DelayTime--”意味著“累減型”。 } 仔細對比“累加型”和“累減型”,會發現在實現同樣“阻塞延時”的功能下,因為“累減型”巧妙的借用了函數入口的局部變量u32DelayTime來充當for循環的變量,而省去了一個i變量。因此,“累減型”比“累加型”強一點。 【82.4 Delay函數讓初學者容易犯的錯誤。】 初學者剛接觸Delay函數,常常容易犯的錯誤就是忽略了for循環變量的類型,for循環變量的類型決定了你能輸入的數值范圍,比如上面例子中用到的是unsigned long變量,因此可以最大輸入Delay(4294967295)。如果是unsigned int變量,最大可以輸入Delay(65535)。如果是unsigned char變量,最大可以輸入Delay(255)。 【82.5 Delay內部的for循環嵌套可產生無窮長的時間。】 剛才講到,如果用最大的變量類型unsigned long ,最大的輸入是Delay(4294967295),那么問題來,難道Delay函數的阻塞延時的時間有最大極限?其實不存在最大極限,理論上,你要多大的延時都可以,只需要在Delay函數內部用上for循環的嵌套,就可以產生“乘法級”的無窮長的時間,例子如下: void Delay(unsigned long u32DelayTime) { static unsigned long i; static unsigned long k; for(i=0;i<u32DelayTime;i++) { for(k=0;k<5000;k++); //內部嵌套的for循環,意味著乘法的關系u32DelayTime的5000倍! } } 【82.6 “阻塞延時”與“非阻塞延時”的各自應用范圍。】 “阻塞延時”一般應用在兩個地方,一個是上電初始化進入主循環之前的延時,另一個是進入主循環之后,跟外部驅動芯片通信時候產生的時鐘節拍小延時,而這個類延時一般是低于1ms的小延時。 “非阻塞延時”在項目中是被大量應用的,進入主循環之后,只要大于或等于1ms的延時,大多數都采樣“非阻塞延時”,因為進入“任務框架級”的層面,只有“非阻塞延時”才能保證項目可以繼續“多任務并行處理”。“非阻塞延時”的方式后續章節會講到。 綜上所述,1ms是“阻塞延時”與“非阻塞延時”的一個分界線,1ms這個時間不是絕對的,只是一個經驗值。
                  <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>

                              哎呀哎呀视频在线观看