view include/TaskManager/SchedTask.h @ 135:ac436cebae2a draft

remove xml file
author gongo@charles.cr.ie.u-ryukyu.ac.jp
date Thu, 27 Nov 2008 16:19:50 +0900
parents 028ffc9c0375
children e3b7776b1420
line wrap: on
line source

#ifndef INCLUDED_SCHED_TASK
#define INCLUDED_SCHED_TASK

#ifndef INCLUDED_BASE_H_
#  include "base.h"
#endif

#ifndef INCLUDED_SCHEDULER
#  include "Scheduler.h"
#endif

#ifndef INCLUDED_SCHED_TASK_BASE
#  include "SchedTaskBase.h"
#endif

#ifndef INCLUDED_LIST_DATA
#  include "ListData.h"
#endif

#ifndef INCLUDED_TASK_GROUP
#  include "TaskGroup.h"
#endif


class SchedTask : public SchedTaskBase {
public:
    /* constructor */
    SchedTask(TaskListPtr, TaskPtr, ListDataPtr, ListDataPtr, Scheduler*);
    ~SchedTask(void);

    BASE_NEW_DELETE(SchedTask);

    /* variables */
    // 現在スケジューラが持つ TaskList と、このタスクに対応する Task
    TaskListPtr __list;
    TaskPtr __task;

    // read/write 用の ListData
    ListDataPtr __inListData;
    ListDataPtr __outListData;

    // read データ、write 用のバッファ
    // readbuf には タスク登録時に設定した入力データが入っている。
    // writebuf にデータを描き込んでおくと、
    // タスク登録時に設定した出力先に書き込む
    void *__readbuf;
    void *__writebuf;

    Scheduler *__scheduler;
    TaskGroup *__taskGroup;

    int __renew_flag; // タスクが生成されたフラグ
    int __flag_renewTask;

    /* functions */
    SchedTaskBase* next(Scheduler *, SchedTaskBase *);

    void __init__(void);

    // override
    void read(void);
    void exec(void);
    void write(void);

    // ここをユーザが継承して
    // それぞれのタスクに対応した処理を記述する
    virtual int run(void* r, void *w) { return 0; }

    void* get_input(void *buff, int index);
    void* get_output(void *buff, int index);
    int get_param(int index);

    TaskPtr create_task(int cmd);
    void wait_task(TaskPtr waitTask);

    void* global_alloc(int id, int size);
    void* global_get(int id);
    void global_free(int id);

    void mainMem_alloc(int id, int size);
    void mainMem_wait(void);
    void* mainMem_get(int id);

    void *allocate(int size);

    void dma_load(void *buf, uint32 addr, uint32 size, uint32 mask);
    void dma_store(void *buf,uint32 addr, uint32 size, uint32 mask);
    void dma_wait(uint32 mask);

    class STaskManager {
    public:
	STaskManager(SchedTask *_t) {
	    outer = _t;
	}

	BASE_NEW_DELETE(STaskManager);

	SchedTask *outer;

	void* get_input(int index) {
	    return outer->get_input(outer->__readbuf, index);
	}

	void* get_output(int index) {
	    return outer->get_output(outer->__writebuf, index);
	}

	int get_param(int index) {
	    return outer->get_param(index);
	}

	TaskPtr create_task(int cmd) {
	    return outer->create_task(cmd);
	}

	void wait_task(TaskPtr waitTask) {
	    outer->wait_task(waitTask);
	}
	
	void* global_alloc(int id, int size) {
	    return outer->global_alloc(id, size);
	}

	void* global_get(int id) {
	    return outer->global_get(id);
	}

	void global_free(int id) {
	    outer->global_free(id);
	}

	void mainMem_alloc(int id, int size) {
	    outer->mainMem_alloc(id, size);
	}

	void mainMem_wait(void) {
	    outer->mainMem_wait();
	}

	void* mainMem_get(int id) {
	    return outer->mainMem_get(id);
	}

	void *allocate(int size) {
	    return outer->allocate(size);
	}

	void dma_load(void *buf, uint32 addr, uint32 size, uint32 mask) {
	    outer->dma_load(buf, addr, size, mask);
	}

	void dma_store(void *buf,uint32 addr, uint32 size, uint32 mask) {
	    outer->dma_store(buf, addr, size, mask);
	}

	void dma_wait(uint32 mask) {
	    outer->dma_wait(mask);
	}
    };

    STaskManager *smanager;
};

#endif

extern SchedTask* CreateSchedTask(TaskListPtr, Scheduler *);