DSP编程技巧之_第1页
DSP编程技巧之_第2页
DSP编程技巧之_第3页
DSP编程技巧之_第4页
DSP编程技巧之_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、DSP编程技巧之18-不得不看的编译指示编译指示(Pragma Directives)可能是所有的预处理指令中最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对编译器给出了如何处理特定的函数、对象和代码段的方法,在保持与C/C+语言完全兼容的情况下,给出主机(比如C28x)或操作系统(比如DSP/BIOS)专有的特征。这些编译指示的使用较为复杂,但是我们还必须要了解它们,因为它们是程序中必不可少的东西,例如#pragma DATA_SECTION ( symbol , section name );这样的。但是往往讲解它们的资料又不多(因为大部分资料

2、集中在入门指南上面),所以在此我们就总结一下针对C28x编译器的pragma指令,再遇到它们的时候就不会一头雾水了。本文引用地址:/article/.htm1.CHECK_MISRA它的作用与在编译器选项中使用-check_misra是相同的,都是对特定源文件使能MISRA-C:2004规则检查(汽车工业软件可靠性联会),使用方法是:#pragma CHECK_MISRA ( all|required|advisory|none|rulespec );其中的rulespec是具体MISRA中的规则,使用方法请参考DSP编程技巧之12-揭开编译器神秘面纱

3、之代码规范MISRA-C。2.CLINKCLINK指令可用于某段代码或者某个数据符号,使用之后会在包含被作用符号的段中产生一个.clink指示,表明在条件链接的情况下,如果这个段没有被其它任何段引用的话,这个段可以被移除,从而减小链接输出文件的尺寸。使用方法是:#pragma CLINK (symbol )3.CODE_ALIGNCODE_ALIGN用来沿着特定的对齐参数constant来对齐函数(从而可以让CPU更快寻址,更快执行指令)。当我们希望函数从特定的边界开始的时候,这个指令非常有用。参数constant必须是2的幂(偶数对齐),使用方法是:C代码: #pragma CODE_ALI

4、GN ( func, constant );C+代码: #pragma CODE_ALIGN ( constant );注:在本文中,在C和C+代码中,指令使用方法一样时,不分别写出,如不一样则分C代码和C+代码分别写出。C代码中的#pragma指令一般需指定函数名,也即其作用域;C+代码中的#pragma指令一般不带有函数名,其作用域为紧邻该指令后面的函数;下同。4.CODE_SECTIONCODE_SECTION是较为常见的指令,默认情况下,代码被存放在.text段中,使用此指令则用来指定并改变某段代码所分配的段,其使用方法是:C代码: #pragma CODE_SECTION (symb

5、ol , section name )C+代码: #pragma CODE_SECTION ( section name )例如:char bufferA80;char bufferB80;#pragma CODE_SECTION(funcA, codeA)char funcA(int i);char funcB(int i);void main()char c;c = funcA(1);c = funcB(2);char funcA (int i)return bufferAi;char funcB (int j)return bufferBj;5.DATA_SECTIONDATA_SECT

6、ION可能是使用最多的pragma指令了,它用来定义存储某个符号所使用的段,使用方法是:C代码: #pragma DATA_SECTION ( symbol , section name );C+代码: #pragma DATA_SECTION ( section name );例如:#pragma DATA_SECTION(bufferB, my_sect)char bufferA512;char bufferB512;6.与诊断信息有关的Pragma诊断信息一般包括:提醒,警告,错误和不提示等几个级别,使用与诊断信息有关的Pragma和使用相关的编译器选项的结果是一样的,其使用方法以及们的

7、对应关系如下:Pragma对应的编译器选项有关诊断信息的含义,请参考DSP编程技巧之7-揭开编译器神秘面纱之预处理与诊断。7.FAST_FUNC_CALL使用这个指令,会在编译时调用快速汇编指令FFC,而不是传统的CALL指令来完成函数的跳转,其使用方法是:#pragma FAST_FUNC_CALL ( func );它的使用范围是受限的:仅限于调用返回LB *XAR7指令的汇编程序。例如:;汇编程序_add_long:ADD ACC, *-SP2LB *XAR7/调用汇编的C程序#pragma FAST_FUNC_CALL (add_long);long add_long(long, lo

8、ng);void foo()long x, y;x = 0xffff;y = 0xff;y = add_long(x, y);除此之外,如果使用该指令,编译器会输出警告信息,并忽略其指示。8.FUNC_EXT_CALLED在我们启用程序级别的优化选项时(-O3),所有未直接或者简介被main函数调用的函数都将被优化掉,但是这些函数也有可能被我们定义的某些汇编代码使用到,所以使用FUNC_EXT_CALLED可以在编译时保留这些代码,其使用方法是:C代码: #pragma FUNC_EXT_CALLED ( func );C+代码: #pragma FUNC_EXT_CALLED;9.FUNCT

9、ION_OPTIONS使用这个选项可以在编译C/C+代码中的某些函数时,使用额外的编译器的命令行选项,实现与在命令行中输入相关的命令同样的效果。其使用方法是:C代码: #pragma FUNCTION_OPTIONS ( func, additional options );C+代码: #pragma FUNCTION_OPTIONS( additional options );10.INTERRUPT使用这个选项可以在C代码中直接操作中断,其使用方法是:C代码: #pragma INTERRUPT ( func );C+代码: #pragma INTERRUPT ;被该指令直接操作的函数将使

10、用IRP(中断返回指针)来返回值。在使用FPU时,中断分为两种:高优先级中断HPI和低优先级中断LPI,其中HPI使用快速的上下文存储机制,不能被嵌套,LPI则与普通的C28x中断机制一样,并且可以被嵌套。此时可以增加第二个参数来控制:C代码: #pragma INTERRUPT ( func , HPI|LPI );C+代码: #pragma INTERRUPT ( HPI|LPI );在DSP/BIOS和SYS/BIOS HWI对象中,不能使用INTERRUPT指令,因为Hwi_enter/Hwi_exit宏和Hwi解包器已经包含了该函数,此时使用该指令会产生负面的效果。11.MUST_I

11、TERATE使用这个指令的情况下,我们确信某个for循环能够执行指定的次数。使用这个指令能够帮助编译器确定循环的次数和最佳的实现方式,从而减小代码的尺寸。其使用方法是:#pragma MUST_ITERATE ( min, max, multiple );min是循环的最小次数,max是最大执行次数,multiple则是循环次数的整数倍,如果这其中某个参数不存在,则可以省略,例如:#pragma MUST_ITERATE(5); /* 最少循环5次 */#pragma MUST_ITERATE(5, , 5); /* max参数省略;循环次数是5的倍数次(至少1倍) */pragma MUST

12、_ITERATE(8, 48, 8);/* 循环此时可能为8, 16, 24, 32, 40, 48 */12.NO_HOOKS该指令阻止在调用函数时自动产生进入钩子和退出钩子,使用方法是:C代码: #pragma NO_HOOKS ( func );C+代码: #pragma NO_HOOKS;13.RESET_MISRA顾名思义,这个指令会把MISRA-C:2004规则检查恢复到它原先的设定状态。例如,某条规则在命令行里被使能,但是在某段代码中被屏蔽了(某些原因导致它无法通过规则检查),使用该指令会规则检查重新使能。使用方法是:#pragma RESET_MISRA ( all|requi

13、red|advisory|rulespec )14.RETAIN使用这个指令,可以避免某些符号在条件链接时被优化掉,从而在输出文件中保留它。使用方法是:#pragma RETAIN ( symbol )这个指令与我们的第二条,CLINK的效果是整好相反的。15.SET_CODE_SECTION与SET_DATA_SECTION这两条指令用来设置其后所有声明的段。使用方法是:C代码: #pragma SET_CODE_SECTION (section name)C+代码: #pragma SET_DATA_SECTION (section name)例如:#pragma SET_DATA_SECTION(mydata)int x;int y;#pragma SET_DATA_SECTION()其中的x和y都被会放入我们指定的段mydata中,直到我们使用空参数SET_DATA_SECTION(),之后的代码或数据才会被放入默认的段之中。16.UNROLLUNROLL是“摊开”的意思,这个指令与for/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论