DSP的Gel作用

转自:http://blog.csdn.net/azhgul/article/details/6660960
最近刚在研究Davinci系,特此MARK下,以资后续学习之用。

DSP的Gel作用

1 GEL文件基本作用

当CCSStudio启动时,GEL文件加载到PC机的内存中,如果定义了StartUp()函数则执行该函数在CCSStudio(V2.3或更早的版本中),主机和目标板的初始化工作都在Startup()函数中执行但是对于支持Connect/Disconnect的CCSStudio(V2.4或之后的版本,尤其3.1版本),这样的GEL文件有可能没有正确的执行,因为CCSStudio启动时和目标处理器是断开的这个时候,当Startup()函数试图访问目标处理器时会出错

因此,V2.4或之后的版本,尤其3.1版本CCS启动时候,一个新的回调函数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()函数

 绝对最小的系统初始化处理,保证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文件中实现,和应用程序链接在一起但是要注意以下几点:

使用volatile来保证变量不被优化例如:

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

转载于:https://www.cnblogs.com/gune/p/3240566.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/274109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决关于登录校园网显示不在IP段的问题方案(要看注意事项哦!)

有时,登录校园网,账号和密码都显示正确,但是却显示出“账号只能在指定IP段登录”的问题。 那我们就提供了一个解决方案: 使用WinR,并在输入框,输入cmd命令:(如下)接着输入&#xff1…

jquery插件编写

jQuery为开发插件提拱了两个方法,分别是: jQuery.fn.extend(object); jQuery.extend(object); jQuery.extend(object); 为扩展jQuery类本身.为类添加新的方法。可以理解为添加静态方法。是全局的(位于jQuery命名空间内部的函数)…

gtk/Glade编程 编译命令不成功 解决方法

摘自:http://blog.chinaunix.net/uid-26746982-id-3433656.html 当我们编写gtk/glade程序,gcc编译时,用如下命令: #gcc -o server server.c pkg-config --cflags --libs gtk-2.0 报错:/tmp/ccoXadAd.o: In function …

Android 第十五课 如何使用LitePal从SQLite数据库中删除数据(十四课用来保留讲解如何向SQLite数据库中存入数据)

使用LitePal删除数据的方式主要有两种,第一种就是直接调用已存对象的delete()方法,所谓已存储对象就是调用过save()方法的对象,或者说是通过LitePal提供的查询API查出来的对象,都是可以直接使用delete方法来删除对象的。这是比较简…

页面返回顶部(方法比较)

下面就说下简单的返回顶部效果的代码实现&#xff0c;附注释说明。 1. 最简单的静态返回顶部&#xff0c;点击直接跳转页面顶部&#xff0c;常见于固定放置在页面底部返回顶部功能 方法一&#xff1a;用命名锚点击返回到顶部预设的id为top的元素 html代码 <a href"#top…

Android 第十六课 使用LitePal查询数据

LitePal在查询API方面做了非常多的优化&#xff0c;基本上可以满足绝大多数场景的查询需求&#xff0c;并且代码也十分整洁。 例如我们需要查询表中的所有数据&#xff1a; List<books> DataSupport.findAll(Book.class); 没有冗长的参数列表&#xff0c;只需要调用一下…

linux创建桌面图标,和开始菜单栏图标

转自&#xff1a;http://blog.csdn.net/qq_25773973/article/details/50514767 ###环境&#xff1a;Mint17&#xff0c;&#xff08;其他类似的linux系统是一样的&#xff09; 如果开始菜单有图标&#xff0c;创建桌面图标很简单&#xff0c;右键添加到桌面即可。 如果没有&am…

ScrollView中使用ListView

转自 http://blog.csdn.net/fzh0803/article/details/7971391 由于scrollview和listview不能直接共存&#xff0c;在scrollview中直接使用lsitview的话只会显示一个条目&#xff0c;要使他们共存&#xff0c; 据我所知&#xff0c;有三种方法&#xff1a; 1。如果listview的高度…

Android 第十四课 使用LitePal添加数据(更新数据)

我们注意到当你登录一个app&#xff0c;是不是需要先注册呢&#xff1f;&#xff0c;所谓注册&#xff0c;简单地来理解是不是就是把输入框中地数据传入数据库中呢&#xff1f; 这里我们设置简单一点&#xff0c;注册的信息只包括两项&#xff0c;一项是用户名&#xff0c;另一…

微信公众平台的服务号和订阅号

微信公众平台 服务号 订阅号 作者&#xff1a;方倍工作室 地址&#xff1a;http://www.cnblogs.com/txw1958/p/ServiceNumber-subscriptionNumber.html 什么是服务号&#xff1f; 服务号给企业和组织提供更强大的业务服务与用户管理能力&#xff0c;帮助企业快速实现全新的公众…

Android 第十七课 碎片的简单用法及动态添加碎片

Fragment(碎片)是一种可以嵌入在活动当中的UI片段&#xff0c;它可以让程序更加合理和充分的利用大屏幕的空间。碎片和活动太像了&#xff0c;同样都包含布局&#xff0c;都有自己的声明周期&#xff0c;可以将碎片理解为一种迷你型的活动。 新建FragmentTest项目。假设项目已经…

在Linux下禁用键盘、鼠标、触摸板(笔记本)等输入设备

在Linux系统下禁用键盘、触摸板、鼠标等输入设备&#xff0c;可以通过xinput命令来实现&#xff1a;主要涉及&#xff1a;#xinput list#xinput list-props list-number#xinput set-prop list-number func-number 1/0具体操作如下&#xff1a;step1&#xff1a;查看系统中有那些…

委托又给我惹麻烦了————记委托链的取消注册、获取返回值

今天改bug碰到了一个问题&#xff0c;有多个方法注册到了一个事件里去&#xff0c;而这些方法本身又有点儿互斥&#xff0c;因而造成了bug&#xff0c;哥调试半天才发现&#xff0c;郁闷至极&#xff0c;遂复习了以前的知识并进行适当延伸&#xff0c;再将成果记录及分享之&…

Python第一课

对python仰慕已久&#xff0c;今日下定决心学习。可能我是一时头脑发热&#xff0c;但我还是愿意坚持。 先了解一下&#xff1a;命令行模式和Python交互模式 在Windows开始菜单选择“命令提示符”&#xff0c;就进入到命令行模式&#xff0c;它的提示符类似C:\>&#xff1a;…

C++模板专门化与重载

最近在复习C有关知识&#xff0c;又重新看<<Effective C>>&#xff0c;收获颇丰。原来以前看这边书&#xff0c;好多地方都是浅尝辄止。<<Effective C>>条款25&#xff1a;考虑写出一个不抛出异常的swap函数&#xff0c;涉及到C模板专门化(Templates S…

Android 第十八课 强大的滚动控件 RecyclerView

步骤&#xff1a; 一、添加依赖库compilecom.android.support:recyclerview-v7:26.1.0 二、在activity_mian.xml中&#xff0c;添加RecyclerView控件&#xff0c;并占据整个页面。 三、把你要在RecyclerView中展示的内容&#xff0c;设置成一个实体类Fruit&#xff0c;接着为Re…

通过rtcwake命令设置系统S3(休眠到内存)/S4(挂起到硬盘)一段时间后自动唤醒

rtcwake -m disk -s 60 //S4&#xff08;挂起&#xff09;60秒后自动唤醒 rtcwake -m mem -s 60 //S3(休眠&#xff09;60秒后自动唤醒

电商首页设计的时候,就应该考虑这个

如果有目的去找某一类商品的人几乎都会从导航或搜索进去了&#xff0c;看首页的一般是属于那些还没想好要买什么东西的人&#xff0c;这些人一般都是漫无目的的瞎逛&#xff0c;看在首页有没有特价的或便宜的东西被捡到。 转载于:https://www.cnblogs.com/wangzong/p/3256555.h…

JavaScript 第一课 JavaScript简史

1、JavaScript的起源 Java在理论上可以部署在任何环境下&#xff0c;但是JavaScript却更倾向于只应用在Web浏览器。JavaScript是一种脚本语言&#xff0c;通常只能通过Web浏览器去完成一些操作而不能像普通意义上的程序那样独立运行。因为需要Web浏览器进行解释和执行&#xff…

Linux下的屏保设置 xset s 与 xset dpms

Linux下的屏保设置 xset s 与 xset dpmshttp://bbs.chinaunix.net/archiver/?tid-2112889.html用xset q 可以查看当前屏保的设置情况&#xff0c;黑屏方式的屏保有两种状态&#xff1a;1. xset 的s参数后面可接两个数字参数&#xff0c;前一个即是进入屏保的秒数&#xff0…