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