嵌入式知识积累2_ARM

1.ARM微处理器共有______个______位寄存器,其中______个为通用寄存器,______个为状态寄存器。

答案:37、32、31、6

2.ARM体系结构可用两种方法存储字数据,具体为_____、______。

答案:大端格式和小端格式

3.协处理器主要控制:______、______、______。

答案:片内的MMU、指令和数据缓存(IDC)、写缓冲(Write Buffer)

4.简单描述ARM内核的四个功能模块,各自具备什么功能特点?

答:ARM内核有四个功能模块T、D、M、I,可供生产厂商根据不同用户的要求来配置生产ARM芯片。
其中T功能模块表示16位Thumb,可以在兼顾性能的同时减少代码尺寸。
M功能模块表示8位乘法器。
D功能模块表示Debug,该内核中放置了用于调试的结构,通常它为一个边界扫描链JTAG,可使CPU进入调试模式,从而可方便地进行断点设置、单步调试。
I功能模块表示EmbeddedICE Logic,用于实现断点观测及变量观测的逻辑电路部分,其中的TAP控制器可接入到边界扫描链。

5.通用寄存器包括R0~R15,可以分为具体哪三类?

答:通用寄存器包括R0~R15,可以分为三类:
(1)未分组寄存器R0~R7;
(2)分组寄存器R8~R14;
(3)程序计数器PC(R15)。

6.请描述Thumb状态下的寄存器与ARM状态下的寄存器有什么关系?

答:Thumb状态下的寄存器与ARM状态下的寄存器有如下关系:

(1)Thumb状态下和ARM状态下的R0~R7是相同的。

(2)Thumb状态下和ARM状态下的CPSR和所有的SPSR是相同的。

(3)Thumb状态下的SP对应于ARM状态下的R13。

(4)Thumb状态下的LR对应于ARM状态下的R14。

(5)Thumb状态下的程序计数器对应于ARM状态下的R15。

7.当一个异常出现以后,ARM微处理器会执行哪几步操作?

答:当一个异常出现以后,ARM微处理器会执行以下几步操作。

(1)将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。若异常是从ARM状态进入,则LR寄存器中保存的是下一条指令的地址(当前PC+4或PC+8,与异常的类型有关);若异常是从Thumb状态进入,则在LR寄存器中保存当前PC的偏移量,这样,异常处理程序就不需要确定异常是从何种状态进入的。例如:在软件中断异常SWI,指令 MOV PC,R14_svc总是返回到下一条指令,不管SWI是在ARM状态执行,还是在Thumb状态执行。

(2)将CPSR复制到相应的SPSR中。

(3)根据异常类型,强制设置CPSR的运行模式位。

(4)强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。

8.ARM处理器有9种基本寻址方式,分别是:______、______、______、______、______、______、______、______、______。

答案:寄存器寻址、立即寻址、寄存器偏移寻址、寄存器间接寻址、基址寻址、多寄存器寻址、堆栈寻址、块拷贝寻址、相对寻址

9.FIQ比IRQ快的原因:

A、FIQ模式的R8–R14寄存器是独有的,FIQ处理程序可以不必执行保存和恢复中断现场的指令。

B、FIQ可以将ISR直接放在FIQ后面的地址空间,不需要跳转。

10.中断与异常有何区别

异常 在处理的时候必须考虑与处理器的时钟同步,实际上异常也称为同步中断,在处理器执行到因编译错误而导致的错误指令时,或者在执行期间出现特殊错误,必须靠内核处理的时候,处理器就会产生一个异常;

所谓中断 是指外部硬件产生的一个电信号从CPU的中断引脚进入,打断CPU的运行。所谓异常是指软件运行过程中发生了一些必须作出处理的事件,CPU自动产生一个陷入来打断CPU的运行。

11.在ARM系统中,在函数调用的时候,参数是通过哪种方式传递的

当参数小于等于4的时候是通过r0-r3寄存器来进行传递的,当参数大于4的时候是通过压栈的方式进行传递

12.CPU和总线的关系

1、 地址总线的位数决定CPU寻址范围; 数据总线的位数决定CPU单次通信能交换的信息数量。
2、CPU的位数指的是数据总线的位数;32位CPU寻址的范围是4G,所以最多支持4G内存。

13.S5PV210启动过程

在这里插入图片描述
210的启动过程大致是:
第一步:CPU上电后先从内部IROM中读取预先设置的代码(BL0),执行。这一段IROM代码首先做了一些基本的初始化(CPU时钟、关看门狗···);然后这一段代码会判断我们选择的启动模式,从相应的外部存储器去读取第一部分启动代码(BL1,大小为16KB)到内部SRAM。
第二步:从IRAM去运行刚上一步读取来的BL1(16KB),然后执行。BL1负责初始化NandFlash,然后将BL2读取到IRAM(剩余的80KB)然后运行
第三步:从IRAM运行BL2,BL2初始化DRAM,然后将OS读取到DRAM中,然后启动OS,启动过程结束。

14.BL0 做了什么?

在这里插入图片描述
在这里插入图片描述

15.ARM的异常处理机制

在这里插入图片描述

16.指令和伪指令的区别

(1)(汇编)指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以由CPU读取执行。
(2)(汇编)伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码。

17.ARM汇编特点

(1)LDR/STR架构:CPU本身不能直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器中才能被CPU处理。ldr/str组合用来实现 ARM CPU和内存数据交换。
ldr(load register)指令将内存内容加载入通用寄存器。
str(store register)指令将寄存器内容存入内存空间中。

(2)八种寻址方式
寄存器寻址 mov r1, r2
立即寻址 mov r0, #0xFF00
寄存器移位寻址 mov r0, r1, lsl #3
寄存器间接寻址 ldr r1, [r2]
基址变址寻址 ldr r1, [r2, #4]
多寄存器寻址 ldmia r1!, {r2-r7, r12}
堆栈寻址 stmfd sp!, {r2-r7, lr}
相对寻址 beq flag
flag:

(3)多级指令流水线
在这里插入图片描述

17.lar指令和ldr伪指令

        (1)
		ldr指令: ldr  r0, #0xff
	    ldr非指令: ldr r0, =0xff
	    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200323150334335.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjY1Njg4OQ==,size_16,color_FFFFFF,t_70)
	    (2)adr和ldr
	 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200323150412292.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjY1Njg4OQ==,size_16,color_FFFFFF,t_70)

18.环境变量如何参与程序运行

(1)环境变量有2份,一份在Flash中,另一份在DDR中。uboot开机时一次性从Flash中读取全部环境变量到DDR中作为环境变量的初始化值,然后使用过程中都是用DDR中这一份,用户可以用saveenv指令将DDR中的环境变量重新写入Flash中去更新Flash中环境变量。下次开机时又会从Flash中再读一次。
(2)环境变量在uboot中是用字符串表示的,也就是说uboot是按照字符匹配的方式来区分各个环境变量的。因此用的时候一定要注意不要打错字了。

19.uboot可移植性的实现原理:

在uboot中有很多彼此平行的代码,各自属于各自不同的架构/CPU/开发板,我们在具体到一个开发板的编译时用符号连接的方式提供一个具体的名字的文件夹供编译时使用。这样就可以在配置的过程中通过不同的配置使用不同的文件,就可以正确的包含正确的文件。

为什么要创建符号链接?这些符号链接文件的存在就是整个配置过程的核心,这些符号链接文件(文件夹)的主要作用是给头文件包含等过程提供指向性连接。根本目的是让uboot具有可移植性。

20.uboot为什么不能在windows的共享文件夹下配置编译?

因为windows中没有符号链接。如果我要把uboot移植到mips架构下,则start.S源代码中所有的头文件包含全部要修改。我们用了符号链接之后,则start.S中源代码不用改,只需要在具体的硬件移植时配置不同,创建的符号链接指向的不同,则可以具有可移植性。

21.lowlevel_init.S做的事情

(1)检查CPU复位状态: 判断哪种复位的意义在于:冷上电时DDR是需要初始化才能用的;而热启动或者低功耗状态下的复位则不需要再次初始化DDR。
(2)IO状态恢复
(3)关看门狗
(4)一些SRAM SROM相关GPIO设置
(5)供电锁存
注:以上为不重要,仅关闭看门狗和供电锁存比较重要
———————————————————————————————————————————
(6)判定当前代码执行的位置在SRAM中还是在DDR中。
ldr r0, =0xff000fff
bic r1, pc, r0 /* r0 <- current base addr of code /
ldr r2, _TEXT_BASE /
r1 <- original base addr in ram /
bic r2, r2, r0 /
r0 <- current base addr of code /
cmp r1, r2 /
compare r0, r1 /
beq 1f /
r0 == r1 then skip sdram init
为什么要做这个判定?原因1:BL1(uboot的前一部分)在SRAM中有一份,在DDR中也有一份,因此如果是冷启动那么当前代码应该是在SRAM中运行的BL1,如果是低功耗状态的复位这时候应该就是在DDR中运行的。原因2:我们判定当前运行代码的地址是有用的,可以指导后面代码的运行。譬如在lowlevel_init.S中判定当前代码的运行地址,就是为了确定要不要执行时钟初始化和初始化DDR的代码。如果当前代码是在SRAM中,说明冷启动,那么时钟和DDR都需要初始化;如果当前代码是在DDR中,那么说明是热启动则时钟和DDR都不用再次初始化。
(7)初始化串口
初始化完了后通过串口发送了一个’O’
(8)tzpc初始化
(9)pop {pc}以返回
返回前通过串口打印’K’
————————————————————————————————————————————
总结回顾:lowlevel_init.S中总共做了哪些事情:
检查复位状态、IO恢复、关看门狗、开发板供电锁存、时钟初始化、DDR初始化、串口初始化并打印’O’、tzpc初始化、打印’K’。
其中值得关注的:关看门狗、开发板供电锁存、时钟初始化、DDR初始化、打印"OK"

22.MMU单元的作用

(1)MMU就是memory management unit,内存管理单元。MMU实际上是SOC中一个硬件单元,它的主要功能就是实现虚拟地址到物理地址的映射。
(2)MMU单片在CP15协处理器中进行控制,也就是说要操控MMU进行虚拟地址映射,方法就是对cp15协处理器的寄存器进行编程。

23.uboot的第一阶段做了哪些工作

(1)构建异常向量表
(2)设置CPU为SVC模式
(3)关看门狗
(4)开发板供电置锁
(5)时钟初始化
(6)DDR初始化
(7)串口初始化并打印"OK"
(8)重定位
(9)建立映射表并开启MMU
(10)跳转到第二阶段
——————————————————————————————————————————
请问uboot启动过程都做了些什么?
答:
1、cpu刚开始初始化的时候,还未设置栈,所以先使用汇编代码,构建异常项链表,然后设置cpu为svc(特权)模式,同时关闭FIQ和IRQ(防止突发中断程序跑飞了)
注:在跳转到内核之前,要满足CPU出在SVC模式下。
2、关闭MMU和cache。
3、第一次设置栈,进入到板级初始化阶段lowlevel_init.S,关看门狗、开发板供电锁存、时钟初始化、DDR初始化、打印"OK"。
4、接下来第二次设置栈,

(目的:DDR已经初始化了,已经有大片内存可以用了,没必要再把栈放在SRAM中可怜兮兮的了;原来SRAM中内存大小空间有限,栈放在那里要注意不能使用过多的栈否则栈会溢出,我们及时将栈迁移到DDR中也是为了尽可能避免栈使用时候的小心翼翼。)
进行重定位,把uboot搬运到ddr中。
建立映射表并开启MMU。
5、第三次设置栈,(这次设置栈还是在DDR中,之前虽然已经在DDR中设置过一次栈了,但本次设置的目的是将栈放在比较合适(安全,紧凑而不浪费内存)的地方。我们实际将栈设置在uboot起始地址上方2MB处,这样安全的栈空间是:2MB-uboot大小-0x1000=1.8MB左右。这个空间既没有太浪费内存,又足够安全。)
在这里插入图片描述
清理bss,并加载_start_armboot,进入uboot启动第二阶段。
—————————————————————————————————

为c语言准备运行环境,调用board_init_f,填充gd结构体。
6、对代码重定位,搬运到内存中去,搬运之后,跳转到内存中去执行board_init_r,这里就可以开启cache了,当然也可以不开启。然后初始化其他设备。比如flash、网卡、emmc等。初始化完之后,在执行main_loop

24.uboot启动2阶段总结

1、启动流程回顾、重点函数标出

(1)第二阶段主要是对开发板级别的硬件、软件数据结构进行初始化。
(2)
init_sequence
cpu_init 空的
board_init 网卡、机器码、内存传参地址
dm9000_pre_init 网卡
gd->bd->bi_arch_number 机器码
gd->bd->bi_boot_params 内存传参地址
interrupt_init 定时器
env_init
init_baudrate gd数据结构中波特率
serial_init 空的
console_init_f 空的
display_banner 打印启动信息
print_cpuinfo 打印CPU时钟设置信息
checkboard 检验开发板名字
dram_init gd数据结构中DDR信息
display_dram_config 打印DDR配置信息表
mem_malloc_init 初始化uboot自己维护的堆管理器的内存
mmc_initialize inand/SD卡的SoC控制器和卡的初始化
env_relocate 环境变量重定位
gd->bd->bi_ip_addr gd数据结构赋值
gd->bd->bi_enetaddr gd数据结构赋值
devices_init 空的
jumptable_init 不用关注的
console_init_r 真正的控制台初始化
enable_interrupts 空的
loadaddr、bootfile 环境变量读出初始化全局变量
board_late_init 空的
eth_initialize 空的
x210_preboot_init LCD初始化和显示logo
check_menu_update_from_sd 检查自动更新
main_loop 主循环

2、启动过程特征总结

(1)第一阶段为汇编阶段、第二阶段为C阶段
(2)第一阶段在SRAM中、第二阶段在DRAM中
(3)第一阶段注重SoC内部、第二阶段注重SoC外部Board内部

25.一般执行一个系统镜像步骤都是:

第一步先读取头信息,然后在头信息的特定地址找MAGIC_NUM,由此来确定镜像种类;第二步对镜像进行校验;第三步再次读取头信息,由特定地址知道这个镜像的各种信息(镜像长度、镜像种类、入口地址);第四步就去entrypoint处开始执行镜像。

26.子程序返回调用程序的指令

MOV PC,LR

27.异常向量表及对应地址

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值