嵌入式平台实习生笔试题目V2.0_ 答案

  • 格式:doc
  • 大小:108.50 KB
  • 文档页数:6

学校:日期:姓名:C1. 以下为WinNT下的32位C++程序,请计算sizeof的值。

(5分)防止重复定义C3. 已知strcpy函数的函数原型是:char *strcpy(char *strDest, const char *strSrc)。

其中,strDest是目的字符串,strSrc是源字符串。

(15分)(1)不调用C++/C的字符串库函数,请编写函数strcpy答:char *strcpy(char *strDest, const char *strSrc){char *s = strDest;if((strDest == NULL) || (strSrc == NULL))return NULL;while((*strDest++ = *strSrc++) != …\0‟);return s;}(2)strcpy能把strSrc的内容复制到strDest,为什么还要char *类型的返回值?答:为了实现链式表达式,如:int length = strlen( strcpy( strDest, “hello world”) );C6. 简述..在C++程序中调用被C编译器编译后的函数,为什么要加extern “C”声明?(5分)答:主要为了解决C++中函数重载这个特性。

详细如下:载,函数名一样,但汇编代号绝对不能一样。

为了区分,编译器会把函数名和参数类型合在一起作为汇编代号,这样就解决了重载问题。

具体如何把函数名和参数类型合在一起,要看编译器的帮助说明了。

这样一来,如果C++调用C,如fun(),则调用名就不是C的翻译结果_fun,而是带有参数信息的一个名字,因此就不能调用到fun(),为了解决这个问题,加上extern "C"表示该函数的调用规则是C的规则,则调用时就不使用C++规则的带有参数信息的名字,而是_fun,从而达到调用C函数的目的。

C7. 已知一个函数原型:int foo(struct type_t1 a, struct type_t2 *b),请定义一个指向该原型函数的指针类型,并用这个新定义的类型声明一个元素个数为SIZE的指针数组。

(10分)答:typedef int FOO_FUNC(struct type_t1 a, struct type_t2 *b);FOO_FUNC *foo[SIZE];H1.什么是堆栈,简述为什么需要堆栈?(5分)答:堆栈是CPU用来临时存储信息的一段读/写存储区(RAM)。

由于寄存器数量有限所以需要堆栈。

H2. 什么叫流水线深度(pipeline depth),流水线技术的优缺点是什么?(5分)答:某个时刻正在处理的指令数取决于流水线阶段的数目,通常叫流水线深度。

优点:流水线技术使CPU可同时执行多条指令,加快执行速度。

缺点:1、跳转指令太多会降低程序效率2、执行速度受限于流水线中最慢的阶段O1. 简要叙述你熟悉或接触过的一款嵌入式OS的调度方式,并简述该调度方式的特点。

(10分)答:O2. 用信号量实现生产消费过程。

假设等待信号量用wait(),释放信号量用signals(),创建进程用parbegin(...)。

(15)答:const int sizeofbuffer = /*缓冲区的大小*/semaphore s = 1;/*访问缓冲区的控制信号量*/semaphore n = 0;/*生产的数量*/semaphore e = sizeofbuffer;/*缓冲区的大小-生产的数量=容量*/void producer(){while(true){produce();wait(e);append();singal(s);signal(n);}}void consumer(){while(true){wait(n);wait(s);take();signal(s);signal(e);consume();}}void main(){parbegin(producer,consumer);}以上程序如果singal(s)和signal(n)被互换,不会影响程序,因为无论任何情况,消费者在继续进行之前必须等待在两个信号量上等待.但是如果wait(n)和wait(s)被颠倒,这时会产生严重的甚至是致命的错误,如果当缓冲区为空时,消费者曾经进入过它的临界区,那么任何一个生产者都不能往缓冲区种添加项,系统发生死锁.A1.下面是对ecos中的package的一段描述,请将其翻译成中文。

(10分)A package is a special type of component. Specifically, a package is the unit of distribution of components. It is possible to create a distribution file for a package containing all of the source code, header files, documentation, and other relevant files. This distribution file can then be installed using the appropriate tool. Afterwards it is possible to uninstall that package, or to install a later version. The core eCos distribution comes with a number of packages such as the kernel and the infrastructure. Other packages such as network stacks can come from various different sources and can be installed alongside the core distribution.A2. 智力题5个囚犯,分别按1-5号在装有100颗绿豆的麻袋抓绿豆,规定每人至少抓一颗,抓得最多和最少的人将被处死,而且,他们之间不能交流,但在抓的时候,可以摸出剩下的豆子数。

问他们中谁的存活几率最大?提示:1. 他们都是很聪明的人2. 他们的原则是先求保命,再去多杀人3. 100颗不必都分完4. 若有重复的情况,则也算最大或最小,一并处死最佳答案由题设条件可知:摸到最大绿豆数的囚犯必死,摸到最小绿豆数的囚犯必死,摸到重复绿豆数的囚犯必死。

整体来看,至少有两个囚犯必死。

绿豆数为5时,2个囚犯必死(11111)。

绿豆数为4时,3-4个囚犯必死(1211,2111)。

绿豆数为3时,4-5个囚犯必死(131,311,221,212)。

绿豆数为2、1时,5个囚犯必死。

5个囚犯的策略应该是:5个囚犯必须使摸到的绿豆数不重复,这样才会有最多存活机会;又必须使自己摸到的绿豆数居中,才会有最大存活机会。

明确了这一点,就可以往下分析了。

具体分析求机率设1号囚犯摸到的绿豆数为N。

则2号囚犯摸到的绿豆数为N+1或N-1。

因为2号囚犯可以通过摸剩余绿豆的方法得知1号囚犯摸到的绿豆数,2号囚犯摸到的绿豆数为N的话就会重复是找死,如果摸到的绿豆数与N相差大于1的话,又会使得3号囚犯有机会使摸到的绿豆数居中。

3号囚犯也会使自己摸到的绿豆数与1、2号的紧密相邻,即使自己摸到的绿豆数比1、2号的之中最大的大1,最小的小1。

因为3号囚犯可以通过摸剩余绿豆的方法得知1、2号囚犯摸到的绿豆总数,又知1、2号囚犯摸到的绿豆数相差为1,从而判断出1、2号囚犯各自摸到的绿豆数。

4、5号囚犯与3号囚犯想法基本相同。

即使自己摸到的绿豆数比自己前面所有的之中最大的大1,最小的小1。

综上所述,5个囚犯摸到的绿豆数为5个连续整数。

1号囚犯存活机率。

1号囚犯有两种情况必死:摸到的绿豆数最大或最小。

摸到的绿豆数最大或最小,只能由后4位囚犯决定,由分析可知后4位囚犯的摸到绿豆数的位置都只有两个,即一组连续整数的两边。

因此1号囚犯摸到的绿豆数为最大时的机率为(1/2)*(1/2)*(1/2)*(1/2)=1/16,最小时的机率也为1/16,1号囚犯存活机率为1-(1/16)*2=7/82号囚犯存活机率。

由对称性可知2号囚犯存活机率与1号相同,也为7/8。

3号囚犯存活机率。

3号囚犯摸到的绿豆数为最大时的机率为(1/2)*(1/2)*(1/2)=1/8,最小时的机率也为1/8,1号囚犯存活机率为1-(1/8)*2=3/4。

4号囚犯存活机率。

4号囚犯摸到的绿豆数为最大时的机率为(1/2)*(1/2)=1/4,最小时的机率也为1/4,4号囚犯存活机率为1-(1/4)*2=1/2。

5号囚犯存活机率。

5号囚犯摸到的绿豆数不是最大就是最小,必死无疑。

5号囚犯存活机率为0。

[本题到此告一段落。

但是5个囚犯的策略似乎有点问题:5号囚犯在必死无疑的情况下,还会为前4人保驾护航吗?他会不会临死拉个垫背的?于是有了以下分析。

]5号囚犯的“觉醒”(临死拉个垫背的,在必死无疑的情况下多杀人)1-4号囚犯策略如前,则4个囚犯摸到的绿豆数为4个连续整数,而5号囚犯的“觉醒”促使他多杀人。

要多杀人,他摸到的绿豆数必须为4个连续整数的中间两个,这样有4人必死,只有1人存活。

5号囚犯必死,4号囚犯摸到的绿豆数为4个连续整数的最大或最小值,也必死,1-3号囚犯有可能存活。

先不考虑5号囚犯。

1号囚犯存活机率。

1号囚犯摸到的绿豆数为4个连续整数的最大或最小值,则必死。

1号囚犯摸到的绿豆数为最大时的机率为(1/2)*(1/2)*(1/2)=1/8,最小时的机率也为1/8,1号囚犯存活机率为1-(1/8)*2=3/42号囚犯存活机率。

由对称性可知2号囚犯存活机率与1号相同,也为3/4。

3号囚犯存活机率。

3号囚犯摸到的绿豆数为最大时的机率为(1/2)*(1/2)=1/4,最小时的机率也为1/4,3号囚犯存活机率为1-(1/4)*2=1/2。

考虑5号囚犯。

由于5号囚犯摸到的绿豆数必为4个连续整数的中间两个,故1-3号囚犯存活机率都将减半。

即1、2号囚犯存活机率为(3/4)*(1/2)=3/8,3号囚犯存活机率(1/2)*(1/2)=1/4。

[5号囚犯的“觉醒”等于宣判了4号囚犯的死刑,4号囚犯考虑到这一点后,随之“觉醒”。

]4、5号囚犯共同“觉醒”此情况很简单,大家同赴九泉。

综合考虑后,1、2号囚犯存活机率最大。

参考答案:1、2号囚犯存活机率最大参考资料:网上注:此题主要是看笔试者的思路,最好是有分析过程,即便是没有给出结果也没关系,另外,此题属于附加题,不计算分值,仅做为考察笔试者思维的参考。