chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

改進(jìn)一個(gè)可實(shí)現(xiàn)多任務(wù)操作電表的代碼程序

h1654155971.7688 ? 2018-02-02 17:19 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

2002年初,筆者著手寫一個(gè)IC卡預(yù)付費(fèi)電表的工作程序,該電表使用Philips公司的8位51擴(kuò)展型單片機(jī)87LPC764,要求實(shí)現(xiàn)很多功能,包括熄顯示、負(fù)荷計(jì)算與控制、指示閃爍以及電表各種參數(shù)的查詢等,總之,要使用時(shí)間的單元很多。筆者當(dāng)時(shí)使用ASM51完成了這個(gè)程序的編寫,完成后的程序量是2KB多一點(diǎn)。后來,由于種種原因,這個(gè)程序并沒有真正使用,只是作了一些改動(dòng)之后用在一個(gè)老化設(shè)備上進(jìn)行計(jì)時(shí)與負(fù)荷計(jì)算。約一年后,筆者又重新改寫了這些代碼。

1系統(tǒng)的改進(jìn)

可以說,這個(gè)用ASM51實(shí)現(xiàn)的代碼是沒有什么組織性可言的,要什么功能就加入什么功能,弄得程序的結(jié)構(gòu)非常松散,其實(shí)這也是導(dǎo)致筆者最終決定重新改寫這些代碼的原因。大家知道,87LPC764有4KB的FlashROM,而筆者的程序量只有2KB多點(diǎn),因而第一個(gè)想法是改用C語(yǔ)言作為主要的開發(fā)語(yǔ)言,應(yīng)該不至于導(dǎo)致代碼空間不夠用。其次,考慮到需要定時(shí)功能的模塊(或稱任務(wù),以下統(tǒng)稱任務(wù))較多,有必要對(duì)這些任務(wù)進(jìn)行有序的管理。筆者考慮使用時(shí)間片輪詢方式,即給每個(gè)要求時(shí)間管理的任務(wù)以一個(gè)時(shí)間間隔,時(shí)間間隔一到,即運(yùn)行其代碼,達(dá)到合理使用系統(tǒng)定時(shí)器資源的目的。就51系統(tǒng)而言,一般至少一個(gè)定時(shí)器可用來進(jìn)行時(shí)間片的輪詢。基于以上的想法,構(gòu)造了下述數(shù)據(jù)類型。

typedef unsigned char uInt8

typedef struct {

void (*proc)( void ); /* 處理程序 */

uInt8 ms_count; /* 時(shí)間片大小 */

} _op_;

數(shù)據(jù)結(jié)構(gòu)定義好之后,接著就是實(shí)現(xiàn)代碼,包括三部分,即初始化數(shù)據(jù)、時(shí)間片的刷新與時(shí)間到執(zhí)行。

初始化數(shù)據(jù)。#defineproc_cnt0x08//定義過程或任務(wù)數(shù)量

//任務(wù)棧初始化

code _op_ Op[proc_cnt] = { { ic_check 10 } { disp_loop 100 }

{ calc_power 150 } { set_led 2 } … };

//設(shè)置時(shí)間片初始值

datauInt8time_val[proc_cnt]={10,100,150,2,…};

時(shí)間片刷新。

void time_int1( void ) interrupt 3

{

uInt8 cnt;

Time_Counter: = Time_Unit;

for ( cnt = 0; cnt < proc_cnt; cnt++ )

{

time_val[cnt]--;

}

}

任務(wù)的執(zhí)行。

void main( void )

{

uInt8 cnt;

init(); /*程序初始化 */

interrupt_on(); /* 打開中斷 */

do

{

for ( cnt = 0; cnt < proc_cnt; cnt++ )

{

if ( !time_val[cnt] )

{

time_val[cnt] = Op[cnt].ms_count;

Op[cnt].proc();

}

}

}

while ( 1 );

}

在上面的結(jié)構(gòu)定義中,proc是不能帶參數(shù)的,各任務(wù)之間的通信可以定義一個(gè)參數(shù)內(nèi)存塊,通過一種機(jī)制進(jìn)行數(shù)據(jù)信息交互,如定義一個(gè)全局變量。對(duì)于小容量單片機(jī)系統(tǒng)而言,需要這樣做的任務(wù)并不多,總?cè)蝿?wù)量也不會(huì)太多,因而這種協(xié)調(diào)并不太難處理。也許大家都有這樣的認(rèn)識(shí),即一個(gè)實(shí)時(shí)系統(tǒng)中,差不多所有的具體任務(wù)都是有時(shí)間屬性的,即使是不需要定時(shí)的過程或任務(wù),也不見得要時(shí)時(shí)進(jìn)行查詢與刷新。如IC卡介質(zhì)檢測(cè),保證每秒一次就足夠了。因而,這些任務(wù)也可以列入到這個(gè)結(jié)構(gòu)中來。在以上的程序代碼中,考慮到單片機(jī)系統(tǒng)的RAM限制,不能像一些實(shí)時(shí)OS那樣將任務(wù)棧建立在RAM中。筆者將任務(wù)棧建立在代碼空間,因而不能在程序運(yùn)行時(shí)動(dòng)態(tài)地加入任務(wù),因此要求在程序編譯時(shí),任務(wù)棧已經(jīng)確定。同時(shí),定義一組計(jì)數(shù)值旗標(biāo)time_val,記錄程序運(yùn)行時(shí)的時(shí)間量,并在一個(gè)定時(shí)器中斷中對(duì)其進(jìn)行刷新。改變時(shí)間片刷新中斷過程語(yǔ)句Time_Counter:=Time_Unit;中的Time_Unit,可以改變系統(tǒng)時(shí)間片的刷新粒度,一般這個(gè)值由系統(tǒng)的最小時(shí)間度量值確定。同時(shí),由任務(wù)的執(zhí)行流程可知,此種系統(tǒng)構(gòu)造并沒有改變其前/后臺(tái)系統(tǒng)的性質(zhì),只是對(duì)后臺(tái)邏輯操作序列進(jìn)行了有效管理。同時(shí),如果將任務(wù)執(zhí)行流程進(jìn)行一些更改,并保證時(shí)間片小的任務(wù)前置,如下述程序。

do

{

for ( cnt = 0; cnt < proc_cnt; cnt++ )

{

if ( !time_val[cnt] )

{

time_val[cnt] = Op[cnt].ms_count;

Op[cnt].proc();

break; /* 執(zhí)行完成后,重新進(jìn)行優(yōu)先調(diào)度 */

}

}

}

while ( 1 );

則系統(tǒng)變?yōu)橐粋€(gè)以執(zhí)行頻率為優(yōu)先級(jí)的任務(wù)調(diào)度系統(tǒng)。當(dāng)然,設(shè)置此種方式得非常小心,并要注意時(shí)間片的分配,如果時(shí)間片過小,則可能導(dǎo)致執(zhí)行頻率較低的任務(wù)難以被執(zhí)行;而如果存在兩個(gè)同樣的時(shí)間片,則更加危險(xiǎn),可能導(dǎo)致第二個(gè)具有相同時(shí)間片的任務(wù)不被執(zhí)行,因而,時(shí)間片的分配要合理,并保證其唯一性。

2性能分析與任務(wù)拆分

以上兩種任務(wù)管理方式,前一種按任務(wù)棧的順序與時(shí)間片的大小依次進(jìn)行調(diào)度,暫且稱其為流水作業(yè)調(diào)度;而后一種,且稱其為頻率優(yōu)先調(diào)度。兩種方式各有優(yōu)缺點(diǎn)。流水作業(yè)調(diào)度的各任務(wù)具有等同優(yōu)先級(jí),時(shí)間片一到即會(huì)被按序調(diào)用,時(shí)間片大小的次序與唯一性不作要求;缺點(diǎn)是可能導(dǎo)致時(shí)間片小的,即要求執(zhí)行得較快的任務(wù)等待過長(zhǎng)的時(shí)間。頻率優(yōu)先調(diào)度的各任務(wù)按其時(shí)間片的大小,即執(zhí)行頻率劃分優(yōu)先級(jí),時(shí)間片小的任務(wù),其執(zhí)行頻率高,總是具有較高的優(yōu)先權(quán),但時(shí)間片的分配得協(xié)調(diào),否則可能會(huì)導(dǎo)致執(zhí)行頻率低的任務(wù)長(zhǎng)時(shí)間等待。要特別注意的是,兩種方式都有可能導(dǎo)致一些任務(wù)長(zhǎng)時(shí)間等待,時(shí)間片所設(shè)定的時(shí)間也因此不能作為精確時(shí)間的依據(jù),根據(jù)系統(tǒng)的要求或需要,甚至要在任務(wù)執(zhí)行過程中進(jìn)行某些保護(hù)工作,如中斷屏蔽等,因而在進(jìn)行任務(wù)規(guī)劃時(shí)要注意。如果一個(gè)任務(wù)較繁瑣或可能要等待很長(zhǎng)時(shí)間,則應(yīng)當(dāng)考慮任務(wù)的拆分,把一個(gè)較大的任務(wù)細(xì)化為較小的任務(wù),把一個(gè)費(fèi)時(shí)長(zhǎng)的任務(wù)劃分為多個(gè)費(fèi)時(shí)小的任務(wù),協(xié)同完成其功能。如在等待時(shí)間長(zhǎng)的情況下,可附加一個(gè)定時(shí)任務(wù),定時(shí)任務(wù)到則發(fā)送一個(gè)消息旗標(biāo),主過程沒有檢測(cè)到消息旗標(biāo)就馬上返回,否則繼續(xù)執(zhí)行。下面是示例代碼,假定該任務(wù)將等待很長(zhǎng)時(shí)間,現(xiàn)將其拆分為兩個(gè)任務(wù)proc1與proc2協(xié)同完成原來的工作,proc1每100個(gè)時(shí)間單位執(zhí)行一次,而proc2每200個(gè)時(shí)間單位執(zhí)行一次。

