task_except.c

説明を見る。
00001 /*
00002  *  TOPPERS/ASP Kernel
00003  *      Toyohashi Open Platform for Embedded Real-Time Systems/
00004  *      Advanced Standard Profile Kernel
00005  * 
00006  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
00007  *                              Toyohashi Univ. of Technology, JAPAN
00008  *  Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
00009  *              Graduate School of Information Science, Nagoya Univ., JAPAN
00010  * 
00011  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
00012  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
00013  *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
00014  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
00015  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
00016  *      スコード中に含まれていること.
00017  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
00018  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
00019  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
00020  *      の無保証規定を掲載すること.
00021  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
00022  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
00023  *      と.
00024  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
00025  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
00026  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
00027  *        報告すること.
00028  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
00029  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
00030  *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
00031  *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
00032  *      免責すること.
00033  * 
00034  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
00035  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
00036  *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
00037  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
00038  *  の責任を負わない.
00039  * 
00040  *  @(#) $Id: task_except.c 748 2008-03-07 17:18:06Z hiro $
00041  */
00042 
00043 /*
00044  *      タスク例外処理機能
00045  */
00046 
00047 #include "kernel_impl.h"
00048 #include "check.h"
00049 #include "task.h"
00050 
00051 /*
00052  *  トレースログマクロのデフォルト定義
00053  */
00054 #ifndef LOG_RAS_TEX_ENTER
00055 #define LOG_RAS_TEX_ENTER(tskid, rasptn)
00056 #endif /* LOG_RAS_TEX_ENTER */
00057 
00058 #ifndef LOG_RAS_TEX_LEAVE
00059 #define LOG_RAS_TEX_LEAVE(ercd)
00060 #endif /* LOG_RAS_TEX_LEAVE */
00061 
00062 #ifndef LOG_IRAS_TEX_ENTER
00063 #define LOG_IRAS_TEX_ENTER(tskid, rasptn)
00064 #endif /* LOG_IRAS_TEX_ENTER */
00065 
00066 #ifndef LOG_IRAS_TEX_LEAVE
00067 #define LOG_IRAS_TEX_LEAVE(ercd)
00068 #endif /* LOG_IRAS_TEX_LEAVE */
00069 
00070 #ifndef LOG_DIS_TEX_ENTER
00071 #define LOG_DIS_TEX_ENTER()
00072 #endif /* LOG_DIS_TEX_ENTER */
00073 
00074 #ifndef LOG_DIS_TEX_LEAVE
00075 #define LOG_DIS_TEX_LEAVE(ercd)
00076 #endif /* LOG_DIS_TEX_LEAVE */
00077 
00078 #ifndef LOG_ENA_TEX_ENTER
00079 #define LOG_ENA_TEX_ENTER()
00080 #endif /* LOG_ENA_TEX_ENTER */
00081 
00082 #ifndef LOG_ENA_TEX_LEAVE
00083 #define LOG_ENA_TEX_LEAVE(ercd)
00084 #endif /* LOG_ENA_TEX_LEAVE */
00085 
00086 #ifndef LOG_SNS_TEX_ENTER
00087 #define LOG_SNS_TEX_ENTER()
00088 #endif /* LOG_SNS_TEX_ENTER */
00089 
00090 #ifndef LOG_SNS_TEX_LEAVE
00091 #define LOG_SNS_TEX_LEAVE(state)
00092 #endif /* LOG_SNS_TEX_LEAVE */
00093 
00094 #ifndef LOG_REF_TEX_ENTER
00095 #define LOG_REF_TEX_ENTER(tskid, pk_rtex)
00096 #endif /* LOG_REF_TEX_ENTER */
00097 
00098 #ifndef LOG_REF_TEX_LEAVE
00099 #define LOG_REF_TEX_LEAVE(ercd, pk_rtex)
00100 #endif /* LOG_REF_TEX_LEAVE */
00101 
00102 /*
00103  *  タスク例外処理の要求
00104  */
00105 #ifdef TOPPERS_ras_tex
00106 
00107 ER
00108 ras_tex(ID tskid, TEXPTN rasptn)
00109 {
00110     TCB     *p_tcb;
00111     ER      ercd;
00112 
00113     LOG_RAS_TEX_ENTER(tskid, rasptn);
00114     CHECK_TSKCTX_UNL();
00115     CHECK_TSKID_SELF(tskid);
00116     CHECK_PAR(rasptn != 0U);
00117     p_tcb = get_tcb_self(tskid);
00118 
00119     t_lock_cpu();
00120     if (TSTAT_DORMANT(p_tcb->tstat) || p_tcb->p_tinib->texrtn == NULL) {
00121         ercd = E_OBJ;
00122     }
00123     else {
00124         p_tcb->texptn |= rasptn;
00125         if (p_tcb == p_runtsk && p_runtsk->enatex) {
00126             call_texrtn();
00127         }
00128         ercd = E_OK;
00129     }
00130     t_unlock_cpu();
00131 
00132   error_exit:
00133     LOG_RAS_TEX_LEAVE(ercd);
00134     return(ercd);
00135 }
00136 
00137 #endif /* TOPPERS_ras_tex */
00138 
00139 /*
00140  *  タスク例外処理の要求(非タスクコンテキスト用)
00141  */
00142 #ifdef TOPPERS_iras_tex
00143 
00144 ER
00145 iras_tex(ID tskid, TEXPTN rasptn)
00146 {
00147     TCB     *p_tcb;
00148     ER      ercd;
00149 
00150     LOG_IRAS_TEX_ENTER(tskid, rasptn);
00151     CHECK_INTCTX_UNL();
00152     CHECK_TSKID(tskid);
00153     CHECK_PAR(rasptn != 0U);
00154     p_tcb = get_tcb(tskid);
00155 
00156     i_lock_cpu();
00157     if (TSTAT_DORMANT(p_tcb->tstat) || p_tcb->p_tinib->texrtn == NULL) {
00158         ercd = E_OBJ;
00159     }
00160     else {
00161         p_tcb->texptn |= rasptn;
00162         if (p_tcb == p_runtsk && p_runtsk->enatex) {
00163             reqflg = true;
00164         }
00165         ercd = E_OK;
00166     }
00167     i_unlock_cpu();
00168 
00169   error_exit:
00170     LOG_IRAS_TEX_LEAVE(ercd);
00171     return(ercd);
00172 }
00173 
00174 #endif /* TOPPERS_iras_tex */
00175 
00176 /*
00177  *  タスク例外処理の禁止
00178  */
00179 #ifdef TOPPERS_dis_tex
00180 
00181 ER
00182 dis_tex(void)
00183 {
00184     ER      ercd;
00185 
00186     LOG_DIS_TEX_ENTER();
00187     CHECK_TSKCTX_UNL();
00188 
00189     t_lock_cpu();
00190     if (p_runtsk->p_tinib->texrtn == NULL) {
00191         ercd = E_OBJ;
00192     }
00193     else {
00194         p_runtsk->enatex = false;
00195         ercd = E_OK;
00196     }
00197     t_unlock_cpu();
00198 
00199   error_exit:
00200     LOG_DIS_TEX_LEAVE(ercd);
00201     return(ercd);
00202 }
00203 
00204 #endif /* TOPPERS_dis_tex */
00205 
00206 /*
00207  *  タスク例外処理の許可
00208  */
00209 #ifdef TOPPERS_ena_tex
00210 
00211 ER
00212 ena_tex(void)
00213 {
00214     ER      ercd;
00215 
00216     LOG_ENA_TEX_ENTER();
00217     CHECK_TSKCTX_UNL();
00218 
00219     t_lock_cpu();
00220     if (p_runtsk->p_tinib->texrtn == NULL) {
00221         ercd = E_OBJ;
00222     }
00223     else {
00224         p_runtsk->enatex = true;
00225         if (p_runtsk->texptn != 0U) {
00226             call_texrtn();
00227         }
00228         ercd = E_OK;
00229     }
00230     t_unlock_cpu();
00231 
00232   error_exit:
00233     LOG_ENA_TEX_LEAVE(ercd);
00234     return(ercd);
00235 }
00236 
00237 #endif /* TOPPERS_ena_tex */
00238 
00239 /*
00240  *  タスク例外処理禁止状態の参照
00241  */
00242 #ifdef TOPPERS_sns_tex
00243 
00244 bool_t
00245 sns_tex(void)
00246 {
00247     bool_t  state;
00248 
00249     LOG_SNS_TEX_ENTER();
00250     state = (p_runtsk != NULL && p_runtsk->enatex) ? false : true;
00251     LOG_SNS_TEX_LEAVE(state);
00252     return(state);
00253 }
00254 
00255 #endif /* TOPPERS_sns_tex */
00256 
00257 /*
00258  *  タスク例外処理の状態参照
00259  */
00260 #ifdef TOPPERS_ref_tex
00261 
00262 ER
00263 ref_tex(ID tskid, T_RTEX *pk_rtex)
00264 {
00265     TCB     *p_tcb;
00266     ER      ercd;
00267 
00268     LOG_REF_TEX_ENTER(tskid, pk_rtex);
00269     CHECK_TSKCTX_UNL();
00270     CHECK_TSKID_SELF(tskid);
00271     p_tcb = get_tcb_self(tskid);
00272 
00273     t_lock_cpu();
00274     if (TSTAT_DORMANT(p_tcb->tstat) || p_tcb->p_tinib->texrtn == NULL) {
00275         ercd = E_OBJ;
00276     }
00277     else {
00278         pk_rtex->texstat = (p_tcb->enatex) ? TTEX_ENA : TTEX_DIS;
00279         pk_rtex->pndptn = p_tcb->texptn;
00280         ercd = E_OK;
00281     }
00282     t_unlock_cpu();
00283 
00284   error_exit:
00285     LOG_REF_TEX_LEAVE(ercd, pk_rtex);
00286     return(ercd);
00287 }
00288 
00289 #endif /* TOPPERS_ref_tex */

Copyright © 2008 by Kijineko Inc.

ホームページ制作