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

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

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

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

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

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