视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
GEL语言的使用[1]
2025-09-30 23:19:23 责编:小OO
文档
1、GEL简介

GEL(General Extension Language,通用扩展语言)是类似与C的一种解释性语言,它可以创建GEL函数,以扩展CCS的用途。按照GEL的语法创建GEL函数加载到CCS即可。GEL支持以下类型的语句:

函数定义

函数参数

调用GEL函数

返回语句

if-else语句

while语句

GEL注释

预处理语句

2.如何将GEL函数加载到CCS的GEL菜单

a :hotmenu关键词

//joseph add

menuitem "Set_zone6" /*添加一级菜单Set_zone6*/

hotmenu Set_zone6() /*在Set_zone6下添加二级菜单Set_zone6*/ 

{

*(long *)0x0B34 = 0x00014c1f; /*XINTCNF2 config*/

*0x0B38 = 0x803e; /*XBANK config*/ 

*(long *)0x0B2C = 0x0043f1224; /*XTIMING6 config*/

}

b : dialog关键词

主要是创建一个需要输入参数的对话框

dialog funcName(参数1 “参数说明”,参数2 “参数说明”,......)

{

语句......

}

c : silder 关键词

主要是创建一个可以改变参数的滑动条

3.在CCS启动时自动加载GEL函数

将自己的函数加入到Startup()或者把自己的函数命名为Startup()

4.GEL函数简介

1).GEL_Go(adress)

CCS菜单中的debug->Go Main就是调用的这个函数

2).GEL_MapAdd( address , page , length , readable , writeable)

address:存储器起始地址

page:存储器类型0表示程序存储器,1表示数据存储器

length:定义的存储器长度

readable:定义存储器是否可读,1可读,0不可读

writeable:定义存储器是否可写,1可写,0不可写

3).GEL_WatchAdd("expression

将表达式添加到Watch窗口,参数lable可选

gel文件的应用

GEL--通用扩展语言,无类型语言,只有int类型,当CCS运行时首先执行这个GEL函数

当我们自己需要设定某功能上电后立即开启,那么可以在这个函数里面实现。

以2407的看门狗为例子,因为上电后2407的看门狗是自动开启的,但我们在调试程序的时候都是把看门狗关闭的,所以想在调试程序的时候可以把关看门狗的任务放在GEL中。

以下就是这个小程序

#define   WDCR    0X7029

#define   WDKEY   0X7025

Startup()

{

    WDCR=0X68;

}

Startup()函数在GEL文件加载时会自动运行,这样就可以实现上电关闭看门狗功能了

GEL(General Extension Language 通用扩展语言)是一种解释语言,类似与C语言,这个文件中的函数是按照先后顺序执行的。

GEL函数可以用来配置CCS开发环境,也可以用来初始化目标CPU。当启动CCS时,扫描启动的GEL文件并加载文件中包含的GEL函数,如果文件中包含Startup()函数,则包含的所有函数都运行

GEL存储空间映射函数可以用来描述处理器的存储空间映射。

Startup()

{

     /* startup 内的所有函数都要执行 */

GEL_MapOn();

GEL_MapAdd(0,0,0xf000,1,1);

GEL_MapAdd(0,1,0xf000,1,1);

}

1 GEL文件的改变

    使用CCSStudio Setup工具,可以为在系统配置中的每一个处理器指定一个启动GEL文件。当CCSStudio启动时,GEL文件加载到PC机的内存中,如果定义了StartUp()函数则执行该函数。在CCSStudio(V2.3或更早的版本中),主机和目标板的初始化工作都在Startup()函数中执行。但是对于支持Connect/Disconnect的CCSStudio,这样的GEL文件有可能没有正确的执行,因为CCSStudio启动时和目标处理器是断开的。当Startup()函数试图访问目标处理器时会出错。一个新的回调函数OnTargetConnect()来执行目标处理器的初始化工作。

2 GEL回调函数

2.1 Startup()函数

    如果指定的GEL文件中包含Startup()函数,当CCSStudio启动时执行Startup()函数。支持Connect/Disconnect的CCSStudio的启动时,Startup()函数中不包括访问目标处理器的代码,目标处理器由回调函数OnTargetConnect()来初始化。

推荐:

建立基本的CCSStudio内存映射关系(不需要访问目标处理器)

任何不需要访问目标处理器的基本初始化

不推荐:

Get_Reset()(该函数通过仿真器复位目标处理器)

通过GEL_BreakPtAdd()设置断点

GEL_TextOUT()和GET_OpenWindow(),因为StartUp()执行时CCSStudio的任何控制窗口还没有打开

不支持Connect/Disconnect的CCSStudio GEL文件中的StartUp()函数:

/* The StartUp() function is called each time CCS is started. */

/* Customize this function to perform desired initialization. */

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()函数:

/* The StartUp() function is called each time CCS is started. */

/* Customize this function to perform desired initialization */

/* that will not access the target. */

StartUp()

{

setup_memory_map();

}

2.2 OnTargetConnect()函数

推荐:

绝对最小的系统初始化处理,保证CCSStudio在目标处理器上处于一种可信赖的状态。例如:禁止看门狗时钟、DSP复位结束

每一次和目标处理器建立连接时都调用OnTargetConnect()函数。

/* OnTargetConnect() is called every time a target is connected.*/

/* Its execution finishes before anything else occurs. Customize*/

/* this function to perform essential target initialization. */

OnTargetConnect()

{

// place critical target initialization steps here

GEL_Reset();

init_emif();

}

对某些平台,必须调用GEL_Reset()函数使得CCSStudio处于一种“Good”状态,可以通过测试来确定是否需要调用GEL_Reset()函数。应该尽可能的降低GEL startup functions复杂度-包括减少GEL_Reset()的调用。

2.3 OnPreFileLoaded()函数

    在加载program/symbol(.out)文件之前该回调函数执行。在该函数中执行另外的目标处理器初始化操作以保证程序可以加载和调试是一个好的选择。

/* This function is called automatically when the 'Load Program'*/

/* Menu item is selected. */

OnPreFileLoaded()

{

FlushCache();

IER = 0;

IFR = 0;

init_emif();

}

2.4 OnReset()函数

    当目标处理器复位后该函数被调用。如果你需要每次重新启动程序设计了软复位,GEL_Restart()在此处调用。

/* This function is called automatically after a SW Reset has been executed. 

OnReset(int nErrorCode)

{

init_emif();

}

2.5OnRestart()函数

       当程序复位时调用该函数。

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 code multiple times.

OnRestart(int nErrorCode )

{

Turn off L2 for all EMIFA CE spaces. App should manage these for coherency 

GEL_TextOut("Turn off cache segment\\n");

*(int *)0x1848200 = 0; /* MAR0 */

*(int *)0x1848204 = 0; /* MAR1 */

*(int *)0x1848208 = 0; /* MAR2 */

*(int *)0x184820c = 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;

}

3 存储器映射

       CCSStudio存储器映射告诉调试器目标处理器的那些存储区域可以访问那些不能访问。CCSStudio存储器映射一般在StartUp()函数种执行。

3.1 GEL_MapAdd()函数

该函数添加一个存储区域到存储区映射中。

3.2 GEL_MapOn()和GEL_MapOff()函数

       可以调用GEL_MapOn() or GEL_MapOff()来打开或关闭存储区映射。当存储区映射关闭时,CCSStudio假定可以访问所有的存储区空间。

3.3 GEL_MapReset()函数

       GEL_MapReset()函数清除所有的存储区映射。没有存储区映射时,缺省设置是所有的存储区空间都不能访问。

4 尽量避免使用GEL初始化

       可以考虑在GEL文件中使用GEL_MapAdd()建立存储区映射以准许CCSStudio可以调试,但是不在GEL文件中执行外设设置例如:EMIF寄存器初始化、看门狗禁止。

       因为GEL语法和C兼容,inif_emif()函数可以在.c文件中实现,和应用程序链接在一起。但是要注意以下几点:

l         使用“volatile”来保证变量不被优化。例如:

*(volatile int *)EMIFA_SDRAMTIM = 0x00000618; /* SDRAM timing (refresh) */

       在编译调试过程中避免在GEL文件中进行外设设置,当到达了最终程序时,需要一个智能加载软件从FLASH或主机加载程序对EMIF进行设置,然后通过(E)DMA或memcpy()拷贝程序/数据。

 *.gel是你的秘书,可以帮你打杂

Gel文件用来处理一些繁琐的事情,例如我总是用Gel来自动初始化DSP系统,代码如下:

StartUp()

{

    int i;

    //setup_memory_map();

for( i=0; i<1000; i++) i=i;

    GEL_Reset(); 

for( i=0; i<1000; i++) i=i;

    init_emif();

for( i=0; i<1000; i++) i=i;

    GEL_ProjectLoad( "D:\\\i\\\\MyProjects\\\\EagleEye\\\\V100\\\\EagleEye.pjt");

for( i=0; i<10000; i++) i=i;

    GEL_Load( "D:\\\i\\\\MyProjects\\\\EagleEye\\\\V100\\\\debug\\\\EagleEye.out");

for( i=0; i<10000; i++) i=i;

    GEL_Go( main);

只要打开CCS,它就会自动依次执行:系统软件复位、配置EMIF的各种寄存器、打开项目文件、装载项目文件,并且自动执行到MAIN(),停在那里等着你继续操作。

如果不用Gel,你就麻烦了。

GEL 文件的功能同emuinit.cmd 的功能基本相同,用于初始化DSP。但它的功能比emuinit

的功能有所增强,GEL 在CCS 下有一个菜单,可以根据DSP 的对象不同,设置不同的初始

化程序。以TMS320LF2407 为例:

#define SCSR1 0x7018 ;定义scsr1 寄存器

#define SCSR2 0X7019 ;定义scsr2 寄存器 

#defineWDKEY 0x7025 ;定义wdkey 寄存器

#defineWDNTR 0x7029 ;定义wdntr 寄存器

StartUp() ; 开始函数

{

GEL_MapReset(); ; 存储空间复位GEL_MapAdd(0x0000,0,0x7fff,1,1); 定义程序空间从0000

-7fff 可读写

GEL_MapAdd(0x8000,0,0x7000,1,1); 定义程序空间从8000-f000 可读写

GEL_MapAdd(0x0000,1,0x10000,1,1); 定义数据空间从0000-10000 可读写

GEL_MapAdd(0xffff,2,1,1,1); 定义i/o 空间0xffff 可读写

GEL_MapOn(); 存储空间打开

GEL_MemoryFill(0xffff,2,1,0x40); 在i/o 空间添入数值40h

*(int *)SCSR1=0x0200; 给scsr1 寄存器赋值

*(int *)SCSR2=0x000C; 给scsr2 寄存器赋值,在这里可以进行mp/mc 方式的转换

*(int *)WDNTR=0x006f; 给wdntr 寄存器赋值

*(int *)WDKEY=0x055; 给wdkey 寄存器赋值

*(int *)WDKEY=0x0AA; 给wdkey 寄存器赋值

}

GEL文件只是在仿真器和目标系统上电的时候起到初始化dsp的作用

在上电后再改变GEL文件将不会对DSP产生影响

除非断电后再上电

贴上DSP5416的GEL文件

/* set PMST to: MP =  OVLY = 1; DROM off, CLKOUT on */

#define PMST_VAL        0x0ffe0u  

/* set wait-state control reg for: 2 w/s or more on i/o; one for ext memory */

#define SWWSR_VAL       0x2009u

/* set external-banks switch control for: no bank switching; BH set */

#define BSCR_VAL        0x02u

/* Set Default Reset Initialization Value */

#define    ZEROS        0x0000u

这一部分是对寄存器初始化

/* Set Peripheral Control Register Addresses for DEV_RESET */

#define DMPREC          0x0054u

#define DMSA            0x0055u

#define DMSDI           0x0056u

#define DMA_CH0_DMFSC_SUB_ADDR  0x0003u

#define DMA_CH1_DMFSC_SUB_ADDR  0x0008u

#define DMA_CH2_DMFSC_SUB_ADDR  0x000Du

#define DMA_CH3_DMFSC_SUB_ADDR  0x0012u

#define DMA_CH4_DMFSC_SUB_ADDR  0x0017u

#define DMA_CH5_DMFSC_SUB_ADDR  0x001cu

#define MCBSP0_SPSA     0x0038u

#define MCBSP0_SPSD     0x0039u

#define MCBSP1_SPSA     0x0048u

#define MCBSP1_SPSD     0x0049u

#define MCBSP2_SPSA     0x0034u

#define MCBSP2_SPSD     0x0035u

#define MCBSP_SPCR1_SUB_ADDR   0x0000u

#define MCBSP_SPCR2_SUB_ADDR   0x0001u

#define MCBSP_SRGR1_SUB_ADDR   0x0006u

#define MCBSP_SRGR2_SUB_ADDR   0x0007u

#define MCBSP_MCR1_SUB_ADDR    0x0008u

#define MCBSP_MCR2_SUB_ADDR    0x0009u

#define SRGR1_INIT             0x0001u

#define PRD0            0x0025u

#define TCR0            0x0026u

#define PRD1            0x0031u

#define TCR1            0x0032u

#define TIMER_STOP             0x0010u

#define TIMER_RESET            0x0020u

#define PRD_DEFAULT            0xFFFFu   

#define GPIOCR                 0x0010u

StartUp()

{

C5416_Init(); 

GEL_TextOut("Gel StartUp complete.\\n");

}

menuitem "C5416_Configuration";

hotmenu CPU_Reset()

{

GEL_Reset();

PMST = PMST_VAL;

/* don't change the wait states, let the application code handle it */

/* note: at power up all wait states will be the maximum (7)        */

/* SWWSR = SWWSR_VAL;                                          */

BSCR = BSCR_VAL;

GEL_TextOut("CPU Reset Complete.\\n");

}

/* All memory maps are based on the PMST value of 0xFFE8 */

hotmenu C5416_Init()

{

GEL_Reset();

PMST = PMST_VAL;

/* don't change the wait states, let the application code handle it */

/* note: at power up all wait states will be the maximum (7)        */

/* SWWSR = SWWSR_VAL;                                          */

BSCR = BSCR_VAL;

C5416_Periph_Reset();

GEL_XMDef(0,0x1eu,1,0x8000u,0x7f);

GEL_XMOn();

GEL_MapOn();

GEL_MapReset();

GEL_MapAdd(0x80u,0,0x7F80u,1,1); /* DARAM */

GEL_MapAdd(0x08000u,0,0x8000u,1,1); /* External */

GEL_MapAdd(0x18000u,0,0x8000u,1,1); /* DARAM */

GEL_MapAdd(0x18000u,0,0x8000u,1,1); /* SARAM */

GEL_MapAdd(0x28000u,0,0x8000u,1,1); /* SARAM */

GEL_MapAdd(0x0u,1,0x60u,1,1);  /* MMRs */

GEL_MapAdd(0x60u,1,0x7FA0u,1,1); /* DARAM */

GEL_MapAdd(0x08000u,1,0x8000u,1,1); /* DARAM */

GEL_TextOut("C5416_Init Complete.\\n"); }

/* ****************************** */

C5416_Periph_Reset()

{

IFR = 0xFFFFu;  

IFR = 0x0000u;  

DMA_Reset();

MCBSP0_Reset();

MCBSP1_Reset();

MCBSP2_Reset();

TIMER0_Reset();

GPIO_Reset();

}

DMA_Reset()

MCBSP0_Reset()

MCBSP1_Reset()

MCBSP2_Reset()

TIMER0_Reset()

GPIO_Reset()

在上面的各个初始化函数中,多半是把0值付给寄存器。当然这些初始化值如果用户不使用的话必须在主程序中做修改。

所以加载了GEL文件以后,并不一定所有的寄存器都是复位值,主程序中没有赋值的寄存器并不一定就是它的上电复位值,因为加上了仿真器,加载了GEL文件,起到了作用下载本文

显示全文
专题