
<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">

<channel>
<title>52RD Spaces，研发人员自己的博客</title>
<link>http://www.52RD.com/Blog/</link>
<description>52RD Spaces，研发人员自己的博客</description>
<copyright>52RD</copyright>
<generator>52RD Blog</generator>
<webMaster>webmaster_52rd@126.com</webMaster>
<item>
<title><![CDATA[常用电阻阻值]]></title>
<link>http://www.52RD.com/Blog/more.asp?name=seu_dust&amp;id=14854</link>
<author>seu_dust</author>
<pubDate>2008-5-26 16:14:00</pubDate>
<description><![CDATA[<P><FONT color=#0066ff>本文为转载。</FONT></P>
<P><FONT color=#0066ff>国家标准规定了电阻的阻值按其精度分为两大系列，分别为E-24系列和E-96系列，E-24系列精度为5%，E-96系列为1%， 在这两种系列之外的电阻为非标电阻，较难采购。下面列出了常用的5％和1％精度电阻的标称值，供大家设计时参考。 <BR><BR><STRONG>精度为5％的碳膜电阻，以欧姆为单位的标称值：</STRONG> <BR><BR>1.0&nbsp;&nbsp;&nbsp;&nbsp; 5.6&nbsp;&nbsp;&nbsp;&nbsp; 33&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 160&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 820&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.9K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 510K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.7M <BR>1.1&nbsp;&nbsp;&nbsp;&nbsp; 6.2&nbsp;&nbsp;&nbsp;&nbsp; 36&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 180&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 910&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.3K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 22K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 110K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 560K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3M <BR>1.2&nbsp;&nbsp;&nbsp;&nbsp; 6.8&nbsp;&nbsp;&nbsp;&nbsp; 39&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 200&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.7K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 120K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 620K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.3M <BR>1.3&nbsp;&nbsp;&nbsp;&nbsp; 7.5&nbsp;&nbsp;&nbsp;&nbsp; 43&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 220&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.1K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.1K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 27K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 130K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 680K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.6M <BR>1.5&nbsp;&nbsp;&nbsp;&nbsp; 8.2&nbsp;&nbsp;&nbsp;&nbsp; 47&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 240&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.2K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.6K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 150K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 750K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.9M <BR>1.6&nbsp;&nbsp;&nbsp;&nbsp; 9.1&nbsp;&nbsp;&nbsp;&nbsp; 51&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 270&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.3K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6.2K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 33K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 160K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 820K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.3M <BR>1.8&nbsp;&nbsp;&nbsp;&nbsp; 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 300&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.5K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6.6K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 36K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 180K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 910K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.7M <BR>2.0&nbsp;&nbsp;&nbsp;&nbsp; 11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 62&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 330&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.6K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7.5K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 39K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 200K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.1M <BR>2.2&nbsp;&nbsp;&nbsp;&nbsp; 12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 68&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 360&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.8K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8.2K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 43K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 220K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.1M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.6M <BR>2.4&nbsp;&nbsp;&nbsp;&nbsp; 13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 75&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 390&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9.1K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 47K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 240K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.2M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6.2M <BR>2.7&nbsp;&nbsp;&nbsp;&nbsp; 15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 82&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 430&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.2K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 51K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 270K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.3M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6.8M <BR>3.0&nbsp;&nbsp;&nbsp;&nbsp; 16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 91&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 470&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.4K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 56K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 300K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.5M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7.5M <BR>3.3&nbsp;&nbsp;&nbsp;&nbsp; 18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp;&nbsp;&nbsp;&nbsp; 510&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.7K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 62K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 330K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.6M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8.2M <BR>3.6&nbsp;&nbsp;&nbsp;&nbsp; 20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 110&nbsp;&nbsp;&nbsp;&nbsp; 560&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 13K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 68K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 360K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.8M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9.1M <BR>3.9&nbsp;&nbsp;&nbsp;&nbsp; 22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 120&nbsp;&nbsp;&nbsp;&nbsp; 620&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.2K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 75K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 390K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10M <BR>4.3&nbsp;&nbsp;&nbsp;&nbsp; 24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 130&nbsp;&nbsp;&nbsp;&nbsp; 680&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.3K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 82K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 430K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.2M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15M <BR>4.7&nbsp;&nbsp;&nbsp;&nbsp; 27&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 150&nbsp;&nbsp;&nbsp;&nbsp; 750&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.6K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 91K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 470K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.4M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 22M <BR>5.1&nbsp;&nbsp;&nbsp;&nbsp; 30&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR><STRONG>&nbsp;&nbsp; 精度为1％的金属膜电阻，以欧姆为单位的标称值：</STRONG> <BR><BR>10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 33&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp;&nbsp;&nbsp;&nbsp; 332&nbsp;&nbsp;&nbsp;&nbsp; 1K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.32K&nbsp;&nbsp;&nbsp;&nbsp; 10.5K&nbsp;&nbsp;&nbsp;&nbsp; 34K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 107K&nbsp;&nbsp;&nbsp;&nbsp; 357K <BR>10.2&nbsp;&nbsp;&nbsp;&nbsp; 33.2&nbsp;&nbsp;&nbsp;&nbsp; 102&nbsp;&nbsp;&nbsp;&nbsp; 340&nbsp;&nbsp;&nbsp;&nbsp; 1.02K&nbsp;&nbsp;&nbsp;&nbsp; 3.4K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10.7K&nbsp;&nbsp;&nbsp;&nbsp; 34.8K&nbsp;&nbsp;&nbsp;&nbsp; 110K&nbsp;&nbsp;&nbsp;&nbsp; 360K <BR>10.5&nbsp;&nbsp;&nbsp;&nbsp; 34&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 105&nbsp;&nbsp;&nbsp;&nbsp; 348&nbsp;&nbsp;&nbsp;&nbsp; 1.05K&nbsp;&nbsp;&nbsp;&nbsp; 3.48K&nbsp;&nbsp;&nbsp;&nbsp; 11K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 35.7K&nbsp;&nbsp;&nbsp;&nbsp; 113K&nbsp;&nbsp;&nbsp;&nbsp; 365K <BR>10.7&nbsp;&nbsp;&nbsp;&nbsp; 34.8&nbsp;&nbsp;&nbsp;&nbsp; 107&nbsp;&nbsp;&nbsp;&nbsp; 350&nbsp;&nbsp;&nbsp;&nbsp; 1.07K&nbsp;&nbsp;&nbsp;&nbsp; 3.57K&nbsp;&nbsp;&nbsp;&nbsp; 11.3K&nbsp;&nbsp;&nbsp;&nbsp; 36K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 115K&nbsp;&nbsp;&nbsp;&nbsp; 374K <BR>11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 35.7&nbsp;&nbsp;&nbsp;&nbsp; 110&nbsp;&nbsp;&nbsp;&nbsp; 357&nbsp;&nbsp;&nbsp;&nbsp; 1.1K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.6K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11.5K&nbsp;&nbsp;&nbsp;&nbsp; 36.5K&nbsp;&nbsp;&nbsp;&nbsp; 118K&nbsp;&nbsp;&nbsp;&nbsp; 383K <BR>11.3&nbsp;&nbsp;&nbsp;&nbsp; 36&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 113&nbsp;&nbsp;&nbsp;&nbsp; 360&nbsp;&nbsp;&nbsp;&nbsp; 1.13K&nbsp;&nbsp;&nbsp;&nbsp; 3.65K&nbsp;&nbsp;&nbsp;&nbsp; 11.8K&nbsp;&nbsp;&nbsp;&nbsp; 37.4K&nbsp;&nbsp;&nbsp;&nbsp; 120K&nbsp;&nbsp;&nbsp;&nbsp; 390K <BR>11.5&nbsp;&nbsp;&nbsp;&nbsp; 36.5&nbsp;&nbsp;&nbsp;&nbsp; 115&nbsp;&nbsp;&nbsp;&nbsp; 365&nbsp;&nbsp;&nbsp;&nbsp; 1.15K&nbsp;&nbsp;&nbsp;&nbsp; 3.74K&nbsp;&nbsp;&nbsp;&nbsp; 12K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 38.3K&nbsp;&nbsp;&nbsp;&nbsp; 121K&nbsp;&nbsp;&nbsp;&nbsp; 392K <BR>11.8&nbsp;&nbsp;&nbsp;&nbsp; 37.4&nbsp;&nbsp;&nbsp;&nbsp; 118&nbsp;&nbsp;&nbsp;&nbsp; 374&nbsp;&nbsp;&nbsp;&nbsp; 1.18K&nbsp;&nbsp;&nbsp;&nbsp; 3.83K&nbsp;&nbsp;&nbsp;&nbsp; 12.1K&nbsp;&nbsp;&nbsp;&nbsp; 39K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 124K&nbsp;&nbsp;&nbsp;&nbsp; 402K <BR>12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 38.3&nbsp;&nbsp;&nbsp;&nbsp; 120&nbsp;&nbsp;&nbsp;&nbsp; 383&nbsp;&nbsp;&nbsp;&nbsp; 1.2K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.9K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12.4K&nbsp;&nbsp;&nbsp;&nbsp; 39.2K&nbsp;&nbsp;&nbsp;&nbsp; 127K&nbsp;&nbsp;&nbsp;&nbsp; 412K <BR>12.1&nbsp;&nbsp;&nbsp;&nbsp; 39&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 121&nbsp;&nbsp;&nbsp;&nbsp; 390&nbsp;&nbsp;&nbsp;&nbsp; 1.21K&nbsp;&nbsp;&nbsp;&nbsp; 3.92K&nbsp;&nbsp;&nbsp;&nbsp; 12.7K&nbsp;&nbsp;&nbsp;&nbsp; 40.2K&nbsp;&nbsp;&nbsp;&nbsp; 130K&nbsp;&nbsp;&nbsp;&nbsp; 422K <BR>12.4&nbsp;&nbsp;&nbsp;&nbsp; 39.2&nbsp;&nbsp;&nbsp;&nbsp; 124&nbsp;&nbsp;&nbsp;&nbsp; 392&nbsp;&nbsp;&nbsp;&nbsp; 1.24K&nbsp;&nbsp;&nbsp;&nbsp; 4.02K&nbsp;&nbsp;&nbsp;&nbsp; 13K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 41.2K&nbsp;&nbsp;&nbsp;&nbsp; 133K&nbsp;&nbsp;&nbsp;&nbsp; 430K <BR>12.7&nbsp;&nbsp;&nbsp;&nbsp; 40.2&nbsp;&nbsp;&nbsp;&nbsp; 127&nbsp;&nbsp;&nbsp;&nbsp; 402&nbsp;&nbsp;&nbsp;&nbsp; 1.27K&nbsp;&nbsp;&nbsp;&nbsp; 4.12K&nbsp;&nbsp;&nbsp;&nbsp; 13.3K&nbsp;&nbsp;&nbsp;&nbsp; 42.2K&nbsp;&nbsp;&nbsp;&nbsp; 137K&nbsp;&nbsp;&nbsp;&nbsp; 432K <BR>13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 41.2&nbsp;&nbsp;&nbsp;&nbsp; 130&nbsp;&nbsp;&nbsp;&nbsp; 412&nbsp;&nbsp;&nbsp;&nbsp; 1.3K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.22K&nbsp;&nbsp;&nbsp;&nbsp; 13.7K&nbsp;&nbsp;&nbsp;&nbsp; 43K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 140K&nbsp;&nbsp;&nbsp;&nbsp; 442K <BR>13.3&nbsp;&nbsp;&nbsp;&nbsp; 42.2&nbsp;&nbsp;&nbsp;&nbsp; 133&nbsp;&nbsp;&nbsp;&nbsp; 422&nbsp;&nbsp;&nbsp;&nbsp; 1.33K&nbsp;&nbsp;&nbsp;&nbsp; 4.32K&nbsp;&nbsp;&nbsp;&nbsp; 14K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 43.2K&nbsp;&nbsp;&nbsp;&nbsp; 143K&nbsp;&nbsp;&nbsp;&nbsp; 453K <BR>13.7&nbsp;&nbsp;&nbsp;&nbsp; 43&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 137&nbsp;&nbsp;&nbsp;&nbsp; 430&nbsp;&nbsp;&nbsp;&nbsp; 1.37K&nbsp;&nbsp;&nbsp;&nbsp; 4.42K&nbsp;&nbsp;&nbsp;&nbsp; 14.3K&nbsp;&nbsp;&nbsp;&nbsp; 44.2K&nbsp;&nbsp;&nbsp;&nbsp; 147K&nbsp;&nbsp;&nbsp;&nbsp; 464K <BR>14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 43.2&nbsp;&nbsp;&nbsp;&nbsp; 140&nbsp;&nbsp;&nbsp;&nbsp; 432&nbsp;&nbsp;&nbsp;&nbsp; 1.4K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.53K&nbsp;&nbsp;&nbsp;&nbsp; 14.7K&nbsp;&nbsp;&nbsp;&nbsp; 45.3K&nbsp;&nbsp;&nbsp;&nbsp; 150K&nbsp;&nbsp;&nbsp;&nbsp; 470K <BR>14.3&nbsp;&nbsp;&nbsp;&nbsp; 44.2&nbsp;&nbsp;&nbsp;&nbsp; 143&nbsp;&nbsp;&nbsp;&nbsp; 442&nbsp;&nbsp;&nbsp;&nbsp; 1.43K&nbsp;&nbsp;&nbsp;&nbsp; 4.64K&nbsp;&nbsp;&nbsp;&nbsp; 15K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 46.4K&nbsp;&nbsp;&nbsp;&nbsp; 154K&nbsp;&nbsp;&nbsp;&nbsp; 475K <BR>14.7&nbsp;&nbsp;&nbsp;&nbsp; 45.3&nbsp;&nbsp;&nbsp;&nbsp; 147&nbsp;&nbsp;&nbsp;&nbsp; 453&nbsp;&nbsp;&nbsp;&nbsp; 1.47K&nbsp;&nbsp;&nbsp;&nbsp; 4.7K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15.4K&nbsp;&nbsp;&nbsp;&nbsp; 47K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 158K&nbsp;&nbsp;&nbsp;&nbsp; 487K <BR>15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 46.4&nbsp;&nbsp;&nbsp;&nbsp; 150&nbsp;&nbsp;&nbsp;&nbsp; 464&nbsp;&nbsp;&nbsp;&nbsp; 1.5K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.75K&nbsp;&nbsp;&nbsp;&nbsp; 15.8K&nbsp;&nbsp;&nbsp;&nbsp; 47.5K&nbsp;&nbsp;&nbsp;&nbsp; 160K&nbsp;&nbsp;&nbsp;&nbsp; 499K <BR>15.4&nbsp;&nbsp;&nbsp;&nbsp; 47&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 154&nbsp;&nbsp;&nbsp;&nbsp; 470&nbsp;&nbsp;&nbsp;&nbsp; 1.54K&nbsp;&nbsp;&nbsp;&nbsp; 4.87K&nbsp;&nbsp;&nbsp;&nbsp; 16K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 48.7K&nbsp;&nbsp;&nbsp;&nbsp; 162K&nbsp;&nbsp;&nbsp;&nbsp; 511K <BR>15.8&nbsp;&nbsp;&nbsp;&nbsp; 47.5&nbsp;&nbsp;&nbsp;&nbsp; 158&nbsp;&nbsp;&nbsp;&nbsp; 475&nbsp;&nbsp;&nbsp;&nbsp; 1.58K&nbsp;&nbsp;&nbsp;&nbsp; 4.99K&nbsp;&nbsp;&nbsp;&nbsp; 16.2K&nbsp;&nbsp;&nbsp;&nbsp; 49.9K&nbsp;&nbsp;&nbsp;&nbsp; 165K&nbsp;&nbsp;&nbsp;&nbsp; 523K <BR>16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 48.7&nbsp;&nbsp;&nbsp;&nbsp; 160&nbsp;&nbsp;&nbsp;&nbsp; 487&nbsp;&nbsp;&nbsp;&nbsp; 1.6K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.1K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16.5K&nbsp;&nbsp;&nbsp;&nbsp; 51K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 169K&nbsp;&nbsp;&nbsp;&nbsp; 536K <BR>16.2&nbsp;&nbsp;&nbsp;&nbsp; 49.9&nbsp;&nbsp;&nbsp;&nbsp; 162&nbsp;&nbsp;&nbsp;&nbsp; 499&nbsp;&nbsp;&nbsp;&nbsp; 1.62K&nbsp;&nbsp;&nbsp;&nbsp; 5.11K&nbsp;&nbsp;&nbsp;&nbsp; 16.9K&nbsp;&nbsp;&nbsp;&nbsp; 51.1K&nbsp;&nbsp;&nbsp;&nbsp; 174K&nbsp;&nbsp;&nbsp;&nbsp; 549K <BR>16.5&nbsp;&nbsp;&nbsp;&nbsp; 51&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 165&nbsp;&nbsp;&nbsp;&nbsp; 510&nbsp;&nbsp;&nbsp;&nbsp; 1.65K&nbsp;&nbsp;&nbsp;&nbsp; 5.23K&nbsp;&nbsp;&nbsp;&nbsp; 17.4K&nbsp;&nbsp;&nbsp;&nbsp; 52.3K&nbsp;&nbsp;&nbsp;&nbsp; 178K&nbsp;&nbsp;&nbsp;&nbsp; 560K <BR>16.9&nbsp;&nbsp;&nbsp;&nbsp; 51.1&nbsp;&nbsp;&nbsp;&nbsp; 169&nbsp;&nbsp;&nbsp;&nbsp; 511&nbsp;&nbsp;&nbsp;&nbsp; 1.69K&nbsp;&nbsp;&nbsp;&nbsp; 5.36K&nbsp;&nbsp;&nbsp;&nbsp; 17.8K&nbsp;&nbsp;&nbsp;&nbsp; 53.6K&nbsp;&nbsp;&nbsp;&nbsp; 180K&nbsp;&nbsp;&nbsp;&nbsp; 562K <BR>17.4&nbsp;&nbsp;&nbsp;&nbsp; 52.3&nbsp;&nbsp;&nbsp;&nbsp; 174&nbsp;&nbsp;&nbsp;&nbsp; 523&nbsp;&nbsp;&nbsp;&nbsp; 1.74K&nbsp;&nbsp;&nbsp;&nbsp; 5.49K&nbsp;&nbsp;&nbsp;&nbsp; 18K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 54.9K&nbsp;&nbsp;&nbsp;&nbsp; 182K&nbsp;&nbsp;&nbsp;&nbsp; 576K <BR>17.8&nbsp;&nbsp;&nbsp;&nbsp; 53.6&nbsp;&nbsp;&nbsp;&nbsp; 178&nbsp;&nbsp;&nbsp;&nbsp; 536&nbsp;&nbsp;&nbsp;&nbsp; 1.78K&nbsp;&nbsp;&nbsp;&nbsp; 5.6K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18.2K&nbsp;&nbsp;&nbsp;&nbsp; 56K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 187K&nbsp;&nbsp;&nbsp;&nbsp; 590K <BR>18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 54.9&nbsp;&nbsp;&nbsp;&nbsp; 180&nbsp;&nbsp;&nbsp;&nbsp; 549&nbsp;&nbsp;&nbsp;&nbsp; 1.8K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.62K&nbsp;&nbsp;&nbsp;&nbsp; 18.7K&nbsp;&nbsp;&nbsp;&nbsp; 56.2K&nbsp;&nbsp;&nbsp;&nbsp; 191K&nbsp;&nbsp;&nbsp;&nbsp; 604K <BR>18.2&nbsp;&nbsp;&nbsp;&nbsp; 56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 182&nbsp;&nbsp;&nbsp;&nbsp; 560&nbsp;&nbsp;&nbsp;&nbsp; 1.82K&nbsp;&nbsp;&nbsp;&nbsp; 5.76K&nbsp;&nbsp;&nbsp;&nbsp; 19.1K&nbsp;&nbsp;&nbsp;&nbsp; 57.6K&nbsp;&nbsp;&nbsp;&nbsp; 196K&nbsp;&nbsp;&nbsp;&nbsp; 619K <BR>18.7&nbsp;&nbsp;&nbsp;&nbsp; 56.2&nbsp;&nbsp;&nbsp;&nbsp; 187&nbsp;&nbsp;&nbsp;&nbsp; 562&nbsp;&nbsp;&nbsp;&nbsp; 1.87K&nbsp;&nbsp;&nbsp;&nbsp; 5.9K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19.6K&nbsp;&nbsp;&nbsp;&nbsp; 59K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 200K&nbsp;&nbsp;&nbsp;&nbsp; 620K <BR>19.1&nbsp;&nbsp;&nbsp;&nbsp; 57.6&nbsp;&nbsp;&nbsp;&nbsp; 191&nbsp;&nbsp;&nbsp;&nbsp; 565&nbsp;&nbsp;&nbsp;&nbsp; 1.91K&nbsp;&nbsp;&nbsp;&nbsp; 6.04K&nbsp;&nbsp;&nbsp;&nbsp; 20K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 60.4K&nbsp;&nbsp;&nbsp;&nbsp; 205K&nbsp;&nbsp;&nbsp;&nbsp; 634K <BR>19.6&nbsp;&nbsp;&nbsp;&nbsp; 59&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 196&nbsp;&nbsp;&nbsp;&nbsp; 578&nbsp;&nbsp;&nbsp;&nbsp; 1.96K&nbsp;&nbsp;&nbsp;&nbsp; 6.19K&nbsp;&nbsp;&nbsp;&nbsp; 20.5K&nbsp;&nbsp;&nbsp;&nbsp; 61.9K&nbsp;&nbsp;&nbsp;&nbsp; 210K&nbsp;&nbsp;&nbsp;&nbsp; 649K <BR>20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 60.4&nbsp;&nbsp;&nbsp;&nbsp; 200&nbsp;&nbsp;&nbsp;&nbsp; 590&nbsp;&nbsp;&nbsp;&nbsp; 2K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6.2K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 21K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 62K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 215K&nbsp;&nbsp;&nbsp;&nbsp; 665K <BR>20.5&nbsp;&nbsp;&nbsp;&nbsp; 61.9&nbsp;&nbsp;&nbsp;&nbsp; 205&nbsp;&nbsp;&nbsp;&nbsp; 604&nbsp;&nbsp;&nbsp;&nbsp; 2.05K&nbsp;&nbsp;&nbsp;&nbsp; 6.34K&nbsp;&nbsp;&nbsp;&nbsp; 21.5K&nbsp;&nbsp;&nbsp;&nbsp; 63.4K&nbsp;&nbsp;&nbsp;&nbsp; 220K&nbsp;&nbsp;&nbsp;&nbsp; 680K <BR>21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 62&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 210&nbsp;&nbsp;&nbsp;&nbsp; 619&nbsp;&nbsp;&nbsp;&nbsp; 2.1K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6.49K&nbsp;&nbsp;&nbsp;&nbsp; 22K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64.9K&nbsp;&nbsp;&nbsp;&nbsp; 221K&nbsp;&nbsp;&nbsp;&nbsp; 681K <BR>21.5&nbsp;&nbsp;&nbsp;&nbsp; 63.4&nbsp;&nbsp;&nbsp;&nbsp; 215&nbsp;&nbsp;&nbsp;&nbsp; 620&nbsp;&nbsp;&nbsp;&nbsp; 2.15K&nbsp;&nbsp;&nbsp;&nbsp; 6.65K&nbsp;&nbsp;&nbsp;&nbsp; 22.1K&nbsp;&nbsp;&nbsp;&nbsp; 66.5K&nbsp;&nbsp;&nbsp;&nbsp; 226K&nbsp;&nbsp;&nbsp;&nbsp; 698K <BR>22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 64.9&nbsp;&nbsp;&nbsp;&nbsp; 220&nbsp;&nbsp;&nbsp;&nbsp; 634&nbsp;&nbsp;&nbsp;&nbsp; 2.2K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6.8K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 22.6K&nbsp;&nbsp;&nbsp;&nbsp; 68K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 232K&nbsp;&nbsp;&nbsp;&nbsp; 715K <BR>22.1&nbsp;&nbsp;&nbsp;&nbsp; 66.5&nbsp;&nbsp;&nbsp;&nbsp; 221&nbsp;&nbsp;&nbsp;&nbsp; 649&nbsp;&nbsp;&nbsp;&nbsp; 2.21K&nbsp;&nbsp;&nbsp;&nbsp; 6.81K&nbsp;&nbsp;&nbsp;&nbsp; 23.2K&nbsp;&nbsp;&nbsp;&nbsp; 68.1K&nbsp;&nbsp;&nbsp;&nbsp; 237K&nbsp;&nbsp;&nbsp;&nbsp; 732K <BR>22.6&nbsp;&nbsp;&nbsp;&nbsp; 68&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 226&nbsp;&nbsp;&nbsp;&nbsp; 665&nbsp;&nbsp;&nbsp;&nbsp; 2.26K&nbsp;&nbsp;&nbsp;&nbsp; 6.98K&nbsp;&nbsp;&nbsp;&nbsp; 23.7K&nbsp;&nbsp;&nbsp;&nbsp; 69.8K&nbsp;&nbsp;&nbsp;&nbsp; 240K&nbsp;&nbsp;&nbsp;&nbsp; 750K <BR>23.2&nbsp;&nbsp;&nbsp;&nbsp; 68.1&nbsp;&nbsp;&nbsp;&nbsp; 232&nbsp;&nbsp;&nbsp;&nbsp; 680&nbsp;&nbsp;&nbsp;&nbsp; 2.32K&nbsp;&nbsp;&nbsp;&nbsp; 7.15K&nbsp;&nbsp;&nbsp;&nbsp; 24K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 71.5K&nbsp;&nbsp;&nbsp;&nbsp; 243K&nbsp;&nbsp;&nbsp;&nbsp; 768K <BR>23.7&nbsp;&nbsp;&nbsp;&nbsp; 69.8&nbsp;&nbsp;&nbsp;&nbsp; 237&nbsp;&nbsp;&nbsp;&nbsp; 681&nbsp;&nbsp;&nbsp;&nbsp; 2.37&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7.32K&nbsp;&nbsp;&nbsp;&nbsp; 24.3K&nbsp;&nbsp;&nbsp;&nbsp; 73.2K&nbsp;&nbsp;&nbsp;&nbsp; 249K&nbsp;&nbsp;&nbsp;&nbsp; 787K <BR>24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 71.5&nbsp;&nbsp;&nbsp;&nbsp; 240&nbsp;&nbsp;&nbsp;&nbsp; 698&nbsp;&nbsp;&nbsp;&nbsp; 2.4K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7.5K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24.9K&nbsp;&nbsp;&nbsp;&nbsp; 75K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 255K&nbsp;&nbsp;&nbsp;&nbsp; 806K <BR>24.3&nbsp;&nbsp;&nbsp;&nbsp; 73.2&nbsp;&nbsp;&nbsp;&nbsp; 243&nbsp;&nbsp;&nbsp;&nbsp; 715&nbsp;&nbsp;&nbsp;&nbsp; 2.43K&nbsp;&nbsp;&nbsp;&nbsp; 7.68K&nbsp;&nbsp;&nbsp;&nbsp; 25.5K&nbsp;&nbsp;&nbsp;&nbsp; 76.8K&nbsp;&nbsp;&nbsp;&nbsp; 261K&nbsp;&nbsp;&nbsp;&nbsp; 820K <BR>24.7&nbsp;&nbsp;&nbsp;&nbsp; 75&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 249&nbsp;&nbsp;&nbsp;&nbsp; 732&nbsp;&nbsp;&nbsp;&nbsp; 2.49K&nbsp;&nbsp;&nbsp;&nbsp; 7.87K&nbsp;&nbsp;&nbsp;&nbsp; 26.1K&nbsp;&nbsp;&nbsp;&nbsp; 78.7K&nbsp;&nbsp;&nbsp;&nbsp; 267K&nbsp;&nbsp;&nbsp;&nbsp; 825K <BR>24.9&nbsp;&nbsp;&nbsp;&nbsp; 75.5&nbsp;&nbsp;&nbsp;&nbsp; 255&nbsp;&nbsp;&nbsp;&nbsp; 750&nbsp;&nbsp;&nbsp;&nbsp; 2.55K&nbsp;&nbsp;&nbsp;&nbsp; 8.06K&nbsp;&nbsp;&nbsp;&nbsp; 26.7K&nbsp;&nbsp;&nbsp;&nbsp; 80.6K&nbsp;&nbsp;&nbsp;&nbsp; 270K&nbsp;&nbsp;&nbsp;&nbsp; 845K <BR>25.5&nbsp;&nbsp;&nbsp;&nbsp; 76.8&nbsp;&nbsp;&nbsp;&nbsp; 261&nbsp;&nbsp;&nbsp;&nbsp; 768&nbsp;&nbsp;&nbsp;&nbsp; 2.61K&nbsp;&nbsp;&nbsp;&nbsp; 8.2K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 27K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 82K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 274K&nbsp;&nbsp;&nbsp;&nbsp; 866K <BR>26.1&nbsp;&nbsp;&nbsp;&nbsp; 78.7&nbsp;&nbsp;&nbsp;&nbsp; 267&nbsp;&nbsp;&nbsp;&nbsp; 787&nbsp;&nbsp;&nbsp;&nbsp; 2.67K&nbsp;&nbsp;&nbsp;&nbsp; 8.25K&nbsp;&nbsp;&nbsp;&nbsp; 27.4K&nbsp;&nbsp;&nbsp;&nbsp; 82.5K&nbsp;&nbsp;&nbsp;&nbsp; 280K&nbsp;&nbsp;&nbsp;&nbsp; 887K <BR>26.7&nbsp;&nbsp;&nbsp;&nbsp; 80.6&nbsp;&nbsp;&nbsp;&nbsp; 270&nbsp;&nbsp;&nbsp;&nbsp; 806&nbsp;&nbsp;&nbsp;&nbsp; 2.7K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8.45K&nbsp;&nbsp;&nbsp;&nbsp; 28K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 84.5K&nbsp;&nbsp;&nbsp;&nbsp; 287K&nbsp;&nbsp;&nbsp;&nbsp; 909K <BR>27&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 82&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 274&nbsp;&nbsp;&nbsp;&nbsp; 820&nbsp;&nbsp;&nbsp;&nbsp; 2.74K&nbsp;&nbsp;&nbsp;&nbsp; 8.66K&nbsp;&nbsp;&nbsp;&nbsp; 28.7K&nbsp;&nbsp;&nbsp;&nbsp; 86.6K&nbsp;&nbsp;&nbsp;&nbsp; 294K&nbsp;&nbsp;&nbsp;&nbsp; 910K <BR>27.4&nbsp;&nbsp;&nbsp;&nbsp; 82.5&nbsp;&nbsp;&nbsp;&nbsp; 280&nbsp;&nbsp;&nbsp;&nbsp; 825&nbsp;&nbsp;&nbsp;&nbsp; 2.8K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8.8K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29.4K&nbsp;&nbsp;&nbsp;&nbsp; 88.7K&nbsp;&nbsp;&nbsp;&nbsp; 300K&nbsp;&nbsp;&nbsp;&nbsp; 931K <BR>28&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 84.5&nbsp;&nbsp;&nbsp;&nbsp; 287&nbsp;&nbsp;&nbsp;&nbsp; 845&nbsp;&nbsp;&nbsp;&nbsp; 2.87K&nbsp;&nbsp;&nbsp;&nbsp; 8.87K&nbsp;&nbsp;&nbsp;&nbsp; 30K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 90.9K&nbsp;&nbsp;&nbsp;&nbsp; 301K&nbsp;&nbsp;&nbsp;&nbsp; 953K <BR>28.7&nbsp;&nbsp;&nbsp;&nbsp; 86.6&nbsp;&nbsp;&nbsp;&nbsp; 294&nbsp;&nbsp;&nbsp;&nbsp; 866&nbsp;&nbsp;&nbsp;&nbsp; 2.94K&nbsp;&nbsp;&nbsp;&nbsp; 9.09K&nbsp;&nbsp;&nbsp;&nbsp; 30.1K&nbsp;&nbsp;&nbsp;&nbsp; 91K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 309K&nbsp;&nbsp;&nbsp;&nbsp; 976K <BR>29.4&nbsp;&nbsp;&nbsp;&nbsp; 88.7&nbsp;&nbsp;&nbsp;&nbsp; 300&nbsp;&nbsp;&nbsp;&nbsp; 887&nbsp;&nbsp;&nbsp;&nbsp; 3.0K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9.1K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30.9K&nbsp;&nbsp;&nbsp;&nbsp; 93.1K&nbsp;&nbsp;&nbsp;&nbsp; 316K&nbsp;&nbsp;&nbsp;&nbsp; 1.0M <BR>30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 90.9&nbsp;&nbsp;&nbsp;&nbsp; 301&nbsp;&nbsp;&nbsp;&nbsp; 909&nbsp;&nbsp;&nbsp;&nbsp; 3.01K&nbsp;&nbsp;&nbsp;&nbsp; 9.31K&nbsp;&nbsp;&nbsp;&nbsp; 31.6K&nbsp;&nbsp;&nbsp;&nbsp; 95.3K&nbsp;&nbsp;&nbsp;&nbsp; 324K&nbsp;&nbsp;&nbsp;&nbsp; 1.5M <BR>30.1&nbsp;&nbsp;&nbsp;&nbsp; 91&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 309&nbsp;&nbsp;&nbsp;&nbsp; 910&nbsp;&nbsp;&nbsp;&nbsp; 3.09K&nbsp;&nbsp;&nbsp;&nbsp; 9.53K&nbsp;&nbsp;&nbsp;&nbsp; 32.4K&nbsp;&nbsp;&nbsp;&nbsp; 97.6K&nbsp;&nbsp;&nbsp;&nbsp; 330K&nbsp;&nbsp;&nbsp;&nbsp; 2.2M <BR>30.9&nbsp;&nbsp;&nbsp;&nbsp; 93.1&nbsp;&nbsp;&nbsp;&nbsp; 316&nbsp;&nbsp;&nbsp;&nbsp; 931&nbsp;&nbsp;&nbsp;&nbsp; 3.16K&nbsp;&nbsp;&nbsp;&nbsp; 9.76K&nbsp;&nbsp;&nbsp;&nbsp; 33K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 332K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>31.6&nbsp;&nbsp;&nbsp;&nbsp; 95.3&nbsp;&nbsp;&nbsp;&nbsp; 324&nbsp;&nbsp;&nbsp;&nbsp; 953&nbsp;&nbsp;&nbsp;&nbsp; 3.24K&nbsp;&nbsp;&nbsp;&nbsp; 10K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 33.2K&nbsp;&nbsp;&nbsp;&nbsp; 102K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 340K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>32.4&nbsp;&nbsp;&nbsp;&nbsp; 97.6&nbsp;&nbsp;&nbsp;&nbsp; 330&nbsp;&nbsp;&nbsp;&nbsp; 976&nbsp;&nbsp;&nbsp;&nbsp; 3.3K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10.2K&nbsp;&nbsp;&nbsp;&nbsp; 33.6K&nbsp;&nbsp;&nbsp;&nbsp; 105K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 348K</FONT></P>]]></description>
</item><item>
<title><![CDATA[VCC VSS VEE VDD 说明]]></title>
<link>http://www.52RD.com/Blog/more.asp?name=seu_dust&amp;id=14682</link>
<author>seu_dust</author>
<pubDate>2008-5-7 15:04:00</pubDate>
<description><![CDATA[<P><STRONG><FONT color=#0066ff>VDD:电源电压（单极器件）；电源电压（4000系列数字电 路）；漏极电压（场效应管） <BR>VCC：电源电压（双极器件）；电源电压（74系列数字电路）；声控载波（Voice Controlled Carrier) <BR>VSS:地或电源负极 <BR>VEE：负电压供电；场效应管的源极（S） <BR>VPP：编程/擦除电压。 <BR>详解： <BR>在电子电路中，VCC是电路的供电电压, VDD是芯片的工作电压： <BR>VCC：C=circuit 表示电路的意思, 即接入电路的电压， D=device 表示器件的意思, 即器件内部的工作电压，在普通的电子<BR>电路中，一般Vcc&gt;Vdd ! <BR>VSS：S=series 表示公共连接的意思，也就是负极。 <BR>有些IC 同时有VCC和VDD， 这种器件带有电压转换功能</FONT></STRONG></P>
<P><BR><STRONG><FONT color=#0066ff>Vcc和Vee出现在双极型晶体管电路中，和集电极（collector）发射极（emitter）有关，所以 <BR>一正一负。 </FONT></STRONG></P>
<P><STRONG><FONT color=#0066ff>Vdd,Vss在MOS电路中出现，和漏级（Drain），源极（Source）有关，也是一正一负。 </FONT></STRONG></P>
<P><STRONG><FONT color=#0066ff>Vcc和Vdd是器件的电源端。Vcc是双极器件的正，Vdd多半是单级器件的正。下标可以理解为NPN晶体管的集电极C，和PMOS or NMOS场效应管的漏极D。同样你可在电路图中看见Vee和Vss，含义一样。因为主流芯片结构是硅NPN所以Vcc通常是正。如果用PNP结构Vcc就为负了。建议选用芯片时一定要看清电气参数。</FONT></STRONG></P>]]></description>
</item><item>
<title><![CDATA[protel基础：元件库列表]]></title>
<link>http://www.52RD.com/Blog/more.asp?name=seu_dust&amp;id=14646</link>
<author>seu_dust</author>
<pubDate>2008-5-4 15:29:00</pubDate>
<description><![CDATA[<FONT color=#0066ff>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原理图常用库文件：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Miscellaneous Devices.ddb <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dallas Microprocessor.ddb<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Intel Databooks.ddb<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Protel DOS Schematic Libraries.ddb<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PCB元件常用库：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Advpcb.ddb<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; General IC.ddb<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Miscellaneous.ddb <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分立元件库 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 部分 分立元件库元件名称及中英对照<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND 与门<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ANTENNA 天线<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BATTERY 直流电源<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BELL 铃,钟<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BVC 同轴电缆接插件<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BRIDEG 1 整流桥(二极管)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BRIDEG 2 整流桥(集成块)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BUFFER 缓冲器<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BUZZER 蜂鸣器<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CAP 电容<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CAPACITOR 电容<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CAPACITOR POL 有极性电容<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CAPVAR 可调电容<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CIRCUIT BREAKER 熔断丝<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COAX 同轴电缆<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CON 插口<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CRYSTAL 晶体整荡器<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DB 并行插口<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DIODE 二极管<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DIODE SCHOTTKY 稳压二极管<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DIODE VARACTOR 变容二极管<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DPY_3-SEG 3段LED<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DPY_7-SEG 7段LED<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DPY_7-SEG_DP 7段LED(带小数点)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELECTRO 电解电容<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FUSE 熔断器<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDUCTOR 电感<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDUCTOR IRON 带铁芯电感<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDUCTOR3 可调电感<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JFET N N沟道场效应管<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JFET P P沟道场效应管<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LAMP 灯泡<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LAMP NEDN 起辉器<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LED 发光二极管<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; METER 仪表<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MICROPHONE 麦克风<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOSFET MOS管<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOTOR AC 交流电机<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOTOR SERVO 伺服电机<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NAND 与非门<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOR 或非门<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOT 非门<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NPN NPN三极管<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NPN-PHOTO 感光三极管<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OPAMP 运放 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OR 或门<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PHOTO 感光二极管<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PNP 三极管<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NPN DAR NPN三极管<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PNP DAR PNP三极管<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; POT 滑线变阻器<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PELAY-DPDT 双刀双掷继电器<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RES1.2 电阻<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RES3.4 可变电阻<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESISTOR BRIDGE ? 桥式电阻<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESPACK ? 电阻<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SCR 晶闸管<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PLUG ? 插头<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PLUG AC FEMALE 三相交流插头<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOCKET ? 插座<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOURCE CURRENT 电流源<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOURCE VOLTAGE 电压源<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SPEAKER 扬声器<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SW ? 开关<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SW-DPDY ? 双刀双掷开关<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SW-SPST ? 单刀单掷开关<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SW-PB 按钮<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THERMISTOR 电热调节器 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRANS1 变压器<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRANS2 可调变压器<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRIAC ? 三端双向可控硅<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRIODE ? 三极真空管<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARISTOR 变阻器<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ZENER ? 齐纳二极管<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DPY_7-SEG_DP 数码管<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SW-PB 开关<BR><BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其他元件库<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Protel Dos Schematic 4000 Cmos .Lib <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 40.系列CMOS管集成块元件库<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4013 D 触发器<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4027 JK 触发器<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Protel Dos Schematic Analog Digital.Lib 模拟数字式集成块元件库<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AD系列 DAC系列 HD系列 MC系列<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Protel Dos Schematic Comparator.Lib 比较放大器元件库 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Protel Dos Shcematic Intel.Lib INTEL公司生产的80系列CPU集成块元件库 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Protel Dos Schematic Linear.lib 线性元件库<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例555<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Protel Dos Schemattic Memory Devices.Lib 内存存储器元件库 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Protel Dos Schematic SYnertek.Lib SY系列集成块元件库<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Protes Dos Schematic Motorlla.Lib 摩托罗拉公司生产的元件库<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Protes Dos Schematic NEC.lib NEC公司生产的集成块元件库<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Protes Dos Schematic Operationel Amplifers.lib 运算放大器元件库<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Protes Dos Schematic TTL.Lib 晶体管集成块元件库 74系列<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Protel Dos Schematic Voltage Regulator.lib 电压调整集成块元件库<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Protes Dos Schematic Zilog.Lib 齐格格公司生产的Z80系列CPU集成块元件库<BR><BR><BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 元件属性对话框中英文对照<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lib ref 元件名称<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Footprint 器件封装<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Designator 元件称号<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Part 器件类别或标示值<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Schematic Tools 主工具栏<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Writing Tools 连线工具栏<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Drawing Tools 绘图工具栏<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Power Objects 电源工具栏<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Digital Objects 数字器件工具栏<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Simulation Sources 模拟信号源工具栏<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PLD Toolbars 映象工具栏<BR></FONT>]]></description>
</item><item>
<title><![CDATA[关于上拉电阻]]></title>
<link>http://www.52RD.com/Blog/more.asp?name=seu_dust&amp;id=14159</link>
<author>seu_dust</author>
<pubDate>2008-4-22 18:56:00</pubDate>
<description><![CDATA[<P><FONT color=#0066ff>转自百度知道</FONT></P>
<P><FONT color=#0066ff>上下拉电阻： <BR>1、当TTL电路驱动COMS电路时，如果TTL电路输出的高电平低于COMS电路的最低高电平（一般为3.5V），&nbsp; &nbsp;这时就需要在TTL的输出端接上拉电阻，以提高输出高电平的值。 <BR>2、OC门电路必须加上拉电阻，以提高输出的搞电平值。 <BR>3、为加大输出引脚的驱动能力，有的单片机管脚上也常使用上拉电阻。 <BR>4、在CMOS芯片上，为了防止静电造成损坏，不用的管脚不能悬空，一般接上拉电阻产生降低输入阻抗，&nbsp; &nbsp;提供泄荷通路。 <BR>5、芯片的管脚加上拉电阻来提高输出电平，从而提高芯片输入信号的噪声容限增强抗干扰能力。 <BR>6、提高总线的抗电磁干扰能力。管脚悬空就比较容易接受外界的电磁干扰。 <BR>7、长线传输中电阻不匹配容易引起反射波干扰，加上下拉电阻是电阻匹配，有效的抑制反射波干扰。 <BR><BR>上拉电阻：<BR>就是从电源高电平引出的电阻接到输出 <BR>1，如果电平用OC(集电极开路，TTL)或OD(漏极开路，COMS)输出，那么不用上拉电阻是不能工作的， 这个很容易理解，管子没有电源就不能输出高电平了。 <BR>2，如果输出电流比较大，输出的电平就会降低（电路中已经有了一个上拉电阻，但是电阻太大，压降太高），就可以用上拉电阻提供电流分量， 把电平“拉高”。（就是并一个电阻在IC内部的上拉电阻上， 让它的压降小一点）。当然管子按需要该工作在线性范围的上拉电阻不能太小。当然也会用这个方式来实现门电路电平的匹配。 <BR>需要注意的是，上拉电阻太大会引起输出电平的延迟。（RC延时） <BR>一般CMOS门电路输出不能给它悬空，都是接上拉电阻设定成高电平。 <BR>下拉电阻：和上拉电阻的原理差不多， 只是拉到GND去而已。 那样电平就会被拉低。 下拉电阻一般用于设定低电平或者是阻抗匹配(抗回波干扰)。<BR><BR><BR><BR>上拉电阻阻值的选择原则包括: <BR>1、从节约功耗及芯片的灌电流能力考虑应当足够大；电阻大，电流小。 <BR>2、从确保足够的驱动电流考虑应当足够小；电阻小，电流大。 <BR>3、对于高速电路，过大的上拉电阻可能边沿变平缓。综合考虑 <BR>以上三点,通常在1k到10k之间选取。对下拉电阻也有类似道理</FONT></P>]]></description>
</item><item>
<title><![CDATA[WINCE应用程序开机自动运行方法]]></title>
<link>http://www.52RD.com/Blog/more.asp?name=seu_dust&amp;id=14148</link>
<author>seu_dust</author>
<pubDate>2008-4-21 21:54:00</pubDate>
<description><![CDATA[<P><STRONG><FONT color=#ff0000>转自<A href="http://www.cnblogs.com/hbt19860104/archive/2008/04/11/1147981.html">http://www.cnblogs.com/hbt19860104/archive/2008/04/11/1147981.html</A></FONT></STRONG></P>
<P><STRONG><FONT color=#ff0000>1、</FONT></STRONG> 将应用程序和应用程序快捷方式添加到映像里，再将快捷方式添加到StartUp目录下，这样当系统运行后应用程序就能自动运行；<BR><BR><STRONG><FONT color=#ff0000>2、</FONT></STRONG> 直接替换Wince的SHELL，即修改注册表：</P>
<P>[HKEY_LOCAL_MACHINE\init]<BR>"Launch50"="explorer.exe"<BR>"Depend50"=hex:14,00, 1e,00</P>
<P>把这个explorer.exe改成你的应用程序（比如：MyApp.exe）；<BR><BR><FONT color=#ff0000><STRONG>3、</STRONG></FONT> 把应用程序加入到映像，修改注册表：</P>
<P>[HKEY_LOCAL_MACHINE\init]<BR>"Launch80"="MyApp.exe" <BR>"Depend80"=hex:1E,00</P>
<P>可以设置启动顺序和依赖程序；</P>
<P>以上方法都可行，但是都存在一个问题，就是应用程序是集成到NK里面的，也就是说每次升级应用程序都要重新编译下载内核，很麻烦，尤其在程序调试阶段，大家都希望把应用程序放在SD卡上，这样更新起来比较容易；据说通过第三种方法可以实现，即修改"Launch80"="MyApp.exe"为"Launch80"="\STDCard\MyApp.exe"( STDCard为SD卡目录)，但是我试了一下没有成功，因为Launch80运行时SD卡的文件驱动还没有加载，找不到MyApp.exe文件。同样，采用快捷方式加载SD卡里的应用程序也不可行。<BR>所以我采用了另一种方法，自己编了一个小程序，比如叫ShellExe.exe，将此程序加入到映像里，通过StartUp快捷方式调用ShellExe，ShellExe再去调用SD卡里的应用程序，具体实现步骤如下：<BR>1、 在eVC下编译如下代码： </P><PRE>int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR    lpCmdLine,
int       nCmdShow)
{
WIN32_FIND_DATA fd;
HANDLE hd=INVALID_HANDLE_VALUE;
int iCount = 20;
while(iCount--)
{
hd=::FindFirstFile(lpCmdLine,&amp;fd);
Sleep(500);
if(INVALID_HANDLE_VALUE!=hd) break;
}
if(0==iCount) return 0;
FindClose(hd);
SHELLEXECUTEINFO ShExeInfo={0};
ShExeInfo.cbSize=sizeof(SHELLEXECUTEINFO);
ShExeInfo.fMask=SEE_MASK_NOCLOSEPROCESS;
ShExeInfo.hwnd=NULL;
ShExeInfo.lpVerb=NULL;
ShExeInfo.lpFile=lpCmdLine;
ShExeInfo.lpParameters=L"";
ShExeInfo.lpDirectory=NULL;
ShExeInfo.nShow=SW_SHOW;
ShExeInfo.hInstApp=NULL;
ShellExecuteEx(&amp;ShExeInfo);
return 0;
}
</PRE>　　生成ShellExe.exe的可执行文件，此段代码主要功能是查找指定的应用程序，然后执行；下面这段代码可以保证在SD卡文件系统正确加载后才去执行应用程序； <PRE>while(iCount--)
{
hd=::FindFirstFile(lpCmdLine,&amp;fd);
Sleep(500);
if(INVALID_HANDLE_VALUE!=hd) break;
}
</PRE>文件的名称和路径由命令行参数指定： <PRE>ShExeInfo.lpFile=lpCmdLine;</PRE>
<P>2、 新建一个快捷方式，如Autorun.lnk，按如下方式编辑其内容：</P><PRE>21#\windows\shellexe.exe \stdcard\MyApp.exe</PRE>
<P>其中\stdcard\MyApp.exe应用程序的绝对路径；</P>
<P>3、 将MyApp.exe和Autorun.lnk添加到NK里，方法是在project.bib文件内加入如下内容：</P><PRE>ShellExe.exe f:\WINCE420\PBWORKSPACES\LioetEnTer\RelDir\ShellExe.exe NK S
Autorun.lnk f:\WINCE420\PBWORKSPACES\LioetEnTer\RelDir\Autorun.lnk NK S</PRE>
<P>注意：ShellExe.exe的属性不能带H（隐藏）.</P>
<P>4、 在project.dat里加入如下内容：</P><PRE>Directory("\Windows\Startup"):-File("Autorun.lnk","\Windows\Autorun.lnk")</PRE>
<P>5、 选择Make Image生成映像（当然Build也可以，就是慢点儿），烧到FLASH里，开机运行，可以看到SD卡里的MyApp.exe被正确执行。</P>
<P>总结</P>
<P>　　这种方法用起来比较方便，ShellExe.exe不用每次都重新编译，只要根据应用程序路径修改Autorun.lnk即可，可以加载Flash、U盘、SD卡里的应用程序。调试及升级应用程序就不用重新烧写内核了。<BR></P>]]></description>
</item><item>
<title><![CDATA[WINCE驱动开发问题精华集锦]]></title>
<link>http://www.52RD.com/Blog/more.asp?name=seu_dust&amp;id=14147</link>
<author>seu_dust</author>
<pubDate>2008-4-21 21:30:00</pubDate>
<description><![CDATA[<P><STRONG>转自<A href="http://www.cnblogs.com/hbt19860104/archive/2008/04/11/1147884.html">http://www.cnblogs.com/hbt19860104/archive/2008/04/11/1147884.html</A>&nbsp;对原出处表示感谢。</STRONG></P>
<P><STRONG></STRONG>&nbsp;</P>
<P><STRONG>如何让系统加载自己写的驱动程序？</STRONG>&nbsp;&nbsp; <BR>两种办法：&nbsp; <BR>1、在[HKEY_LOCAL_MACHINE\Drivers\BuiltIn]下添加注册键。&nbsp; <BR>2、在应用程序中调用ActivateDeviceEx。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>在一些文件中用分号来表示注释，例如下面的内容&nbsp;&nbsp; <BR></STRONG>;&nbsp;@CESYSGEN&nbsp;IF&nbsp;SERVERS_MODULES_HTTPD&nbsp; <BR>;&nbsp;@CESYSGEN&nbsp;ENDIF&nbsp; <BR>在“CESYSGEN...”前加了“@”，有没有什么特别的含义？&nbsp; <BR>在WINCE的一些文件中，用“;”作为注释并在注释文字中用@CESYSGEN作为标记，后面接条件语句。Cefilter.exe工具负责按照条件来筛选文件内容，所以不要轻易地删除包含@CESYSGEN的注释语句。&nbsp; <BR>&nbsp; <BR>&nbsp;通过串口建立ActiveSync联接,串口线用三线的可以吗?&nbsp;&nbsp; <BR>不可以，因为用串口同步时要用到其余口的状态。&nbsp; <BR><BR>&nbsp;&nbsp; <BR>&nbsp;<STRONG>&nbsp;&nbsp;&nbsp;&nbsp;WINCE是否支持MAPI？</STRONG>&nbsp; <BR>不支持。WINCE自带的pmail.exe软件也不是很好用。建议自开发邮件收发软件。如果需要购买WINCE下邮件收发软件可以联系我。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>如何旋转屏幕显示的内容？</STRONG>&nbsp; <BR>例子代码如下（前提是显示驱动程序支持旋转）：&nbsp; <BR>DEVMODE&nbsp;&nbsp;devmode&nbsp;=&nbsp;{0};&nbsp; <BR>&nbsp;devmode.dmSize&nbsp;=&nbsp;sizeof(DEVMODE);&nbsp; <BR>&nbsp;devmode.dmDisplayOrientation&nbsp;=&nbsp;DMDO_90;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///垂直模式&nbsp; <BR>&nbsp;devmode.dmFields&nbsp;=&nbsp;DM_DISPLAYORIENTATION;&nbsp; <BR>&nbsp;ChangeDisplaySettingsEx(NULL,&nbsp;&amp;devmode,&nbsp;NULL,&nbsp;0,&nbsp;NULL);&nbsp;&nbsp;///改变显示的设置&nbsp; <BR>&nbsp;CRect&nbsp;&nbsp;rcWorkArea(0,&nbsp;0,&nbsp;320,&nbsp;240);&nbsp;&nbsp;&nbsp;&nbsp;///整个屏幕尺寸&nbsp; <BR>&nbsp;///设置客户区大小并广播消息，这样所有软件也就随之更改显示&nbsp; <BR>&nbsp;SystemParametersInfo(SPI_SETWORKAREA,&nbsp;0,&nbsp;(void*)&amp;rcWorkArea,&nbsp;SPIF_SENDCHANGE);&nbsp;&nbsp; <BR>&nbsp; <BR><STRONG>&nbsp;请问如何修改字形缓存的容量？&nbsp; <BR></STRONG>[HKEY_LOCAL_MACHINE\System\GDI\GLYPHCACHE]&nbsp; <BR>"limit"=dword:0400&nbsp; <BR>&nbsp; <BR><STRONG>&nbsp;如何得到从WINCE启动开始到现在的时间？</STRONG>&nbsp; <BR>调用API&nbsp;GetTickCount，得到的值为32位整数，单位为毫秒。&nbsp; <BR><STRONG>&nbsp; <BR>&nbsp;如何调用WINCE的软键盘？</STRONG>&nbsp; <BR>调用API&nbsp;SipShowIM(SIPF_ON)，前提是内核加入了软键盘组件。&nbsp; <BR>&nbsp; <BR><STRONG>&nbsp;基于HIVE的注册表，如何在系统关闭前保存注册表的数据到文件system.hv？</STRONG>&nbsp; <BR>调用API&nbsp;RegFlushKey函数。&nbsp; <BR>&nbsp; <BR><STRONG>&nbsp;使用VirtualAlloc和VirtualCopy的时候需要注意哪些事项？</STRONG>&nbsp; <BR>1、VirtualAlloc的作用是申请虚拟地址空间，这肯定不是最终的目的，最终目的可能是申请物理内存、映射寄存器、提交文件等。没有一个目的会在意虚拟地址空间的位置，所以尽量传递参数1为0，也就是让WINCE自动分配虚拟地址空间。VirtualAlloc分配地址空间实际上是以64KB为单位，所以要指定申请的虚拟空间的首地址的话，参数1应该为64KB的整数倍，申请的长度也应该为64KB的整数倍，即使你不需要那么大。&nbsp; <BR>2、VirtualCopy的主要作用是映射物理地址空间，如果参数2为物理地址，那么最后一个参数要添加PAGE_PHYSICAL，参数2必须是256的整数倍。如果参数2为虚拟地址（0x80000000以上），那么最后一个参数就不要添加PAGE_PHYSICAL，WINCE内核会根据这个虚拟地址找到对应的物理地址。&nbsp; <BR>&nbsp; <BR><STRONG>&nbsp;驱动程序和应用程序之间传递数据时何时调用MapPtrToProcess？&nbsp; <BR></STRONG>因为设备管理器负责加载驱动程序DLL，这意味着当应用程序调用驱动程序接口函数的时候，WINCE内核会将调用驱动程序接口函数的线程转移到设备管理器的进程空间然后执行具体的驱动程序代码，应用程序和设备管理器处于两个进程空间，这就造成设备管理器无法访问应用程序传递的指针（虚拟地址），所以当我们在应用程序中传递指针给流驱动程序接口函数时，WINCE内核从中作了一个地址映射，例如ReadFile、WriteFile、DeviceIoControl函数的参数凡是指针都经过了映射才传递给驱动程序，所以很多驱动程序开发者并不了解其中的奥秘就可以编程了。但是如果参数是一个指向一个结构体的指针，而结构体里包括一个或多个指针，那么WINCE内核并不负责映射，所以就需要开发者在驱动程序接口函数中调用API函数MapPtrToProcess来映射地址。例如：pPointer_retval&nbsp;=&nbsp;MapPtrToProcess(pPointer,&nbsp;GetCallerProcess());&nbsp;&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>如何判断可插拔的设备是否存在？</STRONG>&nbsp; <BR>1、通过查找注册表的值。凡是由API&nbsp;ActivateDeviceEx加载的驱动程序都在[HKEY_LOCAL_MACHINE\Drivers\Active]键下有注册键，通过查找“name”或者其它键值就能够找到。设备管理器就调用这个API。如果是PCI设备，在注册表[HLM\Drivers\BuiltIn\PCI\Instance]下查找关键字，例如[HLM\Drivers\BuiltIn\PCI\Instance\WaveDev1]，说明音频驱动已经加载。&nbsp; <BR>2、调用驱动程序接口函数，根据返回值或者执行结果来判断。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>如何做到通过串口过来的一个信号启动自己开发的应用程序？&nbsp; <BR></STRONG>创建一个线程负责等待串口过来的信号，调用API&nbsp;SetCommMask设置要等待的信号种类，具体可以等待的信号种类参见参数2的说明。然后再调用API&nbsp;WaitCommEvent函数等待这个信号，接收之后再调用API&nbsp;CreateProcess启动应用程序。&nbsp; <BR>&nbsp; <BR><STRONG>&nbsp;在WINCE中如何只能启动应用程序的一个实例？</STRONG>&nbsp; <BR>常用的两种办法：&nbsp; <BR>1、如果应用程序实例创建了窗口，可通过API&nbsp;FindWindow函数通过窗口类名和窗口标题名称来查找，前提是系统内不会出现窗口名称重复的情况。&nbsp; <BR>2、应用程序初始化的时候创建一个事件或互斥等内核对象，因为内核对象是由内核创建，名称在系统内唯一。&nbsp; <BR>&nbsp; <BR><STRONG>&nbsp;能不能自己编辑一个数字签名文件导入到手机上，这样就可以用这个签名签自己的程序了？</STRONG>&nbsp; <BR>WINCE的内核签名机制的用途是限制非法的可执行模块EXE、DLL等在设备上运行。要求内核的加载模块用公钥验证请求加载的EXE、DLL的签名是否合法，而这个公钥是在定制内核的时候加进去的，所以除内核的定制者以外的人无法修改这个验证机制。&nbsp; <BR>&nbsp; <BR>&nbsp;我按照版主的文章《加密WINCE系统》里操作，提示错误如下：&nbsp; <BR>Error&nbsp;80090016&nbsp;during&nbsp;CryptSignHash&nbsp;1!&nbsp; <BR>Error&nbsp;signing&nbsp;hash&nbsp; <BR>这是因为传递了无效的钥容器名称，使CryptoAPI调用失败。应该在使用signfile工具之前创建一个钥容器，在桌面Windows中调用API&nbsp;CryptAcquireContext创建一个指定名称的钥容器，接着再创建一个签名密钥对，这时再使用signfile工具就可以了。我在文章里写成-kfulinlin是因为我创建钥容器的时候没有指定名称，系统就采用当前登录的用户名为容器名。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>编译错误：CVTRES&nbsp;:&nbsp;fatal&nbsp;error&nbsp;CVT1102:&nbsp;out&nbsp;of&nbsp;memory;&nbsp;42&nbsp;bytes&nbsp;required&nbsp;？</STRONG>&nbsp; <BR>多数情况下出现这种错误是因EVC的bug而起，应该在安装EVC之后就立刻安装EVC的SP补丁。另外为了避开BUG，使用EVC编程应该养成一些习惯，比如定期备份工程所有文件，每次编译时采用Clean&nbsp;+&nbsp;Rebuild&nbsp;All，正调试时不要关闭模拟器等等。&nbsp; <BR>&nbsp; <BR><STRONG>&nbsp;在WINCE下是否能够得到某一进程使用的物理内存总量？</STRONG>&nbsp; <BR>目前没发现有这样一个API能够得到指定进程使用的物理内存总量。只有GlobalMemoryStatus能够得到整个系统使用的物理内存总量。&nbsp; <BR>&nbsp; <BR><STRONG>&nbsp;应用程序如何控制lcd的亮度？如何获得电池的电量？</STRONG>&nbsp; <BR>从常见的平台如Geode、三星ARM系列来看，的确在驱动方面没有统一的控制LCD或者其它种类屏幕亮度的接口函数，所以只能根据具体平台提供的接口来做。从帮助文档来看微软的带有DirectDraw功能的显示驱动程序的确有标准的增加亮度的接口函数，关于背景光参见标题为“Enabling&nbsp;a&nbsp;Backlight”的帮助文档。&nbsp; <BR>获得电池电量有标准的接口函数GetSystemPowerStatusEx，前提是驱动程序和硬件都要支持。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>WINCE的socket函数好像不支持发送/接收超时？</STRONG>&nbsp; <BR>是的，最早版本的WINCE支持选项SO_RCVTIMEO、SO_SNDTIMEO，后来却不支持了。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>WINCE下如何设置窗口最大化和最小化？</STRONG>&nbsp; <BR>WINCE的帮助文档在介绍API&nbsp;ShowWindow函数的参数时指出SW_MAXIMIZE,&nbsp;SW_MINIMIZE,&nbsp;SW_RESTORE,&nbsp;SW_SHOWDEFAULT,&nbsp;SW_SHOWMAXIMIZED,&nbsp;SW_SHOWMINIMIZED,&nbsp;SW_SHOWMINNOACTIVE都不被支持，但实际上并不完全是这样，具体来说：&nbsp; <BR>SW_MAXIMIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;比原来窗口大，但不是最大化&nbsp; <BR>SW_MINIMIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译成功，但是不起作用&nbsp; <BR>SW_SHOWMAXIMIZED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最大化&nbsp; <BR>SW_SHOWMINIMIZED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译出错&nbsp; <BR>SW_RESTORE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;能恢复&nbsp; <BR>SW_SHOWDEFAULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译出错&nbsp; <BR>SW_SHOWMINNOACTIVE&nbsp;&nbsp;&nbsp;编译出错&nbsp; <BR>SW_HIDE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;能够隐藏&nbsp; <BR>&nbsp; <BR><STRONG>&nbsp;如何用程序调用控制面板的触摸屏校对程序？</STRONG>&nbsp;&nbsp; <BR>两种办法：&nbsp; <BR>1、调用API&nbsp;TouchCalibrate函数&nbsp; <BR>2、调用CreateProcess，参数1为L"\\windows\\ctlpnl.exe"，参数2为L"cplmain.cpl,9"。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>如何获得U盘或者其它类型的存储器总容量和剩余可用容量？</STRONG>&nbsp; <BR>调用API&nbsp;GetStoreInfo得到扇区数、每扇区字节数，相乘即是总容量。调用API&nbsp;GetDiskFreeSpaceEx得到剩余可用容量。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>三星2440头文件定义#define&nbsp;IIC_BASE&nbsp;0xB1400000&nbsp;//&nbsp;54000000，datasheet是54000000，那么怎么转成0xB1400000？</STRONG>&nbsp; <BR>物理地址映射方法分为两种，一种静态映射另一种为动态映射。在OEMAddressTable中定义了物理地址与虚拟地址的映射关系属于静态映射，用VirtualCopy映射属于动态映射，采用哪种办法都可以。问题中提到的属于静态映射，2440的BSP在map.a文件中定义了IIC控制寄存器的物理起始地址和对应的虚拟地址如下：&nbsp; <BR>DCD&nbsp;0x91400000,&nbsp;0x54000000,&nbsp;1&nbsp;;&nbsp; <BR>在OEMAddressTable中定义的虚拟地址范围在0x8000&nbsp;0000—0x9FFF&nbsp;FFFF，这部分可缓存，适合内核程序和应用程序使用，同时WINCE内核在0xA000&nbsp;0000—0xBFFF&nbsp;FFFF中映射了另一份，指向了同样的物理地址，这部分不可缓存，适合驱动程序使用。三星ARM处理器带有L1级高速缓存，可缓存会提高执行效率。对于特殊的设备寄存器适合映射到不可缓存的虚拟地址。&nbsp; <BR>当驱动程序调用VirtualCopy对0xB1400000地址读写时，WINCE自动将这个地址减去0x2000&nbsp;0000，也就是0x91400000，对应的物理地址就是0x54000000，也就是IIC控制寄存器的物理起始地址。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>基于RAM的注册表如何保存数据？</STRONG>&nbsp; <BR>调用API&nbsp;RegCopyFile备份注册表。调用API&nbsp;RegRestoreFile恢复注册表，然后调用KernelIoControl热启动使恢复生效。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>如何隐藏和显示winCE下标准外壳的任务栏？</STRONG>&nbsp; <BR>&nbsp;HANDLE&nbsp;&nbsp;hTaskBar&nbsp;=&nbsp;FindWindow(L"HHTaskBar",&nbsp;NULL);&nbsp;&nbsp; <BR>&nbsp;ShowWindow(hTaskBar,&nbsp;SW_HIDE);&nbsp;&nbsp; <BR>&nbsp;ShowWindow(hTaskBar,&nbsp;SW_SHOWNORMAL);&nbsp;&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>如果能让WINCE的IE浏览器播放flash动画？</STRONG>&nbsp; <BR>播放flash需要Macromedia&nbsp;Flash&nbsp;Player&nbsp;SDK，参见http://www.adobe.com/products/flashplayer_sdk/。这和real&nbsp;player相似，都需要WINCE平台的SDK，都需要申请。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>WINCE下内核模式和用户模式有什么区别？</STRONG>&nbsp; <BR>为了使读者能够详细了解WINCE的地址映射原理还有两种模式，在这里我分几个部分说明：&nbsp; <BR>1、WINCE内核nk.exe的任务是管理操作系统核心功能。按照OEMAddressTable的映射要求，所有物理地址都映射到0x80000000以上，所以对于内核程序nk.exe和内核模式下的线程来说，只要访问0x80000000以上的有效虚拟地址经MMU就能够访问物理地址，无需再映射是内核模式的一个特点。内核模式的第二个特点是没有地址访问限制，内核模式线程可以访问任何有效虚拟地址，所谓有效虚拟地址是指有实际事物对应。&nbsp; <BR>2、用户模式线程只能访问0x80000000以下的虚拟地址空间，WINCE6.0之前版本的内核为每个进程划分32MB的地址空间，在不调用特殊函数的情况下不能相互访问，这样的设计使得WINCE系统更安全、更稳定，限制访问地址是用户模式的第一个特点。第二个特点就是需要多一层映射，如果线程要访问物理内存的话需要先映射到0x80000000以上，再经MMU访问物理内存地址。&nbsp; <BR>WINCE的线程具有转移性（参考API&nbsp;GetCallerProcess的说明，有一个很好的例子），当应用程序的线程调用API或者调用驱动程序接口函数时，该线程会转移到gwes.exe、device.exe、filesys.exe等进程中执行，转移是由WINCE内核操作的，它会修改线程的上下文，记录线程的当前进程、调用者进程、拥有者进程三个值。&nbsp; <BR>3、如果在定制内核的时候选择了“Full&nbsp;Kernel&nbsp;Mode”，那么在这个内核上运行的所有线程都处于内核模式，即使调用SetKMode(FALSE)后线程仍然具有内核模式的特点，能够访问任何有效的虚拟地址。假设现有一个64MB&nbsp;RAM的WINCE产品，RAM映射从0x80000000到0x84000000，如果线程处于内核模式，它就直接可以访问这个范围的虚拟地址：&nbsp; <BR>在OnButton1()中编写&nbsp; <BR>DWORD&nbsp;oldMode&nbsp;=&nbsp;SetKMode(FALSE);&nbsp; <BR>volatile&nbsp;int&nbsp;*piTemp&nbsp;=&nbsp;(volatile&nbsp;int*)(0x20000000+0x84000000-0x00019000);&nbsp;///或者(0x84000000-0x00019000)&nbsp; <BR>*piTemp&nbsp;=&nbsp;12345;&nbsp; <BR>在OnButton2()中编写&nbsp; <BR>DWORD&nbsp;oldMode&nbsp;=&nbsp;SetKMode(FALSE);&nbsp; <BR>volatile&nbsp;int&nbsp;*piTemp&nbsp;=&nbsp;(volatile&nbsp;int*)(0x20000000+0x84000000-0x00019000);&nbsp;///或者(0x84000000-0x00019000)&nbsp; <BR>int&nbsp;iTemp&nbsp;=&nbsp;*piTemp;&nbsp; <BR>先只执行OnButton1()然后关闭程序，再重启程序然后执行OnButton2()，iTemp仍然等于12345。结果说明了两点：内核模式线程可以直接访问0x80000000以上的有效虚拟地址；我们写到RAM中的数据没有丢失，说明虚拟地址有效。&nbsp; <BR>如果在定制内核的时候没有选择“Full&nbsp;Kernel&nbsp;Mode”，那么在这个内核上运行的所有线程都处于用户模式。可以调用SetKMode(TRUE)使调用线程暂时处于内核模式，还是原来的假设环境，我再举个例子：&nbsp; <BR>在OnButton1()中编写&nbsp; <BR>DWORD&nbsp;oldMode&nbsp;=&nbsp;SetKMode(TRUE);&nbsp; <BR>volatile&nbsp;int&nbsp;*piTemp&nbsp;=&nbsp;(volatile&nbsp;int*)(0x20000000+0x84000000-0x00019000);&nbsp;///或者(0x84000000-0x00019000)&nbsp; <BR>*piTemp&nbsp;=&nbsp;12345;&nbsp; <BR>在用户模式下，如果不调用SetKMode(TRUE)，那么执行*piTemp&nbsp;=&nbsp;12345一定会弹出对话框，提示地址访问非法，如果调用SetKMode(TRUE)就不会提示地址访问非法，而且在OnButton2()中仍然能得到12345这个值。&nbsp; <BR>通过这两个例子我相信读者能够完全了解两种模式的区别了。&nbsp; <BR>4、WINCE提供了两个函数SetKMode和SetProcPermissions，其中SetKMode能够把调用线程切换到内核模式，还可以切换回用户模式。SetProcPermissions&nbsp;+&nbsp;GetCurrentPermissions添加当前进程访问权限给调用线程，SetProcPermissions&nbsp;(0xFFFFFFFF)能让调用线程访问所有进程空间，但是调用线程仍然处于用户模式。SetKMode和SetProcPermissions函数使得用户模式的特点不那么明晰。&nbsp; <BR>如上所说一个应用程序的线程可能转移到其它两个进程地址空间中读写数据，而每一个线程在被创建的时候只有访问创建它的进程地址空间的权限，所以驱动程序开发者必须在驱动程序读写数据前调用SetKMode或者SetProcPermissions增加调用此函数的线程访问其它进程空间的权限。如果一个应用程序的线程只转移到一个进程地址空间，一般为设备管理器进程device.exe，这种情况下不必增加线程访问其它进程空间的权限，但如果驱动程序本身创建了一个线程，那还是要调用SetKMode或者SetProcPermissions增加新的线程访问其它进程的权限的，因为驱动程序创建线程时，当前进程为设备管理器，所以新线程只具有访问设备管理器进程空间的权限，而不具备访问应用程序进程空间的权限。&nbsp; <BR>5、可能一个编写过简单的流驱动的初学者会很疑惑，因为开发一个简单的流驱动程序根本不需要调用这些函数，也没有调用过MapPtrToProcess，那是因为如果标准流驱动接口函数的参数为指针（ReadFile、WriteFile、DeviceIoControl参数都有指针），WINCE内核会自动映射指针包含的地址，但仅此而已，其余任何情况都要求开发者自行处理，比如流接口函数的参数是一个指向结构体的指针PA，而结构体中包括指针PB，PB指针就必须在流接口函数中映射，映射后才能访问，否则就会造成地址访问非法。所以结构体中每个指针都要映射。&nbsp; <BR>为了让读者能了解其中的原因，我举个例子：&nbsp; <BR>假设设备管理器被加载到Slot4，应用程序A被加载到Slot&nbsp;8，A只有一个主线程T，T开始执行，按照WINCE的规定，正获得CPU的进程必须映射到Slot0，那么在执行代码的时候A的所有虚拟地址都被减去一个偏移值，也就是8×0x02000000，A调用DeviceIoControl，传递一个指向一个结构体的指针B，而这个结构体中包含一个指针C，指针C包含的地址假设为0x00030000，当执行DeviceIoControl时WINCE把设备管理器的进程地址空间映射到Slot0，因为放在注册表[HKLM\Drivers\BuiltIn]下的驱动程序是由设备管理器加载的，自然驱动程序的代码段被加载到设备管理器进程空间，但是线程仍然是T，此时T的当前所在进程为设备管理器（CurrentProcess），A变成了T的调用者进程（CallerProcess），T自动具有了访问调用者进程空间的权限。这时访问Slot0中的虚拟地址其实质就是访问设备管理器的进程地址空间，要把地址加上一个偏移值，也就是4×0x02000000，所以DeviceIoControl访问指针C包含的地址时本应该加上8×0x02000000，却加上4×0x02000000，结果地址并不是设备管理器的合法区域，系统就会提示地址访问非法。而如果做了一个映射，指针C包含的地址就会被加一个正确的偏移值，使地址处于A的地址空间Slot&nbsp;8中，T此时具有访问A进程空间的权限，访问到正确的虚拟地址当然会得到正确的数据了。&nbsp; <BR>&nbsp; <BR><STRONG>&nbsp;为什么WINCE目录下的例子用build+sysgen能够编译成EXE文件，而我添加的例子就不能编译呢？</STRONG>&nbsp; <BR>如果这个例子是一个应用程序，那么肯定包括代码文件（.h&nbsp;.c&nbsp;.cpp）和资源文件（.rc和其它资源文件），build工具根据source文件内容把代码文件编译成lib文件，资源文件编译成.res文件，sysgen工具根据makefile文件内容将source文件中列出的需要链接的各个库文件合并成一个EXE文件。所以说关键在于makefile文件，WINCE目录下凡是能够用build+sysgen编译的都在makefile中有如何链接的设置，而我们添加的例子当然没有在makefile中找到如何链接的设置，nmake工具就会提示不知道如何创建。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>pcienum.exe干什么用的？</STRONG>&nbsp; <BR>如果你要开发某一个PCI设备的驱动程序，首先要知道这个PCI设备的信息（如VendorID、DeviceID、BaseClass、SubClass）和PCI总线的信息。运行这个pcienum.exe就能得到相关信息。pcienum.exe提供了源码，位置\Public\Common\Oak\Drivers\Ceddk\Test\Pcienum。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>wince下如何让操作系统进入待机模式？又如何把它激活？</STRONG>&nbsp; <BR>通过注册表就可以设置，前提是你的驱动和硬件都支持。注册表项参见标题为“GWES&nbsp;Suspend&nbsp;Time-outs”的帮助文档。&nbsp; <BR>[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Power]&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;"BattPowerOff"=dword:300&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;"ExtPowerOff"=dword:0&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;"WakeupPowerOff"=dword:60&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;"ScreenPowerOff"=dword:0&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>现有一个GPRS模块，如何通过GPRS连接到Internet？</STRONG>&nbsp; <BR>1、先在内核中加入WAN下面的几个组件，如RAS/PPP、TAPI。WINCE采用unimodem驱动，所以不必担心没有Modem驱动的支持。&nbsp; <BR>2、WINCE启动后新建一个拨号连接，比如名称叫“gprs1”，输入用户名、密码、电话号码。电话号码不同，所采用的模式不一样，例如“*99#”是GPRS模式，“17201”是普通的数据模式，速度差很多，价钱也差很多。&nbsp; <BR>3、开始连接，连接过程会在对话框中显示，直到显示“连接成功”。&nbsp; <BR>4、打开浏览器或者自己开发的通讯软件测试网络连接情况。&nbsp; <BR>5、关闭连接。&nbsp; <BR>6、保存[HKEY_CURRENT_USER\Comm\RasBook\gprs1]下的所有数据，添加到project.reg中，重新编译后内核中就有了一个拨号连接“gprs1”。&nbsp; <BR>7、调用RAS函数可以修改拨号连接“gprs1”的参数，如用户名、密码、电话号码，但是不能修改硬件设置，如波特率、串口、数据位、停止位等。RAS函数还能够拨号、挂断。为了修改波特率可以多保存几个拨号连接，也可以直接调用TAPI开发拨号软件，另外WINCE自带的拨号连接是有源码的，位置在\PUBLIC\COMMON\OAK\DRIVERS\NETSAMP\CONNMC。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>采用基于HIVE的注册表如何删除用户保存在注册表中的数据，恢复到出厂时的注册表？</STRONG>&nbsp; <BR>用户修改的数据保存在user.hv文件中，直接删除一定失败，所以不能通过删除文件实现恢复出厂设置。微软考虑到了这个问题，在WINCE启动过程中filesys.exe加载注册表时会调用OEMIoControl函数并传递一个IOCTL，这个IOCTL在pkfuncs.h中定义如下：&nbsp; <BR>#define&nbsp;&nbsp;IOCTL_HAL_GET_HIVE_CLEAN_FLAG&nbsp;&nbsp;CTL_CODE(FILE_DEVICE_HAL,&nbsp;49,&nbsp;METHOD_BUFFERED,&nbsp;FILE_ANY_ACCESS)&nbsp; <BR>filesys.exe会分别传递参数HIVECLEANFLAG_SYSTEM和HIVECLEANFLAG_USERS，如果返回值为TRUE那么filesys.exe清除原来的注册表文件，如果返回值为FALSE那么filesys.exe保留原来的注册表文件。默认WINCE并没有实现这个IOCTL，所以OEM要删除注册表文件就必须先编写这个IOCTL代码。代码的例子可参考标题为“IOCTL_HAL_GET_HIVE_CLEAN_FLAG”的帮助文档。另外必须在ioctl.h和ioctl.c两个文件中编写该代码。在ioctl.c文件中找到const&nbsp;OAL_IOCTL_HANDLER&nbsp;g_oalIoCtlTable[]，添加IOCTL和对应的处理函数。要进一步了解这个全局数组，参见标题为“IOCTL&nbsp;Library”的帮助文档。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>如何在不删除必要组件的前提下减小内核文件长度？</STRONG>&nbsp; <BR>要减小内核文件长度首先要在使用PB的定制内核向导中选择自定义，也就是说对于每个组件都由自己来选择，而不是选择PB的标准配置。但减小内核文件长度最有效最直接的办法是缩小字体，尤其对于东亚字体，采用字体压缩技术并且选择合理的字库文件将明显缩小文件长度。&nbsp; <BR>1、在定制内核时选择AGFA&nbsp;AC3&nbsp;Font&nbsp;Compression组件。SYSGEN变量为SYSGEN_AGFA_FONT。&nbsp; <BR>2、参考标题为“East&nbsp;Asian&nbsp;Font&nbsp;Versions”的帮助文档，从中选择你需要的字库文件加到内核中，从文档可以看出加AC3压缩比不加压缩在文件长度方面差距很大。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>如何得到WAV文件播放的总时间？</STRONG>&nbsp; <BR>1、直接读取wav文件头信息，从文件起始地址偏移28个字节长度为4个字节保存的是每秒钟播放的字节数，从文件起始地址偏移40个字节长度为4个字节保存的是声音数据的总的字节数，相除就是播放时间。&nbsp; <BR>2、调用IGraphBuilder::RenderFile打开一个wav文件，然后通过IGraphBuilder得到IMediaSeeking指针，再调用IMediaSeeking::GetDuration得到总的时间（结果要除以10000000），IMediaSeeking::GetCurrentPosition得到当前播放时间。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>如何在Dialog-Based程序中加入menubar？</STRONG>&nbsp; <BR>先调用CommandBar_Create再调用CommandBar_InsertMenubar。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>请问MultiByteToWideChar与_T、L、TEXT的区别？</STRONG>&nbsp; <BR>MultiByteToWideChar函数转换的对象可以是常量也可以是变量。其它只能转换常量。_T和TEXT会根据当前系统是否定义_UNICODE宏来决定是否转换，而L就是转换成宽字符，当然也包括其他类型常量的转换。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>在用UBS线缆通过ActiveSync同步有效的情况下，如何插上USB线缆后WINCE自动与PC同步？</STRONG>&nbsp; <BR>1、新建一个拨号连接，假设名称为“usb1”，选择连接类型为“直接连接”，并在连接设备里选择通过USB线缆连接。&nbsp; <BR>2、将注册表[HKEY_CURRENT_USER\Comm\RasBook\usb1]下的数据添加到project.reg或者platform.reg中。&nbsp; <BR>3、在[HKEY_CURRENT_USER\ControlPanel\Comm]下添加如下：&nbsp; <BR>"AutoCnct"=dword:1&nbsp;&nbsp;///直接连接&nbsp; <BR>"Cnct"="usb1"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///连接名称&nbsp; <BR>4、重新编译内核。为了节省编译时间也可以在内核工程下搜索*.reg文件，将2、3步骤中的注册表数据添加其中，然后直接make&nbsp;image。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>如何通过进程句柄来获得该进程的主窗口句柄？</STRONG>&nbsp; <BR>好像没有API能够通过进程句柄直接获得主窗口的句柄，因为并非每个应用程序都带UI。但是可以反过来，先枚举当前系统所有主窗口，然后根据每个窗口的句柄调用GetWindowThreadProcessId函数得到进程的ID，再调用OpenProcess得到进程句柄，与现有的进程句柄比较。&nbsp; <BR>&nbsp; <BR>&nbsp;我做的显示驱动DLL已经编译成功了，但是在加载显示驱动的过程中弹出话框，提示如下：&nbsp; <BR>unhandled&nbsp;exception&nbsp;&nbsp;in&nbsp;&nbsp;gwes.exe&nbsp;&nbsp;(0xc0000005&nbsp;access&nbsp;violation)&nbsp; <BR>提示的错误——地址访问非法，表明你的驱动程序代码并没有在读写数据前添加SetKMode(TRUE)或者SetProcPermissions(0xFFFFFFFF)函数让线程能够访问任何进程的地址空间。你可以调用&nbsp;IsBadReadPtr和IsBadWritePtr函数检测地址是否能够合法访问。编写和gwes有关的驱动程序应该首先调用SetKMode(TRUE)或者SetProcPermissions(0xFFFFFFFF)函数，这是一个好习惯。&nbsp; <BR>&nbsp; <BR><STRONG>&nbsp;请问在嵌入式系统中如何设置GPRS拔号用的APN？</STRONG>&nbsp; <BR>对一个拨号连接比如“我的连接”单击鼠标右键，在弹出的菜单中选择“属性”，然后单击“配置”—“拨号选项”，在“附加设置”中添加AT命令如“+cgdcont=1,"ip","cmnet"”。“cmnet”位置即为APN。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>WINCE的IP&nbsp;Phone功能如何？</STRONG>&nbsp; <BR>WINCE的voip需要c-s-c结构，既需要服务器的中转，而skype采用第三代p2p技术就不需要中转，但是在gprs下也做不到语音流畅。skype有pocket&nbsp;pc版本，但是无线方面需要wlan或者cdma。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>三星ARM平台如何定义自己的中断ID？</STRONG>&nbsp; <BR>以S3C2410为例，在oalintr.h文件中定义中断ID，也称SYSINTR，例如&nbsp;#define&nbsp;SYSINTR_MYINT&nbsp;&nbsp;(SYSINTR_FIRMWARE+20)，最大值不能超过SYSINTR_FIRMWARE+23。然后在armint.c文件中找到OEMInterruptHandler函数，用if&nbsp;(IntPendVal&nbsp;==&nbsp;INTSRC_XXX)&nbsp;判断当前发生的中断源号，然后返回SYSINTR_MYINT。内核分别调用OEMInterruptDisable（禁止当前中断）、OEMInterruptDone（中断处理结束）、OEMInterruptEnable（当前中断有效）三个函数，参数都为中断ID，在这三个函数中用&nbsp;case&nbsp;SYSINTR_MYINT判断当前要处理的中断。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>如何开发软件从PC端复制文件到基于WINCE的设备？</STRONG>&nbsp; <BR>调用RAPI（Remote&nbsp;Application&nbsp;Programming&nbsp;Interface）函数，此函数集由桌面计算机调用，由基于WINCE的设备执行。一旦连接上就可以在桌面计算机端调用RAPI。通过注册表还可以限制RAPI能够访问目录的范围。具体参考RAPI和RDP（远程桌面协议）。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>请问如何对NandFlash分区、格式化？</STRONG>&nbsp; <BR>你看看WINCE420\PUBLIC\COMMON\OAK\DRIVERS\ETHDBG\BOOTPART\bootpart.cpp，在Eboot中先要调用BP_LowLevelFormat(&nbsp; <BR>DWORD&nbsp;dwStartBlock,&nbsp;DWORD&nbsp;dwNumBlocks,&nbsp;DWORD&nbsp;dwFlags)再flash的一个区域建立空的MBR,然后连续两次调用BP_OpenPartition(DWORD&nbsp;dwStartSector,&nbsp;DWORD&nbsp;dwNumSectors,&nbsp;DWORD&nbsp;dwPartType,&nbsp;BOOL&nbsp;fActive,&nbsp;DWORD&nbsp;dwCreationFlags)函数来建立BINFS和FAT分区。建好后，将nk.bin烧入binfs分区中。&nbsp; <BR>&nbsp; <BR>&nbsp;&nbsp;<STRONG>要做个弹出对话框具有&nbsp;always&nbsp;on&nbsp;top&nbsp;属性，如何实现？</STRONG>&nbsp; <BR>调用SetWindowPos(..&nbsp;,&nbsp;HWND_TOPMOST,&nbsp;....,&nbsp;SWP_NOACTIVATE)。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>s3c2410＋WINCE下网络PING一会就断，如何解决？</STRONG>&nbsp; <BR>原因在于中断处理程序把已经产生的中断标志清除掉了，这样就丢失一次中断。因为原驱动里配置中断为上升沿触发，一次中断丢失就导致不会再产生中断信号跳变，因为只有在中断服务中读取了cs8900的&nbsp;Interrupt&nbsp;status&nbsp;queue寄存器后，才会产生下一次中断！解决办法：&nbsp; <BR>1、在cfw.c文件中全局定义BOOL&nbsp;Inited&nbsp;=&nbsp;FALSE&nbsp; <BR>2、修改OEMInterruptEnable()中case&nbsp;SYSINTR_ETHER:&nbsp;下面的语句为：&nbsp; <BR>if(Inited&nbsp;==&nbsp;FALSE)&nbsp;&nbsp; <BR>{&nbsp;&nbsp; <BR>s2410IOP-&gt;rEINTPEND&nbsp;=&nbsp;0x200;&nbsp;&nbsp; <BR>s2410INT-&gt;rSRCPND&nbsp;=&nbsp;BIT_EINT8_23;&nbsp;&nbsp; <BR>if&nbsp;(s2410INT-&gt;rINTPND&nbsp;&amp;&nbsp;BIT_EINT8_23)&nbsp;&nbsp; <BR>s2410INT-&gt;rINTPND&nbsp;=&nbsp;BIT_EINT8_23;&nbsp;&nbsp; <BR>Inited&nbsp;=&nbsp;TRUE;&nbsp;&nbsp; <BR>}&nbsp;&nbsp; <BR>s2410IOP-&gt;rEINTMASK&nbsp;&amp;=&nbsp;~0x200;&nbsp;&nbsp; <BR>s2410INT-&gt;rINTMSK&nbsp;&amp;=&nbsp;~BIT_EINT8_23;&nbsp;&nbsp; <BR>break；&nbsp;&nbsp; <BR>注：本解决办法转载于http://stoned.blogchina.com/stoned/3083045.html，非我本人研究成果。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>已经搜索到文件，如何用CListBox以图标形式显示出来？</STRONG>&nbsp; <BR>CListCtrl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListCtrl;&nbsp; <BR>CImageList&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImageList;&nbsp; <BR>ImageList.Create(IDB_BITMAP,&nbsp;48,&nbsp;2,&nbsp;RGB(0,0,0));&nbsp; <BR>ListCtrl.SetImageList(&amp;ImageList,&nbsp;LVSIL_NORMAL);&nbsp; <BR>ListCtrl.InsertItem(iListIndex,&nbsp;strItem,&nbsp;1);&nbsp;&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>如何改变控制面板中电源属性对话框的尺寸?</STRONG>&nbsp;&nbsp; <BR>1、需要修改对话框的尺寸是因为对话框是以资源方式加载的，不会根据当前系统显示分辨率而自我调节尺寸。&nbsp; <BR>2、安装WINCE后有一些组件（feature）的资源文件*.res就已经有了，如果你不改变，那么build内核的时候PB只是把这些.res复制到工程目录下，然后与*.obj合并成EXE、DLL、CPL。所以修改了.rc文件里面的对话框尺寸后要重新编译.rc文件为.res文件，然后再覆盖原来WINCE自带的.res文件。&nbsp; <BR>3、改变对话框尺寸有两种办法：一种方法是更改系统字体字号，系统字体的字号变化会影响对话框的尺寸，但是缺点是所有系统字体有关的UI都会改变。另一种是在.rc文件中调整对话框尺寸，然后编译成.res文件，再将.res复制到对应的语言目录里，比如目录名为0804（中文），再执行Rebuild命令重新编译内核，或者执行sysgen＋build。在研究中我发现.res文件虽然能够直接用EVC打开、修改、保存，但是和其它Obj链接成EXE、DLL、CPL后并不能运行，所以还是建议读者用CE自带的rc工具编译最好。读者可在PB的命令行中键入“rc&nbsp;/?”了解rc.exe工具的用途和参数。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>使用EVC&nbsp;build之后连接模拟器的时候，提示download&nbsp;file等了一会又出现download&nbsp;failed？</STRONG>&nbsp; <BR>一般这样的问题从下面几个步骤解决：&nbsp; <BR>1、如果之前能启动模拟器而现在不能，那么先clean然后重启计算机再build。&nbsp; <BR>2、如果开发的主机为WINXP+SP2，可能存在与EVC模拟器不兼容的情况，检查C:\boot.ini，将/noexecute=optin改为/execute=optin。&nbsp; <BR>3、检查你的模拟器是否能运行，假设你正用的SDK名称为MYSDK，单击菜单tools—configure&nbsp;platform&nbsp;manager，选择MYSDK—MYSDK&nbsp;emulator，再单击properties—test，看看模拟器是否能够启动，如果能启动那问题就不大。&nbsp; <BR>4、单击菜单build—update&nbsp;remote&nbsp;output&nbsp;files，看看模拟器是否能够启动。&nbsp; <BR>5、如果上述办法均不行，关闭EVC然后重新建立一个新的工程，编译，看看模拟器是否能够启动，如果能启动说明原来工程出了问题，最好恢复原工程的备份。&nbsp; <BR>&nbsp; <BR>&nbsp;<STRONG>如何设置能够自动拨号、禁止自动拨号？</STRONG>&nbsp; <BR>在[HKEY_LOCAL_MACHINE\Comm\Autodial]下是自动拨号的注册表设置。&nbsp; <BR>Enabled=DWORD:1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///是否能够自动拨号&nbsp; <BR>FailRetryWaitMS=DWORD&nbsp;&nbsp;&nbsp;&nbsp;///如果失败再次拨号的等待时间&nbsp; <BR>RasEntryName1=&nbsp;REG_SZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///自动拨号采用的拨号连接名称&nbsp; <BR></P>]]></description>
</item><item>
<title><![CDATA[TTL电平]]></title>
<link>http://www.52RD.com/Blog/more.asp?name=seu_dust&amp;id=13628</link>
<author>seu_dust</author>
<pubDate>2008-3-21 11:21:00</pubDate>
<description><![CDATA[<P>TTL一直在说，今天查看一下TTL的标准定义。</P>
<P><FONT color=#6600ff>TTL电平信号被利用的最多是因为通常数据表示采用二进制规定，+5V等价于逻辑“1”，0V等价于逻辑“0”，这被称做TTL（晶体管-晶体管逻辑电平）信号系统，这是计算机处理器控制的设备内部各部分之间通信的标准技术。 <BR>TTL电平信号对于计算机处理器控制的设备内部的数据传输是很理想的，首先计算机处理器控制的设备内部的数据传输对于电源的要求不高以及热损耗也较低，另外TTL电平信号直接与集成电路连接而不需要价格昂贵的线路驱动器以及接收器电路；再者，计算机处理器控制的设备内部的数据传输是在高速下进行的，而TTL接口的操作恰能满足这个要求。TTL型通信大多数情况下，是采用并行数据传输方式，而并行数据传输对于超过10英尺的距离就不适合了。这是由于可靠性和成本两面的原因。因为在并行接口中存在着偏相和不对称的问题，这些问题对可靠性均有影响。 <BR>TTL输出高电平&gt;2.4V，输出低电平&lt;0.4V。在室温下，一般输出高电平是3.5V，输出低电平是0.2V。最小输入高电平和低电平：输入高电平&gt;=2.0V，输入低电平&lt;=0.8V，噪声容限是0.4V。 <BR><BR>TTL电路是电流控制器件，TTL电路的速度快，传输延迟时间短(5-10ns)，但是功耗大。</CA></FONT></P>]]></description>
</item><item>
<title><![CDATA[PB中的参数选项卡]]></title>
<link>http://www.52RD.com/Blog/more.asp?name=seu_dust&amp;id=13375</link>
<author>seu_dust</author>
<pubDate>2008-3-10 10:35:00</pubDate>
<description><![CDATA[<P><FONT color=#0066ff>转自《WINCE.NET内核定制及应用开发》</FONT></P>
<P><FONT color=#0066ff>PB的ParameterView<BR>1、公用参数<BR>公用参数对所有的工程（无论采用何款CPU），是WINCE的基本参数文件。主要包括COMMOM.REG,COMMON.BIB,COMMON.DAT,COMMON.DB。<BR>对这些文件的修改会影响所建立的所有工程，所以除非确认所做修改在之前或之后建立的工程中均起作用，否则不要对这4个文件进行任何形式的修改。<BR></FONT></P>
<P><FONT color=#0066ff>2、硬件特性参数<BR>硬件特性参数是保存所采用的CPU系列的硬件设置内容，对所有采用相同CPU系列的工程均起作用，是基于某款CPU系列的公用参数。包括CONFIG.BIB,PLATFORM.BIB,PLATFORM.REG,PLATFORM.DAT,PLATFORM.DB。<BR>对这5个文件的修改会影响所有以此款CPU系列BSP为基础建立的工程。<BR></FONT></P>
<P><FONT color=#0066ff>3、工程参数<BR>工程参数是当前工程用到的基本参数，对它的修改只对当前工程有作用，对其他任何工程没有作用，包括CESYSGEN.BAT,PROJECT.REG,PROJECT.DAT,PROJECT.BIB,PROJECT.DB。</FONT></P>]]></description>
</item><item>
<title><![CDATA[extern 和 extern "C" 分析]]></title>
<link>http://www.52RD.com/Blog/more.asp?name=seu_dust&amp;id=11774</link>
<author>seu_dust</author>
<pubDate>2007-11-20 15:22:00</pubDate>
<description><![CDATA[<P>对这两个关键字的理解一直有些模糊，查了一些资料，将某些不错的解释整理转载于此，对原出处表示感谢。<A href="http://hi.baidu.com/ylywyn/blog/item/c43338d3602e66023bf3cf7c.html">http://hi.baidu.com/ylywyn/blog/item/c43338d3602e66023bf3cf7c.html</A></P>
<P><A href="http://hi.baidu.com/cjscu/blog/item/1b4bd122ace49bf1d6cae263.html">http://hi.baidu.com/cjscu/blog/item/1b4bd122ace49bf1d6cae263.html</A></P>
<DIV>
<P>extern</P>
<P><FONT color=#6600ff>extern是C/C++语言中表明函数和全局变量作用范围（可见性）的关键字.它告诉编译器，其声明的函数和变量可以在本模块或其它模块中使用。</FONT></P>
<P><SPAN><FONT color=#6600ff>1。对于extern变量来说，仅仅是一个变量的声明，其并不是在定义分配内存空间。如果该变量定义多次，会有连接错误</FONT></SPAN></P>
<P><SPAN><FONT color=#6600ff>2。通常，在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。也就是说c文件里面定义，如果该函数或者变量与开放给外面，则在h文件中用extern加以声明。所以外部文件只用include该h文件就可以了。而且编译阶段，外面是找不到该函数的，但是不报错。link阶段会从定义模块生成的目标代码中找到此函数。</FONT></SPAN></P>
<P><SPAN><FONT color=#6600ff>3。与extern对应的关键字是static，被它修饰的全局变量和函数只能在本模块中使用。</FONT></SPAN></P>
<P><SPAN><FONT color=#6600ff>1 问题：</FONT></SPAN><SPAN><FONT color=#6600ff><SPAN>常常见extern放在函数的前面成为函数声明的一部分，那么，C语言的关键字extern在函数的声明中起什么作用？<BR><BR>　　答案与分析：<BR><BR>　　如果函数的声明中带有关键字extern，仅仅是暗示这个函数可能在别的源文件里定义，没有其它作用。即下述两个函数声明没有明显的区别：extern int fun() 和 int fun()；</SPAN><BR>　　当然，这样的用处还是有的，就是在程序中取代include “*.h”来声明函数，在一些复杂的项目中，我比较习惯在所有的函数声明前添加extern修饰。<BR></FONT></P></SPAN>
<P><SPAN><FONT color=#6600ff>2 问题：extern 变量</FONT></P>
<P><FONT color=#6600ff>　　在一个源文件里定义了一个数组：<BR>char a[6];<BR>　　在另外一个文件里用下列语句进行了声明：<BR>extern char *a；</FONT></P>
<P><FONT color=#6600ff>　　请问，这样可以吗？</FONT></P>
<P><FONT color=#6600ff>　　答案与分析：</FONT></P>
<P><FONT color=#6600ff>　　1)、不可以，程序运行时会告诉你非法访问。原因在于，指向类型T的指针并不等价于类型T的数组。extern char *a声明的是一个指针变量而不是字符数组，因此与实际的定义不同，从而造成运行时非法访问。应该将声明改为extern char a[ ]。</FONT></P>
<P><FONT color=#6600ff>　　2)、例子分析如下，如果a[] = "abcd",则外部变量a=0x61626364 (abcd的ASCII码值)，*a显然没有意义，如下图：</FONT></P>
<P><FONT color=#6600ff>　　显然a指向的空间（0x61626364）没有意义，易出现非法内存访问。</FONT></P>
<P><FONT color=#6600ff>　　3)、这提示我们，在使用extern时候要严格对应声明时的格式，在实际编程中，这样的错误屡见不鲜。</FONT></P>
<P><FONT color=#6600ff>　　4)、extern用在变量声明中常常有这样一个作用，你在*.c文件中声明了一个全局的变量，这个全局的变量如果要被引用，就放在*.h中并用extern来声明。</FONT></P>
<P><FONT color=#6600ff>　　3 问题：extern 函数1</FONT></P>
<P><FONT color=#6600ff>　　常常见extern放在函数的前面成为函数声明的一部分，那么，C语言的关键字extern在函数的声明中起什么作用？</FONT></P>
<P><FONT color=#6600ff>　　答案与分析：</FONT></P>
<P><FONT color=#6600ff>　　如果函数的声明中带有关键字extern，仅仅是暗示这个函数可能在别的源文件里定义，没有其它作用。即下述两个函数声明没有明显的区别：<BR>　 <BR>extern int f(); 和int f();</FONT></P>
<P><FONT color=#6600ff>　　当然，这样的用处还是有的，就是在程序中取代include “*.h”来声明函数，在一些复杂的项目中，我比较习惯在所有的函数声明前添加extern修饰。</FONT></P>
<P><FONT color=#6600ff>　　4 问题：extern 函数2</FONT></P>
<P><FONT color=#6600ff>　　当函数提供方单方面修改函数原型时，如果使用方不知情继续沿用原来的extern申明，这样编译时编译器不会报错。但是在运行过程中，因为少了或者多了输入参数，往往会照成系统错误，这种情况应该如何解决？</FONT></P>
<P><FONT color=#6600ff>　　答案与分析：</FONT></P>
<P><FONT color=#6600ff>　　目前业界针对这种情况的处理没有一个很完美的方案，通常的做法是提供方在自己的xxx_pub.h中提供对外部接口的声明，然后调用方include该头文件，从而省去extern这一步。以避免这种错误。</FONT></P>
<P><FONT color=#6600ff>　　宝剑有双锋，对extern的应用，不同的场合应该选择不同的做法。</FONT></P>
<P><FONT color=#000000>extern "C"</FONT></P><FONT color=#6600ff>
<P>某企业曾经给出如下的一道面试题：</P>
<P>面试题</P>
<P>为什么标准头文件都有类似以下的结构？</P>
<P>&nbsp;&nbsp;&nbsp; #ifndef __INCvxWorksh</P>
<P>&nbsp;&nbsp;&nbsp; #define __INCvxWorksh</P>
<P>&nbsp;&nbsp;&nbsp; #ifdef __cplusplus</P>
<P>&nbsp;&nbsp;&nbsp; extern "C" {</P>
<P>&nbsp;&nbsp;&nbsp; #endif</P>
<P>&nbsp;&nbsp;&nbsp; /*...*/</P>
<P>&nbsp;&nbsp;&nbsp; #ifdef __cplusplus</P>
<P>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp; #endif</P>
<P>&nbsp;&nbsp;&nbsp; #endif /* __INCvxWorksh */</P>
<P>分析</P>
<P>显然，头文件中的编译宏“#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif” 的作用是防止该头文件被重复引用。</P>
<P>那么</P>
<P>&nbsp;&nbsp;&nbsp; #ifdef __cplusplus</P>
<P>&nbsp;&nbsp;&nbsp; extern "C" {</P>
<P>&nbsp;&nbsp;&nbsp; #endif</P>
<P>&nbsp;&nbsp; #ifdef __cplusplus</P>
<P>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp; #endif</P>
<P>的作用又是什么呢？</P>
<P>extern "C" 包含双重含义，从字面上即可得到：首先，被它修饰的目标是“extern”的；其次，被它修饰的目标是“C”的。让我们来详细解读这两重含义。</P>
<P>（1）extern "C"限定的函数或变量是extern类型的；</P>
<P>extern是C/C++语言中表明函数和全局变量作用范围（可见性）的关键字，该关键字告诉编译器，其声明的函数和变量可以在本模块或其它模块中使用。记住，下列语句：</P>
<P>extern int a;</P>
<P>仅仅是一个变量的声明，其并不是在定义变量a，并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次，否则会出现连接错误。</P>
<P>通常，在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如，如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样，模块B中调用模块A中的函数时，在编译阶段，模块B虽然找不到该函数，但是并不会报错；它会在连接阶段中从模块A编译生成的目标代码中找到此函数。</P>
<P>与extern对应的关键字是static，被它修饰的全局变量和函数只能在本模块中使用。因此，一个函数或变量只可能被本模块使用时，其不可能被extern “C”修饰。</P>
<P>（2）被extern "C"修饰的变量和函数是按照C语言方式编译和连接的；</P>
<P>未加extern “C”声明时的编译方式</P>
<P>首先看看C++中对类似C的函数是怎样编译的。</P>
<P>作为一种面向对象的语言，C++支持函数重载，而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如，假设某个函数的原型为：</P>
<P>void foo( int x, int y );</P>
<P>该函数被C编译器编译后在符号库中的名字为_foo，而C++编译器则会产生像_foo_int_int之类的名字（不同的编译器可能生成的名字不同，但是都采用了相同的机制，生成的新名字称为“mangled name”）。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息，C++就是靠这种机制来实现函数重载的。例如，在C++中，函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的，后者为_foo_int_float。</P>
<P>同样地，C++中的变量除支持局部变量外，还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名，我们以"."来区分。而本质上，编译器在进行编译时，与函数的处理相似，也为类中的变量取了一个独一无二的名字，这个名字与用户程序中同名的全局变量名字不同。</P>
<P>未加extern "C"声明时的连接方式</P>
<P>假设在C++中，模块A的头文件如下：</P>
<P>// 模块A头文件　moduleA.h</P>
<P>#ifndef MODULE_A_H</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define MODULE_A_H</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; int foo( int x, int y );</P>
<P>#endif</P>
<P>在模块B中引用该函数：</P>
<P>// 模块B实现文件　moduleB.cpp</P>
<P>＃i nclude "moduleA.h"</P>
<P>foo(2,3);</P>
<P>实际上，在连接阶段，连接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_int这样的符号！</P>
<P>加extern "C"声明后的编译和连接方式</P>
<P>加extern "C"声明后，模块A的头文件变为：</P>
<P>// 模块A头文件　moduleA.h</P>
<P>#ifndef MODULE_A_H</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define MODULE_A_H</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; extern "C" int foo( int x, int y );</P>
<P>#endif</P>
<P>在模块B的实现文件中仍然调用foo( 2,3 )，其结果是：</P>
<P>（1）模块A编译生成foo的目标代码时，没有对其名字进行特殊处理，采用了C语言的方式；</P>
<P>（2）连接器在为模块B的目标代码寻找foo(2,3)调用时，寻找的是未经修改的符号名_foo。</P>
<P>如果在模块A中函数声明了foo为extern "C"类型，而模块B中包含的是extern int foo( int x, int y ) ，则模块B找不到模块A中的函数；反之亦然。</P>
<P>所以，可以用一句话概括extern “C”这个声明的真实目的（任何语言中的任何语法特性的诞生都不是随意而为的，来源于真实世界的需求驱动。我们在思考问题时，不能只停留在这个语言是怎么做的，还要问一问它为什么要这么做，动机是什么，这样我们可以更深入地理解许多问题）：</P>
<P>实现C++与C及其它语言的混合编程。</P>
<P>明白了C++中extern "C"的设立动机，我们下面来具体分析extern "C"通常的使用技巧。</P>
<P>4.extern "C"的惯用法</P>
<P>（1）在C++中引用C语言中的函数和变量，在包含C语言头文件（假设为cExample.h）时，需进行下列处理：</P>
<P>extern "C"</P>
<P>{</P>
<P>＃i nclude "cExample.h"</P>
<P>}</P>
<P>而在C语言的头文件中，对其外部函数只能指定为extern类型，C语言中不支持extern "C"声明，在.c文件中包含了extern "C"时会出现编译语法错误。</P>
<P>笔者编写的C++引用C函数例子工程中包含的三个文件的源代码如下：</P>
<P>/* c语言头文件：cExample.h */</P>
<P>#ifndef C_EXAMPLE_H</P>
<P>#define C_EXAMPLE_H</P>
<P>extern int add(int x,int y);</P>
<P>#endif</P>
<P>/* c语言实现文件：cExample.c */</P>
<P>＃i nclude "cExample.h"</P>
<P>int add( int x, int y )</P>
<P>{</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x + y;</P>
<P>}</P>
<P>// c++实现文件，调用add：cppFile.cpp</P>
<P>extern "C"</P>
<P>{</P>
<P>＃i nclude "cExample.h"</P>
<P>}</P>
<P>int main(int argc, char* argv[])</P>
<P>{</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add(2,3);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</P>
<P>}</P>
<P>如果C++调用一个C语言编写的.DLL时，当包括.DLL的头文件或声明接口函数时，应加extern "C" {　}。</P>
<P>（2）在C中引用C++语言中的函数和变量时，C++的头文件需添加extern "C"，但是在C语言中不能直接引用声明了extern "C"的该头文件，应该仅将C文件中将C++中定义的extern "C"函数声明为extern类型。</P>
<P>笔者编写的C引用C++函数例子工程中包含的三个文件的源代码如下：</P>
<P>//C++头文件 cppExample.h</P>
<P>#ifndef CPP_EXAMPLE_H</P>
<P>#define CPP_EXAMPLE_H</P>
<P>extern "C" int add( int x, int y );</P>
<P>#endif</P>
<P>//C++实现文件 cppExample.cpp</P>
<P>＃i nclude "cppExample.h"</P>
<P>int add( int x, int y )</P>
<P>{</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x + y;</P>
<P>}</P>
<P>/* C实现文件 cFile.c</P>
<P>/* 这样会编译出错：＃i nclude "cExample.h" */</P>
<P>extern int add( int x, int y );</P>
<P>int main( int argc, char* argv[] )</P>
<P>{</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add( 2, 3 );&nbsp;&nbsp;&nbsp;&nbsp;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</P>
<P>}<BR></P></FONT><FONT color=#6600ff>
<P>简短一点就是:</P>
<P>函数经过编译系统的翻译成汇编，函数名对应着汇编标号。 因为C编译函数名与得到的汇编代号基本一样，如：fun()=&gt;_fun, main=&gt;_main 但是C++中函数名与得到的汇编代号有比较大的差别。 如：由于函数重载，函数名一样，但汇编代号绝对不能一样。 为了区分，编译器会把函数名和参数类型合在一起作为汇编代号， 这样就解决了重载问题。具体如何把函数名和参数类型合在一起， 要看编译器的帮助说明了。 这样一来，如果C++调用C，如fun(),则调用名就不是C的翻译结果_fun, 而是带有参数信息的一个名字，因此就不能调用到fun（），为了解决 这个问题，加上extern "C"表示该函数的调用规则是C的规则，则调用 时就不使用C++规则的带有参数信息的名字，而是_fun,从而达到调用C函数的目的。 <BR></P></FONT></SPAN></DIV>]]></description>
</item><item>
<title><![CDATA[UCOS_II的内存管理模块]]></title>
<link>http://www.52RD.com/Blog/more.asp?name=seu_dust&amp;id=11599</link>
<author>seu_dust</author>
<pubDate>2007-11-12 11:09:00</pubDate>
<description><![CDATA[<P><FONT color=#0066ff>转自<A href="http://www.daxia.com/list_804.shtml">http://www.daxia.com/list_804.shtml</A>，在此表示感谢。&nbsp;&nbsp;</FONT></P>
<P><FONT color=#0066ff>&nbsp;&nbsp;&nbsp;内存管理模块主要由一个数据结构体和五个函数组成： <BR>◇ 内存控制块数据结构OS_MEM <BR>◇ 内存分区建立函数OSMemCreate（） <BR>◇ 内存块分配函数OSMemGet（） <BR>◇ 内存块释放函数OSMemPut（） <BR>◇ 内存分区状态查询函数OSMemQuery（） <BR>◇ 内存控制块链表初始化函数OSMemInit（） <BR>他们一同构成内存管理模块来对需要管理的内存块进行简单的管理――分配（动态分配）和<BR>释放（动态回收）； <BR><BR>◇ 内存控制块数据结构OS_MEM <BR>typedef struct { <BR>void *OSMemAddr; <BR>void *OSMemFreeList; <BR>INT32U OSMemBlkSize; <BR>INT32U OSMemNBlks; <BR>INT32U OSMemNFree; <BR>} OS_MEM; <BR>系统中每个内存分区必须有一个属于自己的内存控制块，只有这样，内存管理模块中的五个<BR>函数才能对这个内存分区进行管理和操作； <BR>操作系统首先在内存中声明了一个全局的内存控制块数组和指针： <BR>static OS_MEM *OSMemFreeList; <BR>static OS_MEM OSMemTbl[OS_MAX_MEM_PART]; <BR>然后在系统初始化的时候调用内存控制块链表初始化函数把这个全局的内存控制块数组<BR>OSMemTbl[ ]构建成一个单向链表，并把这个链表的头指针赋给OSMemFreeList，这样以后，<BR>每当用内存分区建立函数OSMemCreate（）建立一个分区时，从这个链表中取出一个内存控<BR>制块来对这个内存分区进行管理；内存控制块数组的大小决定系统中内存分区的最大数<BR>目； <BR><BR>◇ 内存分区建立函数OSMemCreate（） <BR>要建立一个内存分区，必须具备三个条件： <BR>1． 有供建立内存分区的内存空间：一般处理方法是以二维数组的形式来声明一个变量，这<BR>个变量在编译、链接的时候必定分配给一定的内存空间，这个内存空间只能通过内存块分配<BR>函数来获取使用； <BR>2． 内存控制块数组中有闲置的内存控制块：一般的处理方法是先统计需要建立的内存分区<BR>的数目，然后依此来声明足够的内存控制块； <BR>3． 声明一个内存控制块指针，便于以后对这个内存分区的访问； <BR>内存分区建立后，这个二维数组就被构建成了一个单向链表，每个节点就是一个内存块，它<BR>由两部分组成：指向下一个内存块的指针（不能用来作为动态内存来使用）、能够作为动态<BR>内存来使用的存储空间； <BR><BR>◇ 内存块分配函数OSMemGet（） <BR>用户创建的任务要使用内存分区中的内存块，就必须通过调用内存分配函数来申请；一般的<BR>处理方法是：先在用户任务中声明一个void类型的指针和一个INTU8 型变量，然后调用<BR>OSMemGet（）来从指定的内存分区中申请一个内存块，并把内存块的指针赋给预先声明的<BR>void类型指针；接着对INTU8 型变量进行判断，看申请内存块是否成功。如果成功，就可以<BR>使用这个内存块中可以用动态使用的存储空间。 <BR><BR>◇ 内存块释放函数OSMemPut（） <BR>用户创建的任务不在使用申请来的内存块的时候，必须及时的调用OSMemPut（）来把内存块<BR>释放到相应的内存分区中去。需要注意的是，这个内存块从那个内存分区中申请来的就必须<BR>释放到那个内存分区中去，否则会造成系统崩溃；这个用户在编写任务的时候注意就可以避<BR>免了； <BR>OSMemGet（）和OSMemPut（）应该成对使用； <BR><BR>◇ 内存分区状态查询函数OSMemQuery（） <BR>调用内存分区状态查询函数可以获取一个内存分区的相关信息，它的实现方法就是把内存分<BR>区控制块中的信息拷贝到OS_MEM_DATA的数据结构体中供调用查看、使用；那么大家也许会<BR>问为什么我们不直接通过访问分区控制块来获取这个分区的使用信息呢？这就涉及到代码的<BR>临界区的问题。试想如果我们直接访问内存控制块中的域的话而没有关中断的话，那么如果<BR>时钟节拍到来的时候我们的访问肯定被打断（我们只获取了内存分区的部分信息，还有部分<BR>信息没来得及获取），这个时候通过调度准备就绪而且优先级高的任务得以运行，那么前面<BR>的任务就得等待；试想现在运行的任务如果对这个内存分区进行操作的话，那么上一个任务<BR>获取的内存分区的信息就不一致了，这个可能给我们不可预测的后果；为此在访问内存分区<BR>控制块前，我们得关中断，之后我们还得开中断，这个给我们的移值带来琐碎的麻烦！这也<BR>就是编写这个函数的原因！ <BR><BR>下面就内存管理模块来举个例子： <BR>#define BlockNum 100 <BR>#define BlockSize 32 <BR>OS_MEM *CommRAMA_Ptr； <BR>OS_MEM *CommRAMB_Ptr； <BR>INT8U CommRAMA[BlockNum][BlockSize]； <BR>INT8U CommRAMB[BlockNum][BlockSize*4]； <BR>… … … … <BR>void main（void） <BR>｛ <BR>INT8U error； <BR>… … … … <BR>/*用内存分区建立函数OSMemCreate（）把这两块RAM存储空间构建成内存 */ <BR>/*区，并把管理这两块内存分区的内存分区控制块的地址赋给两个OS_MEM指针*/ <BR>CommRAMA_Ptr=OSMemCreate（CommRAMA，BlockNum， BlockSize，error）； <BR>CommRAMB_Ptr=OSMemCreate（CommRAMB，BlockNum， BlockSize*2，error）； <BR>… … … … <BR>OSStart（）； <BR>｝ <BR><BR>void MyTask（void） <BR>｛ <BR>… … … … <BR>INT8U Error； <BR>OS_MEM_DATA MemInfo； <BR>INT8U BlkA_Ptr，BlkB_Ptr； <BR>… … … … <BR>for（;;）｛ <BR>Error= OSMemQuery（CommRAMA_Ptr，&amp;MemInfo）； ------（1） <BR>If（MemInfo.OSNFree≥2）｛ ------（2） <BR>BlkA_Ptr=（INT8U *）OSMemGet（CommRAMA_Ptr,&amp;Error）； ------（3） <BR>BlkB_Ptr=（INT8U *）OSMemGet（CommRAMA_Ptr,&amp;Error）； ------（4） <BR>/*使用获得的内存块*/ <BR>… … … … <BR>/*释放获得的内存块*/ <BR>OSMemPut（CommRAMA_Ptr，BlkA_Ptr）； <BR>OSMemPut（CommRAMA_Ptr，BlkB_Ptr）； <BR>｝else｛ <BR>Error= OSMemQuery（CommRAMB_Ptr，&amp;MemInfo）； <BR>If（MemInfo.OSNFree≥1）｛ <BR>BlkA_Ptr=（INT8U *）OSMemGet（CommRAMB_Ptr,&amp;Error）；---（5） <BR>/*使用获得的内存块*/ <BR>… … … … <BR>/*释放获得的内存块*/ <BR>OSMemPut（CommRAMA_Ptr，BlkB_Ptr）； <BR>｝else｛ <BR>OSTimeDly（1）； /*等待一个时钟节拍*/ <BR>｝ <BR>｝ <BR>… … … … <BR>｝ <BR>｝ <BR>系统建立了两个内存分区：内存分区CommRAMA的内存块的大小为32个INT8U（可用的为31个<BR>INT8U），内存分区CommRAMB的内存块的大小为128个INT8U（可用的为127个INT8U）；现在<BR>用户创建了一个名为MyTask的任务，它运行时需要一个大小为60个INT8U的内存空间，在这<BR>个系统有两个解决办法：从内存分区CommRAMA中申请两个内存块以及从内存分区CommRAMB中<BR>申请一个内存块；具体的实现方法是先获取内存分区CommRAMA的使用信息，看有没有足够的<BR>内存块（剩余块数不小于2）如果够的话，就不用从内存分区CommRAMB中申请了，否则就的<BR>从CommRAMB中申请，如果这里也没有的话，那么就等待一个时钟节拍！ <BR><BR>使用内存管理模块需要做的工作还有： <BR>1．打开配置文件OS_CFG.H，将开关量OS_MEM_EN设置为1： <BR>#define OS_MEM_EN 0 <BR>2．打开配置文件OS_CFG.H，设置系统要建立的任务分区的数量： <BR>#define OS_MAX_MEM_PART 2 <BR></P></FONT>]]></description>
</item>
</channel>
</rss>