メインページ | モジュール | 名前空間一覧 | クラス階層 | 構成 | ファイル一覧 | 名前空間メンバ | 構成メンバ | ファイルメンバ | 関連ページ

toppers/overrunhandler.hpp

解説を見る。
00001 /*
00002  *  TOPPERS/C++ API Template Library
00003  *      Toyohashi Open Platform for Embedded Real-Time Systems/
00004  *      C++ API Template Library
00005  *
00006  *  Copyright (C) 2004 by TAKAGI Nobuhisa
00007  *
00008  *  上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
00009  *  によって公表されている GNU General Public License の Version 2 に記
00010  *  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
00011  *  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
00012  *  利用と呼ぶ)することを無償で許諾する.
00013  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
00014  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
00015  *      スコード中に含まれていること.
00016  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
00017  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
00018  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
00019  *      の無保証規定を掲載すること.
00020  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
00021  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
00022  *      と.
00023  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
00024  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
00025  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
00026  *        報告すること.
00027  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
00028  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
00029  *
00030  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
00031  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
00032  *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
00033  *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
00034  *
00035  *  @(#) $Id: overrunhandler.hpp,v 1.1.1.1 2004/04/14 09:30:30 takagi-n Exp $
00036  */
00037 
00051 #ifndef TOPPERS_OVERRUNHANDLER_HPP_
00052 #define TOPPERS_OVERRUNHANDLER_HPP_
00053 
00054 #include <toppers/context.hpp>
00055 
00056 namespace toppers
00057 {
00058 
00059     template <class Body> void overrunhandler_entry(ID, VP_INT);
00060 
00061     template <class Diagnostics, class Stub> class overrunhandler_body;
00062     template <ID Id, class Diagnostics, class Stub> class task;
00063 
00075     template <class Diagnostics = TOPPERS_DEFAULT_DIAGNOSTICS,
00076               class Stub = TOPPERS_DEFAULT_STUB >
00077     class overrunhandler : Diagnostics
00078     {
00079     public:
00081         typedef t_dovr definition;
00083         typedef t_rovr reference;
00085         typedef overrunhandler_body<Diagnostics, Stub> body;
00086 
00089 
00090         //  互換性のための多重定義
00091         static ER define(definition* pk_dobj)
00092         {
00093             ER ercd = Stub::stub_def_ovr(pk_dobj);
00094             return static_handle_error(ercd);
00095         }
00097         static ER define(const definition* pk_dobj)
00098         {
00099             ER ercd = Stub::stub_def_ovr(pk_dobj);
00100             return static_handle_error(ercd);
00101         }
00103         static ER define(ATR ovratr, void (*ovrhdr)(ID, VP_INT))
00104         {
00105             definition packet;
00106             packet.ovratr = ovratr;
00107             packet.ovrhdr = FP(ovrhdr);
00108             return define(&packet);
00109         }
00111         template <class Body>
00112         static ER define(ATR ovratr = 0)
00113         {
00114             return define(ovratr & ~TA_ASM | TA_HLNG, &overrunhandler_entry<Body>);
00115         }
00117         static ER undefine()
00118         {
00119             return define(static_cast<definition*>(0));
00120         }
00121 
00123 
00126 
00128         template <ID Id, class Diagnostics2, class Stub2>
00129         static ER refer(const task<Id, Diagnostics2, Stub2>& host, reference* pk_robj)
00130         {
00131             ER ercd = Stub::stub_ref_ovr(get_unsafe_id(host), pk_robj);
00132             return handle_error(ercd);
00133         }
00135         static ER refer(reference* pk_robj)
00136         {
00137             ER ercd = Stub::stub_ref_ovr(TSK_SELF, pk_robj);
00138             return handle_error(ercd);
00139         }
00140 
00142 
00145 
00147         template <ID Id, class Diagnostics2, class Stub2>
00148         static ER start(const task<Id, Diagnostics2, Stub2>& host, OVRTIM ovrtim)
00149         {
00150             ER ercd = Stub::stub_sta_ovr(get_unsafe_id(host), ovrtim);
00151             return handle_error(ercd);
00152         }
00154         template <ID Id, class Diagnostics2, class Stub2>
00155         static ER stop(const task<Id, Diagnostics2, Stub2>& host)
00156         {
00157             ER ercd = Stub::stub_stp_ovr(get_unsafe_id(host));
00158             return handle_error(ercd);
00159         }
00160 
00162         static ER start(OVRTIM ovrtim)
00163         {
00164             ER ercd = Stub::stub_sta_ovr(TSK_SELF, ovrtim);
00165             return handle_error(ercd);
00166         }
00168         static ER stop()
00169         {
00170             ER ercd = Stub::stub_stp_ovr(TSK_SELF);
00171             return handle_error(ercd);
00172         }
00173 
00175 
00176     private:
00177         ID get_host_id() const
00178         {
00179             return get_unsafe_id(host_);
00180         }
00181     };
00182 
00194     template <class Diagnostics = TOPPERS_DEFAULT_DIAGNOSTICS,
00195               class Stub = TOPPERS_DEFAULT_STUB >
00196     class overrunhandler_body : public non_task_context_body<Diagnostics, Stub>
00197     {
00198         task<0, Diagnostics, Stub> task_;
00199         VP_INT exinf_;
00200 
00201     protected:
00203         ~overrunhandler_body() {}
00204 
00205     public:
00207         explicit overrunhandler_body(ID tskid, VP_INT exinf)
00208             : task_(tskid), exinf_(exinf)
00209         {
00210         }
00211 
00213         const task<0, Diagnostics, Stub>& get_task() const { return task_; }
00214 
00216         VP_INT get_extended_info() const { return exinf_; }
00217     };
00218 
00229     template <class Body>
00230     inline void overrunhandler_entry(ID tskid, VP_INT exinf)
00231     {
00232         Body body(tskid, exinf);
00233         body.run();
00234     }
00235 
00236 }
00237 
00238 #endif  // ! TOPPERS_OVERRUNHANDLER_HPP_