题目起得跟绕口令一样,转来转去。本文主要说的就是非安全的代码怎么去操作安全区的资源。
) }1 I2 S* T1 l# h# c; f非安全区不能操作安全区资源,不过非安全区可以调用安全区允许的代码。
3 E; n' l4 |0 k0 j2 C! j
, @# C" A2 s& O2 ]4 k8 G工程设置跟上一个一样,还是俩小灯,PH6属于非安全区资源,PH7属于安全区资源。& Y- r$ X9 D$ v
( _! I1 m5 ~. n) j
首先我们试一下直接操作寄存器(这样是不行滴)。) I" y' f' U' W& i) o) q; U
非安全区 main函数里
, g ]2 x' L! @5 f- /* USER CODE BEGIN WHILE */
! r+ f# P4 q% H8 G - while (1)
& ]. j- g- z( m5 a' c" C - {
7 ~8 r7 S! \2 a% | - HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_7);! U' M) Q- h8 _( R1 m+ e$ U
- HAL_Delay(1000);! G$ R6 f# G a: i9 V; z
- /* USER CODE END WHILE */: o% ]0 B8 \* E/ s/ k+ _$ x+ d
4 J" W0 O' Q- X, x- /* USER CODE BEGIN 3 */5 G% S, v+ y- j+ {
- }. y* E$ w4 q3 e. U. x
- /* USER CODE END 3 */
复制代码
# h4 D1 T# m: v2 G9 j$ C编译下载到芯片,不能运行,说明非安全区代码是不能直接操作安全区资源的。5 T; g2 v) S( @6 M6 f
1 V6 C& p, F4 K+ S- J e+ U8 i% V正统的方式是使用函数的方式调用。而且这个函数不是普通函数(肯定的,毕竟是俩工程)。需要使用__attribute((cmse_nonsecure_entry)) 进行修饰(不修饰的话,编译都过不了)。- D [% G1 o( [. H8 q+ [! {
# i( s* v5 |/ M重新写一下代码
: s v3 R" y& | T安全区- b! w# _! } _/ ?% E4 }
- CMSE_NS_ENTRY void LED_toggle_S(void)2 b; m4 Q# k }% }- E
- { _3 Q6 `) Q% N; M- q& E
- HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_7);
1 N, _! T1 W3 G9 b' D/ s9 X9 q - }
复制代码
[. C% W. ?! H* }这里的CMSE_NS_ENTRY 与 __attribute((cmse_nonsecure_entry)) 是等价的。如果追求严谨的话,可以把这个函数定义到secure_nsc.c里面,并在secure_nsc.h做声明,声明时只需像普通函数一样即可,即void LED_toggle_S(void);
9 d# b- Q: N( F! {( C' v/ H
' g ]% `2 e- V7 I8 O# H1 ~非安全区 main函数里/ S' a5 v/ L9 H$ p# A: ~, {' k
- /* USER CODE BEGIN WHILE */; ?8 l8 M- d+ z9 ~5 R9 M+ c
- while (1)' X6 f6 o0 p% M+ Z) p6 A% w2 K9 m0 ~
- {. w! K1 D% I7 R$ j5 N. W8 p
- LED_toggle_S();7 D b, G% A1 l, I6 L4 Z% H" `
- HAL_Delay(1000);
: ^6 @0 l1 ?& e! C7 h - /* USER CODE END WHILE */
6 a& H( S0 F0 n5 _# w! f
3 ~" U3 h' `0 o- /* USER CODE BEGIN 3 */9 n* J }. C: d
- }- d" r) U) D# ~
- /* USER CODE END 3 */
复制代码 8 f2 P9 [, V' K/ B2 x
编译下载,绿灯开始正常闪烁。
6 F! Z. _* X/ ~ |7 Q$ T; }0 C8 Q+ Y$ G- S- W
注:因为非安全区可以调用安全区允许的代码,所以,编译的时候建议先编译安全区的程序,再编译非安全区的程序。
4 Y: y% k6 A6 x
8 ?. R: F' E, w. g# H' { |
! Q( S$ O8 W& P