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

 
图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.
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qqssss121dfd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值