﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-franksunny的个人技术空间-随笔分类-概念扫盲</title><link>http://www.cppblog.com/franksunny/category/4835.html</link><description>获得人生中的成功需要的专注与坚持不懈多过天才与机会。

                       ——C.W. Wendte</description><language>zh-cn</language><lastBuildDate>Thu, 27 Nov 2008 18:46:11 GMT</lastBuildDate><pubDate>Thu, 27 Nov 2008 18:46:11 GMT</pubDate><ttl>60</ttl><item><title>Nucleus PLUS介绍</title><link>http://www.cppblog.com/franksunny/archive/2008/11/27/68036.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Thu, 27 Nov 2008 14:37:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2008/11/27/68036.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/68036.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2008/11/27/68036.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/68036.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/68036.html</trackback:ping><description><![CDATA[<h1 style="MARGIN: 17pt 0cm 16.5pt"><font size=6><font color=#000000><span lang=EN-US><font face="Times New Roman">Nucleus PLUS</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">介绍</span></font></font></h1>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">今天在公司看到</span><span lang=EN-US>VIA</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang=EN-US>CBP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系列</span><span lang=EN-US>CDMA</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">手机方案用到了</span><span lang=EN-US>Nucleus +OS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，说实话还是第一次听说，所以查了些资料，引用别人的总结做个百科小文，原文链接如下：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><a href="http://www.upsdn.net/html/2005-01/250.html"><u><font color=#800080>http://www.upsdn.net/html/2005-01/250.html</font></u></a></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<h2 style="MARGIN: 13pt 0cm"><font size=5><font color=#000000><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">一、</span><span lang=EN-US><font face=Arial>Nucleus PLUS</font></span><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">嵌入式操作系统的简单介绍</span><span lang=EN-US><o:p></o:p></span></font></font></h2>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>Nucleus PLUS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">嵌入式操作系统是目前最受欢迎的操作系统之一，是</span><span style="COLOR: #383838; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">美国</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">源代码操作系统商</span><span lang=EN-US style="COLOR: #383838; mso-bidi-font-size: 10.5pt">ATI</span><span style="COLOR: #383838; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">公司</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为实时嵌入式应用而设计的一个<span style="COLOR: red">抢先式多任务操作系统内核</span>，其</span><span lang=EN-US style="COLOR: red">95</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">％的代码是用</span><span lang=EN-US style="COLOR: red">ANSIC</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">写成的，因此非常<span style="COLOR: red">便于移植并能够支持大多数类型的处理器</span>。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从实现角度来看，</span><span lang=EN-US>Nucleus PLUS </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是一组</span><span lang=EN-US>C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数库，应用程序代码与核心函数库连接在一起，生成一个目标代码，下载到目标板的</span><span lang=EN-US>RAM</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中或直接烧录到目标板的</span><span lang=EN-US>ROM</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中执行。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>Nucleus Plus</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内核在典型的</span><span lang=EN-US>CISC</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">体系结构上占据大约</span><span lang=EN-US>20k</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">空间，而在典型的</span><span lang=EN-US>RISC</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">体系结构上占据空间为</span><span lang=EN-US>40k</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">左右，其内核数据结构占据</span><span lang=EN-US>1.5k</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字节的空间。</span><span lang=EN-US>Nucleus Plus</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以其<span style="COLOR: red">实时响应、抢先、多任务以及源代码开放</span>特性获得在通讯、国防、工业控制、航空</span><span lang=EN-US>/</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">航天、铁路、网络、</span><span lang=EN-US>POS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、自动化控制、智能家电等领域的广泛应用。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>Nucleus PLUS </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">采用了<span style="COLOR: red">软件组件的方法</span>。每个组件具有<span style="COLOR: red">单一而明确的目的</span>，通常由几个</span><span lang=EN-US>C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">及汇编语言模块构成，提供清晰的外部接口，对组件的引用就是通过这些接口完成的。除了少数一些特殊情况外，不允许从外部对组件内的全局进行访问。由于采用了软件组件的方法，</span><span lang=EN-US>Nucleus PLUS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">各个组件<span style="COLOR: red">非常易于替换和复用</span>。</span><span lang=EN-US>Nucleus PLUS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的组件包括任务控制、内存管理、任务间通信、任务的同步与互斥、中断管理、定时器及</span><span lang=EN-US>I/O</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">驱动等。</span><span lang=EN-US><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<h2 style="MARGIN: 13pt 0cm"><font size=5><font color=#000000><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">二、</span><span lang=EN-US><font face=Arial>Nucleus</font></span><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">具有的优点：</span><span lang=EN-US><o:p></o:p></span></font></font></h2>
