Mercurial > hg > Game > Cerium
view TaskManager/Cell/spe/CellScheduler.cc @ 1229:424c1f16e704 draft
add args useRefDma
author | Daichi TOMA <e085740@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 24 Aug 2011 07:45:27 +0900 |
parents | 2a4ba6366394 |
children |
line wrap: on
line source
//#include <stdio.h> #include "CellScheduler.h" #include "CellDmaManager.h" #include "error.h" // ユーザプログラムで定義 // なんだけど、それは微妙じゃね? extern void task_init(Scheduler *scheduler); extern unsigned long long alloc_flag; void CellScheduler::init_impl(int useRefDma) { connector = new CellDmaManager; mainMemNum = 0; task_init(this); // PPE側ではUser 側で既に呼んでいる... // SPE側はここで呼び出す必要がある // Fifo ではSPEは無いので呼び出されない } /** * メインメモリ領域を allocate する。 * allocate した領域のアドレスは mainMem_get で取得するが、 * mainMem_get を実行できるのは * Renew Task (タスク内で create した Task) から。 * alloc してすぐ get しても、アドレス何も入ってないです。 */ void CellScheduler::mainMem_alloc(int id, int size) { mainMemList[id] = (memaddr)NULL; // flag on. (unsigned long long) alloc_flag = 1; mainMemNum++; connector->mail_write((memaddr)MY_SPE_COMMAND_MALLOC); connector->mail_write((memaddr)id); connector->mail_write((memaddr)size); } void CellScheduler::mainMem_wait() { unsigned long id; memaddr addr; while (mainMemNum > 0) { id = (unsigned long)connector->mail_read(); addr = connector->mail_read(); mainMemList[id] = (memaddr)addr; mainMemNum--; } } /* end */