学习嵌入式软件工程师面试题(day1)

news2025/2/25 5:19:56

前言

(1)如果你在读大学,不管你本科毕业是读研还是就业,你都可以早点准备嵌入式面试题,本系列教程的面试题均基于C语言。

(2)像嵌入式学得好,且学历不错的本科生和研究生,都有机会进入华为、小米、大疆、智元等公司,薪资待遇也是不错的。

(3)早点接触面试题,心里有底,大家一起学起来吧。

(4)希望各位大佬多多指点经验,大家一起交流,共同进步!本人邮箱:3201935299@qq.com

第一题(考查对volatile关键字的认识——华为)

#include<setjmp.h>
static jmp_buf  buf;

main()    
{
  volatile  int b;
  b =3;

  if(setjmp(buf)!=0)  
  {
    printf("%d ", b);  
    exit(0);
  }
  b=5;
  longjmp(buf , 1);
}

请问,这段程序的输出是

(a) 3
(b) 5
© 0
(d) 以上均不是

第一题答案(b)5

详细解析

(1)volatile是C语言中的一个关键字,用于声明一个变量为"易变"(volatile)。当一个变量被声明为volatile时,编译器将对该变量的访问和操作做出特殊处理,以确保对该变量的读写操作不会被优化、重排序或省略,从而提供对变量的准确和可预测的访问。
(2)这是因为这个变量可能在一个寄存器,直接与外部设备相连,你写入之后,该寄存器也有可能被外部设备的写操作所改变;或者,该变量被一个中断程序,或被另一个进程改变了。
(3)volatile 不会被编译器优化影响,在longjump 后,它的值是后面假定的变量值,b最后的值是5,所以5被打印出来.

(4)setjmp : 设置非局部跳转 /* setjmp.h*/

Lonjjmp: 执行一个非局部跳转 /* setjmp.h*/

反思

(1)请先允许见识狭窄的我先说一句,我用了两年C语言都没见过<setjmp.h>这个头文件,以至于我开始都以为这题考的不是C语言哈哈,直到我把题目代码在VS里编译后,才相信,还是学的东西太少了,一下子暴露了自己的知识上限(doge),其次题目代码少包含了一个头文件#include <stdio.h>。

在这里插入图片描述

我提出问题,头文件<setjmp.h>有什么作用?函数setjmp()、longjmp()是什么作用?该程序的逻辑功能是什么?

(2)头文件<setjmp.h>有什么作用?

头文件<setjmp.h>是C标准库中的一个头文件,它提供了用于非局部跳转的函数setjmp()和longjmp()的声明和定义。

setjmp()和longjmp()函数允许在程序的不同位置进行跳转,而不是按照正常的顺序执行代码。这种非局部跳转的能力对于处理异常、错误处理、状态回滚等情况非常有用。

具体来说,<setjmp.h>头文件中提供的函数有以下作用:

setjmp()函数:用于设置一个跳转点,并将当前程序状态保存到jmp_buf类型的变量中。它在设置跳转点时返回0,但当通过longjmp()函数跳转回来时,setjmp()函数会返回非零值,用于判断是否发生了跳转。

longjmp()函数:用于进行非局部跳转,返回到之前通过setjmp()函数设置的跳转点。它的第一个参数是之前保存的jmp_buf变量,第二个参数是用于标识跳转原因的值。

通过结合使用setjmp()和longjmp()函数,可以实现一种跳转回之前的程序状态的机制,从而实现异常处理、错误处理、状态回滚等操作。

需要注意的是,由于非局部跳转可能会导致代码流程的混乱和难以维护,应该谨慎使用setjmp()和longjmp()函数,并确保在使用时遵循相关的规范和最佳实践。

(3)函数setjmp()、longjmp()是什么作用?

函数setjmp()longjmp()是C标准库中提供的用于非局部跳转的函数。

  1. setjmp()函数:setjmp()函数用于设置一个跳转点,并将当前程序状态保存到一个jmp_buf类型的变量中。它的原型如下:

    int setjmp(jmp_buf env);
    ```
    
    ``setjmp()`函数在设置跳转点时返回0,并将程序状态保存在`env`变量中。这样,通过调用`longjmp()`函数可以跳回到`setjmp()`函数所在的位置,并恢复保存的程序状态。
    
  2. longjmp()函数:longjmp()函数用于进行非局部跳转,返回到之前通过setjmp()函数设置的跳转点。它的原型如下:

    void longjmp(jmp_buf env, int value);
    ```
    
    ``longjmp()`函数接受一个`jmp_buf`类型的变量`env`作为参数,以及一个用于标识跳转原因的整数值`value`。调用`longjmp()`函数会使程序跳转回`setjmp()`所在的位置,并且`setjmp()`函数的返回值被设置为`value`。
    

这种非局部跳转的机制可以用于异常处理、错误处理以及特定的控制流程需求。例如,当发生某个异常情况时,可以使用setjmp()函数设置一个跳转点,然后在需要的地方调用longjmp()函数跳转回来,从而实现异常处理。这种机制在一些C语言框架和库中被广泛使用,例如错误处理和资源回收的实现。

需要注意的是,非局部跳转是一种强大但也容易导致代码复杂性和难以维护性的特性,因此在使用时应慎重考虑,并确保遵循相关的规范和最佳实践。

(4)程序逻辑分析

这段代码展示了使用C标准库中的setjmp()和longjmp()函数来实现非局部跳转的示例。

首先,jmp_buf是一个用于存储跳转位置信息的数据类型。在代码中,我们声明了一个名为buf的jmp_buf类型变量。

接下来,main()函数中声明了一个volatile修饰符的整型变量b,并将其初始化为3。

然后,通过使用setjmp(buf)函数,在此处设置了一个跳转点。setjmp()函数会将当前程序状态保存到buf中,并返回0作为返回值。这是第一次调用setjmp()函数,因此返回值为0。

之后,代码中的条件判断语句if(setjmp(buf)!=0)检测到setjmp()函数的返回值不为0,表示发生了跳转。在这种情况下,程序会执行跳转后的代码块。

在跳转后的代码块中,通过调用printf()函数输出变量b的值,并调用exit(0)函数来终止程序运行。

然而,在跳转之前,我们将变量b的值修改为5。

最后,通过调用longjmp(buf, 1)函数,程序将跳转回之前设置的跳转点,并且setjmp()函数的返回值被设置为1。这会导致条件判断语句为真,从而执行跳转后的代码块。

综上所述,这段代码的输出结果将是"5"。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/982223.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

应急物资管理系统-完善应急物资保障体系

东识智慧应急物资管理系统&#xff08;智物资DW-S300&#xff09;在政府应急救援物资管理、红十字会应急物资管理、防汛应急物资管理、医疗抗疫物资管理等行业均有成功案例。智物资DW-S300实现了功能一体化管理、流程一体化管理、信息一体化管理&#xff0c;使得资产从采购、入…

循环(while do...while for)介绍

3.循环 1.while循环 while循环是先判断后执行 while循环一般都会有: 循环初始值, 循环条件 和 循环变量增量(或者减量) 语法: while(表达式){逻辑代码块 }// 计算123...100之和var num 1;//循环初始值var sum 0;//统计结果//循环条件while (num < 100) {console.log(n…

Java到底是值传递还是引用传递【通俗易懂】

我相信很多刚学Java的小伙伴都很难理解Java到底是值传递还是引用传递的问题&#xff0c;但肯定背过这道面试题。确实&#xff0c;Java就是值传递&#xff0c;那什么原理呢&#xff1f;请往下看。 我们先看一段代码&#xff1a;分析一下这两句打印的结果分别是什么。 public c…

对象存储 OSS

大家好 , 我是苏麟 , 今天聊聊OSS . 这里使用阿里云的OSS对象存储. 首先大家得有一个阿里云账号 , 注册大家都会 这里不多介绍 . 阿里云官网 : 阿里云登录页 (aliyun.com) 首页产品目录下存储集合里对象存储OSS 进入对象存储OSS页面 点击管理控制台(新用户应该有免费试用期的)…

【数学建模竞赛】预测类赛题常用算法解析

解析常见的预测类算法 灰色预测模型 灰色预测模型是一种利用少量的、不完全的信息&#xff0c;建立数学模型并进行预测的方法。该方法通过对系统行为特征的发展变化规律进行估计预测&#xff0c;同时也可以对行为特征的异常情况发生的时刻进行估计计算&#xff0c;并研究特定…

Python商业数据存取

&#x1f433; 我正在和鲸社区参加“商业数据分析训练营活动” https://www.heywhale.com/home/competition/6487de6649463ee38dbaf58b &#xff0c;以下是我的学习笔记&#xff1a; 学习主题&#xff1a;Python商业数据存取 日期&#xff1a;2023.9.6 关键概念/知识点&…

IMX6ULL移植篇-uboot源码目录表

一. uboot 源码分析前提 由于 uboot 会使用到一些经过编译才会生成的文件&#xff0c;因此&#xff0c;我们在分析 uboot的时候&#xff0c;需要先编译一下 uboot 源码工程。 这里所用的开发板是 nand-flash 版本。 本文学习续上一篇文章&#xff0c;如下&#xff1a; IMX6U…

电商物流解决方案公司Globavend申请纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;电商物流解决方案公司Globavend近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&#xff0c;股票代码为&#xff08;GVH&#xff09;&#x…

chatglm2-6b在P40上做LORA微调 | 京东云技术团队

背景&#xff1a; 目前&#xff0c;大模型的技术应用已经遍地开花。最快的应用方式无非是利用自有垂直领域的数据进行模型微调。chatglm2-6b在国内开源的大模型上&#xff0c;效果比较突出。本文章分享的内容是用chatglm2-6b模型在集团EA的P40机器上进行垂直领域的LORA微调。 …

智慧铁路:机车整备场数字孪生

机车整备场是铁路运输系统中的重要组成部分&#xff0c;它承担着机车的维修、保养和整备工作&#xff0c;对保障铁路运输的运维和安全起着至关重要的作用。 随着铁路运输的发展、机车技术的不断进步&#xff0c;以及数字化转型的不断推进&#xff0c;数字孪生技术在机车整备场…

LeetCode刷题笔记【27】:贪心算法专题-5(无重叠区间、划分字母区间、合并区间)

文章目录 前置知识435. 无重叠区间题目描述参考<452. 用最少数量的箭引爆气球>, 间接求解直接求"重叠区间数量" 763.划分字母区间题目描述贪心 - 建立"最后一个当前字母"数组优化marker创建的过程 56. 合并区间题目描述解题思路代码① 如果有重合就合…

【业务功能篇99】微服务-springcloud-springboot-电商订单模块-生成订单服务-锁定库存

八、生成订单 一个是需要生成订单信息一个是需要生成订单项信息。具体的核心代码为 /*** 创建订单的方法* param vo* return*/private OrderCreateTO createOrder(OrderSubmitVO vo) {OrderCreateTO createTO new OrderCreateTO();// 创建订单OrderEntity orderEntity build…

echarts饼图label自定义样式

生成的options {"tooltip": {"trigger": "item","axisPointer": {"type": "shadow"},"backgroundColor": "rgba(9, 24, 48, 0.5)","borderColor": "rgba(255,255,255,0.4)&q…

Python Qt学习(十)一个简易的POP3邮件客户端

公司把126这类的邮箱网站都封了&#xff0c;正好现在无事&#xff0c;加之&#xff0c;算是一个对这俩周学习Qt的一个总结吧。遂写了这么一个简易的通过POP3协议接收126邮件的客户端。 源代码&#xff1a; # -*- coding: utf-8 -*-# Form implementation generated from read…

OpenCV图像处理——矩形(Rect)类的常用操作

1.Rect类 创建类 Rect类成员变量x、y、width、height&#xff0c;分别为左上角点的坐标和矩形的宽和高。 创建一个Rect对象Rect,并在图像上画该矩形框。 cv::Rect rect(100, 50, 500, 500);cv::Mat cv_src cv::imread("11.JPG");cv::rectangle(cv_src, rect, cv:…

每一座屎山代码背后,都藏着一堆熟读代码规范的研发

&#x1f449;导读 韩寒在《他的国》中写道&#xff1a;“我们懂很多道理&#xff0c;却依然过不好这一生”&#xff0c;人们虽然知道很多道理&#xff0c;但并不一定能将这些道理应用到实际生活中。这种现象在生活中很常见&#xff0c;我们听了很多的成功学的道理&#xff0c;…

接入 NVIDIA A100、吞吐量提高 10 倍!Milvus GPU 版本使用指南

Milvus 2.3 正式支持 NVIDIA A100&#xff01; 作为为数不多的支持 GPU 的向量数据库产品&#xff0c;Milvus 2.3 在吞吐量和低延迟方面都带来了显著的变化&#xff0c;尤其是与此前的 CPU 版本相比&#xff0c;不仅吞吐量提高了 10 倍&#xff0c;还能将延迟控制在极低的水准。…

ChatGLM2-6B 部署

引言 这是ChatGLM2-6B 部署的阅读笔记&#xff0c;主要介绍了ChatGLM2-6B模型的部署和一些原理的简单解释。 ChatGLM-6B 它是单卡开源的对话模型。 充分的中英双语预训练 较低的部署门槛 FP16半精度下&#xff0c;需要至少13G的显存进行推理&#xff0c;甚至可以进一步降低…

罕见病 对称性脂肪瘤(MSL) 马德龙病

如果你体内脂肪瘤分布大致如下 而且个数不断增多 这篇文章适合你 症状 脂肪瘤个数一直增加 而且很对称 比如: 左手臂一个 右手臂一个 别名 多发性对称性脂肪增多症 Multiple symmetric lipomatosis (MSL) 多发性对称性脂肪瘤&#xff08;MSL&#xff09; 脂肪瘤 马德龙病(…

大场景的倾斜摄影三维模型OBJ格式轻量化处理处理关键处理技术分析

大场景的倾斜摄影三维模型OBJ格式轻量化处理处理关键处理技术分析 大场景的倾斜摄影三维模型是指通过航空或地面摄影获取的大范围、高分辨率的地理环境数据。为了在虚拟环境中加载和渲染这些模型&#xff0c;需要对其进行OBJ格式的轻量化处理。本文将分析大场景的倾斜摄影三维模…