|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
クラス テンプレート toppers::itron::specified_object< Policy >特定のカーネルオブジェクトを管理するクラス [詳細]
toppers::itron::specified_object< Policy >に対する継承グラフ ![]() ![]()
説明template<class Policy>
特定のカーネルオブジェクトを管理するクラス
|
|
主な静的APIの解析処理
specified_object.hpp の 223 行で定義されています。 参照先 toppers::itron::static_api::begin(). 00224 { 00225 static_api::const_iterator iter( api.begin() ); 00226 for ( int i = 0; Policy::apis_[i] != 0; i++ ) 00227 { 00228 if ( *iter == Policy::apis_[i] ) 00229 { 00230 self_t t; 00231 if ( !t.analyze_parameters( api, Policy::params_[i] ) ) 00232 { 00233 break; 00234 } 00235 swap( t ); 00236 return true; 00237 } 00238 } 00239 return false; 00240 }
関数の呼び出しグラフ: ![]() |
|
副次的な静的APIの解析
具体的には、タスクであれば CRE_TSK の解析は analyze_primary 関数で行い、 DEF_TSK の解析は analyze_secondary で行うことになる。 この関数で解析する静的APIの情報は、 Policy::apis_ および Policy::params_ の2番目の要素(配列添え字は 1 〜)以降を使用する。 specified_object.hpp の 255 行で定義されています。 参照先 toppers::itron::static_api::begin(). 00256 { 00257 static_api::const_iterator iter( api.begin() ); 00258 for ( int i = 0; Policy::apis2_[i] != 0; i++ ) 00259 { 00260 if ( *iter == Policy::apis2_[i] ) 00261 { 00262 if ( id() < 0 && name().empty() ) 00263 { 00264 break; 00265 } 00266 self_t t( *this ); 00267 if ( !t.analyze_parameters( api, Policy::params2_[i] ) ) 00268 { 00269 break; 00270 } 00271 if ( id() != t.id() || name() != t.name() ) 00272 { 00273 break; 00274 } 00275 swap( t ); 00276 return true; 00277 } 00278 } 00279 return false; 00280 }
関数の呼び出しグラフ: ![]() |
|
kernel_object の構築
specified_object.hpp の 152 行で定義されています。 参照先 toppers::itron::static_api::begin(). 参照元 toppers::itron::fdmp::cfg_contents::do_parse(). 00153 { 00154 static_api::const_iterator iter( api.begin() ); 00155 boost::shared_ptr<kernel_object> ptr; 00156 00157 for ( int i = 0; Policy::apis_[i] != 0; i++ ) 00158 { 00159 if ( *iter == Policy::apis_[0] ) 00160 { 00161 ptr.reset( new self_t ); 00162 if ( ptr->analyze( api ) ) 00163 { 00164 container.push_back( ptr ); 00165 } 00166 } 00167 } 00168 if ( !ptr ) 00169 { 00170 // 副次的なAPIの処理 00171 for ( int i = 0; Policy::apis2_[i] != 0; i++ ) 00172 { 00173 if ( *iter == Policy::apis2_[i] ) 00174 { 00175 typedef std::vector<boost::shared_ptr<kernel_object> >::const_iterator const_iterator; 00176 for ( const_iterator i( container.begin() ), t( container.end() ); i != t; ++i ) 00177 { 00178 if ( std::strcmp( ( *i )->get_object_type(), Policy::name_ ) == 0 ) 00179 { 00180 if ( ( *i )->analyze( api ) ) 00181 { 00182 return *i; 00183 } 00184 } 00185 } 00186 } 00187 } 00188 } 00189 return ptr; 00190 }
関数の呼び出しグラフ: ![]() |
|
実際の静的APIの解析は以下の手順で行います。
上記の手順のうち、最初に成功した( true が返ってきた)ものを解析結果と して採用します。 解析に成功した場合 Policy::verify によって整合性を判定します。 toppers::itron::kernel_objectを実装しています。 specified_object.hpp の 293 行で定義されています。 00294 { 00295 bool result = Policy::analyze( api, *this ); 00296 result = result || analyze_primary( api ); 00297 result = result || analyze_secondary( api ); 00298 result = result && Policy::verify( api, *this ); 00299 return result; 00300 }
|
|
カーベルオブジェクトの種類の参照
toppers::itron::kernel_objectを実装しています。 specified_object.hpp の 301 行で定義されています。
|
|
toppers::itron::kernel_objectを実装しています。 specified_object.hpp の 305 行で定義されています。
|
|
kernel_cfg.c の生成
specified_object.hpp の 197 行で定義されています。
|
|
kernel_id.h の生成
specified_object.hpp の 207 行で定義されています。 00208 { 00209 if ( Policy::use_id_ ) 00210 { 00211 Policy::generate_kernel_id( id_cfg, ostr ); 00212 } 00213 }
|