IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> ARM单片机上的C语言库<setjmp.h>的使用 -> 正文阅读

[嵌入式]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.
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 21:07:25  更:2022-03-21 21:11:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:43:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码