打印

CCS2.2和CCS3.1在读写GEL文件上的区别(转)

[复制链接]
1282|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
elecintop|  楼主 | 2015-10-28 14:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的是一块从学长那儿拿过来的DSP开发板,从板子上看不出来是哪家做的,芯片型号是TMS320DM642,从芯片的型号就可以看出这块板子主要是围绕图像处理,仿真器是SEED XD510的,我从合众达的官方网站上找到了CCS2.2、3.1、3.3三个版本的驱动,并搞到了合众达另外一套试验箱图像处理方面的源程序,于是自己想在板子上跑一下。刚开始用的是CCS2.2的版本,虽然比较老,但是和win7竟然也兼容的很好,跑了一些那套程序竟然也基本兼容,看来两套板子在硬件上没什么太大的差别。后来电脑重装系统后我换了CCS3.1,在去跑那套程序发现部分程序就运行不正常了,好了下面换回正题,说一下我遇到的问题:跑灰度图像的处理没什么问题,一切正常,一旦跑彩色图像出来的图像就全花了,于是我又装了一个2.2的版本试试,发现是正常的,原程序也是2.2的版本编译的,难道2.2和3.1兼容性有问题?

先说说2.2和3.1在使用上的区别,最明显的是CCS2.2必须在目标板连接后才能打开,打开软件之后CPU的状态就是HALT,而CCS3.1在软件打开之后的状态时UNKNOWN,需要手动去debug-connect,也就是说CCS3.1需要手动连接目标版,支持离线的编译,其他方面的区别不是特别大(当然这是对于我这个小菜鸟而言)。

    另外就是在芯片配置上面,CCS2.2在配置的最后会出现选择GEL文件,而CCS3.1选择完端口之后直接就完了,刚开始我就忽略了这个问题,GEL文件用的是默认的EVMDM642.gel,导致部分程序运行不正常。

相关帖子

沙发
elecintop|  楼主 | 2015-10-28 14:19 | 只看该作者
这里说一下gel文件,各类文件时芯片的初始化配置文件,往往不同的开发板需要用不同的gel文件,这是因为不同的开发板的硬件连接可能不同,因此很多芯片的地址也就不一样,因此需要不同的文件来进行配置。在打开之后的界面可以看到GELfiles,这里面即是初始化配置文件,因此gel文件很重要。



在我发现gel文件不一致后,我第一想法是换掉这个文件,于是我重新配置,gel文件由默认的CCStudio_v3.1\cc\gel\EVMDM642.gel换成SEEDDM642.gel。结果在打开CCS的时候弹出警告GEL:Error while executing StartUp(): Target must be connected before calling the function G也不管他,点击确定打开之后连接芯片提示GEL: Error calling OnPreFileLoaded(): memory map prevented write to target memory at 0x01800054,将程序写入之后还是不正常。原来程序不正常我认为是由于gel文件的原因,2.2里面用的是SEEDDM642.gel的配置文件,里面相关是配置显然是根据开发板做了调整,所以正常运行,后来由于设置的是默认的EVMDM642.gel,这个我查了一下是针对TI公司的开发板的,和我手中的板子不太兼容,于是除了问题,现在在3.1的环境下换成了SEEDDM642.gel下载程序都出错显然是2.2和3.1不兼容的地方了。下面具体谈一下GEL文件的执行过程。使用CCSStudio Setup工具,可以为在系统配置中的每一个处理器指定一个启动GEL文 件。当CCSStudio启动时,GEL文 件加载到PC机的内存中,由CCS根据加载的GEL文件对目标板进行初始化。在CCS2.2中,主机和目标板的初始化工作都在GEL文件的Startup()函数中执行,而CCS2.2必须在打开时就会连接目标板同时进行初始化。但是对于支持Connect/Disconnect的CCSStudio例如CCS3.1,打开后目标板并没有被自动连接,这样的GEL文件中的初始化程序并没有正确执行,因为CCSStudio启动时和目标处理器是断开的。当Startup()函数试图访问目标处理器时会出错。因此在CCS3.1中需要回调函数来重新执行初始化。下面可以将SEEDDM642.gel和EVMDM642.gel做一个对比。

使用特权

评论回复
板凳
elecintop|  楼主 | 2015-10-28 14:20 | 只看该作者
首先是SEEDDM642.gel中的StartUp()


view plaincopy to clipboardprint?
StartUp()   
{   
    setup_memory_map();   
    GEL_Reset();     
    init_emif();   
}  
StartUp()
{
    setup_memory_map();
    GEL_Reset();  
    init_emif();
}




EVMDM642.gel中的StartUp()



view plaincopy to clipboardprint?
StartUp()   
{   
    setup_memory_map();   
  
    /*------------------------------------------------------*/  
    /* Uncomment the OnTargetConnect() call for CCS 2.X     */  
    /* support.                                             */  
    /*                                                      */  
    /*                                                      */  
    /*------------------------------------------------------*/  
    //OnTargetConnect();   
}  
StartUp()
{
    setup_memory_map();

    /*------------------------------------------------------*/
    /* Uncomment the OnTargetConnect() call for CCS 2.X     */
    /* support.                                             */
    /*                                                      */
    /*                                                      */
    /*------------------------------------------------------*/
    //OnTargetConnect();
}


从这个函数的对比就可以看到前一个在StartUp()中就已经完成了GEL和emif的初始化工作,而在后一个中就没有,这一点和前面说的软件打开时目标板的连接方式刚好一致。

因此在CCS3.1的gel文件中就多了这样一段函数:

view plaincopy to clipboardprint?
OnTargetConnect()   
{   
    /*------------------------------------------------------*/  
    /* GEL_Reset() is used to deal with the worst case      */  
    /* senario of unknown target state.  If for some reason */  
    /* a reset is not desired upon target connection,       */  
    /* GEL_Reset() may be removed and replaced with         */  
    /* something "less brutal" like a cache initialization  */  
    /* function.                                            */  
    /*------------------------------------------------------*/  
    //GEL_Reset();   
  
    init_emif();   
  
    GEL_TextOut("GEL StartUp Complete.\n");   
}  
OnTargetConnect()
{
    /*------------------------------------------------------*/
    /* GEL_Reset() is used to deal with the worst case      */
    /* senario of unknown target state.  If for some reason */
    /* a reset is not desired upon target connection,       */
    /* GEL_Reset() may be removed and replaced with         */
    /* something "less brutal" like a cache initialization  */
    /* function.                                            */
    /*------------------------------------------------------*/
    //GEL_Reset();

    init_emif();

    GEL_TextOut("GEL StartUp Complete.\n");
}


即在目标板连接的时候进行初始化操作,由此就可以理解为什么前面弹出的警告了,将SEEDDM642.gel对应的部分修改后在运行警告消失,即在软件打开时不对芯片初始化,改在芯片连接时进行。

使用特权

评论回复
地板
elecintop|  楼主 | 2015-10-28 14:20 | 只看该作者
    同样可以看一下gel文件中的其他函数:

view plaincopy to clipboardprint?
/*--------------------------------------------------------------*/  
/* OnReset()                                                    */  
/* This function is called by CCS when you do Debug->Resest.    */  
/* The goal is to put the C6x into a known good state with      */  
/* respect to cache, edma and interrupts.                       */  
/*--------------------------------------------------------------*/  
OnReset( int nErrorCode )   
{   
    init_emif();   
}   
  
/*--------------------------------------------------------------*/  
/* OnPreFileLoaded()                                            */  
/* This function is called automatically when the 'Load Program'*/  
/* Menu item is selected.                                       */  
/*--------------------------------------------------------------*/  
OnPreFileLoaded()   
{   
    /*------------------------------------------------------*/  
    /* GEL_Reset() is used to deal with the worst case      */  
    /* senario of unknown target state.  If for some reason */  
    /* a reset is not desired upon target connection,       */  
    /* GEL_Reset() may be removed and replaced with         */  
    /* something "less brutal" like a cache initialization  */  
    /* function.                                            */  
    /*------------------------------------------------------*/  
    //GEL_Reset();   
  
    flush_cache();   
    IER = 0;   
    IFR = 0;   
    init_emif();   
}   
  
/*--------------------------------------------------------------*/  
/* OnRestart()                                                  */  
/* This function is called by CCS when you do Debug->Restart.   */  
/* The goal is to put the C6x into a known good state with      */  
/* respect to cache, edma and interrupts.                       */  
/* Failure to do this can cause problems when you restart and   */  
/* run your application code multiple times.  This is different */  
/* then OnPreFileLoaded() which will do a GEL_Reset() to get the*/  
/* C6x into a known good state.                                 */  
/*--------------------------------------------------------------*/  
OnRestart( int nErrorCode )   
{   
    /*------------------------------------------------------*/  
    /* Turn off L2 for all EMIFA CE spaces.  App should     */  
    /* manage these for coherancy in the application.       */  
    /* GEL_TextOut("Turn off cache segment\n");             */  
    /*------------------------------------------------------*/  
    *(int*)0x01848200 = 0;          // MAR0   
    *(int*)0x01848204 = 0;          // MAR1   
    *(int*)0x01848208 = 0;          // MAR2   
    *(int*)0x0184820c = 0;          // MAR3   
  
    /*------------------------------------------------------*/  
    /* Disable EDMA events and interrupts and clear any     */  
    /* pending events.                                      */  
    /* GEL_TextOut("Disable EDMA event\n");                 */  
    /*------------------------------------------------------*/  
    *(int*)0x01A0FFA8 = 0;          // CIERH   
    *(int*)0x01A0FFB4 = 0;          // EERH   
    *(int*)0x01A0FFB8 = 0XFFFFFFFF; // ECRH   
  
    *(int*)0x01A0FFE8 = 0;          // CIERL   
    *(int*)0x01A0FFF4 = 0;          // EERL   
    *(int*)0x01A0FFF8 = 0xFFFFFFFF; // ECRL   
  
    /* Disable other interrupts */  
    IER = 0;   
    IFR = 0;   
}  
/*--------------------------------------------------------------*/
/* OnReset()                                                    */
/* This function is called by CCS when you do Debug->Resest.    */
/* The goal is to put the C6x into a known good state with      */
/* respect to cache, edma and interrupts.                       */
/*--------------------------------------------------------------*/
OnReset( int nErrorCode )
{
    init_emif();
}

/*--------------------------------------------------------------*/
/* OnPreFileLoaded()                                            */
/* This function is called automatically when the 'Load Program'*/
/* Menu item is selected.                                       */
/*--------------------------------------------------------------*/
OnPreFileLoaded()
{
    /*------------------------------------------------------*/
    /* GEL_Reset() is used to deal with the worst case      */
    /* senario of unknown target state.  If for some reason */
    /* a reset is not desired upon target connection,       */
    /* GEL_Reset() may be removed and replaced with         */
    /* something "less brutal" like a cache initialization  */
    /* function.                                            */
    /*------------------------------------------------------*/
    //GEL_Reset();

    flush_cache();
    IER = 0;
    IFR = 0;
    init_emif();
}

/*--------------------------------------------------------------*/
/* OnRestart()                                                  */
/* This function is called by CCS when you do Debug->Restart.   */
/* The goal is to put the C6x into a known good state with      */
/* respect to cache, edma and interrupts.                       */
/* Failure to do this can cause problems when you restart and   */
/* run your application code multiple times.  This is different */
/* then OnPreFileLoaded() which will do a GEL_Reset() to get the*/
/* C6x into a known good state.                                 */
/*--------------------------------------------------------------*/
OnRestart( int nErrorCode )
{
    /*------------------------------------------------------*/
    /* Turn off L2 for all EMIFA CE spaces.  App should     */
    /* manage these for coherancy in the application.       */
    /* GEL_TextOut("Turn off cache segment\n");             */
    /*------------------------------------------------------*/
    *(int*)0x01848200 = 0;          // MAR0
    *(int*)0x01848204 = 0;          // MAR1
    *(int*)0x01848208 = 0;          // MAR2
    *(int*)0x0184820c = 0;          // MAR3

    /*------------------------------------------------------*/
    /* Disable EDMA events and interrupts and clear any     */
    /* pending events.                                      */
    /* GEL_TextOut("Disable EDMA event\n");                 */
    /*------------------------------------------------------*/
    *(int*)0x01A0FFA8 = 0;          // CIERH
    *(int*)0x01A0FFB4 = 0;          // EERH
    *(int*)0x01A0FFB8 = 0XFFFFFFFF; // ECRH

    *(int*)0x01A0FFE8 = 0;          // CIERL
    *(int*)0x01A0FFF4 = 0;          // EERL
    *(int*)0x01A0FFF8 = 0xFFFFFFFF; // ECRL

    /* Disable other interrupts */
    IER = 0;
    IFR = 0;
}

由此可以更深刻的了解gel文件的作用和两个版本的区别了。

使用特权

评论回复
5
zhuotuzi| | 2015-10-29 14:23 | 只看该作者
GEL文 件加载到PC机的内存中,由CCS根据加载的GEL文件对目标板进行初始化

使用特权

