0 1

小鱼的悲剧

沙滩上好舒服呀,软软的

我在跟海浪赛跑

前不久应海月的要求在鲜鱼店买了三条身上带有绿色光泽的鱼,因为没有吃过所以并不太知道应该怎么吃,别说我不知道,就连路上遇到的老奶奶看了,还问我:这鱼怎么吃。不过我心里有底,日本的鱼无外乎煎着吃或烤箱烤着吃。回到家海月对这漂亮的鱼非常感兴趣,于是从刮鱼鳞,给鱼开膛破肚,到上油锅,都仔仔细细观摩了一番,最后上桌,海月吃的非常香。

故事到此似乎已经结束了,其实悲剧还在后面,也许海月一直想找机会亲自实践一下吧。

大概一个月前海月在参加庙会的时候带回了三条小鱼,其中只有一条生命力比较顽强活到现在。上星期六海月和爸爸两个人在家的时候,爸爸在屋里搞电脑,海月在阳台上看小鱼。不一会海月进屋对爸爸说:把小鱼扔了吧,我不要了,它死了。海月爸爸出去一看,小鱼的鱼鳞被刮了,内脏也都被拽了出来。无疑凶手就是海月,开始海月还嘴硬想逃脱罪责。海月爸爸非常恼火,因为他一直都非常喜欢那条小鱼,每天回到家都要给他换水,喂吃的。那条小鱼还很害羞总是躲在影子下面。不知道海月爸爸采取了什么手段,使得海月乖乖认罪。海月爸爸命令海月把没吃完的饭吃光,然后乖乖去睡觉。海月为了不搞得像小鱼的下场乖乖照办了。

我回到家知道事情的经过后问海月:你就自己乖乖睡觉的。海月说:是。我又问:那爸爸对你说什么呢?海月:爸爸说要把我的肠子肚子揪出来。我听了笑得前仰后合。 

 


海月让我欢喜让我忧

手里拿的是中的奖,(每扔5个盘子进去,可抽一次奖。) 

我是大孩子了,也能一口一个。 

上星期天三个人去海边,因为沿着海边再走一段就是旋转寿司店,看看时间还早人不会很多,于是就欣然走去了。刚好海月那天有点饿,所以吃得很香。她想学大人一口吃一个时,不小心噎住了,结果又吐出一半。吐出来的东西当然看上去没什么食欲,海月说:那个我不要了。我和海月爸爸就连忙说:这个可不能浪费,一个要一百日元呢。本来也没指望她吃,没想到海月听了这话后很自觉地就拿起来吃了。我和海月爸爸都很感动,感慨海月真的长大懂事了。 

小孩子经常是时而让你激动的说不出话来,时而把你气的说不出话来。

昨天晚上很凉快室内28度睡觉很舒服,可是海月非要开风扇,吹得我和海月爸爸都头疼。结果海月爸爸跑到别的房间睡,我也对海月敬而远之,不再肯靠近她和风扇。可海月睡觉非得要我离她近点才肯睡,就这样僵持了半天,终于海月困的不行,哭着把风扇关了才睡了。 

孩子就是这样有时乖巧懂事有时调皮捣蛋,就是这样一天一天长大的。 


与虫为伴

就是用这个网

昨天收获了这样两只虫子

如此亲密接触 

今天收获一只螳螂 


海月负伤

昨天海月在外面摔了一跤,两个膝盖都受伤了,回家上了消炎药以为一会就没事了,结果抱着还是哭了一个小时。于是担心了起来,会不会伤到骨头,保险起见立刻决定去医院。因为离医院关门只剩半个小时了,抱起海月就跑。路上海月想通了:我不哭了,不太疼了。可惜海月的觉悟有些为时已晚,走到一半怎有回去之理。到了医院又是一阵撕心裂肺的哭,医生给消毒,打上绷带,看上去挺惨,其实就是擦伤了皮。今天又去医院换了药,这次只用了邦迪活动自如些了。 

 


万里晴空的日子

海月爸爸是极其不爱运动的人,每次叫他出去,他就会念叨:豪雨知时节,休息乃发生。结果就真的会下起雨来。这个周末看着万里晴空,他再念叨也没用,终于答应去电器店买电器。没想到他出发前学了几下子魔方,等车的时候也拿着魔方在我面前卖弄,结果打错了车,去了海月的出生地“舞子”----一个坐汽车20分钟左右的城市。因为那天不是很热,沿着沙滩走30分钟左右就是一个比较大的商业区。所以三个人看着风景不知不觉就走过去了。因为没有买东西的计划所以到处看热闹,海月则不停地要吃的。回家的路上海月就睡着了(海月总是在回家的汽车上睡觉)。我和海月爸爸则拖着疲惫的双腿终于爬回了家。

