奇迹
发布时间:2021-10-17 17:34
|
题目起得跟绕口令一样,转来转去。本文主要说的就是非安全的代码怎么去操作安全区的资源。* A% A9 n( Z4 J! `# a 非安全区不能操作安全区资源,不过非安全区可以调用安全区允许的代码。9 W( y& d% j/ A+ u& i( \( q 工程设置跟上一个一样,还是俩小灯,PH6属于非安全区资源,PH7属于安全区资源。
首先我们试一下直接操作寄存器(这样是不行滴)。 非安全区 main函数里
编译下载到芯片,不能运行,说明非安全区代码是不能直接操作安全区资源的。: z: m: ]" T; \5 O4 j {) M $ P1 {+ L3 |8 H+ |3 O7 Z 正统的方式是使用函数的方式调用。而且这个函数不是普通函数(肯定的,毕竟是俩工程)。需要使用__attribute((cmse_nonsecure_entry)) 进行修饰(不修饰的话,编译都过不了)。 重新写一下代码2 T m1 V* }, i: o( M+ ^ 安全区
这里的CMSE_NS_ENTRY 与 __attribute((cmse_nonsecure_entry)) 是等价的。如果追求严谨的话,可以把这个函数定义到secure_nsc.c里面,并在secure_nsc.h做声明,声明时只需像普通函数一样即可,即void LED_toggle_S(void); & O2 u0 s' M3 K! b" J 非安全区 main函数里/ w. |9 o- _( M/ W. ?: z. k
编译下载,绿灯开始正常闪烁。 l/ I1 }3 P. N& A; R9 [ 注:因为非安全区可以调用安全区允许的代码,所以,编译的时候建议先编译安全区的程序,再编译非安全区的程序。 |
微信公众号
手机版
% ]0 x$ o% C8 {