PCROP 数无与解
前言
前言前言
前言
PCROP Proprietary code readout protection 的缩写,也就是说这是一个专有代码读出保护的功能。与 RDP 对整片 Flash
读保护不同的是,它只是针对 Flash 的某些特定区域进行代码的读写保护。所以它可以被用来保护一些 IP 代码,方便进行二
次开发。它存在于许多 STM32 的型号中,如 STM32F401STM32F411STM32F427/437STM32F429/439
STM32F446STM32F469/479STM32L476/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’
在对话框中选择“C/C++”页面,选中“Execute-only code”,点“OK”。
2) 另外,还需修改 Keil scatter file.sct 文件),设置 IP 代码为只可执行代码,如下:
LR_PCROP 0x08008000 0x00004000 {
ER_PCROP 0x08008000 0x00004000 { ; load address = execution address
arm_fir_init_f32.o (+XO)
arm_fir_f32.o (+XO)
FIR_Filter.o (+XO)
}
}
IARNo data reads in code memory