评论回复
6
稳稳の幸福| | 2015-10-29 15:59 | 只看该作者
   setup_memory_map();   

使用特权

评论回复
7
Snow7| | 2015-10-31 09:03 | 只看该作者
CCS2.2必须在目标板连接后才能打开

使用特权

评论回复
8
拉克丝| | 2015-10-31 09:13 | 只看该作者
感谢楼主分享,支持一下

使用特权

评论回复
9
公孙璇娟| | 2015-10-31 17:09 | 只看该作者
.GEL文件,是配置文件么?

使用特权

评论回复
10
chenci2013| | 2015-10-31 21:49 | 只看该作者
这个没有注释吗?

使用特权

评论回复
11
isseed| | 2015-10-31 22:12 | 只看该作者
现在都使用ccs5了

使用特权

评论回复
12
isseed| | 2015-10-31 22:14 | 只看该作者
3版本的都快过时了,不过支持的仿真器真多。

使用特权

评论回复
13
isseed| | 2015-10-31 22:21 | 只看该作者
这个GEL还有区别吗

使用特权

评论回复
14
suzhanhua| | 2015-10-31 22:35 | 只看该作者
CCS的GEL语言是一种交互式的命令,它是解释执行的,即不能被编译成可执行文件。它的作用在于扩展了CCS Studio的功能,可以用gel来调用一些菜单命令,对DSP的存储器进行初始化配置等。 对于不同型号的DSP,我们应选择相对应的GEL文件。
         当CCS Studio启动时,GEL文件加载到PC机的内存中,如果定义了StartUp()函数则执行该函数在CCS Studio(V2.3或更低的版本中),主机和目标板的初始化工作都在Startup()函数中执行。但是对于支持Connect /Disconnect的CCS Studio(V2.4或之后的版本,比如3.1版本,3.3版本),GEL文件可能并没有正确的执行。因为CCS Studio启动时和目标处理器之间的连接是断开的,当Startup()函数试图访问目标处理器时会出错。因此,V2.4或之后的版本,当CCS启动 时,用一个新的回调函数OnTargetConnect()来执行目标处理器的初始化工作。
对于支持Connect/Disconnect的CCS Studio:CCS Studio启动时,如果指定的GEL文件中包含Startup()函数,通过它建立基本的CCSStudio内存映射关系,进行不需要访问目标处理器的 基本初始化操作。Startup()函数中不用包括访问目标处理器的代码,目标处理器由回调函数OnTargetConnect()来初始化。

使用特权

评论回复
15
suzhanhua| | 2015-10-31 22:36 | 只看该作者
Startup()函数中尽量避免Get_Reset()、GEL_BreakPtAdd()、GEL_TextOUT()和GET_OpenWindow(),因为StartUp()执行时CCSStudio的任何控制窗口还没有打开。
我们对两种不同的gel文件进行对比,让大家更容易理解。
不支持Connect/Disconnect的CCSStudio GEL文件中的StartUp()函数:
             StartUp()
{
setup_memory_map();
GEL_Reset(); /* Do not call in StartUp() with CCStudio v2.4 or higher */
init_emif(); /* Do not call in StartUp() with CCStudio v2.4 or higher */
}
支持Connect/Disconnect的CCSStudio GEL文件中的StartUp()函数:
StartUp()
{
setup_memory_map();
}
OnTargetConnect()函数在每一次和目标处理器建立连接时都被调用。进行绝对最小的系统初始化处理,保证CCSStudio在目标处 理器上处于一种可信赖的状态例如:禁止看门狗时钟、DSP复位结束。 对于某些平台,调用GEL_Reset()函数可使CCSStudio处于一种Good状态,可以通过测试来确定是否需要调用。
我们可看出后一种仅建立了存储映射。其他初始化dsp的工作交给了OnTargetConnect()函数去完成。下面我们以6437为例,gel的源码如下:
StartUp( )
{
    Setup_Memory_Map( );
}
OnTargetConnect( )
{
    Setup_Cache( );
    Setup_Pin_Mux( );               // Setup Pin Mux
    Setup_Psc_All_On( );            // Setup Power Domains
    Setup_PLL0_594_MHz_OscIn( );    // Setup Pll1 [DSP @ 594 MHz][Core 1.20V]
    Setup_PLL1_DDR_135_MHz_OscIn();
    Setup_Aemif_8Bit_Bus( );        // Setup Async-EMIF [8-bit bus]
  }

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

176

主题

1329

帖子

3

粉丝