你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】PCROP 区域函数无法被调用的问题与解决

[复制链接]
STMCU小助手 发布时间:2022-2-27 16:37
前言4 `8 J: b  {! M# o$ c
PCROP 为 Proprietary code readout protection 的缩写,也就是说这是一个专有代码读出保护的功能。与 RDP 对整片 Flash读保护不同的是,它只是针对 Flash 的某些特定区域进行代码的读写保护。所以它可以被用来保护一些 IP 代码,方便进行二次开发。它存在于许多 STM32 的型号中,如 STM32F401、STM32F411、STM32F427/437、STM32F429/439、STM32F446、STM32F469/479,STM32L476/486,等等。对于 PCROP 的功能,我们有另一篇文章《STM32F4xx PCROP功能使用说明》已经做了描述。  i( Y1 e& r4 i( o+ v) x! p5 m
1 c. L* ]7 \+ g
问题
& m* z# p2 g+ X* Q某客户在其产品的设计中,使用了 STM32F446ZET6,客户使用了 PCROP 的功能,为他们的算法代码进行保护。但是,客户在使用过程中,发现位于 PCROP 的函数无法被调用。
/ G3 Q, C; f5 `3 k
  i2 Y5 o% J( e$ c$ J9 [! z" ]8 l调研
$ K8 Y  L! a/ ]1 }2 m. z. ~) R1.了解问题
: I8 f2 @5 Y' G  S1 \8 X. t客户使用 Keil Realview MDK 进行项目的开发。检查客户的代码,看是否在项目中的 IP 代码的 Options 中使能了“Executeonly Code”选项,发现并没有将于使能。于是将此选项使能后,并编辑.sct 文件,再编译,运行代码。问题解决。, |4 a* F/ `  S8 _- |( [  y

3 f! Z) N0 {2 T* o: J2.问题分析
7 @- G& U) m) R* o  @, ~4 o! y: B受 PCROP 保护的区域是无法使用 D-Code 总线进行读访问的,所以在这片区域中只允许执行代码(通过 I-Code 总线取指令),数据读取是被禁止的。因此,受保护的 IP 代码不能访问存储于同一块区域内的关联数据,比如文字池(literal pools)、分支表(branch tables)以及在执行过程中需要通过 D-code 总线进行读取的常数数据。所以受 PCROP 保护的代码只能是只执行的代码,并不包含任何数据。7 m& K! s  }# f5 ~4 k7 z
& F. }6 m$ x, o( _
因此,我们在编译受 PCROP 保护的 IP 代码时,必须对其进行配置,以避免生成文字池。不同的编译工具链有其自己的配置方式去阻止编译器生成文字池和分支表。我们来看一下,如何在 Keil 中和 IAR 中进行设置。
% M; T$ z" o+ o, I, B• Keil:使用 Execute-only 命令
: v& f2 G7 W1 g2 @. h1) 右击项目中的 IP 代码文件组(比如 AN4701 的例子中的 FIR-Filter),选择“Options for Group ‘FIR-Filter’”
8 L6 Z8 I  @( m
7 F$ u) e: S# [! \5 L ZSIGCYC4Q)HQ6SSPBHWVS31.png " u) [7 }8 M- n( ]0 q
; }) n6 m. n' r/ `# O- V+ |3 x- N
在对话框中选择“C/C++”页面,选中“Execute-only code”,点“OK”。0 ]& V, Q6 `! F# a* {( C

5 r6 t. \2 I# L5 [! {- g& c$ l
: ~3 N$ k' f, `- K0 z" p' M
+ W% q: N; Y; \, V/ a2) 另外,还需修改 Keil scatter file(.sct 文件),设置 IP 代码为只可执行代码,如下:
- }# \/ m0 c$ X$ k/ O. h7 ~
  1.    LR_PCROP 0x08008000 0x00004000 {+ }6 Y7 U. u- H
  2.    ER_PCROP 0x08008000 0x00004000 { ; load address = execution address
    $ \5 N! }4 y: a; U8 E9 e5 L
  3. + F3 M! N1 X) T! A0 b  X
  4. arm_fir_init_f32.o (+XO)  w. D; {# Y3 T  H
  5. arm_fir_f32.o (+XO)  d2 c2 g8 q1 I  C7 k
  6. FIR_Filter.o (+XO)
    % m; v7 a$ D- M
  7. }
    3 ?% c% X/ i& }( R! t
  8. }
复制代码

) k8 ]) I  R6 M$ Q* z) ^• IAR:No data reads in code memory; h& I. i' B, t8 }  h1 ^( R* o$ F" X
1) 右击项目中的 IP 代码文件组(比如 AN4701 的例子中的 FIR-Filter),选择“Options”% Z: [' p9 f% a2 F+ g. ?! D0 ?

6 H" R  x& q8 c/ T 47NX@UP`%CING9I_3BX3.png
, d2 ~% ?& y6 f8 {% k: T3 a8 {' i* a5 X# o5 F
   在对话框中的 “C/C++ Compiler”分类中,选择“Code”页面,选中“No data reads in code memory”,点“OK”。8 q- g0 ~8 L! ]% i. w) _4 x) a9 d
  n* n6 v9 ?: N
FFH3N4XBAD{)}P[NAY_LY1E.png - K/ V. N) z. Y! T; J
* g" L7 p0 I/ u2 q+ j3 G& T
2) 另外,还需修改 IAR ICF 文件(.icf 文件)。假如我们将 IP 代码放在 Sector 2,那么,我们需要在.icf 中加入以下内容,如下:4 B+ q3 K# U) r& s) D7 I
  1.    define symbol __ICFEDIT_region_PCROP_start__ = 0x08008000;6 @) i9 a: [- o
  2.    define symbol __ICFEDIT_region_PCROP_end__ = 0x0800BFFF;, r9 H+ P; c. m8 J% Z2 C
  3.    define region PCROP_region = mem:[from __ICFEDIT_region_PCROP_start__ to( c3 I8 V- v: g* S' H' P5 c9 M. {* e
  4.    __ICFEDIT_region_PCROP_end__];* C  {: R1 q7 D1 U* m3 l% _8 f
  5.    /* Place IP Code in sector 2 which will be PCROP-ed */
    9 y+ n2 j6 B- m5 S5 u
  6.    place in PCROP_region { ro object arm_fir_f32.o,* G. J6 b1 b" _* k4 X
  7.    ro object arm_fir_init_f32.o,
    0 `& G% n9 `! c
  8.    ro object FIR_Filter.o};
复制代码
$ a' j, V4 |% {0 f% @
结论; B* h" T2 E4 o
由于客户在项目中未对 IP 代码部分进行配置,从而导致编译器并未避免生成文字池和分支表。故而在调用 PCROP 内部的函数时,使用了 D-code 总线去访问 PCROP 区域,导致错误发生。3 I% _9 G9 m8 X6 T: d
   
- ^5 p! U$ X) j- ~. i8 r0 ^( w. ^处理" M' r6 w3 O. [) J/ K
正确地对项目的 IP 代码进行设置,并修改相应的文件。
( v2 U! j  _& @  _1 j* K# l' }% r* h   1 Y: C7 x5 @6 {7 x% r! R
建议
/ p4 _$ x( G) Z! y- o) O* E对于 PCROP 功能的详细使用说明,请参考应用笔记 AN4701《Proprietary code read-out protection on microcontrollers of the STM32F4 series》及其相应的参考代码 X-CUBE-PCROP.zip。
1 ^2 T% v; a& L6 B; F' H另外,一些注意事项可以了解一下:2 r1 \- h; `3 `$ V7 r
1) 某些 Sector 进行写保护,某些 Sector 进行 PCROP。这个方案无法实现,要么是全是写保护,要么是全是 PCROP;
( j5 q! C: Q& @% p/ P! [  e2) 中断向量表所在的 Sector 不允许进行 PCROP;
  t, M+ n. @1 G3) IP 代码所使用的所有常数都必须存放在 PCROP 区域外边,因为 PCROP 区域无法使用 D-Code 总线进行访问;这些数据在二次开发时注意不要被误擦除。% P$ u( H' A" }) x+ |5 _, N+ B8 S

) F' B( a9 j# b' v. T; K
赞 收藏 评论0 发布时间:2022-2-27 16:37

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版