view TaskManager/kernel/schedule/SchedTask.h @ 713:f725c6455d19

remove SIMPLE_TASK conditional
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 16 Dec 2009 15:27:46 +0900
parents 56487849ea2d
children 31d0a5baafdf
line wrap: on
line source

#ifndef INCLUDED_SCHED_TASK
#define INCLUDED_SCHED_TASK

#include <stdio.h>
#include <stdlib.h>
#include "base.h"
#include "Scheduler.h"
#include "SchedTaskBase.h"
#include "ListData.h"
#include "HTask.h"
#include "MemList.h"


class SchedTask : public SchedTaskBase {
public:
    /* constructor */
    SchedTask();
    virtual ~SchedTask();

    BASE_NEW_DELETE(SchedTask);

    // Task Array しか使わないが、たいした大きさではないのでいいか...
    ListData inListData;
    ListData outListData;

    /* variables */

private:

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


    /* functions */

    // override
    void read();
    void exec();
    void write();
    SchedTaskBase* next(Scheduler *, SchedTaskBase *);

    // タスクの処理は、task_list に登録された C の関数によっておこなう

    //---  System API ---
    SchedTask* get_nextTask(TaskListPtr list);


public:
    /* functions */

    void init(TaskListPtr _list, SimpleTaskPtr _task, int index,
		    Scheduler* sc);

    //---  User API ---
    int read_size() { return task->r_size; }
    int write_size() { return task->w_size; }
    void set_write_size(int w) { task->w_size = w; }

    virtual void* get_input(void *buff, int index);
    virtual void* get_output(void *buff, int index);
    virtual memaddr get_param(int index);
    memaddr get_inputAddr(int index);
    memaddr get_outputAddr(int index);
    // 書き出しを追加する API がない... 
    int get_inputSize(int index);
    int get_outputSize(int index);

    int get_cpuid();

    void* global_alloc(int id, int size);
    void* global_get(int id);
    void global_set(int id, void *addr);
    void global_free(int id);
    MemList* createMemList(int size, int count);

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

    MemorySegment * get_segment(memaddr addr, MemList *m);
    uint32 get_tag();
    void put_segment(MemorySegment *s);
    void wait_segment(MemorySegment *s);



    void *allocate(int size);
    void free_(void *p) ;

    /* これは禁止するべき */
    void dma_load(void *buf, memaddr addr, uint32 size, uint32 mask);
    void dma_store(void *buf,memaddr addr, uint32 size, uint32 mask);
    void dma_wait(uint32 mask);

    void show_dma_wait();
    void start_profile();


    /*!
      SPU用の get_input, get_output
     */
    void* get_input(int index) {
      return get_input(readbuf, index);
    }

    void* get_output(int index) {
      return get_output(writebuf, index);
    }

    // user
    HTaskPtr create_task(int cmd);
    HTaskPtr create_task(int cmd, memaddr r, long rs, memaddr w, long ws);

    void set_task_depend(HTaskPtr master, HTaskPtr slave);
    void spawn_task(HTaskPtr);
    void set_task_cpu(HTaskPtr, CPU_TYPE);
    void* allocate(int size,int align);
    Scheduler* get_scheduler();
    long get_random();


    /* system call */

    FILE *stdout_;
    FILE *stderr_;
    FILE *stdin_;
    int fprintf(FILE * stream, const char * format, ...);
    int printf(const char * format, ...);

};


extern void loadSchedTask(Scheduler *scheduler,TaskPtr task);

#endif