將CompactECC移植到愛特梅爾新型SAM3S控制器
起始點:SAM7S/SAM7X
本文引用地址:http://m.butianyuan.cn/article/116952.htm德國一家大型電表制造商從2009年10月就開始在其最新產品中采用這個ubisys CompactECC版本。由于愛特梅爾的AT91SAM7X控制器帶有嵌入式以太網MAC,是SyM²電表的理想選擇。因此,ubisys選擇SAM7作為支持優(yōu)化p192r1 ECC產品的初始平臺。為了滿足客戶要求,下一個被支持的平臺是愛特梅爾的8位 AVR,為超大批量、價格敏感的EDL電表提供高成本效益方案。
這里給出幾個相關數字,SAM7X上運行在48MHz主時鐘頻率下的 ECDSA簽名在140ms內可以完成,并需要大約8 KB ROM和2.5KB RAM,可以執(zhí)行SyM ²電表的所有必要任務。 在這個基準上, C++編譯器按照主要生成16位Thumb 指令 (約 99 %)的方式進行配置。這樣一來,代碼可從32位寬的預取緩沖器獲益。 這個緩沖器的作用相當于一個極簡指令緩存, 愛特梅爾將之集成到它的SAM7控制器中,以便在控制器的運行頻率超出閃存的最大存取頻率時提高16位Thumb指令的執(zhí)行速度。 沒有這種預取緩沖,當運行頻率超過30MHz時,對閃存中存儲的指令和數據進行存取就必然會因強制性等待狀態(tài)而帶來不良影響。 而有了預取緩沖的幫助,第2個16位Thumb 指令可以從緩沖器中載出,并由內核執(zhí)行,而下一個32位字從快閃 ROM搬移到緩沖器。 在大多數情況下,這種方法可以為ARM內核的指令管線提供一個穩(wěn)定的指令流。
至于CompactECC,只有單個計算極為密集的乘法(192 位 x 192 位生成 384 位結果)以一個采用32位ARMv4指令并直接從SRAM執(zhí)行的手工編寫的匯編程序的形式來實現。即使是在最大時鐘速度之下,同步RAM的存取時間從來不超過一個時鐘周期。
移植到SAM3S
最后,SAM3S的移植到底有多么復雜和耗時呢?以CompactECC庫本身來說,5分鐘之內就可以完成。至于項目設置,在C++編譯器選項之下,代碼生成目標已從ARM7TDMI變?yōu)镃ortex-M3――差不多就是這樣。
鑒于Cortex-M3不支持ARM模式(不用擔心,Thumb-2中包含有32位ARM指令),必須得對上面提到的用于乘法操作的單行匯編源代碼進行修改,也就是表明指令集被使用的指示。實際指令根本沒有被涉及。由于SAM3提供有一條比SAM7寬四倍的閃存總線,故不再需要讓該代碼從以往的SRAM執(zhí)行。
另外,還應該考慮到ARM7采用的是馮諾伊曼(Von-Neumann)架構, Cortex-M3卻是基于數據和指令路徑相互獨立的哈佛(Harvard)架構。因此,若從閃存取指令,而從SRAM 讀取和存入數據,可以獲得最高的吞吐量。由于沒有其它硬件依賴性需要考慮,CompactECC移植的算法部分就算完成了。
處理器模式也被簡化,隨之影響到硬件堆棧的數目和其初始化。ARM7TDMI支持7個工作模式(USR、FIQ、IRQ、SVC、ABT、SYS、UND),這表明該內核最初是針對具有多任務處理和分頁等功能的成熟操作系統(tǒng)而設計的。相反地,Cortex-M3是針對控制器應用從頭開始量身定做的,有兩種模式就足夠了。正常的程序執(zhí)行采用線程模式(thread mode),中斷則采用處理模式(handler mode)。實際上,ARM7TDMI程序內通常設置有兩或三個堆棧:一個用于應用程序,一般運行在管理模式(supervisor mode,SVC)下;一個用于中斷(IRQ);另一個用于快速中斷(FIQ)。其余的處理器模式一般對控制器應用無用。此外,Cortex-M3設計包含一個(“主要”)或兩個(“主要”和“進程”)堆棧。
當啟動順序運行時,在堆棧初始化之后,底層硬件初始化很快被執(zhí)行。甚至在C/C++運行庫控制之前,SAM7應用程序就從32 kHz振蕩器切換到晶振,并且把PLL編程到其工作頻率。這項工作應盡可能早完成,以加速包含預定義內容的存儲器段的初始化,實際上最終提升整個系統(tǒng)啟動體驗。
評論