DSP编程技巧---理解函数的调用过程

发布者:雅致人生最新更新时间:2014-10-13 来源: 互联网关键字:DSP  编程技巧 手机看文章 扫描二维码
随时随地手机看文章
  在我们使用进行编程的时候,函数无疑是功能模块划分的重要组成部分,这些函数之间则通过显式地调用或者中断等方式来共同工作。除了对特定的RTS库中的函数(例如某些数学函数)的调用按照它们内置规则进行分配外,我们自定义的函数之间的调用则需要遵循一定的规则,了解这一过程对理解程序的执行和调试也是十分有帮助的,下面我们就来解读一下函数的调用过程,并且可以从其中了解到CPU、FPU以及栈(stack)在这一过程中的作用。

  一.父函数调用子函数

  在父函数调用子函数(被调函数)时,通常会执行以下的步骤:

  1.如果不是SOE类型的(入口保存,save on entry),即它的值没有被被调用函数占用,但是在被调用函数返回值之后又会用到该寄存器的值的话,则该寄存器的值被保存在栈中。

  2.如果被调函数返回一个结构体,则调用函数会为结构体分配空间,并且把这段空间的地址作为第一个参数传递给被调函数,被调函数需要创建一个该结构体的本地副本。

  3.传递给被调函数的参数一般情况下会保存在寄存器中,在必要的情况下则会保存在栈中,因为寄存器的数量有限;具体的规则是:

  (1)如果目标器件是FPU,并且传递的有32位的浮点从那时,则前4个浮点参数被保存在R0H-R3H这4个FPU寄存器中(注意与CPU寄存器AR0H-AR3H相区别)。

  (2)如果有64位的整形(longlong)参数,则第一个64位整形参数的高32位存入ACC寄存器中,低32位存入P寄存器中,其它的64位整形参数按照逆序(函数声明中参数列表里最左边的参数最后被压入栈中)保存在栈中。

  此外,如果P寄存器被用于参数传递,则对该函数的装入(prolog)和排空(epilog)的提取的优化功能(通过减小性能达到减小程序尺寸)被禁止。

  (3)如果参数中有任何的32位长整形或者浮点型,则第一个会放入ACC寄存器中,其它的32位参数则按照逆序保存在栈中。

  (4)指针参数被放入CPU寄存器XAR4和XAR5中,其它的指针则存入栈中。

  (5)剩余的16位的参数在CPU寄存器AL,AH,XAR4和XAR5可用的情况下,按照这一寄存器的顺序被保存在它们中。

  4.任何没有被存入寄存器的参数都会被以逆序压入栈中,所有的32位参数在压入栈中时都会对齐到偶数地址。

  如果一个函数的参数中使用了省略号,即参数个数是可变的,则最后一个显式声明的参数在压入栈中之后,它在栈中的地址可以用来定位未显式声明的参数。

  5.栈指针SP必须在父函数调用子函数之前偶对齐。如果不是偶对齐,则需要把SP加1.

  6.父函数使用LCR指令(使用返回程序指针寄存器RPC的方式来进行22位的长调用)来调用子函数,在调用时RPC寄存器的值会被压入栈中,从而可以把返回地址保存在RPC寄存器中。

  7.最后,栈被对齐到函数的边界上。

  二.子函数响应父函数

  在子函数被调用时,通常会执行以下的步骤:

  1.如果被调函数修改了XAR1、XAR2或者XAR3的值,则必须保存它们的值,因为在调用前后,父函数假设这3个寄存器的值在被返回之前是被保留的。如果目标是FPU,并且在被调函数中修改了R4H-R8H的值,则同样需要保存它们的值。

  2.被调用的函数需要在栈中为所有的本地变量、临时存储区域已经任何被调用的参数分配足够的空间。在通过为SP寄存器加偏移量跳转到被调函数之后,这段存储空间就立刻被分配了。

  3.栈被对齐到函数的边界上。

  4.如果被调用的函数参数中有结构体,则它实际接收到的是该结构体的指针。如果在被调函数中对该结构体进行了写操作,则必须在栈中分配空间以创建该结构体的副本,在完成操作之后把本地结构体通过指针复制回原有的结构体。如果在被调函数中不对传入的结构体参数进行写操作,则可以通过对其指针的操作来完成参数的引用。

  5.完成参数传入之后,被调函数执行它本身的代码。

  6.功能执行完成之后,被调函数返回值,根据返回值的类型,它们值的保存位置分别为:

  16位整数:AL寄存器

  32位整数:ACC寄存器

  64位整数:ACC和P寄存器

  16位或者22位指针:XAR4寄存器

  FPU下的32位浮点数:R0H寄存器

  结构体:其指针保存在XAR4寄存器中

  在返回结构体的情况下,例如s=f(x),其中s为结构体,f为函数,则可以直接用f(&s,x)的方式在父函数中调用子函数f,通过结构体指针,被调函数可以自动返回结构体的值了。

  7.通过把SP中减去调用子函数时加的偏移量,SP寄存器可以重新指向父函数。

  8.被调函数恢复所有在第一步中保存的建城七队值。

  9.被调函数使用LRETR(使用PC指针返回)指令返回,PC寄存器的值被置为RPC寄存器中的值,即返回地址,然后RPC寄存器中的原有值被推出栈并重新保存在RPC寄存器中。

  通过以上的描述,可以看出栈在函数调用前后起着非常关键的中继作用。所以,如果在调用时传递的参数非常多,例如传递了一个很长的数组,或者有多个64位的参数,则栈很有可能没有足够的空间来完成参数的暂存,造成栈的溢出,甚至造成程序运行结果的异常或者错误的输出结果,因为编译器无法检查栈的溢出错误(除非我们自己编写某些代码来检测),所以要为栈分配一个相对较大的存储空间,它的默认值是1K字。即使是非常小的程序,常用例程里栈的长度也往往能达到0x400这样的长度。

关键字:DSP  编程技巧 引用地址:DSP编程技巧---理解函数的调用过程

上一篇:一种基于DSP处理器的车载导航系统设计方案
下一篇:美高森美发布全新安全特性 为业界提供最安全的FPGA器件

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

用TL16C752B实现DSP和PC机的串行通信
摘要:介绍了TL16C752B的特点、性能和相关寄存器,给出了通过TL16C752B实现TMS320VC5421和PC机实时通信的方法。同时给出了串口通信部分的硬件应用电路图以及对TL16C752B进行初始化的软件实现程序。 关键词:数字信号处理;通信接口;异步通信;TL16C752B;TMS320VC5421 1 引言 美国德州仪器公司(TI)的TMS320VC54XX系列DSP芯片与PC机实现异步通信通常有两种方法:第一种是使用通用I/O信号XF和BIO作为串口发送和接收信号,用软件逐位发送和接收数据,即软件异步通信方法,这种方法需要占用很多CPU时间,因此,只能在DSP不太忙、实时性要求不高的情况下采用;第二种是通过扩
[嵌入式]
WCDMA系统基带处理的DSP+FPGA实现方案
  摘 要: 本文在分析WCDMA系统基带处理方案的基础上,结合DSP和FPGA性能的比较,提出了一种在性能、灵活性和性价比上都比较理想的DSP+FPGA基带发送的实现方案。   关键词: 第三代移动通信;WCDMA;基带处理;DSP;FPGA   引言   随着Internet的迅猛发展和各种无线业务需求的增加,目前以承载单一话音业务为主的无线通信网已经越来越不适应人们的需要,所以,以大容量、高数据率和承载多媒体业务为目的的第三代移动通信系统(IMT-2000)成为无线通信的发展方向。码分多址(CDMA)技术凭借其良好的抗噪性、保密性和低功率等优点成为第三代移动通信中最主要的多址接入技术。   和传统的CDMA系统相比,
[手机便携]
采用DSP和STM32的双核智能电液伺服控制器
  伺服控制系统大部分都采用传统的硬件结构,控制算法比较固定,而且也无法实现不同工况下的高性能控制算法,难以满足现代工业的需求。现阶段迫切需要研制一种智能型、具有高可靠性、控制性能更加优秀的电液伺服系统。基于DSP与STM32的智能型伺服控制器具有软硬件结合程度更加紧密、系统的智能化程度更高、可实现多种控制策略的优势。本系统从实际的需求出发,结合精确数字PID控制算法和Fuzzy控制算法自身的优势,组合成Fuzzy-PID控制算法,根据偏差的大小范围选择合适的控制算法进行调节。   本设计将两款工控芯片—TI公司的浮点型DSP TMS320F28335和ST公司的ARM7升级版STM32F103RET6引入智能电液伺服系统,设计
[单片机]
采用<font color='red'>DSP</font>和STM32的双核智能电液伺服控制器
面向DSP的电源解决方案
前言 本文描述了一种简单的电源解决方案。它采用同步降压转换控制器,如TPS56100、TPS5210、TPS56xx和TPS5602,面向TI的C6000 DSP应用。同时,本文列举了三种电源解决方案:单电压输入系统(5V或12V)、双电压输入系统(5V和12V)和宽输入电压范围系统(4.5V~25V)。 DSP对电源的要求 TIDSP家族(C6000和C54xx)要求有独立的内核电源和I/0电源。虽然TI的DSP不要求内核电源和I/O电源之间有特殊的上电顺序,但是假如有一个电源低于正常的工作电压,设计时要确保没有任何一个电源在任何时间段处于上电状态。如果违反此规则,将严重影响器件的长期可靠性。另外从系统级考虑,例如
[电源管理]
基于DSP 内嵌ECAN模块的总线接口设计
  0 引言   CAN 总线以其可靠、实时、低成本优势已在汽车、机械等工业控制领域广泛应用。TMS320F2812是TI公司最具代表性的低成本、低功耗和高性能的定点DSP芯片,具有强大的事件管理能力和嵌入式控制能力。其内嵌的增强型CAN 总线控制器(ECAN)模块,完全兼容CAN 2.0B 协议,邮箱数量增加至32 个,并增加了时间戳、消息过滤和超时发送功能,提高了应用CAN通信的灵活性。   ADM3053是ADI公司2011年推出一款集成信号和电源隔离功能的CAN 收发器。本文采用集成ECAN 模块的TMS320F2812 和ADM3053 来设计CAN 节点。该设计将内嵌ECAN模块的DSP作为节点主控制器,同时采
[嵌入式]
一“芯”二用,MCU+DSP处理器大盘点
  近年来,越来越多的领域需要用到高性能,高集成度的DSP器件,功能日益增加的多媒体处理器对DSP的需求也日益剧增,于是,基于MCU+DSP架构的集成芯片也随之应运而生,更低的成本、更小的封装和更微的功耗所开辟的,是一条属于DSP或者MCU厂商们的“阳光大道“而未来,它们还将沿着这条新路继续前行。本系列文章将为你介绍市面上比较流行的基于MCU+DSP架构的处理器或者解决方案。    飞思卡尔DSP56800E   飞思卡尔在DSP与MCU领域深耕数年,为满足市场发展需求,公司率先在56800内核基础上又推出了新一代增强型内核56800E,该产品可在单一内核上提供DSP和MCU双重功能。56800E 系列DSP将为不断增长的工业、
[嵌入式]
一“芯”二用,MCU+<font color='red'>DSP</font>处理器大盘点
基于PCI总线通用DSP信号处理系统的设计
1 引言 1.1 DSP简介及基本特点 数字信号的处理离不开算法和实现手段。数字信号处理器(digital signal processor简称DSP)。是在模拟信号变换成数字信号以后进行高速实时处理的专用处理器,是实现实时数字信号处理的有力工具。DSP目前广泛应用于模式识别,数字通信,信号处理,工业控制等领域。TI公司的TMS320C54X系列DSP有着以下的特点:采用先进的修正增强型哈佛结构,片内共有8条总线(1条程序存储器总线,3条数据存储器总线和4条地址总线);高度并行和带有专用硬件逻辑的CPU设计;高度专业化的指令系统;模块化结构设计;能降低功耗和提高抗辐射能力的新的静电设计方法。因此它能高速实时以及灵活地应用于图像
[嵌入式]
ARM/DSP双核系统的通信接口设计
引 言   嵌入式系统的核心是嵌入式微处理器和嵌入式操作系统。早期的嵌入式系统硬件核心是各种类型的8位和16位单片机;而近年来32位处理器以其高性能、低价格,得到了广泛的应用。近年来,又出现了另一类数据密集处理型芯片DSP。DSP由于其特殊的结构、专门的硬件乘法器和特殊的指令,使其能快速地实现各种数字信号处理及满足各种高实时性要求。随着现代嵌入式系统的复杂度越来越高,操作系统已成为嵌入式系统不可缺少的部分。免费的嵌入式操作系统,如Linux等,随着自身不断的改善,得到了飞速的发展。Linux是一个免费的、强大的、可信赖的、具有可伸缩性与扩充性的操作系统。Linux实现了许多现代化操作系统的理论,并且支持完整的硬件驱动程序、网络通
[嵌入式]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

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

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