Cypress Semiconductor與HI-TECH Software共同發表一款最新的編譯器技術,能有效擴充可動態調整的PSoC混合訊號陣列中的記憶體容量與效能。此新款符合ANSI規範的C語言編譯器—「專為PSoC混合訊號陣列量身設計的HI-TECH C PRO」,運用HI-TECH的「Omniscient Code Generation(OCG)」全知程式碼產生技術,可大幅縮減PSoC程式碼大小。
PSoC混合訊號陣列將可編程的類比與數位功能與8位元MCU核心整合在一起,並包含最大可達32Kbyte的快閃記憶體,及最大可達2Kbyte的SRAM。PSoC混合訊號陣列可廣泛運用在各種注重成本、及有空間限制的消費性應用,包括:觸控螢幕介面、馬達控制、以及近距離偵測等。PSoC元件具備動態調整功能,並可由同一個矽元件執行多個獨立運作的功能,因此能降低元件數量、機板空間、以及電源消耗。
雖然將可重新組態的功能加入到PSoC元件不會增加所需的矽元件數量,但每個可重新組態的功能將需要更多的程式碼。在某些應用中,增加功能會讓程式碼增加並超過晶片內建快閃記憶體的容量。此外,更大的軟體堆疊和設計變化的需求,促使晶片內建SRAM的使用狀況不斷接近極限,增加未偵測堆疊溢滿的機會。目前解決SRAM與快閃記憶體諸多限制的解決方案有下列3個:(1)限制產品的功能;(2)將應用移轉至包含更多SRAM與快閃記憶體容量的更大的PSoC元件;(3)撰寫組譯語言程式碼,以縮小程式、堆疊、以及變數的數量,這種方法非常耗時費力,並讓程式碼的移植能力大幅受限。這些替代方案的都不實用。
鎖定PSoC混合訊號陣列的HI-TECH C PRO編譯器採用OCG技術,在檢查所有程式模組後,再進行編譯與指標、暫存器、和堆疊配置的最佳化,以及刪除多餘程式碼等作業。編譯器亦釋放出SRAM空間,並針對所有非遞迴與非重進入的程式碼,編譯直接定址與最佳化函數堆疊,以減少PSoC元件索引暫存器競用資源的狀況。由於縮小的程式碼能在更少的週期內執行完畢,因此,新款編譯器亦可增加PSoC元件的效能。
因為OCG知道變數與已編譯堆疊需要多少記憶體,並可隨時配置,如此可讓SRAM的使用能更有效率,甚至能研判指標變數的範圍,並在適當的時機配置單位元指標。編譯器可藉此增加可用SRAM的容量,有時增加的幅度相也當可觀。此外,根據統計數據設定的堆疊,可增加到程式需要的最大深度,OCG並可藉以防範可能導致嚴重故障的堆疊滿溢狀況。
掃瞄所有程式模組,並對應至呼叫圖與指標參考圖功能
在準備編譯時,OCG編譯器會針對程式中每個模組,建立部份編譯的程式函式庫。然後再搜尋所有對應至程式的函式庫功能,並建立一個“呼叫圖”。在呼叫圖完成後,從頭到尾都沒有被呼叫的函式就會被移除,編譯器會找出並標示被稱為「重新進入」的函式,像是在主程式碼與中斷函式中的函式。
OCG編譯器亦會在每個程式模組中,為每個指標產生一個指標參考圖。因為編譯器知道任何指標所定址的物件尺寸,因此可偵測出任何一個存取靜態配置物件端的動作,並警告程式設計師可能的無效記憶體存取動作。從未啟動過的指標將會被刪除,並在編譯時間內發出適當警告。此外,編譯器亦提供開發工程師一個相當有價值的除錯報告,可顯示出所有指標及其目標物件。編譯器還會在不同原始碼檔案中,先確認出彼此不相容的變數或物件,並向使用者提出警告。
針對變數與堆疊進行最佳化,釋出SRAM資源
傳統的編譯器一般會對變數尺寸做最壞狀況的假設。這種模式導致SRAM資源的使用效率低落。由於編譯器知道所有變數的大小,因此僅會配置需要的記憶體來儲存每個變數,並能依應用的程度,配合釋放出最高達10%或更多的SRAM空間。
在許多低成本8位元可編程元件中,PSoC混合訊號陣列使用相同的SRAM空間來儲存軟體函數堆疊與資料變數。若沒有配置足夠的SRAM空間來配合動態堆疊的最大容量,堆疊可能就會溢滿到資料變數空間,而造成程式當機。
排除PSoC索引暫存器競爭資源的窘境
要存取儲存在PSoC元件中動態堆疊內的資料,需要先拿到僅用來移動與移除暫存器內容的堆疊指標,並傳送到可存取資料的索引暫存器。由於PSoC元件僅含有一個索引暫存器,因此動態配置的堆疊會造成競用稀有資源的狀況。此外,若堆疊指標變更,或索引暫存器改用於其他用途,堆疊指標就必須先儲存,然後重新複製到索引暫存器。每次指標複製出或寫入到索引暫存器時,都分別需要4與10個時脈週期,經常存取動態堆疊的應用程式,會導致系統需要使用超過某些數量的程式碼,才能執行系統功能。
最佳化PSoC記憶體使用模式
PSoC混合訊號陣列擁有一個分頁式SRAM架構,無論任何時刻都僅能存取256位元組的SRAM。要存取其他記憶體分頁,需要透過分頁選擇暫存器(PSR)進行重置。每個PSR重置動作需要3位元組的程式碼以及12個週期來執行。若分頁中一個使用中的資料(像是一個中斷常式)必須寫入另一個記憶體分頁,就需要使用更多程式碼和更多時脈週期。例如,Page0被自動選取用來支援中斷常式。若中斷常式需要存取Page0以外其他分頁中的變數時,就須先儲存PSR,再變更記憶體存取模式,然後PSR再載入其他分頁位址。之後PSR必須回復原先的狀態,然後再進行中斷。
HI-TECH支援OCG的編譯器擁有智慧型功能,能偵測到所有程式模組使用的變數與指標,以及它們所使用的頻率,並且再產生程式碼之前,就已經知道堆疊需要多少容量,以及應該配置的區域。它會把最常用到的變數配置到最方便存取的RAM,並把較不常用到的資料放到分頁RAM。結果可以避免讓程式碼設定分頁選擇暫存器,並可藉此增進程式碼密度,進而大幅提升效能。
能與PSoC Designer v4.4整合
HI-TEC支援OCG技術的編譯器,可完全整合至用於PSoC混合訊號陣列的Cypress PSoC Designer整合式開發環境(IDE)。