軟體硬體看似兩個分家的東西,其實內在有千絲萬縷的聯絡。我舉一些小例子:
開關電源的電感在一個刻度內,要滿足伏秒平衡。物理意義是,開關周期內電感吸收的能量和釋放的能量應該是相等的。否則,系統不會平衡,不穩定。對於軟體系統,特別是複雜的大型系統,雖然有嚴謹的理論去判斷一個軟體模組的穩定性。但對於程式員調試,並不是一個簡單輕鬆的過程。可以借鑒伏秒平衡的思路,一個大型的代碼在一個狀態結束時,除了一些統計變數之外,應該是回到最初的狀態,具體的體現:記憶體釋放與申請,系統輸出的結果等應和最初狀態一致。棧在沒有中斷回到初始位置時,應該也是回到最初位置的。否則,系統會不穩定。
關於初始化,一直不被軟體工程師所重視。硬體工程師有時候也會忽視這個問題。軟體中的初始化,從宏觀上講,模組的初始化;啟動作業系統的準備工作;任務棧,堆的準備。從微觀上講,變數的初始化,全域建構函式,全域變數初始化。對於硬體,上電的順序;晶片管腳上電的狀態。數字晶片的初始邏輯狀態。類比訊號的初始範圍等等。有一些音箱,開機的時候會砰一聲。這個是上電產生的電流衝擊,比較難抑制。消音電路很難做好。一些進階的CPU,會有上電順序要求。一些可靠的系統,要求上電,掉電,訊號都必須有確定的狀態。單純的硬體去做,有時候很困難。可能需要軟體硬體一起結合著做。Bootloader 為了後續的應用代碼做了很多初始化工作。
在軟體抽象一些客觀事物時,可以參考硬體的抽象。比如說乙太網路相對於處理器是個低速裝置,為瞭解決無休止的中斷,DMA 可以大大緩解處理器的壓力。如果處理器抽象成一個類、乙太網路抽象成一個類,那麼DMA可以看作一個通訊關聯類別了。其參數的抽象和深入的分析,對軟體設計和硬體設計都是個極大的促進。
晶片是別人給你的庫函數。完成各種各樣的功能。軟體開發過程中,需要瞭解庫函數的執行行為,參數範圍,提示,應用情境。其實,晶片的應用也是一樣的。需要瞭解管腳的功能定義,晶片的動作行為,應用情境,功耗等等各方面的資訊。瞭解得越細,對應用越有協助。
軟體硬體的結合,主要是洞悉背後解決問題的方法,處理實際的工程問題。