1.C6000C运行时环境1.ppt

上传人:sccc 文档编号:6012155 上传时间:2023-09-14 格式:PPT 页数:24 大小:392.52KB
返回 下载 相关 举报
1.C6000C运行时环境1.ppt_第1页
第1页 / 共24页
1.C6000C运行时环境1.ppt_第2页
第2页 / 共24页
1.C6000C运行时环境1.ppt_第3页
第3页 / 共24页
1.C6000C运行时环境1.ppt_第4页
第4页 / 共24页
1.C6000C运行时环境1.ppt_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《1.C6000C运行时环境1.ppt》由会员分享,可在线阅读,更多相关《1.C6000C运行时环境1.ppt(24页珍藏版)》请在三一办公上搜索。

1、C6000 C 运行时环境,C6000 C run-time environment定义,The run time parameters in which your program must function.These parameters are defined by 1.the memory conventions(规范)2.register conventions3.stack organization,4.function call conventions5.system initialization.,存储器模型,C6000编译器把整个存储区当作单个线性存储块,并将它分为代码区和数

2、据区编译器假定目标存储器的全部32-bit地址空间是可用的。定义存储器映象并将代码和数据分配到目标存储器的是连接器,而非编译器。Cmd文件是linker使用的。,Hello.cmd,段&已初始化段,编译器生成的可重定位的代码和数据块称为段(sections)已初始化的段:包含数据和可执行代码。C/C+编译器生成的已初始化的段有:(1).cinit段:包括变量初始值和常量值。(2).const段:包括字符串文字(string literals),浮点常量和在C/C+中被声(3)明为const的数据(如果常量没有同时被声明为volatile)。(4).switch段:包含大的switch语句的跳转

3、表(jump table)(5).text段:包含所有的可执行代码。,未初始化段,未初始化的段:存储器(一般指RAM)中的保留空间。程序在运行时用它来创建和存储变量。C/C+编译器生成的未初始化的段有:(1).bss段:为全局变量和静态变量保留。如果为连接器设定-c选项,则在程序的开始,C引导程序会将.cinit段的数据(可在ROM中)复制到.bss段。编译器定义全局符号$bss,并指定它为.bss段的起始地址。(2).far段:为声明为far的全局变量和静态变量保留。(3).stack段:系统堆栈。这个存储区用于传递函数的参数和为局部变量分配存储器空间。(4).sysmem段:为动态存储空间

4、分配保留的存储区。提请动态存储空间分配要求的有malloc,calloc和realloc等函数。如果C/C+程序未使用这些函数,编译器便不生成该段。,段的补充,汇编器产生默认的.text,.bss和.data段,但C/C+编译器不使用.data段。允许用CODE_SECTION和DATA_SECTION pragma来让编译器生成另外的段。除了.text段,各个初始化段和非初始化段均不能分配到内部程序存储器。,系统堆栈,编译器将堆栈用于:(1)保存函数调用后的返回地址;(2)给局部变量分配存储空间(3)传递函数参数(4)保存临时结果运行时堆栈增长方向是从高向低,编译器用B15寄存器来管理堆栈,

5、即将它作为堆栈指针(SP),指向堆栈中下一个空闲的存储器位置。,初始化变量,C/C+编译器生成的代码可固化到ROM中,.cinit段的初始化表也是贮存在ROM中。在系统初始化的时候,C/C+引导程序将表中的数据(ROM中)拷贝给.bss段中对应的变量(RAM中)。如果程序是从目标文件直接载入存储器,然后运行时,可以无需.cinit段。加载器(loader)直接地从目标文件中读出初始化表(而不是从ROM中),在加载时完成初始化,而不是运行时。这个过程可以通过为连接器指定cr选项来实现。,存储器模式(-mln),小存储器模式和大存储器模式。它们的区别在于为.bss段分配存储空间的方式。小存储器模式

6、:.bss 32KByte,使用DP(B14)访问全局数据:LDW*+DP(0 x7),B5大存储器模式:不限制.bss段的大小,访问数据使用MVKL&MVKH:MVKL _x,A0 MVKH _x,A0 LDW*A0,B0,寄存器使用规范,在C/C+环境下,一些具体的操作要使用哪些的寄存器来完成,是有严格的规范的。寄存器使用规范规定了编译器使用寄存器的方法以及函数调用过程中数值保存的方法。要在C/C+程序中嵌入汇编语言,必须理解并遵循寄存器使用规范。,寄存器使用规范,函数调用约定,函数(父函数)在调用另一个函数(子函数)的时候执行下列操作(1)将传递到子函数的参数放入寄存器或堆栈。,函数调用

7、(父函数),(2)如果需要,保存寄存器(a/b09)到堆栈。(3)调用者(父函数)调用函数(子函数)。(4)(对非C/C+代码)当返回时,调用者收回(reclaim)被调用者使用的堆栈空间。,函数调用(子函数),(1)被调函数(子函数)为所有的局部的变量、临时存储区和它调用的函数的参数分配足够的堆栈空间。(2)如果被调函数还继续调用其他的函数,返回地址必须保存在堆栈中。(3)如果被调函数修改寄存器A10到A15或者B10到B15的值,必须将它们保存。(4)被调函数执行其代码。(5)存放返回值在A5:A4中。(6)恢复3中保留的寄存器值(7)释放1分配的堆栈(8)利用B3,跳转返回父函数,C/C

8、+与汇编语言的接口,使用独立的汇编代码模块,并将其与编译完的C/C+模块连接在一起在C/C+源程序中使用内联函数(intrinsics),直接地调用汇编语句使用内联(inline)汇编语言直接嵌入C/C+源程序在C/C+源程序中使用汇编程序变量和常量,C+调用汇编程序,内联函数(intrinsics),C6000编译器可以识别若干内联函数。内联函数直接调用某些汇编语句,这些汇编语句在C/C+中实现起来是很繁复或难以表达的。int x1,x2,y;/饱和加法y=_sadd(x1,x2);,内联(inline)汇编语言,asm(”;*这是汇编语言的注释”);要很小心不要破坏C/C+环境。对插入的汇

9、编指令,编译器不做任何检查或者分析。,用C/C+访问汇编语言变量,系统初始化,运行一个C/C+程序之前,必须建立C/C+运行环境。这个工作是由C/C+引导程序调用c_int00函数完成的。系统运行开始时,跳转到或调用c_int00函数,但通常是硬件复位中断的中断服务程序调用它的。1)定义系统堆栈.stack段并初始化堆栈指针。2)定义.bss并初始化DP指针3)初始化全局的变量,这是通过将.cinit段中的初始化表复制给.bss段中为变量分配的存储空间来完成的。如果是在加载时初始化变量(cr选项),加载器(loader)在程序运行之前就完成了这个步骤(它不是通过引导程序执行的)。4)调用mai

10、n函数来运行C/C+程序。,运行时初始化和加载时初始化,C_int_00源码 1,extern void _interrupt c_int00()/*-*/*SET UP THE STACK POINTER IN B15.*/*THE STACK POINTER POINTS 1 WORD PAST THE TOP OF THE STACK,SO SUBTRACT*/*1 WORD FROM THE SIZE.*/*-*/_asm(mvkl _stack,SP);_asm(mvkh _stack,SP);_asm(mvkl _STACK_SIZE-4,B0);_asm(mvkh _STACK_

11、SIZE-4,B0);_asm(add B0,SP,SP);/*-*/*THE SP MUST BE ALIGNED ON AN 8-BYTE BOUNDARY.*/*-*/_asm(and 7,SP,SP);/*-*/*SET UP THE GLOBAL PAGE POINTER IN B14.*/*-*/_asm(.global$bss);_asm(mvkl$bss,DP);_asm(mvkh$bss,DP);,C_int_00源码 2,/*-*/*SET UP FLOATING POINT REGISTERS FOR C70 ONLY*/*-*/#ifdef _TMS320C6700 _

12、asm(mvk 0,B3);/*round to nearest*/_asm(mvc B3,FADCR);_asm(mvc B3,FMCR);#endif/*-*/*GET THE POINTER TO THE AUTOINITIALIZATION TABLES INTO THE FIRST*/*ARGUMENT REGISTER(A4)*/*-*/_asm(.global cinit);_asm(mvkl cinit,A4);_asm(mvkh cinit,A4);/*-*/*PASS THE CURRENT DP TO THE AUTOINITIALIZATION ROUTINE.*/*-

13、*/_asm(mv DP,B4);,/*-*/*CALL THE AUTOINITIALIZATION ROUTINE.*/*-*/_asm(.global _auto_init);_asm(mvkl$aiRL,B3);_asm(mvkh$aiRL,B3);_asm(mvkl _auto_init,B0);_asm(mvkh _auto_init,B0);_asm(b B0);/*far call*/_asm(NOP 5);_asm($aiRL:);/*-*/*CALL THE USERS PROGRAM.*/*-*/main();/*-*/*CALL EXIT.*/*-*/exit(1);,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号