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

发布者:悠闲自在最新更新时间: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编程技巧之20---理解函数的调用过程

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

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

基于DSP的全桥移相控制感应加热电源研究
随着感应加热 电源 对自动化控制程度及可靠性要求的提高,感应加热电源正向智能化与数字化控制的方向发展。DSP具有高速的数字处理能力及丰富的外设功能, 使得一些先进的控制策略能够应用实践,研究基于DSP的数字控制感应加热电源,可使产品具有更加优良的稳定性及控制的实时性,并且具有简单灵活的特点。本 文以 TMS320F2812 为核心,设计了超音频串联谐振式感应加热电源的数字化控制系统,包括数字锁相环(DPLL)、移相PWM发生与系统闭环控制 等。 1 系统结构     串联谐振式感应加热电源主电路如图1所示。采用不控整流加可控逆变电源结构,负载为感应线圈(等效为电感)与补偿电容串联。逆变部分采用带锁相环的移相
[电源管理]
基于<font color='red'>DSP</font>的全桥移相控制感应加热电源研究
DSP和小波变换在配电网接地选线中的应用
1 引言 中性点非有效接地系统单相接地故障选线问题一直以来是电力系统继电保护工作的重要课题。现有的选线方法大都是基于稳态分量进行分析的,实际使用效果不够理想。小波包(WP) 技术能够把任何信号投影到一个由小波伸缩而成一组基函数上,可以对频带进行任意层次的进一步信息分解, 信息量完整无缺,在通道范围内得到分布在不同频带的分解序列,能更清晰的表示故障暂态信号某频段的时域特征, 为暂态量故障选线进行深层信息处理提供条件 。但对多通道高采样率所获得的庞大暂态数据进行小波变换,需要对采样信号进行大量的逐层提取与分离,因而乘法运算量十分巨大。暂态信号持续时间很短,前面的数据处理部分要在短时间内完成,这就对处理器工作速度提出了很高的要求。
[嵌入式]
基于DSP的新型多功能电能质量监测仪表的设计
  近年来,我国电力事业无论是发电总量还是电网的建设都得到了迅猛发展,电力系统的规模不断扩大。但随着生产力的发展,电能质量的问题日益受到重视,生产和生活中对于电能质量的要求也越来越高。由于高压直流输电系统的应用和大量变频器、整流器、电弧炉等非线性负荷、冲击性负荷不断地引入电力系统,大量谐波电流注入电网,造成电力系统中谐波含量急剧上升和电压波形严重“畸变”,致使电能质量下降。电网中的谐波污染日益严重,对继电保护、计算机、测量和计量仪器及通讯系统都有不利和不可预知的影响;降低了电网可靠性,增加了电网损失;降低了电气设备的效率和利用率,在生产和生活中都造成巨大的经济损失。   鉴于以上的各问题,提高电能质量的新技术及改善电能质量的分析方
[单片机]
基于<font color='red'>DSP</font>的新型多功能电能质量监测仪表的设计
基于DSP芯片的分级分布式管理系统设计
摘要:通过一个两级分布式图像处理系统中管理计算机的实现,阐述基于DSP的控制电路的设计方法以及对两级分布式系统的协调控制;给出原理样机的调试结果和进一步的讨论。 关键词:DSP 分级分布 FIFO 中断 1 概述 1.1 背景 数字信号处理器(DSP)一般是用来运行核心数据处理算法的,但在一些特殊的环境中,必须使用DSP来承担管理控制单元的核心片芯。本文给出一套分级分布式图像处理系统,其中的管理计算机的核心芯片是AD公司的浮点DSP(ADSP21020)。它不仅承担着对图像处理系统的管理控制任务,还必须实时响应执行上级1553总线的关键指令。本文重点讨论基于DSP芯片管理计算机对两级分布式系统的协调控制。 1.2 系统介
[工业控制]
不同阶数的FIR数字滤波器的DSP实现
  FIR滤波器的结构主要是非递归结构,没有输出到输入的反馈。并且FIR滤波器很容易获得 严格的线性相位特性,避免被处理信号产生相位失真。而线性相位体现在时域中仅仅是h( n)在时间上的延迟,这个特点在图像信号处理、数据传输等波形传递系统中是非常重要的。此外,他不会发生阻塞现象,能避免强信号淹没弱信号,因此特别适合信号强弱相差悬殊的情况。其主要的不足之处是,其较好的性能是以较高的阶数为代价换来的。因此,在保证相同性能的前提下,努力降低其阶数是FIR数字滤波器设计的重要因素之一。   下面介绍应用Matlab和DSP芯片来实现FIR滤波器的通用模式。 1 FIR滤波器的设计方法   通常采用窗函数法设计FIR滤波器方法简单,
[嵌入式]
基于DSP和OZ890的电池管理系统设计
本文从设计要求和功能出发,设计了一种用于混合动力汽车的电池管理系统。其中硬 件系统包括:电源模块、基于OZ890 的单体电压采集电路和I2C 通信电路、基于DSP 的RS232 串口通信和CAN 通信等硬件系统的设计;软件系统包括:利用周期中断和下溢中断实现数 据采集处理、SOC 估算和各种通信程序。 关键词:电池管理系统;OZ890;I2C 双向隔离;下溢中断 中图分类号:TM912.2 文献标识码:A 文章编号: Design of battery management system based on DSP and OZ890 WANG Tao, QI Bo-jin, WU Hong-jie, LI Wei(School o
[电源管理]
基于<font color='red'>DSP</font>和OZ890的电池管理系统设计
ARM、DSP、FPGA的技术特点和区别有哪些
ARM、DSP、FPGA与什么区别?各自有什么特点?这是一个很基础的问题,本文对ARM、DSP、FPGA的各自特点和技术进行了分析。 ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软 件。ARM架构是面向低预算市场设计的第一款RISC微处理器,基本是32位单片机的行业标准,它提供一系列内核、体系扩展、微处理器和系统芯片方案,四 个功能模块可供生产厂商根据不同用户的要求来配置生产。由于所有产品均采用一个通用的软件体系,所以相同的软件可在所有产品中运行。目前ARM在手持设备 市场占有90以上的份额,可以有效地缩短应用程序开发与测试
[单片机]
基于DSP的CompactFlash卡接口设计
随着半导体技术的发展,小型化、大容量、低功耗、智能型是未来存储技术的发展方向。近年来,各种小型存储媒体不断问世,在便携式设备中应用广泛。这些存储媒体大多以Flash Memory(闪烁存储器)为主要载体,内部用微处理器进行时序控制和存储管理,通常做成非易失性存储卡形式。 目前常见的存储卡类型有:①MultiMedia Card(多媒体卡);②CompactFlash Card(快闪磁盘卡);③SmartMedia Card(智能媒体卡);④memoryStick(记忆棒)。各存储卡在功耗、体积、容量等方面各有特色,但它们之间的接口目前还互不兼容。 CompactFlash 卡(以下简称CF卡)最先由SanDisk 公司于199
[嵌入式]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

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

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