
軟件供應(yīng)商們在致力于開發(fā)屬于自己的知識產(chǎn)權(quán)的軟件產(chǎn)品,尤其是那些中間件產(chǎn)品的同時,如何保護(hù)這些知識產(chǎn)權(quán)[IP]實際上也是他們非常關(guān)心和重視的問題。基于各類微處理器的嵌入式產(chǎn)品對IP保護(hù)的要求也日益明顯和迫切。 為了滿足對產(chǎn)品IP保護(hù)的需求,STM32的各系列MCU都提供芯片讀保護(hù)寫保護(hù)。除此之外,目前STM32家族10個產(chǎn)品線中,除了STM32F1等個別早期產(chǎn)品線外,還增加了專有代碼讀保護(hù)功能,即Proprietary Code Read Out Protection (PCROP)。 ? Read Protection(RDP): 對整個芯片實施讀出保護(hù); ? Write Protection: 防止意外的對存儲器的擦、寫操作; ? PCROP: 針對指定扇區(qū)進(jìn)行讀寫保護(hù); PCROP為Proprietary code readout protection 的縮寫,是一個專有代碼讀出保護(hù)的功能。與RDP 對整片F(xiàn)lash讀保護(hù)不同的是,它只是針對Flash 的某些特定區(qū)域進(jìn)行代碼的讀寫保護(hù)。它可以被用來保護(hù)一些IP代碼,方便進(jìn)行二次開發(fā)。ST公司的多個STM32產(chǎn)品系列,比如STM32L1、STM32F4、STM32L4、STM32F7、STM32H7等都支持PCROP功能。

**受PCROP保護(hù)的IP代碼可以隨意地被用戶應(yīng)用程序調(diào)用運行,同時又防止外界對IP代碼的直接讀寫訪問。一咋看這句話理解起來可能有點別扭,稍微琢磨下應(yīng)可反應(yīng)過來。相信不少軟件工程師在開發(fā)中有時會用到第三方庫代碼,有些庫代碼是編譯過的lib庫,看不到source code,但你能使用調(diào)用它,有點類似。 **寫保護(hù)和PRROP保護(hù)都可以針對指定的扇區(qū)配置,但是在同一存儲器內(nèi)要么針對扇區(qū)實施寫保護(hù),要么針對扇區(qū)進(jìn)行PCROP保護(hù)。不可以一部分扇區(qū)配置寫保護(hù),另一部分扇區(qū)配置PCROP保護(hù)。

**PCROP區(qū)的代碼也可以調(diào)用PCROP區(qū)外的處于固定地址的函數(shù)。 
**受PCROP保護(hù)的區(qū)域是無法使用D-Code 總線進(jìn)行讀訪問的,所以在這片區(qū)域中只允許執(zhí)行指令代碼(通過I-Code 總線取指令),數(shù)據(jù)讀取是被禁止的。因此,受保護(hù)的IP代碼不能訪問存儲于同一塊區(qū)域內(nèi)的關(guān)聯(lián)數(shù)據(jù),比如文字池(literal pools)、分支表(branch tables)以及在執(zhí)行過程中需要通過D-code總線進(jìn)行讀取的常量數(shù)據(jù)。
換言之,受PCROP 保護(hù)的代碼只能是只執(zhí)行的指令代碼,而不包含任何數(shù)據(jù)。因此,我們在編譯受PCROP保護(hù)的IP代碼時,必須對其進(jìn)行相應(yīng)配置,以避免在PRROP區(qū)域生成文字池、常量數(shù)據(jù)等。
我們知道STM32的中斷向量表里都是些常量數(shù)據(jù),所以包含中斷向量表的扇區(qū)不可進(jìn)行PCROP。一般來講向量表放在第一個扇區(qū),所以該扇區(qū)不可進(jìn)行PCROP。 不同的編譯工具鏈有其自己的配置方式去阻止編譯器生成文字池和分支表。我們來看一下基于MDK Keil中和IAR 開發(fā)環(huán)境的設(shè)置操作。
·Keil:使用Execute-only 命令 1) 右擊項目中的IP代碼文件組(比如ST 官方應(yīng)用筆記AN4701例子中的FIR-Filter),選擇“Options for Group‘FIR-Filter’”

在對話框中選擇“C/C++”頁面,選中“Execute-only code”,點“OK”。 
2) 另外,還需修改Keil scatter file(.sct文件),設(shè)置IP 代碼為只可執(zhí)行代碼:

· IAR:No data reads incode memory
1) 右擊項目中的IP 代碼文件組(比如例子中的FIR-Filter),選擇“Options” 2) 另外,還需修改IAR ICF 文件(.icf 文件)。假如我們將IP 代碼放在Sector 2,那么,我們需要在.icf 中加入以下內(nèi)容,如下:

最后以一個基于STM32F4的PCROP實際應(yīng)用案例分享結(jié)尾。 某客戶使用了STM32F446ZET6,開啟PCROP 的功能,對他們的算法代碼進(jìn)行保護(hù)。在使用過程中,他發(fā)現(xiàn)位于PCROP 區(qū)的函數(shù)無法被用戶程序調(diào)用。 經(jīng)了解,客戶使用Keil MDK 進(jìn)行項目的開發(fā)。檢查客戶的代碼,看是否在項目中的IP代碼的Options 中使能了“ExecuteonlyCode”選項,發(fā)現(xiàn)并沒有將之使能。于是將此選項使能后,并編輯.sct 文件,再編譯,運行代碼。問題解決。
原因就在于客戶未對IP 代碼部分進(jìn)行相應(yīng)的配置處理,從而導(dǎo)致編譯器未在PCROP區(qū)域避免生成文字池和分支表等數(shù)據(jù)。故而在調(diào)用PCROP內(nèi)部的函數(shù)時觸發(fā)了D-code 總線去訪問PCROP 區(qū)域,導(dǎo)致錯誤發(fā)生。 對于PCROP 功能的詳細(xì)使用說明,請參考應(yīng)用筆記AN4701《Proprietary code read-out protection on microcontrollers of theSTM32F4 series》及其相應(yīng)的參考代碼X-CUBE-PCROP.zip。 |