类似linux驱动的写法



struct __gsim_struct_device__
{
    char*               name;                                               //!< name of the device
    TGSimDeviceCls      cls;                                                //!< default value PeriDev
    TGSimDeviceId       id;                                                 //!< run timer parameter Device Instance id
    TGSimError          (*control) (TGSimDevice* self, TGSimCtrlCmd cmd,
                                    PVOID param);                       //!< used by arbitrator to get the device status
    void                (*create) (TGSimDevice* self);                  //!< create function of device
    void                (*destroy) (TGSimDevice* self);                 //!< destroy function of device
    PVOID               priv;
};

typedef enum
{
    eDevIniting,
    eDevRunning,            //<  Device running
    eDevPending,            //<  Device pending
    eDevExit,            //<  Device pending
}EDevSt;
typedef struct __struct_taskdev_priv TTaskDevData;
typedef struct __struct_arbitrator__ TArbitrator;
struct __struct_arbitrator__
{
    sem_t            sem;            // Semaphore which used by arbitrator to synchronize tasks
    EDevSt           st;             // Current status of the task
};
struct __struct_taskdev_priv
{
    TArbitrator         arbitrator;
    sem_t*              thread_ready;
    TQueue*             msgQueue;
    EDevSt              (*status) (TGSimDevice* self);                  //!< used by arbitrator to get the device status
    bool                (*send) (TGSimDevice* self, void* message);     //!< used by Message Send to send message
    void                (*start) (TGSimDevice* self);                   //!< create function of device
    void                (*stop) (TGSimDevice* self);                    //!< destroy function of device
    void                (*init)(TGSimDevice* dev);
    void                (*body)(TGSimDevice* dev);
};


static bool __TaskDev_Init(TGSimDevice* dev, uint32_t size, TGSimCB init,
        TGSimCB body)
{
    static TTaskDevData taskdev_tmpl=
    {
            .send   =__taskdev_send  ,
            .start  =__taskdev_start ,
            .stop   =__taskdev_stop  ,
    };
    dev->cls=malloc(sizeof(TTaskDevData)+size);
    assert(dev->cls!=NULL);
    TTaskDevData * taskdev=(TTaskDevData*)dev->cls;
    *taskdev=taskdev_tmpl;
    taskdev->init=init;
    taskdev->body=body;
    taskdev->msgQueue = Queue_Create(DEFAULT_CPU_QUEUE_MESSAGE_CAPACITY);
    assert(taskdev->msgQueue!=NULL);
    return true;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值