目前越來越多的微控器(MCU)應用需要使用到復雜的算法及中間件解決方案(middleware solution),因此,如何保護軟件方案商開發出來的核心算法等知識產權代碼(IP-Code),便成為微控制器應用中一項很重要的課題。因為這一重要的需求,AT32F402/405系列提供了安全庫區(SLIB)的功能,以防止重要的IP-Code被終端用戶的程序做修改或讀取,進而達到保護的目的。本文檔將詳細闡述AT32F402/405系列安全庫區的應用原理和軟件使用方法。
應用原理
安全庫區的應用原理
- 設定以密碼保護主閃存中指定范圍的程序區(即安全庫區),軟件方案商可將核心算法存放到此區域,以達到保護的功能,其余空白程序區可以提供給終端商客戶進行二次開發。
- 安全庫區劃分為唯讀區(SLIB_READ_ONLY)及指令區(SLIB_INSTRUCTION),并可選擇部分或是整個安全庫區存放唯讀區或者指令區。
- 唯讀安全庫區(SLIB_READ_ONLY)的數據能透過I-Code和D-Code總線讀取,不能寫入。
- 指令安全庫區(SLIB_INSTRUCTION)內的程序代碼僅能被MCU透過I-Code總線抓取指令(僅能被執行),不能透過D-Code總線以讀取數據的方式讀取(包含ISP/ICP/調試模式以及從內部RAM啟動的程序),以讀取數據的方式去訪問SLIB_INSTRUCTION時,讀到的數值全都是0xFF。
- 安全庫區的程序代碼及數據,除非輸入正確的密碼,否則無法被擦除。在密碼不正確時,對安全庫區執行寫入或擦除,將會在FLASH_STS寄存器的EPPERR位置"1"提出警告。
- 終端用戶執行主閃存的整片擦除時,安全庫區的程序代碼及數據不會被擦除。
- 當安全庫區的保護功能被啟動后,可以透過在SLIB_PWD_CLR寄存器寫入先前設置的密碼來解除保護功能。解除安全庫區的保護時,芯片將會執行主閃存的整片擦除(包含安全庫區的內容)。因此即使軟件方案商設置的密碼被泄漏,也不會有程序代碼外泄的疑慮。
下圖是包含安全庫區的主閃存區映射示意圖,安全庫區的程序代碼可以很容易地被終端用戶調用并執行, 但不能直接被讀取,因而達到保護的功能。
圖1. 帶有安全庫區的主閃存區映射
安全庫區的范圍大小是以扇區(sector)為單位做設定,每一扇區的大小以實際MCU型號為準。表1是AT32F402/405系列各型號的主閃存大小、每扇區大小及可設置范圍。另外啟動程序代碼區在開啟了主存擴展功能后,整個20KB區域也是可以作為安全庫區。
表1. AT32F402/405各型號閃存大小總表
如何啟動安全庫區保護
默認狀態下,安全庫區設定寄存器始終是不可讀且被寫保護。要想對安全庫區設定寄存器進行寫操作,首先要對安全庫區設定寄存器解鎖,對SLIB_UNLOCK寄存器寫入解鎖0xA35F6D24值,通過查看SLIB_MISC_STS寄存器的SLIB_ULKF位確認解鎖成功,隨后便允許對安全庫區設定寄存器寫入設定值。
啟動主閃存安全庫區的步驟如下:
- 檢查FLASH_STS寄存器的OBF位,以確認沒有其他正在進行的閃存操作;
- 對SLIB_UNLOCK寄存器寫入0xA35F6D24,以進行安全庫區解鎖;
- 檢查SLIB_MISC_STS寄存器的SLIB_ULKF位,以確認解鎖成功;
- 在SLIB_SET_RANGE寄存器設定要保護的區域,包含SLIB的起始和結束地址以及SLIB指令區的起始地址;
- 等待OBF位變為‘0’;
- 在SLIB_SET_PWD寄存器設定安全區域密碼;
- 等待OBF位變為‘0’;
- 燒錄將存入安全庫區的代碼;
- 進行系統復位,重裝載安全庫區設定字;
- 讀出SLIB_STS0/STS1寄存器用于判斷安全庫區設定結果。
注意事項:
- 可在主閃存和主閃存擴展區中設置安全庫區,實際可設置范圍參見表1;
- 安全庫區代碼必須以扇區為單位進行燒錄,且起始地址必須與主閃存地址或者擴展區地址對齊;
- 中斷向量表是數據型態且通常會被放置在閃存的第一扇區(扇區0)內,請勿將閃存的第一扇區設定為安全庫區的指令區;
關于安全庫區設定寄存器的詳細說明,請參閱AT32F402/405系列技術手冊。
啟動安全庫區的程序可參考安全庫區應用范例project_l0中位于main.c中的slib_enable()函數。亦可使用雅特力的ICP或ISP刻錄工具做設定,后面章節將會有詳細的說明。
如何解除安全庫區保護
當安全庫區的保護功能被啟動后,可以透過在SLIB_PWD_CLR寄存器寫入先前設置的密碼來解除保護功能。解除安全庫區的保護時,芯片將會執行主閃存的整片擦除(包含安全庫區的內容)。解除主閃存安全庫區的步驟如下:
- 檢查FLASH_STS寄存器的OBF位,以確認沒有其他正在進行的編程操作;
- 在SLIB_PWD_CLR寄存器寫入先前設置的安全區域密碼;
- 進行系統復位,重裝載安全庫區設定字;
- 讀出SLIB_STS0寄存器用于判斷安全庫區設定結果。
編排及執行安全庫區的程序
如前面章節所提到,在指令安全庫區(SLIB_INSTRUCTION)內的的程序代碼可以被MCU經由I-Code總線抓取,但不能經由D-Code總線以讀取數據的方式去讀出,這樣的保護是全面性的,也就是說在指令安全庫區之內的程序代碼,也不能讀取同樣被放置在指令安全庫區之內的數據,例如C程序代碼常被編譯成的文字池(literal pool)、分支表(branch table)或常數(constant)等之類當指令被執行時會經由D-Code總線去讀取的數據。這代表指令安全庫區之內只能放置指令,不能放置任何數據。因此用戶在編排要放置在指令安全庫區之內的程序代碼時,必須配置編譯程序(compiler)的設定去產生只執行(execute-only)的代碼以避免上述那些型態的數據產生。圖2及圖3是一般常見的文字池跟分支表的例子:switch()是C程序中常用的跳轉指令,此例子中的sclk_source變量是去讀取CRM_CFG寄存器,圖2可看到編譯出來的匯編代碼(assembly code)“LDR R7, [PC, #288]”,會用程序計數器(program counter, PC)間接尋址的方式去取得CRM_CFG寄存器的地址,而CRM_CFG的地址會被以常數的方式存放在鄰近的指令區(也在指令安全庫區之內),因此執行switch()指令時就會發生數據的讀取。如果指令安全庫區內有這類的程序代碼,在執行的時候就會產生錯誤。第三章的范例程序將會說明如何設定編譯程序的配置來避免這樣的問題。
圖2. 文字池例子(1)
圖3. 文字池例子(2)
一、不可將中斷向量表設置為安全庫區的指令區
中斷向量表包含每個中斷處理程序的入口點地址,由MCU通過D-Code總線讀取。通常,中斷向量表位于主閃存第一扇區(sector 0)的起始地址0x08000000,因此在設置指令安全庫區時,必須遵守以下的規則:
- 不可將主閃存的第一扇區設置為安全庫區的指令區。
二、安全庫區代碼與用戶區代碼的關聯性
受安全庫區保護的程序代碼(IP-Code)可以從位于用戶代碼區(安全庫區之外的區域)的函數庫中調用函數。在這種情形下,IP-Code將會包含這些函數的地址,允許PC(程序計數器)在執行IP-Code時跳轉到這些函數。一旦安全庫區被啟動,這些函數的地址就不能被改變,此時,這些位于用戶代碼區的函數的地址就必須固定下來,否則PC將跳轉到錯誤的地址而無法正常工作。因此在設置安全庫區的時候,應該將所有與IP-Code相關聯的函數都一起編排到安全庫區之內以避免此情況發生。下圖顯示出一個被保護的函數Function_A()調用到用戶區內的函數Function_B()的例子。圖4. 安全庫區的函數調用用戶區函數的例子
此外,另一個最常見的情形就是使用到C語言的標準函式庫,例如memset()及memcpy()這類函數。如果IP-Code跟用戶區代碼都有調用到這類函數,就會有上述問題的困擾。列舉兩種常用的解決方法:1) 將其編譯到安全庫區范圍內,具體如何實現可以查看keil或IAR的相關文檔。2) 避免在IP-Code內使用C的標準函式庫,若非要使用,就必須將用到的函數改寫為其他名稱,以下是一個范例,在IP-Code 中寫一個my_memset()函數取代原先的memset()。圖5. 自定義函數范例
安全庫區范例程序
本章節將以為例介紹安全庫區的使用范例,并詳述完成此范例程序所需的每一個步驟。
范例需求
一、硬件需求
- 帶有AT32F402RCT7芯片的AT-START-F402實驗板
- AT-Link仿真器,用來調試范例程序
二、軟件需求
- Keil μvision IDE(本范例使用μvision V5.36.0.0)或IAREmbedded workbench IDE(本范例使用IAR V8.22.2)
- 雅特力ICP或ISP刻錄工具,主要是用來啟動或解除安全庫區的設置
范例概述
本應用指南提供了兩個范例項目,展示了軟件開發商開發智權代碼(IP-Code)給終端用戶應用的場景。其中
- Project_L0為方案商開發算法并編排到安全庫區的示例
- Project_L1為終端用戶應用此算法的示例
Project_L0完成的算法將預先下載刻錄到AT32F402芯片并設置安全庫區保護,同時提供下列各項設定訊息給終端客戶應用程序使用:
- 主閃存區塊的映像,說明安全庫區所占用的區域以及用戶可開發程序的區域
- 包含算法函數定義的頭文件,讓終端用戶可以用來調用相關的函數
- 符號定義文件(symbol definition file),此符號文件內含IP-Code的各個函數的實際地址,讓終端用戶程序可以正確的調用,下圖為此范例的示意圖。
圖6. 范例流程示意圖
軟件方案商可以參考Project_L0范例開發算法代碼,并參考Project_L1提供終端用戶使用,下圖為應用示意圖。圖7. 應用示意圖
安全庫區保護的代碼:FIR低通濾波器
本范例使用CMSIS-DSP庫提供的FIR低通濾波器(FIR lowpass filter)算法作為被安全庫保護的IPCode,關于FIR低通濾波器算法可詳閱CMSIS-DSP的相關文件,這里僅著重在說明如何設置安全庫以保護此算法及如何被終端用戶的程序代碼調用。范例中的低通濾波器的輸入信號是一個混和了頻率各為1KHz及15KHz的兩個正弦波的訊號,而低通濾波器的截止頻率約為6KHz。經過低通濾波后,將15KHz的訊號濾除而僅剩下1KHz的正弦波輸出。下圖為FIR低通濾波功能的示意圖。圖8. FIR低通濾波器
使用到的CMSIS DSP庫的函數及文件包括:
- arm_fir_init_f32()
此函數的功能是做濾波器函數的初始化設定,包含在arm_fir_init_f32.c文件里
- arm_fir_f32()
此函數為濾波器算法的主要部分,包含在arm_fir_f32.c文件里
- FIR_lowpass_filter()
此函數為使用上述兩個基本函數寫成的FIR低通濾波器全局函數,供終端用戶調用,包含在fir_filter.c文件里
- fir_coefficient.c
此C文件內含FIR濾波器函數所使用的系數(只讀的常數),在范例中會將這些系數放置到唯讀安全庫區
在此范例中,MCU內嵌的FPU及DSP指令會被用來做信號處理以及浮點運算,以達到準確的運算及正確的輸出信號。
Project_L0: 方案商范例
在此階段的范例程序,將完成下列幾個項目:
- 將算法的相關函數編譯成只可執行(execute-only)的代碼
- 將算法的程序代碼編排放置到主閃存區的指定扇區,以下用扇區A指示
- 將濾波器函數的系數編排放置到主閃存區的指定扇區,以下用扇區B指示
- 在主程序中執行FIR_lowpass_filter()以驗證其正確性
- 驗證成功后,將扇區A設置為指令安全庫區,并將扇區B設置為唯讀安全庫區,此部分可在范例的主程序中以調用slib_enable()函數來完成,或使用Artery ICP Programmer來完成(建議使用ICP工具完成設置)
- 產出終端用戶程序調用低通濾波函數時需用到的頭文件及符號定義文件
一、產生只執行(Execute-only)代碼
每一種工具鏈(toolchain)都有自己的設定選項,可以防止編譯程序生成文字池(literal pools)和分支表(branch table)這些在指令執行時會發生讀取數據的指令格式,例如”LDR Rn, [PC, #offset]”這類指令。關于文字池及分支表的例子可參照章節2.4的說明。以Keil μvision為例,Keil μvision有Execute-only Code的選項來做設定,設定的方式如下:Keil μvision:使用Execute-only Code選項設置的方式是:
- 選擇C文件群組或個別的C文件,范例中是把要保護的相關C文件都放在fir_filter群組
- 按鼠標右鍵然后選擇對應文件,例如本例程的Option for File ‘arm_fir_f32.c’,如下圖
圖9. Keil進入Option界面
- 勾選C/C++窗口里的Execute-only Code選項,然后--execute_only命令就會被加到編譯過程控制字符串里,如下圖
圖10. Keil選擇Execute-only Code
- 本例程中有三個文件位于SLIB_INSTRUCTION區,分別是arm_fir_f32.c、arm_fir_init_f32.c和fir_filter.c,這三個文件都需要配置產生為只執行代碼。
IAR:使用No data read in code memory選項設置的方式是:
- 選擇fir_filter群組里對應的文件,按鼠標右鍵選擇Option
圖11. IAR進入Option界面
- 如下圖,在"C/C++"窗口內勾選Override inherited settings以及No data read in code memory
圖12. IAR設置C/C++窗口選項
- 本例程中有三個文件位于SLIB_INSTRUCTION區,分別是arm_fir_f32.c、arm_fir_init_f32.c和fir_filter.c,這三個文件都需要配置產生為只執行代碼。
AT32 IDE:添加Other compiler flags關鍵字設置的方式是:
- 選擇工程中fir_filter群組里對應的文件,按鼠標右鍵選擇Properties
圖13. AT32 IDE進入Properties界面
- 點選C/C++Build->Settings->GNU ARM Cross C Complier->Miscellaneous,在”Other compiler flags”填入-mpure-code以及-mslow-flash-data這兩個關鍵字,然后按Apply設定生效
圖14. AT32 IDE設置Miscellaneous
二、編排安全庫區的地址
前面章節提到的,主閃存的第一扇區(sector 0)會被用來存放中斷向量表。下圖為主閃存的映射及RAM的使用分區。RAM的分區主要是為了避免SLIB保護區的代碼與終端用戶的代碼用到相同的RAM而產生的沖突問題。圖15. 范例程序的主閃存映像及RAM分區
Keil μvision的scatter file步驟如下:
- 到Project→Optios for Target→Linker窗口,取消Use memory layout from Target Dialog選項,然后按Edit按鍵來開啟slib-w-xo.sct文件做修改,如下圖
圖16. Keil設置Linker窗口選項
- 打開scatter file之后,將需要放到指令安全庫區(SLIB_INSTRUCTION)的代碼的目標文件(object file)放到名為LR_SLIB_INSTRUCTION的專用加載區,并將標示修改為execute-only(+XO),同時也要將SLIB_READ_ONLY占用的區域保留起來放到名為LR_SLIB_READ_ONLY的專用加載區,避免編譯程序將其他非IP-Code的函數編排到SLIB區內,RW_IRAM1是指定給安全庫區算法的函數使用,目的是為了避免終端用戶的項目也用到同樣的RAM區塊,而造成程序執行時發生錯誤,如下所示
圖17. Keil scatter修改
- IP-Code用到的RAM以及數據安全庫區FIR低通濾波器函數使用到的常數編排地址,除了上述的修改scatter file方式之外,也可以代碼中使用Keil的__attribute__((at(address)))描述元將變量或常數放置到固定的地址
IAR的ICF file步驟如下:
- 開啟\project_l0\IAR_V8.2\目錄下的icf文件,添加三個新的加載區,如下所示,其中SLIB_RAM區塊的RAM保留給算法的函數使用
圖18. icf文件中SLIB地址定義
- 在ICF文件中,也要將SLIB占用的區域保留起來,避免編譯程序將其他非IP-Code的函數編排到SLIB區內,同時將IP-Code使用的RAM區域保留起來
圖19. icf文件中地址分配
- IP-Code用到的RAM和ROM,修改icf文件,如下圖
圖20. icf文件中SLIB使用的RAM修改
- IP-Code用到的RAM以及數據安全庫區FIR低通濾波器函數使用到的常數編排地址,除了上述的修改ICF文件方式之外,也可以代碼中使用IAR的@描述元將變量或常數放置到固定的地址
AT32 IDE的ld file步驟如下:
- 修改ld文件,劃出安全庫區所需的區域,如下圖
圖21. ld文件中使用的RAM和ROM范圍修改
- 將算法代碼放到.slib_inst section,低通濾波器的系數放到.slib_read_only section,并將算法使用到的全局變量指定到.slib_ram section,如下圖
圖22. ld文件中編排放置位置
- 在Project->Properties->C/C++Build->Setting->GNU ARM Cross C Linker->General設定中的Script files,加入改好后的ld文件。
圖23. 添加修改后的ld文件
- 本范例會使用到gcc的數學運算函數庫libm.a,在Properties->GNU ARM Cross C Linker->Miscellaneous設定中的Other linker flags填入--specs=rdimon.specs,linker才不會出現錯誤訊息,如下圖
圖24. 添加額外關鍵字避免編譯報錯
三、啟用安全庫區保護
要啟用安全庫區的保護功能,有以下兩種方式:(1) 使用ICP刻錄工具Artery ICP Programmer(建議用此方式)要使用ICP Programmer,請參照以下步驟:
- 連接AT-Link到AT-START-F402板子上并上電
- 開啟ICP Programmer,選擇用AT-Link連接,然后添加Project_L0范例編譯后產出的HEX或BIN文件,如下圖
圖25. 配置ICP Programmer
- 按下載按鍵,會出現下載選項的頁面,此頁面會顯示SLIB的狀態及相關的參數,設定啟用密碼0x55665566(可自定義)并勾選啟用SLIB,然后按開始下載,即可完成程序的燒錄并啟用SLIB,如下圖
圖26. 設置下載選項參數
關于ICP Programmer的詳細說明,請參閱ICP Programmer用戶手冊。(2) 使用范例程序main.c之中的slib_enable()函數在低通濾波函數測試正確后執行過一次此函數,就可以啟用安全庫區的保護功能。要執行此函數,只要在main.c中使能#define USE_SLIB_FUNCTION即可。
四、Project_L0執行流程
在此范例中,FIR低通濾波器會針對混和1KHz及15KHz正弦波的輸入信號testInput_f32_1kHz_15kHz 做計算,計算后輸出的1KHz正弦波數據存放到testOutput,然后會跟預先用MATLAB軟件計算好且存放在refOutput中的數據做比對,如果誤差值小于預期值(訊噪比SNR大于預設的門坎),板子上綠色的LED燈會一值閃爍,反之則是紅色的LED燈一值閃爍,下圖是Project_L0的整個流程圖27. Project_L0執行流程
要執行此范例程序,請按照下列步驟:(1) 使用Keil μvision開啟\utilities\AT32F402_405_slib_demo\project_l0\mdk_v5\目錄下的Project_L0項目,并重新編譯。(2) 在下載代碼之前,先檢查AT-START-F402板子上的芯片是否已經有SLIB或讀寫保護(FAP/EPP),如果有,就請先用ICP刻錄工具將這些保護都解除,然后再下載代碼。(3) 下載成功后并開始值執行后,會看到板子上的LED3燈持續快速閃爍。(4) 按下板子上的USER按鍵,就會執行低通濾波器的運算。(5) 比對運算結果,若結果正確,綠色LED4燈會持續閃爍。反之,則是紅色LED2燈持續閃爍。(6) 在比對結果正確的條件下,如果main.c中的USE_SLIB_FUNCTION有被定義且芯片未啟用過SLIB的話,就會執行slib_enable()函數去設置SLIB,若設置失敗,紅色LED2燈會一直亮著。若設置成功,綠色LED4燈會點亮約3秒鐘然后執行系統重置(system reset)來啟動SLIB。然后程序又回到步驟(3)。
五、產生頭文件及符號定義文件
頭文件(header file)跟符號定義文件(symbol definition file)是終端客戶應用范例Project_L1在調用FIR低通濾波函數時需要用到。在范例中,就是main.c中包含的fir_filter.h文件。符號定義文件的產出方法跟使用的工具鏈(toolchain)相關。使用Keil μvision產生符號定義文件方法如下:
- 進入Ottions forTarget→Linker設定畫面
- 在Misc controls這一欄,添加--symdefs=fir_filter_symbol.txt命令,如下圖
圖28. 設置Keil Misc controls選項
- 重新編譯整個項目后,在project_l0\mdk_v5\Objects 目錄下就會產生一個名為fir_filter_symbol.txt的符號定義文件
- 這個符號定義文件包含了整個項目全部的符號定義,所以需要修改,只保留終端用戶會調用的低通濾波函數的定義,刪減后的fir_filter_symbol.txt顯示如下
圖29. 修改后的fir_filter_symbol.txt內容
使用IAR產生符號定義文件方法如下:
- 選擇Project→Option→Build Actions
圖30. 設置IAR Build Actions選項
- 然后在Post-build命令行中輸入以下命令
$TOOLKIT_DIR$\bin\isymexport.exe--edit "$PROJ_DIR$\steering_file.txt"
"$TARGET_PATH$" "$PROJ_DIR$\fir_filter_symbol.o"
- 此處fir_filter_symbol.o是要產出的符號定義文件,steering_file.txt放在project_l0\iar_v8.2目錄下,是用來選擇要產生哪些函數的符號,需根據安全庫區調用的內容進行手動編輯,內容如下,其中"show"是用來選擇函數的命令
圖31. 編輯的steering_file.txt內容
使用AT32 IDE產生符號定義文件方法如下:
- 創建一個keep_sym.txt文件,用來選擇要產生哪些函數的符號,需根據安全庫區調用的內容進行手動編輯
- 創建一個postbuild.sh文件,文件內容見工程,主要是用于生成包含函數名稱和地址的.ld文件
- 選中project_l0工程,按鼠標右鍵選擇Properties
- 點選C/C++Build->Settings->Build Steps->Post-build steps->Command中,填入"../postbuild.sh" "${BuildArtifactFileName}",點擊Apply生效
- 編譯后,DEBUG文件夾中會生成一個keep_sym_app.ld文件
圖32. AT32 IDE添加post-build命令
Project_L1: 終端用戶范例
Project_L1范例會使用到在Project_L0中調試好,并已經被刻錄到AT32F402芯片的主閃存中且被SLIB保護的FIR低通濾波器函數。根據Project_L0提供的頭文件、符號定義文件以及主閃存區塊映像,終端用戶就可以參照Project_L1做到
- 建立一個應用項目
- 引用Project_L0提供的頭文件及符號定義文件到項目里
- 調用FIR低通濾波器函數
- 開發并調試用戶自己的應用程序
注意事項:Project_L1必須使用跟Project_L0開發時一樣的工具鏈及相同版本的編譯程序,不然有可能會因為版本差異的兼容性問題,而無法使用Project_L0提供的代碼。例如本范例中Project_L0使用的是Keil μvision V5.36.0.0,那Project_L1也要使用同樣的這個版本。
一、建立用戶的應用項目
因為Project_L0啟用的安全庫區已經占用了一些特定的主閃存扇區,Project_L1的代碼必須參照Project_L0提供的主閃存區塊映像來編排放置的地址。圖15為此范例的主閃存區塊映射,其中sector2至sector 5為安全庫區所占用,終端用戶需使用linker control file將這個區域隔離起來,避免代碼在編譯時被編排到這個區域內,方式如下:Keil μvision的scatter file可參照project_l1\mdk_v5\目錄的end_user_code.sct文件,將主閃存空間切成兩個區塊,中間空出來的區域就是SLIB保護區。此外,RAM的區域也要保留0x20017000之后的區域。如下圖圖33. 修改后的scatter文件
IAR的ICF file可參照project_l1\iar_V8.2\目錄下enduser.icf文件中如下圖的部分圖34. 修改后的icf文件AT32 IDE的ld file可參照project_l1\at32_ide\目錄下FLASH_enduser.ld文件修改,添加如下圖的行圖35. ld文件添加project_l0生成的文件
二、在項目中加入符號定義文件
Project_L0所產生的符號定義文件fir_filter_symbol.txt必須被添加到Project_L1項目中,才能被正確的編譯并鏈結到SLIB保護區的代碼。在Keil μvision中加入符號定義文件工程中添加fir_filter_symbol.txt這個符號定義文件,如下圖:圖36. 在Keil加入symbol definition file
將文件加入fir_filter群組后,必須將它的文件類型更改為Object文件,而不是原來的文本(text)文件,修改方式如下圖37. 修改符號定義文件的類型為Object file
在IAR中加入符號定義文件將fir_filter_symbol.o這個Object文件加到加到fir_filter群組即可,如下圖圖38. 在IAR中加入符號定義文件
在AT32 IDE中加入符號定義文件例程中將keep_sym_app.ld放在了fir_filter文件夾內添加進工程,在Project->Properties->C/C++Build->Setting->GNU ARM Cross C Linker->Library中添加keep_sym_app.ld所在路徑圖39. 在AT32 IDE中添加ld路徑
三、調用SLIB保護區的函數
當filter.h頭文件被main.c引用且符號定義文件也正確地加入項目之后,保護區的低通波器函數就可以被調用。方式如下:FIR_lowpass_filter(inputF32, outputF32, TEST_LENGTH_SAMPLES);其中:inputF32 :指向包含輸入信號數據表的指針outputF32 :指向存放輸出信號數據表的指針TEST_LENGTH_SAMPLES :要被處理的信號樣本數
四、Project_L1執行流程
Project_L1的執行流程如下圖,說明如下:
- 開始執行后LED3燈會持續閃爍
- 按下AT-START板子上的USER按鍵,FIR_lowpass_filter()開始做運算
- 如運算結果正確,綠色LED4燈持續閃爍,如運算結果錯誤則紅色LED2燈持續閃爍
圖40. Project_L1流程圖
五、調試模式下的SLIB保護
當終端用戶在開發應用程序時,會用到開發工具調試代碼,以下將以Keil μvision為例,說明在調試模式下,SLIB如何防止保護區內的代碼被以數據的方式讀取
- 開啟Project_L1項目并重新編譯
- 點擊”Start/Stop Debug Session”進入調試模式
- 在”Disassembly”窗口點擊數標右鍵,然后選擇”Show Disassembly at Address”,如下圖
圖41. 進入Show Disassembly at Address
- 輸入SLIB_INSTRUCTION扇區地址
圖42. 設置Show Code at Address可以看到代碼都是0x00圖43. 代碼查看
- 同樣地在Memory窗口輸入地址,也會看到全部是0x00
圖44. Memory窗口查看代碼
- 在Memory窗口,輸入SLIB_READ_ONLY地址,因為這個區塊允許被D-Code數據總線讀取,所以可以看到原來的數值
圖45. Memory窗口查看SLIB_READ_ONLY起始頁面對安全庫區的數據嘗試做修改,FLASH_STS寄存器的EPPERR位置”1”提出警告,顯示寫保護發生作用圖46. SLIB寫測試如果有使能寫保護錯誤中斷,繼續執行程序就會進入中斷程序里面圖47. 寫保護錯誤中斷
方案商和終端用戶代碼整合及下載操作流程
方案商和終端用戶的代碼設計完成后,需要下載到同一個MCU中,這就涉及到各自代碼的安全性問題。以下列舉兩種常用下載操作流程供用戶參考,仍然是以上面Project_L0和Project_L1為例。操作中涉及到AT-Link的離線下載模式,詳細描述可以參考ICP使用文檔及AT-Link使用文檔。
方案商和終端用戶代碼分別燒錄
方案商先燒錄SLIB代碼到MCU,然后終端用戶再燒錄應用代碼到MCU,步驟如下:(1)方案商將編譯完成的工程中SLIB部分的代碼提取并保存成BIN或者HEX檔,這步可以通過各個IDE軟件或者ICP工具實現,例如在KEIL工程中,user選項中添加fromelf.exe--bin--output.\Listings\@L.bin !L,編譯生成對應固件的bin檔,將對應的SLIB段文件添加后綴名.bin格式,本例中修改為ER_SLIB_INSTRUCTION.bin和ER_SLIB_READ_ONLY.bin,對應的就是SLIB-INSTRUCTION文件和SLIB-DATA文件,也可以新版ICP直接打開工程完整HEX檔然后點擊文件->文件另存為bin格式,分段的bin名對應地址,如下圖。圖48. 生成SLIB代碼部分bin文件(2) 將bin通過ICP工具,在線燒錄到MCU,如下圖圖49. ICP在線燒錄MCU(3) 或者通過ICP工具配置成離線項目工程保存到AT-Link,然后經過AT-Link離線燒錄到MCU,保存離線項目工程如下圖。圖50. AT-Link離線燒錄到????MCU(4) 經過步驟2或者步驟3,終端用戶拿到燒錄好SLIB部分的MCU,此時SLIB狀態會顯示為已啟用,終端用戶通過在線燒錄或者離線燒錄應用代碼到MCU完成整個過程,在線燒錄如下圖。圖51. 終端用戶燒錄代碼到MCU
方案商和終端用戶代碼合并燒錄
方案商的SLIB代碼和終端用戶的應用代碼整合到一個離線項目工程中,通過AT-Link離線燒錄一次下載到MCU,步驟如下:(1) 方案商將編譯完成的工程按照上一章節所述方法處理,得到SLIB部分的BIN檔。(2) 方案商通過ICP制作離線項目工程并保存到PC,可以根據最終需求配置各種參數,比如限制下載次數、項目文件綁定AT-Link、下載完成后開啟FAP等,保存離線項目工程如下圖注意:離線項目工程本身已經經過加密,為進一步提升安全性,方案商還可以將slib.bin制作成加密的slib.benc文件再添加到離線項目工程中,但此時的離線項目工程只能在對應匹配加密秘鑰的AT-Link上才能使用圖52. 制作離線項目工程(3) 終端用戶拿到該離線項目工程,用ICP打開項目文件,通過添加文件功能,可以添加應用代碼部分到該離線項目工程,然后再保存到PC或者直接存儲到AT-Link,通過執行離線下載完成操作,項目文件添加方法如下圖。注意:為防止代碼泄露被破解等風險,離線項目工程添加代碼文件時其余配置都不可更改,所以需要方案商預先將最終配置設置好圖53. 添加項目文件
-
mcu
+關注
關注
146文章
17316瀏覽量
352497 -
雅特力
+關注
關注
0文章
168瀏覽量
8135 -
AT32
+關注
關注
1文章
118瀏覽量
2156
發布評論請先 登錄
相關推薦
評論