题目起跟上一篇很接近啊。本文主要说的就是安全区的代码怎么去操作非安全区的资源。7 c; l# R5 f1 N
安全区可以操作非安全区资源,安全区可以调用非安全区的代码。; Q# ]& @3 a; e+ u0 S
工程设置跟上一个一样,还是俩小灯,PH6属于非安全区资源,PH7属于安全区资源。
& @) a: _- d% l: B- Y
4 h) u% @4 t' L O: f; C首先我们试一下直接操作寄存器,接着上次的程序来。
* J' @ A7 s1 S$ `5 D1 `2 _6 v& @这次程序是非安全区调用安全区代码,然后安全区代码操作非安全区的小灯,嗯,听起来很绕。
& b4 Y) l: H; r# z% d非安全区 main函数里% \5 H' J3 }/ n2 z5 L+ {7 j4 N) j) F8 i
- /* USER CODE BEGIN WHILE */
( `* P/ g: o! r - while (1), h9 j+ P1 V2 Q0 [: E& @* d0 T
- {8 Z) \, _! L J8 h
- LED_toggle_S();
$ R" |& V! J( @5 T; S* I- P. h5 @ - HAL_Delay(1000);
% I9 @+ M# W. p1 W2 V5 P - /* USER CODE END WHILE */) R, a5 U3 Z/ Y, A0 C2 x
- 0 K/ v1 ]) m- O
- /* USER CODE BEGIN 3 */
& c! Y* b2 L$ B M. `9 H - }# c- b- Q i' `. p
- /* USER CODE END 3 */
复制代码
7 D% U( w6 s( c6 v6 h安全区代码
+ l2 y$ r/ j. G' G. g( E( C/ {- void LED_toggle_S(void) CMSE_NS_ENTRY 4 j5 a' w- Q4 ]; k/ G
- {
( A J8 d; G1 p5 j( B - HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_6);
8 a6 o/ E9 X( {: ` - }
复制代码 / q n+ Q& g) j# F3 S# r' k
编译下载,红灯开始正常闪烁。7 _5 m4 d/ W6 C0 q* Q, b
一切正常。
0 h" Q. L) k: N接下来是安全区代码调用非安全区函数,好像有点怪,如果安全区代码调用非安全区代码,同时非安全区代码也调用安全区代码,是不是就出现互相依赖的问题了?所以它并不是直接调用的函数,因为安全区代码对非安全区所有的资源都有操作权限,那我就直接操作地址就好了啊,直接访问非安全区代码的地址,调用它(实际使用中还需要点修饰)。接着刚才的程序。
) e b3 _) k; V. M. V; c7 [% T# ^非安全区6 I1 P) ?' b) v" v8 }# D# D
- void LED_toggle_NS(void) __attribute((section(".ARM.__at_0x8101000")));6 \* E A! @4 G* T7 S( n+ j
- : m/ o( x) k8 O& y9 _6 x
- void LED_toggle_NS(void): E1 R+ U( }& P5 S2 o4 ?
- {- _8 q ^) q4 a9 B+ ^; h) m- I
- HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_6);4 F+ Q. J' z; \& Y% b
- }
复制代码
( g4 N& U0 v2 o6 A& ]. \非安全区 main函数里
v9 } F+ U$ x* w- /* USER CODE BEGIN WHILE */
( v! W7 }1 k/ t2 V3 Y- n - while (1); z* `% S2 @' K) N- q
- {* _, l( J9 |/ Q P F" O/ ^) z( _! J
- LED_toggle_S();% A/ ?; f' A9 E5 H: [8 v
- HAL_Delay(1000);: l1 l8 V- \6 P G; L
- /* USER CODE END WHILE */
0 Y+ V3 a: N% o [0 @* V% p - 5 L0 [# r* L6 ]( x* J# |( Z' u
- /* USER CODE BEGIN 3 */0 u P0 w: K2 t& f
- }
+ [1 A' \6 a4 x1 y& M2 q2 E' f - /* USER CODE END 3 */
; L& ?# p6 p& g/ a
复制代码 & W" L6 l, P, M
创建一个操作小灯的代码,并编译到0x8101000地址上。
& ?4 m4 n# U1 \- n( R/ M" g安全区代码( b) Y6 K D6 c. r; ~3 ~/ a
- void LED_toggle_S(void) CMSE_NS_ENTRY$ R/ |& H/ T, s8 R7 _6 W) i3 v( i, u
- {+ }( y/ t7 M9 |
- funcptr_NS LED_toggle_NS;
( _8 ~; j* D+ B; m) L; g8 T& X - LED_toggle_NS = (funcptr_NS)0x8101000;
& B3 x1 h9 X! q' D! k4 I9 L - LED_toggle_NS();
4 l, x- {) _5 e - }
复制代码
( w7 f! s' x- i$ w' j; v" {* L就是调用了非安全区的程序,嗯,这是一个非安全区代码调用安全区代码,然后安全区代码调用非安全区代码,然后通过操作非安全区程序控制小灯,嗯,绕口令越来越熟练了。# y+ L, `: R+ c9 {/ Z
编译下载,红灯开始正常闪烁。$ y$ A6 G8 S) J: O" F
& o/ e2 ?0 N) C
funcptr_NS 是ST给我们提供的一个定义好的接口,不光上面一种写法。
; n4 t. j' ]& z: ]( c& f/ N& c3 t; |' S
善良守序. v% g# B1 {2 n5 ?
- funcptr_NS LED_toggle_NS;
- c% S F; d$ h, U - LED_toggle_NS = (funcptr_NS)0x8101000;. c2 k3 B" B* K! {
- LED_toggle_NS();
复制代码
& b8 I1 A3 l z3 D5 O6 J) L绝对中立8 h6 F: P# u2 [' [
- ((funcptr_NS)0x8101000)();
复制代码 . C3 |& l! ~% j! P: K- n
混乱邪恶
' U% ~8 p" W; E- p- ((void __attribute((cmse_nonsecure_call))(*)(void))0x8101000)();
复制代码 / G. ]6 F% o* I3 L @! i W1 o
全展开确实太刺激了点,哈哈。
+ i! X* x8 e* k/ `6 |3 w
* d6 O6 m1 t/ f |
+ m5 x# l% z& ~9 b& I4 {% g! K