题目起跟上一篇很接近啊。本文主要说的就是安全区的代码怎么去操作非安全区的资源。" A( p: G# |9 D* {* S3 C
安全区可以操作非安全区资源,安全区可以调用非安全区的代码。
1 N/ p5 o6 h d* t! H& b& {. I工程设置跟上一个一样,还是俩小灯,PH6属于非安全区资源,PH7属于安全区资源。
. U8 \! Z3 ^, s( O9 B
7 |. c; i3 n- p- P首先我们试一下直接操作寄存器,接着上次的程序来。$ v U3 T4 ^7 g8 v) M4 t$ A" o
这次程序是非安全区调用安全区代码,然后安全区代码操作非安全区的小灯,嗯,听起来很绕。
& { h2 |0 d# J6 P' C非安全区 main函数里
& r8 [5 V* A9 L( j+ s" z- /* USER CODE BEGIN WHILE */
! f6 p; e' `* B# _ - while (1)
; F- L, {4 a! U) |9 W- Q4 i2 t - {
! e+ o0 [: F% Z - LED_toggle_S();+ z- _7 w, q8 z
- HAL_Delay(1000);
/ g% K/ W8 c* z% ~- p - /* USER CODE END WHILE */
8 h0 F% o, F7 f) U9 J0 h
4 P& r2 q: v3 N2 S3 j- /* USER CODE BEGIN 3 */
/ w' G5 l4 W: i' e - }* o: _* K+ q' n
- /* USER CODE END 3 */
复制代码 8 B1 R( \, c$ M0 E, n
安全区代码2 C* n( y9 n$ [# `" j$ e9 B
- void LED_toggle_S(void) CMSE_NS_ENTRY 0 C5 t+ p- U( d4 G; t
- {% r5 B! V8 r+ N: j5 y( e/ l
- HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_6);: Y. c4 f+ O/ i- `1 K
- }
复制代码 9 h. D% n! \3 d
编译下载,红灯开始正常闪烁。
7 @( R- Q2 s/ }2 U) W% g一切正常。
" r- [/ h+ J# V$ w- M. R接下来是安全区代码调用非安全区函数,好像有点怪,如果安全区代码调用非安全区代码,同时非安全区代码也调用安全区代码,是不是就出现互相依赖的问题了?所以它并不是直接调用的函数,因为安全区代码对非安全区所有的资源都有操作权限,那我就直接操作地址就好了啊,直接访问非安全区代码的地址,调用它(实际使用中还需要点修饰)。接着刚才的程序。; ~, E; o! {) q
非安全区' B4 s5 p9 N4 ~
- void LED_toggle_NS(void) __attribute((section(".ARM.__at_0x8101000")));3 Z! N* c: D6 X" J+ D9 g
w# A2 Z5 [, H6 T( C- void LED_toggle_NS(void)
7 B) O: w1 ^1 P2 S6 r" S - {
2 S4 ] ^* W% O - HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_6);
) {+ O8 b# f( P6 X2 y% [ - }
复制代码 1 |* w: \7 b! I6 O: T2 G! G
非安全区 main函数里
2 }. w- n: D7 [3 i- /* USER CODE BEGIN WHILE */% Z# G. [( G0 j
- while (1)
7 c- O1 q8 q Y; ^6 P- W1 s - {
' `) F2 {1 h+ I. Y7 j - LED_toggle_S();4 t" Z! F' b4 i" B
- HAL_Delay(1000);1 `' h) ?4 P" {! \# F
- /* USER CODE END WHILE */5 H" k) g7 ] V) q) p! N2 N; X
- ! J8 b9 U' B# k* z. i
- /* USER CODE BEGIN 3 */
! U7 W i+ A2 e7 ]9 l - } Q, W; E/ `( Q+ }) y6 Q, ~
- /* USER CODE END 3 */
, l6 Y$ o$ K" ]0 |3 h
复制代码
1 A- A7 l( l$ f+ y* {2 M创建一个操作小灯的代码,并编译到0x8101000地址上。) x1 X8 u9 ^0 s1 N& Z O' K
安全区代码
3 s1 F4 J+ S$ d- void LED_toggle_S(void) CMSE_NS_ENTRY
8 h1 V4 @- Y. C4 ?4 c c3 ]0 Y - {
$ z) U8 k$ {, N8 ^1 t3 V! Z0 M - funcptr_NS LED_toggle_NS;
. N, m0 |3 t' F7 D' E: x) _+ ` - LED_toggle_NS = (funcptr_NS)0x8101000;* R; }8 c- S% y$ M; a# C
- LED_toggle_NS();% J. W& w4 T4 @9 \9 R4 A
- }
复制代码
2 }. |3 g" V+ B就是调用了非安全区的程序,嗯,这是一个非安全区代码调用安全区代码,然后安全区代码调用非安全区代码,然后通过操作非安全区程序控制小灯,嗯,绕口令越来越熟练了。
8 I1 H5 L4 N/ V5 z/ x( l: K编译下载,红灯开始正常闪烁。 s$ L) ~) H* u0 N8 n) D
! J3 B, d, c' t# ^. ofuncptr_NS 是ST给我们提供的一个定义好的接口,不光上面一种写法。
1 E* p/ x! N* U) J1 R5 t! t5 }; {# M. ]% {3 L4 R, u
善良守序
; B. B- _) r2 q) S, b- funcptr_NS LED_toggle_NS;
' M0 f4 Z4 c' M3 u7 } - LED_toggle_NS = (funcptr_NS)0x8101000;
9 n0 g8 g/ N# i& y5 ?6 X& e$ J' p - LED_toggle_NS();
复制代码 " w' ~' u w6 y/ I
绝对中立' x7 J8 p& l- g6 \4 V: @6 o
- ((funcptr_NS)0x8101000)();
复制代码 % G" N4 Z2 l! F, f
混乱邪恶
9 @: e; f0 |9 J: p8 a- ((void __attribute((cmse_nonsecure_call))(*)(void))0x8101000)();
复制代码
5 _4 p7 r3 g$ k( V% {全展开确实太刺激了点,哈哈。
3 R/ |6 `7 U5 L) J& g, g3 }
) `) G2 F8 Y0 Z3 \) G9 a3 S! T |