×

DSP编程技巧之五大使用代码优化的问题解析

消耗积分:0 | 格式:rar | 大小:0.1 MB | 2017-10-17

分享资料个

  1. 小心使用汇编表达式

  在C/C++代码中,有时候一些操作难免会对某些CPU寄存器进行操作,此时要使用内嵌的汇编表达式,例如asm(“EALLOW”),或者重置某个中断的掩码寄存器等。在优化代码时,编译器会重新调整某些代码段的顺序,自己决定使用某些寄存器(例如AR0-AR7这样的辅助寄存器),甚至删除某些编译器认为无用的变量、函数等,但是编译器一般情况下并不会对内嵌的汇编代码进行任何优化(除非这段汇编代码被编译器认为是永远不会执行到的无用代码),这就造成了编译器的优化效果在这段汇编代码和它的上下文代码中无法进行有效的优化,特别是汇编代码和C/C++代码直接存在变量调用的情况下。所以非必要的情况下,要尽量避免C/C++和汇编语句的混用,如果确实需要的,也要在编译之后检查生成的汇编代码是不是保证了我们代码原意的完整性。

  2. 为必要的内存存取使用volatile关键字

  在C/C++代码的编译过程中,编译器会分析数据流,从而尽量避免对存储空间的直接存取。但是如果我们要在C/C++代码中直接对内存地址进行操作的话,需要使用volatile关键字来定义变量,编译器在优化时不会对volatile类型的变量进行优化。

  例如,在下面的代码中,循环的结束条件为指针指向的地址为0xFF:

  unsigned int *ctrl;

  while (*ctrl !=0xFF);

  因为*ctrl是一个不变的表达式,这个循环会被优化为一次内存读取。为了正确实现我们的代码意图,需要把ctrl定义为volatile类型:

  volatile unsigned int *ctrl

  使用volatile类型定义的类型在调试的时候还有一个极大的优势,就是我们可以直接在CCS的debug窗口里改变变量的值,极大地方便我们的调试。

  3. 小心使用Alias变量

  Alias(别名)在一个变量可以被至少两种方式存取的时候会用到,例如,当两个指针指向同一块区域或对象时,我们称一个指针 alias 另一个指针。Alias变量的使用要非常谨慎,因为会涉及到非直接的引用,从而破坏了优化效果。编译器在优化时会分析代码来决定在哪些地方会产生alias引用,然后在保持代码正确性的基础上“保守”地优化代码。

  一般情况下,编译器会假设,如果一个本地变量的地址被传递给某个函数,则这个函数有可能会通过指针操作改变这个本地变量的内容,但是这个函数不能在该地址被返回后仍然可以被别的指针操作所示使用,例如把这个本地变量的地址分配给一个全局变量或者返回它。如果这种假设被打破,则需要在编译器选项里使用-ma强制编译器按照最坏情况的别名引用来进行一定的优化,在这种情况下,任何非直接的引用(例如使用指针)都可以引用到这个变量。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !