11道嵌入式笔试题,看下你会几道?

一口Linux
关注

3. ARM状态与Thumb状态的切换指令是什么?

举例说明概念 ARM状态arm处理器工作于32位指令的状态,所有指令均为32位thumb状态arm执行16位指令的状态,即16位状态切换指令 由arm状态切换到thumb状态将寄存器的最低位设置为1

BX指令:R0[0]=1,则执行BXR0指令将进入thumb状态

由thumb状态切换到ARM状态寄存器最低位设置为0

BX指令:R0[0]=0,则执行BXR0指令将进入arm状态

举例  AREA Arm_to_Thumb,CODE, READONLY
ENTRY
CODE32
start
ldr r0,=aaa+1
mov r3,#18
bx r0
CODE16
aaa
mov r1,#12
mov r2,#10
END

4. 请问ARM支持哪几种异常类型,请列出其中断向量地址。

异常源分类

要进入异常模式,一定要有异常源,ARM规定有7种异常源:

异常源描述Reset上电时执行Undef当流水线中的某个非法指令到达执行状态时执行SWI当一个软中断指令被执行完的时候执行Prefetch当一个指令被从内存中预取时,由于某种原因而失败,如果它能到达执行状态这个异常才会产生Data如果一个预取指令试图存取一个非法的内存单元,这时异常产生IRQ通常的中断FIQ快速中断

异常向量表是一段特定内存地址空间,每种ARM异常对应一个字长空间(4Bytes),正好是一条32位指令长度,当异常发生时,CPU强制将PC的值设置为当前异常对应的固定内存地址。

异常向量表:

异常向量表

跳入异常向量表操作是异常发生时,硬件自动完成的,剩下的异常处理任务完全交给了程序员。由上表可知,异常向量是一个固定的内存地址,我们可以通过向该地址处写一条跳转指令,让它跳向我们自己定义的异常处理程序的入口,就可以完成异常处理了。

正是由于异常向量表的存在,才让硬件异常处理和程序员自定义处理程序有机联系起来。异常向量表里0x00000000地址处是reset复位异常,之所以它为0地址,是因为CPU在上电时自动从0地址处加载指令,由此可见将复位异常安装在此地址处也是前后结合起来设计的,不得不感叹CPU设计师的伟大,其后面分别是其余7种异常向量,每种异常向量都占有四个字节,正好是一条指令的大小,最后一个异常是快速中断异常,将其安装在此也有它的意义,在0x0000001C地址处可以直接存放快速中断的处理程序,不用设置跳转指令,这样可以节省一个时钟周期,加快快速中断处理时间。

存储器映射地址0x00000000是为向量表保留的。在有些处理器中,向量表可以选择定位在高地址0xFFFF0000处【可以通过协处理器指令配置】,当今操作系统为了控制内存访问权限,通常会开启虚拟内存,开启了虚拟内存之后,内存的开始空间通常为内核进程空间,和页表空间,异常向量表不能再安装在0地址处了。

比如Cortex-A8系统中支持通过设置CP15的C12寄存器将异常向量表的首地址放置在任意地址。

5. 在Linux中与外设的通信是层次化的,请画出外设寻址的分层模型。

本题有点没整明白在问什么,如果分析有误,欢迎给我留言。

Linux下一切皆文件,应用程序访问外设都需要通过驱动来操作外设。

Linux下设备类型分为:字符设备、块设备、网络设备。

架构图参考下图:

此外题目问画出外设寻址的分层模型,我想可能是想问如何访问SDRAM。

如下图所示,CPU要访问SDRAM或者flash需要先通过AHB总线,然后再通过外存接口控制器对外存寻址,然后进行数据的读写。

访问外存

声明: 本文由入驻OFweek维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。
侵权投诉

下载OFweek,一手掌握高科技全行业资讯

还不是OFweek会员,马上注册
打开app,查看更多精彩资讯 >
  • 长按识别二维码
  • 进入OFweek阅读全文
长按图片进行保存