【導(dǎo)讀】通常,我們只對(duì)與我們正在處理的過(guò)程相關(guān)的特定事件感興趣。正如您在上面注意到的,從時(shí)間的角度來(lái)看,我們關(guān)心的事件是是否該起床了。處理并發(fā)的典型方法是讓另一個(gè)物理資源(鬧鐘或人)監(jiān)視我們感興趣的事件,然后提醒(或打斷)我們事件已經(jīng)發(fā)生的事實(shí),以便我們可以處理它。
本文是探討并發(fā)和中斷概念的系列文章中的篇。本系列的大部分內(nèi)容將直接處理微控制器和 GPIO 中斷。
在初的這篇文章中,我們將討論這些概念的基本定義,并考慮它們與為微控制器編寫(xiě)代碼的相關(guān)性。
什么是并發(fā)?
讓我們用一個(gè)我們都熟悉的例子來(lái)談?wù)劜l(fā)。通常,當(dāng)您上床睡覺(jué)時(shí),您想在特定時(shí)間醒來(lái)。你在這里有兩個(gè)目標(biāo):上床睡覺(jué),這樣你就可以休息,但也要確保你不會(huì)睡到你想要的起床時(shí)間。
確保您不會(huì)錯(cuò)過(guò)起床時(shí)間的一種方法是保持清醒并看時(shí)鐘,但這會(huì)破壞您想要上床睡覺(jué)的目的。為了幫助補(bǔ)救這個(gè)問(wèn)題,我們通常使用鬧鐘(一個(gè)設(shè)備或受信任的人,到那時(shí)已經(jīng)醒了)在特定時(shí)間叫醒我們,這樣我們就可以專注于睡眠,同時(shí)仍然實(shí)現(xiàn)我們的目標(biāo)時(shí)間。
并發(fā)性是我們用來(lái)描述您同時(shí)處理兩個(gè)或多個(gè)進(jìn)程但在任何時(shí)間點(diǎn)只能物理處理其中一個(gè)進(jìn)程的能力的場(chǎng)景。
在上面的示例中,要注意的兩個(gè)過(guò)程是睡眠和跟蹤時(shí)間(因此我們會(huì)在所需時(shí)間醒來(lái))。同一個(gè)人同時(shí)做這兩件事在物理上是不可能的。
通常,我們只對(duì)與我們正在處理的過(guò)程相關(guān)的特定事件感興趣。正如您在上面注意到的,從時(shí)間的角度來(lái)看,我們關(guān)心的事件是是否該起床了。處理并發(fā)的典型方法是讓另一個(gè)物理資源(鬧鐘或人)監(jiān)視我們感興趣的事件,然后提醒(或打斷)我們事件已經(jīng)發(fā)生的事實(shí),以便我們可以處理它。
圖 1 顯示了這方面的時(shí)間線圖解。
圖 1.上床睡覺(jué)并讓鬧鐘在特定時(shí)間叫醒您的時(shí)間線圖示。
嵌入式和網(wǎng)絡(luò)物理系統(tǒng)中的并發(fā)
嵌入式和網(wǎng)絡(luò)物理系統(tǒng)通常必須處理并發(fā)性。
這個(gè)概念的一個(gè)例子是微波爐。該設(shè)備需要能夠處理按鈕按下或檢測(cè)您在食物加熱時(shí)打開(kāi)門(mén)的時(shí)間。按下暫?;蛉∠粹o或打開(kāi)門(mén)將導(dǎo)致食物停止加熱。
微控制器——您通常將其編程為系統(tǒng)“大腦”的計(jì)算機(jī)——在設(shè)計(jì)時(shí)就考慮到了并發(fā)性。
除了通用 CPU 之外,它們還包含許多用于與外界交互的專用硬件設(shè)備(稱為外圍設(shè)備),因此您可以連接諸如按鈕和顯示器之類(lèi)的東西以及實(shí)現(xiàn)系統(tǒng)所需的其他外部硬件。通常,這些外設(shè)具有中斷機(jī)制,因此 CPU 可以要求它們監(jiān)視特定事件,然后在該事件發(fā)生時(shí)中斷 CPU。
中斷和并發(fā)程序的概述
微控制器上的中斷就像我之前討論的睡眠和鬧鐘示例一樣工作。
您可以編寫(xiě)一個(gè)程序,將外設(shè)配置為監(jiān)視某個(gè)事件并在該事件發(fā)生時(shí)中斷 CPU——例如,當(dāng) GPIO 輸入值從 0 變?yōu)?1 時(shí)。當(dāng)您的程序運(yùn)行時(shí),CPU 會(huì)執(zhí)行您的程序片段主程序。當(dāng)您等待的事件發(fā)生時(shí),外圍設(shè)備向 CPU 發(fā)出事件已經(jīng)發(fā)生的信號(hào)。如果一切配置正確,CPU 將停止它在主程序中所做的任何事情,執(zhí)行一個(gè)稱為中斷服務(wù)例程 (ISR) 或中斷處理程序的特殊函數(shù),然后返回主程序從中斷的地方繼續(xù)當(dāng)它完成時(shí)。
您必須將 ISR 編寫(xiě)為代碼的一部分。假設(shè)您正在使用 C 編寫(xiě)程序,這意味著您必須在源代碼中的某處聲明和定義它,該源代碼將作為微控制器將運(yùn)行的可執(zhí)行文件的一部分構(gòu)建。
但是,您永遠(yuǎn)不會(huì)自己調(diào)用 ISR。所有微控制器開(kāi)發(fā)工具都有一種特定的方式讓您告訴 C 編譯器某個(gè)函數(shù)是 ISR 以及它與哪個(gè)特定中斷相關(guān)聯(lián)。正確完成此操作后,當(dāng)特定中斷發(fā)生時(shí),CPU 將自動(dòng)跳轉(zhuǎn)到該函數(shù)并執(zhí)行它。
C 代碼中的中斷示例
由于中斷的工作方式,一開(kāi)始在編程中處理并發(fā)似乎有點(diǎn)不直觀。
下圖展示了用 C 語(yǔ)言編寫(xiě)的具有 ISR 的代碼將如何運(yùn)行,以幫助提供一種思考并發(fā)程序的好方法。它假定所有中斷配置都已正確完成。
圖 2.帶有中斷的 C 代碼
CPU 在 main 函數(shù)的 while 循環(huán)中執(zhí)行代碼。
感興趣的事件(從 1 變?yōu)?0)發(fā)生在為中斷配置的引腳上。
CPU停止執(zhí)行while循環(huán)中的代碼,轉(zhuǎn)而執(zhí)行中斷服務(wù)程序。
中斷服務(wù)程序執(zhí)行完畢后,CPU 從中斷處繼續(xù)執(zhí)行主循環(huán)。
CPU 正在 while 循環(huán)中執(zhí)行代碼。
感興趣的事件再次發(fā)生。
CPU停止執(zhí)行while循環(huán)中的代碼,轉(zhuǎn)而執(zhí)行中斷服務(wù)程序。
中斷服務(wù)程序執(zhí)行完畢后,CPU 從中斷處繼續(xù)執(zhí)行主循環(huán)。
外圍設(shè)備和 GPIO 的中斷
本系列的大部分內(nèi)容都集中在微控制器的并發(fā)和中斷概念上。接下來(lái),我們將討論GPIO 中斷及其工作原理。
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問(wèn)題,請(qǐng)聯(lián)系小編進(jìn)行處理。
推薦閱讀:
海康威視發(fā)布2022年ESG報(bào)告:科技為善,助力可持續(xù)的美好未來(lái)
如何設(shè)計(jì)簡(jiǎn)單的電壓控制雙向電流源
運(yùn)算放大器的8種應(yīng)用電路,您都了解嗎?
輕量級(jí)的電源系統(tǒng),該如何設(shè)計(jì)?