91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文看懂嵌入式單片機(jī)程序架構(gòu)之順序結(jié)構(gòu)

電子工程師 ? 2018-04-15 11:39 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

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

代碼:

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

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

uint8TaskMark[TASK_NUM];//同樣對(duì)應(yīng)三個(gè)標(biāo)志位,為0表示時(shí)間沒到,為1表示定時(shí)時(shí)間到。

3. 在定時(shí)器中斷服務(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;
}
}
}
}

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

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

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

代碼:

TaskCount[0] = 20;// 延時(shí)20ms

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

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

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

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

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

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

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

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

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

代碼:

//任務(wù)結(jié)構(gòu)

typedefstruct_TASK_COMPONENTS

{

uint8Run;//程序運(yùn)行標(biāo)記:0-不運(yùn)行,1運(yùn)行

uint8Timer;//計(jì)時(shí)器

uint8ItvTime;//任務(wù)運(yùn)行間隔時(shí)間

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

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

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

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

代碼:

voidTaskRemarks(void)

{

uint8i;

for(i=0;i//逐個(gè)任務(wù)時(shí)間處理

{

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

{

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

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

{

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

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

}

}

}

}


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

3. 任務(wù)處理

代碼:

voidTaskProcess(void)

{

uint8i;

for(i=0;i//逐個(gè)任務(wù)時(shí)間處理

{

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

{

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

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

}

}

}

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

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

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

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

代碼:

staticTASK_COMPONENTSTaskComps[]=

{

{0,60,60,TaskDisplayClock},//顯示時(shí)鐘

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

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

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

};

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6077

    文章

    45506

    瀏覽量

    671112
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    嵌入式單片機(jī)開發(fā)學(xué)習(xí)路徑

    嵌入式系統(tǒng)是現(xiàn)代科技的重要組成部分,廣泛應(yīng)用于智能家居、汽車電子、工業(yè)控制、醫(yī)療設(shè)備等領(lǐng)域。學(xué)習(xí)嵌入式單片機(jī)開發(fā)不僅能提升個(gè)人技能,還能開拓職業(yè)發(fā)展路徑。本文將為你提供條詳細(xì)的
    發(fā)表于 02-09 15:42

    如何入門單片機(jī)/嵌入式?

    學(xué)的單片機(jī),本科玩了幾年嵌入式,做過智能家居,智能小車,示波器,開關(guān)電源等等,后來工作(本人芯片行業(yè))以后就沒搞了,但是這段時(shí)間積累的經(jīng)驗(yàn),可以讓整個(gè)職業(yè)生涯受益。 單片機(jī)相對(duì)來
    發(fā)表于 02-02 06:57

    arm嵌入式主板優(yōu)缺點(diǎn)

    。   二、強(qiáng)大的擴(kuò)展功能和網(wǎng)絡(luò)傳輸功能:隨著更多的行業(yè)開始使用到嵌入式主板,導(dǎo)致市場對(duì)主板功能的要求的差異化越來越大。嵌入式主板ARM的出現(xiàn),恰恰滿足了這個(gè)個(gè)性化的需求。從擴(kuò)展性上來講,8位單片機(jī)的擴(kuò)展
    發(fā)表于 01-08 07:08

    個(gè)面向單片機(jī)、事件驅(qū)動(dòng)的嵌入式開發(fā)平臺(tái)介紹

    EventOS,是個(gè)面向單片機(jī)、事件驅(qū)動(dòng)的嵌入式開發(fā)平臺(tái)。它主要有兩大技術(shù)特色:是事件驅(qū)動(dòng),二是超輕量。EventOS以及其母項(xiàng)目EventOS,目標(biāo)是開發(fā)
    發(fā)表于 12-05 06:26

    分享個(gè)嵌入式開發(fā)學(xué)習(xí)路線

    法,這些語法在嵌入式開發(fā)中至關(guān)重要。 2. 技能進(jìn)階期(2-3個(gè)月) 從51單片機(jī)過渡到主流的ARM Cortex-M系列(嵌入式就業(yè)核心平臺(tái)),學(xué)會(huì)使用STM32單片機(jī),掌握
    發(fā)表于 12-04 11:01

    嵌入式單片機(jī)定義及區(qū)別

    ,我們將深入探討這些不同類型的嵌入式處理器的定義、特性及其在各種應(yīng)用領(lǐng)域中的作用。 我們的單片機(jī),即嵌入式微控制器MCU,是種高度集成的電子器件。它內(nèi)部融合了ROM/RAM、總線邏
    發(fā)表于 11-17 08:11

    單片機(jī)嵌入式,到底是什么關(guān)系?

    很多人初次接觸嵌入式開發(fā)時(shí),都會(huì)聽到句話:“嵌入式其實(shí)就是單片機(jī)?!笨僧?dāng)你真正開始學(xué)習(xí)時(shí),會(huì)發(fā)現(xiàn)嵌入式
    的頭像 發(fā)表于 11-14 10:28 ?1611次閱讀
    <b class='flag-5'>單片機(jī)</b>和<b class='flag-5'>嵌入式</b>,到底是什么關(guān)系?

    嵌入式達(dá)到什么水平才能就業(yè)?

    搭建開發(fā)環(huán)境并解決依賴包沖突熟悉計(jì)算機(jī)組成原理核心知識(shí)點(diǎn):能說清 CPU 架構(gòu)、內(nèi)存尋址、IO 映射的基本原理,能看懂簡單的硬件電路圖 (二)實(shí)操要求能獨(dú)立完成 51/STM32 單片機(jī)項(xiàng)目開發(fā)
    發(fā)表于 09-15 10:20

    嵌入式從入門到進(jìn)階,怎么學(xué)?

    、位操作(直接決定代碼效率),通過 串口通信程序 練手(如單片機(jī)與 PC 數(shù)據(jù)互傳)。 硬件基礎(chǔ)懂?dāng)?shù)電模電(邏輯門、放大電路)、常用元件(電阻 / 電容 / 三極管),能看懂 51 單片機(jī)
    發(fā)表于 09-02 09:44

    飛凌嵌入式RK3576多模態(tài)大模型圖像理解助手,讓嵌入式設(shè)備“看懂”世界

    (LLM)+視覺語言模型(VLM)多模態(tài)架構(gòu),推出多模態(tài)大模型圖像理解助手,為嵌入式設(shè)備打造 “智能視覺中樞”,讓終端設(shè)備能夠真正 “看懂” 復(fù)雜的世界 。
    的頭像 發(fā)表于 07-25 11:09 ?1701次閱讀
    飛凌<b class='flag-5'>嵌入式</b>RK3576多模態(tài)大模型圖像理解助手,讓<b class='flag-5'>嵌入式</b>設(shè)備“<b class='flag-5'>看懂</b>”世界

    嵌入式單片機(jī),是同個(gè)東西嗎?

    程序控制各種外部設(shè)備,完成特定的操作。 總結(jié)來說,單片機(jī)嵌入式系統(tǒng)中的種重要硬件組件,而嵌入式系統(tǒng)則是
    發(fā)表于 07-09 10:20

    Linux嵌入式單片機(jī)嵌入式的區(qū)別?

    :使用Linux操作系統(tǒng),可以運(yùn)行各種復(fù)雜的應(yīng)用程序和驅(qū)動(dòng)程序。 4. 資源需求 : 單片機(jī)嵌入式 :對(duì)硬件資源的需求較低,通常只需要
    發(fā)表于 06-20 09:46

    嵌入式單片機(jī)在電機(jī)控制系統(tǒng)中的應(yīng)用

    有效提升電機(jī)控制系統(tǒng)的性能,這也是建立高速實(shí)時(shí)電機(jī)控制系統(tǒng)的前提。 純分享帖,需要者可點(diǎn)擊附件免費(fèi)獲取完整資料~~~*附件:嵌入式單片機(jī)在電機(jī)控制系統(tǒng)中的應(yīng)用.pdf【免責(zé)聲明】本文系網(wǎng)絡(luò)轉(zhuǎn)載,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請(qǐng)第
    發(fā)表于 06-11 15:07

    看懂嵌入式與壁掛工控機(jī)安裝方式的關(guān)鍵差異

    技術(shù)人員根據(jù)實(shí)際需求,制定出科學(xué)合理的安裝方案。 、安裝前期規(guī)劃差異 (嵌入式工控機(jī) 嵌入式工控機(jī)
    的頭像 發(fā)表于 05-14 14:40 ?1036次閱讀

    嵌入式單片機(jī)的區(qū)別?簡單明了的給你講透兩者的技術(shù)本質(zhì)!

    上周有個(gè)做智能硬件創(chuàng)業(yè)的朋友問我:"我們產(chǎn)品用的是STM32單片機(jī),但方案商總說要做嵌入式系統(tǒng),這兩者到底有啥區(qū)別?"這個(gè)問題其實(shí)戳中了大多數(shù)電子工程師的認(rèn)知盲區(qū)。作為深耕物聯(lián)網(wǎng)
    的頭像 發(fā)表于 04-21 16:10 ?2939次閱讀
    <b class='flag-5'>嵌入式</b>和<b class='flag-5'>單片機(jī)</b>的區(qū)別?<b class='flag-5'>一</b><b class='flag-5'>文</b>簡單明了的給你講透兩者的技術(shù)本質(zhì)!