DSP开发中关于gel文件的知识扫盲及GEL在工程中的应用
GEL--通用扩展语言,无类型语言,只有int类型,当DSP.com/forum.php?mod=forumdisplay&fid=58" target="_blank" class="relatedlink">CCS运行时首先执行这个GEL函数;
当我们自己需要设定某功能上电后立即开启,那么可以在这个函数里面实现。以2407的看门狗为例子,因为上电后2407的看门狗是自动开启的,但我们在调试程序的时候都是把看门狗关闭的,所以想在调试程序的时候可以把关看门狗的任务放在GEL中以下就是这个小程序(欢迎指正)
- #define WDCR 0X7029
- #define WDKEY 0X7025
- Startup()DSP
- {
- 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()来初始化。
推荐:
l 建立基本的CCSStudio内存映射关系(不需要访问目标处理器)
l 任何不需要访问目标处理器的基本初始化
不推荐:
l Get_Reset()(该函数通过仿真器复位目标处理器)
l 通过GEL_BreakPtAdd()设置断点
l 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()函数
推荐:
l 绝对最小的系统初始化处理,保证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()拷贝程序/数据。
|