1.国内嵌⼊式系统⾏业对嵌⼊式系统的定义是什么?如何理解
答:以应⽤为中⼼、以计算机技术为基础、软件硬件可裁剪、适应应⽤系统对功能、可靠性、成本、体积、功耗严格要求的专⽤计算机系统。
从这个定义看以看出嵌⼊式系统是与应⽤紧密结合的,它具有很强的专⽤性,必须结合实际系统要求进⾏合理的裁剪利⽤。因此有⼈把嵌⼊式系统⽐作是⼀个针对特定的应⽤⽽量⾝定做的专⽤计算机系统。2.当前最常见的源码开放的嵌⼊式操作系统有哪些,请举出两例,并分析其特点答:嵌⼊式linux和嵌⼊式实时操作系统uc/os-IILinux:
(1)linux是源码开放的,每⼀个技术细节都是透明的,易于裁剪定制。
(2)⽬前嵌⼊式linux已经在多种嵌⼊式处理器芯⽚移植成功,有⼤量且不断增加的开发⼯具,这些⼯具为嵌⼊式系统开发提供了良好的开发环境。
(3)Linux内核⼩、功能强⼤、运作稳定、效率⾼。Ucos:
(1)源代码公开(2)可移植性。(3)可固化(4)可裁剪(5)占先式(6)多任务(7)可确定性。(8)系统服务
第2章ARM技术与ARM体系结构
3.arm处理器的⼯作模式有哪⼏种,其中哪些为模式,哪些为异常模式,并指出处理器在什么情况下进⼊相应的模式。答:ARM 处理器共有7 种⼯作模式:
⽤户模式:⾮模式,也就是正常程序执⾏的模式,⼤部分任务在这种模式下执⾏。在⽤户模式下,如果没异常发⽣,不允许应⽤程序⾃⾏改变处理器的⼯作模式,如果有异常发⽣,处理器会⾃动切换⼯作模式
FIQ 模式:也称为快速中断模式,⽀持⾼速数据传输和通道处理,当⼀个⾼优先级(fast)中断产⽣时将会进⼊这种模式。
IRQ 模式:也称为普通中断模式,:当⼀个低优先级中断产⽣时将会进⼊这种模式。在这模式下按中断的处理器⽅式⼜分为向量中断和⾮向量中断两种。通常的中断处理都在IRQ 模式下进⾏。
SVC 模式:称之为管理模式,它是⼀种操作系统保护模式。当复位或软中断指令执⾏时处理器将进⼊这种模式。
中⽌模式:当存取异常时将会进⼊这种模式,⽤来处理存储器故障、实现虚拟存储或存储保护。
未定义指令异常模式:当执⾏未定义指令时会进⼊这种模式,主要是⽤来处理未定义的指令陷阱,⽀持硬件协处理器的软件仿真,因为未定义指令多发⽣在对协处理器的操作上。
系统模式:使⽤和User 模式相同寄存器组的模式,⽤来运⾏级的操作系统任务。
在这7 种⼯作模式中,除了⽤户模式以外,其他6 种处理器模式可以称为
模式,在这些模式下,程序可以访问所有的系统资源,也可以任意地进⾏处理器模式的切换。在这6 种模式中,除了系统模式外的其他5 种模式⼜称为异常模式
4.分析程序状态寄存器(PSR)各位的功能描述,并说明C、Z、N、V 在什么情况下进⾏置位和清零。答:PSR 的具体格式为
V—溢出标志位
对于加/减法运算指令,当操作数和运算结果为⼆进制补码表⽰的带符号数时,V=1 表⽰符号位溢出,其他的指令通常不影响V 位。
C—进位或借位标志位
对于加法指令(包括⽐较指令CMN),结果产⽣进位,则C=1,表⽰⽆符号数运算发⽣上溢出,其他情况下C=0;在减法指令中(包括⽐较指令CMP),结果产⽣借位,则C=0,表⽰⽆符号数运算发⽣下溢出,其他情况下C=1;对于包含移位操作的⾮加/减法运算指令,C 中包含最后⼀次溢出位的数值;对于其他⾮加/减法运算指令,C 位的值通常不受影响。Z—结果为0 标志位
Z=1 表⽰运算结果是0,Z=0 表⽰运算结果不是零;对于CMP 指令,Z=1 表⽰进⾏⽐较的两个数⼤⼩相等。N—符号标志位
本位设置成当前指令运算结果的bit[31]的值。当两个补码表⽰有符号整数运算时,N=1 表⽰运算的结果为负数,N=0 表⽰结果为正数或零。
5.简述ARM 处理器异常处理和程序返回的过程。答:ARM 在异常产⽣时会进⾏以下操作:
(1)将引起异常指令的下⼀条指令地址保存到新的异常模式的LR 中,使异常处理程序执⾏完后能根据LR 中的值正确返回;(2)将CPSR 的内容复制到新的异常模式下的SPSR 中;
(3)根据异常类型将CPSR 模式控制位强制设定为发⽣异常所对应的模式值;(4)强制PC 指向相应的异常向量地址。ARM 在异常返回时
(1)从 SPSR_恢复CPSR;(2)从LR_恢复PC 。
6.ARM 处理器字数据的存储格式有哪两种?并指出这两种格式的区别。答:
(1)⼩端存储格式(Little-Endian)
在⼩端存储格式中,对于地址为A 的字单元,其中字节单元由低位到⾼位字节地址顺序为A,A+1,A+2,A+3;对于地址为A 的半字单元,其中字节单元由低位到⾼位字节地址顺序为A,A+1;(2)⼤端存储格式(Big-Endian)
在⼤端存储格式中,对于地址为A 的字单元,其中字节单元由⾼位到低位字节地址顺序为A,A+1,A+2,A+3;对于地址为A 的半字单元,其中字节单元由⾼位到低位字节地址顺序为A,A+1。第3章 ARM指令集寻址⽅式
3.在ARM 指令中,什么是合法的⽴即数?判断下⾯各⽴即数是否合法,如果合法则写出在指令中的编码格式(也就是8 位常数和4 位的移位数)。0x5430 0x108 0x304 0x501
0xFB10000 0x334000 0x3FC000 0x1FE00000x5580000 0x7F800 0x39C000 0x1FE80000答:计算步骤:
(1)⼗六进制⽴即数两端0去掉(2)展成⼆进制
(3)连续偶数个0去掉,数字中间0不去掉
(4)剩下数字位数⼩于等于8可以,反之,不可以。
5.ARM 数据处理指令具体的寻址⽅式有哪些,如果程序计数器PC 作为⽬标寄存器,会产⽣什么结果?答:ARM数据处理指令寻址⽅式有5种1)第⼆操作数为⽴即数2)第⼆操作数为寄存器
3)第⼆操作数为寄存器移位⽅式,且移位的位数为⼀个5位的⽴即数4)第⼆操作数为寄存器移位⽅式,且移位数值放在寄存器中5)第⼆操作数为寄存器进⾏RRX移位得到
如果程序计数器PC作为⽬标寄存器,会发⽣程序跳转。
6.在Load/Store 指令寻址中,字、⽆符号字节的Load/Store 指令寻址和半字、有符号字节寻址,试分析它们之间的差别。答:字、⽆符号字节寻址:
1)Addressing_mode中的偏移量为⽴即数
2)Addressing_mode中的偏移量为寄存器的值3)Addressing_mode中的偏移量通过寄存器移位得到半字、有符号字节寻址:
1)Addressing_mode中的偏移量为⽴即数2)Addressing_mode中的偏移量为寄存器的值
从以上分析看出:差别就在于后者没有第三项寻址⽅式。
7.块拷贝Load/Store 指令在实现寄存器组和连续的内存单元中数据传递时,地址的变化⽅式有哪⼏种类型,并分析它们的地址变化情况。
答:批量Load/Store 指令在实现寄存器组和连续的内存单元中数据传递时,地址的变化⽅式(addr_mode)有以下4 种类型:后增IA (Increment After) :每次数据传送后地址加4;先增IB (Increment Before) :每次数据传送前地址加4 ;后减DA (Decrement After) :每次数据传送后地址减4 ;先减DB (Decrement Before) :每次数据传送前地址减4 。
8.栈操作指令地址的变化⽅式有哪⼏种类型,并分析它们的地址变化情况,从⽽得出栈操作指令寻址和块拷贝Load/Store 指令之间的对应关系。答:
(1) 四种类型的堆栈⼯作⽅式,即:
满递增堆栈FA(Empty Ascending):堆栈指针指向最后压⼊的数据,且由低地址向⾼地址⽣成。
满递减堆栈FD(Full Descending):堆栈指针指向最后压⼊的数据,且由⾼地址向低地址⽣成。
空递增堆栈EA(Full Ascending):堆栈指针指向下⼀个将要放⼊数据的空位置,且由低地址向⾼地址⽣成。
空递减堆栈ED(Empty Descending):堆栈指针指向下⼀个将要放⼊数据的空位置,且由⾼地址向低地址⽣成。
(2) 栈操作指令寻址和块拷贝Load/Store 指令之间的对应关系见表3-10。第4章 ARM指令集系统
4. 分析下列每条语句的功能,并确定程序段所实现的操作。CMP R0,#0MOVEQ R1,#0MOVGT R1,#1答:分析:
当R0 等于0 时,MOVEQ 执⾏,则R1 等于0;当R0 等于正数时,MOVGT 执⾏,则R1 等于1;此功能码段可以判别R0 中的值为正数还是0。
5. 请使⽤多种⽅法实现将字数据0xFFFFFFFF 送⼊寄存器R0。
答:
例如,MVN R0,#0或者:MOV R0,#0SUB R0,R0,#1
还可以⽤其它运算指令来实现,读者⾃⾏写出。9. 写出下列ARM 指令所实现操作:LDR R2,[R3,#-4] !LDR R0,[R0],R2
LDR R1,[R3,R2,LSL#2]!;LDRSB R0,[R2,#-2]!STRB R1,[R2,#0xA0]LDMIA R0,{R1,R2,R8}
SB R0!,{R1-R5,R10,R11}解答:
LDR R2,[R3,#-4]!
将存储器地址为R3-4 的字数据读⼊R2,并将地址R3-4 写⼊R3LDR R0,[R0],R2
将存储器地址为R0 的字数据读⼊R0,并将地址R0+R2 写⼊R0LDR R1,[R3,R2,LSL#2]!
将存储器地址为R3+R2*4 的字数据读⼊R1,并将地址R3+R2*4 写⼊R3LDRSB R0,[R2,#-2]!
将存储器地址为R2-2 的字节数据读⼊R0 的低8 位,将R0 的⾼24 位⽤符号位扩展,并将地址R2-2 写⼊R2STRB R1,[R2,#0xA0]
将R0 的低8 位存⼊存储器地址为R2+0xA0 字节中LDMIA R0,{R1,R2,R8}
将内存单元R0 所指向的地址单元以字为单位递减⽅式读取到R1,R2,R8 中,低地址编号的字数据内存单元对应低编号寄存器SB R0! {R1-R5,R10,R11}
将R1-R5,R10,R11 存储到以R0 为起始地址的递减内存中,最终R0 指向存放R11的地址单元
10. SWP 指令的优势是什么?答:
ARM 指令⽀持原⼦操作,主要是⽤来对信号量的操作,因为信号量操作的要求
是作原⼦操作,即在⼀条指令中完成信号量的读取和修改操作。SWP 数据交换指令就能完成此功能,能在⼀条指令中实现存储器和寄存器之间交换数据。11. 如何⽤带PSR 操作的批量字数据加载指令实现IRQ 中断的返回?
答:在进⼊IRQ中断处理⼦程序时,⾸先计算返回的地址,并保存相关的寄存器SUB R14,R14,#4STMFD R13!,{R0-R3,R12,LR}
如果IRQ中断处理程序返回到被中断的进程则执⾏下⾯的指令。该指令从数据栈中恢复R0-R3及R12的值,将返回地址传送到PC中,并将SPSR_irq值复制到CPSR中LDMFD R13!,{R0-R3,R12,PC}^
12. ⽤ARM 汇编语⾔编写代码,实现将ARM 处理器切换到⽤户模式,并关闭中断。.equ User_Mode, 0x10.equ Mode_Mask 0x1F.equ NOINT, 0xC0
MRS R0, CPSR @读CPSRBIC R0, R0, #Mode_Mask
ORR R1, R0, #User_Mode | NOINT @修改MSR CPSR_cxsf, R1 @进⼊⽤户模式第6章 ARM汇编伪指令与伪操作
1.在ARM汇编语⾔程序设计中,伪操作与伪指令的区别是什么?答:
伪指令是ARM处理器⽀持的汇编语⾔程序⾥的特殊助记符,它不在处理器运⾏期间由机器执⾏,只是在汇编时被合适的机器指令代替成ARM或Thumb指令,从⽽实现真正的指令操作。伪操作是ARM汇编语⾔程序⾥的⼀些特殊的指令助记符,其作⽤主要是为完成汇编程序做各种准备⼯作,对源程序进⾏汇编程序处理,⽽不是在计算机运⾏期间由处理器执⾏。也就是说,这些伪操作只是在汇编过程中起作⽤,⼀旦汇编结束,伪操作也就随之消失。
2.分析ARM汇编语⾔伪指令LDR、ADRL、ADR的汇编结果,说明它们之间的区别。答:
LDR是⼤范围地址读取伪指令。LDR将⼀个32位的常数或者⼀个地址值读取到寄存器中,可以看作是加载寄存器的内容。ADRL是中等范围地址读取伪指令。它将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。ADR是⼩范围地址读取伪指令,它将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。从以上分析可以看出:LDR不依赖于PC值,加载的数据是绝对值。ADRL和ADR依赖于PC值,加载的数据是基于PC相对偏移值第 7 章汇编语⾔程序设计
4.在GNU环境下⽤ARM汇编语⾔编写程序初始化各ARM处理器各模式下的堆栈指针SP_mode (R13),各模式的堆栈地址如下:
.equ _ISR_STARTADDRESS,0xcFFF000.equ UserStack, _ISR_STARTADDRESS.equ SVCStack, _ISR_STARTADDRESS+.equ UndefStack, _ISR_STARTADDRESS +*2
.equ AbortStack, _ISR_STARTADDRESS +*3.equ IRQStack, _ISR_STARTADDRESS +*4.equ FIQStack, _ISR_STARTADDRESS +*5//--------------------------⽰例程序----------------------------------代码为平常⾃⼰写的,上机调试成功!与题⽬有点不⼀样,变量名和数值得改⼀改//--------------------------------------------------------------------.equ ISR_STARTADDRESS,0x40008000
.equ svc_stack_top, ISR_STARTADDRESS /*0x40008000*/ .equ user_stack_top, ISR_STARTADDRESS-512/*0x40007E00*/ .equ undefstack_top, ISR_STARTADDRESS-512*2 /*0x40007C00*/ .equ abortstack_top,
ISR_STARTADDRESS-512*3 /*0x40007A00*/ .equ isrstack_top, ISR_STARTADDRESS-512*4 /*0x40007800*/ .equfiqstack_top, ISR_STARTADDRESS-512*5 /*0x40007600*/.equ user_mode, 0x10.equ fiq_mode, 0x11.equ irq_mode, 0x12.equ svc_mode, 0x13.equ abt_mode, 0x17.equ udf_mode, 0x1c.equ sys_mode, 0x1f.global _start.text
_start: b reset_handlerb undifned_handlerb svc_handlerb prefetch_handlerb abort_handlerb .
b irq_handlerb fiq_handlerreset_handler:
ldr sp,=svc_stack_top /*svc_stack */mrs r0,cpsrbic r0,r0,#0x1forr r0,r0,#udf_modemsr cpsr_c,r0
ldr sp,=undefstack_top /*undefstack */mrs r0,cpsrbic r0,r0,#0x1f
orr r0,r0,#abt_modemsr cpsr_c,r0
ldr sp,=abortstack_top /*abortstack */mrs r0,cpsrbic r0,r0,#0x1forr r0,r0,#irq_modemsr cpsr_c,r0
ldr sp,=isrstack_top /*isrstack*/mrs r0,cpsrbic r0,r0,#0x1forr r0,r0,#fiq_modemsr cpsr_c,r0
ldr sp,=fiqstack_top /*fiqstack*/mrs r0,cpsrbic r0,r0,#0x1forr r0,r0,#user_modemsr cpsr_c,r0
ldr sp,=user_stack_top /*user_stack*/stop:b .
undifned_handler: b .svc_handler:stmfd sp!,{r0-r12,lr}ldr r0,[lr,#-4]
bic r0,r0,#0xff000000ldmfd sp!,{r0-r12,pc}^prefetch_handler: b .abort_handler: b .irq_handler: b .fiq_handler: b ..end
//另外有第5题和第7题,没时间写,可是⽼师也划题了。第8章嵌⼊式C编程规范
3.volatile符在程序中起到什么作⽤,请举例说明。答:volatile符起到抑制编译器优化的作⽤。
例如:中断服务程序中修改的供其他程序检测的变量的问题。Static char flg=0;main(void){…While(1){if(flg){
…程序代码A}else{
…程序代码B}}}
//中断服务程序Void ISR_INT(void){flg=1;}
在这个程序中,由于在程序执⾏的⼤部分时间内,flg的值并没有变化,编译器会优化程序,flg=0。优化后的程序为:Static char flg=0;main(void){…while(1){
…程序代码B}}
解决问题的⽅法:将声明语句 static char flg=0;改为volatile static char flg=03.请分析下列程序代码的执⾏结果
#includemain(){
int value=0xff1;int *p1,**p2,***p3,****p4;p1=&value;p2=&p1;p3=&p2;p4=&p3;
printf(“****p4=%x\\n”,****p4);}
程序执⾏结果:*****p4=oxff1;
5.分析宏定义#define POWER(x) x*x 是否合理,举例说明。如果不合理,应如何更改?答:不合理。x=i+j;
POWER(x)=i+j*i+j;⽽不是(i+j)*(i+j)更改:
#define POWER(x) ((x)*(x))
7.何为可重⼊函数?如果使程序具有可重⼊性,在程序设计中应注意哪些问题?
答:如果某个函数可以被多个任务并发使⽤,⽽不会造成数据错误,我们就说这个函数具有可重⼊性,相应的这个函数就可以成为可重⼊函数。
可重⼊函数可以使⽤局部变量,也可以使⽤全局变量。如果使⽤全局变量,则应通过关中断、信号量(P、V操作)等⼿段对其加以保护,若不加以保护,则此函数就不具有可重⼊性,即当多个进程调⽤此函数时,很有可能使得此全局变量变为不可知状态。
9.ATPCS与AAPCS的全称是什么,它们有什么差别?掌握⼦程序调⽤过程中寄存器的使⽤规则、数据栈的使⽤规则及参数的传递规则,在具体的函数中能够熟练应⽤。
答:过程调⽤标准ATPCS(ARM-Thumb Produce Call Standard)规定了⼦程序间相互调⽤的基本规则,ATPCS规定⼦程序调⽤过程中寄存器的使⽤规则、数据栈的使⽤规则及参数的传递规则。这些规则为嵌⼊式C语⾔程序和汇编程序之间相互调⽤提供了依据。
2007年,ARM公司推出了新的过程调⽤标准AAPCS(ARM Architecture Produce Call Standard),它只是改进了原有的ATPCS的⼆进制代码的兼容性。⽬前,这两个标准都在被使⽤。第9章 S3C2410硬件结构与关键技术分析第10章 S3C2410通信与LCD接⼝技术//S3C2410的启动初始化程序这个⼀定要会的!
《《《《《《------嵌⼊式linux标准开发教程-------》》》》》//这应该是考点吧第1章linux 快速⼊门1.3 linux⽂件及⽂件系统
⽂件类型、⽂件属性、⽂件系统、linux⽬录结构第2章 linux基础指令
//基本指令太多了,考哪些不好说啊,会的越多越好吧2.2linux启动过程详解第3章 linux下C编程基础3.3 GCC编译器的使⽤3.5 Make⼯程管理器
//答案有的来⾃pdf有的为⾃⼰所写,仅供参考.
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- vipyiyao.com 版权所有 湘ICP备2023022495号-8
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务