红黑伴青豆

今天在超市偶尔碰到了冷冻的青豆,99日元200g相当于人民币约16元一斤,这么一算贵还是有点贵,不过因为老公很喜欢吃青豆又比较有营养就买了一袋。以前在老家的时候没有吃过炒的青豆,这次在武汉才第一次吃到的,觉得味道还不错。武汉家里是一盘子全是青豆,在这可吃不起哟,于是就放了些木耳和胡萝卜,这样色香味就俱全了。本来家里有榨菜也可以放一点,但一考虑到榨菜比青豆还难买到就没有放。这道菜的心得就是要把青豆最后放进去,因为青豆比较容易熟些。好在这次只用了三分之一,下次注意吧。



 


做更有魅力的女人

 记得曾经有一段时间我的心总是空荡荡的,似乎人是活的而心却死了。对自己没有自信,未来生活一片昏暗。不知多少次抱着妈妈大哭,不知道还以为我怎么了,其实怎么也没怎么,就是心里难受,恨自己不争气,恨自己头脑发滞,恨自己技不如人。哭得晕天黑地,哭得义愤填膺,哭得慷慨激昂,哭到豁然开朗后,哭声会厄然而止,让妈妈迅速离开现场,继续做自己该做的事。那样的生活是痛苦的,但却是一种经历,依靠自己的力量站了起来的经历。
结婚后生活在爱的温床里,生活的昏暗也由一个人的变成两个人的,心也在良好的环境下做着匀速运动,偶尔哭哭也是有意哭给老公看的。我在想这样的生活如果可以维持下去当然好,可如果有一天老公弃我而去,或疾病缠身,或天灾人祸,那时候该怎么办。岂不是成了坍塌的房屋,这打击如何承受得了。每当想到这一点我就在有意地寻找当年的感觉,寻找让自己学会独立的动力,假想各种理由说服自己不要成为幸福生活的傀儡。

一个月很快也很慢

终于活着命回来了,有一种重获新生的感觉。不得不承认越来越不习惯国内的生活了。曾经发毒誓般地对朋友说,再过几年几年就回去,现在有点困惑,犹豫,忐忑不安。
经 过一个月的朝夕相处,女儿已经基本上承认我这个妈妈了,每次让她喊我,她虽然有的时候会杂七杂八的乱说一通,但最后总能答对,因为我拿的碗里有她想吃的山 楂片。晚上睡觉也由一看是我便哭的更猛烈起来到主动要求我抱她睡觉,实属不易,给我了做为母亲极大的满足感。也许和孩子在一起要多对她说话,可我更加喜欢 看她自己玩,看着她很投入地听音乐,手舞足蹈,直到她有求于我了,用纤细的手指一指,或主动爬到我身上,这时才是交流的机会,问问她想要什么。她现在所能 说的还很有限,而且意思也不是很清楚。当我已做为母亲的特权无数次地亲她和要求她亲我的时候,她有时会极其奋怒地与我争辩,那时我会说,等你学会了说话再 和我吵吧。有时她会张开小嘴狠狠地咬我,这是她从小一贯的作风。有时她会为了得到山楂片很不情愿地把脸送过来让我亲,渐渐地会主动要我亲她从而得到更多的 山楂片,这证明她的脑子里得确在想些什么。
我感觉似乎一离开便想不起来她的长相了,留在脑子里的还是8个月时的样子,所以我很依赖录相和照片。


人到三十

终于到30岁了。20岁的生活应该是丰富多彩的,不过对于我来说却非常简单:2年 大学,1年半在家呆着,1年半的研修生,2年的研究生,3年的工作。后6 年半的时 间都是在日本度过的。在日本的生活很简单,因此可回忆的事情也不多,几乎是一 转眼这些年就过来了。

虽然在日本的这些年对我的记忆改变的不多,可是我的身体却发生了不小的变化: 身高是不可能变的了,不过体重倒是与日俱增。日本这些年一共增长了20公斤。这 就是时间在我身上留下的最深的印迹。

