如何编写电力实时应用的运行在DSP上的高效C代码

2013-12-12 10:46:22 电力信息化  点击量: 评论 (0)
摘要:数字信号处理器(DSP)因其出色的处理能力,在包括电力应用在内的各个领域得到十分广泛的应用。为了满足电力应用的高实时性的要求,需要为DSP编写高效的代码。目前对DSP进行程序设计时,使用得最多的是C语
准库函数中所使用的数组操作方式。也许指针方式在很多时候比下标方式来得更方便,然而下标方式比指针方式具有更高的效率。因此,在DSP程序设计中在能使用下标方式的地方尽量使用下标方式。
例如下面一个初始化数组的函数,用指针方式写成:
void InitArray(int *array, int arrayLenth)
{
int n;
 
for(n=0;n<arrayLength;n++)
{
*array++=0;
}
}
用下标方式写成:
void InitArray(int *array, int arrayLenth)
{
int n;
 
for(n=0;n<arrayLength;n++)
{
array[n]=0;
}
}
用下标方式写成的函数,其执行的时间效率要比用指针方式写成的函数高很多。
3.2.2 少用判断语句和分支语句
判断语句和分支语句的使用会打断流水线,因而严重降低程序的执行效率。从DSP的汇编指令集中可以看得很清楚,一条同时完成乘法和加法的复杂指令只需要DSP的一个指令周期,而一条简单的条件跳转指令则需要DSP的六条指令周期【4】【5】。究其原因,条件跳转语句将打断流水线。在C代码中,if…else…语句和switch…case…语句都属于条件跳转语句。因此,判断语句和分支语句的使用会降低代码的时间效率,要尽量少用。
在实际操作时,可以通过各种方法来避免判断语句和分支语句的使用,用其他代码取而代之。例如下面的返回最大值的函数,如果使用判断语句,函数一般写成如下形式:
int MaxOfTwo(int a, int b)
{
if(a>b)
{
return a;
}
else
{
return b;
}
}
我们可以改写这个函数以避免判断语句的使用,改写后的函数如下:
int MaxOfTwo(int a, int b)
{
unsigned int c;
 
c=a<b;
return (a-c*(a-b));
}
改写后的函数比改写前的函数具有更高的时间效率。
3.2.3 register关键字的使用
在多数DSP程序设计中,都允许使用register关键字【2】。它的作用就在于将register关键字所修饰的变量放在DSP的寄存器中,而不是放在片内存储器中。由于DSP对寄存器的访问速度比对片内存储器的访问速度还要快,因此提高了代码的时间效率。特别是作为循环的计数变量,更需要放入寄存器中。例如前面提到的初始化数组的函数,如果写成:
void InitArray(int *array, int arrayLenth)
{
register int n;
 
for(n=0;n<arrayLength;n++)
{
array[n]=0;
}
}
则变量n将被放入寄存器。虽然多数DSP编译器的自动优化功能有时候会根据自己的判断自动将一些没有进行register修饰的变量放入寄存器,但是编译器的选择往往不是最明智的,需要人为添加register修饰词。如果register变量太多,以至于寄存器的数目不够,编译器会忽视一部分register修饰词,因此不会造成程序的错误。但这不代表所有的变量都可以放入寄存器中。为
大云网官方微信售电那点事儿

责任编辑:和硕涵

免责声明:本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
我要收藏
个赞