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

发布者:脑洞狂想最新更新时间:2014-09-24 来源: 互联网关键字: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编程技巧之20---理解函数的调用过程

上一篇:DSP编程技巧---在main函数运行之前,你需要知道的
下一篇:一种基于DSP处理器的车载导航系统设计方案

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

基于CAN总线和DSP的起重机多功能安全监控系统
  起重机是工程建设中的必要设备之一,在施工中应用相当广泛。然而,起重机潜在的危险因素也较多,容易发生恶性事故。国家技术监督局先后专门制定和发布了《起重机设计规范》(GB3811-83)、《起重机械超载保护装置安全技术规范》(GB12602-90)、《起重机安全规程》(GB6067-85)等标准,要求各类起重机械必须装备安全保护装置。因此开发新型的起重机多功能安全监控和保护系统是很有必要的。基于此,近年来国内外先后研制出一些起重机安全保护装置,如载荷限制器、力矩限制器、起升高度仪、防碰撞装置、风速报警器等。但它们功能单一,如果需要多种保护功能,必须安装多台仪器,这样不仅价格昂贵,也给维护和使用带来了不便。起重机用户迫切需要一种集多
[嵌入式]
基于DSP的USB接口设计方案
  本文介绍了一种基于DSP的USB 接口设计方案,分别从接口的硬件设计、接口操作原理、软件设计流程以及中断服务程序设计要点等方面进行阐述,并利用Cypress 公司提供的USB2.0 接口芯片CY7C68001 实现了USB2.0 从机接口设计,通过硬件平台的搭建和软件程序设计,实现了PC 机与DSP 之间高速双向地传输数据。   1 引言   近年来,随着数字信号技术的发展,需要处理的数据量越来越大,处理的速度也越来越快,因此具有高速性能DSP 芯片的应用得到了广泛重视。而通过DSP 处理的数据往往要传输给PC 机进行存储和再处理,那么就必须解决DSP 与 PC 机之间的高速通信问题。本设计方案以德州仪器(TI)的C5000
[嵌入式]
基于CAN总线的并联逆变电源通信监控系统研究
  逆变电源的模块化并联运行可大大提高系统的灵活性,打破逆变电源在功率等级上的限制,用户可根据需要组合系统的功率,同时便于实现冗余设计,因而具有高可靠性和易于大功率化的优点。并联逆变电源通信监控技术的研究是交流电源系统从传统的集中式供电向分布式供电乃至智能电源系统供电模式发展过程中必须解决的一个课题 。本文介绍一种基于CAN现场总线的并联逆变电源通信监控系统。系统充分利用TI公司TMS320LF2407A DSP芯片的内部资源,通过CAN总线从各并联模块获取并解析现场控制数据,响应现场强实时性操作,实现对模块工作的调度监控,具有结构简洁、扩容方便及可靠性高的优点。 1 系统组成 1.1 系统网络结构   系统组成如图1所示
[嵌入式]
基于DSP的音频会议信号合成算法研究
  随着在数字信号处理(DSP)算法和芯片处理能力以及通信网络结构优化等方面的不断发展,现代化通信已经迅速普及。音频会议是众多通信系统的必备功能。有多个用户参与的音频会议,最简单的模式可以使用令牌控制下的互斥模式,使只有拥有发言权的那个与会者才可以讲话。在这种模式下,每个与会者某一时刻只能听到一路音频信号,这种“半双工”模式对于音频会议是不方便和不实际的。   真正的电话会议应当仿真多个与会者在一个会议室进行对话的情形。但是由于与会终端在物理上并不在一起,而每个终端只有一套音频输出设备(功放+音箱),要同时传送给每个终端的音频流也只能使用一路信道。为使每个终端同时接收多个与会者的声音,必须采取多路音频合成方案。电话会议的特点是会
[安防电子]
一款基于DSP的三相SPWM变频电源电路的设计
引言 变频电源作为电源系统的重要组成部分,其性能的优劣直接关系到整个系统的安全和可靠性指标。现代变频电源以低功耗、高效率、电路简洁等显著优点而备受青睐。变频电源的整个电路由交流-直流-交流-滤波等部分构成,输出电压和电流波形均为纯正的正弦波,且频率和幅度在一定范围内可调。 本文实现了基于TMS320F28335的变频电源数字控制系统的设计,通过有效利用TMS320F28335丰富的片上硬件资源,实现了SPWM的不规则采样,并采用PID算法使系统产生高品质的正弦波,具有运算速度快、精度高、灵活性好、系统扩展能力强等优点。 系统总体介绍 根据结构不同,变频电源可分为直接变频电源与间接变频电源两大类。本文所研究的变频电源采用间接变频结构
[电源管理]
一款基于<font color='red'>DSP</font>的三相SPWM变频电源电路的设计
如何简化并实现复杂的电源时序控制
   引言        电源时序控制是微控制器、FPGA、DSP、 ADC和其他需要多个电压轨供电的器件所必需的一项功能。这些应用通常需要在数字I/O轨上电前对内核和模拟模块上电,但有些设计可能需要采用其他序列。无论如何,正确的上电和关断时序控制可以防止闩锁引发的即时损坏和ESD造成的长期损害。此外,电源时序控制可以错开上电过程中的浪涌电流,这种技术对于采用限流电源供电的应用十分有用。   本文讨论使用分立器件进行电源时序控制的优缺点,同时介绍利用ADP5134内部精密使能引脚实现时序控制的一种简单而有效的方法ADP5134内置2个1.2-A 降压调节器与2个300-mA LDO。同时,本文还列出一系列IC,可用于要求更高精度
[电源管理]
如何简化并实现复杂的电源时序控制
基于DSP的视频编解码系统设计
    随着数字多媒体的应用日渐广泛,视频解码 在嵌入式系统设计中变成一个基本要素。视频标准有多种,依赖于产品可实施其中的一个或者多个标准。当然这不是全部,视频仅仅是多媒体码流的一部分,另外还 有音频或者语音需要并行处理。因此,一个精确的处理存储或数据流的同步层是必需的。此外,视频解码本身对性能要求较高,需要不同于先前基于语音和信息应用 的系统架构;这就对便携系统提出了特殊挑战,而桌面应用同样面临这些问题。 通用视频标准和编解码器 联合视频组(Joint Video Team, JVT)由 ITU的视频编码专家组(Video Coding Experts Group, VCEG)和ISO/IEC运动图像专家组(Moving
[嵌入式]
基于DSP和CPLD的低功耗多路数据处理系统设计
摘 要: 本文介绍了一种基于DSP和CPLD的低功耗多路数据采集处理系统。整个系统由DSP和CPLD动态地设置A/D采样通道,控制6路16位高精度A/D转换器ADS7805的启动和停止。由DSP对采样数据进行读取和处理。 关键词: DSP; CPLD;低功耗;多路数据处理 引言 随着电子技术的应用和发展,数字信号处理内容日益复杂,同时,很多情况下要求整个系统具有低功耗的特点。为满足这种要求,DSP芯片设计技术也在向低功耗、高性能的方向发展。从处理速度来看,TMS320VC5502的运算能力已经达到了600MMACS,即每秒钟可以完成6亿次乘加运算。从功耗来看,TMS320VC5502内核电压只有1.26V,整个芯片的功耗
[嵌入式]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

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

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