
PCROP 区域函数无法被调用的问题与解决
前言
前言前言
前言
PCROP 为 Proprietary code readout protection 的缩写,也就是说这是一个专有代码读出保护的功能。与 RDP 对整片 Flash
读保护不同的是,它只是针对 Flash 的某些特定区域进行代码的读写保护。所以它可以被用来保护一些 IP 代码,方便进行二
次开发。它存在于许多 STM32 的型号中,如 STM32F401、STM32F411、STM32F427/437、STM32F429/439、
STM32F446、STM32F469/479,STM32L476/486,等等。对于 PCROP 的功能,我们有另一篇文章《STM32F4xx PCROP
功能使用说明》已经做了描述。
问题
问题问题
问题
某客户在其产品的设计中,使用了 STM32F446ZET6,客户使用了 PCROP 的功能,为他们的算法代码进行保护。但是,客
户在使用过程中,发现位于 PCROP 的函数无法被调用。
调研
调研调研
调研
1
11
1.
..
.了解
了解了解
了解问题
问题问题
问题
客户使用 Keil Realview MDK 进行项目的开发。检查客户的代码,看是否在项目中的 IP 代码的 Options 中使能了“Execute-
only Code”选项,发现并没有将于使能。于是将此选项使能后,并编辑.sct 文件,再编译,运行代码。问题解决。
2.
2.2.
2.问题
问题问题
问题分析
分析分析
分析
受 PCROP 保护的区域是无法使用 D-Code 总线进行读访问的,所以在这片区域中只允许执行代码(通过 I-Code 总线取指
令),数据读取是被禁止的。因此,受保护的 IP 代码不能访问存储于同一块区域内的关联数据,比如文字池(literal pools)、
分支表(branch tables)以及在执行过程中需要通过 D-code 总线进行读取的常数数据。所以受 PCROP 保护的代码只能是只
执行的代码,并不包含任何数据。
因此,我们在编译受 PCROP 保护的 IP 代码时,必须对其进行配置,以避免生成文字池。不同的编译工具链有其自己的配置
方式去阻止编译器生成文字池和分支表。我们来看一下,如何在 Keil 中和 IAR 中进行设置。
• Keil:使用 Execute-only 命令
1) 右击项目中的 IP 代码文件组(比如 AN4701 的例子中的 FIR-Filter),选择“Options for Group ‘FIR-Filter’”