2022年嵌入式秋招题目及解答

2022年嵌入式秋招题目及解答

1 ARM体系结构、总线、各种外设、微机原理

ARM的中断处理流程,以及每个阶段做什么事(中断触发到返回的具体行为);

答:中断属于七种异常的一部分。对于异常,分为三个部分,中断初始化(异常不需要初始化),异常产生,异常处理。中断初始化,由开发者按照芯片手册设置寄存器,主要是使能中断以及设置优先级;异常产生,硬件或者软件自动产生,CPU每执行完一条指令都会检测是否有异常信号到达CPU。
异常处理 可以分为两个部分,硬件自动处理和软件人为处理。硬件自动处理:硬件处理检测到异常信号后自动识别该异常信号属于七种异常中的哪一种,假设为未定义指令异常(und),硬件会将PC中存放的原本下一条要执行的指令的地址放入LR_und寄存器中,硬件将当前的CPSR寄存器内容保存到SPSR_und,硬件将CPSR的后无为改成und对应的数字,处理器进入未定义模式,硬件自动跳转到中断向量表的对应位置,该位置放置一条跳转指令 ldr pc, und_addr,自此硬件处理结束;软件人为处理:跳转到处理und异常的汇编代码中后,汇编代码可以选择直接用汇编进行处理,也可以在设置好栈后通过ATPCS协议调用C函数进行处理。软件处理主要包括:设置对应处理模式的栈,比如这里进入未定义模式,则通过R13_und(代码中仍然写成SP,不会写成SP_und)设置und模式的栈,将R0-R12以及LR寄存器的值压入und的栈中(这里的LR实际上是LR_und,这些处理都是为了中断处理函数能顺利返回,ARM提供了两种返回方式,一种是从对应模式的LR_XXX寄存器返回,一种是将对应模式的LR_XXX寄存器压入栈中,返回时将栈中数据再压回PC);汇编或者跳转C函数,具体处理中断;将栈中数据压出,R0-R12依然压入R0-R12,栈中LR的值压入PC,这样程序下一条指令就会返回主程序,硬件会自动将SPSR的值返回给CPSR,这里有个问题,PC的返回和CPSR的返回不能有逻辑上的先后,这个如何解决看电科嵌入式书233。

中断上下文

答:

中断嵌套如何实现(NVIC相关)

答:http://news.eeworld.com.cn/mcu/ic551887.html。NVIC是STM32的,Cortex-M内核。

两级向量表如何查找

答:

DMA与中断传输的比较;

答:
中断:实时响应,需要中断控制电路;适合于传输数据量少,且实时性较高的情况;需要CPU参与
DMA:实时响应,需要DMA控制电路;适合于存储器、IO之间大量数据的高速传输;不需要CPU参与

为什么中断里不要进行一些耗时的操作?

答:一般进入中断是屏蔽了其他中断的,中断处理太久会导致其他中断的丢失;二是中断处理太久会导致CPU没有空余时间去处理原本的主要程序。

中断速度过频怎么办;

答:

中断和轮询的效率问题;

答:
中断:实时响应,需要中断控制电路;适合于传输数据量少,且实时性较高的情况;需要CPU参与
轮询:不能实时响应,电路简单;适用于简单的无实时性要求的场合;需要CPU参与

ARM的开发流程

答:随意答

AD采样的精度

答:

你用过的ARM9和Cortex-A7芯片做个对比?

答:

大端模式和小端模式,如何用程序判断

答:写入一个int,强制转化为char,取出来看是高还是低

项目中用的哪款芯片,它的一些配置

答:S3C2440A相关看《微处理器系统结构与嵌入式系统设计》307,看一下里面关于存储器bank的知识,不太懂

关于arm的Cortex-M内核寄存器,以下说法正确的是:

A. R0~R12为通用寄存器,所有的ARM指令均可访问用于计算;
B. R13为栈指针寄存器,包含MSP和PSP,特权模式下使用MSP;
C. R14为LR寄存器,用于保存调用函数执行完后的返回值;;
D. R15为PC寄存器,执行指令后会由硬件修改,指向下一条指令;
答:

Nand Flash具体细节,存储空间大小,怎样检查数据是否正确?

答:

Nand Flash有哪些线?具体操作命令,发命令、发地址、写数据、读数据

答:

I2C相关问题:画I2C的时序图;I2C总线速率及通信过程;I2C空闲时两线的状态;I2C怎么暂停传输;I2C的死锁;I2C的总线仲裁;手绘i2c接口;

答:I2C时序、通信速率及通信过程、空闲时两线状态、怎么暂停传输、手绘接口:韦东山第一期I2C第一节。
I2C的死锁、总线仲裁:https://blog.csdn.net/u010037269/article/details/123914833 以及https://blog.csdn.net/zhangduang_KHKW/article/details/121953275?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-121953275-blog-123914833.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-121953275-blog-123914833.pc_relevant_default&utm_relevant_index=2

SPI相关问题:手绘spi接口;SPI总线最大速率,用在哪里;SPI从模式DMA传输;

答:

UART相关问题:手绘串口波形图;

答:

说下UART、IIC、SPI、RS232、RS422之间的区别;

答:

单线制怎么传输数据

答:韦东山第一期I2C第一节。

LCD相关问题:LCD屏的配置主要有哪些参数,时钟多少,怎样配置; LCD时钟与刷新率有关吗;LCD的字库问题

答:

ARM和FPGA主要都完成哪些任务

答:

ARM的工作模式(如何切换模式),工作状态、7种异常

答:

arm模式切换和上下文切换

答:

虚拟内存物理内存映射

答:

ARM体系结构介绍

答:《微处理器系统结构与嵌入式系统设计》216

嵌入式中最快的存储介质是什么;

答:

tlb加速

答:

cache,内存,页表

答:

cache-miss什么情况

答:

流水线冲突与解决、分支预测什么原理;

答:

arm指令集流水线

答:

什么叫软硬实时

答:

m4内核双堆栈机制

答:

flash读写

答:

DSP和普通ARM MCU的区别,DSP的特点

答:DSP:单周期乘法运算,能在一个CPU周期内完成一个乘法运算,比如28335能够在一个周期内完成3232 位的乘法累加运算,或者两个1616位乘法累加运算,而同样32 位的普通单片机则需要4 个周期以上才能完成(冯诺依曼结构);单独的浮点运算单元;28335最高主频150MHZ;哈佛结构;
DSP和普通MCU的区别:DSP主要用于快速的数据处理,MCU主要用于实现复杂的控制逻辑;DSP为哈佛结构,MCU为冯诺依曼结构

一个最小系统由什么组成

答:CPU、时钟、电源、存储器、复位电路、调试器、IO

2 u-boot、linux、根文件系统、驱动、应用

Linux之虚拟文件系统

Linux之网络接口

Linux之进程调度

优先级反转问题

答:

Linux的任务调度方法有哪些

答:两种任务:实时和普通。实时分为先进先出实时和时间片轮转实时,普通分为数据处理型任务和交互型任务。内核能识别实时,不能识别交互和数据处理,能通过经验判断交互和数据处理。

用户进程和内核进程抢占执行的时机

答:

Linux之进程间通信

中断里为什么不能使用信号量

答:

linux内核进程间不共享内存,信号量存在哪里

答:内核空间?

说下信号量的实现原理; 信号量与互斥锁的区别

答:信号量与互斥锁的区别
(1)互斥锁用于线程的互斥,信号量一般用于线程的同步。
互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。 同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。
(2)互斥锁的值只能为0/1,信号量值可以为非负整数。也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量时,也可以完成一个资源的互斥访问。
(3)互斥锁的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。

项目使用到多线程了吗?多线程之间怎样通信?

答:

中断与任务之间通信方式?

答:

中断中使用消息队列需要注意什么?

答:

Linux之内存管理

上下文切换时任务在内存中是如何变动

答:

任务在内存中的组织方式

答:TCB-用户栈-用户代码

Linux之设备驱动

介绍下Linux内核的总线设备驱动模型; 字符设备与块设备驱动框架;字符设备与块设备的不同点;IIC的驱动框架

答:

设备树是什么时候被识别(加载)的?设备树、设备驱动的详细流程;

答:

Linux之uboot-Linux-文件系统流程

U-boot启动流程和内核的启动流程,U-boot移植做了哪些事情?

答:

设备树是什么时候被识别(加载)的?

