0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

簡單認識ARM處理器家族

sakobpqhz6 ? 來源:TrustZone ? 2024-01-02 10:55 ? 次閱讀

就把這當作ARM學(xué)習的開篇,雖然最近RiscV被各大媒體推崇,我也持續(xù)看好。

但是我還是覺得短期內(nèi)很難在高利潤的行當對ARM和x86造成威脅,因為指令集的特點,以及各個廠家的各自為戰(zhàn),期待早點出現(xiàn)RiscV的天降猛男。

有個朋友,說他們公司因為制裁,只有V8的授權(quán)。所以開源或者自研架構(gòu)又是一條不可避免的道路,不過無論如何,對于我們來說,技術(shù)是具有遷移性和相關(guān)性的,所以某種程度上,不用過于的糾結(jié),開始行動比較重要,當然選擇很重要。

突然發(fā)現(xiàn)我也是廢話大師!

PART ONE-實現(xiàn)

1.ARM處理器家族

(1)什么是多內(nèi)核

Candidates should be familiar with the available processors from ARM and know which of these may be used in multiprocessor configurations.

需要熟悉ARM的處理器,并且了解其中哪些是用于多處理器配置的。

ARM處理器根據(jù)其設(shè)計和應(yīng)用場景的不同,有多種不同的系列。其中,Cortex-A系列是用于高計算要求的領(lǐng)域,如智能手機、平板電腦、汽車娛樂系統(tǒng)、數(shù)字電視等,它可以運行豐富的操作系統(tǒng)和提供交互媒體和圖形體驗。

在Cortex-A系列中,Cortex-A9微體系結(jié)構(gòu)既可用于可伸縮的多核處理器(Cortex-A9 MPCore多核處理器),也可用于更傳統(tǒng)的處理器(Cortex-A9單核處理器)。這兩種類型的處理器都支持16、32或64KB 4路關(guān)聯(lián)的L1高速緩存配置,對于可選的L2高速緩存控制器,最多支持8MB的L2高速緩存配置。這種高度的靈活性使它們能夠適用于特定的應(yīng)用領(lǐng)域和市場。

Cortex-A系列中的Cortex-A9內(nèi)核可以用于多處理器配置。它既可用于可伸縮的多核處理器(Cortex-A9 MPCore多核處理器),也可用于更傳統(tǒng)的處理器(Cortex-A9單核處理器)。

Cortex-A9 MPCore多核處理器包含兩個或更多同構(gòu)或異構(gòu)的內(nèi)核,并支持運行一個輕量級的操作系統(tǒng)以進行系統(tǒng)管理。它適合用于高性能、高吞吐量的計算應(yīng)用,如服務(wù)器、高端智能手機和平板電腦等。

另外,Cortex-A15和Cortex-A17內(nèi)核也是高性能處理器,可以用于多種配置中。它們具有更強的性能和功效,并支持運行復(fù)雜的操作系統(tǒng)和交互媒體和圖形體驗。

總之,ARM的Cortex-A系列處理器中的Cortex-A9、Cortex-A15和Cortex-A17內(nèi)核都可以用于多處理器配置,以滿足高性能和高計算要求的應(yīng)用需求。

另外,Cortex-M系列是通用微處理器,一般不運行操作系統(tǒng)或只運行實時操作系統(tǒng)(RTOS)。

而Cortex-R系列是實時微處理器,它們在Cortex-M的基礎(chǔ)上增強了實時性能,主要用于高安全性和高實時性的場合。

(2)連接硬件

Candidates should be aware of the concept of coherency hardware, what it does, why it is required and what are the benefits of using it.

需要了解連接硬件的含義,它是做什么的,為什么需要它以及它的優(yōu)勢是什么。

連接硬件是在多核系統(tǒng)中必須使用的。要理解它是如何工作的以及它是如何影響軟件開發(fā)的,需要具備對多核系統(tǒng)以及緩存知識的了解。

在多核系統(tǒng)中,硬件連接和通信是一個關(guān)鍵的考慮因素。為了實現(xiàn)多個處理器核心之間的有效通信和數(shù)據(jù)共享,通常需要使用高速緩存一致性協(xié)議,如MESI協(xié)議。這些協(xié)議確保當一個核心修改了共享數(shù)據(jù)時,其他核心能夠立即或最終獲得更新的數(shù)據(jù)。

在多核系統(tǒng)中,每個核心都有自己的高速緩存(L1或L2),但它們之間需要通過共享的內(nèi)存區(qū)域進行通信。當一個核心訪問共享內(nèi)存區(qū)域時,其他核心也需要更新它們的高速緩存以確保一致性。

為了實現(xiàn)這一目標,硬件需要維護一種狀態(tài)機制,如MESI協(xié)議中的狀態(tài),來跟蹤每個高速緩存行的狀態(tài)(例如,修改、獨占、共享等)。當一個核心修改了共享數(shù)據(jù)時,它會發(fā)送一個消息給其他核心,通知它們更新它們的高速緩存行狀態(tài)。

這種通信機制對于確保多核系統(tǒng)中的數(shù)據(jù)一致性和正確性至關(guān)重要。它也影響軟件開發(fā)的方面,因為開發(fā)者需要考慮如何有效地利用多核處理器資源,并確保數(shù)據(jù)的一致性和共享。

為了更有效地開發(fā)多核系統(tǒng)軟件,開發(fā)者需要了解硬件的連接方式和通信機制,以便編寫高效、可靠的并行代碼。他們還需要了解多核處理器架構(gòu)的特性和限制,以及如何利用硬件特性來優(yōu)化軟件性能。

多核心系統(tǒng)中的硬件連接和通信對軟件開發(fā)的影響主要體現(xiàn)在以下幾個方面:

內(nèi)存一致性:在多核心系統(tǒng)中,每個核心都有自己的高速緩存(L1或L2),但它們之間需要通過共享的內(nèi)存區(qū)域進行通信。為了確保數(shù)據(jù)的一致性,需要使用高速緩存一致性協(xié)議,如MESI協(xié)議。這些協(xié)議確保當一個核心修改了共享數(shù)據(jù)時,其他核心能夠立即或最終獲得更新的數(shù)據(jù)。軟件開發(fā)需要考慮如何處理這種內(nèi)存一致性的問題,以避免數(shù)據(jù)不一致或競態(tài)條件。

通信開銷:在多核心系統(tǒng)中,核心之間的通信存在一定的開銷。如果大量核心頻繁地進行通信,會影響系統(tǒng)的性能。因此,在軟件開發(fā)中,需要盡量避免不必要的核心間通信,或者采用高效的通信機制來降低通信開銷。

負載均衡:在多核心系統(tǒng)中,如果負載分布不均衡,會導(dǎo)致某些核心空閑而其他核心還在忙碌,從而影響系統(tǒng)性能。軟件開發(fā)中需要考慮負載均衡的問題,通過合理地分配任務(wù)和數(shù)據(jù),使得每個核心都能得到充分利用。

并行算法編程模型:為了充分利用多核心系統(tǒng)的并行處理能力,需要采用適合并行處理的算法和編程模型。這包括使用線程、進程、數(shù)據(jù)并行等編程模式,以及選擇合適的同步原語和通信機制。

系統(tǒng)集成和測試:在多核心系統(tǒng)中,由于硬件連接和通信的復(fù)雜性,系統(tǒng)的集成和測試變得更加困難。軟件開發(fā)中需要考慮如何進行有效的集成和測試,以確保系統(tǒng)的正確性和可靠性。

綜上所述,多核心系統(tǒng)中的硬件連接和通信對軟件開發(fā)的影響是多方面的。

為了充分利用多核心系統(tǒng)的優(yōu)勢,開發(fā)者需要深入了解硬件的特性和限制,并采用合適的并行處理技術(shù)和編程模型來優(yōu)化軟件性能。

(3)通用中斷控制器GIC

GIC常用于Cortex-A5多內(nèi)核、Cortex-A9多內(nèi)核以及Cortex-R7多內(nèi)核處理器中,它也可作為可選部件存在于Cortex-A7和Cortex-A15內(nèi)核中。

它提供了一種可擴展的中斷處理機制,使開發(fā)者可以根據(jù)需要進行配置和使用。

GIC(Generic Interrupt Controller)是ARM Cortex-A系列處理器中使用的通用中斷控制器。它為多核處理器和單核處理器提供中斷管理功能,并支持可擴展的中斷處理機制。

在多核處理器中,GIC允許多個核心共享中斷信號,并協(xié)調(diào)各個核心對共享中斷的處理。通過GIC,每個核心可以獨立地響應(yīng)和分發(fā)中斷,確保中斷處理的并行性和高效性。

此外,GIC還提供了一些可編程的中斷控制功能,如設(shè)置中斷優(yōu)先級、子優(yōu)先級、使能/禁用中斷等。這些功能使得開發(fā)者能夠靈活地配置和控制中斷處理的行為。

總之,GIC是Cortex-A系列處理器中用于中斷管理的關(guān)鍵組件,它為多核和單核處理器提供了通用和高效的中斷處理機制。

(4)架構(gòu)版本歸屬

Candidates must be able to identify which ARM processors conform to which Architecture versions. Architectures from ARMv4T onwards are included, with the exception of ARMv7-M and ARMv6-M architectures.

需要能夠識別具體的ARM的處理器是屬于哪個處理器架構(gòu)版本的。ARMv4T架構(gòu)之后的都需要了解。

ARMv4T架構(gòu):

ARM7TDMI系列處理器(如ARM710T、ARM720T、ARM740T等)

ARM9TDMI系列處理器(如ARM920T、ARM940T等)

StrongARM系列處理器(Intel公司的產(chǎn)品

ARMv5TEJ架構(gòu):

ARM7EJ-S系列處理器(基于ARMv5TEJ架構(gòu))

ARMv6架構(gòu):

ARM11系列處理器(如ARM11MPCore、ARM1176、ARM1156、ARM1136等)

XScale系列處理器(Intel公司的產(chǎn)品)

ARMv7架構(gòu):

Cortex-A系列處理器(如Cortex-A5、Cortex-A7、Cortex-A9、Cortex-A15等)

Cortex-R系列處理器(如Cortex-R4、Cortex-R7等)

Cortex-M系列處理器(如Cortex-M3、Cortex-M4等)

ARMv8架構(gòu):

AArch64架構(gòu)(64位指令集)

AArch32架構(gòu)(32位指令集)

Cortex-A50系列處理器(基于ARMv8架構(gòu),支持64位指令集)

Cortex-A53系列處理器(基于ARMv8架構(gòu),支持64位指令集)

Cortex-A57系列處理器(基于ARMv8架構(gòu),支持64位指令集)

Cortex-A72系列處理器(基于ARMv8架構(gòu),支持64位指令集)

ARMv9架構(gòu):

Cortex-X2

Cortex-A710

Cortex-A510

這些是ARM的處理器架構(gòu)版本中比較常見的系列。每個系列中的處理器型號可能會有所不同,但它們都遵循相同的架構(gòu)規(guī)范。希望這些信息對您有所幫助!

(5)性能

Candidates must be able to distinguish between applications, real-time and microcontroller profiles, be aware of the distinguishing features between them and understand the typical target market/applications of each.

需要能夠區(qū)別ARM Cortex的應(yīng)用、實時和微控制器三大系列的區(qū)別,理解它們之間的不同特性以及所針對的典型目標應(yīng)用和市場。

《Cortex-A系列程序員指南》,顧名思義,它只介紹了Cortex-A系列,并沒有提供很多關(guān)于Cortex-R和Cortex-M系列的知識。Cortex-A系列處理器主要應(yīng)用于需要MMU內(nèi)存管理單元和緩存工作的操作系統(tǒng)的應(yīng)用場合,要求擁有高性能的處理能力。

Cortex-R系列處理器主要面向?qū)崟r應(yīng)用,它面向需要硬實時反應(yīng)能力的嵌入式系統(tǒng)。這說明它的特性要求有快速、確定的中斷響應(yīng),有緊密耦合的存儲器(TCM)位于處理器的局部快速總線上以提供快速響應(yīng)的代碼和數(shù)據(jù),有奇偶校驗或者ECC校驗機制來保證錯誤的檢測和修正。

Cortex-R系列處理器使用內(nèi)存保護單元MPU代替Cortex-A系列中的內(nèi)存管理單元MMU來進行內(nèi)存的管理和保護。

Cortex-M系列處理器面向低成本和功耗敏感的微控制器和混合信號系統(tǒng)。例如一些終端設(shè)備,包括智能電表、人機交互設(shè)備、自動和工業(yè)控制系統(tǒng)、大型家用電器、消費類產(chǎn)品和醫(yī)療儀器等。這類領(lǐng)域應(yīng)用的關(guān)鍵是要求微量代碼(更好的代碼密度),易于使用以及節(jié)能。例如,Cortex-M0+內(nèi)核是ARM處理器中能耗最低的內(nèi)核,可達到mW/MHz。Cortex-M系列處理器僅支持16位和32位的Thumb指令集,通常不含緩存。

之前做過一段時間Zigbee的智慧農(nóng)業(yè)項目,買的開發(fā)板就是M內(nèi)核。

不過已經(jīng)三年前了,時間好快??!

2.指令周期時序

Candidates should be aware of the effects of pipeline and memory system on instruction execution timing.

需要了解流水線和內(nèi)存系統(tǒng)對指令執(zhí)行時間的影響。

了解一些流水線架構(gòu)相關(guān)的基本知識。

了解ARM7TDMI的三級流水線(取指、譯碼、執(zhí)行)的含義可以幫助理解流水線對執(zhí)行周期時序的影響。

ARM7TDMI技術(shù)參考手冊給出了這個流水線,這讓理解流水線的概念變得更容易。

例如,在ARM7TDMI上分支跳轉(zhuǎn)會導(dǎo)致2個周期的損失,因為分支跳轉(zhuǎn)發(fā)生在流水線的執(zhí)行階段,此時位于取指和譯碼階段的指令將被沖刷掉,流水線被重新按新的指令流填滿,因此在跳轉(zhuǎn)后的第一條指令執(zhí)行前將產(chǎn)生3個周期的延遲。

同理,一旦理解了簡單的流水線,“加載-使用損耗”的概念就很明了了,它用于描述當寄存器加載一個存儲空間的值時的狀況。

如果接下來的指令需要使用這個寄存器的值,那么它需要等待該寄存器完成數(shù)據(jù)的加載(并到達處理器流水線的相關(guān)級,可能通過專用通道到達)。

編譯器(或者匯編器)會避免這種情況發(fā)生,它一般會試圖把使用加載數(shù)據(jù)的指令從加載指令處分離開。

同理,一旦理解了簡單的流水線,“加載-使用損耗”的概念就很明了了,它用于描述當寄存器加載一個存儲空間的值時的狀況。

如果接下來的指令需要使用這個寄存器的值,那么它需要等待該寄存器完成數(shù)據(jù)的加載(并到達處理器流水線的相關(guān)級,可能通過專用通道到達)。

編譯器(或者匯編器)會避免這種情況發(fā)生,它一般會試圖把使用加載數(shù)據(jù)的指令從加載指令處分離開。

PART TWO-軟件調(diào)試

1.標準調(diào)試手段

(1)軟件斷點和硬件斷點的區(qū)別

Candidates should be aware of the differences and limitations between Hardware and Software breakpoints. They should understand the usage of watchpoint units in configuring these two types of breakpoint.

需要清楚硬件和軟件斷點的區(qū)別以及各自的限制,需要了解在配置這兩種類型的斷點時觀察點單元的使用。

在較早的處理器(如ARM7TDMI)中,并沒有配備專用的斷點指令BKPT,而是使用設(shè)置觀察點單元來查看特定的位模式的,調(diào)試器可以在RAM的代碼空間中設(shè)置無限量的軟件斷點。

調(diào)試器會讀取需要放置斷點指令的操作碼,并保存到主機上。這條指令然后被一個特定的數(shù)據(jù)位替代(通常對應(yīng)的是一個無效指令)。

通常,這需要處理器的數(shù)據(jù)緩存被清空并且使指令緩存無效,以確保從處理器數(shù)據(jù)端寫入的特定數(shù)據(jù)可以被取指邏輯正確訪問。

在較新的處理器上,包括所有的Cortex系列處理器,則采用了BKPT指令來代替原來的需要放置斷點的操作碼。

當斷點被移除時,原本存儲在主機上的原操作碼會被寫回。與此對應(yīng)的是,硬件斷點可以被設(shè)置在任何類型的存儲器上(包括RAM和ROM),但它的數(shù)量則由硬件限制。

在學(xué)習這部分內(nèi)容時,建議使用真實的調(diào)試器來理解它的使用和限制,獲得一些實際的應(yīng)用經(jīng)驗,這可以比書本上的解釋提供更多的有益背景知識。

軟件斷點和硬件斷點是兩種不同的斷點類型,它們在實現(xiàn)方式和適用場景上存在顯著的差異。

硬件斷點:

需要目標CPU的硬件支持。

斷點的數(shù)目受特定硬件設(shè)計的限制。例如,ARM7/9內(nèi)核最多支持兩個硬件斷點,而ARM11可以支持到8個硬件斷點。

硬件斷點可以設(shè)置在任何位置的代碼上,包括ROM和RAM。

由于硬件斷點設(shè)置的靈活性,它是最優(yōu)先選用的斷點資源。

軟件斷點:

通過在代碼中設(shè)置特征值的方式實現(xiàn)。

當需要在某地址代碼處設(shè)置軟件斷點時,仿真器會先將此處代碼進行備份保護,然后將預(yù)先設(shè)定好的斷點特征值(一般為0x0000等不易與代碼混淆的值)寫入此地址,覆蓋原來的代碼數(shù)據(jù)。

當程序運行到此特征值所在的地址時,仿真器識別出此處是一個軟斷點,便會產(chǎn)生中斷。當取消斷點時,之前受保護的代碼信息會被自動恢復(fù)。

由于軟件斷點需要修改相應(yīng)地址的值,所以一般只能設(shè)在RAM上,但是數(shù)量可以不受限制??偟膩碚f,軟件斷點和硬件斷點各有其特點和使用場景。硬件斷點由于其設(shè)置的靈活性,通常是最優(yōu)先選用的斷點資源,但當需要大量設(shè)置斷點時,軟件斷點可以作為有效的補充資源。

硬件斷點在實際應(yīng)用中更為常用。原因主要有以下幾點:

硬件斷點通常更快,因為它們直接由硬件控制,不需要軟件進行干預(yù)。

硬件斷點通常更可靠,因為它們不受軟件運行的影響,比如內(nèi)存管理、進程切換等。

硬件斷點通??梢栽O(shè)置更多的斷點,因為它們直接由硬件支持,不像軟件斷點可能會受到軟件資源的限制。

當然,在某些情況下,軟件斷點也可能是更好的選擇。例如,對于一些沒有硬件調(diào)試支持的低端設(shè)備,或者在需要精細控制斷點的位置和數(shù)量時,可能需要使用軟件斷點。

硬件斷點在實際應(yīng)用中更為常用,但具體選擇哪種斷點類型取決于具體的應(yīng)用場景和需求。

(2)監(jiān)控模式與停止模式調(diào)試

Candidates should be aware of the differences between debugging in each of the two modes and when one would be chosen over the other e.g. choosing monitor mode if interrupts must continue to be serviced while debugging.

需要了解調(diào)試的兩種模式之間的區(qū)別以及何時選用哪種模式。

例如,需要在調(diào)試過程中仍舊響應(yīng)中斷時,則應(yīng)選擇監(jiān)測模式來調(diào)試。

監(jiān)控模式和停止模式調(diào)試之間的主要區(qū)別在于它們的目的和行為。

監(jiān)控模式調(diào)試主要用于實時監(jiān)測程序的運行狀態(tài)和行為。在這種模式下,程序繼續(xù)正常運行,同時允許開發(fā)者實時觀察變量值、執(zhí)行流程和函數(shù)調(diào)用等信息。監(jiān)控模式調(diào)試適用于需要了解程序?qū)崟r行為的情況,以便及時發(fā)現(xiàn)潛在問題或異常。它也適用于需要實時響應(yīng)用戶輸入或外部事件的情況。

停止模式調(diào)試主要用于暫停程序的執(zhí)行,以便進行深入檢查和診斷問題。在這種模式下,程序停止執(zhí)行,開發(fā)者可以對程序進行單步執(zhí)行、檢查變量值、查看堆棧跟蹤等操作,以便更好地理解程序的狀態(tài)和行為。停止模式調(diào)試適用于需要深入了解程序內(nèi)部狀態(tài)和行為的情況,例如處理復(fù)雜錯誤或調(diào)試性能問題。

在需要調(diào)試過程中仍舊響應(yīng)用戶中斷時,監(jiān)控模式調(diào)試可能更為合適。在這種模式下,程序繼續(xù)正常運行,同時允許開發(fā)者實時觀察和監(jiān)控程序的運行狀態(tài)。這樣可以及時發(fā)現(xiàn)和修復(fù)與中斷相關(guān)的問題,并確保程序的正常運行。

然而,在某些情況下,可能需要使用停止模式調(diào)試來更好地診斷問題。例如,當遇到復(fù)雜的錯誤或性能問題時,可能需要暫停程序的執(zhí)行,以便進行更深入的檢查和分析。在這種情況下,停止模式調(diào)試可以幫助開發(fā)者更好地理解程序的狀態(tài)和行為,并找到問題的根本原因。

綜上所述,選擇監(jiān)控模式還是停止模式調(diào)試取決于具體的需求和場景。監(jiān)控模式更適合實時監(jiān)測和響應(yīng)用戶輸入或外部事件的情況,而停止模式更適合深入檢查和診斷復(fù)雜問題的情況。根據(jù)實際情況選擇合適的調(diào)試模式將有助于提高開發(fā)效率和程序的穩(wěn)定性。

(3)矢量捕捉

Candidates should be aware of the function of this feature, why and when it is typically used.

需要了解矢量捕捉的功能,為什么以及何時需要使用它。

矢量捕捉是調(diào)試器捕獲處理器異常中斷的方法,早期開發(fā)時在異常中斷服務(wù)句柄被取指之前捕獲到處理器的異常中斷。

許多ARM的處理器都由矢量捕獲硬件來完成這一任務(wù)。而在另外一些處理器,如ARM7TDMI,調(diào)試器可以采用在異常矢量表的適當位置設(shè)置斷點的方法來進行中斷矢量捕獲。

矢量捕捉是一種調(diào)試技術(shù),用于在處理器異常中斷發(fā)生時捕獲異常信息。它通常用于嵌入式系統(tǒng)開發(fā)中,尤其是在調(diào)試和排除異常問題時。

矢量捕捉的主要目的是獲取異常發(fā)生時的處理器狀態(tài)信息,包括程序計數(shù)器(PC)、堆棧指針(SP)、寄存器內(nèi)容等。這些信息可以幫助開發(fā)人員快速定位異常發(fā)生的具體位置,并理解異常發(fā)生時處理器的行為。

為什么需要使用矢量捕捉?主要有以下幾個原因:

快速定位異常:通過矢量捕捉,開發(fā)人員可以獲得異常發(fā)生時的詳細信息,從而快速定位異常發(fā)生的具體位置。這有助于縮短調(diào)試時間,提高開發(fā)效率。

深入理解異常行為:矢量捕捉不僅提供了異常發(fā)生時的處理器狀態(tài),還可以幫助開發(fā)人員理解異常的具體行為。這有助于確定異常的根本原因,并為修復(fù)異常提供重要線索。

優(yōu)化異常處理:通過矢量捕捉,開發(fā)人員可以評估異常處理程序的性能,并對其進行優(yōu)化。例如,通過分析捕捉到的異常信息,開發(fā)人員可以檢查異常處理程序是否正確處理了異常,并對其進行必要的調(diào)整。

何時需要使用矢量捕捉?以下是一些可能需要使用矢量捕捉的情況:

當無法正常啟動程序時:如果程序無法正常啟動,可能存在硬件或軟件故障。在這種情況下,使用矢量捕捉可以幫助開發(fā)人員快速定位問題所在。

當程序出現(xiàn)未處理的異常時:在程序運行過程中,如果出現(xiàn)未處理的異常,可能會導(dǎo)致程序崩潰或數(shù)據(jù)丟失。通過矢量捕捉,可以捕獲這些異常并進行調(diào)試,以修復(fù)問題。

當需要深入了解程序行為時:有時,開發(fā)人員可能需要對程序的運行行為進行深入了解。例如,在性能優(yōu)化或調(diào)試復(fù)雜問題時,矢量捕捉可以幫助開發(fā)人員更好地理解程序的行為。

總之,矢量捕捉是一種非常有用的調(diào)試技術(shù),可以幫助開發(fā)人員快速定位異常問題、深入理解異常行為并進行優(yōu)化處理。在嵌入式系統(tǒng)開發(fā)中,特別是在調(diào)試復(fù)雜異常問題時,使用矢量捕捉可以提高開發(fā)效率和程序的穩(wěn)定性。

(4)判別異常觸發(fā)原因(如DFSR、SPSR、Link鏈接寄存器)

Candidates should understand how to determine the actual cause of an exception by using additional resources, which might include special registers that contain fault status. For example, using the DFSR, DFAR to determine cause of a Data Abort or using the SPSR and LR to locate and retrieve SVC comment field.

DFSR (Data Fault Status Register):當數(shù)據(jù)訪問發(fā)生異常時,相關(guān)的異常類型和向量會寫入到DFSR寄存器中。例如,當發(fā)生數(shù)據(jù)訪問權(quán)限違規(guī)、地址無效或數(shù)據(jù)讀取錯誤等情況時,會觸發(fā)數(shù)據(jù)異常,相關(guān)的信息會被寫入到DFSR中。

SPSR (Saved Program Status Register):在進入異常處理時,當前程序狀態(tài)寄存器(PSR)會被保存到SPSR中,以便在異常處理完成后恢復(fù)執(zhí)行。通過檢查SPSR的狀態(tài),可以了解異常發(fā)生時的程序狀態(tài)。

Link鏈接寄存器:在某些架構(gòu)中,如ARM,鏈接寄存器用于保存子程序返回地址。當一個子程序開始執(zhí)行時,返回地址會被推入堆棧并存放在鏈接寄存器中。如果發(fā)生異常,這個地址可以用于從堆棧中恢復(fù)并跳轉(zhuǎn)到正確的返回地址。

為了判斷具體的異常觸發(fā)原因,需要根據(jù)實際場景和異常的具體表現(xiàn)來分析。這可能包括檢查程序狀態(tài)寄存器(PSR)、程序計數(shù)器(PC)、堆棧指針(SP)和其他相關(guān)的系統(tǒng)寄存器的狀態(tài),以及檢查相關(guān)的內(nèi)存和I/O操作等。此外,異常處理程序中的上下文信息和調(diào)用堆棧信息也是重要的線索。

應(yīng)當理解如何使用額外的資源來判別觸發(fā)一個異常中斷的原因,這些資源通常包括含有錯誤狀態(tài)的特殊寄存器,如使用DFSR、DFAR來判別數(shù)據(jù)中止的原因,采用SPSR以及Link寄存器來定位并獲取SVC系統(tǒng)調(diào)用的參數(shù)位。

當調(diào)試一段軟件時,通常有必要了解為何特定的處理器異常會發(fā)生。為此ARM處理器提供了一系列的寄存器來提供有用的信息。

在異常中斷中,當前異常模式的鏈接寄存器(LR)會給出主程序中最靠近觸發(fā)異常的指令的位置。通常觸發(fā)異常的指令的位置是LR寄存器的值減去4或者8。類似地,SPSR寄存器的mode位可以給出在進入異常模式之前處理器所處的模式。

對于特定的模式,還有一些額外的信息。在取指異?;驍?shù)據(jù)中止異常后,CP15寄存器的錯誤狀態(tài)寄存器(FSR)和故障地址寄存器(FAR)是值得注意的,它們可以給出異常中止發(fā)生的原因(如一個外部存儲器錯誤或者該地址的轉(zhuǎn)換表項無效)以及產(chǎn)生異常中止的內(nèi)存訪問操作的地址。

注意:ARMv6-M和ARMv7-M架構(gòu)在異常處理模型上與其他的ARM內(nèi)核有所不同。

(5)跟蹤

Candidates should be aware of what Trace is,what on-chip and off-chip components are required to make it work, what it is used for.Also that it is non-intrusive.

需要了解什么是跟蹤,它正常工作需要哪些片上和片外模塊,它是用來做什么的,以及它是屬于非侵入式的。

通過跟蹤,開發(fā)人員可以了解處理器在運行時執(zhí)行的操作和執(zhí)行的指令。為了實現(xiàn)跟蹤功能,需要一些片上和片外模塊的支持。

片上模塊包括跟蹤硬件單元和相關(guān)控制邏輯。這些模塊負責生成跟蹤數(shù)據(jù),并將數(shù)據(jù)存儲在內(nèi)部緩沖區(qū)或外部存儲器中,以便后續(xù)分析。片上模塊是非侵入式的,即它們不會影響處理器的正常功能。

片外模塊包括跟蹤數(shù)據(jù)捕獲單元和外部存儲器。跟蹤數(shù)據(jù)捕獲單元負責從片上跟蹤硬件單元獲取跟蹤數(shù)據(jù),并將其轉(zhuǎn)換為可分析的格式。外部存儲器用于存儲跟蹤數(shù)據(jù),以便后續(xù)分析和調(diào)試。

(6)交叉觸發(fā)

ARM交叉觸發(fā)技術(shù)是一種調(diào)試技術(shù),用于在特定事件發(fā)生時觸發(fā)并記錄處理器的行為。通過交叉觸發(fā),開發(fā)人員可以在調(diào)試過程中觀察處理器在特定事件發(fā)生時的行為,例如異常、中斷或特定指令執(zhí)行等。

交叉觸發(fā)機制通常由硬件和軟件協(xié)同實現(xiàn)。硬件部分負責監(jiān)測事件的發(fā)生,并在事件發(fā)生時觸發(fā)跟蹤機制。跟蹤機制記錄處理器執(zhí)行的相關(guān)指令和操作,并將數(shù)據(jù)存儲在內(nèi)部緩沖區(qū)或外部存儲器中。軟件部分負責讀取跟蹤數(shù)據(jù),并將其轉(zhuǎn)換為可分析的格式,以便開發(fā)人員能夠深入了解處理器的行為。

在ARM調(diào)試中,交叉觸發(fā)技術(shù)對于診斷和解決問題非常重要。開發(fā)人員可以通過交叉觸發(fā)機制觀察處理器在特定事件發(fā)生時的行為,從而定位問題或錯誤的根源。這種技術(shù)還可以用于性能分析、代碼覆蓋率分析等場景,幫助開發(fā)人員優(yōu)化代碼和改進系統(tǒng)性能。

ARM交叉觸發(fā)技術(shù)可以應(yīng)用于多種應(yīng)用場景,以下是其中一些常見的應(yīng)用場景:

異常和中斷調(diào)試:通過交叉觸發(fā)技術(shù),開發(fā)人員可以在異常或中斷發(fā)生時觀察處理器的行為。這有助于確定異?;蛑袛喟l(fā)生的原因,以及處理器在異?;蛑袛嗵幚磉^程中的表現(xiàn)。性能優(yōu)化:交叉觸發(fā)技術(shù)可以幫助開發(fā)人員分析處理器在不同工作負載下的性能表現(xiàn)。通過觀察處理器在執(zhí)行關(guān)鍵任務(wù)或高負載情況下的行為,開發(fā)人員可以發(fā)現(xiàn)性能瓶頸并優(yōu)化代碼。

代碼覆蓋率分析:交叉觸發(fā)技術(shù)可以用于分析處理器在執(zhí)行不同代碼路徑時的行為。通過記錄處理器在特定事件發(fā)生時的行為,開發(fā)人員可以確定代碼覆蓋率,并確定哪些代碼路徑被執(zhí)行和哪些未被執(zhí)行。

系統(tǒng)穩(wěn)定性分析:交叉觸發(fā)技術(shù)可以幫助開發(fā)人員分析系統(tǒng)在不同條件下的穩(wěn)定性表現(xiàn)。例如,在系統(tǒng)崩潰或掛起的情況下,開發(fā)人員可以通過交叉觸發(fā)技術(shù)觀察處理器在崩潰或掛起前的行為,以確定問題的根源。

安全漏洞分析:交叉觸發(fā)技術(shù)可以用于安全漏洞分析中,幫助開發(fā)人員定位和處理安全問題。例如,開發(fā)人員可以通過交叉觸發(fā)技術(shù)觀察處理器在執(zhí)行惡意代碼時的行為,以便發(fā)現(xiàn)和處理安全漏洞。

總的來說,ARM交叉觸發(fā)技術(shù)是一種強大的調(diào)試工具,可以幫助開發(fā)人員深入了解處理器的行為和性能,并解決潛在的問題或錯誤。它可以應(yīng)用于多種應(yīng)用場景,包括異常和中斷調(diào)試、性能優(yōu)化、代碼覆蓋率分析、系統(tǒng)穩(wěn)定性分析和安全漏洞分析等。

(7)物理調(diào)試接口

Candidates should be aware of available options for making physical connections to the target for the purpose of run-control debug (e.g. JTAG, SWD)

需要理解在線調(diào)試所需要的連接到物理目標系統(tǒng)的物理連接選項(如JTAG、SWD)。

JTAG是一個廣泛使用的工業(yè)標準,它在物理上通常需要至少5個信號引腳來連接主機計算機和ARM目標系統(tǒng)板。串行調(diào)試口SWD是一個擁有類似調(diào)試功能的2腳調(diào)試口,并且它通常只在較新的處理器上才有。

而從處理器抓取跟蹤信息,則需要比控制代碼執(zhí)行大得多的帶寬,因為每個周期都會有很多的32位地址和數(shù)據(jù)信息產(chǎn)生,因此專用的跟蹤端口需要更多的引腳。

此外,跟蹤信息也可以存儲在片上的緩沖區(qū)中,采用較少物理引腳的慢速調(diào)試口來讀取這些跟蹤信息。

(8)調(diào)試訪問內(nèi)存

Candidates should be aware of how a debugger uses the processor to access memory and be aware of how memory translation affects this. They should also understand the potential impact of cache maintenance caused by debug operations on the state of the memory system.

需要了解調(diào)試器是如何使用處理器來訪問內(nèi)存的,并且理解內(nèi)存轉(zhuǎn)換如何影響這種訪問,還需要理解對內(nèi)存系統(tǒng)狀態(tài)的調(diào)試操作可能帶來對緩存內(nèi)容維系的潛在影響。

調(diào)試器通常需要顯示調(diào)試目標內(nèi)存(或者外設(shè))的內(nèi)容并進行修改,它通常是通過處理器執(zhí)行加載或者存儲指令來實現(xiàn)的,然而有些系統(tǒng)則可以通過內(nèi)建的調(diào)試系統(tǒng)單元來直接對內(nèi)存進行寫(或讀)操作,不需要處理器本身參與內(nèi)存操作。

一個良好的調(diào)試器會減少調(diào)試動作對系統(tǒng)的影響。例如,它通常會盡量減小調(diào)試時對緩存的修改。

如果調(diào)試器在調(diào)試窗口上顯示一塊內(nèi)存區(qū)域的內(nèi)容但調(diào)試器必須使用處理器來讀取內(nèi)存時,它會盡量采用非緩存方式來操作,從而確保之前緩存中的內(nèi)容不會被沖刷掉。

程序員必須了解(當內(nèi)存管理單元MMU被使能時)調(diào)試顯示使用的是虛擬地址而非物理地址,而且緩存中的內(nèi)容可能與外部存儲器的內(nèi)容不一致。

如果內(nèi)存訪問是直接通過片上系統(tǒng)的調(diào)試單元(而非處理器)來進行的,那么訪問使用的就是物理地址而非處理器的虛擬地址轉(zhuǎn)換,而且它是直接訪問內(nèi)存的(繞過處理器的緩存)。

(9)半主機

Candidates should be aware of semi-hosting,understand what its function is and how it can be used during development. They should also be aware of the invasive nature of using this feature and how it may affect timing etc. They should also be aware of the danger of using semi-hosting when no debugger is connected and how to retarget the standard C library.

需要理解半主機的功能是什么,在開發(fā)過程中應(yīng)如何使用;

需要了解這種機制的侵入式特性以及它對時序等方面的影響;

還需要了解當目標板沒有連接調(diào)試器時使用這一機制的風險,以及它如何重定向到標準C庫。

半主機是一種讓ARM目標板上的代碼可以使用主機計算機上調(diào)試器提供的部分資源的機制。

這些資源可以包含鍵盤輸入、顯示輸出、硬盤I/O。例如,程序員可以使用這種機制提供的標準C庫函數(shù),如printf()和Scanf()來使用主機上的終端屏幕和鍵盤。

開發(fā)的硬件通常不包含全功能的輸入/輸出設(shè)備,而半主機則可以讓主機提供這些資源。

半主機是通過一系列專用的軟件指令產(chǎn)生異常來實現(xiàn)的。

應(yīng)用程序使用適當?shù)陌胫鳈C異常調(diào)用——調(diào)試中介來響應(yīng)異常處理。調(diào)試中介會提供到主機所需的通信。

半主機的接口一般是通過ARM提供的調(diào)試單元作為中介來實現(xiàn)的。ARM的工具使用SVC 0x123456(ARM狀態(tài))或者SVC 0xAB(Thumb狀態(tài))來表示半主機調(diào)試函數(shù)。

當然,如果脫離了開發(fā)環(huán)境,運行著調(diào)試器的主機并不會連接到目標系統(tǒng)上。此時開發(fā)人員有必要將任何使用到半主機的庫函數(shù)重定向,如fputc()函數(shù)。

之前調(diào)試一個小的IoT芯片就是,輕量級的設(shè)備沒有系統(tǒng),而是跑的一個協(xié)議棧。里面的打印都是fput。

這意味著需要使用能夠輸出字符到指定設(shè)備的代碼來替代使用SVC調(diào)用半主機的庫函數(shù)代碼。

2.標準調(diào)試技術(shù)

(1)調(diào)用棧

Candidates must understand what a call stack is and how it may be used in debugging.

需要理解什么是調(diào)用棧以及它在調(diào)試時應(yīng)如何使用。

應(yīng)用程序代碼主要使用堆棧來進行參數(shù)傳遞、保存局部變量和保存返回地址。

每個函數(shù)壓入堆棧的數(shù)據(jù)都被組織為一個“堆棧幀”,當調(diào)試器停止處理器時,它可以分析堆棧中的數(shù)據(jù),為程序員提供“調(diào)用?!保?/p>

這是從最頂層函數(shù)調(diào)用到當前子函數(shù)之間每一層級的調(diào)用關(guān)系,它可以在調(diào)試時讓用戶非常方便地了解整個調(diào)用路徑,了解為何程序會運行到當前的位置。

為了能夠重建調(diào)用棧,調(diào)試器必須能夠確定堆棧的哪些項包含了返回地址的信息。如果編譯的時候包含的話,這些信息一般會存在于“調(diào)試器信息”(DWARF調(diào)試表)中,或者從一個由程序壓入堆棧的“幀指針”鏈表獲得。

當然,代碼必須使用幀指針。如果這兩種類型的信息都沒有,那么這個調(diào)用棧無法被重建。

在多線程任務(wù)應(yīng)用中,每個線程都有自己的堆棧,因此調(diào)用棧的信息也只和它對應(yīng)的線程相關(guān)。

堆棧幀信息是指在函數(shù)調(diào)用過程中,由編譯器自動在堆棧上分配的數(shù)據(jù)結(jié)構(gòu),用于保存函數(shù)調(diào)用的狀態(tài)和局部變量等信息。在調(diào)用棧中,每個函數(shù)調(diào)用對應(yīng)一個堆棧幀,包含了該函數(shù)執(zhí)行所需的所有信息。

堆棧幀的主要作用是保存局部變量和函數(shù)參數(shù)。當函數(shù)被調(diào)用時,其局部變量和參數(shù)被壓入堆棧中,以便在函數(shù)執(zhí)行期間訪問。此外,堆棧幀還包含了函數(shù)調(diào)用的返回地址、環(huán)境信息(如寄存器值)等。

在調(diào)試過程中,通過分析堆棧幀信息,可以了解函數(shù)調(diào)用的層次結(jié)構(gòu)、當前執(zhí)行位置、變量的值等。這有助于理解程序執(zhí)行流程和定位問題。

為了能夠重建調(diào)用棧并獲取堆棧幀信息,編譯器需要在編譯時生成調(diào)試信息(如DWARF調(diào)試表)。這些調(diào)試信息包含了程序結(jié)構(gòu)和變量的元數(shù)據(jù),以及堆棧幀的布局信息。調(diào)試器可以利用這些信息來解析堆棧幀并重建調(diào)用棧,從而提供給開發(fā)人員一個完整的程序執(zhí)行視圖。

總之,堆棧幀信息是函數(shù)調(diào)用過程中的重要組成部分,通過它我們可以深入了解程序執(zhí)行的狀態(tài)和歷史,并利用這些信息進行調(diào)試和優(yōu)化。

(2)單步執(zhí)行

Candidates must understand what single stepping is and how it may be used in debugging. They should understand the difference between Step-In and Step-Over when single-stepping.

需要理解什么是單步執(zhí)行以及如何在調(diào)試中應(yīng)用,它需要理解在單步執(zhí)行時Step-In和Step-Over的區(qū)別。

單步執(zhí)行指的是調(diào)試時調(diào)試器可以控制執(zhí)行部分代碼,每一次執(zhí)行一條指令。Step-In和Step-Over的區(qū)別可以從函數(shù)調(diào)用中理解。

當采用Step-Over來調(diào)試函數(shù)時,整個函數(shù)會作為一步來執(zhí)行,讓程序員可以直接執(zhí)行整個函數(shù)而不需要進入函數(shù)里面去單步執(zhí)行。Step-In表示進入函數(shù)里面去單步執(zhí)行函數(shù)體。

(3)開始/停止

Candidates must understand what start/stop debugging is and how it may be used.

需要理解什么是開始/停止調(diào)試以及如何使用它。

開始的含義就是按下調(diào)試器的“開始”按鈕,處理器退出調(diào)試狀態(tài)并重新進入正常執(zhí)行狀態(tài)(從當前的程序指針處開始執(zhí)行),直到程序遇到某個讓它停止的因素為止,這些因素通常是一個斷點、觀察點或者捕捉向量事件或者是從外部調(diào)試器及其他系統(tǒng)阻塞所產(chǎn)生的調(diào)試請求。

開始/停止的調(diào)試模式與不能停止代碼執(zhí)行的調(diào)試的系統(tǒng)形成鮮明的對照。在一些嵌入式系統(tǒng)中(如汽車引擎控制系統(tǒng)),在進行系統(tǒng)調(diào)試時是不能簡單地讓處理器停止執(zhí)行的。

(4)打印printf

Candidates must understand how printf may be used in code instrumentation (they may also be expected to understand what other kinds of instrumentation might typically be used).

需要理解如何在代碼儀器化中使用printf(還需要理解其他可用的儀器化函數(shù))。

這是一個最基本的調(diào)試技術(shù),通常在所有的處理器架構(gòu)中使用,用于在代碼中插入指令來輸出一些數(shù)據(jù),例如來顯示程序的指令流或者某一時刻一些關(guān)鍵變量的值。

在代碼儀器化中,printf函數(shù)是一種常用的調(diào)試工具,用于輸出數(shù)據(jù)和信息,幫助開發(fā)人員了解程序的執(zhí)行狀態(tài)和變量的值。printf函數(shù)類似于其他編程語言中的輸出函數(shù),如C語言中的printf()函數(shù)或Python中的print()函數(shù)。

在代碼中使用printf函數(shù),需要在程序中插入printf語句,并在其中指定要輸出的內(nèi)容。這些內(nèi)容包括各種類型的變量、宏、表達式等。通過輸出這些內(nèi)容,可以在調(diào)試過程中了解程序的執(zhí)行狀態(tài)、變量的值以及其他關(guān)鍵信息。

(5)裸機代碼和應(yīng)用代碼

Candidates should be aware of the difference in debug options between applications running on OS-based or bare metal system (e.g. Ethernet, GDB server, ICE).

Example: Candidates should know that it is necessary to run a server program on the target system in order to debug an OS-based application.

需要了解基于操作系統(tǒng)的應(yīng)用層軟件調(diào)試和基于裸機代碼的系統(tǒng)調(diào)試方法的差別(如以太網(wǎng)、GDBServer、ICE)。

例如,需要知道在目標板上調(diào)試一個基于操作系統(tǒng)的應(yīng)用程序必須運行一個調(diào)試服務(wù)程序。

(6)RAM/ROM調(diào)試

Candidates should be aware of the limitations of debugging code running in different types of memory (e.g. breakpoints and image load).

Example: Candidates should know that it is not possible to set an unlimited number of breakpoints when executing code in ROM.More advanced candidates would understand why this is the case.

需要了解在不同類型的存儲空間中進行代碼調(diào)試的限制。

例如,應(yīng)該知道調(diào)試在ROM中執(zhí)行的代碼時是不能設(shè)置無限量的斷點的,更深入的了解應(yīng)該知道為什么如此。

軟件斷點只能設(shè)置在RAM中,因為RAM是可寫的空間。調(diào)試ROM中的代碼的另一個通常的限制是很難修改代碼來修改錯誤的部分。

在存儲空間中進行代碼調(diào)試時,確實存在一些限制,主要與存儲空間的類型和特性有關(guān)。以下是對您提到的幾種情況的詳細解釋:

ROM(只讀存儲器)中的代碼調(diào)試:

限制:由于ROM是只讀的,因此在ROM中執(zhí)行的代碼無法直接修改。這限制了調(diào)試過程中對代碼的修改能力,例如設(shè)置斷點。

為什么如此:由于ROM的設(shè)計目的就是為了保存固定數(shù)據(jù),例如程序代碼,而不是為了在運行時修改。因此,它不具備RAM的寫能力,這使得在ROM中執(zhí)行的代碼無法直接設(shè)置斷點。

軟件斷點與RAM:

限制:軟件斷點只能設(shè)置在RAM中。這是因為在RAM中,數(shù)據(jù)是可以寫入的,而ROM或其他類型的存儲器通常是只讀的。

原因:由于RAM是可寫的,所以可以在其上設(shè)置斷點。當程序執(zhí)行到特定的地址時,斷點會被觸發(fā),然后程序執(zhí)行會被暫停,允許開發(fā)人員進行調(diào)試。如果嘗試在ROM或其他只讀存儲器上設(shè)置斷點,硬件或操作系統(tǒng)通常會拒絕這種操作,因為這違反了只讀存儲器的設(shè)計目的。

修改ROM中的代碼:

限制:由于ROM的只讀特性,很難直接修改其中的代碼來修復(fù)錯誤。通常需要重新編譯和燒寫新的ROM映像。

原因:ROM的設(shè)計初衷是為了存儲固定、不可更改的數(shù)據(jù)。這意味著一旦ROM被編程(即寫入數(shù)據(jù)),其內(nèi)容就不能輕易更改。如果需要更改存儲在ROM中的代碼,通常需要重新編譯應(yīng)用程序,生成新的ROM映像,然后將其燒寫到ROM中。這比直接在RAM中調(diào)試和修改代碼要復(fù)雜得多。

總之,了解不同存儲空間中代碼調(diào)試的限制非常重要,因為它們影響了調(diào)試過程的效率和靈活性。在ROM中調(diào)試代碼通常更加困難,因為它們的只讀特性限制了對代碼的修改能力。而在RAM中調(diào)試則更加靈活,因為它是可寫的,允許開發(fā)人員設(shè)置斷點、修改變量和執(zhí)行其他調(diào)試任務(wù)。

(7)調(diào)試時序相關(guān)問題

Candidates should be aware that certain debug approaches may affect the timing of the code (e.g. halt mode) and be aware of non-invasive alternatives (e.g. trace).

需要了解某些調(diào)試方法可能會影響代碼的時序(如暫停模式)并了解其他非侵入式的調(diào)試方法(如跟蹤)。

在調(diào)試過程中,一些傳統(tǒng)的調(diào)試方法可能會對代碼的時序產(chǎn)生影響,例如在暫停模式下進行調(diào)試。這些方法可能會改變程序的執(zhí)行流程和時間,從而影響程序的性能和結(jié)果。

為了解決這個問題,一些非侵入式的調(diào)試方法被引入。其中一種常用的方法是跟蹤(Tracing)。

跟蹤是一種監(jiān)視程序執(zhí)行過程的技術(shù),通過記錄程序執(zhí)行過程中的關(guān)鍵事件和數(shù)據(jù),幫助開發(fā)人員了解程序的執(zhí)行狀態(tài)和行為。與傳統(tǒng)的調(diào)試方法不同,跟蹤不會干擾程序的執(zhí)行流程,因此對代碼的時序影響較小。

跟蹤可以通過在程序中插入跟蹤語句或使用專門的跟蹤工具來實現(xiàn)。

跟蹤語句可以在程序的特定位置輸出一些關(guān)鍵信息,例如變量的值、函數(shù)調(diào)用堆棧等。這些信息被記錄下來,并在程序執(zhí)行結(jié)束后進行分析。通過分析這些信息,開發(fā)人員可以了解程序的執(zhí)行路徑、變量的值以及其他關(guān)鍵信息。

除了跟蹤之外,還有一些其他的非侵入式調(diào)試方法,例如使用監(jiān)視點(Watchpoints)和斷點(Breakpoints)。

監(jiān)視點可以在程序的特定地址處設(shè)置一個觸發(fā)條件,當變量的值發(fā)生變化時觸發(fā)。通過使用監(jiān)視點,開發(fā)人員可以觀察變量的值變化,并了解程序的行為。斷點可以在程序的特定位置設(shè)置一個暫停點,當程序執(zhí)行到該位置時暫停。通過使用斷點,開發(fā)人員可以逐步執(zhí)行程序并觀察變量的值和執(zhí)行流程。

總之,了解某些調(diào)試方法可能會影響代碼的時序是重要的。

為了減小影響,開發(fā)人員可以選擇使用非侵入式的調(diào)試方法,如跟蹤、監(jiān)視點和斷點等。這些方法可以幫助開發(fā)人員了解程序的執(zhí)行狀態(tài)和行為,并發(fā)現(xiàn)潛在的問題和優(yōu)化方向。

(8)使用調(diào)試器調(diào)試軟件的影響(系統(tǒng)可能會被更改狀態(tài))

Candidates should be aware of the implications/impact of debugging (e.g.reading memory locations).

需要了解調(diào)試的含義和影響(如讀取內(nèi)存位置)。

調(diào)試是軟件開發(fā)過程中必不可少的一部分,它有助于發(fā)現(xiàn)和修復(fù)代碼中的錯誤和問題。然而,使用調(diào)試器進行調(diào)試時,確實可能會對軟件的系統(tǒng)狀態(tài)產(chǎn)生影響。以下是一些可能的影響和需要注意的事項:

1、系統(tǒng)狀態(tài)更改:在調(diào)試過程中,開發(fā)人員可能會暫停程序的執(zhí)行、單步執(zhí)行代碼、修改變量的值等。這些操作都可能直接或間接地更改系統(tǒng)的狀態(tài)。例如,修改變量的值可能會導(dǎo)致程序的行為與正常情況下不同。

2、內(nèi)存讀取和寫入:使用調(diào)試器時,開發(fā)人員經(jīng)常需要讀取和修改變量的值。這些操作可能涉及到內(nèi)存的讀寫。如果操作不當,可能會導(dǎo)致內(nèi)存損壞、數(shù)據(jù)丟失或其他未定義的行為。

3、性能影響:在調(diào)試過程中,程序的執(zhí)行可能會被暫停、中斷或減速,這可能會影響程序的性能。如果頻繁地進行調(diào)試,可能會導(dǎo)致程序的性能下降。

4、依賴性問題:在調(diào)試過程中,開發(fā)人員可能需要模擬某些外部事件或條件。這些模擬可能會導(dǎo)致程序的行為與實際運行時不同,從而引入依賴性問題。

5、安全性考慮:在某些情況下,調(diào)試可能會暴露敏感信息或允許惡意用戶利用調(diào)試器來操縱程序的行為。因此,在調(diào)試時需要注意安全性問題,并采取適當?shù)拇胧﹣肀Wo系統(tǒng)的安全。

為了減小調(diào)試對軟件系統(tǒng)狀態(tài)的影響,開發(fā)人員應(yīng)該采取一些最佳實踐:

1、備份重要數(shù)據(jù):在開始調(diào)試之前,建議備份重要的系統(tǒng)數(shù)據(jù)和配置,以防止意外更改導(dǎo)致數(shù)據(jù)丟失或損壞。

2、限制調(diào)試器的權(quán)限:確保調(diào)試器沒有不必要的權(quán)限,以減少潛在的安全風險。

3、使用斷言和日志記錄:在代碼中添加斷言和日志記錄可以幫助開發(fā)人員在調(diào)試過程中更好地理解程序的狀態(tài)和行為。

4、謹慎使用內(nèi)存操作:盡量避免直接讀寫內(nèi)存,特別是當程序處于不穩(wěn)定狀態(tài)時。

5、限制調(diào)試的范圍:盡量只在需要調(diào)試的部分代碼上使用調(diào)試器,而不是在整個程序上運行調(diào)試器。

6、定期測試和驗證:在調(diào)試過程中,定期測試和驗證程序的正確性和性能可以幫助開發(fā)人員及時發(fā)現(xiàn)潛在的問題。

7、遵循良好的編碼實踐:編寫高質(zhì)量的代碼可以減少潛在的錯誤和問題,從而減少調(diào)試的需要。

總之,雖然調(diào)試是軟件開發(fā)中必不可少的部分,但開發(fā)人員應(yīng)該意識到使用調(diào)試器可能對系統(tǒng)狀態(tài)產(chǎn)生的影響,并采取適當?shù)拇胧﹣頊p小這些影響。

PART THREE-架構(gòu)

1.指令集

(1)LDREX/STREXCLEX

Candidates should be aware of how these instructions work and how they might be used to implement software synchronization (e.g. mutex). At this level candidates should be able to recognize a simple mutex implementation (in assembler) and be able to explain its operation. They will not be expected to write one.

Example: Candidates should be aware of what a mutex is. More advanced candidates will be aware of the exclusive access instructions which are used to implement mutexes and similar constructs.

需要了解這些指令如何工作,如何用于軟件的同步(如互斥);

應(yīng)該能夠識別一個互斥的應(yīng)用(在匯編代碼中)并能解釋它們的作用,但不需要自己編寫一個此類代碼應(yīng)用。

LDREX和STREX是ARM架構(gòu)中的兩條指令,它們被用來實現(xiàn)原子操作。原子操作是一種在執(zhí)行過程中不會被其他線程或進程中斷的操作。

LDREX指令用于讀取內(nèi)存中的值,并標記對該段內(nèi)存的獨占訪問。它會在讀取寄存器Ry指向的4字節(jié)內(nèi)存值后,將其保存到Rx寄存器中,同時標記對Ry指向內(nèi)存區(qū)域的獨占訪問。如果執(zhí)行LDREX指令的時候發(fā)現(xiàn)已經(jīng)被標記為獨占訪問了,并不會對指令的執(zhí)行產(chǎn)生影響。

STREX指令在更新內(nèi)存數(shù)值時,會檢查該段內(nèi)存是否已經(jīng)被標記為獨占訪問,并以此來決定是否更新內(nèi)存中的值。如果執(zhí)行這條指令的時候發(fā)現(xiàn)已經(jīng)被標記為獨占訪問了,則將寄存器Ry中的值更新到寄存器Rz指向的內(nèi)存,并將寄存器Rx設(shè)置成0。指令執(zhí)行成功后,會將獨占訪問標記位清除。一旦某條STREX指令執(zhí)行成功后,以后再對同一段內(nèi)存嘗試使用STREX指令更新的時候,會發(fā)現(xiàn)獨占標記已經(jīng)被清空了,就不能再更新了,從而實現(xiàn)獨占訪問的機制。

這兩條指令常被用來在并發(fā)編程中實現(xiàn)線程間的同步,以避免數(shù)據(jù)競爭和其他并發(fā)問題。

在軟件開發(fā)中,同步是一種重要的技術(shù),用于確保多個線程或進程在共享資源時的正確行為?;コ猓╩utex)是實現(xiàn)軟件同步的一種常見方法,它允許多個線程安全地訪問共享資源。為了理解互斥的實現(xiàn),開發(fā)人員需要了解底層指令的工作原理。

在匯編語言中,有一些特定的指令可以用來實現(xiàn)互斥和軟件同步。這些指令通常涉及對內(nèi)存的讀寫操作,以及對進程或線程狀態(tài)的更改。

例如,一個簡單的互斥實現(xiàn)可能使用以下類型的指令:

原子操作指令:這些指令在執(zhí)行過程中不會被其他線程或進程中斷,因此可以在沒有鎖的情況下安全地修改共享變量的值。例如,一些CPU提供了CMPXCHG(比較并交換)指令,它可以原子地比較和交換內(nèi)存中的值。

自旋鎖指令:這些指令允許一個線程持續(xù)檢查一個條件,直到該條件變?yōu)檎?。這通常用于實現(xiàn)循環(huán)鎖,其中線程在等待獲取鎖時會“自旋”。例如,CMP(比較)和JXX(條件跳轉(zhuǎn))指令可以組合使用來實現(xiàn)自旋鎖。

阻塞和喚醒指令:這些指令允許線程阻塞自己(例如,通過WAIT或PAUSE指令),直到另一個線程喚醒它(例如,通過SIGNAL或WAKE指令)。

了解這些底層指令如何工作對于理解互斥等同步機制的實現(xiàn)至關(guān)重要。開發(fā)人員需要能夠識別和理解這些指令在匯編代碼中的應(yīng)用,以便更好地理解軟件的同步行為。

值得注意的是,雖然了解這些底層細節(jié)對于深入理解同步機制是有幫助的,但在實際開發(fā)中通常會使用更高級的抽象和工具(如操作系統(tǒng)提供的線程同步原語或高級語言中的并發(fā)庫),而不是直接編寫匯編代碼來實現(xiàn)這些機制。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19039

    瀏覽量

    228485
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9009

    瀏覽量

    366087
  • 控制器
    +關(guān)注

    關(guān)注

    112

    文章

    16037

    瀏覽量

    176678
  • 指令集
    +關(guān)注

    關(guān)注

    0

    文章

    221

    瀏覽量

    23323

原文標題:1.指令集

文章出處:【微信號:IC學(xué)習,微信公眾號:IC學(xué)習】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    ARM處理器簡介及RISC設(shè)計要點

    ARM是一個32位RISC(精簡指令集)處理器架構(gòu),ARM處理器則是ARM架構(gòu)下的微處理器。
    的頭像 發(fā)表于 04-01 08:17 ?9203次閱讀
    <b class='flag-5'>ARM</b><b class='flag-5'>處理器</b>簡介及RISC設(shè)計要點

    ARM處理器ARM處理器工作模式

    ARM處理器狀態(tài)ARM處理器的工作狀態(tài)一般有兩種,并可在兩種狀態(tài)之間切換:第一種為ARM狀態(tài),此時處理
    發(fā)表于 01-27 11:13

    ARM處理器ARM處理器工作模式

    ARM處理器狀態(tài)ARM處理器的工作狀態(tài)一般有兩種,并可在兩種狀態(tài)之間切換:第一種為ARM狀態(tài),此時處理
    發(fā)表于 01-27 14:19

    怎么區(qū)分ARM Cortex系列的處理器

    頻率可以達到400Mhz。當然,性能不是選擇處理器的唯一指標。在許多應(yīng)用中,低功耗和成本是關(guān)鍵的選擇指標。因此,Cortex-M處理器家族包含各種產(chǎn)品來滿足不同的需求:不同于老的經(jīng)典ARM
    發(fā)表于 09-13 10:01

    ARM處理器簡單介紹

    ARM公司開發(fā)了很多系列的ARM處理器核,目前最新的系列已經(jīng)是ARM11了,而ARM6核及更早的系列已經(jīng)很罕見了,
    發(fā)表于 07-23 07:08

    什么是ARM處理器 ARM處理器有哪些系列

    包括 幾種內(nèi)存管理單元的變種,包括簡單的內(nèi)存保護到復(fù)雜的頁面層次。ARM處理器系列包括 ARM7 系列、ARM9 系列、
    發(fā)表于 09-24 17:47

    淺談ARM處理器架構(gòu)

    `讓我們先從ARM處理器家族說起。一、ARM 處理器家族多年來,
    發(fā)表于 08-18 12:04

    ARM Cortex-M處理器詳解 精選資料分享

    ARM Cortex-M處理器家族現(xiàn)在有8款處理器成員。在本文中,我們會比較Cortex-M系列處理器之間的產(chǎn)品特性,重點講述如何根據(jù)產(chǎn)品應(yīng)
    發(fā)表于 07-16 07:57

    ARM,ARM處理器是什么意思

    ARM,ARM處理器是什么意思 ARM處理器簡介 ARM(Advanced RISC Mach
    發(fā)表于 03-26 10:53 ?5239次閱讀

    arm是什么處理器arm處理器匯總

    ARM處理器是Acorn計算機有限公司面向低預(yù)算市場設(shè)計的第一款RISC微處理器。更早稱作Acorn RISC Machine。ARM處理器
    發(fā)表于 11-10 16:32 ?3114次閱讀

    arm的協(xié)處理器有幾個?ARM協(xié)處理器詳解

    本文首先介紹了ARM處理器特點與主要模式,其次介紹了arm的協(xié)處理器有幾個,最后介紹了CP14和CP15系統(tǒng)控制協(xié)處理器。
    發(fā)表于 04-24 15:34 ?8884次閱讀

    從Cortex-M到 Cortex-A認識ARM處理器

    從Cortex-M到Cortex-A認識ARM處理器
    的頭像 發(fā)表于 03-08 11:34 ?3366次閱讀

    Cortex-M3是一款ARM處理器內(nèi)核

    Cortex-M3:是一款ARM處理器內(nèi)核,也可以理解為ARM處理器家族之中的一個成員。ARM
    的頭像 發(fā)表于 06-24 14:44 ?1.1w次閱讀

    arm處理器有哪些中斷源?arm處理器對異常中斷的響應(yīng)過程

    arm處理器有哪些中斷源?arm處理器對異常中斷的響應(yīng)過程? ARM處理器是一種廣泛使用的嵌入式
    的頭像 發(fā)表于 10-19 16:35 ?1306次閱讀

    簡單認識高級處理器

    除了傳統(tǒng)的處理器 (CPU、MPU/MCU、DSP 和 GPU),面向當代各種應(yīng)用的高級處理器(Advanced Processors)層出不窮,例如加速處理單元 (Accelerated
    的頭像 發(fā)表于 12-07 11:31 ?804次閱讀
    <b class='flag-5'>簡單</b><b class='flag-5'>認識</b>高級<b class='flag-5'>處理器</b>