DSP技术及应用(第四章第二部分PPT).pptVIP

  1. 1、本文档共31页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
DSP技术及应用(第四章第二部分PPT)

4.5 TMS320C54x C语言编程 C54x软件设计: 利用C语言进行编程 纯汇编语言编程 利用C和汇编语言进行混合编程 4.5 TMS320C54x C语言编程 4.5.1 存储器模式 4.5.2 寄存器规则 4.5.3 函数调用规则 4.5.4 中断处理 4.5.5 表达式分析 4.5.1 存储器模式 1.段 C54x将存储器处理为程序存储器和数据存储器两个线性块。程序存储器包含可执行代码;数据存储器主要包含外部变量、静态变量和系统堆栈。编译器的任务是产生可重定位的代码,允许链接器将代码和数据定位进合适的存储空间。C编译器对C语言编译后除了生成3个基本段,即.text、 .data、 .bss外,还生成.cinit、.const、.stack、.sysmem段。 2.C系统堆栈 DSP汇编程序中要将堆栈指针SP指向一块RAM,用于保存中断、调用时的返回地址,存放PUSH指令的压栈内容。 .stack定义的系统堆栈实现的功能是保护函数的返回地址,分配局部变量,在调用函数时用于传递参数,保护临时结果。 .stack定义的段大小(堆栈大小)可用链接器选项-stack size设定,链接器还产生一个全局符号_ _STACK_SIZE,并赋给它等于堆栈长度的值,以字为单位,缺省值为1K。 3.存储器分配 (1)运行时间支持函数。 (2)动态存储器分配。 (3)静态和全局变量的存储器分配。 4.5.2 寄存器规则 TMS320C5x运行环境对寄存器的使用有严格的规则,如果编写涉及到寄存器的汇编程序,必须严格遵守这些规则,否则可能造成系统工作异常。寄存器规则规定了编译器如何使用寄存器,和寄存器在函数调用的过程中如何进行保护。 4.5.2 寄存器规则 寄存器按照保护方式分为两种: ??调用保存(save on call),调用其它函数的函数负责保存这些寄存器的内容。 ??入口保存(save on entry),被调用的函数负责保存这些寄存器的内容。 注:无论是否使用优化编译,都必须遵守这些寄存器规则。 4.5.2 寄存器规则 寄存器规则明确了编译器如何使用寄存器以及在函数调用过程中如何保护寄存器。 (1)辅助寄存器AR1、AR6、AR7由被调用函数保护,即可以在函数执行过程中修改,但在函数返回时必须恢复。在TMS320C54X中,编译器将AR1和AR6用作寄存器变量。其中,AR1被用作第一个寄存器变量,AR6被有作第二个寄存器变量,其顺序不能改变。AR0、AR2、 AR3、AR4、AR5可以自由使用,即在函数执行过程中可以修改,而且不必恢复。 (2)堆栈指针SP在函数调用时必须予以保护,但其是自动保护的,即在返回时,压入椎栈的内容都将被全部弹出。 4.5.2 寄存器规则 (3)ARP在函数进入和返回时,必须为0,即当前辅助寄存器为AR0。函数执行时可以是其它值。 (4)在缺省的情况下,编译器总是认为OVM为0。因此,若在汇编程序中将OVM置为1,则在返回C环境时,必须将其恢复为0。 (5)其它状态位和寄存器在子程序中可以任意使用,不必恢复。 4.5.3 函数调用规则 C编译器对函数的调用有一系列严格的规定。除了特殊的运行支持函数外,任何调用者函数和被调用函数都要遵守这些规则,否则可能会破坏C环境并导致程序失败。 (1)函数调用 在调用其他函数(子函数)时执行以下任务。 a. 调用者函数将参数以颠倒的顺序压入堆栈(最右边声明的参数第一个压入堆栈,最左边的参数最后一个压入堆栈)。即函数调用时,最左边的参数放在栈顶单元。 b. 调用者函数调用子函数。 c. 调用者函数假定当子函数执行完成返回。 d. 完成调用后,调用者函数将参数弹出堆栈。 (2)函数结束 a. 将返回地址从硬件堆栈中弹出,压入软件堆栈。 b. 将FP压入软件堆栈。 c. 分配局部帧。 d. 如果函数修改了AR6和AR7,则将它们压入堆栈,其他的任何寄存器可以不用保存,任意修改。 e. 实现函数功能。 f. 如果函数返回标量数据,将它放入累加器。 g. 将ARP设定为AR0。 h. 如果保护了AR6、AR7,恢复这两个寄存器。 i. 删除局部帧。 j. 恢复FP。 k. 从软件堆栈中弹出返回地址并压入硬件堆栈。 l. 返回。 4.5.4 中断处理 (1)中断的使能和屏蔽必须由程序员自己来设置。 (2)中断程序没有参数传递,即使说明,也会被忽略 (3)中断处理程序不能被正常的C程序调用。 (4)为了使中断程序与中断一致,在相应的中断矢量中必须放置一条转移指令,可以用.sect汇编伪指令建立一个简单的跳转指令表来完成此项功能。 (5)在汇编语言中,注意在符号名前面加上一个下划线,例如c_int00记为_ c_int00。 (

文档评论(0)

yaocen + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档