在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

改進一個可實現多任務操作電表的代碼程序

h1654155971.7688 ? 2018-02-02 17:19 ? 次閱讀

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

1系統的改進

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

typedef unsigned char uInt8

typedef struct {

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

uInt8 ms_count; /* 時間片大小 */

} _op_;

數據結構定義好之后,接著就是實現代碼,包括三部分,即初始化數據、時間片的刷新與時間到執行。

初始化數據。#defineproc_cnt0x08//定義過程或任務數量

//任務棧初始化

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

{ calc_power 150 } { set_led 2 } … };

//設置時間片初始值

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

時間片刷新。

void time_int1( void ) interrupt 3

{

uInt8 cnt;

Time_Counter: = Time_Unit;

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

{

time_val[cnt]--;

}

}

任務的執行。

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 );

}

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

do

{

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

{

if ( !time_val[cnt] )

{

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

Op[cnt].proc();

break; /* 執行完成后,重新進行優先調度 */

}

}

}

while ( 1 );

則系統變為一個以執行頻率為優先級的任務調度系統。當然,設置此種方式得非常小心,并要注意時間片的分配,如果時間片過小,則可能導致執行頻率較低的任務難以被執行;而如果存在兩個同樣的時間片,則更加危險,可能導致第二個具有相同時間片的任務不被執行,因而,時間片的分配要合理,并保證其唯一性。

2性能分析與任務拆分

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

/* 定義兩個任務,并將其加入到任務棧中。 */

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

data inttime1_Seg; /* 定義一個全局旗標 */

/* 任務實現 */

void proc1( void )

{

if ( time1_Seg )

exit;

else

time1_Seg = const_Time1; /* 如果時間到了,則恢復初值并 */

/* 接著執行下列代碼。 */

… /* 任務實際執行代碼 */

}

void proc2( void )

{

if ( time1_Seg )

time1_Seg--;

}

由上例可以看出,任務拆分后,幾乎不占過多的CPU時間,使得任務的等待時間大減,讓CPU有足夠的時間進行任務管理與調度。同時也讓程序的結構性與可讀性大為加強。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6043

    文章

    44623

    瀏覽量

    638685
  • IC
    IC
    +關注

    關注

    36

    文章

    5986

    瀏覽量

    176264
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10907

    瀏覽量

    213065
  • 電表
    +關注

    關注

    13

    文章

    580

    瀏覽量

    35459

原文標題:如何用單片機完成多任務操作

文章出處:【微信號:weixin21ic,微信公眾號:21ic電子網】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    實時多任務操作系統

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

    setjmp構建簡單協作式多任務系統

    在實際應用中,搶中式的多任務某種程序上帶來了用戶程序設計時數據保護的困難,并且,具備搶占功能的多任務內核設計時困難也比較多,這會增加操作系統
    發表于 12-07 15:55

    實時多任務操作系統(RTOS)

    多任務處理是指用戶可以在同時間內運行多個應用程序,每個應用程序被稱作
    發表于 08-24 06:34

    如何去實現基于stm32的FreeRTOS多任務程序

    基于 stm32 的 FreeRTOS多任務程序實現、什么是FreeRTOS二、AHT20數據采集原理電路繪制三、FreeRTOS的多任務
    發表于 08-24 07:45

    多任務編程多任務處理是指什么

    嵌入式Linux應用編程-多任務編程多任務處理是指用戶可在同時間內運行多個應用程序,每個正在執行的應用程序被稱為
    發表于 12-22 08:30

    如何在STM32下完成基于FreeRTOS的多任務程序

    任務要求:在STM32下完成基于FreeRTOS的多任務程序,執行3周期性task;目錄
    發表于 01-17 07:10

    VxWorks操作系統及實時多任務程序設計

    VxWorks操作系統及實時多任務程序設計
    發表于 03-25 10:38 ?13次下載

    VxWorks下實時多任務程序實現

    本文介紹了VxWorks操作系統的技術特點,給出了種VxWorks操作系統下實現實時多任務程序
    發表于 09-07 08:22 ?9次下載

    基于消息驅動的多任務操作機制

    本文對多任務操作機制與傳統的單任務操作機制進行了比較,分析了多任務系統中數據交換的方法,特別是目前最為流行的用消息驅動方式
    發表于 05-14 16:56 ?0次下載

    MSP430單片機實時多任務操作系統c源代碼

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

    DSP實時多任務操作系統設計與實現

    DSP實時多任務操作系統設計與實現又需要的下來看看。
    發表于 05-09 10:15 ?0次下載

    51單片機多任務操作系統的原理與實現

    51單片機多任務操作系統的原理與實現,在51單片機上模擬操作系統
    發表于 02-28 15:09 ?16次下載

    基于實時操作系統的單片機多任務應用程序設計

    基于實時操作系統的單片機多任務應用程序設計
    發表于 10-27 15:21 ?49次下載
    基于實時<b class='flag-5'>操作</b>系統的單片機<b class='flag-5'>多任務</b>應用<b class='flag-5'>程序</b>設計

    種實時嵌入式多任務微內核的分析與改進

    種實時嵌入式多任務微內核的分析與改進(嵌入式開發系統)-種實時嵌入式多任務微內核的分析與改進
    發表于 07-30 13:49 ?11次下載
    <b class='flag-5'>一</b>種實時嵌入式<b class='flag-5'>多任務</b>微內核的分析與<b class='flag-5'>改進</b>

    STM32 簡單多任務調度的方法與程序例程

    多任務處理是指用戶可以在同時間內運行多個應用程序,每個應用程序被稱作
    發表于 12-22 19:04 ?13次下載
    STM32 簡單<b class='flag-5'>多任務</b>調度的方法與<b class='flag-5'>程序</b>例程
    主站蜘蛛池模板: 天天操天天干天搞天天射 | 操你啦在线视频 | 国产偷窥女洗浴在线观看亚洲 | 日本三级在线播放线观看2021 | 高h细节肉爽文bl1v1 | 在线观看视频你懂得 | 免费看欧美一级特黄a大片 免费看欧美一级特黄a大片一 | 深夜福利欧美 | 狂野欧美性猛交xxxx免费 | 久久久久国产一级毛片高清片 | 波多野结衣三个女人蕾丝边 | 亚洲国产高清人在线 | 国产三级精品最新在线 | 男人的天堂在线免费视频 | 天天怕夜夜怕狠狠怕 | 天天干天天上 | 在线观看一二三区 | 99久久精品免费精品国产 | 天堂中文在线免费观看 | 日本黄色大片在线播放视频免费观看 | 欧美午夜在线播放 | 午夜寂寞影视 | 午夜色大片在线观看 | 国产亚洲网站 | 日韩欧美卡通动漫在线观看 | 热re久久精品国产99热 | 欧美三级网站 | 六月综合网 | 天天干天天拍 | 国产成人啪午夜精品网站 | 天天干夜夜爱 | 丁香婷婷综合网 | 色99在线| 日本一本一道久久香蕉免费 | 2021久久精品99精品久久 | 天天操天天干天天舔 | 国产网站在线免费观看 | 人人澡人人澡人人看青草 | aaaa欧美高清免费 | 1024人成软件色www | 成人在线免费电影 |