答:

杂七杂八:调试、脚本、API、中断、系统调用

用过哪些系统调用?

答:

写过shell脚本吗?或者说写shell脚本的一些基础知识

答:

写过Makefile吗?或者说Makefile的一些基本知识

答:

linux下的命令有用过吗?; linux下,查找当前目录下所有.c文件下的包含“hello world”字符串的文件的命令(find/grep命令的用法);

答:

中断上半部和下半部的处理

答:

3 C语言基础、数据结构与算法、手撕代码、TCP

手写冒泡排序和快排,各种排序的特点

答:

手撕memcpy,strcpy

答:memcpy(含重叠的处理,其实就是memmove),讲解链接:https://blog.csdn.net/Li_Ning_/article/details/51418400

void* memmove(void *dest,const void *src,size_t size){
    if(dest==NULL||src==NULL)
        return NULL;
     char *s_dest=(char *)dest,*s_src=(char *)src;
    if(s_dest>s_src&&s_dest<s_src+size){
        s_dest=s_dest+size-1;
        s_src=s_src+size-1;
        while(size--){
            *s_dest--=*s_src--;
        }
        return dest;
    }
    else{
        while(size--){
            *s_dest++=*s_src++;
        }
        return dest;
    }
    return NULL;
}

static关键字的用法,static和const区别,volatile关键字与register关键字的区别

答:volatile关键字与register的区别
(1)volatile
volatile是易变的,不稳定的意思,volatile是关键字,是一种类型修饰符,用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者其他线程等,遇到这个关键字声明的变量,编译器对访问该变量的代码不再进行优化,从而可以提供对特殊地址的稳定访问。那么什么是编译器优化呢?
为了提高运行效率,攻城师们费尽心机地把代码优化,优化程序运行时存取速度。一般,分为硬件优化和软件优化。硬件优化,流水线工作,详细可以参考《计算机组成原理》。软件优化,一部分是程序猿们做的代码优化(前提你得有优化的思路和能力),还有一部分就是我们的编译器优化了。
现代的编译器经过那么多年的发展,已经比较成熟,它会把多余的变量忽略掉,让代码的运行效率更高。默认情况下,编译器都会对代码进行优化,会把一些变量在寄存器里存取,而不是在内存里存取,如此一来,CPU在自己家里拿东西当然比从内存那里拿东西要快得多。举个小栗子:

int i=5;
int a=i;
...
int b=i;

编译器发现两次从i读数据的代码之间,并没有对i进行过操作,它会自动把上次读的数据放在b中,而不是重新从i里面读取。而volatile关键字告诉编译器该变量是随时可能发生变化的,每次使用它的时候必须从内存中取出它的值,因而编译器生成的汇编代码会从原内存地址中读取数据使用,而不是从寄存器或者缓存中读取,从而保证了对特殊地址的稳定访问。简言之,状态要经常变化的,为了防止我们编译优化而导致的存取的数据不同步的问题,这时我们就需要用到volatile。那具体到什么场景下需要用到volatile关键字呢
1)并行设备的硬件寄存器(如:状态寄存器);2)一个中断服务子程序中会访问到的非自动变量;3)多线程应用中被几个任务共享的变量;

上面提到了非自动变量,这里进一步对几种变量做一番解释:
自动变量:是在函数内部定义和使用的变量,它是局部变量。
非自动变量:有两种,一种是全局变量,一种是静态变量。
全局变量:在函数外面定义的变量,只能定义一次,不能有重复的定义,不然就会发生错误,而其他的文件要想使用这个变量,需要extern来声明这个变量(也可省略,因为默认就是extern),这个声明叫做引用声明。
若不想被其他文件访问,则用static关键字声明为静态变量。静态变量与自动变量的本质区别是,静态变量并不像自动变量那样使用堆栈机制来使用内存。而是为静态变量分配固定的内存,在程序运行的整个过程中,它都会被保持,而不会被销毁。这就是说静态变量的持续性是程序运行的整个周期。这有利于我们共享一些数据。如果静态变量在函数内部定义,则它的作用域就是在这个函数内部,仅在这个函数内部使用它才有效,但是它不同于自动变量,自动变量离开函数后就会被销毁,而静态变量不会被销毁。他在函数的整个运行周期内都会存在。
(2) register
这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。注意是尽可能,不是绝对。你想想,一个CPU 的寄存器也就那么几个或几十个,你要是定义了很多很多register 变量,它累死也可能不能全部把这些变量放入寄存器吧。

堆和栈的区别,怎样减少堆和栈的使用?

答:堆和栈的区别(操作系统导论P22):C语言中程序使用栈存放局部变量、函数参数和返回地址;堆则用于显示的请求动态分配数据,程序通过malloc来请求堆空间,通过free来释放堆空间。堆和栈的区别(韦东山知乎文章)
(1)存储内容不同:
栈:在函数调用时,栈中存放的是函数中(最底下是函数调用后的下一条指令)的各个参数(局部变量)。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员分配。
(2)管理方式上不同
栈:由系统自动分配并释放空间。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间,当对应的生存周期结束后栈空间被自动释放。
堆:需要程序员指定大小手动申请和手动释放,在C语言中使用malloc函数申请,使用free函数释放。
(3)空间大小不同
栈:获取空间较小。在Windows下一般大小是1M或2M,当剩余栈空间不足时,分配失败overflow。
堆:获得空间根据系统的有效虚拟内存有关,比较灵活、大。
(4)能否产生碎片不同
栈:不会产生碎片,空间连续。
堆:采用的是链表的存储方式,会产生碎片。
(5)生长方向不同
栈: 向低地址扩展的数据结构,是一块连续的内存区域。
堆: 向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表空闲内存地址来存储的,自然不连续,而链表的遍历方向是由低地址向高地址。
(6)分配方式不同
栈:有2种分配方式:静态分配和动态分配,静态由编译器完成,例如局部变量;动态由malloc函数实现,由编译器进行释放。
堆: 都是动态分配的,没有静态分配的堆。
(7)分配效率不同
栈:由系统自动分配,速度较快。但程序员无法控制。
堆:由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。

malloc分配超过内存更大的空间,会发生什么?

答:https://www.cnblogs.com/timssd/p/5024873.html

C语言中函数调用的值存放在哪里?

答:

c语言代码规范,给一段代码,让评价代码质量

答:

栈空间分配超过最大值时,会发生什么?

答:

不释放堆空间会导致哪些问题?

答:

怎样检测内存溢出?

答:

说下字符串相关的函数?

答:

strcpy、sprintf 、memcpy的区别;memcpy安全吗(memmove)?

答:strcpy、sprintf 、memcpy的区别:操作对象不同,strcpy 的两个操作对象均为字符串,sprintf 的操作源对象可以是多种数据类型,目的操作对象是字符串,memcpy 的两个对象就是两个任意可操作的内存地址,并不限于何种数据类型。执行效率不同,memcpy 最高,strcpy 次之,sprintf 的效率最低。实现功能不同,strcpy 主要实现字符串变量间的拷贝,sprintf 主要实现其他数据类型格式到字符串的转化,memcpy 主要是内存块间的拷贝。复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。说明:strcpy、sprintf 与memcpy都可以实现拷贝的功能,但是针对的对象不同,请根据实际需求,来选择合适的函数实现拷贝功能。
memcpy安全吗:不安全,https://blog.csdn.net/Li_Ning_/article/details/51418400

内存泄漏和内存溢出的不同?内存泄露的原理

答:内存泄漏最主要情况就是通过malloc申请了内存,但是没有释放,这样其他程序也调用不了这块内存。一两次内存泄漏没什么,大量的内存泄漏(导致泄漏的程序段一直运行)会导致大量内存空间不可用,导致程序崩溃。内存溢出一般是指你需要的空间大于了实际分配给你的空间,比如往一个int空间写入long的数据,又或者分配的栈满了以后继续往栈里加数据,持续的内存泄漏也可能导致内存溢出,因为没有内存可用了。
网页链接:https://www.bilibili.com/read/cv8097492/

平时写程序有遇到过类似段错误吗?或者说什么是段错误,什么时候会发生段错误。什么又是页错误?

答:段错误在《操作系统导论》113,页错误在167

TCP三次握手详细过程; 如果让你写一个TCP

 Server,你需要用到那些函数?;服务端为什么要用listen监听呢?;服务端什么时候会建立连接呢?;

答:

C语言中#ifndef #define#endif的作用?

答:

C语言中inline关键字,所有时候都会进行内联展开吗?内联函数的原理和应用

答:

结构体对齐,结构体怎么设置n字节对齐,给一个结构体,问它的sizeof,然后问大小怎么优化一下

答:

平时写程序过程中会进行检测吗?方法是什么?你做的东西怎么验证正确的

答:

指针与数组的区别、指针与引用的区别

答:指针和引用的区别:1) 引用必须被初始化,指针不必。2) 引用初始化以后不能被改变,指针可以改变所指的对象。3) 不存在指向空值的引用,但是存在指向空值的指针

全局变量可不可以定义在可被多个.C文件包含的头文件中?

答:

局部变量能否和全局变量重名?

答:

布尔型,int,float怎么和0比较

答:

怎么对malloc进行第二层封装优化

答:

函数调用过程中哪些用到了堆栈

答:

几个函数占内存特别大怎么办

答:

函数调用联合体怎么进入不同的功能

答:

指针常量和常量指针

答:

怎么存储大链接数据,采用什么数据结构

答:

怎么优化堆和栈

答:

协议栈处理,我一直不明白,啥叫协议栈

答:

用两个链表实现队列

答:

内存拷贝的时候如果发生错误怎么办?(memcpy函数有哪些错误情况)

答:

malloc申请在堆上还是栈上

答:

C语言函数调用过程,函数调用进行了哪些寄存器操作

答: 栈指针,程序计数器,传入参数,传出参数,调用者,被调用者保存寄存器;你刚刚说的那些寄存器的英文简写是什么? %rsp,pc,%rbp等等;

中断里面不能执行什么

答:static变量的存储

static变量存储在哪

答:

静动态链接的区别,链接原理

答:

tcp和udp

答:

sizeof和strlen 有何区别?

答:sizeof 是一个操作符,strlen 是库函数。sizeof 的参数可以是数据的类型,也可以是变量,而 strlen 只能以结尾为‘\0‘的字符串作参数。编译器在编译时就计算出了sizeof 的结果。而 strlen 函数必须在运行时才能计算出来。并且sizeof计算的是数据类型占内存的大小,而 strlen 计算的是字符串实际的长度。数组做sizeof 的参数不退化,传递给 strlen 就退化为指针了。注意:有些是操作符看起来像是函数,而有些函数名看起来又像操作符,这类容易混淆的名称一定要加以区分,否则遇到数组名这类特殊数据类型作参数时就很容易出错。最容易混淆为函数的操作符就是sizeof。

函数传参的入栈顺序

答:

网络传输数据的格式

答:

指针占空间的大小

答:

程序分段,BSS、Data段、text段

答:

如何手动分配存储空间减少内存消耗,内存不够的时候如何解决

答:

写个函数指针和指针函数

答:

C语言的不同变量怎么存储和使用的

答:

结构体和联合体的区别

答:

define和typedef的区别

答:

程序的局部变量存在于哪里,全局变量存在于哪里,动态申请数据存在于哪里。

答:程序的局部变量存在于栈区;全局变量存在于静态区;动态申请数据存在于堆区。

野指针产生的原因及解决办法

答:(1)声明指针变量时没有被初始化。解决办法:声明指针时初始化,可以是具体的地址值,也可让它指向NULL。 (2)指针 p 被 free 或者 delete 后,没有设置为 NULL。解决办法:指针指向的内存空间被释放后指针应该指向NULL。 (3)操作指针时超越了变量的作用范围。解决办法:在变量的作用域结束前释放掉变量的地址空间并且让指针指向NULL。 注意:“野指针”的解决方法也是编程规范的基本原则,平时使用指针时一定要避免产生“野指针”,在使用指针前一定要检验指针的合法性。

链表和数组的区别?

答:(1)存储形式:数组是一块连续的空间,声明时就要确定长度。链表是一块可不连续的动态空间,长度可变,每个结点要保存相邻结点指针。(2)数据查找:数组的线性查找速度快,查找操作直接使用偏移地址。链表需要按顺序检索结点,效率低。(3)数据插入或删除:链表可以快速插入和删除结点,而数组则可能需要大量数据移动。(4)越界问题:链表不存在越界问题,数组有越界问题。说明:在选择数组或链表数据结构时,一定要根据实际需要进行选择。数组便于查询,链表便于插入删除。数组节省空间但是长度固定,链表虽然变长但是占了更多的存储空间。

