显示标签为“Embedded”的博文。显示所有博文
显示标签为“Embedded”的博文。显示所有博文

2008年10月31日星期五

Busybox移植

今天做了一个Busybox的移植实验。
我使用的是Busybox 1.7.0
编译器使用的是arm-linux-gcc 3.4.1。
编译Busybox有很多选项,但是以下的几步是必须要做的,剩下的选项自己看着进行勾选。
首先修改Makefile在175行和176行,本来是
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
修改成
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
然后执行make menuconfig 进入Busybox Settings,然后进入Installation Options,然后勾选
[*] Don't use /usr
然后在Linux Module Utilities配置项中,因为我使用linux2.6内核,所以我取消
[*] Support version 2.2.x to 2.4.x Linux kernels选项,让这个选项变成这样
[ ] Support version 2.2.x to 2.4.x Linux kernels
在Miscellaneous Utilities配置项中,取消[*] taskset 的选中状态,让它变成这样
[ ] taskset

因为我使用glibc库,如果想编译成静态的,那么需要在Busybox Settings选项中的Build Options子选项中选择使用静态链接,然后
把applet目录下applet.c文件中如下的一堆注释掉就可以开始编译了
#if ENABLE_STATIC && defined(__GLIBC__) && !defined(__UCLIBC__)
#warning Static linking against glibc produces buggy executables
#warning (glibc does not cope well with ld --gc-sections).
#warning See sources.redhat.com/bugzilla/show_bug.cgi?id=3400
#warning Note that glibc is unsuitable for static linking anyway.
#warning If you still want to do it, remove -Wl,--gc-sections
#warning from top-level Makefile and remove this warning.
#error Aborting compilation.
#endif

然后进行其他的配置,保存配置后,执行make和make install两条命令就可以在_install目录下得到需要的东西了。

2008年10月30日星期四

miniGUI编译小记

因为项目需要,但是目前暂时又没有开发板,所有想在PC机上搭建一个miniGUI的开发环境。
首先是安装qvfb了,因为我用的ubuntu,所以,简单,sudo apt-get install qt3-dev-tools-embedded 就好了,接下来要编译miniGUI。
参考网络文章:http://blog.iyi.cn/hily/archives/2006/09/miniguii386.html,下载了那几个包,这篇文章写的也玄乎,这里会出错哪里会出错的。果不如其然,make一下一堆的错误,奇奇怪怪,其中一个是 keyboard.h:43: error: 说是缺少')'还是什么的,晕,改了半天都没用,后来去网上找半天,找到这一篇:http://www.lyore.cn/blog/read-205.html,不过我觉得他的解决办法是不是也很麻烦,我直接把那些个ushort定义了 typedef unsigned short ushort; 就好了。还有一个错误是说什么重复定义还是什么的,开始我用gcc 4.2进行编译的时候我的解决办法是把那个.c文件中的那个结构体定义删除了,不过后来我还是换用gcc 3.4进行编译,这个错误变成一个警告了。后来编译例子的时候,又出错,“libmingui.so: unreference to function 'pthread_kill_other_threads_np'”错误,这还是minigui代码线程库使用问题,解决办法是在minigui解压路径下,使用"grep -r pthread_kill_other_threads_np *"查找所有包含该函数的调用,然后注释掉。最后重新编译即可。

编译这东西真是累啊,也不知道那个作者是怎么编译成功的……

其实原因就是因为编译器的原因了,gcc的开发人员不知道怎么回事,总得搞个向后兼容才对呀-_-!

(本来这篇文章应该7月16号贴上来的,因为那天的网络原因,所以把文章保存与一文本文档中,今天被我不小心翻出来所以就贴上来了)

2008年8月14日星期四

sqlite在ARM7+uclinux上的移植

下载源码:
http://www.sqlite.org/sqlite-amalgamation-3_6_1.zip
http://www.sqlite.org/sqlite-source-3_6_1.zip
下面的包我们只用到shell.c,
把shell.c从sqlite-source-3_6_1.zip中解压出来和从sqlite-amalgamation-3_6_1.zip中解压出来的三个源文件放在一起。

编译:(我用的是博创的UP-NETARM 3000)
[CODE]
arm-uclibc-gcc *.c -c -g -O2 -D__linux__ -DSQLITE_OMIT_LOAD_EXTENSION -I/uclinux/uClinux-2.4.x/include -I/uclinux/uClibc-0.9.19/include -fno-builtin -nostartfiles
arm-uclibc-gcc *.o -Wall -elf2flt -static  -L/uclinux/uClibc-0.9.19/lib -lc -lpthread -o sqlite3
[/CODE]

好了,把sqlite3拷到开发板上去就可以用了

2008年8月3日星期日

发现Keil uVision 3 for C51 bug一只

今天早上7点20才睡。 -_-!

原因是我一整晚都在调试一个单片机程序,本来一个非常简单的程序,但是却一直有问题,整晚都抓狂的很,不过最终问题的答案找到了,是

编译器的bug ! 我的汗啊……

贴出我的源码:
1, main.c :
[code:c]
#include "kernel.h"
#include "stdio.h"

unsigned char print_timer = NO_TASK ;
int print ()
{
printf ( "i am in print \n" ) ;
}
void flash_led ()
{
printf ("flash \n" ) ;
}

void reg()
{
static bit f = 1 ;
if ( f )
{
if ( print_timer == NO_TASK )
{
print_timer = reg_task ( print, 40 ) ;
printf(" task create seccess ! id : %d \n", (int)print_timer ) ;
}
}
else
{
unreg_task ( &print_timer ) ;
printf (" task print has been unreg ! \n" ) ;
}
f = ~f ;
}

void main()
{
SBUF = ' ' ;
kernel_init () ;
//reg_task ( flash_led, 40 ) ;
reg_task ( flash_led, 400 ) ;
reg_task ( reg, 80 ) ;
while (1) ;
}
[/code]

2, kernel.c :
[code:c]
#include "kernel.h"
void kernel_init ()
{
TMOD |=0x01;
PT0=1; //设置定时器的优先级高,精确定时
TH0=0x9e; //40HZ,25ms kernel freq
TL0=0x57;
EA = 1 ;
ET0=1; //允许定时器0中断
TR0=1; // 核心定时器运行
}

static TASK funp[MAX_TASK+1] = { (TASK)0 } ; //存放函数地址
static int freq[MAX_TASK+1] = { (int)0 } ; // 每隔多少个25ms运行一次
static int counter = 1 ;
static int max_id = 0 ;

int reg_task ( TASK t, int f ) // 定时器的时间是 time*25ms
{
disable_kernel ;
if ( (max_id == MAX_TASK) || (f==0) || (t==(TASK)0) )
{
enable_kernel ;
return 0 ;
}
max_id ++ ;
funp[max_id] = (TASK)t ;
freq[max_id] = f ;
enable_kernel ;
return max_id ;
}

void unreg_task ( int * task_id )
{
int id ;
disable_kernel ;
id = *task_id ;
if ( id == 0 )
{
enable_kernel ;
return ; // 没有0这个任务,不用注销任务
}
funp[id] = funp[max_id] ;
freq[id] = freq[max_id] ;
max_id -- ;
*task_id = 0 ; // 这样在外面检测任务ID的时候,显示为0,表示这个任务不存在。
enable_kernel ;
}

void time_0_kernel() interrupt 1 //using 2 但是为什么我不能切换寄存器组呢????一旦去掉注释,输出结果马上不同
{
int id ;
ET0 = 0; // 禁用中断
if ( counter++ == 26400 ) counter = 1 ; // 最长定时器为一个小时
//定时器任务调度
id = max_id ;
while ( id )
{
if ( freq[id] > 0 )
if ( (counter%freq[id]) == 0 )
(funp[id])() ;

id -- ;
}
TH0=0x9e; //40HZ,25ms kernel freq
TL0=0x57;
ET0 = 1 ; // 开启定时器中断
}
[/code]

3, kernel.h :
[code:c]
#ifndef MY_KERNEL_H
#define MY_KERNEL_H


#include "REGX51.H"
#include "stdio.h"
#include "intrins.h"

#define disable_interrupt ( EA = 0 )
#define enable_interrupt ( EA = 1 )
#define disable_kernel (TR0 = 0 )
#define enable_kernel ( TR0 = 1 )

#define MAX_TASK 6

typedef void ( * TASK ) () ;
void kernel_init () ;
int reg_task ( TASK timer_task, int time ) ;
void unreg_task ( int * id ) ;

#endif
[/code]

上面是没有问题的代码可以在Keil uVison3 for 51 中仿真运行,结果如图:

src='http://music.blogcn.com/wp-content/uploads/154/15462/2008/08/right_result.jpg' alt='right_result.jpg' />

但是,如果我把 kernel.c中的那个注释去掉,即我切换寄存器组,马上就会出问题。输出的结果立即不同 :

src='http://music.blogcn.com/wp-content/uploads/154/15462/2008/08/wrong_result.jpg' alt='wrong_result.jpg' />

这甚至只是错误结果的一种,因为还有好几种输出情况,但都是错误的。

一开始我以为是我切换寄存器有问题,不能切换,但是我找半天也找不到不能切换的理由,而是找到要切换的理由:我可以省下8字节的堆栈空

间。怎么想都得不到答案,最后我拼了,把它反汇编之后从汇编指令一条条查看,最后发现错误的原因在这里:

src='http://music.blogcn.com/wp-content/uploads/154/15462/2008/08/keil_bug.JPG' alt='keil_bug.JPG' />

下面我来分析一下这几行汇编指令:
这一段代码的目的是把我传递过来的函数指针值存放在适当的地方,这样,适当

时候我可以从这个地方取出函数指针,并进行函数调用。
这里编译器设置把函数地址存放在2AH开始后的一个数组里,因为在keil C51里一

个函数指针占用三个字节,第一个字节存放的是指针类型,第二个和第三个字节

分别存放高位和地位的地址。所以,第一个函数的地址存放在2BH(高位)和2CH(低

位),第二个就存放在2EH和2FH了,依次类推。

第1行 : 把我传递过来的函数指针值的高位存到寄存器R2
第2行 : 把我传递过来的函数指针值的低位存到寄存器R1
第3行 : 3FH里存放的是函数指针值数组的偏移量,把偏移量赋值给A
第4行 : 把每个地址占用的长度赋值给B
第5行 : 做一个乘法,得到的结果就是A,其中就是我现在应该存放函数指针值

的地址的偏移量
第6行 : 把得到的偏移量加上数组的基址2AH得到最终应该存放的地址
第7行 : 把地址值给R0,即将用R0做寄存器寻址之用
第8行 : 把该指针的类型值(存放在13H)先存入
第9行 : 寄存器指针指向下一个字节
第10行: 把函数指针值的高位存入
第11行: 寄存器指针指向下一个字节
第12行: 把函数指针值的低位存入

如果只看我的注释的话是一点问题也没有的,如果你看代码就应该发现一点不对劲了,在第10行和第12行,分别把函数指针值的高位和地位存

入,而函数指针值的高位和地方在前面两行就暂存在了R2和R1中,所以这个时候应该用:
MOV @R0, R2和MOV @R0, R1才对吧?对,这是最保险的,但是图中编译器生成的代码如果使用的是寄存器第0组的话也是没有问题的,因为第0

组的R2和R1地址就是02H和01H,但是目前的问题是,我已经切换了寄存器组,所以应该用R2和R1才是对的。我不知道编译器这个时候在耍什么

小聪明,好好的R2和R1不用,用绝对地址来表示。

找到问题的原因后,通过直接修改汇编代码,程序又成功运行了。

这个时候是早上四点半,接着上网和jerome聊了会天,五点半了,细细刷刷,6点了,开电视看,七点二十,睡了……

八点四十又起来了,因为我一天多没去实验室,据说今天要调试,我就过去了,不一会儿,调试完毕,写篇日志,睡了……

2007年9月29日星期六

MC9S08QG8

因为ARM核对于我这种小菜鸟来说,立刻入门确实是有点难度,于是我把计划学习时间加长了,并且想先学习一段时间freescale的s12系列或者atmel的AVR单片机,一是为了开阔一下视野,而是学习嵌入式在线开发的方法。

       刚好飞锐泰克有免费派送仿真器的活动,马上就申请一个。虽然派送的是8位的单片机,但是开发环境和方法与s12对比都没有变,所以就也很开心。

        昨天,喔,不对(看看现在时间),应该是前天早上,收到了飞锐泰克派送的BDM仿真器,收到的时候很兴奋,但是一拆开包装,傻眼了,那个仿真器还有demo的小目标板小的跟mp3似的。尤其是那个demo的小板,小到我竟然不知道这是一块单片机的最小系统板,因为事先不知道派送的型号,以至于没有认出来那块小板上的那个长的像普通74芯片的那个东西原来就是一块单片机!

         认真的把那块芯片对着光看了看,得到该芯片型号为MC9S08QG8,到查了下资料,发现这片芯片的资源的丰富程度,完全出乎我的意料之外:
MC9S08QG8/QG4产品特性
基于HCS08内核
在高于2.1V时,时钟频率高达20MHz (总线10MHz),最短指令执行时间为100ns。在低于2.1V时,时钟频率为16MHz(总线8MHz)
8K 和 4K的可编程闪存选择
同步和异步的串行外围设备(SPI、IIC、SCI)
带温度传感器的8通道10位模数转换器(ADC)
模拟比较器模块(ACMP)
2通道定时器/PWM模块(TPM)和8位模数定时器模块(MTIM)
8脚键盘中断模块,极性可由软件选择的边沿或边沿/电平模式
包含锁频环(FLL)的内部时钟源模块(ICS)
支持外部时钟源的外部振荡器
系统保护功能,例如低电压检测(LVD)、上电复位(POR)、带独立振荡器的计算机运行正常(COP)计数器
背景调试系统,具有实时总线捕捉功能的内置在线仿真(ICE)

价格和供货信息
此8位微控制器的建议零售价格:MC9S08QG4为0.89美元,MC9S08QG8为0.99美元。
该芯片的价格也是意料之外的。

        兴奋了一个白天,想把设备连接起来测试一下看是否正常,却找不到一个电源,到前天半夜三更,才做成实验,确实是很兴奋。因为调试一次性成功,并且开发环境也很和我胃口,就是大名鼎鼎的codewarrior:我对这个软件充满了好的印象,除了其体积超级庞大之外。

        freescale的东西做的真不错。freescale的嵌入式学习中心更是好地方:http://www.embeddedlearningcenter.com  居然提供免费的网络在线实时仿真(需要java支持),我这里因为网速比较慢一点的原因,体验有点不好。不过这确实是一个好东西,以至于你可以不用买开发板,就可以免费学习freescale的任意款式的嵌入式处理器。

       那么接下来的一小段时间,我会以研究MC9S08QG8为主,ARM暂时先放一放。

2007年9月23日星期日

Embedded学习进展

既然已经规划好了,那么更加有必要的事情当然是监督自己去执行。

      (先说成果会比较增加自己的自信心)首先,对java语言已经有了一个总体的了解,不得不说的是,java真的是一门糟糕的语言,在我的理解,java能够如此流行的关键因素是“java语言结合了C语言的简单和C++对C的改进的优点,并且抛弃了C++里面的很多复杂的东西,使语言更加的简单”(自己概括的,不要到处乱抄),但是简单的后果就是java的运行的低效和语言功能的弱小,比不上C++强大,甚至跟C也是没法比,因为它甚至连指针都不要了,真是失败。记得当年学C语言的时候,老师说C的最大的优势就是指针,当时我也不觉得指针有什么神奇的,不过后来自己慢慢领悟之后,发现指针真的是绝好的东西啊。没想到到了java居然有人说:“Java语言的一个优点就是取消了指针的概念 ”。晕倒,这是说什么嘛。

      第二个成果,《C++ primer》看到186页,感觉还不错。

      警钟:《ARM微控制器基础与实践》这本书才看到39页,并且没有看其他的关于ARM的书。这样的速度真的是让人感到伤心。

ps:想买一块ARM7的开发板,价格528RMB,好贵哦。但是大家都说学习这个花点钱是值得的,因为学成以后就……哈哈哈哈
有没有高手鉴别下这个块板好不好:http://www.hzlitai.com.cn/product/ARM7/sys44B0/2006101120.html
另外还要买一本书:《嵌入式系统设计与开发实例详解——基于ARM的应用》

2007年9月17日星期一

好的适用于初学者学习ARM的书太少啦

这段时间,图书馆有关嵌入式的书全部被我翻了下,发现有关ARM的书本来就少,要谈起经典来,那是没有。

     有网友推荐一本《ARM体系结构与编程》,我借回来看了下,晕死:整本书的例程不管长的短的,加起来不知道有没有10个,全部是理论,这书怎么看啊?

       自己发现一本书稍微还算可以看的是周立功的《ARM微控制器基础与实践》,不过整个书的体系结构太糟糕了。

      不是说崇洋媚外,像这种专业书籍,真的只能看英文原版或者翻译过来的,国人的“著名教授”、“大师”写的都不能看。遗憾的是,还没有在图书馆或者书店看到中译本的国外关于ARM的著作。

      唉,只能自己慢慢地、再慢慢地研究了。

2007年9月14日星期五

Advanced RISC Machines

题目很漂亮,呵呵。

题目的所写就是ARM。

      这个学期开始,学习ARM的嵌入式开发,如果顺利的话,我以后估计就靠这个吃饭了,祝我成功!

      很强大的东西:

(注:这门课是我自己加的,学校是不学的,所以遇到了问题,陷入了困境,现实生活中没人可以帮我.。多么孤独的远行……)

电子时代的“苦力工”

注意这里的“苦力工”加了双引号,这里双引号的意思不是说这是假的,而是想强调这个事实。

      作为一名准电子行业的小孩,还是很有必要了解一些东西的。

      索尼为什么失去创新的奇迹

      注意看最后一句话。

      现实就是这么残忍,电子行业没有创新只能做苦力啊。

2007年9月7日星期五

Private: 没有属于我的“索尼杯”

      四天三夜,结果是没有结果,这样的结果留下的阴影,我很难抹去,让团队合作去死吧!要不我就一个人把所有的事情做完,要不别人的完成与否不关我事,BOSS自然去处置。否则绝不接受水平低于我两倍以上的人与我一起团队合作。


      熬了三个通宵,把所有后来证实可行的方案提出之后,在程序写完之后,没有机会给我一个证明自我的机会,也就没有我的索尼杯。我不爽!我非常在意!


     我是i eager,但是团队中其他人只是i want,我想我更伤心。


      一个暑假的努力!唉,这样的事情可以逼迫森林狼的狼王都要从新选择!


(记于2007年全国大学生电子设计竞赛“成功参赛”之后)

2007年8月28日星期二

一种新总线的诞生–IPLUSC

Microstar问说为什么叫单片机不叫双片机呢?答案是单片机即一片芯片尽可能几种所有功能。

      简单点讲单片机(MCU)其实就是一台微型个人电脑,里面集成了了处理器、内存、“硬盘”、“网卡”,可以接入“显示器”、键盘、“声卡”。怎么样,是不是完完全全的一台电脑?

      这台“电脑”只要5块钱一片,比你的手掌要小上几倍。

      但是有的时候,单片机不够用,就像Google的服务器都需要分布式运算一样,我也想把多片单片机通信起来,组建一个网络。虽然单片机自带“网卡”,但是实话,那个串行网卡不好用。

      在参考I2C通信协议后。经过多天的分析,并于今天实验成功了一种新的总线标准,我把它命名为 IPLUSC 总线,成功实现两片单片机之间的通信,按照我的设计,这种通信标准可以连接 255X255 片主机或者更多。实现多主机通信。而目前网上流传的软件模拟I2C通信的程序只适合模拟I2C主机的情况。如果这台主机不带I2C接口,并且想成为从机的话是做不到的。

      这个总线标准暂时处于测试阶段,如果稳定性和速度以及简便性足够的话,我会把它做成一个库文件提供下载的。

2007年8月19日星期日

写程序多严谨都不为过

上次我们做写的电机控制程序控制带霍尔传感器的电机转速时,电机的转速一直突破不了45转每秒。当时想了N久都没有答案,当时老师的要求是最高40转每秒,所以后来就没去想这个问题。

      刚刚在写控制水温的程序,顺带看了下上次控制电机转速的程序,终于明白了上面这个问题的答案。

      这一段是电机控制系统里摘录下来的。



if(pwm_time_h>60) pwm_time_h=60;
else if(pwm_time_h<1) pwm_time_h=0;




      问题就出在pwm_time_h>60) pwm_time_h=60;这里我用的是十进制的60!!!也就是十六进制的3C,而我的本意是十六进制的60,也就是十进制的96!!!!!

  终于知道控制电机转速时只有电机可达到转速的三分之二的原因了!!!

      写程序一定要严谨。以后一定多加注意。

2007年8月12日星期日

感想——本文不谈技术问题

本文不谈技术问题,希望看到本文的读者可以把它看完啊。

 关于PID算法调节PWM控制电机转速实验:
      实验要求:设计一个电机转速控制系统,并且带有输入输出设备,输入一个预定的速度,30秒钟之内控制电机到达预定速度,误差不能大于“0.1转/秒”,并且实时的把电机速度通过显示设备显示出来。

      第二个课题其实不算是太难,可是我却花了N多的时间,导致这一段时间上网、体育活动、溜达的时间大为减少,整天就是对着个电脑(但是没心思和没时间上网)。

      其实就是PID算法这个东西啦,花了我N多时间。具体原因是我不知道PID算法是什么东西,可是要调节电机的转速用PID算法是比较好的方法,于是我查资料,问老师,问同学,得到的答案无非是“比列调节、积分调节、微分调节”。我就很郁闷了,我们实验室里大部分人都是用汇编语言编程,可是用汇编语言怎么算积分微分呢?没人可以告诉我。(后来想想,这个跟装神秘的性质是一样的)虽然我是用C语言编程,但是要写出一个积分表达式或者一个微分表达式也是非常困难的事情。于是我就放弃了这种经典的方法,我想自己想一种算法来控制电机,但是我不是神,PID算法这么经典的东西,我如果在几天之类就想出更好的算法我就不在这里混了。方法是有的,但是不能精确的控制转速到“0.1转/秒”。

