日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 嵌入式 > 嵌入式軟件
[導讀]與非網(EEFOCUS)電子產業(yè)社區(qū)平臺為中國電子行業(yè)首家采用強大技術平臺,由專業(yè)的電子技術編輯服務,為全球3000家知名半導體廠家及電子技術系統(tǒng)廠商提供技術信息發(fā)布、廠商網站、技術社區(qū)建設服務,并以電子術語詞典,集成電路數據手冊查詢,電子產品新聞訪談資訊信息以及互動技術交流社區(qū)為上百萬電子技術工程師以及高校師生提供最完整的電子技術信息查詢和交流服務。

二、同步

在多數情況下,線程之間難免要相互通信、相互協(xié)調才能完成任務。比如,當有多個線程共同訪問同一個資源時,就必須保證一個線程正讀取這個資源數據的時候,其它線程不能夠修改它。這就需要線程之間相互通信,了解對方的行為。再有當一個線程要準備執(zhí)行下一個任務之前,它必須等待另一個線程終止才能運行,這也需要彼此相互通信。實際開發(fā)過程中,線程間需要同步的情況非常多。Windows CE.NET給我們提供了很多的同步機制,熟練的掌握這些機制并合理運用會使線程之間的同步更合理、更高效。進程間的通信機制在下一篇文章中講解。

Windows CE.NET具有兩種運行模式:用戶模式和內核模式。并且允許一個運行于用戶模式的應用程序隨時切換為內核模式,或切換回來。線程同步的有些解決辦法運行在用戶模式,有些運行在內核模式?!禬indows核心編程》上說從用戶模式切換到內核模式再切換回來至少要1000個CPU周期。我查看過CE下API函數SetKMode的源碼,這個函數用于在兩種模式間切換,改變模式只需修改一些標志,至于需要多少個CPU周期很難確定。但至少可以肯定來回切換是需要一定時間的。所以在選擇同步機制上應該優(yōu)先考慮運行在用戶模式的同步解決辦法。

1、互鎖函數

互鎖函數運行在用戶模式。它能保證當一個線程訪問一個變量時,其它線程無法訪問此變量,以確保變量值的唯一性。這種訪問方式被稱為原子訪問?;ユi函數及其功能見如下列表:

函數參數和功能InterlockedIncrement參數為PLONG類型。此函數使一個LONG變量增1InterlockedDecrement參數為PLONG類型。此函數使一個LONG變量減1InterlockedExchangeAdd參數1為PLONG類型,參數2為LONG類型。此函數將參數2賦給參數1指向的值InterlockedExchange參數1為PLONG類型,參數2為LONG類型。此函數將參數2的值賦給參數1指向的值InterlockedExchangePointer參數為PVOID* 類型,參數2為PVOID類型。此函數功能同上。具體參見幫助InterlockedCompareExchange參數1為PLONG類型,參數2為LONG類型,參數3為LONG類型。此函數將參數1指向的值與參數3比較,相同則把參數2的值賦給參數1指向的值。不相同則不變InterlockedCompareExchangePointer參數1為PVOID* 類型,參數2為PVOID類型,參數3為PVOID。此函數功能同上。具體參見幫助
2、臨界區(qū)

臨界區(qū)對象運行在用戶模式。它能保證在臨界區(qū)內所有被訪問的資源不被其它線程訪問,直到當前線程執(zhí)行完臨界區(qū)代碼。除了API外,MFC也對臨界區(qū)函數進行了封裝。臨界區(qū)相關函數:

void InitializeCriticalSection ( LPCRITICAL_SECTION );
void EnterCriticalSection ( LPCRITICAL_SECTION );
void LeaveCriticalSection ( LPCRITICAL_SECTION );
void DeleteCriticalSection ( LPCRITICAL_SECTION );

舉例如下:

void CriticalSectionExample (void)
{
CRITICAL_SECTION csMyCriticalSection;
InitializeCriticalSection (&csMyCriticalSection); ///初始化臨界區(qū)變量

__try
{
EnterCriticalSection (&csMyCriticalSection); ///開始保護機制
///此處編寫代碼
}

__finally ///異常處理,無論是否異常都執(zhí)行此段代碼
{
LeaveCriticalSection (&csMyCriticalSection); ///撤銷保護機制
}
}

MFC類使用更簡單:

CCriticalSection cs;

cs.Lock();

///編寫代碼

cs.Unlock();

使用臨界區(qū)要注意的是避免死鎖。當有兩個線程,每個線程都有臨界區(qū),而且臨界區(qū)保護的資源有相同的時候,這時就要在編寫代碼時多加考慮。

3、事件對象

事件對象運行在內核模式。與用戶模式不同,內核模式下線程利用等待函數來等待所需要的事件、信號,這個等待過程由操作系統(tǒng)內核來完成,而線程處于睡眠狀態(tài),當接收到信號后,內核恢復線程的運行。內核模式的優(yōu)點是線程在等待過程中并不浪費CPU時間,缺點是從用戶模式切換到內核模式需要一定的時間,而且還要切換回來。在講解事件對象前應該先談談等待函數。等待函數有四個。具體參數和功能見下表:

