题目起得跟绕口令一样,转来转去。本文主要说的就是非安全的代码怎么去操作安全区的资源。
3 B) h# m6 o: M4 x4 b" Y4 K非安全区不能操作安全区资源,不过非安全区可以调用安全区允许的代码。# p* z: F1 A: H: \' n( i+ i
+ U! X$ z6 K5 R! z& T+ d工程设置跟上一个一样,还是俩小灯,PH6属于非安全区资源,PH7属于安全区资源。5 F" [0 J& P, g1 w
. X, E/ |% L: F% n; R6 M5 q
首先我们试一下直接操作寄存器(这样是不行滴)。6 J- \; G5 c* C8 g3 W5 y8 N
非安全区 main函数里
1 z9 c- ], J) b3 a- /* USER CODE BEGIN WHILE */# R# v) j+ x1 S5 P6 t8 o( c
- while (1)
& [& N# B K& B: q& M! K - {
T, Z, s! \ w1 Q) L( p - HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_7);/ c3 ~, ~" j# E& G3 a$ X
- HAL_Delay(1000);; j, K. B6 Z0 r3 k) _
- /* USER CODE END WHILE */
5 V( Q* r% G6 {. v# A- C5 G/ c - ; J$ s% d5 U0 z3 `, S) m9 w
- /* USER CODE BEGIN 3 */
: t1 _# d+ N" M1 {! O - }
4 R3 {& y4 f3 w& |" E+ x - /* USER CODE END 3 */
复制代码
0 j. e% b6 A: Z! C* y编译下载到芯片,不能运行,说明非安全区代码是不能直接操作安全区资源的。
( C% P1 y' i5 f7 G1 Z
- ]! s3 O2 }, |6 ?- ?7 L正统的方式是使用函数的方式调用。而且这个函数不是普通函数(肯定的,毕竟是俩工程)。需要使用__attribute((cmse_nonsecure_entry)) 进行修饰(不修饰的话,编译都过不了)。
. }5 z; E6 \* h6 k* {( n* L" x; z2 @" C
重新写一下代码, Q, ]" A f6 f: d+ B
安全区
& [/ W4 x! I8 B7 l- CMSE_NS_ENTRY void LED_toggle_S(void)4 I) n$ Z" m- g$ i& v
- {
7 _: [" T% ~ D+ F - HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_7);, X0 u1 ^& |' `; [2 t' J
- }
复制代码 ' F1 o/ [7 r8 {
这里的CMSE_NS_ENTRY 与 __attribute((cmse_nonsecure_entry)) 是等价的。如果追求严谨的话,可以把这个函数定义到secure_nsc.c里面,并在secure_nsc.h做声明,声明时只需像普通函数一样即可,即void LED_toggle_S(void);- w" A+ d; P1 y$ g) E4 \
) j9 t! T2 r" W非安全区 main函数里9 }7 q8 F, }8 X; r6 @
- /* USER CODE BEGIN WHILE */
+ T% v' J8 K# f4 D. } - while (1)) N$ J- ~3 i6 k
- {
7 F7 g; K' z. ?1 O8 i! L1 z+ o - LED_toggle_S();: t. G" U7 z6 V
- HAL_Delay(1000);
- o F3 ]5 E+ ~* P5 E G3 g1 [ - /* USER CODE END WHILE */
3 o6 P- _8 F. r0 V) J8 r
% ^/ ]+ i5 s# b! ^) j- /* USER CODE BEGIN 3 */6 c* Z& O s1 i1 s( l2 ]
- }' r5 T" ?7 s2 q6 C" i
- /* USER CODE END 3 */
复制代码 : }) \: g6 O3 X- G5 }' I
编译下载,绿灯开始正常闪烁。# x/ u- p) e6 M# z
5 [4 j/ X4 G; Y# z5 R F
注:因为非安全区可以调用安全区允许的代码,所以,编译的时候建议先编译安全区的程序,再编译非安全区的程序。
5 l3 s2 K9 Z& N# ?
. p5 U* F5 M/ `% M% X: { |
& b' c; Y# h* l