校园招聘攻略----嵌入式软件工程师基础问题(三)

问题21

面试官:

DMA是什么,如何使用?

学生:
  • 为了提高CPU的使用效率,使用DMA方式。DMA是直接存储器访问,用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路, 能使 CPU 的效率大为提高
  • 查询方式:查询方式可以不使能DMA中断,通过DMA_GetFlagStatus函数判断标志位来辨别是否传输完成或过半以及出错,然后关闭DMA通道,用DMA_SetCurrDataCounter函数重设缓存大小,完成相应操作后要记得清除标志位再使能DAM通道。如果使能了循环模式,会自动重装载计数
  • 中断方式:DMA中断一般用于定长数据传输,以传输完成中断为例。1、当产生DMA传输完成中断后,清除中断标志位、传输完成标志位;2、关闭DMA通道;3、处理数据;4、重新设置DMA通道的DMA缓存的大小(可以省去);5、开启DMA通道
  • 不定长数据传输:以串口为例,不定长数据传输的时候,可以通过串口空闲中断来判断传输是否完成(传输缓存大小要大于传输的数据大小),数据长度可以通过DMA_GetCurrDataCounter函数来计算,然后关闭DMA通道,重设DMA缓存的大小,再启用DMA通道
  • 双缓冲方式:设置两个缓冲区,设置一个缓冲区标志(用来指示当前处在哪个缓冲区),每完成一次传输就通过重新配置DMA_MemoryBaseAddr的缓冲区地址,下次传输数据就会保存到新的缓冲区中,可以通过自定义缓存区标志来判断和切换,这样可以避免缓冲区数据来不及处理就被覆盖的情况,也能为处理数据留出更多地时间(指到下次传输完成)

问题22

面试官:

高优先级中断在执行时有个低优先级触发,高优先级结束后会不会执行?

学生:
  • 会执行
  • 关于中断源的中断优先级关系,可以归纳为下面两条基本原则:1、低优先可被高优先级中断,高优先级不能被低优先级中断;2、任何一种中断(不管是高级还是低级)一旦得到响应,不会再被它同等级的中断源所中断

问题23

面试官:

IIC最多可以挂载多少从机?

学生:
  • 由IIC地址决定,8位地址,减去1位广播地址,是7位地址,2^7=128,但是地址0x00不用,那就是127个地址,所以理论上可以挂127个从器件
  • 但是IIC总线协议规定总线电容不能超过400pF,管脚有输入电容,PCB也会有寄生电容,经验值不超过8个设备

问题24

面试官:

IIC主机应答和从机应答区别?

学生:
  • IIC是按字节来传输的,当每传输完一个字节的数据,后面必须紧跟一个校验位,这个校验位是接收端通过控制SDA(数据线)来实现的,以提醒发送端数据我这边已经接收完成。(SDA=0为ACK 接收完成 SDA=1为NACK 繁忙中)
  • 主机应答: 传输完一个字节数据以后(数据传输方向:从机—>主机),主机控制(此时是接收端)SDA来提醒从机(发送端),我这边接受完成
  • 从机应答: 传输完一个字节数据以后(数据传输方向:主机—>从机),从机控制(此时是接收端)SDA来提醒主机(发送端),我这边接受完成

问题25

面试官:

结构体字节对齐的原因和规则?

学生:
  • 原因:1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问
  • 规则:1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。3、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储

问题26

面试官:

大小端指的什么?

学生:

对于一个由2个字节组成的16位整数,在内存中存储这两个字节有两种方法:一种是将低序字节存储在起始地址,这称为小端(little-endian)字节序;另一种方法是将高序字节存储在起始地址,这称为大端(big-endian)字节序

问题27

面试官:

C语言编译结束后内存怎么分配?

学生:
  • 1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈
    2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 。它与数据结构中的堆不同,分配方式类似于链表
    3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量、未初始化的静态变量在相邻的另一块区域。当程序结束后,变量由系统释放
    4、文字常量区:存放常量字符串。当程序结束后,常量字符串由系统释放
    5、程序代码区:存放函数体的二进制代码

问题28

面试官:

如何用两个栈实现队列?

学生:

队列的特性是:“先入先出”,栈的特性是:“先入后出”

  • 1、建立两个栈A、B;栈A用来入队列;栈B用来出队列
  • 2、入队出队操作;入队:将元素进栈A;出队:判断栈B是否为空,如果为空,则将栈A中所有元素pop,并push进栈B,栈B出栈,如果不为空,栈B直接出栈

问题29

面试官:

sizeof与strlen的区别?

学生:
  • sizeof是C/C++中的一个长度运算符,是返回一个对象或者类型在内存中所占用的字节数
  • strlen是C语言中的库函数,所在头文件为#include <string.h>。原型: unsigned int strlen(char *str);其中str为指定的字符串。功能: 统计字符串str中字符的个数(不包括 ‘\0’)。返回值: 返回字符个数。数组长度 = sizeof(数组名)/sizeof(数组名[0])
  • 区别:1、strlen 测量的是字符的实际长度,以’\0’ 结束,但不包括结束字符(\0或null)。而sizeof 测量的是字符的分配大小。2、sizeof是编译期就计算完成的,strlen是运行期计算的

问题30

面试官:

C语言中malloc与c++中new的区别?

学生:
  • 1、new是一个C++关键字,需要编译器支持,而malloc是一个库函数,需要头文件支持
  • 2、使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸
  • 3、new内存分配失败时,会抛出bac_alloc异常。malloc分配内存失败时返回NULL
  • 4、new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void* ,需要通过强制类型转换将void*指针转换成我们需要的类型
  • 5、开辟空间位置不同(malloc开辟空间在堆上,new不一定在堆上,new开辟的一块空间被称为自由存储区)
  • 6、new不仅能分配内存还会初始化,malloc只可以进行初始化
  • 7、new调用operator new(可以重载),而malloc不可以重载
  • 8、new可以调用malloc,malloc不可以调用new
  • 9、new可以开辟常量,malloc不可以开辟常量内存

希望本文对大家有帮助,上文若有不妥之处,欢迎指正

分享决定高度,学习拉开差距

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲁棒最小二乘支持向量机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值