您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > C6000_C_运行时环境
C6000C运行时环境C6000Crun-timeenvironment定义Theruntimeparametersinwhichyourprogrammustfunction.Theseparametersaredefinedby1.thememoryconventions2.registerconventions3.stackorganization,4.functioncallconventions5.systeminitialization.存储器模型C6000编译器把整个存储区当作单个线性存储块,并将它分为代码区和数据区编译器假定目标存储器的全部32-bit地址空间是可用的。定义存储器映象并将代码和数据分配到目标存储器的是连接器,而非编译器。Cmd文件是linker使用的。使用.map文件Hello.cmd段&已初始化段编译器生成的可重定位的代码和数据块称为段(sections)已初始化的段:包含数据和可执行代码。C/C++编译器生成的已初始化的段有:(1).cinit段:包括变量初始值和常量值。(2).const段:包括字符串文字(stringliterals),浮点常量和在C/C++中被声明为const的数据(如果常量没有同时被声明为volatile)。(3).switch段:包含大的switch语句的跳转表(jumptable)(4).text段:包含所有的可执行代码。未初始化段未初始化的段:存储器(一般指RAM)中的保留空间。程序在运行时用它来创建和存储变量。C/C++编译器生成的未初始化的段有:(1).bss段:为全局变量和静态变量保留。如果为连接器设定-c选项,则在程序的开始,C引导程序会将.cinit段的数据(可在ROM中)复制到.bss段。编译器定义全局符号$bss,并指定它为.bss段的起始地址。(2).far段:为声明为far的全局变量和静态变量保留。(3).stack段:系统堆栈。这个存储区用于传递函数的参数和为局部变量分配存储器空间。(4).sysmem段:为动态存储空间分配保留的存储区。提请动态存储空间分配要求的有malloc,calloc和realloc等函数。如果C/C++程序未使用这些函数,编译器便不生成该段。不同的bss段地址,.cinit中不同的内容(.out文件中)段的补充汇编器产生默认的.text,.bss和.data段,但C/C++编译器不使用.data段。允许用CODE_SECTION和DATA_SECTIONpragma来让编译器生成另外的段。除了.text,.vectors段,各个初始化段和非初始化段均不能分配到内部程序存储器。系统堆栈编译器将堆栈用于:(1)给局部变量分配存储空间(2)传递函数参数(3)保存临时结果运行时堆栈增长方向是从高向低,编译器用B15寄存器来管理堆栈,即将它作为堆栈指针(SP),指向堆栈中下一个空闲的存储器位置。初始化变量C/C++编译器生成的代码可固化到ROM中,.cinit段的初始化表也是贮存在ROM中。在系统初始化的时候,C/C++引导程序将表中的数据(ROM中)拷贝给.bss段中对应的变量(RAM中)。如果程序是从目标文件直接载入存储器,然后运行时,可以无需.cinit段。加载器(loader)直接地从目标文件中读出初始化表(而不是从ROM中),在加载时完成初始化,而不是运行时。这个过程可以通过为连接器指定–cr选项来实现。存储器模式(-mln)小存储器模式和大存储器模式。它们的区别在于为.bss段分配存储空间的方式。小存储器模式:.bss32KByte,使用DP(B14)访问全局数据:LDW*+DP(0x7),B5大存储器模式:不限制.bss段的大小,访问数据使用MVKL&MVKH:MVKL_x,A0MVKH_x,A0LDW*A0,B0寄存器使用规范在C/C++环境下,一些具体的操作要使用哪些的寄存器来完成,是有严格的规范的。寄存器使用规范规定了编译器使用寄存器的方法以及函数调用过程中数值保存的方法。要在C/C++程序中嵌入汇编语言,必须理解并遵循寄存器使用规范。寄存器使用规范函数调用约定函数(父函数)在调用另一个函数(子函数)的时候执行下列操作(1)将传递到子函数的参数放入寄存器或堆栈。函数调用(父函数)(2)如果需要,保存寄存器(a/b0~9)到堆栈。(调用子函数后要再用到其中的值)(3)调用者(父函数)调用函数(子函数)。函数调用(子函数)(1)被调函数(子函数)为所有的局部的变量、临时存储区和它调用的函数的参数分配足够的堆栈空间。(2)如果被调函数还继续调用其他的函数,返回地址必须保存在堆栈中。(3)如果被调函数修改寄存器A10到A15或者B10到B15的值,必须将它们保存。(4)被调函数执行其代码。(5)存放返回值在A5:A4中。(6)恢复3中保留的寄存器值(7)释放1分配的堆栈(8)利用B3,跳转返回父函数C/C++与汇编语言的接口使用独立的汇编代码模块,并将其与编译完的C/C++模块连接在一起在C/C++源程序中使用内联函数(intrinsics),直接地调用汇编语句使用内联(inline)汇编语言直接嵌入C/C++源程序在C/C++源程序中使用汇编程序变量和常量C++调用汇编程序内联函数(intrinsics)C6000编译器可以识别若干内联函数。内联函数直接调用某些汇编语句,这些汇编语句在C/C++中实现起来是很繁复或难以表达的。intx1,x2,y;//饱和加法y=_sadd(x1,x2);内联(inline)汇编语言asm(”;***这是汇编语言的注释”);要很小心不要破坏C/C++环境。对插入的汇编指令,编译器不做任何检查或者分析。用C/C++访问汇编语言变量系统初始化运行一个C/C++程序之前,必须建立C/C++运行环境。这个工作是由C/C++引导程序调用c_int00函数完成的。系统运行开始时,跳转到或调用c_int00函数,但通常是硬件复位中断的中断服务程序调用它的。1)定义系统堆栈.stack段并初始化堆栈指针。2)定义.bss并初始化DP指针3)初始化全局的变量,这是通过将.cinit段中的初始化表复制给.bss段中为变量分配的存储空间来完成的。如果是在加载时初始化变量(–cr选项),加载器(loader)在程序运行之前就完成了这个步骤(它不是通过引导程序执行的)。4)调用main函数来运行C/C++程序。运行时初始化和加载时初始化C_int_00源码1externvoid__interruptc_int00(){/*SETUPTHESTACKPOINTERINB15.*//*THESTACKPOINTERPOINTS1WORDPASTTHETOPOFTHESTACK,SOSUBTRACT1WORDFROMTHESIZE.*/__asm(mvkl__stack,SP);__asm(mvkh__stack,SP);__asm(mvkl__STACK_SIZE-4,B0);__asm(mvkh__STACK_SIZE-4,B0);__asm(addB0,SP,SP);/*THESPMUSTBEALIGNEDONAN8-BYTEBOUNDARY*/__asm(and~7,SP,SP);/*SETUPTHEGLOBALPAGEPOINTERINB14.*/__asm(.global$bss);__asm(mvkl$bss,DP);__asm(mvkh$bss,DP);C_int_00源码2/*SETUPFLOATINGPOINTREGISTERSFORC70ONLY*/#ifdef_TMS320C6700__asm(mvk0,B3);/*roundtonearest*/__asm(mvcB3,FADCR);__asm(mvcB3,FMCR);#endif/*GETTHEPOINTERTOTHEAUTOINITIALIZATIONTABLESINTOTHEFIRST*//*ARGUMENTREGISTER(A4)*/__asm(.globalcinit);__asm(mvklcinit,A4);__asm(mvkhcinit,A4);/*PASSTHECURRENTDPTOTHEAUTOINITIALIZATIONROUTINE.*/__asm(mvDP,B4);C_int_00源码3/*CALLTHEAUTOINITIALIZATIONROUTINE*/__asm(.global__auto_init);__asm(mvkl$aiRL,B3);__asm(mvkh$aiRL,B3);__asm(mvkl__auto_init,B0);__asm(mvkh__auto_init,B0);__asm(bB0);/*farcall*/__asm(NOP5);__asm($aiRL:);/*CALLTHEUSER'SPROGRAM*/main();exit(1);}课堂编程实验混合代码调用C调用汇编子函数,汇编子函数中再调用C的子函数
本文标题:C6000_C_运行时环境
链接地址:https://www.777doc.com/doc-3360648 .html