函數參數和功能WaitForSingleObject參數1為HANDLE類型,參數2為DWORD類型。此函數等待參數1標識的事件,等待時間為參數2的值,單位ms。如果不超時,當事件成為有信號狀態(tài)時,線程喚醒繼續(xù)運行。WaitForMultipleObjects參數1為DWORD類型,參數2為HANDLE * 類型,參數3為BOOL類型,參數4為DWORD類型。此函數等待參數2指向的數組中包含的所有事件。如果不超時,當參數3為FALSE時,只要有一個事件處于有信號狀態(tài),函數就返回這個事件的索引。參數3為TRUE時,等待所有事件都處于有信號狀態(tài)時才返回。MsgWaitForMultipleObjects參數1為DWORD類型,參數2為LPHANDLE類型,參數3為BOOL類型,參數4為DWORD類型,參數5為DWORD類型。此函數功能上同WaitForMultipleObjects函數相似,只是多了一個喚醒掩碼。喚醒掩碼都是和消息有關的。此函數不但能夠為事件等待,還能為特定的消息等待。其實這個函數就是專為等待消息而定義的。MsgWaitForMultipleObjectsEx參數1為DWORD類型,參數2為LPHANDLE類型,參數3為DWORD類型,參數4為DWORD類型,參數5為DWORD類型。此函數是MsgWaitForMultipleObjects函數的擴展。將原來函數的參數3除掉,添加參數5為標志。標志有兩個值:0或MWMO_INPUTAVAILABLE。
如果一個線程既要執(zhí)行大量任務同時又要響應用戶的按鍵消息,這兩個專用于等待消息的函數將非常有用。

和事件有關的函數有:

HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset,
BOOL bInitialState,
LPTSTR lpName);

BOOL SetEvent(HANDLE hEvent );
BOOL PulseEvent(HANDLE hEvent);
BOOL ResetEvent(HANDLE hEvent);

HANDLE OpenEvent(DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName );

事件對象是最常用的內核模式同步方法。它包含一個使用計數和兩個BOOL變量。其中一個BOOL變量指定這個事件對象是自動重置還是手工重置。另一個BOOL變量指定當前事件對象處于有信號狀態(tài)還是無信號狀態(tài)。

函數CreateEvent創(chuàng)建一個事件對象,參數1必須為NULL,參數2指定是否手工重新設置事件對象的狀態(tài)。如果為FALSE,當等待函數接到信號并返回后此事件對象被自動置為無信號狀態(tài)。這時等待此事件對象的其它線程就不會被喚醒,因為事件對象已經被置為無信號狀態(tài)。如果參數2設置為TRUE,當等待函數接到信號并返回后事件對象不會被自動置于無信號狀態(tài),其它等待此事件對象的線程都能夠被喚醒。用ResetEvent函數可以手工將事件對象置為無信號狀態(tài)。相反SetEvent函數將事件對象置為有信號狀態(tài)。PulseEvent函數將事件對象置為有信號狀態(tài),然后立即置為無信號狀態(tài),在實際開發(fā)中這個函數很少使用。OpenEvent函數打開已經創(chuàng)建的事件對象,一般用于不同進程內的線程同步。在調用CreateEvent創(chuàng)建一個事件對象時,傳遞一個名字給參數4,這樣在其它進程中的線程就可以調用OpenEvent函數并指定事件對象的名字,來訪問這個事件對象。

4、互斥對象

互斥對象運行在內核模式。它的行為特性同臨界區(qū)非常相似,在一個線程訪問某個共享資源時,它能夠保證其它線程不能訪問這個資源。不同的是,互斥對象運行在內核模式,從時間上比臨界區(qū)要慢。由于內核對象具有全局性,不同的進程都能夠訪問,這樣利用互斥對象就可以讓不同的進程中的線程互斥訪問一個共享資源。而臨界區(qū)只能在一個進程內有效。

和互斥相關的函數有:

HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL bInitialOwner,
LPCTSTR lpName);

BOOL ReleaseMutex(HANDLE hMutex);

互斥對象包含一個引用計數,一個線程ID和一個遞歸計數。引用計數是所有內核對象都含有的。線程ID表示哪個線程正在使用互斥資源,當ID為0時,互斥對象發(fā)出信號。遞歸計數用于一個線程多次等待同一個互斥對象。函數CreateMutex創(chuàng)建一個互斥對象,參數1必須設置為NULL,參數2如果設置為FALSE,表示當前線程并不占有互斥資源,互斥對象的線程ID和遞歸計數都被設置為0,互斥對象處于有信號狀態(tài)。如果設置為TRUE,表示當前線程將占有互斥資源,互斥對象的線程ID被設置為當前線程ID,遞歸計數被設置為1,互斥對象處于無信號狀態(tài)。當調用等待函數時,等待函數檢驗互斥對象的線程ID是否為0,如果為0,說明當前沒有線程訪問互斥資源,內核將線程喚醒,并且將互斥對象的遞歸計數加1。當一個線程被喚醒后,必須調用函數ReleaseMutex將互斥對象的遞歸計數減1。如果一個線程多次調用等待函數,就必須以同樣的次數調用ReleaseMutex函數。與其它Windows不同的是,和互斥相關的函數中沒有OpenMutex函數。要在不同進程中訪問同一互斥對象,調用CreateMutex函數,參數傳遞互斥對象的名稱,返回這個互斥對象的句柄。

5、信標對象

信標對象,也叫信號燈,用于限制資源訪問數量,他包含一個引用計數,一個當前可用資源數,一個最大可用資源數。如果當前可用資源數大于0,信標對象處于有信號狀態(tài)。當可用資源數等于0,信標對象處于無信號狀態(tài)。

和信標對象相關的函數:

HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
LONG lInitialCount,
LONG lMaximumCount,
LPCTSTR lpName);

BOOL ReleaseSemaphore(HANDLE hSemaphore,
LONG lReleaseCount,
LPLONG lpPreviousCount);

函數CreateSemaphore的參數1為NULL,參數2為當前可用資源初始值,參數3為最大可用資源數,參數4為名字。當參數2的值等于0時,信標對象處于無信號狀態(tài),這時內核將調用等待函數的線程置于睡眠狀態(tài),如果參數2的值大于0,信標對象處于有信號狀態(tài),這時內核將調用等待函數的線程置于運行狀態(tài),并將信標對象的當前可用資源數減1。函數ReleaseSemaphore的參數1為信標對象的句柄,參數2為要釋放的資源數,參數3返回原來可用資源數,調用此函數將當前可用資源數加上參數2的值。當一個線程訪問完可用資源后,應該調用ReleaseSemaphore函數使當前可用資源數遞增。要在不同進程中訪問同一信標對象,調用CreateSemaphore函數并傳遞信標對象的名稱,得到已經在其它進程創(chuàng)建的信標對象的句柄。CE下沒有OpenSemaphore函數。另外我還要說明一點,等待函數默認將信標對象的當前可用資源數減1,但線程可能一次使用多個資源,這就可能出現(xiàn)問題了。為避免問題出現(xiàn),應該遵守一個線程只使用一個資源的原則。

6、消息隊列

Windows CE.NET允許一個應用程序或驅動程序創(chuàng)建自己的消息隊列。消息隊列既可以作為在線程之間傳遞數據的工具,也可以作為線程之間同步的工具。它的優(yōu)點是需要很小的內存,一般只用于點到點的通信。

和消息隊列相關的函數:

HANDLE WINAPI CreateMsgQueue(LPCWSTR lpszName,
LPMSGQUEUEOPTIONS lpOptions);

BOOL WINAPI CloseMsgQueue(HANDLE hMsgQ);
BOOL GetMsgQueueInfo(HANDLE hMsgQ,
LPMSGQUEUEINFO lpInfo);

HANDLE WINAPI OpenMsgQueue(HANDLE hSrcProc,
HANDLE hMsgQ,
LPMSGQUEUEOPTIONS lpOptions);

BOOL ReadMsgQueue(HANDLE hMsgQ,
LPVOID lpBuffer,
DWORD cbBufferSize,
LPDWORD lpNumberOfBytesRead,
DWORD dwTimeout,
DWORD *pdwFlags);

BOOL WINAPI WriteMsgQueue(HANDLE hMsgQ,
LPVOID lpBuffer,
DWORD cbDataSize,
DWORD dwTimeout,
DWORD dwFlags);

使用CreateMsgQueue函數創(chuàng)建一個消息隊列,傳遞一個MSGQUEUEOPTIONS結構指針。在這個結構中設置標志(允許隊列緩沖區(qū)動態(tài)改變大小,允許直接讀或者寫操作而不管之前是否有過寫操作或讀操作)、隊列允許的最大消息數、隊列屬性(只讀或者只寫)。使用WriteMsgQueue函數把一個消息寫入到消息隊列中。傳遞一個消息隊列的緩沖區(qū)、消息數據的大小、寫入緩沖區(qū)的超時值、標志。使用ReadMsgQueue函數把一個消息從消息隊列中讀出。使用CloseMsgQueue函數關閉消息隊列緩沖區(qū)。使用OpenMsgQueue函數能夠打開其它進程中創(chuàng)建的消息隊列。另外可以用等待函數等待消息隊列的變化。當消息隊列由沒有消息到有消息時,或由滿消息到不滿消息時喚醒調用等待函數的線程。關于消息隊列我并沒有實驗過,MSDN上有幾個簡單的例子。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