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","lable")
将表达式添加到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:\\ti\\MyProjects\\EagleEye\\V100\\EagleEye.pjt");
for( i=0; i<10000; i++) i=i;
GEL_Load( "D:\\ti\\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文件,起到了作用