在有些情況下,限制你的應用程序的因素是 RAM 而不是ROM。在這些情況下,你想要降低對于全局變量、堆和棧的依賴。這些優化由程序員來做比用編譯器來做會更好。
由于 ROM 通常比RAM 更加便宜(以每字節為基準),所以一個可接受的降低全局數據量的策略是把常數移到ROM 中去。如果你用關鍵字const 聲明所有的常數,那么這可以由編譯器自動完成。大部分的C/C++編譯器把所有它們遇到的常全局數據放入一個特殊的數據段里,這個數據段可以被定位器識別為可分配ROM 的數據段。如果有很多的字符串和導向表數據在運行的時候不發生變化,那么這項技術是最有價值的。
如果有些數據一旦程序運行起來就固定了,但不一定是不變的,那么常數數據段可以改放在一個tb混合存儲設備中。然后,這個存貯設備可以通過網絡來更新,或者由一個指派的技術員來完成這個改變。在你的產品要部署的每一個地區的稅率就是這種數據的一個例子。如果稅率發生了改變,那么存儲設備可以更新,但是同時也節省了附加的RAM。
減小棧的大小也可以降低你的程序對于 RAM 的需要。有一種方法可以準確地計算出你需要多大的棧。做法是用一個特殊的數據類型填滿整個為棧保留的存儲區域。然后,在軟件運行一段時間之后——最好在正常和緊張兩種情況下都運行一下——用調試工具研究被修改過的棧。有一部分仍然包含有你的特殊類型數據的棧存儲區,因此可以安全地從棧的大小中減去那部分存儲區的大小(注1)。
如果你在使用一個實時的操作系統,就要特別當心棧的大小。大部分操作系
——————————————————————————————————
注1:當然,你可能想在棧中留一點額外的空間——萬一你的測試沒有持續足夠長的時間,或者沒有準確地反映所有可能的運行場景。千萬不要忘記棧的溢出對于你的軟件來說是一個潛在的致命事件,要不惜一切代價避免。
統為每一個任務創建一個分離的棧。這些棧用于函數的調用以及在一個任務的設備場景中遇到的中斷服務倒程。你可以通過前面介紹的方式為每一個任務的棧決定其數量。你可以設法減少任務的數量或者切換到一個操作系統,這個操作系統具有分離的為執行所有中斷服務例程而建立的“中斷棧”。后一種方法可以顯著地降低每個任務對棧大小的要求。
堆的大小受限于 RAM 在所有的全局數據和??臻g都分配以后剩余的數量,如果堆太小,你的tbw程序就不能夠在需要的時候分配內存,因此在廢棄它之前一定要把malloc 和new 的結果和NULL 比較。如果你試過了所有這些建議,而且你的程序仍然需要太多的存儲空間,那么你除了完全刪除所有的堆之外沒有別的選擇。