📄 specified_object.hpp
字号:
/*
* TOPPERS/FDMP Kernel
* Toyohashi Open Platform for Embedded Real-Time Systems/
* Function Distributed Multiprocessor Kernel
*
* Copyright (C) 2005 by Takagi Nobuhisa
*
* 忋婰挊嶌尃幰偼丆埲壓偺 (1)乣(4) 偺忦審偐丆Free Software Foundation
* 偵傛偭偰岞昞偝傟偰偄傞 GNU General Public License 偺 Version 2 偵婰
* 弎偝傟偰偄傞忦審傪枮偨偡応崌偵尷傝丆杮僜僼僩僂僃傾乮杮僜僼僩僂僃傾
* 傪夵曄偟偨傕偺傪娷傓丏埲壓摨偠乯傪巊梡丒暋惢丒夵曄丒嵞攝晍乮埲壓丆
* 棙梡偲屇傇乯偡傞偙偲傪柍彏偱嫋戻偡傞丏
* (1) 杮僜僼僩僂僃傾傪僜乕僗僐乕僪偺宍偱棙梡偡傞応崌偵偼丆忋婰偺挊嶌
* 尃昞帵丆偙偺棙梡忦審偍傛傃壓婰偺柍曐徹婯掕偑丆偦偺傑傑偺宍偱僜乕
* 僗僐乕僪拞偵娷傑傟偰偄傞偙偲丏
* (2) 杮僜僼僩僂僃傾傪丆儔僀僽儔儕宍幃側偳丆懠偺僜僼僩僂僃傾奐敪偵巊
* 梡偱偒傞宍偱嵞攝晍偡傞応崌偵偼丆嵞攝晍偵敽偆僪僉儏儊儞僩乮棙梡
* 幰儅僯儏傾儖側偳乯偵丆忋婰偺挊嶌尃昞帵丆偙偺棙梡忦審偍傛傃壓婰
* 偺柍曐徹婯掕傪宖嵹偡傞偙偲丏
* (3) 杮僜僼僩僂僃傾傪丆婡婍偵慻傒崬傓側偳丆懠偺僜僼僩僂僃傾奐敪偵巊
* 梡偱偒側偄宍偱嵞攝晍偡傞応崌偵偼丆師偺偄偢傟偐偺忦審傪枮偨偡偙
* 偲丏
* (a) 嵞攝晍偵敽偆僪僉儏儊儞僩乮棙梡幰儅僯儏傾儖側偳乯偵丆忋婰偺挊
* 嶌尃昞帵丆偙偺棙梡忦審偍傛傃壓婰偺柍曐徹婯掕傪宖嵹偡傞偙偲丏
* (b) 嵞攝晍偺宍懺傪丆暿偵掕傔傞曽朄偵傛偭偰丆TOPPERS僾儘僕僃僋僩偵
* 曬崘偡傞偙偲丏
* (4) 杮僜僼僩僂僃傾偺棙梡偵傛傝捈愙揑傑偨偼娫愙揑偵惗偠傞偄偐側傞懝
* 奞偐傜傕丆忋婰挊嶌尃幰偍傛傃TOPPERS僾儘僕僃僋僩傪柶愑偡傞偙偲丏
*
* 杮僜僼僩僂僃傾偼丆柍曐徹偱採嫙偝傟偰偄傞傕偺偱偁傞丏忋婰挊嶌尃幰偍
* 傛傃TOPPERS僾儘僕僃僋僩偼丆杮僜僼僩僂僃傾偵娭偟偰丆偦偺揔梡壜擻惈傕
* 娷傔偰丆偄偐側傞曐徹傕峴傢側偄丏傑偨丆杮僜僼僩僂僃傾偺棙梡偵傛傝捈
* 愙揑傑偨偼娫愙揑偵惗偠偨偄偐側傞懝奞偵娭偟偰傕丆偦偺愑擟傪晧傢側偄丏
*
*/
/*!
* \file toppers/itron/specified_object.hpp
* \brief 摿掕偺僇乕僱儖僆僽僕僃僋僩忣曬偵娭偡傞愰尵掕媊
*
* 偙偺僼傽僀儖偱掕媊偝傟傞僋儔僗
* \code
* class specified_object<Policy>;
* class kernel_object_policy_base;
* class kernel_object_policy_base::generator;
* \endcode
*/
#ifndef TOPPERS_ITRON_SPECIFIED_OBJECT_HPP_
#define TOPPERS_ITRON_SPECIFIED_OBJECT_HPP_
#include "toppers/itron/kernel_object.hpp"
#include "toppers/itron/static_api.hpp"
#include "toppers/itron/cfg_factory.hpp"
#include "toppers/misc.hpp"
#include <cstring>
#include <boost/format.hpp>
namespace toppers
{
class s_record;
class nm_symbol;
namespace itron
{
class kernel_chk;
/*!
* \class specified_object kernel_object.hpp "toppers/itron/kernel_object.hpp"
* \brief 摿掕偺僇乕僱儖僆僽僕僃僋僩傪娗棟偡傞僋儔僗
*
* kernel_object 僋儔僗傪屄乆偺僆僽僕僃僋僩偵懳墳偝偣傞偨傔偺張棟傪偙偺僋儔僗偱
* 掕媊偟傑偡丅\n
* 椺偊偽丄僙儅僼僅偵娭偡傞掕媊偼 semaphore_policy 僋儔僗傪 specified_object 偺
* 僥儞僾儗乕僩堷悢 Policy 偵巜掕偡傞偙偲偱峴偄傑偡丅
*
* 僥儞僾儗乕僩堷悢 Policy 偵偼師偺儊儞僶傪帩偮宆傪巜掕偟偰偔偩偝偄丅
*
* \code
* // 僐儞僗僩儔僋僞偱搉偝傟偨弶婜壔暥帤楍偵偟偨偑偭偰丄pinib偑巜偡梫慺傪
* // 宆type偵曄姺偡傞僼傽儞僋僞
* class generator
* {
* public:
* explicit generator( const std::string& format );
* type operator()( boost::shared_ptr<kernel_cfg::initial_block> pinib );
* };
*
* // kernel_cfg.c傊偺弌椡張棟傪僆乕僶乕儔僀僪偡傞丅
* static bool generate_kernel_cfg( const kernel_cfg& cfg, std::ostream& ostr );
*
* // kernel_id.h傊偺弌椡張棟傪僆乕僶乕儔僀僪偡傞丅
* static bool generate_kernel_id( const kernel_id& id_cfg, std::ostream& ostr );
*
* // kernel_cfg.c傊偺彂偒崬傒壜擻梫慺偺弌椡張棟傪婰弎偡傞丅
* static void generate_regions( const kernel_cfg& cfg, std::ostream& ostr );
*
* // kernel_cfg.c傊偺弶婜壔僽儘僢僋偺弌椡張棟傪婰弎偡傞丅
* static void generate_inits( const kernel_cfg& cfg, std::ostream& ostr );
*
* // kernel_cfg.c傊偺椞堟梫慺偺弌椡張棟傪婰弎偡傞丅
* static void generate_variables( const kernel_cfg& cfg, std::ostream& ostr );
*
* // kernel_cfg.c傊偺彂偒崬傒晄壜梫慺偺弌椡張棟傪婰弎偡傞丅
* static void generate_constants( const kernel_cfg& cfg, std::ostream& ostr );
*
* // kernel_cfg.c傊偺傾僒乕僔儑儞僐乕僪偺弌椡張棟傪婰弎偡傞丅
* static void generate_assertions( const kernel_cfg& cfg, std::ostream& ostr );
*
* // 僆僽僕僃僋僩偑側偄応崌偵kenrel_cfg.c傊偺__EMPTY_LABEL弌椡張棟傪婰弎偡傞丅
* static void generate_extra_empty_labels( std::ostream& ostr );
*
* // 惷揑API偺夝愅張棟傪僆乕僶乕儔僀僪偡傞丅
* // 僆乕僶乕儔僀僪偟偨応崌偼true傪曉偡
* bool analyze( kernel_object& obj, const static_api& api );
*
* // 惷揑API偺夝愅寢壥傪敾掕偡傞丅
* bool verify( const static_api& api, kernel_object& obj );
*
* // ID斣崋偺斖埻僠僃僢僋傪峴偆丅
* bool check_id_range( long id );
*
* static const bool use_id_; // ID傪巊偆応崌偼true丄斣崋傪巊偆応崌偼false
* static const char name_[]; // 僆僽僕僃僋僩柤
* static const char symbol_[]; // 嶰暥帤柤
* static const char* const apis_[]; // 庡側惷揑API柤偺攝楍
* static const char* const params_[]; // 庡側惷揑API柤偺僷儔儊乕僞暲傃偺攝楍
* static const char* const apis_[]; // 暃師揑側惷揑API柤偺攝楍
* static const char* const params_[]; // 暃師揑側惷揑API柤偺僷儔儊乕僞暲傃偺攝楍
* static const char prefix_[]; // 弶婜壔僽儘僢僋摍偺宆柤偵巊偆僾儗僼傿僢僋僗
* static const char region_format_[]; // 椞堟掕媊偺彂幃壔暥帤楍
* static const char init_format_[]; // 弶婜壔僽儘僢僋偺弶婜壔暥帤楍
* \endcode
*
* \sa kernel_object_policy_base
*/
template <class Policy>
class specified_object : public kernel_object
{
public:
typedef specified_object<Policy> self_t;
/*!
* \brief kernel_object 偺峔抸
* \param api 惷揑API忣曬
* \param container 峔抸偟偨 kernel_object 奿擺梡僐儞僥僫
* \return 峔抸偝傟偨 kernel_object 傊偺僗儅乕僩億僀儞僞
* \note 奿擺梡僐儞僥僫傪堷悢偲偟偰搉偡偺偼 DEF_TEX 偺傛偆偵婛懚偺 kernel_object
* 傪峏怴偡傞惷揑API偺懳墳偡傞偨傔
*/
static const boost::shared_ptr<kernel_object> build( const static_api& api, std::vector<boost::shared_ptr<kernel_object> >& container )
{
static_api::const_iterator iter( api.begin() );
boost::shared_ptr<kernel_object> ptr;
for ( int i = 0; Policy::apis_[i] != 0; i++ )
{
if ( *iter == Policy::apis_[0] )
{
ptr.reset( new self_t );
if ( ptr->analyze( api ) )
{
container.push_back( ptr );
}
}
}
if ( !ptr )
{
// 暃師揑側API偺張棟
for ( int i = 0; Policy::apis2_[i] != 0; i++ )
{
if ( *iter == Policy::apis2_[i] )
{
typedef std::vector<boost::shared_ptr<kernel_object> >::const_iterator const_iterator;
for ( const_iterator i( container.begin() ), t( container.end() ); i != t; ++i )
{
if ( std::strcmp( ( *i )->get_object_type(), Policy::name_ ) == 0 )
{
if ( ( *i )->analyze( api ) )
{
return *i;
}
}
}
}
}
}
return ptr;
}
/*!
* \brief kernel_cfg.c 偺惗惉
* \param cfg kernel_cfg.c 惗惉忣曬
* \param ostr 弌椡僗僩儕乕儉
*/
static void generate_kernel_cfg( const kernel_cfg& cfg, std::ostream& ostr )
{
Policy::generate_kernel_cfg( cfg, ostr );
}
/*!
* \brief kernel_id.h 偺惗惉
* \param id_cfg kernel_id.h 惗惉忣曬
* \param ostr 弌椡僗僩儕乕儉
*/
static void generate_kernel_id( const kernel_id& id_cfg, std::ostream& ostr )
{
if ( Policy::use_id_ )
{
Policy::generate_kernel_id( id_cfg, ostr );
}
}
protected:
/*!
* \brief 庡側惷揑API偺夝愅張棟
* \param api 夝愅偡傞惷揑API忣曬
* \return 夝愅偵惉岟偟偨応崌偼 true 傪曉偡
*
* 偙偺娭悢偱夝愅偡傞惷揑API偺忣曬偼丄 Policy::apis_ 偍傛傃 Policy::params_
* 偺嵟弶偺梫慺傪巊梡偡傞丅
*/
bool analyze_primary( const static_api& api )
{
static_api::const_iterator iter( api.begin() );
for ( int i = 0; Policy::apis_[i] != 0; i++ )
{
if ( *iter == Policy::apis_[i] )
{
self_t t;
if ( !t.analyze_parameters( api, Policy::params_[i] ) )
{
break;
}
swap( t );
return true;
}
}
return false;
}
/*!
* \brief 暃師揑側惷揑API偺夝愅
* \param api 夝愅偡傞惷揑API忣曬
* \return 夝愅偵惉岟偟偨応崌偼 true 傪曉偡
*
* 偙偺娭悢偼丄椺偊偽僞僗僋偺傛偆偵丄偦偺僇乕僱儖僆僽僕僃僋僩偵娭楢偡傞
* 惷揑API偑暋悢懚嵼偡傞応崌偵巊梡偡傞丅\n
* 嬶懱揑偵偼丄僞僗僋偱偁傟偽 CRE_TSK 偺夝愅偼 analyze_primary 娭悢偱峴偄丄
* DEF_TSK 偺夝愅偼 analyze_secondary 偱峴偆偙偲偵側傞丅
*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -