如何實現軟體的遠端更新 如何實現嵌入式系統遠端除錯

2021-10-11 17:22:02 字數 2936 閱讀 4716

嵌入式系統隨著目前科技的發展,正逐步融入人們的生活中。對於嵌入式系統,我們應該有所了解。就專業人員而言,他們對嵌入式系統早已駕輕就熟。為增進大家對嵌入式系統的認識,本文將對嵌入式系統的遠端除錯予以介紹。注意,本文中的嵌入式系統遠端除錯方案僅僅代表一種方式,僅提供一種參考。如果你對嵌入式系統抑或是嵌入式系統的遠端除錯具有興趣,不妨繼續往下閱讀哦。

一、基本方法

圖1(a)是傳統的嵌入式除錯方法:主機pc通過串列埠與從機嵌入式系統相連,接收從嵌入式系統發來的除錯資訊並向嵌入式系統傳送除錯指令,主機和從機之間只能有幾公尺或者幾十公尺的距離。圖1(b)是現在比較流行的遠端嵌入式除錯方法:主機pc和從機嵌入式系統分別通過乙太網連線到網路上,主機通過諸如telnet之類的協議向嵌入式系統接收除錯資訊和傳送指令。本文介紹的方法是將這兩者結合起來,位於遠端的嵌入式系統與其相鄰的pc2通過串列埠相連,主機pc1和從機pc2各自通過乙太網連線到網路上,主機pc1仍然通過telnet協議(使用windows自帶的「超級終端」程式)與從機pc2通訊,在從機pc2上執行一種我們設計的軟體telent2com,其將telnet協議轉換成串列埠的資料收發。為了能夠更好地完成對遠端的嵌入式系統的控制,還使用了telnet協議中特殊的控制命令來通過串列埠的額外控制線和一定的硬體電路完成對嵌入式系統,如電源和i/o輸入的控制,如圖1(c)所示。

使用這種方法單從嵌入式系統的角度來說,基本上沒有增加任何額外的電路和成本,仍和第一種方法一樣對外使用串列埠進行通訊。雖然增加了一台額外的pc機,但是對於那些在正常工作中不需要使用網路,只在測試和除錯時需要使用網路來完成除錯和更新韌體的嵌入式系統來說,這台額外的pc機只能算作是乙個除錯工具。

此外,由於增加了通過網路完成對嵌入式系統的電源和i/o輸入的控制,相對於第2種方法,即使在除錯中嵌入式系統由於某種原因宕機了,仍能從遠端通過控制電源,使系統上電復位;而對系統i/o輸入的控制,則可以更好完成模擬系統與外界的互動模擬。

整個系統的工作由兩部分構成:① telnet到串列埠之間通訊協議轉換的pc端程式;② 使用串列埠控制線控制嵌入式系統電源和i/o輸入的介面電路。

二、介面電路的設計

介面電路主要是完成將串列埠rxd和txd以外的控制線(如rts、cts等)對嵌入式系統電源或者i/o輸入進行控制。為了防止嵌入式系統可能對pc串列埠的影響,採用圖2所示的電路。通過使用光耦來達到pc串列埠和嵌入式系統之間的電氣隔離,通過使用繼電器能夠控制不同電壓的電源和不同電平的訊號。

三、telnet到串列埠轉換的軟體

telnet是一種最基本的網路應用層協議,其通訊協議由rfc0854定義。它是建立於tcp協議之上的用於傳送資料和控制資訊的協議。在預設情況下,其使用tcp埠23。最初設計它的目的,是為建立一種基於網路的序列終端**協議。這也正是為什麼可以使用telnet協議傳送串列埠資料的原因。

通過telnet傳送的資料基本以原來的格式(如果是0xff資料,則以兩個0xff表示)填充到tcp訊息的有效資料載荷區。對於控制資訊(如轉入二進位制模式命令,以及我們自定義的控制電源和i/o的命令)則通過在控制命令前加iac轉意字元(0xff)方式混雜在普通資料中傳送。這樣就可以避免像ftp協議使用額外的埠來傳送控制資訊的必要,降低程式的複雜度。

這裡所要設計的telnet到串列埠協議的轉換程式(telnet2com)實際上是乙個telnet的伺服器。它接受來自圖1(c)中主機pc1客戶端的telnet鏈結請求,然後向pc1客戶端通過telnet協議傳送其從串列埠接收到的資料,同時將接收到的telnet資料傳送到串列埠。

在windows作業系統,大部分的伺服器(如iis)都是以windows nt服務元件(service)的形式存在於系統中的,它們在系統啟動後就一直執行在後台,等待事件的觸發(如某個tcp埠是否有鏈結請求)。作為服務元件,其與一般windows程式的不同之處是:它必然包含名為ntserviceentry的入口函式,當windows開始執行乙個服務元件時,首先執行這個入口函式,而非通常的main函式。

在入口函式中,必須定義乙個dispatchtable的結構,包括服務名稱sservicename以及服務的實際主函式servicemain,並通過startservicectrldispatcher函式真正完成服務的註冊和執行。一旦乙個服務元件啟動後,除了不斷監聽某埠外,還需要響應服務管理器(service mananger)的不同請求(如暫停服務)。因此將服務的實際功能設計成乙個子程序bridgethread,由服務的主程序呼叫該子程序,而服務的主程序則專門用來響應服務管理器的請求。

圖3是子程序bridgethread的流程。首先,使用winsock對特定埠進行監聽。然後,通過訊息迴圈,當接收到鏈結請求的事件後,將串列埠初始化。之後,訊息迴圈就不斷響應來自telnet和串列埠的寫請求,將telnet的資料傳送到串列埠,直到收到winsock斷開鏈結的請求。

在接收到來自telnet客戶端發來的資料後傳送到串列埠之前,必須掃瞄接收到資料中是否有iac轉義字元。如果有,必須將它們去掉,而且對於定義的如控制電源和i/o的命令必須進行相關的操作。反之,從串列埠接收的資料在傳送到telnet客戶端之前,必須在所有的0xff字元之前多加乙個0xff。下面是對從telnet接收的資料進行掃瞄過程的**。

這裡主要使用了winsock的api來完成telnet部分的資料讀取;串列埠部分是通過將串列埠虛擬成乙個檔案,通過檔案讀寫的api來完成的。此外,為了對串列埠其他控制線的控制,使用了getcommstate( )和setcommstate ( )兩個windows api來完成。

軟體如何實現執行的?

看了許多前輩寫了關於這一塊的知識,mark一下,自己的第一篇部落格。軟體,都是一堆程式 的形式儲存在硬碟上的,當執行乙個程式時 例如雙擊了乙個ie瀏覽器的圖示 作業系統會把該軟體的 複製到記憶體裡,再由cpu從記憶體裡讀取 完成運算,再將運算的結果以二進位制形式返還給記憶體,作業系統又將記憶體中的二...

vc 如何實現遠端除錯

假設除錯機ip 192.168.0.182 遠端機ip 192.168.0.161 遠端機為除錯機分配許可權,使除錯機可以使用遠端桌面登陸到遠端機器上 這樣除錯起來方便 除錯機上安裝visual studio net 2003 共享除錯機上的visual studio 上的遠端除錯目錄 以我的機器為...

如何快速實現遠端運維

現如今,企業的it運維管理人員面對多方考驗,一方面企業為了減員增效,無法完全滿足匹配各地運維人員,另一方面又要面對資訊化的需求公升級,需要更高效和快速的實現it管理和運維,這對企業it管理和運維人員的要求在不斷提高,也讓it運維工程師的壓力倍增 壓力是什麼?容易陷入繁雜瑣碎的事情中去,無法關注可靠性...