2021年嵌入式面试题汇总(最新经典)

2023-05-16

写在前面:秋招嵌入式开发方向,经过了很多场的笔试与面试,在准备的过程中看了非常多的资料,现在把他们整理一下,有的资料看过了觉得不错就保存下来了,如果有不对的地方,欢迎批评指正,侵权联删!(慢慢更新过程中........)

-------------------------------------------------------------------------------------------------------------------

目录

1、c语言内存模型

2、C语言中的变量定义在什么地方

3、C语言代码如何运行的、关于栈的相关

4、指针函数与函数指针的区分

5、Static关键字的作用

6、const作用

7、进程与线程的区别

8、链表与数组的区别

9、#define宏定义与typedef的区别


1、c语言内存模型

2、C语言中的变量定义在什么地方

内存中供用户使用的存储空间分为三部分:1、程序区,2、静态存储区3、动态存储区。

内存中局部变量定义在栈区,全局变量和静态变量放在静态数据区。

还不理解可参考:动态存储区、静态存储区、堆和栈的区别_qian_enjoy-CSDN博客

3、C语言代码如何运行的、关于栈的相关

   1、预处理--编译--汇编--链接

      (1)预处理(Preprocessing):用于将所有的#include头文件以及宏定义替换成其真正的内容;

      (2)编译(Compilation):将经过预处理之后的程序转换成特定汇编代码的过程;

      (3)汇编(Assemble):将上一步的汇编代码转换成机器码,产生的文件叫做目标文件(.o);

      (4)链接(Linking):链接过程将多个目标文件以及所需的库文件(.so等)链接成最终的可执行文件(.exe)。

   2、程序定义的“局部变量”会放在计算机内存中(栈),栈在数据结构是最基本的操作,只有两个操作,一个是push入栈,另一个是pop出栈。在c的栈中,是从栈顶向下开始存入变量的。

4、指针函数与函数指针的区分

指针函数

简单来说,就是一个返回指针的函数。本质是一个函数,函数返回的类型是一个指针。

普通函数的声明:

 int sort (int a,int b);

指针函数的声明:

 int *sort(int a,int b);

函数指针

本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。

函数指针的声明:

 int  (*sort)(int a,int b);

函数指针的赋值有两种方法:

 sort=&a;
 sort=a;

取地址运算符&不是必需的,因为一个函数标识符就表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。

两者的不同

1、定义不同

指针函数本质上是一个函数,其返回值时指针。

函数指针本质上式一个指针,其指向一个函数。

2、写法不同

 指针函数:int *sort(int a,int b);
 函数指针:int (*sort)(int a,int b);

5、Static关键字的作用

1、作用于变量:(参考内存分部,静态存储区与动态存储区,看前面的3和4)

用Static声明局部变量------局部变量是指在代码块内定义的变量,只在代码块内起作用,其缺省的存储方式是自动变量或说是动态存储的,即指令执行到变量时才会给变量分配存储单元,调出代码块时释放内存单元。用Static关键字声明后,是变量成为静态的局部变量,即编译时就为变量分配存储单元,直到程序结束时才释放。这样,使得该局部变量有记忆功能,可以记忆上次的数据,不过由于仍是局部变量,因而只能在代码块内部使用(作用域不变)。

用Static声明全局变量-----全局变量指在所有代码块{}之外定义的变量,它缺省为静态变量,编译时分配内存,程序结束时释放内存单元。同时全局变量作用域很广,整个文件都有效甚至别的文件也能引用它。为了限制某些全局变量的作用域,使其只在本文件中有效,而不能被其他文件引用,可以用static关键字对其作出声明。

总结:用static声明局部变量,使其变为静态存储方式(静态数据区),作用域不变;用static声明外部变量,其本身就是静态变量,这只会改变其连接方式,使其只在本文件内部有效,而其他文件不可连接或引用该变量。

2、作用于函数

使用static用于函数定义时,对函数的连接方式产生影响,使得函数只在本文件内部有效,对其他文件是不可见的。这样的函数又叫作静态函数。使用静态函数的好处是,不用担心与其他文件的同名函数产生干扰,另外也是对函数本身的一种保护机制。

  如果想要其他文件可以引用本地函数,则要在函数定义时使用关键字extern,表示该函数是外部函数,可供其他文件调用。另外在要引用别的文件中定义的外部函数的文件中,使用extern声明要用的外部函数即可。

