青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

tbwshc

tbw

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  95 Posts :: 8 Stories :: 3 Comments :: 0 Trackbacks

常用鏈接

留言簿(4)

我參與的團(tuán)隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

正如我早先說的。這個應(yīng)用程序所做的兩件事之一是使紅色指示燈閃爍。這可以通過下面的代碼來做到。這里函數(shù)flashRed()作為一個任務(wù)來執(zhí)行。然而,如果忽略這一點(diǎn)以及新的函數(shù)名,那么這段代碼和第七章“外圍設(shè)備”中我們研究過的LED 閃爍函數(shù)幾乎是一樣的。在這一級上的唯一差別就是新的頻率(10HZ)和指示燈的顏色(紅色)。
#include "led.h"
#include "timer.h"
/*******************************************************************
*
* Function : flashRed()
*
* Description : Blink the red LED ten times a second.
*
* Notes : This outer loop is hardware-independent, However, it
* calls the hardware-dependent function toggleLed().
*
* Returns : This routine contains an infinite loop.
*
*******************************************************************/
void
flashRed(void)
{
Timer timer;
timer.start(50, Periodic); // Start a periodic 50 ms timer.
while(1)
{
toggleLed(LED_RED); // Toggle the red LED.
timer.waitfor(); // Wait for the timer to expire.
}
} /* flashRed() */
LED 閃爍程序主要的改變在這段代碼中是看不見的。這些主要的變化是對toggleLed()函數(shù)和Timer 類進(jìn)行了修改以兼容多任務(wù)的環(huán)境。toggleLed()函數(shù)就是我現(xiàn)在稱之為指示燈驅(qū)動的東西。一旦你開始這樣考慮這個問題,tb也許會考慮把驅(qū)動重寫成一個C++類,并已加入新的方法以明確地設(shè)置和清除指示燈,這個方法也是講得通的。但是,采用和第七章一樣的實現(xiàn)方法,并且僅使用一個互斥體來保護(hù)P2LTCH 寄存器不被一個以上的任務(wù)同時訪問,就已經(jīng)足夠了(注1)。這里是修改后的代碼:
#include "i8018xEB.h"
#include "adeos.h"
static Mutex gLedMutex;
/*******************************************************************
*
* Function : toggleLed()
*
* Description : Toggle the state of one or both LEDs.
*
* Notes : This version is ready for multitasking.
*
* Returns : None defined.
*
*******************************************************************/
void
toggleLed(unsigned char ledMask)
{
gLedMutex.take();
// Read P2LTCH, modify its value, and write the result.
//
gProcessor.pPCB->ioPort[1].latch ^= ledMask;
gLedMutex.release();
} /* toggleLed() */
注 1:在早先的那個toggleLed()函數(shù)中存在競爭的情況。為了理解這一點(diǎn),返回去查看這段代碼,并且假想兩個任務(wù)在共享指示燈,第一個任務(wù)恰好調(diào)用了那個切換紅色指示燈的函數(shù),突然之間,第一個任務(wù)被第二個任務(wù)占先,此時,在toggleLed()函數(shù)中,指示燈的狀態(tài)都被讀入并存入一個處理器的寄存器?,F(xiàn)在第二個任務(wù)導(dǎo)致兩個指示燈的狀態(tài)都被再次讀入并且存入另一個處理器的寄存器,然后兩個指示燈的狀態(tài)都被修改以改變綠色指示燈的狀態(tài),并且導(dǎo)致結(jié)果寫出到P2LTCH 寄存器。當(dāng)中斷的任務(wù)重新啟動時,它已經(jīng)有一個指示燈狀態(tài)的拷貝。但是這個拷貝不再準(zhǔn)確了。當(dāng)發(fā)生這個變化后,指示燈變成紅燈,并且比新的指示燈狀態(tài)寫到P2LTCH 寄存器。這樣,第二個任務(wù)的改變將會被撤銷。加入一個互斥體可以消除這個潛在的危險。

第七章中的時鐘驅(qū)動程序在應(yīng)用于一個多任務(wù)的環(huán)境之前,tbw必須對它做類似的改動。然而這時不存在競爭的情況(注2)。我們需要利用一個互斥體來消除waitfor 方法中的輪詢。通過把一個互斥體和每一個軟件時鐘關(guān)聯(lián),我們可以使任何一個在等待時鐘的任務(wù)休眠,因此,釋放了處理器以執(zhí)行就緒的低優(yōu)先級的任務(wù)。當(dāng)?shù)却臅r鐘到期了,休眠的任務(wù)會被操作系統(tǒng)喚起。為此,一個指向互斥體的指針,叫做 pMutex,被加入到類的定義中:
class Timer
{
public:
Timer();
~Timer();
int start(unsigned int nMilliseconds, TimerType = OneShot);
int waitfor();
void cancel();
TimerState state;
TimerType type;
unsigned int length;
Mutex * pMutex;
unsigned int count;
Timer * pNext;
private:
static void interrupt Interrupt();
};
每次構(gòu)造函數(shù)創(chuàng)建軟件時鐘的時候,這個指針被初始化。此后,無論何時一個時鐘對象被啟動,它的互斥體可以像下面這樣獲得:
——————————————————————————————————
注 2:記得時鐘硬件只初始化一次(在第一次構(gòu)造函數(shù)請求的時候),并且此后時鐘專用寄存器只能由一個函數(shù)(即中斷服務(wù)例程)來讀寫。
/*******************************************************************
*
* Function : start()
*
* Description : Start a software timer, based on the tick from the
* underlying hardware timer.
*
* Notes : This version is ready for multitasking.
*
* Returns : 0 on success, -1 if the timer is already in use.
*
*******************************************************************/
int
Timer::start(unsigned int nMilliseconds, TimerType timerType)
{
if(state != Idle)
{
return(-1);
}
//
// Take the mutex. It will be released when the timer expires.
//
pMutex->take();
//
// Initialize the software timer.
//
state = Active;
type = timerType;
length = nMilliseconds / MS_PER_TICK;
//
// Add this timer to the active timer list.
//
timerList.insert(this);
return(0);
} /* start() */
通過在時鐘啟動的時候獲得互斥體,我們可以保證在同一個互斥體釋放之前沒有其他任務(wù)(甚至是啟動時鐘的任務(wù))能夠再獲得它。并且這在時鐘自然到期(中斷服務(wù)程序)或是人為取消(通過取消的辦法)之前是不會發(fā)生的。所以在waitfor()中的輪詢可以由pMutex->take()來替換如下:
/*******************************************************************
*
* Function : waitfor()
*
* Description : Wait for the software timer to finish.
*
* Notes : This version is ready for multitasking.
*
* Returns : 0 on success, -1 if the timer is not running.
*
*******************************************************************/
int
Timer::waitfor()
{
if(state != Active)
{
return(-1);
}
//
// Wait for the timer to expire.
//
pMutex->take();
//
// Restart or idle the timer, depending on its type.
//
if(type == Periodic)
{
state == Active;
timerList.insert(this);
}
else
{
pMutex->release();
state = Idle;
}
return(0);
} /* waitfor() */
當(dāng)時鐘最后到期時,中斷服務(wù)程序?qū)尫呕コ怏w,調(diào)用的任務(wù)會在waitfor()中被喚起。喚起的過程中,互斥體已經(jīng)為下一個運(yùn)行的時鐘獲得?;コ怏w只有當(dāng)時鐘是OneShot 類型時才會被釋放,因此,是不會自動重啟的。

 

posted on 2013-08-19 11:53 tbwshc 閱讀(368) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产在线不卡精品| 久久精品30| 亚洲国产精品尤物yw在线观看| 国内精品久久久久久久97牛牛| 蜜臀va亚洲va欧美va天堂| 亚洲视频1区2区| 亚洲午夜av在线| 午夜在线成人av| 国产精品久久久亚洲一区| 欧美成人精品一区二区三区| 久久视频国产精品免费视频在线| 久久大香伊蕉在人线观看热2| 欧美成人黄色小视频| 亚洲欧美成人一区二区三区| 中文欧美日韩| 一级日韩一区在线观看| 夜夜嗨av一区二区三区中文字幕 | 欧美激情一区二区三区全黄 | 免费久久99精品国产自| 玖玖玖国产精品| 欧美激情成人在线| 欧美噜噜久久久xxx| 欧美一区1区三区3区公司| 亚洲日本电影| 一本色道久久综合亚洲精品高清 | 欧美成人嫩草网站| 欧美激情a∨在线视频播放| 欧美国产视频在线观看| 日韩午夜中文字幕| 亚洲一级免费视频| 一本色道久久综合精品竹菊 | 精品av久久707| 一区二区三区蜜桃网| 国产综合视频| 亚洲人永久免费| 亚洲综合色在线| 久久久蜜臀国产一区二区| 农村妇女精品| 国产精品99久久久久久白浆小说| 欧美一区二区免费视频| 欧美chengren| 国产精品久久久久免费a∨大胸| 国产精品亚洲综合一区在线观看| 伊人狠狠色j香婷婷综合| 91久久一区二区| 黄色资源网久久资源365| 欧美波霸影院| 国产精品永久免费视频| 亚洲国产导航| 亚洲欧美日韩一区| 欧美成人免费在线观看| 一区二区三区日韩精品| 亚洲综合色丁香婷婷六月图片| 欧美日韩精品一区二区在线播放| 国产欧美一区二区三区沐欲| 伊人成综合网伊人222| 亚洲成人直播| 午夜精彩视频在线观看不卡 | 国产精品福利av| 久久精品一级爱片| 欧美色视频在线| 亚洲国产高清高潮精品美女| 欧美日韩中文另类| 伊人久久婷婷| 久久精品道一区二区三区| 亚洲久久一区| 欧美激情bt| 国产一区二区三区免费在线观看 | 亚洲精品国久久99热| 久久av在线| 国产精品久久久久毛片软件| 日韩亚洲在线观看| 久久精品视频免费播放| 亚洲视频免费在线观看| 欧美日韩久久不卡| 99精品视频免费在线观看| 99精品欧美一区二区三区 | 亚洲视频免费| 欧美成人69| 国产精品一区=区| 亚洲综合色网站| 亚洲一区二区成人在线观看| 国产精品成人aaaaa网站| 欧美韩日视频| 午夜精品影院| 国产日韩成人精品| 久久久久成人精品| 久久久久久久91| 国产精品高精视频免费| 亚洲自拍16p| 亚洲五月六月| 国产日韩亚洲欧美精品| 久久精品男女| 久久亚洲精品一区二区| 国产精品尤物福利片在线观看| 亚洲欧美日韩一区二区| 亚洲永久免费| 激情久久影院| 亚洲国产精品一区二区第一页 | 欧美一区二区三区久久精品茉莉花 | 久久欧美中文字幕| 国产精品试看| 久久国产精品久久久久久电车| 亚洲欧美一区二区三区在线| 国产一区视频网站| 欧美国产日韩亚洲一区| 欧美精品激情在线观看| 在线日韩欧美| 亚洲精选国产| 国产精品一区二区视频| 国产综合色产| 亚洲欧美电影在线观看| 欧美在线一二三区| 亚洲最新视频在线| 最新69国产成人精品视频免费| 国产精品高潮呻吟久久av黑人| 欧美日韩另类一区| 国产精品久久久久久久9999| 久久久久久亚洲精品中文字幕| 美女主播精品视频一二三四| 国内精品嫩模av私拍在线观看| 欧美激情精品久久久久久大尺度| 欧美一区二区黄色| 亚洲精品久久久久久久久久久久久| 日韩视频国产视频| 在线成人激情视频| 亚洲第一精品电影| 国产一区二区看久久| 亚洲国产精品va| 国产欧美成人| 午夜欧美精品久久久久久久| 亚洲欧美在线免费观看| 亚洲视频在线一区| 亚洲无线一线二线三线区别av| 欧美日本一区二区高清播放视频| 欧美黑人在线播放| 亚洲精品自在在线观看| 欧美二区视频| 亚洲三级免费电影| 香蕉久久久久久久av网站| 国产欧美日韩综合| 久久精品色图| 亚洲高清在线观看| 亚洲午夜精品福利| 国产美女精品| 久久久久久一区二区| 欧美激情综合| 在线亚洲精品| 国产精品毛片a∨一区二区三区|国| 亚洲一区二区在线视频 | 玖玖精品视频| 亚洲三级网站| 欧美性色综合| 欧美一区二区三区在线免费观看| 欧美aa在线视频| 国产免费成人在线视频| 麻豆精品91| 99爱精品视频| 国产精品亚洲一区| 久久久久久久国产| 亚洲黄色有码视频| 亚洲欧美国产精品桃花| 国产综合色在线| 久久国产婷婷国产香蕉| 欧美在线不卡| 欧美成人一区二区三区| 亚洲理论在线观看| 欧美一区二区精品| 亚洲动漫精品| 欧美视频网址| 久久久久久9| 一区二区三区免费网站| 美女视频黄免费的久久| 亚洲午夜精品17c| 揄拍成人国产精品视频| 欧美日韩一区成人| 久久久久一区二区三区| 中日韩高清电影网| 亚洲福利专区| 久久亚洲美女| 欧美一区二区三区另类| 亚洲精品激情| 欧美激情一区二区| 欧美亚洲网站| 亚洲图片欧美日产| 亚洲人人精品| 嫩草伊人久久精品少妇av杨幂| 亚洲欧美激情四射在线日 | 免费观看国产成人| 中日韩视频在线观看| 亚洲第一精品电影| 久久久久久综合| 亚洲欧美日韩一区二区三区在线| 亚洲精品日韩一| 在线观看一区二区视频| 国产亚洲精品bv在线观看| 国产精品久久久久久久久动漫| 欧美区日韩区| 欧美精品v日韩精品v国产精品| 久久视频在线看|