找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1725|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

一種基于系統(tǒng)節(jié)拍時(shí)間的單片機(jī)程序設(shè)計(jì)模式(利用好每一次節(jié)拍時(shí)間-03)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:249272 發(fā)表于 2019-12-3 09:59 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 水漫金山2017 于 2019-12-3 10:07 編輯

前一篇文章,我們直接用代碼實(shí)現(xiàn)了系統(tǒng)節(jié)拍時(shí)間的產(chǎn)生。其實(shí)節(jié)拍時(shí)間不是一個(gè)新的概念,這和操作系統(tǒng)中所提及的時(shí)間片是一個(gè)含義。那在單片機(jī)程序設(shè)計(jì)中,你真的會(huì)利用好這個(gè)時(shí)間片嗎?怎樣設(shè)置時(shí)間片長(zhǎng)度比較合理?如合利用好這個(gè)時(shí)間片,就就是本節(jié)內(nèi)容要討論的內(nèi)容。
經(jīng)常看到有同事這樣利用時(shí)間片,我看著就特別心疼,好好的CPU時(shí)間,就被浪費(fèi)了。

void main(void)
{
         //系統(tǒng)初始化
        for(;;)
       {
                 if(Clock.Tick)
                 {
                         if(++Clock.Cnt20ms >= 10)
                         {
                                 Clock.Cnt20ms = 0;
                                 Task_20ms();
                         }

                         if(++Clock.Cnt100ms >= 100)
                         {
                                 Clock.Cnt100ms = 0;
                                 Task_100ms();
                         }

                         //添加其它周期性任務(wù)
                 }
       }
}
這咋起來(lái)看沒(méi)啥問(wèn)題,每個(gè)任務(wù)都在指定周期到了,才會(huì)運(yùn)行。仔細(xì)分析起來(lái),這是一種非常粗糙的分時(shí)調(diào)度寫法。任務(wù)多了,其各任務(wù)都得不到按時(shí)的響應(yīng)。為簡(jiǎn)單明了,我直接指出這種寫法存在的問(wèn)題:
           1、浪費(fèi)了許多節(jié)拍時(shí)間
           2、任務(wù)重疊太多,與我們所設(shè)計(jì)的一個(gè)節(jié)拍只執(zhí)行一個(gè)任務(wù)相違背
為了讓更多的任務(wù)可以享受每一次節(jié)拍時(shí)間的到來(lái),我們應(yīng)該對(duì)這個(gè)程序程序稍微改動(dòng)一下:
理論知識(shí):
假設(shè)我們?cè)O(shè)定的節(jié)拍時(shí)間為2ms,那么我們可以并發(fā)執(zhí)行20/2=10個(gè)20ms周期的任務(wù);500ms以此類推。是的,理論就是這么簡(jiǎn)單。
現(xiàn)在開(kāi)始我們的改造:

                if(Clock.Cnt20ms == 0)     //周期20ms的任務(wù)
               {
                     Task0();
               }
               else if(Clock.Cnt20ms == 1)
               {
                    Task1();
               }
               else if(Clock.Cnt20ms == 2)
               {
                   Task2();
               }
               else if(Clock.Cnt20ms == 3)
               {
                   Task3();
               }
               else if(Clock.Cnt20ms == 4)
               {
                   Task4();
               }
               else if(Clock.Cnt20ms == 5)
               {
                   Task5();
               }
               else if(Clock.Cnt20ms == 6)
               {
                   Task6();
               }
               else if(Clock.Cnt20ms == 7)
               {
                   Task7();
               }
               else if(Clock.Cnt20ms == 8)
               {
                   Task8();
               }
               else if(Clock.Cnt20ms == 9)
               {
                  Task9();
               }
               if(++Clock.Cnt20ms >= 10)
                 Clock.Cnt20ms = 0;


對(duì)于20ms周期的任務(wù),這10個(gè)任務(wù)是并發(fā)的,他們的周期都是20ms,盡管起點(diǎn)和終點(diǎn)不一樣。









分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表