钩子函数(hook function)是在进入程序中的函数或许退出函数时调用的程序。它们的用处包含:调试(debug)、盯梢(trace)、评价(profile)以及仓库溢出的检测等。咱们能够经过表1中的选项对钩子函数的运用进行操控。
表1 进口/出口钩子函数选项
关于钩子函数,在CCS的编译器里还有以下的几个规矩能够弥补阐明一下:
1. 使能钩子函数选项的话,会默许运用表1中的界说办法创立钩子函数的隐式声明。此刻假如咱们要声明或许界说钩子函数的功用的话,有必要与这个隐式声明运用相同的界说办法。
2. 在C++编程的时分,钩子函数被声明为外部的C函数,这时分咱们能够运用C言语或许汇编言语来编写钩子函数的程序,由于运用的是extern C的调用办法,所以咱们不必忧虑会违背C++的函数姓名改编(name mangling)规矩而发生编译过错。
3. 钩子函数能够被声明为inline内联类型的,此刻编译器把它们与其它的内联函数依照相同的规矩进行处理,例如函数优化等选项对它们起相同的效果。
4. 进口钩子函数和出口钩子函数是相互独立的,咱们能够只运用它们中的一个,或许一起运用它们。
5. 咱们要避免对钩子函数的递归调用,也就是说在钩子函数中不要调用其它包含了对钩子函数自身进行调用的函数(有点小拗口)。为了避免这种潜在bug的发生,编译器对钩子函数的发生有一些约束,例如关于内联类型的函数或许钩子函数自身,咱们都无法为它们发生一个钩子函数。
那假如在优化选项的效果下,编译器把某些函数主动优化为内联函数的话,咱们现已为它们发生的钩子函数会不会导致过错呢?此刻咱们要运用–remove_hooks_when_inlining选项把编译器主动内联的函数的进口/钩子出口函数给优化掉。
6. 假如咱们不期望发生钩子函数的话,在编程时能够直接运用与处理指令阻挠发生钩子函数。在C言语编程时,运用办法为#pragma NO_HOOKS ( func );
在C++编程时,运用办法#pragma NO_HOOKS;(话说C++的语法常常比C的要简略一些)。
钩子函数相关的操控选项并不多,不过其运用时的条条框框却真不少。下面咱们换个轻松点的看看,比方库函数选项。库函数一般是指编译器供给的可在C/C++源程序中调用的函数。可分为两类,一类是C言语规范规矩的库函数,一类是编译器特定的库函数。库中寄存函数的称号和对应的方针代码,以及衔接过程中所需的重定位信息,一般情况下厂家不会向咱们敞开库函数的内容。当然,在CCS编程中,假如咱们咱们需求共享某个功用给他人,可是又不想让他们知道函数的内容,也能够把咱们的函数乃至程序封装为一个库函数(CCS一般情况下咱们用它发生.out二进制文件,此外还能够发生.lib库文件)就行了。
库函数咱们都不生疏,比方在C2000 DSP的编程中,为了运用定点数学库的相关函数,咱们要把IQmath.lib加入到工程里;为了运用FPU相关的浮点函数库,咱们需求调用C28x_FPU_Lib_Beta1.lib等。在CCS编译环境下,库函数的相关选项并不多,也不杂乱,如表2、表3所示。
表2 库函数选项1
在运用编译器的–opt_level=3优化等级(即-O3,文件等级的优化)的情况下,编译器会对已知的库函数使用已有的优化规矩直接输出优化成果。可是假如咱们对规范的库函数进行重界说,即规范库函数的界说发生了改动的话,则对它的优化将失效。
表2 库函数选项2