微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于ADSP-TS101S嵌入式系统的混合编程

基于ADSP-TS101S嵌入式系统的混合编程

时间:08-10 来源:3721RD 点击:

3 程序优化

程序优化包括汇编优化和C优化。手写汇编程序的优化空间相当大,可以产生非常高效的程序代码。由于许多相关书籍都有介绍,就不再赘述,这里主要介绍C程序的优化。

一般DSP的C编译器都会提供优化编译器,采用优化编译就可以生成效率更高的汇编代码,在某些情况下,执行优化的程序代码要快10~20倍。从某种程度上说,C程序的效率主要取决于C编译器所能进行优化的范围和数量。应说明的是,TSl01S编译器的默认设置是不使用优化器,它可以进行以下几个不同级别的优化,优化程度由低到高:

①Debugging:"-g"开启。编译器产生调试信息,以确保目标码与相应的源代码匹配。
②DefauIt:编译器进行基本的高级优化。例如对明确标明的内联函数进行内联。
③Procedural optimization:"-o"启动。编译器对要编译的文件中的每一过程进行高级优化。如果同时开启"-g",由于"-O"项有更高的优先级,会限制调试功能。
④Interprocedural optimization:"-ipa"打开。除了基本优化外,编译器将对所有源文件的整个程序进行高级优化操作,将删除从没被调用的函数和变量,会明显减少代码长度。

以上"-g"、"-O"、"-ipa"在编译信息中可以看到。优化级越高,优化的范围就越广。应注意的是,使用C优化编译可以提高程序的运行效率,但由于优化时采用了一些优化措施,使得C和汇编的交叉列表文件不如在不用优化时得到的那样清晰。因此,在调试程序时,最好先不用优化编译进行调试,待程序调试成功后再用优化编译进行优化。采用C优化编译时,为了保证程序的正确性,特别需要注意几点:

①使用asm行汇编语句时必须特别小心。优化器在优化过程中会对程序代码重新进行组织,寄存器使用也比较灵活,同时程序中的有些变量或表达式可能会被删除。虽然asm语句不会被删除,但asm语句的前后环境可能因优化而发生很大的变化。因此,当asm语句涉及到C环境或访问C变量时,使用优化器可能会得到不正确的结果。此时,必须对编译后得到的汇编语句进行仔细的检查,以确保asm语句在程序中的正确性。一般而言,当asm语句仅涉及诸如控制中断寄存器或I/0口等硬件操作时,使用优化是比较安全的。

②在高级优化中,C语言源函数中从未使用过的变量和函数将被删除。若汇编子函数的C外部变量在C程序中从未使用过,有可能被删除并导致编译失败。使用retain_name pragma可以避免变量和函数因优化而被删除。例如:
保留函数



③使用volatile变量避免优化。一个定义为volatile的变量是说这个变量可能会被意想不到地改变,比如,并行设备的硬件寄存器(如状态寄存器),一个中断服务子程序中会访问到的非自动变量,多线程应用中被几个任务共享的变量。采用volatile限定词,优化器在用到这个变量时必须每次都重新读取这个变量的值,而不是使用保存在寄存器里的备份。
④C语言程序应尽量避免使用指针运算。指针转换会在一定程度上降低运行效率。
⑤在"-ipa'’使能的情况下,在循环前使用#pragmann_alias可以起到进一步优化程序的功能。一般来说,对于循环中不存在迭代运算(使用上一次结果)的情况,优化效果很好。
⑥使用PM限定词定义数据块。默认情况下数组存放在DM区,即第一块数据区(0x80000-0x8ffff)中。使用PM限定的数组放在第二块数据区(0x100000-0x10ffff)中。由于两块数据区有独立的128位数据总线相连,因此可以实现单周期内的双数据同时访问。

4 混合编程在系统程序管理中的应用

下面是一个嵌入式系统管理实例。系统由4片DSP构成,作为系统管理的DSP0负责通过IRQ0接收控制台从RS232串口传来的控制字,译码,并通过控制flag3产生下降沿触发IRQ3中断来启动其他各片DSP。这里用C搭建框架,汇编控制底层硬件,效率高,可读性强。由于篇幅限制,这里略去了串口初始化、串口数据接收函数以及其他芯片的处理程序。

以下是系统管理中的混合编程。
Main.c文件:









5 总 结

实践证明,采用混合编程的软件更加符合一般系统对时间和空间的严格约束。设计良好的混合编程软件既能有效满足嵌入式系统对功能与性能的需求,也可以为程序的扩展和移植预留足够的空间。总之混合编程是嵌入式系统软件优化的重要途径。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top