你脱我就不拍

我自己刷牙呢。其实牙齿怎么样我不在乎,主要是牙膏是甜的。呵呵

我自己坐在凳子上泡脚。好舒服呀。

来日本后,不知为什么海月总是想脱光了睡,说是睡觉其实是觉得好玩。所以一脱光就一点睡意都没有,有时搞到2点才睡。昨天她又犯老毛病,说什么都要脱光了睡。我说你要脱我就不拍也不哼歌了。她就自言自语的说:脱光了妈妈也拍,其实这是说给我听的。我不理她,让她爸爸挨着她躺下,我到另一边躺着。她就开始哭。我问她还脱不脱,她还坚持说脱。我就横下心让她哭。我说这么冷的天,脱光了感冒怎么办,可以把裤子脱了,但不能脱衣服。她爸爸也说:等到暖和了再脱。她还是不改口,坚持要脱。僵持了一会,我说你不脱我就过去拍还唱歌。她就很委屈地边哭边说:不脱了不脱了。然后我过去给她脱裤子,她说裤子也不脱,就这样搞到12点半终于睡了。
今天白天我跟她说:今天晚上不许再说要脱光了。她一听又开始很委屈地哭起来。看她那委屈的样子真的好可怜。现在还小什么都记不住,过一会就又有说有笑的了。要是长大了就要注意不能这样来硬的了,所以在她还不是很懂事的时候要改掉她的一些坏毛病。长大后尤其不能让她哭着睡着,有的孩子哭着睡觉,再醒过来就变得脑子有问题了。


憋尿、吃洗衣粉、认字

 前两天带海月去市政府办事。上公共汽车之前,我问她要不要上厕所。她开始说要然后,想想又说不要。我说上了车可就没有厕所了,她点点头,坚持说不去。后来上了车,在车上我也问她多次,我说你要是上厕所,就跟妈妈说,没关系,我们下车上了厕所再上来也可以。由于我总是问总是问,她就很生气的样子说:打妈妈。终于到了地方,我又问她要不要上厕所,她马上说去。我说:原来你一直憋着在。她点头说是。呵呵,这么小的小孩子,就知道轻重缓急了。

上星期六我洗衣服的时候,把洗衣粉露到她玩的盆子里了。被她发现,她以为是她平时吃的白白的酸奶糖,就给放到嘴里了。然后就哭了起来,要我抱 ,我也不知道是怎么回事,就抱着她做事情。结果发现她的嘴鼓鼓的,象是有东西。我问她是什么,她又不肯说。我一捏她的脸颊,便吐出来好多水。我说你吃什么了,她指指扔掉的洗衣粉,我一看愰然大悟,赶紧让她漱口。发现漱口水里还有一块洗衣粉呢。我说不好吃为什么不知道吐呢,平时吐饭的本事到哪去了。她不知声了。小孩子误吃东西还是挺危险的,要多注意。

前些日子我一直想教几个汉字让她认,首先从月亮的月开始,我说这是月亮的月也是海月的月。她根本不理我,坚持教了几天都象是不感冒,无法记住。后来我自己安慰自己说是过了学汉字的阶段了,以后自然还会学的,就放弃了。结果有一天我以前看的日语资料被她捡起来,其中正好有一首中国的诗里有月字。她兴致勃勃地指给我看说:你看月亮的月。还拿去给她爸爸看。真是的月字。呵呵,也许她觉得我教的太简单了,所以赖得理我吧。


海月回日本啦

海月已经来日本两个星期了,我们俩个之间最大的矛盾就是她的吃饭问题。每到吃饭时间对于我来说,都是一道难以逾越的难关。事实上两岁小孩都是这样,有时饭量大些,有时饭量小些,有时吃面包,有时吃蛋糕,不管吃什么只要她不饿就问题不大。我虽然明白这些道理,可每当自己精心打造的饭菜,她却不谢一顾,怎么都气不大一处来。有时冲她发发脾气,她却当做一种游戏,一到我开始喂她饭,她就讲条件似地说:你发脾气呀。

一个人照看海月还真是很累啊。平时她要睡觉的时候,都是我轻轻地拍睡着的,所以前天半夜醒来的时候,她就哭着叫妈妈拍拍。我呢,迷迷糊糊地还很着急,结果就拍拍拍,拍错了方向,拍的是另外一边呼呼大睡地老公,把他拍醒了我才发现拍错了对象。

昨天她在婴儿车上吃面包,要我给她打开动画片。我说等一下 ,她却慢不经心地说:你不开我就不吃了。本来这句话应该是我说:你不吃我就不开。什么时候被她学了去。真是哭笑不得。

看别人的孩子会认很多字了,自己就开始着急。看别人的孩子会背唐诗了,自己也要把海月和她比比。有时觉得好累呀,我辛苦点,少吃点少睡点都不成问题。这些慕名的烦恼,却让自己高兴不起来。怎样才能保持一个平常心来对待自己的孩子呢。

我问爸爸妈妈我们小时候的情况,他们很自豪地说:什么也没教过,现在不也挺好的。他们还真是知足者常乐。我也应该学着知足,对于我对于海月或许都是一种解脱。 



6727芯片的flash启动程序

RY 隐藏 2008/01/23

经常有朋友询问TI的6727芯片的flash启动程序怎么做,其实TI提供了一个二次启动的例子,具体做法可以参照http://focus.ti.com/lit/an/spraa69c/spraa69c.pdf
这篇文档很详细,如果你有耐心将其读完,采用TI的新方式做启动是再好不过了。不过如果你和我一样懒,不愿意做安装Perl,把程序做成AIS Stream,编译那个Secondary bootloader工程等等,这一系列麻烦的工作的话,那么请继续往下看。

我采用和6713时代一样的办法:在0x90000000 - 0x90000400 中放置不到 1k bytes的boot loader,载入指定位置的boot table(用hex6x将out文件转换为boot table)。

6727 有个麻烦,它的EMIF对flash空间的存取有限,需要采用其它的引脚对高位地址进行扩充,这样启动程序会复杂一些,可能导致程序大小超出1k byte,这也许是TI选择二次启动的原因之一吧。

为了节省空间,很自然想到的是采用汇编编写,不过6727的汇编实在是太麻烦了,因此我尝试用C语言编写这个boot loader。不过由于boot loader运行时尚未初始化C语言运行环境,也就是说没有堆栈可用,因此所有变量都必须采用寄存器。另外C语言编译之后的大小很可能超出1k byte,所以需要对编译器进行优化配置,我选择Size Most Critical(-ms3)对下面的程序进行编译,最终编译之后的大小约为650bytes,看来还有余地添加一些其它的功能呢。

* 当使用register变量时,编译器会先将寄存器中的原来的内容放入堆栈,由于此程序运行时堆栈还没有初始化,可能会出现意想不到的结果,因此在将机器码写入flash之前,需要将堆栈操作的几条命令手工改为NOP指令。

在调用函数时编译器不会将返回地址入栈,而是将返回地址存入寄存器B3,因此不需要担心跳转到EntryPoint时对堆栈进行操作。

01/*
02    bootloader for C6727
03    根据HD12引脚的状态载入不同的程序
04     HD12 pin = High, load from page 0
05     HD12 pin = Low , load from page 8
06     硬件设计上通过HD0 - HD3控制flash地址的高位
07    control flash page address by HD0 - HD3
08*/
09 
10/*定义SDRAM配置寄存器*/
11#define SDTIMR *(Uint32 *)0xf0000020
12#define SDSRETR *(Uint32 *)0xf000003c
13#define SDRCR *(Uint32 *)0xf000000c
14#define SDCR *(Uint32 *)0xf0000008
15 
16/* 控制flash地址的高位,根据硬件的配置不同应做适当的修改 */
17#define FLASH_SET_PAGE(X) *(Uint32 *)(0x43000014) = \
18        (*(Uint32 *)(0x43000014) & 0xfffffff0) | (X)
19 
20/* 将boot函数放在.boot_prog section */
21#pragma CODE_SECTION(bss_boot,".boot_prog")
22 
23void boot()
24{
25    /* 由于boot函数运行时尚未初始化C语言运行环境的Stack,
26    因此所有变量都采用register */
27 
28    register Uint32 * boot_dst;
29    register Uint32 * boot_src;
30    register Uint32 boot_page;
31    register Uint32 boot_ep;
32    register Int32 boot_cnt;
33 
34    /* set EMIF-A1CR-ASIZE to 16bit、flash内存的存储类型为16bit */
35    /* 根据flash的类型,可能还需要进行其它的配置 */
36    *(Uint32 *)(0xf0000010) =
37        (*(Uint32 *)(0xf0000010) & 0xfffffffc) | 0x01;
38 
39    /*为了能将程序复制到SDRAM中,进行EMIF的SDRAM相关的配置*/
40    /*应根据SDRAM芯片的类型做适当的修改*/
41    SDTIMR = 0x29114510;
42    SDSRETR = 0x00000006;
43    SDRCR = 0x00000d06;
44    SDCR = 0x00004520;
45    SDRCR = 0x000005ff;
46 
47    /* set UHPI-GPIOEN */
48    /* 使能控制 flash 地质高位的 GPIO */
49    *(Uint32 *)(0x4300000c) = 0x00000180;
50 
51    /* set UHPI-GPIODIR1 */
52    /* 设置控制 flash 地址高位的GPIO的方向 */
53    *(Uint32 *)(0x43000010) = 0x0000000f;
54 
55    /* 根据HD12的状态、配置需载入的程序所在的Page */
56    if( *(Uint32 *)(0x43000014) & 0x00001000 )
57        boot_page = 8;
58    else
59        boot_page = 0;
60     
61    FLASH_SET_PAGE(boot_page);
62     
63    /* 被载入的程序的boot table所在的地址 */
64    boot_src = (Uint32 *)(0x90000400);
65    boot_ep = *boot_src++; /* 取得 Entry point */
66    while(1){
67        boot_cnt =(Int32) *boot_src++;
68        if((Uint32)boot_src == 0x90008000){
69            boot_src = (Uint32 *)(0x90000000);
70            boot_page ++;
71            FLASH_SET_PAGE(boot_page);
72        }
73        boot_dst = (Uint32 *)(*boot_src++);
74        if((Uint32)boot_src == 0x90008000){
75            boot_src = (Uint32 *)(0x90000000);
76            boot_page ++;
77            FLASH_SET_PAGE(boot_page);
78        }
79        if(boot_cnt == 0){
80            (*(void (*)())boot_ep)(); /* 跳转到Entry point */
81        }
82        while(boot_cnt>0){
83            *boot_dst++ = *boot_src++;
84            if((Uint32)boot_src == 0x90008000){
85                boot_src = (Uint32 *)(0x90000000);
86                boot_page ++;
87                FLASH_SET_PAGE(boot_page);
88            }
89            boot_cnt -= 4;
90        }
91    }
92}