嵌入式软件笔试题_第1页
嵌入式软件笔试题_第2页
嵌入式软件笔试题_第3页
嵌入式软件笔试题_第4页
嵌入式软件笔试题_第5页
免费预览已结束,剩余32页可下载查看

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、凹凸笔试题目(嵌入式软件开发)20070207Embedded Software Desig n Engin eer1读程序段,回答问题int main (i nt argc,char *argv)int c=9,d=0;c=c+%5;d=c;prin tf(d=%dn,d);return 0;a)写岀程序输岀b)在一个可移植的系统中这种表达式是否存在风险?#i nclude stdio.hint a=0;int b;static char c;int main (i nt argc,char *argv)char d=4;static short e;why?a+;b=100;c=(char

2、)+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,datasection,bsssection),最好用图形方式描述。2中断是嵌入式系统中重要的组成部分,这导致了许多编译开发商提供一种扩展:让标准C支持中断,产生了一个新的关键字interrupt。下面的代码就使用了interrupt关键字去定义了一个中断服务子程序(ISR),请评论以下这段代码。_in terrupt double compute_

3、area(double radius)double area = PI * radius *radius;prin tf( nArea = %f, area);return area;3 C/C+基础知识问题a)关键字volatile在编译时有什么含义?并给岀三个不同使用场景的例子(可以伪代码或者文字描述)。b)C语言中static关键字的具体作用有哪些?c)请问下面三种变量声明有何区别?请给岀具体含义int const *p;int* const p;int con st* const p;4嵌入式系统相关问题a)对于整形变量A=0 x12345678,请画岀在little endian及b

4、ig endian的方式下在内存中是如何存储的。b)在ARM系统中,函数调用的时候,参数是通过哪种方式传递的?c)中断(interrupt,如键盘中断)与异常(exception,如除零异常)有何区别?5设周期性任务P1,P2,P3的周期为T1,T2,T3分别为100,150,400;执行时间分别为20,40,100。请设计一种调度算法进行任务调度,满足任务执行周期及任务周期。6优先级反转问题在嵌入式系统中是一中严重的问题,必须给与足够重视。a)首先请解释优先级反转问题b)很多RTOS提供优先级继承策略(Priority inheritanee)和优先级天花板策略(Priority ceili

5、ngs)用来解决优先级反转问题,请讨论这两种策略。参考答案:1 5存在风险,因为c=c+%5;这个表达式对c有两次修改,行为未定义,int a=0; / data secti onint b; / data secti onstatic char c; / BSSint main (i nt argc,char *argv)char d=4;/ stackstatic short e; / BSSa+;b=100;c=(char)+a;e=(+d)+;pri ntf(a=%d, b=%d, c=%d, d= %d, e=%d,a,b,c,d,e);return 0;a=2,b=100,c=2,

6、d=6,e=5c的值不确定2 a)ISR不能返回一个值;b) ISR不能传递参数;c)浮点一般都是不可重入的;d) pri ntf函数有重入和性能上的问题。3 a)用volatile关键字定义变量,相当于告诉编译器,这个变量的值会随时发生变化,每次使用 时都需要去内存里重新读取它的值,并不要随意针对它作优化。建议使用volatile变量的场所:(1)并行设备的硬件寄存器(2)一个中断服务子程序中会访问到的非自动变量(全局变量)(3)多线程应用中被几个任务共享的变量b)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。在模块内(但在函数体外),一个被声明为静态的变量可以被模块内

7、所用函数访问,但不能 被模块外其它函数访问。它是一个本地的全局变量。在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝c)一个指向常整型数的指针一个指向整型数的常指针一个指向常整型数的常指针4big en di

