1.GEL简介
GEL(General Extension Language,通用扩展语言)是类似与C的一种解释性语言,它可以创建GEL函数,以扩展CCS的用途。按照GEL的语法创建GEL函数加载到CCS即可。GEL支持以下类型的语句:
函数定义
函数参数
调用GEL函数
返回语句
if-else语句
while语句
GEL注释
预处理语句
GEL文件的改变
使用CCSStudio Setup工具,可以为在系统配置中的每一个处理器指定一个启动GEL文件。当CCSStudio启动时,GEL文件加载到PC机的内存中,如果定义了StartUp()函数则执行该函数。在CCSStudio(V2.3或更早的版本中),主机和目标板的初始化工作都在Startup()函数中执行。但是对于支持Connect/Disconnect的CCSStudio,这样的GEL文件有可能没有正确的执行,因为CCSStudio启动时和目标处理器是断开的。当Startup()函数试图访问目标处理器时会出错。一个新的回调函数OnTargetConnect()来执行目标处理器的初始化工作。
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 存储器映射
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()函数清除所有的存储区映射。没有存储区映射时,缺省设置是所有的存储区空间都不能访问。
3).GEL_WatchAdd("expression","lable")
将表达式添加到Watch窗口,参数lable可选,expression必需
GEL文件的功能同emuinit.cmd的功能基本相同,用于初始化DSP。但它的功能比emuinit的功能有所增强,GEL在CCS下有一个菜单,可以根据DSP的对象不同,设置不同的初始化程序。以TMS320LF2407为例:
#define SCSR1 0x7018 ;定义scsr1寄存器
#define SCSR2 0X7019 ;定义scsr2寄存器
#define WDKEY 0x7025 ;定义wdkey寄存器
#define WDNTR 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寄存器赋值
}
参考http://processors.wiki.ti.com/index.php/GEL
一、cmd文件分析
1)系统定义:
.cinit 存放C程序中的变量初值和常量;
.const 存放C程序中的字符常量、浮点常量和用const声明的常量;
.switch 存放C程序中switch语句的跳针表;
.text 存放C程序的代码;
.bss 为C程序中的全局和静态变量保留存储空间;
.far 为C程序中用far声明的全局和静态变量保留空间;
.stack 为C程序系统堆栈保留存储空间,用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果;
.sysmem 用于C程序中malloc、calloc和realloc函数动态分配存储空间。
2)用户定义:
#pragma CODE_SECTION (symbol, "section name");
#pragma DATA_SECTION (symbol, "section name");
单个地址的时候可以使用 #define
如 #definemy_data *(volatile unsigned int*)0x000C
在数组变量时使用#pragma 宏
如 XXX.h/XXX.c
#pragma DATA_SECTION(my_data,".data_section")
unsigned char my_data[1024];
在xxx.cmd中建立.data_section并赋予地址就可以了。
3)cmd作用
cmd由3部分组成:
1)输入/输出定义:.obj文件:链接器要链接的目标文件;.lib文件:链接器要链接的库文件;.map文件:链接器生成的交叉索引文件;.out文件:链接器生成的可执行代码;链接器选项;
2)MEMORY命令:描述系统实际的硬件资源;
3)SECTIONS命令:描述“段”如何定位。
Link的cmd文件用于DSP代码的定位。由于DSP的编译器的编译结果是未定位的,DSP没有操作系统来定位执行代码,每个客户设计的DSP系统的配置也不尽相同,因此需要用户自己定义代码的安装位置。以C5000为例,基本格式为:
-o sample.out
-m sample.map
-stack 100
sample.obj meminit.obj
-l rts.lib
MEMORY {
PAGE 0: VECT: origin = 0xff80,length 0x80
PAGE 0: PROG: origin = 0x2000,length 0x400
PAGE 1: DATA: origin = 0x800,length 0x400
}
SECTIONS {
.vectors : {}>VECT PAGE 0
.text : {}>PROG PAGE 0
.data : {}>PROG PAGE 0
.cinit : {}>PROG PAGE 0
.bss : {} >DATA PAGE 1
}