/* 定義兩個(gè)任務(wù),并將其加入到任務(wù)棧中。 */

code _op_Op[proc_cnt] = { …{ proc1 100 } { proc2 200 } };

data inttime1_Seg; /* 定義一個(gè)全局旗標(biāo) */

/* 任務(wù)實(shí)現(xiàn) */

void proc1( void )

{

if ( time1_Seg )

exit;

else

time1_Seg = const_Time1; /* 如果時(shí)間到了,則恢復(fù)初值并 */

/* 接著執(zhí)行下列代碼。 */

… /* 任務(wù)實(shí)際執(zhí)行代碼 */

}

void proc2( void )

{

if ( time1_Seg )

time1_Seg--;

}

由上例可以看出,任務(wù)拆分后,幾乎不占過多的CPU時(shí)間,使得任務(wù)的等待時(shí)間大減,讓CPU有足夠的時(shí)間進(jìn)行任務(wù)管理與調(diào)度。同時(shí)也讓程序的結(jié)構(gòu)性與可讀性大為加強(qiáng)。

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

    關(guān)注

    6071

    文章

    45259

    瀏覽量

    660138
  • IC
    IC
    +關(guān)注

    關(guān)注

    36

    文章

    6206

    瀏覽量

    182669
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11187

    瀏覽量

    221311
  • 電表
    +關(guān)注

    關(guān)注

    13

    文章

    783

    瀏覽量

    36930

原文標(biāo)題:如何用單片機(jī)完成多任務(wù)操作

文章出處:【微信號(hào):weixin21ic,微信公眾號(hào):21ic電子網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    實(shí)時(shí)多任務(wù)操作系統(tǒng)

    大多數(shù)嵌入式軟件開發(fā)還是基于處理器直接編寫,沒有采用商品化的RTOS,不能將系統(tǒng)軟件和應(yīng)用軟件分開處理。RTOS是段嵌入在目標(biāo)代碼中的軟件,用戶的其它應(yīng)用程序都建立在RTOS之上。不但如此,RTOS還是
    發(fā)表于 08-12 14:31

    setjmp構(gòu)建簡(jiǎn)單協(xié)作式多任務(wù)系統(tǒng)

    在實(shí)際應(yīng)用中,搶中式的多任務(wù)某種程序上帶來了用戶程序設(shè)計(jì)時(shí)數(shù)據(jù)保護(hù)的困難,并且,具備搶占功能的多任務(wù)內(nèi)核設(shè)計(jì)時(shí)困難也比較多,這會(huì)增加操作系統(tǒng)
    發(fā)表于 12-07 15:55

    實(shí)時(shí)多任務(wù)操作系統(tǒng)(RTOS)

    多任務(wù)處理是指用戶可以在同時(shí)間內(nèi)運(yùn)行多個(gè)應(yīng)用程序,每個(gè)應(yīng)用程序被稱作個(gè)
    發(fā)表于 08-24 06:34

    如何去實(shí)現(xiàn)基于stm32的FreeRTOS多任務(wù)程序

    基于 stm32 的 FreeRTOS多任務(wù)程序實(shí)現(xiàn)、什么是FreeRTOS二、AHT20數(shù)據(jù)采集原理電路繪制三、FreeRTOS的多任務(wù)
    發(fā)表于 08-24 07:45

    多任務(wù)編程多任務(wù)處理是指什么

    嵌入式Linux應(yīng)用編程-多任務(wù)編程多任務(wù)處理是指用戶可在同時(shí)間內(nèi)運(yùn)行多個(gè)應(yīng)用程序,每個(gè)正在執(zhí)行的應(yīng)用程序被稱為
    發(fā)表于 12-22 08:30

    如何在STM32下完成個(gè)基于FreeRTOS的多任務(wù)程序

    任務(wù)要求:在STM32下完成個(gè)基于FreeRTOS的多任務(wù)程序,執(zhí)行3個(gè)周期性task;目錄
    發(fā)表于 01-17 07:10

    VxWorks操作系統(tǒng)及實(shí)時(shí)多任務(wù)程序設(shè)計(jì)

    VxWorks操作系統(tǒng)及實(shí)時(shí)多任務(wù)程序設(shè)計(jì)
    發(fā)表于 03-25 10:38 ?13次下載

    VxWorks下實(shí)時(shí)多任務(wù)程序實(shí)現(xiàn)

    本文介紹了VxWorks操作系統(tǒng)的技術(shù)特點(diǎn),給出了種VxWorks操作系統(tǒng)下實(shí)現(xiàn)實(shí)時(shí)多任務(wù)程序
    發(fā)表于 09-07 08:22 ?9次下載

    基于消息驅(qū)動(dòng)的多任務(wù)操作機(jī)制

    本文對(duì)多任務(wù)操作機(jī)制與傳統(tǒng)的單任務(wù)操作機(jī)制進(jìn)行了比較,分析了多任務(wù)系統(tǒng)中數(shù)據(jù)交換的方法,特別是目前最為流行的用消息驅(qū)動(dòng)方式
    發(fā)表于 05-14 16:56 ?0次下載

    MSP430單片機(jī)實(shí)時(shí)多任務(wù)操作系統(tǒng)c源代碼

    : 資料-【C】嵌入系統(tǒng)-【C0】嵌入式綜合-【2】單片機(jī)編程-【參考程序】-MSP430單片機(jī)的實(shí)時(shí)多任務(wù)操作系統(tǒng)c源代碼.zip
    發(fā)表于 09-18 10:18 ?91次下載
    MSP430單片機(jī)實(shí)時(shí)<b class='flag-5'>多任務(wù)</b><b class='flag-5'>操作</b>系統(tǒng)c源<b class='flag-5'>代碼</b>

    DSP實(shí)時(shí)多任務(wù)操作系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)

    DSP實(shí)時(shí)多任務(wù)操作系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)又需要的下來看看。
    發(fā)表于 05-09 10:15 ?0次下載

    51單片機(jī)多任務(wù)操作系統(tǒng)的原理與實(shí)現(xiàn)

    51單片機(jī)多任務(wù)操作系統(tǒng)的原理與實(shí)現(xiàn),在51單片機(jī)上模擬操作系統(tǒng)
    發(fā)表于 02-28 15:09 ?16次下載

    基于實(shí)時(shí)操作系統(tǒng)的單片機(jī)多任務(wù)應(yīng)用程序設(shè)計(jì)

    基于實(shí)時(shí)操作系統(tǒng)的單片機(jī)多任務(wù)應(yīng)用程序設(shè)計(jì)
    發(fā)表于 10-27 15:21 ?49次下載
    基于實(shí)時(shí)<b class='flag-5'>操作</b>系統(tǒng)的單片機(jī)<b class='flag-5'>多任務(wù)</b>應(yīng)用<b class='flag-5'>程序</b>設(shè)計(jì)

    種實(shí)時(shí)嵌入式多任務(wù)微內(nèi)核的分析與改進(jìn)

    種實(shí)時(shí)嵌入式多任務(wù)微內(nèi)核的分析與改進(jìn)(嵌入式開發(fā)系統(tǒng))-種實(shí)時(shí)嵌入式多任務(wù)微內(nèi)核的分析與改進(jìn)
    發(fā)表于 07-30 13:49 ?11次下載
    <b class='flag-5'>一</b>種實(shí)時(shí)嵌入式<b class='flag-5'>多任務(wù)</b>微內(nèi)核的分析與<b class='flag-5'>改進(jìn)</b>

    STM32 簡(jiǎn)單多任務(wù)調(diào)度的方法與程序例程

    多任務(wù)處理是指用戶可以在同時(shí)間內(nèi)運(yùn)行多個(gè)應(yīng)用程序,每個(gè)應(yīng)用程序被稱作個(gè)
    發(fā)表于 12-22 19:04 ?13次下載
    STM32 簡(jiǎn)單<b class='flag-5'>多任務(wù)</b>調(diào)度的方法與<b class='flag-5'>程序</b>例程