DSP编程技巧---在main函数运行之前,你需要知道的

发布者:神秘行者最新更新时间:2014-09-24 来源: 互联网关键字:DSP  C/C++  main函数 手机看文章 扫描二维码
随时随地手机看文章
  在一个程序能正常运行之前,相关的运行时(run-time)环境首先要正确建立。在CCS软件编程的情况下,的实时运行库RTS的源程序库rts.src中包含了名为boot.c或者boot.asm的启动程序(在一些TI的例子里,则使用了CodeStartBranch.asm来完成启动工作,它会自动调用库文件中的boot.asm),用于在系统启动后调用c_int00函数,并通过其中的操作来完成运行时环境的建立。通常情况下,c_int00函数位于rts2800.lib库函数中的boot.obj(即TI官方编译boot.c或者boot.asm生成的目标文件)下,这也就是为什么我们在C28x编程的情况下通常要把rts2800.lib库函数加入工程中的原因(其它器件则根据型号、系列添加对应的库文件;否则就会出现初学者经常遇到的找不到boot.c之类的错误)。

  注:小型内存模型含义是已初始化的段被链接至低 64Kw(字)可寻址空间内的非易失性内存,它使用rts2800.lib。对于定点器件,如果使用大内存模型(超过64K字),则需要使用库 rts2800_ml.lib;对于含有FPU的器件,用于标准 C 语言代码的为 rts2800_fpu32.lib,或者用于 C++ 代码的 rts2800_fpu32_eh.lib(没有针对浮点器件的较小内存模型库)。在 CCS v5/v6 中,有一个针对库的“自动”设置,此设置可据项目的设置(例如,浮点支持和内存模型选择)让 CCS 自动选择正确的库来使用。对于 /BIOS 项目,/BIOS 将负责将所需的库包括在内,我们用户不需要在项目中包含任何运行支持库。

  如果在链接器选项中我们使用了--ram_model或者--rom_mode(具体含义请参考http://www.eepw.com.cn/article/249328.htm),则_c_int00函数自动被配置为整个程序执行的入口点。此外,在CPU复位之后(相当于一个软件或者硬件的复位中断),我们也可以把整个程序的入口点指向_c_int00,例如:

  .def _Reset

  .ref _c_int00

  _Reset: .vec _c_int00, USE_RETA

  则在执行CPU复位操作之后,系统自动跳转到_c_int00函数。

  在c_int00函数中完成的功能主要有:

  1. 设置/初始化CPU的状态和配置寄存器。

  2. 为系统的栈定义一个.stack段(关于各个段的含义,请参考http://www.eepw.com.cn/article/256732.htm),然后建立并初始化栈的指针。其中,栈需要被分配在单一的、连续的一段地址中,起始点为低地址,终点为高地址,栈指针SP的初始化值指向栈的顶端。

  3. 从初始化表中,把数据复制到.bss段中,从而初始化全局变量。如果使用了—ram_model选项在加载程序时就初始化变量,则在程序运行前,会首先运行一个加载程序来完成变量的初始化。如果使用了--rom_model选项,则使用.cinit中的运行时初始化表来完成变量的初始化。

  默认情况下,链接器使用--rom_model选项,在程序运行时完成变量的自动初始化。在程序运行时,.cinit段和其它初始化的段会被一起加载到内存中,从而使得C/C++的启动程序可以自动把.cinit中的初始化表格复制到.bss段中,完成全局变量的自动初始化。这种方法的特点在于,初始化的表格可以被存放在更加便宜且大容量的ROM或者FLASH,而不是RAM中,并且可以在程序启动时再自动加载到RAM中,这种方法在我们把程序烧写到FLASH中再运行的时候是经常使用的。关于Flash运行的更多信息,可以参考TI的的一个应用报告:http://www.ti.com.cn/cn/lit/an/zhca550l/zhca550l.pdf,从 TMS320F28xxx 数字信号处理器 () 上的内部闪存存储器上运行一个应用。

  如果使用—ram_model的链接器选项,则链接器会在.cinit段的开头中配置STYP_COPY位(0010h),告诉加载器不要把.cinit段自动加载到内存中,并且把cinit这个符号设置为-1(默认情况下符号cinit指向初始化表格),从而向启动程序表明,内存中没有初始化表格,在启动时不需要执行运行时的初始化工作。在这种情况下,需要我们自定义一个加载程序,从而在加载程序时就完成初始化,它的主要内容包括:

  ü 在目标文件中检测.cinit段的存在;

  ü 在.cinit段的开头配置STYP_COPY位,使得该段不会被自动复制到内存中;

  ü 需要我们理解并正确遵循初始化表格的格式。

  这三个注意点貌似比较复杂,不过有读者可能会问,我们在直接把程序通过JTAG下载到DSP的RAM中并运行的时候,貌似并没有配置这么麻烦的步骤啊?那是因为CCS编程环境已经帮我们承担了这一重要任务,在我们用仿真器来调试、运行的时候经常会使用到这个方式。

  注意:在C/C++程序运行之前,一些全局变量必须被赋予初始值。在ANSI/ISO C中,未明确初始化的全局和静态变量在程序执行前都需要被初始化为0,C/C++的编译器并不会对它们进行自动初始化。在把程序加载到RAM而不是ROM中的情况下,比较方便的方法是直接把.bss段初始化为0。

  而在C28x DSP的编程中,如果一个全局变量的初值并不会对程序的运行结果产生任何影响,则我们一般不用考虑给它们赋初值,因为编译器会使用.cinit段中的初始化表格来初始化变量,叫做自动初始化autoinitialization,其示意图为:DSP编程技巧之21---在main函数运行之前,你需要知道的

  在使用了--ram_model或者--rom_mode选项的情况下,链接器在把所有C/C++模块中的相关变量初始化的内容链接入.cinit段之后,会自动在其末尾加入null关键字,来标明初始化表格的末尾。

  4.调用.pinit中的所有的全局构造函数。

  .pinit段中的内容相对简单,它主要包含了构造的地址列表。在.cinit初始化完成之后,构造函数的地址就出现在构造函数地址列表中了。

  在使用了--ram_model或者--rom_mode选项的情况下,链接器在把所有C/C++模块中的构造函数的地址链接入.pinit段之后,会自动在其末尾加入null关键字,来标明构造函数地址的结束。

  与.cinit段不同的时,不管使用--ram_model还是--rom_mode选项,.pinit段都会在运行时被加载和处理。

  5.调用main()函数,执行我们的程序。

  6.在main()函数返回时,调用exit函数。

  根据需要,我们可以自定义启动函数,但是一定要保证我们的自定义函数能够正确完成以上的步骤以建立C/C++的实时运行库环境,否则我们的程序将无法正常运行,甚至根本无法运行。

关键字:DSP  C/C++  main函数 引用地址:DSP编程技巧---在main函数运行之前,你需要知道的

上一篇:浅谈DSP数字信号处理技术的实现与应用
下一篇:DSP编程技巧之20---理解函数的调用过程

推荐阅读最新更新时间:2024-05-02 23:11

稳定可靠的I2C通信的设计计算
  许多系统需要可靠的非易失性存储,对于这些系统,可选择EEPROM存储器技术。EEPROM技术具有稳定可靠的架构,供应商较多,并且经过了多年的改进。EEPROM器件可用于各种工业标准串行总线,包括I2C™、SPI、Microwire和UNI/O®总线。其中,I2C总线在单片机和其他芯片组中具有广泛的硬件支持,并且信号传递方式简单,可采用极小的硅片有效实现,因此占据了非易失性存储器市场约70%的份额。但是,I2C总线拓扑要依赖于阻值合适的上拉电阻才能实现稳定可靠的通信。电阻值选择错误不仅会造成电能浪费,还可能导致总线状态和传输过程由于噪声、温度变化、工作电压变化以及器件间的制造差异而出错。   I2C是二线同步总线,使用总线主器
[单片机]
稳定可靠的I2<font color='red'>C</font>通信的设计计算
Pickering Interfaces的PXI开关模块被选择用于A-10C飞机的地面支持
2018年5月,于英国滨海克拉克顿镇,Pickering Interfaces作为业内领先的模块化信号开关与电子测试与验证仿真的供应商,很荣幸地宣布,与位于美国犹他州希尔空军基地的美国空军奥格登航空物流中心,最近签订了一项批量供应6U 高密度矩阵模块(45-542型)的合同。该模块将用于对A-10C飞机的PATS-70A(便携式自动测试装置)部分进行输出和输入级维护时的PXI开关要求。 这份合同要求Pickering Interfaces为100多套PATS-70A系统提供45-542开关矩阵模块。这份订单是自2014年Pickering跟希尔空军基地合作,为他们配置PATS-70测试装置之后接到的第二份矩阵模块的大订单。除支
[半导体设计/制造]
基于S3C2410的辅助倒车数字图像系统设计
1 、引言   据统计,由于车后盲区所造成的交通事故在中国约占30%,美国20%。前两代倒车辅助产品,一种是倒车喇叭,一种是倒车雷达。前者只能提醒路人自行躲闪,而司机却一无所知,固定的障碍物更是无法探测,起到的作用微乎其微,后者虽能把固定的障碍物通过报警的形式告知司机,但司机还是无法判断障碍物的确切位置,更不能探测地坑或低矮障碍物。   目前,国内外的研究趋势是在倒车雷达的基础上采用数字图像处理技术,利用强大的嵌入式处理器,开发用于检测车后物距和监视车后图像的优点相结合的车载可视倒车装置。   因此本文提出一种基于S3C2410的辅助倒车系统设计,该系统不但使驾驶员可以在车内观察到汽车车尾的真实场景,而且可以通过系统所带
[单片机]
基于S3<font color='red'>C</font>2410的辅助倒车数字图像系统设计
水下机器人博雅工道官宣完成亿元C轮融资
1月15日,消费级水下机器人研发商博雅工道宣布完成亿元C轮融资,由领中资本领投,华和资本、鹏博投资、中关村启航创新基金跟投。本轮融资主要用于博雅工道在水下智能装备的整机工艺和关键传感器等方面继续加大自主研发强度,并通过产业链整合,进一步扩大公司在水下智能装备领域的业务布局,提高市场占有率。 据了解,博雅工道是一家主要从事机器人及自动化设备研发和销售,机器人技术培训及服务的公司,有自主开发消费级水中摄影机器人 “高仿真机器鱼”、无人机等相关产品,机并提供械学堂和智慧社区服务。
[机器人]
Altera推出DSP Builder版本8.0
Altera公司发布具有第二代模型合成技术的DSP Builder工具版本8.0,该技术使DSP设计人员能够自动产生采用高阶Simulink设计描述架构的时序最佳化RTL程式码,设计人员可在几分钟内实现接近峰值FPGA性能的设计。 DSP Builder工具自动加入串流阶级和暂存器,透过分时多工技术產生高度最佳化的功能设计,例如数位升频(DUC)、降频(DDC)、峰值因子抑制(CFR)和数位预失真(DPD)等功能。用户能够迅速完成系统层级设计,并针对载波频宽、载波数、天线和分区变化轻易调整设计。DSP Builder版本8.0提供了多天线、多载波WiMAX和WCDMA DUC与DDC设计等的设计实例。 Altera软体、嵌入式和DS
[嵌入式]
S3C2440PWM 定时器
S3C2440A 有5个16位定时器。其中定时器0、1、2和3具有脉宽调制(PWM)功能。定时器4是一个无输出引脚 的内部定时器。定时器0还包含用于大电流驱动的死区发生器。 定时器0和1共用一个8位预分频器,定时器2、3和4共用另外的8位预分频器。每个定时器都有一个可以生成5种 不同分频信号(1/2,1/4,1/8,1/16和TCLK)的时钟分频器。每个定时器模块从相应8位预分频器得到其自己的时钟信 号。8位预分频器是可编程的,并且按存储在TCFG0和TCFG1寄存器中的加载值来分频PCLK。 定时计数缓冲寄存器(TCNTBn)包含了一个当使能了定时器时的被加载到递减计数器中的初始值。定时比较缓 冲寄
[单片机]
S3<font color='red'>C</font>2440PWM 定时器
应用创新推动发展,未来25年DSP将全面“入侵”你的生活
2004年,美国好莱坞大片《机械公敌》上映,片中主人公芝加哥警探戴尔.史普纳乘坐无人驾驶奥迪跑车上班的情景让人对未来汽车充满了遐想。不过,虽然该片宣称描述的是2035年的汽车,但是昨天,在TI一年一度的IDF大会上,TI首席科学家方进(Gene Frantz)却指出:“这种无人驾驶汽车离我们已经不远,距离实现仅有10到15年的时间了。”这就是说,2022年左右,我们就可以乘坐上这样在科幻大片中才能见到的超炫酷车了。 实现这一梦想的基础就是数字信号处理技术。从25年前TI推出第一个有55000个晶体管的DSP TMS320C10到如今有6核以上的TNETV3020,DSP在25年里性能提升了1万倍以上,而许多以前看似天方夜谭
[焦点新闻]
利用DSP技术与软件的企业IP电话解决方案
引言     从最初的概念展示,一直到目前的广泛应用,VoIP(Voice over IP)市场的成长可说极为快速。透过VoIP网关的实际安装布署,下一代的电信厂商不但已经开始提供全球性的IP电话服务,其成本也低于传统的通话方式。事实上,只要利用现有的分组交换网络基础设施,然后再使用IP电话网关以及客户端设备,厂商就可大幅降低电话服务的成本,这包括了语音与传真服务。今天,在所有实际应用的VoIP解决方案中,几乎都可以看到数字信号处理器(DSP)的踪迹,在这些解决方案的成功经验中,DSP芯片与软件都扮演了极为重要的角色。目前,许多企业的电话系统都采用专用电话交换机设备,因此为了继续支持这些服务,下一代的IP电话产品也会
[应用]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved