📄 file_generator.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/jsp/file_generator.hpp
* \brief 僇乕僱儖僆僽僕僃僋僩偺惗惉偵娭偡傞愰尵掕媊
*
* 偙偺僼傽僀儖偱掕媊偝傟傞僋儔僗
* \code
* class file_generator<Policy>;
* \endcode
*/
#ifndef TOPPERS_ITRON_JSP_FILE_GENERATOR_HPP_
#define TOPPERS_ITRON_JSP_FILE_GENERATOR_HPP_
#include "toppers/kernel_cfg.hpp"
#include "toppers/misc.hpp"
#include <boost/format.hpp>
namespace toppers
{
namespace itron
{
namespace jsp
{
/*!
* \class file_generator file_generator.hpp "toppers/itron/jsp/file_generator.hpp"
* \brief JSP僇乕僱儖岦偗僇乕僱儖僆僽僕僃僋僩惗惉僋儔僗
*
* 偙偺僋儔僗偼 toppers::itron::specified_object<Policy> 偵巜掕偡傞 Policy 偵昁梫偵側傞
* generate_kernel_cfg 偍傛傃 generate_kernel_id 娭悢傪掕媊偟傑偡丅
* 偦傟傜偺娭悢傪丄姼偊偰 file_generator<Policy> 僋儔僗偵愗傝弌偟偰偄傞偺偼丄
* 娭悢偺掕媊偑 Policy 偺懠偺儊儞僶乕偵埶懚偡傞偨傔偱偡丅
*/
template <class Policy>
class file_generator
{
public:
/*!
* \brief kernel_cfg.c 偺惗惉
* \param cfg kernel_cfg.c 惗惉忣曬
* \param ostr 弌椡僗僩儕乕儉
*/
static void generate_kernel_cfg( const kernel_cfg& cfg, std::ostream& ostr )
{
using boost::format;
ostr << format( "\t/* Object initializer [%1%] */\n\n" ) % static_cast<const char*>( Policy::name_ );
kernel_cfg::inib_array inibs( *cfg.get_inib_array( Policy::name_ ) );
std::string SYM( toupper( Policy::symbol_ ) );
std::string TNUM;
boost::shared_ptr<cmdline::option_array> options( cfg_factory::global()->options() );
if ( Policy::use_id_ )
{
// ID斣崋偺悢偲嵟戝抣
TNUM = "TNUM_" + SYM + "ID";
ostr << format( "#define %1% %2%\n\n" ) % TNUM % inibs.size();
// ostr << format( "const ID _kernel_tmax_%1%id = (TMIN_%2%ID + %3% - 1);\n\n" ) % static_cast<const char*>( Policy::symbol_ ) % SYM % TNUM;
/* @chg 2004-04-03 TMIN_xxID 偺攑巭偵傛傞曄峏 */
ostr << format( "const ID _kernel_tmax_%1%id = (TMIN_ID + %2% - 1);\n\n" ) % static_cast<const char*>( Policy::symbol_ ) % TNUM;
}
else
{
// 僆僽僕僃僋僩斣崋偺悢偲嵟戝抣
TNUM = "TNUM_" + SYM + "NO";
ostr << format( "#define %1% %2%\n\n" ) % TNUM % inibs.size();
ostr << format( "const UINT _kernel_tnum_%1%no = %2%;\n\n" ) % static_cast<const char*>( Policy::symbol_ ) % TNUM;
}
std::string prefix( Policy::prefix_ == 0 ? Policy::symbol_ : Policy::prefix_ );
std::string PREFIX( toupper( prefix ) );
if ( inibs.empty() )
{
if ( !options->find( "-z" ) )
{
// 僆僽僕僃僋僩偑堦偮傕側偄応崌偺僟儈乕儔儀儖偺弌椡
ostr << format( "__EMPTY_LABEL(const %1%INIB, _kernel_%2%inib_table);\n" ) % PREFIX % prefix;
if ( Policy::use_id_ )
{
ostr << format( "__EMPTY_LABEL(%1%CB, _kernel_%2%cb_table);\n" ) % PREFIX % prefix;
}
Policy::generate_extra_empty_labels( ostr );
ostr << '\n';
}
}
else
{
std::sort( inibs.begin(), inibs.end(), &kernel_cfg::initial_block::less_than );
// 椞堟掕媊偺惗惉
std::transform( inibs.begin(), inibs.end(), std::ostream_iterator<std::string>( ostr ), typename Policy::generator( Policy::region_format_ ) );
ostr << '\n';
// 弶婜壔僽儘僢僋掕媊偺惗惉
ostr << format( "const %1%INIB _kernel_%2%inib_table[%3%] = {\n" ) % PREFIX % prefix % TNUM;
output_list( inibs.begin(), inibs.end(), ostr, typename Policy::generator( Policy::init_format_ ), ",\n" );
ostr << "\n};\n\n";
// 偦偺懠偺曄悢掕媊乮RAM椞堟乯偺弌椡
Policy::generate_variables( cfg, ostr );
// 惂屼僽儘僢僋掕媊偺弌椡
if ( Policy::use_id_ )
{
ostr << format( "%1%CB _kernel_%2%cb_table[%3%];\n\n" ) % PREFIX % prefix % TNUM;
}
// 偦偺懠偺掕悢掕媊乮ROM椞堟乯偺弌椡
Policy::generate_constants( cfg, ostr );
// ID斣崋傪奿擺偟偨峀堟曄悢偺弌椡
if ( Policy::use_id_ )
{
if ( options->find( "-var" ) )
{
ostr << "\t/* Identifier storage variables */\n";
std::transform( inibs.begin(), inibs.end(), std::ostream_iterator<std::string>( ostr ), typename Policy::generator( "const int @name\\_id = @id;\n" ) );
ostr << '\n';
}
}
// 傾僒乕僔儑儞僐乕僪偺弌椡
if ( options->find( "-c" ) )
{
Policy::generate_assertions( 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 )
{
const kernel_id::id_array* pids = id_cfg.get_id_array( Policy::name_ );
if ( pids != 0 )
{
typedef kernel_id::id_array::const_iterator idb_iterator;
for ( idb_iterator iter( pids->begin() ), last( pids->end() ); iter != last; ++iter )
{
std::string name( ( *iter )->name() );
if ( !name.empty() )
{
ostr << "#define " << name << '\t' << ( *iter )->value() << '\n';
}
}
}
}
};
}
}
}
#endif // ! TOPPERS_ITRON_JSP_FILE_GENERATOR_HPP_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -