GEL文件

    技术2022-05-11  94

    CCS2.2以后版本的GEL文件 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() 拷贝程序 / 数据。 xgbing 认证博客专家 驱动开发 arm开发 嵌入式硬件 专注于嵌入式方向的软硬件设计与开发(ASM\C\C ,RTOS,Linux,android,以太网\嵌入式网络协议栈,蓝牙,WIFI,文件系统/嵌入式存储,显示\音频,单片机\DSP\ARM\Cortex,电路设计\PCB布板\硬件驱动\数字逻辑CPLD,FPGA\niosII),目前从事VirtualBox\qemu\KVM虚拟化研究工作。

    最新回复(0)