嵌入式linux系統的遠程開發經驗

開篇

  最近正點原子發佈了嵌入式linux開發板ALPAH,該開發板基於NXP的i.MX6ULL處理器,並且發佈了大量開源的教程和視頻。這為大量的STM32開發者轉入嵌入式linux開發提供了絕好的學習機會。在該系列教程中,開發環境為windows10上安裝虛擬機,虛擬機中安裝Ubuntu系統,這樣的雙系統環境無論是裸機開發,linux驅動開發,應用開發都能夠實現編輯、編譯、下載,而且目前幾乎所有的嵌入式系統開發教學系統都是類似的本地雙系統方案。這樣的方案在本地進行學習開發還是很方便的,但是也會有一些問題,Ubuntu開發環境在本地,不能實現遠程開發,編譯,本地下載。如果能夠實用遠程雲服務器進行開發的話,無論走到哪裡,只要能夠連接網絡,就能在同一個遠程服務器上進行編碼和編譯,並且實現本地下載,這樣就不需要本地使用虛擬機創建linux系統了。另外,對於嵌入式系統的團隊開發,也是建議使用單獨的Ubuntu服務器外加本地windows進行開發的,原理和雲端遠程開發是一樣的。本人正好有一個騰訊雲的服務器,已經安裝了Ubuntu18.04,也是64位系統,正好符合嵌入式開發環境。下面就詳細講述如何實現遠程開發嵌入式linux系統。

1、配置SSH免密登錄

  雲服務器在創建好Ubuntu鏡像後,自動啟動,並且默認開啟了SSH服務,在本地通過SSH連接到雲服務器後,可以使用命令行控制服務器,同時可以使用FileZilla通過SFTP協議進行上傳下載資料。但是每一次都需要輸入用戶名和密碼,我們可以使用ssh-keygen方式實現免密碼登錄。ssh-keygen可以在git中生成,所以需要在本地windows系統中安裝git工具。

嵌入式linux系統的遠程開發經驗

安裝好git後,在開始菜單中啟動Git GUI。

嵌入式linux系統的遠程開發經驗

啟動GUI後在菜單中選擇Help->Show SSH Key,就可以彈出ssh Key生成界面。

嵌入式linux系統的遠程開發經驗

點擊Generate Key後生成本地ssh公鑰,拷貝的剪貼板,在本地創建一個文本文件,把生成的公鑰粘貼到文本文件中,把文件通過FileZilla等工具上傳到Ubuntu服務器中,在服務器的~/.ssh/authorized_keys文件(沒有可以創建改目錄和文件)中粘貼上傳的公鑰後保存,重啟服務器後ssh-keygen生效,再次使用ssh登錄Ubuntu服務器就可以不用輸入密碼了。

2、配置vscode

  嵌入式開發的編輯器推薦使用vscode,插件眾多,功能豐富,而且界面看起來很舒服。在windows上安裝vscode後,安裝Remote Development擴展,這裡注意只用安裝這個插件,其他的依賴包會自動下載。

嵌入式linux系統的遠程開發經驗

安裝完成後,在SSH TARGETS中增加遠程服務器,Host為要顯示的名稱,HostName填寫服務器公網IP或者域名,User填寫用戶名。

嵌入式linux系統的遠程開發經驗

配置完成後,在SSH TARGETS列表中找到雲服務器名稱,右擊選擇”Connect to Host in Current window”就可以連接到服務器了。

3、編寫實例代碼

嵌入式linux系統的遠程開發經驗

連接到服務器後,可以在菜單中打開相應的文件夾,然後在vscode資源管理器中相應服務器名稱上方點擊添加文件,創建新文件,開始編寫代碼。這裡裸機程序以正點原子的彙編點燈程序為例,編寫好彙編代碼和Makefile文件即可。

4、編譯,轉換bin文件為imx文件並下載到本地

  雲服務器已經安裝好了arm交叉編譯器。直接使用make編譯即可,編譯完成後生成了led.bin。NXP的i.MX系列的裸機程序在寫入SD卡之前需要進行打包,主要是把一些配置信息打包的程序文件頭部,正點原子的方法是使用其提供的imxdownload工具,這個工具會自動把頭文件信息打包,並生成load.imx文件,這裡我們還是使用這個工具,不同的是隻讓他打包,並不使用其寫入SD卡的功能,在調用imxdownload指定寫入設備時寫入一個虛擬設備即可。

