嵌入式面试题.docx
- 文档编号:18463440
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:14
- 大小:22.40KB
嵌入式面试题.docx
《嵌入式面试题.docx》由会员分享,可在线阅读,更多相关《嵌入式面试题.docx(14页珍藏版)》请在冰点文库上搜索。
嵌入式面试题
以下题目可能与原题目有差入,但力争使题目与原题目接近。
1.linux内核里面,内存申请有哪几个函数,各自的区别?
2.IRQ和FIQ有什么区别,在CPU里面是是怎么做的?
3.
int*a;
char*b;
a和b本身是什么类型?
a、b里面本身存放的只是一个地址,难道是这两个地址有不同么?
4.中断的上半部分和下半部分的问题:
讲下分成上半部分和下半部分的原因,为何要分?
讲下如何实现?
5.内核函数mmap的实现原理,机制?
6.驱动里面为什么要有并发、互斥的控制?
如何实现?
讲个例子?
7.spinlock自旋锁是如何实现的?
8.任务调度的机制?
1.嵌入式linux和wince操作系统的特点和特性?
2.嵌入式linux中tty设备驱动的体系结构?
3.嵌入式设备,为加快启动速度,可以做哪些方面的优化?
4.USB设备的枚举过程?
5.PSRAM、SDRAM、DDR、DDR2的时序特性?
6.I2C触摸屏芯片与CPU的数据传输流程?
画出相关图例?
(这题目记得不是太清楚了,大概是考查I2C设备驱动的数据传输过程)
EmbeddedSoftwareDesignEngineer
1读程序段,回答问题
intmain(intargc,char*argv[])
{
intc=9,d=0;
c=c++%5;
d=c;
printf("d=%d\n",d);
return0;
}
a)写出程序输出
b)在一个可移植的系统中这种表达式是否存在风险?
why?
#include"stdio.h"
inta=0;
intb;
staticcharc;
intmain(intargc,char*argv[])
{
chard=4;
staticshorte;
a++;
b=100;
c=(char)++a;
e=(++d)++;
printf("a=%d,b=%d,c=%d,d=%d,e=%d",a,b,c,d,e);
return0;
}
a)写出程序输出
b)编译器如果安排各个变量(a,b,c,d)在内存中的布局(eg.stack,heap,datasection,bsssection),最好用图形方式描述。
2中断是嵌入式系统中重要的组成部分,这导致了许多编译开发商提供一种扩展:
让标准C支持中断,产生了一个新的关键字__interrupt。
下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论以下这段代码。
__interruptdoublecompute_area(doubleradius)
{
doublearea=PI*radius*radius;
printf("nArea=%f",area);
returnarea;
}
3C/C++基础知识问题
a)关键字volatile在编译时有什么含义?
并给出三个不同使用场景的例子(可以伪代码或者文字描述)。
b)C语言中static关键字的具体作用有哪些?
c)请问下面三种变量声明有何区别?
请给出具体含义
intconst*p;
int*constp;
intconst*constp;
4嵌入式系统相关问题
a)对于整形变量A=0x12345678,请画出在littleendian及bigendian的方式下在内存中是如何存储的。
b)在ARM系统中,函数调用的时候,参数是通过哪种方式传递的?
c)中断(interrupt,如键盘中断)与异常(exception,如除零异常)有何区别?
5设周期性任务P1,P2,P3的周期为T1,T2,T3分别为100,150,400;执行时间分别为20,40,100。
请设计一种调度算法进行任务调度,满足任务执行周期及任务周期。
6优先级反转问题在嵌入式系统中是一中严重的问题,必须给与足够重视。
a)首先请解释优先级反转问题
b)很多RTOS提供优先级继承策略(Priorityinheritance)和优先级天花板策略(Priorityceilings)用来解决优先级反转问题,请讨论这两种策略。
参考答案:
15//我感觉答案应该是4,但标准答案给的是5...
存在风险,因为c=c++%5;这个表达式对c有两次修改,行为未定义,c的值不确定
inta=0;//datasection
intb; //datasection
staticcharc;//BSS
intmain(intargc,char*argv[])
{
chard=4; //stack
staticshorte; //BSS
a++;
b=100;
c=(char)++a;
e=(++d)++;
printf("a=%d,b=%d,c=%d,d=%d,e=%d",a,b,c,d,e);
return0;
}
a=2,b=100,c=2,d=6,e=5
2a)ISR不能返回一个值;
b)ISR不能传递参数;
c)浮点一般都是不可重入的;
d)printf函数有重入和性能上的问题。
3a)用volatile关键字定义变量,相当于告诉编译器,这个变量的值会随时发生变化,每次使用时都需要去内存里
重新读取它的值,并不要随意针对它作优化。
建议使用volatile变量的场所:
(1)并行设备的硬件寄存器
(2)一个中断服务子程序中会访问到的非自动变量(全局变量)
(3)多线程应用中被几个任务共享的变量
b)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数
访问。
它是一个本地的全局变量。
在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。
那就是,这个函数被限制在声明它的
模块的本地范围内使用。
static全局变量与普通的全局变量有什么区别:
static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:
static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
c)一个指向常整型数的指针
一个指向整型数的常指针
一个指向常整型数的常指针
4
a)0x12345678
littleendian bigendian刚好反过来
高地址--〉0x12 低地址--〉0x12
0x34 0x34
0x56 0x56
低地址--〉0x78 高地址--〉0x78
b)参数<=4时候,通过R0~R3传递,>4的通过压栈方式传递
c) 异常:
在产生时必须考虑与处理器的时钟同步,实践上,异常也称为同步中断。
在处理器执行到由于编程失误而导致的错误指令时,或者在执行期间出现特殊情况(如缺页),必须靠内核处理的时候,处理器就会产生一个异常。
所谓中断应该是指外部硬件产生的一个电信号,从cpu的中断引脚进入,打断cpu当前的运行;
所谓异常,是指软件运行中发生了一些必须作出处理的事件,cpu自动产生一个陷入来打断当前运行,转入异常处理流程。
异步与同步的区别`
5
6高优先级任务需要等待低优先级任务释放资源,而低优先级任务又正在等待中等优先级任务的现象叫做优先级反转
优先级继承策略(Priorityinheritance):
继承现有被阻塞任务的最高优先级作为其优先级,任务退出临界区,恢
复初始优先级。
优先级天花板策略(Priorityceilings):
控制访问临界资源的信号量的优先级天花板。
优先级继承策略对任务执行流程的影响相对教小,因为只有当高优先级任务申请已被低优先级任务占有的临界资源
这一事实发生时,才抬升低优先级任务的优先级。
1 读程序段,回答问题
int main(int argc,char *argv[])
{
int c=9,d=0;
c=c++%5;
d=c;
printf("d=%d\n",d);
return 0;
}
a) 写出程序输出
5
b) 在一个可移植的系统中这种表达式是否存在风险?
why?
#include "stdio.h"
int a=0;
int b;
static char c;
int main(int argc,char *argv[])
{
char d=4;
static short e;
a++;
b=100;
c=(char)++a;
e=(++d)++;
printf("a=%d, b=%d, c=%d, d= %d, e=%d",a,b,c,d,e);
return 0;
}
a) 写出程序输出
以前学过c++,这个是可以的 e=(++d)++;
现在才发现在c中,这是不行的
a=2, b=100, c=2, d= 6, e=5
b) 编译器如果安排各个变量(a,b,c,d)在内存中的布局(eg. stack,heap,data section,bss section),最好用图形方式描述。
datasection:
a
bsssection:
b,c,e
stackd
在采用段式内存管理的架构中,数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。
数据段属于静态内存分配。
在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。
BSS是英文Block Started by Symbol的简称。
BSS段属于静态内存分配。
4 嵌入式系统相关问题
a) 对于整形变量A=0x12345678,请画出在little endian及big endian的方式下在内存中是如何存储的。
low->high
littleendian 0x780x560x340x12
big endian 0x120x340x560x78
b) 在ARM系统中,函数调用的时候,参数是通过哪种方式传递的?
在arm汇编中,如果不超过4个参数时,是通过r0 -r3寄存器来传递参数,>4的通过压栈方式传递。
c) 中断(interrupt,如键盘中断)与异常(exception,如除零异常)有何区别?
在《Linux内核设计与实现》一书中,说道:
异常 :
在产生时必须考虑与处理器的时钟同步,实践上,异常也称为同步中断。
在处理器执行到由于编程失误而导致的错误指令时,或者在执行期间出现特殊情况(如缺页),必须靠内核处理的时候,处理器就会产生一个异常。
中断可分为同步(synchronous)中断和异步(asynchronous)中断:
1.同步中断是当指令执行时由CPU控制单元产生,之所以称为同步,是因为只有在一条指令执行完毕后CPU才会发出中断,而不是发生在代码指令执行期间,比如系统调用。
2.异步中断是指由其他硬件设备依照CPU时钟信号随机产生,即意味着中断能够在指令之间发生,例如键盘中断。
所谓中断应该是指外部硬件产生的一个电信号,从cpu的中断引脚进入,打断cpu当前的运行;
所谓异常,是指软件运行中发生了一些必须作出处理的事件,cpu自动产生一个陷入来打断当前运行,转入异常处理流程。
6 优先级反转问题在嵌入式系统中是一中严重的问题,必须给与足够重视。
a) 首先请解释优先级反转问题
高优先级任务需要等待低优先级任务释放资源,而低优先级任务又正在等待中等优先级任务的现象叫做优先级反转
b) 很多RTOS提供优先级继承策略(Priority inheritance)和优先级天花板策略(Priority ceilings)用来解决优先级反转问题,请讨论这两种策略。
优先级继承策略(Priority inheritance):
最低优先级任务继承现有被阻塞任务的最高优先级作为其优先级,任务退出临界区,恢
复初始优先级。
优先级天花板策略(Priority ceilings):
控制访问临界资源的信号量的优先级天花板。
优先级继承策略对任务执行流程的影响相对教小,因为只有当高优先级任务申请已被低优先级任务占有的临界资源
这一事实发生时,才抬升低优先级任务的优先级。
via的考题--继续
2007-06-2911:
09
1.via的考题一道
这个程序设计的思想是这样的:
为了测试32位机上的浮点数的运算精度,作如下考虑:
当1.5==1时(二进制1.1==1)精度为1个小数位
当1.25==1时(二进制1.01==1)精度为2个小数位
继续判断测试,直到两者相等,从而得到精度。
所以程序代码如下:
intmain()
{intnCount;
floatnumber1,number2;
nCount=0;
number1=1.0;
number2=1.0
while(number1+number2!
=number1){
nCount++;
number2/=2.0;
}
printf("%dbitsaccruacy.\n",nCount);
}
问题是,结果为多少?
经测试得64或者53或者24(稍加改动)。
。
。
得53和24已基本得出答案,主要是ieee754标准中规定单双精度数字的底数指数符号位所置。
。
。
64的目前还没有得出结论。
。
。
2.改错题
voidmymul(double*p)
{
*p*=2.0;
}
intmain(intargc,char*argv[])
{
floatf =6.0;
mymul((double*)&f);
printf("nowf=%f\n",f);
return0;
}
直接运行,结果为6.00000
这个题目很简单,可以有很多种改法,如:
a.把floatf=6.0;改为doublef=6.0;睛面的mymul句不要强制类型转化b.把所有的数都当成float型来处理等等
但往细的方面想,float型默认4字节,double型默认8字节,虽然在vc6下能勉强运行(运行时报出调试窗口),但单步跟踪发现在mymul()中并没有得到正确执行,而是:
AccessViolation,这个错误常常在计算机用户运行的程序试图存取未被指定使用的存储区时遇到中,可见mymyl()这个函数并没有得到正确的执行。
。
。
同样,用gcc来直接编译上述程序,虽然没有报错,但结果仍然为6.00000,可能gcc也是在执行mymul()时没有正确执行(不过我没拿gdb来跟踪看)
以下内容是补充,主要是一些基础的知识
3.二维数组空间的动态申请
a.简单的,已经有一维,如
char(*c)[5];
c=newchar[n][5];//n为已定义的行数
b.二维的
int**p;
p=newint*[m_row];//创建行指针
for(inti=0;i p[i]=newint[m_cols]; 写到某一个函数中: voidgetmemory(int**&p,intm_row,intm_cols) { p=newint*[m_row];//创建行指针 for(inti=0;i p[i]=newint[m_cols]; } 释放空间: voiddeletememory(int**&p,intm_row) { //释放每一行所分配的空间 for(inti=0;i delete[]x[i]; //释放行指针 delete[]x; x=0; } \ ] 1楼 1.C/C++基础知识问题 a)关键字volatile在编译时有什么含义? 并给出三个不同使用场景的例子(可以伪代码或者文字描述)。 b)C语言中static关键字的具体作用有哪些? c)请问下面三种变量声明有何区别? 请给出具体含义 intconst*p; int*constp; intconst*constp 参考答案 a)用volatile关键字定义变量,相当于告诉编译器,这个变量的值会随时发生变化,每次使用时都需要去内存里重新读取它的值,并不要随意针对它作优化。 建议使用volatile变量的场所: (1)并行设备的硬件寄存器 (2)一个中断服务子程序中会访问到的非自动变量(全局变量) (3)多线程应用中被几个任务共享的变量 b)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。 它是一个本地的全局变量。 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。 那就是,这个函数被限制在声明它的模块的本地范围内使用。 static全局变量与普通的全局变量有什么区别: static全局变量只初使化一次,防止在其他文件单元中被引用; static局部变量和普通局部变量有什么区别: static局部变量只被初始化一次,下一次依据上一次结果值; static函数与普通函数有什么区别: static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝; c)一个指向常整型数的指针 一个指向整型数的常指针 一个指向常整型数的常指针 2.要使引用pr代表变量“char*p”,则pr的初始化语句为__________ 参考答案 char*&pr=p; 3.表达式8&3的结果是__________。 参考答案 0 4.设intx;,则经过( )后,语句*px=0;可将x值置为0。 Aint*px; Bintconst*px=&x; Cint*constpx=&x; Dconstint*px=&x; 参考答案 C 5.写出下列程序的执行结果。 #include voidfun(int,int,int*); voidmain() { intx,y,z; fun(2,3,&x); fun(4,x,&y); fun(x,y,&z); cout< } voidfun(inta,intb,int*c) { b*=a; *c=b-a; } 参考答案 4,12,44 原文出处: http: //www.akaedu.org 1普通操作系统中信号量的作用 答: 线程同步,保护多线程共享资源和不可重入的临界区代码。 2在嵌入式代码中总会这么定义: typedefunsignedcharTUC; typedefunsignedshortintTUS; typedefunsignedlongintTUL; 为什么? 有什么好处! 答: 嵌入式处理器种类繁多,这样写是为了方便在不同字长的处理器间移植。 3在程序中总会用到等待某个事件的发生才处理下事件,如: 只有StatusFlag==1时,setBin (1)才执行。 下面代码可不可行? 为什么? setBin(0); while(StatusFlag==0); setBin (1); 答: 视具体情况而定。 如果未使用操作系统(嵌入式不使用操作系统很常见),整个系统就一单任务,标志由中断服务程序设置的话,而且在等待期间也没有其他什么事可做的话,这样是可行的。 当然,系统使用了多线程,那就不行了,浪费处理器资源,而其他线程去得不到处理器资源。 4在嵌入式系统中总会用到中断,在下面中断服务子程序中,有什么不合理的地方? _interruptdoubleRipple(double r) { doublearea=PI*r*r; prinif("%f\n",area); returnarea; } 答: 这里最主要就两点: 1.中断服务函数不能有参数。 2.中断服务函数不能有返回值。 5.写代码,给绝对地址0x56a00赋整型值0x55aa; *(volatileunsignedint*)0x56a00=0x55aa; 最好加上关键字volatile,防止被优化或CACHE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 试题