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

ADSP-TSl01S嵌入式系统的混合编程

时间:05-18 来源:单片机及嵌入式系统应用 点击:

中断是DSP控制程序执行的重要方式。通常,DSP工作在包含多个外部异步事件的环境中,这些异步事件的随机发生要求DSP能中断当前的处理程序并转向执行该事件处理程序,执行完后又要求返回被中断的原程序继续处理步骤,这一过程就是中断。中断源可以来自片内或片外的设备,例如时钟、A/D等。中断的设置包含两步--①打开中断屏蔽寄存器的相应中断位,②设置中断服务程序的入口地址,这样就能实现中断的正常运行。中断服务程序是特殊的函数,不能带返回值,不能传递参数,内容须短而有效。标准运行模式为:①保存断点地址并保护所有用到的寄存器,②执行中断服务程序,③释放寄存器并返回。

ADSP-TSl01s中C语言中断实现有两种方法:一种是采用interrupt(int,vuid(*func(int)))函数来设置中断矢量表,这个函数定义在signal.h头文件中。第一个参量表示需响应的中断位,在这个头文件中也有定义;第二个参数即是中断服务程序。应该引起注意的是,采用这种方法时,IMASK寄存器的异常中断位必须打开,因为interrupt()库函数要使用trap语句来产生陷阱,必须打开异常中断,陷阱才能设置成功,中断矢量表的设置才能完成,否则,中断来l临并不会进入指定的中断服务程序。另一种与汇编语言中断服务程序的实现类似。以定时器O为例,设置好IMASK后,用_builtin_sysreg_write(_ⅣTIMEROHP,(int)timer0h_isr)函数设置中断矢量表,用#pragma interrupt来标识中断服务程序即可。这种方法更简单快捷,但它只适用于Visua1DSP++3.5以上版本,而第一种方法适用于任何版本。

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位数据总线相连,因此可以实现单周期内的双数据同时访问。

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

网站地图

Top