题目起得跟绕口令一样,转来转去。本文主要说的就是非安全的代码怎么去操作安全区的资源。; J% A7 |2 ?: [* f h: @
非安全区不能操作安全区资源,不过非安全区可以调用安全区允许的代码。
n5 Q7 l5 h1 |3 s2 x4 v% e# F& i/ @5 o5 A ?
工程设置跟上一个一样,还是俩小灯,PH6属于非安全区资源,PH7属于安全区资源。% A) K* V9 i, I# {: P3 L
/ S' |9 H: J1 F8 S w( s首先我们试一下直接操作寄存器(这样是不行滴)。
/ n c- z9 Z7 J非安全区 main函数里5 j: Z3 F4 a& Q V. ?; {3 `( |8 s, Q' k
- /* USER CODE BEGIN WHILE */1 x: C, r" B6 t8 W
- while (1)5 L( K6 v) ~; l& b6 {# ]
- {( |% P8 L, I+ v$ [
- HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_7);
) L- g2 F5 B' `* M# R8 m1 ~ - HAL_Delay(1000);6 O( M7 Z" `7 u
- /* USER CODE END WHILE */ M3 @7 d% I$ c3 B4 B
- 9 Q1 d# f9 K* C0 f: O8 z; v
- /* USER CODE BEGIN 3 */
5 X6 P9 y9 C+ D. P7 e6 z: o/ g' Q$ K, C - }# p; x( a2 n9 }/ Q% X0 i9 v
- /* USER CODE END 3 */
复制代码 9 L- l }7 _& F3 {& q
编译下载到芯片,不能运行,说明非安全区代码是不能直接操作安全区资源的。
- Q: Y2 ^4 _* O" w& U* c
4 e! t% [" p# j* g% J8 v: F正统的方式是使用函数的方式调用。而且这个函数不是普通函数(肯定的,毕竟是俩工程)。需要使用__attribute((cmse_nonsecure_entry)) 进行修饰(不修饰的话,编译都过不了)。# w% N! v# x O
6 U# A, u8 ]5 }% f. X: ?' n- j* ]+ t
重新写一下代码$ ~/ {5 r( d- G) r/ j3 w/ M L
安全区( i- N; p7 }3 l) n! Q1 d( n
- CMSE_NS_ENTRY void LED_toggle_S(void)* p: k3 l: z/ [/ h) O
- {0 `1 G" Q+ H! ?! `: d3 }
- HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_7);. Q% O! T2 n" A- F# n4 W2 h" P; G. k
- }
复制代码 2 J, K2 _- F, j/ ? g1 ~" c
这里的CMSE_NS_ENTRY 与 __attribute((cmse_nonsecure_entry)) 是等价的。如果追求严谨的话,可以把这个函数定义到secure_nsc.c里面,并在secure_nsc.h做声明,声明时只需像普通函数一样即可,即void LED_toggle_S(void);
# \- O* G8 A; I; o7 P. u+ j, ^& w' }0 \- a. {) P' y
非安全区 main函数里
* x v0 v/ O6 h& v; |; O- Z- /* USER CODE BEGIN WHILE */) i+ w1 k8 ?; C" n5 T" W
- while (1)6 P4 e5 g3 y6 ^& K
- {. f7 [& L1 X, [4 ]
- LED_toggle_S();2 l$ S; B3 l3 \4 u9 R5 `8 B: [! j
- HAL_Delay(1000);5 t2 e8 T5 G& `5 j3 W
- /* USER CODE END WHILE */# N: O# p6 }( X7 e9 S( k
- 5 n* ^2 n, l t* q
- /* USER CODE BEGIN 3 */6 x9 R" Q8 j& L9 v
- }& F! e9 I" Y i6 I$ F8 Q% z
- /* USER CODE END 3 */
复制代码
+ j# p+ ~: g' l编译下载,绿灯开始正常闪烁。
- [ O }4 S* }& V) p* g7 b& B' x1 Y$ F* z
注:因为非安全区可以调用安全区允许的代码,所以,编译的时候建议先编译安全区的程序,再编译非安全区的程序。
& X# B/ U1 T' [3 @ ~6 M( S6 {$ X& R) N3 Y( n* s7 o
|
, B2 x2 \ {) j* b