13.2.1 C语言与汇编语言混合编程的方式
? C语言调用汇编语言编写的函数
? 使用内嵌汇编语句(asm语句)
? C语言访问汇编语言变量
? 手动修改C语言程序编译后生成的汇编代码
13.2.2 存储器模式
TMS320C2x/C2xx/C5x的C语言编译器将存储器分为两个线性的空间:
? 程序存储器 存储可执行代码
? 数据存储器 存储各种变量和堆栈编译器将存储器以分段(section)的方法分配和管理,用户以不同的方式分配存储器,可以形成不同的系统配置。连接器将各个块连接在一起形成最终输出的存储器结构。
已初始化的段:
.text 包含所有可执行代码和浮点型常量 Page 0
.cinit 包含初始化变量和常量表 Page 0
.const 包含字符串常量,以及以const修饰的全局或静态变量的声明和初始化 Page 1
.switch 包含switch语句的分支跳转地址表 Page 0
未初始化的块:
.bss 为全局和静态变量保留空间 Page 1
.stack 为系统软件堆栈分配空间 Page 1
.system 为动态分配的内存保留空间,可以被calloc、
malloc、realloc函数使用 Page 1
13.2.3 系统堆栈系统堆栈分为硬件堆栈和软件堆栈。
DSP内部程序控制逻辑部分包含一定大小的堆栈,通常称为硬件堆栈,可以用来保存若干个分支、跳转、函数调用或中断服务程序的返回地址,也可以用来保存其它变量。
通过系统配置可以另外生成一定大小的软件堆栈,用来:
?分配局部变量
?传递函数参数
?保存处理器状态
?保存函数返回地址
?保存临时结果
?保存寄存器内容堆栈从低端地址向高端地址生成。编译器利用两个辅助寄存器来管理堆栈:
? AR1 堆栈指针(SP,stack pointer),指向当前堆栈顶。
? AR0 帧指针(FP,frame pointer),指向当前帧的起始点,每一个函数都会在堆栈顶部建立一个新的帧,
用来保存局部或临时变量。
C语言环境自动操作这两个寄存器。如果编写用到堆栈的汇编语言程序,一定要注意正确使用这两个寄存器。
用-stack连接选项可以指定软件堆栈的大小,用C编写DSP程序一定注意保留足够的堆栈空间!
注意:编译器不会检查堆栈溢出情况,堆栈溢出会破坏DSP
运行环境,导致程序失败。编写DSP程序和配置DSP存储器资源要注意防止堆栈溢出的发生。
13.2.4 动态分配内存
TMS320C2x/C2xx/C5x C语言可调用malloc、calloc或realloc
函数动态申请内存,申请的内存将分配在.system块。
动态分配的内存只能通过指针进行访问。将大数组通过这种方式来分配可以节省.bss块的空间。
通过连接器的-heap选项可以定义.system块。
/***************************************************/
unsigned int *data;
data =(unsigned int *) malloc (100 * sizeof (unsigned
int));
/***************************************************/
13.2.5 寄存器规则
TMS320C2x/C2xx/C5x运行环境对寄存器的使用有严格的要求,如果编写涉及到寄存器的汇编程序,必须严格遵守这些规则,否则可能造成系统工作异常。
寄存器规则规定了编译器如何使用寄存器,和寄存器在函数调用的过程中如何进行保护。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-29489-49.html
不听话
望严查