VxWorks下采用C++构建Application可以使得程序更加利于维护,利用其提供的STL支持,可以省去大量的底层工作,大大加速软件的开发进度。
Tornado完全支持C++开发,风河也提供了包括STL在内的丰富的C++组件,但由于VxWorks的系统调用是以C函数的形式给出的,用户在使用C++编写应用程序的时候并不能实现纯粹的面向对象的开发方式,所以有必要对VxWorks的系统调用用类进行封装,产生VxWorks下的C++基础类库。风河提供WIND基础类库,但是需要另外购买,还是自己动手丰衣足食吧。
1 异常类VxError
首先封装异常类VxError,当程序出现异常时,向外层调用者抛出一个该类的对象,调用者采用try-catch clause捕获该异常对象,进行异常处理。
由于该类针对的是系统运行时产生的异常,故考虑由C++标准异常类中的runtime_error类派生;VxWorks内核采用设置全局变量errno的方式记录系统运行中产生的错误,所以将int errNum 作为该类的成员变量,用以记录异常发生时的errno值。源代码如下:
#include <stdexcept>
#include "errnoLib.h"
class VxRunTimeError : public runtime_error {
protected:
int errNum;
public:
VxRunTimeError(const string msg = "") : runtime_error(msg), errNum(errnoGet ())
{
}
int getErrNum(void)
{
return errNum;
}
};
2 任务类VxTask
任务类VxTask用以封装VxWorks的task,本来考虑将任务的入口函数作为该类的纯虚成员函数,用户只要在该类的派生类中重载该纯虚函数就能实现自己的VxWorks task,但由于taskSpawn()的入口函数的参数类型是FUNCPTR(typedef int (*FUNCPTR) (...)),而指向VxTask类成员函数的指针类型为int (VxTask:: *ptr)(…),编译器不支持这两种类型之间的强制类型转换,所以只能换种思路——用一个名为Runnable的类专门封装task的入口函数,同时提供一个静态成员函数完成对该入口函数的调用,而该静态成员函数地址可以转换成FUNCPTR类型,供taskSpawn()调用。在VxTask类中实现关于task的系统调用。部分源代码如下:
class Runnable {
protected:
virtual void run() = 0;
public:
static void entry(Runnable * Run)
{
Run->run();
}
virtual ~Runnable()
{
}
};