使用C语言实现字符串倒序。

答:

#include <stdio.h>
#include <string.h>
void Reverse_String(char a[])
{ 
	int i,length; char t; 
	length = strlen(a); 
	for(i=0 ;i < length/2 ; i++) 
	{   
		t = a[i];   
		a[i] = a[length-1-i];   
		a[length-1-i] = t;  
	}
}
main()
{  
	char a[10];  
	printf("input a string:");  
	gets(a);  
	puts(a);  
	Reverse_String(a);  
	puts(a);
}

使用scanf()和gets()输入字符串有何利弊?

答:用scanf()函数输入字符串时,默认分隔符是空格、跳格(Tab)等,因此scanf()函数不能输入含有上述字符的字符串,这是其不足之处;与gets()相比,其优点是它可以一次输入多个字符串,而且还可以用于输入不同类型的数据,应用面较广。用gets()函数输入时,可以输入含空格、跳格等字符的字符串,但其不足之处在于,它只能用于输入字符串,且一次只能输入一个。

for语句与while语句在实现循环时,哪一个更好?

答:相对而言,for语句更好用,尤其是循环次数确定的情况下。而while语句,一般用于循环次数不确定的情况。可以这么理解,只要while语句能实现的地方,用for语句都能实现。另外,如果是多重循环,while嵌套的时候,看起来比较繁琐。

TCP与UDP有啥区别?

答:(1)TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。(2)TCP提供可靠的服务。它通过校验和,丢包时的重传控制,序号标识,滑动窗口、确认应答,次序乱掉的分包进行顺序控制实现可靠传输。即通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达; UDP尽最大努力交付,即不保证可靠交付。(3)UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高要求的通信或广播通信场景。(4)每一条TCP连接只能是点到点的; UDP支持一对一,一对多,多对一和多对多的交互通信方式。(5)TCP对系统资源要求较多,UDP对系统资源要求较少。

UDP有时比TCP更有优势:UDP以其简单、传输快的优势,在越来越多场景下取代了TCP, 如实时游戏。(1)网速的提升给UDP的稳定性提供可靠网络保障,丢包率很低,如果使用应用层重传,能够确保传输的可靠性。(2)TCP为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,建立了繁琐的握手过程,由于TCP在内置的系统协议栈中,极难对其进行改进。采用TCP,一旦发生丢包,TCP会将后续的包缓存起来,等前面的包重传并接收到后再继续发送,延时会越来越大。基于UDP对实时性要求较为严格的情况下,采用自定义重传机制,能够把丢包产生的延迟降到最低,尽量减少网络问题造成的影响。

全局变量、局部变量、静态全局变量、静态局部变量

比如在源文件A.c中有以下程序

int a;
static int b;
void main(){
int c;
static int d;
}

a为全局变量,存储在静态存储区,默认链接属性为external(C和指针42),其他文件可以访问a,当然为了易于理解,最好还是加上extern关键字;b为静态的全局变量,存储也在静态存储区,static关键字用于全局变量前面,表示将其链接属性由默认的external变为static,b与a都存储在静态区,只不过其他文件不可以访问b;c是普通的局部变量,存储在栈中,main函数每次运行时都重新初始化,main函数结束时自动释放,c只能在main函数中用,也就是c是函数作用域;static关键字用于局部变量前面,表示将其存储类型由栈中改为静态存储区,也就是a和b的存放区域,在main函数结束后d依然存在。全局变量、静态全局变量、静态局部变量都只初始化一次,局部变量每次函数运行时重新初始化。静态局部变量的生存期虽然为整个源程序,但是其作用域仍与普通局部变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它(应该是不能写,可以读该变量)。

什么是生命周期,什么事作用域?说明全局变量、静态变量、局部变量、const变量的生命周期和作用域

《王道程序员求职宝典》107 习题11

malloc/free 和new/delete的区别

《王道程序员求职宝典》104

如何减少频繁malloc造成的内存碎片?

《王道程序员求职宝典》109 习题13

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值