view TaskManager/kernel/ppe/Task.cc @ 684:458a1ad91427

Task Array generation worked.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 06 Dec 2009 23:03:28 +0900
parents 9a6cb2439593
children 257ad1a518e3
line wrap: on
line source

#include "Task.h"

// #include "SchedTask.h"  it includes #define Task

#ifndef SIMPLE_TASK
/**
 * タスクの入力データを追加する
 *
 * @param [addr] add input data
 * @param [size] size of data at [addr]
 *
 * @return if ([ret] == 0) ? success : failuer;
 */
int
Task::add_inData_t(memaddr addr, int size)
{
    return add_data(inData, addr, size);
}

/**
 * タスクの出力先を追加する
 *
 * @param[in] addr Address at out data
 * @param[in] size Size of data transfer
 *
 * @return if ([ret] == 0) ? success : failuer;
 */
int
Task::add_outData_t(memaddr addr, int size)
{
    return add_data(outData, addr, size);
}

/**
 * エラーの時に -1 を返す、ってことするよりは
 * perror みたいにしたほうがわかりやすいかな。
 *
 * 現在は MAX_PARAMS 個まで。
 * 本当は、MAX_PARAMS個以上にすると task->param[] には アドレスが入り
 * そのアドレスは メインメモリでアロケートされた int の集合。
 */

// こちらのAPIは、受け側と出力側での対応を良く見れない。廃止の方向。
int
Task::add_param_t(memaddr _param)
{
    if (param_size >= MAX_PARAMS) return -1;
    
    this->param[param_size++] = _param;
    return 0;
}

int
Task::set_param_t(int index, memaddr _param)
{
    if (index >= MAX_PARAMS) return -1;
    
    this->param[index] = _param;
    return 0;
}

/*
 * エラーの時に -1 を返す、ってことするよりは
 * perror みたいにしたほうがわかりやすいかな。
 */
int
Task::add_data(ListData& list, memaddr addr, int size)
{
    if (list.length >= MAX_LIST_DMA_SIZE) return -1;

    list.bound[list.length] = list.size;

    // size でも制限かけるべき?
    list.size += size;

    ListElementPtr elm = &list.element[list.length++];
#ifdef __CERIUM_CELL__
    elm->addr = (uint32)(unsigned long)addr;
#else
    elm->addr = addr;
#endif
    elm->size = size;
    return 0;
}

#else /* ifdef SIMPLE_TASK */

void 
Task::set_inData_t( int index, memaddr addr, int size)
{
    ListElementPtr elm = (ListElementPtr) inData(0);
#ifdef __CERIUM_CELL__
    elm->addr = (uint32)(unsigned long)addr;
#else
    elm->addr = addr;
#endif
    elm->size = size;
}  

void 
Task::set_outData_t(int index, memaddr addr, int size)
{
    ListElementPtr elm = (ListElementPtr) outData(0);
#ifdef __CERIUM_CELL__
    elm->addr = (uint32)(unsigned long)addr;
#else
    elm->addr = addr;
#endif
    elm->size = size;
}

void
Task::print()
{
    printf("task id %d task size = %d param size %d "
       "inData size %d "
       "outData size %d\n", command, size(), param_size, inData_size, outData_size
    );
    for(int i=0; i< param_size && i<5; i++) {
	printf("param %d = 0x%ld\n", i, (long)param(i));
    }

}

#endif

/* end */