离开妈妈

妈妈回娘家去了。她这一走却不知何时才能再回来看我了。幸好前些天分别多日的姑奶奶又回来照顾 我了,爷爷奶奶也对我关怀备至,才让我在离开妈妈的那天没有太伤心。前天我听到电脑里突然传来妈妈的叫唤声,"海月海月....“,这下我可实在是忍耐不 住了,到处找妈妈,却怎么也找不到,于是就号啕大哭起来了,谁说几个月大的孩子就不认人,不记事了。
咳!可怜我小小年纪,就经历了这许许多多的悲欢离合。

开爬,长牙

经常听人说七坐八爬九长牙,不过我好像比这个平均水平要高出来一点点。从5个月开始我就会坐了,到了第6个月,我已经坐得稳如泰山。只是因为妈妈以前很少训练我爬,因此那时我只能双手撑地,把屁股蹶起来,但是爬行的动作始终做不好。爸爸离开武汉之前总是说,如果能看到我爬就好了。爸爸走了以后,我苦练爬行,就在7个月多一点的时候,我已经能爬好几步了,前两个星期更是突飞猛进,如果没有人照看我的话,我都可以从床上爬到地上去。也正是因为我越来越灵活的身手,奶奶妈妈等对我更加不放心,好几次我都因为想站起来而把头碰到了沙发上了。

这几个星期我的小牙齿也慢慢地长出来了,无极里面说,速度就是不知不觉中婴儿长出第一颗牙齿,此话倒是不假,不过妈妈每天喂我,却没有什么感觉,爸爸突然听到我已经长牙了,兴奋得非要让妈妈掰开我的嘴巴让他看。嘿嘿,长牙了就可以吃好多好多好东西了。真馋阿,口水又止不住地流了出来。

延时音效的数据存取

RY DSP开发 2006/06/26

许多声音效果都基于延时,例如合唱(Chorus),回声(Echo),混响(Reverberation)等等。它们共同的特点就是都需要很大的存储空 间来保存最近的一段声音片断。以双声道16bit、44.1kHz的声音信号为例,如果要保存最近的0.5秒的声音信息的话,则需要88.2kB的存储空 间。DSP的内存通常都是很珍贵的,用来存放声音当然不划算,所以一般都把延时用的声音信号储存在扩展内存中(SDRAM或SRAM)。然而扩展内存的存 取速度却比DSP的内部内存慢得多,如果直接通过程序来存取扩展内存的话,将会浪费很多MIPS。这样在内存和效率上就产生了矛盾。

以前我在 C5416DSP上实现一个混响效果,每计算一个数据需要对扩展内存进行14次读操作,2次写操作,双声道的混响则需要存取32次扩展内存,一次存取扩展 内存大约需要10个DSP时钟周期,这样单单存取扩展内存一项就需要14MIPS。为了减少存取扩展内存所带来的消耗,我决定采用DMA来进行扩展内存的 存取。在每次混响计算结束之后,就启动DMA把下一次计算所需要的数据全部复制到内部内存中,并把这次计算的结果保存到扩展内存。然而5416的DMA不 能自动地支持这样复杂的复制工作,因此为了完成这32块内存的复制工作,我只能响应DMA中断32次,在每次中断时,设置下一次DMA的源地址和目标地址 (最后一次中断只是简单地停止DMA)。由于混响运算全部在内部内存上操作,因此内部内存的消耗也是很大的。我的混响程序每次处理64个数据,因此需要 64*32=2048words的内部内存。为了节省内存当然可以把每次处理的数据量减少,然而因为处理一次数据,就得为准备下一次的数据响应32次 DMA中断,若减少每次处理的数据量,将会增加DMA中断的频率。结果仍然产生了内存和效率的矛盾。

最近学习C6727,发现它的dMAX的FIFO模式彻底解决了上述问题。它可以在不产生中断的情况下连续地复制间隔的内存块,如果C5416有这个功能的话就不需要相应32次中断了。剔除了中断对DSP的影响之后,减少每次处理的数据量也不会带来额外的负担。
关于dMAX在这方面的应用的详细信息请参照:
http://www-s.ti.com/sc/psheets/spraaa5/spraaa5.pdf
http://www-s.ti.com/sc/psheets/spraaa5/spraaa5.zip


C6727开发基本完成

RY DSP开发 2006/06/20

由于是移植以前在C6713上开发的程序,因此工作量不大,到目前为止已经基本实现要求。在dMAX和McASP设置方面遇到不少问题,不过依照CSL的例子和相关文档,倒也不难解决。

这 次开发中最大的一个问题就是C6727没有数据缓存,因此它存取SDRAM时的速度就大不如C6713了。我大概测量了一下,存取100MHz的 SDRAM所需要的时间大概是On-Chip内存的30-50倍。这样,之前直接在SDRAM上进行的计算都必须修改为在On-Chip内存上执行。由于 数据量很大,不能把所有的数据都放在On-Chip内存上,因此需要计算一部分就复制一部分到On-Chip,计算完毕之后再放回到SDRAM。这样修改 之后,算法终于能够实时运行了,而且运算速度比200MHz的6713快不止1.5倍,寄存器多一倍的确不一样啊。


C6727开发---Bootloader

RY DSP开发 2006/06/12
最近这个工作是要把以前的6713上的一个程序移植到6727上,本来以为这两个芯片只有两个数字不同,应该差别不大,可是开发过程中却遇到了许多新问题。第一个重要的问题就是从flash自举。

由于6727的EMIF的地址线太少,只有13根,当要对较大的flash存储器寻址时,必须想办法确定地址的高位。硬件设计上将flash的A14- A17与DSP的HD0 – HD4相连。HD0 – HD4 属于UHPI单元,因此在启动之后第一件事情就是将HD0 – HD4设置为GPIO模式。对flash寻址的时候,先设置好GPIO这几根线,然后再读取地址0x9000xxxx中的值。

6727 从0x00000000 – 0x10000000的地址空间属于片内ROM,当DSP启动时从ROM中的0x00000000开始运行,这里面有一段程序将自动读取DSP的几根启动配置线的值,以决定采用何种方式载入程序。这个项目从flash启动,当ROM中的程序确定从flash启动之后,它读取flash中的第一个字节的数据(地址为0x90000000),若为0则表示此flash为8bit,若为1则表示为16bit,然后它进行相应的EMIF的配置,接着复制flash 中的头1024个字节到0x10000000。0x90000000 – 0x90000400 到 0x10000000 – 0x10000400,然后设置程序指针寄存器到0x10000004开始运行。

放在0x90000000 – 0x90000400的程序就是所谓的Bootloader。它负责把剩下的程序从flash复制到指定的位置,然后跳转到c_int00开始程序的执行。TI提供的Using the TMS320C672x Bootloader文档有这方面的详细介绍。但是其中推荐的启动格式是Application image script(AIS)。这和以前的6713的Boot table完全不同。为了能够识别AIS格式,1Kbyte的程序远远不够,因此TI提供的例子采用了二级启动。先由0x90000000 – 0x90000400这1Kbyte的程序将放在flash中的一个二级启动程序复制到内存中,然后运行这个二级启动程序,它分析flash中的AIS格式的数据,并将相应部分复制到内存中,然后再跳转到c_init00运行。

我觉得这样的程序写起来太复杂了,于是干脆还是用以前的那个boot table格式,和6713的程序基本相同,就是要多注意flash地址页更换的情况。