<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>西格玛向量™ &#187; C/C++</title>
	<atom:link href="http://sigmav.net/category/c_cpp/feed/" rel="self" type="application/rss+xml" />
	<link>http://sigmav.net</link>
	<description>指向 任何方向都是未来</description>
	<lastBuildDate>Sun, 12 Feb 2012 11:24:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<cloud domain='sigmav.net' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
		<item>
		<title>mini2440 Helloworld驱动</title>
		<link>http://sigmav.net/2011/03/01/mini2440-helloworld%e9%a9%b1%e5%8a%a8/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mini2440-helloworld%25e9%25a9%25b1%25e5%258a%25a8</link>
		<comments>http://sigmav.net/2011/03/01/mini2440-helloworld%e9%a9%b1%e5%8a%a8/#comments</comments>
		<pubDate>Tue, 01 Mar 2011 15:42:35 +0000</pubDate>
		<dc:creator>西玛哒</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[IT悟语]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[硬件与嵌入式]]></category>
		<category><![CDATA[Driver]]></category>
		<category><![CDATA[mini2440]]></category>

		<guid isPermaLink="false">http://sigmav.net/2011/03/mini2440-helloworld%e9%a9%b1%e5%8a%a8/</guid>
		<description><![CDATA[&#160; &#160; Mini2440 是基于S3C2440（2410工业版） 的Arm9平台，实验平台已经移植了Linux，目前正打算添加RF24L01接口驱动程序。 &#160; 首先建立Helloworld驱动程序，作为驱动开发的模版，记录如下： &#160;&#160; 一、建立编译环境： &#160;&#160; mini2440开发环境 &#160;&#160;&#160; 编译器 ： arm-linux-gcc&#160;&#160;&#160; 3.4.1 &#160;&#160;&#160; linux内核版本 ： 2.6.32.2 &#160;&#160;&#160; 解压并记录内核源码树 位置例：/opt/FriendlyARM/mini2440/linux-2.6.32.2 &#160;&#160; 二、编写驱动程序文件： #include &#60;linux/init.h&#62; #include &#60;linux/module.h&#62; MODULE_LICENSE(&#34;Dual BSD/GPL&#34;); static int hello_init(void) { printk(KERN_ALERT &#34;Hello modulen&#34;); return 0; } static int hello_exit(void) { printk(KERN_ALERT &#34;Goodby modulen&#34;); return 0; } module_init(hello_init); module_exit(hello_exit); &#160;&#160;&#160;&#160;&#160; 上述实现了在加载时打印相关语句功能，KERN_ALERT [...]]]></description>
			<content:encoded><![CDATA[<p>&#160;</p>
<p>&#160; Mini2440 是基于S3C2440（2410工业版） 的Arm9平台，实验平台已经移植了Linux，目前正打算添加RF24L01接口驱动程序。</p>
<p>&#160; 首先建立Helloworld驱动程序，作为驱动开发的模版，记录如下：</p>
<h4>&#160;&#160; 一、建立编译环境：</h4>
<p>&#160;&#160; mini2440开发环境</p>
<p>&#160;&#160;&#160; 编译器 ： arm-linux-gcc&#160;&#160;&#160; 3.4.1</p>
<p>&#160;&#160;&#160; linux内核版本 ： 2.6.32.2 </p>
<p>&#160;&#160;&#160; 解压并记录内核源码树 位置例：/opt/FriendlyARM/mini2440/linux-2.6.32.2</p>
<h4>&#160;&#160; 二、编写驱动程序文件：</h4>
<pre class="brush: cpp">#include &lt;linux/init.h&gt;
#include &lt;linux/module.h&gt;
MODULE_LICENSE(&quot;<span style="color: #8b0000">Dual BSD/GPL</span>&quot;);

<span style="color: #0000ff">static</span> <span style="color: #0000ff">int</span> hello_init(<span style="color: #0000ff">void</span>)
{
    printk(KERN_ALERT &quot;<span style="color: #8b0000">Hello modulen</span>&quot;);
    <span style="color: #0000ff">return</span> 0;
}
<span id="more-41288"></span>
<span style="color: #0000ff">static</span> <span style="color: #0000ff">int</span> hello_exit(<span style="color: #0000ff">void</span>)
{
    printk(KERN_ALERT &quot;<span style="color: #8b0000">Goodby modulen</span>&quot;);
    <span style="color: #0000ff">return</span> 0;
}

module_init(hello_init);
module_exit(hello_exit);</pre>
<p>&#160;&#160;&#160;&#160;&#160; 上述实现了在加载时打印相关语句功能，KERN_ALERT 表示了优先级为KERN_ALERT级别，较低级别的printk可能出现在终端无显示的情况。</p>
<h4>&#160;&#160;&#160; 三、编写Makefile</h4>
<p>&#160;&#160;&#160;&#160;&#160; 这里所配置的makefile模板文件如下： </p>
<pre>#Mini2440 General Makefile for SSDUT_MCU_LAB
#Auth: sigmax6
#2011 03 01

CC = arm-linux-gcc                                 #name of platform compiler
KDIR ?= /opt/FriendlyARM/mini2440/linux-2.6.32.2    #platform linux source dir
PWD := $(shell pwd)

obj-m := hello.o                                   #obj-m means hello.ko , and it depends on hello.o

default:
	$(MAKE) -C $(KDIR) M=$(PWD) modules            #make 

.PHONY: clean
clean:
	$(MAKE) -C $(KDIR) M=$(PWD) clean              #clean
	rm -rf *.o *.ko .*.cmd *.mod.*</pre>
<p>&#160;&#160; 实际上，对于一个驱动模块来说，在有了hello.c之后，只要一句规则就可以生成目标模块</p>
<p>&#160;&#160;&#160;&#160; obj-m := hello.o</p>
<blockquote>
<p>&#160; <br />&#160;&#160;&#160; 熟悉的 make , 但是对 2.6 内核建立系统不熟悉的读者, 可能奇怪这个 makefile 如何工作. 毕竟上面的这一行不是一个传统的 makefile 的样子. 答案, 当然, 是内核建立系统处理了余下的工作. 上面的安排 </p>
<p>( 它利用了由 GNU make 提供的扩展语法 )表明有一个模块要从目标文件 hello.o 建立. 在从目标文件建立后结果模块命名为 hello.ko.</p>
<p>反之, 如果你有一个模块名为 module.ko, 是来自 2 个源文件( 姑且称之为, file1.c 和 file2.c ), 正确的书<br />
    <br />写应当是: </p>
<p>obj-m := module.o </p>
<p>module-objs := file1.o file2.o </p>
<p>对于一个象上面展示的要工作的 makefile, 它必须在更大的内核建立系统的上下文被调用. 如果你 </p>
<p>的内核源码数位于, 假设, 你的 ~/kernel-2.6 目录, 用来建立你的模块的 make 命令( 在包含模块源码 </p>
<p>和 makefile 的目录下键入 )会是: </p>
<p>make -C ~/kernel-2.6 M=`pwd` modules </p>
<p>这个命令开始是改变它的目录到用 -C 选项提供的目录下( 就是说, 你的内核源码目录 ). 它在那里 </p>
<p>会发现内核的顶层 makefile. 这个 M= 选项使 makefile 在试图建立模块目标前, 回到你的模块源码目 </p>
<p>录. 这个目标, 依次地, 是指在 obj-m 变量中发现的模块列表, 在我们的例子里设成了 module.o. </p>
<p>键入前面的 make 命令一会儿之后就会感觉烦, 所以内核开发者就开发了一种 makefile 方式, 使得生 </p>
<p>活容易些对于那些在内核树之外建立模块的人. 这个窍门是如下书写你的 makefile: </p>
<p></p>
<pre>

# If KERNELRELEASE is defined, we've been invoked from the
  # kernel build system and can use its language.

ifneq ($(KERNELRELEASE),)

obj-m := hello.o

# Otherwise we were called directly from the command

# line; invoke the kernel build system.

else

KERNELDIR ?= /lib/modules/$(shell uname -r)/build

PWD := $(shell pwd)

default:

$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

endif

</pre>
<p>&#160;&#160;&#160; 再一次, 我们看到了扩展的 GNU make 语法在起作用. 这个 makefile 在一次典型的建立中要被读 2次. 当从命令行中调用这个 makefile , 它注意到 KERNELRELEASE 变量没有设置. 它利用这样一个事实来定位内核源码目录, 即已安装模块目录中的符号连接指回内核建立树. 如果你实际上没有运行你在为其而建立的内核, 你可以在命令行提供一个 KERNELDIR= 选项, 设置 KERNELDIR 环境变量, 或者重写 makefile 中设置 KERNELDIR 的那一行. 一旦发现内核源码树, makefile 调用 default: 目标, 来运行第 2 个 make 命令( 在 makefile 里参数化成 $(MAKE))象前面描述过的一样来调用内核建立系统. 在第 2 次读, makefile 设置 obj-m, 并且内核的 makefile 文件完成实际的建立模块工作.这种建立模块的机制你可能感觉笨拙模糊. 一旦你习惯了它, 但是, 你很可能会欣赏这种已经编排进内核建立系统的能力. 注意, 上面的不是一个完整的 makefile; 一个真正的 makefile 包含通常的目标类型来清除不要的文件, 安装模块等等.</p>
<p>” —— 《Linux设备驱动程序 中文第三版》</p></blockquote>
<h4>四、编译生成模块 </h4>
<p>在当前目录下 使用make命令生成.ko模块文件</p>
<p>&#160; 按照上文的讲解,其中还会生成很多中间文件,格式为*.cmd *.mod.* 等 这些文件是系统将你的代码转化而来的。最终产品是.ko文件，也就是驱动模块。</p>
<p>&#160;&#160; Helloworld模块没有实际的操作，所以并不需要测试程序。一般情况下驱动程序需要通过测试程序验证其功能。</p>
<p>&#160;&#160; 将.ko文件下载到目标系统中，使用：</p>
<p> #insmod hello.ko</p>
<p>就可以看到 “Hello module” 出现在终端上。</p>
<p> 同理 </p>
<p> #rmmod hello&#160;&#160; （这里没有后缀名，因为调用的是模块名称）</p>
<p>&quot;会显示 “Goodbye module”</p>
<p>==========================================================</p>
]]></content:encoded>
			<wfw:commentRss>http://sigmav.net/2011/03/01/mini2440-helloworld%e9%a9%b1%e5%8a%a8/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>神奇的字符进度条</title>
		<link>http://sigmav.net/2010/06/17/%e7%a5%9e%e5%a5%87%e7%9a%84%e5%ad%97%e7%ac%a6%e8%bf%9b%e5%ba%a6%e6%9d%a1/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e7%25a5%259e%25e5%25a5%2587%25e7%259a%2584%25e5%25ad%2597%25e7%25ac%25a6%25e8%25bf%259b%25e5%25ba%25a6%25e6%259d%25a1</link>
		<comments>http://sigmav.net/2010/06/17/%e7%a5%9e%e5%a5%87%e7%9a%84%e5%ad%97%e7%ac%a6%e8%bf%9b%e5%ba%a6%e6%9d%a1/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 06:40:20 +0000</pubDate>
		<dc:creator>西玛哒</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Shell]]></category>

		<guid isPermaLink="false">http://sigmav.net/?p=38907</guid>
		<description><![CDATA[好久不写文章了，刚刚去FPGA的世界打了一圈酱油，回头发现自己的嵌入式C快要挂掉了，攒点人品学点儿习吧。 为了一个清凉的环境，觉得需要Emerge -auvDN world一下（不良嗜好）,看着刷屏休息一下，忽然一样东西吸引了我： 真相： a quickr pickr post 一根旋转的小棍让人有了盼头，起码知道自己的机器没有挂掉哇，早先在Fedora下也见过这个东东。忽然想到，这东西既然是程序写的，就可以用程序重现嘛，为什么不自己写一个玩玩呢？ 分析一下这个旋转小棍，其实原理很简单，就是一个字符位在不同字符上来回变化{- / &#124; &#8211; &#8230;..} 问题在于，如何实现同一位上的变化呢？在字符系统中，有如下一些转移字符可以来用（引用：百度百科）： a 响铃(BEL) 007 b 退格(BS) 008 f 换页(FF) 012 n 换行(LF) 010 r 回车(CR) 013 t 水平制表(HT) 009 v 垂直制表(VT) 011 \ 反斜杠 092 ? 问号字符 063 ' 单引号字符 039 " 双引号字符 034 空字符(NULL) 000 ddd 任意字符 三位八进制 xhh [...]]]></description>
			<content:encoded><![CDATA[<p>好久不写文章了，刚刚去FPGA的世界打了一圈酱油，回头发现自己的嵌入式C快要挂掉了，攒点人品学点儿习吧。</p>
<p>为了一个清凉的环境，觉得需要Emerge -auvDN world一下（不良嗜好）,看着刷屏休息一下，忽然一样东西吸引了我：</p>
<p>真相：<br />
<a href="http://www.flickr.com/photos/sigmax6/4708398212/" target="_blank"><img src="http://67.195.19.74/4072/4708398212_78803d6dcc.jpg" alt="4708398212 78803d6dcc 神奇的字符进度条"  title="神奇的字符进度条" /></a></p>
<p style="font-size:xx-small" dir="ltr" align="right">a <a href="http://quickrpickr.com" target="_blank">quickr pickr</a> post</p>
<p>一根旋转的小棍让人有了盼头，起码知道自己的机器没有挂掉哇，早先在Fedora下也见过这个东东。忽然想到，这东西既然是程序写的，就可以用程序重现嘛，为什么不自己写一个玩玩呢？<br />
分析一下这个旋转小棍，其实原理很简单，就是一个字符位在不同字符上来回变化{- / |  &#8211; &#8230;..} 问题在于，如何实现同一位上的变化呢？在字符系统中，有如下一些转移字符可以来用（引用：<a href="http://baike.baidu.com/view/73.html">百度百科</a>）：</p>
<pre class="brush:c">
a 响铃(BEL) 007
b 退格(BS) 008
f 换页(FF) 012
n 换行(LF) 010
r 回车(CR) 013
t 水平制表(HT) 009
v 垂直制表(VT) 011
\ 反斜杠 092
? 问号字符 063
' 单引号字符 039
" 双引号字符 034
  空字符(NULL) 000
ddd 任意字符 三位八进制
xhh 任意字符 二位十六进制
</pre>
<p>其中退格和回车都可以用以实现要求，退格嘛就是删除前面的字符，那么回车呢？正常我们说的“回车”其实是回车+换行，单独的“回车”作用是将光标移动到本行的行首，而其后的输出会将原有的内容删除。<br />
那么如此便简单了，只要一个计数器和case选择就可以实现我们的要求，首先给出Shell脚本～</p>
<pre class="brush:shell">
#rotate_line.sh
#!/bin/sh
function rotate_line #实现旋转线的函数
{
TCOUNT=0         #声明一个计数器
TSLEEP=1         #间隔时间
while true
do
TCOUNT=`expr $TCOUNT + 1`      #计数器+1 注意格式 有空格 反单引号
echo -e "Waitingc "
case $TCOUNT in                #用CASE 语句选择状态
"1") echo -e '-'"rc "    #-e 表示转义，
sleep $TSLEEP;;
"2") echo -e '\'"rc "   #r表示回到行首
sleep $TSLEEP;;
"3") echo -e '|'"rc "    #c表示不换行
sleep $TSLEEP;;
"4") echo -e '/'"rc "
sleep $TSLEEP
TCOUNT=0;;            #回到初始状态
"*") ;;
esac
done
}
rotate_line    #使用测试函数
</pre>
<p></p>
<p><a href="http://www.flickr.com/photos/sigmax6/4707929181/" target="_blank"><img src="http://69.147.90.159/1288/4707929181_232a0267a4.jpg" alt="4707929181 232a0267a4 神奇的字符进度条"  title="神奇的字符进度条" /></a></p>
<p></p>
<p dir="ltr" align="right" style="font-size:xx-small">a <a href="http://quickrpickr.com" target="_blank">quickr pickr</a> post</p>
<p> 脚本很小，但是基本功能有了，归功于echo的c转义结合经典的r b 使用，上面个的代码中r 与b产生的效果应该是一样的，但是实现方式不同，如果延时较长看的就比较明显了。<br />
&lt;待续&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://sigmav.net/2010/06/17/%e7%a5%9e%e5%a5%87%e7%9a%84%e5%ad%97%e7%ac%a6%e8%bf%9b%e5%ba%a6%e6%9d%a1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>C语言状态机算法下模拟电梯的实现</title>
		<link>http://sigmav.net/2010/05/05/c%e8%af%ad%e8%a8%80%e7%8a%b6%e6%80%81%e6%9c%ba%e7%ae%97%e6%b3%95%e4%b8%8b%e6%a8%a1%e6%8b%9f%e7%94%b5%e6%a2%af%e7%9a%84%e5%ae%9e%e7%8e%b0/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=c%25e8%25af%25ad%25e8%25a8%2580%25e7%258a%25b6%25e6%2580%2581%25e6%259c%25ba%25e7%25ae%2597%25e6%25b3%2595%25e4%25b8%258b%25e6%25a8%25a1%25e6%258b%259f%25e7%2594%25b5%25e6%25a2%25af%25e7%259a%2584%25e5%25ae%259e%25e7%258e%25b0</link>
		<comments>http://sigmav.net/2010/05/05/c%e8%af%ad%e8%a8%80%e7%8a%b6%e6%80%81%e6%9c%ba%e7%ae%97%e6%b3%95%e4%b8%8b%e6%a8%a1%e6%8b%9f%e7%94%b5%e6%a2%af%e7%9a%84%e5%ae%9e%e7%8e%b0/#comments</comments>
		<pubDate>Wed, 05 May 2010 14:46:31 +0000</pubDate>
		<dc:creator>西玛哒</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[IT悟语]]></category>

		<guid isPermaLink="false">http://sigmav.net/?p=38900</guid>
		<description><![CDATA[//作业中的程序,采用了状态机算法和双线程模拟一个简易3层电梯,. // 欢迎高手指教. //运行平台: Gcc version 4.4.3 (Gentoo 4.4.3-r2 p1.2)  编译通过 //2010.5.5  初稿 //修改:增加了代码显示插件 /**********************************/ /*    电梯程序-状态机-@sigmax6    */ /**********************************/ #include&#60;stdio.h&#62; #include&#60;pthread.h&#62; #define MAX_FLOOR 3 /**********************************************************/ //数据结构定义. typedef enum Status{              // STATUS 类型: 记录电梯状态 open, close, run, stop }STATUS; typedef enum OutReq{             [...]]]></description>
			<content:encoded><![CDATA[<p>//作业中的程序,采用了状态机算法和双线程模拟一个简易3层电梯,.</p>
<p>// 欢迎高手指教.</p>
<p>//运行平台: Gcc version 4.4.3 (Gentoo 4.4.3-r2 p1.2)  编译通过</p>
<p>//2010.5.5  初稿</p>
<p>//修改:增加了代码显示插件</p>
<pre class="brush:c">/**********************************/

/*    电梯程序-状态机-@sigmax6    */

/**********************************/

#include&lt;stdio.h&gt;

#include&lt;pthread.h&gt;

#define MAX_FLOOR 3

/**********************************************************/ //数据结构定义.

typedef enum Status{              // STATUS 类型: 记录电梯状态

open,

close,

run,

stop

}STATUS;

typedef enum OutReq{              // QUTREQ 类型: 记录外部请求

up_req,

down_req,

both,

no

}OUTREQ;

typedef enum Dir{                 //DIRECTION 类型: 记录运行方向

up,

down,

still

}DIRECTION;

typedef struct Requests{         //REQURST  类型:  记录请求,Req表示请求类型,-1无情求,0为内部请求,1为外部请求

int    Req;

OUTREQ outReq;

}REQUEST;

typedef struct ElevatorInfo{     //ELEINFO_T 类型:  存放当前电梯状态

DIRECTION Direction;

int       Floor;

STATUS    Statu;

REQUEST   Request[MAX_FLOOR];

}ELEINFO_T;

typedef struct Key{               //KEY_T    类型:  存放当前按键信息

char       typeFlag;

int        floor;

char       updownFlag;

}KEY_T;

//--------------------------------

ELEINFO_T ELEINFO;                //ELEINFO  存储电梯状态

KEY_T KEY;                        //KEY      存储按键信息

/**********************************************************/ //电梯初始化函数

void initEle(void)

{

int temp;                      //计数器

ELEINFO.Direction=still;       //电梯初始状态,在1层,无方向,状态为停止.

ELEINFO.Floor=0;

ELEINFO.Statu=stop;

for(temp=0;temp&lt;MAX_FLOOR;temp++)

{

ELEINFO.Request[temp].Req=-1;

ELEINFO.Request[temp].outReq=no;

}

}

/**********************************************************/  //打印当前状态函数

void printEle(void)

{

printf("%d : ",ELEINFO.Floor+1);  //楼层:

switch(ELEINFO.Statu)

{

case stop:

printf("Stopping!n");

break;

case run:

printf("Running!n");

break;

case open:

printf("Door Opened!n");

break;

case close:

printf("Door Closed!n");

break;

}

}

/**********************************************************/  //线程1:获取输入(KEY)并处理为请求(REQUEST)

void * getKey(void)

{

while(1)

{

scanf("%d",&amp;KEY.floor);      //这里方便测试,没有设计复杂的按键处理

/*

* 可扩展按键处理

*/

switch(KEY.floor)

{

case 1:

case 2:

case 3:                         //1,2,3按键对应1-3层内部请求.

ELEINFO.Request[KEY.floor-1].Req=0;;

break;

case 4:

case 5:

case 6:                         //4,5,6对应1-3层外部向上请求

(ELEINFO.Request[KEY.floor-4].outReq==down_req)?(ELEINFO.Request[KEY.floor-4].outReq=both):(ELEINFO.Request[KEY.floor-4].outReq=up_req);

ELEINFO.Request[KEY.floor-4].Req=1;

break;

case 7:

case 8:

case 9:                         //7,8,9对应1-3层外部向下请求

(ELEINFO.Request[KEY.floor-7].outReq==up_req)?(ELEINFO.Request[KEY.floor-7].outReq=both):(ELEINFO.Request[KEY.floor-7].outReq=down_req);

ELEINFO.Request[KEY.floor-7].Req=1;

break;

default:

printf("ERROR!n");

break;

}

}

}

/**********************************************************/  //线程2 :电梯状态转换处理函数

void * procEle(void)

{

int floorPtr;

while(1)

{

switch(ELEINFO.Statu)                                 //依据当前状态判断处理方式

{

case stop:                                         //停止状态处理------------------------

if(ELEINFO.Request[ELEINFO.Floor].Req!=-1)

{

ELEINFO.Request[ELEINFO.Floor].Req=-1;

ELEINFO.Request[ELEINFO.Floor].outReq=no;

ELEINFO.Statu=open;

}

else

{

floorPtr=ELEINFO.Floor;

while(floorPtr&lt;MAX_FLOOR)

{

if(ELEINFO.Request[floorPtr].Req!=-1)

break;

floorPtr++;

}

if(floorPtr&lt;MAX_FLOOR)

{

ELEINFO.Direction=up;

ELEINFO.Statu=run;

}

else

{

floorPtr=0;

while(floorPtr&lt;ELEINFO.Floor)

{

if(ELEINFO.Request[floorPtr].Req!=-1)

break;

floorPtr++;

}

if(floorPtr&lt;ELEINFO.Floor)

{

ELEINFO.Direction=down;

ELEINFO.Statu=run;

}

}

}

break;

case run:                                             //运行状态处理---------------------

if(ELEINFO.Direction==up)

{

if(ELEINFO.Request[ELEINFO.Floor].Req!=-1&amp;&amp;ELEINFO.Request[ELEINFO.Floor].outReq!=down_req)

{

ELEINFO.Statu=open;

}

else

{

floorPtr=ELEINFO.Floor;

while(floorPtr&lt;MAX_FLOOR)

{

if(ELEINFO.Request[floorPtr].Req!=-1)

break;

floorPtr++;

}

if(floorPtr&lt;MAX_FLOOR)

{

ELEINFO.Floor++;

}

else if(ELEINFO.Request[ELEINFO.Floor].Req!=-1&amp;&amp;ELEINFO.Request[ELEINFO.Floor].outReq==down_req)

{

ELEINFO.Statu=open;

}

else

{

floorPtr=0;

while(floorPtr&lt;ELEINFO.Floor)

{

if(ELEINFO.Request[floorPtr].Req!=-1)

break;

floorPtr++;

}

if(floorPtr&lt;ELEINFO.Floor)

{

ELEINFO.Direction=down;

}

}

}

}

else

{

if(ELEINFO.Request[ELEINFO.Floor].Req!=-1&amp;&amp;ELEINFO.Request[ELEINFO.Floor].outReq!=up_req)

{

ELEINFO.Statu=open;

}

else

{

floorPtr=0;

while(floorPtr&lt;ELEINFO.Floor)

{

if(ELEINFO.Request[floorPtr].Req!=-1)

break;

floorPtr++;

}

if(floorPtr&lt;ELEINFO.Floor)

{

ELEINFO.Floor--;

}

else if(ELEINFO.Request[ELEINFO.Floor].Req!=-1&amp;&amp;ELEINFO.Request[ELEINFO.Floor].outReq==up_req)

{

ELEINFO.Statu=open;

}

else

{

floorPtr=ELEINFO.Floor;

while(floorPtr&lt;MAX_FLOOR)

{

if(ELEINFO.Request[floorPtr].Req!=-1)

break;

floorPtr++;

}

if(floorPtr&lt;ELEINFO.Floor)

{

ELEINFO.Direction=up;

}

}

}

}

break;

case open:                                             //开门状态处理----------------------

ELEINFO.Statu=close;

if(ELEINFO.Direction==up)

{

if(ELEINFO.Request[ELEINFO.Floor].Req==1&amp;&amp;ELEINFO.Request[ELEINFO.Floor].outReq==both)

{

ELEINFO.Request[ELEINFO.Floor].outReq=down_req;

}

else if(ELEINFO.Request[ELEINFO.Floor].Req!=-1)

{

ELEINFO.Request[ELEINFO.Floor].outReq=no;

ELEINFO.Request[ELEINFO.Floor].Req=-1;

}

}

else if(ELEINFO.Direction==down)

{

if(ELEINFO.Request[ELEINFO.Floor].Req==1&amp;&amp;ELEINFO.Request[ELEINFO.Floor].outReq==both)

{

ELEINFO.Request[ELEINFO.Floor].outReq=up_req;

}

else if(ELEINFO.Request[ELEINFO.Floor].Req!=-1)

{

ELEINFO.Request[ELEINFO.Floor].outReq=no;

ELEINFO.Request[ELEINFO.Floor].Req=-1;

}

}

else

{

ELEINFO.Request[ELEINFO.Floor].outReq=no;

ELEINFO.Request[ELEINFO.Floor].Req=-1;

}

break;

case close:                                              //关门状态处理----------------------

if(ELEINFO.Direction==up)

{

floorPtr=ELEINFO.Floor;

while(floorPtr&lt;MAX_FLOOR)

{

if(ELEINFO.Request[floorPtr].Req!=-1&amp;&amp;ELEINFO.Request[floorPtr].outReq!=down_req)

break;

floorPtr++;

}

if(floorPtr&lt;MAX_FLOOR)

{

ELEINFO.Statu=run;

}

else

{

floorPtr=0;

while(floorPtr&lt;ELEINFO.Floor)

{

if(ELEINFO.Request[floorPtr].Req!=-1&amp;&amp;ELEINFO.Request[floorPtr].outReq!=up_req)

break;

floorPtr++;

}

if(floorPtr&lt;ELEINFO.Floor)

{

ELEINFO.Statu=run;

ELEINFO.Direction=down;

}

else

{

ELEINFO.Statu=stop;

ELEINFO.Direction=still;

}

}

}

else

{

floorPtr=0;

while(floorPtr&lt;ELEINFO.Floor)

{

if(ELEINFO.Request[floorPtr].Req!=-1&amp;&amp;ELEINFO.Request[floorPtr].outReq!=up_req)

break;

floorPtr++;

}

if(floorPtr&lt;ELEINFO.Floor)

{

ELEINFO.Statu=run;

}

else

{

floorPtr=ELEINFO.Floor;

while(floorPtr&lt;MAX_FLOOR)

{

if(ELEINFO.Request[floorPtr].Req!=-1&amp;&amp;ELEINFO.Request[floorPtr].outReq!=down_req)

break;

floorPtr++;

}

if(floorPtr&lt;MAX_FLOOR)

{

ELEINFO.Statu=run;

ELEINFO.Direction=up;

}

else

{

ELEINFO.Statu=stop;

ELEINFO.Direction=still;

}

}

}

break;

}

//------------------------------------------

printEle();                              //打印当前状态

sleep(1);

//------------------------------------------

}

}

/**********************************************************/  //主函数 调用初始化,创建调度线程

int main (int argc, char const* argv[])

{

pthread_t getkey_t,proc_t;           //线程ID

initEle();                           //初始化

pthread_create(&amp;getkey_t,NULL,(void *)&amp;getKey,NULL);  //创建键盘获取线程

pthread_create(&amp;proc_t,NULL,(void *)&amp;procEle,NULL);   //创建电梯处理线程

pthread_exit(NULL);                  //等待线程结束

return 0;

}

/*************************************************************************************************/
</pre>
]]></content:encoded>
			<wfw:commentRss>http://sigmav.net/2010/05/05/c%e8%af%ad%e8%a8%80%e7%8a%b6%e6%80%81%e6%9c%ba%e7%ae%97%e6%b3%95%e4%b8%8b%e6%a8%a1%e6%8b%9f%e7%94%b5%e6%a2%af%e7%9a%84%e5%ae%9e%e7%8e%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

