- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
5.6 TMS320C54x C语言编程 5.6.1 存储器模式 5.6.2 寄存器规则 5.6.3 函数调用规则 5.6.4 中断处理 5.6.5 表达式分析 5.6.1 存储器模式 1.段 C54x将存储器处理为程序存储器和数据存储器两个线性块。程序存储器包含可执行代码;数据存储器主要包含外部变量、静态变量和系统堆栈。编译器的任务是产生可重定位的代码,允许链接器将代码和数据定位进合适的存储空间。C编译器对C语言编译后除了生成3个基本段,即.text、.data、.bss外,还生成.cinit、.const、.stack、.sysmem段。 2.C/C++系统堆栈 .stack不同于DSP汇编指令定义的堆栈。DSP汇编程序中要将堆栈指针SP指向一块RAM,用于保存中断、调用时的返回地址,存放PUSH指令的压栈内容。 .stack定义的系统堆栈实现的功能是保护函数的返回地址,分配局部变量,在调用函数时用于传递参数,保护临时结果。 .stack定义的段大小(堆栈大小)可用链接器选项-stack size设定,链接器还产生一个全局符号_ _STACK_SIZE,并赋给它等于堆栈长度的值,以字为单位,缺省值为1K。 3.存储器分配 (1)运行时间支持函数。 (2)动态存储器分配。 (3)静态和全局变量的存储器分配。 (4)位域/结构的对准。 5.6.2 寄存器规则 寄存器规则明确了编译器如何使用寄存器以及在函数调用过程中如何保护寄存器。 (1)辅助寄存器 (2)堆栈指针SP (3)ARP (4)在默认情况下,编译器总是假定ST1中的OVM在硬件复位时被清0。若在汇编代码中对OVM置位为1,返回到C环境时必须复位。 (5)寄存器变量 5.6.3 函数调用规则 (1)局部帧的产生 (2)参数传递 (3)函数的返回 5.6.4 中断处理 (1)中断的使能和屏蔽必须由程序员自己来设置。 (2)中断程序没有参数传递,即使说明,也会被忽略 (3)中断处理程序不能被正常的C程序调用。 (4)为了使中断程序与中断一致,在相应的中断矢量中必须放置一条转移指令,可以用.sect汇编伪指令建立一个简单的跳转指令表来完成此项功能。 (5)在汇编语言中,注意在符号名前面加上一个下划线,例如c_int00记为_ c_int00。 (6)中断程序使用的所有寄存器,包括状态寄存器和程序中调用函数使用的寄存器都必须予以保护。 (7)TMS320C54x C编译器将C语言进行了扩展,中断可以利用interrupt关键字由C/C++函数直接处理。 5.6.5 表达式分析 当C程序中需要计算整型表达式时,必须注意以下几点: (1)算术上溢和下溢。 (2)整除和取模。 (3)C代码对16位乘法结果高16位的访问。 5.7 用C语言和汇编语言混合编程 5.7.1 独立的C模块和汇编模块接口 5.7.2 从C程序中访问汇编程序变量 5.7.3 在C程序中直接嵌入汇编语句 5.7.1 独立的C模块和汇编模块接口 在编写独立的汇编程序时,必须注意以下几点: (1)不论是用C语言编写的函数还是用汇编语言编写的函数,都必须遵循寄存器使用规则。 (2)必须保护函数要用到的几个特定寄存器。 (3)中断程序必须保护所有用到的寄存器。 (4)从汇编程序调用C函数时,第一个参数(最左边)必须放入累加器A中,剩下的参数按自右向左的顺序压入堆栈。 (5)调用C函数时,注意C函数只保护了几个特定的寄存器,而其他是可以自由使用的。 (6)长整型和浮点数在存储器中存放的顺序是低位字在高地址,高位字在低地址。 (7)如果函数有返回值,返回值存放在累加器A中。 (8)汇编语言模块不能改变由C模块产生的.cinit段,如果改变其内容将会引起不可预测的后果。 (9)编译器在所有标识符(函数名、变量名等)前加下划线“_”。 (10)任何在汇编程序中定义的对象或函数,如果需要在C程序中访问或调用,则必须用汇编指令.global定义。 (11)编辑模式CPL指示采用何种指针寻址,如果CPL=1,则采用堆栈指针SP寻址;如果CPL=0,则选择页指针DP进行寻址。 5.7.2 从C程序中访问汇编程序变量 从C程序中访问在汇编程序中定义的变量或常数,可以分为以下3种情况: (1)访问在.bss块中定义的变量 (2)对于访问不在.bss块中定义的变量 (3)对于在汇编程序中用.set和.global伪指令定义的全局常数,也可以使用特殊的操作从C程序中访问它们。 5.7.3 在C程序中直接嵌入汇编语句 在C程序中嵌入汇编语句是一种直接的C模块和汇编模块接口方法。采用这种方法一方面可以在C程序中实现用C语言难以实现的一些硬件控制功能。另一方面,也可
文档评论(0)