?????在看别人的
A
R
M
ARM
ARM单片机的程序的时候,看见了对
s
e
t
j
m
p
setjmp
setjmp的调用,跳转过去之后发现还是库的内容,我以前也没有碰见过,于是这在这里记录以下。 ?????要调用
s
e
t
j
m
p
setjmp
setjmp只要把头文件
s
e
t
j
m
p
.
h
setjmp.h
setjmp.h包含进来就可以了,我这边看到的是这个头文件位于
K
E
I
L
KEIL
KEIL的安装目录,如图1所示。这个应该也是
C
C
C语言标准库的内容,具体可以参考维基百科以及这个地方的讲解。
图1.
?????下面的讲解我主要参考了这篇博客。其实这里也没有太多内容,
s
e
t
j
m
p
.
h
setjmp.h
setjmp.h这个头文件主要声明了两个函数和一个类型,具体可以到该头文件里面查看,也可以看图2。类型
j
m
p
_
b
u
f
jmp\_buf
jmp_buf定义的是一个数组类型,函数
i
n
t
s
e
t
j
m
p
(
j
m
p
_
b
u
f
e
n
v
)
int\quad setjmp(jmp\_buf\quad env)
intsetjmp(jmp_bufenv)用来保存调用该函数的位置整个程序环境到变量
e
n
v
env
env,第一次调用函数
s
e
t
j
m
p
setjmp
setjmp时返回值为0,调用函数
v
o
i
d
l
o
n
g
j
m
p
(
j
m
p
_
b
u
f
e
n
v
,
i
n
t
v
a
l
)
void\quad longjmp(jmp\_buf\quad env,int\quad val)
voidlongjmp(jmp_bufenv,intval)(调用时参数
e
n
v
env
env的值为前面调用函数
s
e
t
j
m
p
setjmp
setjmp所存储的程序环境参数)会重新回到前面调用函数
s
e
t
j
m
p
setjmp
setjmp的位置,且此时函数
s
e
t
j
m
p
setjmp
setjmp的返回值为调用函数
l
o
n
g
j
m
p
longjmp
longjmp的参数
v
a
l
val
val。这就有一点类似于
C
C
C语言的
g
o
t
o
goto
goto语句,但是
g
o
t
o
goto
goto语句只能在一个函数内部进行跳转,但是
s
e
t
j
m
p
setjmp
setjmp和
l
o
n
g
j
m
p
longjmp
longjmp一起来使用的话可以在不同的函数之间进行跳转。
图2.
?????下面我们直接上一段代码,下面的代码在正点原子的
S
T
M
32
F
103
STM32F103
STM32F103精英开发板上测试的。图3、图4和图5是当
m
a
i
n
main
main函数中调用函数
f
u
n
c
t
i
o
n
_
c
function\_c
function_c的时候的参数分别为4、5、8的时候的输出情况。
#include "usart.h"
#include <stdio.h>
#include <setjmp.h>
jmp_buf jmpbuffer;
int function_a(int p_a)
{
int result = p_a * 2 - 10;
if (result < 0)
{
longjmp(jmpbuffer, 5);
}
return result;
}
int function_b(int p_b)
{
int result = function_a(p_b) + 6;
if (result > 10)
{
longjmp(jmpbuffer, 10);
}
return result;
}
int function_c(int p_c)
{
return function_b(p_c)+1;
}
int main()
{
int jumpValue=-1;
uart_init(115200);
printf("\"setjmp.h\" file test start.\r\n");
jumpValue = setjmp(jmpbuffer);
printf("Slection start,jumpValue=%d.\r\n",jumpValue);
if( jumpValue == 5 )
{
printf("Error happened in function function_a.\r\n");
}
else if ( jumpValue == 10 )
{
printf("Error happened in function function_b.\r\n");
}
else
{
int result = function_c(5);
printf("No error happened,result = %d.\r\n", result);
}
printf("\"setjmp.h\" file test end.\r\n");
while(1);
return 0;
}
图3.
图4.
图5.
|