母亲节

知道怀上我的时候,妈妈哭了。她并不是因喜悦而激动,而是因为爸爸妈妈对养孩子没有任何心理准备,对未来的家庭生活感到无助和彷徨。然而几次透过超声波图像看到小小的我之后,妈妈变得越来越像妈妈了。

她可以和爸爸就我的极其不清楚超声波照片讨论半天我的模样;可以为了我的营养而不顾自己纤细苗条的身材;可以为我一时懒惰没有踢她肚子而担心半天。

也许妈妈为孩子所付出的辛苦只有做妈妈的人才能真正理解,爸爸说生我的那天情景他终生都不会忘记。生孩子只是一时的痛苦,而养孩子却要操一辈子的心。妈妈原本是个大大咧咧的人,但是对我她可是细心得无比周到。洗澡、喂奶、打预防针......,不知道她度过了多少个不眠的夜晚,为我操了多少心,现在我刚刚七个多月,妈妈已经比怀我之前还瘦了。

还有一个月妈妈也要离开我了,但是我知道她的心永远会和我在一起。在此母亲节之际,向妈妈送上一句衷心的问候,妈妈,你辛苦了。

爸爸回日本了

这几天我最开心的时候,就是妈妈抱着我,爸爸逗着我的时候。爸爸只要用手指头对我一指,我就会咯咯地笑个不停。爸爸的假期一天天地过去,他总是说,如果能在回日本之前看到我爬就心满意足了。可是他终究没能如愿以偿,昨天爸爸从上海打电话回武汉的时候,妈妈才告诉爸爸他走了以后,我就爬起来了,第一次虽然只爬了两三步,可是这毕竟是我人生的第一步呀,没能让爸爸看到真是太可惜了。

今天爸爸已经到了日本的家里,他说他看到我留下的婴儿车、玩具以及尿布等等东西,就感到一阵地心酸,于是赶紧把这些东西都给收了起来。

下午爸爸用MSN和妈妈聊天,我听到了爸爸的声音,就迫不及待地要和爸爸说几句话:我在爷爷奶奶这里过得很好的,下次你回来的时候,我都会走会跑会叫你爸爸了。

到家

爸爸妈妈一直都担心我这么大一点点坐飞机一定会很吃亏的,可是事实证明当我们一家三口顺利到达武汉的家的时候,我是最最精神的一个。奶奶早就堵在楼下,我一下出租车她就把我抢在怀中,对爸爸确是几乎是熟视无睹。

一到家我自然地成为了家庭的中心,这个抱了那个抱,搞得我头两天机会都没有机会学爬。奶奶更是问寒问暖,怕这怕那,生怕我有一点点不如意,这下我就放心了,我可以好好地在武汉茁壮成长了。

昨天,爸爸妈妈把我带到附近的妇幼保健医院咨询打预防针的事情,我在家是个宝,在那里是根草。仅仅为了抽点血检验肝炎,就在我头上和胳膊上各扎了一针,无论你如何大喊大叫那两位护士就是不撒手,还是妈妈求情才让我休息了一会儿。谁叫咱们中国人多呢,谁也不把个小孩当回事。

C6727的板子到了

RY DSP开发 2006/05/26

期待已久的C6727的板子终于到了,C6727果然厉害,同样是300MHz的芯片,C6727看上去大概只有C6713的1/4,且功能更加强大。由 于C6727太新,需要升级SD的emulator的驱动程序。可是即使升级了,仍然无法连接,找了半天文档,终于发现说要让XDS510USB emulator正确识别C672x的芯片,必须编辑windows\system32\sdopts.cfg文件,找到EmuFirmware = sdxds510usb_v10_1.out这一行,去掉前面的注释。这样emulator就可以正确连接C6727了。

接下来又遇到一个问题, Build Options下的Target Version最高只能设置到C671x (-mv6710),看来还得升级,找了半天文档,发现要正确编译C6727的程序,必须使用Code Generation Tools v5.3.0,赶紧上网寻找最新的升级包,升级之后,Target Version就可以设置为C67x+ (-mv67p)了。
C6727的CSL(chip support library)也必须自己下载,此CSL和以前的CSL区别很大,最好不要放在CCS的目录下,我把它直接放在工程文件的目录下了。

C6727的变化很大,例如它已经没有DMA或者EDMA了,取而代之的是DMAX,也没有了McBSP,取而代之的是3个McASP。看来要在这个芯片上实现声音的输入输出还得费一番功夫呢。


两种比较特殊的断点

RY DSP开发 2006/05/24

在CCS中可以设置多种断点,给艰难的调试工作带来了许多方便。选择Debug菜单下的Breakpoints…选项,就可以打开断点设置窗口。

在Breakpoint type中选择所需要的断点类型,下面详细举例介绍一下我常用的两种断点:

break on data write: 在DSP写数据存储区中的某个地址时中断程序执行。这个在调试缓冲区溢出等BUG时经常可以用到。有时候DSP常常出现一些不可捉摸的错误,很多情况下是 因为数组越界,把不该修改的地址修改了。有一次我的程序偶尔会出现CF卡不能读取的错误,经过跟踪调试发现保存磁盘0扇区信息的内存被修改了。由于这段内 存只在启动的时候写一次,其后只是读取其中的信息,为了找出是什么程序修改了它,我就设置了break on data write断点。这样当程序被中断的时候,就找到了罪魁祸首。经过一些分析发现原来是一段完全不相干的SRC程序的错误。它出错的时候,正好会改写保存0 扇区的那段内存。

Break on Prog read: 当DSP读取某个地址的代码(读取程序空间的内容)的时中断程序运行。一般情况下这种断点用不上,因为可以直接在程序旁边设置断点。但是如果程 序是放在flash中,则不能直接设置断点了,只能使用Break on Prog read。有一个项目我使用了自己编写的boot load程序,当DSP需要更换自己的程序时,就跳转到flash中执行这段boot load程序,它再根据设置从flash中载入相应的程序。这样DSP就可以不同的功能之间切换,如果把这些功能写成一个程序的话,DSP的内存是装不下 的。为了调试这段boot load程序,我大量地用到了Break on Prog read。


C5509A的IDLE用法

RY DSP开发 2006/05/16

在C5509A的那个项目中,当DSP通过I2C从MCU接收到SLEEP命令时,需要进入休眠状态。一旦进入休眠状态,DSP就停在IDLE语句之上, 不再往下运行,也无法再通过I2C获取命令了,因此硬件设计上,将DSP的INT0和MCU相连,由MCU通过对DSP产生INT0中断而唤醒DSP。 DSP被唤醒之后,继续运行IDLE下面的语句。休眠程序的具体步骤如下:

1.    设置ICR的各个Bit为1,1表示此Bit所对应的模块将进入休眠状态。
2.    设置IMR寄存器,禁止不相关的中断,只允许INT0中断。
3.    执行IDLE汇编语句,使DSP进入休眠状态。当运行IDLE时,DSP将ICR中的设置复制到ISTR寄存器中,ISTR则实际控制各个模块是否休眠。
4.    当产生INT0中断之后,ISTR中的CLKGENIS和CPUIS Bit将自动清零,也就说时钟模块和CPU模块将中止休眠,这样DSP就可以开始运行IDLE之后的语句了。注意,此时的别的模块仍然处于休眠状态。
5.    清除ICR的各个Bit,并再次运行IDLE语句,这将把ISTR寄存器中的各位清零,使得DSP的各个模块都中止休眠。
6.    重新配置DMA,McBSP等模块。

上述的步骤5尤其重要,一开始我以为当DSP收到INT0中断之后,将自动全部中止休眠,结果尝试多次都无法恢复休眠前的状态。仔细阅读了TMS320C55x DSP Peripherals Overview之后才把这个问题搞明白。

在5509A DSK上测试上述代码时还遇到一个小问题。DSK板子上有个WAKE UP的按钮,但是按下它之后会向DSP产生什么中断不得而知,经阅读文档 TMS320VC5509A DSK Technical Reference 2.1.7节之后才知道原来需要设置CPLD的寄存器(INT REG),奇怪的是DSK的源程序dsk5509.h中居然没有这个寄存器的定义,于是干脆自己直接写这个寄存器:*((Uint16 *)0x3F0007) = 0x0001; 设置为1表示采用INT0中断。