功勋会员
WJ
- 积分
- 6304
- 威望
- 1456
- 贡献
- 4674
- 兑换币
- 17
- 注册时间
- 2008-4-6
- 在线时间
- 87 小时
|
<>接上一贴:</P><P><FONT size=4>11. 中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。 <BR>__interrupt double compute_area (double radius) <BR>{ <BR>double area = PI * radius * radius; <BR>printf("\nArea = %f", area); <BR>return area; <BR>} <BR>?; ISR 不能返回一个值。如果你不懂这个,那么你不会被雇用的。 <BR>?; ISR 不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。 <BR>?; 在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。 <BR>?; 与第三点一脉相承,printf()经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了。 <BR><BR>代码例子(Code examples) <BR>12 . 下面的代码输出是什么,为什么? <BR>void foo(void) <BR>{ <BR>unsigned int a = 6; <BR>int b = -20; <BR>(a+b > 6) ? puts("> 6") : puts("<= 6"); <BR>} <BR>这个问题测试你是否懂得C语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。不管如何,这无符号整型问题的答案是输出是 ”>6”。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。 因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据 <BR>类型的嵌入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了得不到这份工作的边缘。 <BR>13. 评价下面的代码片断: <BR><BR>unsigned int zero = 0; <BR>unsigned int compzero = 0xFFFF; <BR>/*1's complement of zero */ <BR>对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下: <BR>unsigned int compzero = ~0; <BR><BR>动态内存分配(Dynamic memory allocation) <BR>14. 尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配内存的过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么? <BR>这里,我期望应试者能提到内存碎片,碎片收集的问题,变量的持行时间等等。这个主题已经在ESP杂志中被广泛地讨论过了(主要是 P.J. Plauger, 他的解释远远超过我这里能提到的任何解释),所有回过头看一下这些杂志吧!让应试者进入一种虚假的安全感觉后,我拿出这么一个小节目: <BR>下面的代码片段的输出是什么,为什么? <BR>char *ptr; <BR>if ((ptr = (char *)malloc(0)) == <BR>NULL) <BR>else <BR>puts("Got a null pointer"); <BR>puts("Got a valid pointer"); <BR>该代码的输出是“Got a valid pointer”。 <BR><BR>Typedef <BR>15 Typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子: <BR>#define dPS struct s * <BR>typedef struct s * tPS; <BR>以上两种情况的意图都是要定义dPS 和 tPS 作为一个指向结构s指针。哪种方法更好呢?(如果有的话)为什么? <BR>这是一个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的。答案是:typedef更好。思考下面的例子: <BR>dPS p1,p2; <BR>tPS p3,p4; <BR>第一个扩展为 <BR>struct s * p1, p2; <BR>上面的代码定义p1为一个指向结构的指,p2为一个实际的结构,这也许不是你想要的。第二个例子正确地定义了p3 和p4 两个指针。 <BR>晦涩的语法 <BR><BR><BR>16 . C语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么? <BR>int a = 5, b = 7, c; <BR>c = a+++b; <BR>这个问题将做为这个测验的一个愉快的结尾。不管你相不相信,上面的例子是完全合乎语法的。问题是编译器如何处理它?水平不高的编译作者实际上会争论这个问题,根据最处理原则,编译器应当能处理尽可能所有合法的用法。因此,上面的代码被处理成: <BR>c = a++ + b; <BR>因此, 这段代码持行后a = 6, b = 7, c = 12。 </FONT></P><P> </P><P><FONT color=#f73809 size=7>大家喜欢就顶!</FONT></P> |
|