嵌入式软件工程师面试题——嵌入式专题 (五十六)

说明:

  • 面试群,群号: 228447240
  • 面试题来源于网络书籍,公司题目以及博主原创或修改(题目大部分来源于各种公司);
  • 文中很多题目,或许大家直接编译器写完,1分钟就出结果了。但在这里博主希望每一个题目,大家都要经过认真思考,答案不重要,重要的是通过题目理解所考知识点,好应对题目更多的变化;
  • 博主与大家一起学习,一起刷题,共同进步;
  • 写文不易,麻烦给个三连!!!

1.内核如何传参

答案:

uboot传的是R0,R1,R2参数,R0默认是0,R1存放的就是CPU的型号,R2里面存放的是些基地址,比如内存的起始地址,内存大小,根文件系统的信息。

规定参数的格式:

Linux内核2.4以后都是以标记列表tagged_list的形式来传递参数,标记列表就是挨着存放多个标记,标记列表以标记ATAG_CORE开始,ATAG_NONE结束。

嵌入式软件工程师面试题——嵌入式专题 (五十六)_第1张图片

该结构体有两部分组成,结构体tag_header,和联合体

2.uboot为什么要关闭caches

答案:

Caches是cpu的2级缓存,主要作用是将常用的指令和数据存在cpu内部,刚上电CPU还不能管理caches,指令caches可以关闭,也可以不关闭,但是数据caches必须关闭,否则可能由于刚开始的代码到caches里面取数据的时候,由于caches还没准备好,会导致数据异常。

3.驱动申请内存的函数

答案:

Kmalloc会在“lowmem  : 0xc0000000 - 0xef600000”地址空间里申请内存(底端内存);

Vmalloc 会在0xef800000 - 0xfee00000”地址空间里申请内存(高端内存)。

kmalloc 分配的内存大小有限制(128KB),而 vmalloc 没有限制;

kmalloc 分配内存的开销小,因此 kmalloc 比 vmalloc 要快。

内核中一般使用 kmalloc(),而只有在需要获得大块内存时才使用 vmalloc(),得到的地址非线性

kmalloc获取到的是连续的地址,vmalloc获取的是不连续的,一般情况下,vmalloc申请的是以M为单位,kmalloc申请的是以B为单位。

函数 devm_kzalloc() 和kzalloc()一样都是内核内存分配函数

但是devm_kzalloc()是跟设备(device)有关的,当设备(device)被detached或者驱动(driver)卸载(unloaded)时,内存会被自动释放。另外,当内存不在使用时,可以使用函数devm_kfree()释放。

而kzalloc()则需要手动释放(使用kfree()),但如果工程师检查不仔细,则有可能造成内存泄漏

4.AD转换的原理

答案:

A/D转换器的工作原理,主要有以下三种方法:

1.逐次逼近法;

2.双积分法;

3.电压频率转换法

A/D转换四步骤:采样、保持、量化、编码。

采用电压频率转换法的A/D转换器,由计数器、控制门及一个具有恒定时间的时钟门控制信号组成,它的工作原理是V/F转换电路把输入的模拟电压转换成与模拟电压成正比的脉冲信号。电压频率转换法。

电压频率转换法的工作过程是:当模拟电压Vi加到V/F的输入端,便产生频率F与Vi成正比的脉冲,在一定的时间内对该脉冲信号计数,时间到,统计到计数器的计数值正比于输入电压Vi,从而完成A/D转换。

5.开发板的启动流程

答案:

嵌入式软件工程师面试题——嵌入式专题 (五十六)_第2张图片

启动过程:四部曲

(无论是uboot、Linux内核、设备树、根文件系统,都必须拷贝到芯片内存才能使用,因为这些都是事先存在外存中)

开发板上电之后,会先找到地址为0的地址空间,即96k的iROM,这个是芯片厂家事先固化好的程序,这个程序主要是初始化时钟,栈,还有依据拨码开关找到bootloader的位置即是在SD卡还是在MMC或其他外存,对应图中的1,

之后把Bootloader的前4KB数据从外存拷贝到iRAM内存中,它包含了启动数据的地址以及长度,告诉boot ROM将启动数据拷贝到哪里以及拷贝多大,然后初始化外部DRAM控制器对应图2,

在初始化完DRAM控制器之后,bootloader主体部分被拷贝至外部DRAM中,对应图3,

bootloader随后便将linux操作系统镜像从引导设备加载到DRAM中,并对OS完整性检查,引导完成之后,bootloader跳到操作系统中去运行,启动Linux内核,对应图4。

6.移植需要做哪些工作

答案:

Uboot----->linux内核------->设备树------->根文件系统

说明:

在移植Linux系统之前需要先移植一个bootloader,这个bootloader用于启动linux内核,常用的有u-boot,移植好uboot之后就可以移植linux内核,这还不能够正常启动,还需要移植一个根文件系统rootfs,这个根文件系统里面就包含了常用的命令和文件

所以一个完整的Linux系统包括uboot、linux kernel(含设备树)、rootfs

7.bootloader基本功能

答案:

初始化软硬件环境,比如:内存地址

引导加载Linux内核

给Linux内核传参

执行用户命令

8.uboot

答案:

uboot是bootloader的一种,主要作用就是在芯片上电一段时间后初始化DDR,然后将Linux内核的镜像从SD或者MMC、NAND(这些都是外存)拷贝到DDR(内存),启动内核。

外存是相当于ROM(和电脑硬盘)掉电不消失也叫闪存,内存是RAM掉电消失。

Uboot的区别

嵌入式软件工程师面试题——嵌入式专题 (五十六)_第3张图片

9.Uboot常用命令

答案:

  Help----->列出所有支持的命令。或指定的命令的帮助

Reset--->重启uboot

Setenv----->设置/修改/删除环境参数的值

Printenv----->打印环境的值

Md---->查看内存地址的值

Mw---->修改内存地址的值

Echo---->打印

Run---->执行某条环境变量参数命令

Bootz---->在内存引导内核启动

Load---->从文件系统中加载二进制文件到内存 

10.IIC为什么要加上拉电阻,为什么使用开漏输出

答案:

上拉电阻

1.当IIC总线在空闲状态,SDA和SCL需要处于高电平状态

2.开漏输出无法输出高电平,使用上拉电阻可以完成高低电平之间的转换

开漏输出

1.加入使用推挽输出可能导致器件的烧毁

2.实现线与功能

你可能感兴趣的:(嵌入式面试题,面试,职场和发展,嵌入式,面试题,开发语言)