/*! * 割込み出入り口前のパラメータ類の退避(mv_acre_tsk():タスクコントロールブロックの生成(ID自動割付)) * *par : ユーザ側で定義されたシステムコールバッファポインタ * (返却値)E_PAR : システムコールの引数不正 * (返却値)E_NOID : 動的メモリが取得できない(割付可能なIDがない) * (返却値)E_NOMEM : ユーザスタックが確保できない * (返却値)tskid : 正常終了 */ ER_ID mv_acre_tsk(SYSCALL_PARAMCB *par) { ER_ID ercd; INTR_DISABLE; /* 割込み無効にする */ current->syscall_info.flag = MV_SRVCALL; /* サービスコールフラグセット */ /* ラッパー(ISR)呼び出し */ ercd = kernelrte_acre_tsk(par->un.acre_tsk.type, par->un.acre_tsk.func, par->un.acre_tsk.name, par->un.acre_tsk.priority, par->un.acre_tsk.stacksize, par->un.acre_tsk.rate, par->un.acre_tsk.rel_exetim, par->un.acre_tsk.deadtim, par->un.acre_tsk.floatim, par->un.acre_tsk.argc, par->un.acre_tsk.argv); INTR_ENABLE; /* 割込み有効にする */ return ercd; }
/*! * システムコールの処理(acre_tsk():タスクの生成(ID自動割付)と起動) * -タスクの状態としては未登録状態から休止状態に移行後,実行可能状態へ移行 * func : タスクのメイン関数 * *name : タスクの名前 * priority : タスクの優先度 * stacksize : ユーザスタック(タスクのスタック)のサイズ * rate : 周期 * rel_exetim : 実行時間(仮想) * deadtim : デッドライン時刻 * floatim : 余裕時間 * argc : タスクのメイン関数の第一引数 * *argv[] : タスクのメイン関数の第二引数 * (返却値)rcd(E_PAR) : システムコールの引数不正 * (返却値)rcd(E_NOID) : 動的メモリが取得できない(割付可能なIDがない) * (返却値)rcd(E_NOMEM) : メモリが確保できない * (返却値)rcd : 自動割付したID * (返却値)ercd(E_ID) : エラー終了(タスクIDが不正) * (返却値)ercd(E_NOEXS) : エラー終了(対象タスクが未登録) * (返却値)ercd(E_OBJ) : エラー終了(タスクが休止状態ではない) */ ER_ID run_tsk_isr(SYSCALL_PARAMCB *p) { ER_ID acre_rcd; /* 自動割付IDまたはエラーコードを記録 */ ER sta_rcd; SYSCALL_PARAMCB acre_ptr, sta_ptr; acre_ptr.un.acre_tsk.func = p->un.run_tsk.func; acre_ptr.un.acre_tsk.name = p->un.run_tsk.name; acre_ptr.un.acre_tsk.priority = p->un.run_tsk.priority; acre_ptr.un.acre_tsk.stacksize = p->un.run_tsk.stacksize; acre_ptr.un.acre_tsk.rate = p->un.run_tsk.rate; acre_ptr.un.acre_tsk.rel_exetim = p->un.run_tsk.rel_exetim; acre_ptr.un.acre_tsk.deadtim = p->un.run_tsk.deadtim; acre_ptr.un.acre_tsk.floatim = p->un.run_tsk.floatim; acre_ptr.un.acre_tsk.argc = p->un.run_tsk.argc; acre_ptr.un.acre_tsk.argv = p->un.run_tsk.argv; /* タスク生成ルーチン呼び出し */ kernelrte_acre_tsk(&acre_ptr); sta_ptr.un.sta_tsk.tskid = acre_rcd = acre_ptr.un.acre_tsk.ret; /* 生成できなかった場合はkernelrte_acre_tsk()のエラーコードを返却 */ if (acre_rcd < E_OK) { return acre_rcd; } /* タスク起動ルーチン呼び出し(kernelrte_sta_tsk()のputcurrent()はすでにレディーへ存在するので,無視される) */ kernelrte_sta_tsk(&sta_ptr); sta_rcd = sta_ptr.un.sta_tsk.ret; /* 起動できた場合はIDを返却 */ if (sta_rcd == E_OK) { return acre_rcd; } /* 起動できなかった場合はkernelrte_sta_tsk()のエラーコードを返却 */ else { return (ER_ID)sta_rcd; } }