在產品開發中,調試工具是不可或缺的開發利器,除了日常常見的ARM的CMSIS-DAP/ULINK,IAR的I-JET,P&E的U-multilink/Cyclone, 各個半導體廠商自定義的XX-LINK(例如LPC-link, ST-Link,等)之外,還有兩個是神一樣的存在,一個是SEGGER的J-LINK,支持與IAR/KEIL等各種編譯環境無縫銜接,性能穩如老狗, 價格低廉, 所以在嵌入式工程師中的普及率非常高,被稱為居家旅行匱贈好友之佳品。另外一個是一聽名字就感覺高大上的勞特巴赫Lauterbach,作為專業第三方調試工具廠商,以其強大的TRACE32開發調試工具享譽全球,TRACE32開發工具擁有非常豐富和強大的功能,包括基本調試配置、RTOS、多核系統、虛擬目標調試、能耗分析以及強大的腳本語言等,而且可以支持市場中使用的80多種常見的微處理架構。
當然Lauterbach性能的強大,對應的代價就是價格也比JLINK多出一個數量級,但是對于大部分嵌入式開發者來說,最常用的還是基本的調試功能,包括斷點,寄存器查看,內存/Flash的查看,本文從斷點使用的角度講解如何使用JLINK配合IAR支持的各種斷點用出點勞德巴赫的一些強大功能。
斷點的概念非常簡單,目的簡單來說就是在指定指令或者代碼行中斷程序的執行,實現上可以是硬件斷點(通過編程FPB實現)也可以是軟件斷點(通過插入BKPT斷點指令實現 ),具體二者的底層實現這里不展開討論。常規的斷點調試(本質上是代碼斷點)是在想觀察哪里的問題時就在對應的代碼地址雙擊設置斷點,并且一旦運行到斷點位置會讓程序自動暫停運行,然后觀察感興趣的變量,內存或者寄存器,這種斷點調試功能能幫助開發者解決大部分的問題,但是其也有很大的局限性。
因為很多時候我們只想知道某段代碼是否運行過,而不能讓程序停下來,譬如說調試BLE協議棧,無法去單步運行,否則會打斷BLE主機和從機之間的通訊時序,而導致整個系統功能出現問題。還有中斷處理函數的調試,程序一旦停下了也就失去了其他所有中斷的后續響應,再比如兩個設備通信,一旦一方采用常規斷點的方式調試,可能會打斷正常的通信過程。所以通常的做法是添加串口打印或者ITM半主機打印輸出log信息到顯示屏,但是這種方式會帶來額外的軟硬件開銷(對于串口打印來說是兩個UART pin腳+UART驅動函數,對于ITM打印輸出是一個SWO+ITM驅動),甚至因為引入新的代碼導致程序出錯。除此之外,還有3種場景是這種普通斷點無法滿足的,第一個是同一段循環體運行N次才停下來,第二個是當變量被寫入新的數據或者被讀取時停下來,第三個是實時記錄斷點所在行某個特定變量或者地址的值,并在時間軸上以圖形的形式顯示出來,方便分析和對比。
以上這些功能在這些功能在勞德巴赫中是最基本功能,同樣在IAR中也提供了不同形式的斷點類型和組合,只是日常習慣了只用了其代碼斷點的功能,沒能充分發揮IAR的強大斷點功能,針對以上4種問題在IAR中可以分別用日志斷點、條件斷點、讀寫權限的數據斷點、數據日志斷點逐個擊破,從而避免了額外添加代碼的繁瑣,也能為解決隱藏bug提供更加靈活的手段。尤其是其中的讀寫權限的數據斷點,筆者曾經就是使用這種辦法幫客戶解決了兩個埋藏的很深大bug,其中一個是查找某個關鍵變量在哪里被意外修改,通過設置條件斷點+stack callback迅速定位到了肇事代碼段,另一種是客戶代碼意外堆棧溢出調查,當時的做法是在堆棧大小的90%地址靠近棧頂處設置一個寫觸發的數據斷點,當某層調用過程中堆棧接近溢出時,設置的數據斷點會被觸發而停止應用程序,從而迅速找到堆棧是在哪層調用溢出的,從而解決問題。
嵌入式物聯網需要學的東西真的非常多,千萬不要學錯了路線和內容,導致工資要不上去!
無償分享大家一個資料包,差不多150多G。里面學習內容、面經、項目都比較新也比較全!某魚上買估計至少要好幾十。
點擊這里找小助理0元領取:嵌入式物聯網學習資料(頭條)
總結下來,在 IAR 中,主要有以下幾種斷點,下面逐一介紹。
這種斷點就是前面提到的最常用的斷點,也是最簡單的斷點。開發則只需要在反匯編窗口中選擇C行或ASM指令并切換斷點。一旦遇到斷點,用戶應用程序將停止。這時候可以查看變量、標志和寄存器的值。換句話說,開發者擁有完全的控制權。對于這種普通代碼斷點,其數量受限于硬件斷點的數量,例如對于 Arm Cortex-M,通常有6-8個硬件斷點,但如果使用軟件斷點或在RAM中運行應用程序,則可以不受限制。使用時只需選擇顯示View -> Breakpoints 窗口,就可以啟用或禁用斷點。
默認情況下,IDE 將設置代碼斷點,而且是auto類型,可以通過Option->Debugger->JLINK/JTrace->Breakpoint去設置硬件斷點還是軟件斷點。如果開發者有 I-jet,可以在右鍵單擊代碼行時明確選擇一個 flash斷點。注意斷點符號中的“F”。Flash 斷點功能在適用于 Arm 的IAR7.60 或更高版本中可用。
條件斷點是代碼斷點與某些標志或變量作為條件的組合。設置斷點后,同樣可以再次使用View -> Breakpoints 窗口查看所有斷點,也可以通過右鍵單擊并選擇Edit option來設置額外參數。
設置斷點條件所使用的語法類似于C語法,可以使用==、>=和 <=。例如,如果您希望應用程序在計數器等于 10 時在斷點處停止,您可以使用“counter==10”。這在中斷例程中需要斷點時非常有用。如果沒有設置條件,應用程序就會一直被停止,影響到系統的正常工作,使用標志或變量作為條件使事情變得容易得多。甚至用戶還可以使用跳過計數器和條件檢查(如true或changed)來實現更復雜的斷點停止條件設置。該方法可以解決上面提到的第二種問題。
與其他斷點相比,數據斷點有點不同,因為是對特定內存地址、標志、變量或寄存器的讀寫訪問的監控。使用時只需右鍵單擊標志或變量并選擇選項Set data Breakpoint。默認情況下,對該變量,特定地址,寄存器的任何讀取和寫入訪問都會觸發斷點。如果你想添加額外的設置,你可以通過View->Breakpoints 窗口和Edit 選項來完成. 除了讀寫訪問之外,還可以監控數據是否匹配來作為斷點的觸發條件,這意味著寫或讀訪問只會在數據匹配時觸發暫停。另外,通過選擇編輯按鈕,開發者還可以打開一個額外的窗口,可以選擇絕對地址甚至源代碼所在行。對于變量或標志,建議使用自動大小。如果需要監控更大的范圍,則應手動設置監控的地址范圍或者變量范圍,譬如說監控一個結構體的數據變化,使用這種數據斷點也是可以實現的,但需要用戶正確設置變量,特定地址,寄存器等監控對象的Size。使用這種方法可以解決前文提到的第三種問題。
此處需要特別提一下,數據斷點對于調試被應用程序破壞的標志和變量非常有用。筆者曾經就是使用這種辦法在客戶解決了兩個埋藏的很深大bug,其中一個是查找某個關鍵變量在哪里被意外修改,通過設置條件斷點+stack callback迅速定位到了肇事代碼段,另一種是客戶端的意外堆棧溢出調查,當時的做法是在堆棧大小的90%地址靠近棧頂處設置一個數據斷點,當堆棧溢出接近時,設置的數據斷點會被觸發而停止應用程序,從而迅速找到問題的根源,至于如何設置,此處暫不展開。
除了具有讀寫訪問權限的數據斷點外,開發者還可以使用數據日志斷點。這種斷點的好處在于可以在時間線中監視和以圖形方式繪制內存中特定變量或地址的值,使顯示更加直觀,用戶還可以在同一個時間軸上顯示和比較兩個或多個變量,從而在邏輯上排查問題。設置的方法就是View->Breakpoints 窗口和Edit 選項,然后選擇set Data Log Breakpoint for counter即可,使用這種方法可以解決前文提到的第四種問題。
時間線以及附加數據日志和數據日志摘要可在探針選項下找到,例如如下面的屏幕截圖所示。
除了代碼和數據斷點之外,還有一種日志斷點,這是一個特殊的斷點,因為它只會臨時暫時停止應用程序以打印消息,然后繼續代碼的運行。一旦運行到設置的日志斷點,它會顯示如下用戶預先設定的消息,告知用戶某個函數事件被觸發。這種方式的好處在于,無需額外添加串口打印或者ITM半主機打印輸出log信息到顯示屏,無需額外的軟硬件開銷,便可實現基本的信息打印,方便開發者跟蹤程序的執行流程。
如下圖所示,每次斷點命中時,調試日志窗口中都會顯示一條消息。添加的計數器可以了解應用程序通過該部分源代碼的次數。通過這種辦法可以解決前面提到的第一個問題,即不停止代碼又能獲知感興趣的代碼段是否被執行過,以及執行的次數,兵不血刃,無需添加任何額外的代碼。
除了代碼的調試,IAR還支持先進的電源調試技術,可以監控功耗,并將其與源代碼相關聯。這也使得添加電源斷點成為可能,可以設置一個閾值,如 25mA,一旦能量高于該值,調試器將被觸發停止。設置閾值非常簡單, 只需要打開J-Link->PowerLog 窗口,然后設置值和所需選項,如上圖或下圖所示。通過這種分析,可以直觀的看出代碼執行過程中的功耗值,下面的時間線窗口不是必需的,但它可以為提供正在使用的能量提供一個時間參考。
至此,介紹完了IAR支持的6種不同的斷點類型和使用方法,也順帶針對性的解決了前文中提到的日常調試遇到的四個問題。如果在日常調試過程中靈活運用以上的這幾種斷點,對于日常調試提高開發速度和解決一些深藏的bug(例如前文提到的大型程序中變量被莫名修改,堆棧溢出追蹤等) 很有幫助。當然勞特巴赫之所以賣的這么貴,必然有其強大之處,尤其是強大的腳本編程,多核系統,能耗分析以及對芯片內部操作的開放度,能給開發者最大的操作靈活度。但就日常的斷點調試看,IAR+JLINK的組合也基本能滿足大部分的需求,畢竟就地取材最方便。
原文鏈接:https://mp.weixin.qq.com/s/3b2dsi6Gh05nS4Gfo9lHgQ
文章轉載自:痞子衡嵌入式
文章來源于:如何使用JLINK配合IAR的斷點功能用出點勞德巴赫的感覺
原文鏈接:如何使用JLINK配合IAR的斷點功能用出點勞德巴赫的感覺
版權聲明:本文來源于網絡,免費傳達知識,版權歸原作者所有,如涉及作品版權問題,請聯系我進行刪除
摘要:針對物聯網中傳感器種類繁多、接口不一致的現狀,設計了一種新型的無線傳感器通用接口。該接口由信號處理電路、藍牙芯片、電源和無線射頻電路組成,具有體積小、即插即用、功耗低等特點。接口所采樣的信號通過藍牙傳輸給數據采集器或云服務器,并實時在界面上顯示。該通用接口可在工業現場、智能家居、樓宇監控等場合下用于電流、電壓、開關量與串口形式傳感器信號的處理。并給出了通用接口的設計方案。測試結果表明,該接口可以有效處理傳感器信號,達到了預期目標。
0引言
隨著物聯網[1]概念的興起和發展,通用傳感器接口[2]成為了傳感網絡中一個重要的研究領域。新的感測技術層出不窮,在信號處理、數字通信及本地智能擴展方面對類型多樣的傳感器信號提出了越來越高的處理要求[3]。微電子技術、半導體工藝與無線通信等技術日益成熟,出現了向傳感器內部實現信息采集、數據處理和無線傳輸一體化發展的趨勢。我國物聯網的發展呈現良好的發展態勢[4],然而在傳感器接口方面卻存在連接口復雜多樣、維護或更換困難、傳感器接口兼容性差等問題。在物聯網應用日益普及的大背景下,為了縮短開發時間,降低風險,迫切需要研發低成本、高性能的通用傳感器接口[5]。
在無線傳輸領域,相比于ZigBee[6]、WiFi[7]這些活躍的新興技術,藍牙在個人電腦及移動終端具備很大的基礎積累。最新的藍牙4.2協議提供了政府級隱私權限與信息安全保障,2.5倍傳輸速率提升,支持IPv6的互聯網連接[8],適合在物聯網領域尤其是智能家居行業中應用[9]。
1接口組成與應用框架
基于藍牙4.2協議設計無線傳感器通用接口屬于無線通信與電工電子領域,其應用場景如圖1所示,主要由節點、數據采集器、藍牙4.2無線傳感器網絡(BLE 4.2 Wireless Sensor Network, BLE 4.2 WSN)、路由器和云端組成。每個節點含有傳感器、信號接口電路、藍牙芯片、電源與無線射頻,內部結構如圖2所示。
將信號接口電路、電源、藍牙芯片和無線射頻電路共同組成的數據采集系統稱為無線傳感器接口。信號接口電路可處理多種類型傳感器信號。每個節點通過路由器、支持6LoWPAN[10]或藍牙4.2的接入點,周期性地向BLE 4.2 WSN傳輸所采樣的數據。數據采集器可以接入BLE 4.2 WSN或云端,對接口進行參數設置。
與藍牙4.0/4.1不同,藍牙4.2協議直接支持IPv6地址分配,接入BLE 4.2 WSN網絡中的每個傳感器節點都會分配到唯一的IPv6地址。
2信號接口電路與供電
傳感器的信號處理是無線傳感器通用接口設計中的一個核心組成部分。需要考慮應用的實際需求,也應考慮成本、可行性等因素。查閱相關文獻,為接口設計了電流、電壓、開關量與串口通信電路。
2.1電流型接口電路
在工業應用中,一般傳感器將物理量轉化為電流輸出。鑒于儀器儀表標準輸出為4~20 mA電流[11],設計如圖3所示電流轉電壓接口,將電流轉為電壓。其中,傳感器通過圖3中端口Cn1與Cn2接入,選用INA214芯片,其內部放大器增益為100。改變電阻R1阻值便可改變輸出電壓Vout范圍,通過藍牙芯片內的A/D轉換即可測量輸入電流大小。其中Power_Supply為傳感器供電電源,Vcc_IO為接口電源。
2.2開關量接口電路
在日常生活、工業現場或樓宇等場景下,常會遇到如繼電器、接近開關,為了檢測開關量狀態,采用如圖4所示電路。
圖4中,S2代表傳感器輸出,單刀雙擲開關S1通過觸點1或3即可靈活選擇電源。選用光耦如4N25實現電氣隔離,MCU I/O代表微控制器引腳輸入。開關S2斷開時,MCU I/O輸出為邏輯高電平;當S2為閉合狀態時,MCU I/O輸出為邏輯低電平。微控制器只需讀取I/O引腳狀態便可判斷開關量S2的邏輯狀態。
2.3接口供電
為了便于在物聯網中使用,設計了內部6 V電池和外接電源兩種方式供電。為保證微處理器及外設正常工作,需要穩定的電壓。設計電源如圖5、圖6所示。
其中DC為外部7~40 V供電接入口,經LM2576S5降壓后輸出5 V電壓作為Vcc_IO,用于信號接口電路,D2、D4為二極管,用于內部電池與外部供電切換;AP733333SAG7芯片為低功耗穩壓電路,降壓輸出3.3 V作為藍牙芯片電壓Vcc_nRF;BT1代表電池。
2.4電壓型接口電路
藍牙芯片nRF51822片內集成A/D轉換器,工作電壓范圍為0~3.6 V。傳感器輸出的1~5 V電壓SVin經單片機A/D輸入通道AINx即可測量電壓大小,如圖7所示。其中D1為5 V穩壓二極管,作為過壓保護;電阻R1、R2、R3圖7電壓接口電路用于將5 V降壓為3.6 V。
2.5串口通信電路
藍牙芯片nRF51822片內集成UART控制器,與串口驅動模塊連接如圖8所示。
其中RXD為串口輸入端,TXD為串口發送端。CTS為清除發送;RTS為請求發送。MAX232ACPE為RS232驅動芯片,Vcc_IO為接口電壓,J1為DB9接口。
3藍牙4.2傳感器網絡
通過上文提及的接口電路可完成傳感器信號的采集,而數據的無線傳輸則借助藍牙實現。
3.1藍牙4.2協議
低功耗藍牙支持星型拓撲[12],主要分為應用層、主機與控制器。主機與控制器通過主機控制器接口交換信息。控制器負責物理層射頻信號收發;主機側重于邏輯控制、安全以及屬性配置,并為應用層提供底層服務接口。搭載藍牙4.2協議的傳感節點,需要配置GATT以便于讀寫傳感器數據。應用層提供API為上層用戶程序調用,用于控制底層藍牙設備,包括設備名稱、廣播時間、屬性與特征配置等。
3.2軟件設計
針對接口功能需求,設計接口底層嵌入式軟件以及數據采集器應用。其中接口底層程序用于處理傳感器信號并發送給采集器;采集器的應用則與用戶交互,控制接口底層的工作。
3.2.1接口底層軟件
基于Nordic的S110[13] 協議棧編寫接口底層軟件,工作流程如圖9所示。通用接口與數據采集器之間通信流程:先對藍牙模塊進行初始化設置,初始化完成后,藍牙模塊發出廣播信號等待數據采集器連接,如果在廣播期間內接收到數據采集器的連接請求,則與之配對。若配對成功,則接口停止廣播,數據采集器通過藍牙設置接口參數,設置完畢后,傳感器接口開始數據采集工作,經信號接口模塊處理后,傳給藍牙模塊進一步處理,而后無線發送給數據采集器,發送成功之后繼續采集數據。周而復始不斷采集、發送數據。
使用嵌入式C語言編寫接口底層程序,管理nRF51822資源,完成外圍硬件的初始化設置、協議棧初始化、設備配對以及傳感器數據的收發與解析等;數據采集器發送的命令經藍牙傳輸給下位機,下位機解析命令后執行;命令包括接口功能選擇、參數設定如A/D采樣速率、串口波特率等。
3.2.2數據采集器應用
數據采集器采用基于Android平臺系統的嵌入式設備,如智能手機。Android系統功能豐富,開發者調用Android API庫構建程序組件即可實現各種功能[14]。本文使用Java語言開發應用,調用藍牙API完成設備掃描、連接與通信。
4通用接口設計與驗證
由于目前藍牙4.2協議還未普及,采用已經成熟的4.0協議做探索性試驗,驗證通用接口方案的可行性與可靠性。
4.1接口電氣兼容性
在實際接口設計與使用時,遵循的電氣規范包括A/D量程范圍(0~3.6 V)、微控制器引腳輸出驅動能力(最大驅動電流15 mA)、串口RS232引腳規范等。
4.2藍牙通信模塊
選用Nordic藍牙核心模塊,該模塊含有CortexM0內核的nRF51822芯片,含有包括ADC、UART、SPI等豐富資源,適合應用于設計無線傳感器通用接口。
4.3實測結果
使用C語言編寫的代碼經Keil編譯鏈接后下載到nRF51822上;Java編寫的應用安裝到手機上。測試信號包括高低電平、模擬電流與電壓,以及串口數據。終端的部分工作界面如圖10所示。
5結論
通過對各種類型傳感器信號的實驗測試可知,本文設計的通用接口結構簡單,設置與使用方便,連接常用的傳感器即可實時檢測分布松散的物理變量而無需布線;對于環境監測與海量信息采集,可利用數據采集器傳入云服務器分析。通用接口的研究與應用,有利于促進物聯網的發展。
參考文獻
[1] YOUNAS M, AWAN I, PESCAPE A. Internet of Things and Cloud services[J]. Future Generation Computer Systems, 2016, 56: 605606.
[2] LI X, MEIJER G C M, DE BOER R, et al. A highperformance universal sensor interface[C]. Sensors for Industry, 2001. Proceedings of the First ISA/IEEE Conference. IEEE, 2001: 1922.
[3] WILSON P D, HOPKINS S P, SPRAGGS R S, et al. Applications of a universal sensor interface chip (USIC) for intelligent sensor applications[C].Advances in Sensors, IEEE Colloquium on. IET, 1995: 3/13/6.
[4] 工信部. 物聯網 “十二五” 發展規劃[EB/OL].(20140219)[20160430].http://www.als.gov.cn/jw/zdgz/1_52290/default.shtml.
[5] 于海斌, 梁煒, 曾鵬. 智能無線傳感器網絡系統[M]. 北京:科學出版社, 2013.
[6] 劉子京, 裴文江. 基于ZigBee 協議的無線傳感器網絡研究[J].計算機技術與發展, 2009, 19(5): 192194.
[7] PATEL N, DESAI N. WiFi module and wireless sensor network based automated irrigation system[J]. SYSTEM, 2015, 2(4): 7076.
[8] 于博. 藍牙技術聯盟發布 Bluetooth 4.2 核心版本[J]. 中國電子商情: 基礎電子, 2015 (3): 1516.
[9] 王偉.藍牙4.2: 物聯網首選無線技術標準[J].電子技術應用,2015, 41(2): 7.
[10] MA X, LUO W. The analysis of 6LoWPAN technology[C]. 2008 IEEE PacificAsia Workshop on Computational Intelligence and Industrial Application. IEEE, 2008: 963966.
[11] 林勇.工業控制用4~20mA電流變送器[J].電子元器件應用,2006, 8(7): 28.
[12] 楊寧,田耀,張平,等.無線傳感器網絡拓撲結構研究[J].無線電工程,2006, 36(2): 1113.
[13] 周堂興.基于FPGA的脈搏與血氧飽和度監測系統研究[D].上海:東華大學,2015.
[14] 曾健平,邵艷潔.Android系統架構及應用程序開發研究[J].微計算機信息,2011, 27(9): 13.