8、a n刚好反过来低地址-0 x12 0 x34 0 x56高地址-0 x78c)异常:在产生时必须考虑与处理器的时钟同步,实践上,异常也称为同步中断。在处理器执行到由于编程失误而导致的错误指令时,或者在执行期间岀现特殊情况(如缺页),必须靠内核处理的时候,处理器就会产生一个异常。所谓中断应该是指外部硬件产生的一个电信号,从cpu的中断引脚进入,打断cpu当前的运行;所谓异常,是指软件运行中发生了一些必须作岀处理的事件,cpu自动产生一个陷入来打断当前运行,转入异常处理流程。异步与同步的区别6高优先级任务需要等待低优先级任务释放资源,而低优先级任务又正在等待中等优先级任务的现象叫做优先级反转优先

9、级继承策略(Priority in herita nee):继承现有被阻塞任务的最高优先级作为其优先级,任务a)0 x12345678little en dia n高地址-0 x120 x340 x56低地址-0 x78b)参数4的通过压栈方式传递退岀临界区,恢复初始优先级。优先级天花板策略(Priority eeili ngs):控制访问临界资源的信号量的优先级天花板。优先级继承策略对任务执行流程的影响相对教小,因为只有当高优先级任务申请已被低优先级任务占有的临界资源这一事实发生时,才抬升低优先级任务的优先级。原文地址 http:/.en/u/451daef9010007mv约定:1)下面的

10、测试题中,认为所有必须的头文件都已经正确的包含了2)数据类型char 一个字节 1 byteint 两个字节 2 byte (16 位系统,认为整型是 2 个字节)long int四个字节 4 bytefloat 四个字节 4 byetdouble 八个字节 8 bytelong double 十个字节 10 byte pointer 两个字节 2 byte(注意,16 位系统,地址总线只有 16位)第 1 题:考查对 volatile 关键字的认识#include static jmp_buf buf;main()volatile int b;b =3;if(setjmp(buf)!=O)p

11、rintf(%d , b);exit(0);b=5;longjmp(buf , 1);请问,这段程序的输出是3(b) 5(c) 0main()struct nodeint a;int b;int c;struct node s= 3, 5,6 ;struct node *pt = &s;printf(%d,*(int*)pt);(c) 6(d) 7int foo ( int x , int n)int val;val =1;if (n0)if (n%2 = 1) val = val *x;val = val * foo(x*x , n/2);return val;这段代码对 x 和 n