2007年8月2日星期四

七天后:第一个课题终于成功了!

算算啊。除去从7.23到7.26这三天算玩。从7.26开始到今天中午。也算是忙活了五六天了。终于把第一课题做完了!

      这其中最烦的一段时间烦的却是一些莫须有的问题。

      比如前天晚上发现LED显示出来的数字是乱码,比如我需要显示6,它却显示一个3!真的很莫名奇妙。后来害得我把整个程序的显示部分全部改了。但是今天我才发现原来一组驱动显示的排线插反了是显示错误的原因,当时如果把排线拔出然后反向插入就行了。害得我改程序,然后调试几乎又多用了4个小时,这四个小时是我这几天来最最郁闷的四个小时。因为我完全不知道到底是哪里错了。唉,仅仅是一根线插反了!

      又比如今天早上突然发现系统的硬件复位键按下去后系统不复位。经过老师指点才知道原来用仿真机是不能复位的,我们于是把烧录好的芯片插入,但是依然是不复位。忙活了一个上午后,老师过来检查,发现原来是芯片没有完全插好!

      两个不是问题的问题使我痛苦的忙活了一整天!

      第一个课题很重要,不仅仅是对我们这几天学习的检验。更重要的是我们必须做出来,因为如果第一个课题都做不出来的话,那么……买张火车票回家消夏算了吧。

      这一关就这样的走过来。那么电子设计大赛,我也正式的宣布我来了!

2007年7月27日星期五

Private: 看来,要通宵了

正在做一个A/D、D/A转换。

从12点开始写程序写到现在啊。还没完……

出来冒个泡。顺带泡一杯茉莉花茶,很特别的是,其中加了一颗红枣。

茉莉花茶很甜。看来,今天晚上要通宵了。(早上8点钟要去实验室呢)

ps:正在听一首歌 水木年华 《别哭,我最爱的人》 特别值得关注的是,歌词很不错。

其中有一句是这样说的“这世界,我曾经来过”。

其实我更有感触想表达我的感想是:这世界,我曾经爱过。
[fmp]mydata/do_not_cry.mp3[/fmp]

2007年7月21日星期六

我很有可能又一次的站在了人生的转折点上

刚刚在文科梯形教室开完了“全国电子竞赛动员大会”。

(小声的说句,其实我很想知道如果黑板上写的不是电子竞赛而是电子竞技,那么场面有多壮观啊……)

前几天一直在思考的一个问题,就是暑假要不要回去。谢天谢地,我终于不用去思考这个比量子力学还要难上几倍的问题了,因为我决定不回去了。因为7.23就开始培训上课了。

老师的演讲虽然不是很有文采,但是很有激情。比如说获奖的同学找工作是如何的容易,老板又是如何欣赏他们的素质,就算没有获奖,能力也大为提升。以至于我很想马上在实验室通宵一个月把我不懂的东西统统学完。当然也就决定暑假在学校充电啦。在这里要说声抱歉的是,爸爸妈妈,今年暑假我不能回家看你们了,还有姐姐,同学。还有那些等我回去打街机的游戏兄弟们,看来今年的西天取经路上,少了我白龙马啊(偶就喜欢选白龙马,要不小龙女也成。)。

比赛是按小组报名的,三人一组。我们这组都是精英啊(废话,否则我就不要混了)。可是有头牛逼居然先行回家了,说家里有事情,过几天才来,我倒无所谓,被老师知道了直接取消资格我就跟你拼命[emot]anger[/emot]。

W剑一直在跟我强调叫我要坚持一个暑假,不能半途而废,不能中途回家。是的,我想我不会因为我个人的意志原因离开的。我也希望我们这一组能坚持下去。

也许人生就因为一个暑假而改变呢。

ps:些这篇日志用的是happytiger的新本本,感觉就是不一样。但是Vista系统、IE7真垃圾,一个小时崩溃十多次。[url=http://www.ieager.com/read.php/120.htm]第五呼吸道呼吸困难[/url]。