如果我们已经编写了两个版本的setAlarm-State()函数,那么我们必须保证一次只编译其中的一个。要达到这一目的,一种方法是一直采用CPB代码,直到目标硬件设计好之后,再用目标专用的代码代替其中所有CPB专用的代码。如果我们这样做,那么在我们开始目标硬件的开发工作之后,就无法再运行仿真了。读者可能认为这不是什么问题,但事实上,即使硬件设计好之后,仿真也是有用的。
例如,仿真中基于PC的调试环境往往就比目标硬件的开发环境要好。因为目标硬件的下载速度可能较慢,或者每次修改软件都必须重新烧录一块一次性可编程芯片。而且目标硬件的调试环境中可能也不支持单步调试和断点调试。即使目标硬件的调试环境较好,相对而言,PC仿真还是有其它优势。开发者可以将.exe文件通过电子邮件发送给不在同一工作地点的工作伙伴,以获得他们的反馈信息。
一旦开发者决定要在整个项目的开发周期中同时保留两个版本的函数,那么分隔它们就很容易。在CPB中的Project/Options下,可以定义宏。我通常会定义USING_CPB,然后在我的源代码中,利用一个#ifdef来区分不同的函数版本。另一种区分函数版本的方法就是将目标代码和仿真代码存放在不同的文件中,但让二者共享同一个头文件,以保证二者采用同样一组函数标记。
CPB环境是基于C++的一种环境,但许多嵌入式目标几乎都不支持C。这时,开发者只能采用共享代码中由交叉编译器所支持的C++子集,这其实并没有想象中的困难。解决该问题的方法之一就是针对嵌入式目标来编译代码,即使当前并没有硬件可以运行这些代码。这时那些在PC机上可用的而在目标硬件上则可能属于非法的特性就显得突出起来。例如,有些较小型的处理器就不支持递归。同时,在嵌入式编译器上检查软件,还能快速地在程序中标出那些偶然被包含进目标可执行文件中的CPB专用代码。我本人就发觉这种方法在跟踪软件的大小时非常有用,因为CPB库过于庞大,会完全扭曲程序的大小,所以PC机中进行编译时给出的软件大小并不真实。
IC693CPU351