文档详情

5、混合编程详解.ppt

发布:2017-05-20约2.82千字共24页下载文档
文本预览下载声明
5. DSP混合编程程序设计 虽然c编译器的优化功能可以使c代码的效率大大增加,但是在某些情况下,c代码的效率还是无法与手工编写的汇编代码的效率相比。这是因为,即使是最佳的c编译器,也无法在所有的情况下都能够最佳地利用DSP芯片所提供的各种资源。 用c语言编写的中断程序虽然可读性很好,但由于在进入中断程序后,有时不管程序中是否用到,中断程序都将寄存器进行保护,从而大大降低中断程序的效率。如果中断程序频繁被调用,那么即使是一条指令也是至关重要的。 此外,用c语言实现DSP芯片的某些硬件控制也不如汇编程序方便,有些甚至无法用C语言实现。因此,在很多情下,DSP应用程序往往需要用c语言和汇编语言的混合编程方法来实现,以达到最佳利用DSP芯片软硬件资源的目的。 C语言和汇编语言的混合编程方法 (1)独立编写c程序和汇编程序,分开编译或汇编,形成各自的目标代码模块,然后用链接器将c模块和汇编模块链接起来。例如,FFT程序一般采用汇编语言编写,形成目标代码模块,与c模块链接就可以在c程序中调用FFT程序; (2)直接在C语言程序的相应位置嵌入汇编语句; (3)对C程序进行编译,生成相应的汇编程序 ,然后手动修改和优化。 5.1 独立编程,再链接 这是一种常用的c和汇编语言接口方法。采用这种方法时需注意的是在编写汇编语言和c语言时必须遵循有关的调用规则和寄存器规则。如果遵循了这些规则,那么c和汇编函数之间的接口是非常方便的。 c程序既可以调用汇编程序,也可以访问汇编程序中定义的变量。同样,汇编程序也可以调用c函数或访问c程序中定义的变量。 (1)注意的问题 包括存储器、寄存器和函数调用等规则; 汇编模块不能改变由c程序产生的.cinit块,如果改变其内容则会引起不可预测的后果。 编译器在所有的标识符(函数名、变量名等)前要加一下划杠“_”。因此,编写汇编语言程序时,必须在c程序可以访问的所有对象前加“_”。例如,在c程序中定义了变量x,如果在汇编程序中要使用,要标记为“_x” 。 (1)注意的问题 任何在汇编程序中定义的对象或函数,如果需要在C程序中访问或调用,则必须用汇编指令.global定义。同样,如果在c程序中定义的对象或函数,需要在汇编程序中访问或调用,在汇编程序中也必须用.gIobal指令定义。 从C程序中访问汇编程序变量 从c程序中访问在汇编程序中定义的变量或常数需根据变量或常数定义的方式采取不同方法。总的来说,可以分为三种不同的情形:变量在.bss块中定义;变量不在.bss块定义;常数。对于访问在.bss块中定义的变量,可用如下步骤实现: (1)采用.bss命令定义变量: (2)用.global命令定义为外部变量; (3)在变量名前加一下划线“_”; (4)在c程序中将变量说明为外部变量。 采用上述方法后,在c程序中就可以访问这个变量 在C中访问汇编变量的例子1 汇编程序 从C程序中访问汇编程序变量 对于访问不在.bss块中定义的变量,其方法复杂一些。在汇编中定义的常数表是这种情形一种常见的例子。在这种情况下,必须定义一个指向该变量的指针,然后在c程序中间接地访问这个变量。步骤是: (1)申明一个指向该表起始的全局标号。 (2)可以为这个表定义一个独立的块,也可以在现有的块中定义。如果定义为一个独立的块,则可以在链接时将它分配至任意可用的存储器空间。 (3)在c程序中访问该表时,必须另外申明一个指向该表的指针。 在C中访问汇编变量的例子2 汇编程序 从C程序中访问汇编常数 对于在汇编中用.set和.global命令定义的全局常数,也可以从c程序中访问,不过访问的方法更复杂些。 一般对于在c或汇编中定义的变量,符号实际上包含的是变量值的地址,而非变量值本身。然而,对于在汇编中定义的常数,符号包含的是常数的值。而编译器不能区分符号表中哪些是变量值,哪些是变量的地址。 因此,在c程序中访问汇编中的常数不能直接使用常数的符号名,而应在常数名之前加一个地址操作符“&”。如在汇编中的常数名为“_x”,则在C程序中的值应为“x”。 在C中访问汇编常数的例子 在汇编程序中访问C程序变量 在编写独立的汇编程序时,经常需要访问在c程序中定义的全局变量或数组。下面的例子介绍了如何在汇编程序中访问c程序定义的变量和数组。 .end 交叉访问 5.2 在C程序中直接嵌入汇编语句 优点:采用这种方法一方面可以在c程序中实现用c语言无法实现的一些硬件控制功能,如修改中断控制寄存器、中断使能成无效、读取状态寄存器和中断标志寄存器等。另一方面,也可以用这种方法在c程序中的关键部分用汇编语句代替c语句以优化程序。 采用这种方法的一个缺点是比较容易破坏c环境,因为c编译器在编译嵌入了汇编语句的c程序时,并不检查或分析所嵌
显示全部
相似文档