ARM单片机上的C语言库<setjmp.h>的使用

     在看别人的 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语言标准库的内容,具体可以参考维基百科以及这个地方的讲解。

  ARM单片机上的C语言库<setjmp.h>的使用_第1张图片
图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一起来使用的话可以在不同的函数之间进行跳转。

  ARM单片机上的C语言库<setjmp.h>的使用_第2张图片
图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 
#include 

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;
}
  ARM单片机上的C语言库<setjmp.h>的使用_第3张图片
图3.
  ARM单片机上的C语言库<setjmp.h>的使用_第4张图片
图4.
  ARM单片机上的C语言库<setjmp.h>的使用_第5张图片
图5.

你可能感兴趣的:(嵌入式,arm,单片机,c语言)