alpha add运算优化

这不是一个新的算法或者思路,如果搜索的话,会看到很多的,这个算法只是可以将尽可能的方便CPU的计算而已。

先看代码,这是ALPHA的优化算法(颜色格式:R5G6B5,Alpha最大值31):

       #define DRAW_OP_ALPHA_565(SRC, DES, ALPHA)                              \
        {                                                               \
                uint32 front =((uint32)(SRC)|((uint32)(SRC)<<16))&0x07E0F81F; \
                uint32 back =((uint32)(DES)|((uint32)(DES)<<16))&0x07E0F81F; \
                uint32 result =((((front-back)*ALPHA)>>5)+back)&0x07E0F81F; \
                DES = (uint16)(result|result>>16);                      \
        }

       

上述运算只是将数值由16位扩展到32位,然后进行统一的计算,对于R5G6B5的颜色的二进制表示:RRRRRGGGGGGBBBBB,调整为:00000GGGGGG00000RRRRR000000BBBBB

对于alpha add的计算,由于增加了上限的判断,及当颜色分量大于最大值的时候,要按最大值来进行计算,于是就进行了下面的修改:

       #define DRAW_OP_ADD_565(SRC, DES, ALPHA)                                \
        {                                                               \
                uint32 front =((uint32)(SRC)|((uint32)(SRC)<<16))&0x07E0F81F; \
                uint32 back =((uint32)(DES)|((uint32)(DES)<<16))&0x07E0F81F; \
                uint32 result =(((((front)*ALPHA)>>5)&0x07E0F81F)+back); \
                if (result & (1<<27))                                   \
                        result |=0x7E00000;                             \
                if (result & (1<<16))                                   \
                        result |=0x0FC00;                               \
                if (result & (1<<5))                                    \
                        result |=0x1F;                                  \
                result &=0x07E0F81F;                                    \
                DES = (uint16)(result|(result>>16));                    \
        }
       

相比于alpha运算,在arm的CPU上,大约增加了6条指令,考虑到arm的CPU上的指令均支持条件执行,因此,对于执行周期来说,估计可能增加4个左右的周期,相对来说,还是可以接受的。

对于alpha sub的运算,也可按照类似的优化步骤。如果谁有更好的优化方法的话,希望可以告诉我。当然,为了大部分人可以看懂,不太欢迎汇编形式

卡内基梅隆大学新生据说不再学习面向对象编程了

我是刚才从linuxeden上看到的,听到这个消息,我真为国外的大学生感到高兴。他们终于可以学习些更有用的内容了。

我并不想说面向对象编程不好或者什么其他意思,但就我对国内的大学生的计算机课程的了解来说,如果放弃了面向对象编程的话,他们就可以扔掉一些不知所云的内容了。面向对象,就像哈利×波特的魔法学校中的那个预测未来的课程一样,并非无用,但大部分都是无用的。

回忆自己刚看完面向对象的感觉(其实我看到过很多程序员都有和我类似的感觉),觉得自己不会写程序了,每一条语句都要想想这是个什么模式,是个什么定义,是否符合规范,天,考虑这么多内容还如何干活?于是,就像春晚中吃苹果的讨论一样,爱怎么写怎么写吧。当然,还有一些对我来说是比较幸运的,我先学的C,再学的汇编,然后反过来学C,学C++,我并非设计的大师或资深人士,我只是让机器更高效合理的转动起来。

幸运的是,他们开始学习面向对象的设计了,终于算是落对脚了。面向对象编程,就像中国古代女人裹脚一样。我碰到的一些夸夸其谈的一些人士,口口声声一说面向对象编程,便是C++,java,objective C等等,似乎汇编,C便没有面向对象一样,持有这种观点的人实在可笑。这只是一种设计方式,一种思考方式,而不应和具体的事情挂钩,就像艺术不等于画画一样。

另外一条新闻也让我颇觉好笑,我在不同的地方看到好几次,我不知道最初出自何处,但我最初好像是在《环球时报》上看到的,说“谷歌跌下神坛:灭掉一个公司的非竞争是自大”,里面提到了财报,提到了威胁,一个有如此危机感的公司竟然可以简单的灭亡掉?而提到“自大”,可能说的是佩吉的性格,在国人这种独裁者的控制方式下,灭掉一个公司是件很简单的事情,就是将独裁者除去,但在民主共和的情况下,则是不一样的,一个公司的存在和灭亡,不是由某个人决定的,而是由所有的工作人员劳动的一致性决定的,就像磁铁一样。有人或许说symbian是个例子,但这样说的人一定不太了解symbian现在的维护成本有多高,而维护人员又有多缺乏,symbian的前途没有几种可以选择,或者和android合作,或者和wp7合作,或者艰难维持,但不管如何,结局都是一样的,只是发生在特殊的时间,由特殊的人来做了一个特殊的决定,让人难以接受而已。

另外,恭祝gcc 4.6.0发布和C++0X标准的通过。但无论如何,面向对象似乎总算回归本位了。

自我评价

过年之后一直很忙,琐碎的事情一个接着一个,这段时间的严重睡眠不足造成的影响完全表现在脸上了。前两天忽然有人问我,你觉得自己是个什么样的人?

已经有很长时间里面没有考虑过这个问题,但简单的说,我只是一个矛盾体而已。换句话说,我并非天使,但至于你想象中的恶魔,可能要比我坏很多。

在项目的麻木摞码中,我有时间抽出一部分脑力来考虑这个问题,我是个什么样的人,将要成为什么样的人?

值得肯定的是,我不会是一个好人,虽然经过这么多年的伟光正的辛苦栽培,我并非一个大善人。大善人都有钱,或者有权,或者有某种超乎常人的能力,而我没有,我只是一个普通的人,有普通人的生活,普通人的思想,做普通人做的普通事,并为普通的事情而喜怒哀乐。是否想成为大善人?我也没有想过,也不愿意做。我的性格也不适合当大善人,那些大人物,通常都是拿得起,放的下,一杯酒解恩仇,可我不是,我看中的是过程,是前往目的地路上的风景,至于目的地是否真如自己所想,我倒不是很关心。因此,像我这样的人不可能杯酒解恩仇,而像杯酒释兵权倒是可能做的到的。

因此,我倒是个恶人了,犹如明祖那般杀人无数,让许多人去做自己的挡箭牌。但我自认为我还未能达到这样的境界。我有自己的喜乐憎恶,我喜欢那些善良的人们,那些天真的孩子,那些美好的梦想,乐于看见有情人终成眷属,妒忌那些成功的人士,厌恶那份冷漠,在一些人眼里,我或许还会卖弄能力,希望上帝的光环套在自己的头上,然后做去做恶魔的事情。我厌恶那些带着感情的有色眼睛去看待人或事的人,我告诉他们,将你放到那个位置,你如何感受?在你遇到困难或者落难之时,是否会帮助你?我无法给出答案,或许会,或许不会,每个人的困难都是不一样的,相同的困难在每个人身上也是不一样的,相同的帮助在每个人自己的眼里也并非一样,我无法在未知的情况下给出一个没有承诺的答案。因此,对于我的朋友们,只能说抱歉,我不知道答案。

这么一来,我又是个遵守承诺的人了,但我无法对自己的承诺去做保证。我只是答应尽力去做,然后自己尽力去做,或许到了最后,并未达到结果,那我只能说,我尽力了。我只能在自己最大的努力下对自己所说的话负责,但我不能保证真的如你所愿。我对我做的事情,我说的话负责,欺骗不是我的长项,我也没有打算发挥它,我想让自己的儿子也变成这样的人,因此从来没有准备去欺骗,将自己的真实去呈现,去做自己所说的事情,贡献自己的知识。我并不打算去隐瞒什么,我只是想说,真实是什么。因此,我的几乎所有的都可以分享。

但这并非说我很大度或大方,诚如我的twitter所言:”不要说我好,我将我所知道的知识共享出来是期望从你那里也能获得回报,好吧,我承认我很自私。”,如果说共享的话,我不会将自己的money之类的共享的,我乐于分享,在于我可以获得回报,无论是哪一方面的回报,我都会觉得开心,这说明,我是独立的,我影响了别人。从这一方面,我是自私的,只是我看中的和你看中的不一样而已,在你那边是个大元宝,我这边可能就是陀屎了。

但这并不意味着我视金钱如废土了,这只是衡量一个人的标准不一样而已,我只是采用了不同的方式去衡量,不同的方面所占的比重不同而已,我远没有那种视金钱如废土的气魄,而且,我看到很多这样的人,都是不缺钱的人,有一首歌的歌词不是这么说的么,“不要说你很有钱,但你不快乐”,而我正好也不是一个不缺钱的人。

我看重钱,但不会为钱而做事,就像之前所说的,我看中的是路途中的花草和感受,去体验这份愉悦,但如果无法得到的话,还是趁早另辟新路吧。在学校的时候,第一次看到“海阔。。天高。。”这句话的时候,我在考虑为什么没有人呢,于是,有了自己以后在代码注释中的名字。

在以后的生活中,我喜欢观察别人,我发现,生活中的每个人,每件事都非常的有意思,他们总是能给我各种各样的灵感。我注意到公司的门大约3个月里面必然会坏一次,注意到也有人像我一样,即使站在地图前面,看到目的地和当前所在的地方,也无法确定到底是往左走还是往右走,注意到候车站中所放的广告类型,赞助商,注意到地铁里面的男女之间的亲密程度,每件事情都有一定的必然性,然后开始思考这种必然性和未来的不确定性,这种方式不论在项目管理还是生活中都是非常有用的。

