|
|
cyclic.cpp00001 /* 00002 * TOPPERS/FDMP Kernel 00003 * Toyohashi Open Platform for Embedded Real-Time Systems/ 00004 * Function Distributed Multiprocessor Kernel 00005 * 00006 * Copyright (C) 2005 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 */ 00036 00037 /* 00038 * toppers/itron/jsp/cyclic.cpp 00039 */ 00040 #include "toppers/itron/jsp/cyclic.hpp" 00041 #include "toppers/itron/jsp/kernel_chk.hpp" 00042 #include "toppers/reporter.hpp" 00043 #include "toppers/s_record.hpp" 00044 #include "toppers/nm_symbol.hpp" 00045 00046 namespace toppers 00047 { 00048 namespace itron 00049 { 00050 namespace jsp 00051 { 00052 00058 void cyclic_policy::generate_assertions( const kernel_cfg& cfg, std::ostream& ostr ) 00059 { 00060 const kernel_cfg::inib_array* pinibs = cfg.get_inib_array( name_ ); 00061 static const char pattern[] = 00062 "#if ((@#cycatr) & (TA_HLNG|TA_ASM)) != TA_HLNG\n" 00063 "#error \"`cycatr\' of cyclic handler `@name\' is not TA_HLNG\"\n" 00064 "#endif\n" 00065 "__CFG_ASSERT(((@#cycatr) & (TA_HLNG|TA_ASM)) == TA_HLNG);\n" 00066 "#if ((@#cycatr) & 0x04u) != 0x00u\n" 00067 "#error \"`cycatr\' of cyclic handler `@name\' is specified TA_PHS\"\n" 00068 "#endif\n" 00069 "__CFG_ASSERT(((@#cycatr) & 0x04u) == 0x00u);\n" 00070 "\n"; 00071 std::transform( pinibs->begin(), pinibs->end(), std::ostream_iterator<std::string>( ostr ), generator( pattern ) ); 00072 } 00073 00080 bool cyclic_policy::check( const itron::kernel_chk& chk, const s_record& srec, const nm_symbol& syms ) 00081 { 00082 nm_symbol::entry entry = syms.find( "_kernel_cycinib_table" ); 00083 if ( entry.type < 0 ) 00084 { 00085 return false; 00086 } 00087 long tnum_cycid = chk.get( kernel_chk::countof_CYCID ); 00088 long sizeof_FP = chk.get( kernel_chk::sizeof_FP ); 00089 long sizeof_CYCINIB = chk.get( kernel_chk::sizeof_CYCINIB ); 00090 long offsetof_CYCINIB_cychdr = chk.get( kernel_chk::offsetof_CYCINIB_cychdr ); 00091 00092 for ( int i = 0; i < tnum_cycid; i++ ) 00093 { 00094 unsigned long value = 0; 00095 for ( int j = 0; j < sizeof_FP; j++ ) 00096 { 00097 int t = srec[entry.address + sizeof_CYCINIB*i + offsetof_CYCINIB_cychdr + j]; 00098 if ( t < 0 ) 00099 { 00100 return false; 00101 } 00102 value = ( value << 8 ) | ( t & 0xff ); 00103 } 00104 if ( value == 0 ) 00105 { 00106 error( _( "start address of cyclic %1% handler is null" ) % ( i + 1 ) ); 00107 } 00108 } 00109 return true; 00110 } 00111 00112 const char cyclic_policy::name_[] = "cyclic"; 00113 const char cyclic_policy::symbol_[] = "cyc"; 00114 const char* const cyclic_policy::apis_[] = { "CRE_CYC", 0 }; 00115 const char* const cyclic_policy::params_[] = { "$cycid { #cycatr exinf cychdr cyctim cycphs }", 0 }; 00116 const char cyclic_policy::init_format_[] = "\t{ @#cycatr, @exinf, (FP)(@cychdr), @cyctim, @cycphs }"; 00117 00118 } 00119 } 00120 } Copyright © 2006 by TAKAGI Nobuhisa. このページは Wed Apr 12 16:31:56 2006 に Doxygen によって生成されました。 |