2008年12月25日星期四
Socket程序之平台差异:windows vs linux
windows下winsock.h或winsock2.h
linux下netinet/in.h(大部分都在这儿),unistd.h(close函数在这儿),sys/socket.h(在in.h里已经包含了,可以省了)
2)初始化
windows下需要用WSAStartup启动Ws2_32.lib,并且要用#pragma comment(lib,"Ws2_32")来告知编译器链接该lib。
linux下不需要
3)关闭socket
windows下closesocket(...)
linux下close(...)
4)类型
windows下SOCKET
linux下int(我喜欢用long,这样保证是4byte,因为-1我总喜欢写成0xFFFF)
5)获取错误码
windows下getlasterror()/WSAGetLastError()
linux下,未能成功执行的socket操作会返回-1;如果包含了errno.h,就会设置errno变量
6)设置非阻塞
windows下ioctlsocket()
linux下fcntl(),需要头文件fcntl.h
7)send函数最后一个参数
windows下一般设置为0
linux下最好设置为MSG_NOSIGNAL,如果不设置,在发送出错后有可能会导致程序退出
8)毫秒级时间获取
windows下GetTickCount()
linux下gettimeofday()
9)多线程
windows下包含process.h,使用_beginthread和_endthread
linux下包含pthread.h,使用pthread_create和pthread_exit
10)用IP定义一个地址(sockaddr_in的结构的区别)
windows下addr_var.sin_addr.S_un.S_addr
linux下addr_var.sin_addr.s_addr
而且Winsock里最后那个32bit的S_addr也有几个以联合(Union)的形式与它共享内存空间的成员变量(便于以其他方式赋值),而Linux的Socket没有这个联合,就是一个32bit的s_addr。遇到那种得到了是4个char的IP的形式(比如127一个,0一个,0一个和1一个共四个char),WinSock可以直接用4个S_b来赋值到S_addr里,而在Linux下,可以用边向左移位(一下8bit,共四下)边相加的方法赋值。
11)异常处理
linux下当连接断开,还发数据的时候,不仅send()的返回值会有反映,而且还会像系统发送一个异常消息,如果不作处理,系统会出BrokePipe,程序会退出。为此,send()函数的最后一个参数可以设MSG_NOSIGNAL,禁止send()函数向系统发送异常消息。
2008年12月23日星期二
巴菲特警言
If something can't go on forever, it will end.
(70%在纽约证交所的股票永远消失了,这也是中国的未来。这句话是他从物理学变通过来的, "不永远运动的,就会停止".价值投资每年的全美60人聚会,包括大家一起听爱因斯坦的相对论。因为价值投资相信,知识是不可以用专业分割的。中国的大学,最擅长培养会微积分的高分低能人士。这种人缺乏从A直接跳到Z的能力。缺乏从物理/数学/文学/艺术跳到股票的能力. 微软和IBM的第一轮面试,考你"北京有多少个百万富豪",就是为了消灭这些"什么都会,就是不会思考的人",这种人回答是"我不知道", 这种人也不会爱艺术。)
1988年年报 时间是杰出企业的朋友,平庸企业的敌人。
(是的,有的股票现在在3000点呢,讨论上证是多么的无聊,甚至可以列入幼稚)
1989年年报 当发现自己处在洞穴中时,你要做的第一件事就是停止挖掘。
1990年年报 在错误的道路上,奔跑也没有用。
(插一句,奔跑也没有用,大喊大叫也没有用)
1993年年报 可口可乐在1890年时整个公司大约值2000美元今天它的市值为500亿美元。如某个人在1890年时买该公司股票时,有人可能会对他说:"我们将会有两次世界大战,会有1907年的大崩盘。是不是最好等一等?"我们不能犯这个错误。
1994年年会 几乎在任何领域,专业人员取得的成就明显地高于门外汉。但在金钱的管理上往往并非如此。
(呵呵, 你们天天看到失败的专业人士)
1994年12月6日投资的基本思想是:把股票当作企业来看待,利用市场波动来取得优势,寻找安全的余地。这是本.格雷厄姆教导我们的……百年以后,这仍将是投资的基石.
( 是的,波动在BS模型里是风险,在价值投资却是优势。你能3折买赤湾,这难道会风险更大吗?)
1994年12月6日如果你一生中找到三个杰出的企业,你就会变得非常富裕。
(同意, 继续努力中)
1996年年会 1986年我的最大的成就就是没有做任何蠢事。诀窍是当没有合适的事情可做时,就什么也不做。
(对,永远呆在市场上是错的,空仓比止损境界高多了)
广泛引用购买股票很简单。你要做的事情是按低于企业内在价值的价格购买一家企业的股票,如该企业管理层诚实可靠、有能力,那么你就永远持有这些股票。
(注意,他说的是永远)
1990年8月6日 近年来,我的投资重点已经转移。我们不想以最便宜的价格买最糟糕的家具,我们要的是按合理的价格买最好的家具。
(好股就一个字:贵)
投资并非一个智商为160的人就一定能击败智商为130的人的游戏。
(看第一句的评论,中国从来就培养只会数学的白痴)
" 市场先生"是你的仆人,而不是你的向导。
(这是投机和投资的一个明显区别,投机的往往说自己"对市场有敬畏之心",而投资人士把Mr.Market"市场先生"当成神经质的家伙,被他引导,只会一起疯。所以,我们利用"市场先生", 我们无视噪音。)
在别人贪婪时恐惧,在别人恐惧时贪婪。
(反向就是价值的源泉,但是反向不代表你是价值投资)
从短期来看,股市是一个投票机;而从长期来看,股市是一个称重机。
(老师的话)
价格是你所付出的,价值是你所得到的。
(上大学的学费,是价格,大学教育是价值。价格和价值是不等的。
我宁要模糊的正确,也不要精确的错误。
(我以前很爱技术指标, 就是精确的错误.)
对于大多数投资者而言,重要的不是他知道什么,而是清醒地知道自己不知道什么。如果你不愿意拥有一家股票10年,那就不要考虑拥有它十分钟。
(买股票不是买个代码)
于每一笔投资,你都应当有勇气和信心将你净资产的10%以上投入。
2008年12月22日星期一
Linux下Opera中文输入问题及中文字体设置解决方案
1.请用 Qt4 版本 Opera,或 Qt3 版本 Opera
2.执行 sudo sed -i '2aexport QT_IM_MODULE=xim' /usr/bin/opera
以上方法 只能 在屏幕左下角 显示 输入框 ,不能 跟随光标 移动。(暂时的解决方案)
2. Linux下Opera字体设置
在Linux下使用Opera浏览中文页面时经常会发生字体混乱的问题。具体来说就是在一行中文中大部分都是宋体但是有时会蹦出来几个楷体字而且字号偏小显示模糊。
这一问题的产生和Opera的字体调用机制有关,解决起来也不难。Linux下Opera的字体配置文件是目录/usr/share/opera/ini下的font.ini文件,用VI编辑器打开该文件,找到“Know fonts that solves specific problems”项,修改包含“chinese-s good try-first”的条目如下family:WenQuanYi Bitmap Song=chinese-s good try-first,如果使用微软的SimSun字体(最好不要用,牵扯版权问题)相应的将WenQuanYi Bitmap Song替换为SimSun即可。 而后将上下的japanese和korean条目注释掉。完成上述修改后,重启Opera即可。
2008年12月16日星期二
【转帖】我的FPGA学习历程
FPGA,已经有一段时间了,从开始的茫然,到后来的疯狂看书,设计开发板,调电路,练习各种FPGA实例,到最后能独立完成项目,一路走来,感受颇多,拿出来和大家分享,顺便介绍下自己的一点经验所得,希望对初学者有所帮助。
废话不说了,下面进入正题,学习FPGA我主要经历了这么几个阶段:
①、Verilog语言的学习,熟悉Verilog语言的各种语法。
②、FPGA的学习,熟悉QuartusII软件的各种功能,各种逻辑算法设计,接口模块(RS232,LCD,VGA,SPI,I2c等)的设计,时序分析,硬件优化等,自己开始设计简单的FPGA板子。
③、NiosII的学习,熟悉NiosII的开发流程,熟悉开发软件(SOPC,NiosII IDE),了解NiosII的基本结构,设计NiosII开发板,编写NiosII C语言程序,调试板子各模块功能。
先来说说第一个阶段,现在主要的硬件描述语言有VHDL,Verilog两种,在本科时老师一般教VHDL,不过现在
Verilog用的人越来越多,其更容易上手(与C语言语法比较类似),也更灵活,现在的IC设计基本都用Verilog。像systemC,systemVerilog之类的应该还在萌芽阶段,以后可能会有较大发展。鉴于以上原因我选择了Verilog作为我学习的硬件描述语言。
其实有C语言的基础,学起Verilog的语言很简单,关键要有并行的概念,所有的module,assign,always都是并行的,这一点与软件语言有明显不同。这里推荐几本评价比较好的学习Verilog的书籍:
①、《verilog 数字系统设计教程》,这本书对于入门是一本很好的书,通俗易懂,让人很快上手,它里面的例子也不错。但本书对于资源优化方面的编程没有多少涉及到。
②、《设计与验证Verilog HDL》,这本书虽然比较薄,但是相当精辟,讲解的也很深入,很多概念看了这本书有种豁然开朗的感觉,呵呵。
学习Verilog其实不用看很多书,基本的语法部分大家都一样,关键是要自己会灵活应用,多做练习。
Verilog语言学了一段时间,感觉自己可以编点东西,希望自己编的程序在板子上运行看看结果,下面就介绍我学习的第二个阶段。
刚开始我拿了实验室一块CPLD的开发板做练习,熟悉QuartusII的各种功能,比如IP的调用,各种约束设置,时序分析,Logiclock设计方法等,不过做到后面发现CPLD的资源不太够(没有内嵌的RAM、不能用SignalTapII,LE太少等),而实验室没有FPGA开发板,所以就萌生了自己做FPGA开发板的意图,刚好Cadence我也学的差不多了,就花了几天时间主要研究了FPGA配置电路的设计,在板子上做了Jtag和AS下载口,在做了几个用户按键和LED,其他的口全部引出作为IO口,电路比较简单,板子焊好后一调就通了(心里那个爽啊...)。我选的FPGA是cycloneII系列的EP2C5,资源比以前的FPGA多了好几倍,还有PLL,内嵌的RAM,可以试试SignalTapII,用内嵌的逻辑分析仪测试引脚波形,对于FPGA的调试,逻辑分析仪是至关重要的。利用这块板子我完成了项目中的几个主要功能:RS232通信,指令译码,配置DDS,AD数据高速缓存,电子开关状态设置等,在实践中学习起来真的比平时快很多,用到什么学什么动力更大。这个时候我主要看的数据有这几本感觉比较好:
①、《Altera FPGA/CPLD 设计(基础篇)》:讲解一些基本的FPGA设计技术,以及QuartusII中各个工具的用法(IP,RTL,SignalProbe,SignalTapII,Timing Closure Floorplan,chip Editor等),对于入门非常好。
②、《Altera FPGA/CPLD 设计(高级篇)》:讲解了一些高级工具的应用,LogicLock,时序约束很分析,设计优化,也讲述了一些硬件编程的思想,作为提高用。
③、《FPGA设计指南--器件,工具和流程》:这本书看了他的目录忍不住就买了,这本书讲述了FPGA设计的各个方面,虽然每个方面都是点到为止,但能让你有个整体的概念,了解FPGA的所有设计功能,了解FPGA开发的整个流程。
④、在这里也推荐几个学习FPGA比较好的论坛
http://www.edacn.net/bbs
http://www.eetop.cn/
⑤、其实最好的学习网站莫过于Altera的官方网站www.altera.com,不过很多人一看到英语就不想看,其实上面的英文很简单,很多时候不敢看是因为对自己没信心或心静不下来看。不过官方网站上资料很多,刚开始可能会觉得资料安排的有点乱,不方便查找,以后有时间我列个资料的链接目录,整理一下,方便大家查找。
到这里,自己最FPGA的学习有一段时间了,练习了很多实例,自己也编写了不少程序,也有了一些项目经验,算是对FPGA有些了解了。在不断的学习中发现FPGA不仅可以做逻辑设计,算法设计等,还能做嵌入式开发,altera先后开发了Nios,NiosII两款FPGA的嵌入式软核,并有配套的软件,刚开始看到这些我真是心中突然豁然开朗,学习真的是无止境,又一个全新的领域摆在我面前,我决定学习NiosII,要学就要学最好。
刚开始入门是很痛苦的,嵌入式设计需要从硬件到驱动到软件全部熟悉,硬件系统问题还不是很大(以前做过单片机,DSP等MCU),处理器的架构心里还有点数,对于驱动和软件工程,刚开始学习真的很头痛。NiosII应该还算比较新的内容(应该是2004年出的),国内的书籍不算很多,网上这方面的资料也比较零碎,所以我就开始将Altera网站上这方面的资料系统的看一边,这里推荐几本网站上的handbook:
①、Embedded Design Handbook
②、Nios II Processor Reference Handbook
③、Nios II Software Developer's Handbook
④、Quartus II Handbook, Volume 4: SOPC Builder
⑤、Quartus II Handbook, Volume 5: Embedded Peripherals
看完这些handbook,总算基本明白整个架构,软硬件设计方法,驱动的编写等,感觉自己可以编一些嵌入式的程序了,不过虽然前面做的那块ep2c5的板子支持NiosII系统,不过对于嵌入式设计来说还是显得单薄了一点,没有SDRAM,Flash这两个比较基本的模块,Ep2C5内嵌的RAM太小,程序写不大,而且每次总要绞尽脑汁优化程序代码大小,很多时候优化了后函数功能会受到限制,不利于初学者,也不利于调试。所以到这里我有产生了自己做一块Nios开发板的想法(直接买比较贵,自己做便宜,而且还能锻炼自己,一举两得),通过借鉴其他开发板,选择自己开发板上需要包含什么模块,确定各个模块使用什么芯片,阅读各个芯片的datasheet,画出原理图并做出PCB图,这块板子我选的是Ep2c8Q208,比上一块资源又将近多了一倍,板子上还有以下模块:SDRAM,Flash,EPCS4,RS232,USB,VGA,PS2,AD,DA,LCD等,满足了一般开发板的配置要求。板子回来以后调试了四五天,(flash工作了,LCD显示了,RS232通了,USB通了,AD,DA工作了,SDRAM正常了...),真是每天都有惊喜,每个模块都编写了NiosII软件测试程序,调试硬件的时候对软件的运行也更熟悉了。在这次调试的过程中真的学到了很多,为此专门写了好几页调试笔记,下次拿出来和大家一起分享。现在硬件平台有了,NiosII也了解的差不多了,终于可以自己编写一些规模大一点的程序了。
以后的路还很长,不过也有很多惊喜在等着我们......
2008年12月15日星期一
TI DSP/BIOS线程比较
| 硬件中断 | 软件中断 | 任务 |
触发 | 外部异步事件 | SWI函数 | TSK模块,动态调度抢占 |
优先级 | 最高 | 高 | 次高 |
主要特征 | 200Khz左右,应对硬件信号进行响应,时间要求苛刻,步骤简单,处理快速,非阻塞程序 | 100ms以上事件,除非被更高级别中断抢占,会一直执行至完毕 | 拥有多任务间通信和同步手段,一个任务可以挂起等待某一资源的有效 |
堆栈使用 | 使用系统栈 | 使用系统栈 | 每个任务具有自己大运行时栈,用于保存局部变量和调用嵌套函数 |
优点 | 响应快,应对关键任务 | 时间要求不苛刻,减少了中断禁止时间,中断函数相对独立 | 时间要求不苛刻,减少了中断禁止时间,中断函数要求复杂,更有效利用共享数据 |
其他注解 | CLK函数,每个定时器中断末尾执行 | PRD函数,定时器中断或其他事件多次计数后执行 | 拥有队列,信号灯,邮箱等机制用于任务间同步和通信 |
TI的DSP的动态加载
动态加载说到底就是预先进行了重新位, 里面所有的跳转和调用语句都是按照运行位置进行编译的, 而不是按照load位置. 这样, 我们可以将程序放在任何地方,甚至硬盘里面, 到时候需要的时候, 只要加载到固定的位置即可.因此, 可以建立一种类似于传统的OS. 只是有很多限制.
这一点和传统的操作系统有不同的地方就是: 传统的操作系统加载的文件一般都有重定位表, 在加载的时候,需要将这个重定位表中每一项所对应的位置地方的偏移量(一般都是绝对偏移)等按照当前实际位置进行修改;对于具有export 函数功能的文件, 可能需要建立一个表格, 甚至修改系统的函数入口地址映射表, 这样别的文件才能找到当前加载的函数.
动态加载有三种方法: 在CCS2.2之后,一般采用cmd文件中定义union和group的方法来建立各个动态加载项的run位置和load位置,以及各自大小. 这种方式需要我们采用DMA的方式进行手动将需要的程序段加载到运行区域. 而在ccs3.0里面,提出了一种更简洁的建立这个run和load位置的方法, 并且提供相应的传输函数. 这些都很类似.
有一点值得指出: 在函数中使用的时候, 必须定义成指针的形式, 否则将找不到定义的符号.
DM642的中断处理
2.当非NMI中断的发生的时候,自动清楚GIE,保存到PGIE中,退出采用B IRP,会自动恢复GIE
3.中断的能够发生位置:Single Assignment vs. Multiple Assignment:只有在single assignment才能发生中断
另外:TI DSP的printf问题
1. printf可能会打破互斥的功能,导致互斥失败。