<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一些嵌入式軟件設(shè)計(jì)經(jīng)驗(yàn)

          共 5066字,需瀏覽 11分鐘

           ·

          2022-08-04 07:01

              關(guān)注、星標(biāo)公眾號(hào),直達(dá)精彩內(nèi)容

          來源:CSDN

          作者 | twx11213030422


          1、什么是框架?

          程序框架其實(shí)就類似一個(gè)文件大綱或者模板。因?yàn)閷懗绦蚓秃皖愃朴趯懳恼拢绻麤]有大綱或者模板那么你寫起來就會(huì)比較費(fèi)勁。

          2、為什么要有框架?

          節(jié)約時(shí)間,減少錯(cuò)誤。因?yàn)閷?duì)于一種類型的程序它們代碼結(jié)構(gòu)體邏輯是一樣的,同時(shí)有大量相似或者共同的地方。我們可以將這些共同的地方抽出來形成一個(gè)固定的程序框架,那么我們?cè)匍_發(fā)新的同一種類型的程序時(shí)就可以套用這套框架。

          這樣會(huì)大大提高我們的開發(fā)效率,同時(shí)由于這個(gè)框架是一套公眾的大家都在使用的與維護(hù)的,使用它會(huì)使代碼邏輯更不容易出錯(cuò)。

          3、嵌入式系統(tǒng)組成

          嵌入式控制系統(tǒng)基本都是由普通任務(wù)和中斷任務(wù)組成。

          • 普通任務(wù):指對(duì)時(shí)間響應(yīng)要求不高或者說是那種周期性執(zhí)行的任務(wù);
          • 中斷任務(wù):指對(duì)時(shí)間響應(yīng)要求高,必須立刻處理的任務(wù);
          4、常見的框架
          4.1、輪詢無中斷

          說明:所有的任務(wù)都是按照順序執(zhí)行,為了減少整個(gè)系統(tǒng)的響應(yīng)時(shí)間有兩種方法:

          1. 任務(wù)中不要使用等待式的延時(shí)函數(shù);
          2. 任務(wù)無法一次執(zhí)行完的情況下應(yīng)該將任務(wù)分解成若干個(gè)小任務(wù)每次執(zhí)行一個(gè)小任務(wù)循環(huán)直到任務(wù)完成;

          上述兩種方法都會(huì)消耗內(nèi)存,本來局部變量可以解決的事,現(xiàn)在只能用靜態(tài)或者全局變量來處理。

          優(yōu)點(diǎn):程序執(zhí)行流程簡(jiǎn)單清晰;

          缺點(diǎn):對(duì)于系統(tǒng)修改功能非常不方便,同時(shí)如果任務(wù)數(shù)量增加的話會(huì)影響整個(gè)系統(tǒng)的響應(yīng)時(shí)間,就會(huì)顯得系統(tǒng)卡頓;

          偽代碼實(shí)現(xiàn):

          int main(void)
          {
              while(1)
              {
                  doSomething_1(); //任務(wù)1
                  doSomething_2(); //任務(wù)2
                  doSomething_3(); //任務(wù)3
                  /*其他各種任務(wù)*/
              }
              return 0;
          }
          4.2、只有中斷

          說明:在“只有中斷“的系統(tǒng)中,主函數(shù)main的循環(huán)中是不做任何操作的。

          優(yōu)點(diǎn):可以實(shí)時(shí)響應(yīng)異常的任務(wù)(事件)

          缺點(diǎn):中斷資源有限,當(dāng)任務(wù)過多時(shí)會(huì)響應(yīng)不及時(shí)。

          偽代碼實(shí)現(xiàn):

          int main(void)
          {
              while(1)
              {
                  ;
              }
          }
           
          /*中斷服務(wù)函數(shù)1*/
          void ISR1_IRQHandler(void)
          {
              doSomething_1();
          }
           
          /*中斷服務(wù)函數(shù)2*/
          void ISR2_IRQHandler(void)
          {
              doSomething_2();
          }
          4.3、只有中斷框架的變種

          說明:采用狀態(tài)機(jī)的機(jī)制來執(zhí)行任務(wù)。中斷函數(shù)中設(shè)置狀態(tài)機(jī)的狀態(tài),而main函數(shù)主循環(huán)中根據(jù)不同的狀態(tài)值執(zhí)行不同的任務(wù)。這個(gè)其實(shí)不屬于真正只有中斷的形式。

          int main(void)
          {
              while(1)
              {
                  if(flag_1)
                  {
                      doSomething_1();
                  }
                  if(flag_2)
                  {
                      doSomething_2();
                  }
                  if(flag_3)
                  {
                      doSomething_3();
                  }
                  /*其他各種任務(wù)*/
              }
              return 0;
          }
           
          /*********中斷服務(wù)函數(shù)1************/
          void ISR1_IRQHandler(void)
          {
              flag_1 = ~flag_1;
          }
           
          /*********中斷服務(wù)函數(shù)2************/
          void ISR2_IRQHandler(void)
          {
              flag_2 = ~flag_2;
          }
           
          /*********中斷服務(wù)函數(shù)3************/
          void ISR3_IRQHandler(void)
          {
              flag_3 = ~flag_3;
          }
          4.4、輪詢有中斷

          說明:將一些周期性的任務(wù)放置在main函數(shù)中的主循環(huán)中執(zhí)行:

          優(yōu)點(diǎn):合理的利用資源,將常規(guī)任務(wù)與緊急任務(wù)分開來了。

          缺點(diǎn):程序結(jié)構(gòu)與邏輯比較復(fù)雜,在任務(wù)分配以及協(xié)作之間需要花費(fèi)很大精力。

          偽代碼實(shí)現(xiàn):

          int main(void)
          {
              while(1)
              {
                  if(flag_1)
                  {
                      doSomething_1();
                  }
                  if(flag_2)
                  {
                      doSomething_2();
                  }
                  if(flag_3)
                  {
                      doSomething_3();
                  }
                  /*其他各種任務(wù)*/
              }
              return 0;
          }
           
          /*********定時(shí)器中斷服務(wù)函數(shù)************/
          void ISR1_IRQHandler(void)
          {
              
          }
          4.5、輪詢有中斷——虛擬定時(shí)器

          說明:利用不同的”虛擬定時(shí)器“的定時(shí)時(shí)間來調(diào)用不同任務(wù),當(dāng)定時(shí)器的定時(shí)時(shí)間到時(shí)則執(zhí)行回調(diào)函數(shù)或者調(diào)用任務(wù)函數(shù)。

          這對(duì)于一些周期性運(yùn)行的任務(wù)是非常適合的,同時(shí)中斷可以應(yīng)對(duì)外界的突發(fā)事件。這樣實(shí)時(shí)性也可以得到保障,但要注意不要使用等待式延時(shí)。一般虛擬定時(shí)器的時(shí)基為1ms。

          優(yōu)點(diǎn):任務(wù)的時(shí)間間隔可以相對(duì)精確的控制,同時(shí)由于中斷使用整個(gè)系統(tǒng)的實(shí)時(shí)性也很不錯(cuò)。

          缺點(diǎn):任務(wù)的執(zhí)行時(shí)間無法掌控,當(dāng)定時(shí)任務(wù)執(zhí)行時(shí)間過長(zhǎng)時(shí)會(huì)影響到虛擬定時(shí)器的定時(shí)精度。

          虛擬定時(shí)器實(shí)現(xiàn)代碼:

          https://codeload.github.com/0x1abin/MultiTimer/zip/master

          4.6、非搶占式實(shí)時(shí)操作系統(tǒng)

          說明:任務(wù)之間沒有優(yōu)先級(jí)之分,每個(gè)任務(wù)都是依次執(zhí)行。但是任務(wù)的執(zhí)行時(shí)間是由操作系統(tǒng)嚴(yán)格控制的。即使任務(wù)沒有執(zhí)行完,當(dāng)時(shí)間片時(shí)間達(dá)到時(shí)任務(wù)便會(huì)被掛起。

          優(yōu)點(diǎn):不用再處心積慮的減少任務(wù)中的延時(shí),我們只需要將精力放置在業(yè)務(wù)邏輯上。

          缺點(diǎn):任務(wù)之間是平級(jí)的,這就會(huì)導(dǎo)致有些任務(wù)無法得到緊急處理。

          偽代碼實(shí)現(xiàn):

          https://blog.csdn.net/twx11213030422/article/details/104637273

          4.7、搶占式實(shí)時(shí)操作系統(tǒng)

          說明:每個(gè)任務(wù)之間是一個(gè)“死循環(huán)”同時(shí)任務(wù)都有一個(gè)優(yōu)先級(jí)。高優(yōu)先級(jí)的任務(wù)可以打斷低優(yōu)先級(jí)的任務(wù),這個(gè)就類似于中斷一樣。所以整個(gè)系統(tǒng)的實(shí)時(shí)性就非常好,同時(shí)每個(gè)任務(wù)都還受時(shí)間片的控制也就是說它們的執(zhí)行時(shí)間是可以預(yù)測(cè)的。它也支持中斷可以響應(yīng)緊急的事件。

          優(yōu)點(diǎn):實(shí)時(shí)響應(yīng),工程師只需要將精力放置在業(yè)務(wù)邏輯的實(shí)現(xiàn)上

          缺點(diǎn):需要移植且對(duì)單片機(jī)硬件資源有一定要求;使用比較復(fù)雜。

          常用的搶占式實(shí)時(shí)操作系統(tǒng):Keil RTX、FreeRTOS、uCosII/III等等。

          4.8、回調(diào)函數(shù)

          什么是回調(diào)函數(shù)?

          答:函數(shù)指針作為函數(shù)的形參,然后函數(shù)的調(diào)用通過此函數(shù)指針來實(shí)現(xiàn)。

          回調(diào)函數(shù)中注冊(cè)與回調(diào)是什么?

          答:注冊(cè)其實(shí)就是使用一個(gè)全局的函數(shù)指針,然后給此函數(shù)指針賦值(將我們自定義的函數(shù)名稱賦值給它)。然后在中斷或者其他地方通過此全局的函數(shù)指針來調(diào)用我們?cè)茸远x的函數(shù)且這個(gè)自定義的函數(shù)我們也叫回調(diào)函數(shù)。


          版權(quán)聲明:本文來源網(wǎng)絡(luò),免費(fèi)傳達(dá)知識(shí),版權(quán)歸原作者所有。如涉及作品版權(quán)問題,請(qǐng)聯(lián)系我進(jìn)行刪除。

          ????????????????  END  ???????????????

          關(guān)注我的微信公眾號(hào),回復(fù)“加群”按規(guī)則加入技術(shù)交流群。


          點(diǎn)擊“閱讀原文”查看更多分享,歡迎點(diǎn)分享、收藏、點(diǎn)贊、在看。

          瀏覽 47
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲视频在线播放免费 | 91男女操逼的视频 | 亚洲— —在线 | 豆花在线视频 | 国产精品影视1区2区3区 |