似乎扯的很远了,再回来,我具体是个什么样的人,我现在还无法评价自己,或许评价这件事,不应该是自己来做的。留给别人吧,坚持自己所想的,坚持自己所做的,坚持做自己。

imx515 apad复活记

最近运气比较差,诸事不宜。在我担心我唯一可以测试用的android真机会不会出现问题的时候,它挂了。在我看着电车为了通过缓缓逆向行驶而为它连接电线的支撑杆会不会脱掉而担心当初设计时是否考虑到这一点的时候,它也倒下了。然后就只好想办法修复自己的apad了。

我说的挂掉表现几乎是彻底的挂掉,开机仅能听到滋滋的电流声,剩下就是板砖了。拆机,dd copy,开机,还是一样。拔卡重插,无任何表现。我甚至都在考虑是不是显示屏挂掉了,要不要重新挑选了。抱着试一试的态度,看能不能进recovery模式,其实不用想也知道的,因为显示屏都没有任何反应,几乎意味着recovery模式无法启动的,老天眷顾,我只是想做最后一次的尝试,失败的话就当垃圾了。在我估计足够长的时间之后,确保正常的话已经停在了recovery模式的菜单之后,默认情况下,会停在reboot这个选项上,然后,按下确定键(机器正面的圆按钮),奇迹就这样发生了,它居然复活了。至于什么原因我也不清楚,这样的话,对于我之前做的android 2.3.1的研究出现的没有显示或者最后出现正常显示的总结出现怀疑了。然后查看了编译脚本,发现对于内核的配置几乎没有改变,还是按照默认的来,只是修改了u-boot的boot的参数,孰是孰非,我也不清楚了。

另外,推荐dd copy的时候按照这样的顺序来,先umount所有的分区,然后再dd copy,因为ubuntu默认会挂载所有的分区,如果在这样的情况下dd copy的话,很容易出现copy完之后,分区不认的情况。

imx515 android 2.3.1总结

首先说明下,这个总结不是弄出一个完美的甚至稍微正确些的rom,写出来主要是由于我个人的原因,不论是时间还是设备,都不足以让我这样折腾下去了。这里仅仅是一些自己的见解。

关于启动部分的黑屏(u-boot),从官方拿到的代码,默认的配置,似乎是没有包含驱动显示的部分,并且,默认的启动首先不是从SD卡上启动的,而是可能从网络还是什么启动的,我修改了启动的参数,将其SD卡部分提前了。代码中也强制修改了一些,主要是强制从SD卡启动。但至于有没有效果,则不清楚,因为这部分显示还是黑屏。

关于内核的配置,官方的配置和2.2中的配置有很大的不同,大概有227处(记忆中是这个数字,也可能是277),这其中,有些是2.3.1升级来的,而有些则可能是关于驱动什么的配置的,总之,我的按照最简单的方法:

调用adb pull /proc/config.gz获取设备中2.2的配置,然后复制到kernel-imx中,修改为.config(我建议做备份),然后运行make uImage,由于多出来好多新的配置,会一个一个问是否需要选择,一般情况下,我都是选择no的,而有些是需要填一些内容的,就参照官方默认的配置文件。

然后,按照官方的编译方法(这里有些不太准确,见下段),编译出来升级需要的那几个文件,关于boot,无论是boot.bin还是boot-no-padding.bin,我都建议放到SD卡中,我也不清楚到底用的是哪一个,当然还有md5文件,然后,在2.2中的3E屏幕升级所有的,重启完之后就变成2.3.1得了。由于u-boot部分无法驱动起来,因此在该部分会黑屏,然后会出现小企鹅,android的图片,然后进入系统。

在上段的不准确部分,是由于嫌编译命令太长,因此,写了一个脚本,然后自动执行,但由于android系统会在kernel编译之后再编译,是否会重新生成uImage不是很清楚,但这样的确实可以成功了。

这样做需要很大的风险,因为弄完之后就没有recovery模式了(无法进入3E屏),按键也是错误的,电池电量检查也是错误的(满电才能支持1分钟,而apad又不支持边充电边用接usb键盘),所以接下来的修正什么的都只能拆机弄了。我建议那些有能力将内置的SD卡槽移到机器旁边的人弄,像我这种电子的外行只能不断的拆机了。目前内部的那个卡可能已经部分出现了坏块之类的,而用来转换到记忆棒的转换卡片几乎要完全罢工了(我手边没有读卡器,因此用psp来做读卡器的)。

我更建议大家将自己的研究都放出来供参考,这样没必要每个感兴趣的人都要走重复的道路,不过从padbbs.net上的一些讨论来看,似乎是有限制的。