人说三十而立,所谓的“立”我想大概是指成家立业吧。还好在20岁的最后3年中, 有了老婆,有了工作,有了孩子,还有了房子。然而,虽然有孩子但是养不到,虽 然有房子但是住不到,虽然有工作但是不知道能做多久,不过能有老婆天天陪在身 边倒也应该知足了。人生尚有这许多未知数,有未知数应该是件好事。今后的10年 就和老婆一起着手解决这些问题吧。

Run-time和load-time初始化

RY DSP开发 2007/03/01

在CCS的build options中的linker选项卡中,Autoinit Model有两个选项:Run-Time Autoinitialization和Load-Time Initialization。本文简单介绍一下这两个选项的区别和用法。

因为这两个选项和.cinit和.bss Section有关,所以先简单的介绍一下这两个section相关的知识。从C语言的角度来看的话,.bss section是用来存放C语言中的全局变量的。而.cinit则用来存放全局变量的初始值。例如如果有下面的全局变量buf的话,

short buf[4] = {0x01, 0x02, 0x03, 0x04};

那么buf放在.bss中,而初始值0x01, 0x02, 0x03, 0x04放在.cinit中。.cinit中储存的实际上是一个copy table,它对于每个需要初始化的全局变量,都有一个复制项与之对应,以55x系为例,上面的这段程序产生的复制项为:

00 04 00 12 34 00 00 01 00 02 00 03 00 04 
----- ----------- ------------------------
1 2 3
  1. 复制的word数
  2. 复制的目标地址,也就是buf的地址(这里假设为0x1234)
  3. 要复制的数据,也就是初始化数据0x01, 0x02, 0x03, 0x04

那么对于这个.cinit中的copy table具体由谁来完成复制操作呢,这样就有了Load-Time和Run-Time的这两个选择。

先来看看Run-Time Autoinitialization。这段英文的的意思是“运行时初始化”,实际上就是在main函数之前被运行的c_int00中的一段代码完成这个复制工作。我们知道c_int00是用来初始化C语言程序运行所需要的环境的,这个初始化的一部分就是初始化全局变量的初始值。因此在c_int00中初始化全局变量是理所当然的。

然而这样做存在一个问题:.cinit中的copy table只在c_int00中用一次,如果把它放在DSP的on chip RAM中的话,实在是太浪费了。因此通常的做法是将.cinit放到flash内存中。假设系统没有flash内存,而是采用的serial boot之类的启动方式,由别的芯片通过McBSP将DSP的程序传输到DSP中的话,我们就不得不把.cinit放到RAM中了。如果初始化数据很多的话,显然是非常浪费内存的。为了解决这个问题,可以采用Load-Time Initialization。

所谓Load-Time Initialization,就是在将程序load进DSP内存的同时,初始化.bss中的全局变量。我们以55x系列的serial boot为例来解释一下Load-Time Initialization。out文件的格式比较复杂,所以通常都是先通过hex5x工具将out文件转化为一个boot table格式的文件,然后通过DSP ROM中的boot程序接收并分析这个boot table完成各个section的初始化工作,最后跳转到c_int00运行。boot table的格式和.cinit中的copy table类似,都有复制个数,目标地址以及需要复制的数据。例如下图是hex5x产生的boot table的格式。

DSP ROM中的serial boot程序一边接收这个boot table的数据一边将数据复制到相应的地址中去。因此如果能将.cinit中的copy table转换到boot table中去的话,就不需要在c_int00中对.cinit进行操作了,也就不需要额外的内存用来储存.cinit了。只要选择了Load-Time Initialization选项,这个工作就都由计算机自动完成了。我们来看看它具体是如何做的。

当以Load-Time Initialization方式对项目进行link的时候,linker会在输出的out文件中的.cinit的section header中添加一个STYP_COPY标签。这个标签会改变hex5x工具对这个section的操作。也就是说当hex5x发现某个section header中有STYP_COPY标签的话,它就把这个section中的数据当作copy table一项一项添加到boot table中去了。因此最终产生的boot table不是将整个.cinit复制到DSP的内存中,而是将.cinit中的每个复制项复制到.bss相应的位置。这样就在boot load的同时完成了全局变量的初始化工作。