立即进入循环。
[每空2分]
解析:
隐式类型转换规则:
C语言自动转换不同类型的行为称之为隐式类型转换,转换的基本原则是:
低精度类型向高精度类型转换,具体是:
int->unsignedint->long->unsignedlong->longlong->unsignedlonglong->float->double->longdouble
注意,上面的顺序并不一定适用于你的机器,比如当int和long具有相同字长时,unsignedint的精度就会比long的精度高(事实上大多数针对32机的编译器都是如此)。
另外需要注意的一点是并没有将char和short型写入上式,原因是他们可以被提升到int也可能被提升到unsignedint。
提升数据的精度通常是一个平滑无损害的过程,但是降低数据的精度可能导致真正的问题。
原因很简单:
一个较低精度的类型可能不够大,不能存放一个具有更高精度的完整的数据。
一个1字节的char变量可以存放整数101但不能存放整数12345。
当把浮点类型数据转换为整数类型时,他们被趋零截尾或舍入。
强制类型转换:
通常我们应该避免自动类型转换,当我们需要手动指定一个准确的数据类型时,我们可以用强制类型转换机制来达到我们的目的,使用方法很简单,在需要强制转换类型的变量或常量前面加上(type),例如(double)i;即把变量i强制转换成double型。
4.一个计划跑LINUX系统的ARM系统把bootloader烧录进去后,上电后串口上没有任何输出,硬件和软件各应该去检查什么?
提示:
1.跑LINUX的系统一般都需要外扩DRAM,一般的系统也经常有NOR或NANDFLASH
2.bootloader一般是由汇编和C编写的裸奔程序[5分]
参考答案:
单片机系统:
硬件上:
1.确认电源电压是否正常。
用电压表测量接地引脚跟电源引脚之间的电压,看是否是电源电压,例如常用的5V。
2.检查复位引脚电压是否正常。
分别测量按下复位按钮和放开复位按钮的电压值,看是否正确。
3.检查晶振是否起振了,一般用示波器来看晶振引脚的波形,另一个办法是测量复位状态下的IO口电平,按住复位键不放,然后测量IO口(没接外部上拉的IO口除外)的电压,看是否是高电平,如果不是高电平,则多半是因为晶振没有起振。
4.检查基本的外扩设备(这里主要是DRAM,特别是DDR/DDR2/DDR3)的pcblayout的走线是否符合要求
软件上:
如果软件代码中:
1.检查CPU和DRAM是否正确初始化(CPU的初始化包括一些典型步骤如:
关闭看门狗,关键FIQ,IRQ中断,关闭MMU和CACHE,调整CPU的频率)
2.检查堆栈指针是否正确设置了
2.若如NANDFLASH做系统启动部分,则需注意一般需要的从NANDFLASH中拷贝代码到DRAM中的步骤是否能正常完成
5.列举最少3种你所知道的嵌入式的体系结构,并请说明什么是ARM体系结构。
[7分]
参考答案:
嵌入式的体系结构包括ARM,MIPS,POWERPC,X86,AVR32,SH等
这个没有非常标准的答案,但由经常面试的时候会问到,关于什么是ARM体系结构主要请参考讲义的ARM相关章节去总结,下面是我的总结,仅供参考:
什么是ARM体系结构?
答:
首先,ARM体系结构是ARM公司设计,并授权其合作伙伴生产的占嵌入式市场份额最大的一种RISC(精简指令集)的CPU,它具有高性能、低功耗、低成本的特点。
ARM体系结构从工作模式、工作状态,指令集几个方面简述以下ARM:
ARM体系支持7种工作模式,包括系统(Sys)、未定义指令(und)、数据存取异常(abt)、 管理(SVC)、中断(IRQ)、快速中断(FIQ)、用户模式(usr).其中,除了用户模式以外的其它模式,我们称之为特权模式.它们之间的区别在于有些操作只能在特权模式下才被允许,如直接改变模式和中断使能等. 除了用户模式和系统模式以外的其它5种模式,我们又称之为异常模式。
当特定的异常出现的时候,程序就会进入到相应的异常模式中。
备注:
在LINUX系统中, Linux的应用程序工作在usr模式,而内核在正常情况下工作在svc模式,当中断或异常时工作在异常模式
ARM体系结构中CPU有2种工作状态,thumb(指令为16位)和ARM状态(指令为32位),相对寄存器不多,总共37个,它包括通用寄存器r0~r12(FIQ有自己的r8 ~r12),栈指针寄存器SP(r13),链接寄存器lr(r14),PC指针寄存器PC(r15),程序状态寄存器CPSR和保存程序状态寄存器SPSR,在上面提到几种异常中,用户(usr)和系统模式(sys)使用相同寄存器, 而其他异常模式有自己独立的SP,LR,SPSR寄存器。
当异常产生时,硬件上(ARMcore)会完成以下动作:
拷贝CPSR到SPSR_
设置适当的CPSR位:
改变处理器状态进入ARM态
改变处理器模式进入相应的异常模式
设置中断禁止位禁止相应中断(如果需要)}保存返回地址到LR_
设置PC为相应的异常向量
返回时,软件的异常处理程序需要:
从SPSR_恢复CPSR
从LR_恢复PC
Note:
这些操作只能在ARM态执行.
ARM处理器是基于精简指令集计算机(RISC)原理设计的,发展过程中商用的指令集经过了v4,v5,v6,v7(cortex系列) 4个系列,ARM内核的通用处理器型号比较常见的有arm7tdmi(v4),arm920/arm920t/arm926ejs,arm10,arm11,cortex-a8。
为了提高指令执行效率,大部分的ARM指令为单周期指令,并从软件设计角度看,ARM处理器的指令流水线采用3级流水线模型,并提供了LDM/STM类似的批量数据操作指令。
为了提高CPU访问外部设备数据效率,ARM处理器除部分ARM7采用冯.洛伊曼结构外,其他得都采用
哈佛架构,从而实现了对指令和数据存储器的同时访问。
并且,ARMCPU提供了现代操作系统所需的虚拟内存管理机制(MMU)和指令、数据cache,并提供了协议处理器(cp15)来协助管理CPU的MMU和CACHE。
扩展概念:
以上叙述里面提及的概念也要稍微去总结一下,比如:
1.什么是RISC?
2.ARM中断在ARM9,CORTEX-A8是怎么处理的?
LINUX中为什么需要把中断分为上半部分,下半部分
3.MMU和CACHE的一些基本原理和知识
6.请简述下面这段代码的功能
movr12,#0x0
ldrr13,=0x30100000
movr14,#4096
loop:
ldmia r12!
{r0-r11}
stmia r13!
{r0-r11}
cmp r12,r14
blo loop [2分]
参考答案:
借助r0~r11,将内存地址0x0开始的4KB数据拷贝到0x30100000
7.嵌入式中常用的文件系统有哪些?
说出它们的主要特点和应用场合?
[5分]
参考答案:
嵌入式相关的文件系统:
嵌入式文件系统包括只读和可读写文件系统,一般情况下,只读文件系统启动速度快于可读写的文件系统
嵌入式相关的文件系统包括以下几种:
只读文件系统
cramfs:
压缩的只读文件系统
特点:
启动快,文件最大支持256MB,单个文件最大16MB
squashfs:
只读文件系统
特点:
压缩比最大,启动比cramfs慢
案例:
路由器,ubuntu的发行光盘 可结合LZMA压缩算法
可读写的文件系统:
JFFS2:
支持NOR和NANDFLASH(对NAND的支持天生不足)
特点:
1.可读写
2.挂载慢(特别是在小文件很多的文件系统中,就更慢)
3.当数据占到JFFS2分区的75~80%左右时,性能会急剧下降
YAFFS2:
只支持NANDFLASH
特点:
1.可读写
2.挂载快(特别是在小文件很多的文件系统中,优势更明显)