娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

時間片輪詢法,在很多書籍中有提到,而且有很多時候都是與操作系統(tǒng)一起出現(xiàn),也就是說很多時候是操作系統(tǒng)中使用了這一方法。不過我們這里要說的這個時間片輪詢法并不是掛在操作系統(tǒng)下,而是在前后臺程序中使用此法。也是本貼要詳細說明和介紹的方法。

 

對于時間片輪詢法,雖然有不少書籍都有介紹,但大多說得并不系統(tǒng),只是提提概念而已。下面本人將詳細介紹本人模式,并參考別人的代碼建立的一個時間片輪詢架構(gòu)程序的方法,我想將給初學(xué)者有一定的借鑒性。

 

記得在前不久本人發(fā)帖《1個定時器多處復(fù)用的問題》,由于時間的問題,并沒有詳細說明怎樣實現(xiàn)1個定時器多處復(fù)用。在這里我們先介紹一下定時器的復(fù)用功能。。。

 

使用1個定時器,可以是任意的定時器,這里不做特殊說明,下面假設(shè)有3個任務(wù),那么我們應(yīng)該做如下工作:

 

1. 初始化定時器,這里假設(shè)定時器的定時中斷為1ms(當(dāng)然你可以改成10ms,這個和操作系統(tǒng)一樣,中斷過于頻繁效率就低,中斷太長,實時性差)。

 

2. 定義一個數(shù)值:

 

 

復(fù)制內(nèi)容到剪貼板

代碼:

 

#define TASK_NUM   (3)                  //  這里定義的任務(wù)數(shù)為3,表示有三個任務(wù)會使用此定時器定時。

 

uint16 TaskCount[TASK_NUM] ;           //  這里為三個任務(wù)定義三個變量來存放定時值

uint8  TaskMark[TASK_NUM];             //  同樣對應(yīng)三個標(biāo)志位,為0表示時間沒到,為1表示定時時間到。

 

 

 

3. 在定時器中斷服務(wù)函數(shù)中添加:

 

復(fù)制內(nèi)容到剪貼板

代碼:


void TimerInterrupt(void)
{
    uint8 i;

    for (i=0; i
    {
        if (TaskCount[i]) 
        {
              TaskCount[i]--; 
              if (TaskCount[i] == 0) 
              {
                    TaskMark[i] = 0x01; 
              }
        }
   }
}

 

 

代碼解釋:定時中斷服務(wù)函數(shù),在中斷中逐個判斷,如果定時值為0了,表示沒有使用此定時器或此定時器已經(jīng)完成定時,不著處理。否則定時器減一,知道為零時,相應(yīng)標(biāo)志位值1,表示此任務(wù)的定時值到了。

 

4. 在我們的應(yīng)用程序中,在需要的應(yīng)用定時的地方添加如下代碼,下面就以任務(wù)1為例:

 

復(fù)制內(nèi)容到剪貼板

代碼:

TaskCount[0] = 20;       // 延時20ms

TaskMark[0]  = 0x00;     // 啟動此任務(wù)的定時器

 

 

到此我們只需要在任務(wù)中判斷TaskMark[0] 是否為0x01即可。其他任務(wù)添加相同,至此一個定時器的復(fù)用問題就實現(xiàn)了。用需要的朋友可以試試,效果不錯哦。。。。。。。。。。。

 

通過上面對1個定時器的復(fù)用我們可以看出,在等待一個定時的到來的同時我們可以循環(huán)判斷標(biāo)志位,同時也可以去執(zhí)行其他函數(shù)。

 

循環(huán)判斷標(biāo)志位:

那么我們可以想想,如果循環(huán)判斷標(biāo)志位,是不是就和上面介紹的順序執(zhí)行程序是一樣的呢?一個大循環(huán),只是這個延時比普通的for循環(huán)精確一些,可以實現(xiàn)精確延時。

 

執(zhí)行其他函數(shù):

那么如果我們在一個函數(shù)延時的時候去執(zhí)行其他函數(shù),充分利用CPU時間,是不是和操作系統(tǒng)有些類似了呢?但是操作系統(tǒng)的任務(wù)管理和切換是非常復(fù)雜的。下面我們就將利用此方法架構(gòu)一直新的應(yīng)用程序。

 

時間片輪詢法的架構(gòu):

 

1.設(shè)計一個結(jié)構(gòu)體:

 

代碼:
  1. // 任務(wù)結(jié)構(gòu)  

  2. typedef struct _TASK_COMPONENTS  

  3. {  

  4.     uint8 Run;                 // 程序運行標(biāo)記:0-不運行,1運行  

  5.     uint8 Timer;              // 計時器  

  6.     uint8 ItvTime;              // 任務(wù)運行間隔時間  

  7.     void (*TaskHook)(void);    // 要運行的任務(wù)函數(shù)  

  8. } TASK_COMPONENTS;       // 任務(wù)定義  



 

這個結(jié)構(gòu)體的設(shè)計非常重要,一個用4個參數(shù),注釋說的非常詳細,這里不在描述。

 

2. 任務(wù)運行標(biāo)志出來,此函數(shù)就相當(dāng)于中斷服務(wù)函數(shù),需要在定時器的中斷服務(wù)函數(shù)中調(diào)用此函數(shù),這里獨立出來,并于移植和理解。

 

 


代碼:
  1.   

  2. void TaskRemarks(void)  

  3. {  

  4.     uint8 i;  

  5.   

  6.     for (i=0; i// 逐個任務(wù)時間處理  

  7.     {  

  8.          if (TaskComps[i].Timer)          // 時間不為0  

  9.         {  

  10.             TaskComps[i].Timer--;         // 減去一個節(jié)拍  

  11.             if (TaskComps[i].Timer == 0)       // 時間減完了  

  12.             {  

  13.                  TaskComps[i].Timer = TaskComps[i].ItvTime;       // 恢復(fù)計時器值,從新下一次  

  14.                  TaskComps[i].Run = 1;           // 任務(wù)可以運行  

  15.             }  

  16.         }  

  17.    }  

  18. }  




 

大家認(rèn)真對比一下次函數(shù),和上面定時復(fù)用的函數(shù)是不是一樣的呢?

 

3. 任務(wù)處理

 

 


代碼:
  1.   

  2. void TaskProcess(void)  

  3. {  

  4.     uint8 i;  

  5.   

  6.     for (i=0; i// 逐個任務(wù)時間處理  

  7.     {  

  8.          if (TaskComps[i].Run)           // 時間不為0  

  9.         {  

  10.              TaskComps[i].TaskHook();         // 運行任務(wù)  

  11.              TaskComps[i].Run = 0;          // 標(biāo)志清0  

  12.         }  

  13.     }     

  14. }  


 

此函數(shù)就是判斷什么時候該執(zhí)行那一個任務(wù)了,實現(xiàn)任務(wù)的管理操作,應(yīng)用者只需要在main()函數(shù)中調(diào)用此函數(shù)就可以了,并不需要去分別調(diào)用和處理任務(wù)函數(shù)。

 

到此,一個時間片輪詢應(yīng)用程序的架構(gòu)就建好了,大家看看是不是非常簡單呢?此架構(gòu)只需要兩個函數(shù),一個結(jié)構(gòu)體,為了應(yīng)用方面下面將再建立一個枚舉型變量。

 

下面我就就說說怎樣應(yīng)用吧,假設(shè)我們有三個任務(wù):時鐘顯示,按鍵掃描,和工作狀態(tài)顯示。

 

1. 定義一個上面定義的那種結(jié)構(gòu)體變量

 


代碼:
  1.   

  2. static TASK_COMPONENTS TaskComps[] =   

  3. {  

  4.     {0, 60, 60, TaskDisplayClock},            // 顯示時鐘  

  5.     {0, 20, 20, TaskKeySan},               // 按鍵掃描  

  6.     {0, 30, 30, TaskDispStatus},            // 顯示工作狀態(tài)  

  7.   

  8.      // 這里添加你的任務(wù)。。。。  

  9.   

  10. };  


在定義變量時,我們已經(jīng)初始化了值,這些值的初始化,非常重要,跟具體的執(zhí)行時間優(yōu)先級等都有關(guān)系,這個需要自己掌握。

 

①大概意思是,我們有三個任務(wù),沒1s執(zhí)行以下時鐘顯示,因為我們的時鐘最小單位是1s,所以在秒變化后才顯示一次就夠了。

②由于按鍵在按下時會參數(shù)抖動,而我們知道一般按鍵的抖動大概是20ms,那么我們在順序執(zhí)行的函數(shù)中一般是延伸20ms,而這里我們每20ms掃描一次,是非常不錯的出來,即達到了消抖的目的,也不會漏掉按鍵輸入。

③為了能夠顯示按鍵后的其他提示和工作界面,我們這里設(shè)計每30ms顯示一次,如果你覺得反應(yīng)慢了,你可以讓這些值小一點。后面的名稱是對應(yīng)的函數(shù)名,你必須在應(yīng)用程序中編寫這函數(shù)名稱和這三個一樣的任務(wù)。

 

2. 任務(wù)列表

 


代碼:
  1. // 任務(wù)清單  

  2. typedef enum _TASK_LIST  

  3. {  

  4.     TAST_DISP_CLOCK,            // 顯示時鐘  

  5.     TAST_KEY_SAN,             // 按鍵掃描  

  6.     TASK_DISP_WS,             // 工作狀態(tài)顯示  

  7.      // 這里添加你的任務(wù)。。。。  

  8.      TASKS_MAX                                           // 總的可供分配的定時任務(wù)數(shù)目  

  9. } TASK_LIST;  



 

 

 

好好看看,我們這里定義這個任務(wù)清單的目的其實就是參數(shù)TASKS_MAX的值,其他值是沒有具體的意義的,只是為了清晰的表面任務(wù)的關(guān)系而已。

 

3. 編寫任務(wù)函數(shù)

  1. // 任務(wù)清單  

  2. typedef enum _TASK_LIST  

  3. {  

  4.     TAST_DISP_CLOCK,            // 顯示時鐘  

  5.     TAST_KEY_SAN,             // 按鍵掃描  

  6.     TASK_DISP_WS,             // 工作狀態(tài)顯示  

  7.      // 這里添加你的任務(wù)。。。。  

  8.      TASKS_MAX                                           // 總的可供分配的定時任務(wù)數(shù)目  

  9. } TASK_LIST;  



代碼:
  1. void TaskDisplayClock(void)  

  2. {  

  3.   

  4.    

  5.   

  6. }  

  7.   

  8.   

  9. void TaskKeySan(void)  

  10. {  

  11.   

  12.   

  13. }  

  14.   

  15.   

  16. void TaskDispStatus(void)  

  17. {  

  18.   

  19.   

  20. }  

  21.   

  22.    

  23.   

  24. // 這里添加其他任務(wù)。。。。。。。。。  

 

現(xiàn)在你就可以根據(jù)自己的需要編寫任務(wù)了。

 

4. 主函數(shù)

 

代碼:


  1.   

  2. int main(void)   

  3. {   

  4.     InitSys();                  // 初始化  

  5.   

  6.     while (1)  

  7.     {  

  8.         TaskProcess();             // 任務(wù)處理  

  9.     }  

  10. }  



到此我們的時間片輪詢這個應(yīng)用程序的架構(gòu)就完成了,你只需要在我們提示的地方添加你自己的任務(wù)函數(shù)就可以了。是不是很簡單啊,有沒有點操作系統(tǒng)的感覺在里面?


關(guān)鍵字:嵌入式  單片機  程序架構(gòu)  順序結(jié)構(gòu) 引用地址:嵌入式單片機程序架構(gòu)之順序結(jié)構(gòu)

上一篇:你不知道的單片機編程器分類
下一篇:PLC控制與單片機控制的區(qū)別

0

推薦閱讀

集邦咨詢:2017年全球LED封裝營收前十大出爐,木林森排名躍升至第四Apr. 11, 2018 ---- 根據(jù)集邦咨詢LED研究中心(LEDinside)最新報告,2017年LED封裝市場穩(wěn)定成長,產(chǎn)值從2016年的159.75億美元,成長至180.35億美元。在2017年全球LED封裝營收排名方面,前三名依舊為日亞化、歐司朗光電半導(dǎo)體及Lumileds,中國廠商木林森受惠于大幅擴產(chǎn),排名升至第四...
被稱為“最強蘋果分析員”的天風(fēng)國際證券分析員郭明錤發(fā)表報告,指蘋果將于31.6寸個人電腦iMac,與及10寸至12寸平板電腦iPad的屏幕使用“次毫米發(fā)光二極體”(mini LED)技術(shù)。其中新iMac將于今年第二至第三季推出,新iPad則于2020年第四季至2021年首季推出。 業(yè)內(nèi)表示,Mini LED具有高對比度、高亮度等多種優(yōu)勢,2019年商用化提速,此前有消息稱,華為...
耐威科技公布公告稱,為進一步完善公司在航空電子、專業(yè)通信及導(dǎo)航領(lǐng)域的產(chǎn)業(yè)布局,拓展公司 在航空及海事領(lǐng)域的相關(guān)業(yè)務(wù),提高公司的綜合競爭實力,公司全資子公司青州耐威航電科技有限公司(“青州耐威航電”)通過支付現(xiàn)金方式收購C.N.S.Systems AB 97.81%的股權(quán)。收購?fù)瓿珊螅珻.N.S.Systems AB將成為公司的控股子公司。耐威科技表示,本交易的目的主...
企查查APP顯示,4月13日,“梅卡曼德機器人”完成C輪融資,投資機構(gòu)為紅杉資本、美團、源碼資本,金額數(shù)億元人民幣。企查查信息顯示,“梅卡曼德機器人”致力于將智能賦予工業(yè)機器人,隸屬于梅卡曼德(北京)機器人科技有限公司。該公司成立于2016年,法定代表人為邵天蘭,注冊資本381萬元人民幣,經(jīng)營范圍包含:工業(yè)機器人制造;通用儀器儀表制造;產(chǎn)品設(shè)...

史海拾趣

問答坊 | AI 解惑

wince 阿拉伯語言系統(tǒng)

ce 5.0, 在platform settings->locale相應(yīng)地方選中阿拉伯語,并添加阿拉伯字體。可編譯出來的系統(tǒng)是英文,為什么呢?…

查看全部問答∨

哪位高手能用操作系統(tǒng)里的線程調(diào)用等等知識來解釋一下Ctrl+A,Ctrl+c,Ctrl+V的原理啊??

反正我是一點頭緒都沒有,這操作系統(tǒng)也太難學(xué)了吧.......我不知道該往哪個地方發(fā)帖,就發(fā)這里了,有想法的就說說,咱都給分!!!…

查看全部問答∨

初學(xué)FPGA-2

2011年9月29日8:30:26   1、assign一般多用于組合邏輯,其后變量必須為wire類型;對于輸入和輸出變量,如不聲明其類型,默認(rèn)為wire類型。   2、always多用于時序邏輯。       2011年9月30日   3、modelsim ...…

查看全部問答∨

到啦!哈哈!

我團購的板子到手啦!吼吼,小樣,來,摸摸。…

查看全部問答∨

本科僧求助。。。LM324構(gòu)成的RC正弦波振蕩器,頻帶不夠?qū)捲趺崔k?

模電課設(shè),LM324運放構(gòu)成的RC正弦波振蕩電路,用的文氏橋電路。可是老師要求頻率達到100KHz,說需要引入負(fù)反饋來拓寬頻帶,加上了一個運放構(gòu)成的負(fù)反饋后情況似乎沒有改觀,求教...…

查看全部問答∨

希望對大家有用

msp430  開發(fā)應(yīng)用例子…

查看全部問答∨

易電源試用貼第三貼

LMX12002評估板測試(輸出1.8V,沒改動電阻)結(jié)果(空載): 實驗結(jié)果:1,電源輸入電壓從0V開始上升到4.1V左右,開始有輸出電壓。輸出電壓為1.77(萬用表電池不足導(dǎo)致0.03的誤差有誤差)。              ...…

查看全部問答∨

創(chuàng)業(yè)合作-歡迎人在上海放入志同道合的朋友一同創(chuàng)業(yè)

朋友您好! 我們創(chuàng)業(yè)團隊現(xiàn)在在做的項目是健康與移動物聯(lián)相結(jié)合的產(chǎn)品,分硬件和軟件的兩部分; 硬件部分具有感知人體的健康程度,智能感知,智能監(jiān)護。軟件部分是一個平臺系統(tǒng)根據(jù)這個健康程度分析出結(jié)果和建議呈現(xiàn)給用戶。 我們現(xiàn)在創(chuàng)業(yè)團隊有 ...…

查看全部問答∨

DS1302 讀數(shù)據(jù)的問題

如下是 DS1302的 讀時鐘或ram的 子代碼。scl為clock。 sda為data(I/0)。 en為RST信號。uchar read(uchar a2)  //a2 為地址{uchar j,d2=0x00;en=0;scl=0;en=1;for(j=0;j<8;j++)     //發(fā)送地址{scl=0;sda=(a2 ...…

查看全部問答∨

關(guān)于STM8S和STM32的一些個人見解

由于產(chǎn)品需要,我先后接觸了STM32和STM8S兩種芯片。考慮到功能的可擴展性,我先選擇使用STM32F103芯片,該芯片編程以及硬件設(shè)計都很方便,可以負(fù)責(zé)任的說該芯片很強大而且價位合適。但,考慮到功耗以及版圖面積的原因,該芯片還是存在不足,我們實 ...…

查看全部問答∨
小廣播
添点儿料...
无论热点新闻、行业分析、技术干货……
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 绥宁县| 瓮安县| 洛阳市| 顺昌县| 南康市| 那曲县| 固始县| 红桥区| 电白县| 七台河市| 策勒县| 卢氏县| 拉孜县| 沛县| 上饶县| 海南省| 泰和县| 昭平县| 吉隆县| 禄丰县| 临汾市| 鄂托克旗| 兴和县| 长子县| 敦化市| 明溪县| 利辛县| 丽水市| 尤溪县| 洪洞县| 孟村| 丰宁| 九龙坡区| 泸溪县| 老河口市| 内黄县| 漳平市| 唐山市| 汽车| 涟源市| 依安县|