私が取り組んでいるいくつかの同意マルチタスキング コードのコンストラクタとデストラクタに問題があります。私が受け取っているエラーは
task.o: In function `$_4Task':
/home/luke/project/task.cc(.text+0x57): undefined reference to `Task virtual table'
task.o: In function `_4TaskUi':
/home/luke/project/task.cc(.text+0x5): undefined reference to `Task virtual table'
オブジェクト ファイルを見ると、_4Task と _4TaskUi の逆参照名が、それぞれ私の Task デストラクタとコンストラクタであるように見えます。コンパイラが仮想テーブルを参照していないと言っている理由を理解できないようです。ubuntu 12.10でGCCを使用しています。
以下は私のヘッダーファイルです
#ifndef TASK
#define TASK
#include "stddef.h"
#include "nocopy.h"
class Task: private NoCopy
{
void** stack; //Base of stack
void** sp; //saved sp when not running
static Task* current; //Point to running task
static void start(); //calls task::main
static void dispatch(Task* t); //switch context to task t
virtual void main();
friend class TaskList;
protected:
void fork(); //start task
public:
Task(size_t stackSize);
virtual ~Task();
static Task* const getCurrent()
{
return current;
}
static void yield();
};
#endif
以下は私のcppファイルです
#include "task.h"
Task initialTask(0); //initial code before
// set up stack in crt0.s
Task* Task::current = &initialTask; //note first running task
TaskList readyList;
Task::Task(size_t stackSize)
:stack(new (void*)[stackSize/sizeof(void*)]),
sp(&stack[stackSize/sizeof(void*)])
{ //set up task stack
if(stackSize)
{
*--sp = 0; //for debugger
*--sp = 0; //terminate frame chain
*--sp = &start; //point to first code
}
}
Task::~Task()
{
delete[](stack);
}
//Contec Switching
register void** spreg asm("s"); //can refer to hc12 SP as spreg
void Task::dispatch(Task* task)
{
current -> sp = spreg;
current = task;
spreg = current -> sp;
}//Dispatch is called by one task but is returned by another
void Task::fork() //call in ctor of all task
{
TaskList::Node node(&readyList); //Make caller go from "running"->"ready"
dispatch(this); //Start new task
}
void Task::start()
{
current -> main();
TaskList forever; //Wait Task
forever.enqueue(); //Wait forever
}
編集メインはタスクに依存しているため、タスクに依存しているため、メインのデフォルト定義は次のようになります。
virtual void main(){};