社区导航

 

搜索
查看: 82|回复: 0

[资料分享] DSP中如何写C/C++代码?

[复制链接]

6090

TA的帖子

19

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2019-11-12 20:56 | 显示全部楼层 |阅读模式

问题的提出:如何写C/C++代码?

数据类型:
C6000 compiler defines a size for each data type (signed and unsigned):
char 8 bits
short 16 bits
int 32 bits
long 40 bits
float 32 bits
double 64 bits
基于每种数据类型的不同,我们写C代码的时候,有如下的指导方针:
1:避免把int和long搞混,因为C6000把long的值定义为40位
2:无论在什么时间,我们都要尽量使用short类型的数据来作为定点乘法的输入,因为对C6000
   的乘法器来说,这个数据类型最有效率。(short×short使用1个时钟周期,int×int使用
   5个时钟周期);
3:使用int或unsigned int 类型作为循环计数器,而不是使用short或unsigned short数据类型
   这样的目的是避免不必要的符号扩展指令。
4:When using floating-point instructions on a floating-point device such as
   the ’C6700, use the –mv6700 compiler switch so the code generated will
   use the device’s floating-point hardware instead of performing the task
   with fixed point hardware. For example, the RTS floating-point multiply will
   be used instead of the MPYSP instruction.
5:当使用C6400的设备时,使用-mv6400编译器开关,这样代码的产生就会使用设备额外的
   硬件和指令。

分析C代码的性能
用以下的一些计数来分析指定代码的性能:
1:一个初步的手段是看看这段代码的运行时间。使用clock()和printf()函数来计算时间并显示
   出来。我们可以单独使用软件仿真来实现我们的目标。记住要减去调用clock()函数的时间。
2:使用软件仿真的profile模式。这可以通过用-mg选项来编译我们的代码和执行load64x用
   -g选项。profile的结果会存到一个文件中(带有.vaa类型扩展符)--TMS320C6000 Optimizing 
   C/C++ Compiler User’s Guide
3:Enable the clock and use profile points and the RUN command in the Code
Composer debugger to track the number of CPU clock cycles consumed
by a particular section of code. Use “View Statistics” to view the number
of cycles consumed.
4:我们代码中最关键的部分往往是循环部分。优化循环最简单的办法是把这个循环分解
   成单独的可以重写的,重编译的可以用软件仿真器仿真的文件。

Example 2–5. Including the clock( ) Function
#include <stdio.h>
#include <time.h> /* need time.h in order to call clock()*/
main(int argc, char *argv[]) {
const short coefs[150];
short optr[150];
short state[2];
const short a[150];
const short b[150];
int c = 0;
int dotp[1] = {0};
int sum= 0;
short y[150];
short scalar = 3345;
const short x[150];
clock_t start, stop, overhead;
start = clock(); /* Calculate overhead of calling clock*/
stop = clock(); /* and subtract this value from The results*/
overhead = stop – start;
start = clock();
sum = mac1(a, b, c, dotp);
stop = clock();
printf(”mac1 cycles: %d\n”, stop – start – overhead);
start = clock();
vec_mpy1(y, x, scalar);
stop = clock();
printf(”vec_mpy1 cycles: %d\n”, stop – start – over head);
start = clock();
iir1(coefs, x, optr, state);
stop = clock();
printf(”iir1 cycles: %d\n”, stop – start – overhead);
}

Refining C/C++ Code
You can realize substantial gains from the performance of your C/C++ code
by refining your code in the following areas:
Using intrinsics to replace complicated C/C++ code
Using word access to operate on 16-bit data stored in the high and low
parts of a 32-bit register
Using double access to operate on 32-bit data stored in a 64-bit register
pair (C64x and C67x only)

使用内联函数:
如:int sadd(int a, int b)
{
int result;
result = a + b;
if (((a ^ b) & 0x80000000) == 0)
{
if ((result ^ a) & 0x80000000)
{
result = (a < 0) ? 0x80000000 : 0x7fffffff;
}
}
return (result);
}
可以用:result = _sadd(a,b);
内联函数表:

DATA_SECTION pragma的使用:
这个对象指出的是一个far变量,并且这个变量不能被覆盖。要是我们在另一个文件中涉及这个变量
那么我们必须声明一下:用extern far。这样做保护变量的读取,因为这个变量可能不在.bss段中。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-2-18 00:05 , Processed in 0.090200 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表