在這里總結了我學習工作多年以來的技術棧,既是自己的一個知識框架梳理,也是給有興趣和志向從事嵌入式軟件開發的小伙伴一些分享和交流~
通用的嵌入式技能
先來總結所有嵌入式軟件開發都需要掌握的通用知識,適合在校學生參考。
計算機原理
- 計算機的組成,原理和術語,如BIOS, WINDOWS, LINUX, 南橋,北橋,顯卡,內存,硬盤,網絡,電源等等。雖然說程序員不是修電腦的,但是確實從業多年后,自己修電腦的技術也得到了很大的提高了 @_@。
- 常用的BAT/SHELL語句,這個上面說過了,基本技能。
- 常用的系統配置,如環境變量,系統日志查看,WINDBG,計划任務,LINUX的APP安裝,外設掛載等等。
常用的WINDOWS/LINUX工具
- 辦公軟件:Office。
- 文本編輯軟件:Notepad++,Ultra Edit。
- 郵箱工具:Outlook,Foxmail等。
- 搜索工具:Everything。
- 遠程工具:Teamview, KConsole ( (= ^ _ ^ =) 自己C#開發的 )。
- 繪圖工具:DrawIO, Visio。
- 虛擬機:VMWare, VirtualBox。
- 筆記工具:OneNote,DokuWiki。
- 網盤工具:OneDrive,Syncthing。
- 數據分析:WINHEX,Beyound Compare。
- 任務管理:PingCode。
- 翻譯軟件:網易有道。
- 文件傳輸:FTP,共享文件夾,KSync( (= ^ _ ^ =) 自己C#開發的 )。
- 會議工具:Zoom,Teams,騰訊會議。
常用的網站
- 開源項目:GitHub, Gitee,我自己也會用他們來放一些自己個人的項目,其他GitHub的項目更加豐富,但是不能保存私有倉庫而且訪問經常受阻,Gitee訪問速度快而可以存放私有倉庫,但是相對的熱門開源項目會少很多。
- 論壇:21 IC,電子發燒友等。
- 博客:CSDN,博客園,簡書。
- 技術速查:runoob。
- 電子書下載:腳本之家。
- 專利查閱: SooPat。
編程語言
- C. 嵌入式軟件開發的核心語言,80%以上的代碼都是由C完成的。其實C的語言本身並不復雜,核心就是指針和內存管理。工作上更多地是將精力放到協議、業務和算法等功能的實現上,因此,C語言必須十分熟悉,信手拈來。
- C#. 嵌入式產品少不了和上位機打交道。有時候是因為通用的工具不滿意,有時候是需要定制化一些功能。此時使用C#來做WINDOWS GUI的工具十分方便。得益於豐富且強大的Microsoft.NET Framework庫,使用VS+C#的開發模式,學習成本很低就能作出功能強大的工具。后續自己也開發了好幾款PC工具,在工作上起了很大的助力作用。
- PYTHON. 最早學習PYTHON是因為它實在太火了,抱着好奇的心態去學習了一番。然后很快就被它給征服了。PYTHON的語言包袱很低、學習資料齊全、而且有各種各樣的庫可以使用,因此學習和使用都十分輕松。這里也推薦大家將PYTHON作為自己的第二語言。我在工作中使用PYTHON做一下數據分析和處理,十分高效便捷。
- BAT/SHELL. 腳本語言,只要你的產品需要在WINDOWS/LINUX下運行或者測試,總是需要使用到的,不需要精通,但要知道怎么查資料來快速完成編寫。
- C++. 早期在學習嵌入LINUX的GUI開發時有用過QT,里面就要用到C++做開發。后面用得比較少,主要是因為C#太方便了 ╮( ̄▽  ̄)╭ 。但是讓我印象深刻的一點是QT的可移植性真的強,代碼幾乎不用修改,就可以在linux,嵌入式linux和windows下直接編譯運行。
- Assembly. 做嵌入式必須掌握基本的匯編語言。倒不是平時大家說的為了優化性能嵌入匯編代碼,這個我從來沒見過,反而讀研時這個干過,自己寫的匯編代碼效率不高反而沒有直接用C運行得快。主要是CPU在boot up, Hibers, 以及移植rtos時,少不了要使用匯編在實現功能。因為此時棧已經消失,C語言不能用了。如果看不懂匯編,那這個階段調試起來就舉步維艱了。
- Markdown. Makrdown是目前最熱門的標記語言了,當然除了Markdown還是其他的如Syntax等其他標記原因。不過學會了一種其他的也是依葫蘆畫瓢的。
- Other. Matlab,JAVA等等,用得不多。
編程技能
- 編碼規范:Linux編碼風格以及公司研發內部要求的命名格式,包括命令、縮進、注釋、復雜度、可讀性等要求。
- 數據結構和算法:棧、隊列、鏈表、樹、排序、查找等。
- 實時操作系統編程:FreeRTOS,RT-Thread,uCOS等。
- Linux系統編程:文件(open, read, write, close),進程(fork, exec, wait),線程(pthread, sem, mutex),網絡(Socket),同步共享(pipe, mq, sem),I/O模型。
- 嵌入式Linxu系統構建:ubooty移植,kernel移植,根文件系統構建。
- 嵌入式Linxu驅動編程:字符設備,塊設備,網絡設備。
開發工具
- 代碼管理工具:GIT,SVN,GITLAB。
- 串口工具:XCOM,KCOM( (= ^ _ ^ =) 自己C#開發的 )
- 編譯環境和編譯器:CMake,Make,armcc,arm-linux-gcc,VS。
- IDE: Visual Studio, Keil, IAR, VS Code, ADS(Arm Development Studio),QT。
- 調試工具:Ozone, GDB, Segger Jlink全家桶。
測試技術
- 黑盒測試:CI持續集成測試(Daily/Weekly),代碼Merge測試,冒煙測試(Smoke test),回歸測試(Regression test)。
- 白盒測試:單元測試,靜態代碼檢查PC-lint。
硬件技能
- SCH:看懂原理圖,熟悉基本的模擬電路、數字電路原理。
- PCB:掌握基本的PCB布線規則,進階可以掌握Altium Designer等軟件進行PCB設計。
- 焊接:最基本得懂得怎么焊飛線,進階可以掌握焊SOP,LQFP,BGA等封裝的IC。
- Spec/datasheet:看懂芯片手冊,需要CET4或以上的英語基礎。
開發管理技能
- 軟件協作管理工具:JIRA,PingCode。
- 多人寫作知識庫:Confluence,DokuWiki。
- 開發模式:IPD集成產品開發流程、瀑布線開發、V字形開發、敏捷開發等。
其他感興趣的技術
- 人工智能:深度學習TensorFlow。
- 無人機:四軸。
- 物聯網:TCP/IP,Lora,Zibee,Bluetooth,MQTT。
專業領域的技能
嵌入式開發是一個很龐大很廣泛的技術。除了一些通用技能外,還有各行各業的領域細分。不同的細分需要掌握的技能可謂是各不相同。例如:
- 無人機領域,需要掌握姿態角合成,電機控制,無線通訊等技能;
- 物聯網領域,需要掌握各種各樣的通訊協議,TCP/IP,Lora,Zibee,Bluetooth,MQTT等;
- 工業控制,需要掌握電機控制,MODBUS/CAN總線通訊,GUI開發等;
本人是從事存儲產品開發的,存儲產品包括SSD,UFS,eMMC,SD卡,U盤等。屬於一個比較小眾的領域,但其技術壁壘也是十分的高。
可以說通用的技術棧只是嵌入式工程師的基礎,真正有體現價值的技術還是在於你在某個細分領域的專業程度。只有自己的專業領域有了一定高度的建樹,才具有自己的不可替代性,才能體現出自身的經驗。
而電機控制、網絡通訊、GUI開發等細分技術,都有可能是自己奮斗一輩子都沒有掌握透的技術。因此專業領域的技術棧,更加體現工程師的職業高度。
在后續的文章也我也會繼續與大家分享我的專業領域的技術棧~