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






