⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jsp_check.cpp

📁 嵌入式系统开发 TOPPERS and JSP Kernel Release 1.3 TOPPERS = Toyohashi Open Platform for Embedded Real-Tim
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -