嵌入式八股文總結(ARM篇)

? ? ? ? 嵌入式開發中使用的通常是ARM芯片,在此總結一些面試常問的問題,希望可以和大家一起進步。(持續更新中……)

目錄

1. 介紹一下I2C的傳輸時序

2.?I2C為什么加上拉電阻,為什么使用開漏輸出

3. I2C能接多少個設備,由什么決定的

4. 什么是I2C死鎖,怎么解決

5. I2C讀取寄存器失敗應該如何排查問題??

6.介紹下SPI的工作模式

7. SPI可以去掉哪根線

8. SPI讀取寄存器失敗應該如何排查問題

9. 簡單對比下SPI和I2C

10. 什么是交叉編譯,為什么要使用交叉編譯

11. 嵌入式基于ROM運行和基于RAM運行有什么區別

12. RS485數據異常應該如何排查問題

13. 什么是回調函數,為什么要使用回調函數

14. STM32的啟動流程

15. STM32程序跑飛或者卡死怎么調試

16. 關于STM32的ADC外設的一些問題

17. STM32程序的組成、存儲和運行

18. 介紹一下OSI七層模型

19. 介紹一下TCP/IP 四層、五層模型

20. 介紹一下數據的封裝與拆封

21. 介紹一下TCP和UDP的區別

22. 介紹一下什么是三次握手的四次揮手

23.什么是馮諾依曼結構和哈佛結構,區別是什么

24.Cache是什么,有什么用

25.ARM處理器的工作模式

26.ARM處理器內部寄存器介紹

27.棧幀指針FP、堆棧指針SP、程序計數器PC和鏈接寄存器LR

28.PC指針真的指向當前正在執行指令的地址么?

29.講講中斷和異常的區別

30.?硬中斷和軟中斷的區別


1. 介紹一下I2C的傳輸時序

? ? ? ? 這個問題在面試時經常會問到,務必掌握,這里總結一下。I2C有兩根數據線:SCL時鐘線和SDA數據線,SDA和SCL在空閑時都處于高電平狀態,圖示如下:

(1)起始信號:SCL為高電平時,拉低SDA表示起始信號,如①所示;

(2)停止信號:SCL為高電平時,拉高SDA表示停止信號,如②所示;

(3)應答信號:發送器每發送一個字節數據,會釋放SDA數據線,在第9個時鐘接收器會回復一個ACK應答信號(低電平表示應答),如③所示;

(4)數據有效性:SCL高電平期間SDA數據線必須保持穩定,只有在SCL低電平期間,SDA才可以變化,并且在SCL上升沿之前就應該準備好;

(5)重復起始信號:當主機想開始一個新的傳輸,但不想釋放總線的使用權,那就可以發出一個新的起始信號,也就是重復起始信號。使用重復起始信號可以避免兩次數據傳輸間的重新確定通訊設備的過程,從而節省時間和開銷。重復起始信號時序圖如下所示,SDA在SCL低電平時拉高,然后SCL拉高,這樣兩根信號線就處于空閑狀態了,然后主機重新將SDA拉低,則表示發送一個重新起始信號。

(6)I2C讀寫時序描述

寫時序:(需要注意的是,I2C從機設備地址通常是7位,有的從機地址為10位,10位的不常用?,這里就不介紹了)

①? 主機先向從機發送一個起始信號,表示開始傳輸數據;

② 接著主機會發送一字節從機地址,前7位為從機地址,第8位是讀寫位,0表示寫數據,1表示讀數據;

③ 總線上的從機接收到這8bit數據后,會和自己的設備地址進行比較,若匹配成功,從機則會向主機發送一個ACK應答信號;

④ 主機接收到應答信號后才會繼續發送數據,發送數據的順序為高位在前,低位在后

⑤ 主機向從機寫數據時通常是寫兩字節數據,先發送一字節數據指定要寫入的寄存器地址,等待從機回復一個ACK應答;

⑥ 接著主機再發送一字節數據指定要寫入的數據,等待從機回復ACK應答;

⑦? 最后從機發送一個停止信號表示通訊結束。

????????上面是寫一個數據的情況,如果要寫入多個數據也比較簡單,也是每次發送一字節數據,等待從機回復一個應答信號,當數據發送完成后發送一個停止信號就行了,示意圖如下:

讀時序:(前三步和寫時序相同,這里也只介紹7位從機地址的情況)

①? 主機先向從機發送一個起始信號,表示開始傳輸數據;

② 接著主機會發送一字節從機地址,前7位為從機地址,第8位為讀寫位,這里讀寫位為0,因為要先發送從機地址(0表示寫數據,1表示讀數據);

③ 總線上的從機接收到這8bit數據后,會和自己的設備地址進行比較,若匹配成功,從機則會向主機發送一個ACK應答信號;

④ 主機發送一字節數據指定要讀取的寄存器地址,等待從機回復一個ACK應答信號;

④ 接著主機重新發送一個起始信號和從機地址,此時地址的讀寫位為1,表示要開始讀數據了

⑤ 從機向主機回復一個ACK應答后,就開始向主機寄存器中的數據,每讀取一字節數據,主機都要給從機發送一個ACK應答;

⑥ 數據讀取完成后,主機向從機回復一個NACK非應答,表示通訊結束;

⑦? 最后從機發送一個停止信號表示通訊結束。

2.?I2C為什么加上拉電阻,為什么使用開漏輸出

????????I2C總線支持總線上有多個主設備和多個從設備,用推挽輸出的話可能出現設備間短路的情況,所以使用開漏輸出。因為開漏輸出無法輸出高電平,所以使用上拉電阻實現輸出高電平的能力。開漏輸出還能實現線與的作用,多個主機搶占總線進行仲裁時會用到線與的特性。

3. I2C能接多少個設備,由什么決定的

? ? ? ? 理論上可以掛載127個設備,由I2C地址決定。因為設備地址為7位(也有10位的),也就是2^7 = 128個地址,但是廣播地址0X00不能用,剩下127個地址,對應127個設備。I2C協議沒有限制總線上的最大設備數,但是規定了總線電容不得超過400pF,所以實際上I2C總線上的設備數推薦不超過8個。

注:規定總線電容是因為I2C外部由兩個上拉電阻,電阻和總線電容會產生RC延時效應,總線電容越大,那信號的邊沿就會越平緩,傳輸速度較快時可能會導致信號質量出現問題。

4. 什么是I2C死鎖,怎么解決

? ? ? ? 最近面試被問到了這個問題,之前竟然沒聽說過,這里總結一下。

(1)I2C死鎖時的現象

????????SCL一直為高,SDA一直為低。(注意,只有硬件I2C會出現死鎖,軟件模擬I2C不會出現死鎖的現象

(2)I2C死鎖的原因

????????一般有兩種情況會導致死鎖,一種是從設備向主機回復ACK應答時,主機意外復位,而從機不會自動復位;另一種是從設備向主機發送數據位是0時,主機意外復位,而從機不會自動復位。這兩種情況其實本質一樣:就是當從設備將SDA數據線拉低時,主機意外復位,但從機不會自動復位,就會導致I2C死鎖。因為主機意外復位后SCL仍為高電平,而從設備不會自動復位,I2C規定只有在SCL低電平時,SDA才允許變化,所以從設備就會一直輸出低電平;而主機檢測到SDA為低電平后,會認為當前總線已經被占用。此時從設備在等待主機將SCL拉低,而主機在等待從設備釋放SDA數據線,兩者互相等待,也就是造成了I2C死鎖。

(3)常見的解決I2C死鎖的方法

① 選擇帶復位功能的從設備;

② 在I2C總線上添加一個總線恢復設備,當檢測到SDA數據線被拉低超過指定的時間時,就在總線上產生9個SCL時鐘,使從設備完成數據發送,進而釋放SDA,從死鎖中恢復出來(這個總線恢復設備一般需要具備編程功能,一般可以使用單片機來實現,也可以使用具有I2C死鎖恢復的緩沖器);

③ 主機檢測到SDA被拉低超過指定時間后,主動復位從設備,前提是總設備具有復位引腳,并且主機可以控制從設備的復位引腳;

④ 主機檢測到SDA被拉低超過指定時間后,推送9個SCL時鐘,使從設備完成數據發送,進而釋放SDA,從死鎖中恢復出來。

5. I2C讀取寄存器失敗應該如何排查問題??

1)檢查數據線和時鐘線是否通過上拉電阻上拉到電源,數據線和時鐘線是否連接正確

2) 檢查設備地址是否正確,總線上的設備地址是否沖突

3) 檢查設備供電是否正常,設備是否關閉寫保護

4) 檢查通信速率是否過高,是否超過了設備支持的通信速率

5) 可通過示波器檢查通信時序是否正確,是否符合I2C協議的規范? ?

6.介紹下SPI的工作模式

? ? ? ? SPI是一種高速的全雙工同步的通信總線,具有四種工作模式,由時鐘相位和時鐘極性來選擇SPI的工作模式,介紹如下。

時鐘極性(CPOL):空閑狀態下,也就是未進行數據傳輸時,時鐘線CLK的電平狀態。若空閑狀態下,時鐘線SCL為高電平,則CPOL = 1;時鐘線SCL為低電平,則?CPOL = 0

時鐘相位(CPHA):傳輸數據時,數據在時鐘線CLK的上升沿或下降沿對數據進行采樣。若數據在時鐘線SCL的奇數邊沿采樣,則CPHA = 0;若數據在時鐘線SCL的偶數邊沿采樣,則CPHA = 1

? ? ? ? 根據CPOL和CPHA不同的狀態,實現了4種SPI模式,介紹如下:

SPI 工作模式?CPOLCPHASCL 空閑狀態采樣邊沿采樣時刻
000低電平?上升沿?奇數邊沿
101低電平?下降沿偶數邊沿
210高電平下降沿奇數邊沿
311高電平上升沿?偶數邊沿

? ? ? ? 對應的時序圖如下,其中使用最多的是模式 0 和模式 3。

7. SPI可以去掉哪根線

? ? ? ? SPI有四根線:SCLK、MISO?、MOSI、CS。當只需要主機向從機發送指令,而不需要從機回復數據時,MISO信號線就可以去掉;當主機只想讀取從機的數據,而不需要向從機發送指令時,MOSI就可以去掉;如果只有一個從機,那么CS片選線也可以不要,直接將其固定為有效電平,一直處于使能的狀態。需要注意的是,時鐘線不能去掉,發送數據和接收到數據時都需要使用時鐘線進行數據采樣。

8. SPI讀取寄存器失敗應該如何排查問題

1) 檢查信號線是否連接正確,片選線是否使能、是否接線過長,是否接觸不嚴

2) 通信速率是否過高,是否超過了設備支持的通信速率

3) 數據線外接可能導致數據異常,比如用杜邦線來連接主機和從設備,可能會受到外界的干擾,導致數據錯亂

4) 檢查CPOL和CPHA是否配置正確,如果主機和從機的CPOL和CPHA配置相反,仍然可以正常收發數據,但可能導致數據移位

5) 如果數據錯位,可以嘗試更改SCK信號線的上下拉

6)如果出現數據錯亂或者通信錯誤,可使用示波器查看通信波形,進行排查

9. 簡單對比下SPI和I2C

① I2C是串行同步半雙工的通信協議,SPI總線是串行同步全雙工的通信協議;

② I2C有兩根數據線,SPI有四根數據線,相應的,I2C的讀寫時序就要比SPI要復雜一些;

③ I2C通過從機地址來選擇通訊設備,SPI通過片選線來選擇從機設備;

④ I2C比SPI傳輸速率慢,I2C在標準模式下傳輸速率可達100kbit/s, 在快速模式下可達400kbit/s, 在高速模式下可達3.4Mbit/s,SPI的傳輸速率并沒有一個官方的標準,通常能達到甚至超過10 Mbit/s,已知有的器件的SPI已達到50Mbit/s;

⑤ I2C支持多主多從,而SPI總線上只能有一個主設備;

????????綜上,SPI總線適用于對速度要求較高且連接設備數量較少的應用場景,而I2C總線適用于連接設備數量較多且速度要求相對較低的應用場景。

10. 什么是交叉編譯,為什么要使用交叉編譯

? ? ? ?交叉編譯是指在一中計算機平臺中編譯出可以在另一種平臺上運行的程序,比如在X86架構的計算機上編譯出32位ARM架構的程序,我們稱對應的編譯器為交叉編譯器。交叉編譯在嵌入式系統開發中應用非常廣泛,因為嵌入式設備通常資源有限,處理器性能不足以運行我們要使用的編譯器,甚至有的嵌入式設備連操作系統都沒有,自然就無法運行編譯器了,所以我們通常選擇交叉編譯的方式生成目標平臺的程序。

11. 嵌入式基于ROM運行和基于RAM運行有什么區別

1)運行速度:基于ROM運行速度相對較慢,因為基于ROM運行會涉及到把變量和程序從flash拷貝到RAM的過程;

2) RAM資源:基于ROM運行的可用RAM資源比基于RAM運行時的資源要多,因為基于RAM運行時所有的程序和數據都保存在了RAM中;

3)程序重定位:基于RAM運行時一般會將代碼從外部存儲介質加載到RAM中,加載過程涉及到重定位的操作;

4) 數據安全性:基于ROM運行更安全,因為ROM是只讀存儲器,程序無法被惡意修改; ? ?

12. RS485數據異常應該如何排查問題

1) 檢查波特率是否配置正確,是否過高

2) 檢查時鐘是否正確,比如電路板上的晶振是否與推薦電路的晶振頻率一樣

3) 檢查RS485收發器芯片終端引腳A、B之間的電阻值是否為120Ω,有些USB轉RS485模塊上已經在引腳間加了120Ω電阻了,如果再加一個電阻會導致阻抗失配,從而導致數據異常

4) 檢查附近是否有強磁干擾,若有則需要加隔離保護或遠離干擾源

5)?檢查RS485的雙絞線屏蔽層是否接地

13. 什么是回調函數,為什么要使用回調函數

? ? ? ? 回調函數就是通過函數指針調用的函數,回調函數不是由函數的實現方直接調用,而是在特定的事件或某條件發生時由另一方調用的,用于對該事件或條件進行響應。使用回調函數可以把調用者和被調用者分開,調用者不必關心誰是被調用者,只需要知道存在一個具有特定原型和限制條件的被調用函數,使得程序設計更加靈活。? ? ?

14. STM32的啟動流程

? ? ? ? STM32有三種復位方式:上電復位、硬件復位和軟復位,復位后ARM內核會設置堆棧大小、初始化中斷向量表。從0X0000 0000處取出堆棧指針MSP的初始值,從0X0000 0004中取出程序計數器指針PC的初始值,PC指針指向的就是中斷向量表中的復位中斷函數,之后內核就會從PC指向的地址讀取指令執行了。事實上,STM32可以通過設置BOOT0和BOOT1引腳來選擇啟動模式,如下:

? ? ? ? 系統時鐘的第四個上升沿鎖存BOOT引腳的值,通過選擇不同的啟動模式,可將對應的地址映射到0X0000 0000和0X0000 0004這兩個地址上。在復位中斷服務程序中會跳轉到SystemInit函數中進行配置系統時鐘,然后調用__main函數初始化用戶堆棧,最后調用main函數。

(啟動流程主要由啟動文件實現的,在ARM匯編語言基礎-CSDN博客中對STM32的啟動文件進行了詳細分析。)

15. STM32程序跑飛或者卡死怎么調試

? ? ? ? STM32程序跑飛可能有以下幾種原因:

1) 中斷處理不當:打開某中斷后沒及時響應和清理中斷標志,導致頻繁進入中斷,造成程序死機的假象。

2) 堆棧溢出:若程序代碼量較大,程序中存在大量的函數調用和局部變量,可能導致堆棧溢出,使程序跑飛。

3) 內存越界:比如訪問數組越界可能會意外修改系統寄存器中的數據,導致程序失控。

4) 看門狗:如果開啟看門狗但沒在適當的時間喂狗,會導致程序頻繁重啟。

5) 晶振失效、野指針、外部電磁干擾等。

? ? ? ? 找到程序跑飛的位置:

情況一:程序邏輯執行不正常,但程序沒有報錯,中斷可以正常運行。

解決方法:使用調試器在線調試,找到程序卡死的位置;在程序中添加打印或點燈判斷程序卡死位置。檢查是不是因為while()等循環體的判斷條件錯誤,導致死循環了。

情況二:程序邏輯執行不正常,部分中斷不能正常運行,但程序沒有報錯。

解決方法:大概率就是中斷服務函數中沒有及時清除中斷標志,導致頻繁進入中斷,造成假死的現象。可以將不能運行的中斷的優先級調整為最高優先級,看是否能正常運行,如果能運行了就說明程序卡死在中斷程序中了,檢查相應的中斷函數就行了。

情況三:程序報錯了,直接卡死。

解決方法:此時應該是發生了操作錯誤,比如數組越界,除數為0等,此時程序會自動跳轉到HardFault_Handle函數中解決方法可以查看這篇文章:http://t.csdnimg.cn/sbFxZ。

(除此之外,還可能遇到其他導致程序卡死的情況,之后遇到了會在此進行補充。)? ? ?

16. 關于STM32的ADC外設的一些問題

? ? ? ? 在項目中通常會使用ADC來采集傳感器數據,這里簡單回顧下ADC的相關內容。STM32的ADC是12位逐次逼近型的模數轉換器,用來將引腳上連續變化的模擬電壓轉換為內存中存儲的數字變量。有18個輸入通道,分別為16個外部通道和2個內部通道(內部溫度和內部參考電壓)。先看下STM32的ADC外設框圖。

????????ADC有兩種觸發方式:軟件觸發和硬件觸發,軟件觸發就是在程序中調用一條代碼觸發ADC轉換,硬件觸發就是④中的這些觸發源。圖中②為輸入通道,分別對應不同的GPIO引腳,用來輸入從外部(如傳感器)采集到的模擬量;ADC可以將多個通道以任意順序進行轉換,轉換時可以選擇兩種轉換類型,也就是③中的規則通道和注入通道,介紹如下:(平常用的最多的是規則通道)

規則通道:最多16個輸入通道進行轉換,但是對應的規則數據寄存器只有一個,也就是說每轉換完成一個輸入通道后,就要及時將數據從規則數據寄存器中讀走,否則就會被下一個通道轉換結果覆蓋,所以通常配合DMA一起使用。

注入通道:最多4個輸入通道進行轉換,對應的注入數據寄存器有四個,所以就不用關心數據被覆蓋的問題了。

區別:除了轉換通道的數量不同外,注入通道的優先級比規則通道的優先級高,當規則通道轉換過程中,如果啟動注入通道,則注入通道會打斷規則通道的執行,注入通道轉換完成后才會繼續執行規則通道,示意圖如下:

????????實際項目中,通常使用規則通道進行ADC轉換,因為規則通道只有一個數據寄存器,所以通常和DMA進行配合使用。注意,只有ADC1和ADC3有DMA功能,ADC2沒有DMA功能,但可以在雙ADC模式與ADC1共同使用DMA傳輸。

DMA:DMA是直接存儲器讀取,用來實現外設和存儲器、存儲器和存儲器之間的高速數據搬運,不需要CPU的干預,節省了CPU資源。STM32F1系列的DMA有12個獨立可配置的通道(DMA1有7個通道,DMA2有5個通道),每個通道支持軟件觸發和特定的硬件觸發。以STM32的DMA1為例,若想使用DMA搬運ADC1的結果,就需要開啟ADC1的DMA輸出,如下所示。

????????ADC有兩種轉換模式:單次轉換模式和連續轉換模式,單次模式下只進行一次轉換,連續轉換模式下,本此轉換完成后會馬上啟動下一次轉換。當采集多路傳感數據時,可采用ADC掃描模式+DMA的方式,如下所示。

? ? ? ? 開啟ADC轉換后,這7個通道依次進行AD轉換,然后將轉換結果存儲到ADC_DR寄存器中,同時觸發DMA請求,DMA就會馬上將數據搬運到目標地址中,我們通常會定義一個數組來保存數據,并且要設置DMA的目的地址自增,以免數據被覆蓋。

(這里只介紹了ADC和DMA的大致內容,用來進行簡單回顧,具體的代碼編寫就不展示了,看江科大吧)

最后介紹幾個常見的面試問題

1) 你使用的ADC分辨率是多少,如何提高ADC的精度

? ? ? ? 我使用的是STM32F103,F1系列只支持12位分辨率的ADC,F4系列可配置?12 位、10 位、8 位或 6 位分辨率。可以通過濾波電路減少噪聲和干擾,軟件上使用濾波算法進行濾波,常見的濾波算法有中值濾波、加權平均濾波法、最小二乘法等。若長時間使用ADC,需要進行定期校準和校正。

2)?ADC的通道數是多少?

????????STM32F103有18個ADC通道,分別為16個外部通道和2個內部通道(內部溫度和內部參考電壓)。

3) ADC的采樣頻率是多少?

????????STM32F103的ADC最大的轉換速率為 1Mhz,也就是轉換時間為 1us(在 ADCCLK=14M,采樣周期為 1.5 個 ADC 時鐘下得到),不要讓 ADC 的時鐘超過 14M,否則將導致結果準確度下降。

(ADC的問題先總結這些吧,面試問到其他問題的話會在此補充)

17. STM32程序的組成、存儲和運行

? ? ? ? 使用Keil編譯完程序后,會打印出如下信息,程序占用的空間,介紹如下:

Code:程序的代碼域,也就是編譯生成的機器指令,存放在flash中;

RO-data:只讀數據域,也就是程序中的常量,程序不能修改其內容,這些區域被存儲在flash中,如const定義的變量就是典型的RO-data;

RW-data:可讀可寫數據域,指初始化為非0值的全局變量,程序可以修改其內容,程序運行時RW-data會常駐在RAM中;

ZI-data:0初始化數據,也就是未初始化或初始化為0值的全局變量,程序剛運行時會將這些數據全部初始化為0,之后就和RW-data一樣常駐在在RAM中;除此之外,程序中的堆棧空間也是屬于ZI-data區域的,這些空間都會被初始值化為0值。

程序運行時占用flash空間的大小:RO Size = Code + RO Data

程序運行時占用RAM空間的大小:RW Size = RW Data + ZI Data

燒寫程序時占用flash空間的大小:ROM Size =?Code + RO Data +?RW Data

? ? ? ? 可見,在程序文件中并沒有為ZI Data分配空間,這是因為ZI Data都是0,只要在程序運行前將其所在的區域都初始化為0就可以了,從而節省了flash的存儲空間。下面介紹STM32程序運行時的存儲狀態,如下圖所示:

? ? ? ??由于PC機和ARM的CPU架構不同,所以程序運行時的存儲位置也是不同的,x86構架的PC機的CPU是基于馮諾依曼體系的,程序運行時會將程序從硬盤提取到RAM中運行,CPU從RAM中讀取程序和數據。由于單片機的RAM資源有限,所以其CPU架構基本都是哈佛體系的,也就是程序和數據分來存儲,程序運行時CPU直接從flash中讀取程序,從RAM中讀取數據。程序開始運行時,內核會直接從flash中讀取代碼,并且將RW Data從flash搬運到SRAM中,并且添加ZI Data,ZI Data段內存都被初始化為0,之后才正式開始執行主程序。

18. 介紹一下OSI七層模型

???????OSI 七層模型是國際標準化組織(ISO)制定的一個用于計算機或通信系統間網絡互聯的標準體系,一般稱為 OSI 參考模型或七層模型。OSI將計算機網絡通信協議劃分為物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層這七個不同層次,每一層負責不同的功能,這種模型有助于在不同的系統之間進行通信時,更好地理解和管理網絡通信的過程。介紹如下:

應用層:應用層是OSI模型中最高、最靠近用戶的一層,為用于提供應用接口,也為用戶直接提供各種網絡服務。常見的網 絡協議有HTTP、FTP、TFTP、SMTP、SNMP、DNS、TELNET、HTTPS、POP3、DHCP。

表示層:表示層用于向應用層提供數據的編碼和轉換功能,以確保當前系統的應用層發送的數據能被另一個系統的應用層識 別。該層可以提供一種標準表達形式,將計算機內部的多種數據格式轉換成通信中采用的標準表示形式。此外, 數據壓縮/解壓縮和加密/解密(提供網絡的安全性)也是表示層可提供的功能之一。

會話層:會話層用于建立、管理和終止表示層實體間的通信會話,該層的通信由不同設備中的應用程序間的服務請求和響應 組成。將不同實體的表示層之間的連接稱為會話,會話是屬于軟件層面的,允許不同機器上的用戶之間建立會話 關系。會話層的作用就是組織、協調會話中兩個進程間的通信,并對數據交換進行管理。

傳輸層:傳輸層建立了主機端到端的連接,定義了傳輸數據的協議端口號,以及端到端的流控和差錯校驗。該層的作用就是 為上層協議提供端到端的可靠和透明的數據傳輸服務,包括差錯校驗處理和流控等問題。我們通常說的,TCP、 UDP 協議就工作在這一層,端口號即是這里的“端”。

網絡層:網絡層用于邏輯地址尋址,實現不同網絡之間的路徑選擇。本層通過 IP 尋址來建立兩個節點之間的連接,為源端 發送的數據包選擇合適的路由和交換節點,以確保數據能夠正確無誤地按照地址傳送給目的端的運輸層。網絡層 也就是通常說的IP 層。該層包含的協議有:IP(Ipv4、Ipv6)、ICMP、IGMP 等。

數據鏈路層:數據鏈路層接收來自物理層的原始比特流,將其封裝成數據幀后傳送到上一層,并會檢測和糾正傳輸中出現的 錯誤。同時,也負責將來自上層的數據幀拆裝為比特流,轉發到物理層,還負責處理接收端發回的確認幀的信息,以便提供可靠的數據傳輸。

物理層:物理層的主要功能是利用傳輸介質為數據鏈路層提供物理連接,實現比特流的透明傳輸,盡可能屏蔽具體傳輸介質 和物理設備的差異,使數據鏈路層不必考慮網絡傳輸介質的類型。實際上,網絡傳輸信號的傳輸是通過物理層實 現的,物理層規定了物理設備標準、電平、傳輸速率等,通過物理介質傳輸比特流。常用設備有(各種物理設備) 集線器、中繼器、調制解調器、網線、雙絞線、同軸電纜等,這些都是物理層的傳輸介質。

網絡層

說明

應用層

為用戶提供各種網絡服務接口。

表示層

進行數據處理,如編碼/解碼、加密/解密、壓縮/解壓縮等。

會話層

建立、管理、終止應用程序間的會話。

傳輸層

為兩臺主機進程之間的通信提供通用的數據傳輸服務,包括差錯校驗、流控等。

網絡層

邏輯地址尋址,實現數據在不同網絡間的路徑選擇。

數據鏈路層

幀編碼/幀解碼,進行硬件地址尋址,差錯校驗等功能。

物理層

建立、維護和斷開物理連接,透明地傳輸比特流。

上面的內容比較多,下面舉個例子理解一下:

????????應用層可理解為人機交互界面,比如在微信發送一句話:“你好”,表示層會將這兩個字翻譯成機器碼,同時對數據進行加密壓縮等操作;會話層檢測到有數據要傳輸時,會找到數據接收方并與其建立會話關系;傳輸層可理解為同一個軟件的兩個端口,我打開的微信軟件是一個端口,對方也必須使用微信才能接收到我發送的數據;傳輸層準備好后就可以進行數據傳輸了,但全國的微信用戶非常多,要想將數據準確的發送給對方,就可通過網絡層提供的IP地址實現尋址,并選擇最優路徑,實現準確的數據傳輸;網絡層接收到數據后需要繼續往下傳輸到數據鏈路層,數據鏈路層將數據幀解碼成比特流,并會進行差錯校驗等操作,最后傳輸到物理層,網絡傳輸信號其實是通過物理層實現的,數據到達物理層后會變成信號進行傳輸。當數據達到對方主機后,會執行一個逆向過程:物理層接收到信號后,依次向上傳輸,最后到達應用層,微信頁面顯示接收到的數據:“你好”。

其他帖子(http://t.csdnimg.cn/kbf5t)找到記憶口訣,如下所示:

19. 介紹一下TCP/IP 四層五層模型

????????TCP/IP模型是OSI模型的簡化版本,TCP/IP五層模型中,將OSI最上面的三層(應用層、表示層和會話層)合并成了一個應用層;TCP/IP四層模型是在五層模型的基礎上將數據鏈路層和物理層合并為網路接口層。在實際應用中使用的是四層模型,TCP/IP五層模型是專門為了介紹網絡原理而設計的。

20. 介紹一下數據的封裝與拆封

????????我們在進行網絡通信時,需要數據包在不同網絡設備之間傳輸。這個過程就需要對數據包進行封裝與解封裝,如下所示:(左封裝、右拆封)?

????????用戶發送數據時,數據從應用層依次向下傳遞,在傳遞給傳輸層之前會先使用相關協議對數據進行封裝,如MQTT、HTTP 等協議,其實就是在數據前加一個頭部;同樣,傳輸層也會使用相關協議在數據前加上一個頭部,如TCP、UDP協議等;網絡層接收到數據后會在數據前加上IP頭部,然后將數據傳遞給數據鏈路層;數據鏈路層會對數據進行最后一次封裝,以使用以太網接口為例,會對數據加上以太網頭部,最后將數據交給網卡;網卡硬件設備將數據轉換成電平信號發送出去。數據的接收過程與發送過程正好相反,依次解析數據前的頭部,最后將數據傳遞給應用層,對應的就是數據的拆封過程。

21. 介紹一下TCP和UDP的區別

1)連接性:TCP是面向連接的協議,傳輸數據前需要進行三次握手,輸出傳輸完成后需要進行四次揮手,并且TCP是全雙工的,即數據可以在兩個方向上同時傳輸。而UDP是一種無連接、不可靠的協議,傳輸數據時不需要建立連接,發送方可以直接發送數據,接收方可以隨時接收數據。

2)可靠性:TCP是一種可靠的協議,不怕數據丟包、亂序。TCP協議通過建立連接、序號機制、數據校驗、超時重傳、流量控制、擁塞控制等機制保證數據的可靠傳輸。而UDP沒有這些機制,它只是簡單地實現從一端主機到另一端主機的數據傳輸,并不確保數據正確、完整、有序地到達目的地。

3)通信模式: TCP通常用于一對一通信,也就是只有一個發送方和一個接收方。而UDP可實現一對多、多對多通信,因此可用于實現廣播和組播功能。

4)傳輸速率:由于TCP傳輸數據時需要建立連接,并且需要一些機制保證數據傳輸的可靠性,所以相比之下TCP的傳輸效率較低。

5)報文大小:因為TCP提供可靠傳輸,所以數據報文的頭部中會包含一些序列號、控制好等一些控制信息。而UDP的報文頭部中只包含源端口、目標端口等一些必要的控制信息。所以相比之下TCP的報文會大一些。

22. 介紹一下什么是三次握手的四次揮手

????????為了保證客戶端和服務器端的可靠連接,TCP建立連接時必須要進行三次握手,目的是為了確認雙方的接收能力和發送能力是否正常。最開始的時候客戶端和服務器都是處于CLOSED關閉狀態,由客戶端發起建立連接的請求,服務器會時刻監聽、等待客戶端的連接,示意圖如下所示。

1)?第一次握手:客戶端將報文標志位SYN置1,隨機產生一個序號值seq=J保存在序號字段里,指明客戶端準備連接服務器的端口,數據發送給服務器后,客戶端進入 SYN_SENT 狀態,等待服務器端確認。

2)?第二次握手:服務器接收到報文后,若檢測到標志位 SYN=1 ,則知道客戶端在請求建立連接,服務器會將TCP報文標志位SYN和ACK都置1,確認號為ack=J+1,產生一個隨機序號值 seq=K,將該數據包發送給客戶端已確認連接請求,此時服務器進入 SYN_RCVD 狀態。

3)?第三次握手:客戶端接收到確認報文后,會檢查確認號ack是否為J+1、ACK是否為1,若檢查通過則將標志位ACK置1,ack=K+1,再將該數據包發送給服務器端,服務器會檢查ack是否為K+1、K是否為1,若正確則成功建立連接,客戶端和服務器端會進入 ESTABLISHED 狀態。

????????三次握手完成后,客戶端與服務器端之間就可以開始傳輸數據了,雙方會得到彼此的窗口大小、序列號等信息,傳輸TCP報文時,每個TCP報文首部的SYN標志位都會被置0,因為SYN標志位只用于發起連接。四次揮手是指關閉TCP連接的過程,當客戶端和服務端需要關閉 TCP 連接時,雙方總共需要發送4個數據包已確認斷開連接。在 socket 編程中,這一過程由客戶端或服務端任一方執行 close 來觸發,示意圖如下所示。

1)?第一次揮手:斷開TCP連接時,雙方都要單獨進行關閉。當數據發送完成后,客戶端會將報文標志位FIN置1,序號seq=M,M為前面已經傳送過來的數據的最后一個字節的序號,將報文發送給服務器后,客戶端會進入 FIN_WAIT_1 (終止等待1)狀態。

2)?第二次揮手:服務器接收到客戶端發送的FIN標志位置1的報文后,會向客戶端發送一個ACK=1的報文,確認號ack= seq+1,表示同意客戶端的關閉請求。報文發送給客戶端后,服務器進入CLOSE-WAIT (關閉等待)狀態。客戶端接收到服務器的確認請求后,會進入FIN-WAIT-2(終止等待2)狀態。

3)?第三次揮手:服務器將最后的數據發送完畢后,會向客戶端發送一個FIN報文段請求關閉TCP連接,之后進入LAST-ACK(最后確認)狀態,等待客戶端的確認。

4)?第四次揮手:客戶端接收到服務器發送的FIN報文后,會向服務器發送一個ACK報文,之后進入 TIME_WAIT(時間等待) 狀態。服務器接收到ACK報文后就關閉連接,但此時TCP連接還未終止,客戶端等待2MSL(最長報文壽命)后依然沒有收到回復,則證明 Server 端已正常關閉,最后客戶端才會關閉連接。

23.什么是馮諾依曼結構和哈佛結構,區別是什么

馮諾依曼結構:也叫普林斯頓結構,特點是程序中的指令和數據混合存儲,存儲在同一塊外部存儲器的不同物理地址上,共享同一總線,程序運行時再把指令和數據加載到內存中。優點是:結構簡單、易于設計和實現且成本較低;缺點是:指令和數據共享總線,會導致吞吐量受限,影響性能。應用場景:常用于對成本敏感、對處理速度要求不高的場景,如X86、ARM7、MIPS等處理器使用的是該結構。

哈佛結構:特點是程序中的指令和數據是分開獨立存儲的,每個存儲器都獨立編址、獨立訪問,各自有自己的總線。優點是:指令和數據可以在一個時鐘周期內進行并行訪問,避免了總線沖突,提高效率。指令存儲器通常為ROM只讀存儲器,可防止程序被意外修改,提高了安全性。缺點是:結構復雜,設計和實現的難度較大,成本較高。應用場景:常用于對處理速度和實時性較高的場景,如數字信號處理器(DSP)、單片機(如8051系列單片機)等處理器使用的是該結構。

混合結構:隨著處理器技術的更新迭代,CPU的工作頻率越來越高,可達到GHz級別,而內存RAM的訪問頻率一般為MHz級別(目前的DDR4、SDRAM的訪問頻率也達到了GHz級別)。這會拖慢CPU的效率,所以現代的ARM SOC芯片通常采用混合結構:即CPU內部采用哈佛結構,外部采用馮諾依曼結構。具體來說,SOC內部引入了Cache機制,通過指令Cache和數據Cache來緩存指令和數據,CPU通過不同的總線訪問兩種Cache,可實現對指令和數據進行并行操作。SOC外部采用馮諾依曼結構,指令和數據混合存儲在同一存儲區,共享外部存儲器。(Cache其實就是靜態隨機訪問存儲器SRAM,其訪問速度介于CPU和DRAM之間,是CPU與內存間的高速緩沖存儲器)

24.Cache是什么,有什么用

作用:隨著技術的發展,CPU的工作頻率越來越高,可達到GHz級別,而內存的訪問頻率一般為MHz級別(目前DDR4 ?SDRAM也可達到GHz級別)。Cache其實就是靜態隨機訪問存儲器SRAM,其運行速度介于CPU和內存DRAM之間,是在CPU與內存間插入的一組高速緩沖存儲器,用來解決兩者速度不匹配帶來的瓶頸問題

原理:CPU從內存讀取數據時,會一次性讀取一片數據緩存到Cache中,下次CPU讀取數據時,會先到Cache中檢查要讀取的數據是否存在,若存在,則稱為緩存命中(Cache Hit),CPU就直接從Cache中讀取數據,若數據不存在,則稱為緩存未命中(Cache Miss),CPU就重新到內存中讀取數據,并重新緩存從該地址開始的一片數據到Cache中。CPU向內存寫數據與讀數據類似,會先寫到Cache中,然后CPU會根據一些特殊標志位選擇合適的時間將數據寫入到內存中。

多級Cache:CPU從Cache讀取數據時,緩存命中的確可以提高效率,但若緩存未命中,則CPU就需要到內存中讀取數據,并重新刷新數據到Cache中,此過程比較耗時。有如下兩種改進方法:(1)增大Cache的容量來提高緩存命中的概率,但會增加成本,占用很大的芯片面積,導致芯片發熱量增加,所以CPU附近的一級Cache通常只有幾十K字節.(2)在一級Cache和CPU間添加二級Cache,二級Cache的訪問速度較低,對應的成本也會降低。

????????目前CPU一般為多核結構,CPU內部會集成多個Core,每個Core有自己獨立的L1 Cache,X86架構的CPU中每個Core還會有自己獨立的L2 Cache,L3 Cache被所有Core共享。

補充:Cache通常用在高性能的處理器中,而C51系列單片機、Coretex-M0/M1/M2/M3/M4系列的ARM處理器中不包含Cache,因為這些處理器是低功耗、低成本處理器,而Cache會增加成本和功耗。且這些處理器工作頻率不高,也沒必要使用Cache。此外,Cache無法保證實時性,當緩存未命中時,CPU從RAM中讀取數據的時間是不確定的,所以不適用于實時性場景。

25.ARM處理器的工作模式

? ? ? ? 為保證設備能夠長期穩定運行,ARM架構處理器提供7種工作模式,程序正常運行時工作在用戶模式,當程序出錯或產生中斷時,ARM處理器就會切換到對應的特權工作模式,如下表所示。

? ? ? ? 處理器處于用戶模式時,沒有權限對內存和底層硬件進行操作,程序若想對底層硬件進行讀寫操作,則需要通過系統調用或軟件中斷進入特權模式,運行操作系統內核或硬件驅動代碼來對底層的硬件設備進行讀寫操作。

26.ARM處理器內部寄存器介紹

? ? ? ? ARM處理器內部除了包含算術運算單元、邏輯運算單元、浮點運算單元和控制單元,還包含一系列寄存器,包括通用寄存器、狀態寄存器和控制寄存器,ARM處理器在不同工作模式下,其寄存器會有一些差異,具體介紹如下。

? ? ? ?如上所示,除了FIQ模式,在其他模式下都可使用R0~R12寄存器,這些寄存器是共用的,我們將其稱為通用寄存器(為保證快速相應中斷,處理器在FIQ模式下有自己獨立的R8~R12寄存器)。其他的寄存器都是在各自模式下獨立使用的,我們將其稱為專用寄存器。下面對這些寄存器的功能進行具體介紹。(ARM程序通常默認使用滿遞減堆棧

R0~R3:用來傳遞函數參數,當參數個數大于4個時,使用堆棧來傳遞剩余的參數,返回值通過R0~R1返回。

R4~R11:用來保存程序運算的中間結果或函數的局部變量。

R12:函數調用過程中的臨時寄存器,通常用來保存函數的棧幀基址,記作FP。

R13:堆棧指針寄存器SP,用來維護和管理函數調用過程中的棧幀變化,總是指向當前正在運行的函數的棧幀。

R14:鏈接寄存器LR,用來保存函數調用時,上一級函數調用者的返回地址。

R15:程序計數器PC,總是指向正在運行的指令,CPU默認從該寄存器保存的地址處讀取指令,每讀取一次指令,PC寄存器的地址自動增加。ARM三級流水線中,一條指令的執行流程包括:取指、譯碼和執行,因此PC指針的值為當前正在運行的指令地址加8。

CPSR:處理器狀態寄存器,用來表征當前處理器的運行狀態,圖示如下:?(STM32處理器為?Cortex-M 架構處理器,使用xPSR來替代CPSR,ARM匯編語言基礎-CSDN博客中對xPSR寄存器進行了介紹)

SPSR:當處理器切換模式或發生異常時,還寄存器用來保存當前模式下的處理器現場,也就是CPSR寄存器中的值,當模式切換回來時,就從SPSR寄存器中恢復原先的處理器狀態。

補充:在?ARM Cortex-M 架構中,當進入異常服務程序后,會自動更新LR寄存器(R14)的值為一個特殊值EXC_RETURN,EXC_RETURN的高28位全為1,只有[3:0]才有特殊含義,當把R14傳送給PC時,處理器就會執行中斷返回。EXC_RETURN的位段介紹如下。

位段說明
[31:4]EXC_RETURN的標識:必須全為1
30:返回后進入Handler模式
1:返回后進入線程模式? ?
20:從主堆棧中做出棧操作,返回后使用MSP
1:從進程堆棧中做出棧操作,返回后使用PSP
1保留,必須為0
00:返回ARM狀態
1:返回Thumb狀態( 在CM3 中必須為1)

常見的EXC_RETURN取值

  • 0xFFFF_FFF1:返回handler模式
  • 0xFFFF_FFF9 :返回線程模式,并使用主堆棧(SP=MSP)
  • 0xFFFF_FFFD:返回線程模式,并使用線程堆棧(SP=PSP)

????????Cortex-M 在異常退出時通過 ?硬件自動恢復 CPSR,確保中斷狀態與進入異常前一致,此過程無需軟件干預,由BX LR指令觸發。

27.棧幀指針FP、堆棧指針SP、程序計數器PC和鏈接寄存器LR

指針說明
FP棧幀指針,FP指針始終指向當前函數調用的棧幀的底部,也就是當前函數局部變量和參數的起始位置FP的作用是作為函數調用時棧的標記,使得編譯器可以有效地管理局部變量和函數參數。尤其是在多次函數調用時,FP幫助函數在棧中定位自己的數據。它的值在函數進入時被設置,并在函數返回時恢復,以便在函數返回后能夠正確地恢復調用者的棧環境。
SP堆棧指針,SP指針指向當前棧的頂部,且會隨著數據的入棧和出棧進行動態的變化在ARM架構中,通常使用R13寄存器作為SP指針。通常由R13寄存器作為SP指針。
PC程序計數器,指向正在執行的指令的地址,且自動更新其主要作用就是在程序執行時跟蹤指令的地址,每次執行完一條指令后,PC會自動指向下一條指令,當遇到跳轉指令時,PC指針會被顯式的更改,從而跳轉到指定的地址。通常由R15寄存器作為PC指針。
LR鏈接寄存器,LR指針用于保存下一條要執行的指令的地址當進行函數調用時(如BL、BLX指令),處理器會自動將下一條指令的地址保存到LR寄存器中,當函數執行完成后,將LR寄存器中的值加載到PC指針中,即可實現函數返回。當發行異常或中斷時,LR會被設置為特定的值,以便在處理完異常或中斷后返回到正確的位置。在ARM匯編語言中,LR還可用于實現子程序之間的鏈接。通常由R14寄存器作為LR指針。

?注:在ARM架構中,通常使用R11作為棧幀指針,但在Thumb模式下可能會使用R7作為棧幀指針。具體使用的是哪個寄存器取決于目標平臺(如ARMv7、ARMv8)、指令集(ARM指令集或Thumb指令集)和編譯器設置等方面。此外,在ARM架構中,FP指針不是必須的,當程序比較簡單時,可不使用FP指針,直接使用SP指針對棧進行訪問,以減少寄存器的使用,提高代碼指向效率。在一些特定的硬件平臺或實時系統中,也可能為了節省寄存器資源或特高代碼運行效率,不使用棧幀指針FP,而通過精心設計的代碼來直接操作堆棧,以滿足系統的特殊需求。

28.PC指針真的指向當前正在執行指令的地址么?

? ? ? ? ARM架構的處理器采用的是三級流水線技術,一條指令的執行周期包括:取指、譯碼和執行三步。比如處理器在執行第N條指令時,第N+1條指令正在譯碼,第N+2條指令正在取指。為適應流水線的工作方式,PC指針實際上指向的是第N+2條指令的地址。每條指令的長度為4字節,所以PC=當前指令地址+8,圖示如下。

? ? ? ? 當程序進行跳轉時,會將下條要執行的語句的地址保存在LR寄存器中,當子程序執行完成后返回時,就可以將LR中的地址加載到PC寄存器中,實現子程序返回。在程序跳轉前,保存到LR寄存器中的地址實際是PC-4,也就是第N+1條指令的地址

:ARM架構中有兩種指令集:ARM指令集和Thumb指令集,ARM指令的長度為4字節,而Thumb指令的長度為2字節,所以在Thumb狀態下PC=當前指令地址+4,對應的,在程序跳轉時,LR=PC-2

29.講講中斷和異常的區別

? ? ? ? 在嵌入式系統中,中斷和異常是兩種處理特殊事件的機制,具體介紹如下。

中斷:中斷是由外部硬件設備觸發,用來通知處理器及時響應外部事件,確保系統對外部環境的實時性,比如定時器到時、外設請求數據傳輸等。當中斷發生時,處理器會停止當前的任務,跳轉執行對應的中斷處理函數,中斷處理完成后處理器再回到之前的任務繼續執行。

異常:異常通常由處理器在執行指令時檢測到錯誤或特殊情況而引發的,主要用于處理程序運行時出現的錯誤或特殊情況,以確保系統的穩定性和安全性,比如非法指令、除零錯誤、內存訪問違規等。當發生異常時,處理器會調用操作系統的異常處理程序來處理異常,處理方式一般包括終止程序、忽略異常或修復錯誤后繼續執行等。

30.?硬中斷和軟中斷的區別

1)?硬件中斷是由硬件外設引發的, 軟中斷是執行中斷指令產生的;

2)?硬件中斷的中斷號是由中斷控制器提供的, 軟中斷的中斷號由指令直接指出, 無需使用中斷控制器;

3)?硬件中斷可設置CPU的屏蔽位進行屏蔽, 軟中斷不可屏蔽

4)?硬件中斷處理程序要確保它能快速地完成任務, 這樣程序執行時才不會等待較長時間, 稱為上半部;

5)?軟中斷處理硬中斷未完成的工作, 是一種推后執行的機制, 屬于下半部。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91853.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91853.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91853.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TCL --- 列表_part2

0 回顧 列表part0和part1描述了列表的創建,修改,獲取,搜索等相關命令。接下來這篇文章將介紹列表的排序和拼接。通過這三篇文章的描述,詳細大家對列表具有一個詳細并且系統的認識。 1 排序 排序是一個老生常談的話題。最最最常見的…

Kafka 單機多 Broker 實例集群搭建 | 詳情

全文目錄:開篇語前言1. Kafka 集群架構2. 環境要求2.1 安裝 Java2.2 安裝 Zookeeper3. 安裝 Kafka4. 創建 Topic4.1 查看創建的 Topic5. 測試 Kafka 集群5.1 生產者(Producer)測試5.2 消費者(Consumer)測試6. 小結文末…

Ajax——異步前后端交互提升OA系統性能體驗

本文介紹了Ajax中的基礎使用,包括XMLHttpRequest的狀態變化、并使用BMI 場景的示例進行介紹,以及結合 DAO 和 Servlet 處理OA系統復雜業務邏輯和JSON數據的處理等等。 本文目錄一、Ajax 基礎html頁面二、 XMLHttpRequestXMLHttpRequest的狀態變化同步和異…

【最后一個單詞的長度】

思路 逆向遍歷: 從字符串末尾開始向前遍歷,跳過末尾的空格,直到找到非空格字符。 遇到非空格字符時開始計數,直到再次遇到空格或字符串開頭。 狀態標記: 使用 state 標記是否已經進入最后一個單詞的計數階段&#xff1…

OpenCV學習 day3

一、灰度實驗 將彩色圖像轉換為灰度圖像的過程稱為灰度化,這種做法在圖像處理中和計算機視覺領域非常常見 1、灰度圖 灰度圖是一種 單通道圖像,每個像素僅存儲 亮度信息(0純黑,255純白),沒有顏色信息&#…

基于單片機一氧化碳CO檢測/煤氣防中毒檢測報警系統

傳送門 👉👉👉👉其他作品題目速選一覽表 👉👉👉👉其他作品題目功能速覽 概述 基于單片機的CO檢測系統通過傳感器實時監測環境中的一氧化碳濃度,結合信號處理電路與…

前端-移動Web-day3

目錄 1、視口 2、rem體驗 3、rem基本使用 4、媒體查詢 5、rem適配 6、rem布局 7、less-體驗 8、less-注釋 9、less-運算 10、less-嵌套 11、less-變量 12、less-導入 13、less-導出 14、less-禁止導出 15、案例-極速問診 1、視口 <!DOCTYPE html> <htm…

【正點原子K210連載】第二十四章 按鍵輸入實驗 摘自【正點原子】DNK210使用指南-CanMV版指南

第二十四章 按鍵輸入實驗 本章實驗將介紹如何使用CanMV讓Kendryte K210獲取板載按鍵的狀態。通過本章的學習&#xff0c;讀者將學習到在CanMV下讀取Kendryte K210的GPIO上的高低電平狀態。 本章分為如下幾個小節&#xff1a; 14.1 maix.GPIO模塊介紹 14.2 硬件設計 14.3 程序設…

基于springboot/java/VUE的旅游管理系統/旅游網站的設計與實現

用戶&#xff1a;注冊&#xff0c;登錄&#xff0c;旅游景點&#xff0c;酒店信息&#xff0c;旅游線路&#xff0c;公告信息&#xff0c;留言板&#xff0c;后臺管理&#xff0c;個人中心&#xff0c;門票預訂管理&#xff0c;酒店預訂管理管理員&#xff1a;登錄&#xff0c;…

Python Excel 高階教程:使用 Spire.XLS 插入、修改和刪除迷你圖

Python 操作 Word 文檔&#xff1a;主流庫對比與選擇指南 在辦公自動化、報告生成、數據處理等領域&#xff0c;利用 Python 程序化地創建、讀取或修改 Microsoft Word 文檔 (.docx 格式) 是一項非常實用的技能。Python 生態中有多個優秀的庫可以完成這項任務&#xff0c;但它…

WebPages PHP:深入解析PHP在網頁開發中的應用

WebPages PHP&#xff1a;深入解析PHP在網頁開發中的應用 引言 隨著互聯網技術的飛速發展&#xff0c;PHP作為一種開源的腳本語言&#xff0c;已經在網頁開發領域占據了舉足輕重的地位。本文將深入探討PHP在網頁開發中的應用&#xff0c;包括其優勢、常用框架、開發流程以及未來…

【深度學習】【三維重建】windows11環境配置PyTorch3d詳細教程

【深度學習】【三維重建】windows11環境配置PyTorch3d詳細教程 文章目錄【深度學習】【三維重建】windows11環境配置PyTorch3d詳細教程前言確定版本對應關系源碼編譯安裝Pytorch3d總結前言 本人windows11下使用搭建PyTorch3d環境&#xff0c;故此以詳細教程以該算法依賴的環境…

SpringBoot+Mybatis+MySQL+Vue+ElementUI前后端分離版:日志管理(四)集成Spring Security

目錄 一、前言 二、后端開發及調整 1.日志管理開發 2.配置調整 3.日志入庫&#xff08;注解、切面&#xff09; 三、前端調整 1.日志管理開發 四、附&#xff1a;源碼 1.源碼下載地址 五、結語 一、前言 此文章在上次調整的基礎上開發后端管理系統的用戶請求日志功能&…

ceph 14.2.22 nautilus Balancer 數據平衡

Ceph Balancer (upmap 模式) 啟用與配置 在 Ceph Nautilus (14.2.22) 版本中啟用和配置 Balancer 的完整步驟 1. 前提檢查 檢查集群的初始狀態和版本。 集群狀態 (ceph -s)cluster:id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxhealth: HEALTH_OKservices:mon: 3 daemons, quo…

在Linux上對固態硬盤進行分區、格式化和掛載的步驟

在Linux上對固態硬盤進行分區、格式化和掛載的步驟如下&#xff1a; 插入固態硬盤&#xff1a;將固態硬盤插入計算機的SATA或M.2接口。 確認固態硬盤被識別&#xff1a;打開終端&#xff0c;輸入以下命令查看硬盤是否被系統識別 fdisk -l 查找硬盤列表中的固態硬盤&#xf…

用Unity結合VCC更改人物模型出現的BUG

1、上傳模型時出現錯誤經過排查是因為服裝發型預制體放到人物模型上之后&#xff0c;物體上自動多了一個空腳本&#xff0c;懷疑是VRC工具箱自動添加的。解決方法&#xff1a;在上傳前將帶有空腳本的物體上的組件刪除即可2、添加頭發時出現模型碰撞錯誤按照【【VRCHAT】從零開始…

k8s之DevicePlugin

解密 Kubernetes Device Plugin&#xff1a;讓容器輕松駕馭特殊硬件 在容器化技術飛速發展的今天&#xff0c;容器憑借輕量、隔離、可移植的特性成為應用部署的主流選擇。但在實際應用中&#xff0c;當容器需要訪問 GPU、FPGA 等特殊硬件資源時&#xff0c;事情就變得不那么簡單…

動態規劃Day7學習心得

今天給動態規劃掃個尾&#xff0c;還有兩題。 第一道&#xff1a;647. 回文子串 - 力扣&#xff08;LeetCode&#xff09; 暴力解法 兩層for循環&#xff0c;遍歷區間起始位置和終止位置&#xff0c;然后還需要一層遍歷判斷這個區間是不是回文。所以時間復雜度&#xff1a;O…

SpringCloud實戰:機器人對戰系統架構

基于Spring Cloud的機器人對戰 以下是基于Spring Cloud的機器人對戰實例相關案例和技術實現方向的整理,涵蓋微服務架構設計、通信機制及典型應用場景: 分布式對戰系統架構 采用Spring Cloud Alibaba+Nacos實現服務注冊與發現,每個機器人實例作為獨立微服務部署。通過Open…

LLM 核心能力解構與項目實踐指南

大語言模型&#xff08;LLM&#xff09;的爆發式發展&#xff0c;本質上是其核心能力在產業場景中的規模化驗證。作為技術博主&#xff0c;本文將系統拆解 LLM 的六大核心能力&#xff0c;結合工業級項目案例&#xff0c;提供從能力映射到工程實現的完整技術路徑&#xff0c;并…