专栏首页嵌入式知识ARM等硬件、Linux驱动内核面试问题

ARM等硬件、Linux驱动内核面试问题

面试中可能涉及的一些硬件问题。比如IIC原理。NAND和nor的区别。

一、ARM

重定位、可重入函数、回调函数

1、工作模式:

user:非特权模式,大部分都在这种模式下工作 FIQ:快速中断模式 异常模式,特权模式 IRQ:普通中断模式 异常模式,特权模式 Supervisor:复位或者软中断模式 异常模式,特权模式 Abort:存取异常 异常模式,特权模式 undef:未定义模式 异常模式,特权模式 system:系统模式 特权模式

2、寄存器

ARM的通用寄存器共有37个。

user模式下可用的寄存器是r0~r15和cpsr寄存器,其中r13又叫sp(栈)寄存器,r14又叫lr寄存器。r15又叫pc寄存器。pc(程序控制寄存器)中的地址是哪里,CPU就执行在哪里。 FIQ:其中的寄存器r0~r7和r15以及cpsr寄存器和user一样,但是有自己的r8~r14,以及spsr IRQ:其中的寄存器r0~r12和r15以及cpsr寄存器和user一样,但是有自己的r13~r14,以及spsr Supervisor:其中的寄存器r0~r12和r15以及cpsr寄存器和user一样,但是有自己的r13~r14,以及spsr Abort:其中的寄存器r0~r12和r15以及cpsr寄存器和user一样,但是有自己的r13~r14,以及spsr undef:其中的寄存器r0~r12和r15以及cpsr寄存器和user一样,但是有自己的r13~r14,以及spsr system:和user的寄存器一模一样,但是这是特权模式下的。 这里所有的cpsr又叫程序状态寄存器,其中bit0~bit4位工作模位,bit5是ARM编程模式位,bit6和bit7是FIQ和IRQ的中断使能位,bit28~bit31是条件位。

3、异常

发生异常时需要: ①拷贝cpsr到spsr中 ②设置cpsr ③保存返回地址到lr ④设置pc到异常处 ⑤返回:从spsr到cpsr,从lr到pc。

二、Uboot

承上启下的作用,Linux内核前执行的代码,作用就是引导Linux内核的执行

三、IIC总线

1、介绍一下你了解的I2C?

I2C总线是飞利浦(PHLIPS)公司推出的一种串行总线,用于连接微控制器及其外围设备, I2C串行总线有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。 它仅通过两根信号线就可以完成对所有挂载在I2C总线上的从器件进行操作。这样的好处是可以大大的节省我们微处理器的IO口资源。

2、I2C到底可以挂载多少个器件呢?

答:IIC协议规定,在启动总线后第1字节的高7位是从节点的寻址地址,其中高四位为器件类型识别符,接着三位为片选,最后一位为读写位,当为1时为读操作,为0时为写操作,所以具体挂载多少个器件由I2C地址决定,7位寻址地址减去1个广播地址0x00不用,所以有2^7=128 - 1 = 127,那就是127个地址, 所以理论上可以挂127个从器件。

3、I2C如何同时挂载多个同一种器件(地址相同的器件)?

答:理论上是不会这样设计的,如果一定要这样做的话,可以通过硬件上设计,控制器件是否挂载总线来实现(方法可用一个开关电路切断器件SDA或者SCL是否接入总线来实现)

4、I2C总线的主机与从机之间是如何通信的呢?

I2C总线的主机与从机之间的通信主要和I2C的时序有关。在通信开始的时候SCL与SDA都置为高电平,此时为总线空闲时间。当SCL为高电平期间SDA的电平被拉低,标志这总线的启动。当SCL为高电平期间SDA的电平被拉高,标志这总线的终止。在进行数据传送时,SCL为高电平期间,SDA上的数据必须保持稳定,只有在SCL的信号为低电平时,SDA上的高电平才允许变化。所以只要我们根据芯片手册正确的写好IIC的时序,按时序发送器件地址(不同的器件的地址不同)以及数据,就可以使主机与从机之间通信。

5、I2C总线的仲裁你知道吗?

总线上可能挂接有多个器件,有时会发生两个或多个主器件同时想占用总线的情况,这种情况叫做总线竞争。I2C总线具有多主控能力,可以对发生在SDA线上的总线竞争进行仲裁,其仲裁原则是这样的:当多个主器件同时想占用总线时,如果某个主器件发送高电平,而另一个主器件发送低电平,则发送电平与此时SDA总线电平不符的那个器件将自动关闭其输出级。总线竞争的仲裁是在两个层次上进行的。首先是地址位的比较,如果主器件寻址同一个从器件,则进入数据位的比较,从而确保了竞争仲裁的可靠性。由于是利用I2C总线上的信息进行仲裁,因此不会造成信息的丢失。

6、I2C时钟信号(SCL)的同步问题

在I2C总线上传送信息时的时钟同步信号是由挂接在SCL线上的所有器件的逻辑“与”完成的。SCL线上由高电平到低电平的跳变将影响到这些器件,一旦某个器件的时钟信号下跳为低电平,将使SCL线一直保持低电平,使SCL线上的所有器件开始低电平期。此时,低电平周期短的器件的时钟由低至高的跳变并不能影响SCL线的状态,于是这些器件将进入高电平等待的状态。当所有器件的时钟信号都上跳为高电平时,低电平期结束,SCL线被释放返回高电平,即所有的器件都同时开始它们的高电平期。其后,第一个结束高电平期的器件又将SCL线拉成低电平。这样就在SCL线上产生一个同步时钟。可见,时钟低电平时间由时钟低电平期最长的器件确定,而时钟高电平时间由时钟高电平期最短的器件确定。

7、I2C总线的其他注意点

1、进行数据传送时,在SCL为高电平期间,SDA线上电平必须保持稳定,只有SCL为低时,才允许SDA线上电平改变状态。并且每个字节传送时都是高位在前。 2、对于应答信号,ACK=0时为有效应答位,说明从机已经成功接收到该字节,若为1则说明接受不成功。 3、如果从机需要延迟下一个数据字节开始传送的时间,可以通过把SCL电平拉低并保持来强制主机进入等待状态。 4、主机完成一次通信后还想继续占用总线在进行一次通信,而又不释放总线,就要利用重启动信号Sr。它既作为前一次数据传输的结束,又作为后一次传输的开始。 5、总线冲突时,按“低电平优先”的仲裁原则,把总线判给在数据线上先发送低电平的主器件。 6、在特殊情况下,若需禁止所有发生在I2C总线上的通信,可采用封锁或关闭总线,具体操作为在总线上的任一器件将SCL锁定在低电平即可。 7、SDA仲裁和SCL时钟同步处理过程没有先后关系,而是同时进行的。

四、SPI总线

摩托罗拉公司推出的总线

1、SPI一般使用4条线通信分别是?

1、 MISO ————— 主设备数据输入、从设备数据输出

2、 MOSI ————— 主设备数据输出、从设备数据输入

3、 SCLK ————— 时钟信号、由主设备产生

4、 NSS(CS) ————– 从设备片选信号,由主设备控制

2、通信方式

SPI是单主设备通信协议,这意味着总线中只有一个中心设备能发起通信,当SPI主设备想读/写从设备时,它要拉低从设备对应的CS线(CS是低电平有效的)。主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。寄存器通过MOSI信号线将字节传送给从机,实现“写”的功能。从机也将自己的移位寄存器中的内容通过MISO信号线返回给主机,实现“读”的功能。这样,两个移位寄存器中的内容就被交换,外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之。若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。

3、SPI有四种操作模式,模式0、模式1、模式2、模式3。它们的区别是?

