资源描述
以下题目可能与原题目有差入,但力争使题目与原题目接近。1. linux内核里面,内存申请有哪几个函数,各自的区别?2. IRQ和FIQ有什么区别,在CPU里面是是怎么做的?3.int *a;char *b;a和b本身是什么类型?、b里面本身存放的只是一个地址,难道是这两个地址有不同么?3. 中断的上半部分和下半部分的问题:讲下分成上半部分和下半部分的原因,为何要分?讲下如何实现?4. 内核函数mmap的实现原理,机制?.驱动里面为什么要有并发、互斥的控制?如何实现?讲个例子?7. spinlock自旋锁是如何实现的?8. 任务调度的机制?1. 嵌入式linux和wince操作系统的特点和特性?2. 嵌入式linux中tty设备驱动的体系结构?3. 嵌入式设备,为加快启动速度,可以做哪些方面的优化?4. USB设备的枚举过程?5. PSRAM、SDRAM、DDR、DDR2 的时序特性?6. I2C触摸屏芯片与CPU的数据传输流程?画出相关图例?(这题目记得不是 太清楚了,大概是考查I2C设备驱动的数据传输过程)Embedded Software Design Engineer1 读程序段,回答问题int main(int argc,char *argv)int c=9,d=0;c=c+%5;d=c;printf(d=%dn,d);return 0;a) 写出程序输出b) 在一个可移植的系统中这种表达式是否存在风险? why?#include stdio.hint 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) 写出程序输出b) 编译器如果安排各个变量(a,b,c,d)在内存中的布局(eg. stack,heap,data section,bsss e c t ion) ,最好用图形方式描述。2中断是嵌入式系统中重要的组成部分,这导致了许多编译开发商提供一种扩展:让标准C支持 中断,产生了一个新的关键字interrupt。下面的代码就使用了_interrupt关键字去定义了 一个中断服务子程序(ISR),请评论以下这段代码。_interrupt double compute_area(double radius)double area = PI * radius *radius;printf(nArea = %f, area);return area;3 C/C+基础知识问题a) 关键字volatile在编译时有什么含义?并给出三个不同使用场景的例子(可以伪代码或者文 字描述)。b) C语言中static关键字的具体作用有哪些?c) 请问下面三种变量声明有何区别?请给出具体含义int const *p;int* const p;int const* const p;4 嵌入式系统相关问题a) 对于整形变量A=0xl2345678,请画出在little endian及big endian的方式下在内存中是如 何存储的。b) 在ARM系统中,函数调用的时候,参数是通过哪种方式传递的?c) 中断(interrupt,如键盘中断)与异常(exception,如除零异常)有何区别?5设周期性任务P1,P2,P3的周期为T1,T2,T3分别为100, 150,400;执行时间分别为20,40, 100。请设计一种调度算法进行任务调度,满足任务执行周期及任务周期。6 优先级反转问题在嵌入式系统中是一中严重的问题,必须给与足够重视。a) 首先请解释优先级反转问题b) 很多RTOS提供优先级继承策略(Priority inheritance)和优先级天花板策略(Priority ceilings)用来解决优先级反转问题,请讨论这两种策略。参考答案:1 5 /我感觉答案应该是4,但标准答案给的是5.存在风险,因为c=c+%5;这个表达式对c有两次修改,行为未定义,c的值不确定int a=0; / data sectionint b;/ data sectionstatic char c; / BSSint main(int argc,char *argv)char d=4;/ stackstatic short e; / BSSa+;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=2,b=100,c=2,d=6,e=52 a)ISR不能返回一个值;b)ISR不能传递参数;C)浮点一般都是不可重入的;d) printf函数有重入和性能上的问题。3 a)用volatile关键字定义变量,相当于告诉编译器,这个变量的值会随时发生变化,每次使 用时都需要去内存里重新读取它的值,并不要随意针对它作优化。建议使用volatile变量的场所:(1) 并行设备的硬件寄存器(2) 一个中断服务子程序中会访问到的非自动变量(全局变量)(3) 多线程应用中被几个任务共享的变量b) 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问, 但不能被模块外其它函数访问。它是一个本地的全局变量。在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这 个函数被限制在声明它的模块的本地范围内使用。static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止 在其他文件单元中被引用;static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一 次依据上一次结果值;static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝c) 一个指向常整型数的指针一个指向整型数的常指针 一个指向常整型数的常指针4a) 0x12345678little endian高地址- 0x12big endian 刚好反过来低地址- 0x120x340x340x560x56低地址- 0x78高地址- 0x78b) 参数=4时候,通过R0R3传递,4的通过压栈方式传递c) 异常:在产生时必须考虑与处理器的时钟同步,实践上,异常也称为同步中断。在处理 器执行到由于编程失误而导致的错误指令时,或者在执行期间出现特殊情况(如缺页),必须靠内 核处理的时候,处理器就会产生一个异常。所谓中断应该是指外部硬件产生的一个电信号,从cpu的中断引脚进入,打断cpu当前的运行; 所谓异常,是指软件运行中发生了一些必须作出处理的事件,cpu自动产生一个陷入来打断当前 运行,转入异常处理流程。异步与同步的区别 56 高优先级任务需要等待低优先级任务释放资源,而低优先级任务又正在等待中等优先级任务的 现象叫做优先级反转优先级继承策略(Priority inheritance):继承现有被阻塞任务的最高优先级作为其优先级,任 务退出临界区,恢复初始优先级。优先级天花板策略(Priority ceilings):控制访问临界资源的信号量的优先级天花板。 优先级继承策略对任务执行流程的影响相对教小,因为只有当高优先级任务申请已被低优先级任 务占有的临界资源这一事实发生时,才抬升低优先级任务的优先级。1 读程序段,回答问题int main(int argc,char *argv)int c=9,d=0;c=c+%5;d=c;printf(d=%dn,d);return 0;a) 写出程序输出5b) 在一个可移植的系统中这种表达式是否存在风险? why?#include stdio.hint 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=5b)编译器如果安排各个变量(a,b,c,d)在内存中的布局(eg. stack,heap,data section,bss section),最好用图形方式描述。 data section: abss section: b,c,estack d在采用段式内存管理的架构中,数据段(data segment)通常是指用来存放程 序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序 中未初始化的全局变量的一块内存区域。 BSS 是英文Block Started by Symbol 的简称。 BSS 段属于静态内存分配。4 嵌入式系统相关问题a) 对于整形变量A=0xl2345678,请画出在little endian及big endian的方 式下在内存中是如何存储的。low - highlittle endian 0x78 0x56 0x34 0xl2big endian 0xl2 0x34 0x56 0x78b) 在 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-29 11:091. via的考题一道这个程序设计的思想是这样的: 为了测试32位机上的浮点数的运算精度,作如下考虑: 当1.5 = 1时(二进制1. 1=1)精度为1个小数位 当1.25 = 1时(二进制1.01=1)精度为2个小数位 继续判断测试,直到两者相等,从而得到精度。所以程序代码如下:int main() int nCount;float number1,number2; nCount = 0;number1 = 1.0; number2 = 1.0 while( number1 + number2 != number1 )nCount+;number2 /= 2.0;printf( %d bits accruacy.n, nCount ); 问题是,结果为多少? 经测试得64或者53或者24(稍加改动) 。 。 。得53和24已基本得出答案,主要是ieee 754标准中规定单双精度数字的底数 指 数 符号位所置。64的目前还没有得出结论。2. 改错题void mymul(double *p)*p *= 2.0;int main(int argc, char *argv)float f = 6.0; mymul(double *) &f); printf(now f = %fn, f); return 0; 直接运行,结果为6.00000这个题目很简单,可以有很多种改法,如:a.把float f=6.0;改为double f=6.0; 睛面的mymul句不要强制类型转化b.把所有的数都当成float型来处理 等等 但往细的方面想,float型默认4字节,double型默认8字节,虽然在vc6下能 勉强运行(运行时报出调试窗口),但单步跟踪发现在mymul()中并没有得 到正确执行,而是:Access Violation,这个错误常常在计算机用户运行的程序 试图存取未被指定使用的存储区时遇到中,可见mymyl()这个函数并没有得到正 确的执行。同样,用gcc来直接编译上述程序,虽然没有报错,但结果仍 然为6.00000,可能gcc也是在执行mymul()时没有正确执行(不过我没拿gdb来 跟踪看)以下内容是补充,主要是一些基础的知识3. 二维数组空间的动态申请a.简单的,已经有一维,如char (*c)5;c=new charn5;/n为已定义的行数b.二维的 int *p;p二new int* m_row;/仓 U建行指针for(in t i=0;im_row;i+)/为每一行分配空间pi=new intm_cols;写到某一个函数中:void getmemory(int * &p,int m_row,int m_cols)p二new int* m_row;/仓 U建行指针for(in t i=0;im_row;i+)/为每一行分配空间pi=new intm_cols;释放空间:void deletememory(int *&p,int m_row)/释放每一行所分配的空间for(int i=0;im_row;i+)delete xi;/释放行指针delete x;x=0;1楼1. C/C+基础知识问题a) 关键字volatile在编译时有什么含义?并给出三个不同使用场景的例子(可 以伪代码或者文字描述)。b) C语言中static关键字的具体作用有哪些?c) 请问下面三种变量声明有何区别?请给出具体含义int const *p;int* const p;int const* const p参考答案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的结果是。参考答案04. 设int x;,则经过()后,语句*px=O;可将x值置为0。A int * px;B int const *px=&x;C int * const px=&x;D const int * px=&x;参考答案5. 写出下列程序的执行结果。# include void fun(int,int,int * );void main()int x,y,z;fun (2,3,&x);fun (4,x,&y);fun (x,y,&z);coutx,y,zendl;void fun(int a,int b,int * c )b*=a;*c=b-a;参考答案4,12,44原文出处:htt p:/www.akaedu.org1 普通操作系统中信号量的作用答 :线程同步,保护多线程共享资源和不可重入的临界区代码。2 在嵌入式代码中总会这么定义:typedef unsigned char TUC;typedef unsigned short int TUS;typedef unsigned long int TUL;为什么?有什么好处!答 :嵌入式处理器种类繁多,这样写是为了方便在不同字长的处理器间移植。3在程序中总会用到等待某个事件的发生才处理下事件,如:只有StatusFlag = 1时,setBin(l) 才执行。下面代码可不可行?为什么?setBin(0);while(StatusFlag = 0);setBin(1);答 :视具体情况而定。如果未使用操作系统(嵌入式不使用操作系统很常见),整个系统就 一单任务,标志由中断服务程序设置的话,而且在等待期间也没有其他什么 事可做的话, 这样是可行的。当然,系统使用了多线程,那就不行了,浪费处理器资源,而其他线程去得 不到处理器资源。4 在嵌入式系统中总会用到中断,在下面中断服务子程序中,有什么不合理的地方?_interrupt double Ripple(double r)double area = PI*r*r;prinif(%fn,area);return area;答 :这里最主要就两点: 1.中断服务函数不能有参数。2.中断服务函数不能有返回值。5.写代码,给绝对地址0x56a00赋整型值0x55aa;*(volatile unsigned int*)0x56a00 = 0x55aa; 最好加上关键字volatile ,防止被优化或CACHE
展开阅读全文