📄 kernel_object.cpp
字号:
/*
* 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僾儘僕僃僋僩偼丆杮僜僼僩僂僃傾偵娭偟偰丆偦偺揔梡壜擻惈傕
* 娷傔偰丆偄偐側傞曐徹傕峴傢側偄丏傑偨丆杮僜僼僩僂僃傾偺棙梡偵傛傝捈
* 愙揑傑偨偼娫愙揑偵惗偠偨偄偐側傞懝奞偵娭偟偰傕丆偦偺愑擟傪晧傢側偄丏
*
*/
/*
* toppers/itron/kernel_object.cpp
*/
#include "toppers/itron/kernel_object.hpp"
#include "toppers/itron/static_api.hpp"
#include "toppers/parser.hpp"
#include <sstream>
#include <set>
#include <iterator>
#include <algorithm>
#include <limits>
namespace toppers
{
namespace itron
{
/*!
* \brief 僼傿乕儖僪偺嶲徠
* \param key 僼傿乕儖僪柤
* \return 僼傿乕儖僪偵愝掕偝傟偨抣傪曉偡
*/
const std::string& kernel_object::get( const std::string& key ) const
{
arg_type::const_iterator iter( args_.find( key ) );
if ( iter == args_.end() )
{
static const std::string dummy;
return dummy;
}
return iter->second;
}
/*!
* \brief 僆僽僕僃僋僩偺岎姺
* \param other kernel_object 宆傑偨偼偦偺攈惗宆偺僆僽僕僃僋僩
*/
void kernel_object::swap( kernel_object& other ) throw()
{
std::swap( id_, other.id_ );
name_.swap( other.name_ );
args_.swap( other.args_ );
}
/*!
* \brief 僷儔儊乕僞儕僗僩偺夝愅
* \param api 惷揑API忣曬
* \param parameters 僷儔儊乕僞儕僗僩忣曬
* \return 夝愅偵惉岟偡傟偽 true 傪曉偡
*
* 僷儔儊乕僞儕僗僩忣曬偵婎偯偄偰惷揑API偺堷悢傪夝愅偟傑偡丅
* 僷儔儊乕僞儕僗僩忣曬 params 偼師偺傛偆偵丄僷儔儊乕僞暥帤楍傪巜掕偟傑偡丅
*
* \code
* // CRE_TSK偺応崌
* const char cre_tsk_params[] = "$tskid { #tskatr exinf task itskpri stksz stk }";
* \endcode
*
* 僷儔儊乕僞偺庬椶偵墳偠偰丄暥帤楍偺愭摢偵婰崋傪晅偗傞偙偲偑偱偒傑偡丅
* 乮兪ITRON 4.0巇條 2.1.11 惷揑API偺巇條偲僷儔儊乕僞傪嶲徠乯
*
* - '$': 帺摦妱晅偗懳墳惍悢僷儔儊乕僞
* - '%': 帺摦妱晅偗旕懳墳惍悢僷儔儊乕僞
* - '#': 僾儕僾儘僙僢僒掕悢幃僷儔儊乕僞
* - 側偟: 堦斒掕悢幃僷儔儊乕僞
*
* 懠偵丄':'偱巒傑傞僷儔儊乕僞傪婰弎偟偨応崌丄惷揑API偺僷儔儊乕僞偐傜撉傒庢傞偺偱偼
* 側偔丄':'偵懕偔暥帤楍傪僷儔儊乕僞偺抣偲偟偰愝掕偟傑偡丅\n
* 椺偊偽丄":RID"偲婰弎偟偨応崌丄":RID"傪僉乕偲偟偨僼傿乕儖僪偵"RID"傪愝掕偟傑偡丅
*
* 僷働僢僩偺応崌偼丄椉抂偺拞妵屖乮"{"偍傛傃"}"乯傕攝楍偵娷傔偰偔偩偝偄丅
*/
bool kernel_object::analyze_parameters( const static_api& api, const std::string& parameters )
{
std::istringstream istr( parameters );
std::vector<std::string> params;
typedef std::istream_iterator<std::string> istream_iterator;
std::copy( istream_iterator( istr ), istream_iterator(), std::back_inserter( params ) );
static_api::const_iterator iter( api.begin() );
static_api::const_iterator last( api.end() );
++iter; // API柤傪僗僉僢僾
typedef std::vector<std::string>::const_iterator params_iterator;
for ( params_iterator i( params.begin() ), t( params.end() ); i != t; ++i, ++iter )
{
std::string param( *i );
char ch = param[0];
switch ( ch )
{
case '{':
case '}':
if ( iter == last || *iter != param )
{
static_api::line_type line( api.line() );
std::string token( ")" );
if ( iter != last )
{
token = *iter;
}
error( line.file_.native_file_string(), line.line_, _( "missing `%1%\' before `%2%\'" ) % ch % token );
return false;
}
break;
case '$': // 帺摦妱晅偗懳墳惍悢僷儔儊乕僞
case '%': // 帺摦妱晅偗旕懳墳惍悢僷儔儊乕僞
if ( iter == last || !analyze_id( *iter ) )
{
static_api::line_type line( api.line() );
std::string token( ")" );
if ( iter != last )
{
token = *iter;
}
error( line.file_.native_file_string(), line.line_, _( "illegal argument `%1%'" ) % token );
return false;
}
set( param, *iter );
break;
case ':':
set( param, param.substr( 1 ) );
break;
case '#': // 僾儕僾儘僙僢僒掕悢幃僷儔儊乕僞
default: // 堦斒掕悢幃僷儔儊乕僞
if ( iter == last )
{
static_api::line_type line( api.line() );
error( line.file_.native_file_string(), line.line_, _( "illegal argument `%1%'" ) % ")" );
return false;
}
set( param, *iter );
break;
}
}
return true;
}
/*!
* \brief 僼傿乕儖僪偺愝掕
* \param key 柤慜
* \param value 抣
*
* key 偱巜掕偟偨柤慜偺僼傿乕儖僪傪 value 偵愝掕偟傑偡丅
*/
void kernel_object::set( const std::string& key, const std::string& value )
{
args_[key] = value;
}
/*!
* \brief 弶婜壔僽儘僢僋忣曬偺庢摼
* \return 弶婜壔僽儘僢僋忣曬傊偺僗儅乕僩億僀儞僞傪曉偡
*/
const kernel_object::inib_ptr kernel_object::do_get_inib() const
{
std::auto_ptr<kernel_cfg::initial_block> ptr( new kernel_cfg::initial_block );
ptr->id( id_ );
if ( !name_.empty() )
{
ptr->set( "name", name_ );
// 妱傝崬傒傗CPU椺奜摍丄ID斣崋帺摦妱晅傪峴傢側偄僆僽僕僃僋僩偺偨傔偺壖斣崋丅
// 惷揑API偱懄抣偑巊梡偝傟偰偄側偄応崌偵丄ID斣崋偑晧偵側傝丄弶婜壔僐乕僪偑
// 惓偟偔惗惉偝傟側偄晄嬶崌偺懳嶔
if ( id_ < 0 )
{
ptr->id( std::numeric_limits<long>::max() );
}
}
else
{
std::ostringstream osstr;
osstr << id_;
ptr->set( "name", osstr.str() );
}
for ( arg_type::const_iterator iter( args_.begin() ), last( args_.end() ); iter != last; ++iter )
{
ptr->set( iter->first, iter->second );
}
return inib_ptr( ptr.release() );
}
/*!
* \brief ID忣曬偺庢摼
* \return ID忣曬傊偺僗儅乕僩億僀儞僞傪曉偡
*/
const kernel_object::idb_ptr kernel_object::do_get_idb() const
{
std::auto_ptr<kernel_id::id_number> ptr( new kernel_id::id_number );
ptr->set( name_, id_ );
return idb_ptr( ptr.release() );
}
/*!
* \brief ID斣崋偺夝愅
* \param arg 夝愅偡傞堷悢
* \return 夝愅偵惉岟偡傟偽 true 傪曉偡
*
* 帺摦妱晅偗懳墳惍悢抣僷儔儊乕僞傪夝愅偟丄悢抣偺応崌偼 id_ 偵愝掕偟丄
* 幆暿巕偺応崌偼 name_ 偵愝掕偟傑偡丅
*/
bool kernel_object::analyze_id( const std::string& arg )
{
using namespace boost::spirit;
id_ = -1L;
name_.clear();
if ( parse( arg.begin(), arg.end(), c_int_parser<long>()[ assign_a( id_ ) ] ).full )
{
if ( !do_check_id_range( id_ ) )
{
return false;
}
}
else
{
if ( !parse( arg.begin(), arg.end(), c99_ident_p[ assign_a( name_ ) ] ).full )
{
return false;
}
}
return true;
}
/*!
* \brief ID斣崋偺妱晅曗彆娭悢
* \param first 僇乕僱儖僆僽僕僃僋僩楍偺愭摢埵抲
* \param last 僇乕僱儖僆僽僕僃僋僩楍偺廔抂埵抲+1
* \return ID斣崋偺妱晅偗偵惉岟偡傟偽 true 傪曉偡
*/
bool kernel_object::assign_id_helper( std::vector<kernel_object*>::const_iterator first, std::vector<kernel_object*>::const_iterator last )
{
typedef std::vector<kernel_object*> vector_t;
vector_t::size_type size = last - first;
vector_t t( size, static_cast<kernel_object*>( 0 ) );
std::set<std::string> set;
// 1僷僗栚偱寛傔懪偪偺ID斣崋傪挷傋傞
for ( vector_t::const_iterator iter( first ); iter != last; ++iter )
{
kernel_object* pobj = *iter;
long id = pobj->id();
if ( id > 0 )
{
if ( t[id-1] != 0 )
{
error( _( "id `%1%\' of %2% is duplicated" ) % id % pobj->get_object_type() );
return false;
}
t[id-1] = pobj;
}
else
{
std::string id( pobj->name() );
if ( !set.insert( id ).second )
{
error( _( "id `%1%\' of %2% is duplicated" ) % id % pobj->get_object_type() );
}
}
}
// 2僷僗栚偱嬻偒ID斣崋傪弴斣偵妱傝晅偗傞
vector_t::size_type pos = 0;
for ( vector_t::const_iterator iter( first ); iter != last; ++iter )
{
kernel_object* pobj = *iter;
long id = pobj->id();
if ( id < 0 )
{
while ( t[pos] != 0 )
{
++pos;
}
t[pos] = pobj;
pobj->id_ = pos+1;
}
}
return true;
}
/*!
* \fn bool kernel_object::do_analyze( const static_api& api )
* \brief analyze 娭悢偺幚懱
* \param api 夝愅偡傞惷揑API忣曬
* \return 夝愅偵惉岟偡傟偽 true 傪曉偡
*/
/*!
* \fn const char* kernel_object::do_get_object_type() const
* \brief 僇乕儀儖僆僽僕僃僋僩偺庬椶偺嶲徠
* \return 庬椶傪昞偡暥帤楍傪曉偡
*/
/*!
* \fn bool kernel_object::do_has_id() const
* \return ID斣崋傪巊梡偡傞応崌偵偼 true 傪曉偡
* \note "do has"偲偄偆偺偼塸岅揑偵偼娫堘偄偱偡偑丄専嶕偺曋媂偺偨傔偵
* 姼偊偰偙偺傛偆偵柦柤偟偰偄傑偡丅
*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -