嵌入式复习
第一章課后習題
1. 簡要總結嵌入式系統的定義、由來、分類及特點(P6-11)
嵌入式系統是指嵌入于其他設備或系統中的計算機系統,它通常被用于控制、監視或執行特定的功能。嵌入式系統通常包括處理器、存儲器、輸入/輸出接口以及特定的軟件,用于滿足特定的應用需求。
嵌入式系統的由來可以追溯到20世紀60年代末,當時隨著集成電路技術的發展,微處理器的出現使得計算機系統能夠被嵌入到各種設備中。從此之后,嵌入式系統廣泛應用于汽車、家電、工業控制、醫療設備等各種領域。
嵌入式系統可以根據其用途和性能要求進行分類,包括實時嵌入式系統、嵌入式操作系統、網絡嵌入式系統等。根據應用領域的不同,嵌入式系統還可分為汽車嵌入式系統、工業控制嵌入式系統、消費類電子產品嵌入式系統等。
嵌入式系統的特點包括:穩定性和可靠性要求高,通常需要長時間連續運行;對資源的要求嚴格,包括處理器性能、存儲器容量、能耗等;針對特定應用需求進行優化,通常具有高度定制化;通常需要考慮實時性,特別是對于實時嵌入式系統;體積小巧、功耗低,適合嵌入在各種設備中。
2.歸納嵌入式系統的學習困惑,簡要說明如何消除這些困惑(P11-14)
學習嵌入式系統可能會導致以下困惑:
- 復雜的硬件和軟件交互:學習者可能會感到困惑,因為需要同時理解硬件和軟件之間的交互,并掌握底層系統編程的技能。
- 實時系統設計:理解和設計實時系統可能是一個挑戰,因為需要考慮時間約束、任務調度和響應性能。
- 多樣化的應用領域:嵌入式系統應用于多個領域,每個領域都有特定的要求和挑戰,這可能讓學習者感到困惑。
要消除這些困惑,可以采取以下方法:
- 學習適當的理論知識:深入理解計算機體系結構、嵌入式系統設計原理和實時系統原理等的基本概念,掌握底層硬件與嵌入式軟件之間的交互原理。
- 實踐項目經驗:通過參與實際的嵌入式系統項目,如基于微控制器的開發板實驗、傳感器控制系統設計等,積累項目經驗,加深對實際系統開發的理解。
- 學習指導:尋求嵌入式系統領域的專業指導和教學資源,可以通過參加課程、閱讀相關教材和與領域專家交流等方式來獲取知識。
- 深入研究應用領域:了解特定領域的嵌入式系統應用案例,如汽車電子、智能家居、工業自動化等,從實際應用中學習經驗和解決方案。
3.簡要歸納嵌入式系統的知識體系(P14-17)
- 計算機體系結構和硬件知識:理解處理器架構、內存管理、總線結構、外設接口等相關硬件知識。
- 嵌入式系統設計原理:包括嵌入式系統的設計原則、嵌入式系統的特點、實時操作系統的設計原理等。
- 實時系統理論:了解實時系統的概念、實時任務調度算法、實時操作系統的特點及設計方法。
- 嵌入式軟件開發:掌握嵌入式軟件開發的相關編程語言(如C、C++、匯編語言)、嵌入式操作系統(如FreeRTOS、uC/OS等)的使用和嵌入式軟件調試技術。
- 嵌入式系統架構:了解嵌入式系統的傳感器、執行器、通信接口等硬件組件的選擇和使用。
- 嵌入式系統通信協議:掌握常見的嵌入式系統通信協議,如UART、SPI、I2C、CAN等。
- 低功耗設計:了解嵌入式系統的低功耗設計原則和技術,以滿足嵌入式系統對功耗的要求。
- 嵌入式系統安全:了解嵌入式系統安全領域的相關知識,包括嵌入式系統安全威脅、安全設計原則、安全算法等。
- 實際應用領域:深入研究特定的應用領域,如汽車電子、智能家居、工業自動化等領域的嵌入式系統設計原則和技術。
4.簡要給出MCU的定義及典型內部框圖(P17)
MCU的基本含義是:在一塊芯片內集成了*處理器、存儲器、定時器/計數器及多種輸入輸出接口的比較完整的數字處理系統。
5.簡要比較CPU、MCU、MAP(P20、24)
- 計算能力:CPU通常具有較高的計算能力,適用于復雜的通用計算任務;MCU通常具有較低的計算能力,適用于對計算能力要求不高的實時控制任務;MPU介于兩者之間。
- 外圍設備集成:MCU通常在單芯片上集成了豐富的外圍設備,如模擬數字轉換器(ADC)、定時器、通信接口等,而CPU和MPU通常需要外部芯片支持。
- 成本和功耗:MCU通常具有低成本和低功耗的特點,適用于對成本和功耗有嚴格要求的場景;CPU和MPU通常具有較高的成本和功耗,適用于對性能要求較高的場景。
第二章課后習題
1.指令保留字簡表(P30)、偽運算符(P43)
2.馮諾依曼架構和哈佛架構
馮諾依曼架構:
- 馮諾依曼架構使用統一的存儲器來存儲指令和數據,指令和數據共用同一條總線傳輸。
- 這種結構的特點是指令和數據存儲在同一塊內存中,指令和數據采用相同的地址總線和數據總線進行傳輸。
- 馮諾依曼架構的優點是靈活,存儲器利用率高,但其缺點是在數據和指令并行傳輸時會有瓶頸,因此可能影響性能。
哈佛架構:
- 哈佛架構使用獨立的指令存儲器和數據存儲器,指令和數據使用不同的總線傳輸。
- 這種結構的特點是指令和數據分別存儲在不同的存儲器中,它們使用獨立的地址總線和數據總線進行傳輸。
- 哈佛架構的優點是可以同時進行指令和數據的讀取,因此有更好的并行性,能夠提高系統的性能。
3.說明全局變量、局部變量、常數和程序機器碼的存儲特征
1.全局變量,也稱為外部變量,使用靜態存儲方式保存,保存在內存的全局 存儲區中。在程序開始執行時給全局變量分配存儲區,程序行完畢就釋放。在 程序執行過程中它們占據固定的存儲單元,占用永久性的靜態存儲單元;
2.函數中的局部變量,如不專門聲明,都是動態地分配存儲空間的,數據存 儲在動態存儲區中,只有在所在函數被調用時才由系統動態在棧中分配臨時性 的存儲單元,在函數調用結束時就自動釋放這些存儲空間。有時希望函數中的 局部變量的值在函數調用結束后不消失而保留原值,這時就應該指定局部變量 為“靜態局部變量”,靜態局部變量屬于靜態存儲類別,在靜態存儲區內分配存 儲單元。在程序整個運行期間都不釋放。
3.常數保存在文字常量區中,這是一塊比較特殊的存儲區,他們里面存放的 是常量,不允許修改,程序結束后,由系統釋放。
4.程序機器碼保存在程序代碼區,用于保存函數體的二進制代碼。
4.M4微處理器有哪些寄存器?作用分別是什么(P31)
1)直接尋址
操作數來自存儲單元,指令中直接給出存儲單元地址。指令碼中顯示給出數據的位數,有字(4字節)、半字(2字節)、單字節三種情況。
2)寄存器尋址
寄存器尋址是指將操作數從寄存器中獲取,這種尋址方式適用于需要頻繁使用的數據和臨時變量。
3)立即數尋址
立即數直接編碼在指令中,該尋址方式主要適用于常量操作數。由于立即數直接編碼在指令中,指令長度相對較短,可以節省存儲器空間,提高執行效率。
4)偏移尋址及寄存器間接尋址
偏移尋址:偏移尋址是指將操作數的地址與偏移量相加來獲取最終的地址。偏移量可以是一個立即數或者是一個存儲在寄存器中的值。這種尋址方式適用于需要在操作數地址上進行相對偏移的情況。寄存器間接尋址:寄存器間接尋址是指將操作數的地址存儲在一個寄存器中,通過間接引用寄存器來獲取最終的地址。這種尋址方式適用于需要通過寄存器動態地引用內存地址的情況。
5.調用子程序是用B還是BL指令?請寫出返回子程序的指令
在 ARM 匯編語言中,用于調用子程序的指令通常使用 BL(Branch with Link)指令。這個指令會將返回地址保存在鏈接寄存器(LR)中,并跳轉到指定的子程序地址。
當子程序執行完畢需要返回時,可以使用 BX LR 指令來返回到調用子程序的地址。這條指令會跳轉到鏈接寄存器中保存的地址,實現了從子程序返回到調用子程序的過程。
6.舉例說明運算指令與偽運算符的本質區別
- 運算指令:
- 運算指令是由處理器直接執行的指令,用于進行算術運算、邏輯運算等操作。
- 例如,在 ARM 匯編語言中,
ADD指令用于執行加法操作,SUB指令用于執行減法操作,這些指令由處理器執行,會對寄存器或內存中的數據進行實際的算術運算。
- 偽指令(偽運算符):
- 偽指令并不是由處理器直接執行的指令,而是由匯編器處理的指令,用于定義符號、設置程序起始地址、預處理等。
- 例如,在 ARM 匯編語言中,
EQU偽指令用于定義符號常量,DCB偽指令用于定義字節型數據,這些指令并不由處理器執行,而是在匯編階段被轉換為實際的機器碼或數據。
第三章課后習題
1.中斷的定義是什么?什么是內核中斷?什么是非內核中斷?給出所學MCU芯片的中斷個數(P50)
中斷是指處理器在執行程序過程中,根據外部設備的請求或者其他特定事件發生而打斷當前程序執行的一種機制。當發生中斷時,處理器會立即停止當前執行的指令,保存當前狀態并轉去執行中斷服務程序,處理完中斷后再返回到被打斷的程序繼續執行。
內核中斷和非內核中斷是針對操作系統內核的中斷處理方式的概念:
- 內核中斷(也稱為特權模式中斷):
- 內核中斷是指在操作系統內核執行期間發生的中斷。內核擁有較高的優先級和特權級別,可以訪問系統資源和執行特權指令。內核中斷通常用于處理與操作系統核心功能相關的事件,如系統調用、時鐘中斷等。
- 非內核中斷(也稱為用戶模式中斷):
- 非內核中斷是指在用戶程序執行期間發生的中斷。用戶程序運行在較低的特權級別,無法直接訪問系統資源和執行特權指令。非內核中斷通常用于處理用戶程序與外部設備或其他用戶程序之間的交互,如IO中斷、定時器中斷等。
2.什么是芯片的硬件最小系統,它由哪幾個部分組成?簡要闡述各部分技術要點(P53-55)
芯片的硬件最小系統是指可使內部程序得以運行的、規范的、可復用的核心構件系統,由電源、晶振、復位、寫入調試器接口等組成。
-
電源及其濾波電路:用于提供足夠的電流容量,外接適當的濾波電容用于抑制電源波動,電源濾波電路可以改善系統的電磁兼容性、降低電源波動對系統的影響、增強電路工作的穩定性。
-
復位引腳:若復位引腳有效(低電平)則MCU復位,復位引腳內部的上拉電阻外部懸空則上電時引腳為低電平隨后為高電平。
-
晶振電路:提供計算機工作時需要的時間基準。
-
SWD接口引腳:芯片內部沒有程序時,需要用寫入器將程序寫入芯片,SWD接口提供最大的靈活性、實現程序的下載和調試功能。
3.若不用MCU芯片的引腳直接控制LED三色燈,給出MCU引腳通過三極管控制LED三色燈的電路
第四章課后習題
1.從寄存器角度對GPIO編程,GPIO的輸出有推挽輸出與開漏輸出兩個類型,說明其應用場合。基礎的GPIO構件中,默認是什么輸出類型。
- 推挽輸出(Push-Pull Output):
- 推挽輸出的GPIO引腳具有兩種狀態:高電平狀態和低電平狀態。
- 在高電平狀態時,輸出引腳連接到正電源(Vcc),提供高電平信號。
- 在低電平狀態時,輸出引腳連接到地,提供低電平信號。
- 推挽輸出適合驅動大部分邏輯電路和數字電路的輸入,也可以驅動絕大多數的顯示器件和LED。
- 開漏輸出(Open-Drain Output):
- 開漏輸出的GPIO引腳只能提供低電平信號,而不能提供高電平信號。
- 開漏輸出在輸出低電平時,輸出引腳為低電平,但在輸出高電平時,輸出引腳并不輸出高電平信號,而是處于高阻態,需要外部上拉電阻來提供高電平信號。
- 開漏輸出通常用于與其他器件共享總線的情況,如I2C總線,可以通過多個器件共享同一根總線,由于開漏輸出只負責輸出低電平,因此不會產生總線沖突。
在基礎的GPIO構件中,默認的輸出類型取決于特定的MCU,通常默認是推挽輸出。
2.從寄存器角度對GPIO編程,GPIO的輸出有輸出速度問題,為什么封裝基礎構件時,不把輸出速度作為形式參數?
- 靈活性和可移植性:將輸出速度作為形式參數會增加構件的復雜性,降低代碼的可讀性和可維護性。更靈活的做法是在具體使用時通過寄存器的設置來實現輸出速度的調整。這樣更好地適應了不同的應用場景和硬件平臺。
- 硬件依賴:輸出速度通常是受硬件設計的限制的,不同的芯片、不同的引腳,其輸出速度的定義和能力也是不同的。將輸出速度作為形式參數會使得構件的移植變得更加困難,需要針對不同的硬件平臺進行復雜的適配。
- 不同的功能需求:在實際的應用中,有些場景可能更加關注輸出速度,而有些場景可能并不那么重要。將輸出速度作為形式參數限制了構件在不同場景下的靈活性,增加了額外的開發和維護成本。
3.闡述GPIO的基本含義并給出GPIO構件的初始化函數原型
P64
P81-83
4.什么叫上拉電阻?它的作用是什么?如何選擇上拉電阻的阻值?在哪些情況下使用上拉電阻?(P65)
若MCU的某個引腳通過一個電阻接到電源上,這個電阻就被稱為上拉電阻。
上拉電阻的作用:
1、當 TTL 電路驅動 CMOS 電路時,如果電路輸出的高電 平低于 CMOS 電路的最低高電平(一般為 3.5V), 這時就需要在 TTL 的輸出端接 上拉電阻,以提高輸出高電平的值。
2、OC 門電路必須使用上拉電阻,以提高 輸出的高電平值。
3、為增強輸出引腳的驅動能力,有的單片機管腳上也常使用 上拉電阻。
4、在 CMOS 芯片上,為了防止靜電造成損壞,不用的管腳不能懸空, 一般接上拉電阻以降低輸入阻抗, 提供泄荷通路。
5、芯片的管腳加上拉電阻 來提高輸出電平,從而提高芯片輸入信號的噪聲容限,增強抗干擾能力。
6、提 高總線的抗電磁干擾能力,管腳懸空就比較容易接受外界的電磁干擾。
7、長線 傳輸中電阻不匹配容易引起反射波干擾,加上、下拉電阻是電阻匹配,有效的 抑制反射波干擾。
上拉電阻阻值的選擇原則包括:
1、從節約功耗及芯片的灌電流能力考慮應 當足夠大;電阻大,電流小。
2、從確保足夠的驅動電流考慮應當足夠小;電阻小, 電流大。
3、對于高速電路,過大的上拉電阻可能邊沿變平緩。綜合考慮以上三 點,通常在 1k 到 10k 之間選取。
在哪些情況下使用:一般作單鍵觸發使用時,如果 IC 本身沒有內接電阻, 為了使單鍵維持在不被觸發的狀態或是觸發后回到原狀態,必須在 IC 外部另接 一電阻。數字電路有三種狀態:高電平、低電平、和高阻狀態,有些應用場合 不希望出現高阻狀態,可以通過上拉電阻或下拉電阻的方式使處于穩定狀態。
5.閱讀如下 GPIO 構件初始化函數模型,并將空格內容補充完整(P84)
第五章課后習題
1.簡述嵌入式硬件構件概念及嵌入式硬件構件分類(P94)
嵌入式硬件構件是將一個或多個硬件功能模塊、支撐電路及其功能描述封裝成一個可重用的硬件實體,并提供一系列規范的輸入輸出接口。
根據接口之間的生產消費關系,接口可分為供給接口和需求接口兩類。根據所擁有接口類型的不同,硬件構件分為核心構件、中間構件、終端構件三類。核心構件只有供給接口,沒有需求接口,只為其他硬件構件提供服務而不接受服務,如芯片硬件的最小系統;中間構件既有供給接口,也有需求接口,可以提供服務也可以接受服務,如電源控制構件、232電平轉換構件;終端構件只有需求接口,它只接受其他構件提供的服務,如LCD構件、LED構件、鍵盤構件。
2.簡述核心構件、中間構件、終端構件的含義及設計規則(P95)
- 核心構件(Core Component):
- 核心構件是軟件系統中最基本和最核心的構件,負責實現系統的基本功能和架構,是整個系統的基礎。核心構件通常是不依賴于其他構件的,是其他構件的提供者。
- 設計規則:核心構件應該盡可能簡單、穩定、高內聚,低耦合,避免包含過多的細節和實現,同時需要提供良好的接口和抽象,以便其他構件可以方便地使用。
- 中間構件(Intermediate Component):
- 中間構件位于核心構件和終端構件之間,起到連接和協調的作用,或者是對核心構件的進一步封裝。中間構件既提供服務給其他構件,也會依賴于其他構件提供的服務。
- 設計規則:中間構件應該具有良好的靈活性和適應性,能夠適應不同的使用場景,同時也需要符合高內聚、低耦合的設計原則,以便于維護和擴展。
- 終端構件(Terminal Component):
- 終端構件是軟件系統中最終的用戶接口或者是提供服務的終端實現。終端構件通常是依賴于其他構件的,作為用戶實際使用的部分。
- 設計規則:終端構件需要具有良好的用戶體驗、可用性和性能,同時也需要與其他構件保持良好的交互和協作,以便實現系統的整體目標。
3.簡述嵌入式底層驅動構件的基本內涵(P97)
簡稱底層驅動構件或硬件驅動構件,是直接面向硬件操作的程序代碼和函數接口的使用說明。規范的底層驅動構件由頭文件和源程序文件構成,頭文件應該是底層驅動構件簡明并且完備的使用說明。
4.在設計嵌入式底層驅動構件時,其對外接口函數設計的基本原則有哪些(P100-101)
封裝性、描述性、可移植性、可復用性的基本要求,層次化、易用性、魯棒性及對內存的可靠實用原則。
5.舉例說明在什么情況下使用宏定義
-
定義常量:宏定義可以用來定義程序中的常量,比如定義數值常量、錯誤碼常量、標志位等。例如:
#define PI 3.14159 #define ERROR_FILE_NOT_FOUND 1 #define FLAG_ACTIVE 0x01 -
簡化代碼:宏定義可以用來簡化代碼,尤其是對于一些復雜、重復的操作或者表達式。比如定義一個計算立方的宏:
#define CUBE(x) ((x) * (x) * (x))這樣就可以通過
CUBE(5)來獲得 5 的立方,避免了重復輸入(5) * (5) * (5)。 -
調試輸出:宏定義可以用來實現調試輸出功能,通常在調試階段開啟,發布版本時關閉。例如:
#ifdef DEBUG #define DEBUG_PRINT(x) Serial.print(x) #else #define DEBUG_PRINT(x) #endif -
平臺相關代碼:宏定義可以用來區分不同的平臺或者操作系統,從而實現跨平臺的代碼編寫。例如:
#ifdef _WIN32 // Windows平臺下的特定代碼 #endif #ifdef __linux__ // Linux平臺下的特定代碼 #endif -
條件編譯:宏定義可以用來進行條件編譯,根據不同的條件編譯不同的代碼。例如:
#define FEATURE_A #ifdef FEATURE_A // Feature A 相關的代碼 #else // 其他情況下的代碼 #endif
6.舉例說明底層構件的移植方法
假設我們有一個基于ARM Cortex-M系列的嵌入式系統,使用Keil MDK開發的UART底層驅動構件,現在需要將這個UART驅動移植到一個新的硬件平臺,例如基于Raspberry Pi的Linux系統。
- 確定平臺差異:首先需要了解目標平臺與原始平臺之間的硬件和操作系統的差異,例如,Raspberry Pi可能使用不同的ARM芯片,具有不同的外設和I/O接口,運行不同的Linux內核等。
- 修改底層驅動:在了解了平臺差異后,需要修改底層驅動的代碼,以適應新的硬件和操作系統環境。這可能涉及到對寄存器配置、時鐘設置、中斷處理等方面的修改。
- 重寫硬件相關部分:如果目標平臺的硬件架構與原始平臺有較大差異,可能需要重寫底層驅動的硬件相關部分,以滿足新平臺的特定要求。
- 適配操作系統:如果原始平臺使用了特定的操作系統接口,而目標平臺具有不同的操作系統,可能需要對驅動進行適配,確保其能夠在新的操作系統上正常工作。
- 編譯與調試:對修改后的底層驅動進行編譯,并將其集成到新的系統中。然后進行調試,確保驅動在新平臺上能夠正確工作。
7.驅動程序的開發在嵌入式系統中具有重要地位,根據自己的理解解釋底層驅動構件開發的基本思想(P110)
嵌入式底層驅動構件時直接面向硬件操作的程序代碼及使用說明。規范的底層驅動構件由頭文件及源程序文件構成,頭文件是底層驅動構件簡明且完備的使用說明,即在不查看源程序文件情況下,就能夠完全使用該構件進行上一層程序的開發,這也是設計底層驅動構件最值得遵循的原則。
在設計實現驅動構件的源程序文件時,需要合理設計外接口函數與內部函數。外接口函數供上層應用程序調用,其頭注釋需要完整表述函數名、函數功能、入口參數、函數返回值、使用說明、函數適用范圍等信息,以增強程序的可讀性。在具體代碼實現時,嚴格禁止使用全局變量。
第六章課后習題
1.闡述 UART 的基本知識要素。設波特率為 9600,使用NRZ格式的8個數據位、沒有校驗位、1 個開始位、1 個停止位,傳輸100K 字節的文件最少需要多少時間?
UART(Universal Asynchronous Receiver/Transmitter)是一種常見的串行通信協議,常用于嵌入式系統和外部設備之間的通信。它有以下基本知識要素:
- 波特率(Baud Rate):指的是每秒傳輸的比特數,即傳輸速率。在這個問題中,波特率為 9600,表示每秒傳輸9600位數據。
- 傳輸格式:在這個問題中,使用 NRZ(Non-Return-to-Zero)格式,即非歸零傳輸格式,每個數據位以高電平或低電平表示,沒有中間狀態。
- 數據位:每個數據幀包括 8 位數據。
- 校驗位:在這個問題中,并沒有校驗位。
- 開始位和停止位:每個數據幀包括 1 個開始位和 1 個停止位,用于標識數據幀的開始和結束。
數據量:100KB*1024=102400字節;
位數:10位
102400*10/9600 = 106.67s
2.利用PC的USB和MCU之間進行串行通信,為什么要進行電平轉換?
- 電壓兼容性:PC的USB接口通常使用的是5V邏輯電平(或者3.3V),而許多MCU采用的是3.3V或更低的邏輯電平。如果直接連接這兩者,可能會導致信號電平不匹配,造成通信錯誤或者對MCU的損壞。
- 保護MCU:直接連接PC的USB信號到MCU,可能會存在電壓過高的風險,對MCU產生損害。通過進行適當的電平轉換,可以保護MCU免受過高電壓的影響。
- 確保信號質量:進行電平轉換可以確保信號傳輸的質量和穩定性,避免傳輸中產生噪音,提高通信的可靠性。
3.簡要給出ARM Cortex-M4中斷編程的基本知識要素,以串口通信的接受終端編程為例加以說明
- 中斷向量表:在ARM Cortex-M4中,中斷向量表是一個保存中斷處理函數地址的數據結構。當一個中斷發生時,處理器會根據中斷號在中斷向量表中查找對應的中斷處理函數的地址,并跳轉到該地址處執行中斷處理。
- 中斷處理函數的注冊與編寫:需要編寫串口接收中斷的處理函數,并將其注冊到中斷向量表中對應的位置。在處理函數中,通常會讀取串口接收寄存器中的數據,并進行相應的處理。
- 中斷優先級設置:ARM Cortex-M4支持多級中斷優先級,可以通過設置中斷優先級來決定不同中斷的處理順序。在串口接收中斷編程中,通常要考慮串口接收中斷與其他中斷的優先級關系,以確保數據的有效接收。
- 中斷使能:在進行中斷編程時,需要在代碼中顯式地啟用或禁用相應的中斷,以確保處理器能夠響應特定的中斷事件。
以串口通信的接收中斷編程為例,假設我們要在ARM Cortex-M4上實現串口接收功能,可以按照以下步驟進行中斷編程:
- 編寫串口接收中斷處理函數:在中斷處理函數中,讀取串口接收寄存器中的數據,并進行相應的處理,例如存儲收到的數據或者觸發其他相關操作。
- 將中斷處理函數的地址注冊到中斷向量表中。這通常是通過在鏈接腳本或者中斷向量表文件中設置中斷處理函數的地址來實現的。
- 設置串口接收中斷的優先級,確保其能夠及時響應。可以通過配置中斷控制器的寄存器來設置中斷的優先級。
- 在初始化代碼中,啟用串口接收中斷。這通常是通過特定的寄存器或者相關控制寄存器來實現的。
4.簡述制作UART構件的基本過程,說明UART構件中對引腳復用處理方法的優缺點
- 確定串行通信接口:確定UART的物理接口,包括數據線(TX和RX)、時鐘線(可選)等。這通常會涉及到選擇合適的引腳以及確定信號電平(如TTL、RS-232等)。
- 設計數據緩沖區:為接收和發送的數據設計緩沖區,用于暫存接收到的數據和等待發送的數據。通常需要考慮緩沖區的大小、讀寫指針的管理等。
- 實現控制邏輯:實現UART的控制邏輯,包括波特率發生器、數據格式設置、中斷處理、數據收發控制等。這部分的具體實現會根據UART的規格和功能需求而有所不同。
- 集成到整個系統中:將UART構件集成到整個系統中,通常需要考慮與其他構件的接口和協作,例如與處理器核的接口、時鐘和復位信號的管理等。
優點:
- 節省引腳資源:通過引腳復用,可以在系統中重復使用某些引腳,從而節省了硬件資源。
- 靈活性:引腳復用可以使得同一引腳在不同的工作模式下承擔不同的功能,提高了系統的靈活性和可擴展性。
缺點:
- 復雜性:引腳復用可能導致硬件設計和連接的復雜性增加,需要仔細管理不同模式下的引腳狀態和功能。
- 可能引起干擾:不同的工作模式可能會導致引腳的信號特性(如電氣特性、驅動能力等)發生變化,可能會引起干擾或影響系統的穩定性。
5.詳細論述計算機中斷處理的基本過程(P129)
1.中斷請求:當某一中斷源需要CPU為其服務時,它會向CPU發出中斷請求信號。中斷控制器獲取中斷源硬件設備的中斷向量號,并通過識別的中斷向量號,并通過識別的中斷向量號將對應硬件中斷源模塊的中斷狀態寄存器中的“中斷請求位”置位,以便CPU分辨中斷請求種類。
2.中斷采樣:CPU在每條指令結束時,會檢查中斷請求或系統是否滿足異常條件。大多CPU專門在指令周期中使用了中斷周期。在中斷周期中,CPU將會檢測系統中是否有中斷請求信號。若有,則CPU將會暫停當前運行的任務,轉而響應中斷事件;否則繼續當前任務。
3.中斷響應與中斷處理:中斷響應的過程是由系統自動完成的,在這個過程中,CPU會查找中斷源所對應的模塊中斷是否被允許,若被允許則響應,中斷響應的過程要求CPU將當前環境的上下文保存于堆棧匯總, 通過中斷向量號找到中斷服務程序去運行ISR,在中斷結束后再將該RAM地址中的數據恢復到CPU內部寄存器中,恢復現場。
6.給出 ARM Cortex-M 內核定時器 Systick 基本的工作機制,并根據如下代碼 給出初始化步驟
基本工作機制:
1.梳理初始化流程,systick定時器被捆綁在嵌套向量NVIC中,定時器工作后,計數器開始-1計數,到達0后,COUNTFLAG置1,發出中斷請求,計數器開始新一輪級數;
2.確定初始化參考及其范圍,確定時鐘源,當VAL=0時產生中斷,要確定中斷時間間隔;
3.中斷優先級設置函數;
4.縮寫systick_init函數,函數檢查;禁止systick,清除計數器;設置時鐘源,重載寄存器;systick優先級;允許中斷并使能該模塊。
步驟:
參數檢查——設置前禁止systick,清除當前計數器——設置時鐘源,重載寄存器——設定優先級——允許中斷,使能該模塊。
第七章課后習題
1.使用完全軟件方式進行時間極短的延時,為什么要在使用的變量前加上volatile前綴?
volatile關鍵字告訴編譯器,該變量的值可能會在意想不到的時間被改變,因此編譯器在優化時不應該對該變量的讀取和寫入進行優化。在時間極短的延時中,往往需要依賴循環內部某個變量的值,如果沒有對該變量使用volatile,編譯器可能會對循環進行優化,導致延時的效果無法達到預期。
2.簡述可編程定時器的主要思想
- 寄存器編程:可編程定時器通常具有多個寄存器,用于存儲計數器的初始值、計數器當前值、控制寄存器等。通過編程這些寄存器,可以設置定時器的工作模式、計數范圍、時鐘源等屬性。
- 中斷處理:可編程定時器通常具有產生中斷的功能。通過編程設置定時器的中斷使能、中斷標志位等,可以實現在計時器達到預設值時產生中斷,從而實現對時間的精確控制和觸發特定事件。
- 計時功能:可編程定時器可以通過編程設置計數器的初值和計數范圍,以及選擇合適的時鐘源,實現對時間的精確測量和計時功能。這種計時功能對于實時系統、定時觸發任務、PWM(脈沖寬度調制)等應用具有重要意義。
- 靈活性和可定制性:可編程定時器通常具有豐富的控制寄存器和工作模式選擇,可以根據具體需求進行靈活的定時器功能定制。
3.從編程角度,給出基本定時功能的編程步驟
- 初始化定時器:首先需要初始化定時器,包括選擇合適的時鐘源、設置計數器的初值和計數范圍等。這通常涉及到對定時器的各個寄存器進行編程設置。
- 啟用定時器中斷:如果需要在計時器計數到特定值時觸發中斷來實現定時功能,需要設置相應的中斷使能位,并編寫對應的中斷服務程序。
- 啟動定時器:在初始化之后,啟動定時器,讓其開始計數。定時器開始計數后,將按照設定的時鐘源和計數范圍進行計數。
- 中斷服務程序:如果使用定時器中斷來實現定時功能,需要編寫中斷服務程序。在中斷服務程序中通常需要清除定時器的中斷標志位,并進行相應的定時處理。
- 定時處理:根據需要,可以在定時器中斷服務程序中進行相應的定時處理,如更新時間、觸發事件、執行特定任務等。
- 停止定時器(可選):在需要停止定時器計數時,可以調用相應的函數停止定時器的計數。
4.簡述PWM的基本含義及主要技術指標的含義,舉例說明主要用途(P148)
用途:
1.利用PWM為其他設備產生類似時鐘的信號(控制一定頻率的閃光燈)
2.利用PWM控制輸入某個設備的電流感電壓(直流電流,使其轉變與平均輸入電壓的大小成正比)
3.利用PWM控制命令字編碼(發送不同寬度脈沖代表不同含義)
5.確定初始化參數及范圍(P140)
6.什么輸出比較?主要用途是什么?(P158)
第八章課后習題
1.簡要闡述Flash在線編程的基本含義及用途
Flash在線編程是指通過編程器或者相應的軟件工具,對嵌入式系統中的Flash存儲器進行在線編程,即在系統運行狀態下對Flash進行寫入、擦除等操作。Flash在線編程常見的用途包括:
- 調試和測試:在嵌入式系統開發過程中,需要對程序進行調試和測試。通過Flash在線編程,可以方便地更新和修改程序代碼,以驗證系統功能和進行調試。
- 運行時參數配置:在系統運行過程中,有時需要根據特定的應用需求對某些參數或配置進行調整。通過Flash在線編程,可以實現在系統運行狀態下動態地修改和更新這些參數或配置,而無需重新燒錄整個程序。
- 固件更新:在產品發布后,可能需要對嵌入式系統的固件進行更新。通過Flash在線編程,可以在不中斷系統運行的情況下,將新的固件程序寫入系統的Flash存儲器,以實現固件的在線更新。
- 數據存儲:某些嵌入式系統會使用Flash存儲器作為數據存儲介質。通過Flash在線編程,可以實現對數據的實時更新和存儲,而無需停止系統運行或重啟。
2.簡述A/D轉換的主要知識要素。若A/D轉換的參考電壓為m伏,要區分n毫伏的電壓,則采樣位數至少為多少位?
1.轉換精度;
2.單端輸入與差分輸入;
3.軟件濾波問題;
4.物理量回歸問題;
5.量化誤差,轉換速度,A/D參考電壓等;
\[\frac{m(V)}{n(MV)} = ? \] \[2^{\alpha} < ? < 2^{\beta} \]至少為\(\beta\)位。
P177練習
3.使用PWM波的方式可以完成一些場景下的DAC功能嗎?
使用PWM(脈沖寬度調制)波形可以在某些場景下模擬數字模擬轉換器(DAC)的功能。DAC用于將數字信號轉換為模擬信號,而PWM波形通過調整脈沖寬度來實現對模擬信號的模擬,從而在一定程度上實現DAC的功能。以下是一些必要描述:
- 脈沖寬度調制(PWM):PWM是一種周期性方波信號,其脈沖寬度隨著輸入信號的變化而調整。通過控制脈沖的占空比,可以實現對輸出信號的模擬。
- 重構濾波器:在PWM輸出的方波信號通過一個重構濾波器后,可以通過濾波去除高頻成分,從而得到一個接近模擬信號的輸出。
- 離散性:需要注意的是,使用PWM完成DAC功能產生的模擬信號是離散的,而非連續的。因此在應用中需要考慮到這種離散性對系統的影響。
第九章課后習題
1.舉例說明同步通信和異步通信的主要區別
同步通信:
- 在同步通信中,數據是按照時鐘信號進行傳輸的。發送方和接收方需要有相同的時鐘信號來保證數據的傳輸和接收的同步性。
- 發送方和接收方的時鐘信號需要嚴格同步,以確保數據傳輸的正確性。任何時鐘偏差都可能導致數據傳輸錯誤。
- 典型的同步通信包括SPI(串行外設接口)和I2C(Inter-Integrated Circuit)等通信協議。
異步通信:
- 在異步通信中,數據的傳輸是通過幀之間的起始位和停止位進行同步的,而不依賴于時鐘信號。
- 異步通信中,發送方和接收方的時鐘信號是獨立的,不需要嚴格同步。數據的傳輸速率可以是不同的,不需要精確的時鐘同步。
- 典型的異步通信包括串行通信中的UART(通用異步收發傳輸)和RS-232等通信協議。
2.簡述SPI數據傳輸過程
- 選擇從設備:SPI總線上可以連接多個從設備,需要通過片選信號(Chip Select)來選擇要通信的從設備。
- 傳輸格式:SPI通信通常采用主從結構,一個主設備與一個或多個從設備進行通信。在數據傳輸中,主設備控制通信的時序和數據傳輸。
- 時鐘信號:SPI使用時鐘信號來同步數據傳輸。時鐘信號的極性和相位可以通過控制寄存器進行配置。
- 數據傳輸:
- 主設備將一定數量的數據放入發送緩沖寄存器。
- 當傳輸開始時,主設備開始產生時鐘脈沖。每個時鐘脈沖都導致發送緩沖寄存器中的一個比特被傳輸到從設備,并且接收到從設備的一個比特。
- 同時,從設備也在其發送緩沖寄存器中放置要傳輸的數據。當從設備接收到主設備的數據時,從設備的數據也被傳輸到主設備。
- 數據傳輸完成后,主設備停止時鐘信號,結束本次數據傳輸。
3.說明在SPI通信中如何設定時鐘極性和相位(P195-196)
在SPI通信中,可以通過設置SPI控制寄存器來設定時鐘極性(CPOL)和時鐘相位(CPHA)。這些設置可以通過SPI控制寄存器中的特定位來實現,具體的設置方式可能會有所差異,取決于所用的具體芯片或微控制器。一般來說,以下是針對CPOL和CPHA的設置方法:
- 時鐘極性(CPOL):
- CPOL決定時鐘信號在空閑狀態時的電平。當CPOL=0時,時鐘信號在空閑狀態下為低電平;當CPOL=1時,時鐘信號在空閑狀態下為高電平。
- 時鐘相位(CPHA):
- CPHA決定數據采樣的時機。當CPHA=0時,數據在時鐘信號的第一個跳變沿(上升沿或下降沿)進行采樣;當CPHA=1時,數據在時鐘信號的第二個跳變沿進行采樣。
在大多數SPI控制器中,可以通過設置SPI控制寄存器中的特定位來配置CPOL和CPHA。例如,對于某些微控制器或外圍設備,可能會有類似以下的寄存器位設置方式:
- 時鐘極性(CPOL):可以在SPI控制寄存器中設置CPOL位(比如在控制寄存器的第0位),具體設置為0或1來選擇時鐘信號的空閑狀態電平。
- 時鐘相位(CPHA):可以在SPI控制寄存器中設置CPHA位(比如在控制寄存器的第1位),具體設置為0或1來選擇數據采樣的時機。
4.簡述I2C總線的數據傳輸過程
- 起始條件:
- 主設備發送起始條件,即SCL(時鐘線)為高電平時,SDA(數據線)從高電平轉為低電平。這表示I2C總線上的數據傳輸即將開始。
- 地址和讀/寫位:
- 主設備發送目標從設備的7位地址,加上一個讀/寫位(通常是R/W=0表示寫,R/W=1表示讀)。
- 如果從設備存在并且已準備好接收數據,則會返回一個應答信號。如果沒有響應,則總線處于“忙碌”狀態。
- 數據傳輸:
- 主設備在發送模式下,發送要寫入的數據到從設備。這個數據可以是命令、控制字節或實際數據。
- 如果是讀取模式,則主設備會發送讀取命令到從設備,并等待從設備返回數據。
- 停止條件:
- 數據傳輸完成后,主設備發送停止條件,即SCL為高電平時,SDA從低電平轉為高電平。這表示I2C總線上的數據傳輸結束。
第十章課后習題
1.闡述CAN通信的發送與接收的基本原理
發送:
- 消息構建:發送方將要發送的數據打包成CAN消息,包括消息ID、數據長度、數據內容和CRC校驗等信息。
- 傳輸準備:發送方首先檢查總線空閑,然后根據優先級選擇要發送的消息,并在一個CAN幀中發送消息。
- 傳輸數據:發送方通過將正常電平信號轉換為電壓來改變總線狀態,從而將CAN消息發送到總線上。CAN將消息分為不同的幀,并在總線上廣播以使所有節點都可以接收到。
接收:
- 接收準備:所有的CAN節點都會監聽總線上的消息。接收方會首先檢查消息的ID以及數據長度,以確定是否與自身有關。
- 消息過濾和識別:接收方對接收到的消息進行篩選和識別,只接收與自身相關的消息,其他消息會被忽略。
- 數據接收:當接收方檢測到總線上有符合自身條件的消息時,會將消息內容解析出來并進行處理。
基本原理:
- CAN通信采用差分信號傳輸,利用總線上的兩根線來傳輸信息,這樣可以有效地抗干擾。
- CAN使用非常嚴格的消息優先級和許可機制來決定哪個節點可以發送消息,這種機制使得CAN可以實現高效的多節點通信。
- CAN通信協議具有很強的錯誤檢測和錯誤恢復能力,能夠在數據傳輸中發生錯誤時進行自動糾正和重傳。
2.CAN總線為什么要使用總線仲裁,簡要闡述總線仲裁的基本過程(P236)
CAN總線使用總線仲裁是為了解決多個節點同時發送消息時可能發生的沖突。在總線仲裁過程中,CAN總線上的多個節點會根據消息的優先級進行競爭,以確定哪個節點可以成功地發送消息。
基本過程如下:
- 節點準備發送消息時,首先會監測總線狀態,檢查是否有其他節點正在發送消息。
- 如果總線上有其他消息正在發送,節點會等待當前消息發送完成,進入一個“偵聽”狀態。
- 如果總線是空閑的,節點會立即發送它的消息。同時,所有其他節點也會檢測到這個消息的發送,并進行消息的接收和解析。
- 在消息的發送過程中,每個節點都會不斷地發送自己的消息標識符(ID)和消息的優先級。所有節點都會同時監聽總線上的這些信息。
- 如果在總線上有多個節點同時發送消息,由于CAN總線是基于優先級的,擁有最高優先級的消息會勝出,并且其他節點會意識到沖突,并停止發送消息。
3.舉例給出基于構件的CAN應用程序基本編程步驟
-
包含必要的頭文件:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <signal.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/can.h> #include <linux/can/raw.h> -
打開CAN設備并初始化:
int s; struct sockaddr_can addr; struct ifreq ifr; s = socket(PF_CAN, SOCK_RAW, CAN_RAW); strcpy(ifr.ifr_name, "can0"); ioctl(s, SIOCGIFINDEX, &ifr); addr.can_family = AF_CAN; addr.can_ifindex = ifr.ifr_ifindex; bind(s, (struct sockaddr *)&addr, sizeof(addr)); -
構建CAN消息并發送:
struct can_frame frame; frame.can_id = 0x123; // 消息ID frame.can_dlc = 8; // 消息長度 strcpy((char *)frame.data, "Hello!"); // 消息數據 write(s, &frame, sizeof(struct can_frame)); // 發送消息 -
接收CAN消息并處理:
struct can_frame frame_rcv; while(1) { read(s, &frame_rcv, sizeof(struct can_frame)); // 讀取消息 printf("Received: %s\n", frame_rcv.data); // 處理接收的消息 }
4.給出DMA的基本含義,哪種情況下會用到DMA(P246)
DMA(Direct Memory Access,直接內存存取)是計算機系統中的一種數據傳輸技術,允許外部設備(如硬盤驅動器、網絡接口卡、圖形顯示卡等)直接與系統內存進行數據傳輸,而無需通過*處理器(CPU)的干預。DMA可以提高數據傳輸的效率,釋放CPU的負擔,減少對CPU的干預,從而提高系統的并行處理能力。
DMA適用于以下一些情況:
- 大容量數據傳輸:當需要大量數據在外部設備和內存之間進行傳輸時,使用DMA可以顯著提高數據傳輸的效率,而不會占用CPU大量的時間和資源。
- 高速數據傳輸:一些外部設備(如高速網絡接口卡、高速存儲設備等)需要在內存和設備之間以非常高的速率進行數據傳輸,這時使用DMA可以有效地提升傳輸速度。
- 數據流:一些需要持續不斷地進行數據傳輸的應用場景,如音頻、視頻處理等,使用DMA可以更好地滿足對數據傳輸的實時性要求,減少對CPU的干預。
5.給出位帶操作的基本含義,哪種情況下會用到位帶操作
位帶操作是一種在微控制器和嵌入式系統中常見的操作,在位帶操作中,可以直接通過地址訪問特定位的值,而不需要進行讀取-修改-寫入的操作。這種操作可以使得對特定位的讀寫操作更加高效,并且可以簡化對特定位進行控制和狀態檢測的實現。
位帶操作通常用于以下情況:
- 對特定寄存器或寄存器中的特定位進行原子性的操作,從而避免了在多線程或中斷處理時的競爭條件。
- 在需要對特定標志位進行快速設置或清除的場景中,比如在處理外部事件和中斷時,可以利用位帶操作直接對標志位進行設置或清除。
在嵌入式系統中,位帶操作通常用于對外設寄存器的位進行控制、對狀態位進行快速檢測和設置、對寄存器中的控制位進行原子性的修改等操作。通過使用位帶操作,可以提高對特定位進行訪問和控制的效率,并且可以確保對位的操作是原子性的,從而提高了系統的穩定性和可靠性。
第十一章課后習題
1.如何給一個應用程序增加看門狗功能?什么階段可以添加看門狗功能?
-
了解硬件或軟件看門狗的特性:首先,需要了解目標平臺所支持的看門狗類型和功能。
-
初始化并配置看門狗:在應用程序的初始化階段,需要對看門狗進行初始化和配置。這可能涉及設置看門狗的定時器、喂狗(kick the dog)等操作。硬件看門狗通常需要通過特定的寄存器配置,而軟件看門狗可能需要調用特定的API進行初始化。
-
喂狗:在應用程序的關鍵階段或循環中,需要定期喂狗,以防止看門狗因為未及時喂狗而啟動重啟操作。這通常需要以特定的時間間隔重置看門狗的定時器。
-
錯誤處理:應用程序需要實現適當的錯誤處理機制,以便在出現故障或異常時能夠正常重啟系統。
-
測試和調試:對增加了看門狗功能的應用程序進行全面的測試和調試,確保看門狗能夠在系統故障時正確地重啟系統。
是在應用程序的早期階段就考慮增加看門狗功能,因為考慮到看門狗的特性可能會影響系統的整體架構和設計。
2.看門狗復位屬于冷復位還是熱復位,冷熱復位后再編程方面有何區別
看門狗復位屬于熱復位。熱復位是指通過硬件電路或專門的監控電路來實現的復位方式,它不受軟件的影響,發生復位時,會清除處理器的狀態并恢復到初始狀態。
在編程方面,冷啟動和熱啟動主要區別在于系統的初始化狀態和程序的執行路徑。當系統經歷冷復位時,通常會進行全面的初始化,包括清零所有寄存器、初始化系統時鐘、初始化外設等。而當系統經歷熱復位時,通常會保持一些關鍵設置和數據的狀態,以便快速地恢復到之前的運行狀態。
對于看門狗復位,熱復位通常意味著系統會在發生復位時盡可能地保持一些關鍵設置和數據的狀態,以便盡快地恢復到原先的運行狀態。在編程方面,需要注意處理好復位后的初始化工作,包括重新初始化寄存器、時鐘和外設,并根據需要進行恢復程序的執行狀態。
3.如何實現主動復位,如何記錄芯片熱復位類型及復位次數?
主動復位意味著系統中的某個模塊或代碼段可以通過特定條件觸發復位。例如,通過特定的軟件命令、硬件信號或外部輸入來觸發系統的復位。以下是關于實現主動復位和記錄芯片熱復位類型及復位次數的一般方法:
實現主動復位:
- 軟件觸發:在軟件中編寫特定的代碼或函數,以便在滿足特定條件時觸發系統復位。這可以通過對系統復位寄存器或控制寄存器進行寫操作來實現。
- 硬件觸發:使用外部硬件電路或信號來觸發系統復位。這可以通過硬件引腳、看門狗定時器、中斷請求等方式來實現。
記錄芯片熱復位類型及復位次數:
- 復位類型:可以在系統初始化的時候讀取復位狀態寄存器或特定的復位原因寄存器,以了解上一次復位的原因。這些寄存器通常由芯片廠商提供。
- 復位次數:可以使用非易失性存儲器(如EEPROM或Flash存儲器)來記錄復位次數。每次復位時,將復位次數加一并保存到非易失性存儲器中。
總結
- 上一篇: 利用腾讯快捷登录协议截取 QQ Clie
- 下一篇: GeoServer发布地图服务(WMS、