当前位置: 首页 > news >正文

嵌入式八股文

硬件

1.CPU、MPU、MCU、SOC联系与差别

Cpu是一台计算机的运算核心和控制核心。CPU由运算器、控制器和寄存器及实现它们之间联系的数据、控制及状态的总线构成。差不多所有的CPU的运作原理可分为四个阶 段:提取(Fetch)、解码(Decode)、执行(Execute)和写回(Writeback)。 CPU从存储器或高速缓冲存储器中取出指令,放入指令寄存器,并对指令译码,并执行指令。所谓的计算机的可编程性主要是指对CPU的编程

MPU (Micro Processor Unit),叫微处理器通常代表一个功能强大的CPU

MCU(Micro Control Unit),叫微控制器,是指随着大规模集成电路的出现及其发展,将计算机的 CPU、RAM、ROM、定时计数器和多种I/O接口集成在一片芯片上,形成芯片级的芯片,MCU MPU 最主要的区别就是能否直接运行代码。MCU有内部的RAM ROM,而MPU是增强版的CPU,需要添加外部RAM ROM才可以运行代码。

SOC(System on Chip),指的是片上系统,MCU只是芯片级的芯片,而SOC是系统级的芯片,它既MCU(51,avr)那样有内置RAM,ROM同时又像MPU(arm)那样强大的,不单单是放简单的代码,可以放系统级的代码,也就是说可以运行操作系统(将就认为是MCU集成化与MPU强处理力各优点二合一)。

2.什么是交叉编译

在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。

3.左值和右值是什么?

    左值是指可以出现在等号左边的变量或表达式,它最重要的特点就是可写(可寻址)。也就是说,它的值可以被修改,如果一个变量或表达式的值不能被修改,那么它就不能作为左值。

    右值是指只可以出现在等号右边的变量或表达式。它最重要的特点是可读。一般的使用场景都是把一个右值赋值给一个左值。通常,左值可以作为右值,但是右值不一定是左值。

Linux

进程

1.进程和线程有什么区别?

1、根本区别

       进程是资源分配的基本单位,线程是程序执行的最小单位

2、资源开销

       进程有自己独立地址空间(代码空间和数据空间),每启动一个进程,系统会为它分配地址空间。

       线程没有自己独立的地址空间,线程共享进程中的数据,使用相同的地址空间。每个线程都有自己的堆栈。

       线程切换的资源开销要比进程小。涉及频繁切换,就选择线程。

       线程开销小,但是不利于进行资源包含;进程开销大,但是有利于资源保护。

3、关于通信

线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。(ftok函数)

但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也跟着死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

4、执行过程

进程是独立的任务执行单元,而线程是在进程内的任务执行单元。一个进程可以有多个线程,但一个线程只能属于一个进程

       每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

2.何时使用多进程,何时使用多线程?

       对资源的管理和保护要求高,不限制开销和效率时,使用多进程。

       要求效率高,频繁切换时,资源的保护管理要求不是很高时,使用多线程

3.进程的几种状态?

关于IO:

       用户程序进行IO的读写,会用到read&write两大系统调用。read系统调用,是把数据从内核缓冲区复制到进程缓冲区;而write系统调用,是把数据从进程缓冲区复制到内核缓冲区。

 同步IO

是指用户空间线程是主动发起IO请求的一方,内核空间是被动接受方。

异步IO

是指内核kernel是主动发起IO请求的一方,用户线程是被动接受方。

4.进程间通信方式有哪些?有什么优缺点?

一、管道(Pipe)

  • 优点

    • 易于实现和使用,适用于具有亲缘关系的进程之间的通信(如父子进程)。

  • 缺点

    • 只能用于单向通信,无法进行双向通信。

    • 局限于具有亲缘关系的进程间使用。

    • 缓冲区有限,可能导致数据丢失或阻塞。

二、命名管道(Named Pipe)

  • 优点

    • 可以在不具有亲缘关系的进程之间进行通信。

    • 提供一个唯一的名称,可以在文件系统中进行访问。

  • 缺点

    • 长期存于系统中,使用不当容易出错。

    • 缓冲区有限,可能导致数据丢失或阻塞。

三、消息队列(Message Queue)

  • 优点

    • 可以实现任意进程间的通信。

    • 消息的接收和发送没有严格的先后顺序,支持异步处理。

    • 可以通过系统调用函数来实现消息发送和接收之间的同步,无需考虑同步问题。

  • 缺点

    • 信息的复制需要额外消耗CPU的时间,不适宜于信息量大或操作频繁的场合。

    • 消息类型比较单一,可能无法满足复杂的数据传输需求。

四、共享内存(Shared Memory)

  • 优点

    • 速度最快,因为多个进程可以直接访问同一块物理内存。

    • 可以进行大量数据的传输,无需复制数据。

  • 缺点

    • 需要额外考虑同步机制,以避免数据竞争和不一致性问题。

    • 同步问题可能导致程序复杂性和出错率的增加。

    • 只能同一个计算机系统中的诸多进程共享,不方便网络通信。

五、信号量(Semaphore)

  • 优点

    • 可以用于多个进程之间进行同步和互斥控制。

    • 计数器机制可以有效地管理共享资源的访问。

  • 缺点

    • 容易出现死锁问题,如果信号量的使用不当。

    • 信号量有限,可能无法满足大量并发访问的需求。

六、套接字(Socket)

  • 优点

    • 可以进行网络通信,适用于不同主机之间的进程通信。

    • 传输数据为字节级,传输数据可自定义,数据量小效率高。

    • 传输数据时间短,性能高。

    • 适合于客户端和服务器端之间信息实时交互。

    • 可以加密,数据安全性强。

  • 缺点

    • 通信开销相对比较大,需要建立和维护网络连接。

    • 需对传输的数据进行解析,转化成应用级的数据。

5.僵尸进程的危害?

  浪费资源、降低系统性能,进程号枯竭:在进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号PID,退出状态,运行时间等)。直到父进程通过wait / waitpid 来取时才释放。 如果进程不调用 wait / waitpid 的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程。
 

6.如何清理僵尸进程?

       当系统中出现了僵尸进程时,我们是无法通过 kill 命令把它清除掉的。但是我们可以杀死它的父进程, 让它变成孤儿进程,并进一步被系统中管理孤儿进程的进程收养并清理。  

7.什么是堆,栈,内存泄漏和内存溢出? 

堆(Heap)和栈(Stack)是计算机内存管理中的两个重要概念,而内存泄漏和内存溢出则是与内存管理相关的两个问题。

堆(Heap):堆是一种动态分配的内存区域,它由程序员分配和释放。堆的大小受系统限制,通常位于栈的顶部。在程序运行过程中,当需要分配大块内存时,可以通过调用malloc等函数从堆中分配。堆的优点是可以灵活地分配和释放内存,但需要注意的是,由于堆是动态分配的,可能会存在内存碎片和内存泄漏的问题。

栈(Stack):栈是一种静态分配的内存区域,它由系统自动分配和释放。栈的大小也受系统限制,通常位于内存的底部。在程序运行过程中,当需要分配局部变量或函数参数时,系统会自动从栈中分配内存。栈的优点是分配和释放内存的速度较快,但缺点是空间有限且大小固定,无法分配大块内存。

内存泄漏(Memory Leak):内存泄漏指的是程序中的某些代码由于某些原因未能释放已经不再需要的内存,导致内存无法被再次使用。这通常会导致程序运行过程中出现内存不足的情况,从而导致程序性能下降或崩溃。

内存溢出(Out of Memory):内存溢出指的是程序在运行过程中所需的内存超过了系统所能提供的内存大小。这通常会导致程序崩溃或出现不可预测的行为。为了解决内存溢出问题,程序员需要优化程序的内存使用,避免无谓的内存占用和泄漏。

8.堆和栈的区别

1) 申请方式不同:栈由系统分配和释放,存放函数的参数值、局部变量的值等;而堆需要程序员自己申请和释放,堆中的具体内容也由程序员自己安排;

2) 申请大小的限制:栈空间有限,栈是向下生长的一块连续的内存区域,栈顶的地址和栈的容量已经设定好了,若申请的空间大于栈的剩余空间,则会报栈溢出错误。堆是向上生长的不连续的内存区域,系统中使用链表来管理空闲的内存地址,堆的大小受限于计算机系统中有效的的虚拟内存(链表的遍历方向是由低地址向高地址,当系统收到程序的申请时,会遍历链表,寻找第一个空间大于所申请空间的堆节点,然后将节点从内存空闲节点链表中删除,并将该节点的空间分配给程序)。可见,堆的空间比较灵活,通常比栈的空间要大。

栈通常位于内存的底部,大小固定,而堆位于栈的顶部

3) 申请效率:栈由系统分配,效率较高,但程序员无法控制;相比之下堆的申请效率就比较低,而且容易产生内存碎片,但是用起来比较方便。

9.栈区放什么?栈区有多大?

栈区主要用于存储函数调用时的局部变量函数形参以及返回地址等,linux下默认8M,可以用ulimit -s修改

网络

TCP、UDP的区别

TCP 有连接 一对一 有缓冲区 字节流 可靠 效率低 应答机制 

UDP 无连接 一对多 无缓冲区 数据报 不可靠 效率高 

3次握手的过程是怎么样的?

描述端口号的作用,概念,两边都有还是只有一边

端口号在网络通信的双方都存在。

TCP为啥安全可靠?

一、校验和

TCP在数据传输过程中,会对传输的数据进行校验和计算。这是通过将数据当作一个16位整数,把所有数据加起来(最前面的进位补到最后一位),然后取反得到的。

发送方和接收方都会进行校验和的计算与验证。如果接收方计算出的校验和与发送方的不一致,那么数据就被认为是传输有误的,接收方会丢弃这个TCP段,并可能请求重发。

二、序列号与确认应答

TCP给发送的每一个数据包分配一个序列号,接收方根据序列号对数据包进行排序,确保数据按序到达。

接收方在成功接收数据后,会返回一个确认应答(ACK),告知发送方已正确接收的数据序列号。这一机制确保了数据的完整性和传输的可靠性。

三、超时重传

当TCP发出一个数据包后,会启动一个定时器等待接收方的确认应答。

如果在定时器超时前未能收到确认应答,TCP会认为数据包已丢失或损坏,并重新发送该数据包。这一机制有效应对了数据包在网络传输过程中的丢失问题。

四、连接管理

TCP在数据传输之前会进行三次握手连接过程,确保双方都已准备好进行数据传输。

数据传输结束后,还会进行四次挥手断开连接过程,以节约系统资源并确保双方都已正确结束数据传输。

五、流量控制与拥塞控制

TCP使用滑动窗口协议实现流量控制,确保发送方不会发送超过接收方处理能力的数据。

拥塞控制则通过慢启动、拥塞避免、快重传和快恢复等算法,动态调整发送速率,避免网络拥塞。

六、面向连接的特性

TCP是一个面向连接的协议,这意味着在数据传输之前必须先建立连接。

这种面向连接的特性使得TCP能够提供更可靠的数据传输服务,因为它可以在连接建立阶段就进行一系列的参数协商和准备工作

相关文章:

嵌入式八股文

硬件 1.CPU、MPU、MCU、SOC联系与差别 Cpu是一台计算机的运算核心和控制核心。CPU由运算器、控制器和寄存器及实现它们之间联系的数据、控制及状态的总线构成。差不多所有的CPU的运作原理可分为四个阶 段:提取(Fetch)、解码(Dec…...

【IOS】Undefined symbol: _OBJC_CLASS_$_PAGFile

项目场景: flutter构建framework包,ios导入时,报PAG动画第三方库引用错误问题。 问题描述 Undefined symbol: _OBJC_CLASS_$_PAGFile Undefined symbol: _OBJC_CLASS_$_PAGPlayer Undefined symbol: _OBJC_CLASS_$_PAGSurface 1.第三方PAG…...

Spring Boot整合Tomcat底层源码分析

引言 Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置和起步依赖等特性,大大简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring…...

工具类-基于 axios 的 http 请求工具 Request

基于 axios 的 http 请求工具 基于 axios 实现一个 http 请求工具,支持设置请求缓存和取消 http 请求等功能 首先实现一个 简单的 http 请求工具 import axios, {AxiosError,AxiosInterceptorManager,AxiosRequestConfig,AxiosResponse, } from axios;// 接口返回…...

WPF的基础控件详解

WPF的基础控件详解 在WPF学习中 基本控件是最简单也是最基础的东西。也是很初学者容易忽略的 本此笔记教程主要针对WPF中基础控件使用和应用进行手把手教学,如果学习了此笔记对你有帮助记得一键三连哦~~~~ TextBlock 基本用法 长字串处理 LineBreak标籤在指定的地…...

qt学习:截图+键盘事件

效果 生成一个透明无边框全屏的窗口,然后按ctrlb键就可以选择区域进行截图保存 步骤 新建一个项目新建一个ctrlb类继承QMainWindow新建一个CaptureScreen类继承QWidget在main中启动ctrlb类 代码 ctrlb类.cpp #include "ctrlb.h" #include "cap…...

Scala中Arry

import scala.collection.mutable.ArrayBuffer //Arry:数组 //可修改的:ArryBuffer //不可修改的:Arryobject Test_1118_2 {//可修改的:ArrayBufferdef main(args: Array[String]): Unit {//1.新建val arr1ArrayBuffer(1,2,3)//2.添加arr14a…...

学习threejs,使用AnimationMixer实现变形动画

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.AnimationMixer 动画…...

两大新兴开发语言大比拼:Move PK Rust

了解 Move 和 Rust 的差异有助于开发者根据项目的具体需求选择最合适的语言。选择不恰当的语言可能会导致项目后期出现技术债务。不同语言有其独特的优势。了解 Move 和 Rust 的差异可以帮助开发者拓展技术视野,发现不同语言在不同领域的应用潜力。 咱们直奔主题&a…...

基于一种基于OCR图像识别技术的发票采集管理系统及方法

本发明涉及了一种基于OCR图像识别技术的发票采集管理系统及方法,该系统的发票信息采集单元采集发票图片信息数据,OCR图像识别单元基于OCR图像识别技术并结合人工智能深度学习算法对发票图片信息数据进行识别读取以获得OCR图像识别结果,发票信…...

基于深度学习的车牌检测系统的设计与实现(安卓、YOLOV、CRNNLPRNet)+文档

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...

JavaWeb——JS、Vue

目录 1.JavaScript a.概述 b.引入方式 c.JS的基础语法 d.JS函数 e.JS对象 f.JS事件监听 2.Vue a.概述 b.Vue常用指令 d.生命周期 1.JavaScript a.概述 JavaScript是一门跨平台、面向对象的脚本语言。是用来控制网页行为的,它能使网页可交互。JavaScript和…...

Springboot 整合 Java DL4J 构建股票预测系统

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...

ATmaga8单片机Pt100温度计源程序+Proteus仿真设计

目录 1、项目功能 2、仿真图 ​3、程序 资料下载地址:ATmaga8单片机Pt100温度计源程序Proteus仿真设计 1、项目功能 设计Pt100铂电阻测量温度的电路,温度测量范围是0-100摄氏度,要求LCD显示。画出电路图,标注元器件参数&am…...

FPGA通过MIPI CSI-2发送实时图像到RK3588,并HDMI显示

介绍FPGA通过MIPI CSI-2发送实时图像到RK3588,并HDMI显示。 FPGA本地产生动态图像模板,通过MIPI CSI-2接口发送到RK3588 MIPI CSI接口。RK3588注册成相机后,调用接口并在HDMI显示器上显示。 1、RK3588驱动调试 查看Media controller信息 Med…...

ELK8.15.4搭建开启安全认证

安装 Elastic :Elasticsearch,Kibana,Logstash 另外安装一个收集器filebeat 通过二进制安装包进行安装 创建一个专门放elk目录 mkdir /elk/ mkdir /elk/soft下载 es 、kibana、Logstash、filebeat二进制包 cd /elk/softwget https://art…...

原生微信小程序中封装一个模拟select 下拉框组件

1.首先在components 里面设置组件名称&#xff1a;van-select&#xff08;随便取名字&#xff09;&#xff1b; 2.新建文件写代码&#xff1a; wxml&#xff1a; <view class"w100 select_all_view"><!-- 标题&#xff0c;可以没有 --><view class…...

商品管理系统引领时尚零售智能化升级 降价商品量锐减30%

根据贝恩咨询公司2024年发布的消费品报告&#xff0c;当前消费品行业正面临增长放缓、全球市场波动及消费者期望变化的巨大压力。为保持市场竞争力&#xff0c;企业需要重新审视其增长战略&#xff0c;重视可持续创新、数字化转型和运营敏捷性。企业必须灵活应对供应链中断和消…...

UE5 5.1.1创建C++项目,显示error C4668和error C4067

因为工作要求&#xff0c;没法使用最新 5.5版本的ue5 而是要用ue5.1和5.2版本。 但是我在安装下载了visual studio2022后&#xff0c;使用 ue5.1编辑器 创建C项目&#xff0c;爆出如下错误。 error C4668: ?????__has_feature?????ΪԤ?????꣬???0????…...

spring boot 集成 redis 实现缓存的完整的例子

Cacheable 注解是 Spring Cache 抽象的一部分&#xff0c;用于声明式地管理缓存。Cacheable 注解本身并不直接指定缓存的存储位置&#xff0c;而是依赖于配置的缓存管理器&#xff08;CacheManager&#xff09;来决定缓存数据的存储位置。 常见的缓存存储方式: 1、内存缓存&a…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...