📄 jsp_check.cpp
字号:
#include "jsp_defs.h"#include "component.h"#include "filecontainer.h"#include <fstream>class ConfigurationChecker : public Component{protected: unsigned int error_count; std::string banner; void set_banner(const std::string &); void set_banner(Directory &, const Message &, const char *, int); void notify(const Message &, bool = true); bool check_taskblock(Directory &, filecontainer *); bool check_semaphoreblock(Directory &, filecontainer *); bool check_eventflagblock(Directory &, filecontainer *); bool check_dataqueueblock(Directory &, filecontainer *); bool check_mailboxblock(Directory &, filecontainer *); bool check_fixed_memorypoolblock(Directory &, filecontainer *); bool check_cyclic_handlerblock(Directory &, filecontainer *); bool check_interrupt_handlerblock(Directory &, filecontainer *); bool check_exception_handlerblock(Directory &, filecontainer *); virtual void parseOption(Directory &); virtual void body(Directory &);};//------------------------------------------------------using namespace std;const char * BootBanner = "--- TOPPERS/JSP Configuration Checker (ver 2.0) ---";ConfigurationChecker instance_of_ConfigurationChecker;//------------------------------------------------------#define LoadVal(x,y,z) x = 0; container->load_variable(&x, sizeof(x), y, z)#define Load(x,y) container->load_variable(&(x), sizeof(x), y)inline void ConfigurationChecker::set_banner(const string & src){ if(VerboseMessage::getVerbose()) cout << src << endl; else banner = src;}void ConfigurationChecker::set_banner(Directory & container, const Message & object, const char * type, int id){ string objectname; Directory * node; char buffer[32]; banner = string(" ") + (const char *)object + " : "; objectname = filecontainer::get_instance()->get_objectname(id, type); sprintf(buffer, "id = %d", id); if(objectname.empty()) banner += buffer; else banner += objectname + " (" + buffer + ") "; node = container.findChild(OBJECTTREE, type, objectname.c_str(), "position", NULL); if(node != 0) banner += string(" at ") + node->toString(); if(VerboseMessage::getVerbose()) { cout << banner << endl; banner.erase(); }}inline void ConfigurationChecker::notify(const Message & msg, bool error){ if(!banner.empty()) { cout << banner << endl; banner.erase(); } cout << " "; if(error) { cout << Message("[ Error ] ","[エラ〖] "); error_count ++; }else cout << Message("[Warning] ","[ 焚桂 ] "); cout << msg << endl;}bool ConfigurationChecker::check_taskblock(Directory & parameter, filecontainer * container){ unsigned int id; unsigned int maxpri; unsigned int minpri; unsigned int work; unsigned int num; struct variable_information tinib_table; unsigned int old_error_count = error_count; Message object("Task","タスク"); if(!Load(num, "_kernel_tmax_tskid")) Exception("Internal error: Unknown symbol (Probably, Symbol table was stripped)","柒婶エラ〖: 稍赖なシンボル叹 (悸乖妨及がシンボルテ〖ブルを崔んでない材墙拉があります)"); if(num <= 1) { error_count ++; cout << Message(" [Task] : No tasks created\n"," [タスク] : タスクオブジェクトがありません\n"); return true; } tinib_table = container->get_variable_information("_kernel_tinib_table"); maxpri = container->get_variable_information("TMAX_TPRI").value; minpri = container->get_variable_information("TMIN_TPRI").value; VerboseMessage("%s object : %d items\n","%sオブジェクト : %d 改\n").format((const char *)object, num); for(id = 1; id <= num; id++) { set_banner(parameter, object, TASK, id); //掳拉チェック LoadVal(work, tinib_table.address, "task_initialization_block::tskatr"); if((work & ~0x3) != 0) notify(Message("Illegal task attribute (It should be ((TA_HLNG||TA_ASM)|TA_ACT))","稍赖なタスク掳拉 ((TA_HLNG||TA_ASM)|TA_ACT)笆嘲")); //庭黎刨チェック LoadVal(work, tinib_table.address, "task_initialization_block::ipriority"); if(work < minpri) notify(Message("Initial priority is less than minimum priority (%d).","介袋庭黎刨が呵你庭黎刨(%d)を亩えている").format(minpri)); if(work > maxpri) notify(Message("Initial priority is greater than maximum priority (%d).","介袋庭黎刨が呵络庭黎刨(%d)を亩えている").format(maxpri)); tinib_table.address += tinib_table.size; } return old_error_count == error_count;}bool ConfigurationChecker::check_semaphoreblock(Directory & parameter, filecontainer * container){ unsigned int id; unsigned int num; unsigned int work; unsigned int work2; unsigned int old_error_count = error_count; struct variable_information seminib; Message object("Semaphore","セマフォ"); Load(num, "_kernel_tmax_semid"); if(num <= 1) return true; seminib = container->get_variable_information("_kernel_seminib_table"); VerboseMessage("%s object : %d items\n","%sオブジェクト : %d 改\n").format((const char *)object, num); for(id = 1; id <= num; id++) { set_banner(parameter, object, SEMAPHORE, id); //attribute validation check LoadVal(work, seminib.address, "semaphore_initialization_block::sematr"); if((work & ~0x1) != 0) notify(Message("Illegal attribute (It should be (TA_TFIFO||TA_TPRI)).","(TA_TFIFO||TA_TPRI)笆嘲の掳拉が回年されている")); //maxcnt < isemcnt LoadVal(work, seminib.address, "semaphore_initialization_block::maxsem"); LoadVal(work2,seminib.address, "semaphore_initialization_block::isemcnt"); if(work < work2) notify(Message("Initial count[%d] is greater than the maximum count[%d] of this semaphore","介袋猛[%d]が呵络猛[%d]を亩えている").format(work2,work)); seminib.address += seminib.size; } return old_error_count == error_count;}bool ConfigurationChecker::check_eventflagblock(Directory & parameter, filecontainer * container){ unsigned int id; unsigned int num; unsigned int work; unsigned int old_error_count = error_count; struct variable_information inib; Message object("Event flag","イベントフラグ"); Load(num, "_kernel_tmax_flgid"); if(num <= 1) return true; inib = container->get_variable_information("_kernel_flginib_table"); VerboseMessage("%s object : %d items\n","%sオブジェクト : %d 改\n").format((const char *)object, num); for(id = 1; id <= num; id++) { set_banner(parameter, object, EVENTFLAG, id); //attribute validation check LoadVal(work, inib.address, "eventflag_initialization_block::flgatr"); if((work & ~0x7) != 0) notify(Message("Illegal attribute value [0x%x]","おかしな掳拉猛 [0x%x]").format(work & ~0x7)); if((work & 0x2) != 0) notify(Message("Attribute TA_WMUL is not supported in current version.","TA_WMULはサポ〖ト嘲").format(work & ~0x7)); inib.address += inib.size; } return old_error_count == error_count;}bool ConfigurationChecker::check_dataqueueblock(Directory & parameter, filecontainer * container){ unsigned int id; unsigned int num; unsigned int work; unsigned int old_error_count = error_count; struct variable_information inib; Message object("Data queue","デ〖タキュ〖"); Load(num, "_kernel_tmax_dtqid"); if(num <= 1) return true; inib = container->get_variable_information("_kernel_dtqinib_table"); VerboseMessage("%s object : %d items\n","%sオブジェクト : %d 改\n").format((const char *)object, num); for(id = 1; id <= num; id++) { set_banner(parameter, object, DATAQUEUE, id); //attribute validation check LoadVal(work, inib.address, "dataqueue_initialization_block::dtqatr"); if((work & ~0x1) != 0) notify(Message("Illegal attribute value [0x%x]","おかしな掳拉猛 [0x%x]").format(work & ~0x1)); inib.address += inib.size; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -