CSK.Blog--个人原创Weblog

Arduino-Lite, 轻量级且高性能的AVR固件库

一篇拖了2年多的文章...目前首发于我们RoboPeak团队网站,可以过去查看中英文版本以及最好的阅读体验。这里只是缩略版本。

RP Blog文章:

Arduino-Lite, RoboPeak使用的高效轻量级AVR库(1) -- 介绍篇

http://www.robopeak.net/blog/?p=42

Arduino-Lite, RoboPeak使用的高效轻量级AVR库(2) -- 使用篇

http://www.robopeak.net/blog/?p=70

Arduino-Lite开发参考文档

http://www.robopeak.net/blog/?p=107

我blog早先时候写的一篇相关文章:

说说我从去年9月份开始的AVR单片机学习和使用

http://www.csksoft.net/blog/post/255.html

Arduino-Lite是我们RoboPeak机器人团队开发使用的轻量级高性能AVR固件库,我们机器人小车的AVR系统中全部采用Arduino-Lite所开发。目前已经将他全部开源了,希望对各位有所帮助。

Google Code项目主页: http://code.google.com/p/arduino-lite/

简介

Arduino固件库提供了非常易于初学者使用的函数库,可以很快对AVR进行开发,即使是专业人员用这个库也会觉得便利。同时他对引脚的抽象编号也有利于固件代码的移植。不过这个库相对体积过大,性能也不理想,所以难以在产品领域使用。这就是我们开发Arduino-Lite的原因所在。

Arduino-Lite包括了2大部分

1) 改良和扩充的Arduino固件库,

提供大多数情况下大于50%的代码尺寸缩小和10倍以上的运行速度加速。同时支持更多的AVR芯片和时钟频率。使得这个库能可被用于对成本和性能敏感的产品应用中

2) 自我包含的编译开发环境

不需要安装任何第三方程序即可完成AVR的开发、下载工作。Arduino-Lite自带了avr-gcc(WINAVR),不过创建新工程非常简单,基本的文件夹复制操作即可自动产生新的工程,也不用编写和修改Makefile脚本,都是智能进行的

 

这里先给出2个直观的例子:

实现PWM输出功能:

代码类型 代码 执行所需的AVR时钟周期
Arduino analogWrite(9, pwm_val); ~80
Arduino-Lite ANALOG_WRITE(9, pwm_val); 2
Arduino-Lite PWM_SET(9, pwm_val); 1
avr-gcc直接寄存器操作 OCR01 = pwm_val; 1

可以看出,Arduino-Lite提供的函数和使用方式与Arduino非常接近,但效率上他有和直接去操作AVR寄存器性能一致。

编写一个PWM驱动LED闪烁程序的代码尺寸对比: 

  • Arduino库产生的最终代码: 2048 byte
  • Arduino-Lite产生的最终代码: 100byte

对于AVR ISP编程器的支持,Arduino-Lite支持Arduino方式的串口下载,也支持HIDboot的USB-HID下载,同时原生支持我们RoboPeak做的开源USB免驱动编程器RoboPeak USB Connector进行AVR芯片编程(见http://www.robopeak.net/blog/?p=133)。

特点和适合使用的场合

同样使用C++/C编写且基于avr-gcc编译器。但与Arduino固件库相比,Arduino-Lite有如下优势。

非常轻量级

使用Arduino-Lite的固件往往比使用Arduino固件库小了50%以上.

高效率

许多Arduino-Lite提供的与Arduino固件相同功能的函数,例如digitalWrite之Arduino-Lite版本:DIGITAL_WRITE仅使用一条AVR指令实现.

支持更多的AVR芯片和时钟频率

除了 Atmega8(A), Atmega168(PA), Atmega328(PA), Atmega1280 芯片外, Arduino-Lite 也支持以下芯片: Attiny2313, Attiny26, Atmega48(PA), Atmega88(PA)

对于时钟频率, Arduino-Lite 支持从1Mhz 至 20Mhz 的频率范围.

 

除此之外,Arduino-Lite还有如下特点:

 

自包含,无需依赖任何第三方工具/编译器/库

只要系统中带有文本编辑器,即可直接用Arduino-Lite进行AVR固件开发、编译、烧录等动作。Arduino-Lite自带了avr-gcc(WINAVR)以及相关的函数库。

灵活易与整合的编译环境,基于Make,但无需用户编写或是生成任何Makefile

创建一个新的Arduino-Lite工程,最简单的办法是将模板工程文件夹解压缩并重命名为希望的工程文件。并将相关的源代码以任何目录结构放置于工程目录下,Arduino-Lite就能编译项目,无需用户修改/编写/生成Makefile.

 

我们认为Arduino-Lite适用于以下领域

  1. 对固件代码尺寸/器件成本敏感的场合,比如需要使用Attiny或者Atmega48等小Rom尺寸的芯片的场合
  2. 对固件执行速度有较高要求的场合,比如对实时性要求较高的工控领域和机器人控制器领域
  3. 喜欢使用Make脚本、自定义IDE等的开发环境
  4. Arduino/AVR爱好者,且有一定的编程经验,不满足于Arduino IDE环境,期望更高效的固件库
  5. 希望将Arduino的简易开发特性运用于Attiny, Atmega48以及不同时钟条件下的硬件环境
相比Ardunio的固件库,Arduino-Lite或许不适合
  1. 不喜欢命令行界面、Make编译脚本的人群 (我们也有计划将Arduino-Lite支持Arduino-IDE)
  2. 希望直接使用Arduino各类第三方库,急需应用的情况

实现细节

省略,请参考RP Blog原文:http://www.robopeak.net/blog/?p=42

 

如何使用

 可以在Google code上下载已经打包好的zip包,或者直接checkout 源代码使用,具体见:http://www.robopeak.net/blog/?p=70

 

开发和配置过程都异常的简单,基本都是鼠标操作即可搞定,也无需以来别的软件、库。

 

下面有段使用RP USB Connector进行AVR烧录的视频:

(http://www.tudou.com/programs/view/Den9uh3HTHE/)

 

函数手册

 略文,详见:http://www.robopeak.net/blog/?p=107

Arduino-Lite新增函数/宏

基本IO引脚控制

PWM输出控制

模拟量采集(ADC)

睡眠和延迟

中断处理和管理

串口通讯

调试功能

文本格式化

飞信(Fetion)的Perl命令行版本

请点击标题进入正文下载附加脚本

飞信我就不多介绍了,随着网上出现了libFetion后,各类第三方飞信客户端程序就纷纷涌现,对于飞信的协议分析资料也不少。不过一直比较遗憾的是用于命令行的客户端版本不多,目前只有基于PHP的实现,同时libFetion似乎不开源,无法基于它作开发。

其实纯命令行的实现有很多优势,比如可以写一个自动天气预报脚本,每天定时运行,采集到天气信息后就可以用命令行的飞信程序发送到手机了。

我原本打算用bash script实现一个飞信客户端,不过考虑到perl几乎每个linux发行版本都自带,且处理文本更加方便,所以这个周末就参照着网上一些PHP版的飞信实现,写了一个perl版本的飞信客户端脚本。同时因为之前从没有写过perl脚本也完全不会,所以也称趁这个机会速成一把。所谓实践出真知,写了这个脚本觉得自己的perl水平应该能算中等水平:-P

因为我写这个脚本主要就是为了发送短信用,所以功能很单纯,就是用飞信给一个手机号码发送指定的文本短信息。至于例如查询好友、加好友等复杂功能我没有考虑,各位可以发挥各自想象力,在以后的脚本基础上添加即可。本程序采用GPL作为许可证。

不明真相的截图

脚本的使用和要求:

按照飞信的协议要求,脚本中需要通过HTTP协议也要通过TCP socket发送SIPC文报。后者perl提供了POSIX一致的socket规范,前者我采用了curl命令,所以请确保自身系统中安装了合适的curl。对于win32,我没有做过测试,不过相信只要有相应的win32版程序,还是可以工作的。

如果要发送中文短信,请确保自己的shell环境是采用UTF8编码的。否则请用iconv自己转换。

要发送短信,请使用下面的命令:

perlfetion.pl <绑定飞信的手机号码> <飞信密码> <发送目标手机号码> <发送的文本>

这里要注意的是参数中所有手机号码都是应当绑定了飞信帐号的,且已经和发送手机建立了飞信好友关系。否则将发送失败。

如果发送成功,将有如下回应:

$ ./perlfetion.pl 138***** ***** 138***** "Hello World!"
Retrieving the config xml...
Retrieving the SSIAPP URL...
Retrieving the SIPC Address...
Trying to get the fetion number of the current account...
Connecting to the SIPC via TCP socket...
Login OK
Send SMS succeed

为了各位调试或者了解协议详情,本脚本支持dump模式,请修改脚本,在执行前调用函数:fetion_verbose();脚本会将所有通讯文报打印至stdout。

 

topic:开发人员眼中的RIA,基于Flash实现

请点击文章标题进入正文以下载附加信息

前不久因为不少朋友对这个主题感兴趣,就在公司组里做了这个topic。主要从软件开发人员的角度来介绍flash的最新技术以及当今一些新兴的RIA应用。

整个topic主要分为下面几个部分:

1. RIA的介绍,当前状况

2. Flash的起源,内部运作模式,AVM2虚拟机构架

3. Flash10的最新应用:Pixel Blender以及3D渲染支持以及其意义

4. AS1/2/3语法比较,AIR构架

5. OpenSource Flash,Flex sdk与FD3

6. Flash和Silverlight的比较

7. Demos. 基于FlArtoolkits库的演示、现场演示制作音乐可视化特效、编译Flash实现的人脸识别程序

 

这里就把当时做topic用的ppt以及一些demo代码公布出来,其中那个音乐可视化特效会在后面花些篇幅解释下。其实我很久没接触AS3.0的东西了,很多数据和资料也是看了相关文献得到的,如果有错误或者遗漏,希望谅解,也欢迎给出纠正。

下面贴一些该topic ppt截图:

 

 

包含的Demo介绍

1. Flartoolkits 的应用

不得不承认现在AS3.0在JIT的帮助下性能的确提高了很多。以至于处理一些简单的CV都可以了。FlArtoolkits是一个基于Flash实现的artoolkits(主页介绍)库。在目前主流的计算机配置下,使用摄像头配合浏览器任何人都可以进行虚拟现实应用。这次介绍了一个Flash的虚拟鼓的应用,如下图。有摄像头的朋友可以直接去给出的链接中亲自体验。不过之前需要打印marker到一张A4纸上。大致意思就是将虚拟的3d物件影射到现实世界中,并且能和现实世界产生些“互动”。

上图以及该DEMO来源:http://www.squidder.com/2009/03/03/augmented-reality-drum-kit/

FlArtoolkit和上面这个demo都是开源的。

2. 音乐频谱的视觉化效果器

这个是我花了1个小时写的,演示了提取当前声音输出FFT频谱的功能。程序也比较简单,100行代码。比较适合新手了解Flex sdk以及FD3的使用。另外要说明的是该demo附带的音乐出自我表弟Somnia之手的WayOutWest-Melt,给他做下宣传,呵呵。

Linux下的语音天气预报脚本

请点击文章标题进入正文下载代码

这是最近我刚在家里部署的一个程序,主要功能就是在每天的特定时间(7:30 以及 18:30 )计算机将自动用中文人声朗读出当天以及后一天的天气情况/预报。天气预报的信息由程序采集自中国气象网(weather.com.cn)。如果你对此感兴趣,不妨了解下这篇文章。

其实类似的应用网上应该也不少,我完成这个应用其实大部分精力也并不是花在天气预报的采集上。而是解决如何将Windows的TTS引擎(MS SAPI)“移植”到Linux上,以及编写相关的服务框架程序。同时,这个应用实际上只是我之前提过的智能化家庭系统(IHES)的一个小应用,所以这次也会连带着发布ihes framework的一些代码(比较简陋,看过算过,哈哈)。在给出具体的程序代码之前,我将一步步介绍其中的一些细节问题,以便有兴趣的人自己实现类似的功能。

1.天气预报的抓取

前文已经提到,我使用的是weather.com.cn的数据。实际上这部分工作是通过一个bash script来完成的。从该网站抓取并提取我们需要的天气信息的一个难点是如何从内容繁多的html代码中有效的筛选我们要的内容。这里我偷了下懒,通过观察他们网站,我发现其wap版本网站内容简单,特别适合抓取:http://wap.weather.com.cn/wap/

基本除了我们需要的天气情况外,只有写简单的关于信息,而且主要都使用了文字。这里以我家所在地:上海松江为例,分析信息提取过程:

该网站wap版不同城市以及预报范围的组织很简单,仅仅通过url地址来标示,比如上海松江24小时(当天)的预报信息页面地址为:http://wap.weather.com.cn/wap/58462/h24/ 而对应的48小时天气预报(第二天)地址为:http://wap.weather.com.cn/wap/58462/h48/ 。很明显,前面的58462应当为地区的区域代码,而预报范围就是后面的h{24|48|...}。因此,实现当天以及第二天的预报提取,只要抓取这2个地址即可。

采用curl工具抓取网页

对于还不熟悉linux环境的朋友,可以在shell里面输入man curl来参看该命令相关信息。直接通过curl即可将对应html输出到stdout。

$curl http://wap.weather.com.cn/wap/58462/h24/
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="
http://www.w3.org/1999/xhtml" xml:lang="utf-8">
<head>
<title>24小时[松江]城市天气详情</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
...

接下来要做的就是仅提取出我们需要的预报信息,比如:

2009年3月15日 星期天:
[农历二月十九]:
松江  :
天气:晴 :
气温:17度到4度:
风向风力:西南风4-5级转3-4级:
紫外线指数:中等:

我做的处理首先是过滤掉所有html标签,观察curl抓取的html代码可以发现我们需要的信息没有被html tag包含,经过这一步处理,输出的文本中含有可读文字了。接下来需要将空白行去除。最后仅提取我们需要的文本所在的其实行以及终止行即可。这里采用sed过滤。这样一来,最终的处理命令为:

curl -s http://wap.weather.com.cn/wap/58462/h24/ | sed  's/<[^<]*>//g' |

sed 's/^M//g' | sed '/^[ ]*$/d' | sed 's/^.*$/&:g' | sed -n '3,9p'

这样便可得到上面要求的文本输出了。

2.Linux下部署SAPI以及TTS引擎

一定要采用SAPI主要还是因为linux下面我没找到原生的中文TTS库。因此只好想办法利用Windows下面的资源了。办法其实也很简单,用wine... 这里所说的部署,是指同样通过wine运行自己编写的windows程序调用部署在linux下的tts engine来进行朗读。实际上就是进行SAPI com组件以及需要的tts engine com组件的注册工作。这里有一个偷懒的办法:http://www.linuxdiyf.com/viewarticle.php?id=121686

接下来要做的其实就和windows下一样了,打开VC写一段SAPI的调用程序吧...

不过其实问题要复杂些,存在两个困难:

  1. 该windows程序如何与原生的linux程序/脚本交互(基于wine)
  2. SAPI依赖窗口消息,需要X-windows环境

可能对一部分人第二个并不是什么问题,不过我目前家里用作服务器的机器配置比较老,为节省资源平时完全禁用了XServer。我又没心思去修改wine来解决这个问题,所以XServer是必须启动的了,那么需要将他的资源消耗尽可能减少。而对于第一个问题,我的解决办法是将TTS发音功能做成一个C/S构架的体系。提供一个./readit的命令,该命令为linux的native程序,readit将需要朗读的文本用tcp报文发送给基于windows(wine)的server程序完成真正的合成朗读。同时我发现每次加载/结束使用sapi的程序,所在的XServer的虚拟内存都会无故增加。因此C/S构架是的server常驻系统也避免了潜在的内存泄露。还有一个好处就是在局域网内任何机器都可以调用该TTS功能。具体的实现这里就不给出了,有兴趣的可以去看源代码。文末给出了readit的linux/win32版本。我的实现中,readit支持如下2种方式调用:

./readit <Text to read>

echo "Text to read by pipe" | ./readit

后者的好处在于能够朗读超过命令行参数长度限制的文本,同时能很好的结合前面介绍的脚本。Linux需要终端设置为UTF-8编码。

对于TTS engine的选择这里就不介绍了,大家选择比较合适的版本即可(Windows自带的那个中文男声其实不怎么样),我采用了上次eArts中运用的TTS引擎。

3.部署

在上面几个问题解决后,就是部署问题了,我把天气预报获取的脚本抽象成命令GetWeather( 24 | 48 )。要朗读明天的天气,采用命令

./GetWeather 48 | readit

即可。在运行该命令前要确保我们的TTS server已经启动了。因为Server部分依赖于Wine和XServer。这里用下面命令来完成Server的加载:

X :3 -ac &

sleep 60
export DISPLAY=":3" && wine win_voice.exe  1>/dev/null 2>&1 &

其中win_voice.exe就是TTS server。可以在开机时配置该脚本。不过要注意脚本运行的当前用户要和部署TTS时,wine所在的用户要一致。

公布个我自己用的备忘录/日记系统

早在去年3月就打算写一个作为我记录日记以及当作备忘录的东西。同时又希望能通过手机访问,不希望拥有过复杂的功能。于是去年9月份左右用asp写了下面这个日志管理系统:

 

 

虽然功能很简陋,不过自己用着还行。主要有下面几个功能:

1. 支持TODO:关键字的高亮显示

2. 支持*strong*, #URL#的解析

3. 按照工作日跟踪遗漏的日志,会给出提示要求记录

4. 自动按季度进行日志存档

5. 允许创建多个日志并分别存储

6. 数据存储为xml形式

 

同时,如果希望一次性记录不同日期的日志,可以在相应日志前加上日期,系统将自动识别:

[2009-02-01]

Log of this Date

[2009-02-03]

Log of that Date

功能介绍就到此为止,如果感兴趣并打算自己部署一个的话,直接将代码放到你希望的目录即可。不过如果打算记录私人信息的话最好加上权限访问。公布的版本中是没有密码保护的。还有要澄清的是上图画面不是我正在记录的日志,是为了示意做的。

至于源代码,风格很糟糕,而且还是JS和VBS混合编程。所以关于代码就别抱怨了。呵呵。不过能帮我做些改进的话还是很感谢。

我自己基本上每天都会用这个系统写当天的日志以及做一些摘录、点子等。感觉还是很好用的。同时通过手机访问效果也很好。

说实话有了这个工具自己生活状态改变了不少,以前一直觉得活得漫无目的。后来想想大概是自己定的计划没有坚持一直时刻对照和反省。同时每天没有很好的进行当日的总结和第二天的计划。其实这些也不是因为一个工具就改变的。但毕竟有了这样一个工具,同时也坚持保持这样一种习惯,感觉还是很不错的。

人生就是要时刻提醒自己,也要时常做些记录和总结。好了,扯淡扯远了。

我的blog似乎冷清了不少,偶尔发写文章貌似回复的也不多。看来自己太堕落了,以后要重新培养时常写blog的习惯。争取本周再发布两篇文章吧,应该都会比这篇有实际内容...

差点忘记了,本文提到的系统的代码下载地址:http://www.csksoft.net/data/Log_Tracer.rar

Codename: ETH-SENSOR[Ver 0.1]

其实原本打算推迟发布的时间,不过既然有言在先,就先放出目前的版本。

我先把一些事情交待了(我有一个习惯,不会对那些已经在网站或blog上明确给出答案的问题给与回复。这次也是一样):

1.我目前还是对这个项目很不满意,因为它的完成度还是很低,从等会我列出的功能列表上就能看出。所以目前这个版本可用性不是很强,我已经打算在寒假放出一个我自己认为合格的版本。

2.这是我第一次接触GTK编程,甚至也是我第一次接触linux下的程序开发(之前只是编译过单文件的module)。所以一些不符合开源界规范的事情就请各位多多包涵。

3.整个工程从创建到提交只有5天时间(01/12/2008 - 01/16/2008),期间还有2天时间用于出国申请和考试复习(其间有2门考试),所以代码质量有一定影响,同时在后期(这是我网络课的大作业)临近作业检查时候也作了一些妥协。所以在寒假中会对那些缩水的部分加以改善

4.对于程序中尚未完成的部分或者会存在问题的部分,已经用"TODO"和"FIXME"标出了

5.本程序使用GTK+库和glade库,同时必然也使用了libpcap

6.不提供可执行版本,请自行编译(这个没啥好说的)。今后在完善后可能会考虑出rpm或者deb包

7.暂时不考虑为windows移植

8.采用的许可证是GPL

9.我开发的环境是Ubuntu 7.10, Anjuta IDE 2.3.0(unstable)

----------------------------------------------------

目前具有的功能:

1.完全图形化界面

2.基本的截包功能

3.包过滤(Layer II/III的协议过滤、端口过滤、ip地址过滤)

4.包数据察看

5.包的Decoder(采用树形结构表示,目前实现的是ethernet MAC, ARP/RARP, ICMP, IGMP, IP, UDP, TCP

6.包的保存(tcpdump兼容格式)

7.监听网卡选择

 

距离我满意还缺少的功能

1.包数据的重组

2.应用层协议的decoder

3.更完善的Filter

4.可配置的包decoder引擎

 

程序运行效果:


点击察看原始尺寸

 

再附上些开发的环境,其实用glade还是很方便的:


点击察看原始尺寸


点击察看原始尺寸

 

源代码下载:

http://www.csksoft.net/data/legacyftp/Products/code_and_lib/code_eth-sensor_src_0.01.rar

 

编译和安装

1. 使用Anjuta IDE编译

2. 采用常用的编译安装流程:

./configure

make

make install

 

 

最后再补充下,这个程序和那些商业软件或者目前常用的tcpdump还是不具有可比性的,我也不打算在功能上有所超越。不过可能今后打算做一个可配置、扩充的包解析引擎。我希望实现的效果是:改善目前linux下GUI程序缺乏的情况,毕竟就我个人而言,不是所有时候都喜欢开命令行操作的,很多时候点点按钮还是很省力的事情。

 

其实开发这个项目效率很低,就完成的功能来说,换成windows,我可能2天内就能做完,但是linux下就不同了,很多时间都浪费在研究GTK+的使用上,GTK+是个很优秀的GUI库,或许有足够好的IDE作为支撑,windows下那些都是小儿科。

 

这个项目如果将来做的好,我的计划是发布在SourceForge.net, 不过将来肯定是没时间维护的了

Linux下USB MASS STORAGE驱动的分析和改造

这原本是我这学期OS课程设计最后一次的作业,因为比较有意思,所以就把它公布出来吧。

作业要求:

开发Linux下的usb存储设备的驱动,仅需支持自己的u盘即可。

下面是我写的驱动,他基于linux下自带的usb-storage驱动(/driver/usb/storage)。仅支持基于Bulk-only传输模式下的ATAPI协议的存储设备。我使用自己的SAMSUNG D828手机的usb mass storage功能测试成功。

使用方法是insmod。

 

代码:

http://www.csksoft.net/data/legacyftp/Products/code_and_lib/csk_udisk_mgr.rar

 

下面是这次作业报告的节选,希望对需要研究usb-storage或者想自己开发linux u盘驱动(虽然那已经没有必要了)的朋友有帮助。这次报告的原文后面给出的地址。

点击原文观看详细信息

Intercessor-Super Task Manager

 

这学期Windows的大作业,和Messiah一起合作的东西。

看界面就知道他的作用了吧,是一个进程管理器,他的优点在于

直接扫描物理内存中的EPROCESS结构来获取进程列表,并且对于大部分进程信息获取工作都是直接读取内存进行了。因而理论上他可以探测大部分的隐藏进程,应该说功能还是很强劲的。

对于进程管理方面,Intercessor直接调用了内核态的NtTerminateProcess来关闭进程,所以杀伤力也很大。

 

我个人的评价是在进程显示方面比如今的Iceword差不多,而且有些方面比较人性化。同时该程序也作了防止非法关闭的处理。具体间附带的文档。

 

如果喜欢可以下载过来使用,程序使用WTL进行界面开发,体积比较小巧。

 

下载地址:http://www.csksoft.net/data/legacyftp/Products/APP/intercessor_bin.rar

 

原理和核心驱动代码下载:http://www.csksoft.net/data/legacyftp/Products/APP/Intercessor_report_src_bin.rar

 

由于这是一个课程大作业,所以今后恐怕没时间维护了,所以如果你希望继续开发完善她的话。可以试着与我联系获取源代码。但如果你是有其他目的的,那就不用来找我了。

 

MMX指令优化的32bit AlphaBlend

前一段时间再进行一个目前保密的项目:Prototype A (哈哈,知道的人不要说阿)

其中需要较高的运行效率,所以就写了一个将32bit位图渲染到目标32bit位图的AlphaBlend。支持Alpha通道。

代码指令参照了http://dev.gameres.com/Program/Visual/2D/mmxaddalpha.htm提供的代码,在此表示感谢。由于第一次写汇编优化。所以不知道这样写是不是最高效的。

如果对位深没有要求,可以采用intel提供的16bit的alphablend,网上很多了,这个号称是目前最快的.

参数:

pDest:目标渲染buffer,32bit的,通道情况:ARGB

wlined:pDest的扫描线宽(即横向的像素个数,即实际宽度/4)

hlined:pDest的扫描线行数,可以理解成实际高度

startX:pDest的开始坐标X

startY:pDest的开始坐标Y,采用倒置坐标系

pSrc:要渲染得图片,通道情况:ARGB

wlines,hlines和前面类似

Alpha:对pSrc做得整体alphaBlend,0-255级

返回:

如果图片得到渲染,返回TRUE

用在Prototype A中效果还好,采用GDI渲染一个100*100的图片可以有1000fps*

代码:

BOOL AlphaBlt(BYTE *pDest,DWORD wlined,DWORD hlined,int startX,int startY,BYTE *pSrc,DWORD wlines,DWORD hlines,DWORD Alpha)
{
 int Xd,Yd,Xs=0,Ys=0;
 int loopH,loopW;
 if (startX>=(int)wlined) return FALSE;
 if (startY>=(int)hlined) return FALSE;
 
 if (startX + (int)wlines <=0) return FALSE;
 if (startY + (int)hlines <=0) return FALSE;
 
 Xd = startX;
 Yd = startY;
 loopW = (startX + wlines);
 loopH = (startY + hlines);
 if (loopH>hlined) loopH = hlined;
 if (loopW>wlined) loopW = wlined;
 if (startX<0)
 {
  Xd = 0;
  Xs = -startX;
 }
 if (startY<0)
 {
  Yd = 0;
  Ys = -startY; 
 }
 
 DWORD factorA = hlines-Ys+Yd-1;
 for (DWORD j= Yd ; j< loopH ; j++)
 {
  DWORD dwOffSrc,dwOffDest;
  dwOffSrc = (factorA-j)*wlines;
  
  dwOffDest = (hlined-j-1)*wlined;
  DWORD srcPosX = Xs;
  for (DWORD i = Xd ; i< loopW ; i++)
  {
  
   BYTE *BufSrc = pSrc + (dwOffSrc + srcPosX)*4;
   DWORD dwSrc =((DWORD)BufSrc[3] << 24) |((DWORD)BufSrc[2] << 16) | ((WORD)BufSrc[1] << 8) | (BufSrc[0]);
   DWORD *dwpDest = (DWORD *)pDest + dwOffDest + i;
    __asm{
     pxor mm2,mm2

     mov edx,dwpDest
     movd mm0,[edx]
     movd mm1,dwSrc
     punpcklbw mm0,mm2
     punpcklbw mm1,mm2

     movq mm3,mm1
     punpckhwd mm3,mm3
     punpckhdq mm3,mm3

     movd mm4,Alpha

     punpcklwd mm4,mm4

     punpckldq mm4,mm4

     pmullw mm3,mm4 //Alpha * SrcAlpha
     psrlw mm3,8

     movq mm4,mm0

     movq mm5,mm1

     psubusw mm4,mm1

     psubusw mm5,mm0

     pmullw mm4,mm3

     pmullw mm5,mm3

     psrlw mm4,8

     psrlw mm5,8

     paddusw mm0,mm5

     psubusw mm0,mm4

     packuswb mm0,mm0


     movd [edx],mm0 //保存结果

     emms

   }


   srcPosX++;
  }
 }
 return TRUE;
}

写了个Tiger语言的IDE

编译大作业下周就要检查了,所以最近一直在完善它。不过我没时间去做真正的代码生成了,不过就目前做的东西总觉得太傻了些,所以今天集中精力写了下面这个东西:

功能和特点:
>源代码语法上色
>直接编译
>随意切换编译器
>产生图形化语法树(就是PrettyPrint)

IDE里面包括我写的tiger编译器,所以IDE可以直接运行,点击exec.bat即可
除了tiger编译器,我把IDE的所有原代码都放在一起了。 也可以把你写的编译器用于本IDE,而且不用修改任何代码也不用重新编译,只要把你编译
器的类路径放在本IDE目录下的配置文件里面,详见readme IDE会把Sytem.out.printf这类的输出,即stdout和stderr显示在ide环境里面,好比是cl
和vc ide关系

写的很匆忙,有bug多多包涵~

校内
ftp://Great_csk:public@public.sjtu.edu.cn/public-files/TigerBoxv1_csk.rar
校外:
http://www.csksoft.net/data/legacyftp/Products/APP/TigerBoxv1_csk.rar

分页:[«]1[2][3][»]

日历

<< 2015-6 >>

Sun

Mon

Tue

Wed

Thu

Fri

Sat

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

Copyright Shikai Chen 2000-2012. Powered By Z-Blog(CSK Modified)