智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 9387|回复: 33
打印 上一主题 下一主题

实用,经典的单片机编程要点[2]

[复制链接]

14

主题

929

帖子

1

精华

功勋会员

WJ

Rank: 10Rank: 10Rank: 10

积分
6304

特殊贡献奖章

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

0

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
272
威望
209
贡献
49
兑换币
18
注册时间
2010-2-23
在线时间
7 小时
34#
发表于 2010-3-16 21:39:07 | 只看该作者
顶啊
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
威望
187
贡献
28
兑换币
4
注册时间
2010-3-15
在线时间
0 小时
33#
发表于 2010-3-15 19:16:19 | 只看该作者
回复 支持 反对

使用道具 举报

7

主题

158

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2843
QQ
威望
393
贡献
2380
兑换币
26
注册时间
2009-11-5
在线时间
35 小时
32#
发表于 2010-3-15 19:09:49 | 只看该作者
兄弟也顶了~!
回复 支持 反对

使用道具 举报

0

主题

44

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
311
威望
239
贡献
46
兑换币
6
注册时间
2010-1-13
在线时间
13 小时
31#
发表于 2010-3-15 17:46:43 | 只看该作者
不错,顶了
回复 支持 反对

使用道具 举报

6

主题

309

帖子

0

精华

高级会员

光棍

Rank: 4

积分
845
QQ
威望
595
贡献
170
兑换币
16
注册时间
2009-11-2
在线时间
40 小时
30#
发表于 2010-3-15 12:47:07 | 只看该作者
顶起
回复 支持 反对

使用道具 举报

0

主题

18

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
威望
188
贡献
18
兑换币
0
注册时间
2010-3-13
在线时间
3 小时
29#
发表于 2010-3-13 22:24:02 | 只看该作者
嗯。。不错,确实很实用的……顶一下
回复 支持 反对

使用道具 举报

7

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
356
威望
237
贡献
21
兑换币
0
注册时间
2009-10-28
在线时间
49 小时
28#
发表于 2010-3-13 16:38:50 | 只看该作者
非常感谢!
回复 支持 反对

使用道具 举报

6

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
681
威望
448
贡献
151
兑换币
0
注册时间
2010-1-10
在线时间
41 小时
27#
发表于 2010-1-21 18:19:55 | 只看该作者
学习学习~~~~
回复 支持 反对

使用道具 举报

1

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
475
威望
371
贡献
88
兑换币
0
注册时间
2010-1-10
在线时间
8 小时
26#
发表于 2010-1-20 18:46:27 | 只看该作者
顶一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2025-1-10 14:06 , Processed in 0.057376 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表