它们的区别是定义了在时钟脉冲的哪条边沿转换输出信号,哪条边沿采样输入信号,还有时钟脉冲的稳定电平值(就是时钟信号无效时是高还是低)。每种模式都由参数时钟极CPOL和时钟期CPHA刻画。

4、硬件SPI和软件模拟SPI的区别有哪些?

硬件SPI的效率要比软件模拟SPI高,写程序的时候只要把要发的数据写在寄存器里,硬件就会自动给你发了,软件模拟SPI则需要器实现时钟的拉高拉低,数据串行输出等等。硬件SPI必须要处理器支持才可以用,软件SPI就不需要特定的要求了,一般IO口就可用

五、Linux驱动

总线、设备、驱动

platform总线

file_operations结构体

lsmod、rmmod、insmod、modinfo

cat /proc/devices查看设备号

老的注册函数register_chrdev

老的注销函数unregister_chrdev

新的注册设备号有两个函数,第一步register_chrdev_region是自己指定主次设备号,alloc_chrdev_region是自动分配主设备号。第二步:cdev相关注册file_operations

新的注销函数在module_exit中调用的函数中先调用cdev_del,再调用下面中对应的一个函数unregister_chrdev_regionunalloc_chrdev_region

class_create(owner, name)

device_destroy(test_class, mydev);

六、中断

中断中不可睡眠。中断上下半部

①ISR(中断处理函数) 不能返回一个值。如果你不懂这个,那么你不会被雇用的。 ② ISR 不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。 ③在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。 ④ 与第三点一脉相承,printf()经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • linux命令

    如果文件已经存在,那么touch这个文件的作用就是更新这个文件的最新修改时间为现在。

    用户5426759
  • 从刷机开始学ARM

    ①ARM是一家公司:ARM前身为艾康电脑,于1978年在英国剑桥成立。1980年苹果与艾康合作,研究ARM。 1985年研究出ARM1(全球第一款商用RISC架...

    用户5426759
  • 进程

    以前的计算机一次只能执行一个程序,后来有了多道程序设计的电脑,可以宏观上执行多个程序。由此产生了进程的概念

    用户5426759
  • 【C语言笔记】变参函数

    提到变参函数,我们的感觉是不是既熟悉又陌生?感觉熟悉是因为我们平时都在使用着,如我们常使用的printf()函数与scanf()函数就是典型的变参函数。因为pr...

    正念君
  • 04 设计模式 建造者模式

    shimeath
  • 移动直播连麦解决方案

    最开始观看直播是主播在那边又唱又跳,而你想与女神互动,只能简单的刷刷弹幕送送礼物。直到有了连麦,你才能用音视频的方式和主播互动,让女神看到你的画面,一起诉说风花...

    腾讯视频云-Zachary
  • Js-函数式编程 前言什么是函数式编程为什么Js支持FP纯函数柯里化组合 compose范畴学functorMonadApplicative FunctorFunctor\Monad\Applic

    JavaScript是一门多范式语言,即可使用OOP(面向对象),也可以使用FP(函数式),由于笔者最近在学习React相关的技术栈,想进一步深入了解其思想,所...

    菜的黑人牙膏
  • 原生javascript实现图片轮播效果代码

    前几天用jquery做了一个JS的图片轮播效果,现在用原生的javascript代码实现同样的功能,当练习用吧,代码写得不是很满意。 看到BlueDream在他...

    李海彬
  • 第四节:详细讲解Java中的类和面向对象思想

    大家好,我是 Vic,今天给大家带来详细讲解Java中的类和面向对象思想的概述,希望你们喜欢

    达达前端
  • Barefoot和Stordis在欧洲领导开源网络

    德国公司Stordis在欧洲分销电信设备。但是,Stordis正在重新自己给定位,希望成为欧洲服务提供商的开源网络硬件和软件的领头羊。目前该公司与Barefoo...

    SDNLAB

扫码关注云+社区

领取腾讯云代金券