嵌入式軟件開發(fā)流程(個(gè)人心得)(嵌入式軟件的開發(fā)流程)
一 背景
剛從學(xué)校出來實(shí)習(xí)那會(huì)兒,在深圳南山某龍電控公司上班,職位是售后維修,用伺服電機(jī)控制繡花機(jī),有個(gè)顯示終端應(yīng)該用的是桌面系統(tǒng)。一進(jìn)公司就開始修板子,在經(jīng)過一番培訓(xùn)之后就出去駐場(chǎng)服務(wù),看到軟件開發(fā)工程師來支持我們的工作,他們沒什么頭發(fā),大部分都戴著眼鏡,看上去很厲害的樣子,他們拿著示波器的探頭,拿著萬用表打到二極管檔位,測(cè)量線路的通斷,當(dāng)時(shí)真的很想成為這樣的人。
二 畢業(yè)后換工作
來到我人生中最重要的一家公司,有個(gè)老同事真的很熱心,手把手教我怎么看原理圖,為什么控制這個(gè)IO為高電平,三極管就輸出低電平,為什么電磁閥可以動(dòng)起來,怎么控制繼電器,怎么寫代碼怎么畫原理圖,怎么畫PCB板,一條龍服務(wù)毫無保留地非常耐心地指導(dǎo)我,部門經(jīng)理在下班后,等我們吃完飯手把手教我們?cè)趺从胘ava與下位機(jī)通信,怎么創(chuàng)建線程,那段時(shí)光真的很美好,把我?guī)нM(jìn)了軟件開發(fā)行業(yè)。
三 感謝
非常感謝過去幫助過我的人,這個(gè)社會(huì)真的需要你們這樣的人,特別是剛畢業(yè)的學(xué)生,進(jìn)到這樣一家公司真的是很不錯(cuò)的選擇。
四 嵌入式軟件開發(fā)流程
因?yàn)榇蟛糠肿龅氖乔度胧介_發(fā),所以是按照這個(gè)話題來開展
4.1 好的軟件深受4個(gè)人的喜愛和1個(gè)人的無奈
4.1.1 老板
通常老板都喜歡又快又好,交期快,訂單量大。前期應(yīng)該達(dá)不到,但有了良好的框架后理論上是可以達(dá)到這種效果的。
4.1.2 多個(gè)用戶
傻瓜式操作、操作一步到位、快速上手、大量通俗易懂的手冊(cè)、查閱文檔自助解決問題、視頻教程、技術(shù)支持快速響應(yīng)(客服機(jī)器人)、穩(wěn)定可靠不會(huì)崩潰滿足一個(gè)用戶是比較簡(jiǎn)單的,但是同時(shí)滿足不同的用戶就比較困難了,在技術(shù)支持方面我們需要引導(dǎo)用戶自助解決問題、提供通俗易懂的用戶手冊(cè)。
4.1.3 同事
代碼風(fēng)格和編程思想良好、命名方式通俗易懂、有注釋、良好的設(shè)計(jì)架構(gòu)、閱讀代碼不會(huì)難受、有豐富的通俗易懂的技術(shù)文檔,易于更新維護(hù)、易于跨平臺(tái)移植、沒有潛在的BUG。
4.1.4 自己
錢多事少,更新、維護(hù)、擴(kuò)展、移植時(shí)只需更改少量代碼、或不用改代碼,軟件測(cè)試、領(lǐng)導(dǎo)簽字一次性通過,用戶使用過程中體驗(yàn)良好,沒有收到任何BUG反饋,深受用戶喜愛。
4.1.5 軟件測(cè)試
測(cè)了半天沒有發(fā)現(xiàn)一個(gè)BUG,功能全部正常,一個(gè)版本都沒有升,感覺太無聊,沒有一點(diǎn)成就感,完全沒有發(fā)揮他的價(jià)值,他會(huì)感到很迷茫,甚至開始懷疑人生但是沒辦法,只能委屈一下他了。
五 具體實(shí)施方法
5.1 現(xiàn)場(chǎng)考察
用戶需求在開發(fā)之前,如果有現(xiàn)成的產(chǎn)品,最好去客戶現(xiàn)場(chǎng)了解一下,就像做生意先要踩點(diǎn)記錄一下人流量,人均消費(fèi)水平,房租之類的同樣的道理,我們需要知道:
5.1.1 用戶使用現(xiàn)有產(chǎn)品體驗(yàn)是否良好,操作是否方便,如何改進(jìn)
5.1.2 用戶將來會(huì)遇到哪些問題
5.1.3 用戶遇到問題時(shí),如何通過我們提供的資源,他自己獨(dú)立解決問題用戶能夠使用文檔或者現(xiàn)有功能來自己解決問題,可結(jié)合公眾號(hào),服務(wù)器,數(shù)據(jù)庫
5.1.4 總結(jié)哪些尚未被滿足的、而又被廣泛渴望的需求(用戶痛點(diǎn))
5.1.5 將以上用戶需求轉(zhuǎn)換成規(guī)范的開發(fā)計(jì)劃、開發(fā)文檔(硬件系統(tǒng)框架圖、軟件功能定義等)
5.2 設(shè)計(jì)原則
5.2.1 開閉原則
軟件設(shè)計(jì)應(yīng)該在滿足功能需求的基礎(chǔ)上增加一些東西當(dāng)應(yīng)用的需求改變時(shí),在不修改軟件實(shí)體的源代碼或者二進(jìn)制代碼的前提下,可以擴(kuò)展模塊的功能,使其滿足新的需求視覺反饋、觸感反饋,為什么要有反饋,可能是一個(gè)很深?yuàn)W的話題了,可能跟人體分泌的多巴胺有關(guān)系,我不確定。以不變應(yīng)萬變(無論用戶需求有什么變化,我們都不用改固件),用戶的可變動(dòng)需求,還可以通過(GPIO)(撥碼開關(guān))或者其他通信接口來配置,把配置權(quán)交給硬件或者通信接口,交給用戶
5.2.2 有軟件框架和設(shè)計(jì)模式
5.2.3 有分層,做框架之前有個(gè)前提條件,要拿到功能定義、硬件系統(tǒng)框架圖
分好層之后,分別編譯成庫文件,后續(xù)獨(dú)立維護(hù)相應(yīng)的庫文件即可,便于移植減少維護(hù)時(shí)地相互影響,改動(dòng)時(shí)不影響其他功能
5.2.4 穩(wěn)定可靠
不出錯(cuò),不崩潰(訪問了空地址、內(nèi)存溢出、內(nèi)存泄露、數(shù)組越界、堆棧溢出等)
5.2.5 參數(shù)檢查
有輸入?yún)?shù)的函數(shù),要有參數(shù)檢查(排除所有可能的非法值)、錯(cuò)誤處理、返回值用戶輸入是一個(gè)非常危險(xiǎn)的事情,需要謹(jǐn)慎處理
5.2.6 自定義malloc
-不使用庫函數(shù)malloc動(dòng)態(tài)申請(qǐng)或釋放內(nèi)存創(chuàng)建內(nèi)存池(靜態(tài)),自己實(shí)現(xiàn)申請(qǐng)和釋放的函數(shù)
-多任務(wù)時(shí),需要對(duì)公共資源進(jìn)行原子性訪問,防止數(shù)據(jù)出錯(cuò)
5.2.7 重試機(jī)制
為了保證數(shù)據(jù)的有效傳輸,可能需要加入重試機(jī)制
5.2.8 易擴(kuò)展、易維護(hù)更新軟件時(shí),更改代碼量較少或無需更改代碼
5.2.9 抽象變動(dòng)部分
-改宏定義,或者類、靜態(tài)鏈表、集合、數(shù)組等的定義,不更改過程將未來可能會(huì)變的部分抽象出來,定義成數(shù)組、靜態(tài)鏈表、集合等,使用通用的過程來處理可變的部分
-不支持編程語法的將未來可能會(huì)變的部分抽象到外部文件(xml,bin),創(chuàng)建動(dòng)態(tài)鏈表或者動(dòng)態(tài)數(shù)組等再觸發(fā)遍歷
-支持編程語法的增加腳本解釋器,將未來可能會(huì)變的部分抽象到外部腳本文件(asm,lua,js,html,php),創(chuàng)建動(dòng)態(tài)鏈表或者動(dòng)態(tài)數(shù)組等再觸發(fā)遍歷
5.2.10 有使用設(shè)計(jì)模式,例如工廠模式、創(chuàng)造者模式等
5.2.11 易維護(hù),能夠快速定位異常(追溯)
5.2.12 JAVA、VB.NET、C#,不確定C 有這種方法增加全局異常捕捉事件,拋出異常時(shí)將具體文件名和行號(hào)追加寫入日志文件
5.2.13 有調(diào)試打印功能單片機(jī)可通過串口/LCD/并口(電腦主板)/PCI(電腦主板)來打印,串口/LCD/并口(電腦主板)/PCI(電腦主板)的讀寫字節(jié)函數(shù)映射到printf的相關(guān)讀寫字節(jié)函數(shù)上位機(jī)可通過控制臺(tái)打印,輸出到文件或者控制臺(tái)窗口
5.2.14 軟件層級(jí)之間通用的接口函數(shù),便于移植跨平臺(tái)
-write2.7.2 read
-control(cmd,data,void*parameter)可以不斷地?cái)U(kuò)展新功能
-接口函數(shù)中void *作為輸入?yún)?shù),可以傳遞任意類型任意長(zhǎng)度的參數(shù)
5.2.15 必要的錯(cuò)誤碼
幫助客戶自主解決問題,依賴于函數(shù)有返回值
5.2.16 有自檢功能
(硬件電路自檢)、上電自檢(通過指示燈來顯示,用于檢查IC,硬件電路等)3.1 當(dāng)出現(xiàn)故障時(shí),可通過系統(tǒng)自檢來鎖定問題,提示用戶排除原因,解決問題能夠便于移植(跨平臺(tái))的原因
5.2.17 分層設(shè)計(jì)
抽象出通用的類,通用的接口函數(shù),除非資源太少,不能支持面向?qū)ο缶幊趟枷?br />例如GPIO類有什么屬性,有什么接口函數(shù),要兼容所有的平臺(tái),就要按照擁有最多的屬性來做GPIO類
六 可實(shí)施步驟
嵌入式軟件開發(fā)可以遵循一定的流程來執(zhí)行:
6.1 總結(jié)用戶需求,兼容多個(gè)用戶的需求
6.2 了解現(xiàn)有方案,總結(jié)用戶痛點(diǎn)(尚未被滿足的、而又被廣泛渴望的需求)
6.3 總結(jié)用戶可能會(huì)遇到的困難
6.4 總結(jié)如何引導(dǎo)用戶解決困難
6.4.1 將以上總結(jié)轉(zhuǎn)換成規(guī)范的開發(fā)計(jì)劃及技術(shù)文檔
6.5 輸出功能定義及設(shè)計(jì)要點(diǎn)(文檔)
6.6 輸出軟件框架圖(文檔)
6.7 輸出軟件流程圖(文檔)
6.8 確認(rèn)以上文檔OK,開始寫代碼
6.8.1 確認(rèn)好軟件測(cè)試計(jì)劃
6.9 軟件測(cè)試(自己)
6.10 軟件測(cè)試(正式),輸出測(cè)試報(bào)告
6.11 更新改善
6.12 穩(wěn)定性測(cè)試、可靠性測(cè)試、極端環(huán)境下測(cè)試
6.13 客戶驗(yàn)收
6.14 客戶現(xiàn)場(chǎng)跟蹤,總結(jié)已知缺陷
6.15 持續(xù)改善
6.16 項(xiàng)目資料存檔,輸出測(cè)試文檔
七 總結(jié)
以上是我以個(gè)人工作經(jīng)驗(yàn)做的總結(jié),不過我們的能力再好也要先提高自己的溝通能力,良好的溝通能力能夠讓我們打開彼此的心扉,讓家庭更加和諧,讓我們與朋友同事相處的更加融洽,讓我們更好地開展工作,最大限度的發(fā)揮我們的工作經(jīng)驗(yàn)和個(gè)人能力。
心有多大舞臺(tái)就有多大,我現(xiàn)在也成了嵌入式軟件工程師,但我還有更大的夢(mèng)想,希望大家大膽去想象,大膽去挑戰(zhàn),一起努力去做到心想事成。