存档在 2014年11月

Eigen与Matlab对应关系

2014年11月29日

1.求方程的特征根

// Solve Ax = b. Result stored in x. Matlab: x = A \ b.
bool solved;
solved = A.ldlt().solve(b, &x));  // A sym. p.s.d.    #include <Eigen/Cholesky>
solved = A.llt() .solve(b, &x));  // A sym. p.d.      #include <Eigen/Cholesky>
solved = A.lu()  .solve(b, &x));  // Stable and fast. #include <Eigen/LU>
solved = A.qr()  .solve(b, &x));  // No pivoting.     #include <Eigen/QR>
solved = A.svd() .solve(b, &x));  // Stable, slowest. #include <Eigen/SVD>
// .ldlt() -> .matrixL() and .matrixD()
// .llt()  -> .matrixL()
// .lu()   -> .matrixL() and .matrixU()
// .qr()   -> .matrixQ() and .matrixR()
// .svd()  -> .matrixU(), .singularValues(), and .matrixV()

2.求特征值与特征向量

// Eigenvalue problems
// Eigen                          // Matlab
A.eigenvalues();                  // eig(A);
EigenSolver<Matrix3d> eig(A);     // [vec val] = eig(A)
eig.eigenvalues();                // diag(val)
eig.eigenvectors();               // ve

3.其他

» 阅读更多: Eigen与Matlab对应关系

GL_PROJECTION、GL_MODELVIEW、GL_TEXTURE

2014年11月26日

这几个都是glMatrixMode()函数的参数,那就先说说glMatrixMode吧~,这个函数其实就是对接下来要做什么进行一下声明,也就是在要做下一步之前告诉计算机我要对“什么”进行操作了,这个“什么”在glMatrixMode的“()”里的选项(参数)有,GL_PROJECTION,GL_MODELVIEW和GL_TEXTURE;

如果参数是GL_PROJECTION,这个是投影的意思,就是要对投影相关进行操作,也就是把物体投影到一个平面上,就像我们照相一样,把3维物体投到2维的平面上。这样,接下来的语句可以是跟透视相关的函数,比如glFrustum()或gluPerspective();
如果参数是GL_MODELVIEW,这个是对模型视景的操作,接下来的语句描绘一个以模型为基础的适应,这样来设置参数,接下来用到的就是像gluLookAt()这样的函数;

若是GL_TEXTURE,就是对纹理相关进行操作;

顺便说下,OpenGL里面的操作,很多是基于对矩阵的操作的,比如位移,旋转,缩放,所以,这里其实说的规范一点就是glMatrixMode是用来指定哪一个矩阵是当前矩阵,而它的参数代表要操作的目标,GL_PROJECTION是对投影矩阵操作,GL_MODELVIEW是对模型视景矩阵操作,GL_TEXTURE是对纹理矩阵进行随后的操作。

我喜欢的VS2012插件

2014年11月4日

使用VS也好几年了,从最初的VC6.0,后面用过05,08,10,现在在用12,很多插件确实比较有用,这里我就放出来,当然这只是我自己比较喜欢的几款。

  • 1.astyle
  • 这是我最喜欢的插件,有时候在网上下载的源码格式很乱,使用它可以瞬间让代码风格变得漂亮。

  • 2.Indent Guides
  • 如果用过source insight的知道,在括号匹配的地方会有加虚线来对齐,这款插件也是干这个的,让括号匹配很明显,但是我还是喜欢vim里的%号查看括号匹配。

  • 3.Spell Checker
  • 拼写检查插件,用过word的人都知道。

  • 4.VSCommands
  • 这个插件强大着呢,调试辅助,编译辅助,同步设置,文件比较等等,自己安装后用用就知道了。

  • 5.visual assist x
  • 这个插件不用说了,老牌插件了。

  • 6.其他

IPNC SDK中remote_debug_client

2014年11月2日

如果不启用remote_debug_client.out,你将不会在终端中看见OSA_printf函数打印 M3/DSP 的信息。
因此,解决办法就是:

  • 1.可以运行init.sh
  • 2.直接运行./bin/remote_debug_client.out ${REMOTE_DEBUG_ADDR} &

另外他的源码位置为: $install_dir/Source/ipnc_rdk/ipnc_mcfw/mcfw/src_linux/utils/

可以略看其源码,并且在Linux启动时,我们可以看见如下信息

[c6xdsp ] Remote Debug Shared Memory @ 0xbff00000
[m3video] Remote Debug Shared Memory @ 0xbff10820
[m3vpss ] Remote Debug Shared Memory @ 0xbff21040

所以,针对不同的核,将各自的调试信息放在各自的地址上,由remote_debug_client来负责收发。

STATIC RemoteDebug_ClientObj gRemoteDebug_clientObj;
/**/
gRemoteDebug_clientObj.pCoreObj[coreId] = (RemoteDebug_CoreObj*)(gRemoteDebug_clientObj.coreObjVirtBaseAddr + sizeof(RemoteDebug_CoreObj)*coreId)

这段代码展示了为什么是上面三个地址!

typedef struct {

    volatile unsigned int headerTag;
    volatile unsigned int serverIdx;
    volatile unsigned int clientIdx;
    volatile unsigned int serverFlags[2]; // RESERVED, DO NOT USE
    volatile unsigned int clientFlags[2]; // RESERVED, DO NOT USE
    volatile unsigned int reserved;       // RESERVED, DO NOT USE

    volatile unsigned char serverLogBuf[REMOTE_DEBUG_LOG_BUF_SIZE];
    volatile unsigned char serverParamBuf[REMOTE_DEBUG_PARAM_BUF_SIZE]; // RESERVED, DO NOT USE
    volatile unsigned char clientParamBuf[REMOTE_DEBUG_PARAM_BUF_SIZE]; // RESERVED, DO NOT USE

} RemoteDebug_CoreObj

实际上,从地址0xbff00000开始,存放1个RemoteDebug_CoreObj全局结构体变量,这个结构体中分别用几个数组来存放各自的调试信息。

这下就很明白了…

DM8127 Linux端程序流程分析

2014年11月1日

今天看了DM8127 Linux端运行在A8核上程序流程,并分析以作备用。我们使用的解决方案是IPNC_SDK_3.5或者IPNC_SDK_3.8,Linux Host使用的是unbutu 10,以下分析都是针对A8运行Linux下的程序。

1.程序启动流程

    1.1.Linux系统开机执行/etc/rcS/dS99finish.sh这个脚本

整个脚本实际上是/etc/init.d/finish_ubifs.sh的一个软连接,可以看看这个脚本详情:

#!/bin/sh
echo ' inside finish.sh '
if ! test -e /etc/.configured; then
	> /etc/.configured
fi
echo 33 > /sys/class/gpio/export
echo 85 > /sys/class/gpio/export
echo 103 > /sys/class/gpio/export
echo 104 > /sys/class/gpio/export
echo 105 > /sys/class/gpio/export
echo 106 > /sys/class/gpio/export
echo 107 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio33/direction
echo out > /sys/class/gpio/gpio104/direction
/opt/ipnc/smart_mount UBIFS /dev/mtd5 /mnt/nand
mkdir /tmp/nand
/opt/ipnc/smart_mount UBIFS /dev/mtd7 /tmp/nand
rm -f /tmp/nand/boa-temp.bin
cd /opt/ipnc
./init.sh
./system_server&
sleep 7
./autorun_ipnc.sh&
cd /

首先挂载文件系统到/dev/mmtd5,因此在每次更新程序后,最好先flash_eraseall /etc/mtd5,接着执行init.sh初始化脚本,启动system_server进程,最后执行autorun_ipnc.sh脚本

    1.2.init.sh初始化脚本

这个脚本除了加载一些驱动或者模块外,还主要运行了./bin/remote_debug_client.out 0xbff00000 ./linux_prcm_ipcam

    1.3.autorun_ipnc.sh初始化脚本

也是执行一些初始化工作,并执行下面程序

cd /opt/ipnc
./boot_proc 1&
sleep 2
./boa -c /etc &
sleep 2
./boot_proc 2&
sleep 2

2.程序运行流程

整个RDK仅仅提供了一个可供执行的工程,Demo位于\ipnc_rdk\ipnc_mcfw\demos,其中的ipnc_rdk\ipnc_mcfw\demos\mcfw_api_demos\multich_usecase为usecase工程主函数所在目录,主函数文件为ti_mcfw_ipnc_main.c

在ipnc_rdk\ipnc_mcfw\mcfw\src_linux\mcfw_api\usecases目录下我们可以看见很多usecase,不同的usecase针对不同的应用场景,在每个usecase的源文件里我们可以看到流程图。

那么multich_usecase与usecases是什么关系呢,看下面各个步骤分析:

    2.1.Demo主函数运行

在使用make -s mcfw_linux交叉编译后,会生成这个demo的可执行程序ipnc_rdk_mcfw.out,在主函数中,会调用函数

Vsys_create();

这个函数可以从提供的chm帮助文档中查到,他的解释如下:

Create and setup processing block’s based on sub-system configuration.
This API should be called after sub-system init’s ( Vxxx_init() ). This API will allocate and setup all HW resource in order for the system use-case to run. Once this API succeds now the sub-system’s can be started to start the system execution

    2.2.Vsys_create主函数运行

在Vsys_create中,根据系统配置的usecase(应用场景)选择不同的处理函数,代码如下:

switch (gVsysModuleContext.vsysConfig.systemUseCase) {

        case VSYS_USECASE_MULTICHN_TRISTREAM_LOWPWR:
            MultiCh_createTriStreamLowPwr();
            break;
		case VSYS_USECASE_TRISTREAM_SMARTANALYTICS:			
        case VSYS_USECASE_MULTICHN_TRISTREAM_FULLFTR:
            MultiCh_createTriStreamFullFtr();
            break;
        case VSYS_USECASE_DUALCHN_DISPLAY:
            MultiCh_createStreamCaptureDisplay();
            break;
		case VSYS_USECASE_ENC_A8_DEC:
			MultiCh_createEncA8Dec();
			break;
		case VSYS_USECASE_MULTICHN_QUADSTREAM_NF:
			MultiCh_createQuadStreamNf();
			break;
        case VSYS_USECASE_DUALCHN_DEMO:
            MultiCh_createStreamDualStreamDemo();
            break;
		case VSYS_USECASE_MCTNF_DEMO:
			MultiCh_createStreamCaptMctnfDisplay();
			break;
		case VSYS_USECASE_RVM_DEMO:
			MultiCh_createRvm();
			break;			
        case VSYS_USECASE_MAX:
        default:
            break;
    

这些函数都声明在\ipnc_rdk\ipnc_mcfw\mcfw\src_linux\mcfw_api\ti_vsys_priv.h中,那么哪些文件来实现这些函数呢,就得看哪些源文件或者头文件包含了这个头文件。在ipnc_rdk\ipnc_mcfw\mcfw\src_linux\mcfw_api\usecases中的multich_common.h中包含了该头文件,现在目标转到multich_common.h上,查看usecases目录下的的所有usecase都会看见包含了multich_common.h头文件。

所以,Vsys_create中使用switch针对不同的应用场景分发到不同的usecase,对应关系如下

这个函数可以从提供的chm帮助文档中查到,他的解释如下:

VSYS_USECASE_MULTICHN_TRISTREAM_LOWPWR——multich_tristream_lowpower.c
VSYS_USECASE_TRISTREAM_SMARTANALYTICS——multich_tristream_fullfeature.c
VSYS_USECASE_MULTICHN_TRISTREAM_FULLFTR——multich_tristream_fullfeature.c
VSYS_USECASE_DUALCHN_DISPLAY——multich_dualstream_demo.c
VSYS_USECASE_ENC_A8_DEC——multich_encode_decode.c
VSYS_USECASE_MULTICHN_QUADSTREAM_NF——multich_quadstream_noisefilter.c
VSYS_USECASE_DUALCHN_DEMO——multich_dualstream_demo.c
VSYS_USECASE_MCTNF_DEMO——multich_captMctnfDisp.c
VSYS_USECASE_RVM_DEMO——multich_rvm.c

至此,明白了,整个RDK提供的唯一的Demo工程为multich_usecase,整个工程中根据配置使用不同的usecase作为应用场景,我们可以很容易添加自己的usecase了。

    2.3.link与chain

另外通过这些usecase,我们可以看到link如何被组织成chain,如果要看link如何实现,在哪里实现的话,我们还是按照这个方向反推multich_common.h->ti_vsys_priv.h,是不是在ti_vsys_priv.h中看见了好多Link的头文件,随便打开一个就知道怎么实现了。