12、 完成什么样的功能(操作)?(a) x5(x的n次幕)(b) x*n(x 与 n 的乘积)(c) nAx(n的 x次幕)main()int a5 = 1,2,3,4,5;int *ptr =(int*)(& a+1);printf(%d %d , *(a+1), *(ptr-1);这段程序的输出是2 2(b) 2 1(c) 2 5(d)以上均不是第 5 题:考查多维数组与指针void foo(int 3);main()int a 33= 1,2,3 , 4,5,6,7,8,9;foo(a);printf(%d , a21);void foo( int b3)+ b;b11 =9;这段程

13、序的输出是(a) 8(b) 9(c) 7(d) 以上均不对第 6 题目:考查逗号表达式main()int a, b,c, d;a=3;b=5;c=a,b;d=(a,b);printf(c=%d ,c); printf(d=%d ,d);这段程序的输出是c=3 d=3第 7 题:考查指针数组main()int a3 = 1,2,3 ,4,5,6;int (*ptr)3 =a;printf(%d %d ,(*ptr)1, (*ptr)2);+ptr;printf(%d %d,(*ptr)1, (*ptr)2);这段程序的输出是:(a) 2 3 5 6(b) 2 3 4 5(c) 4 5 0 0(d

14、)以上均不对第 8 题:考查函数指针int *f1(void)int x =10;return( &x);int *f2(void)int*ptr;*ptr =10;return ptr;int *f3(void)int *ptr;ptr=(int*) malloc(sizeof(int); return ptr;上面这 3 个函数哪一个最可能引起指针方面的问题只有 f3(b) 只有 f1 and f3第 9 题:考查自加操作什+)main()int i=3;int j;j = sizeof(+i+ +i);printf(i=%d j=%d, i ,j);i=4 j=2(b) i=3

15、j=2(c) i=3 j=4(d) i=3 j=6第 10 题:考查形式参数,实际参数,指针和数组void f1(int *, int);void f2(int *, int); void(*p2) ( int *, int);main()int a;int b;p0 = f1;p1 = f2;a=3;b=5;p0(&a , b);printf(%dt %dt , a ,b);p1(&a , b);printf(%dt %dt , a ,b);void f1( int* p , int q)int tmp; tmp =*p;*p = q;q= tmp; void f2( int

16、* p , int q) int tmp;tmp =*p;*p = q;q= tmp;这段程序的输出是(a) 5 5 5 5第 11 题考查自减操作(-)void e(int );main()int a;a=3;e(a);void e(int n)if(n0)e(-n);printf(%d , n);e(-n);这段程序的输出是(a) 0 1 2 0(b) 0 1 2 1(c) 1 2 0 1(d) 0 2 1 1第 12 题考查 typedef 类型定义,函数指针typedef int (*test) ( float * , float*)test tmp;tmp 的类型是(a)函数的指针,

17、该函数以 两个指向浮点数(float)的指针(pointer)作为参数(argume nts)Pointer to function of having two arguments that is pointer to float(b)整型(c) 函数的指针,该函数以 两个指向浮点数(float)的指针(pointer)作为参数(argume nts),并且函数的返回值类型是整型Pointer to functionhavingtwo argument that is pointer to floatreturn int(d)以上都不是第 13 题:数组与指针的区别与联系main()char

18、p;char buf1O = 1,2,3,4,5,6,9,8;p = (buf+1)5;printf(%d , p);这段程序的输出是5(b) 6(c) 9(d)以上都不对第 14 题:考查指针数组的指针Void f(char*);andmain()char * argv = ab ,cd, ef ,gh, ij ,kl ; f( argv );void f( char *p )char* t;t= (p+= sizeof(int)_1;printf( %s , t);这段程序的输出是(a) ab(b) cd(c) ef大学课堂是不会讲到的,不会也情有可原呵呵#include int ripp

19、le ( int ,.);main()int num;num = ripple ( 3, 5,7); printf(” %d , num);int ripple (int n,.)int i , j;int k;vaist p;k= 0;j = 1;va_start( p , n);for (; jn; +j)i = va_arg( p , int);for (; i; i &=i-1)+k;return k;这段程序的输出是7(b) 6第 16 题:考查静态变量的知识int counter (int i)static int count =0;count = count +i;ret

20、urn (count );main()int i , j;for (i=0; i 0)if (n%2 = 1)product = product*val;/* 如果是奇数次幂,x(val)要先乘上一次,;偶数次幂,最后返回时才会到这里乘以 1*/val = val* val;n = n/2;return product;(while n0)if next most significant binary digit ofn( power) is onethen multiply accumulated product by current val,reduce n(power) sequence

21、 by a factor of two using integer division . get next val by multiply current value of itself第 4 题:(c)a 的类型是一个整型数组,它有 5 个成员&a 的类型是一个整型数组的指针所以&a + 1 指向的地方等同于a6ptr -1&乱十1所以*(a+1)等同于 a1ptr 等同 a6, ptr-1就等同与 a5a0al12456799卄bbll=9题目自身就给了足够的提示b00= 4b10= 7第 6 题:(c)考查逗号表达式,逗号表达式的优先级是很低的,比赋值(=)的优先

22、级 低逗号表达式的值就是最后一个元素的值逗号表达式的还有一个作用就是分割函数的参数列表.E1, E2, ., En上面这个表示式的左右是,E1, E2,En 的值被分别计算出来,En 计算出来的结构赋给整个逗号表达式/ *yields c=a* /c=a,b;d=(a,b);/* d =b */操作数即使是一个表达式,也不需要在运行时进行计算 .(+i + + i)是不会执行的,第 7 题:(a)a0al12345ptr+ptrptr 是一个数组的指针,该数组有3 个 int 成员第 8 题:(c)fi 显然有问题,它返回一个局部变量的指针,局部变量是保存在stack 中的,退出函数后,局部变

23、量就销毁了,保留其指针没有意义,因为其指向的stack 空间可能被其他变量覆盖了f2 也有问题,ptr 是局部变量,未初始化,它的值是未知的,*ptr 不知道指向哪里了,直接给*ptr 赋值可能会覆盖重要的系统变量,这就是通常说的野指针的一种第 10 题:(a)很显然选 a.fl 交换*p 和 q 的值,fl 执行完后,*p 和 q 的值的确交换了,但 q 的改变不会影响 到 b 的改变,*p实际上就是 a所以执行 fl 后,a=b=5这道题考查的知识范围很广,包括 typedef 自定义类型,函数指针,指针数组void(*p 2 ) ( int *,i nt);定义了一个函数指针的数组p,p

24、 有两个指针元素元素是函数的指针,函数指针指向的函数是一个带 2 个参数,返回 void 的函数,所带的两个参数是指向整型的指针,和整型p 0 = f1; p 1 = f2 contain address of function .functionname withoutparenthesisrepresent address of function Value and address of variable ispassed to function only argument that is effected is a (address is passed). Because of call

25、 byvalue f1, f2 can not effect be(1) terminates十printf(tt%(f, 0);e(-0) terminatese(-3) -yprintfd,!);printf%d?、2)*e(1)terminates厂e(-l) terminatesprintf(*t%(r,、0);c(-)tciminatcs考查-操作和递归调用,仔细分析一下就可以了第 12 题:(c)建议不会的看看 C 专家编程从左往有,遇到括号停下来,将第一个括号里的东西看成一个整体第 13 题:(c)考查什么时候数组就是指针对某些类型 T 而言,如果一个表达式是T (T 的数组),

26、这个表达式的值实际上就是指向该数组的第一个元素的指针所以(buf+1)5实际上就是*(buf+6)或者 buf6第 14 题:(b)sizeof(int)的值是 2,所以 p+=sizeof(int) 指向 argv2,这点估计大家都没有什么疑问(p+=sizeof(int)-1指向 argv1,能理解吗,因为(p+=sizeof(int)-1就相当于(p+=2)-1, 也就是(p+2-1)第 15 题:(c)在 C 编译器通常提供了一系列处理可变参数的宏,以屏蔽不同的硬件平台造成的差异,增加程序的可移植性。这些宏包括va_start、 va_arg 和 va_end 等。采用 ANSI 标准

27、形式时,参数个数可变的函数的原型声明是:type funcn ame(type para1, type para2, .)这种形式至少需要一个普通的形式参数,后面的省略号不表示省略,而是函数原型的一部分。type 是函数返回值和形式参数的类型。,gcc4.x 中是内置函数.不同的编译器,对这个可变长参数的实现不一样(;i; i&=i-1) k+/*计算 i 有多少 bit 被置 1 */关于可变长参数,可参阅urlhttp:/www.upsd p; /*定义一个变量,保存函数参数列表的指针*/va_start( p , n);/* 用 va_start 宏 初始化 变量 p,va_st

28、art 宏的第 2 个参数 n ,是一个固定的参数,必须是我们自己定义的变长函数的最后一个入栈的参数也就是调用的时候参数列表里的第1 个参数*/for (; jvn; +j)/* j 从 1 开始,遍历所有可变参数*/i = va_arg( p , int);for (; i;i &=i-1)+k;/*va_arg 取出当前的参数,并认为取出的参数是一个整数(int) */*判断取出的 i 是否为 0*/*如果 i 不为 0, k 自加,i 与 i-1 进行与逻辑运算,直到 i 为 0这是一个技巧,下面会谈到它的功能*/当我们调用 ripple 函数时, 传递给 ripple 函数的 va_start初始化 p 士气指向第一个未命名的参数 个).每次对 va_arg 的调用,都将返回一个参数,并且把va_arg 用一个类型名来决定返回的参数是何种类型参数列表的第一个参数n 的值是 3 .(n 是有

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论