大疆2014嵌入式笔试题 答案

1. 有如下CAT_s结构体定义,回答:

1) 在一台64位的机器上,使用32位编译,Garfield 变量占用多少内存空间?64位编译又是如何?(总分5分)

2) 使用32位编译情况下,给出一种判断所使用机器大小端的方法。(总分5分)

struct CAT_s{
int ld;
char Color;
unsigned short Age;
char *Name;
void(*Jump)(void);
}Garfield;

(1):16=4+1+1+2+4+4; 24=4+1+1+2+8+8

(2):使用union,比较数据存放的顺序

2. 描述下面XXX 这个宏的作用。(总分10分)

#define offsetof(TYPE,MEMBER)((size_t)&((TYPE*)0)->MEMBER)
#define XXX(ptr,type,member({   \
const typeof(((type*)0)->member)*__mptr=(ptr);   \
(type*)(char*)__mptr – offsetof(type,member));})

XXX宏的作用是根据MEMBER成员的地址求其TYPE结构体的地址。

3. 简述C 函数:1) 参数如何传递(__cdecl调用方式);2) 返回值如何传递;3) 调用后如何 返回到调用前的下一条指令执行。(总分10分)

答:(1)函数参数从右至坐压栈,使用堆栈传递参数,堆栈由调用者清理,可变参数的函数必须使用__cdecl调用方式。(2)返回值存放在r0寄存器。如果返回值是双字就存放在r0和r1(ARM架构)。(3)函数调用时使用call指令将CP和IP压入堆栈,然后跳转;ret指令指令从堆栈中取出CS:IP。实现返回调用程序(X86)。ARM处理器的返回地址存放在lr寄存器(链接寄存器)中,BX,BL跳转指令实现返回。【特征:ARM通用寄存器多,指令种类少,X86专用指令多,指令可以直接访问操作存储器中的数据】。

参考:https://www.cnblogs.com/jueyunqi/p/4140141.html

参考:https://blog.csdn.net/aguangg_6655_la/article/details/53613270

4、在一个多任务嵌入式系统中,有一个CPU 可直接寻址的32位寄存器REGn ,地址为 0x1F000010,编写一个安全的函数,将寄存器REGn 的指定位反转(要求保持其他bit 的值不变)。(总分10分)

答:

int bit_reverse(int bit)
{
    if(bit >= 0 && bit < 32)
    {
        *((volatile unsigned int *)0x1F000010) ^= 0x01<

5. 有10000个正整数,每个数的取值范围均在1到1000之间,变成找出从小到大排在第 3400(从0开始算起)的那个数,将此数的值返回,要求不使用排序实现。(总分10分)

答:思路:建立一个数组,统计1-1000每个数出现的次数。复杂度O(n)。

二.嵌入式基本知识

1. 简述处理器中断处理的过程(中断向量、中断保护现场、中断嵌套、中断返回等)。(总 分10分)

答:

请求中断:当某一中断源需要CPU为其进行中断服务时,就输出中断请求信号,使中断控制系统的中断请求触发器置位,向CPU请求中断。系统要求中断请求信号一直保持到CPU对其进行中断响应为止;
中断响应:CPU对系统内部中断源提出的中断请求必须响应,而且自动取得中断服务子程序的入口地址,执行中断服务子程序。对于外部中断,CPU在执行当前指令的最后一个时钟周期去查询INTR引脚,若查询到中断请求信号有效,同时在系统开中断(即IF=1)的情况下,CPU向发出中断请求的外设回送一个低电平有效的中断应答信号,作为对中断请求INTR的应答,系统自动进入中断响应周期;
保护现场:主程序和中断服务子程序都要使用CPU内部寄存器等资源,为使中断处理程序不破坏主程序中寄存器的内容,应先将断点处各寄存器的内容(主要是当前IP(将要执行的下一条地址)和CS值(代码段地址))压入堆栈保护起来,再进入的中断处理。现场保护是由用户使用PUSH指令来实现的;
中断服务:中断服务是执行中断的主体部分,不同的中断请求,有各自不同的中断服务内容,需要根据中断源所要完成的功能,事先编写相应的中断服务子程序存入内存,等待中断请求响应后调用执行;
恢复现场:当中断处理完毕后,用户通过POP指令将保存在堆栈中的各个寄存器的内容弹出,即恢复主程序断点处寄存器的原值。
中断返回:在中断服务子程序的最后要安排一条中断返回指令IRET(interrupt return),执行该指令,系统自动将堆栈内保存的 IP(将要执行的下一条地址)和CS值(代码段地址)弹出,从而恢复主程序断点处的地址值,同时还自动恢复标志寄存器FR或EFR的内容,使CPU转到被中断的程序中继续执行。
 

2. 简述处理器在读内存的过程中,CPU 核、cache 、MMU 如何协同工作?画出CPU 核、 cache 、MMU 、内存之间的关系示意图加以说明(可以以你熟悉的处理器为例)。(总分10分)

答 :TLB cache MMU DRAM CPU 。之间的关系和概念。【下次补充】

 

三.基本通信知识

1. 请说明总线接口USRT 、I2C 、USB 的异同点(串/并、速度、全/半双工、总线拓扑等)。 (总分5分)

2. 列举你所知道的linux 内核态和用户态之间的通信方式并给出你认为效率最高的方式, 说明理由。(总分5分)

 

四.系统设计

有一个使用UART 进行通信的子系统X ,其中UART0进行数据包接收和回复,UART1进行数据包转发。子系统X 的通信模块职责是从UART0接收数据包,如果为本地数据包(receiver 为子系统X ),则解析数据包中的命令码(2字节)和数据域(0~128字节),根据命令码调用内部的处理程序,并将处理结果通过UART0回复给发送端,如果非本地数据包,则通过UART1转发。

如果由你来设计子系统X 的通信模块:

1) 请设计通信数据包格式,并说明各字段的定义;(总分5分)

2) 在一个实时操作系统中,你会如何部署模块中的任务和缓存数据,画出任务间的数据流

视图加以说明;(总分5分)

3) 你会如何设置任务的优先级,说说优缺点;(总分5分)

4) 如果将命令码对应的处理优先级分为高、低两个等级,你又会如何设计;(总分5分)

 

 

 

 

 

 

参考:https://blog.csdn.net/qq_38410730/article/details/80905551

 

 

 

 

 

你可能感兴趣的:(笔试面试)