<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
<channel>
<title><![CDATA[听风是雨的日子╰☆~☆╰]]></title>
<link>http://blog.pfan.cn/embed</link>
<description>编程爱好者博客</description>
<language>zh-cn</language>
			<item>
		<title><![CDATA[常见街头骗术37招]]></title>
		<link>http://blog.pfan.cn/embed/20393.html</link>
		<description><![CDATA[街头骗术大全，更新中

常见街头骗术37招
&nbsp;
骗术一：通常是一男一女带个小孩，遇到模样老实的(比如我 ) ，上前 说，钱丢了，没钱回家，给几块钱坐车吧。还有说是来深圳找亲戚，没找着，钱用光了，给几块钱给他们买点吃的。第一次遇到这种骗术往往容易上当，我 在大学时就上当过。骗子骗了几块钱，马上又去骗别人。在深圳路边遇到过多次，广州一般出现在好又多，万佳等超市附近。　　　　 　　骗术二：路边某个青年男子，带着个包，坐在地下，用粉笔在地下写一些 什么“找不到工作，太饿了，请好心人给点钱买东西吃”。一样是骗子，如果 到深圳、广州所有地方走一圈，保证可以找到上百个这样的骗子。　　　　 　　骗术三：大学时室友遇到过一次，来深圳后本人遇到过三次。大概流程是 这样的：当你从银行取钱出来，或者到邮政局存钱的话，旁边会有两个串通好的男子，一个假装把一捆钱丢在地上，往前走，后面的骗子故意在你面前将钱 捡起来，然后把你拉到一边，把捡到的那叠钱放到你身上。而前面丢钱的骗子则返回，问后面的骗子是否捡到了钱，并且要后面的骗子搜身。后面的骗子说 没有，然后把你拉到一边，说捡到的钱平分，现在钱在你身上，我现在跟他去搜身，我怕你在我去搜身后逃之夭夭，所以你要把你身上的部分钱押在我这 里。如果你真的将你自己的部分钱押给他们，就再也找不到人了。你打开那捡到的一叠钱，会发现，表面是一张人民币，里面全是白纸。　　　　 　　骗术四：就是手机短消息了，说什么你中了。。。。奖(比如笔记本电脑) 云云，而你如果一个电话打过去，她们会叫你将钱寄到某个帐号，说是奖品的 邮寄费。而你真的相信了，寄出去的钱就如同石沉大海。　　　　 　　骗术五：路边的押注。几个碗倒盖地下，骗子凭借很快的手法，将一粒棋 子放在某个碗下，让你去猜。如果你押50元，猜中了他倒赔你50，猜错了这50 元就输了。这样的骗子，往往会有一群骗子来故意充当观众，起哄或者押钱。 最近广州太平洋电脑城附近很多。
&nbsp;
骗术六：想起一个行骗的例子，尤其逢年过节，大家要警惕。我遇到一 次，还真的上当了。－－有一个人抗一袋米，然后敲你家门，一张口就说：有一个60多岁的老太太在我们店买了米，让我先送过来，她还要去其他地方买东 西。米50块还没给。我当时心里觉得挺奇怪，我妈没这么老吧？？后来想想可能显老，而且又有这么一袋米，就给了钱。老妈回来]]></description>
		<author><![CDATA[embed]]></author>
		<pubDate>2006-11-16 22:46:00</pubDate>
		</item>
				<item>
		<title><![CDATA[用单片机破译计算机开机密码]]></title>
		<link>http://blog.pfan.cn/embed/20373.html</link>
		<description><![CDATA[用单片机破译计算机开机密码
&nbsp;

发信人: oBigeyes (以不变应万变), 信区: Circuit标&nbsp; 题: 用单片机破译计算机开机密码zz发信站: 水木社区 (Thu Jun 22 02:19:23 2006), 站内
&nbsp;&nbsp;&nbsp; 目前主流计算机的ＢＩＯＳ均为ＡＷＡＲＤ公司生产的，ＣＭＯＳ开机密码最长为８个字符，采用穷举法看似有非常多的键盘组合，但经过加密运算后的有效“密文”只有１６位，即６５５３６种，因此有大量“重复”的密码，即虽然输入的键盘组合不一样，但ＣＭＯＳ中的密文是一样的，实际效果是一样的。对应这６５５３６种密文，每个密文只需找出一种键盘组合即可。本文讲述如何用单片机来计算出这６５５３６种键盘组合，并输给计算机，采用穷举法来破译ＣＭＯＳ密码。
&nbsp;
一、ＣＭＯＳ密码加密运算方法
&nbsp;
&nbsp;&nbsp;&nbsp; ＣＭＯＳ加密运算是：从低位到高位每一位的ＡＳＣＩＩ码左移２（ｎ－１）位之后相加，其中ｎ为位数，相加结果即为密文，存入ＣＭＯＳ。如果密码位数较多，运算结果超过１６位，则将超出１６位的部分再与低１６位相加，保留此结果。
以４位密码“ａｂｃｄ”为例，计算机内部是将“ｄ”的ＡＳＣＩＩ码６４Ｈ保留，“ｃ”的ＡＳＣＩＩ值６３Ｈ向左移２位，ｂ的ＡＳＣＩＩ值６２Ｈ向左移４位，ａ的ＡＳＣＩＩ值６１Ｈ左移６位，然后将这四个数相加得到一个１６位数，此数２０５０Ｈ即为运算后的密文，存入ＣＭＯＳ。用十进制数表示此过程即为：１００＋９９４＋９８１６＋９７６４＝８２７２转为十六进制为２０５０Ｈ。
&nbsp;
二、密文向密码反推算法
&nbsp;
&nbsp;&nbsp;&nbsp; 由加密算法可知，肯定会存在多个密码运算后形成的密文相同的情况，因此用一个密文，可以反推出很多组密码来，我们只需要其中一组即可。
&nbsp;&nbsp;&nbsp; 从１０进制的角度出发，密码的ＡＳＣＩＩ码与密文的关系符合如下方程：
Ｘ１×１＋Ｘ２×４＋Ｘ３×１６＋Ｘ４×６４＋Ｘ５×２５６… …＝密文
其中Ｘ１，Ｘ２，Ｘ３，Ｘ４等分别为密码从低到高位的ＡＳＣＩＩ码。这是一个不定方程，所有符合下列两个条件的解都满足要求：
１． Ｘ１，Ｘ２，Ｘ３，Ｘ４……为整数。
２． Ｘ１，]]></description>
		<author><![CDATA[embed]]></author>
		<pubDate>2006-11-16 14:24:00</pubDate>
		</item>
				<item>
		<title><![CDATA[教你学会编写Linux设备驱动]]></title>
		<link>http://blog.pfan.cn/embed/20372.html</link>
		<description><![CDATA[教你学会编写Linux设备驱动 [ZZ]
&nbsp;
内核版本: 2.4.22 阅读此文的目的: 学会编写Linux设备驱动。 阅读此文的方法: 阅读以下2个文件: hello.c,asdf.c。 此文假设读者: 已经能用C语言编写Linux应用程序, 理解"字符设备文件, 块设备文件, 主设备号, 次设备号", 会写简单的Shell脚本和Makefile。 1. "hello.c" -------------------------------- /* * 这是我们的第一个源文件， * 它是一个可以加载的内核模块， * 加载时显示"Hello,World!"， * 卸载时显示"Bye!"。 * 需要说明一点，写内核或内核模块不能用写应用程序时的系统调用或函数库， * 因为我们写的就是为应用程序提供系统调用的代码。 * 内核有专用的函数库，如, , 等, * 现在还没必要了解得很详细， * 这里用到的printk的功能类似于printf。 * "/usr/src/linux"是你实际的内核源码目录的一个符号链接， * 如果没有现在就创建一个,因为下面和以后都会用到。 * 编译它用"gcc -c -I/usr/src/linux/include hello.c"， * 如果正常会生成文件hello.o, * 加载它用"insmod hello.o", * 只有在文本终端下才能看到输出。 * 卸载它用"rmmod hello" */ /* * 小技巧: 在用户目录的.bashrc里加上一行: * alias mkmod='gcc -c -I/usr/src/linux/include' * 然后重新登陆Shell, * 以后就可以用"mkmod hello.c"的方式来编译内核模块了。 */ /* 开始例行公事 */ #ifndef __KERNEL__ # define __KERNEL__ #endif #ifndef MODULE # define MODULE #endif #include #include MODULE_LICENSE("GPL"); #ifdef CONFIG_SMP #define __SMP__ #endif /* 结束例行公事 */ #include /* printk()在这个文件里 */ static int init_mo]]></description>
		<author><![CDATA[embed]]></author>
		<pubDate>2006-11-16 14:22:00</pubDate>
		</item>
				<item>
		<title><![CDATA[c51模拟串口]]></title>
		<link>http://blog.pfan.cn/embed/20371.html</link>
		<description><![CDATA[c51模拟串口[ZZ]
//作者：晒太阳的小猪
&nbsp;
在电路设计当中，经常会感觉控制器mcu的串口sci数量太少，一般mcu的sci数量不会超过3个（其实包含有3个的就是很多的了）。要想使用更多的串口sci,就得选用硬件串口uart扩展芯片或者采用软件协议利用一般的端口来模拟sci协议。利用软件模拟的方法是最廉价的设计方法。现在把c51模拟串口sci的程序提供出来,供大家享用。
/**********************************************
IO 口模拟232通讯程序,频率9600
占用定时器0 
**********************************************/＃i nclude&nbsp;&nbsp;&nbsp; &lt;MAIN.h&gt;＃i nclude&nbsp;&nbsp;&nbsp; &lt;ABSACC.h&gt;＃i nclude&nbsp;&nbsp;&nbsp; &lt;INTRINS.h&gt;＃i nclude&nbsp;&nbsp;&nbsp; &lt;STRING.h&gt;#define uint unsigned int#define uchar unsigned char#define REN_485 P21&nbsp; //为0则可以接受，否则发送#define TIMER0_ENABLE TL0=TH0; TR0=1;#define TIMER0_DISABLE TR0=0;//#define F_TM F0bit F_TM;uchar time_count;sbit BT_SND =P3^1;sbit BT_REC =P3^0;
sbit ACC0= ACC^0;sbit ACC1= ACC^1;sbit ACC2= ACC^2;sbit ACC3= ACC^3;sbit ACC4= ACC^4;sbit ACC5= ACC^5;sbit ACC6= ACC^6;sbit ACC7= ACC^7;
void IntTimer0() interrupt 1 using 1{F_TM=1;time_count++;}
//发送一个字符void PSendChar(uchar inch){ &nbsp; &nbsp; uchar ii; &n]]></description>
		<author><![CDATA[embed]]></author>
		<pubDate>2006-11-16 13:58:00</pubDate>
		</item>
				<item>
		<title><![CDATA[别踩static的地雷]]></title>
		<link>http://blog.pfan.cn/embed/20369.html</link>
		<description><![CDATA[只要做过项目的朋友对关键字static应该都有一些了解，但未见了解很全面的。在C语言中，关键字static有以下明显的作用：1.static变量分配到静态内存中，这一点和全局非静态变量相同。 
2.在函数体，static变量只要不进行修改操作，在被调用过程中其值将保持不变。3.在模块内，全局static变量可以被模块内所有函数访问，但不能被模块外其它函数访问。它是一个本地的全局变量，具有私有特点。4.在模块内，一个static函数只可被这一模块内的其它函数调用。那就是，这个函数被限制在声明它的模块的本地范围内使用，也具有私有特点。
&nbsp;&nbsp; 如果我们能够很好地利用static的这些特性，书写高内聚低耦合，更具模块化的代码就不会显得象句口号；如果不能很好地理解和使用它，一切都只是空谈。下面来举个例子来说明static在实际应用可能会遇到问题。
　　如果要求实现下面的接口：为每个大小约1600字节的音视频裸数据(audio/video)添加包头(packet header)，然后将打过包头的整个数据包发送到网络。打过包头的数据包格式如下:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;------packet-----&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;｜ header ｜&nbsp;data&nbsp;｜
&nbsp;
　　我想有人可能会这么做：
&nbsp;
#define MAX_PACKET_SIZE 1600
&nbsp;

typedef struct&nbsp;_header
{
&nbsp; bool type;　　/*数据包类型*/
&nbsp; bool length;　/*数据包类型*/
　...
}header;
&nbsp;
bool send(bool ty]]></description>
		<author><![CDATA[embed]]></author>
		<pubDate>2006-11-16 13:52:00</pubDate>
		</item>
				<item>
		<title><![CDATA[如何设计一个合适的电源]]></title>
		<link>http://blog.pfan.cn/embed/20368.html</link>
		<description><![CDATA[如何设计一个合适的电源
对于现在一个电子系统来说，电源部分的设计也越来越重要，我想通过和大家探讨一些自己关于电源设计的心得，来个抛砖引玉，让我们在电源设计方面能够都有所深入和长进。
Q1：如何来评估一个系统的电源需求
Answer：对于一个实际的电子系统，要认真的分析它的电源需求。不仅仅是关心输入电压，输出电压和电流，还要仔细考虑总的功耗，电源实现的效率，电源部分对负载变化的瞬态响应能力，关键器件对电源波动的容忍范围以及相应的允许的电源纹波，还有散热问题等等。功耗和效率是密切相关的，效率高了，在负载功耗相同的情况下总功耗就少，对于整个系统的功率预算就非常有利了，对比LDO和开关电源，开关电源的效率要高一些。同时，评估效率不仅仅是看在满负载的时候电源电路的效率，还要关注轻负载的时候效率水平。
至于负载瞬态响应能力，对于一些高性能的CPU应用就会有严格的要求，因为当CPU突然开始运行繁重的任务时，需要的启动电流是很大的，如果电源电路响应速度不够，造成瞬间电压下降过多过低，造成CPU运行出错。
一般来说，要求的电源实际值多为标称值的＋－5%，所以可以据此计算出允许的电源纹波，当然要预留余量的。
散热问题对于那些大电流电源和LDO来说比较重要，通过计算也是可以评估是否合适的。
Q2：如何选择合适的电源实现电路
Answer：根据分析系统需求得出的具体技术指标，可以来选择合适的电源实现电路了。一般对于弱电部分，包括了LDO（线性电源转换器），开关电源电容降压转换器和开关电源电感电容转换器。相比之下，LDO设计最易实现，输出纹波小，但缺点是效率有可能不高，发热量大，可提供的电流相较开关电源不大等等。而开关电源电路设计灵活，效率高，但纹波大，实现比较复杂，调试比较烦琐等等。
Q3：如何为开关电源电路选择合适的元器件和参数
Answer：很多的未使用过开关电源设计的工程师会对它产生一定的畏惧心理，比如担心开关电源的干扰问题，PCB layout问题，元器件的参数和类型选择问题等。其实只要了解了，使用一个开关电源设计还是非常方便的。
一个开关电源一般包含有开关电源控制器和输出两部分，有些控制器会将MOSFET集成到芯片中去，这样使用就更简单了，也简化了PCB设计，但是设计的灵活性就减少了一些。
开关控制器基本上就是一个闭环的反馈控制系统，所以一般都会有一个反馈]]></description>
		<author><![CDATA[embed]]></author>
		<pubDate>2006-11-16 13:49:00</pubDate>
		</item>
				<item>
		<title><![CDATA[硬件工程师必看]]></title>
		<link>http://blog.pfan.cn/embed/20367.html</link>
		<description><![CDATA[硬件工程师必看---必杀技学习[转载]
&nbsp;
1 充分了解各方的设计需求，确定合适的解决方案
启动一个硬件开发项目，原始的推动力会来自于很多方面，比如市场的需要，基于整个系统架构的需要，应用软件部门的功能实现需要，提高系统某方面能力的需要等等，所以作为一个硬件系统的设计者，要主动的去了解各个方面的需求，并且综合起来，提出最合适的硬件解决方案。比如A项目的原始推动力来自于公司内部的一个高层软件小组，他们在实际当中发现原有的处理器板IP转发能力不能满足要求，从而对于系统的配置和使用都会造成很大的不便，所以他们提出了对新硬件的需求。根据这个目标，硬件方案中就针对性的选用了两个高性能网络处理器，然后还需要深入的和软件设计者交流，以确定内存大小，内部结构，对外接口和调试接口的数量及类型等等细节，比如软件人员喜欢将控制信令通路和数据通路完全分开来，这样在确定内部数据走向的时候要慎重考虑。项目开始之初是需要召开很多的讨论会议的，应该尽量邀请所有相关部门来参与，好处有三个，第一可以充分了解大家的需要，以免在系统设计上遗漏重要的功能，第二是可以让各个部门了解这个项目的情况，提早做好时间和人员上协作的准备，第三是从感情方面讲，在设计之初各个部门就参与了进来，这个项目就变成了大家共同的一个心血结晶，会得到大家的呵护和良好合作，对完成工作是很有帮助的。
&nbsp;
2 原理图设计中要注意的问题
原理图设计中要有“拿来主义”，现在的芯片厂家一般都可以提供参考设计的原理图，所以要尽量的借助这些资源，在充分理解参考设计的基础上，做一些自己的发挥。当主要的芯片选定以后，最关键的外围设计包括了电源，时钟和芯片间的互连。电源是保证硬件系统正常工作的基础，设计中要详细的分析：系统能够提供的电源输入；单板需要产生的电源输出；各个电源需要提供的电流大小；电源电路效率；各个电源能够允许的波动范围；整个电源系统需要的上电顺序等等。比如A项目中的网络处理器需要1.25V作为核心电压，要求精度在＋5%- －3%之间，电流需要12A左右，根据这些要求，设计中采用5V的电源输入，利用Linear的开关电源控制器和IR的MOSFET搭建了合适的电源供应电路，精度要求决定了输出电容的ESR选择，并且为防止电流过大造成的电压跌落，加入了远端反馈的功能。时钟电路的实现要考虑到目标电路的抖动等要求，A项目中]]></description>
		<author><![CDATA[embed]]></author>
		<pubDate>2006-11-16 13:46:00</pubDate>
		</item>
				<item>
		<title><![CDATA[一个linux设备驱动例程]]></title>
		<link>http://blog.pfan.cn/embed/20366.html</link>
		<description><![CDATA[/* * 这个文件是一个内核模块。 * 内核模块的编译，加载和卸载在前面已经介绍了。 
* 这个模块的功能是，创建一个字符设备。 * 这个设备是一块4096字节的共享内存。 * 内核分配的主设备号会在加载模块时显示。 */ 
/* 开始例行公事 */ #ifndef __KERNEL__ # define __KERNEL__ #endif #ifndef MODULE # define MODULE #endif 
#include &lt;linux/config.h&gt; #include &lt;linux/module.h&gt; 
#ifdef CONFIG_SMP #define __SMP__ #endif MODULE_LICENSE("GPL"); /* 结束例行公事 */ 
#include &lt;asm/uaccess.h&gt; /* copy_to_user(), copy_from_user */ #include &lt;linux/fs.h&gt; /* struct file_operations, register_chrdev(), ... */ #include &lt;linux/kernel.h&gt; /* printk()在这个文件里 */ #include &lt;linux/sched.h&gt; /* 和任务调度有关 */ #include &lt;linux/types.h&gt; /* u8, u16, u32 ... */ 
/* * 关于内核功能库，可以去网上搜索详细资料， */ 
/* 文件被操作时的回调功能 */ static int asdf_open (struct inode *inode, struct file *filp); static int asdf_release (struct inode *inode, struct file *filp); static ssize_t asdf_read (struct file *filp, char *buf, size_t count,loff_t *f_pos); static ssize_t asdf_write (struct file *filp, const char *buf, size_t count]]></description>
		<author><![CDATA[embed]]></author>
		<pubDate>2006-11-16 13:41:00</pubDate>
		</item>
				<item>
		<title><![CDATA[鼠标形状绘制分析－嵌入式开发]]></title>
		<link>http://blog.pfan.cn/embed/20365.html</link>
		<description><![CDATA[鼠标形状绘制分析－嵌入式开发















//鼠标形状绘制分析－嵌入式开发
//鼠标所在LCD为黑、白两色屏
//鼠标形状数据结构描述如下：
const uint8 Gliethttp_MouseArrow[] = {
&nbsp; 0x50, 0x00, 0x00,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //1
&nbsp; 0x64, 0x00, 0x00,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //2
&nbsp; 0x69, 0x00, 0x00,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //3
&nbsp; 0x6A, 0x40, 0x00,&nbsp;&nbsp;&nbsp;&nbsp; //4
&nbsp; 0x6A, 0x90, 0x00,&nbsp;&nbsp;&nbsp;&nbsp; //5
&nbsp; 0x6A, 0xA4, 0x00,&nbsp;&nbsp;&nbsp;&nbsp; //6
&nbsp; 0x6A, 0xA9, 0x00,&nbsp;&nbsp;&nbsp;&nbsp; //7
&nbsp; 0x6A, 0xAA, 0x40,&nbsp;&nbsp;&nbsp; //8
&nbsp; 0x6A, 0xAA, 0x90,&nbsp;&nbsp;&nbsp; //9
&nbsp; 0x6A, 0xA5, 0x54,&nbsp;&nbsp;&nbsp;&nbsp; //10
&nbsp; 0x69, 0xA4, 0x00,&nbsp;&nbsp;&nbsp;&nbsp; //11
&nbsp; 0x64, 0x69, 0x00,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //12
&nbsp; 0x50, 0x69, 0x00,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //13
&nbsp; 0x40, 0x1A, 0x40,&nbsp;&nbsp;&nbsp;&nbsp; //14
&nbsp; 0x00, 0x1A, 0x40,&nbsp;&nbsp;&nbsp;&nbsp; //15
&nbsp; 0x00, 0x06, 0x]]></description>
		<author><![CDATA[embed]]></author>
		<pubDate>2006-11-16 13:35:00</pubDate>
		</item>
				<item>
		<title><![CDATA[如何编写Linux设备驱动程序]]></title>
		<link>http://blog.pfan.cn/embed/20364.html</link>
		<description><![CDATA[[转载]序言 
　　Linux是Unix操作系统的一种变种，在Linux下编写驱动程序的原理和思想完全类似于其他的Unix系统，但它与dos或window环境下的驱动程序有很大的区别。在Linux环境下设计驱动程序，思想简洁，操作方便，功能也很强大，但是支持函数少，只能依赖kernel中的函数，有些常用的操作要自己来编写，而且调试也不方便。本人这几周来为实验室自行研制的一块多媒体卡编制了驱动程序，获得了一些经验，愿与Linux fans共享，有不当之处，请予指正。
　　以下的一些文字主要来源于khg，johnsonm的Write linux device driver，Brennan's Guide to Inline Assembly，The Linux A-Z，还有清华BBS上的有关device driver的一些资料. 这些资料有的已经过时，有的还有一些错误，我依据自己的试验结果进行了修正. 
　　一、Linux device driver 的概念 
　　系统调用是操作系统内核和应用程序之间的接口，设备驱动程序是操作系统内核和机器硬件之间的接口.设备驱动程序为应用程序屏蔽了硬件的细节，这样在应用程序看来，硬件设备只是一个设备文件， 应用程序可以象操作普通文件一样对硬件设备进行操作.设备驱动程序是内核的一部分，它完成以下的功能: 
　　1.对设备初始化和释放. 　　2.把数据从内核传送到硬件和从硬件读取数据. 　　3.读取应用程序传送给设备文件的数据和回送应用程序请求的数据. 　　4.检测和处理设备出现的错误. 
　　在Linux操作系统下有两类主要的设备文件类型，一种是字符设备，另一种是块设备.字符设备和块设备的主要区别是:在对字符设备发出读/写请求时，实际的硬件I/O一般就紧接着发生了，块设备则不然，它利用一块系统内存作缓冲区，当用户进程对设备请求能满足用户的要求，就返回请求的数据，如果不能，就调用请求函数来进行实际的I/O操作.块设备是主要针对磁盘等慢速设备设计的，以免耗费过多的CPU时间来等待. 
　　已经提到，用户进程是通过设备文件来与实际的硬件打交道.每个设备文件都都有其文件属性(c/b)，表示是字符设备还蔤强樯璞?另外每个文件都有两个设备号，第一个是主设备号，标识驱动程序，第二个是从设备号，标识使用同一个设备驱动程序的不同的硬件设备，]]></description>
		<author><![CDATA[embed]]></author>
		<pubDate>2006-11-16 13:34:00</pubDate>
		</item>
				<item>
		<title><![CDATA[《彻底搞定C指针》第7篇&nbsp;函数名与函数指针]]></title>
		<link>http://blog.pfan.cn/embed/20177.html</link>
		<description><![CDATA[《彻底搞定C指针》第7篇 函数名与函数指针
&nbsp;


第7篇 函数名与函数指针
转于（白云小飞 blog)
一 通常的函数调用&nbsp;&nbsp;&nbsp;&nbsp;一个通常的函数调用的例子：//自行包含头文件void MyFun(int x);&nbsp;&nbsp;&nbsp;&nbsp;//此处的申明也可写成：void MyFun( int );int main(int argc, char* argv[]){&nbsp;&nbsp;&nbsp;MyFun(10);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这里是调用MyFun(10);函数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;}void MyFun(int x)&nbsp;&nbsp;//这里定义一个MyFun函数{&nbsp;&nbsp;&nbsp;printf(“%d\n”,x);}&nbsp;&nbsp;&nbsp;&nbsp;这个MyFun函数是一个无返回值的函数，它并不完成什么事情。这种调用函数的格式你应该是很熟悉的吧！看主函数中调用MyFun函数的书写格式：MyFun(10);&nbsp;&nbsp;&nbsp;&nbsp;我们一开始只是从功能上或者说从数学意义上理解MyFun这个函数，知道MyFun函数名代表的是一个功能（或是说一段代码）。&nbsp;&nbsp;&nbsp;&nbsp;直到——&nbsp;&nbsp;&nbsp;&nbsp;学习到函数指针概念时。我才不得不在思考：函数名到底又是什么东西呢？&nbsp;&nbsp;&nbsp;&nbsp;（不要以为这是没有什么意义的事噢！呵呵，继续往下看你就知道了。）二 函数指针变量的申明&nbsp;&nbsp;&nbsp;&nbsp;就象某一数据变量的内存地址可以存储在相应的指针变量中一样，函数的首地址也以存储在某个函数指针变量里的。这样，我就可以通过这个函数指针变量来调用所指向的函数了。&nbsp;&nbsp;&nbsp;&nbsp;在C系列语言中，任何一个变量，总是要先申明，之后才能使用的。那么，函数指针变量也应该要先申明吧？那又是如何来申明呢？以上面的例子为例，我来申明一个可以指向MyFun函数的函数指针变量FunP。下面就是申明FunP]]></description>
		<author><![CDATA[embed]]></author>
		<pubDate>2006-11-10 21:43:00</pubDate>
		</item>
				<item>
		<title><![CDATA[基于VC6的俄罗斯方块代码学习版源码]]></title>
		<link>http://blog.pfan.cn/embed/20176.html</link>
		<description><![CDATA[基于VC6的俄罗斯方块代码学习版源码（1） 
转于http://yyf977.programfan.com&nbsp;


◆源代码下载链接：http://upload.programfan.com/upfile/200610120711419.rar
◆本写代码的目的：1.想以此小软件的开发示例演示面向对象软件工程方法的基本开发过程：&nbsp;&nbsp;&nbsp; （我欲将随后将公开全部过程的UML图及相关思路。欢迎大家提出意见，进行讨论，以达共同进步的目的。）2.对该游戏程序软件架构的一次探索：&nbsp;&nbsp;&nbsp;&nbsp;本游戏特点是界面与逻辑有紧密的关系，如何将逻辑与界面实现相分离也是本代码的探索之处。努力实现面向对象的设计思路，代码所追求的目标是：整体结构合理，减小各功能类之间的耦合度，力求相关问题局部化，做到容易维护代码（如易于修正BUG和功能的扩展升级）。3.本程序是对MFC对话框框架学习后的一次总结：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实现了由控制类控制下多个对话框之间切换的面向对象代码示例。本程序包含一个框架窗口，用以容纳子窗口。子窗口有三个：主界面窗口、设置窗口、游戏play窗口。这些窗口都是由对话框组成，框架窗口是一模态对话框，其它各窗口为非模态对话框。&nbsp; 4.对关卡类游戏的一次实践：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本游戏与我之前扫雷游戏的一个不同是它由一关一关游戏组成，所以不仅仅是一局游戏的实现，还要实现由一关进入另一关之间的游戏流程，本设计演示了此类游戏进行面向对象方法设计的一个示例。5.对有定时需求游戏实现的一次探索：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本游戏与扫雷游戏的另一个不同是它有定时要求，对于游戏有定时要求的面向对象软件设计不是直觉感觉的那么简单，如何看待定时器这个对象，如何实现与它相关的代码动作也是本设计想要探讨的问题。
◆类说明：1.游戏界面类：&nbsp;&nbsp; IView：抽象类，作为各对话框的公共接口，提供接受控制类的通知响应管理。&nbsp; TView：实现了IView接口的界面基础类。&nbsp; CRussiaDmdDlg：向导生成的模态对话框，]]></description>
		<author><![CDATA[embed]]></author>
		<pubDate>2006-11-10 21:30:00</pubDate>
		</item>
				<item>
		<title><![CDATA[sprintf函数&nbsp;sizeof()操作符说明]]></title>
		<link>http://blog.pfan.cn/embed/20175.html</link>
		<description><![CDATA[sprintf函数的用法
&nbsp;

自《CSDN 社区电子杂志——C/C++杂志》 

在将各种类型的数据构造成字符串时，sprintf 的强大功能很少会让你失望。由于sprintf 跟printf 在用法上几乎一样，只是打印的目的地不同而已，前者打印到字符串中，后者则直接在命令行上输出。这也导致sprintf 比printf 有用得多。
sprintf 是个变参函数，定义如下：int sprintf( char *buffer, const char *format [, argument] ... );除了前两个参数类型固定外，后面可以接任意多个参数。而它的精华，显然就在第二个参数：格式化字符串上。
printf 和sprintf 都使用格式化字符串来指定串的格式，在格式串内部使用一些以“%”开头的格式说明符（format specifications）来占据一个位置，在后边的变参列表中提供相应的变量，最终函数就会用相应位置的变量来替代那个说明符，产生一个调用者想要的字符串。
格式化数字字符串sprintf 最常见的应用之一莫过于把整数打印到字符串中，所以，spritnf 在大多数场合可以替代itoa。
如：//把整数123 打印成一个字符串保存在s 中。sprintf(s, "%d", 123); //产生"123"可以指定宽度，不足的左边补空格：sprintf(s, "%8d%8d", 123, 4567); //产生：" 123 4567"当然也可以左对齐：sprintf(s, "%-8d%8d", 123, 4567); //产生："123 4567"也可以按照16 进制打印：sprintf(s, "%8x", 4567); //小写16 进制，宽度占8 个位置，右对齐sprintf(s, "%-8X", 4568); //大写16 进制，宽度占8 个位置，左对齐
这样，一个整数的16 进制字符串就很容易得到，但我们在打印16 进制内容时，通常想要一种左边补0 的等宽格式，那该怎么做呢？很简单，在表示宽度的数字前面加个0 就可以了。sprintf(s, "%08X", 4567); //产生："000011D7"上面以”%d”进行的10 进制打印同样也可以使用这种左边补0 的方式。
这里要注意一个符号扩展的问题：比如，假如我们]]></description>
		<author><![CDATA[embed]]></author>
		<pubDate>2006-11-10 21:22:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C/C++&nbsp;试题剖析]]></title>
		<link>http://blog.pfan.cn/embed/20174.html</link>
		<description><![CDATA[strcpy()与strlen()、sizeof()的区别&nbsp;

char&nbsp;s1[6]="china"&nbsp;,s2[3]="ch";strcpy(s1,s2);请问内存中ina部分的数据是否被覆盖？？S1的内容是ch，还是china？？S1的长度是6？？ 
&nbsp;strcpy(s1,s2);　　strcpy函数的意思是：把字符串s2中的内容copy到s1中，连字符串结束标志也一起copy.这样s1在内存中的存放为：ch\0如果说s1的长度是6，那是错误的.你没有弄清strlen与sizeof的意思。strlen函数的意思是测试字符串的字符长度，不含字符串结束标志的。sizeof是个运算符，它的结果是字符串在内存中的所占字节大小，它要把\0算进去的
&nbsp;
C/C++&nbsp;试题剖析（2）&nbsp;


试题3：void test3(char* str1){　char string[10];　if( strlen( str1 ) &lt;= 10 )　{　　strcpy( string, str1 );　}}
if(strlen(str1) &lt;= 10)应改为if(strlen(str1) &lt; 10)，因为strlen的结果未统计’\0’所占用的1个字节。
考查对基本功的掌握：　　(1)字符串以’\0’结尾；　　(2)对数组越界把握的敏感度；　　(3)库函数strcpy的工作方式，如果编写一个标准strcpy函数的总分值为10，下面给出几个不同得分的答案：　　2分void strcpy( char *strDest, char *strSrc ){　 while( (*strDest++ = * strSrc++) != ‘\0’ );}　　4分void strcpy( char *strDest, const char *strSrc ) //将源字符串加const，表明其为输入参数，加2分{　 while( (*strDest++ = * strSrc++) != ‘\0’ );}　　7分void strcpy(char *strDest, const char *strSrc) {　//对源地址和目的地址加非0断言，加3分　assert( (strDest != NULL) &amp;&a]]></description>
		<author><![CDATA[embed]]></author>
		<pubDate>2006-11-10 21:19:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C/C++&nbsp;学习笔记]]></title>
		<link>http://blog.pfan.cn/embed/20173.html</link>
		<description><![CDATA[《数据与算术运算》笔记
转于http://colormoon.programfan.com&nbsp;


1.整数值
整数前面可以带（或不带）正、负号，但不允许带小数点、逗号或其他特殊符号（如美元符号）。
不同的数据类型在不同设备的存储空间是不同的。
要存储超过设备内定存储空间的整数，必须使用整数限定符。
2.浮点数
同整数值一样，浮点数也不允许带小数点、逗号或其他特殊符号。浮点数分为“float”、“double”、“long double”。它们的区别在于存储空间的大小。
浮点数后面加上“F”或“f”表示这是一个单精度浮点数，加上“L”或“l”表示这是一个双精度长浮点数，如果不加后缀则表示是双精度浮点数。
浮点数也可以用指数表示法表示。如1625 可以表示为 1.625e3，即 1.625x103。
3.字符值
A的ASC码值为65，a的ASC码值为97。
4.算术运算
％是取模运算符，该运算结果是取余数。
向输出流中插入数据可以在多个行中完成，以分号为结束。如：
cout&lt;&lt;"The resoult is "
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;&lt;(22.5+5)&lt;&lt;endl;
但是包含在双引号里的字符串不能被分解为几行，且只有在最后一行中出现分号。
算术表达式的结果永远也不会是一个单精度浮点数，因为计算时，计算机临时将所有单精度数转换为双精度数。
5.整数的除法
两个整数相除，其结果是一个整数，小数部分被省去。
6.运算符的优越级
&nbsp;&nbsp;&nbsp; 运算符&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 结合性
-------------------------------------------------
--（一元的）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp]]></description>
		<author><![CDATA[embed]]></author>
		<pubDate>2006-11-10 21:14:00</pubDate>
		</item>
				<item>
		<title><![CDATA[arm+linux平台开发的准备]]></title>
		<link>http://blog.pfan.cn/embed/20146.html</link>
		<description><![CDATA[下面关于arm+linux平台开发的准备，是针对开发人员来讲的。（转）
一、硬件开发的准备
1、单片机知识基础或者是计算机原理基础。
2、数字电路、模拟电路基础。
3、熟悉arm7、arm9原理。
4、会一到两种EDA软件（如PROTEL 99SE、POWERPCB等）。
5、对SDRAM、NAND FLASH、NOR FLASH、串口、USB、网络、液晶显示等硬件控制及读写原理比较了解。当然有的人不了解这些原理，而通过借鉴别人的设计也能设计出来。只是知其然，不知其所以然而已。
6、学习理解能力较强。
如果有上面这些基础，那么你就能够对arm应用的硬件做开发设计了。
二、bootloader、linux、文件系统移植及底层驱动开发的准备
1、单片机知识基础或者是计算机原理基础。
2、数字电路、模拟电路基础。
3、具备C、C++、汇编语言基础。
4、熟悉arm7、arm9原理。
5、熟悉bootloader、linux内核、linux文件系统的原理、配置、编译以及驱动程序的编写及加载过程。
6、对SDRAM、NAND FLASH、NOR FLASH、串口、USB、网络、液晶显示等硬件控制及读写原理非常了解。
7、学习理解能力强。
三、linux应用程序开发的准备
1、熟悉linux操作系统的工作原理、机制，熟悉进程、线程机制。
2、具备c、c++语言基础。
3、有的涉及串口、usb、网络、数据库编程，那么就需要有相应的基础。
4、学习理解能力强。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上是我个人得出的做arm+linux平台开发所需要的基础和前提，可能存在错误或遗漏。请大家发表看法。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我把它分成三个方面。硬件、驱动、应用程序开发。如果三个方面都能做，那肯定是全才。由于做arm+linux开发牵涉的方方面面太多，所以进入门槛相对单片机开发要高。一旦熟悉了开发流程，也不是想象的那样困难。]]></description>
		<author><![CDATA[embed]]></author>
		<pubDate>2006-11-09 20:38:00</pubDate>
		</item>
				<item>
		<title><![CDATA[ARM9微控制器LPC3180的软硬件平台设计&nbsp;]]></title>
		<link>http://blog.pfan.cn/embed/20145.html</link>
		<description><![CDATA[ARM9微控制器LPC3180的软硬件平台设计 
&nbsp;

摘要&nbsp;介绍以Philips&nbsp;LPC3180微控制器为核心的嵌入式软硬件平台设计；对系统设计的硬件部分和软件部分进行详细的分析，并针对LPC3180芯片特性着重讨论了其软件系统构建以及系统启动流程。实验结果表明，LPC3180嵌入式系统平台结合片内硬件浮点运算单元，具有高性能的浮点运算处理能力，可满足复杂的嵌入式应用场合的要求。&nbsp;关键词&nbsp;LPC3180&nbsp;ARM9&nbsp;软硬件平台&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;嵌入式应用系统设计包括硬件平台和软件平台两部分。前者是以嵌入式微控制器/微处理器为核心的硬件系统；后者则是围绕嵌入式操作系统构建的软件系统。两者在设计上是密不可分的，并且需要在设计之间进行权衡优化，根据实际应用进行外扩和裁剪。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;基于ARM926EJS内核的LPC3180内部集成了丰富的外设资源，为嵌入式系统构建提供了很大的设计空间。本文结合笔者开发LPC3180嵌入式平台的实际经验，将具体介绍该系统的实现、结构组成和实验结果。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;LPC3180芯片特性介绍&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPC3180是Philips公司新推出的一款ARM9微控制器。它采用90nm工艺技术，片内集成ARM9EJS处理器内核，具有高计算性能、低功耗的特性，这使得在很多对功耗敏感的嵌入式应用场合中仍能使用高性能的ARM9微控制器。LPC3180内核正常工作电压为1.2V，在低功耗模式下可降至0.9&nbsp;V；同时，LPC3180作为一款新型的32位微控制器，其新特性还包括：&nbsp;◆&nbsp;&nbsp;片内集成向量浮点(VFP)协处理器。LPC3180的浮点运算单元有3条独立的流水线，支持并行单精度或双精度浮点加/减、乘/除以及乘累积运算，完全兼容IEEE754标准，适用于高速浮点运算场合。&nbsp;◆&nbsp;片内集成USB&nbsp;OTG控制模块，同时支持与便携USB主设备]]></description>
		<author><![CDATA[embed]]></author>
		<pubDate>2006-11-09 20:35:00</pubDate>
		</item>
				<item>
		<title><![CDATA[DS1302C51源代码&nbsp;]]></title>
		<link>http://blog.pfan.cn/embed/20144.html</link>
		<description><![CDATA[DS1302C51源代码 
&nbsp;

&nbsp;
#include#include
#define mcuport2 P2#define mcuport1 P1
unsigned char pd;/*********************************************************************/sbit T_CLK="P0"^7; /*实时时钟时钟线引脚 */sbit T_IO="P0"^6; /*实时时钟数据线引脚 */sbit T_RST="P0"^5; /*实时时钟复位线引脚 */sbit ACC0=ACC^0;sbit ACC7=ACC^7;//lcd引脚声明/**************************************************/sbit rs="P0"^0;sbit rw="P0"^1;sbit e="P0"^3;/******************************************************************** ** 名称: v_RTInputByte* 说明: * 功能: 往DS1302写入1Byte数据* 调用:* 输入: ucDa 写入的数据 * 返回值: 无***********************************************************************/void v_RTInputByte(unsigned char ucDa) { unsigned char i;ACC = ucDa;for(i="8"; i&gt;0; i--){T_IO = ACC0; /*相当于汇编中的 RRC */T_CLK = 1;T_CLK = 0;ACC = ACC &gt;&gt; 1; } }/******************************************************************** ** 名称: uchar uc_RTOutputByte* 说明: * 功能: 从DS1302读取1Byte数据* 调用: * 输入: * 返回值: ACC****************************************************]]></description>
		<author><![CDATA[embed]]></author>
		<pubDate>2006-11-09 20:29:00</pubDate>
		</item>
				<item>
		<title><![CDATA[PCB制版&nbsp;相关]]></title>
		<link>http://blog.pfan.cn/embed/20143.html</link>
		<description><![CDATA[PCB工程师分级依据 
工作岗位：入门级PCB工程师 　 
能力要求： 1、能制作简音的封装，如DIP10等到； 2、掌握至少一种PCB设计软件的基本操作，并能制订简单的布线线宽和间距等规则； 3、能对具有100个元件和200个网络或以下PCB进行较合理和有序的布局和布线； 4、能在他人或自定规则下手动或自动布线并修改，达到100%布通并DRC完全通过； 5、具备基本的机械结构和热设计知识； 6、掌握双面板走线的一些基本要求。 　
工作内容： 1、简单PCB的设计和修改（如结构简音的前面板、单片机小系统板等）； 2、复杂PCB中规定部分的走线； 3、与自己设计PCB相关的调试； 4、写相关的开发、调试日志。 　
工作职责：对PCB中自己设计部分负责。 　
工作岗位：初级PCB工程师 　
能力要求： 1、能根据手册和实物制作较复杂的封装，如带灯RJ-45座等，并保证外形、焊盘等尺寸完全正确（按实物测量至少保证可插入）； 　
2、较熟悉掌握至少一种PCB设计软件并能独立或在指导下制订较详细的布线规则； 　
3、能对具有400个元件和1000个网络或以下单、双面和多层PCB进行较合理和有序的布局和布线，能在布局布线过程中随时考虑到热设计、结构设计、电磁兼容性设计、美观等方面的要求，自己不能确定时及时向更高级PCB工程师请教或共同探讨； 　
4、能在他人或自定规则下熟练手动或自动布线并修改，达到100%布通并DRC完全通过，基本上不存在线宽瓶颈、内层孤岛等问题，布线过程中能看出少量原理设计上低级错误并提出，并能正确进行引脚和门交换，能正确修改网络表和原理图； 　
5、能正确导入、导出机械图纸并基本看懂结构尺寸要求； 　
6、能在他人所制定规则或指导下进行一些高速和模拟PCB设计并基本稳定； 　
7、丝印标志清晰明了，能独立完成出GERBER等设计输出工作并校对； 　
8、具备基本的可制造性方面知识并用于实践，所设计板子50%以上可用于生产。 　
工作内容： 1、较复杂PCB的设计和修改（如调度机中除CPU板外的板，十六画面分割器板等）； 2、复杂PCB中规定部分的走线； 3、与自己设计PCB相关的调试； 4、对所有更低级PCB工程师的工作指导； 5、写相关的开发、调试日志； 6、必要时（指自己一定时间内暂时无相应的设计任务，或某一PCB设计工作时]]></description>
		<author><![CDATA[embed]]></author>
		<pubDate>2006-11-09 20:23:00</pubDate>
		</item>
				<item>
		<title><![CDATA[排序算法&nbsp;&nbsp;集中]]></title>
		<link>http://blog.pfan.cn/embed/20066.html</link>
		<description><![CDATA[排序的算法集中到一起了，包括冒泡排序、选择排序、插入排序，Shell排序，快速排序、归并排序、堆排序，基数排序、bucket排序。
使用起来也很简单，包含SortAlgorithm.h即可直接使用（这里重在算法本身，用一个类包含static函数的做法则可以原谅了：）。
（两个文件：SortAlgorithm.h和main.cpp）。
//SortAlgorithm.h #if !defined _SORT_ALGORITHM_H_#define _SORT_ALGORITHM_H_ #ifndef NNULL#define NULL 0L#endif //~ NULL #include &lt;cassert&gt;#include &lt;ctime&gt; #include &lt;iostream&gt;using namespace std; template &lt;typename T&gt;class BasicSortor{public:&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // bubble sort&nbsp;&nbsp;&nbsp; static void bubbleSort( T* _data,int _left,int _right )&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assert( NULL != _data );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assert( ( _left &gt;= 0 ) &amp;&amp; ( _right &gt;= _left ) );&nbsp;&nbsp;&nbsp; 	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( 1 == _right - _left )&nbsp; return ;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ( int i = _left; i &lt;= _right; ++i )&nbsp;&nbsp;&nbsp;&nbsp;]]></description>
		<author><![CDATA[embed]]></author>
		<pubDate>2006-11-07 17:34:00</pubDate>
		</item>
		</channel>
</rss>