<h3 style="MARGIN: 13pt 0cm"><font size=5><span lang=EN-US>1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、提供源代码</span><span lang=EN-US style="COLOR: red"><o:p></o:p></span></font></h3>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>Nucleus PLUS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供注释严格的</span><span lang=EN-US>C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">源级代码给每一个用户。这样，用户能够深入地了解底层内核的运作方式，并可根据自己的特殊要求删减或改动系统软件，这对软件的规范化管理及系统软件的测试都有极大的帮助。另外，由于提供了</span><span lang=EN-US>RTOS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的源级代码，用户不但可以进行</span><span lang=EN-US> RTOS </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的学习和研究，而且产品在量产时也不必支付</span><span lang=EN-US> License</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，可以省去大量的费用。对于军方来说，由于提供了源代码，用户完全可以控制内核而不必担心操作系统中可能会存在异常任务导致系统崩溃。</span><span lang=EN-US><o:p></o:p></span></p>
<h3 style="MARGIN: 13pt 0cm"><font size=5><span lang=EN-US>2</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、性价比高</span></font></h3>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>Nucleus PLUS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">由于采用了先进的微内核</span><span lang=EN-US> ( Micro-kernel ) </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">技术，因而在优先级安排，任务调度，任务切换等各个方面都有相当大的优势。另外，对</span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语言的全面支持又使得</span><span lang=EN-US>Nucleus PLUS </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang=EN-US> Kernel </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">成为名副其实的面向对象的实时操作系统内核。然而，其价格却比较合理。所以，容易被广大的研发单位接受。</span><span lang=EN-US><o:p></o:p></span></p>
<h3 style="MARGIN: 13pt 0cm"><font size=5><span lang=EN-US>3</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、易学易用</span></font></h3>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>Nucleus PLUS </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">能够结合</span><span lang=EN-US> Paradigm</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang=EN-US>SDS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以及</span><span lang=EN-US> ATI</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自己的多任务调试器组成功能强大的集成开发环境，配合相应的编译器和动态联结库以及各类底层驱动软件，用户可以轻松地进行</span><span lang=EN-US> RTOS </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的开发和调试。另外，由于这些集成开发环境</span><span lang=EN-US> ( IDE ) </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为所有的开发工程师所熟悉，因而，容易学习和使用。</span><span lang=EN-US><o:p></o:p></span></p>
<h3 style="MARGIN: 13pt 0cm"><font size=5><span lang=EN-US>4</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、功能模块丰富</span></font></h3>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>Nucleus PLUS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">除提供功能强大的内核操作系统外，还提供种类丰富的功能模块。例如用于通讯系统的局域和广域网络模块，支持图形应用的实时化</span><span lang=EN-US>Windows</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模块，支持</span><span lang=EN-US>Internet</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">网的</span><span lang=EN-US>WEB</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">产品模块，工控机实时</span><span lang=EN-US>BIOS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模块，图形化用户接口以及应用软件性能分析模块等。用户可以根据自己的应用来选择不同的应用模块。</span><span lang=EN-US><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>Nucleus PLUS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang=EN-US>RTOS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内核可支持如下类型的</span><span lang=EN-US>CPU</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span><span lang=EN-US>x86,68xxx,68HCxx,NEC V25, ColdFire, 29K,i960, MIPS, SPARClite, TI DSP, ARM6/7, StrongARM, H8/300H, SH<st1:chsdate w:st="on" IsROCDate="False" IsLunarDate="False" Day="3" Month="2" Year="2001">1/2/3</st1:chsdate>, PowerPC, V8xx, Tricore, Mcore, Panasonic MN10200, Tricore, Mcore</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等。可以说</span><span lang=EN-US>NUCLEUS+</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是<span style="COLOR: red">支持</span></span><span lang=EN-US style="COLOR: red">CPU</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类型最丰富的实时多任务</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作系统。针对各种嵌入式应用，</span><span lang=EN-US>Nucleus PLUS </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还<span style="COLOR: red">提供相应的网络协议</span>（如</span><span lang=EN-US>TCP/IP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang=EN-US>SNMP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等），以满足用户对通讯系统的开发要求。另外，<span style="COLOR: red">可重入的文件系统、可重入的</span></span><span lang=EN-US style="COLOR: red">C</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数库以及图形化界面</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等也给开发者提供了方便。针对不同的</span><span lang=EN-US>CPU</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类型，</span><span lang=EN-US>Nucleus </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还提供编译器、动态连接库、多任务调试器等相应的工具来配置用户的开发环境。</span><span lang=EN-US><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">值得提出的是</span><span lang=EN-US>ATI</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">公司最近还发表了基于</span><span lang=EN-US>Microsoft Developers Studio</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的嵌入式集成开发环境－</span><span lang=EN-US>NUCLEUS EDE</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。从而率先将嵌入式开发工具与</span><span lang=EN-US>Microsoft</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的强大开发环境结合起来，提供给工程师们强大的开发手段。</span><span lang=EN-US><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<h2 style="MARGIN: 13pt 0cm"><font size=5><font color=#000000><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">三、</span><font face=Arial> </font><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">源代码带来的优势众所周知，</span><span lang=EN-US><font face=Arial>Nucleus</font></span><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">实时多任务操作系统提供给用户源代码。</span><span lang=EN-US><o:p></o:p></span></font></font></h2>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这除商务上给用户带来巨大益处（免交</span><span lang=EN-US>Royalty</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）外，还在技术方面给用户极大的方便，即无需编写和调试</span><span lang=EN-US>BSP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，从而达到易学易用的目的，加速产品上市。对</span><span lang=EN-US>RTOS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有一定知识的工程师一定清楚，使用</span><span lang=EN-US>RTOS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最大的障碍在于编写和调试</span><span lang=EN-US>BSP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。大家知道，在调试目标系统的软件之前，必须将目标与主机连接起来并建立通讯。为此，我们可以编写一段监控程序（</span><span lang=EN-US>Monitor</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）。然而，如果要调试基于</span><span lang=EN-US>RTOS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内核的程序，主机上的调试器（</span><span lang=EN-US>Debugger</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）除要与目标建立通讯外，更重要的是必须识别</span><span lang=EN-US>RTOS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的任务，这样才能进行任务级调试（</span><span lang=EN-US>Task-aware Debugger</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）。因此，只有</span><span lang=EN-US>Monitor</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是不够的。如果我们选用的</span><span lang=EN-US>RTOS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不提供源代码，那么，主机上的调试器（</span><span lang=EN-US>Debugger</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）就只有通过用户编写的</span><span lang=EN-US>BSP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来了解</span><span lang=EN-US>Kernel</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在现有硬件平台上对各个任务进行调度的情况。显然，编写</span><span lang=EN-US>BSP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">必须对</span><span lang=EN-US>CPU</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目标系统的硬件以及应用软件等有全面而深入的了解。一般说来，对于一个有一定硬件开发经验的工程师来说，编写一个新的</span><span lang=EN-US>BSP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">要花的平均时间为两个月左右。这对于一个新手来说可是比较困难的。对于编写</span><span lang=EN-US>BSP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的工程师来说，另外一个更大的挑战就是如何调试</span><span lang=EN-US>BSP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，即如何验证所编写的</span><span lang=EN-US>BSP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是否正确。通常刚刚焊接安装好的</span><span lang=EN-US>PCB</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">板中，硬件或软件的故障（</span><span lang=EN-US>Bugs</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）是比较多的。甚至更常见的是</span><span lang=EN-US>CPU</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">部分都没有运作正常。有时时序错误和总线错误都还存在。在您把写好的</span><span lang=EN-US>BSP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">烧入</span><span lang=EN-US>EPROM</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（或</span><span lang=EN-US>FLASH</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）中试图将目标与主机建立联系时，您几乎</span><span lang=EN-US>100%</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">地会发现根本无法通讯，眼前一团漆黑，不知是软件有错误还是硬件不运转。</span><span lang=EN-US>BSP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在正常运行吗？不得而知。在焦急和摸索中您可能发现几个月已悄然而过。对于早期的实时操作系统来说，</span><span lang=EN-US>BSP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是必由之路。然而，新一代的</span><span lang=EN-US>RTOS-Nucleus PLUS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则避免了</span><span lang=EN-US>BSP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">带来的痛苦过程。因为</span><span lang=EN-US>Nucleus</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的调试是基于全新的动态连接库（</span><span lang=EN-US>DLL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）。用户只须通过监控程序（</span><span lang=EN-US>Monitor</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）或者</span><span lang=EN-US>BDM</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">调试口（或者</span><span lang=EN-US>JTAG</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">调试口）建立目标系统（</span><span lang=EN-US>Target</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）与主机（</span><span lang=EN-US>Host</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）之间的通讯，并给主机上的</span><span lang=EN-US>Debugger</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">初始化特性中加入</span><span lang=EN-US>Nucleus</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的动态连接库（</span><span lang=EN-US>DLLs</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">），这时，调试器就能够自动地去识别运行在目标系统中的</span><span lang=EN-US>Nucleus</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内核和各个应用任务，从而完成任务级调试。上述的动态连接库（</span><span lang=EN-US>DLLs</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）是由</span><span lang=EN-US>RTOS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">厂商和</span><span lang=EN-US>Debugger</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">厂商合作完成的，用户无须自行编写。因此，</span><span lang=EN-US style="COLOR: red">Nucleus</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的用户只需要将精力放在基于</span><span lang=EN-US style="COLOR: red">Nucleus</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的编程工作中。对于一个新手，往往经过一天到两天的学习和培训，就可以投入到应用程序编制工作中去，无需花大量的时间去研究</span><span lang=EN-US style="COLOR: red">CPU</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，特定的硬件</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">另外，由于有了源程序，用户在调试程序时可以清楚地通过</span><span lang=EN-US>STEP INTO</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">命令，追踪到</span><span lang=EN-US>RTOS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的内层中去，观看和学习</span><span lang=EN-US>Kernel</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对任务的管理和调度机制。对于有志研究</span><span lang=EN-US>RTOS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">深层技术的工程师来说极为方便。对于</span><span lang=EN-US>Motorola 68K</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang=EN-US>PowerPC</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，用户可以利用</span><span lang=EN-US>GreenHill</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">公司的</span><span lang=EN-US>Mutil</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">调试器或</span><span lang=EN-US>TRACE-ICD</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来完成</span><span lang=EN-US>Nucleus PLUS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的调试；对于</span><span lang=EN-US>ARM</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang=EN-US>StrongARM</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，用户可以利用</span><span lang=EN-US>ARM</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">公司的</span><span lang=EN-US>SDT251</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">调试器或</span><span lang=EN-US>TRACE-ICD</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来完成</span><span lang=EN-US>Nucleus PLUS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的调试；对于</span><span lang=EN-US>Intel x86</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实模式，用户可以利用</span><span lang=EN-US>Paradigm</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">公司的调试器及其</span><span lang=EN-US>DLL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来进行任务级调试；对于</span><span lang=EN-US>Intel x86</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">保护模式则可以利用</span><span lang=EN-US>SSI</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">公司</span><span lang=EN-US>Softprobe</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">调试器和</span><span lang=EN-US>SSI DLL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来调试；对于</span><span lang=EN-US>i960</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang=EN-US>SH3/4</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang=EN-US>ARM6/7</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang=EN-US>MIPS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等芯片，则可以使用</span><span lang=EN-US>ATI</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">公司自己的</span><span lang=EN-US>UDB</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">调试器来进行任务的调试。结论：动态连接库（</span><span lang=EN-US>DLL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）是在</span><span lang=EN-US>RTOS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工具中新出现的应用趋势，通过这种方式，用户可以免去</span><span lang=EN-US>BSP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">带来的麻烦，灵活方便地进行开发和调试，大大加速开发进度。</span><span lang=EN-US>Nucleus</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实时操作系统提供源代码，支持丰富的</span><span lang=EN-US>CPU</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">种类，配合各类</span><span lang=EN-US>DLL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">动态连接库，为使用和研究</span><span lang=EN-US>RTOS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">技术的工程带来极大的利益。</span><span lang=EN-US><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><span style="mso-spacerun: yes">&nbsp;</span></span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行</span><span lang=EN-US style="COLOR: red">ARM</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系列的开发需要大量的设备投入</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，另外如果做比较大型的系统，还必须要操作系统，购买<span style="COLOR: red">一个好的操作系统也是需要几十万元</span>。</span><span lang=EN-US>ARM</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的<span style="COLOR: red">应用层研发可以建立在</span></span><span lang=EN-US style="COLOR: red">C</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang=EN-US style="COLOR: red">C</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">＋＋及其他的大多数开发语言</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上，这对于软件公司来说是很方便的，只要准备好硬件及操作系统，其他的工作就可以分模块给</span><span lang=EN-US>N</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个人来进行。而对于底层的东西，</span><span lang=EN-US>ARM</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">公司也可以有比较大力度的支持，因此如果需要用</span><span lang=EN-US>ARM</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系列开发高端产品，可行性是比较高的，开发周期也不会很长。当然，对于</span><span lang=EN-US>arm</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">芯片，还是有一定的限制，比如没有除法指令，这样在编程时就要尽量避免用除法，否则会带来程序代码的增加和执行速度的降低。一般说，除法还是可以通过移位和乘法来代替。<br><br><br>另外，好久没上来码字了，上周结束失业，估计金融危机对我的影响暂时结束一下了吧。</span></p>
<img src ="http://www.cppblog.com/franksunny/aggbug/68036.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2008-11-27 22:37 <a href="http://www.cppblog.com/franksunny/archive/2008/11/27/68036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IP地址与子网掩码</title><link>http://www.cppblog.com/franksunny/archive/2007/08/05/29403.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Sun, 05 Aug 2007 14:03:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2007/08/05/29403.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/29403.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2007/08/05/29403.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/29403.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/29403.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;IP地址与子网掩码&nbsp;一般考试中都会给定一个IP地址和对应的子网掩码，让你计算1、子网数目2、网络号3、主机号4、广播地址5、可用IP地址范围碰到这类题，我们应该怎么样来解题呢。方法如下：首先，不要管这个IP是A类还是B类还是C类，IP是哪一类对于解题是没有任何意义的，因为在很多题中B类掩码和A类或是C类网络一起出现，不要把这认为是一个错误，很多时候都是这样出题...&nbsp;&nbsp;<a href='http://www.cppblog.com/franksunny/archive/2007/08/05/29403.html'>阅读全文</a><img src ="http://www.cppblog.com/franksunny/aggbug/29403.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2007-08-05 22:03 <a href="http://www.cppblog.com/franksunny/archive/2007/08/05/29403.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于C51内的code，idata，xdata</title><link>http://www.cppblog.com/franksunny/archive/2007/08/05/29393.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Sun, 05 Aug 2007 10:19:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2007/08/05/29393.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/29393.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2007/08/05/29393.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/29393.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/29393.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关于</span><span lang=EN-US style="FONT-SIZE: 16pt">C51</span><span style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内的</span><span lang=EN-US style="FONT-SIZE: 16pt">code</span><span style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang=EN-US style="FONT-SIZE: 16pt">idata</span><span style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang=EN-US style="FONT-SIZE: 16pt">xdata<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以前没搞过</span><span lang=EN-US>C51</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，大学时代跟单片机老师的时候也是捣鼓下汇编，现在重新搞单片机，因为手头资料不多，找到一些</span><span lang=EN-US>C51</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的程序，发现里面有这些关键字，不甚明了，没办法只好找了下，发现如下描述：<br></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt; mso-char-indent-count: 2.0"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><br>&nbsp;&nbsp; 从数据存储类型来说，</span><span lang=EN-US style="FONT-SIZE: 12pt">8051</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系列有<span style="COLOR: red">片内、片外程序存储器，片内、片外数据存储器，片内程序存储器</span>还分<span style="COLOR: red">直接寻址区和间接寻址</span>类型，分别对应</span><span lang=EN-US style="FONT-SIZE: 12pt">code</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US style="FONT-SIZE: 12pt">data</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US style="FONT-SIZE: 12pt">xdata</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US style="FONT-SIZE: 12pt">idata</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以及根据</span><span lang=EN-US style="FONT-SIZE: 12pt">51</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系列特点而设定的</span><span lang=EN-US style="FONT-SIZE: 12pt">pdata</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类型，使用不同的存储器，将使程序执行效率不同，在编写</span><span lang=EN-US style="FONT-SIZE: 12pt">C51</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序时，最好指定变量的存储类型，这样将有利于提高程序执行效率</span><span lang=EN-US style="FONT-SIZE: 12pt">(</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">此问题将在后面专门讲述</span><span lang=EN-US style="FONT-SIZE: 12pt">)</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。与</span><span lang=EN-US style="FONT-SIZE: 12pt">ANSI-C</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">稍有不同，它只分</span><span lang=EN-US style="FONT-SIZE: 12pt">SAMLL</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US style="FONT-SIZE: 12pt">COMPACT</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US style="FONT-SIZE: 12pt">LARGE</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式，各种不同的模式对应不同的实际硬件系统，也将有不同的编译结果。</span><span lang=EN-US style="FONT-SIZE: 12pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span><span lang=EN-US>51</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系列中</span><span lang=EN-US>data,idata,xdata,pdata</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的区别</span><span lang=EN-US><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>data:</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">固定指前面</span><span lang=EN-US>0x00-0x<st1:chmetcnv UnitName="F" SourceValue="7" HasSpace="False" Negative="False" NumberType="1" TCSC="0" w:st="on">7f</st1:chmetcnv></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang=EN-US>128</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个</span><span lang=EN-US>RAM</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，可以用</span><span lang=EN-US>acc</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">直接读写的，速度最快，生成的代码也最小。</span><span lang=EN-US><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>idata:</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">固定指前面</span><span lang=EN-US>0x00-0xff</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang=EN-US>256</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个</span><span lang=EN-US>RAM,</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其中前</span><span lang=EN-US>128</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang=EN-US>data</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang=EN-US>128</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">完全相同，只是因为访问的方式不同。</span><span lang=EN-US>idata</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是用类似</span><span lang=EN-US>C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的指针方式访问的。汇编中的语句为：</span><span lang=EN-US>mox ACC,@Rx.(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不重要的补充：</span><span lang=EN-US>c</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中</span><span lang=EN-US>idata</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">做指针式的访问效果很好</span><span lang=EN-US>) <o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>xdata:</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">外部扩展</span><span lang=EN-US>RAM</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，一般指外部</span><span lang=EN-US>0x0000-0xffff</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">空间，用</span><span lang=EN-US>DPTR</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">访问。</span><span lang=EN-US><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">pdata:外部扩展RAM的低256个字节，地址出现在A0-A7的上时读写，用movx ACC,@Rx读写。这个比较特殊，而且C51好象有对此BUG，建议少用。但也有他的优点，具体用法属于中级问题，这里不提。</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cppblog.com/franksunny/aggbug/29393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2007-08-05 18:19 <a href="http://www.cppblog.com/franksunny/archive/2007/08/05/29393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]重入和不可重入函数概念浅析</title><link>http://www.cppblog.com/franksunny/archive/2007/08/03/29269.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Fri, 03 Aug 2007 04:56:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2007/08/03/29269.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/29269.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2007/08/03/29269.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/29269.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/29269.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可重入函数与不可重入函数</span><span lang=EN-US style="FONT-SIZE: 16pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">主要用于多任务环境中，一个可重入的函数简单来说就是可以被中断的函数，也就是说，可以在这个函数执行的任何时刻中断它，转入<span lang=EN-US>OS</span>调度下去执行另外一段代码，而返回控制时不会出现什么错误；而不可重入的函数由于使用了一些系统资源，比如全局变量区，中断向量表等，所以它如果被中断的话，可能会出现问题，这类函数是不能运行在多任务环境下的。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">也可以这样理解，重入即表示重复进入，首先它意味着这个函数可以被中断，其次意味着它除了使用自己栈上的变量以外不依赖于任何环境（包括<span lang=EN-US>static</span>），这样的函数就是<span lang=EN-US>purecode</span>（纯代码）可重入，可以允许有该函数的多个副本在运行，由于它们使用的是分离的栈，所以不会互相干扰。如果确实需要访问全局变量（包括<span lang=EN-US>static</span>），一定要注意实施互斥手段。可重入函数在并行运行环境中非常重要，但是一般要为访问全局变量付出一些性能代价。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">编写可重入函数时，若使用全局变量，则应通过关中断、信号量（即<span lang=EN-US>P</span>、<span lang=EN-US>V</span>操作）等手段对其加以保护。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><span style="mso-spacerun: yes">&nbsp;</span></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">说明：若对所使用的全局变量不加以保护，则此函数就不具有可重入性，即当多个进程调用此函数时，很有可能使有关全局变量变为不可知状态。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">示例：假设<span lang=EN-US>Exam</span>是<span lang=EN-US>int</span>型全局变量，函数<span lang=EN-US>Squre_Exam</span>返回<span lang=EN-US>Exam</span>平方值。那么如下函数不具有可重入性。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">unsigned int example( int para ) <o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">&nbsp;&nbsp;&nbsp; unsigned int temp;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Exam = para; // </span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">（<span lang=EN-US>**</span>）<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; temp = Square_Exam( );<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return temp;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; </span>此函数若被多个进程调用的话，其结果可能是未知的，因为当（<span lang=EN-US>**</span>）语句刚执行完后，另外一个使用本函数的进程可能正好被激活，那么当新激活的进程执行到此函数时，将使<span lang=EN-US>Exam</span>赋与另一个不同的<span lang=EN-US>para</span>值，所以当控制重新回到<span lang=EN-US>&#8220;temp = Square_Exam( )&#8221;</span>后，计算出的<span lang=EN-US>temp</span>很可能不是预想中的结果。此函数应如下改进。<span lang=EN-US><br><br>&nbsp;&nbsp;&nbsp; unsigned int example( int para ) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned int temp;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [</span>申请信号量操作<span lang=EN-US>] //(1)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Exam = para;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; temp = Square_Exam( );<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [</span>释放信号量操作<span lang=EN-US>]<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return temp;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; (1)</span>若申请不到<span lang=EN-US>&#8220;</span>信号量<span lang=EN-US>&#8221;</span>，说明另外的进程正处于给<span lang=EN-US>Exam</span>赋值并计算其平方过程中（即正在使用此信号）<span lang=EN-US>,</span>本进程必须等待其释放信号后，才可继续执行。若申请到信号，则可继续执行，但其它进程必须等待本进程释放信号量后，才能再使用本信号。<span lang=EN-US><br><br>&nbsp;&nbsp;&nbsp; </span>保证函数的可重入性的方法：<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; </span>在写函数时候尽量使用局部变量（例如寄存器、堆栈中的变量），对于要使用的全局变量要加以保护（如采取关中断、信号量等方法），这样构成的函数就一定是一个可重入的函数。<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; VxWorks</span>中采取的可重入的技术有：<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; * </span>动态堆栈变量（各子函数有自己独立的堆栈空间）<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; * </span>受保护的全局变量和静态变量<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; * </span>任务变量<span lang=EN-US><br><br><br>--------------------------------------------------<br>&nbsp;&nbsp;&nbsp; </span>在实时系统的设计中，经常会出现多个任务调用同一个函数的情况。如果这个函数不幸被设计成为不可重入的函数的话，那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据，从而导致不可预料的后果。那么什么是可重入函数呢？所谓可重入函数是指一个可以被多个任务调用的过程，任务在调用时不必担心数据是否会出错。不可重入函数在实时系统设计中被视为不安全函数。满足下列条件的函数多数是不可重入的：<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; 1) </span>函数体内使用了静态的数据结构；<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; 2) </span>函数体内调用了<span lang=EN-US>malloc()</span>或者<span lang=EN-US>free()</span>函数；<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; 3) </span>函数体内调用了标准<span lang=EN-US>I/O</span>函数。<span lang=EN-US><br><br>&nbsp;&nbsp;&nbsp; </span>下面举例加以说明。<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; A. </span>可重入函数<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; void strcpy(char *lpszDest, char *lpszSrc)<o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><span style="mso-spacerun: yes">&nbsp;</span>{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while(*lpszDest++=*lpszSrc++);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *dest=0;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; B. </span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">不可重入函数<span lang=EN-US>1<br>&nbsp;&nbsp;&nbsp; charcTemp;//</span>全局变量<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; void SwapChar1(char *lpcX, char *lpcY)<o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><span style="mso-spacerun: yes">&nbsp;</span>{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cTemp=*lpcX;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *lpcX=*lpcY;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; lpcY=cTemp;//</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">访问了全局变量<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; C. </span>不可重入函数<span lang=EN-US>2<br>&nbsp;&nbsp;&nbsp; void SwapChar2(char *lpcX,char *lpcY)<o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><span style="mso-spacerun: yes">&nbsp;</span>{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; static char cTemp;//</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">静态局部变量<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cTemp=*lpcX;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *lpcX=*lpcY;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; lpcY=cTemp;//</span>使用了静态局部变量<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; </span>问题<span lang=EN-US>1</span>，如何编写可重入的函数？<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; </span>答：在函数体内不访问那些全局变量，不使用静态局部变量，坚持只使用局部变量，写出的函数就将是可重入的。如果必须访问全局变量，记住利用互斥信号量来保护全局变量。<span lang=EN-US><br><br>&nbsp;&nbsp;&nbsp; </span>问题<span lang=EN-US>2</span>，如何将一个不可重入的函数改写成可重入的函数？<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; </span>答：把一个不可重入函数变成可重入的唯一方法是用可重入规则来重写它。其实很简单，只要遵守了几条很容易理解的规则，那么写出来的函数就是可重入的。<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; 1) </span>不要使用全局变量。因为别的代码很可能覆盖这些变量值。<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; 2) </span>在和硬件发生交互的时候，切记执行类似<span lang=EN-US>disinterrupt()</span>之类的操作，就是关闭硬件中断。完成交互记得打开中断，在有些系列上，这叫做<span lang=EN-US>&#8220;</span>进入<span lang=EN-US>/</span>退出核心<span lang=EN-US>&#8221;</span>。<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; 3) </span>不能调用其它任何不可重入的函数。<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; 4) </span>谨慎使用堆栈。最好先在使用前先<span lang=EN-US>OS_ENTER_KERNAL</span>。<span lang=EN-US><br><br>&nbsp;&nbsp;&nbsp; </span>堆栈操作涉及内存分配，稍不留神就会造成益出导致覆盖其他任务的数据，所以，请谨慎使用堆栈！最好别用！很多黑客程序就利用了这一点以便系统执行非法代码从而轻松获得系统控制权。还有一些规则，总之，时刻记住一句话：保证中断是安全的！<span lang=EN-US><br><br>&nbsp;&nbsp;&nbsp; </span>实例问题：曾经设计过如下一个函数，在代码检视的时候被提醒有<span lang=EN-US>bug</span>，因为这个函数是不可重入的，为什么？<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; unsigned int sum_int( unsigned int base ) <o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned int index;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; static unsigned int sum = 0; // </span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">注意，是<span lang=EN-US>static</span>类型<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (index = 1; index &lt;= base; index++)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sum += index;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return sum;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; </span>分析：所谓的函数是可重入的（也可以说是可预测的），即只要输入数据相同就应产生相同的输出。这个函数之所以是不可预测的，就是因为函数中使用了<span lang=EN-US>static</span>变量，因为<span lang=EN-US>static</span>变量的特征，这样的函数被称为：带<span lang=EN-US>&#8220;</span>内部存储器<span lang=EN-US>&#8221;</span>功能的的函数。因此如果需要一个可重入的函数，一定要避免函数中使用<span lang=EN-US>static</span>变量，这种函数中的<span lang=EN-US>static</span>变量，使用原则是，能不用尽量不用。<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; </span>将上面的函数修改为可重入的函数，只要将声明<span lang=EN-US>sum</span>变量中的<span lang=EN-US>static</span>关键字去掉，变量<span lang=EN-US>sum</span>即变为一个<span lang=EN-US>auto</span>类型的变量，函数即变为一个可重入的函数。<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; </span>当然，有些时候，在函数中是必须要使用<span lang=EN-US>static</span>变量的，比如当某函数的返回值为指针类型时，则必须是<span lang=EN-US>static</span>的局部变量的地址作为返回值，若为<span lang=EN-US>auto</span>类型，则返回为错指针。</span><span lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<img src ="http://www.cppblog.com/franksunny/aggbug/29269.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2007-08-03 12:56 <a href="http://www.cppblog.com/franksunny/archive/2007/08/03/29269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于变量的存储问题</title><link>http://www.cppblog.com/franksunny/archive/2007/06/01/25277.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Fri, 01 Jun 2007 07:00:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2007/06/01/25277.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/25277.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2007/06/01/25277.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/25277.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/25277.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;关于变量的存储问题&nbsp;以前从事上位机程序代码的编写，压根不用很具体的考虑变量的具体存放位置，只知道以下概念就行了：1. 堆区（ heap ）：由程序员申请分配和释放，属动态内存分配方式，变量存放于动态存储区，若程序员不释放，程序结束时可能会由 OS 回收。不过这个内存分配很容易引起问题，如果申请的内存不释放就会造成内存泄漏；如果释放的不是所要释放的内存，则轻者引...&nbsp;&nbsp;<a href='http://www.cppblog.com/franksunny/archive/2007/06/01/25277.html'>阅读全文</a><img src ="http://www.cppblog.com/franksunny/aggbug/25277.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2007-06-01 15:00 <a href="http://www.cppblog.com/franksunny/archive/2007/06/01/25277.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]socket 各种头数据结构及简要说明</title><link>http://www.cppblog.com/franksunny/archive/2007/01/11/17537.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Thu, 11 Jan 2007 15:16:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2007/01/11/17537.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/17537.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2007/01/11/17537.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/17537.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/17537.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: socket 各种头数据结构及简要说明 &nbsp; 发布者： 许超 　　发表日期： 2006-06-12 18:44:51.153 原作者： supermgr &nbsp; socket&nbsp; 各种头数据结构，及简要说明。 //DATATYPE typedef signed char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;<a href='http://www.cppblog.com/franksunny/archive/2007/01/11/17537.html'>阅读全文</a><img src ="http://www.cppblog.com/franksunny/aggbug/17537.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2007-01-11 23:16 <a href="http://www.cppblog.com/franksunny/archive/2007/01/11/17537.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]网络管理之TCP/UDP协议篇</title><link>http://www.cppblog.com/franksunny/archive/2007/01/11/17535.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Thu, 11 Jan 2007 14:50:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2007/01/11/17535.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/17535.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2007/01/11/17535.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/17535.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/17535.html</trackback:ping><description><![CDATA[<p style="LINE-HEIGHT: 150%; TEXT-ALIGN: center" align=center><font face=宋体><strong><span style="FONT-SIZE: 13.5pt; COLOR: black; LINE-HEIGHT: 150%">网络管理之<span lang=EN-US>TCP/UDP</span>协议篇</span> </strong><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: black; LINE-HEIGHT: 150%"><o:p></o:p></span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%"><span lang=EN-US style="DISPLAY: none; FONT-SIZE: 9pt; COLOR: black; LINE-HEIGHT: 150%; mso-hide: all"><o:p>&nbsp;</o:p> </span></p>
<div class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 14pt; TEXT-ALIGN: center" align=center><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #404e60">
<hr align=center width="100%" color=gray noShade SIZE=1>
</span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 12pt; LINE-HEIGHT: 14pt; TEXT-ALIGN: center" align=center><span style="FONT-SIZE: 9pt; COLOR: #404e60; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">发表时间：</span> <span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #404e60">2003-6-13 18:53:48&nbsp;</span> <span style="FONT-SIZE: 9pt; COLOR: #404e60; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来源：中国电脑教育报</span> <span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #404e60">&nbsp;</span> <span style="FONT-SIZE: 9pt; COLOR: #404e60; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作者：双木</span> <span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #404e60">&nbsp;&nbsp;</span> <span style="FONT-SIZE: 9pt; COLOR: #404e60; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">点击</span> <span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #404e60">1 </span><span style="FONT-SIZE: 9pt; COLOR: #404e60; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span> <span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #404e60; FONT-FAMILY: 宋体"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%"><span lang=EN-US style="DISPLAY: none; FONT-SIZE: 9pt; COLOR: black; LINE-HEIGHT: 150%; mso-hide: all"><o:p>&nbsp;</o:p> </span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 12pt; LINE-HEIGHT: 16pt"><span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222"></span> <span style="FONT-SIZE: 11pt; COLOR: #222222; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们学习过什么是</span> <span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222">&#8220;</span> <span style="FONT-SIZE: 11pt; COLOR: #222222; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据包</span> <span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222">&#8221;</span> <span style="FONT-SIZE: 11pt; COLOR: #222222; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。理解数据包，对于网络管理的网络安全具有至关重要的意义。比如，防火墙的作用本质就是检测网络中的数据包，判断其是否违反了预先设置的规则，如果违反就加以阻止。图</span> <span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222">1</span> <span style="FONT-SIZE: 11pt; COLOR: #222222; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就是瑞星个人版防火墙软件设置规则的界面。细心的读者会发现，图</span> <span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222">1</span> <span style="FONT-SIZE: 11pt; COLOR: #222222; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span> <span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222">&#8220;</span> <span style="FONT-SIZE: 11pt; COLOR: #222222; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">协议</span> <span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222">&#8221;</span> <span style="FONT-SIZE: 11pt; COLOR: #222222; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">栏中有</span> <span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222">&#8220;TCP&#8221;</span> <span style="FONT-SIZE: 11pt; COLOR: #222222; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span> <span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222">&#8220;UDP&#8221;</span> <span style="FONT-SIZE: 11pt; COLOR: #222222; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等名词，它们是什么意思呢？现在我们就来讲讲什么是</span> <span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222">TCP</span> <span style="FONT-SIZE: 11pt; COLOR: #222222; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span> <span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222">UDP</span> <span style="FONT-SIZE: 11pt; COLOR: #222222; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span> <span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222"><br style="mso-special-character: line-break"><br style="mso-special-character: line-break"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 12pt; LINE-HEIGHT: 16pt"><span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222"></span> <strong><span style="FONT-SIZE: 11pt; COLOR: #222222; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">面向连接的</span> </strong><strong><span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222">TCP</span> </strong><span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222"><br>&#8220;</span> <span style="FONT-SIZE: 11pt; COLOR: #222222; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">面向连接</span> <span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222">&#8221;</span> <span style="FONT-SIZE: 11pt; COLOR: #222222; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就是在正式通信前必须要与对方建立起连接。比如你给别人打电话，必须等线路接通了、对方拿起话筒才能相互通话。</span> <span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222"><br><br style="mso-special-character: line-break"><br style="mso-special-character: line-break"><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 16pt; TEXT-ALIGN: center" align=center><span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222"><img height=243 src="file:///D:/Temp/msohtml1/01/clip_image001.jpg" width=320 v:shapes="_x0000_i1026"> <o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 12pt; LINE-HEIGHT: 16pt"><span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222"><o:p>&nbsp;</o:p> </span></p>
<p style="LINE-HEIGHT: 16pt; TEXT-ALIGN: center" align=center><span style="FONT-SIZE: 11pt; COLOR: #222222"><font face=宋体>图<span lang=EN-US>1<o:p></o:p></span></font> </span></p>
<p style="LINE-HEIGHT: 16pt"><font face=宋体><span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222">TCP</span> <span style="FONT-SIZE: 11pt; COLOR: #222222">（<span lang=EN-US>Transmission Control Protocol</span>，传输控制协议）是基于连接的协议，也就是说，在正式收发数据前，必须和对方建立可靠的连接。一个<span lang=EN-US>TCP</span>连接必须要经过三次<span lang=EN-US>&#8220;</span>对话<span lang=EN-US>&#8221;</span>才能建立起来，其中的过程非常复杂，我们这里只做简单、形象的介绍，你只要做到能够理解这个过程即可。我们来看看这三次对话的简单过程：主机<span lang=EN-US>A</span>向主机<span lang=EN-US>B</span>发出连接请求数据包：<span lang=EN-US>&#8220;</span>我想给你发数据，可以吗？<span lang=EN-US>&#8221;</span>，这是第一次对话；主机<span lang=EN-US>B</span>向主机<span lang=EN-US>A</span>发送同意连接和要求同步（同步就是两台主机一个在发送，一个在接收，协调工作）的数据包：<span lang=EN-US>&#8220;</span>可以，你什么时候发？<span lang=EN-US>&#8221;</span>，这是第二次对话；主机<span lang=EN-US>A</span>再发出一个数据包确认主机<span lang=EN-US>B</span>的要求同步：<span lang=EN-US>&#8220;</span>我现在就发，你接着吧！<span lang=EN-US>&#8221;</span>，这是第三次对话。三次<span lang=EN-US>&#8220;</span>对话<span lang=EN-US>&#8221;</span>的目的是使数据包的发送和接收同步，经过三次<span lang=EN-US>&#8220;</span>对话<span lang=EN-US>&#8221;</span>之后，主机<span lang=EN-US>A</span>才向主机<span lang=EN-US>B</span>正式发送数据。<span lang=EN-US><o:p></o:p></span></span> </font></p>
<p style="MARGIN-BOTTOM: 12pt; LINE-HEIGHT: 16pt"><font face=宋体><span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222">TCP</span> <span style="FONT-SIZE: 11pt; COLOR: #222222">协议能为应用程序提供可靠的通信连接，使一台计算机发出的字节流无差错地发往网络上的其他计算机，对可靠性要求高的数据通信系统往往使用<span lang=EN-US>TCP</span>协议传输数据。<span lang=EN-US><o:p></o:p></span></span> </font></p>
<p style="LINE-HEIGHT: 16pt; TEXT-ALIGN: center" align=center><span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222"><font face=宋体><img height=110 src="file:///D:/Temp/msohtml1/01/clip_image002.jpg" width=200 v:shapes="_x0000_i1027"> <o:p></o:p></font></span></p>
<p style="LINE-HEIGHT: 16pt; TEXT-ALIGN: center" align=center><span style="FONT-SIZE: 11pt; COLOR: #222222"><font face=宋体>图<span lang=EN-US>2<o:p></o:p></span></font> </span></p>
<p style="MARGIN-BOTTOM: 12pt; LINE-HEIGHT: 16pt"><font face=宋体><span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222"></span> <span style="FONT-SIZE: 11pt; COLOR: #222222">我们来做一个实验，用计算机<span lang=EN-US>A</span>（安装<span lang=EN-US>Windows 2000 Server</span>操作系统）从<span lang=EN-US>&#8220;</span>网上邻居<span lang=EN-US>&#8221;</span>上的一台计算机<span lang=EN-US>B</span>拷贝大小为<span lang=EN-US>8,644,608</span>字节的文件，通过状态栏右下角网卡的发送和接收指标就会发现：虽然是数据流是由计算机<span lang=EN-US>B</span>流向计算机<span lang=EN-US>A</span>，但是计算机<span lang=EN-US>A</span>仍发送了<span lang=EN-US>3,456</span>个数据包，如图<span lang=EN-US>2</span>所示。这些数据包是怎样产生的呢？因为文件传输时使用了<span lang=EN-US>TCP/IP</span>协议，更确切地说是使用了面向连接的<span lang=EN-US>TCP</span>协议，计算机<span lang=EN-US>A</span>接收数据包的时候，要向计算机<span lang=EN-US>B</span>回发数据包，所以也产生了一些通信量。<span lang=EN-US><o:p></o:p></span></span> </font></p>
<p style="LINE-HEIGHT: 16pt; TEXT-ALIGN: center" align=center><span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222"><font face=宋体><img height=128 src="file:///D:/Temp/msohtml1/01/clip_image003.jpg" width=125 v:shapes="_x0000_i1028"> <o:p></o:p></font></span></p>
<p style="LINE-HEIGHT: 16pt; TEXT-ALIGN: center" align=center><span style="FONT-SIZE: 11pt; COLOR: #222222"><font face=宋体>图<span lang=EN-US>3<o:p></o:p></span></font> </span></p>
<p style="MARGIN-BOTTOM: 12pt; LINE-HEIGHT: 16pt"><span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222"><font face=宋体></font> </span><span style="FONT-SIZE: 11pt; COLOR: #222222"><font face=宋体>如果事先用网络监视器监视网络流量，就会发现由此产生的数据流量是<span lang=EN-US>9,478,819</span>字节，比文件大小多出<span lang=EN-US>10.96%</span>（如图<span lang=EN-US>3</span>所示），原因不仅在于数据包和帧本身占用了一些空间，而且也在于<span lang=EN-US>TCP</span>协议面向连接的特性导致了一些额外的通信量的产生。</font> <span lang=EN-US><br><font face=宋体><o:p></o:p></font> </span></span></p>
<p style="MARGIN-BOTTOM: 12pt; LINE-HEIGHT: 16pt"><strong><span style="FONT-SIZE: 11pt; COLOR: #222222"><font face=宋体>面向非连接的<span lang=EN-US>UDP</span>协议</font> </span></strong><span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222"><br><br><br><font face=宋体>&#8220;</font> </span><span style="FONT-SIZE: 11pt; COLOR: #222222"><font face=宋体>面向非连接<span lang=EN-US>&#8221;</span>就是在正式通信前不必与对方先建立连接，不管对方状态就直接发送。这与现在风行的手机短信非常相似：你在发短信的时候，只需要输入对方手机号就<span lang=EN-US>OK</span>了。</font> <span lang=EN-US><br><br><font face=宋体>UDP</font> </span><font face=宋体>（<span lang=EN-US>User Data Protocol</span>，用户数据报协议）是与<span lang=EN-US>TCP</span>相对应的协议。它是面向非连接的协议，它不与对方建立连接，而是直接就把数据包发送过去！<span lang=EN-US><o:p></o:p></span></font> </span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 16pt"><span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222"><o:p>&nbsp;</o:p> </span></p>
<p style="LINE-HEIGHT: 16pt; TEXT-ALIGN: center" align=center><span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222"><img height=101 src="file:///D:/Temp/msohtml1/01/clip_image004.jpg" width=200 v:shapes="_x0000_i1029"> <o:p></o:p></span></p>
<p style="LINE-HEIGHT: 16pt; TEXT-ALIGN: center" align=center><span style="FONT-SIZE: 11pt; COLOR: #222222"><font face=宋体>图<span lang=EN-US>4<o:p></o:p></span></font> </span></p>
<p style="MARGIN-BOTTOM: 12pt; LINE-HEIGHT: 16pt"><span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222"><font face=宋体>UDP</font> </span><span style="FONT-SIZE: 11pt; COLOR: #222222"><font face=宋体>适用于一次只传送少量数据、对可靠性要求不高的应用环境。比如，我们经常使用<span lang=EN-US>&#8220;ping&#8221;</span>命令来测试两台主机之间<span lang=EN-US>TCP/IP</span>通信是否正常，其实<span lang=EN-US>&#8220;ping&#8221;</span>命令的原理就是向对方主机发送<span lang=EN-US>UDP</span>数据包，然后对方主机确认收到数据包，如果数据包是否到达的消息及时反馈回来，那么网络就是通的。例如，在默认状态下，一次<span lang=EN-US>&#8220;ping&#8221;</span>操作发送<span lang=EN-US>4</span>个数据包（如图<span lang=EN-US>2</span>所示）。大家可以看到，发送的数据包数量是<span lang=EN-US>4</span>包，收到的也是<span lang=EN-US>4</span>包（因为对方主机收到后会发回一个确认收到的数据包）。这充分说明了<span lang=EN-US>UDP</span>协议是面向非连接的协议，没有建立连接的过程。正因为<span lang=EN-US>UDP</span>协议没有连接的过程，所以它的通信效果高；但也正因为如此，它的可靠性不如<span lang=EN-US>TCP</span>协议高。<span lang=EN-US>QQ</span>就使用<span lang=EN-US>UDP</span>发消息，因此有时会出现收不到消息的情况。</font> <span lang=EN-US><br><br><font face=宋体></font> </span><font face=宋体><strong>附表：<span lang=EN-US>tcp</span>协议和<span lang=EN-US>udp</span>协议的差别</strong> <span lang=EN-US><o:p></o:p></span></font></span></p>
<p style="LINE-HEIGHT: 16pt; TEXT-ALIGN: center" align=center><span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222"><font face=宋体><img height=104 src="file:///D:/Temp/msohtml1/01/clip_image005.jpg" width=226 v:shapes="_x0000_i1030"> <o:p></o:p></font></span></p>
<p style="LINE-HEIGHT: 16pt"><font face=宋体><span lang=EN-US style="FONT-SIZE: 11pt; COLOR: #222222">TCP</span> <span style="FONT-SIZE: 11pt; COLOR: #222222">协议和<span lang=EN-US>UDP</span>协议各有所长、各有所短，适用于不同要求的通信环境。<span lang=EN-US>TCP</span>协议和<span lang=EN-US>UDP</span>协议之间的差别如附表所示<span lang=EN-US><o:p></o:p></span></span> </font></p>
<img src ="http://www.cppblog.com/franksunny/aggbug/17535.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2007-01-11 22:50 <a href="http://www.cppblog.com/franksunny/archive/2007/01/11/17535.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>