<?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; 学习分享</title>
	<atom:link href="http://www.stars625.com/category/share/feed" rel="self" type="application/rss+xml" />
	<link>http://www.stars625.com</link>
	<description>记录生活点滴，分享学习体会，专注微嵌开发。</description>
	<lastBuildDate>Sun, 18 Jul 2010 02:55:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>几款PDF电子书阅读和管理软件对比</title>
		<link>http://www.stars625.com/bookshelf.html</link>
		<comments>http://www.stars625.com/bookshelf.html#comments</comments>
		<pubDate>Thu, 27 May 2010 13:58:05 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[学习分享]]></category>
		<category><![CDATA[bookshelf]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[PDF管理]]></category>
		<category><![CDATA[电子书]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=291</guid>
		<description><![CDATA[为了能够管理电脑里的电子书，并且能够记录我的阅读情况，想找一款软件既能够像Explorer一样能够组织管理所有的电子书；又能提供封面预览、并记录哪些书已读过、哪些书没读或读到哪了，下次接着读；最好还能够支持内容搜索、加标签等功能，本文由此。]]></description>
			<content:encoded><![CDATA[<p>某日，又想在网上下电子书，下完后罪恶感又来了。遨游网络，每当看到有推荐的书就想找电子版把它下载下来，有点类似“电子书控”，久而久之电脑里就收集了N多电子书，幸好体积都不大，否则的话搬家就累惨了。每当心生悔意就打开几本书看一下，每次看几页就又荒废不看了，因而每本书都是只看了前几页，于是就想找个软件来管管我的书，顺便管管我，提醒我多看书。</p>
<p>平时一直都用<a href="http://www.foxitsoftware.com/">Foxit Reader</a>阅读PDF文档，够精简，功能也全，现在也能记录阅读到哪一页，方便下次打开继续上一次的阅读，但这毕竟只是阅读器，不能组织管理所有的PDF文档，就想上网找一款类似于Apple的iBookShelf那种工具，既提供封面预览、也能直接阅读。</p>
<p>首先在网上找到的是PDF东家Adobe公司的<a href="http://www.adobe.com/products/digitaleditions/">Adobe Digital Editions</a>界面如下：<br />
<a href="http://www.stars625.com/wp-content/uploads/bookshelf_ade.jpg" title="点击查看原图"><img src="http://www.stars625.com/wp-content/uploads/bookshelf_ade_t.jpg" /></a></p>
<p>这款软件要在线安装，前提是机器上安装了Flash播放器，安装后很简单，只有一个主程序和一个卸载程序，在主界面右击可以看到跟Flash Player里一样的选项，这东西有点像Flash的高级应用。不过正如上图看到的，这东西还挺炫的，黑色背景、封面预览、加标签都很好，可以方便地导入多个文件并分类，不过阅读体验太差，用滚轮每次只能下去一行，可能跟使用Flash Player内核有关，资源占用也很大，不提供Linux版本，不过可以用Wine轻松运行。</p>
<p>其次是一款内容管理相当强的<a href="http://www.mendeley.com/">Mendeley</a>看图：<br />
<a href="http://www.stars625.com/wp-content/uploads/bookshelf_mendeley.jpg" title="点击查看原图"><img src="http://www.stars625.com/wp-content/uploads/bookshelf_mendeley_t.jpg" /></a></p>
<p>此软件界面元素很多，朴素的窗口很适合文件管理，PDF信息非常詳細，支持全文搜索、分类、加标等，而且可以显示多种文献资料要求的书名格式，方便写作，阅读体验跟普通阅读器差不多，同时支持Window/Linux/Apple多系统，只可惜不支持封面视图。如果你不介意最后一点，那么强烈推荐这款软件，再提一下，这款软件的最大优点是提供强大的文件和内容管理。</p>
<p>第三款软件是<a href="http://download.csdn.net/source/1385451">Foxit Library</a>，这不是官方链接，因为现在官方好像已经不出了，版本很老了、没更新。<br />
<a href="http://www.stars625.com/wp-content/uploads/bookshelf_foxit.jpg" title="点击查看原图"><img src="http://www.stars625.com/wp-content/uploads/bookshelf_foxit_t.jpg" /></a></p>
<p>用它要求先安装Foxit Reader，界面一般，支持封面视图，可以指定任意页作为封面，本身不支持阅读。</p>
<p>最后一款是<a href="http://martview.com/">MartView</a>，很炫，完全为触摸屏优化。<br />
<a href="http://www.stars625.com/wp-content/uploads/bookshelf_martview.jpg" title="点击查看原图"><img src="http://www.stars625.com/wp-content/uploads/bookshelf_martview_t.jpg" /></a></p>
<p>这是一款完全为阅读而生的软件，运行即全屏，支持双页、单页横上阅读和连续纵向阅读，支持翻页效果，定位功能也做得非常好，单从阅读来看都值得推荐；但对文件管理很弱，不支持导入本地电子书，每次只能打开一本PDF查看，而且无法保存记录，更别提分类了；不过它对于从它内部下载的书籍好像文件管理功能都支持，虽然它网站上也有免费书籍但无法导入本地PDF总觉得不喜欢。它使用JAVA开发，提供Window和Mac两个版本，安装需要JRE环境，建议自己安装JRE，用它的自动安装太慢了，打开一本书后，要等待一会才能阅读，估计是在生成缓存吧，挺耗资源。</p>
<p>其它还试用了几款软件：eBookShelf / Kindle For PC / Calibre 它们都是跟硬件阅读器关联的，也不能在PC上阅读，管理倒还可以，不过总有一些问题，在此不推荐使用。</p>
<p>看下来，没有一款软件是能完全满足我要求的，心目中的样子应该是：使用Adobe Digital Editions的界面，支持封面视图；Mendeley的文件管理和内容搜索；MartView的阅读体验；另外还想加一点功能就是在视图中能提供每本书的阅读情况，已读、未读、读了百分之几对应的进度条，能看到阅读的进度和终点，更能激发阅读的动力。</p>
<p>简单看了下跨平台软件开发中GUI的选择，看中了wxWidgets，欢迎感兴趣的童鞋一起探讨，另以前也写过一篇有关GUI平台对比的文章《<a href="http://www.stars625.com/crossplatformgui.html">跨平台软件开发图形界面的选择</a>》</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/bookshelf.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>我使用和推荐的软件列表</title>
		<link>http://www.stars625.com/swlist.html</link>
		<comments>http://www.stars625.com/swlist.html#comments</comments>
		<pubDate>Sun, 06 Dec 2009 11:28:19 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[学习分享]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=244</guid>
		<description><![CDATA[本文列出了我使用的一些软件，其中大部份属于免费、开源的软件，附上一些自己的使用和感受，希望能给读者拓展一些新的视野。软件可以说是其它行业的基础，能大幅提高生产效率，也希望我推荐的软件能给大家带来一丝欣喜。]]></description>
			<content:encoded><![CDATA[<p>列出的软件，没有分类，完全按照个人喜好和想到的顺序排序，列出了软件的名称、官方网址、一些说明等，能从官方网址下载到纯正的软件，有新的版本能及时得到更新，也能了解一些软件的文件，如果愿意也可以加入到他们的开发队伍中去。</p>
<p><a href="http://www.mozilla.com/firefox/">FireFox</a></p>
<p>网络浏览器。从Google一惯的Web战略来看，基于Web的应用是趋势，浏览器必不可少，因此把浏览放在第一位；在安全性上面全面超越IE，其它在各方面比较有特色的浏览器如：Chrome、Safari、360safe、Opera等跟FF相比都还不太成熟，而且有完善的社区支持、丰富的插件。</p>
<p><a href="http://www.foxitsoftware.com/pdf/reader/">Foxit Reader</a></p>
<p>PDF阅读器。从发现这款软件以来，一直用到现在，喜欢它的小巧，比打印排版功能也是非常方便的，从一个不需安装的绿色单文件软件，慢慢地有了安装包，不过现在还是喜欢用它，里面有个更新插件Foxit Creater，虚拟PDF打印机输出PDF文件。</p>
<p><a href="http://notepad-plus.sourceforge.net/">Notepad++</a></p>
<p>文本编辑器。也用过UltraEdit，功能是强大，但启动速度、十几个选项的下拉菜单、繁琐的操作界面直接被否决了，没有用超过十分钟的；后来用了EmEditor感觉不错，用了很长一段时间，不过由于是共享软件后来正式转投Notepad++，功能可以定制、可以编码转换、可以系统格式转换都挺方便的，就是默认的中文字体不好看，要改一下；另外主要面向日文开发的“秀丸Maruo”各方面也相当优秀，特别是支持Grep搜索很好用；回到Notepad++，中规中矩、可以定制、开源免费。</p>
<p><a href="http://www.vim.org/">Vim</a></p>
<p>文本编辑器。无疑是Linux下最好的文本编辑器，但有人会说Emacs才是世界第一的文本编辑器，那我会让他去看看有多少Linux会预装Emacs，而又有多少完全不装Vim；并且对于开发人员来说，Vim的应用显然比Emacs更广泛，你会在一个嵌入式系统装一个Emacs么；两者都可以移植到Window平台，但你能保证Emacs的命令不会与Win的快捷键重复么。</p>
<p><a href="http://www.7-zip.org/">7-Zip</a></p>
<p>压缩解压缩。老早就听说7-Zip大名，开源、免费、效率高全都是优点，但一直不想换掉原来的WinRAR，后来因为必需要解压一个*.7z的包，才下了安装，后来就一直用它了，非常小巧，界面难看可以下一个皮肤美化一下。</p>
<p><a href="http://www.virtualbox.org/">VirtualBox</a></p>
<p>虚拟机。VMWare老牌的虚拟机，但程序复杂、后台驻很多服务，启动后开很多进程，十分不方便；VirtualPC好像只能虚拟Window系统。而VirtualBox是开源免费的，单进程虚拟机，平时不会在后台开什么多余的服务或进程，只是没有后台运行这个功能，不过可以通过TrayIt这个软件来弥补。</p>
<p><a href="http://www.putty.org/">Putty</a></p>
<p>终端登录。看中它的小巧、单文件、绿色，并且同时支持Telnet、SSH、Com等各种协议的所有认证方式登录，而且默认支持彩色文件名显示，不过它不能保存用户名密码倒是一个不小的遗憾。</p>
<p><a href="http://www.scootersoftware.com/">Beyond Compare</a></p>
<p>文件比较。进了公司才知道的软件，可以很方便的进行软件版本的比较、更新。第三版有了很多的亮点，操作也更加舒服，建议还在使用旧版的用户赶快升级，不过这是一款共享软件，当然网上也有免费的软件，尚未试用，争取能找到一款更好的免费文件比较工具把它替换掉。</p>
<p><a href="http://www.sourceinsight.com/">Source Insight</a></p>
<p>源代码浏览。这是一款让我想哭的软件，因为无法离开它，少了它真的无法想象全世界的软件开发要后退几年，虽然它的实现很简单：文本解析、Tag反查，但至今没有一款软件能超越它，可以说目前大部分的软件产品都有它的一份功劳，让其它IDE都滚一边去吧；这是一款共享软件，如果实在无法使用的话，可以用Vim+TagList+cscope代替，完全免费。</p>
<p><a href="http://dm2.sourceforge.net/">DM2</a></p>
<p>窗口管理。后台编译软件，做其它事情的时候想同时了解编译进度，您需要窗口透明+置顶；后台服务程序不再占用任务栏位置，防止误切换，您需要窗口最小化到托盘；另外还有诸如最小化到图标，窗口快捷键等功能。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/swlist.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>用Window API编写的定时器程序</title>
		<link>http://www.stars625.com/pscountdown.html</link>
		<comments>http://www.stars625.com/pscountdown.html#comments</comments>
		<pubDate>Sun, 20 Sep 2009 07:19:25 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[学习分享]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[window]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=227</guid>
		<description><![CDATA[这是一个用Window API编写的小程序，主要功能是倒计时提醒。通过设定倒计时间，待时间归零后通过托盘汽球提示提醒。学习了Window的消息处理机制、对话框按钮的窗口机制以及Win32的托盘程序编程。]]></description>
			<content:encoded><![CDATA[<p><strong>程序由来</strong></p>
<p>有时候煤气灶炖东西、洗衣机放水都需要一段等待时间，这时候去做其它事情很容易忘记时间，引发汤锅溢出、浪费水资源。以前在广告上看过一款水果定时器，是机械式的，只要根据时间长短一拧，就能在时间到了的时候发出声音提醒，很好、很方便，可是那是要钱的。根据自身经验，一般在家务无人值守时间经常是在电脑前，遂想找一款定时器程序。网上一般有两种，设定一个时间进行提醒，这种太麻烦了；还要一种就是倒计时提醒，正是我需要的，但网上的一般都不完善，而且用对话框弹出挺吓人的，没办法只能自己做一个了。另外还可以用这个工具来掐广告时间，对于一边看电视，一边玩电脑的朋友再好不过了。</p>
<p><strong>设计思路</strong></p>
<p>小巧、方便，这是小工具开发的一般要求，想了很多方案也拿出来晒晒。前阵子学了一段时间的GTK+编程，本来想做它来做，但这需要安装GTK+动态库，不方便用户使用，而且也用不着在Linux下使用（Linux下可以用很多脚本语言实现：Bash、Paython、Perl），还是考虑用MFC开发吧。但VC6的SDK老了点，不支持托盘程序编写，还要升级SDK，遂考虑用Win API来实现，反正程序也不大，而且与GTK+编程有点类似，另外也可以保证程序纯绿色产品，不用额外安装其它组件。开发环境用的是MinSYS+MinGW最新版的，里机的SDK支持托盘程序的开发，也是我比较喜欢的开发方式：C+VIM+GCC。</p>
<p>一开始考虑程序可以支持快捷操作，如设定几个常用定时按钮：1min、5min、10min、30min、60min等，这样直接一点就可以启动定时器了；用滑块来设定时间，用鼠标直接点击拖动就可以设定时间，都不用键盘输入；可以设定倒计时的时、分、秒；可以设定多组定时器，而且可以设定每组定时器的提醒内容等，便这一切都会大大的增加程序的复杂性、体积，显示功能累赘，在一系列比较、思想斗争后选定了最终方案。一个程序只能设定一组定时器，如果您需要多组那么可以开多个程序；定时时间限定在60分钟以内，这可以减少程序对输入数据的有限性验证有数据溢出的麻烦，如果超过一小时请使用更专业的软件；取消提醒内容设定，理由同上；用户交互只使用一个文本框和一个按钮，简化API程序开发。</p>
<p><strong>使用方法</strong></p>
<p>可执行文件总共24.1KB，运行时占用内存3.6MB，程序运行界面如下：</p>
<div id="attachment_228" class="wp-caption aligncenter" style="width: 330px"><a href="http://www.stars625.com/pscountdown.html"><img src="http://www.stars625.com/wp-content/uploads/pscountdown1.jpg" alt="PSCountdown主界面" title="pscountdown1" width="320" height="240" class="size-full wp-image-228" /></a><p class="wp-caption-text">PSCountdown主界面</p></div>
<p>在右上的文件框中输入要等待的时间，数值范围为：1~60，单位为分钟，输入完成后点击“apply”按钮，这时程序会最小化到屏幕右下脚托盘区，点击托盘图标可以呼出主界面查看剩余时间或重新设定时间。时间归零后屏幕右下脚出现汽球提示如下图，单击提示退出程序。</p>
<div id="attachment_229" class="wp-caption aligncenter" style="width: 330px"><a href="http://www.stars625.com/pscountdown.html"><img src="http://www.stars625.com/wp-content/uploads/pscountdown2.jpg" alt="PSCountdown定时器提醒界面" title="pscountdown2" width="320" height="120" class="size-full wp-image-229" /></a><p class="wp-caption-text">PSCountdown定时器提醒界面</p></div>
<p>完整程序如下:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define    _WIN32_IE        0x0600</span>
&nbsp;
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;string.h&gt;</span>
<span style="color: #339933;">#include &lt;windows.h&gt;</span>
<span style="color: #339933;">#include &lt;time.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define ID_TIMER		1</span>
<span style="color: #339933;">#define ID_APPLY		2002</span>
<span style="color: #339933;">#define ID_HIDE			2003</span>
<span style="color: #339933;">#define ID_ICON			2005</span>
&nbsp;
HWND        hwnd<span style="color: #339933;">;</span>
HWND        hwnd_apply<span style="color: #339933;">;</span>
HWND        hwnd_min<span style="color: #339933;">;</span>
HWND		hwnd_rest<span style="color: #339933;">;</span>
HWND		hwnd_current<span style="color: #339933;">;</span>
HWND		hwnd_tips<span style="color: #339933;">;</span>
&nbsp;
NOTIFYICONDATA    nd<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> RestTime <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">char</span> szAppName<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;PSCountdown&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">void</span> ShowNotify<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    nd.<span style="color: #202020;">uFlags</span> <span style="color: #339933;">|=</span> NIF_INFO<span style="color: #339933;">;</span>
    strcpy<span style="color: #009900;">&#40;</span>nd.<span style="color: #202020;">szInfoTitle</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;PSCountdown&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    strcpy<span style="color: #009900;">&#40;</span>nd.<span style="color: #202020;">szInfo</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Setting Time Count Down!!!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    Shell_NotifyIcon<span style="color: #009900;">&#40;</span>NIM_MODIFY<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>nd<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> CALLBACK TimerProc<span style="color: #009900;">&#40;</span>HWND hwnd<span style="color: #339933;">,</span> UINT uMsg<span style="color: #339933;">,</span> UINT idEvent<span style="color: #339933;">,</span> DWORD dwTime<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">char</span> m_str<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">30</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	SYSTEMTIME SysTime<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>RestTime <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		RestTime<span style="color: #339933;">--;</span>
		sprintf<span style="color: #009900;">&#40;</span>m_str<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Rest Seconds: %d&quot;</span><span style="color: #339933;">,</span> RestTime<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		SetWindowText<span style="color: #009900;">&#40;</span>hwnd_rest<span style="color: #339933;">,</span> m_str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>RestTime <span style="color: #339933;">&lt;=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>ShowNotify<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	GetLocalTime<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>SysTime<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	sprintf<span style="color: #009900;">&#40;</span>m_str<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Current Time: %02d:%02d:%02d&quot;</span><span style="color: #339933;">,</span> SysTime.<span style="color: #202020;">wHour</span><span style="color: #339933;">,</span> SysTime.<span style="color: #202020;">wMinute</span><span style="color: #339933;">,</span> SysTime.<span style="color: #202020;">wSecond</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	SetWindowText<span style="color: #009900;">&#40;</span>hwnd_current<span style="color: #339933;">,</span> m_str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> SetRestTime<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> setime <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	<span style="color: #993333;">char</span> m_time<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	GetWindowText<span style="color: #009900;">&#40;</span>hwnd_min<span style="color: #339933;">,</span> m_time<span style="color: #339933;">,</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	setime <span style="color: #339933;">=</span> atoi<span style="color: #009900;">&#40;</span>m_time<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>setime<span style="color: #339933;">&gt;</span><span style="color: #0000dd;">60</span> <span style="color: #339933;">||</span> setime<span style="color: #339933;">&lt;=</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
		MessageBox<span style="color: #009900;">&#40;</span>hwnd<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Setting Time must be 1~60 min!&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Warning&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">else</span>
		RestTime <span style="color: #339933;">=</span> setime <span style="color: #339933;">*</span> <span style="color: #0000dd;">60</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> QuitWin<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	Shell_NotifyIcon<span style="color: #009900;">&#40;</span>NIM_DELETE<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>nd<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	PostQuitMessage<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> IconNotifyProc<span style="color: #009900;">&#40;</span>LPARAM lParam<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">switch</span><span style="color: #009900;">&#40;</span>lParam<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">case</span> WM_LBUTTONDOWN<span style="color: #339933;">:</span>
	<span style="color: #b1b100;">case</span> WM_RBUTTONDOWN<span style="color: #339933;">:</span>
		ShowWindow<span style="color: #009900;">&#40;</span>hwnd<span style="color: #339933;">,</span> SW_NORMAL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">case</span> <span style="color: #208080;">0x404</span><span style="color: #339933;">:</span>
	<span style="color: #b1b100;">case</span> <span style="color: #208080;">0x405</span><span style="color: #339933;">:</span>
		QuitWin<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">default</span><span style="color: #339933;">:</span>
		<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
LRESULT CALLBACK WndProc<span style="color: #009900;">&#40;</span>HWND hwnd<span style="color: #339933;">,</span> UINT iMsg<span style="color: #339933;">,</span> WPARAM wParam<span style="color: #339933;">,</span> LPARAM lParam<span style="color: #009900;">&#41;</span> 
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span>iMsg<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">case</span> WM_COMMAND<span style="color: #339933;">:</span>
		<span style="color: #b1b100;">switch</span><span style="color: #009900;">&#40;</span>wParam<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">case</span> ID_APPLY<span style="color: #339933;">:</span>
			SetRestTime<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			ShowWindow<span style="color: #009900;">&#40;</span>hwnd<span style="color: #339933;">,</span> SW_HIDE<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">case</span> ID_ICON<span style="color: #339933;">:</span>
			IconNotifyProc<span style="color: #009900;">&#40;</span>lParam<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">default</span><span style="color: #339933;">:</span>
			<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">case</span> WM_SYSCOMMAND<span style="color: #339933;">:</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>wParam <span style="color: #339933;">==</span> SC_MINIMIZE<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			ShowWindow<span style="color: #009900;">&#40;</span>hwnd<span style="color: #339933;">,</span> SW_HIDE<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">case</span> WM_DESTROY<span style="color: #339933;">:</span>
		QuitWin<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> DefWindowProc<span style="color: #009900;">&#40;</span>hwnd<span style="color: #339933;">,</span> iMsg<span style="color: #339933;">,</span> wParam<span style="color: #339933;">,</span> lParam<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> WINAPI WinMain<span style="color: #009900;">&#40;</span>HINSTANCE hInstance<span style="color: #339933;">,</span> HINSTANCE hPrevInstance<span style="color: #339933;">,</span>
           LPSTR szCmdLine<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> iCmdShow<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    MSG         msg<span style="color: #339933;">;</span>
    WNDCLASSEX  wc<span style="color: #339933;">;</span>
	DWORD		style<span style="color: #339933;">;</span>
&nbsp;
    wc.<span style="color: #202020;">cbSize</span>         <span style="color: #339933;">=</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>wc<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    wc.<span style="color: #202020;">style</span>          <span style="color: #339933;">=</span> CS_HREDRAW <span style="color: #339933;">|</span> CS_VREDRAW<span style="color: #339933;">;</span>
    wc.<span style="color: #202020;">lpfnWndProc</span>    <span style="color: #339933;">=</span> WndProc<span style="color: #339933;">;</span>
    wc.<span style="color: #202020;">cbClsExtra</span>     <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    wc.<span style="color: #202020;">cbWndExtra</span>     <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    wc.<span style="color: #202020;">hInstance</span>      <span style="color: #339933;">=</span> hInstance<span style="color: #339933;">;</span>
    wc.<span style="color: #202020;">hIcon</span>          <span style="color: #339933;">=</span> LoadIcon<span style="color: #009900;">&#40;</span>NULL<span style="color: #339933;">,</span> IDI_INFORMATION<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    wc.<span style="color: #202020;">hIconSm</span>        <span style="color: #339933;">=</span> LoadIcon<span style="color: #009900;">&#40;</span>NULL<span style="color: #339933;">,</span> IDI_INFORMATION<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    wc.<span style="color: #202020;">hCursor</span>        <span style="color: #339933;">=</span> LoadCursor<span style="color: #009900;">&#40;</span>NULL<span style="color: #339933;">,</span> IDC_ARROW<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    wc.<span style="color: #202020;">hbrBackground</span>  <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>HBRUSH<span style="color: #009900;">&#41;</span>COLOR_BACKGROUND<span style="color: #339933;">;</span>
    wc.<span style="color: #202020;">lpszClassName</span>  <span style="color: #339933;">=</span> szAppName<span style="color: #339933;">;</span>
    wc.<span style="color: #202020;">lpszMenuName</span>   <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
    RegisterClassEx<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>wc<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	style <span style="color: #339933;">=</span> WS_OVERLAPPEDWINDOW<span style="color: #339933;">;</span>
	style <span style="color: #339933;">&amp;=</span> ~<span style="color: #009900;">&#40;</span>WS_MAXIMIZEBOX <span style="color: #339933;">|</span> WS_SIZEBOX<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    hwnd <span style="color: #339933;">=</span>          CreateWindow<span style="color: #009900;">&#40;</span>szAppName<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;PSCountdown - By stars_625&quot;</span><span style="color: #339933;">,</span>
                    style<span style="color: #339933;">,</span>
                    CW_USEDEFAULT<span style="color: #339933;">,</span> CW_USEDEFAULT<span style="color: #339933;">,</span>
                    <span style="color: #0000dd;">320</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">240</span><span style="color: #339933;">,</span>
                    NULL<span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> hInstance<span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    hwnd_apply <span style="color: #339933;">=</span>    CreateWindow<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;BUTTON&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;apply&quot;</span><span style="color: #339933;">,</span>
                    WS_VISIBLE <span style="color: #339933;">|</span> WS_CHILD <span style="color: #339933;">|</span> BS_FLAT<span style="color: #339933;">,</span>
                    <span style="color: #0000dd;">230</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">90</span><span style="color: #339933;">,</span>
                    <span style="color: #0000dd;">50</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">20</span><span style="color: #339933;">,</span>
                    hwnd<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>HMENU<span style="color: #009900;">&#41;</span>ID_APPLY<span style="color: #339933;">,</span> hInstance<span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    hwnd_min <span style="color: #339933;">=</span>      CreateWindow<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;EDIT&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;3&quot;</span><span style="color: #339933;">,</span>
                    WS_CHILD <span style="color: #339933;">|</span> WS_VISIBLE <span style="color: #339933;">|</span> WS_BORDER<span style="color: #339933;">,</span>
                    <span style="color: #0000dd;">230</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">40</span><span style="color: #339933;">,</span>
                    <span style="color: #0000dd;">50</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">20</span><span style="color: #339933;">,</span>
                    hwnd<span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> hInstance<span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    hwnd_rest <span style="color: #339933;">=</span>     CreateWindow<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;STATIC&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Rest Seconds:&quot;</span><span style="color: #339933;">,</span>
                    WS_CHILD <span style="color: #339933;">|</span> WS_VISIBLE<span style="color: #339933;">,</span>
                    <span style="color: #0000dd;">20</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">90</span><span style="color: #339933;">,</span>
                    <span style="color: #0000dd;">180</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">20</span><span style="color: #339933;">,</span>
                    hwnd<span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> hInstance<span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    hwnd_current <span style="color: #339933;">=</span>  CreateWindow<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;STATIC&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Current Time:&quot;</span><span style="color: #339933;">,</span>
                    WS_CHILD <span style="color: #339933;">|</span> WS_VISIBLE<span style="color: #339933;">,</span>
                    <span style="color: #0000dd;">20</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">40</span><span style="color: #339933;">,</span>
                    <span style="color: #0000dd;">180</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">20</span><span style="color: #339933;">,</span>
                    hwnd<span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> hInstance<span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    hwnd_tips <span style="color: #339933;">=</span>		CreateWindow<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;STATIC&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;http://www.stars625.com/pscountdown.html&quot;</span><span style="color: #339933;">,</span>
                    WS_CHILD <span style="color: #339933;">|</span> WS_VISIBLE<span style="color: #339933;">,</span>
                    <span style="color: #0000dd;">10</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">150</span><span style="color: #339933;">,</span>
                    <span style="color: #0000dd;">290</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">20</span><span style="color: #339933;">,</span>
                    hwnd<span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> hInstance<span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/*    Create tray icon  */</span>
    nd.<span style="color: #202020;">cbSize</span>    		<span style="color: #339933;">=</span> <span style="color: #993333;">sizeof</span> <span style="color: #009900;">&#40;</span>NOTIFYICONDATA<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    nd.<span style="color: #202020;">hWnd</span>    			<span style="color: #339933;">=</span> hwnd<span style="color: #339933;">;</span>
    nd.<span style="color: #202020;">uID</span>    			<span style="color: #339933;">=</span> ID_ICON<span style="color: #339933;">;</span>
    nd.<span style="color: #202020;">uFlags</span>		    <span style="color: #339933;">=</span> NIF_ICON <span style="color: #339933;">|</span> NIF_MESSAGE <span style="color: #339933;">|</span> NIF_TIP<span style="color: #339933;">;</span>
    nd.<span style="color: #202020;">hIcon</span>    		<span style="color: #339933;">=</span> LoadIcon<span style="color: #009900;">&#40;</span>NULL<span style="color: #339933;">,</span> IDI_INFORMATION<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    nd.<span style="color: #202020;">uCallbackMessage</span>	<span style="color: #339933;">=</span> WM_COMMAND<span style="color: #339933;">;</span>
    strcpy<span style="color: #009900;">&#40;</span>nd.<span style="color: #202020;">szTip</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;PSCountdown - A Time Count Down&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    Shell_NotifyIcon<span style="color: #009900;">&#40;</span>NIM_ADD<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>nd<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    ShowWindow<span style="color: #009900;">&#40;</span>hwnd<span style="color: #339933;">,</span> iCmdShow<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    UpdateWindow<span style="color: #009900;">&#40;</span>hwnd<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	SetTimer<span style="color: #009900;">&#40;</span>hwnd<span style="color: #339933;">,</span> ID_TIMER<span style="color: #339933;">,</span> <span style="color: #0000dd;">1000</span><span style="color: #339933;">,</span> TimerProc<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span> GetMessage<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>msg<span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        TranslateMessage<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>msg<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        DispatchMessage<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>msg<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> msg.<span style="color: #202020;">wParam</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><a href='http://www.stars625.com/wp-content/uploads/PSCountdown.zip'>点击下载完整程序和可执行文件</a></p>
<p>对于程序需要改进的地方欢迎大家跟帖留言。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/pscountdown.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>安装GTK+/DirectFB图形环境</title>
		<link>http://www.stars625.com/gtkdfb.html</link>
		<comments>http://www.stars625.com/gtkdfb.html#comments</comments>
		<pubDate>Wed, 26 Aug 2009 15:45:42 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[学习分享]]></category>
		<category><![CDATA[DirectFB]]></category>
		<category><![CDATA[GTK]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=155</guid>
		<description><![CDATA[在学习了一段时间的GTK+图形编程后，考虑是否可以将该环境移植到嵌入式系统上，在网上查阅了相关资料后，确定了可行性，本文就是介绍了在虚拟机X86平台Linux系统下配置GTK+图形显示环境的过程。]]></description>
			<content:encoded><![CDATA[<p>一般的嵌入式系统使用MiniGUI、Qt/E、uC/GUI等图形环境，它们都是专业的面向嵌入式系统，经过专门裁剪后的集成包，相对比较成熟、安装方便，不过大部份都是商业版，在网上查阅了相关资料后，发现在嵌入式系统上构建GTK+的图形环境是完全可行的，但是整个环境由很多个源码包组成，依赖复杂，难度相对较大。</p>
<p>Linux系统常用的图形接口是FrameBuffer帧缓冲，实现了显存映射，生成了对应的/dev/fbX文件供用户操作，这需要内核打开相关选项。</p>
<p>本次实验在虚拟机上X86平台进行，可以为我们的第一次尝试去除交叉编译等不必要的麻烦，抓住主要矛盾。这里使用VirtualBox虚拟机，VirtualBox是目前个人感觉最好的虚拟机，比较简洁，不会给系统安装一大撮的服务；在上面安装了Red Hat Enterprise Linux AS4.0，使用AS4企业版，只因为一直使用的这个版本，感觉比较稳定，只安装基本的字符模式和开发包，差不多十分钟就能安装完成。</p>
<p>此时的系统只有字符界面，可以进行正常的编译、安装等开发工作，过会我们就要在上面实现基本的图形界面。</p>
<p>首先要确保内核打开了FrameBuffer支持选项，并且需要在系统启动参数中添加“vga=0&#215;0314”，代表使用800*600分辨率，如果启动时能看到小企鹅图标，表明内核已经支持FrameBuffer，启动后查看是否有/dev/fb0等设备文件。</p>
<p>在这里首先说一下Linux系统编译安装源码包的注意事项，解开源码包有，首先查看README，看看基本功能介绍等，一般它会诉你如果要安装的话要查看哪个说明文件，一般都是INSTALL，在这个里面我们可以了解这个源码包依赖哪些包，以及编译安装方法，一般都是./configure、make、make install，当然要先安装它所依赖的源码包。</p>
<p>我以前一直不了解./configure里面的“&#8211;prefix”参数有什么大的用处，直接安装到默认路径不就行了吗，这也就给我的这次移植埋下了第一大隐患，在安装包的时候，系统中可能已经有一些早期版本，而早期版本一般都是安装在/usr目录下的，而我们的新版本，由于没有指定安装路径，一般都会安装到/usr/local下，导致版本冲突，调用的时候往往使用的还是老版本的可执行文件或库文件，所以安装一定要注意版本冲突问题。</p>
<p>因为Linux操作系统统一使用pkg-config工具来统一管理头文件路径和库路径，在新安装一个开发包后，会将一个开发包信息脚本放到pkg-config的目录下供其调用，而当系统中安装了不同版本的pkg-config，或者其它原因引起的，会同时存在两个pkg-config目录，一般都是/usr/lib/pkgconfig和/usr/local/lib/pkgconfig目录，而一般情况下系统只能搜寻前面的这个目录，所以有时候会导致，明明安装了那个开发包，却提示说pkg-config找不到，此时需要设置一个环境变量“export PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/local/lib/pkgconfig”就能解决，另外将“/usr/lib”和“/usr/local/lib”这两个路径加入到“/etc/ld.so.conf”并且执行“ldconfig”更新。</p>
<p>好了，如果在安装过程中出现开发包没安装，或库找不到的情况请对照以上两条解决。</p>
<p>首先进行编译安装DirectFB-1.4.1.tar.gz，没什么问题，顺利通过。编写以下测试程序并编译运行，如果能看到一条横线，那就成功了。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;unistd.h&gt;</span>
<span style="color: #339933;">#include &lt;directfb.h&gt;</span>
&nbsp;
<span style="color: #993333;">static</span> IDirectFB <span style="color: #339933;">*</span>dfb <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
<span style="color: #993333;">static</span> IDirectFBSurface <span style="color: #339933;">*</span>primary <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">static</span> <span style="color: #993333;">int</span> screen_width  <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #993333;">static</span> <span style="color: #993333;">int</span> screen_height <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #339933;">#define DFBCHECK(x...)                                         \
{                                                      	   \
    DFBResult err = x;                                         \
                                                               \
    if (err != DFB_OK)                                         \
    {                                                          \
        fprintf( stderr, &quot;%s &lt;%d&gt;:\n\t&quot;, __FILE__, __LINE__ ); \
        DirectFBErrorFatal( #x, err );                         \
    }                                                          \
}</span>
&nbsp;
<span style="color: #993333;">int</span> main <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>argv<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	DFBSurfaceDescription dsc<span style="color: #339933;">;</span>
	DFBCHECK <span style="color: #009900;">&#40;</span>DirectFBInit <span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>argc<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>argv<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	DFBCHECK <span style="color: #009900;">&#40;</span>DirectFBCreate <span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>dfb<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	DFBCHECK <span style="color: #009900;">&#40;</span>dfb<span style="color: #339933;">-&gt;</span>SetCooperativeLevel <span style="color: #009900;">&#40;</span>dfb<span style="color: #339933;">,</span> DFSCL_FULLSCREEN<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	dsc.<span style="color: #202020;">flags</span> <span style="color: #339933;">=</span> DSDESC_CAPS<span style="color: #339933;">;</span>
	dsc.<span style="color: #202020;">caps</span>  <span style="color: #339933;">=</span> DSCAPS_PRIMARY <span style="color: #339933;">|</span> DSCAPS_FLIPPING<span style="color: #339933;">;</span>
&nbsp;
	DFBCHECK <span style="color: #009900;">&#40;</span>dfb<span style="color: #339933;">-&gt;</span>CreateSurface<span style="color: #009900;">&#40;</span> dfb<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>dsc<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>primary <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	DFBCHECK <span style="color: #009900;">&#40;</span>primary<span style="color: #339933;">-&gt;</span>GetSize <span style="color: #009900;">&#40;</span>primary<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>screen_width<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>screen_height<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	DFBCHECK <span style="color: #009900;">&#40;</span>primary<span style="color: #339933;">-&gt;</span>FillRectangle <span style="color: #009900;">&#40;</span>primary<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> screen_width<span style="color: #339933;">,</span> screen_height<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	DFBCHECK <span style="color: #009900;">&#40;</span>primary<span style="color: #339933;">-&gt;</span>SetColor <span style="color: #009900;">&#40;</span>primary<span style="color: #339933;">,</span> <span style="color: #208080;">0x80</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x80</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xff</span><span style="color: #339933;">,</span> <span style="color: #208080;">0xff</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	DFBCHECK <span style="color: #009900;">&#40;</span>primary<span style="color: #339933;">-&gt;</span>DrawLine <span style="color: #009900;">&#40;</span>primary<span style="color: #339933;">,</span>
			                      <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> screen_height <span style="color: #339933;">/</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">,</span>
			       screen_width <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> screen_height <span style="color: #339933;">/</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	DFBCHECK <span style="color: #009900;">&#40;</span>primary<span style="color: #339933;">-&gt;</span>Flip <span style="color: #009900;">&#40;</span>primary<span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	sleep <span style="color: #009900;">&#40;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	primary<span style="color: #339933;">-&gt;</span>Release<span style="color: #009900;">&#40;</span> primary <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	dfb<span style="color: #339933;">-&gt;</span>Release<span style="color: #009900;">&#40;</span> dfb <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">23</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>在进行GTK+环境安装的时候出了很多问题，包括开发包的依赖问题，库找不到，undefined symbol: FcDirCacheLoad，mandatory image surface backend feature could not be enabled，提示重新安装FreeType和FontConfig等问题请参考上文方法解决，因为经历过磨难，这里就直接将正确的包的安装顺利和配置参数给出：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">pkg-config-0.23.tar.gz
.<span style="color: #000000; font-weight: bold;">/</span>configure
<span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span>
&nbsp;
glib-2.20.4.tar.bz2 require pkg-config
.<span style="color: #000000; font-weight: bold;">/</span>configure
<span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span>
注：此包依赖新版本的pkg-config工具，因此在此之前对系统原有程序升级。
&nbsp;
libpng-1.2.39.tar.bz2
.<span style="color: #000000; font-weight: bold;">/</span>configure
<span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span>
&nbsp;
pixman-0.15.20.tar.gz
.<span style="color: #000000; font-weight: bold;">/</span>configure
<span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span>
&nbsp;
freetype-2.3.9.tar.bz2
.<span style="color: #000000; font-weight: bold;">/</span>configure
<span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span>
&nbsp;
fontconfig-2.7.1.tar.gz
.<span style="color: #000000; font-weight: bold;">/</span>configure
<span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span>
注：此包依赖FreeType，如果已经安装TreeType但还提示找不到，请根据前文修改。
&nbsp;
cairo-1.8.8.tar.gz
.<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--enable-directfb</span>=<span style="color: #c20cb9; font-weight: bold;">yes</span> <span style="color: #660033;">--enable-ft</span>=<span style="color: #c20cb9; font-weight: bold;">yes</span> <span style="color: #660033;">--enable-ps</span>=no <span style="color: #660033;">--enable-svg</span>=no
<span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span>
注：此包依赖libpng pixman fontconfig，注意Enable DirectFB。
&nbsp;
pango-1.24.5.tar.bz2
.<span style="color: #000000; font-weight: bold;">/</span>configure
<span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span>
注：依赖cairo glib
&nbsp;
atk-1.27.90.tar.bz2
.<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--with-gtktarget-directfb</span> <span style="color: #660033;">--without-libtiff</span> <span style="color: #660033;">--without-libjpeg</span> <span style="color: #660033;">--without-libjasper</span>
<span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span>
注：注意GtkTarget DirectFB。</pre></td></tr></table></div>

<p>至此，开发包都已安装完毕，如果没有出错的话，那么我们就可以写一个GTK+代码进行测试，这里我写了一个最简单的窗体，包括一个按钮，单击按钮退出程序，代码如下：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;gtk/gtk.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span> <span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	GtkWidget <span style="color: #339933;">*</span>window<span style="color: #339933;">;</span>
	GtkWidget <span style="color: #339933;">*</span>button<span style="color: #339933;">;</span>
&nbsp;
	gtk_init<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>argc<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>argv<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	window <span style="color: #339933;">=</span> gtk_window_new<span style="color: #009900;">&#40;</span>GTK_WINDOW_TOPLEVEL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	gtk_widget_set_size_request<span style="color: #009900;">&#40;</span>GTK_WIDGET<span style="color: #009900;">&#40;</span>window<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">640</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">480</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	button <span style="color: #339933;">=</span> gtk_button_new_with_label<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Click Here&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	g_signal_connect<span style="color: #009900;">&#40;</span>window<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;destroy&quot;</span><span style="color: #339933;">,</span> G_CALLBACK<span style="color: #009900;">&#40;</span>gtk_main_quit<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	g_signal_connect<span style="color: #009900;">&#40;</span>button<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;clicked&quot;</span><span style="color: #339933;">,</span> G_CALLBACK<span style="color: #009900;">&#40;</span>gtk_main_quit<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
	gtk_container_add<span style="color: #009900;">&#40;</span>GTK_CONTAINER<span style="color: #009900;">&#40;</span>window<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> GTK_WIDGET<span style="color: #009900;">&#40;</span>button<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	gtk_widget_show_all<span style="color: #009900;">&#40;</span>window<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	gtk_main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>一切正常的话就会出现如下图，能看到鼠标，但标题栏没有，样子也很难后，颜色也许可以通过RC文件修改，但是在我的虚拟机上显示出的整</p>
<p>个图像好你宽度都变成的1/2，前面的DirectFB测试也是如此。</p>
<div id="attachment_160" class="wp-caption aligncenter" style="width: 586px"><a href="http://www.stars625.com/gtkdfb.html/gtkdfb-2" rel="attachment wp-att-160"><img src="http://www.stars625.com/wp-content/uploads/gtkdfb.jpg" alt="GTK+ DirectFB Pic" title="GTK+ DirectFB" width="576" height="474" class="size-full wp-image-160" /></a><p class="wp-caption-text">GTK+ DirectFB Pic</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/gtkdfb.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>跨平台软件开发图形界面的选择</title>
		<link>http://www.stars625.com/crossplatformgui.html</link>
		<comments>http://www.stars625.com/crossplatformgui.html#comments</comments>
		<pubDate>Sun, 02 Aug 2009 09:55:01 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[学习分享]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[软件开发]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=149</guid>
		<description><![CDATA[软件开发中总免不了使用图形界面GUI，平常我们使用VC、VB、Delphi等集成开发环境就能轻松实现，但实现细节被隐藏，不利于定制，更加无法移植到其它操作系统。本文主要讨论了能助你实现跨平台软件的图形界面库。]]></description>
			<content:encoded><![CDATA[<p>标题中提到的跨平台包含两个概念：一是跨软件平台，开发的一套软件既想在Windows上运行，又想在Linux上运行；二是跨硬件平台，就是嵌入式软件开发中在各个硬件平台间的移植，因此，文中介绍的GUI也分为两个部分。</p>
<p>本文对图形界面开发库作一个罗列，简单介绍各个库之间的特点和应用，详细的实现细节以及技术特点大家可以参考网上其它文章。</p>
<p>跨软件平台的图形界面开发库。此类库主要应用于X86平台的基于操作系统的软件开发，我们平常写程序希望既能在Window下可以使用，在Linux、Mac等平台也可以使用，应当使用这些开发库，它们都需要调用操作系统的API。</p>
<p>MFC。这是Visual C++使用的一个开发库，应用相当广泛，但是只能在Win下使用，据说在跨平台版本，但费用相当高。</p>
<p>JAVA。以“一次开发，到处运行”著称，使用虚拟原理，在每个平台上要安装一个Runtime环境来实现跨系统，但其运行效率也是一直以来被人垢病的缺点，而且需要使用一门全新的编程语言。</p>
<p>QT。非常强大的GUI库，应用十分广泛，而且有很多IDE支持，KDE、Opera等很多大型项目都是基于它实现的，但使用前你需要先确认下它的授权协议。</p>
<p>GTK+。与QT平行，功能同样非常强大，GNOME、Firefox、Wireshark都是基于它实现的，能很好的实现本地化（在Linux下使用Linux主题的样式，在Win在使用Win的主题），而且它没有QT那样烦人的授权协议。</p>
<p>wxWidgets。相比以上重量级的，它精简了不少，应用也是相当广泛，但好像完善性有待考量，看网上评价，好像有莫名其妙的问题出现，开源的FTP工具FileZilla就是使用它来实现的。</p>
<p>FLTK。更加轻量级，不适合繁杂图形界面，而且对字符集的支持有先天缺限，如果开发功能主导的、体积要求比较小的软件，可以考虑使用它。</p>
<p>TK。其实它只能算是一种脚本语言，在各平台上安装了运行环境后，可以使用简单的图形界面，一般不推荐使用。</p>
<p>对于该类图形开发库推荐两篇文章写得相当详细：</p>
<p><a href="http://jbean.blog.51cto.com/448512/175190">wxWidgets与其他工具库的比较(上)</a></p>
<p><a href="http://jbean.blog.51cto.com/448512/183119">wxWidgets与其他工具库的比较(下) </a></p>
<p>跨硬件平台的图形界面开发库。该类开发库一般应用于ARM、PowerPC等嵌入式系统开发中需要图形界面进行人机交互的场合，一般要求GUI不能过多依赖操作系统，一般由驱动层实现了画点、输入函数后，其它的都交由开发库来实现，如画按钮、标题栏等。</p>
<p>QT/E。全称Qt/Embedded，明显是用于嵌入式系统的，功能相当强大，当然也是所有GUI是体积最大的一个，推荐系统资源宽裕的时候使用，跟前面一样要考虑许可证的问题。</p>
<p>MiniGUI。功能、体积都稍逊前者，但许可证问题好像稍微好一点，一般嵌入式系统使用的工具的授权协议都比较严格，都是用来赚钱的，开发、学习用好像是免费的。</p>
<p>uC/GUI。Micrium公司开发的，与uC/OS同门，相比前两者，它要算是最精简的了，不过实现的组件也不弱，以前使用过，可以运行在无操作系统状态，上手非常快。</p>
<p>以上只是作者对于各个工具的一个初步印象，没有应用经验，表达难免空洞，只想给大家作个介绍，起一个抛砖引玉的作用。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/crossplatformgui.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>喷水灭火机器人比赛视频</title>
		<link>http://www.stars625.com/firefightingvideo.html</link>
		<comments>http://www.stars625.com/firefightingvideo.html#comments</comments>
		<pubDate>Mon, 01 Jun 2009 15:34:33 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[学习分享]]></category>
		<category><![CDATA[firefighter]]></category>
		<category><![CDATA[robot]]></category>
		<category><![CDATA[机器人]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=95</guid>
		<description><![CDATA[这是我们参加第三届江苏机器人大赛灭火机器人比赛时的视频，我们的机器人是比赛中唯一一个采用非风扇灭火－－喷水的方式进行灭火的，从方案设计、PCB绘制、制板、焊接、组装、调试、编程都是独立开发完成。]]></description>
			<content:encoded><![CDATA[<p>这是一款自行开发研制的比赛用灭火机器人，提出了一种喷水灭火的方案。硬件上灭火机器人的控制部分以32位ARM处理器LPC2148为核心，以红外测距传感器、灰度传感器、远红外火焰传感器组成了环境检测系统，利用LMD18200芯片驱动永磁体直流电机，自制高压喷水装置实现喷水灭火功能。控制策略上，采用沿墙走自主导航寻找火焰并配合无火不进房的方式灭火，大大节省了时间。为了能够实现机器人准确而快速的自动化运动控制，运用PID算法引入红外测距的数值作为反馈对运行速度进行控制。为了能够得到准确的模数转换值，使用中位值平均递推复合滤波算法对A/D采样值进行降噪处理。设计充分利用了LPC2148丰富的外部资源和数据吞吐量大等特点，较传统的单片机控制系统有更简洁的外部接口、更快的处理速度和更高的可靠性。实际比赛结果表明，该机器人具有稳定性好、快速、准确灭火等良好性能。</p>
<p>灭火机器人的相关开发文档将会陆续公布，请大家关注芷菁博客。</p>
<p><embed src="http://player.youku.com/player.php/sid/XMzEwMTcxODQ=/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed></p>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/firefightingvideo.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>我的嵌入式之路</title>
		<link>http://www.stars625.com/myembedway.html</link>
		<comments>http://www.stars625.com/myembedway.html#comments</comments>
		<pubDate>Sat, 30 May 2009 15:39:53 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[学习分享]]></category>
		<category><![CDATA[嵌入式]]></category>
		<category><![CDATA[软件开发]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=88</guid>
		<description><![CDATA[小时候我对电子方面比较感兴趣，后来接触了电脑，又向往程序设计，在受人指点之后，结合两者，转向嵌入式系统软件开发这一条路上。整个过程路线都是非常清晰的，本文就是大致讲解了这么一个过程，也算是一个比较完美的学习规迹吧。]]></description>
			<content:encoded><![CDATA[<p>我从小对电子方面比较感兴趣，平时喜欢做一些小制作，曾获无锡市科技制作二等奖，当时希望以后能从事电子电气方面的工作。</p>
<p>直到接触了电子技术高度发展的产物――电脑，深深地被其强大的功能所吸引，更是羡慕程序设计员，他们能设计出各式各样的软件，让其在电脑上运行完成不同的功能。从那以后开始自学“步步高”上的Q/F-Basic，看帮助文档慢慢写一些运算程序，虽然很简单但也非常令我兴奋，极大地激发了我的兴趣。</p>
<p>初中末真正开始使用电脑，当时使用的是Win98，学习了基本操作和网络共享等知识。到了高中拥有了自己的电脑，开始全面了解电脑的软硬件，学习系统维护等，开始接触Visual Basic，完成了第一个图形界面的程序开发后，不断找资料自已学习，并且编写一些小程序。当时性格内向的我，非常向往坐在电脑前写程序的那种工作氛围，即使这很费神，我还是非常喜欢写程序，所以进入大学选择了软件工程方向。</p>
<p>进入大学真正了解了网络，从同学那学到了“动态网站”这个新名词。自此，结合以前HTML的基础从论坛推广开始，自学ASP/PHP、网站宣传、空间域名申请、服务器架设、Flash动画制作、PS/FW图像处理等，这样一路走来，逐渐得到了教师和同学的认可。</p>
<p>在一次开发网站的机会中，认识到了一位老师，这也许是我人生中的一个转折点。在我们沟通的过程中，他第一次地向我介绍了“嵌入式系统”这个概念。融合了软件和硬件的嵌入式系统软件开发终于在我儿时的梦想和目前的志向中找到了一个很好的契合点，他又向我分析了当前以及未来社会对人才的需求等因素，指出拥有多方面知识的跨学科人才是社会急需的。</p>
<p>在经历了暑假KTV系统集成以及代表学校参加的机器人大赛之后，经过仔细的考虑，终于决定向嵌入式迈进，而网站制作、系统优化、Flash动画等均作为辅助项目暂时放下。</p>
<p>第一步就是按照实验书上的介绍，制作了一个“基于AT89C51及ADC0809模数转换系统”的作品参加学校的电子设计大赛。在经历了实验箱硬件仿真、万能板单片机仿真、烧程序等一系列过程，克服了种种困难之后终于完成了作品，获得了二等奖。</p>
<p>随后选择了一款网上评论较多的三星44B0来进行ARM起步。为了能更快地熟悉硬件，所以单独购买了PCB空板，及相关电子元器件对照BOM及SCH进行焊接。完成之后，把例程跑了一遍，然后改了一些程序跑通了。由于这块开发块焊接完成后，经反复测试发现串口无法正常工作，又把USB(D12)学习了下，基本跑通了USB服务程序及上位机程序。</p>
<p>在随后的全国大学生电子设计大赛中，未用ARM而是用了一款功能非常强大的51单片机C8051F020。根据数据手册，将该单片机的所有功能写了一个函数库供比赛中使用。这个过程，让我学会了如何使用文档，更深入地了解了MCU的工作方式。</p>
<p>比赛之后，开始进行uC/OS的移植，目标板是LPC2142。选用这款ARM是因为体积小，自带Flash和RAM，并自带USB模块，内置的内存资源也足够跑操作系统，可以省去很多外围电路的问题。</p>
<p>后来又参加了“江苏省大学生素质拓展训练”灭火机器人项目，要求制作一个ARM平台的控制核心，所有传感器以及驱动器协同工作。经过半年的努力终于完了，顺利参加了比赛。</p>
<p>可以说，正是儿时的梦想、大学的兴趣奠定了我走上嵌入式之路。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/myembedway.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>基于AT89C51及ADC0809模数转换系统的设计</title>
		<link>http://www.stars625.com/51ad.html</link>
		<comments>http://www.stars625.com/51ad.html#comments</comments>
		<pubDate>Fri, 29 May 2009 15:45:39 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[学习分享]]></category>
		<category><![CDATA[AD]]></category>
		<category><![CDATA[ADC0809]]></category>
		<category><![CDATA[AT89C51]]></category>
		<category><![CDATA[单片机]]></category>
		<category><![CDATA[数模转换]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=75</guid>
		<description><![CDATA[我的专业是计算机科学与技术，大三初期才从一位老师那听说了嵌入式系统，他为我分析了嵌入式系统的前景，这也使用决定转变专业方向投入嵌入式软件开发。在还分不清单片机和ARM之间关系的时候，就制作了这个AD转换的微系统参加学校的电子设计大赛。]]></description>
			<content:encoded><![CDATA[<p>一、概述</p>
<p>该作品主要实现了板载0~5V电压的采集并显示，以及与上位机通讯进行数据的同步显示。作品以AT89C51为中心控制各模块的运行，通过ADC0809进行A/D转换，两个八段数码管显示电压，精确到0.1V，另外通过串口与上位机进行通信，上位机既可以通过超级终端、串口调试助手等接收信息也可以使用配套的数据采集软件进行数据的同步接收。</p>
<p>由于第一次真正接触电路的设计及焊接，在电路的合理性、稳定性以及布线、降噪处理等方面都做得不是很好，外接电源也未做太多的稳压处理，形成了一定的误差，但是本电路仅作为一次练习，在精度方面也能基本满足要求。</p>
<div id="attachment_200" class="wp-caption aligncenter" style="width: 478px"><a href="http://www.stars625.com/51ad.html/51ad_main" rel="attachment wp-att-200"><img src="http://www.stars625.com/wp-content/uploads/51ad_main.jpg" alt="AT89C51 AD转换板" title="AT89C51 AD转换板" width="468" height="287" class="size-full wp-image-200" /></a><p class="wp-caption-text">AT89C51 AD转换板</p></div>
<p>二、功能说明</p>
<p>该电路由于只采集一路信号所以直接选通ADC0809，使用查询方式，判断转换是否结束。由于电路仅作演示用，对精度要求不高，遂将参考基准电压输入端直接接到VCC（Vref+）和GND(Vref-)上。在0～5V范围内的测量的精度为：5/256<0.1,完全能满足要求。</p>
<p>在本电路数码管显示时，为了简化硬件电路，将所有位的段选线相应地并联在一起，由一个单片机的8位I/O口（P0）控制，形成段选线的多路复用。而各位数码管的共阳极由单片机独立的I/O口（P2.7、P2.6）控制，顺序循环地点亮每位数码管，这样的数码管驱动方式就称为“动态扫描”。在这种方式中，虽然每一时刻只选通一位数码管，但由于人眼具有一定的“视觉残留”，只要延时时间设置恰当，便会感觉到多位数码管同时被点亮了。</p>
<p>在本系统中，PC机为上位机，也就是说，由单片机主动发送数据，PC机被动等待接收数据。打开PC机上位机通讯软件，单片机将电压信息发送给PC机。PC机成功接收到单片机发来的数据后，通过软件将接收的信息在窗口上显示出来，并同时描绘出曲线图。</p>
<p>三、程序描述</p>
<p>实验程序使用C语言编写，对控制口均在代码头部进行了宏定义方便调用，提高可读性。除了主程序之外，将延时模块、LED显示模块、数字处理模块、串口数据发送模块均独立出来，提高程序的灵活性。</p>
<p>四、操作说明</p>
<p>演示时，直接将USB口插入电脑的USB口，取5V作电源。此时，调节电位器即可调整输入电压，将数值反映在LED数码管上。如果将左边那个开关向下时，单片机即可通过串口向上位机发送数据，反之则停上向串口发送数据。如果将右边那个开关向上时，即可模拟电压表锁定电压值的功能，使采集数据停止，显示固定值。按左上角的按钮可以复位电路。</p>
<p>上位机串口通讯软件主要是由Visual Basic编写，使用9600波特率、1位开始和停止位，无校验位，通过串口1通信，并且以上信息不能更改。前电压可即时地显示当前电压值（单位：伏），电压电录可显示近期电压变化情况。</p>
<p>当前电压每300ms刷新一次，人眼不会感觉到有延时。电压记录可以显40s内的电压变化情况。</p>
<p>使用前先安装上位机软件，然后将电路的串口与电脑机联，插上USB口再打开软件即可实现通信。</p>
<div id="attachment_201" class="wp-caption aligncenter" style="width: 472px"><a href="http://www.stars625.com/51ad.html/51ad_uart" rel="attachment wp-att-201"><img src="http://www.stars625.com/wp-content/uploads/51ad_uart.jpg" alt="AD转换上位机通讯软件" title="AD转换上位机通讯软件" width="462" height="177" class="size-full wp-image-201" /></a><p class="wp-caption-text">AD转换上位机通讯软件</p></div>
<p>五、主要问题</p>
<p>第一次设计系统，就遇到了几个问题经过别人的帮助才得以解决：AT89C51存储器选择问题，默认情况下，MCU会读取扩展ROM的程序启动，要从内部启动需要将一个口拉低；设计稳定的复位电路，这点相当重要，其它资料上说得非常详细，这边就不多说了；I/O口对于LED的驱动能力问题，要不要上拉等。</p>
<p>说一下整个开发过程：首先选择项目，选了个典型的、难度不是很大的AD转换；在实验箱上调试通过，确定可行；布线、焊接，将仿真器连到电路上进行仿真试验并能过；把Bin文件写到AT89C51里，插上芯片正常运行，其中最后两步从仿真成功到真实成功还是有一些问题在里面的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/51ad.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>博客系统WordPress安装设置</title>
		<link>http://www.stars625.com/configwordpress.html</link>
		<comments>http://www.stars625.com/configwordpress.html#comments</comments>
		<pubDate>Thu, 28 May 2009 15:29:34 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[学习分享]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=71</guid>
		<description><![CDATA[网上讨论WordPress相关安装、设置方式方法的文章已经很多了，我在这过程中也参考了许多的文章，根据自己的要求和一些想法作了一些调整，在这里将这一过程中考虑的内容记录下来。]]></description>
			<content:encoded><![CDATA[<p>（以下均以WordPress2.7.1为例，WordPress简称WP）</p>
<p>1、安装完成后首先设定固定链接。为了对搜索引擎更加友好，WP可以设置伪静态链接，这里要注意几点：链接中不要包含日期，加入日期会增加链接的深度，万一文章日期变更了，以前的链接就失效了；不要包含分类目录信息，一篇文章可能有多个分类，也可能以后会合并分类等，也会导致链接失效；链接中不要包含中文，可以在新增文章时设定一个文章别名放入链接里。个人觉得我们文章一般也不会太多，取个有意义的文章别名很方便，包括自己在其它文章增加内部链接时也很方便，只要记得文章别名就能直接加入链接了。具体设置如下，在固定链接设置处选择“自定义结构”，输入/%postname%.html，最终的链接效果如下：http://www.stars625.com/configwordpress.html。</p>
<p>2、去wordpress.org模版栏目里找一个自己比较喜欢的模版装上，有点小问题没关系，自己修改。使用FireFox浏览器安装了个Web Developer插件，方便修改主题CSS。</p>
<p>3、安装插件。Add Post URL：在文章后自动添加版权信息；Akismet：评论过滤，去除广告评论，需要WP API Key，去wordpress.com申请下，国内有些用户可能无法正常访问，找个在线代理网站吧；WordPress Database Backup：数据库备份工具，因为不需要定时备份，平时禁用，要备份时启用下吧。</p>
<p>4、另外建个编辑用户用于平时常规文章操作；加一些分类目录、页面、标签等。</p>
<p>5、关于统计插件，官方提供的那个，由于需要向WordPress.com发送数据，而该网站又经常无法访问，访问速度也比较慢，影响整体网页打开速度，弃之不用；如果在后台安装一个统计工具，需要把浏览信息记录在数据库中，时间一长，数据库就会变得很大，占用资源太多不用；用Google那个分析工具，在页脚那个页面下插入JS代码似乎是个不错的选择，当然也要往Google发访问数据，不过看在Google的分析工具有强大的后盾，而且做得的确不错，可以考虑；不过目前并没有使用前几种情况，目前用的是cPanel后台的AWStat工具，因为有用户在访问Web服务器时，服务器会对每一个操作记录到Log里面去，那么可以通过这个Log来分析流量，反正这个Log是一定会记的，就用这个分析最原始，也不用加任何代码，平时也不费资源，安全稳定，只是在生成报表的时候会稍微影响一下服务器的效率，完全可以接受，就用这个方案了。</p>
<p>6、中文版的WP，安装后后台的显示有一点问题，左侧字体大小不合适，看了不舒服，去wordpress.org中文版下三个补丁文件就能解决。</p>
<p>7、关于发布文章，我个人是在本地机器上编辑好文件后，再复制到网上发布，这样也有利于归档和备份，关于WP的中文首行缩进问题，通过在模版中加入style=&#8221;text-indent:2em&#8221;实现，反正都是文字性的，也没必要是手工一个个插入缩进标签。</p>
<p>8、在底上放上了作者邮箱，把邮件地址做成图片，这样就不会被邮件地址搜集器捕获，以后也能减少点垃圾邮件。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/configwordpress.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>代码大全《Code Complete》中文第一版阅读笔记</title>
		<link>http://www.stars625.com/codecompletenote.html</link>
		<comments>http://www.stars625.com/codecompletenote.html#comments</comments>
		<pubDate>Sat, 23 May 2009 16:09:06 +0000</pubDate>
		<dc:creator>stars_625</dc:creator>
				<category><![CDATA[学习分享]]></category>
		<category><![CDATA[软件开发]]></category>

		<guid isPermaLink="false">http://www.stars625.com/?p=31</guid>
		<description><![CDATA[前阵花了点时间把《代码大全》Code Complete中文第一版看了一遍，把里面一些自己平时不太注意的，或者需要加强实践的地方摘了出来。建议大家可以把该从头到尾略读一遍，再根据自己的薄弱方面精读相应章节，目前《代码大全》已经出到第二版。]]></description>
			<content:encoded><![CDATA[<p>1、学会详细设计。在做一个项目、写程序之前进行详细设计，摒弃边想边写的做法。</p>
<p>很多人，在做一个项目前都不喜欢写详细设计，认为多此一举，浪费时间。我以前也是这么想的，一方面是觉得项目小或者根本称不上项目；另一方面，当觉得有必要写写文档的时候，最初还很认真的写写，写到中间，特别是遇到一些问题的时候就不想写了，有些东西通过文字也不太好表达。工作了，一开始也分不清基本、详细设计分别写什么东西，慢慢得写得多了，渐渐明白了两都之间的区别，当然对各自的作用也有了更深的理解，而且在写的过程中遇到的问题，也就是你写程序时会遇到的问题。</p>
<p>基本设计就是把一些功能模块列出来，模块之间的关系画一画；详细设计就要求把每个模块的实现都写出来，包括函数流程图、数据输入输出、函数变量命名、宏定义等，这样基本上两份文档也就出炉了。其实这个也就是要多写写，按文档来，以后就会了。</p>
<p>2、建立统一的错误处理。对于程序中的错误处理，做一个统一的错误处理模块，有助于出错处理。</p>
<p>这个吗，灵活运用吧，小项目上做个统一的错误处理模块开销还是比较大的。但是有一点，要提前为错误处理模块做好准备，比如在每处的错误处理模块上加个宏开关，以便Debug和Release切换。</p>
<p>3、非正式Code Check。代码写完后，尽力想什么因素可能破坏目前的模块，然后证明该情况不会发生。</p>
<p>这一点，我觉得根据不同的场合，不可能要求程序对出现的任何情况都能应付，一般把这一步放在单元测试中吧，单元测试可以用CUnit等自动化的测试框架进行；有条件的话可以在编码完成后使用静态编译工具PcLint(win)、SpLint(linux)进行测试下，如果能保证一个Waring都没有，那你的编程水平和编程风格那是相当地强；调试工具建议用GDB吧，在程序运行过程中动态修改变量值那是相当的强啊，这点我比较欣赏。</p>
<p>4、在确信正确之前不要编译。不要依赖编译器，赊望“下一次一定能成功”。</p>
<p>这个错误，我可以保证80%以上的人都会犯，即使是明知故犯，不多说了，相信我也改不了的，源于人的侥幸心理啊。</p>
<p>5、输入垃圾，不输出垃圾。程序的健状性在这里是作为优秀的程序应该总是能确保正确的输出。</p>
<p>要求对输入参数时行严格的Check，此处出现的问题应该能在单元测试中发现。</p>
<p>6、全局数据重入问题。子程序有重入问题，数据也有重入问题，防止数据在多个子程序中同时被改变。</p>
<p>多任务、多线程里典型的资源共享问题，加锁互斥访问。这里容易被忽视的是全局数据是资源、子程序是资源、子程序访问的全局变量也是资源，不要放过任何一个可以被多个进程、任务、同时访问的资源。</p>
<p>7、避免使用循环控制变量。尽量不要将循环控制变量用到其它程序的判断和使用中去。</p>
<p>这里说的重复使用，不是指循环完成后，把控制变量清零再计数等，而是指使用控制变量的记录的循环次数，放入到其它判断语句中去运用，最好添加其它Flag来进行判断吧。</p>
<p>8、合理使用递归。使用递归能使算法程序减化，但必需保证递归能中断退出。</p>
<p>递归使用要求比较高，难用，但用好了事半功倍，而且有些地方还只能用递归，如下某知名公司面试题：实现函数long strlen(char *p)，要求不使用任何变量。诸如此类的问题，当然就该题目而言是毫无意义的，花时间研究这东西不值得，即使研究出来用在程序中，影响阅读、降低效率也是没必要的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stars625.com/codecompletenote.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
