誰告訴過你,在嵌入式項(xiàng)目中軟件更改成本低于硬件?
公司的硬件工程師背著我改了系統(tǒng)的原理圖。改了我的設(shè)計(jì),當(dāng)我發(fā)現(xiàn)時(shí),質(zhì)問其為什么修改我的原理圖時(shí),說:“因?yàn)樽呔€不好走,所以就修改了I/O口?!?/span>
?“你知道嗎,這會(huì)讓我修改軟件?!?/span>
?
“據(jù)說,軟件的更改成本比硬件低?!?/span>
?
當(dāng)時(shí),我就明白了,這位工程師缺乏系統(tǒng)的思維,并且還有些想當(dāng)然,我問了如下的問題:
?
“你依據(jù)什么說軟件更改成本比硬件低?你熟悉軟件開發(fā)的流程?你熟悉那幾個(gè)I/O口究竟是做什么用得嗎?其軟件內(nèi)部是怎么實(shí)現(xiàn)的?你新更換的I/O口可以實(shí)現(xiàn)相同的功能嗎?”
?
這位硬件工程師不作答了,陷入一片茫然……
?
很多時(shí)候,我們?nèi)狈Φ牟皇亲龊檬虑榈闹R,而是做好事情的方法。就如同這個(gè)硬件工程師一樣,沒有好的工作方法。在沒有搞清楚狀況下,就做了結(jié)論。是草率而又不負(fù)責(zé)任的。我們來分析分析這個(gè)原因:
1、嵌入式最大的挑戰(zhàn)是:硬件和軟件同時(shí)成熟,出問題時(shí),不知是軟件或是硬件問題,兩個(gè)方面相互影響,致使開發(fā)成本大幅度上升。假設(shè)這更改的I/O能替代原來的I/O口,也會(huì)致使軟件修改,修改后一樣要做大量的測試,這些都會(huì)致使成本大幅度的上升;一般來說,嵌入式項(xiàng)目的開發(fā)難度和PC機(jī)的開發(fā)難度不能一概而論,說誰一定比誰一定難。兩種項(xiàng)目難度各有特點(diǎn),單從調(diào)試方面說,嵌入式難度稍大些,其調(diào)試手段較 PC機(jī)手段少,且有些不穩(wěn)定,并不能很好的追蹤Bug。并且,嵌入式要求軟件開發(fā)人員了解的過程更加具體,如:AD、DA的工作方式及通訊的時(shí)序,這個(gè)是PC人員不需要掌握的知識。AD、DA時(shí)序的穩(wěn)定性對AD、DA的數(shù)據(jù)采集或多或少的都會(huì)有些影響。
?
2、原來的I/O口真的能隨隨便便的被替代嗎?一般來講, MCU的I/O口,都有附屬功能,在沒有充分理解I/O功能的原理上,實(shí)際上是很難判定能不能替代的。比如說,如果這個(gè)I/O口做輸入,需要中斷。中斷是電平出發(fā)還是邊沿觸發(fā)呢?并不是所有的I/O都支持中斷的,并不是所有的I/O都可以邊沿、電平觸發(fā)中斷的。這個(gè)要從Datasheet中獲得;從軟件的角度來看,就算可以替代,也要評估一下,更改了這個(gè)I/O口,會(huì)不會(huì)造成軟件的模塊化封裝的難度?一般來說,端口A有8個(gè)I/O口,端口B也有8個(gè)I/O口,這8個(gè)I/O口共用一個(gè)中斷服務(wù)程序,進(jìn)入中斷程序后需要判斷到底是哪個(gè)I/O口觸發(fā)了中斷。然后再調(diào)用中斷相關(guān)的服務(wù)程序。實(shí)際上,一個(gè)端口多個(gè)I/O口中斷的編程有很多抽象的辦法,但沒有一個(gè)是比較簡單的,代碼也較端口中只有一個(gè)I/O口的代碼復(fù)雜。復(fù)雜也就意味著有Bug的可能性……同時(shí),這給調(diào)試也帶來了很多不便。
?
3、關(guān)于版本管理和版本兼容的問題。更改了軟件,也就意味著更改新的版本,如果有老設(shè)備發(fā)送到客戶那里,也就意味著要升級;如果每版的硬件都有新的特性,那么無疑是版本管理的噩夢!有朋友說可以做兼容,兼容是可以。舉個(gè)例子,Intel 做的x86架構(gòu)的CPU為什么在嵌入式領(lǐng)域干不過ARM呢?當(dāng)然這里有很多因素,其中一個(gè)重要的因素就是x86選擇了兼容,而ARM沒有選擇。所以ARM更加的簡潔靈巧,或者說突出的特點(diǎn)是低功耗。而Intel的x86為了兼容,很多情況下不能選擇最優(yōu)設(shè)計(jì),因?yàn)橐疹櫤芏鄸|西,就變成了大而全,很難兼顧的。結(jié)果成了低功耗的噩夢,一個(gè)i3全速跑起來也是好幾十W啊!這和ARM Cortex-A8是不同的概念。做版本兼容是無奈的選擇,成本會(huì)大幅的上升,維修、更新、測試、交付等等,問題相當(dāng)?shù)亩?,不光光是軟件成本高,是公司各個(gè)部門的成本都會(huì)變高。再回頭看看,版本管理也是一個(gè)巨復(fù)雜的工作,如果更改了一個(gè)公共的Bug,那需要在所有的硬件上做測試,想想,一兩個(gè)還不算什么?10個(gè)20個(gè)硬件版本,這個(gè)事情還怎么弄?特別對于資源比較緊張的小公司。如果要市場部門通知客戶完成軟件的升級,那么這是多大的工作量?一旦出錯(cuò),損失的是客戶的信任,不是一點(diǎn)點(diǎn)成本所能衡量的!所以,好鋼要用在刀刃上!
?
一個(gè)數(shù)字信號,多打幾個(gè)過孔,可能看起來不是那么美觀,但美觀不是電路的第一要求,電路的第一要求是信號完整性! 所以,僅為走線不好看,更改I/O口,沒有意識到這更改帶來的問題,典型的缺乏系統(tǒng)化的思維。不過話又說回來,都吃五谷雜糧,誰又能保證什么事情都能跳出三界之外,識清廬山真面目呢?掌握好的做事情的方法,不要想當(dāng)然,在深刻的理解的基礎(chǔ)上,謹(jǐn)慎的作出決定,是非常必要的。
?
修道之人,都有一個(gè)過程,那就是否定之否定的過程,剛開始,看山是山,看水是水;經(jīng)過一段時(shí)間的學(xué)習(xí)修煉,看山不是山,看水不是水;最后修煉到一定的境界,看山還是山,看水還是水。這其中包含著對事物理解的逐層滲透,認(rèn)識逐漸升華的過程,其中的復(fù)雜需要自己多用身邊的事例多多體會(huì)。