コード例 #1
0
ファイル: srvcall.c プロジェクト: lifangbo/embos
/*!
* 割込み出入り口前のパラメータ類の退避(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;
}
コード例 #2
0
ファイル: task_manage.c プロジェクト: issey1022/os
/*!
 * システムコールの処理(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;
  }
}