自己动手封装VxWorks下C++基础类

本文介绍了如何在VxWorks操作系统中使用C++封装系统调用,包括异常类VxError、任务类VxTask、中断类VxInt、看门狗类VxWatchDog和信号量类VxSem的实现,以实现更高效的C++应用开发。通过这些封装,开发者可以更好地管理和控制任务、中断和资源,提高代码的可维护性和可读性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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用以封装VxWorkstask,本来考虑将任务的入口函数作为该类的纯虚成员函数,用户只要在该类的派生类中重载该纯虚函数就能实现自己的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()

        {

        }

};

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值