硬體編程與軟體編程的區別與聯繫?

希望各位大牛能講得詳細點,我也在網上查過了,但說得都很籠統,另外硬體工程師關於代碼方面的任務與工作與軟體工程師有什麼區別?懇求大家解答,謝謝!


題主沒說清楚是嵌入式軟體(面向硬體編程)還是數字電路設計(設計硬體),都回答一下。

通用應用軟體:

* 主要關心邏輯和抽象,關心代碼量大了之後複雜度可控。

* 硬體資源較多,硬體性能差別較大,不需要針對特定資源設計。

* 邏輯分層較多,來源於抽象的性能損耗可以接受。甚至於現在很多主流語言構建在虛擬機和解釋器上。

* 非實時。

* 不需要了解底層硬體原理。

嵌入式軟體:

* 時序可控。大部分場景要求實時,因為要滿足硬體時序。非搶佔的任務調度和中斷隊列都會引入定時的偏差。

* 資源開銷可控。因為嵌入式硬體環境大多只有有限的 RAM 和 Flash 資源。

* 針對特定硬體環境設計。

* 所有代碼上的抽象和優化都必須是零損耗或者損耗可控(可以參考 rust 語言)。比較典型的是 GC 會引入嚴重的時序和資源不可控,所以系統語言很少使用。

數字電路設計:

* 數字電路設計不是編程,不是編程,不是編程。是腦海中先有電路,再用語言描述出來。

* 時序要求更嚴,需要考慮建立時間和保持時間,及隨之而來的亞穩態。

* Coding style 會明顯的影響電路性能。邏輯都一樣,但是 DFF 的位置不一樣,就可能導致時序不滿足。

* 並行化。執行順序不再是 CPU 的順序執行,而是多個並行的流水線。比如快速傅立葉 FFT。比如路由器的 CAM,單次動作完成整表查表。


懂這答案的工程師年薪25萬,不懂這答案的年薪40萬。


硬體編程不但有ic和驅動,還有機器人


FPGA的話Coding Style對最後綜合出來的東西影響很大,比如狀態機,按標準格式寫會有優化。

以及硬體邏輯並不是說邏輯上沒問題就好的,腦子裡一定要清楚這一句寫下來,最後會綜合出一個什麼硬體電路出來。不然,小工程還好說,大工程一定藥丸。

按照寫軟體的思路去寫硬體邏輯等於作死。

軟體的話,你不按規範寫頂多噁心自己,反正能用是吧~( ̄▽ ̄~)~


提問不是很準確,從字裡行間猜測,題主並不是想問「硬體工程師」和「軟體工程師」的工作內容的區別,也不是想問硬體描述語言(HDL)和軟體編程語言的區別,而是想問嵌入式系統工程師和軟體工程師編程的區別。

我們的團隊中,有非常棒的軟體工程師,負責開發承載千萬訪問的伺服器系統、流暢漂亮穩定的前端,也有非常棒的嵌入式系統工程師,負責在可控的成本內開發穩定高性能的硬體。我總結嵌入式和軟體工程師的區別有下面一些,不全的再補充。

1、可用的資源不同

在電腦/伺服器上運行的程序,架構設計對系統性能的影響,往往大於細節優化,因此,軟體工程師更在乎設計高效、易於維護的架構。在使用系統資源上,通常以GB來討論資料庫/硬碟的存儲空間,以至少10MB或100MB為單位來討論程序的內存使用。腳本語言的使用,有助於讓程序框架更清晰、更容易維護。

對於硬體工程師,這簡直就是天方夜譚。為了節約硬體成本,工程師總是努力在盡量小的硬體上實現功能。

例如通常的家用路由器,可能總共只有16MB的「硬碟」,16MB的內存。因此,腳本語言不再適用,一般都是純C實現。內存的使用只能以10kB單位計算,代碼空間以100kB單位計算。對於在單片機上編程的工程師,條件更加苛刻。代碼空間通常是10kB單位計算的,而內存使用需要精確到kB,甚至精確到位元組。這讓硬體工程師經常需要進行非常細節和底層的優化。

如何在如此微小的系統上實現功能,是硬體工程師的挑戰,所謂「戴著鐐銬跳舞」。然而,這也成為一些硬體工程師職業發展的瓶頸:因為系統小,通常是一個人完成,對於代碼的質量和維護性的要求放鬆了,個人編程能力不容易進步。

2、對於穩定性的認識不同

軟體工程師對於「穩定性」的理解,在於容錯,即如何快速從系統失效中恢復過來,通過技術讓系統整體的downtime降低直到0。同時,通過高效的框架,使得系統即使在高速的開發和演進過程中,也能保持可用性不損失。

硬體工程師對於「穩定性」的理解,是絕對的穩定性。不是從失效中恢復,而是根本不允許失效。因為任何「失效」,都會嚴重影響設備的可用性,甚至出事故。想像一下,你正在刷微信時閃退了,無非重新打開就行;如果你的微波爐「死機」了,不停加熱,那是什麼體驗?

軟體工程師一般覺得連續工作幾天一個月的程序,已經非常穩定了;硬體工程師的目標通常是幾年不死機,甚至只要硬體晶元不掛掉,程序就不能掛。

3、迭代速度不同

軟體中的敏捷開發思想,通常要求以周為單位迭代新版本。bug可以按照重要程序排次序,做到後面若干版本的開發計劃中去;而新引入的feature也可能有bug,但先投放市場看用戶反饋,比解決bug更加重要。

在硬體中,敏捷開發是行不通的。任何bug,都必須全部消滅掉,產品才能投入市場。對於傳統的硬體產品,其固件無法更新,已經生產出來的產品,就再也沒有機會修bug了。

最近,「互聯網硬體」也逐漸引入可更新的固件。但這並沒有降低對可靠性的要求,因為更新新固件,必須保證原固件還在穩定運行。比如,我們目前支持在用戶完全不知情情況下更新固件,因為測試要求很苛刻,更新的頻率最快也是一個月一次。

4、目標不同

軟體工程師:寫可維護、可擴展的代碼

硬體工程師:用最少資源穩定的實現功能

結語:

1、融合

Android是一個神奇的東西,它讓硬體工程師和軟體工程師的界限逐漸模糊。對於硬體成本不太敏感的系統,上Android作為嵌入式平台,可以讓嵌入式開發非常「偏軟」。

2、了解對方

對軟體工程師:

嘗試了解硬體工程師的工作,了解計算機系統底層的工作原理,寫一寫C甚至讀一讀彙編,可以讓你對軟體架構有全新的、融會貫通的認識。(例如,為什麼C語言沒有「乘方」運算符?)

對硬體工程師:

嘗試了解軟體工程師的工作,一定要學會一門腳本語言。就算平時工作中的代碼量不大,也要提高對代碼的要求,對編程模式和框架的理解,從而有能力管理更大量的代碼。


強答一番。個人是一直做軟體,有時候會偏向嵌入式,和硬體編程的人打交道。

個人感覺區別在於:

1.物資成本:軟體開發工程師一台pc足可。硬體開發就不行了,得要有板子,有儀錶或儀器。在H公司三年,有段時間負責整個非生產物料申購,了解到有些儀器起步價200W,08~09年時候,一台儀器可以在深圳南山後海買個四房啊。很多時候幾個項目組搶一台儀器來用啊。

2. 驗證成本:軟體開發工程師開發出軟體,在網上可以找到一堆又一堆的工具來驗證,硬體工程師呢,不好意思,只能用專門的硬體模擬工具來驗證。這些工具多少錢呢?我以前在H時也接觸過這種軟體的申購,一個license,20W,只能在一台機器。買多license可以優惠。

3. 返工成本:軟體出了問題,打補丁(B2B)或直接升級(互聯網),只要能夠確保數據OK就行。硬體呢,不好意思,生產出來的產品全毀了,原來為生產它的生產線也得重新改。有興趣可以看看H公司的「呆死料」事件

4. 門檻成本:在這一塊,歐美基本上壟斷了,你要用,只能花錢買授權。而軟體呢,以前以為os,db中國還落後,現在看上去已經慢慢趕上了。

5. 查錯成本:如果說軟體定位問題可能會很吐血,但硬體定位真的老天保佑,它出問題並不一定表示在它自身,而是在軟體上。

為什麼中國ic不行了,無非是成本太高了,對人員要求也高,導致創業很困難。雖然也有不少硬體企業,但和軟體企業一比,比例少得太多了。


強答勿拍~

你硬體編程是指像fpga一類的編程嗎?如果是的話,區別還挺大,從編程語言到所需知識差異都很大。前者偏底層硬體,像fpga是去控制可編程門陣列電路通過硬體實現一個數據處理流程,可以用vhdl語言簡單可以理解為實現一個集成電路,比如做個加法器,實現一個演算法。優點是可定製硬體,可以很好滿足需要,速度快,功耗小。一般要求有較好的數字電路一類的知識。具體原理和實現可以百度。

軟體編程是在已有硬體平台上編程,偏軟體,一般由操作系統程驅動去做程硬體打交道的事,比如在pc上用c語言編程,需要去控制cpu去完成一個數據處理流程。需要較多的編程語言,數據結構和演算法知識,像操作系統原理什麼也要了解。優點是抽象程度高,通用性好,價格相對便宜,但能處理的任務受硬體約束,相比fpga會比較慢,功耗什麼也差。

還有種像嵌入式編程是在具體硬體上寫程序,和硬體打交道比較多,因為可能沒驅動或操作系統來完成中間操作,硬體也千奇百怪,你主要是直接指揮具體硬體去完成一個工作。也要一定的電路知識,只為可能要自己畫板子。曾經和同學調過單片機,因為感覺結果不正常直接上示波器調看輸出。現在很多嵌入式的像高端的arm已經自帶linux程pc很像了。

還有驅動編程是去寫個程序幫軟體程序員控制硬體,完成具體和硬體打交道的任務。


作為一個硬體編程的外行,最近迷上了「深圳I/O」這個遊戲。雖然只是個在內行看來很小兒科的模擬嵌入式編程的遊戲,但也讓我體會到了一些嵌入式編程的樂趣和艱辛。就我一點淺薄的感受,跟軟體開發相比,很明顯的一個困難點就是各種硬體模塊的限制——「螺螄殼裡做道場」+「帶著鐐銬跳舞」。


硬體編程語言,準確的講是硬體描述語言,心中要時刻有電路。硬體電路模塊輸入輸出看的是時序圖,也就是在時鐘驅動下,並行輸入並行輸出。先寫行為級代碼,然後綜合,布局布線,生成bit流。如果是ASIC,那麼還有很多後端驗證,時鐘樹,電源布局等等。

軟體編程,編譯鏈接成可執行代碼,通過載入到內存,cpu再去內存取指令,然後執行。是一種串列處理方式。取一條執行一條。

兩個雖然都可以叫編程,但是真是雷鋒和雷峰塔的關係。

如有錯誤,請毫不留情直接打臉,謝謝。


軟體編程出Bug了,複位,分析,修改,編譯,從頭來。

硬體編程,出Bug,可能一通噼噼啪啪後,冒煙噴漿,換下一塊再來。然後試試手焊,飛線,甚至花幾周幾月和幾十,幾百萬重新製版。


硬體編程是描述性的。只是吧你想好的電路用語言寫出來。

現在做ic不行了,薪水是軟體的一半。勸你專註你的軟體吧。


區別,其實說大不大說小不小。軟體編程一般我們所看到的一半是基於OS上的開發,也就是說得先用個平台,比如android,Linux,windows等等。硬體編程更多是指對於硬體的設定及底層fw的實現,多於各種datasheet打交道。當然也會設計到OS上的一些東西,畢竟一些規範設計都是從上到下都有的,你該留的介面得給留好了,硬體的性能和功能你的實現好了。目前來說中國做上層軟體開發的多,底層編程及硬體的少,待遇一般也是互聯網的程序員工資高。但是底層硬體編程的人對各種平台架構更了解。


我這麼說吧,以前應聘軟體開發,簡歷上寫語言包括了VHDL,別人告訴我,那不算編程語言。


題主能不能說明白自己指的是fpga這類硬體編程還是偏嵌入式的編程

————————————————————————————————

我猜題主問的是後者,就先就後者做一些簡要的回答

在計算機剛開始普及或者存在於實驗室的時候,每一個軟體程序員理論上都是現在題主所說的偏硬體的程序員。因為每個程序的編寫大多要針對不同的硬體載體進行編寫和優化,同時更關鍵的一個問題,就是硬體的資源太少了,這就使得程序員在寫程序的時候會使用大量現在看來是Hack的編寫方式,同時很多程序大多為一人所為,這是前言。

對於國外不做評述,但是在國內,從90年代PC機翻著滾的性能爬升,剛才說的這種程序員開始分化了。一類程序員專註於軟體的開發,尤此誕生出很多附屬的技能, 比如軟體工程專業裡面的很多管理技術。簡單來說,編寫的東西對性能要求和硬體要求開始下降,開始轉向對版本控制、人力協作和程序可維護性等方面的重視和加強。

而另一類,比如現在的嵌入式工程師,雖然現在也開始有很多類似軟體工程這樣的學科去指導開發,但是大部分時間裡,由於手中硬體資源依舊緊缺,比如拿現在比較火的Geek喜歡用的arduino來說,Flash ROM(不明群眾可以理解為寫一次硬碟或者叫固件)只有32k, SRAM (可以理解為內存)只有2k,EEPROM(掉電可重複讀寫的區域)只有1024個位元組,所以這類工程師吃硬體必須吃的很透,在開發產品的時候比起前一類人更要去了解硬體底層的概念,很多軟體上的東西就不能直接照搬,否則運行不了。舉個簡單例子,看門狗這個東西,在前一類人裡面可能會理解為駐守進程去監視系統運行,但是在後一類人理解可能就是寄存器的修改(比喻不準確,領會精神……),再比如中斷,前者更能聯想到事件驅動,後者聯想想到的是上升沿或者高電平,等等

有人會說,為神馬都這個年代了還有這種硬體這麼吃緊的項目。存在即合理,我覺得可能是價格和功耗因素佔了大頭,其餘的就靠其它知乎的朋友補充了。


做過多年設備編程的路過,表示硬體編程寫出來的代碼在做軟體的人看來就像是麵條一樣,cs的那坨東西基本不需要了解。

我做的很多需要用到信號處理,所以了解數字信號處理,自己能夠寫出來一些演算法就夠了,剩下的就是了解設備的指標,配套設備的使用限制。


都是淚,夕陽產業。


寫 HDL 的話,要意識到各個模塊物理上就是多線程並發的。大三一門設計課時候被這點坑過


推薦閱讀:

硬體用戶體驗研究有哪些公司做得比較好,聯想、海爾、魅族算不算?有沒有硬體用研的學習網站?
目前市場上除了蘋果的 Airport Extreme 之外,還有哪些產品可以在2.4GHz 和 5GHz 兩個頻段下同時運行?
誠心求一萬左右的電腦主機配置,剪輯,遊戲用,什麼靠譜?
為什麼大型路由器交換機再另開發cpu而不用intel至強系列的呢?
顯卡性能哪個指標最重要?如何選購顯卡?

TAG:編程 | 信息技術IT | 軟體工程 | 硬體 | 硬體工程師 |