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

tbwshc

tbw

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

常用鏈接

留言簿(4)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

正如我早先說的。這個應用程序所做的兩件事之一是使紅色指示燈閃爍。這可以通過下面的代碼來做到。這里函數flashRed()作為一個任務來執行。然而,如果忽略這一點以及新的函數名,那么這段代碼和第七章“外圍設備”中我們研究過的LED 閃爍函數幾乎是一樣的。在這一級上的唯一差別就是新的頻率(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()函數和Timer 類進行了修改以兼容多任務的環境。toggleLed()函數就是我現在稱之為指示燈驅動的東西。一旦你開始這樣考慮這個問題,tb也許會考慮把驅動重寫成一個C++類,并已加入新的方法以明確地設置和清除指示燈,這個方法也是講得通的。但是,采用和第七章一樣的實現方法,并且僅使用一個互斥體來保護P2LTCH 寄存器不被一個以上的任務同時訪問,就已經足夠了(注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()函數中存在競爭的情況。為了理解這一點,返回去查看這段代碼,并且假想兩個任務在共享指示燈,第一個任務恰好調用了那個切換紅色指示燈的函數,突然之間,第一個任務被第二個任務占先,此時,在toggleLed()函數中,指示燈的狀態都被讀入并存入一個處理器的寄存器。現在第二個任務導致兩個指示燈的狀態都被再次讀入并且存入另一個處理器的寄存器,然后兩個指示燈的狀態都被修改以改變綠色指示燈的狀態,并且導致結果寫出到P2LTCH 寄存器。當中斷的任務重新啟動時,它已經有一個指示燈狀態的拷貝。但是這個拷貝不再準確了。當發生這個變化后,指示燈變成紅燈,并且比新的指示燈狀態寫到P2LTCH 寄存器。這樣,第二個任務的改變將會被撤銷。加入一個互斥體可以消除這個潛在的危險。

第七章中的時鐘驅動程序在應用于一個多任務的環境之前,tbw必須對它做類似的改動。然而這時不存在競爭的情況(注2)。我們需要利用一個互斥體來消除waitfor 方法中的輪詢。通過把一個互斥體和每一個軟件時鐘關聯,我們可以使任何一個在等待時鐘的任務休眠,因此,釋放了處理器以執行就緒的低優先級的任務。當等待的時鐘到期了,休眠的任務會被操作系統喚起。為此,一個指向互斥體的指針,叫做 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();
};
每次構造函數創建軟件時鐘的時候,這個指針被初始化。此后,無論何時一個時鐘對象被啟動,它的互斥體可以像下面這樣獲得:
——————————————————————————————————
注 2:記得時鐘硬件只初始化一次(在第一次構造函數請求的時候),并且此后時鐘專用寄存器只能由一個函數(即中斷服務例程)來讀寫。
/*******************************************************************
*
* 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() */
通過在時鐘啟動的時候獲得互斥體,我們可以保證在同一個互斥體釋放之前沒有其他任務(甚至是啟動時鐘的任務)能夠再獲得它。并且這在時鐘自然到期(中斷服務程序)或是人為取消(通過取消的辦法)之前是不會發生的。所以在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() */
當時鐘最后到期時,中斷服務程序將會釋放互斥體,調用的任務會在waitfor()中被喚起。喚起的過程中,互斥體已經為下一個運行的時鐘獲得。互斥體只有當時鐘是OneShot 類型時才會被釋放,因此,是不會自動重啟的。

 

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

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
            在线亚洲美日韩| 一本到12不卡视频在线dvd| 亚洲日韩视频| 一区二区日韩免费看| 夜夜嗨av色一区二区不卡| 一区二区三区波多野结衣在线观看| 日韩西西人体444www| 正在播放亚洲一区| 一区二区福利| 亚洲午夜精品17c| 亚洲一区二区三区精品视频| 欧美在线啊v| 欧美激情一区二区三区成人| 欧美gay视频| 老色鬼久久亚洲一区二区| 亚洲最快最全在线视频| 免费看精品久久片| 欧美激情一区二区三区在线视频| 欧美日韩中文在线| 亚洲伦理在线| 免费成人黄色av| 久久国产精品一区二区三区| 国产精品视频第一区| 亚洲清纯自拍| 欧美成人高清视频| 久久久久国产一区二区| 激情综合网激情| 久久久久久久网| 91久久久久久| 欧美一区二区网站| 国产欧美另类| 亚洲香蕉网站| 一本色道久久综合狠狠躁篇的优点| 久久综合一区| 亚洲国产日韩欧美在线图片| 裸体素人女欧美日韩| 亚洲欧美激情精品一区二区| 国产精品sss| 999在线观看精品免费不卡网站| 麻豆国产精品777777在线| 亚洲欧美成人| 国产视频观看一区| 欧美一级淫片播放口| 亚洲午夜电影| 国产欧美一区二区精品秋霞影院| 亚洲伊人第一页| 日韩视频在线播放| 欧美日韩午夜激情| 亚洲国产高清在线| 久久精品99无色码中文字幕| 亚洲日本视频| 久热精品视频| 亚洲午夜精品17c| 国产日韩欧美三区| 久久久999精品免费| 欧美专区在线播放| 国产综合视频在线观看| 欧美在线影院| 久久视频国产精品免费视频在线| 91久久精品美女| 91久久国产综合久久91精品网站| 免费视频最近日韩| 亚洲欧洲在线看| 中文在线资源观看视频网站免费不卡| 欧美色图五月天| 亚洲激情电影在线| 午夜精品视频网站| 午夜精品久久久久久99热| 欧美日韩国产在线看| 亚洲人成久久| 亚洲电影免费观看高清| 免费h精品视频在线播放| 亚洲欧洲精品天堂一级| 亚洲福利一区| 欧美午夜一区二区福利视频| 欧美一区午夜精品| 久久综合久久综合久久综合| 亚洲成色精品| 99视频精品免费观看| 韩国免费一区| 亚洲人成在线影院| 免费观看国产成人| 久久综合网络一区二区| 亚洲精品中文字幕在线| 99精品99| 国产主播一区二区三区| 亚洲高清一区二| 国产区二精品视| 男女激情久久| 欧美日韩国产bt| 亚洲精品国产精品乱码不99按摩| 中文精品一区二区三区| 亚洲国产一区二区在线| 亚洲美女中文字幕| 国产区日韩欧美| 欧美aⅴ一区二区三区视频| 母乳一区在线观看| 久久久不卡网国产精品一区| 欧美精品日韩www.p站| 久久久水蜜桃| 欧美日韩国产区| 麻豆精品在线视频| 国产精品成av人在线视午夜片| 欧美福利视频在线| 国产日韩欧美在线观看| 一本色道久久综合狠狠躁篇的优点 | 亚洲国产精品ⅴa在线观看| 性做久久久久久免费观看欧美| 亚洲精品国产精品国自产观看| 亚洲欧美www| 午夜精品久久久久久久| 欧美激情在线狂野欧美精品| 久久精品视频导航| 国内久久精品| 亚洲欧美日韩天堂| 午夜精品久久久久久99热软件| 欧美午夜激情小视频| 亚洲成色精品| 亚洲欧洲精品天堂一级| 免播放器亚洲一区| 欧美激情精品久久久久久黑人 | 国产在线精品自拍| 午夜精品在线视频| 久久www成人_看片免费不卡| 国产精品福利在线观看网址| 91久久久久| 日韩一级二级三级| 欧美精彩视频一区二区三区| 最新国产の精品合集bt伙计| 99精品热视频只有精品10| 欧美日韩国产成人高清视频| 日韩特黄影片| 亚洲欧美日本日韩| 国产午夜精品久久久| 久久精品九九| 亚洲国产成人精品久久| 日韩午夜黄色| 久久久视频精品| 91久久精品一区二区三区| 一区二区免费在线视频| 国产精品豆花视频| 性色av一区二区怡红| 久久久综合激的五月天| 1024成人网色www| 欧美激情一区二区三区在线视频观看| 一区二区免费在线观看| 性欧美暴力猛交69hd| 国产日韩欧美综合| 99国产麻豆精品| 久久久国产91| 日韩视频第一页| 国产精品区一区| 欧美伊人影院| 亚洲国产日韩欧美在线动漫| 亚洲视频在线视频| 国产一区二区视频在线观看| 老司机免费视频久久| 亚洲美女色禁图| 久久久久91| 国产女精品视频网站免费| 久久久久久久久久久久久9999| 亚洲日本va在线观看| 午夜精品福利在线观看| 在线免费观看日本欧美| 欧美日韩在线不卡| 久久激情综合网| 99爱精品视频| 免费欧美在线视频| 亚洲男女毛片无遮挡| 今天的高清视频免费播放成人 | 久久久久久亚洲精品中文字幕| 亚洲国产日韩欧美综合久久| 欧美一区二区视频免费观看| 亚洲黄一区二区三区| 欧美一区二区三区久久精品茉莉花| 亚洲福利视频二区| 国产精品久久久久久久久动漫| 久久偷窥视频| 亚洲欧美三级在线| 亚洲激情视频网| 久久久亚洲人| 亚洲一区二区免费看| 亚洲精品九九| 国产一区二区成人久久免费影院| 欧美麻豆久久久久久中文| 久久国产精品久久久久久电车| 亚洲美女诱惑| 欧美韩日高清| 久久久噜久噜久久综合| 亚洲欧美日韩精品一区二区| 日韩视频精品| 亚洲国产另类久久精品| 国产在线精品一区二区夜色| 国产精品香蕉在线观看| 欧美日韩精品一区二区三区| 母乳一区在线观看| 亚洲神马久久| 日韩亚洲欧美精品| 亚洲精选视频在线| 亚洲国产经典视频|