6、const作用

1、定义常量

(1)const(修饰的变量不可变)

修饰变量,以下两种定义形式在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的,readonly。

TYPE const ValueName = value;

const TYPE ValueName = value;

(2)将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义. (修饰的外部链接可以不用定义直接声明使用)

extend const int ValueName = value;

2、指针使用const()

(1)指针本身是常量不可变

char * const pContent;

const (char*) pContent;

(2)指针所指向的内容是常量不可变

const char *pContent;

char const *pContent;

(3)两者都不可变

const char* const pContent;

(4)还有其中区别方法,沿着号划一条线:如果const位于的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。

7、进程与线程的区别

根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位

在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)

内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。

包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

总结一下:进程:1、操作系统会分配地址空间 2、一个进程当中可以有多个线程

线程:1、没有独立的地址空间 2、一个进程里的多个线程可以共享该进程的所有资源 3、线程有自己的栈、堆和局部变量 4、线程是不能独立执行的

补充:

1、同步和互斥的区别

当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源。例如,假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件中的字符数。当然,在把整个文件调入内存之前,统计它的计数是没有意义的。但是,由于每个操作都有自己的线程,操作系统会把两个线程当作是互不相干的任务分别执行,这样就可能在没有把整个文件装入内存时统计字数。为解决此问题,你必须使两个线程同步工作。

所谓同步,是指散步在不同进程之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。如果用对资源的访问来定义的话,同步是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。

所谓互斥,是指散布在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。如果用对资源的访问来定义的话,互斥某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

2、进程间通信的方式

(1)管道(pipe)及有名管道(named pipe):管道可用于具有亲缘关系的父子进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。

(2)信号(signal):信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致的。

(3)消息队列(message queue):消息队列是消息的链接表,它克服了上两种通信方式中信号量有限的缺点,具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限得进程则可以从消息队列中读取信息。

(4)共享内存(shared memory):可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。

(5)信号量(semaphore):主要作为进程之间及同一种进程的不同线程之间得同步和互斥手段。

(6)套接字(socket):这是一种更为一般得进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。

8、链表与数组的区别

链表是一种上一个元素的引用指向下一个元素的存储结构,链表通过指针来连接元素与元素;

链表分为:单向链表、双向链表、循环链表

链表是链式的存储机构;数组是顺序的存储机构

链表通过指针来连接元素与元素,数组则是把所有元素按次序依次存储。

总结:

1)数组便于查询和修改,但是不方便新增和删除

2)链表适合新增和删除,但是不适合查询,根据业务情况使用合适的数据结构和算法是在大数据量和高并发时必须要考虑的问题

9、#define宏定义与typedef的区别

# define宏定义是字符替换,typedef是定义类型,是声明一种新的类型,等同自带的基本类型。

  • #define是宏,处理的时候位于编译前阶段,宏处理器基本上对你的C/C++程序不会有任何的感知。它只处理宏的语法。而编译阶段的“程序”得到的是宏处理完的结果。

  • typedef是编译阶段的一部分。它的意义是单一的。

宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,它不是作简单的代换,而是对类型说明符进行重新命令。被命名的标识符具有类型定义说明的功能。


  
 #include<stdio.h>
 #include<iostream>
 #define PIN1 char*
 typedef char* PIN2;
 ​
 int main() {
     //使用#define相当于:char* x, y;就是说x是char指针类型,而y是char类型
     PIN1 x, y;
     //使用typedef相当于:char* x, char* y;就是说x是char指针类型,而y也是char指针类型
     PIN2 a, b;
     printf("By #define :%d  %d\n\n", sizeof(x), sizeof(y));
     printf("By typedef :%d  %d\n\n", sizeof(a), sizeof(b));
     system("pause");
     return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2021年嵌入式面试题汇总(最新经典) 的相关文章

  • 第一章 PX4-Pixhawk-程序编译过程解析

    第一章 PX4程序编译过程解析 PX4是一款软硬件开源的项目 xff0c 目的在于学习和研究 其中也有比较好的编程习惯 xff0c 大家不妨可以学习一下国外牛人的编程习惯 这个项目是苏黎世联邦理工大学的一个实验室搞出来的 该方案是基于NUT
  • 详解几种飞控的姿态解算算法

    姿态解算是飞控的一个基础 重要部分 xff0c 估计出来的姿态会发布给姿态控制器 xff0c 控制飞行平稳 xff0c 是飞行稳定 的最重要保障 有关姿态解算的基础知识 xff0c 这里笔者不会细细描述 xff0c 有关这方面的资料 xff
  • 陀螺仪的数据处理

    1 陀螺仪数据校准 1 1 原理 一款飞控上的传感器是需要进行校准的 xff0c 比如这里讲的陀螺仪 目前大多数的陀螺校准其实就是去掉零点偏移量 xff0c 采集一定的数据 xff0c 求平均 xff0c 这个平均值就是零点偏移 xff0c
  • LevelDB源码分析之从Put说起

    之前分享的文章leveldb实现原理分析详细描述了LevelDB的实现原理 xff0c 本文从Put接口来看下leveldb数据写流程的源码实现 LevelDB的读写接口在类DB中定义 xff08 leveldb db h xff09 xf
  • 大神浅谈无人机飞控软件设计 系统性总结

    写在前面 深感自己对飞控软件 算法的知识点过于杂乱 xff0c 很久没有进行系统的总结了 xff0c 因此决定写几篇文章记录一些飞控开发过程的知识点 主要是针对一些软件 算法部分进行讨论 xff0c 如内容有错误 xff0c 欢迎指出 1
  • 作为资深的无人机从业者,卡尔曼滤波你不能不知道 通俗易懂的来说卡尔曼滤波

    旋翼无人机的两类主要算法 先说一个旋翼类无人机系统的算法主要有两类 xff1a 姿态检测算法 姿态控制算法 姿态控制 被控对象 xff08 即四旋翼无人机 xff09 姿态检测三个部分构成一个闭环控制系统 被控对象的模型是由其物理系统决定
  • pixhawk commander.cpp的飞行模式切换解读

    commander cpp逻辑性太强了 xff0c 涉及整个系统的运作 xff0c 所以分别拆分成小块看 另此篇blog大部分是参考 xff08 Pixhawk原生固件解读 xff09 飞行模式 xff0c 控制模式的思路 xff0c 笔者
  • Pixhawk代码分析-源码框架

    源码框架 pixhawk代码框架 xff1a pixhawk代码框架基础分析 xff1a 阅读下面内容时请结合源码阅读 xff0c 便于理解 The basic structure of ArduPilot is broken up int
  • Pixhawk代码分析-姿态解算篇A

    姿态解算篇A 基本知识 1 如何实现控制 一个无人机系统的算法主要有两类 xff1a 姿态检测算法 姿态控制算法 姿态控制 被控对象 姿态检测三个部分构成一个闭环控制系统 被控对象的模型是由其物理系统决定 xff0c 设计无人机的算法就是设
  • 电路知识--认识原理图(一)

    开源硬件 xff0c 一个很重要的的一点就是有开放的原理图 xff0c 通过原理图 xff0c 我们可以了解一个模块的输入输出 xff0c 以及使用的芯片类型从而知道使用方法等几乎一切信息 原理图上有很多信息 xff0c 到底怎么看呢 xf
  • 初学PX4之飞控算法

    通知 xff1a 如果你对本站无人机文章不熟悉 xff0c 建议查看无人机学习概览 xff01 xff01 xff01 注意 xff1a 基于参考原因 xff0c 本文参杂了APM的算法分析 本篇文章首先简述了下px4和apm调用姿态相关应
  • Pixhawk之姿态控制篇

    一 开篇 姿态控制篇终于来了 来了 来了 心情爽不爽 xff1f 愉悦不愉悦 xff1f 开心不开心 xff1f 喜欢的话就请我吃顿饭吧 xff0c 哈哈 其实这篇blog一周前就应该写的 xff0c 可惜被上一篇blog霸占了 但是也不算
  • PX4原生固件SPI驱动动编写与IMU传感器替换

    适用于PX4原生固件 核心目标 xff1a 完成XSENS的MTI3 xff0c IMU替换 MTI3是一款航姿参考系统 xff0c 可以独立的输出四元数 xff0c 加速度 xff0c 磁力计等 xff0c 角速度等航姿信息 里面有完整的
  • C语言指针详解----指针声明定义赋值

    C语言的指针是让新手很头疼的事情 xff0c 但是由于其太过于灵活 xff0c 以至于可以很好得的解决一些复杂的问题 xff0c 因此不得不掌握 我最近正在学习指针相关的内容 xff0c 因此在这里做一个小的总结 本篇是不涉及到函数以及结构
  • 【slam-2020-01-02】扩展应用

    一篇比较全面的slam博客 一 VR 43 AR 1 VR和AR的关系 AR MR是平台 xff0c 覆盖面比VR更广 xff0c VR是一种媒体形式 xff0c 任何用得到媒体的场景 xff0c 如娱乐 教育等 xff0c 都会有VR的影
  • nvidia-smi卡顿详解

    如果显卡数量在4张以上 xff0c 在nvidia smi信息后会非常的慢 xff0c 非常的卡 尤其在只在乎计算量服务器的时候 我试过把8张卡 tesla K80 显卡一个个拆下来 8张 7张 6 5 4 3 2 1 试试nvidia s
  • c语言将十进制数转换为16进制的函数

    有3种方式实现 xff0c 其中两种是使用系统函数 xff0c 另一种是直接自己编写 使用系统函数实现要加入 include lt stdlib h gt xff0c 自己编写则不需要这个头文件 下面的代码就是3种方式的实现 xff0c 包
  • go-gl搭建开发环境(一)

    1 简介 Go语言 xff08 Golang xff09 是Google在2009年推出的一种编程语言 Golang是一门开源的语言 xff0c 可以从github上找到它的源码 Golang也是一门跨平台的语言 xff0c 可以运行在Wi
  • 串口UART透传WiFi模块常见的几种参数配置方法含web网页配置

    串口透传WiFi参数配置方法 目前 xff0c 在嵌入式领域 xff0c 智能家居 智能工业 智能公交等等控制中 xff0c WiFi 已经成为了一种普遍被采用的技术 笔者常年在嵌入式 WiFi 行业做一线技术开发 本文我们将介绍串口 wi
  • DockerHub基于Github自动化构建

    Docker Hub上的自动化构建 关于自动化构建 自动化构建是一个特殊的功能 xff0c 它允许您在 Docker Hub 上使用构建集群 xff0c 根据指定的 Dockerfile 或者 GitHub BitBucket 仓库 xff

随机推荐

  • 机器人三维视觉引导系统

    基于结构光测量技术和3D物体识别技术开发的机器人3D视觉引导系统 xff0c 可对较大测量深度范围内散乱堆放的零件进行全自由的定位和拾取 相比传统的2D视觉定位方式只能对固定深度零件进行识别且只能获取零件的部分自由度的位置信息 xff0c
  • rviz 官网

    rviz使用教程 官网 http wiki ros org rviz UserGuide Install or build rviz
  • Robocup2D入门笔记(4)——常见模型

    Robocup2D中有几个常见的模型 xff0c 例如听觉 视觉 移动 踢球等 xff0c 这篇博客主要介绍这几个常见的模型 xff0c 这些模型也都可以在官方发布的说明书中找到 xff08 懒得找可以点这里 xff09 一 球场模型 Ro
  • 2020电赛小记

    64 2020电赛总结 xff08 吐槽 xff09 2020电赛小记 本篇全为吐槽 xff0c 不是经验贴 坐标青岛某双非 说不上最恶心不过够恶心 20年参加电赛 xff0c 和一个大三的师哥组队 xff0c 在组期间任劳任怨 xff0c
  • 如何通过nodejs快速搭建一个服务器

    在前端开发过程中 xff0c 可能某些时候需要自己搭建一台服务器用于一些文件图片请求或者进行后端相关知识的学习 本文主要讲解如何通过nodejs进行一个基础服务器的搭建 xff0c 包括如何将文件布置的服务器 xff0c 以及基础接口的开发
  • import 一些已有的模块,会出现红色下划线

    导入tensorflow 以及使用print xff0c 都会出现红色下划线 xff0c 然而程序是没有错误的 这种情况其实可以不用管 xff0c 是可以正常运行的 xff1b 但是 xff0c 如果看着不舒服 xff0c 可以进行以下过程
  • UCOSIII(1)——SVC与PenSV实现任务切换

    本文基于STM32F407ZGT6 SVC异常 xff1a SVC 系统服务调用 xff0c 亦简称系统调用 用于产生系统函数的调用请求 SVC 异常是必须立即得到响应的应用程序执行 SVC 时都是希望所需的请求立即得到响应 在 UCOS
  • Windows编程之核心书籍推荐

    一 Windows程序设计 xff08 第5版 珍藏版 xff09 Windows程序设计 xff08 第5版 珍藏版 xff09 这是一本经典的Windows编程圣经 xff0c 曾经伴随着近50万Windows程序员步入编程殿堂 xff
  • 使用dockerfile创建镜像报错

    do 34 docker build requires exactly 1 argument See docker build help Usage docker build OPTIONS PATH URL Build an image
  • 基于MxNet实现目标检测-YoloV4【附部分源码及模型】

    文章目录 前言目标检测发展史及意义一 数据集的准备1 标注工具的安装2 数据集的准备3 标注数据4 解释xml文件的内容 二 网络结构的介绍三 代码实现0 工程目录结构如下1 导入库2 配置GPU CPU环境3 数据加载器4 模型构建5 模
  • http://www.houdeblog.com/fakeoakleys/ 45121

    Big Buddha Womens Bb Gate FlatsAmazon Price 42 Kluane SpakeThis Hub was last updated on September 4 2008Christina Aguile
  • QT QGC安装包生成问题

    最后生成安装包的时候 xff0c 提示错误 xff1a FAILURE Build failed with an exception What went wrong Execution failed for task 39 compileD
  • 位置式 PID 控制算法和增量式 PID 控制算法

    数字 PID 控制算法通常分为位置式 PID 控制算法和增量式 PID 控制算法 一 位置式 PID 算法 span class token function e span span class token punctuation span
  • GPS北斗模块串口助手输出测试

    GPS北斗模块测试 材料 北斗模块 usb转ttl 杜邦线 1 模块接线如下图所示 可用5v跟3 3v 2 usb转ttl连接电脑通电指示灯亮 3 电脑通过串口调试助手可以收到北斗模块发送的数据 还没定位信息 波特率为9600 4 接上天线
  • Jetson Nano外接

    外接显示器 HDIM接口用于显示器 xff0c 直接通过HDMI的连线器接入支持接口的显示器 也可使用DVI的转接口 xff0c 但不建议使用VGA的转接口 xff0c 这种接入方式对于转接线和显示器有很大的依赖性 外接电源可以通过Micr
  • Docker无介绍快使用,docker拉取Nginx(六)

    Docker无介绍快使用 xff0c docker拉取Nginx xff08 六 xff09 问题背景Docker无介绍快使用 xff0c 安装部署hello测试 xff08 一 xff09 Docker无介绍快使用 xff0c docke
  • 【教程向】通过windows在树莓派3B上安装Ubuntu MATE 16.04.2 (Xenial)

    本文参考了http www ituring com cn article 273613 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 6
  • Docker无介绍快使用,docker拉取rabbitmq(十三)

    Docker无介绍快使用 xff0c docker拉取rabbitmq xff08 十三 xff09 问题背景Docker无介绍快使用 xff0c 安装部署hello测试 xff08 一 xff09 Docker无介绍快使用 xff0c d
  • 【ROS2&AI】电脑摄像头、intel-D435,利用ros2发布订阅图像(Python)

    本文欲分享两个代码来实现图像的传输 xff0c 利用ros2 xff0c ROS2 xff5e 配置 xff1a Ubuntu20 04 Python ROS2 foxy opencv xff1b 电脑相机 or Intel D435相机
  • 2021年嵌入式面试题汇总(最新经典)

    写在前面 xff1a 秋招嵌入式开发方向 xff0c 经过了很多场的笔试与面试 xff0c 在准备的过程中看了非常多的资料 xff0c 现在把他们整理一下 xff0c 有的资料看过了觉得不错就保存下来了 xff0c 如果有不对的地方 xff