DSP的C语言优化之Circular,2数组指针

7.2数组和指针,7.2数组指针

#include<stdio.h>
int main(void)
{
    long multiple[]={15L, 25L, 35L, 45L};

    long *p=multiple; //把p设置为multiple的地址,为什么不是multiple的值 

    for(int i=0;i<sizeof(multiple)/sizeof(multiple[0]);++i)

        printf("address p+%d(&multiple[%d]):%llu *(p+%d) value:%dn",i,i,(unsigned long long)(p+i),i,*(p+i));

        printf("n type long occupies: %d butesn",(int)sizeof(long));

    return 0;

} 

 

#includestdio.h int
main( void ){ long multiple[]={ 15L , 25L , 35L , 45L }; long
*p=multiple; // 把p设置为multiple的地点,为何不是…

 

循环索引:

  对应的C代码:

 

日常的CPU都还没硬件支持%操作,它实际上是用子程序实现的,效用上相当的低。而Blackfin
DSP提供的DAG通过创造规划,能够达成%操作。

官方澳门新永利下载 1

#include <stdio.h>
int main(void)
{
    int x = 0;
    int i;

       先看以下这么些例子:

结语:固然编写翻译器能够活动对代码优化,可是并非怀有能够优化的地点都能检查评定出来,因而,有认为有必要优化的地点,使用内建函数对编写翻译器指引携带依旧必不可缺的。建议不接受-force-circbuf,在非常大种类里,它使调节和测验变得更辛勤。

int main( void )
{
    int i, j, n = 20;

long circindex(long index, long incr, unsigned long nitems);

 

Visual DSP++的该选项地点:

官方澳门新永利下载 2

       Circular
Buffer,即循环缓存,也正是指规定生龙活虎段内部存款和储蓄器,借使起头地址为B,终止地址为B +
L,当指针I大于B+L时,将电动将I调解为B + I % L。

.import “stdio.h”;
.section L1_data;
.byte str[] = ‘the number:%d’,10;
.section program;
.align 8;
.global _main;

官方澳门新永利下载, 

    for (i = 0; i < 9;i++)
        x = (x + 1) % 4;
    printf(“the number:%dn”, x);
    return 0;
}

图中五个标记的地点分别是多个for语句内代码的反汇编,可以看出,第一个编写翻译器并无优化,里面还用CALL调用了子函数。相比较之下,第贰个for每回循环唯有2周期,成效相差最少5倍。

先是看循环索引的例证,及其反汇编代码来证实如何优化:

官方澳门新永利下载 3

1     for (i =0; i < 1000; i += n)
2     {
3         b[i % 80] = i;
4     }

发表评论

电子邮件地址不会被公开。 必填项已用*标注