《电子技术应用》
您所在的位置:首页 > 可编程逻辑 > 业界动态 > DSP编程技巧之:运行时模型以及钩子函数与库函数

DSP编程技巧之:运行时模型以及钩子函数与库函数

2015-09-18
关键词: DSP 编程技巧 库函数

  在前面几期中,我们了解到DSP编程技巧之:编译流程与处理器选项、程序优化、调试与路径选项、控制与语言选项以及预处理与诊断,今天为大家讲解运行时模型以及钩子函数与库函数
  当我们在PC运行一些C/C++编写程序的时候,如果缺少必要的库文件或者说一些dll文件之类的,程序会崩溃并在各种崩溃声音的提示下弹出一堆对话框,提示我们“run-time error”,缺少xxxx运行库文件等等。那运行库文件是做什么的呢?它里面主要包含了C/C++的库函数,编译器内建的一些功能函数、浮点数的算数运算函数,以及编译器所支持的C语言中一些与I/O操作有关的函数等。在DSP中运行里面运行我们的程序时,同样需要相关的实时运行库文件的支持;所以我们要配置一些相关的运行库选项,使得编译器知道我们希望使用什么样的方法来使用实时运行库,这就是运行时模型(run-time error),它主要定义了代码在特定选项之下的运行方式,这些选项如表1所示。
  钩子函数(hook function)是在进入程序中的函数或者退出函数时调用的程序。它们的用途包括:调试(debug)、跟踪(trace)、评估(profile)以及堆栈溢出的检测等。我们可以通过表1中的选项对钩子函数的使用进行控制。
  DSP编程技巧之:运行时模型以及钩子函数与库函数

  关于钩子函数,在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所示。
  DSP编程技巧之:运行时模型以及钩子函数与库函数
  在使用编译器的--opt_level=3优化级别(即-O3,文件级别的优化)的情况下,编译器会对已知的库函数利用已有的优化规则直接输出优化结果。但是如果我们对标准的库函数进行重定义,即标准库函数的定义发生了改变的话,则对它的优化将失效。
  DSP编程技巧之:运行时模型以及钩子函数与库函数

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。