休息一晚第二天按计划去了电器店,是一个很大的商业区,有两家大电器店,还有各种饭店和服装店以及玩具店和百元店(就是什么都一百日元,是我最喜欢的地方)。因为海月已经懂事些了,所以我和海月一组,海月爸爸单独一组,分头逛电器店。海月爸爸又买了一个1TG大硬盘(尽管我认为家里不缺那个),海月吃了她喜欢的比萨和玉米汤,我嘛买了一件衣服,因为海月爸爸对我的原则是:可以买,就是不许问他的意见。结果在回家的路上一直后悔,买另外一件是不是会更好些。最后总结一条教训就是不买最好,又省钱又不会烦。回家的路上海月照例睡在车上,三个人拖着疲惫的身躯爬回家,不过这次三个人都有收获,所以都笑呵呵的。

左边是明石海峡大桥,右边是孙中山纪念馆

舞子沙滩

商业区的小游乐场,小恐龙200日元(人民币14元)开1分钟左右,贵呀!!

意大利料理店吃比萨


调试多重中断造成的问题

最近一直在调试一个M16C MCU的MP3播放的板子。M16C从UART端口读入周期为0.1秒的命令消息,根据命令执行Mp3播放、音量调节、播放呼叫声等功能。不执行任何命令时也会从HOST收到待机的命令。HOST发送的命令长度为13bytes,有关M16C的命令在前10bytes中,因此程序上忽视后面的3bytes。

这个简单的程序却出现一个令人头疼的问题:虽然它一直接受的是待机命令,但是却有一天一次左右的几率会启动播放呼叫声的功能,也即是说平均每接收864000次命令,大约会有一次误操作。

由于M16C的调试器年久失修,已经不能使用,只能用flash writer将添加了调试代码的编译好的程序写入芯片,然后根据调试程序通过UART端口的输出分析程序内部运作。这样的调试费时费力,而且不知道它会什么时候出问题。

于是我用Python写了两个小程序,一个用pySerial通过COM口接受调试程序发送的数据,一个用pyAudio监视呼叫声,如果出现呼叫声则录下来并且记录下发生的时刻。通过这两个小程序,逐步缩小问题出现的可能的范围,最终发现M16C内部的全局变量会出现意想不到的值:例如写全局变量music_cmd的语句只有music_cmd = receive_buffer[0] & 0x0f;这么一句,但是通过COM接受到的值却会变成0xaa这样的值。完全没有按照'&'运算符进行计算。

出现这样的问题只有两个可能:某段内存出现缓存区溢出,在汇编级别出现了问题。经过对程序的反复核查,没有发现出现缓存区溢出的现象,于是只好查看c语言编译之后的汇编语句,结果找到了原因所在。

M16C的中断服务程序有两种模式:INTERRUPT, INTERRUPT/B,前者会在执行中断时将所有的寄存器压住堆栈中,而后者则使用M16C特有的register bank,register bank是一套和正常寄存器一样的拷贝,也就是说所有的寄存器都有bank0和bank1,普通程序使用bank0,INTERRUPT/B中断服务程序使用bank1。register bank不像堆栈能保存多次中断的值,只能保存一次中断。因此它不适合多重中断,即中断服务程序中响应别的中断。而出问题的这个程序中所有的中断都用的是INTERRUPT/B模式,并且允许多重中断。这样在时钟中断处理接收到的消息时,可能会响应UART接收中断。

具体原因如下:

在时钟中断服务程序中有如下语句,由于是中断,它已经在使用bank1

music_cmd = receive_buffer[0] & 0x0f;
把它翻译成汇编,大致如下:
load _receive_buffer a
and a , 0fh
store a, _music_cmd
如果在and和store语句之间产生UART中断,则转到UART中断服务程序运行,此服务程序没有将寄存器push到堆栈之上,而是和时钟中断一样使用register bank1。在UART中断服务程序中使用寄存器a进行其它运算工作,这样当它返回时,已经改变了寄存器a的值。因此_music_cmd中出现了意想不到的值。

将所有的中断服务程序的模式都该为INTERRUPT,就解决了这个问题。这是一个典型的很难调试的问题,通过调试它总结了如下几条经验:

  • 要尽量动手写一些小工具帮助调试,写小工具可以一劳永逸,解放劳动力。
  • 当出现C语言级别找不到原因时,应该考虑查看调试编译后的汇编代码。
  • 除了程序逻辑之外,编译器的配置、内存的分配等都有可能造成BUG。

最后展示一下那个用pyAudio监视声音的小程序:

 01from pyaudio import PyAudio, paInt16
02import numpy as np
03from datetime import datetime
04import wave
05 
06 
07def save_wave_file(filename, data):
08    wf = wave.open(filename, 'wb')
09    wf.setnchannels(1)
10    wf.setsampwidth(2)
11    wf.setframerate(SAMPLING_RATE)
12    wf.writeframes("".join(data))
13    wf.close()
14 
15 
16NUM_SAMPLES = 2000
17SAMPLING_RATE = 8000
18LEVEL = 1500
19COUNT_NUM = 20
20SAVE_LENGTH = 8
21 
22pa = PyAudio()
23stream = pa.open(format=paInt16, channels=1, rate=SAMPLING_RATE, input=True, frames_per_buffer=NUM_SAMPLES)
24 
25save_count = 0
26save_buffer = []
27 
28while 1:
29    string_audio_data = stream.read(NUM_SAMPLES)
30    audio_data = np.fromstring(string_audio_data, dtype=np.short)
31    large_sample_count = np.sum( audio_data > LEVEL )
32    print np.max(audio_data)
33    if large_sample_count > COUNT_NUM:
34        save_count = SAVE_LENGTH
35    else:
36        save_count -= 1
37 
38    if save_count < 0:
39        save_count = 0
40 
41    if save_count > 0:
42        save_buffer.append( string_audio_data )
43    else:
44        if len(save_buffer) > 0:
45            filename = datetime.now().strftime("%Y-%m-%d_%H_%M_%S") + ".wav"
46            save_wave_file(filename, save_buffer)
47            save_buffer = []
48            print filename, "saved"


哲思社区的邀请链接

今天收到Zoom.Quiet在哲思社区的邀请链接,于是就注册进去看了一看。是一个社区交友的网站,有很多搞IT、开源、Python的朋友。这个社区必须得通过邀请才能注册,因此我将它的所有邀请链接放到这里,访问本博客的朋友如果有兴趣的话,可以用这些链接注册,不需要在意链接的种类,随便挑选你一个你喜欢的即可。

邀请已经全部用完。


用照片记录海月的生活

“有心栽花花不开,无心插柳柳成荫”海月在阳台上玩绿豆的时候撒了一地,

我懒得收,没想到下了两场雨后,竟然发出了豆芽。海月百思不得其解。 

到了夏季日本人都会过于兰盆节,有唱有跳还敲大鼓,海月感兴趣的是前

来参加庙会的各种摊位。 

今天比较困,手里拿着棉花糖还是打不起精神。棉花糖人民币10元左右。 

大热天非得拉着妈妈出去抓虫子,两个人回到家差点没吐血。


母亲需要学会忍耐和等待

海月小的时候很喜欢用画板画画,所以一直鼓励她用画板。但最近发现比海月大点儿的孩子已经能用笔在纸上画了,而且画的很好。可是海月因为习惯了画板所以怎么都不肯用笔画。今天想让海月用笔画一下试试看,结果搞得她直哭。最后不知怎么自己想通了,才肯用笔画,尽管画的不是很好。

给一个教训就是教育孩子要高起点,从长远打算。比如孩子吃饭,总觉得让孩子自己吃又慢又花时间,就一直喂给孩子吃,结果孩子可能到4,5岁还要喂。如果从1,2岁开始就先让孩子用手吃,然后教他用勺子,开始可能比较慢也会搞得到处都是,不过学会了就会轻松很多,也让孩子养成自理的好习惯。

教育孩子不像打扫卫生做饭,有时候需要忍耐和等待。 忍耐他目前犯的小错误,等待他自己学会或知道应该学为止。


水族馆免费

"海月"在日语里是"水母"的意思,所以这张照片就比较有意义。。。水母看水母。

海月吃刨冰,人民币18元左右,平时是不会给买的。

星期天终于和海月爸爸一起去了水族馆,因为是免费所以人特别多。有一些人很多的像亚马逊鱼馆没能看到,不过也正因为是免费所以没看到也不会觉的惋惜。虽然鱼没有看全,不过海月该买的,该吃的一个也没有省。

 


0 1