2008年12月27日星期六

setCentralWidget使用嵌入SDL的Qt Widget?

以前讨论了SDL嵌入Qt Widget, 比较规范的方法是,我在以前的文章里已经提过了:  

char variable[64]; 
_snprintf(variable, sizeof(variable), "SDL_WINDOWID=0x%lx", winId()); 
SDL_putenv(variable); 

这里只使用了三行程序,很简单,唯一要注意的一点:不要使用effectiveWinId (),而是要使用winId ()。
现在我们要使用这个已经嵌入SDL的Qt Widget, 我做了两个测试:


测试1:在MainWindow中使用setCentralWidget

SDLVideo *sdlvideo = new SDLVideo; 
setCentralWidget(sdlvideo); 


结果:无法成为MainWindow的CentralWidget,程序执行一下就立刻结束。测试2:在MainWindow中使用QDockWidget 

SDLVideo *SDLVideo_dock = new SDLVideo; 
QDockWidget *dock_a = new QDockWidget(tr("Media Player of ... ..."), this); 
dock_a->setWidget(SDLVideo_dock); 
//addDockWidget(Qt::LeftDockWidgetArea, dock_a); 
viewMenu->addAction(dock_a->toggleViewAction()); 

结果:和预料的一样,也无法成为MainWindow的QDockWidget,程序执行一下就立刻结束。
结论:经过两个测试证明,SDL嵌入Qt Widget,在一定程度上不能和一般的Qt Widget一样工作,虽然现在它也是Widget但是它只是一个“类Qt Widget”,一定程度上也是一个SDL app,它只是嵌入一个Qt Widget。原因是winid的返回值的问题,在windows下会有点问题,在linux下以上的程序应该就没有问题。

2008年12月26日星期五

用Qprocess调用外部mplayer.exe

最简单的使用Qprocess调用外部mplayer.exe的方法,以下是一个简单的例子:

void MainWindow::showMplayer() { 
    const QString mplayerPath("D:/Download/MPlayer-1.0rc2/MPlayer-1.0rc2/mplayer.exe"); 
    QStringList args; 
    args << "D:/Documents and Settings/Project/release/test.avi"; 
    QProcess *myProcess = new QProcess; 
    myProcess->start(mplayerPath, args);
}

接下来,比较复杂,我不仅调用外部mplayer.exe的方法,而且还要将播放窗口放到Qt Widget。这时必须使用mplayer 的-wid参数,这可以将mplayer输出流重定向的指定的窗体(这里就是我们所要的Qt Widget)。同时我们也可以设定一些mplayer的参数。注意:QWidget::winId() returns an HWND not an int.所以要使用类似QString::number(reinterpret_cast<qlonglong>(wd->winId()))的语句。还有一点,mplayer的configure里的GUI必须disable,不然也无法将mplayer输出流定向到Qt Widget上。以下是一个简化的例子:

void MainWindow::showMplayer() { 
    QWidget *wd = new QWidget(this);
    const QString mplayerPath("D:/Download/MPlayer-1.0rc2/MPlayer-1.0rc2/mplayer.exe"); 
    QStringList args; 
    args << " -wid" << QString::number(reinterpret_cast<qlonglong>(wd->winId())); 
    args <<" D:/Documents and Settings/Project/release/test.avi"; 
    QProcess *myProcess = new QProcess(this); 
    myProcess->start(mplayerPath,args); 
    wd->show(); 
}

2008年12月24日星期三

GALS设计讨论(part2)flow control机制

前面讨论了ack requst 机制在GALS设计的应用。但是,GALS系统(这里假定一个简单的GALS系统由CLK_DOMAIN_A和CLK_DOMAIN_B组成并使用非同步FIFO作为两个DOMAIN的接口),常常需要使用到flow control机制,这时候就需要,flow control signal:例如:(ready, hold信号)。

使用HOLD信号,可以简单的是CLK_DOMAIN_A 保持了高电平。这时DOMAIN_A发送的DATA信号便保持了最后一个值不变,在DOMAIN_A里的模块,就保持“冻结”状态,只有当HOLD = '0' 时,“冻结”状态被解除。这里所谓的“冻结”状态有两个好处:

  1. 可以防止,系统时序的错乱,我做过几个实验,并没有采用flow control机制,仅仅采用ack requst 机制,当DOMAIN_B里的模块要从非同步FIFO系统需要读出数据时,要对DOMAIN_A发送ACK_A= '0'的信号,注意这里很容易会产生 系统时序的错乱。
  2. 可以节能 Energy Efficient。很简单,当DOMAIN_A里的模块,保持“冻结”状态时,这时模块就几乎不会耗能。

使用同样的原理,我们可以很容易地对DOMAIN_B里的模块控制,使其达到“冻结”状态,当往非同步FIFO里写入数据时。以下是一个 stretchable clock 的例子:

Example of the output from a stretchable clock

现在我们有了非同步FIFO(及其控制信号如WR_EN, RD_EN等等),flow control机制里的hold信号,ack requst 机制的ack request信号,我们可以快速的建立一个很简单的GALS系统。

经验:最好不要将ack requst 机制的ack request信号直接对非同步FIFO的控制信号如WR_EN, RD_EN进行控制,理论上是可以成功,但实践上会遇到很多譬如时序,延迟的问题。

比较聪明的解决方法是:建立一个INPUTINTERFACE(也可以叫做INPUTPORT)和一个OUTPUTINTERFACE(也可以叫做OUTPUTPORT)分别放在非同步FIFO两端,仅仅使用INPUTINTERFACE和OUTPUTINTERFACE的内部信号对FIFO进行控制。对于外部INPUTINTERFACE和OUTPUTINTERFACE控制和接受ack requst 机制的ack request信号,控制flow control机制里的hold信号。并且在INPUTINTERFACE和OUTPUTINTERFACE中放置一系列的flipflops和寄存器,对输出和输入信号还有数据进行“保护”。

本系列文章未完,待续。

2008年12月20日星期六

GALS设计讨论(part1)ack request机制

Handshake Protocol 是在硬件设计时,基础通信的协议。ack request信号的使用是其要点,这篇文章并不对其的基本原理进行讨论,这里着重对于ack request机制在GALS(全局非同步,局部同步系统)应用的讨论。

一般典型设计,以下是一个简单的示例:


模块1 模块2
| request_out |--> |request_in |
| ack_in |<-- |ack_out |

GALS系统设计,以下是一个简单的示例:

模块1 非同步FIFO控制模块 模块2
| request_out |--> |request_A(in) request_B(out)| --> |request_in |
| ack_in |<-- |ack_A(out) ack_B(in)| <-- |ack_out |

因为这里要使用到一个 “非同步FIFO控制模块”过渡,所以时序问题的考虑就特别重要,在多次的实验中,我发现 非同步FIFO控制模块 会使一些信号产生延迟,延迟问题常常是致命的,例如:当ack_A(out)无法在正确的时序给定给模块1时(常常,这个信号已经丢失了),模块1就会不断发送request_out信号,因为不能得到正确的ack_in 信号,整个系统就会停摆,或产生错乱。 这时要导入,几个一级flip flop来过滤信号的非稳定性,并要使对延迟进行严格控制。

Struktur der Synchronisierung der 1-Bit breite Kontrollsignale zwischen den Clock Domains

非同步FIFO控制模块有左右两侧接口。为了命名方便,左侧接口为request_A(in),ack_A(out),右侧则命名为B端。非同步FIFO控制模块的左右两端的信号接口,不仅是作为接口,起到链接作用,更为重要的是从模块1和2获得控制信号,并且通过输出信号ack_A(out) 和request_B(out)对模块1和2进行控制。模块1和2的输出信号request_A(in),ack_B(in),也可以进行对非同步FIFO的控制。

接下来讨论, 非同步FIFO控制模块的具体控制问题。

当非同步FIFO控制模块得到request_A(in)等于1时,说明(同一时间)有有效数据传输,这时将数据和request_A(in)信号输入寄存器,然后非同步FIFO从寄存器中读取数据,并发送 "ack_A(out) <= WR_ACK" 给模块1。

说明:WR_ACK是非同步FIFO的写入反馈信号,WR_EN是写使能信号。RD_ACK是非同步FIFO的读出反馈信号,RD_EN是读使能信号。

本文未完,待续。

2008年12月19日星期五

一些我读到的独到见解

"纯金每克20美元、Burberry的领带每克2.5美元、0.13微米制程的8英寸晶圆每克25美元,而IC设计产品每克可达76美元" -- 蔡明介 《竞争力的探求》节选

"计算机行业是唯一一个比女性时装界还要追逐概念和潮流的行业。"Oracle的拉里·埃利森

美国《大西洋月刊》甚至得出了一个有趣的结论——从郁金香球茎到潜藏复杂数学公式的次级贷,人类的天性就是发明一些自己都不明白的东西,然后用来毁灭自己。

附加:
“诸位,请问美国是什么? 美国就是一小部分聪敏绝顶的人,统治着大多数的傻瓜。 ” -- 郎咸平

本文未完,待续。

2008年12月15日星期一

gcc/g++

gcc/g++在执行编译工作-->总共需要4步
1.预处理,生成.i的文件[预处理器cpp]
2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]
3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]
4.连接目标代码,生成可执行程序[链接器ld]

2008年12月12日星期五

在ModelSim中设定大型的Project的一些讨论

以下内容仅仅是举例说明,具体操作视具体项目而定。
举一个例:在ModelSim中设定大型的Project(看完会发现步骤很多):

在.mpf里修改project的路径,用新的地址代替旧的地址。

大型项目常常有储存电路,如果要使用memory进行模拟,先要加入.vhd文档到project里,然后还有要加入.mif 文档到ModelSim的项目目录里,这很重要,还有加入对应的mem_sim文档。
使用memory进行模拟,注意例如要在component里写上:
-- synopsys translate_off
MEM_FILE : string;
-- synopsys translate_on

在instantiation里写上
-- synopsys translate_off
MEM_FILE => "mem_sim/abcd" & str(abcd_NUM-1, 10, 1)& "/xyz" & str(num+1) & "/efgh",
-- synopsys translate_on
-->可以读出ModelSim的项目目录mem\abcd*\ xyz*\efgh的文档里的内容,*代表数字,我们可以通过一些设定设置数字,这里不详细说明。

写一个clean_libs.do和create_libs.do for ModelSim Transcript
clean_libs.do 例如:
vdel -lib work -all
vlib work
vmap work work等等

create_libs.do 例如:
vlib work
vmap work work等等
最后在ModelSim Transcript执行:do clean_libs.do 然后再执行do create_libs.do

对simulation文档进行设定,例如调整unisim的位置,等等。

本文未完,待续。

利用ffmpeg和sdl库播放视频经验

首先要设定Properties for Project: 在MinGW C Linker里-->Libraries --> 加入mingw32, SDLmain, SDL, avformat, avcodec, avutil,并设定想对应的正确的Library search path,在Directories里加入所需的Include path.
然后使用http://www.dranger.com/ffmpeg/tutorial02.c上的tutorial02.c这个例子。
接下来就可以编译和Build啦,(对了,在Build artifact里Artifact Type选用Shared Library或Executable都可以 )。
最后在Command Prompt里进入debug目录输入:例如:projectname.exe examplevideo.avi 就可以播放视频了,实在很简单吧。

最后,推荐一个网站:http://www.arjanhouben.nl/SDL_ffmpeg/

2008年12月9日星期二

Ffmpeg的使用, Eclipse gdb

如果是用C++的话,然后进入Project Properties-->设置好include和lib linker。然后进行编译,如果有问题,无法编译例如avcodec.h里的内容或编译avcodec.h里的内容出错(这常常发生),那么就要点击这个project,然后点击鼠标右键选Open Declaration或按F3。进入可见#include "libavutil/avutil.h"之类的声明,注意这里的#include路径和我们在Project Properties-->设置好include路径是不同的。解决它的最好方法就是,在Project Properties-->include,多设一个路径以满足其要求,例:加上"C:\DA_SDK\ffmpeg-export-snapshot"。
gdb简单的说是一个Debug工具。
MinGW自己并不配gdb,必需自己下载,并安装。注意:必须下载一个6.6版本,或以下版本的,6.8版本的不能在Eclipse中使用,至少现在是这样的。http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=20507 可以直接下载已编译的版本,直接可以使用,吧BIN的exe拷贝到MinGW的bin里就可以,也可以把include里的.h拷贝到MinGW的include里。
现在终于可以进行Debug了。选择Project按鼠标右键,选Debug As --> Open Debug Dialog -->
在Environment例如:new --> Name: PATH Value: C:\DA_SDK\ffmpeg-export-snapshot\lib_dll;%PATH%。
在Debugger里:例如:Debugger: 选MinGW gdb Debugger 在Main: GDB debugger: C:\MinGW\bin\gdb.exe,其他选项可以保持不变。
现在可以进行Debug了,可以点击Elcipse工具条上的小虫,然后进入Debug环境。



2008年12月8日星期一

Ffmpeg构建和编译 续

在ffmpeg构建和编译的过程中我也遇到了一些问题,单凭网上的帮助还是不够的,我把我的解决方案记下来,希望能帮助后来人。
当完成了我上一篇文章的所有步骤后,在MSYS中输入./configure --enable-memalign-hack,若遇到这个错误:“./configure: line 221: pr: command not foundss”
The standard MSys install doesn't come with pr. You need to get it from the coreutils package. 下载coreutils-5.97-MSYS-1.0.11-snapshot.tar并解压,将bin里的文档拷贝到C:\msys\1.0\bin里,这样这个问题就可以解决。
若我们的MSYS的make.exe 的版本例如是make3.79.exe,有在./configure后进行make可能会遇到不能运行的问题,解决这个问题的方法是升级MSYS的make.exe的版本。我这里是升级到make-3.81-MSYS-1.0.11-2版本。
如果输入./configure --enable-memalign-hack后输入make,会生成.a文档,也就是“静态库”,例如: avformat.a \ avcodec.a \ avutil.a
以下转自:http://donaldtc.blogspot.com/2007/05/ffmpeg_22.html
如果希望使用FFmpeg包含的libavcodec库开发多媒体文件处理程序,还需要编译libavcodec的dll动态链接库,编译过程和上述过程稍有差别,如下所述: 首先切换到FFmpeg的源代码目录,在开始编译前先使用"make distclean"清理上一次留下的中间文件,然后向configure脚本多传递两个参数./configure --enable-shared --disable-static --enable-memalign-hack 最后执行"make"命令就可以了。
我因为需要swscale-0.dll,所以我的configure为:
./configure --enable-shared --enable-gpl --enable-swscale --enable-memalign-hack
这个已经可以满足一般的使用。
./configure --help 后你也可以根据自己的需要调整./configure
如果你需要Building FFplay,可以参考以下说明:http://ffmpeg.arrozcru.org/wiki/index.php?title=Building_FFplay

2008年12月4日星期四

一些小问题

int snprintf(char *restrict buf, size_t n, const char * restrict format, ...);

函数说明:最多从源串中拷贝 n 1 个字符到目标串中,然后再在后面加一个 0 。所以如果目标串的大小为 n 的话,将不会溢出。函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值。

_snprintf(variable, sizeof(variable), "SDL_WINDOWID=0x%lx", winId());
//snprintf(variable, sizeof(variable), "SDL_WINDOWID=0x%lx", winId());
snprintf函数并不是标准c/c++中规定的函数,但是在许多编译器中,厂商提供了其实现的版本。
在gcc中,该函数名称就snprintf,而在VC中称为_snprintf。但是我在编译的过程中,使用_snprintf就不会出现warning,若使用snprintf则会出现warning。

qmake 不会处理.cpp文件里的Q_OBJECT,所以,如果在.cpp文件中有它的话,也会产生undefined reference to vtable for "xxx::xxx". 这时,需要先用moc xxxx.cpp生成相应的moc文件,再包含到.cpp里面去,才能解决这个问题.
要解决上面的问题
如果分开, 可能就没问题, 包括 h和 cpp 分开。在你main.cpp 最后加一行 #include "main.moc" from:http://blog.donews.com/netexe/archive/2006/02/09/720544.aspx

from: http://lists.mplayerhq.hu/pipermail/ffmpeg-user/2007-March/007669.html
The correct order is -lavformat -lavcodec -lavutil. It doesnt matter 
when you use dynamic linking, but with static libs it does, because ld
does *not* scan static libraries repeatedly, only once (that is, once
per -l option).

#include
#include // < > 代表是用.PRO INCLUDEPATH引用的
#include "mediaplayer.h" // " " 代表是在现存Project中的文档

如何在C++中调用已经被编译好的C函数?这时必须采用“混合编译”,例如:
extern "C"
{
#include
#include
}
这里调用了ffmpeg的头文件avformat.h和avcodec.h,为了解决C++不能编译C的问题,
这里必须加在extern"C"里。原因:例如函数abcd()被C编译器编译后在库中的名字为_abcd,
而C++编译器则会产生_abcd_int_int之类的名字用来支持
函数重载和类型安全连接。由于编译后的名字不同,C++程序不能直接调用C函数。
C++提供了一个C连接交换指定符号extern “C” 来解决这个问题。

2008年12月3日星期三

创建ON CHIP测试,我的标准步骤

设置的一般步骤:
  1. create Xilinx ChipScope Core chipscope_icon and chipscope_ila, then put them into ISE directory
  2. add component chipscope_icon and chipscope_ila_1 in Top entity, for example: fpga_right
  3. set the CONTROL, DATA and TRIG signals for the component chipscope_ila, the CONTROL comes from the component chipscope_icon, DATA is the signals, which is important and you want to see, for example, I take the signals from the NCORE_adr(the address from the Processors), for TRIG, I use a trigger_proc or use TRIG <= (not ncore_ta) & ncore_r_w;
  4. maybe set some LED signals for show the RESET signals, to see, if the program "Init_Raptor" works
  5. use lb_interface(for the communication with the Computer) in the Top entity
  6. use a "Init_Raptor", which made of MFC to set the Reset signal --> Init and Reset
  7. now you can use the ChipScope Analyze to do the on chip test
接下来,进行综合,并进行设置:
for Xilinx ISE setting here only for the Studienarbeit(GALS system testing):

Synthesis Properties:
by Synthesis Options: Cross Clock Analysis --> yes
by Xilinx Specific Options: Optimize Instantiated Primitives --> yes

Map Properties:
Trim Unconnected Signals --> yes, Replicate Logic to Allow Logic Level Reduction --> yes, Allow Logic Optimaization Across Hierarchy --> yes,
Use RLOC Constrains --> yes, Pack I/O Register/Latches into IOBs --> For Inputs and Outputs, Map Slice Logic into Unused Block RAMs --> yes
注意:将ISE Project中的所有的无关的.vhd删除,并且加入少的.vhd和.v的文档,让Project简单和其他文档无关,互不影响,只保留有用的文档。注意.ucf很重要,必须直接加入到Project中去,不能和Top entity外部相连。

使用ChipScope:
ChipScope_data <=ncore_addr_top (所需要引出的数据);
ChipScope_trigger <=(not ncore_ta) and (ncore_rw) (给定的trigger条件);

注意使用,如下的语句:
-- synopsys translate_off
在这里面的语句将不参与综合
-- synopsys translate_on

开始改用SVN啦

http://www.ibm.com/developerworks/cn/opensource/os-ecl-subversion/
这个文章介绍了如何结合使用 Subversion 和 Eclipse,很完整。
接下来,简单介绍一下,我对SVN的使用心得:
这里只谈Eclipse:
首先,如同上面给的链接的做法,完成前期设定。
然后Windows --> Open Perspective --> Other... --> SVN Repository Exploring
这时可以对SVN Repository 进行修改。(也可以点击Eclipse右上角的图标进行Perspective 的改变)
--> New --> New Remote Folder
--> 建立自己的项目目录
然后 --> 进行分支设定(以下部分内容来自互联网)
+-trunk 保存项目开发的主线。
+-branches 保存项目的各种开发分支。
+-tags (保存项目的标签,也就是创建后永远不会修改的分支,例如发布release版本,它是某个项目,某个时间的一个快照,每次提交一个修订版本其实都是一个精确的快照。)

简单的说:就是-->trunk为主开发目录,branches为分支开发目录,tags为tag存档目录(不允许修改)。

附注:
常用分支模式: 转载自:http://blog.csdn.net/windone0109/archive/2008/09/10/2908117.aspx
a、发布分支:在代码发展到一定阶段,建立发布分支,将当前的一个版本取出来,拷贝到branches目录下,进行全面严酷的测试,如发现BUG则在当前版本进行修复,并同步更新trunk中的BUG,经测试完成后,将文件拷贝到tags目录中发布,并提交给客户。
b、特性分支:如果需要作复杂的修改,会影响到trunk代码的稳定性,则建议建立一个特性分支,等特性稳定之后,再和truck主干合并。
------------------------------------------------------
NOW使用trunk作为主要的开发目录。
一般的,我们的所有的开发都是基于trunk进行开发,当一个版本/release开发告一段落(开发、测 试、文档、制作安装程序、打包等)结束后,代码处于冻结状态(人为规定,可以通过hook来进行管理)。此时应该基于当前冻结的代码库,打tag。
当下一 个版本/阶段的开发任务此时,如果发现了上一个已发行版本(Released Version)有一些bug,或者一些很急迫的功能要求,而正在开发的版本(Developing Version)无法满足时间要求,这时候就需要在上一个版本上进行修改了。应该基于发行版对应的tag,做相应的分支(branch)进行开发。开始,继续在trunk进行开发。

待一切都搞定后,现在可以开始使用SVN进行版本控制啦。
右击Project在 Eclipse 的项目视图,并且从菜单中选择 Team --> Share Project, 选择 SVN,然后单击 Next --> 接下来就很简单了,这里不再说明。
值得注意的是:如果将文件添加到项目中,它不会自动成为版本控制的一部分 —— 需要明确将其添加到特定的存储库中右击新文件,然后选择 Team --> Add to Version Control
当然了,我们也可以进行,“更新项目” 版本控制系统的重要特性之一是其他开发人员能够随时继续开发,并在准备好时提交其变更,但是我现在只是一个人进行编程,暂时不需要用到这个功能。这个功能可以下载这些变更,并将其与本地副本集成。 右击要更新的项目,然后从菜单中选择 Team --> Update。Eclipse 将从存储库中检索任何变更,并尝试将它们与本地副本合并。
对我们来说重要的功能是“提交更改” 如果确定了新的代码可以编译,并且已经对变更进行测试,这时就可以把它们放入Subversion 存储库。右击项目,并从菜单中选择 Team --> Commit。Eclipse 会显示一个 Commit 对话框。
SVN还有很多很好的功能,具体请看IBM的帮助文档。

现在谈谈SVN for Window的最最简单用法,先下载一个SVN的Window版本,然后安装。选中你所要check out 的文档,按鼠标右键,选SVN Checkout,在URL of repository里填上你的路径(这个路径你可以用例如http:/.../trunk/abcd/),自己创建一个Checkout directory,然后点OK。接下来,你就有一个带SVN标志的文件夹,你可以把你所要进行文档版本管理的文件放入这个文件夹里,现在就是最后一步啦,点击这个文件夹,点击鼠标右键然后点SVN Commit,完成了,这时文档就上传到.../trunk/abcd/里去了。

2008年12月2日星期二

编译FFmpeg

MinGW: A collection of freely available and freely distributable Windows specific header files and import libraries, augmenting the GNU Compiler Collection, (GCC), and its associated tools, (GNU binutils). MinGW provides a complete Open Source programming tool set which is suitable for the development of native Windows programs that do not depend on any 3rd-party C runtime DLLs.
MSYS: A Minimal SYStem providing a POSIX compatible Bourne shell environment, with a small collection of UNIX command line tools. Primarily developed as a means to execute the configure scripts and Makefiles used to build Open Source software, but also useful as a general purpose command line interface to replace Windows cmd.exe.

详细请见:FFmpeg编译指南
http://donaldtc.blogspot.com/2007/05/ffmpeg_22.html

准备MSys+MinGW系统 -->获取FFmpeg (不用SVN方式的到直接下载一个ffmpeg-export-snapshot.tar: bare sources) --> 编译(启动MSys --> "cd /C/ffmpeg" --> ./configure --enable-memalign-hack --> make --> ... ... ) --> 也可加入对第三方库的支持, 重复编译步骤,只是加入更多的东东 ./configure --enable-static --enable-shared --enable-bla bla --enable-bla bla bla 然后 make ... ... --> 在Qt+MinGW链接,配置的工作和以前配置SDL时一样 --> ... ...

# ./configure \
'--prefix=/usr' \
'--enable-gpl' \
'--enable-shared' \
'--enable-mp3lame' \

... ...
'--disable-ffserver'
# make
# make install

在configure 不要加 --disable-ffplay 就会同时安装ffplay。
典型的 Desktop (PC) 使用 - ffplay + SDL

附加:
如何uilding ffmpeg for Windows with MSYS and MinGW(在windows里构件ffmpeg用MSYS和MinGW)。
1.先下载最新的MinGW:
http://sourceforge.net/project/showfiles.php?group_id=2435
2.下载MSYS和它的bash
3.下载最新的ffmpeg
  1. 安装 MinGW (choose “MinGW base tools” and “MinGW make”) 到 c:\mingw
  2. 安装 MSYS 到 c:\msys\1.0
  3. 在MSYS安装后,回答一下几个问题:
    Do you wish to continue with the post install? [yn ] -> y
    Do you have MinGW installed? [yn ] -> y
    Where is your MinGW installation? -> C:/mingw
  4. 将 bash-2.05b-MSYS.tar.bz2 拷到 c:\msys\1.0 and 并解压缩 (bash.exe 和 sh.exe必须放到 C:\MSYS\1.0\bin里).
    我们要这么做是因为ffmpeg’s configure script不能在MSYS自配的bash 2.0.4下工作。
  5. 解压ffmpeg
然后使用MSYS进入ffmpeg目录,执行./configure 并做一些设定,一切OK,执行make。

-->其实更本不用那么麻烦,直接下载FFMPEG的SDK就可以使用了,很方便,编译太麻烦,如果搞不定,还很浪费时间呢。
http://www.ffmpeg.com.cn/index.php/SDK_Download

2008年11月30日星期日

Qt 及SDL

Qt部分:
可以把 QWidget包成一個QDockWidget的子类,进而加到QDockWidget中,例如:

SDLVideo *SDLVideo_dock = new SDLVideo; 
QDockWidget *dock_4 = new QDockWidget(tr("Media Player of Online Tool of Robotic Experiment"), this); 
dock_4->setWidget(SDLVideo_dock); // 重点:把 QWidget包成一個QDockWidget的子类 
addDockWidget(Qt::LeftDockWidgetArea, dock_4); 
viewMenu->addAction(dock_4->toggleViewAction()); 

再介绍两个有趣的函数:

setAttribute(Qt::WA_PaintOnScreen);//这个函数可以给屏幕截图 
setUpdatesEnabled(false);//可以决定是否对Widget截的图是否可以Update 

SDL部分:

putenv("SDL_VIDEODRIVER=directx"); 

注意:这个函数必须用在SDL_Init();之前才有实际效果。来设置为directx环境。(VC下为了解除编译警告,也可使用SDL_putenv()来代替putenv(),效果都一样。)

以下程序实例--让SDL结合在Qt Widget里,摘自:http://www.guiadohardware.net/comunidade/showthread.php?t=797107
我试了,可以用,但是还不是很完美的解决方案。
如何用SDL创建一个窗口: 一个台湾网友的LinuxGame的博客,中文说明http://otlinux.blogspot.com/2007_12_01_archive.html

英文版http://www.aaroncox.net/tutorials/2dtutorials/sdlwindow.html

如何让SDL嵌入到Qt的Widget里,使用:QWidget::winId()
至今为止,最好的解决方案。例1: http://listas.apesol.org/pipermail/sdl-libsdl.org/2005-September/051604.html

#define NEED_SDL_GETENV 
#include 
//.... 
char variable[256]; 
sprintf(variable, "SDL_WINDOWID=0x%lx", winId()); 
if (SDL_putenv(variable) == -1) 
{ 
// .... 
}

例2:http://stackoverflow.com/questions/118659/how-do-i-use-qt-and-sdl-together

// Set the new video mode with the new window size 
char variable[64]; 
snprintf(variable, sizeof(variable), "SDL_WINDOWID=0x%lx", winId()); 
putenv(variable); 
// ffmpeg is relatively simple. 
// A while back, I used the page below as a reference 
// and coded up a simple app that uses ffmpeg to decode frames 
// and paints them on screen in a QWidget. 

http://www.inb.uni-luebeck.de/~boehme/libavcodec_update.html

2008年11月29日星期六

SDL库在Qt .pro中设定

在.pro 里加上以下的Script:
INCLUDEPATH = "C:\SDL-devel-1.2.13-mingw32\SDL-1.2.13\include\SDL"
win32:LIBS += -L"C:\MinGW\lib" -lmingw32 \
-L"C:\SDL-devel-1.2.13-mingw32\SDL-1.2.13\lib" -lSDLmain -lSDL
注意1: INCLUDEPATH的双引号可加可不加,win32:LIBS的双引号最好加上

2:win32:LIBS加入的顺序是很重要的

3:用 \ 和 / 效果是一样的对于连接

4:不同的文档用 \ 相隔

5:当写-L时,写-lSDLmain而不是libSDLmain.a 等等,注意写的规范性。

举一个实例:让使用Qt的项目(使用MinGW gcc)可以编译SDL_image
1.在.pro中加入
INCLUDEPATH = C:\SDL_image-1.2.7\include
win32:LIBS += C:\SDL_image-1.2.7\lib\SDL_image.lib
2.将C:\SDL_image-1.2.7\lib中的.dll文件拷到C:\WINDOWS\system32里去
3.在所需的C++文件中加入头文件:#include "SDL_image.h"



2008年11月28日星期五

Qt qmake Makefile设置

从Qt提供的许多现存的源程序中找到相关的.pro项目文件,它们是学习qmake 更多技巧的最佳范例。

Makefile -->用 make 来开发和编译程式的确很方便 --> Makefile可以像这样由\".pro\"文件生成 --> qmake -o Makefile hello.pro (使用qmake作为Qt库和Qt所提供的工具的主要连编工具)用qmake 和.pro 文件一起生成 Makefile
--> 只需要写.pro 文件来链接它不同的链接库等等... ...


We will use qmake to build the executable, so we need to write a .pro file:
以下英文简介来自qmake用户手册:
Declaring Other Libraries
If you are using other libraries in your project in addition to those supplied with Qt, you need to specify them in your project file.
The paths that qmake searches for libraries and the specific libraries to link against can be added to the list of values in the LIBS variable. The paths to the libraries themselves can be given, or the familiar Unix-style notation for specifying libraries and paths can be used if preferred.
For example, the following lines show how a library can be specified:
LIBS += -L/usr/local/lib -lmath
The paths containing header files can also be specified in a similar way using the INCLUDEPATH variable.
For example, it is possible to add several paths to be searched for header files:
INCLUDEPATH = c:/msdev/include d:/stl/include


qmake 使用储存在项目(.pro)文件中的信息来决定Makefile文件中该生成什么,简单的说,所谓的设置配置的信息,就是在项目(.pro)文件中设定。 一个基本的项目文件包含关于应用程序的信息,比如,编译应用程序需要哪些文件,并且使用哪些配置设置。 这里是一个简单的示例项目文件:
SOURCES = hello.cpp
HEADERS = hello.h
CONFIG += qt warn_on release
Makefile可以设定使得 Qt Program可以被编译和链接(linken)。
例如:
win32:LIBS = $(QTDIR)/lib/qt-mt230nc.lib \ $(QTDIR)/lib/qtmain.lib
或:
win32:LIBS += C:/DXSDK/Lib/amstrmid.lib \
C:/DXSDK/Lib/d3d8.lib \
C:/DXSDK/Lib/d3d9.lib
不要忘了:路径中是用 / 相连!!.lib之间用 \ 相隔。
进阶阅读:如何用qmake快速生成makefile

2008年11月27日星期四

Qt-Phonon

刚刚发现有一个很好用的工具在Eclipse:Project View --> properties --> Restore from Local History (可以将以前误删的文件找回)
以下是一个德国高手关于Phonon在WinXP的安装的介绍,是我至今看到最好的。阅读时请注意:这个是对于Qt对于Microsoft Visual Studio的,对于Qt和MinGW则无法进行操作,Qt的官方网站上已经有说道,我就是看介绍太不仔细,居然 没看到:Warning: The MinGW version of Qt does not support building the Qt backend. 所以,在这里我用的是MinGW + Qt openSource + Eclipse是无法building Qt backend 的.
以下我摘抄的要点,对于Microsoft Visual Studio的:
Compilation of Phonon under Windows XP

注意:Patch SDKs
Wired but true, the Windows SDK does not compile. It is somehow broken. You need to do the following:
Add the following line
#include "rpcsal.h"
to linenumber 32 in files
C:\Programme\Microsoft SDKs\Windows\v6.1\Include\medparam.h
C:\Programme\Microsoft SDKs\Windows\v6.1\Include\mediaobj.h .pro for qmake:
INCLUDEPATH = C:\DXSDK\Include \ C:\Program Files\Microsoft SDKs\Windows\v6.1\Include
LIBPATH += C:\Program Files\Microsoft SDKs\Windows\v6.1\Lib
产生: phonon.bat以及Configure"%PROGRAMFILES%\Microsoft DirectX SDK (April 2007)\utilities\bin\dx_setenv.cmd"
%PROGRAMFILES%\Microsoft SDKs\Windows\v6.1\Bin\SetEnv.Cmd
The last one should only be necessary if you use the Express Version, but it is no problem if is called anyway
注意:请使用Qt Command Prompt 然后进入Qt的目录执行configure.exe : If your environment is setup correctly, executing configure.exe on your Qt installation should automatically activate Phonon.

2008年11月25日星期二

在Eclipse建立SDL Extension Libraries

在Eclipse建立SDL Extension Libraries (Setting up SDL Extension Libraries in Eclipse)
http://www.libsdl.org/下载 SDL Windows development library
每一个 extension libary 有三个主要部分:

1. The header file.
2. The lib file.
3. The *.dll file(s)

将 header file 存到 MinGW include folder. It should be at C:\MinGW\include\SDL.
将lib file 存到MinGW lib folder. The MinGW lib folder should be at C:\MinGW\lib.
再 提取 *.dll file(s) 到 C:\WINDOWS\SYSTEM32 (This is so whenever you make an SDL extension app, the program will be able to find the *.dll file(s) even if they're is not in the same directory as the *.exe)

但是存放.lib 和头文件的位置也不用和上面所说的一样,但是要记住放置的位置:)


SDL是用C编写的,但是也支持C++,同时其他多种语言,太好了,我们可以用自己熟悉的语言使用它。我在以后的实例中使用C++来使用它。

现在在Eclipse中进行一些设定:
properties --> C/C++ build --> Setting --> GCC Compiler --> Directories --> Include paths (-I) --> 加入所有需要的Include
properties --> C/C++ build --> Setting --> MinGW C Linker --> Libraries --> Include search path (-L) --> 加入所有需要的Library的Path --> 在Libraries (-I)里加入 mingw32 SDLmain SDL 请注意:要依次加入!!

linker的名称为 :
-lmingw32
-lSDLmain
-lSDL

另一个值得注意的点:#include 的写法,因为我在properties --> C/C++ build --> Setting --> GCC Compiler --> Directories --> Include paths 只写了例如:C:\SDL-devel-1.2.13-mingw32

如果使用的是Qt Eclipse Integration,就不需要进行以上操作,只需对.pro文档进行设定,在.pro文档中加入SDL的include和lib名称和路径。

2008年11月23日星期日

实战Qt .ui文档

首先,关于uic的一些小小的点,很有必要知道的:
The uic tool converts xxxx.ui into C++ and puts the result in ui_xxxx.h.
The generated ui_xxxx.h file contains the definition of the Ui::xxxx class, which is a C++ equivalent of the xxxx.ui file.
如果编译出错: launch failed no binaries

解决方法: 在 project-> properties 中把 c/c++ make project 的 binary parse 进行设置到 PE windows parsers
使用Qt Designer Editor生成的example.ui -->其对应的example.cpp 和 example.h 有ui.setupUi(this);
private:
Ui::ExampleToolClass ui;
的文件,其原文档在ui_example.h里可以使用它的一些设定,这个文件由BUILD生成的。
windows的qt里有个uic.exe
qt4
uic xxx.ui -o xxx.h
把UIC.exe和你要转换的xxx.ui文件拷贝到同一目录。
开始菜单,运行CMD
进入uic.exe和xxx.ui的目录,运行以下命令:
uic xxx.ui -o xxx.h 生成.h文件
uic xxx.ui -i xxx.h -o xxx.cpp 生成.cpp文件
uic -o myform.h myform.ui # generate header file
uic -o myform.cpp -impl myform.h myform.ui # generate implementation file
uic -o myformimpl.h -subdecl MyFormImpl myform.h myform.ui # generate subclass header file
uic -o myformimpl.cpp -subimpl MyFormImpl myformimpl.h myform.ui # generate subclass implementation file
如何修改.h文件:但在QT4在Windows下面 -->OpenSource版只有界面设计功能,其它的就沒了--> 用纯代码进行界面设计师必要的,也是非常重要的,QT Designer只是为了加快界面开发。在自己定义的类里加一个Qt Designer里生成的类的成员,並SetupUi()安裝它,所有在Designer里设计不到的部分,在自定义类里进行处理。
看QT Assistant -->QT Designer的用法的那部分帮助。
有两种方法创建GUI 使用 Qt:
使用直接编程法,我个人推荐这种方法。比较容易生成链接,比较容易进行signal and slot的处理。只需建立xxx.h和xxx.cpp文件,无需建立Qt class之类的文件. 
使用Qt Designer: 它会生成ui_xxx程序(会自动生成,或可以用UCI程序生成),可以把它分解成两部分xxx.h和xxx.cpp但是不是那么容易,然后进行编程。

还有一种比较直接的方法,我称其为:"结合使用法",详细见:以下推荐的书的原版35页。

C++ GUI Programming with Qt 4中文版

2008年11月22日星期六

使用 Xilinx ChipScope对FPGA进行调试

If the prblem with your design lies at the tp-level or is fundamentally hardware-related, using ChipScope modules is probably the best way to debug them.

Example:

如何使用 Xilinx ChipScope对FPGA进行调试,具体请看教程
-- Xilinx Chipscope -- Instantiations
chipscope_controller : chipscope_icon
port map (control0 => chipscope_control);

chipscope_logicanalyzer : chipscope_ila_1
port map (clk => clk_lb, -- #
control => chipscope_control,
trig0 => chipscope_trig0);

-- Trigger
-- chipscope_trig0 <= (not ncore_ta) and (ncore_rw);
-- here:
-- chipscope_trig0 <= cluster_system_chipscope_trig_top;
-------------------------------------------------------

-- Xilinx Chipscope
signal chipscope_trig_top_int : std_logic_vector(0 downto 0);
-------------------------------------------------------
chipscope_trig_top_int(0) <= ((not ncore_ta) and (ncore_r_w)); -- #
chipscope_trig_top <= chipscope_trig_top_int;
逻辑分析仪Xilinx ChipScope的产生有两种方法:

Core Generator
(核产生器): 产生内核,将这些内核例化后添加到原设计文件,最后综合,实现,下载。
Core Inserter(核插入器):不需要修改原文件,它是将生成的内核添加到综合后的网表文件中.

Core Inserter 的流程为:

1)的 RTL 综合成 Netlist

2)调用 Core Inserter 插入逻辑分析仪;

3)布置和布局;

4)产生 bit 文件下载验证。


http://www.stanford.edu/class/ee108a/resources/documentation/chipscope_tutorial.pdf

这是一个很好的简单教程

基本步骤是:
  1. Generationg ChipScope Modules
  2. Incorporating and Instantiating the ChipScope Modules
  3. Connecting the ChipScope Modules
  4. Synthesizing, Implementing, and Running Your Design
  5. Using ChipScope Analyzer

2008年11月21日星期五

使用Qt Eclipse integration加文件到项目里,资源管理,项目管理

加文件到项目里Adding Files to the Project
要增加文件到在Eclipse的一个Qt项目,有二步是必要。首先,文件必须增加到工作区,并且第二,文件必须增加到.pro文件。如果你想要增加一个新的源文件到你的项目,File|New|Source File wizard 和enter 文件名。 Source 文件夹线编辑指定文件将增加的工作区项目。在点击结束以后,项目范围选择器对话框将出现。这对话框显示项目的.pro文件的所有被定义的范围,并且文件可以增加的variable 。在源文件情况下, “源文件”variable 和“标头文件”variable 被显示。 选择应该插入源文件的范围然后点击OK。现在,新的文件是a)增加到工作区和b)被添附到“源文件”variable在.pro文件里。 因为改变了.pro文件,它在编辑被打开并且被标记以被修改。 因此,记住在开始build之前保存.pro文件。
Managing Resources资源管理
要增加新的资源resources,你必须首先创造一个新的.qrc文件。打开File|New|Other... dialog,选择从Qt文件夹里Qt资源文件项目,并且点击Next。 新创建的.qrc文件将被显示在Eclipse上。.qrc文件只包含称/new/prefix1的前缀。你能增加资源在那前缀之下通过点击Add。当稍后关于资源从Qt代码来时,你必须加在前面前缀文件名加在冒号(即, :/new/prefix1/print.bmp)。 对于增加新的前缀,点击在增加按钮的箭头,并且选择Add前缀。 前缀的名字和资源的别名可以更改 with the line edits 在资源视图之下。

项目管理
使用.pro File Editor可以很轻松的利用它所提供的GUI对Project进行管理和改变,在Qt中这是一个很实用的技巧。
详细的例子请:如何进行Project管理


Qt Designer Editor也是很有用的程序,我们可以用它来设计GUI,例如,我们可以使用它改变字的颜色:在 Qt Designer Editor里: Display Widgets --> Label --> Property --> Point Size, text (改名称和大小), 在版上点Label按鼠标右键 --> change rich text --> 可改字的颜色。


2008年11月20日星期四

VHDL设计在FPGA模块测试 & VDHL极限编程结合FPGA实物仿真

例如 先进行5 Port original Switch-Box Testing在这个设计中只该变测试接口add Local Bus Interface, add N_core_Address测试接口,其他保持不变。
the Change for ISE Synthezise:
  1. add: library ethernet_lib;use ethernet_lib.all; in eth_controller.vhd.
  2. add: \hardware\assists : av_hw_acc, IP_header_check
  3. add: \hardware\building_blocks : cc_hw_acc, encoder
  4. in ISE: Sythesize properties: Veliog file path: --> ethenet Path
  5. use the new memory_interface.vhd and do some change to the ncore_wb.vhd: for example CPU_ID
  6. add all CoreGen file to the ISE-directory
  7. ISE libraries: change eth_port.vhd to ETHERNET.lib, change pe_cluster.vhd to URAT.lib
以上的内容对于读者并不重要,我只是记下来提醒自己:正确设置ISE是很重要,也是一点点学问和经验,以上例子表明,进行一个很简单的综合,在前期就要进行多达7步的搭配工作。测试常常需要很多不同的技巧,我这里是用XILINX CoreGenerator 生成储存文档,并和VHDL文件在ISE里进行综合,然后产生具有储存文档所描述功能的Bitstream。有时间的话,我将对XILINX CoreGenerator的使用进行说明。

这里所谓的"VDHL极限编程结合FPGA实物仿真":就是利用eXtreme Programming的一部分思想进行VHDL编程。极限编程:从最简单的解决方式入手再通过不断重构达到更好的结果。这种方法与传统系统开发方式的不同之处在于,它只关注于对当前的需求来进行设计、编码,而不去理会明天、下周或者下个月会出现的需求。
具体步骤:
  1. VHDL小系统的模拟(例:我的项目中:使用只有3个Ports的Switch Box系统在ModelSim进行模拟,这样可以提高模拟效率和速度)
  2. FPGA大系统实物仿真(例:我的项目中:使用有5个Ports的Switch Box的原始系统在ISE进行综合,这样可以保证综合的正确性)
  3. 在VHDL小系统的模拟验证正确的设计,直接放入大的系统,直接进行ISE综合,但是要仔细嵌入新的设计。
  4. 重复以上步骤。

2008年11月19日星期三

使用Eclipes开始第一个Qt例程

首先注意:可以新建一个WORKSPACE因为,Eclipse对于一个Project都需要一个新的WORKSPACE这样就可以把这个Project的所有的东西放在里面,当新建一个WORKSPACE可能要新设置Qt的位置。
先生成一个Qt应用框架
调用New Project dialog in Eclipse --> 点Qt folder --> Qt Gui Project --> 点击 Next -->输入 "AddressBook" 到 Project Name field (对于 "AddressBook" 例子里) --> 点Finish.
当Eclipse 发现 Qt 的位置, the project 这时可以被编译. -->进入 Project menu --> Build Project.
现在可以启用"AddressBook" application,在"AddressBook" project in the "C/C++ Projects" view里, 选 Run|Open Run Dialog... dialog 然后双击C/C++ Local Application item 用于产生一个新的RUN配置。最后 click the Run 按钮。
然后加入构件(Adding the Widgets)
展开 Qt Designer, 双击 addressbook.ui 文件。
先让Qt C++ Widget Box 可视:Window --> Show View --> Other --> Qt --> Qt C++ Widget Box 可让Qt C++ Widget Box出现在View里
开始先见到 QListWidget。 展开 Qt C++ Widget Box, 然后点击 List Widget subitem 并将它拖动到form的左上角. Qt C++ Property Editor (Window|Show View|Qt C++ Property Editor) 将会展示QListWidget的属性.使用property editor, 将objectName property 设为 "addressList".
现在可以试着插入Add and Delete buttons. 在 Qt C++ Widget Box and 拖动两个 Push Buttons 到form的右上角. 将 buttons 改名为 "addButton" and "deleteButton", 将它们的text property(文字属性)设为 "Add" and "Delete"。
哈哈很简单吧。现在已经完成了一个小的widget。

接下来可以看详细的教程.试着完成后面几步。

我的常用的免费软件


几年没有用过盗版软件了,如果要使用一些工具软件,我使用远程登入学校的实验室的机器使用正版,虽然有时比较不方便,但是支持正版人人有责。
在我的古董笔记本里除了(WinXP和Linux)外,只有免费的软件,以下是我常用的免费软件,都很不错。
Firefox mit Google Toolbar: with AddOn -- Tab Kit (Tab Trees), Adblock Plus, Clear Cache Button, Flash Got, Java Quick Start, NoScript, ThunderExtension, google notebook addon
RealPlayer, VLC mediaplayer, quick time, 酷狗音乐:
Google Pingyin,及Google提供的大部分软件,Google Docs 强烈推荐:

Adobe Reader:
MSN:
Notepad++, SVN, Eclipse:
avira antivirus ,CCclean:
HD Tune, SpeedSwitchXP:
NoMachine NX:
WinRAR:
VoipDiscount:
迅雷:
桌面词典 有道

成功生成的 Bitstream 当下载到FPGA时,出错的原因及解决方法

成功生成的 Bitstream 当下载到FPGA时,出错
这很令人愤怒。如果一个大的系统通过 ISE 两个小时以上的综合。BITSTREAM 成功生成了,但下载到 FPGA 时却报错。以下是两个不同的报错。
Attemp to Download full Bitstream
Checking Local 1 Range/Remap Register............Success
FPGA-Erase complete
Startsequenz found, starting programming.......
Preparing for Interrupt..........................Success
ERROR ! Done timeout!
Init is LOW, but should be HIGH, this could indicate a CRC-error

Attemp to Download full Bitstream .
Checking Local 1 Range/Remap Register............Success
ERROR !
Init timeout

我们先讨论其产生原因。
会发生这种情况,常常是我生成2个Bitstream并且分别下载到相邻的FPGA上。这两个Bitstream可以单独放置在FPGA上毫无问题,但是就是不可以分别下载到相邻的 FPGA 上(已经通过多次实验证明),但是通常我需要这两个FPGA模块进行通信交流。

产生原因可能有2个:可能是在LINUX的机器上,不同的时间,综合ISE工具产生的结果是不同的。这个看是很荒谬的原因是我的导师告诉我的,他有多次经历。我在昨天也做了实验,同样一个VHDL设计在不同的时段(不同的LINUX机器)进行综合,新的Bitstream就可以用了。
另一个原因是:可能FPGA的模块的输出和输入没有正确的MAP & ROUTING。一直两个FPGA模块无法对应上。

解决方法:
目前只能进行多次综合,在不同的时段或使用不同的LINUX综合机器。
新的解决方法,如果发现我将在后续发布。
最新的解决方法:
1.请查看ise Project里的FPGA constrain文档是否有正确放置在top 文档下。
2.有时候要先删除旧的FPGA constrain文档,然后再加上一遍,这可能是ise的bug吧,我的导师告诉我的。
3.如果可以的话,请删除和你Project无关的vhd或verilog文档,它们可能会对你的综合产生影响。

开篇 and 安装Qt

因为我的Diplomarbeit需要设计一个软件,今后的一系列文章将分享软件设计过程中的一些心得,由于我是学电子的,对软件设计及编程水平不高,如果文章有错误,请读者大方指出。
我做的软件是 Online Analysis Tool of Robotic Experiment, 也就是机器人实验的在线分析工具,简称暂时为:OATRE

因为要使用Qt, 首先介绍如何安装Qt:
部分翻译来自:
http://labs.trolltech.com/blogs/2007/07/11/develop-qt-applications-in-eclipse/
首先必须安装下列的程序 Download and install the following ingredients:

然后通过 Qt Eclipse Integration --> Start Eclipse with MinGW 启动。
打开 Eclipse 的 HELP 点击 Qt Development User Guide 然后 进入 Getting Started试着开始执行第一个例子。 New Project --> Qt folder --> Qt Gui Project --> Next 或者可以改一些设定。
注意:在 C/C++ Projects View 里点选这个Project 右键鼠标--> Properties 检查是否正确设定 Qt Properties --> Use Qt Version: 系统里当前的Qt 版本。
Window --> Show View --> Other --> Qt --> Qt C++ Widget Box 可让Qt C++ Widget Box出现在View里,然后就可以方便地使用Qt C++ Widget Box。

2008年11月18日星期二

如何让SDL窗口嵌入Qt窗口

先简单介绍一下SDL:

SDL(Simple DirectMedia Layer)是一套开放原始码的跨平台多媒体开发函式库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函式,让开发者只要用相同或是相似的程式码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软体。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。
虽然SDL时常被比较为‘跨平台的DirectX’,然而事实上SDL是定位成以精简的方式来完成基础的功能,它大幅度简化了控制图像、声音、输出入等工作所需撰写的程式码。但更高阶的绘图功能或是音效功能则需搭配OpenGL和OpenAL等API来达成。另外它本身也没有方便建立GUI的函式。

但是如何让SDL窗口嵌入Qt的Widget里(render videos, audioes and images under GUI(made of Qt) using SDL. The sdl screen must be successfully integrated into qt screen.) ?
(Implement SDL in a QT widget-- how to integrate SDL into Qt? )
有两种方法用于解决这个问题,一个是间接法如 solution 1 ,一个是直接法如 solution 2. 以下是从网上收集的说明。

Solution 1: Using a seperate thread for rendering:

The easiest and sanest solution would be to decouple both parts. So that SDL and Qt run in separate processes and have them use some kind of messaging to communicate. SDL can be rendered into borderless window and the editor sends commands via messages.

using a seperate thread for rendering.
This thread could run on its own in the background and you simply could use your Qt-buttons to stop/pause/resume the thread.

If you want your SDL-window to react when a real key is pressed, it would be a viable solution to simulate key events from Qt.

If you want to just signal the SDL-code in some way I'd suggest using custom events (SDL_UserEvent).
For example, do something like this:

  1. Start App and open Qt-Window
  2. Initialize SDL and open output window
  3. Create thread that updates SDL-Window waits for some signal to stop/pause/resume or for xx seconds
  4. Use the SLOTs called by your Qt-Buttons to signal the thread to stop/pause/resume (using Key- or UserEvents? or using flags being set by Qt's main-thread) [/list=1]
Solusion 2: Direct way to integrate SDL into Qt:

put the SDL overlay window on the top of Qt window by using the following 3 steps.
1) create SDL window according to the size of Qt window.
2) create SDL window without frame (SDL_NOFRAME).
3) move SDL window based on the top-right coop. of SDL window (xMoveWindow())

Following functions from SDL are mainly used,
SDL_SysWMinfo info;
SDL_VERSION(&info.version);
SDL_GetWMInfo(&info);
p_container->embed(info.info.x11.wmwindow, false).

链接集合:OpenGL,Ffmpeg等等

习Qt除了装软件还要准备一两本书。我推荐C++ GUI Programming with Qt4, 在网上甚至可以收到它的PDF版。http://www.qiliang.net/qt/index.html Qt参考文档,这个网站也是很值得推荐的,它有一个很热心的中国工程师建立的,内容非常实用,中文资料的好处在于我们可以非常快速的阅读和检索我们所需要的资料。
关于 Qt设计器 部分很值得一读。
Qt设计器是用来设计和实现用户界面并能够在多平台下使用的一种工具。Qt设计器可以使用户界面设计实验变得简单。在任何时候你可以要求所生成的代码去重建Qt设计器产生的用户界面文件,并可以根据你的喜好来改变你的设计。
当然的trolltech 上提供的资料是最丰富的:http://trolltech.com/ 很适合进阶阅读。

OpenGL(全写Open Graphics Library)是个定义了一个跨程式语言、跨平台的编程接口的规格, 为三维绘图提供的标准应用编程接口。OpenGL处理的仅仅是三维绘图方面,而很少或是根本不提供图形用户界面编程方面的支持。OpenGL 的 GUI 必须由其它工具包创建,比如Qt。Qt的OpenGL模块使在Qt应用程序中使用OpenGL变的更加容易。它提供了一个OpenGL的部件类,这个部件类除了打开一个OpenGL显示缓冲,利用这个缓冲使用OpenGL应用编程接口来提供内容外,能像其它Qt部件那样的使用。

Starting out with OpenGL 2.1: 这是一个简单的 study guide.

QGLWidget

在Qt中OpenGL提供支持的类为:

  • QGLWidget:一个容易使用的Qt部件,它提供了OpenGL场景。
  • QGLContext:封装了OpenGL提供的上下文。
  • QGLFormat:对于一个给定的上下文,指定特定的显示模式。
  • QGLColormap:在GL-index中处理编入索引的colormaps。
FFmpeg是一个免费开放原码 的软体,可以执行音讯和视讯多种格式的的录影、转档、串流功能,包含了libavcodec ─这是一个用于多个专案中音讯和视讯的解码器函式库,以及 libavformat ——一个音讯与视讯格式转换函式库。FFmpeg is a complete solution to record, convert and stream audio and video. It includes libavcodec, the leading audio/video codec library. FFmpeg is developed under Linux, but it can compiled under most operating systems, including Windows.
视频技术论坛 » FFMPEG工程组
FFMPEG参数说明
: http://leezen.blogbus.com/logs/19276689.html
ffmpeg使用说明 http://blog.chinaunix.net/u/16166/showart_239248.html
An ffmpeg and SDL Tutorial

ffdshow is a media decoder and encoder mainly used for the fast and high-quality decoding of video in the MPEG-4 ASP (e.g. encoded with DivX, Xvid or FFmpeg MPEG-4) and AVC (H.264) formats, but supporting numerous other video and audio formats as well. It is free software released under the GPL license, runs on Windows and is implemented as a DirectShow and VFW decoding filter.

Xvid(旧称为XviD)是一个开放原始码的MPEG-4视频编解码器,它是基于OpenDivX而编写的。XviD是最新的MPEG-4 codec,而且是第一个真正开放源代码的,一旦完成就会通过GPL协议发布.
http://www.xvid.org/
Xvid in Baidu

Notepad++ and 一些杂谈

编 VHDL 我们研究所习惯用 Notepad++ 一是因为免费开源,二是的确很好用。它有一些有用的技巧如,Clone to another View, 在文档TAB上右击鼠标,点可以分屏幕进行编程,我一直使用分屏幕进行编程,很方便,便于调试。ctrl + shift + del : 整行删除。shift + TAB : TAB 消除。ctrl + shift + 上或下: 整行向上或向下移动。ctrl + d : 整行copy。

顺便谈谈提高使用工作的效率的方法,
1. linux下使用 bash 脚本语言编程. windows里使用批处理文件bat是很有用的。
2. 在工作是扔掉你的鼠标的确也是一个很不错的方法,但是要记住一些快捷键。

其实我根本记不住很多快捷键和一些命令,让我想一想,我能记住的Windows的快捷键和命令大概如下:
再多也记不住了,要google一下:) 。
Command Prompt: 看系统信息:systeminfo组合键:Ctrl + Tab,Windows键 + Tab 键(可以使任务栏图标进行切换),Windows键 +d(显示出电脑桌面),Windows键 + e, Windows键 + r
常用的windows run 命令:
XP的启动项命令:MSCONFIG
打开屏幕键盘:osk
系统配置实用程序:Msconfig.exe
简易widnows media player:mplayer2
远程桌面连接:mstsc
注册表 :regedit.exe
组策略结果集 :rsop.msc
注册表编辑器:regedt32
linux的命令,我只能记得一些常用的,常常要使用man命令。
对我来说最重要的命令就是man :)
man [-k] [command]
man intro
man bash info [command]
help [-s] [command]
参数:
-s: 用法摘要
-k: 在所有的man文档和简介中查找符合条件的命令

使用 local bus slave in FPGA 用于检测 VHDL Design

对FPGA进行测常常是一件很麻烦的工作。
这里有我最近的设计,例:
通过不同的从LOCAL BUS给定的地址可以从FPGA中很方便地读出所需要的测试数据。


status_multiplexer: process (I_ADR_test, DEBUG_PORT) is
begin
  case conv_integer(I_ADR_test)*4 is
  when 0 => I_DATA_IN_test_fpga2pc <= DEBUG_PORT(31 downto 0);
  when
4 => I_DATA_IN_test_fpga2pc <= DEBUG_PORT(63 downto 32);
  when
8 => I_DATA_IN_test_fpga2pc <= DEBUG_PORT(95 downto 64);
  when
12 => I_DATA_IN_test_fpga2pc<= DEBUG_PORT(127 downto 96); -- = 0xC
  when others
=> I_DATA_IN_test_fpga2pc <= "10101010101010101010101010101010";
end case;
end process
;


这里只用了一个很简单的multiplexer。
完成了对多个数据的测试。这个设计对于读取时地址资源稀少的 LOCAL BUS 设计很有帮助。可以只用一个 LOCAL BUS 但是可以读出不同的测试数据(在不同的时间)。我们只要给定 LOCAL BUS 的值 在本例中,给定 60004,就可以读出 DEBUG_PORT(63 downto 32)的数据。

Hanyi on ET

在这个博客我将和大家分享电子技术学习和其他一些有趣的事物.