题目起跟上一篇很接近啊。本文主要说的就是安全区的代码怎么去操作非安全区的资源。3 P6 r% T2 y @. z6 d7 L8 f
安全区可以操作非安全区资源,安全区可以调用非安全区的代码。
' p$ A6 I9 U. n$ ~0 I0 l# n1 }工程设置跟上一个一样,还是俩小灯,PH6属于非安全区资源,PH7属于安全区资源。
' o- E6 P4 P4 d# Y. d2 c1 S' l
, W P2 v9 K" R, D8 S( T3 A
首先我们试一下直接操作寄存器,接着上次的程序来。0 Z, E5 _! P+ t$ y( B
这次程序是非安全区调用安全区代码,然后安全区代码操作非安全区的小灯,嗯,听起来很绕。2 ]5 }$ ~* Q( W
非安全区 main函数里* f: V, [* N- X0 Q( g$ w% P9 r
- /* USER CODE BEGIN WHILE */
) A* T- ^& J% i5 t& M - while (1)& ^8 @) s: o/ L! `. g) X
- {3 d4 J# j3 }& X. @$ @/ ~, M4 R
- LED_toggle_S();
# L' ]- m3 Y& k% e( L( r+ I$ j% G$ F' R - HAL_Delay(1000);/ K# |$ n& ?$ b8 @+ `+ \- H
- /* USER CODE END WHILE */
- b; D2 @9 I2 S0 w5 a( a1 l$ C - 0 A$ a5 x! \; }9 y# R
- /* USER CODE BEGIN 3 */ S3 E& R3 ~: @1 U$ }
- }
1 X! q! }& J9 u+ f7 ~ - /* USER CODE END 3 */
复制代码
" ^% ?1 P* r. T! y9 D7 p安全区代码4 M( ?$ P, H$ ~' g2 x- t1 i# Q$ D! w5 R
- void LED_toggle_S(void) CMSE_NS_ENTRY
" a% M2 o/ Y4 Y& p - {
! h; R& E% v" f P/ t4 M/ C - HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_6);
1 D4 n; z. d7 n; y& p, P& `# D - }
复制代码
; x! T" n: W" {+ C+ q编译下载,红灯开始正常闪烁。
& P5 k6 O3 m9 i" l" f4 ~一切正常。
* J0 Z9 a; f; Z+ E* k4 h- M接下来是安全区代码调用非安全区函数,好像有点怪,如果安全区代码调用非安全区代码,同时非安全区代码也调用安全区代码,是不是就出现互相依赖的问题了?所以它并不是直接调用的函数,因为安全区代码对非安全区所有的资源都有操作权限,那我就直接操作地址就好了啊,直接访问非安全区代码的地址,调用它(实际使用中还需要点修饰)。接着刚才的程序。
# @, p2 A5 Y2 m. b9 D非安全区
" ?5 Y1 o4 W4 G# N0 \% w- void LED_toggle_NS(void) __attribute((section(".ARM.__at_0x8101000")));8 H9 s" B2 m6 B- u% i
- ; H4 Z5 a* Z; r, [, {5 Q' R
- void LED_toggle_NS(void)" P h. [2 y5 _$ [/ k# t4 x, d; s
- {/ e& J: c7 W$ G# w2 t
- HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_6);9 c/ ` Y( |7 s
- }
复制代码 ( v+ T6 m4 d. _ h& A
非安全区 main函数里
) x) v# W$ c) E& e- /* USER CODE BEGIN WHILE */
2 ?; ^& K3 J7 i! E1 ~ - while (1)) D2 T: G2 h* }) Z# y7 k1 k
- {
8 v, ?; e! W% _ - LED_toggle_S();1 J9 b5 v# A q* Z- d
- HAL_Delay(1000);
$ F) d7 j" n- Y& y$ Z1 m - /* USER CODE END WHILE */
+ h; S5 N# D2 e - 8 h4 w" G- D! C) z. E7 y
- /* USER CODE BEGIN 3 */
9 U/ I c- D& x0 a - }- u* O) U1 I+ p% v) ]4 ?
- /* USER CODE END 3 */" F" Q, A) q$ V" K# y8 T( B$ S
复制代码 # l4 ^: ]$ T' U% Q2 p+ J- _
创建一个操作小灯的代码,并编译到0x8101000地址上。
- }" t# _9 k+ q# `7 x安全区代码
! m/ @9 c3 @9 b% Q+ W5 z0 Z- void LED_toggle_S(void) CMSE_NS_ENTRY, x4 n/ U9 F* L$ V* W4 i7 A1 K2 S
- {
; x! |% ?- i2 e" l! ^9 X6 s Y* x - funcptr_NS LED_toggle_NS;5 Q; g P G( b4 O i
- LED_toggle_NS = (funcptr_NS)0x8101000;4 d# `/ T+ N, i: {( h* p+ Y/ Q
- LED_toggle_NS();" C. r0 S) D2 X" _% H
- }
复制代码 8 M/ u: L1 T& h0 H
就是调用了非安全区的程序,嗯,这是一个非安全区代码调用安全区代码,然后安全区代码调用非安全区代码,然后通过操作非安全区程序控制小灯,嗯,绕口令越来越熟练了。. [6 a/ G6 F, L
编译下载,红灯开始正常闪烁。, D, Z4 |; A( f& p6 Y, @& L7 d$ [
) l- ?% o8 u0 K6 z; B, Sfuncptr_NS 是ST给我们提供的一个定义好的接口,不光上面一种写法。6 I9 d" w5 f! ?* {! [4 }* L& l/ e
" D# \- l) o3 B* |; n
善良守序. |" S% w% |( e
- funcptr_NS LED_toggle_NS;7 s$ k2 ?8 f4 Z+ t; F" r
- LED_toggle_NS = (funcptr_NS)0x8101000;# C- v7 J# D! P- `
- LED_toggle_NS();
复制代码
& ^1 P! m; M; v7 }5 y! Z绝对中立
% m" T8 p) r" y# ?- A* F% P; H- ((funcptr_NS)0x8101000)();
复制代码 9 G& q. d" r, \! w$ Q) h; ?
混乱邪恶
, b% y1 T- `3 r0 S0 o& N( ~- ((void __attribute((cmse_nonsecure_call))(*)(void))0x8101000)();
复制代码 / z% n4 y* \9 y- i
全展开确实太刺激了点,哈哈。; I8 p0 {! P/ A7 k, J& w+ ?
3 `4 K5 f; X7 W |