2009年12月17日星期四

设置终端窗口的大小和位置

如我的自启动选项脚本里面是如下设置的:
gnome-terminal --geometry 98x16+0-0 --hide-menubar --tab
--working-directory ~/Work/dppd_linux_dev/dhpd_cam --tab
--working-directory ~/Work/dppd_linux_dev/pddemo_sdl/src --tab
--working-directory ~/Work/rd_pdex_its/admin/iso9000/2规划阶段/

解释:
1. --geometry 98x16+0-0 设置窗口长宽为98、16个字宽, +0-0
表示窗口位置在左下角,同理,-0-0为右下角;
2. --tab 为单开个tab页,可以开多个tab页;
3. --working-directory为设定默认路径;

DM642启动过程分析

DM642复位后,芯片先从CE1空间读取1K字节的数据到内部SRAM,然后从地址0开始运行。因为一般的程序都远远大于1K字节,所以一般都是有一个二级bootloader,用它来加载主程序。Bootloader运行完后调用c_int00()来进行C运行时刻初始化,如堆栈,静态变量等,之后会调用BIOS_init,最后开始运行main函数,main函数结束后DSP/BIOS的任务管理器开始运行。

具体实现起来时要稍复杂一些,因为有一些实际问题需要考虑。
1.外部存储器一般是NOR
Flash,容量较大时,因为DM642的CE1只有1MB空间,需要使用GPIO配合的分页模式。因为GPIO的缺省值是输入,内有上拉电阻,所以bootloader需要写在最高页。DM642复位后采用最慢的读写时序。
2.Bootloader需要在有限的1K字节内完成SDRAM初始化,并将主程序搬运到内存中然后开始运行。TI的例子是用汇编写的,因为此时c的运行环境还没有初始化。其中最关键的是栈指针没有初始化,我们给它赋值后其他部分就可以用c来写,但要注意仍不能使用c库函数。

汇编部分进行栈指针初始化:
_boot_sp:
mvk .S2 0x0600, B15
mvkl .S2 _boot_loader, B0
mvkh .S2 _boot_loader, B0
b .S2 B0
nop 5

boot.c进行EMIF初始化,并分段将主程序从Flash读入SDRAM
#pragma CODE_SECTION(boot_loader, ".boot_load");

void boot_loader(){
Uint32 program_addr,size;
Uint8* src,*dest;

program_addr=0x90000404;//First Entry

//Init the EMIF interface
EMIFA_GCTL = 0x00052060;
EMIFA_CE0 = 0x00000040;
EMIFA_CE1 = 0x21E28E01; //0x11518a01
EMIFA_CE2 = 0xffffffd3;
EMIFA_CE3 = 0xffffffd3;
EMIFA_SDRAMCTL = 0x6b228000;
EMIFA_SDRAMTIM = 0x000003A9;
EMIFA_SDRAMEXT = 0x000505cd;
EMIFA_CE0SECCTL= 0x00000071;
EMIFA_CE1SECCTL= 0x00000002;
EMIFA_CE2SECCTL= 0x00000002;
EMIFA_CE3SECCTL= 0x00000002;

//Load Second Bootloader to SDRAM
size=*(Uint32*)program_addr;
while(size){
program_addr+=4;
dest=(Uint8*)(*(Uint32*)program_addr);
program_addr+=4;
src=(Uint8*)program_addr;
program_addr+=size;
if(size%4)program_addr+=4-(size%4);
while(size--){*dest++=*src++;}
size=*(Uint32*)program_addr;
}

c_int00();//Run the Second Bootloader
3.经常遇到的问题是bootloader调试时运行正常,写到flash就启动不了。这里的区别在于调试时CCS负责将程序装载到内存中,然后程序直接从c_int00()开始运行,而烧到flash就得一切靠自己了。调试这个问题的办法是CCS加载程序后,先查看内存0地址处,是否是bootloader的代码,如果不对就是linker的cmd文件或DSP/BIOS内存设置有问题,需要将bootloader放在片内SRAM中。然后让程序从0地址开始运行,看主程序是否正确地加载到内存中。
.boot_load{
boot_sp.obj
boot.obj
}>BOOT_RAM
BOOT_RAM是起始地址为0,长度1K的内部SRAM空间。
4.bootloader调试完毕后就是烧写到flash。先用TI的Hex6x将输出转换成hex文件,然后用flashburn或自己的代码烧写。Flash的头1K字节是bootloader,然后是主程序的代码段。代码的格式可以参见boot.c

关于DSP程序编译优化选项o3的问题

今天我在优化代码的时候。出现了问题。如下:
//----------------PERIPH.C---------------------
/* 读寄存器,参数 地址 返回内容*/
unsigned int ReadCMD(unsigned char addr)
{
unsigned int temp;
XCS_L();
WriteByte(0x03);
WriteByte(addr);
temp = ReadByte();
temp <<= 8;
temp += ReadByte();
XCS_H();
return temp;
}

//------------------MAIN.C-----------------
#define ReadHDAT0() ReadCMD(SPI_HDAT0)

hdat0=ReadHDAT0();//读文件帧头信息

假如我不用o3优化项。我读出的数据是正确的。但用的话,每次读出来的数据都错。而且都不相同(数值和正确的数值相差不大,可以说在正确数值下波动)。
然后我就查了对应o3的资料,书本有如下一段:
"-o3:表示最大可能优化级别。各种循环优化都执行了,并且各种文件级性质也用来改善性能。"

请问:
1、假如我要选用o3优化的话,我该怎样做才不出错?
2、o3的说明中,"各种循环优化都执行了",各种循环优化,具体怎么优化?在什么条件下?优化了些什么?
3、"各种文件级性质也用来改善性能",文件级性质指的是什么?它何以改善性能?

O3是最大的优化级别,特别对循环试图进行软件流水。优化后一些不常用的中间变量将被释放掉,优化前中间变量被定义在L2缓存里,优化后直接分配在了CPU内部寄存器里,所以这些变量将不能被看到。建议买一本DSP优化方面的书,一般讲得很清楚

很正常,采用O3优化后,少些代码会不正常,我也遇见过好几次,把C代码的方法改一下,再采用FULLL-DEBUG模式回过去看看(MIX模式)汇编确认一下。

我跑的是一个视频采集和压缩的程序,压缩用的是JPEG压缩算法, 程序在 不选-O2
或者-o3选项优化的时候,可以正常工作,而且比较稳定,但使用-o2或者-o3选项后,程序工作不稳定,会出错。而且程序在使用-o2或者-o3选项后,很多变量被优化掉了,有些语句的顺序也被调整了,调试起来也不是很方便,还需要继续研究。

程序中还使用了CSL支持库中
DAT_COPY,用于从外部SRAM中搬移数据到内部L2RAM中,没有使用-o2或者-o3选项时,DAT_COPY工作正常,
在使用-o2或者-o3选项后,DAT_COPY函数工作不正常了, 还得继续整。

肯定要使用-O3,不然全用手工优化,得把人累死。
至于错误的原因,不能怪-O3,只能说程序不严谨!
03出错,有时是用指针读写内存的错误,可以把程序分成比较小的文件,一个文件一个文件的O3,每次-O3一个文件,缩小错误的范围。
不会使用-O3的工程师,不算合格的DSP工程师。

投资之道 策略制胜

我们在面对投资决策之时就像身处一个迷宫,有太多的选择和岔路,大多数人望着目标在每个岔路口选择自己认为最近的路,而真正走出去的寥寥。问题何在?问题就出在对待投资的态度——盲目、急躁、冲动等等。而正确的对待投资的观念及策略就像一张地图,带你走的也许是百转千回的路,但那是唯一制胜的捷径。

  "兵无常势,水无常形",投资也如打仗用兵,需要根据形势的变化用灵活的策略应对之,才能立于常胜不败之地。小女不才,不善于总结提炼大的道理,今天与大家分享几个小故事共勉。

  故事一:几十年前,纽约街头有一个流浪汉偶然在街边捡到一百万美元。狂喜之后他对钱的安排采用了四种策略。第一种策略,到拉斯维加斯豪赌。结果是回到街上流浪。第二种策略,全数存入银行。结果是他花的每一分钱都来源于他的本金,通货膨胀帮他一起花。第三种策略,买入曼哈顿市中心的房子。结果是过着优越而富足的生活。第四种策略,买入量子基金。结果是富可敌国,该基金平均每年为其创造超过百分之三十的复利增长,经过几十年的累计,可怕的复利为其累计了巨额的财富。四种不同的策略成就了他今天不同的生活。在今天的世界中,财富正以自己的规律快速的增加和转移,究竟应该持有什么资产渡过漫长的岁月,穿越这个时代?在中国,我建议的策略是:买基金、买房子、买黄金以及与有钱的人待在一起。是的,股市的泡沫会破灭,楼市的泡沫亦会破灭,黄金也可能因为美元的走强而下跌,但是在漫长的岁月里,泡沫破灭后会是另一个。当然我们可以做波段,只要我们明白上面三者是可以持有穿过漫长岁月的,我们就能在恐慌蔓延时勇敢决断。

  故事二:有一位急性子的先生,由于有事需要到北京。于是他开着新买的小车出发了,在上海市中心遇上了烦人的堵车,一个小时过去了,两个小时过去了,一辆辆自行车从他身边飞驰而过。他,却寸步难行。终于他忍受不了这样等待的煎熬。跳下他的小车,就地叫卖,当场把他的小车以低得惊人的价格卖掉又买了一辆自行车向他的目的地北京进发了,骑上自行车时他心中无比畅快,终于又在前行了。可是,猜猜,何年何月才能骑到北京呢?这个故事看来很荒谬,但是在面对投资决策时,有太多这样的投资人。08年时股市低迷,大家都把主动式投资基金转化成固定收益理财产品,这不就是在把堵住的小车换自行车么?若目标选定了,就请坚持使用真正能带您到目的地的交通工具。做长期决策时需要问自己:究竟想要什么样的旅程,目的地是哪里?做短期决策时需要问自己:气球就要爆破之前,还能为之充多少气?

  故事三:07年初时2800点时,我有一位朋友开始投资股票。初涉这个市场不敢买多,投了10万元,不到一个月就赚进2万元,欣喜若狂下赶紧落袋为安。哪知股市接着往上,不甘心再次买入。这次胆子大了一些,加倍买!投入二十万,忐忑不安地观察了一阵,又赚了不少。心中开始欣赏自己,周围的看多的人群与日俱增,大家与我同在,更加大胆的加码投入!就这样市场一路涨,这位朋友一路加码投资。随着本金的不断追加以及前期投入本金的增值,6000点时几乎满仓。股市急转直下跌到4200点时,他已经分文不赚,跌回2800点时本金已经亏损掉一半。盲目随性的投资,没有策略和纪律是这位朋友失败的关键。风险与回报就像铁路平行的两边,大部分投资者的风险偏好却像钟摆,赚钱时自我膨胀,潮水退去才发现自己在裸泳。投资的大忌是感性的选择。参与投资之前运筹帷幄,制定策略,运用理性和纪律严格的执行才能成为市场长期的赢家。

  事实上,投资之道犹如在迷宫中,最近的道路并非直线而是曲折蜿蜒,若没有全局观念仅盯住眼前几尺之地,或没有退既是进的胸怀和淡定就很难走到目的地。展望2010年,应是经济复苏的整固年。也因此,很多市场人士预测明年主要的投资主线仍将围绕经济复苏进程的反复确认和整固进行,而在经济复苏不同阶段的优势行业会有较大差异,选择不同的投资策略将对投资回报起到较大的影响。至于具体的策略,对于普通的投资者而言,由于A股风格正面临转换,原先以指数型基金为代表的"傻瓜式"投资或许在未来将逐步弱化,2010年要获得好的收益,将更为考验投资者对于行业和个股的主动挖掘。如果个人的时间精力不够,也可以借助基金、券商等专业投资管理来帮助构建主题投资的组合,以期获得较好的收益。

年轻时我们不可不懂

当人们还在猜测大盘今天是否,突破,变盘的时候。
当人们还在憧憬惊天一涨的时候,
当有人昨天就买进图形走式完美的某一股票期待今天停版的时候。
市场给了我们答案,然后,我们在猜测,憧憬,在看图分析,
在我看来,我们是可笑的。
我们什么都不要做,我们只需要问我们自己这样几个问题:
1 是不是今天大盘跌了,我们所持有的企业就变坏了如果没有,那么我们就做下面的事情。
2 安静的阅读我们持有的公司的年报或者公告,或者是财务报表,甚至是所以关于这个企业的新闻,也可以是本行业的数据,历史,以及未来的发展。等待自己烦躁了就做下面的事情。
3 想想历史上有多少次的大跌,有多少次的经济危机,有多少我们所不可以预测的事件。他们对于优秀的企业产生影响了吗,还可以做下面的事情。
4 回归到我们投资的本质,生活的本质,想明白这些事情,我想是对我们有益的,我喜欢这样一句话,
巴非特之所以伟大,并不在与他在76岁时拥有400多亿美圆的财富,而在于他在很年轻的时候就想明白了很多事情,并且用一生的时间来监守。