高階C語言教程 中斷和裝置驅動

2021-08-09 12:22:36 字數 1819 閱讀 2303

簡述裝置驅動、boot loader與bsp之間的區別!

裝置驅動是介於底層硬體與作業系統之間的一層軟體。裝置驅動的主要功能就是遮蔽硬體控制的具體細節,對作業系統提供乙個抽象的、統一的硬體資源訪問介面。

boot loader的概念。boot loader是一段固化在嵌入式系統目標系統rom(或者諸如flash等非易失性儲存器)中的一段程式,他的主要作用就是引導作業系統(這也是為什麼叫他boot lodaer 的原因)。

bsp,所謂的板級支援包類似於pc平台上的bios(basicinputoutput system,基本輸入輸出系統)。一般而言,bsp也是一段固化在嵌入式系統目標目標系統rom中的程式。

在unix系統中將檔案抽象為字元流(byte sream),所謂的檔案就是乙個可以輸入/輸出的字元流。裝置也可以被抽象為字元流,使用者對這個裝置的讀和寫可以抽象為對這個字元流的讀和寫,將所有對裝置的操作都抽象為對檔案的操作,這樣做的好處就是;

第一,將裝置和檔案統一有利於作業系統的管理,實際上很多的外圍的裝置天然的和檔案系統相關,比如磁碟驅動器,cf卡等,第二,不同的裝置被抽象為檔案,便於作業系統採用統一的方式管理不同的外為裝置。

中斷處理模組可能是裝置驅動中最重要的部分之一,因為裝置的非同步特性,作業系統不可能採用輪詢的方式,對裝置進行管理,採用中斷處理非同步事件是唯一的選擇。

將裝置的資料從硬體fifo中讀出來,並將資料存放到由裝置驅動管理的軟體接收緩衝區中,或者將需要傳送給硬體裝置資料從驅動管理的緩衝區寫到硬體傳送的fifo中;

如果是由於硬體裝置故障或者狀態變化引起的中斷,中斷處理程式需要處理這些問題;

在處理基本的資料接收和傳送工作之後,對於有作業系統的系統而言,中斷處理程式需要通過呼叫乙個系統呼叫的方式通知作業系統核心中斷的發生,如果中斷的發生啟用了作業系統中更高優先順序的任務,os核心將通過任務排程器將任務由當前任務切換到更高優先順序任務,

說明:並不是所有的外圍裝置驅動都需要中斷處理程式,某些裝置(如 lcd)通常情況下是不需要中斷處理的;

中斷的處理過程一般由硬體和軟體兩部分共同完成。實現的部分有:

中斷實現的兩種方式,硬體實現還要軟體實現方式的流程:

雖然現在的risc處理器的大多數指令可以在乙個週期內完成,但是依然存在一些特殊的指令必須在多個週期才能完成而這些指令執行期間cpu是不接受中斷請求的,比如arm指令中的ldm和stm兩類指令,這些指令是多裝宅多儲存指令。他們的執行時間取決於軟體程式設計師希望通過一條指令儲存多少資料,在最壞的情況下可能需要十幾個週期才能完成。

幾乎所有的處理器在相應中斷期間都是關閉中斷的,也就是說cpu相應某個中斷請求的時候,硬體會自動的將程式狀態字中的中斷使能位清除(arm處理器剛好相反在相應中斷時硬體會自動的在cpsr中設定一位禁止中斷位),硬體之所以這樣設計是為了防止cpu相應乙個中斷期間又進入另乙個中斷進而造成中斷現場儲存的混亂。總之預設情況下cpu相應中斷之後不會在接受新的中斷,也就是不支援中斷的巢狀,cpu只有從該中斷處理程式中退出之後才可能相應新的中斷,雖然,在cpu完成中斷現場保護工作之後,程式設計師可以通過軟體重新開啟中斷以接收中斷巢狀,但是在通常的情況下,作業系統的任務排程只能發生在外層中斷返回時,對於巢狀的中斷返回將不會發生在任務排程。

可重入函式和不可重入函式

可重入函式主要用於多工環境中,乙個可重入的函式簡單來說就是可以被中斷的函式,也就是說,可以在這個函式執行的任何時刻中斷它,轉入os排程下去執行另外一段**,而返回控制時不會出現什麼錯誤;而不可重入的函式由於使用了一些系統資源,比如全域性變數區,中斷向量表等,所以它如果被中斷的話,可能會出現問題,這類函式是不能執行在多工環境下的。

C語言教程(三)

主要普及c語言的基本語法,本文預設初看的人啥也不懂,如果有程式設計基礎請略過 下面來仔細看一下c編輯器預設給我們生成的 include int main 執行後可以在控制台看見 hello word於是可以做以下嘗試根據程式的變化來逐一了解 的含義 注釋printf hello word n inc...

C語言教程 迴圈

c語言中有2種最常用的迴圈語句 while迴圈 和for 迴圈。while迴圈 while loop while 表示式 程式塊還有乙個變種 do while迴圈,do while 表示式 只要while裡得到表示式是真的,就一直執行程式塊的語句。for迴圈 for loop for 表示式1 表示...

C語言教程 十 復合結構

一 結構體的定義和使用 前面我們已經討論過字元陣列與字串,字元指標也可以指向乙個字串,可以用字串常量對字元 指標進行初始化。例如 char str 這是對字元指標進行初始化。此時,字元指標指向乙個字串常量的首位址。結構體與陣列類似,都是由若干分量組成的,與陣列不同的是,結構體的成員可以是不同型別,可...