嵌入式linux系統的遠程開發經驗

<code>./imxdownload led.bin /dev/null/<code>

這樣就只是生成了load.imx文件。

嵌入式linux系統的遠程開發經驗

在vscode資源管理器中找到load.imx,右擊下載即可把改文件下載到本地。

5、燒寫裸機程序SD卡並驗證

  在Ubuntu中是使用imxdownlaod工具來寫入SD卡的,其內部是使用了dd命令把文件拷貝到SD卡的特定扇區中。這個動作在windows上也是可以實現的,具體方法為在本地windows系統中安裝git時,會同步安裝mingw環境,其中就有dd指令,而且msys也對/dev/sda /dev/sdb1 這樣的路徑做了虛擬和map的,這樣就可以在windows下使用dd命令來寫入SD卡了。注意在windows下需要使用管理員權限才能夠對SD卡進行底層的讀寫。所以在運行git bash時需要右擊使用管理員權限運行。

嵌入式linux系統的遠程開發經驗

為了方便,在桌面創建git bash的快捷方式,並且右擊設置屬性,在兼容性標籤中點擊更改所有用戶設置,勾選以管理員身份運行此程序。確定後保存,這樣以後直接雙擊快捷方式就會以管理員權限運行git bash了。

嵌入式linux系統的遠程開發經驗

啟動bash後,使用cd命令把當前目錄設置為load.imx所在的目錄,使用ls命令查看系統SD卡所在的設備節點,比如/dev/sdc,那麼就可以使用如下命令寫入程序了:

<code>dd iflag=dsync oflag=dsync if=load.imx of=/dev/sdc bs=512 seek=2/<code>

命令中各個部分的具體含義如下:iflag=dsync 輸入使用同步I/O 存取模式oflag=dsync 輸出使用同步I/O 存取模式if=load.imx 輸入文件load.imxof=/dev/sdc 輸出到SD卡所在磁盤bs=512 塊的大小為512字節seek=2 拷貝時對of 後面的部分也就是目標文件跳過多少塊再開始寫這裡為什麼要跳過SD卡的兩塊,也就是1K字節呢?這個要看i.MX6ULL的手冊了,在第八章內有相關描述。

嵌入式linux系統的遠程開發經驗

這是因為NXP在編寫IMX6ULL內部Boot ROM代碼時,要求 IVT 應該放到指定的位置, 不同的啟動設備位置不同,而 IVT 在整個裸機代碼的最前面,其實就相當於要求 load.imx 在燒寫的時候應該燒寫到存儲設備的指定位置去。對於SD卡和EMMC這個偏移大小為1K字節,所以seek=2。我想目的是不想破壞SD卡第一個扇區中的分區表把。我們可以使用工具SDFormatter對SD卡進行格式化,他在格式化SD卡的時候會在第一個扇區分區表後面留空4M字節的空間,後面才是SD卡的真正分區。

嵌入式linux系統的遠程開發經驗

那麼這4M字節就正好留給了IMX6ULL用來存放裸機程序。寫入完成後就可以把SD卡插入開發板,設置開發板啟動模式為SD卡方式,就可以上電進行測試了。經過驗證,編寫的代碼在開發板上運行正常。

6、總結與展望  通過一些列的設置和實驗,證明完全可以使用遠程雲服務器來進行嵌入式linux系統開發裸機程序。對於非裸機程序,同樣在遠程服務器上進行編譯,下載後在windows下使用nxp官方提供過的下載工具MFG_TOOL燒寫工具進行燒寫即可。這樣在有了遠程雲端Ubuntu服務器的基礎上,本地就不需要有虛擬機和Ubuntu系統了。在內核和文件系統部分,原子的教程使用了Ubuntu下的nfs和ftp來為開發板提供連接服務,那麼在windows下我們同樣也可以使用nfs和ftp來為開發板提供服務,跟Ubuntu一樣需要安裝相應軟件並設置即可。


分享到:


相關文章: