From: takemasa Date: Sat, 15 Sep 2012 06:25:30 +0000 (+0900) Subject: 最初のコミット。sample1が通る。 X-Git-Url: http://git.osdn.net/view?p=uzume%2Fuzume_bfin.git;a=commitdiff_plain;h=6faedc690ce0d485ffa17c06caee46293106de96 最初のコミット。sample1が通る。 --- 6faedc690ce0d485ffa17c06caee46293106de96 diff --git a/uzume_prototype/.cproject b/uzume_prototype/.cproject new file mode 100644 index 0000000..8b96b49 --- /dev/null +++ b/uzume_prototype/.cproject @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/uzume_prototype/.gitignore b/uzume_prototype/.gitignore new file mode 100644 index 0000000..f853124 --- /dev/null +++ b/uzume_prototype/.gitignore @@ -0,0 +1,7 @@ +/libkernel.a +/jsp.srec +/jsp.chk +/jsp +/jsp.syms +/kernel_chk.s +/html diff --git a/uzume_prototype/.project b/uzume_prototype/.project new file mode 100644 index 0000000..6508aea --- /dev/null +++ b/uzume_prototype/.project @@ -0,0 +1,78 @@ + + + uzume_prototype + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.autoBuildTarget + all + + + org.eclipse.cdt.make.core.buildArguments + + + + org.eclipse.cdt.make.core.buildCommand + make + + + org.eclipse.cdt.make.core.cleanBuildTarget + clean + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + false + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.fullBuildTarget + all + + + org.eclipse.cdt.make.core.stopOnError + true + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/uzume_prototype/.settings/de.loskutov.anyedit.AnyEditTools.prefs b/uzume_prototype/.settings/de.loskutov.anyedit.AnyEditTools.prefs new file mode 100644 index 0000000..4e815b2 --- /dev/null +++ b/uzume_prototype/.settings/de.loskutov.anyedit.AnyEditTools.prefs @@ -0,0 +1,15 @@ +activeContentFilterList=*.makefile,makefile,*.Makefile,Makefile,Makefile.*,*.mk,MANIFEST.MF +addNewLine=true +convertActionOnSaave=AnyEdit.CnvrtTabToSpaces +eclipse.preferences.version=1 +inActiveContentFilterList= +javaTabWidthForJava=true +org.eclipse.jdt.ui.editor.tab.width=4 +projectPropsEnabled=false +removeTrailingSpaces=true +replaceAllSpaces=false +replaceAllTabs=true +saveAndAddLine=true +saveAndConvert=true +saveAndTrim=true +useModulo4Tabs=true diff --git a/uzume_prototype/.settings/org.eclipse.cdt.codan.core.prefs b/uzume_prototype/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..9c7ec59 --- /dev/null +++ b/uzume_prototype/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,66 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.codan.checkers.errnoreturn=Warning +org.eclipse.cdt.codan.checkers.errnoreturn.params={implicit\=>false} +org.eclipse.cdt.codan.checkers.errreturnvalue=Error +org.eclipse.cdt.codan.checkers.errreturnvalue.params={} +org.eclipse.cdt.codan.checkers.noreturn=Error +org.eclipse.cdt.codan.checkers.noreturn.params={implicit\=>false} +org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation=-Error +org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem=-Error +org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem=Warning +org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem.params={} +org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem=Error +org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem.params={} +org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem=Warning +org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem.params={no_break_comment\=>"no break",last_case_param\=>true,empty_case_param\=>false} +org.eclipse.cdt.codan.internal.checkers.CatchByReference=Warning +org.eclipse.cdt.codan.internal.checkers.CatchByReference.params={unknown\=>false,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem=-Error +org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem=-Error +org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem=-Error +org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.InvalidArguments=-Error +org.eclipse.cdt.codan.internal.checkers.InvalidArguments.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem=-Error +org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem=-Error +org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem=-Error +org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem=-Error +org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker=-Info +org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker.params={pattern\=>"^[a-z]",macro\=>true,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem=Warning +org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem.params={} +org.eclipse.cdt.codan.internal.checkers.OverloadProblem=-Error +org.eclipse.cdt.codan.internal.checkers.OverloadProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem=-Error +org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem=-Error +org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem.params={} +org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem.params={} +org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem=Warning +org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem.params={macro\=>true,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem=Warning +org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem.params={paramNot\=>false} +org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem=Warning +org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem.params={else\=>false,afterelse\=>false} +org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem=-Error +org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem.params={macro\=>true} +org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem.params={macro\=>true} +org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem.params={macro\=>true,exceptions\=>("@(\#)","$Id")} +org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem=-Error +org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +useParentScope=false diff --git a/uzume_prototype/.settings/org.eclipse.cdt.core.prefs b/uzume_prototype/.settings/org.eclipse.cdt.core.prefs new file mode 100644 index 0000000..9d65247 --- /dev/null +++ b/uzume_prototype/.settings/org.eclipse.cdt.core.prefs @@ -0,0 +1,162 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.cdt.core.formatter.alignment_for_assignment=16 +org.eclipse.cdt.core.formatter.alignment_for_base_clause_in_type_declaration=80 +org.eclipse.cdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.cdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.cdt.core.formatter.alignment_for_conditional_expression=34 +org.eclipse.cdt.core.formatter.alignment_for_conditional_expression_chain=18 +org.eclipse.cdt.core.formatter.alignment_for_constructor_initializer_list=0 +org.eclipse.cdt.core.formatter.alignment_for_declarator_list=16 +org.eclipse.cdt.core.formatter.alignment_for_enumerator_list=48 +org.eclipse.cdt.core.formatter.alignment_for_expression_list=0 +org.eclipse.cdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.cdt.core.formatter.alignment_for_member_access=0 +org.eclipse.cdt.core.formatter.alignment_for_overloaded_left_shift_chain=16 +org.eclipse.cdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.cdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.cdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.cdt.core.formatter.brace_position_for_block=end_of_line +org.eclipse.cdt.core.formatter.brace_position_for_block_in_case=end_of_line +org.eclipse.cdt.core.formatter.brace_position_for_method_declaration=end_of_line +org.eclipse.cdt.core.formatter.brace_position_for_namespace_declaration=end_of_line +org.eclipse.cdt.core.formatter.brace_position_for_switch=end_of_line +org.eclipse.cdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.cdt.core.formatter.comment.min_distance_between_code_and_line_comment=1 +org.eclipse.cdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.cdt.core.formatter.compact_else_if=true +org.eclipse.cdt.core.formatter.continuation_indentation=2 +org.eclipse.cdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.cdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.cdt.core.formatter.indent_access_specifier_compare_to_type_header=false +org.eclipse.cdt.core.formatter.indent_access_specifier_extra_spaces=0 +org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_access_specifier=true +org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_namespace_header=false +org.eclipse.cdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.cdt.core.formatter.indent_declaration_compare_to_template_header=false +org.eclipse.cdt.core.formatter.indent_empty_lines=false +org.eclipse.cdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.cdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.cdt.core.formatter.indentation.size=4 +org.eclipse.cdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_after_template_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_before_colon_in_constructor_initializer_list=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_before_identifier_in_function_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.cdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.cdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.cdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_arguments=insert +org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_parameters=insert +org.eclipse.cdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.cdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.cdt.core.formatter.insert_space_after_colon_in_base_clause=insert +org.eclipse.cdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.cdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.cdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_base_types=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_declarator_list=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_expression_list=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_arguments=insert +org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_parameters=insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_arguments=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_parameters=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_bracket=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_exception_specification=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.cdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.cdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.cdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_arguments=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_parameters=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_bracket=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_exception_specification=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_colon_in_base_clause=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.cdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_base_types=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_declarator_list=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_expression_list=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_arguments=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_parameters=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_arguments=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_parameters=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_namespace_declaration=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_bracket=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_exception_specification=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.cdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.cdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.cdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.cdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.cdt.core.formatter.insert_space_between_empty_brackets=do not insert +org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_exception_specification=do not insert +org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.cdt.core.formatter.join_wrapped_lines=true +org.eclipse.cdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.cdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.cdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.cdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.cdt.core.formatter.lineSplit=80 +org.eclipse.cdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.cdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.cdt.core.formatter.tabulation.char=space +org.eclipse.cdt.core.formatter.tabulation.size=4 +org.eclipse.cdt.core.formatter.use_tabs_only_for_leading_indentations=false diff --git a/uzume_prototype/.settings/org.eclipse.cdt.ui.prefs b/uzume_prototype/.settings/org.eclipse.cdt.ui.prefs new file mode 100644 index 0000000..8095e8b --- /dev/null +++ b/uzume_prototype/.settings/org.eclipse.cdt.ui.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +formatter_profile=_K&R [built-in] no tab +formatter_settings_version=1 diff --git a/uzume_prototype/.settings/org.eclipse.core.resources.prefs b/uzume_prototype/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..3945f59 --- /dev/null +++ b/uzume_prototype/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +#Sat May 30 17:38:15 JST 2009 +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/uzume_prototype/.settings/org.eclipse.core.runtime.prefs b/uzume_prototype/.settings/org.eclipse.core.runtime.prefs new file mode 100644 index 0000000..9d8c041 --- /dev/null +++ b/uzume_prototype/.settings/org.eclipse.core.runtime.prefs @@ -0,0 +1,3 @@ +#Sat May 30 17:38:15 JST 2009 +eclipse.preferences.version=1 +line.separator=\n diff --git a/uzume_prototype/Doxyfile b/uzume_prototype/Doxyfile new file mode 100644 index 0000000..fbcc21e --- /dev/null +++ b/uzume_prototype/Doxyfile @@ -0,0 +1,1813 @@ +# Doxyfile 1.7.6.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or sequence of words) that should +# identify the project. Note that if you do not use Doxywizard you need +# to put quotes around the project name if it contains spaces. + +PROJECT_NAME = "I2C Test" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "Test the I2C control task for Blackfin" + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding +# "class=itcl::class" will allow you to use the command class in the +# itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and +# unions with only public data fields will be shown inline in the documentation +# of the scope in which they are defined (i.e. file, namespace, or group +# documentation), provided this scope is documented. If set to NO (the default), +# structs, classes, and unions are shown on a separate page (for HTML and Man +# pages) or section (for LaTeX and RTF). + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penalty. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will roughly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +SYMBOL_CACHE_SIZE = 0 + +# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be +# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given +# their name and scope. Since this can be an expensive process and often the +# same symbol appear multiple times in the code, doxygen keeps a cache of +# pre-resolved symbols. If the cache is too small doxygen will become slower. +# If the cache is too large, memory is wasted. The cache size is given by this +# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. The create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files +# containing the references data. This must be a list of .bib files. The +# .bib extension is automatically appended if omitted. Using this command +# requires the bibtex tool to be installed. See also +# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style +# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this +# feature you need bibtex and perl available in the search path. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = . + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.d \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.idl \ + *.odl \ + *.cs \ + *.php \ + *.php3 \ + *.inc \ + *.m \ + *.mm \ + *.dox \ + *.py \ + *.f90 \ + *.f \ + *.for \ + *.vhd \ + *.vhdl + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = YES + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# style sheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the style sheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) +# at top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. Since the tabs have the same information as the +# navigation tree you can set this option to NO if you already set +# GENERATE_TREEVIEW to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. +# Since the tree basically has the same information as the tab index you +# could consider to set DISABLE_INDEX to NO when enabling this option. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 4 + +# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list. + +USE_INLINE_TREES = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the +# mathjax.org site, so you can quickly see the result without installing +# MathJax, but it is strongly recommended to install a local copy of MathJax +# before deployment. + +MATHJAX_RELPATH = http://www.mathjax.org/mathjax + +# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension +# names that should be enabled during MathJax rendering. + +MATHJAX_EXTENSIONS = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See +# http://en.wikipedia.org/wiki/BibTeX for more info. + +LATEX_BIB_STYLE = plain + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load style sheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will use the Helvetica font for all dot files that +# doxygen generates. When you want a differently looking font you can specify +# the font name using DOT_FONTNAME. You need to make sure dot is able to find +# the font, which can be done by putting it in a standard location or by setting +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the Helvetica font. +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to +# set the path where dot can find it. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. If you choose svg you need to set +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible in IE 9+ (other browsers do not have this requirement). + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# Note that this requires a modern browser other than Internet Explorer. +# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you +# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible. Older versions of IE do not have SVG support. + +INTERACTIVE_SVG = NO + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/uzume_prototype/Makefile b/uzume_prototype/Makefile new file mode 100644 index 0000000..1d5e855 --- /dev/null +++ b/uzume_prototype/Makefile @@ -0,0 +1,507 @@ +# +# TOPPERS/JSP Kernel +# Toyohashi Open Platform for Embedded Real-Time Systems/ +# Just Standard Profile Kernel +# +# Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory +# Toyohashi Univ. of Technology, JAPAN +# Copyright (C) 2005 by Embedded and Real-Time Systems Laboratory +# Graduate School of Information Science, Nagoya Univ., JAPAN +# +# 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation +# によって公表されている GNU General Public License の Version 2 に記 +# 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア +# を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, +# 利用と呼ぶ)することを無償で許諾する. +# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 +# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー +# スコード中に含まれていること. +# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 +# 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 +# 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 +# の無保証規定を掲載すること. +# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 +# 用できない形で再配布する場合には,次のいずれかの条件を満たすこ +# と. +# (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 +# 作権表示,この利用条件および下記の無保証規定を掲載すること. +# (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに +# 報告すること. +# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 +# 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. +# +# 本ソフトウェアは,無保証で提供されているものである.上記著作権者お +# よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も +# 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 +# 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. +# +# @(#) $Id: Makefile,v 1.8 2012/01/21 02:32:02 suikan Exp $ +# + +# +# ターゲットの指定(Makefile.config で上書きされるのを防ぐため) +# +all: + +# +# ターゲット名の定義 +# +CPU = blackfin +SYS = acb_bf592 +TOOL = + +# +# プログラミング言語の定義 +# +PROGRAM_LANG = +ifeq ($(PROGRAM_LANG),c++) + USE_CXX = true + CXXLIBS = + CXXRTS = cxxrt.o newlibrt.o cpu_malloc.o +endif + +# +# ソースファイルのディレクトリの定義 +# +SRCDIR = kernel + +# +# オブジェクトファイル名の拡張子の設定 +# +OBJEXT = + +# +# 実行環境の定義(どれにも該当しない場合は,すべてコメントアウトする) +# (ターゲット依存に上書きされる場合がある) +# +DBGENV := GDB_STUB + +# +# カーネルライブラリ(libkernel.a)のディレクトリ名 +# (カーネルライブラリも make 対象にする時は,空に定義する) +# +KERNEL_LIB = + +# +# ターゲット依存の定義のインクルード +# +ifdef TOOL + ifdef SYS + include $(SRCDIR)/config/$(CPU)-$(TOOL)/$(SYS)/Makefile.config + endif + include $(SRCDIR)/config/$(CPU)-$(TOOL)/Makefile.config +else + ifdef SYS + include $(SRCDIR)/config/$(CPU)/$(SYS)/Makefile.config + endif + include $(SRCDIR)/config/$(CPU)/Makefile.config +endif + +# +# 共通コンパイルオプションの定義 +# +COPTS := $(COPTS) +CDEFS := $(CDEFS) +INCLUDES := -I. -I$(SRCDIR)/include $(INCLUDES) +LDFLAGS := -nostdlib $(LDFLAGS) +LIBS := $(LIBS) $(CXXLIBS) -lgcc +CFLAGS = $(COPTS) $(CDEFS) $(INCLUDES) + +# +# アプリケーションプログラムに関する定義 +# +UNAME = sample1 +UTASK_CFG = $(UNAME).cfg + +UTASK_DIR = $(SRCDIR)/library +UTASK_ASMOBJS = +ifdef USE_CXX + UTASK_CXXOBJS = $(UNAME).o + UTASK_COBJS = +else + UTASK_COBJS = $(UNAME).o +endif +UTASK_CFLAGS = +UTASK_LIBS = + +# +# システムサービスに関する定義 +# +STASK_DIR := $(STASK_DIR):$(SRCDIR)/systask:$(SRCDIR)/library +STASK_ASMOBJS := $(STASK_ASMOBJS) +STASK_COBJS := $(STASK_COBJS) timer.o serial.o logtask.o \ + log_output.o vasyslog.o t_perror.o strerror.o \ + $(CXXRTS) +STASK_CFLAGS := $(STASK_CFLAGS) -I$(SRCDIR)/systask +STASK_LIBS := $(STASK_LIBS) + +# +# カーネルに関する定義 +# +# KERNEL_ASMOBJS: カーネルライブラリに含める,ソースがアセンブリ言語の +# オブジェクトファイル. +# KERNEL_COBJS: カーネルのライブラリに含める,ソースがC言語で,ソース +# ファイルと1対1に対応するオブジェクトファイル. +# KERNEL_LCSRCS: カーネルのライブラリに含めるC言語のソースファイルで, +# 1つのソースファイルから複数のオブジェクトファイルを生 +# 成するもの(Makefile.kernel で定義). +# KERNEL_LCOBJS: 上のソースファイルから生成されるオブジェクトファイル +# (Makefile.kernel で定義). +# KERNEL_AUX_COBJS: ロードモジュールに含めないが,カーネルのソースファ +# イルと同じオプションを適用してコンパイルすべきファ +# イル. +# +KERNEL = $(SRCDIR)/kernel +KERNEL_DIR := $(KERNEL_DIR):$(KERNEL) +KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) +KERNEL_COBJS := startup.o banner.o $(KERNEL_COBJS) +KERNEL_CFLAGS := $(KERNEL_CFLAGS) -I$(KERNEL) +ifdef OMIT_MAKEOFFSET + OFFSET_H = + KERNEL_AUX_COBJS = kernel_chk.o +else + OFFSET_H = offset.h + KERNEL_AUX_COBJS = makeoffset.o kernel_chk.o +endif + +# +# オブジェクトファイル名の定義 +# +OBJNAME = jsp +ifdef OBJEXT + OBJFILE = $(OBJNAME).$(OBJEXT) +else + OBJFILE = $(OBJNAME) +endif + +# +# ターゲットファイル(複数を同時に選択してはならない) +# +all: $(OBJFILE) +#all: $(OBJNAME).out +#all: $(OBJNAME).bin +#all: $(OBJNAME).srec + +# +# カーネルのコンフィギュレーションファイルの生成 +# +kernel_cfg.c kernel_id.h kernel_chk.c: $(UTASK_CFG) + $(CC) -E $(INCLUDES) $(CDEFS) -x c-header $(UTASK_CFG) > tmpfile1 + $(SRCDIR)/cfg/cfg -s tmpfile1 -c -obj -cpu $(CPU) -system $(SYS) + rm -f tmpfile1 + +##### 以下は編集しないこと ##### + +# +# 環境に依存するコンパイルオプションの定義 +# +ifdef DBGENV + CDEFS := $(CDEFS) -D$(DBGENV) +endif + +# +# カーネルライブラリに関連する定義 +# +ifdef KERNEL_LIB + MAKE_KERNEL = + LIBKERNEL = $(KERNEL_LIB)/libkernel.a +else + MAKE_KERNEL = libkernel.a + LIBKERNEL = $(MAKE_KERNEL) +endif + +# +# カーネルのファイル構成の定義 +# +include $(KERNEL)/Makefile.kernel + +# +# $(OBJNAME).chk の生成規則(静的APIのパラメータチェック) +# +$(OBJNAME).chk: kernel_chk.s $(SRCDIR)/utils/gencheck + $(PERL) $(SRCDIR)/utils/gencheck kernel_chk.s > tmpfile2 + mv tmpfile2 $(OBJNAME).chk + +# +# offset.h の生成規則(構造体内のオフセット値の算出) +# +offset.h: makeoffset.s $(SRCDIR)/utils/genoffset + $(PERL) $(SRCDIR)/utils/genoffset makeoffset.s > tmpfile3 + mv tmpfile3 offset.h + +# +# ソースファイルのあるディレクトリに関する定義 +# +vpath %.c $(KERNEL_DIR):$(STASK_DIR):$(UTASK_DIR) +vpath %.S $(KERNEL_DIR):$(STASK_DIR):$(UTASK_DIR) + +# +# コンパイルのための変数の定義 +# +KERNEL_LIB_OBJS = $(KERNEL_ASMOBJS) $(KERNEL_COBJS) $(KERNEL_LCOBJS) +STASK_OBJS = $(STASK_ASMOBJS) $(STASK_COBJS) +UTASK_OBJS = $(UTASK_ASMOBJS) $(UTASK_COBJS) $(UTASK_CXXOBJS) +TASK_OBJS = $(UTASK_OBJS) $(STASK_OBJS) kernel_cfg.o +ALL_OBJS = $(START_OBJS) $(CXX_BEGIN_OBJS) $(TASK_OBJS) $(CXX_END_OBJS) $(END_OBJS) +ALL_LIBS = $(UTASK_LIBS) $(STASK_LIBS) $(LIBKERNEL) $(LIBS) + +ifdef TEXT_START_ADDRESS + LDFLAGS := $(LDFLAGS) -Wl,-Ttext,$(TEXT_START_ADDRESS) +endif +ifdef DATA_START_ADDRESS + LDFLAGS := $(LDFLAGS) -Wl,-Tdata,$(DATA_START_ADDRESS) +endif +ifdef LDSCRIPT + LDFLAGS := $(LDFLAGS) -T $(SRCDIR)/config/$(LDSCRIPT) +endif + +# +# カーネルライブラリファイルの生成 +# +libkernel.a: $(OFFSET_H) $(KERNEL_LIB_OBJS) + rm -f libkernel.a + $(AR) -rcs libkernel.a $(KERNEL_LIB_OBJS) + $(RANLIB) libkernel.a + +# +# 全体のリンク +# $(OBJCOPY) -R ... はGDB用に定義したデバッグ用MMRのメモリ実体を剥ぎ取り、シンボルだけ残すためのもの。 +# +$(OBJFILE): Makefile.depend $(ALL_OBJS) $(MAKE_KERNEL) $(OBJNAME).chk + $(LINK) $(CFLAGS) $(LDFLAGS) -o $(OBJFILE) \ + $(START_OBJS) $(CXX_BEGIN_OBJS) $(TASK_OBJS) $(ALL_LIBS) $(CXX_END_OBJS) $(END_OBJS) + $(NM) $(OBJFILE) > $(OBJNAME).syms + $(OBJCOPY) -O srec -S $(OBJFILE) $(OBJNAME).srec + $(SRCDIR)/cfg/chk -m $(OBJNAME).syms,$(OBJNAME).srec \ + -obj -cs $(OBJNAME).chk -cpu $(CPU) -system $(SYS) + +# +# バイナリファイルの生成 +# +$(OBJNAME).bin: $(OBJFILE) + $(OBJCOPY) -O binary -S $(OBJFILE) $(OBJNAME).bin + +# +# Sレコードファイルの生成 +# +$(OBJNAME).srec: $(OBJFILE) + $(OBJCOPY) -O srec -S $(OBJFILE) $(OBJNAME).srec + +# +# コンパイル結果の消去 +# +clean: + rm -f \#* *~ *.o tmpfile? + rm -f $(MAKE_KERNEL) $(OBJNAME) + rm -f $(OBJNAME).syms $(OBJNAME).srec $(OBJNAME).chk + rm -f $(OBJNAME).exe $(OBJNAME).bin $(OBJNAME).out + rm -f kernel_cfg.c kernel_chk.c kernel_chk.s kernel_id.h kernel_obj.dat + rm -f makeoffset.s offset.h + +cleankernel: + rm -rf $(KERNEL_LIB_OBJS) + rm -f makeoffset.s offset.h + +cleandep: + rm -f Makefile.depend + +realclean: cleandep clean + +# +# kernel_cfg.c のコンパイルルールと依存関係作成ルールの定義 +# +# kernel_cfg.c は,アプリケーションプログラム用,システムサービス用, +# カーネル用のすべてのオプションを付けてコンパイルする. +# +KERNEL_CFG_CFLAGS = $(UTASK_CFLAGS) $(STASK_CFLAGS) $(KERNEL_CFLAGS) + +kernel_cfg.o: kernel_cfg.c + $(CC) -c $(CFLAGS) $(KERNEL_CFG_CFLAGS) $< + +kernel_cfg.s: kernel_cfg.c + $(CC) -S $(CFLAGS) $(KERNEL_CFG_CFLAGS) $< + +kernel_cfg.d: kernel_cfg.c + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \ + -O "$(CFLAGS) $(KERNEL_CFG_CFLAGS)" $< >> Makefile.depend + +# +# 特別な依存関係の定義 +# +banner.o: $(filter-out banner.o,$(KERNEL_LIB_OBJS)) + +# +# 特殊な依存関係作成ルールの定義 +# +kernel_id.d: $(UTASK_CFG) + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) -X \ + -T "kernel_cfg.c kernel_id.h kernel_chk.c" \ + -O "$(INCLUDES)" $< >> Makefile.depend + +makeoffset.d: makeoffset.c + @$(PERL) $(SRCDIR)/utils/makedep -s -C $(CC) \ + -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend + +kernel_chk.d: kernel_chk.c + @$(PERL) $(SRCDIR)/utils/makedep -s -C $(CC) \ + -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend + +# +# 依存関係ファイルの生成 +# +gendepend: + @echo "Generating Makefile.depend." + +ifdef KERNEL_LIB +depend: cleandep kernel_cfg.c gendepend kernel_id.d \ + kernel_chk.d $(ALL_OBJS:.o=.d) +else +depend: cleandep $(OFFSET_H) kernel_cfg.c gendepend kernel_id.d \ + $(KERNEL_AUX_COBJS:.o=.d) $(KERNEL_ASMOBJS:.o=.d) \ + $(KERNEL_COBJS:.o=.d) $(KERNEL_LCSRCS:.c=.d) $(ALL_OBJS:.o=.d) +endif + +# +# 依存関係ファイルをインクルード +# +-include Makefile.depend + +# +# 開発ツールのコマンド名の定義 +# +ifndef TOOL + # + # GNU開発環境用 + # + ifdef TARGET + TARGET_PREFIX = $(TARGET)- + else + TARGET_PREFIX = + endif + CC = $(TARGET_PREFIX)gcc + CXX = $(TARGET_PREFIX)g++ + AS = $(TARGET_PREFIX)as + LD = $(TARGET_PREFIX)ld + AR = $(TARGET_PREFIX)ar + NM = $(TARGET_PREFIX)nm + RANLIB = $(TARGET_PREFIX)ranlib + OBJCOPY = $(TARGET_PREFIX)objcopy + OBJDUMP = $(TARGET_PREFIX)objdump +else + TARGET_PREFIX = +endif + +ifdef USE_CXX + LINK = $(CXX) +else + LINK = $(CC) +endif + +PERL = + +# +# コンパイルルールの定義 +# +KERNEL_ALL_COBJS = $(KERNEL_COBJS) $(KERNEL_AUX_COBJS) + +$(KERNEL_ALL_COBJS): %.o: %.c + $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $< + +$(KERNEL_ALL_COBJS:.o=.s): %.s: %.c + $(CC) -S $(CFLAGS) $(KERNEL_CFLAGS) $< + +$(KERNEL_LCOBJS): %.o: + $(CC) -D__$(*F) -o $@ -c $(CFLAGS) $(KERNEL_CFLAGS) $< + +$(KERNEL_LCOBJS:.o=.s): %.s: + $(CC) -D__$(*F) -o $@ -S $(CFLAGS) $(KERNEL_CFLAGS) $< + +$(KERNEL_ASMOBJS): %.o: %.S + $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $< + +$(STASK_COBJS): %.o: %.c + $(CC) -c $(CFLAGS) $(STASK_CFLAGS) $< + +$(STASK_COBJS:.o=.s): %.s: %.c + $(CC) -S $(CFLAGS) $(STASK_CFLAGS) $< + +$(STASK_ASMOBJS): %.o: %.S + $(CC) -c $(CFLAGS) $(STASK_CFLAGS) $< + +$(UTASK_COBJS): %.o: %.c + $(CC) -c $(CFLAGS) $(UTASK_CFLAGS) $< + +$(UTASK_COBJS:.o=.s): %.s: %.c + $(CC) -S $(CFLAGS) $(UTASK_CFLAGS) $< + +$(UTASK_CXXOBJS): %.o: %.cpp + $(CXX) -c $(CFLAGS) $(UTASK_CFLAGS) $< + +$(UTASK_CXXOBJS:.o=.s): %.s: %.cpp + $(CXX) -S $(CFLAGS) $(UTASK_CFLAGS) $< + +$(UTASK_ASMOBJS): %.o: %.S + $(CC) -c $(CFLAGS) $(UTASK_CFLAGS) $< + +# +# 依存関係作成ルールの定義 +# +$(KERNEL_COBJS:.o=.d): %.d: %.c + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \ + -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend + +$(KERNEL_LCSRCS:.c=.d): %.d: %.c + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) -T "$($*)" \ + -O "$(foreach sym,$($*),-D__$(sym:.o=)) \ + $(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend + +$(KERNEL_LCOBJS:.o=.d): %.d: + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) -T $*.o \ + -O "-D__$(*F) $(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend + +$(KERNEL_ASMOBJS:.o=.d): %.d: %.S + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \ + -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend + +$(STASK_COBJS:.o=.d): %.d: %.c + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \ + -O "$(CFLAGS) $(STASK_CFLAGS)" $< >> Makefile.depend + +$(STASK_ASMOBJS:.o=.d): %.d: %.S + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \ + -O "$(CFLAGS) $(STASK_CFLAGS)" $< >> Makefile.depend + +$(UTASK_COBJS:.o=.d): %.d: %.c + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \ + -O "$(CFLAGS) $(UTASK_CFLAGS)" $< >> Makefile.depend + +$(UTASK_CXXOBJS:.o=.d): %.d: %.cpp + @$(PERL) $(SRCDIR)/utils/makedep -C $(CXX) \ + -O "$(CFLAGS) $(UTASK_CFLAGS)" $< >> Makefile.depend + +$(UTASK_ASMOBJS:.o=.d): %.d: %.S + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \ + -O "$(CFLAGS) $(UTASK_CFLAGS)" $< >> Makefile.depend + +# +# デフォルトコンパイルルールを上書き +# +%.o: %.c + @echo "*** Default compile rules should not be used." + $(CC) -c $(CFLAGS) $< + +%.s: %.c + @echo "*** Default compile rules should not be used." + $(CC) -S $(CFLAGS) $< + +%.o: %.cpp + @echo "*** Default compile rules should not be used." + $(CXX) -c $(CFLAGS) $< + +%.s: %.cpp + @echo "*** Default compile rules should not be used." + $(CXX) -S $(CFLAGS) $< + +%.o: %.S + @echo "*** Default compile rules should not be used." + $(CC) -c $(CFLAGS) $< diff --git a/uzume_prototype/Makefile.depend b/uzume_prototype/Makefile.depend new file mode 100644 index 0000000..3bcddb0 --- /dev/null +++ b/uzume_prototype/Makefile.depend @@ -0,0 +1,771 @@ +kernel_cfg.c kernel_id.h kernel_chk.c: kernel/systask/logtask.cfg \ + kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h sample1.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h kernel/include/t_services.h \ + kernel/include/sil.h kernel/config/blackfin/tool_defs.h \ + kernel/include/t_syslog.h \ + kernel/config/blackfin/_common_bf592/hw_timer.h sample1.cfg \ + kernel/systask/timer.cfg kernel/systask/serial.cfg \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/include/s_services.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + kernel/config/blackfin/_common_bf592/hw_serial.cfg +makeoffset.s: kernel/include/kernel.h \ + kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/kernel/task.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h kernel/kernel/queue.h \ + kernel/kernel/time_event.h kernel/kernel/jsp_rename.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/makeoffset.c \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +kernel_chk.s: kernel/config/blackfin/cpu_defs.h kernel/kernel/task.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h kernel/kernel/queue.h \ + kernel/kernel/time_event.h kernel_chk.c kernel/kernel/wait.h \ + kernel/include/t_stddef.h kernel/kernel/mailbox.h \ + kernel/kernel/eventflag.h kernel/config/blackfin/tool_defs.h \ + kernel/include/../kernel/exception.h \ + kernel/kernel/dataqueue.h kernel/kernel/interrupt.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/kernel.h kernel/include/timer.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/kernel/cyclic.h kernel/kernel/jsp_rename.h \ + kernel/config/blackfin/cpu_rename.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/include/t_syslog.h kernel/kernel/semaphore.h \ + kernel/include/logtask.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h \ + kernel/include/itron.h kernel/kernel/mempfix.h +cpu_support.o: kernel/include/kernel.h \ + kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h \ + kernel/config/blackfin/saverestore.h \ + kernel/config/blackfin/cpu_support.S \ + kernel/kernel/jsp_rename.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h ./offset.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/config/blackfin/cpu_config.h kernel/include/itron.h \ + kernel/config/blackfin/_common_bf592/chip_config.h +startup.o: kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h kernel/kernel/time_event.h \ + kernel/kernel/jsp_rename.h \ + kernel/config/blackfin/cpu_rename.h kernel/kernel/startup.c \ + kernel/include/t_stddef.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/kernel/syslog.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +banner.o: kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h kernel/kernel/jsp_rename.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h kernel/kernel/banner.c \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +chip_config.o: \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/defBF59x_base.h \ + kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/stdint.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/cdef_LPBlackfin.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/defBF592-A.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/cdefBF59x_base.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/cdefBF592-A.h \ + kernel/kernel/jsp_rename.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/def_LPBlackfin.h \ + kernel/include/sil.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/_common_bf592/chip_config.c \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +uart.o: kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/pdic/simple_sio/uart.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h kernel/include/sil.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/include/s_services.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h \ + kernel/include/itron.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/pdic/simple_sio/uart.c +chip_debugboot.o: \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/defBF59x_base.h \ + kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/stdint.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/cdef_LPBlackfin.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/defBF592-A.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/cdefBF59x_base.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/cdefBF592-A.h \ + kernel/kernel/jsp_rename.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/def_LPBlackfin.h \ + kernel/include/sil.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/_common_bf592/chip_debugboot.c \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +chip_dump.o: \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/defBF59x_base.h \ + kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/stdint.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/cdef_LPBlackfin.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/defBF592-A.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/cdefBF59x_base.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/cdefBF592-A.h \ + kernel/kernel/jsp_rename.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/def_LPBlackfin.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/_common_bf592/chip_dump.c \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +cpu_config.o: kernel/include/kernel.h \ + kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/kernel/task.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h kernel/kernel/queue.h \ + kernel/kernel/time_event.h kernel/kernel/jsp_rename.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h \ + kernel/config/blackfin/cpu_config.c \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/kernel/check.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +cpu_defs.o: kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h \ + kernel/config/blackfin/cpu_defs.c \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h kernel/include/sil.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/include/s_services.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h \ + kernel/include/itron.h \ + kernel/config/blackfin/_common_bf592/chip_config.h +tskini.o tsksched.o tskrun.o tsknrun.o tskdmt.o tskact.o tskext.o tskpri.o tskrot.o tsktex.o: \ + kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/kernel/task.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h kernel/kernel/queue.h \ + kernel/kernel/time_event.h kernel/kernel/jsp_rename.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/cpu_context.h kernel/kernel/task.c \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +waimake.o waicmp.o waitmo.o waitmook.o waican.o wairel.o wobjwai.o wobjwaitmo.o wobjpri.o: \ + kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/kernel/task.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h kernel/kernel/queue.h \ + kernel/kernel/time_event.h kernel/kernel/wait.c \ + kernel/kernel/jsp_rename.h kernel/kernel/wait.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +tmeini.o tmeup.o tmedown.o tmeins.o tmedel.o isig_tim.o: \ + kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/kernel/time_event.c \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h kernel/kernel/time_event.h \ + kernel/kernel/jsp_rename.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/kernel/check.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +logini.o vwri_log.o vrea_log.o vmsk_log.o logter.o: \ + kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h kernel/kernel/syslog.c \ + kernel/kernel/time_event.h kernel/kernel/jsp_rename.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/kernel/syslog.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +act_tsk.o iact_tsk.o can_act.o ext_tsk.o ter_tsk.o chg_pri.o get_pri.o: \ + kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/kernel/task.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h kernel/kernel/queue.h \ + kernel/kernel/time_event.h kernel/kernel/jsp_rename.h \ + kernel/kernel/wait.h kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/kernel/task_manage.c \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/kernel/check.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +slp_tsk.o tslp_tsk.o wup_tsk.o iwup_tsk.o can_wup.o rel_wai.o irel_wai.o sus_tsk.o rsm_tsk.o frsm_tsk.o dly_tsk.o: \ + kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/kernel/task.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h kernel/kernel/queue.h \ + kernel/kernel/time_event.h kernel/kernel/jsp_rename.h \ + kernel/kernel/wait.h kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h kernel/kernel/task_sync.c \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/kernel/check.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +ras_tex.o iras_tex.o dis_tex.o ena_tex.o sns_tex.o: \ + kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/kernel/task.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h kernel/kernel/task_except.c \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h kernel/kernel/queue.h \ + kernel/kernel/time_event.h kernel/kernel/jsp_rename.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/kernel/check.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +semini.o sig_sem.o isig_sem.o wai_sem.o pol_sem.o twai_sem.o: \ + kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/kernel/task.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/semaphore.c kernel/kernel/jsp_kernel.h \ + kernel/kernel/queue.h kernel/kernel/time_event.h \ + kernel/kernel/jsp_rename.h kernel/kernel/wait.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/kernel/semaphore.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/kernel/check.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +flgini.o flgcnd.o set_flg.o iset_flg.o clr_flg.o wai_flg.o pol_flg.o twai_flg.o: \ + kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/kernel/task.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h kernel/kernel/queue.h \ + kernel/kernel/time_event.h kernel/kernel/eventflag.c \ + kernel/kernel/jsp_rename.h kernel/kernel/wait.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/kernel/eventflag.h kernel/config/blackfin/tool_defs.h \ + kernel/include/t_syslog.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/kernel/check.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +dtqini.o dtqenq.o dtqfenq.o dtqdeq.o dtqsnd.o dtqrcv.o snd_dtq.o psnd_dtq.o ipsnd_dtq.o tsnd_dtq.o fsnd_dtq.o ifsnd_dtq.o rcv_dtq.o prcv_dtq.o trcv_dtq.o: \ + kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/kernel/dataqueue.c kernel/kernel/task.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h kernel/kernel/queue.h \ + kernel/kernel/time_event.h kernel/kernel/jsp_rename.h \ + kernel/kernel/wait.h kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/kernel/dataqueue.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/kernel/check.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +mbxini.o snd_mbx.o rcv_mbx.o prcv_mbx.o trcv_mbx.o: \ + kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/kernel/task.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h kernel/kernel/mailbox.c \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h kernel/kernel/queue.h \ + kernel/kernel/time_event.h kernel/kernel/jsp_rename.h \ + kernel/kernel/wait.h kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h kernel/kernel/mailbox.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/kernel/check.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +mpfini.o mpfget.o get_mpf.o pget_mpf.o tget_mpf.o rel_mpf.o: \ + kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/kernel/task.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h kernel/kernel/mempfix.c \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h kernel/kernel/queue.h \ + kernel/kernel/time_event.h kernel/kernel/jsp_rename.h \ + kernel/kernel/wait.h kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/kernel/check.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h \ + kernel/kernel/mempfix.h +set_tim.o get_tim.o vxget_tim.o: kernel/include/kernel.h \ + kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h kernel/kernel/time_manage.c \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h kernel/kernel/time_event.h \ + kernel/kernel/jsp_rename.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/kernel/check.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +cycini.o cycenq.o sta_cyc.o stp_cyc.o cyccal.o: \ + kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h kernel/kernel/queue.h \ + kernel/kernel/time_event.h kernel/kernel/cyclic.h \ + kernel/kernel/jsp_rename.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h kernel/kernel/cyclic.c \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/kernel/check.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +rot_rdq.o irot_rdq.o get_tid.o iget_tid.o loc_cpu.o iloc_cpu.o unl_cpu.o iunl_cpu.o dis_dsp.o ena_dsp.o sns_ctx.o sns_loc.o sns_dsp.o sns_dpn.o vsns_ini.o: \ + kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/kernel/sys_manage.c kernel/kernel/task.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h kernel/kernel/queue.h \ + kernel/kernel/time_event.h kernel/kernel/jsp_rename.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/kernel/check.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +inhini.o: kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h kernel/kernel/jsp_rename.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h kernel/kernel/interrupt.c \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/kernel/interrupt.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +excini.o vxsns_ctx.o vxsns_loc.o vxsns_dsp.o vxsns_dpn.o vxsns_tex.o: \ + kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + kernel/kernel/exception.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/kernel/exception.c kernel/kernel/task.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h kernel/kernel/queue.h \ + kernel/kernel/time_event.h kernel/kernel/jsp_rename.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h +start.o: kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/config/blackfin/start.S \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h \ + kernel/kernel/jsp_kernel.h \ + kernel/config/blackfin/saverestore.h \ + kernel/kernel/jsp_rename.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h kernel/config/blackfin/tool_defs.h \ + kernel/include/t_syslog.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/config/blackfin/cpu_config.h kernel/include/itron.h \ + kernel/config/blackfin/_common_bf592/chip_config.h +cpu_crtbegin.o: kernel/config/blackfin/cpu_crtbegin.c +sample1.o: kernel/include/kernel.h kernel/include/t_services.h \ + kernel/config/blackfin/cpu_defs.h sample1.c \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/include/t_syslog.h kernel/config/blackfin/tool_defs.h \ + kernel/include/serial.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h sample1.h \ + kernel_id.h kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h \ + kernel/include/t_stddef.h +timer.o: \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/defBF59x_base.h \ + kernel/include/kernel.h kernel/include/timer.h \ + kernel/config/blackfin/cpu_defs.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/stdint.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/cdef_LPBlackfin.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/defBF592-A.h \ + kernel/config/blackfin/tool_config.h kernel/include/serial.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/cdefBF59x_base.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/cdefBF592-A.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/def_LPBlackfin.h \ + kernel/include/t_services.h kernel/include/sil.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/_common_bf592/hw_timer.h \ + kernel/systask/timer.c \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/include/s_services.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h \ + kernel/include/itron.h +serial.o: kernel/include/kernel.h kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/pdic/simple_sio/uart.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h kernel/include/serial.h \ + ./kernel_id.h kernel/systask/serial.c \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h kernel/include/t_services.h \ + kernel/include/sil.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/config/blackfin/_common_bf592/hw_serial.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/include/s_services.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h \ + kernel/include/itron.h +logtask.o: kernel/include/kernel.h kernel/systask/logtask.c \ + kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/tool_config.h kernel/include/serial.h \ + kernel/config/blackfin/cpu_rename.h \ + kernel/include/t_stddef.h kernel/include/t_services.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/config/blackfin/tool_defs.h kernel/include/t_syslog.h \ + kernel/include/logtask.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h \ + kernel/include/itron.h +log_output.o: kernel/include/kernel.h kernel/include/t_services.h \ + kernel/config/blackfin/cpu_defs.h \ + kernel/library/log_output.c \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/include/t_syslog.h kernel/config/blackfin/tool_defs.h \ + kernel/include/serial.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h \ + kernel/include/t_stddef.h +vasyslog.o: kernel/include/kernel.h kernel/include/t_services.h \ + kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/include/t_syslog.h kernel/config/blackfin/tool_defs.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stdarg.h \ + kernel/library/vasyslog.c kernel/include/serial.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h \ + kernel/include/t_stddef.h +t_perror.o: kernel/include/kernel.h kernel/include/t_services.h \ + kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/include/t_syslog.h kernel/config/blackfin/tool_defs.h \ + kernel/include/serial.h kernel/library/t_perror.c \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h \ + kernel/include/t_stddef.h +strerror.o: kernel/include/kernel.h kernel/include/t_services.h \ + kernel/config/blackfin/cpu_defs.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/include/t_syslog.h kernel/config/blackfin/tool_defs.h \ + kernel/library/strerror.c kernel/include/serial.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/include/itron.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h \ + kernel/include/t_stddef.h +kernel_cfg.o: \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/defBF59x_base.h \ + kernel/config/blackfin/cpu_defs.h \ + kernel/pdic/simple_sio/uart.h \ + kernel/include/../kernel/mempfix.h kernel/include/serial.h \ + kernel/config/blackfin/tool_config.h kernel_cfg.c sample1.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/cdefBF59x_base.h \ + kernel/include/../kernel/cyclic.h kernel/include/t_stddef.h \ + kernel/include/../kernel/semaphore.h \ + kernel/config/blackfin/tool_defs.h \ + kernel/include/../kernel/exception.h \ + kernel/include/../kernel/dataqueue.h \ + kernel/config/blackfin/_common_bf592/hw_serial.h \ + kernel/include/../kernel/time_event.h \ + kernel/config/blackfin/_common_bf592/sys_unrename.h \ + kernel/include/../kernel/jsp_unrename.h \ + kernel/include/kernel_cfg.h kernel/include/s_services.h \ + kernel/config/blackfin/acb_bf592/sys_config.h \ + kernel/config/blackfin/_common_bf592/chip_config.h \ + kernel/include/../kernel/task.h kernel/include/kernel.h \ + kernel/include/timer.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/stdint.h \ + kernel/config/blackfin/_common_bf592/chip_defs.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/cdef_LPBlackfin.h \ + kernel/include/t_config.h \ + kernel/config/blackfin/_common_bf592/sys_rename.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/defBF592-A.h \ + kernel/include/../kernel/eventflag.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/cdefBF592-A.h \ + kernel/config/blackfin/cpu_rename.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/../../../../bfin-elf/include/def_LPBlackfin.h \ + kernel/include/sil.h kernel/include/t_services.h \ + kernel/config/blackfin/cpu_unrename.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include-fixed/limits.h \ + kernel/include/t_syslog.h \ + kernel/config/blackfin/_common_bf592/hw_timer.h \ + kernel/include/../kernel/jsp_rename.h \ + kernel/include/../kernel/mailbox.h \ + kernel/include/../kernel/interrupt.h \ + kernel/include/../kernel/jsp_kernel.h \ + kernel/include/logtask.h \ + kernel/config/blackfin/acb_bf592/sys_defs.h \ + kernel/config/blackfin/cpu_config.h kernel_id.h \ + /opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h \ + kernel/include/itron.h kernel/include/../kernel/queue.h +cpu_crtend.o: kernel/config/blackfin/cpu_crtend.c diff --git a/uzume_prototype/configure-project b/uzume_prototype/configure-project new file mode 100755 index 0000000..94d341e --- /dev/null +++ b/uzume_prototype/configure-project @@ -0,0 +1 @@ +kernel/configure -C blackfin -S acb_bf592 -A i2c-test diff --git a/uzume_prototype/genmmrsyms/.cproject b/uzume_prototype/genmmrsyms/.cproject new file mode 100644 index 0000000..eae72a9 --- /dev/null +++ b/uzume_prototype/genmmrsyms/.cproject @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + make + + all + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/uzume_prototype/genmmrsyms/.cvsignore b/uzume_prototype/genmmrsyms/.cvsignore new file mode 100644 index 0000000..ea5bd75 --- /dev/null +++ b/uzume_prototype/genmmrsyms/.cvsignore @@ -0,0 +1,4 @@ +mmr_bf518.out +mmr_bf533.out +mmr_bf537.out +mmr_bf592.out diff --git a/uzume_prototype/genmmrsyms/.gitignore b/uzume_prototype/genmmrsyms/.gitignore new file mode 100644 index 0000000..f690d76 --- /dev/null +++ b/uzume_prototype/genmmrsyms/.gitignore @@ -0,0 +1,4 @@ +/mmr_bf537.out +/mmr_bf592.out +/mmr_bf533.out +/mmr_bf518.out diff --git a/uzume_prototype/genmmrsyms/.project b/uzume_prototype/genmmrsyms/.project new file mode 100644 index 0000000..e47f3d5 --- /dev/null +++ b/uzume_prototype/genmmrsyms/.project @@ -0,0 +1,77 @@ + + + util-genmmrsyms + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.autoBuildTarget + all + + + org.eclipse.cdt.make.core.buildArguments + + + + org.eclipse.cdt.make.core.buildCommand + make + + + org.eclipse.cdt.make.core.cleanBuildTarget + clean + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + false + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.fullBuildTarget + all + + + org.eclipse.cdt.make.core.stopOnError + true + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/uzume_prototype/genmmrsyms/Makefile b/uzume_prototype/genmmrsyms/Makefile new file mode 100644 index 0000000..be7755d --- /dev/null +++ b/uzume_prototype/genmmrsyms/Makefile @@ -0,0 +1,33 @@ +CC = bfin-elf-gcc +LD = bfin-elf-ld +CCOPT = -g -c +LDOPT = -nostdlib + + +OBJBF533 = cpu_mmr.o chip_mmr_bf533.o +OBJBF537 = cpu_mmr.o chip_mmr_bf537.o +OBJBF518 = cpu_mmr.o chip_mmr_bf518.o +OBJBF592 = cpu_mmr.o chip_mmr_bf592.o + +all:mmr_bf533.out mmr_bf518.out mmr_bf537.out mmr_bf592.out + +clean: + rm *.o + rm *.out + +mmr_bf533.out : $(OBJBF533) + $(LD) $(OBJBF533) -$(LDOPT) -T bf532elf.ld -o mmr_bf533.out + +mmr_bf537.out : $(OBJBF537) + $(LD) $(OBJBF537) -$(LDOPT) -T bf537elf.ld -o mmr_bf537.out + +mmr_bf518.out : $(OBJBF518) + $(LD) $(OBJBF518) -$(LDOPT) -T bf518elf.ld -o mmr_bf518.out + +mmr_bf592.out : $(OBJBF592) + $(LD) $(OBJBF592) -$(LDOPT) -T bf592elf.ld -o mmr_bf592.out + + +.c.o: + $(CC) $(CCOPT) $< + diff --git a/uzume_prototype/genmmrsyms/README b/uzume_prototype/genmmrsyms/README new file mode 100644 index 0000000..f620475 --- /dev/null +++ b/uzume_prototype/genmmrsyms/README @@ -0,0 +1,6 @@ +GDB用MMR シンボル生成プロジェクト + 2012/01/21 Suikan + +このプロジェクトは、Blackfin用のMMRシンボルをGDB用に生成するためのプロジェクトである。 +Makeを実行すると.out ファイルが生成される。使用しているプロセッサに応じて、gdbから +シンボルを追加読み込みして使う。 \ No newline at end of file diff --git a/uzume_prototype/genmmrsyms/bf518elf.ld b/uzume_prototype/genmmrsyms/bf518elf.ld new file mode 100644 index 0000000..ede5513 --- /dev/null +++ b/uzume_prototype/genmmrsyms/bf518elf.ld @@ -0,0 +1,174 @@ +/* +* ADSP-BF518 Rev 0.0ではアノーマリ05000444の影響でこのファイルを使用できない。 +* Rev 0.0 に対しては bf518elf_00.ldを使用すること。 +*/ +OUTPUT_FORMAT("elf32-bfin","elf32-bfin","elf32-bfin") +OUTPUT_ARCH(bfin) + + +MEMORY + { + MEM_SDRAM (XW) : ORIGIN = 0x00000000, LENGTH = 128M + MEM_ASYNC_0 (XW) : ORIGIN = 0x20000000, LENGTH = 1M + MEM_ASYNC_1 (XW) : ORIGIN = 0x20100000, LENGTH = 1M + MEM_ASYNC_2 (XW) : ORIGIN = 0x20200000, LENGTH = 1M + MEM_ASYNC_3 (XW) : ORIGIN = 0x20300000, LENGTH = 1M + + MEM_L1_DATA_A (W!X) : ORIGIN = 0xff800000, LENGTH = 32K + MEM_L1_DATA_B (W!X) : ORIGIN = 0xff900000, LENGTH = 16K /* BF518のバンクBは32kBだが、キャッシュ用に16kBあけておく */ + MEM_L1_CODE (XR) : ORIGIN = 0xffa00000, LENGTH = 32K +/* MEM_L1_INST_C (XR) : ORIGIN = 0xffa10000, LENGTH = 16K BF518のバンクCは16kBだが、キャッシュ用にあけておく */ + MEM_L1_SCRATCH (W!X) : ORIGIN = 0xffb00000, LENGTH = 4K + + MEM_L2 : ORIGIN = 0xffe00000, LENGTH = 0 /* DUMMY */ + + MEM_SYSMMR (W!X) : ORIGIN = 0xffc00000, LENGTH = 2M + MEM_COREMMR (W!X) : ORIGIN = 0xffe00000, LENGTH = 2M + } + +SECTIONS +{ + + + +/* ADSP-BF518依存のSYSTEM MMR */ + .bss.sysmmr (NOLOAD) : { . = 0x0000; *.o(SYSMMR0)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0100; *.o(SYSMMR1)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x010C; *.o(SYSMMR2)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x014C; *.o(SYSMMR3)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0200; *.o(SYSMMR4)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0300; *.o(SYSMMR5)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0400; *.o(SYSMMR6)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x041C; *.o(SYSMMR7)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0424; *.o(SYSMMR8)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0500; *.o(SYSMMR9)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0600; *.o(SYSMMR10)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0700; *.o(SYSMMR11)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0800; *.o(SYSMMR12)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0818; *.o(SYSMMR13)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0820; *.o(SYSMMR14)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0900; *.o(SYSMMR15)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0918; *.o(SYSMMR16)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0920; *.o(SYSMMR17)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0A00; *.o(SYSMMR18)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0A10; *.o(SYSMMR19)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0B0C; *.o(SYSMMR20)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C00; *.o(SYSMMR21)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C10; *.o(SYSMMR22)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C38; *.o(SYSMMR23)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C40; *.o(SYSMMR24)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C50; *.o(SYSMMR25)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C78; *.o(SYSMMR26)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C80; *.o(SYSMMR27)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C90; *.o(SYSMMR28)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0CB8; *.o(SYSMMR29)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0CC0; *.o(SYSMMR30)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0CD0; *.o(SYSMMR31)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0CF8; *.o(SYSMMR32)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D00; *.o(SYSMMR33)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D10; *.o(SYSMMR34)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D38; *.o(SYSMMR35)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D40; *.o(SYSMMR36)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D50; *.o(SYSMMR37)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D78; *.o(SYSMMR38)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D80; *.o(SYSMMR39)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D90; *.o(SYSMMR40)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0DB8; *.o(SYSMMR41)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0DC0; *.o(SYSMMR42)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0DD0; *.o(SYSMMR43)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0DF8; *.o(SYSMMR44)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E00; *.o(SYSMMR45)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E10; *.o(SYSMMR46)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E38; *.o(SYSMMR47)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E40; *.o(SYSMMR48)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E50; *.o(SYSMMR49)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E78; *.o(SYSMMR50)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E80; *.o(SYSMMR51)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E90; *.o(SYSMMR52)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0EB8; *.o(SYSMMR53)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0EC0; *.o(SYSMMR54)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0ED0; *.o(SYSMMR55)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0EF8; *.o(SYSMMR56)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F00; *.o(SYSMMR57)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F10; *.o(SYSMMR58)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F38; *.o(SYSMMR59)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F40; *.o(SYSMMR60)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F50; *.o(SYSMMR61)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F78; *.o(SYSMMR62)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F80; *.o(SYSMMR63)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F90; *.o(SYSMMR64)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0FB8; *.o(SYSMMR65)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0FC0; *.o(SYSMMR66)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0FD0; *.o(SYSMMR67)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0FF8; *.o(SYSMMR68)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1000; *.o(SYSMMR69)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1400; *.o(SYSMMR70)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1480; *.o(SYSMMR71)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1500; *.o(SYSMMR72)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1700; *.o(SYSMMR73)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x2000; *.o(SYSMMR74)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x201C; *.o(SYSMMR75)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x2024; *.o(SYSMMR76)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3000; *.o(SYSMMR77)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x302C; *.o(SYSMMR78)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3060; *.o(SYSMMR79)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x30A0; *.o(SYSMMR80)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3100; *.o(SYSMMR81)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3180; *.o(SYSMMR82)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3200; *.o(SYSMMR83)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3210; *.o(SYSMMR84)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3220; *.o(SYSMMR85)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3240; *.o(SYSMMR86)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3280; *.o(SYSMMR87)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3288; *.o(SYSMMR88)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3300; *.o(SYSMMR89)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3340; *.o(SYSMMR90)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3400; *.o(SYSMMR91)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3500; *.o(SYSMMR92)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3620; *.o(SYSMMR93)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3680; *.o(SYSMMR94)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3700; *.o(SYSMMR95)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3800; *.o(SYSMMR96)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3848; *.o(SYSMMR97)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3880; *.o(SYSMMR98)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x38C0; *.o(SYSMMR99)}>MEM_SYSMMR + + + + + +/* Blackfin 共有のCORE MMR */ + .bss.coremmr (NOLOAD) : { *.o(DMEMCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(DCPLBA)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(DCPLBD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(DTESTC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(DTESTD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(IMEMCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(ICPLBA)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(ICPLBD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(ITESTC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(ITESTD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(EVT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(CEC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(CTMR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000)+0x1000; *.o(DBG)}> MEM_COREMMR /* 1000飛ばす */ + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(TBCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(TBUF)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(WPICTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); *.o(WPIADDR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); *.o(WPICNT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(WPDCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); *.o(WPDADDR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); *.o(WPDCNT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(WPSTAT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(PFCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(PFCNT)}> MEM_COREMMR + + .comment 0 : { *(.comment) } + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } +} diff --git a/uzume_prototype/genmmrsyms/bf532elf.ld b/uzume_prototype/genmmrsyms/bf532elf.ld new file mode 100644 index 0000000..a26fc8a --- /dev/null +++ b/uzume_prototype/genmmrsyms/bf532elf.ld @@ -0,0 +1,77 @@ + +OUTPUT_FORMAT("elf32-bfin","elf32-bfin","elf32-bfin") +OUTPUT_ARCH(bfin) + + +MEMORY + { + MEM_SDRAM (XW) : ORIGIN = 0x00000000, LENGTH = 128M + MEM_ASYNC_0 (XW) : ORIGIN = 0x20000000, LENGTH = 1M + MEM_ASYNC_1 (XW) : ORIGIN = 0x20100000, LENGTH = 1M + MEM_ASYNC_2 (XW) : ORIGIN = 0x20200000, LENGTH = 1M + MEM_ASYNC_3 (XW) : ORIGIN = 0x20300000, LENGTH = 1M + + MEM_L1_DATA_A (W!X) : ORIGIN = 0xff804000, LENGTH = 16K + MEM_L1_CODE (XR) : ORIGIN = 0xffa08000, LENGTH = 48K + MEM_L1_SCRATCH (W!X) : ORIGIN = 0xffb00000, LENGTH = 4K + + MEM_L2 : ORIGIN = 0xffe00000, LENGTH = 0 /* DUMMY */ + + MEM_SYSMMR (W!X) : ORIGIN = 0xffc00000, LENGTH = 2M + MEM_COREMMR (W!X) : ORIGIN = 0xffe00000, LENGTH = 2M + } +SECTIONS +{ + +/* ADSP-BF533依存のSYSTEM MMR */ + .bss.sysmmr (NOLOAD) : { *.o(PWRMGMT)}> MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(SYSRST)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(WDOG)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(RTC)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(UART)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(SPI)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(TIMER)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0040); *.o(TMRCTL)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(FLAG)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(SPORT0)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(SPORT1)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(EBIU)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(DMATC)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(DMA)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x1000); *.o(PPI)} > MEM_SYSMMR + +/* Blackfin 共有のCORE MMR */ + .bss.coremmr (NOLOAD) : { *.o(DMEMCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(DCPLBA)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(DCPLBD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(DTESTC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(DTESTD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(IMEMCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(ICPLBA)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(ICPLBD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(ITESTC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(ITESTD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(EVT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(CEC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(CTMR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000)+0x1000; *.o(DBG)}> MEM_COREMMR /* 1000飛ばす */ + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(TBCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(TBUF)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(WPICTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); *.o(WPIADDR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); *.o(WPICNT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(WPDCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); *.o(WPDADDR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); *.o(WPDCNT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(WPSTAT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(PFCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(PFCNT)}> MEM_COREMMR + + .comment 0 : { *(.comment) } + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } +} diff --git a/uzume_prototype/genmmrsyms/bf537elf.ld b/uzume_prototype/genmmrsyms/bf537elf.ld new file mode 100644 index 0000000..9636203 --- /dev/null +++ b/uzume_prototype/genmmrsyms/bf537elf.ld @@ -0,0 +1,94 @@ + +OUTPUT_FORMAT("elf32-bfin","elf32-bfin","elf32-bfin") +OUTPUT_ARCH(bfin) + + +MEMORY + { + MEM_SDRAM (XW) : ORIGIN = 0x00000000, LENGTH = 128M + MEM_ASYNC_0 (XW) : ORIGIN = 0x20000000, LENGTH = 1M + MEM_ASYNC_1 (XW) : ORIGIN = 0x20100000, LENGTH = 1M + MEM_ASYNC_2 (XW) : ORIGIN = 0x20200000, LENGTH = 1M + MEM_ASYNC_3 (XW) : ORIGIN = 0x20300000, LENGTH = 1M + + MEM_L1_DATA_A (W!X) : ORIGIN = 0xff800000, LENGTH = 32K + MEM_L1_DATA_B (W!X) : ORIGIN = 0xff900000, LENGTH = 16K + MEM_L1_CODE (XR) : ORIGIN = 0xffa00000, LENGTH = 48K + MEM_L1_SCRATCH (W!X) : ORIGIN = 0xffb00000, LENGTH = 4K + + MEM_L2 : ORIGIN = 0xffe00000, LENGTH = 0 /* DUMMY */ + + MEM_SYSMMR (W!X) : ORIGIN = 0xffc00000, LENGTH = 2M + MEM_COREMMR (W!X) : ORIGIN = 0xffe00000, LENGTH = 2M + } + +SECTIONS +{ + +/* ADSP-BF533依存のSYSTEM MMR */ + .bss.sysmmr (NOLOAD) : { *.o(PWRMGMT)}> MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(SYSRST)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(WDOG)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(RTC)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(UART0)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(SPI)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(TIMER)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0040); *.o(TMRCTL)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(FLAGF)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(SPORT0)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(SPORT1)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(EBIU)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(DMATC)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(DMA)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x1000); *.o(PPI)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0400); *.o(TWI)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0080); *.o(TWIDATA)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(FLAGG)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100)+0x0100; *.o(FLAGH)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x1000); *.o(UART1)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0800)+0x0200; *.o(CANCTL0)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0040); *.o(CANCTL1)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0040); *.o(CANCTL2)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(CANMBX)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x1000); *.o(EMAC)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(EMACR)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0080); *.o(EMACT)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0200); *.o(PORTFER)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); *.o(HDMA0)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0040); *.o(HDMA1)} > MEM_SYSMMR + +/* Blackfin 共有のCORE MMR */ + .bss.coremmr (NOLOAD) : { *.o(DMEMCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(DCPLBA)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(DCPLBD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(DTESTC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(DTESTD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(IMEMCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(ICPLBA)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(ICPLBD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(ITESTC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(ITESTD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(EVT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(CEC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(CTMR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000)+0x1000; *.o(DBG)}> MEM_COREMMR /* 1000飛ばす */ + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(TBCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(TBUF)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(WPICTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); *.o(WPIADDR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); *.o(WPICNT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(WPDCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); *.o(WPDADDR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); *.o(WPDCNT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(WPSTAT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(PFCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(PFCNT)}> MEM_COREMMR + + .comment 0 : { *(.comment) } + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } +} diff --git a/uzume_prototype/genmmrsyms/bf592elf.ld b/uzume_prototype/genmmrsyms/bf592elf.ld new file mode 100644 index 0000000..5dba020 --- /dev/null +++ b/uzume_prototype/genmmrsyms/bf592elf.ld @@ -0,0 +1,160 @@ + +OUTPUT_FORMAT("elf32-bfin","elf32-bfin","elf32-bfin") +OUTPUT_ARCH(bfin) + + +MEMORY + { + + + MEM_SYSMMR (W!X) : ORIGIN = 0xffc00000, LENGTH = 2M + MEM_COREMMR (W!X) : ORIGIN = 0xffe00000, LENGTH = 2M + } + +SECTIONS +{ + + + +/* ADSP-BF518依存のSYSTEM MMR */ + .bss.sysmmr (NOLOAD) : { . = 0x0000; *.o(SYSMMR0)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0100; *.o(SYSMMR1)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x010C; *.o(SYSMMR2)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x014C; *.o(SYSMMR3)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0200; *.o(SYSMMR4)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0300; *.o(SYSMMR5)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0400; *.o(SYSMMR6)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x041C; *.o(SYSMMR7)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0424; *.o(SYSMMR8)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0500; *.o(SYSMMR9)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0600; *.o(SYSMMR10)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0640; *.o(SYSMMR105)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0700; *.o(SYSMMR11)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0800; *.o(SYSMMR12)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0818; *.o(SYSMMR13)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0820; *.o(SYSMMR14)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0900; *.o(SYSMMR15)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0918; *.o(SYSMMR16)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0920; *.o(SYSMMR17)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0A00; *.o(SYSMMR18)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0A10; *.o(SYSMMR19)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0B0C; *.o(SYSMMR20)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C00; *.o(SYSMMR21)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C10; *.o(SYSMMR22)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C38; *.o(SYSMMR23)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C40; *.o(SYSMMR24)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C50; *.o(SYSMMR25)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C78; *.o(SYSMMR26)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C80; *.o(SYSMMR27)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C90; *.o(SYSMMR28)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0CB8; *.o(SYSMMR29)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0CC0; *.o(SYSMMR30)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0CD0; *.o(SYSMMR31)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0CF8; *.o(SYSMMR32)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D00; *.o(SYSMMR33)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D10; *.o(SYSMMR34)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D38; *.o(SYSMMR35)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D40; *.o(SYSMMR36)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D50; *.o(SYSMMR37)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D78; *.o(SYSMMR38)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D80; *.o(SYSMMR39)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D90; *.o(SYSMMR40)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0DB8; *.o(SYSMMR41)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0DC0; *.o(SYSMMR42)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0DD0; *.o(SYSMMR43)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0DF8; *.o(SYSMMR44)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E00; *.o(SYSMMR45)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E10; *.o(SYSMMR46)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E38; *.o(SYSMMR47)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E40; *.o(SYSMMR48)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E50; *.o(SYSMMR49)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E78; *.o(SYSMMR50)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E80; *.o(SYSMMR51)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E90; *.o(SYSMMR52)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0EB8; *.o(SYSMMR53)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0EC0; *.o(SYSMMR54)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0ED0; *.o(SYSMMR55)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0EF8; *.o(SYSMMR56)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F00; *.o(SYSMMR57)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F10; *.o(SYSMMR58)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F38; *.o(SYSMMR59)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F40; *.o(SYSMMR60)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F50; *.o(SYSMMR61)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F78; *.o(SYSMMR62)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F80; *.o(SYSMMR63)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F90; *.o(SYSMMR64)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0FB8; *.o(SYSMMR65)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0FC0; *.o(SYSMMR66)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0FD0; *.o(SYSMMR67)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0FF8; *.o(SYSMMR68)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1000; *.o(SYSMMR69)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1100; *.o(SYSMMR83)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1200; *.o(SYSMMR84)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1300; *.o(SYSMMR91)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1400; *.o(SYSMMR70)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1480; *.o(SYSMMR71)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1500; *.o(SYSMMR72)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1700; *.o(SYSMMR73)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x2000; *.o(SYSMMR74)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x201C; *.o(SYSMMR75)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x2024; *.o(SYSMMR76)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3000; *.o(SYSMMR77)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x302C; *.o(SYSMMR78)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3060; *.o(SYSMMR79)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x30A0; *.o(SYSMMR80)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3100; *.o(SYSMMR81)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3180; *.o(SYSMMR82)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3220; *.o(SYSMMR85)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3240; *.o(SYSMMR86)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3280; *.o(SYSMMR87)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3288; *.o(SYSMMR88)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3300; *.o(SYSMMR89)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3340; *.o(SYSMMR90)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3500; *.o(SYSMMR92)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3620; *.o(SYSMMR93)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3680; *.o(SYSMMR94)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3700; *.o(SYSMMR95)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3800; *.o(SYSMMR96)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3848; *.o(SYSMMR97)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3880; *.o(SYSMMR98)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x38C0; *.o(SYSMMR99)}>MEM_SYSMMR + + + + + +/* Blackfin 共有のCORE MMR */ + .bss.coremmr (NOLOAD) : { *.o(DMEMCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(DCPLBA)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(DCPLBD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(DTESTC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(DTESTD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(IMEMCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(ICPLBA)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(ICPLBD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(ITESTC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(ITESTD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(EVT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(CEC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(CTMR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000)+0x1000; *.o(DBG)}> MEM_COREMMR /* 1000飛ばす */ + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(TBCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(TBUF)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(WPICTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); *.o(WPIADDR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); *.o(WPICNT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(WPDCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); *.o(WPDADDR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); *.o(WPDCNT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(WPSTAT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); *.o(PFCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); *.o(PFCNT)}> MEM_COREMMR + + .comment 0 : { *(.comment) } + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } +} diff --git a/uzume_prototype/genmmrsyms/chip_mmr_bf518.c b/uzume_prototype/genmmrsyms/chip_mmr_bf518.c new file mode 100644 index 0000000..bb5cab7 --- /dev/null +++ b/uzume_prototype/genmmrsyms/chip_mmr_bf518.c @@ -0,0 +1,672 @@ +/* + * ADSP-BF518の System MMR 定義。アドレスの指定は .ldファイルとの組み合わせで行う。 + * .ldファイルのサンプルは、 config/blackfin/ezkit_bf518を参照。 + * + * アドレスが正しく割り当てられているかは、次の方法で検証した. + * + $ cat /opt/uClinux/bfin-elf/bfin-elf/include/def_LPBlackfin.h ../jsp/config/blackfin/_common_bf518/defBF51x_base.h ../jsp/config/blackfin/_common_bf518/defBF518.h | tr '[a-z]' '[A-Z]' | grep '0XFF[CE]0' | grep "#DEFINE" | awk '{print $2, $3}' - | grep 0X | sed 's/0X//' | sort -k 2 > regdef.txt + $ awk '{ print $3,$1 }' jsp.syms | grep _mmr | sed 's/_mmr//p'| sort -k 2 | uniq | tr '[a-z]' '[A-Z]'> regelf.txt + $ diff regelf.txt regdef.txt > diff.txt + +31a32,34 +> RTC_PREN FFC00314 +> UART0_DLL FFC00400 +> UART0_RBR FFC00400 +32a36 +> UART0_DLH FFC00404 +149a154 +> DMA_TCPER FFC00B0C +150a156 +> DMA_TCCNT FFC00B10 +414a421,422 +> UART1_DLL FFC02000 +> UART1_RBR FFC02000 +415a424 +> UART1_DLH FFC02004 +567a577,580 +> OTP_CONTROL FFC03600 +> OTP_BEN FFC03604 +> OTP_STATUS FFC03608 +> OTP_TIMING FFC0360C +619a633 +> DCPLB_FAULT_STATUS FFE00008 +657d670 +< IMEM_DUMMY FFE01000 +658a672 +> CODE_FAULT_STATUS FFE01008 +659a674 +> CODE_FAULT_ADDR FFE0100C +712d726 +< IDUMMY FFE02100 +722d735 +< DBGDUMMY FFE05004 + + * これらのうち、ELF側にだけ存在するレジスタはDUMMYレジスタであり、これはコアレジスタである。 + * ツールのバージョン違いでインクルードファイルの内容が改変されたためであり、無視していい。 + * + * DEF側にだけ存在するレジスタには2種類ある。 + * 1. 他のレジスタのエイリアス + * 2. def***.hには存在するが、cdef***.hには存在しないレジスタ + * + * いずれも小さな問題であり、したがって、上の結果は問題ないと言える。 + * + */ + +volatile unsigned short mmrPLL_CTL __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrPLL_DIV __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrVR_CTL __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrPLL_STAT __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrPLL_LOCKCNT __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned long mmrCHIPID __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrSWRST __attribute ((aligned(4), section("SYSMMR1"))); +volatile unsigned short mmrSYSCR __attribute ((aligned(4), section("SYSMMR1"))); +volatile unsigned long mmrSIC_IMASK0 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IAR0 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IAR1 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IAR2 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IAR3 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_ISR0 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IWR0 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IMASK1 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_IAR4 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_IAR5 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_IAR6 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_IAR7 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_ISR1 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_IWR1 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned short mmrWDOG_CTL __attribute ((aligned(4), section("SYSMMR4"))); +volatile unsigned long mmrWDOG_CNT __attribute ((aligned(4), section("SYSMMR4"))); +volatile unsigned long mmrWDOG_STAT __attribute ((aligned(4), section("SYSMMR4"))); +volatile unsigned long mmrRTC_STAT __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned short mmrRTC_ICTL __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned short mmrRTC_ISTAT __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned short mmrRTC_SWCNT __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned long mmrRTC_ALARM __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned short mmrRTC_FAST __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned short mmrUART0_THR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_IER __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_IIR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_LCR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_MCR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_LSR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_SCR __attribute ((aligned(4), section("SYSMMR7"))); +volatile unsigned short mmrUART0_GCTL __attribute ((aligned(4), section("SYSMMR8"))); +volatile unsigned short mmrSPI0_CTL __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_FLG __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_STAT __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_TDBR __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_RDBR __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_BAUD __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_SHADOW __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrTIMER0_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER0_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER0_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER0_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER1_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER1_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER1_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER1_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER2_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER2_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER2_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER2_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER3_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER3_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER3_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER3_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER4_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER4_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER4_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER4_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER5_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER5_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER5_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER5_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER6_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER6_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER6_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER6_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER7_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER7_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER7_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER7_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER_ENABLE __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER_DISABLE __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER_STATUS __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrPORTFIO __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_CLEAR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_SET __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_TOGGLE __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKA __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKA_CLEAR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKA_SET __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKA_TOGGLE __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKB __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKB_CLEAR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKB_SET __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKB_TOGGLE __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_DIR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_POLAR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_EDGE __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_BOTH __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_INEN __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrSPORT0_TCR1 __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned short mmrSPORT0_TCR2 __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned short mmrSPORT0_TCLKDIV __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned short mmrSPORT0_TFSDIV __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned long mmrSPORT0_TX __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned long mmrSPORT0_RX __attribute ((aligned(4), section("SYSMMR13"))); +volatile unsigned short mmrSPORT0_RCR1 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_RCR2 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_RCLKDIV __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_RFSDIV __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_STAT __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_CHNL __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_MCMC1 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_MCMC2 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MTCS0 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MTCS1 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MTCS2 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MTCS3 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MRCS0 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MRCS1 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MRCS2 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MRCS3 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT1_TCR1 __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned short mmrSPORT1_TCR2 __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned short mmrSPORT1_TCLKDIV __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned short mmrSPORT1_TFSDIV __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned long mmrSPORT1_TX __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned long mmrSPORT1_RX __attribute ((aligned(4), section("SYSMMR16"))); +volatile unsigned short mmrSPORT1_RCR1 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_RCR2 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_RCLKDIV __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_RFSDIV __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_STAT __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_CHNL __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_MCMC1 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_MCMC2 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MTCS0 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MTCS1 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MTCS2 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MTCS3 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MRCS0 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MRCS1 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MRCS2 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MRCS3 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrEBIU_AMGCTL __attribute ((aligned(4), section("SYSMMR18"))); +volatile unsigned long mmrEBIU_AMBCTL0 __attribute ((aligned(4), section("SYSMMR18"))); +volatile unsigned long mmrEBIU_AMBCTL1 __attribute ((aligned(4), section("SYSMMR18"))); +volatile unsigned long mmrEBIU_SDGCTL __attribute ((aligned(4), section("SYSMMR19"))); +volatile unsigned short mmrEBIU_SDBCTL __attribute ((aligned(4), section("SYSMMR19"))); +volatile unsigned short mmrEBIU_SDRRC __attribute ((aligned(4), section("SYSMMR19"))); +volatile unsigned short mmrEBIU_SDSTAT __attribute ((aligned(4), section("SYSMMR19"))); +volatile unsigned short mmrDMA_TC_PER __attribute ((aligned(4), section("SYSMMR20"))); +volatile unsigned short mmrDMA_TC_CNT __attribute ((aligned(4), section("SYSMMR20"))); +volatile unsigned long mmrDMA0_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR21"))); +volatile unsigned long mmrDMA0_START_ADDR __attribute ((aligned(4), section("SYSMMR21"))); +volatile unsigned short mmrDMA0_CONFIG __attribute ((aligned(4), section("SYSMMR21"))); +volatile unsigned short mmrDMA0_X_COUNT __attribute ((aligned(4), section("SYSMMR22"))); +volatile signed short mmrDMA0_X_MODIFY __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_Y_COUNT __attribute ((aligned(4), section("SYSMMR22"))); +volatile signed short mmrDMA0_Y_MODIFY __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned long mmrDMA0_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned long mmrDMA0_CURR_ADDR __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR23"))); +volatile unsigned long mmrDMA1_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR24"))); +volatile unsigned long mmrDMA1_START_ADDR __attribute ((aligned(4), section("SYSMMR24"))); +volatile unsigned short mmrDMA1_CONFIG __attribute ((aligned(4), section("SYSMMR24"))); +volatile unsigned short mmrDMA1_X_COUNT __attribute ((aligned(4), section("SYSMMR25"))); +volatile signed short mmrDMA1_X_MODIFY __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_Y_COUNT __attribute ((aligned(4), section("SYSMMR25"))); +volatile signed short mmrDMA1_Y_MODIFY __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned long mmrDMA1_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned long mmrDMA1_CURR_ADDR __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR26"))); +volatile unsigned long mmrDMA2_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR27"))); +volatile unsigned long mmrDMA2_START_ADDR __attribute ((aligned(4), section("SYSMMR27"))); +volatile unsigned short mmrDMA2_CONFIG __attribute ((aligned(4), section("SYSMMR27"))); +volatile unsigned short mmrDMA2_X_COUNT __attribute ((aligned(4), section("SYSMMR28"))); +volatile signed short mmrDMA2_X_MODIFY __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_Y_COUNT __attribute ((aligned(4), section("SYSMMR28"))); +volatile signed short mmrDMA2_Y_MODIFY __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned long mmrDMA2_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned long mmrDMA2_CURR_ADDR __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR29"))); +volatile unsigned long mmrDMA3_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR30"))); +volatile unsigned long mmrDMA3_START_ADDR __attribute ((aligned(4), section("SYSMMR30"))); +volatile unsigned short mmrDMA3_CONFIG __attribute ((aligned(4), section("SYSMMR30"))); +volatile unsigned short mmrDMA3_X_COUNT __attribute ((aligned(4), section("SYSMMR31"))); +volatile signed short mmrDMA3_X_MODIFY __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_Y_COUNT __attribute ((aligned(4), section("SYSMMR31"))); +volatile signed short mmrDMA3_Y_MODIFY __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned long mmrDMA3_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned long mmrDMA3_CURR_ADDR __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR32"))); +volatile unsigned long mmrDMA4_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR33"))); +volatile unsigned long mmrDMA4_START_ADDR __attribute ((aligned(4), section("SYSMMR33"))); +volatile unsigned short mmrDMA4_CONFIG __attribute ((aligned(4), section("SYSMMR33"))); +volatile unsigned short mmrDMA4_X_COUNT __attribute ((aligned(4), section("SYSMMR34"))); +volatile signed short mmrDMA4_X_MODIFY __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_Y_COUNT __attribute ((aligned(4), section("SYSMMR34"))); +volatile signed short mmrDMA4_Y_MODIFY __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned long mmrDMA4_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned long mmrDMA4_CURR_ADDR __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR35"))); +volatile unsigned long mmrDMA5_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR36"))); +volatile unsigned long mmrDMA5_START_ADDR __attribute ((aligned(4), section("SYSMMR36"))); +volatile unsigned short mmrDMA5_CONFIG __attribute ((aligned(4), section("SYSMMR36"))); +volatile unsigned short mmrDMA5_X_COUNT __attribute ((aligned(4), section("SYSMMR37"))); +volatile signed short mmrDMA5_X_MODIFY __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_Y_COUNT __attribute ((aligned(4), section("SYSMMR37"))); +volatile signed short mmrDMA5_Y_MODIFY __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned long mmrDMA5_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned long mmrDMA5_CURR_ADDR __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR38"))); +volatile unsigned long mmrDMA6_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR39"))); +volatile unsigned long mmrDMA6_START_ADDR __attribute ((aligned(4), section("SYSMMR39"))); +volatile unsigned short mmrDMA6_CONFIG __attribute ((aligned(4), section("SYSMMR39"))); +volatile unsigned short mmrDMA6_X_COUNT __attribute ((aligned(4), section("SYSMMR40"))); +volatile signed short mmrDMA6_X_MODIFY __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_Y_COUNT __attribute ((aligned(4), section("SYSMMR40"))); +volatile signed short mmrDMA6_Y_MODIFY __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned long mmrDMA6_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned long mmrDMA6_CURR_ADDR __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR41"))); +volatile unsigned long mmrDMA7_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR42"))); +volatile unsigned long mmrDMA7_START_ADDR __attribute ((aligned(4), section("SYSMMR42"))); +volatile unsigned short mmrDMA7_CONFIG __attribute ((aligned(4), section("SYSMMR42"))); +volatile unsigned short mmrDMA7_X_COUNT __attribute ((aligned(4), section("SYSMMR43"))); +volatile signed short mmrDMA7_X_MODIFY __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_Y_COUNT __attribute ((aligned(4), section("SYSMMR43"))); +volatile signed short mmrDMA7_Y_MODIFY __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned long mmrDMA7_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned long mmrDMA7_CURR_ADDR __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR44"))); +volatile unsigned long mmrDMA8_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR45"))); +volatile unsigned long mmrDMA8_START_ADDR __attribute ((aligned(4), section("SYSMMR45"))); +volatile unsigned short mmrDMA8_CONFIG __attribute ((aligned(4), section("SYSMMR45"))); +volatile unsigned short mmrDMA8_X_COUNT __attribute ((aligned(4), section("SYSMMR46"))); +volatile signed short mmrDMA8_X_MODIFY __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_Y_COUNT __attribute ((aligned(4), section("SYSMMR46"))); +volatile signed short mmrDMA8_Y_MODIFY __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned long mmrDMA8_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned long mmrDMA8_CURR_ADDR __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR47"))); +volatile unsigned long mmrDMA9_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR48"))); +volatile unsigned long mmrDMA9_START_ADDR __attribute ((aligned(4), section("SYSMMR48"))); +volatile unsigned short mmrDMA9_CONFIG __attribute ((aligned(4), section("SYSMMR48"))); +volatile unsigned short mmrDMA9_X_COUNT __attribute ((aligned(4), section("SYSMMR49"))); +volatile signed short mmrDMA9_X_MODIFY __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned short mmrDMA9_Y_COUNT __attribute ((aligned(4), section("SYSMMR49"))); +volatile signed short mmrDMA9_Y_MODIFY __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned long mmrDMA9_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned long mmrDMA9_CURR_ADDR __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned short mmrDMA9_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned short mmrDMA9_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned short mmrDMA9_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned short mmrDMA9_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR50"))); +volatile unsigned long mmrDMA10_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR51"))); +volatile unsigned long mmrDMA10_START_ADDR __attribute ((aligned(4), section("SYSMMR51"))); +volatile unsigned short mmrDMA10_CONFIG __attribute ((aligned(4), section("SYSMMR51"))); +volatile unsigned short mmrDMA10_X_COUNT __attribute ((aligned(4), section("SYSMMR52"))); +volatile signed short mmrDMA10_X_MODIFY __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned short mmrDMA10_Y_COUNT __attribute ((aligned(4), section("SYSMMR52"))); +volatile signed short mmrDMA10_Y_MODIFY __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned long mmrDMA10_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned long mmrDMA10_CURR_ADDR __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned short mmrDMA10_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned short mmrDMA10_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned short mmrDMA10_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned short mmrDMA10_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR53"))); +volatile unsigned long mmrDMA11_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR54"))); +volatile unsigned long mmrDMA11_START_ADDR __attribute ((aligned(4), section("SYSMMR54"))); +volatile unsigned short mmrDMA11_CONFIG __attribute ((aligned(4), section("SYSMMR54"))); +volatile unsigned short mmrDMA11_X_COUNT __attribute ((aligned(4), section("SYSMMR55"))); +volatile signed short mmrDMA11_X_MODIFY __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned short mmrDMA11_Y_COUNT __attribute ((aligned(4), section("SYSMMR55"))); +volatile signed short mmrDMA11_Y_MODIFY __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned long mmrDMA11_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned long mmrDMA11_CURR_ADDR __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned short mmrDMA11_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned short mmrDMA11_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned short mmrDMA11_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned short mmrDMA11_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR56"))); +volatile unsigned long mmrMDMA_D0_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR57"))); +volatile unsigned long mmrMDMA_D0_START_ADDR __attribute ((aligned(4), section("SYSMMR57"))); +volatile unsigned short mmrMDMA_D0_CONFIG __attribute ((aligned(4), section("SYSMMR57"))); +volatile unsigned short mmrMDMA_D0_X_COUNT __attribute ((aligned(4), section("SYSMMR58"))); +volatile signed short mmrMDMA_D0_X_MODIFY __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_Y_COUNT __attribute ((aligned(4), section("SYSMMR58"))); +volatile signed short mmrMDMA_D0_Y_MODIFY __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned long mmrMDMA_D0_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned long mmrMDMA_D0_CURR_ADDR __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR59"))); +volatile unsigned long mmrMDMA_S0_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR60"))); +volatile unsigned long mmrMDMA_S0_START_ADDR __attribute ((aligned(4), section("SYSMMR60"))); +volatile unsigned short mmrMDMA_S0_CONFIG __attribute ((aligned(4), section("SYSMMR60"))); +volatile unsigned short mmrMDMA_S0_X_COUNT __attribute ((aligned(4), section("SYSMMR61"))); +volatile signed short mmrMDMA_S0_X_MODIFY __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_Y_COUNT __attribute ((aligned(4), section("SYSMMR61"))); +volatile signed short mmrMDMA_S0_Y_MODIFY __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned long mmrMDMA_S0_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned long mmrMDMA_S0_CURR_ADDR __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR62"))); +volatile unsigned long mmrMDMA_D1_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR63"))); +volatile unsigned long mmrMDMA_D1_START_ADDR __attribute ((aligned(4), section("SYSMMR63"))); +volatile unsigned short mmrMDMA_D1_CONFIG __attribute ((aligned(4), section("SYSMMR63"))); +volatile unsigned short mmrMDMA_D1_X_COUNT __attribute ((aligned(4), section("SYSMMR64"))); +volatile signed short mmrMDMA_D1_X_MODIFY __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_Y_COUNT __attribute ((aligned(4), section("SYSMMR64"))); +volatile signed short mmrMDMA_D1_Y_MODIFY __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned long mmrMDMA_D1_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned long mmrMDMA_D1_CURR_ADDR __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR65"))); +volatile unsigned long mmrMDMA_S1_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR66"))); +volatile unsigned long mmrMDMA_S1_START_ADDR __attribute ((aligned(4), section("SYSMMR66"))); +volatile unsigned short mmrMDMA_S1_CONFIG __attribute ((aligned(4), section("SYSMMR66"))); +volatile unsigned short mmrMDMA_S1_X_COUNT __attribute ((aligned(4), section("SYSMMR67"))); +volatile signed short mmrMDMA_S1_X_MODIFY __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_Y_COUNT __attribute ((aligned(4), section("SYSMMR67"))); +volatile signed short mmrMDMA_S1_Y_MODIFY __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned long mmrMDMA_S1_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned long mmrMDMA_S1_CURR_ADDR __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR68"))); +volatile unsigned short mmrPPI_CONTROL __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrPPI_STATUS __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrPPI_COUNT __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrPPI_DELAY __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrPPI_FRAME __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrTWI_CLKDIV __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_CONTROL __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_SLAVE_CTL __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_SLAVE_STAT __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_SLAVE_ADDR __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_MASTER_CTL __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_MASTER_STAT __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_MASTER_ADDR __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_INT_STAT __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_INT_MASK __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_FIFO_CTL __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_FIFO_STAT __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_XMT_DATA8 __attribute ((aligned(4), section("SYSMMR71"))); +volatile unsigned short mmrTWI_XMT_DATA16 __attribute ((aligned(4), section("SYSMMR71"))); +volatile unsigned short mmrTWI_RCV_DATA8 __attribute ((aligned(4), section("SYSMMR71"))); +volatile unsigned short mmrTWI_RCV_DATA16 __attribute ((aligned(4), section("SYSMMR71"))); +volatile unsigned short mmrPORTGIO __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_CLEAR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_SET __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_TOGGLE __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKA __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKA_CLEAR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKA_SET __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKA_TOGGLE __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKB __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKB_CLEAR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKB_SET __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKB_TOGGLE __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_DIR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_POLAR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_EDGE __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_BOTH __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_INEN __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTHIO __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_CLEAR __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_SET __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_TOGGLE __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKA __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKA_CLEAR __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKA_SET __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKA_TOGGLE __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKB __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKB_CLEAR __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKB_SET __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKB_TOGGLE __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_DIR __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_POLAR __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_EDGE __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_BOTH __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_INEN __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrUART1_THR __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_IER __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_IIR __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_LCR __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_MCR __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_LSR __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_SCR __attribute ((aligned(4), section("SYSMMR75"))); +volatile unsigned short mmrUART1_GCTL __attribute ((aligned(4), section("SYSMMR76"))); +volatile unsigned long mmrEMAC_OPMODE __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_ADDRLO __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_ADDRHI __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_HASHLO __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_HASHHI __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_STAADD __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_STADAT __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_FLC __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_VLAN1 __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_VLAN2 __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_WKUP_CTL __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK0 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK1 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK2 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK3 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFCMD __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFOFF __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFCRC0 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFCRC1 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_SYSCTL __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_SYSTAT __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_RX_STAT __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_RX_STKY __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_RX_IRQE __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_TX_STAT __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_TX_STKY __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_TX_IRQE __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_MMC_CTL __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_MMC_RIRQS __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_MMC_RIRQE __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_MMC_TIRQS __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_MMC_TIRQE __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned short mmrEMAC_PTP_CTL __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned short mmrEMAC_PTP_IE __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned short mmrEMAC_PTP_ISTAT __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_FOFF __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_FV1 __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_FV2 __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_FV3 __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_ADDEND __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_ACCR __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_OFFSET __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_TIMELO __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_TIMEHI __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_RXSNAPLO __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_RXSNAPHI __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_TXSNAPLO __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_TXSNAPHI __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_ALARMLO __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_ALARMHI __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned short mmrEMAC_PTP_ID_OFF __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_ID_SNAP __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_PPS_STARTLOP __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_PPS_STARTHIP __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_PPS_PERIOD __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_RXC_OK __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_FCS __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_ALIGN __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_OCTET __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_DMAOVF __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_UNICST __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_MULTI __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_BROAD __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LNERRI __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LNERRO __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LONG __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_MACCTL __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_OPCODE __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_PAUSE __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_ALLFRM __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_ALLOCT __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_TYPED __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_SHORT __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_EQ64 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LT128 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LT256 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LT512 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LT1024 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_GE1024 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_TXC_OK __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_1COL __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_GT1COL __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_OCTET __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_DEFER __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_LATECL __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_XS_COL __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_DMAUND __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_CRSERR __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_UNICST __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_MULTI __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_BROAD __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_XS_DFR __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_MACCTL __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_ALLFRM __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_ALLOCT __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_EQ64 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_LT128 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_LT256 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_LT512 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_LT1024 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_GE1024 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_ABORT __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned short mmrPORTF_FER __attribute ((aligned(4), section("SYSMMR83"))); +volatile unsigned short mmrPORTG_FER __attribute ((aligned(4), section("SYSMMR83"))); +volatile unsigned short mmrPORTH_FER __attribute ((aligned(4), section("SYSMMR83"))); +volatile unsigned short mmrPORTF_MUX __attribute ((aligned(4), section("SYSMMR84"))); +volatile unsigned short mmrPORTG_MUX __attribute ((aligned(4), section("SYSMMR84"))); +volatile unsigned short mmrPORTH_MUX __attribute ((aligned(4), section("SYSMMR84"))); +volatile unsigned short mmrPORTF_DRIVE __attribute ((aligned(4), section("SYSMMR85"))); +volatile unsigned short mmrPORTG_DRIVE __attribute ((aligned(4), section("SYSMMR85"))); +volatile unsigned short mmrPORTH_DRIVE __attribute ((aligned(4), section("SYSMMR85"))); +volatile unsigned short mmrPORTF_HYSTERESIS __attribute ((aligned(4), section("SYSMMR86"))); +volatile unsigned short mmrPORTG_HYSTERESIS __attribute ((aligned(4), section("SYSMMR86"))); +volatile unsigned short mmrPORTH_HYSTERESIS __attribute ((aligned(4), section("SYSMMR86"))); +volatile unsigned short mmrNONGPIO_DRIVE __attribute ((aligned(4), section("SYSMMR87"))); +volatile unsigned short mmrNONGPIO_HYSTERESIS __attribute ((aligned(4), section("SYSMMR88"))); +volatile unsigned short mmrHMDMA0_CONTROL __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_ECINIT __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_BCINIT __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_ECURGENT __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_ECOVERFLOW __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_ECOUNT __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_BCOUNT __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA1_CONTROL __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_ECINIT __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_BCINIT __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_ECURGENT __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_ECOVERFLOW __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_ECOUNT __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_BCOUNT __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrSPI1_CTL __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_FLG __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_STAT __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_TDBR __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_RDBR __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_BAUD __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_SHADOW __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrCNT_CONFIG __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned short mmrCNT_IMASK __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned short mmrCNT_STATUS __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned short mmrCNT_COMMAND __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned short mmrCNT_DEBOUNCE __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned long mmrCNT_COUNTER __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned long mmrCNT_MAX __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned long mmrCNT_MIN __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned long mmrSECURE_SYSSWT __attribute ((aligned(4), section("SYSMMR93"))); +volatile unsigned short mmrSECURE_CONTROL __attribute ((aligned(4), section("SYSMMR93"))); +volatile unsigned short mmrSECURE_STATUS __attribute ((aligned(4), section("SYSMMR93"))); +volatile unsigned long mmrOTP_DATA0 __attribute ((aligned(4), section("SYSMMR94"))); +volatile unsigned long mmrOTP_DATA1 __attribute ((aligned(4), section("SYSMMR94"))); +volatile unsigned long mmrOTP_DATA2 __attribute ((aligned(4), section("SYSMMR94"))); +volatile unsigned long mmrOTP_DATA3 __attribute ((aligned(4), section("SYSMMR94"))); +volatile unsigned short mmrPWM_CTRL __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_STAT __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_TM __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_DT __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_GATE __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHA __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHB __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHC __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_SEG __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_SYNCWT __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHAL __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHBL __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHCL __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_LSI __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_STAT2 __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrRSI_PWR_CONTROL __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_CLK_CONTROL __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_ARGUMENT __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_COMMAND __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_RESP_CMD __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_RESPONSE0 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_RESPONSE1 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_RESPONSE2 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_RESPONSE3 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_DATA_TIMER __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_DATA_LGTH __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_DATA_CONTROL __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_DATA_CNT __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_STATUS __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_STATUSCL __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_MASK0 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_MASK1 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_FIFO_CNT __attribute ((aligned(4), section("SYSMMR97"))); +volatile unsigned short mmrRSI_CEATA_CONTROL __attribute ((aligned(4), section("SYSMMR97"))); +volatile unsigned long mmrRSI_FIFO __attribute ((aligned(4), section("SYSMMR98"))); +volatile unsigned short mmrRSI_ESTAT __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_EMASK __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_CONFIG __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_RD_WAIT_EN __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_PID0 __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_PID1 __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_PID2 __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_PID3 __attribute ((aligned(4), section("SYSMMR99"))); + diff --git a/uzume_prototype/genmmrsyms/chip_mmr_bf533.c b/uzume_prototype/genmmrsyms/chip_mmr_bf533.c new file mode 100644 index 0000000..75c369a --- /dev/null +++ b/uzume_prototype/genmmrsyms/chip_mmr_bf533.c @@ -0,0 +1,413 @@ +/* + * ADSP-BF533の System MMR 定義。アドレスの指定は .ldファイルとの組み合わせで行う。 + * .ldファイルのサンプルは、 config/blackfin/bf533cbを参照。 + * + * アドレスが正しく割り当てられているかは、次の方法で検証した. + * (Makefileの$(OBJCOPY) -R .sysmmr -R .coremmr jsp をコメントアウトすること) + * +$ readelf -s -W jsp | grep mmr | grep -v DUMMY | grep -v blackfin | sort -k 2 | awk '/_mmr/{print $8, $2}' - | sed 's/_mmr//p' | uniq > regelf.txt +$ cat ../jsp/config/blackfin/def_lpblackfin.h ../jsp/config/blackfin/defbf532.h | grep '0xFF[CE]0' | grep "#define" | sed 's/_MA /_MAP /' - | awk '{print $2,$3}' - | sort -k 2 | sed 's/0x//' - > regdef.txt +$ diff -i -w regelf.txt regdef.txt +24a25,27 +> RTC_PREN FFC00314 +> UART_DLL FFC00400 +> UART_RBR FFC00400 +25a29 +> UART_DLH FFC00404 +123a128 +> DMA_TCPER FFC00B0C +124a130 +> DMA_TCCNT FFC00B10 +288a295 +> DCPLB_FAULT_STATUS FFE00008 +326a334 +> CODE_FAULT_STATUS FFE01008 +327a336 +> CODE_FAULT_ADDR FFE0100C + + + * + * つまり、いくつかのレジスタの宣言がELF側から抜けていることになる。ここで、 + * それぞれのレジスタは別のレジスタのエイリアスであることに注目する。 + * RTC_PREN -> RTC_FAST + * UART_DLL -> UART_THR + * UART_RBR -> UART_THR + * UART_DLH -> UART_IER + * DMA_TCPER -> DMA_TC_PER + * DMA_TCCNT -> DMA_TC_CNT + * + * したがって、上の結果は問題ないと言える。 + * + */ + + +volatile unsigned short mmrPLL_CTL __attribute__ ((aligned(4), section("PWRMGMT"))); +volatile unsigned short mmrPLL_DIV __attribute__ ((aligned(4), section("PWRMGMT"))); +volatile unsigned short mmrVR_CTL __attribute__ ((aligned(4), section("PWRMGMT"))); +volatile unsigned short mmrPLL_STAT __attribute__ ((aligned(4), section("PWRMGMT"))); +volatile unsigned short mmrPLL_LOCKCNT __attribute__ ((aligned(4), section("PWRMGMT"))); +volatile unsigned short mmrCHIPID __attribute__ ((aligned(4), section("PWRMGMT"))); + +volatile unsigned short mmrSWRST __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned short mmrSYSCR __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_RVECT __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IMASK __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IAR0 __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IAR1 __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IAR2 __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IARDUMMY __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_ISR __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IWR __attribute__ ((aligned(4), section("SYSRST"))); + +volatile unsigned short mmrWDOG_CTL __attribute__ ((aligned(4), section("WDOG"))); +volatile unsigned long mmrWDOG_CNT __attribute__ ((aligned(4), section("WDOG"))); +volatile unsigned long mmrWDOG_STAT __attribute__ ((aligned(4), section("WDOG"))); + +volatile unsigned long mmrRTC_STAT __attribute__ ((aligned(4), section("RTC"))); +volatile unsigned short mmrRTC_ICTL __attribute__ ((aligned(4), section("RTC"))); +volatile unsigned short mmrRTC_ISTAT __attribute__ ((aligned(4), section("RTC"))); +volatile unsigned short mmrRTC_SWCNT __attribute__ ((aligned(4), section("RTC"))); +volatile unsigned long mmrRTC_ALARM __attribute__ ((aligned(4), section("RTC"))); +volatile unsigned short mmrRTC_FAST __attribute__ ((aligned(4), section("RTC"))); + +volatile unsigned short mmrUART_THR __attribute__ ((aligned(4), section("UART"))); +volatile unsigned short mmrUART_IER __attribute__ ((aligned(4), section("UART"))); +volatile unsigned short mmrUART_IIR __attribute__ ((aligned(4), section("UART"))); +volatile unsigned short mmrUART_LCR __attribute__ ((aligned(4), section("UART"))); +volatile unsigned short mmrUART_MCR __attribute__ ((aligned(4), section("UART"))); +volatile unsigned short mmrUART_LSR __attribute__ ((aligned(4), section("UART"))); +volatile unsigned short mmrUART_MSR __attribute__ ((aligned(4), section("UART"))); +volatile unsigned short mmrUART_SCR __attribute__ ((aligned(4), section("UART"))); +volatile unsigned short mmrUART_DUMMY0 __attribute__ ((aligned(4), section("UART"))); +volatile unsigned short mmrUART_GCTL __attribute__ ((aligned(4), section("UART"))); + +volatile unsigned short mmrSPI_CTL __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_FLG __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_STAT __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_TDBR __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_RDBR __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_BAUD __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_SHADOW __attribute__ ((aligned(4), section("SPI"))); + +volatile unsigned short mmrTIMER0_CONFIG __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER0_COUNTER __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER0_PERIOD __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER0_WIDTH __attribute__ ((aligned(4), section("TIMER"))); + +volatile unsigned short mmrTIMER1_CONFIG __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER1_COUNTER __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER1_PERIOD __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER1_WIDTH __attribute__ ((aligned(4), section("TIMER"))); + +volatile unsigned short mmrTIMER2_CONFIG __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER2_COUNTER __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER2_PERIOD __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER2_WIDTH __attribute__ ((aligned(4), section("TIMER"))); + +volatile unsigned short mmrTIMER_ENABLE __attribute__ ((aligned(4), section("TMRCTL"))); +volatile unsigned short mmrTIMER_DISABLE __attribute__ ((aligned(4), section("TMRCTL"))); +volatile unsigned short mmrTIMER_STATUS __attribute__ ((aligned(4), section("TMRCTL"))); + + +volatile unsigned short mmrFIO_FLAG_D __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_FLAG_C __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_FLAG_S __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_FLAG_T __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_MASKA_D __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_MASKA_C __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_MASKA_S __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_MASKA_T __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_MASKB_D __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_MASKB_C __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_MASKB_S __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_MASKB_T __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_DIR __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_POLAR __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_EDGE __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_BOTH __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_INEN __attribute__ ((aligned(4), section("FLAG"))); + + + +volatile unsigned short mmrSPORT0_TCR1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_TCR2 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_TCLKDIV __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_TFSDIV __attribute__ ((aligned(4), section("SPORT0"))); +volatile long mmrSPORT0_TX __attribute__ ((aligned(4), section("SPORT0"))); +volatile long mmrSPORT0_DUMMY0 __attribute__ ((aligned(4), section("SPORT0"))); +volatile long mmrSPORT0_RX __attribute__ ((aligned(4), section("SPORT0"))); +volatile long mmrSPORT0_DUMMY1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_RCR1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_RCR2 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_RCLKDIV __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_RFSDIV __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_STAT __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_CHNL __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_MCMC1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_MCMC2 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MTCS0 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MTCS1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MTCS2 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MTCS3 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MRCS0 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MRCS1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MRCS2 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MRCS3 __attribute__ ((aligned(4), section("SPORT0"))); + + +volatile unsigned short mmrSPORT1_TCR1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_TCR2 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_TCLKDIV __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_TFSDIV __attribute__ ((aligned(4), section("SPORT1"))); +volatile long mmrSPORT1_TX __attribute__ ((aligned(4), section("SPORT1"))); +volatile long mmrSPORT1_DUMMY0 __attribute__ ((aligned(4), section("SPORT1"))); +volatile long mmrSPORT1_RX __attribute__ ((aligned(4), section("SPORT1"))); +volatile long mmrSPORT1_DUMMY1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_RCR1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_RCR2 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_RCLKDIV __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_RFSDIV __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_STAT __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_CHNL __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_MCMC1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_MCMC2 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MTCS0 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MTCS1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MTCS2 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MTCS3 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MRCS0 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MRCS1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MRCS2 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MRCS3 __attribute__ ((aligned(4), section("SPORT1"))); + + + +volatile unsigned short mmrEBIU_AMGCTL __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned long mmrEBIU_AMBCTL0 __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned long mmrEBIU_AMBCTL1 __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned long mmrEBIU_DUMMY0 __attribute__ ((aligned(4), section("EBIU"))); + + +volatile unsigned long mmrEBIU_SDGCTL __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned short mmrEBIU_SDBCTL __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned short mmrEBIU_SDRRC __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned short mmrEBIU_SDSTAT __attribute__ ((aligned(4), section("EBIU"))); + + + +volatile unsigned short mmrDMA_TC_DUMMY0 __attribute__ ((aligned(4), section("DMATC"))); +volatile unsigned short mmrDMA_TC_DUMMY1 __attribute__ ((aligned(4), section("DMATC"))); +volatile unsigned short mmrDMA_TC_DUMMY3 __attribute__ ((aligned(4), section("DMATC"))); +volatile unsigned short mmrDMA_TC_PER __attribute__ ((aligned(4), section("DMATC"))); +volatile unsigned short mmrDMA_TC_CNT __attribute__ ((aligned(4), section("DMATC"))); + + +volatile void * volatile mmrDMA0_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA0_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA0_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA0_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA0_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA0_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA1_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA1_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA1_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA1_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA1_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA1_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA2_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA2_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA2_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA2_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA2_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA2_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA3_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA3_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA3_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA3_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA3_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA3_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA4_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA4_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA4_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA4_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA4_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA4_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA5_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA5_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA5_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA5_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA5_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA5_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA6_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA6_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA6_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA6_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA6_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA6_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA7_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA7_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA7_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA7_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA7_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA7_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrMDMA_D0_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D0_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_D0_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_D0_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D0_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D0_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrMDMA_S0_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S0_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_S0_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_S0_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S0_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S0_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrMDMA_D1_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D1_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_D1_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_D1_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D1_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D1_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrMDMA_S1_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S1_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_S1_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_S1_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S1_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S1_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile unsigned short mmrPPI_CONTROL __attribute__ ((aligned(4), section("PPI"))); +volatile unsigned short mmrPPI_STATUS __attribute__ ((aligned(4), section("PPI"))); +volatile unsigned short mmrPPI_COUNT __attribute__ ((aligned(4), section("PPI"))); +volatile unsigned short mmrPPI_DELAY __attribute__ ((aligned(4), section("PPI"))); +volatile unsigned short mmrPPI_FRAME __attribute__ ((aligned(4), section("PPI"))); diff --git a/uzume_prototype/genmmrsyms/chip_mmr_bf537.c b/uzume_prototype/genmmrsyms/chip_mmr_bf537.c new file mode 100644 index 0000000..74d7146 --- /dev/null +++ b/uzume_prototype/genmmrsyms/chip_mmr_bf537.c @@ -0,0 +1,1117 @@ +/* + * ADSP-BF537の System MMR 定義。アドレスの指定は .ldファイルとの組み合わせで行う。 + * .ldファイルのサンプルは、 config/blackfin/ezkit_bf537を参照。 + * + * アドレスが正しく割り当てられているかは、次の方法で検証した. + * (Makefileの$(OBJCOPY) -R .sysmmr -R .coremmr jsp をコメントアウトすること) + * +$ readelf -s -W jsp | grep mmr | grep -v DUMMY | grep -v blackfin | sort -k 2 | awk '/_mmr/{print $8, $2}' - | sed 's/_mmr//p' | uniq > regelf.txt +$ cat ../jsp/config/blackfin/def_lpblackfin.h ../jsp/config/blackfin/defbf537.h ../jsp/config/blackfin/defbf534.h | grep '0xFF[CE]0' | grep "#define" | sed 's/_MA /_MAP /' - | awk '{print $2,$3}' - | sort -k 2 | sed 's/0x//' - > regdef.txt +$ diff -i -w regelf.txt regdef.txt + +24a25,27 +> RTC_PREN FFC00314 +> UART0_DLL FFC00400 +> UART0_RBR FFC00400 +25a29 +> UART0_DLH FFC00404 +143a148 +> DMA_TCPER FFC00B0C +144a150 +> DMA_TCCNT FFC00B10 +408a415,416 +> UART1_DLL FFC02000 +> UART1_RBR FFC02000 +409a418 +> UART1_DLH FFC02004 +879a889 +> DCPLB_FAULT_STATUS FFE00008 +917a928 +> CODE_FAULT_STATUS FFE01008 +918a930 +> CODE_FAULT_ADDR FFE0100C + * + * つまり、いくつかのレジスタの宣言がELF側から抜けていることになる。ここで、 + * それぞれのレジスタは別のレジスタのエイリアスであることに注目する。 + * RTC_PREN -> RTC_FAST + * UARTx_DLL -> UARTx_THR + * UARTx_RBR -> UARTx_THR + * UARTx_DLH -> UARTx_IER + * DMA_TCPER -> DMA_TC_PER + * DMA_TCCNT -> DMA_TC_CNT + * + * したがって、上の結果は問題ないと言える。 + * + */ + + +volatile unsigned short mmrPLL_CTL __attribute__ ((aligned(4), section("PWRMGMT"))); +volatile unsigned short mmrPLL_DIV __attribute__ ((aligned(4), section("PWRMGMT"))); +volatile unsigned short mmrVR_CTL __attribute__ ((aligned(4), section("PWRMGMT"))); +volatile unsigned short mmrPLL_STAT __attribute__ ((aligned(4), section("PWRMGMT"))); +volatile unsigned short mmrPLL_LOCKCNT __attribute__ ((aligned(4), section("PWRMGMT"))); + + + +volatile unsigned short mmrSWRST __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned short mmrSYSCR __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_RVECT __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IMASK __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IAR0 __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IAR1 __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IAR2 __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IAR3 __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_ISR __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IWR __attribute__ ((aligned(4), section("SYSRST"))); + + + +volatile unsigned short mmrWDOG_CTL __attribute__ ((aligned(4), section("WDOG"))); +volatile unsigned long mmrWDOG_CNT __attribute__ ((aligned(4), section("WDOG"))); +volatile unsigned long mmrWDOG_STAT __attribute__ ((aligned(4), section("WDOG"))); + + + +volatile unsigned long mmrRTC_STAT __attribute__ ((aligned(4), section("RTC"))); +volatile unsigned short mmrRTC_ICTL __attribute__ ((aligned(4), section("RTC"))); +volatile unsigned short mmrRTC_ISTAT __attribute__ ((aligned(4), section("RTC"))); +volatile unsigned short mmrRTC_SWCNT __attribute__ ((aligned(4), section("RTC"))); +volatile unsigned long mmrRTC_ALARM __attribute__ ((aligned(4), section("RTC"))); +volatile unsigned short mmrRTC_FAST __attribute__ ((aligned(4), section("RTC"))); + + + +volatile unsigned short mmrUART0_THR __attribute__ ((aligned(4), section("UART0"))); +volatile unsigned short mmrUART0_IER __attribute__ ((aligned(4), section("UART0"))); +volatile unsigned short mmrUART0_IIR __attribute__ ((aligned(4), section("UART0"))); +volatile unsigned short mmrUART0_LCR __attribute__ ((aligned(4), section("UART0"))); +volatile unsigned short mmrUART0_MCR __attribute__ ((aligned(4), section("UART0"))); +volatile unsigned short mmrUART0_LSR __attribute__ ((aligned(4), section("UART0"))); +volatile unsigned short mmrUART0_MSR __attribute__ ((aligned(4), section("UART0"))); +volatile unsigned short mmrUART0_SCR __attribute__ ((aligned(4), section("UART0"))); +volatile unsigned short mmrUART0_DUMMY0 __attribute__ ((aligned(4), section("UART0"))); +volatile unsigned short mmrUART0_GCTL __attribute__ ((aligned(4), section("UART0"))); + + + +volatile unsigned short mmrSPI_CTL __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_FLG __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_STAT __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_TDBR __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_RDBR __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_BAUD __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_SHADOW __attribute__ ((aligned(4), section("SPI"))); + + + +volatile unsigned short mmrTIMER0_CONFIG __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER0_COUNTER __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER0_PERIOD __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER0_WIDTH __attribute__ ((aligned(4), section("TIMER"))); + +volatile unsigned short mmrTIMER1_CONFIG __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER1_COUNTER __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER1_PERIOD __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER1_WIDTH __attribute__ ((aligned(4), section("TIMER"))); + +volatile unsigned short mmrTIMER2_CONFIG __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER2_COUNTER __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER2_PERIOD __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER2_WIDTH __attribute__ ((aligned(4), section("TIMER"))); + +volatile unsigned short mmrTIMER3_CONFIG __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER3_COUNTER __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER3_PERIOD __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER3_WIDTH __attribute__ ((aligned(4), section("TIMER"))); + +volatile unsigned short mmrTIMER4_CONFIG __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER4_COUNTER __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER4_PERIOD __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER4_WIDTH __attribute__ ((aligned(4), section("TIMER"))); + +volatile unsigned short mmrTIMER5_CONFIG __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER5_COUNTER __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER5_PERIOD __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER5_WIDTH __attribute__ ((aligned(4), section("TIMER"))); + +volatile unsigned short mmrTIMER6_CONFIG __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER6_COUNTER __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER6_PERIOD __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER6_WIDTH __attribute__ ((aligned(4), section("TIMER"))); + +volatile unsigned short mmrTIMER7_CONFIG __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER7_COUNTER __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER7_PERIOD __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER7_WIDTH __attribute__ ((aligned(4), section("TIMER"))); + +volatile unsigned short mmrTIMER_ENABLE __attribute__ ((aligned(4), section("TMRCTL"))); +volatile unsigned short mmrTIMER_DISABLE __attribute__ ((aligned(4), section("TMRCTL"))); +volatile unsigned long mmrTIMER_STATUS __attribute__ ((aligned(4), section("TMRCTL"))); + + + +volatile unsigned short mmrPORTFIO __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_CLEAR __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_SET __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_TOGGLE __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_MASKA __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_MASKA_CLEAR __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_MASKA_SET __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_MASKA_TOGGLE __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_MASKB __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_MASKB_CLEAR __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_MASKB_SET __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_MASKB_TOGGLE __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_DIR __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_POLAR __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_EDGE __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_BOTH __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_INEN __attribute__ ((aligned(4), section("FLAGF"))); + + + +volatile unsigned short mmrSPORT0_TCR1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_TCR2 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_TCLKDIV __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_TFSDIV __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_TX __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_DUMMY0 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_RX __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_DUMMY1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_RCR1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_RCR2 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_RCLKDIV __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_RFSDIV __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_STAT __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_CHNL __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_MCMC1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_MCMC2 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MTCS0 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MTCS1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MTCS2 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MTCS3 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MRCS0 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MRCS1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MRCS2 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MRCS3 __attribute__ ((aligned(4), section("SPORT0"))); + + + +volatile unsigned short mmrSPORT1_TCR1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_TCR2 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_TCLKDIV __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_TFSDIV __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_TX __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_DUMMY0 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_RX __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_DUMMY1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_RCR1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_RCR2 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_RCLKDIV __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_RFSDIV __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_STAT __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_CHNL __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_MCMC1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_MCMC2 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MTCS0 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MTCS1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MTCS2 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MTCS3 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MRCS0 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MRCS1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MRCS2 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MRCS3 __attribute__ ((aligned(4), section("SPORT1"))); + + + +volatile unsigned short mmrEBIU_AMGCTL __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned long mmrEBIU_AMBCTL0 __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned long mmrEBIU_AMBCTL1 __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned short mmrEBIU_DUMMY __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned long mmrEBIU_SDGCTL __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned short mmrEBIU_SDBCTL __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned short mmrEBIU_SDRRC __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned short mmrEBIU_SDSTAT __attribute__ ((aligned(4), section("EBIU"))); + + + +volatile unsigned short mmrDMA_TC_DUMMY0 __attribute__ ((aligned(4), section("DMATC"))); +volatile unsigned short mmrDMA_TC_DUMMY1 __attribute__ ((aligned(4), section("DMATC"))); +volatile unsigned short mmrDMA_TC_DUMMY3 __attribute__ ((aligned(4), section("DMATC"))); +volatile unsigned short mmrDMA_TC_PER __attribute__ ((aligned(4), section("DMATC"))); +volatile unsigned short mmrDMA_TC_CNT __attribute__ ((aligned(4), section("DMATC"))); + + + +volatile void * volatile mmrDMA0_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA0_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA0_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA0_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA0_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA0_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA1_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA1_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA1_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA1_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA1_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA1_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA2_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA2_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA2_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA2_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA2_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA2_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA3_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA3_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA3_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA3_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA3_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA3_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA4_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA4_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA4_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA4_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA4_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA4_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA5_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA5_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA5_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA5_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA5_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA5_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA6_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA6_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA6_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA6_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA6_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA6_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA7_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA7_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA7_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA7_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA7_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA7_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA8_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA8_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA8_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA8_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA8_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA8_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA8_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA8_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA8_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA8_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA8_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA8_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA8_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA8_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA8_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA8_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA9_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA9_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA9_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA9_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA9_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA9_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA9_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA9_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA9_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA9_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA9_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA9_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA9_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA9_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA9_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA9_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA10_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA10_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA10_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA10_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA10_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA10_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA10_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA10_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA10_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA10_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA10_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA10_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA10_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA10_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA10_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA10_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA11_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA11_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA11_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA11_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA11_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA11_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA11_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA11_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA11_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA11_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA11_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA11_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA11_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA11_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA11_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA11_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrMDMA_D0_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D0_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_D0_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_D0_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D0_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D0_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrMDMA_S0_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S0_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_S0_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_S0_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S0_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S0_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrMDMA_D1_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D1_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_D1_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_D1_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D1_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D1_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrMDMA_S1_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S1_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_S1_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_S1_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S1_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S1_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + + +volatile unsigned short mmrPPI_CONTROL __attribute__ ((aligned(4), section("PPI"))); +volatile unsigned short mmrPPI_STATUS __attribute__ ((aligned(4), section("PPI"))); +volatile unsigned short mmrPPI_COUNT __attribute__ ((aligned(4), section("PPI"))); +volatile unsigned short mmrPPI_DELAY __attribute__ ((aligned(4), section("PPI"))); +volatile unsigned short mmrPPI_FRAME __attribute__ ((aligned(4), section("PPI"))); + + +volatile unsigned short mmrTWI_CLKDIV __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_CONTROL __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_SLAVE_CTL __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_SLAVE_STAT __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_SLAVE_ADDR __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_MASTER_CTL __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_MASTER_STAT __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_MASTER_ADDR __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_INT_STAT __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_INT_MASK __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_FIFO_CTL __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_FIFO_STAT __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_XMT_DATA8 __attribute__ ((aligned(4), section("TWIDATA"))); +volatile unsigned short mmrTWI_XMT_DATA16 __attribute__ ((aligned(4), section("TWIDATA"))); +volatile unsigned short mmrTWI_RCV_DATA8 __attribute__ ((aligned(4), section("TWIDATA"))); +volatile unsigned short mmrTWI_RCV_DATA16 __attribute__ ((aligned(4), section("TWIDATA"))); + + + +volatile unsigned short mmrPORTGIO __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_CLEAR __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_SET __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_TOGGLE __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_MASKA __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_MASKA_CLEAR __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_MASKA_SET __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_MASKA_TOGGLE __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_MASKB __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_MASKB_CLEAR __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_MASKB_SET __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_MASKB_TOGGLE __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_DIR __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_POLAR __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_EDGE __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_BOTH __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_INEN __attribute__ ((aligned(4), section("FLAGG"))); + + + +volatile unsigned short mmrPORTHIO __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_CLEAR __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_SET __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_TOGGLE __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_MASKA __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_MASKA_CLEAR __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_MASKA_SET __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_MASKA_TOGGLE __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_MASKB __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_MASKB_CLEAR __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_MASKB_SET __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_MASKB_TOGGLE __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_DIR __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_POLAR __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_EDGE __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_BOTH __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_INEN __attribute__ ((aligned(4), section("FLAGH"))); + + + +volatile unsigned short mmrUART1_THR __attribute__ ((aligned(4), section("UART1"))); +volatile unsigned short mmrUART1_IER __attribute__ ((aligned(4), section("UART1"))); +volatile unsigned short mmrUART1_IIR __attribute__ ((aligned(4), section("UART1"))); +volatile unsigned short mmrUART1_LCR __attribute__ ((aligned(4), section("UART1"))); +volatile unsigned short mmrUART1_MCR __attribute__ ((aligned(4), section("UART1"))); +volatile unsigned short mmrUART1_LSR __attribute__ ((aligned(4), section("UART1"))); +volatile unsigned short mmrUART1_MSR __attribute__ ((aligned(4), section("UART1"))); +volatile unsigned short mmrUART1_SCR __attribute__ ((aligned(4), section("UART1"))); +volatile unsigned short mmrUART1_DUMMY0 __attribute__ ((aligned(4), section("UART1"))); +volatile unsigned short mmrUART1_GCTL __attribute__ ((aligned(4), section("UART1"))); + + + + +volatile unsigned short mmrCAN_MC1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_MD1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_TRS1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_TRR1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_TA1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_AA1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_RMP1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_RML1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_MBTIF1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_MBRIF1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_MBIM1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_RFH1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_OPSS1 __attribute__ ((aligned(4), section("CANCTL0"))); + + +volatile unsigned short mmrCAN_MC2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_MD2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_TRS2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_TRR2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_TA2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_AA2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_RMP2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_RML2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_MBTIF2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_MBRIF2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_MBIM2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_RFH2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_OPSS2 __attribute__ ((aligned(4), section("CANCTL1"))); + +volatile unsigned short mmrCAN_CLOCK __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_TIMING __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_DEBUG __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_STATUS __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_CEC __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_GIS __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_GIM __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_GIF __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_CONTROL __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_INTR __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_DUMMY0 __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_MBTD __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_EWR __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_ESR __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_DUMMY1 __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_DUMMY2 __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_UCREG __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_UCCNT __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_UCRC __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_UCCNF __attribute__ ((aligned(4), section("CANCTL2"))); + + +volatile unsigned short mmrCAN_AM00L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM00H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM01L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM01H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM02L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM02H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM03L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM03H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM04L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM04H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM05L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM05H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM06L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM06H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM07L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM07H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM08L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM08H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM09L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM09H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM10L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM10H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM11L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM11H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM12L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM12H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM13L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM13H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM14L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM14H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM15L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM15H __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_AM16L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM16H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM17L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM17H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM18L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM18H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM19L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM19H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM20L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM20H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM21L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM21H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM22L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM22H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM23L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM23H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM24L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM24H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM25L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM25H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM26L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM26H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM27L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM27H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM28L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM28H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM29L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM29H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM30L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM30H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM31L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM31H __attribute__ ((aligned(4), section("CANMBX"))); + + +volatile unsigned short mmrCAN_MB00_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB00_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB00_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB00_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB00_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB00_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB00_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB00_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB01_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB01_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB01_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB01_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB01_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB01_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB01_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB01_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB02_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB02_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB02_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB02_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB02_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB02_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB02_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB02_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB03_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB03_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB03_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB03_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB03_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB03_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB03_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB03_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB04_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB04_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB04_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB04_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB04_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB04_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB04_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB04_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB05_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB05_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB05_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB05_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB05_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB05_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB05_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB05_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB06_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB06_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB06_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB06_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB06_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB06_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB06_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB06_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB07_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB07_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB07_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB07_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB07_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB07_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB07_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB07_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB08_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB08_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB08_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB08_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB08_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB08_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB08_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB08_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB09_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB09_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB09_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB09_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB09_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB09_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB09_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB09_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB10_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB10_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB10_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB10_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB10_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB10_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB10_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB10_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB11_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB11_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB11_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB11_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB11_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB11_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB11_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB11_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB12_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB12_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB12_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB12_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB12_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB12_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB12_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB12_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB13_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB13_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB13_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB13_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB13_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB13_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB13_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB13_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB14_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB14_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB14_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB14_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB14_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB14_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB14_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB14_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB15_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB15_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB15_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB15_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB15_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB15_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB15_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB15_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB16_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB16_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB16_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB16_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB16_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB16_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB16_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB16_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB17_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB17_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB17_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB17_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB17_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB17_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB17_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB17_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB18_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB18_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB18_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB18_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB18_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB18_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB18_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB18_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB19_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB19_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB19_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB19_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB19_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB19_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB19_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB19_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB20_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB20_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB20_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB20_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB20_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB20_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB20_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB20_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB21_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB21_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB21_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB21_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB21_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB21_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB21_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB21_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB22_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB22_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB22_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB22_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB22_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB22_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB22_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB22_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB23_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB23_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB23_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB23_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB23_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB23_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB23_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB23_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB24_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB24_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB24_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB24_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB24_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB24_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB24_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB24_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB25_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB25_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB25_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB25_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB25_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB25_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB25_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB25_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB26_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB26_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB26_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB26_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB26_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB26_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB26_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB26_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB27_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB27_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB27_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB27_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB27_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB27_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB27_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB27_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB28_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB28_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB28_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB28_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB28_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB28_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB28_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB28_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB29_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB29_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB29_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB29_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB29_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB29_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB29_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB29_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB30_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB30_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB30_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB30_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB30_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB30_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB30_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB30_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB31_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB31_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB31_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB31_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB31_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB31_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB31_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB31_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + + +volatile unsigned short mmrPORTF_FER __attribute__ ((aligned(4), section("PORTFER"))); +volatile unsigned short mmrPORTG_FER __attribute__ ((aligned(4), section("PORTFER"))); +volatile unsigned short mmrPORTH_FER __attribute__ ((aligned(4), section("PORTFER"))); +volatile unsigned short mmrPORT_MUX __attribute__ ((aligned(4), section("PORTFER"))); + +volatile unsigned short mmrHMDMA0_CONTROL __attribute__ ((aligned(4), section("HDMA0"))); +volatile unsigned short mmrHMDMA0_ECINIT __attribute__ ((aligned(4), section("HDMA0"))); +volatile unsigned short mmrHMDMA0_BCINIT __attribute__ ((aligned(4), section("HDMA0"))); +volatile unsigned short mmrHMDMA0_ECURGENT __attribute__ ((aligned(4), section("HDMA0"))); +volatile unsigned short mmrHMDMA0_ECOVERFLOW __attribute__ ((aligned(4), section("HDMA0"))); +volatile unsigned short mmrHMDMA0_ECOUNT __attribute__ ((aligned(4), section("HDMA0"))); +volatile unsigned short mmrHMDMA0_BCOUNT __attribute__ ((aligned(4), section("HDMA0"))); + +volatile unsigned short mmrHMDMA1_CONTROL __attribute__ ((aligned(4), section("HDMA1"))); +volatile unsigned short mmrHMDMA1_ECINIT __attribute__ ((aligned(4), section("HDMA1"))); +volatile unsigned short mmrHMDMA1_BCINIT __attribute__ ((aligned(4), section("HDMA1"))); +volatile unsigned short mmrHMDMA1_ECURGENT __attribute__ ((aligned(4), section("HDMA1"))); +volatile unsigned short mmrHMDMA1_ECOVERFLOW __attribute__ ((aligned(4), section("HDMA1"))); +volatile unsigned short mmrHMDMA1_ECOUNT __attribute__ ((aligned(4), section("HDMA1"))); +volatile unsigned short mmrHMDMA1_BCOUNT __attribute__ ((aligned(4), section("HDMA1"))); + + +volatile unsigned long mmrEMAC_OPMODE __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_ADDRLO __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_ADDRHI __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_HASHLO __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_HASHHI __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_STAADD __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_STADAT __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_FLC __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_VLAN1 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_VLAN2 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_DUMMY0 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_WKUP_CTL __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK0 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK1 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK2 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK3 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_WKUP_FFCMD __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_WKUP_FFOFF __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_WKUP_FFCRC0 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_WKUP_FFCRC1 __attribute__ ((aligned(4), section("EMAC"))); + +volatile unsigned long mmrEMAC_DUMMY1 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_DUMMY2 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_DUMMY3 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_DUMMY4 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_SYSCTL __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_SYSTAT __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_RX_STAT __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_RX_STKY __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_RX_IRQE __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_TX_STAT __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_TX_STKY __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_TX_IRQE __attribute__ ((aligned(4), section("EMAC"))); + +volatile unsigned long mmrEMAC_MMC_CTL __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_MMC_RIRQS __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_MMC_RIRQE __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_MMC_TIRQS __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_MMC_TIRQE __attribute__ ((aligned(4), section("EMAC"))); + + +volatile unsigned long mmrEMAC_RXC_OK __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_FCS __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_ALIGN __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_OCTET __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_DMAOVF __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_UNICST __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_MULTI __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_BROAD __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_LNERRI __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_LNERRO __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_LONG __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_MACCTL __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_OPCODE __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_PAUSE __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_ALLFRM __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_ALLOCT __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_TYPED __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_SHORT __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_EQ64 __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_LT128 __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_LT256 __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_LT512 __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_LT1024 __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_GE1024 __attribute__ ((aligned(4), section("EMACR"))); + +volatile unsigned long mmrEMAC_TXC_OK __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_1COL __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_GT1COL __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_OCTET __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_DEFER __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_LATECL __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_XS_COL __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_DMAUND __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_CRSERR __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_UNICST __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_MULTI __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_BROAD __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_XS_DFR __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_MACCTL __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_ALLFRM __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_ALLOCT __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_EQ64 __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_LT128 __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_LT256 __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_LT512 __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_LT1024 __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_GE1024 __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_ABORT __attribute__ ((aligned(4), section("EMACT"))); + diff --git a/uzume_prototype/genmmrsyms/chip_mmr_bf592.c b/uzume_prototype/genmmrsyms/chip_mmr_bf592.c new file mode 100644 index 0000000..6d38b4c --- /dev/null +++ b/uzume_prototype/genmmrsyms/chip_mmr_bf592.c @@ -0,0 +1,372 @@ +/* + * ADSP-BF592の System MMR 定義。アドレスの指定は .ldファイルとの組み合わせで行う。 + * + * アドレスが正しく割り当てられているかは、次の方法で検証した. + * + $ cat /opt/uClinux/bfin-elf/bfin-elf/include/def_LPBlackfin.h /opt/uClinux/bfin-elf/bfin-elf/include/defBF59x_base.h /opt/uClinux/bfin-elf/bfin-elf/include/defBF592-A.h | tr '[a-z]' '[A-Z]' | grep '0XFF[CE]0' | grep "#DEFINE" | awk '{print $2, $3}' - | grep 0X | sed 's/0X//' | sort -k 2 > regdef.txt + $ bfin-elf-readelf -s -W mmr_bf592.out | grep OBJ | awk '{print $8,$2}'| grep _mmr | sed 's/_mmr//p' | sort -k 2 | uniq | tr '[a-z]' '[A-Z]' > regelf.txt + $ diff regelf.txt regdef.txt > diff.txt + +334a335 +> DCPLB_FAULT_STATUS FFE00008 +372d372 +< IMEM_DUMMY FFE01000 +373a374 +> CODE_FAULT_STATUS FFE01008 +374a376 +> CODE_FAULT_ADDR FFE0100C +427d428 +< IDUMMY FFE02100 +437d437 +< DBGDUMMY FFE05004 + + + * いずれも小さな問題であり、したがって、上の結果は問題ないと言える。 + * + */ + + + + + +volatile unsigned short mmrPLL_CTL __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrPLL_DIV __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrVR_CTL __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrPLL_STAT __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrPLL_LOCKCNT __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned long mmrCHIPID __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrSWRST __attribute ((aligned(4), section("SYSMMR1"))); +volatile unsigned short mmrSYSCR __attribute ((aligned(4), section("SYSMMR1"))); +volatile unsigned long mmrSIC_IMASK0 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IAR0 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IAR1 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IAR2 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IAR3 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_ISR0 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IWR0 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned short mmrWDOG_CTL __attribute ((aligned(4), section("SYSMMR4"))); +volatile unsigned long mmrWDOG_CNT __attribute ((aligned(4), section("SYSMMR4"))); +volatile unsigned long mmrWDOG_STAT __attribute ((aligned(4), section("SYSMMR4"))); +volatile unsigned short mmrUART0_THR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_IER __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_IIR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_LCR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_MCR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_LSR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_SCR __attribute ((aligned(4), section("SYSMMR7"))); +volatile unsigned short mmrUART0_GCTL __attribute ((aligned(4), section("SYSMMR8"))); +volatile unsigned short mmrSPI0_CTL __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_FLG __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_STAT __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_TDBR __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_RDBR __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_BAUD __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_SHADOW __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrTIMER0_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER0_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER0_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER0_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER1_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER1_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER1_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER1_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER2_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER2_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER2_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER2_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER_ENABLE __attribute ((aligned(4), section("SYSMMR105"))); +volatile unsigned short mmrTIMER_DISABLE __attribute ((aligned(4), section("SYSMMR105"))); +volatile unsigned long mmrTIMER_STATUS __attribute ((aligned(4), section("SYSMMR105"))); +volatile unsigned short mmrPORTFIO __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_CLEAR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_SET __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_TOGGLE __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKA __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKA_CLEAR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKA_SET __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKA_TOGGLE __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKB __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKB_CLEAR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKB_SET __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKB_TOGGLE __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_DIR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_POLAR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_EDGE __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_BOTH __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_INEN __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrSPORT0_TCR1 __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned short mmrSPORT0_TCR2 __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned short mmrSPORT0_TCLKDIV __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned short mmrSPORT0_TFSDIV __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned long mmrSPORT0_TX __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned long mmrSPORT0_RX __attribute ((aligned(4), section("SYSMMR13"))); +volatile unsigned short mmrSPORT0_RCR1 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_RCR2 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_RCLKDIV __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_RFSDIV __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_STAT __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_CHNL __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_MCMC1 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_MCMC2 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MTCS0 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MTCS1 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MTCS2 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MTCS3 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MRCS0 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MRCS1 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MRCS2 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MRCS3 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT1_TCR1 __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned short mmrSPORT1_TCR2 __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned short mmrSPORT1_TCLKDIV __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned short mmrSPORT1_TFSDIV __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned long mmrSPORT1_TX __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned long mmrSPORT1_RX __attribute ((aligned(4), section("SYSMMR16"))); +volatile unsigned short mmrSPORT1_RCR1 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_RCR2 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_RCLKDIV __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_RFSDIV __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_STAT __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_CHNL __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_MCMC1 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_MCMC2 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MTCS0 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MTCS1 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MTCS2 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MTCS3 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MRCS0 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MRCS1 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MRCS2 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MRCS3 __attribute ((aligned(4), section("SYSMMR17"))); + +volatile unsigned short mmrDMA_TC_PER __attribute ((aligned(4), section("SYSMMR20"))); +volatile unsigned short mmrDMA_TC_CNT __attribute ((aligned(4), section("SYSMMR20"))); +volatile unsigned long mmrDMA0_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR21"))); +volatile unsigned long mmrDMA0_START_ADDR __attribute ((aligned(4), section("SYSMMR21"))); +volatile unsigned short mmrDMA0_CONFIG __attribute ((aligned(4), section("SYSMMR21"))); +volatile unsigned short mmrDMA0_X_COUNT __attribute ((aligned(4), section("SYSMMR22"))); +volatile signed short mmrDMA0_X_MODIFY __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_Y_COUNT __attribute ((aligned(4), section("SYSMMR22"))); +volatile signed short mmrDMA0_Y_MODIFY __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned long mmrDMA0_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned long mmrDMA0_CURR_ADDR __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR23"))); +volatile unsigned long mmrDMA1_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR24"))); +volatile unsigned long mmrDMA1_START_ADDR __attribute ((aligned(4), section("SYSMMR24"))); +volatile unsigned short mmrDMA1_CONFIG __attribute ((aligned(4), section("SYSMMR24"))); +volatile unsigned short mmrDMA1_X_COUNT __attribute ((aligned(4), section("SYSMMR25"))); +volatile signed short mmrDMA1_X_MODIFY __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_Y_COUNT __attribute ((aligned(4), section("SYSMMR25"))); +volatile signed short mmrDMA1_Y_MODIFY __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned long mmrDMA1_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned long mmrDMA1_CURR_ADDR __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR26"))); +volatile unsigned long mmrDMA2_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR27"))); +volatile unsigned long mmrDMA2_START_ADDR __attribute ((aligned(4), section("SYSMMR27"))); +volatile unsigned short mmrDMA2_CONFIG __attribute ((aligned(4), section("SYSMMR27"))); +volatile unsigned short mmrDMA2_X_COUNT __attribute ((aligned(4), section("SYSMMR28"))); +volatile signed short mmrDMA2_X_MODIFY __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_Y_COUNT __attribute ((aligned(4), section("SYSMMR28"))); +volatile signed short mmrDMA2_Y_MODIFY __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned long mmrDMA2_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned long mmrDMA2_CURR_ADDR __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR29"))); +volatile unsigned long mmrDMA3_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR30"))); +volatile unsigned long mmrDMA3_START_ADDR __attribute ((aligned(4), section("SYSMMR30"))); +volatile unsigned short mmrDMA3_CONFIG __attribute ((aligned(4), section("SYSMMR30"))); +volatile unsigned short mmrDMA3_X_COUNT __attribute ((aligned(4), section("SYSMMR31"))); +volatile signed short mmrDMA3_X_MODIFY __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_Y_COUNT __attribute ((aligned(4), section("SYSMMR31"))); +volatile signed short mmrDMA3_Y_MODIFY __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned long mmrDMA3_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned long mmrDMA3_CURR_ADDR __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR32"))); +volatile unsigned long mmrDMA4_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR33"))); +volatile unsigned long mmrDMA4_START_ADDR __attribute ((aligned(4), section("SYSMMR33"))); +volatile unsigned short mmrDMA4_CONFIG __attribute ((aligned(4), section("SYSMMR33"))); +volatile unsigned short mmrDMA4_X_COUNT __attribute ((aligned(4), section("SYSMMR34"))); +volatile signed short mmrDMA4_X_MODIFY __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_Y_COUNT __attribute ((aligned(4), section("SYSMMR34"))); +volatile signed short mmrDMA4_Y_MODIFY __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned long mmrDMA4_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned long mmrDMA4_CURR_ADDR __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR35"))); +volatile unsigned long mmrDMA5_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR36"))); +volatile unsigned long mmrDMA5_START_ADDR __attribute ((aligned(4), section("SYSMMR36"))); +volatile unsigned short mmrDMA5_CONFIG __attribute ((aligned(4), section("SYSMMR36"))); +volatile unsigned short mmrDMA5_X_COUNT __attribute ((aligned(4), section("SYSMMR37"))); +volatile signed short mmrDMA5_X_MODIFY __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_Y_COUNT __attribute ((aligned(4), section("SYSMMR37"))); +volatile signed short mmrDMA5_Y_MODIFY __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned long mmrDMA5_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned long mmrDMA5_CURR_ADDR __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR38"))); +volatile unsigned long mmrDMA6_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR39"))); +volatile unsigned long mmrDMA6_START_ADDR __attribute ((aligned(4), section("SYSMMR39"))); +volatile unsigned short mmrDMA6_CONFIG __attribute ((aligned(4), section("SYSMMR39"))); +volatile unsigned short mmrDMA6_X_COUNT __attribute ((aligned(4), section("SYSMMR40"))); +volatile signed short mmrDMA6_X_MODIFY __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_Y_COUNT __attribute ((aligned(4), section("SYSMMR40"))); +volatile signed short mmrDMA6_Y_MODIFY __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned long mmrDMA6_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned long mmrDMA6_CURR_ADDR __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR41"))); +volatile unsigned long mmrDMA7_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR42"))); +volatile unsigned long mmrDMA7_START_ADDR __attribute ((aligned(4), section("SYSMMR42"))); +volatile unsigned short mmrDMA7_CONFIG __attribute ((aligned(4), section("SYSMMR42"))); +volatile unsigned short mmrDMA7_X_COUNT __attribute ((aligned(4), section("SYSMMR43"))); +volatile signed short mmrDMA7_X_MODIFY __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_Y_COUNT __attribute ((aligned(4), section("SYSMMR43"))); +volatile signed short mmrDMA7_Y_MODIFY __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned long mmrDMA7_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned long mmrDMA7_CURR_ADDR __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR44"))); +volatile unsigned long mmrDMA8_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR45"))); +volatile unsigned long mmrDMA8_START_ADDR __attribute ((aligned(4), section("SYSMMR45"))); +volatile unsigned short mmrDMA8_CONFIG __attribute ((aligned(4), section("SYSMMR45"))); +volatile unsigned short mmrDMA8_X_COUNT __attribute ((aligned(4), section("SYSMMR46"))); +volatile signed short mmrDMA8_X_MODIFY __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_Y_COUNT __attribute ((aligned(4), section("SYSMMR46"))); +volatile signed short mmrDMA8_Y_MODIFY __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned long mmrDMA8_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned long mmrDMA8_CURR_ADDR __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR47"))); + + +volatile unsigned long mmrMDMA_D0_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR57"))); +volatile unsigned long mmrMDMA_D0_START_ADDR __attribute ((aligned(4), section("SYSMMR57"))); +volatile unsigned short mmrMDMA_D0_CONFIG __attribute ((aligned(4), section("SYSMMR57"))); +volatile unsigned short mmrMDMA_D0_X_COUNT __attribute ((aligned(4), section("SYSMMR58"))); +volatile signed short mmrMDMA_D0_X_MODIFY __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_Y_COUNT __attribute ((aligned(4), section("SYSMMR58"))); +volatile signed short mmrMDMA_D0_Y_MODIFY __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned long mmrMDMA_D0_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned long mmrMDMA_D0_CURR_ADDR __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR59"))); +volatile unsigned long mmrMDMA_S0_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR60"))); +volatile unsigned long mmrMDMA_S0_START_ADDR __attribute ((aligned(4), section("SYSMMR60"))); +volatile unsigned short mmrMDMA_S0_CONFIG __attribute ((aligned(4), section("SYSMMR60"))); +volatile unsigned short mmrMDMA_S0_X_COUNT __attribute ((aligned(4), section("SYSMMR61"))); +volatile signed short mmrMDMA_S0_X_MODIFY __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_Y_COUNT __attribute ((aligned(4), section("SYSMMR61"))); +volatile signed short mmrMDMA_S0_Y_MODIFY __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned long mmrMDMA_S0_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned long mmrMDMA_S0_CURR_ADDR __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR62"))); +volatile unsigned long mmrMDMA_D1_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR63"))); +volatile unsigned long mmrMDMA_D1_START_ADDR __attribute ((aligned(4), section("SYSMMR63"))); +volatile unsigned short mmrMDMA_D1_CONFIG __attribute ((aligned(4), section("SYSMMR63"))); +volatile unsigned short mmrMDMA_D1_X_COUNT __attribute ((aligned(4), section("SYSMMR64"))); +volatile signed short mmrMDMA_D1_X_MODIFY __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_Y_COUNT __attribute ((aligned(4), section("SYSMMR64"))); +volatile signed short mmrMDMA_D1_Y_MODIFY __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned long mmrMDMA_D1_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned long mmrMDMA_D1_CURR_ADDR __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR65"))); +volatile unsigned long mmrMDMA_S1_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR66"))); +volatile unsigned long mmrMDMA_S1_START_ADDR __attribute ((aligned(4), section("SYSMMR66"))); +volatile unsigned short mmrMDMA_S1_CONFIG __attribute ((aligned(4), section("SYSMMR66"))); +volatile unsigned short mmrMDMA_S1_X_COUNT __attribute ((aligned(4), section("SYSMMR67"))); +volatile signed short mmrMDMA_S1_X_MODIFY __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_Y_COUNT __attribute ((aligned(4), section("SYSMMR67"))); +volatile signed short mmrMDMA_S1_Y_MODIFY __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned long mmrMDMA_S1_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned long mmrMDMA_S1_CURR_ADDR __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR68"))); + +volatile unsigned short mmrPPI_CONTROL __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrPPI_STATUS __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrPPI_COUNT __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrPPI_DELAY __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrPPI_FRAME __attribute ((aligned(4), section("SYSMMR69"))); + +volatile unsigned short mmrTWI_CLKDIV __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_CONTROL __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_SLAVE_CTL __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_SLAVE_STAT __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_SLAVE_ADDR __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_MASTER_CTL __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_MASTER_STAT __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_MASTER_ADDR __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_INT_STAT __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_INT_MASK __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_FIFO_CTL __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_FIFO_STAT __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_XMT_DATA8 __attribute ((aligned(4), section("SYSMMR71"))); +volatile unsigned short mmrTWI_XMT_DATA16 __attribute ((aligned(4), section("SYSMMR71"))); +volatile unsigned short mmrTWI_RCV_DATA8 __attribute ((aligned(4), section("SYSMMR71"))); +volatile unsigned short mmrTWI_RCV_DATA16 __attribute ((aligned(4), section("SYSMMR71"))); + +volatile unsigned short mmrPORTGIO __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_CLEAR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_SET __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_TOGGLE __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKA __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKA_CLEAR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKA_SET __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKA_TOGGLE __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKB __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKB_CLEAR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKB_SET __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKB_TOGGLE __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_DIR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_POLAR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_EDGE __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_BOTH __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_INEN __attribute ((aligned(4), section("SYSMMR72"))); + +volatile unsigned short mmrPORTF_FER __attribute ((aligned(4), section("SYSMMR83"))); +volatile unsigned short mmrPORTF_MUX __attribute ((aligned(4), section("SYSMMR83"))); +volatile unsigned short mmrPORTF_PADCTL __attribute ((aligned(4), section("SYSMMR83"))); +volatile unsigned short mmrPORTG_FER __attribute ((aligned(4), section("SYSMMR84"))); +volatile unsigned short mmrPORTG_MUX __attribute ((aligned(4), section("SYSMMR84"))); +volatile unsigned short mmrPORTG_PADCTL __attribute ((aligned(4), section("SYSMMR84"))); +volatile unsigned short mmrSPORT_GATECLK __attribute ((aligned(4), section("SYSMMR84"))); + +volatile unsigned short mmrSPI1_CTL __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_FLG __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_STAT __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_TDBR __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_RDBR __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_BAUD __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_SHADOW __attribute ((aligned(4), section("SYSMMR91"))); + diff --git a/uzume_prototype/genmmrsyms/cpu_mmr.c b/uzume_prototype/genmmrsyms/cpu_mmr.c new file mode 100644 index 0000000..fcaf802 --- /dev/null +++ b/uzume_prototype/genmmrsyms/cpu_mmr.c @@ -0,0 +1,177 @@ +/* + * Blackfin Core MMR定義ファイル。 + * + * このファイルはGDBでのデバッグの支援用に開発したものである。GCC環境での開発に用いても構わないが、 + * VisualDSP++への移行は少々複雑になる。また、開発に使うための検証は行っていない。 + * + * アドレスの正しさの検証は、以下の比較によって行っている。 + * +$ readelf -s -W jsp | grep mmr | grep -v DUMMY | grep -v blackfin | sort -k 2 | awk '/_mmr/{print $8, $2}' - | sed 's/_mmr//p' | uniq > regelf.txt +$ cat ../jsp/config/blackfin/def_lpblackfin.h ../jsp/config/blackfin/defbf532.h | grep '0xFF[CE]0' | grep "#define" | sed 's/_MA /_MAP /' - | awk '{print $2,$3}' - | sort -k 2 | sed 's/0x//' - > regdef.txt +$ diff -i -w regelf.txt regdef.txt 24a25,27 +> RTC_PREN FFC00314 +> UART_DLL FFC00400 +> UART_RBR FFC00400 +25a29 +> UART_DLH FFC00404 +123a128 +> DMA_TCPER FFC00B0C +124a130 +> DMA_TCCNT FFC00B10 +288a295 +> DCPLB_FAULT_STATUS FFE00008 +326a334 +> CODE_FAULT_STATUS FFE01008 +327a336 +> CODE_FAULT_ADDR FFE0100C + * + * 得られた結果では、def_lpblackfin.hにある3つのレジスタがcore_mmr.cでは無視されていることを指摘している。 + * これらのレジスタはエイリアスであり、同じアドレスに別レジスタがあるので、この結果で正しい。 + * + */ +volatile void * volatile mmrSRAM_BASE_ADDRESS __attribute__ ((aligned(4), section("DMEMCTL"))); +volatile unsigned long mmrDMEM_CONTROL __attribute__ ((aligned(4), section("DMEMCTL"))); +volatile unsigned long mmrDCPLB_STATUS __attribute__ ((aligned(4), section("DMEMCTL"))); +volatile void * volatile mmrDCPLB_FAULT_ADDR __attribute__ ((aligned(4), section("DMEMCTL"))); +volatile void * volatile mmrDCPLB_ADDR0 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR1 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR2 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR3 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR4 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR5 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR6 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR7 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR8 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR9 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR10 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR11 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR12 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR13 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR14 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR15 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile unsigned long mmrDCPLB_DATA0 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA1 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA2 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA3 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA4 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA5 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA6 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA7 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA8 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA9 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA10 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA11 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA12 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA13 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA14 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA15 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDTEST_COMMAND __attribute__ ((aligned(4), section("DTESTC"))); +volatile unsigned long mmrDTEST_DATA0 __attribute__ ((aligned(4), section("DTESTD"))); +volatile unsigned long mmrDTEST_DATA1 __attribute__ ((aligned(4), section("DTESTD"))); + + +volatile unsigned long mmrIMEM_DUMMY __attribute__ ((aligned(4), section("IMEMCTL"))); +volatile unsigned long mmrIMEM_CONTROL __attribute__ ((aligned(4), section("IMEMCTL"))); +volatile unsigned long mmrICPLB_STATUS __attribute__ ((aligned(4), section("IMEMCTL"))); +volatile void * volatile mmrICPLB_FAULT_ADDR __attribute__ ((aligned(4), section("IMEMCTL"))); +volatile void * volatile mmrICPLB_ADDR0 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR1 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR2 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR3 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR4 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR5 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR6 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR7 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR8 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR9 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR10 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR11 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR12 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR13 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR14 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR15 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile unsigned long mmrICPLB_DATA0 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA1 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA2 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA3 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA4 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA5 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA6 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA7 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA8 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA9 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA10 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA11 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA12 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA13 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA14 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA15 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrITEST_COMMAND __attribute__ ((aligned(4), section("ITESTC"))); +volatile unsigned long mmrITEST_DATA0 __attribute__ ((aligned(4), section("ITESTD"))); +volatile unsigned long mmrITEST_DATA1 __attribute__ ((aligned(4), section("ITESTD"))); + + +volatile void * volatile mmrEVT0 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT1 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT2 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT3 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT4 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT5 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT6 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT7 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT8 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT9 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT10 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT11 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT12 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT13 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT14 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT15 __attribute__ ((aligned(4), section("EVT"))); +volatile unsigned long mmrIDUMMY __attribute__ ((aligned(4), section("CEC"))); +volatile unsigned long mmrIMASK __attribute__ ((aligned(4), section("CEC"))); +volatile unsigned long mmrIPEND __attribute__ ((aligned(4), section("CEC"))); +volatile unsigned long mmrILAT __attribute__ ((aligned(4), section("CEC"))); +volatile unsigned long mmrIPRIO __attribute__ ((aligned(4), section("CEC"))); + + +volatile unsigned long mmrTCNTL __attribute__ ((aligned(4), section("CTMR"))); +volatile unsigned long mmrTPERIOD __attribute__ ((aligned(4), section("CTMR"))); +volatile unsigned long mmrTSCALE __attribute__ ((aligned(4), section("CTMR"))); +volatile unsigned long mmrTCOUNT __attribute__ ((aligned(4), section("CTMR"))); + + +volatile unsigned long mmrDSPID __attribute__ ((aligned(4), section("DBG"))); +volatile unsigned short mmrDBGDUMMY __attribute__ ((aligned(4), section("DBG"))); +volatile unsigned long mmrDBGSTAT __attribute__ ((aligned(4), section("DBG"))); + + +volatile unsigned long mmrTBUFCTL __attribute__ ((aligned(4), section("TBCTL"))); +volatile unsigned long mmrTBUFSTAT __attribute__ ((aligned(4), section("TBCTL"))); +volatile void * volatile mmrTBUF __attribute__ ((aligned(4), section("TBUF"))); + + +volatile unsigned long mmrWPIACTL __attribute__ ((aligned(4), section("WPICTL"))); +volatile void * volatile mmrWPIA0 __attribute__ ((aligned(4), section("WPIADDR"))); +volatile void * volatile mmrWPIA1 __attribute__ ((aligned(4), section("WPIADDR"))); +volatile void * volatile mmrWPIA2 __attribute__ ((aligned(4), section("WPIADDR"))); +volatile void * volatile mmrWPIA3 __attribute__ ((aligned(4), section("WPIADDR"))); +volatile void * volatile mmrWPIA4 __attribute__ ((aligned(4), section("WPIADDR"))); +volatile void * volatile mmrWPIA5 __attribute__ ((aligned(4), section("WPIADDR"))); +volatile unsigned long mmrWPIACNT0 __attribute__ ((aligned(4), section("WPICNT"))); +volatile unsigned long mmrWPIACNT1 __attribute__ ((aligned(4), section("WPICNT"))); +volatile unsigned long mmrWPIACNT2 __attribute__ ((aligned(4), section("WPICNT"))); +volatile unsigned long mmrWPIACNT3 __attribute__ ((aligned(4), section("WPICNT"))); +volatile unsigned long mmrWPIACNT4 __attribute__ ((aligned(4), section("WPICNT"))); +volatile unsigned long mmrWPIACNT5 __attribute__ ((aligned(4), section("WPICNT"))); +volatile unsigned long mmrWPDACTL __attribute__ ((aligned(4), section("WPDCTL"))); +volatile void * volatile mmrWPDA0 __attribute__ ((aligned(4), section("WPDADDR"))); +volatile void * volatile mmrWPDA1 __attribute__ ((aligned(4), section("WPDADDR"))); +volatile unsigned long mmrWPDACNT0 __attribute__ ((aligned(4), section("WPDCNT"))); +volatile unsigned long mmrWPDACNT1 __attribute__ ((aligned(4), section("WPDCNT"))); +volatile unsigned long mmrWPSTAT __attribute__ ((aligned(4), section("WPSTAT"))); + + +volatile unsigned long mmrPFCTL __attribute__ ((aligned(4), section("PFCTL"))); +volatile unsigned long mmrPFCNTR0 __attribute__ ((aligned(4), section("PFCNT"))); +volatile unsigned long mmrPFCNTR1 __attribute__ ((aligned(4), section("PFCNT"))); + diff --git a/uzume_prototype/i2c-test.c b/uzume_prototype/i2c-test.c new file mode 100644 index 0000000..c509b54 --- /dev/null +++ b/uzume_prototype/i2c-test.c @@ -0,0 +1,36 @@ + + + +#include +#include "kernel_id.h" +#include "i2c-test.h" +#include "i2c_subsystem.h" + + +#define I2CADRESS 0x50 +unsigned char data[3] = {7, 0xDE, 0xAD }; +unsigned char buf[3] = {0,0,0 }; + + +/* + * メインタスク + */ +void main_task(VP_INT exinf) +{ + int errcode; + + syslog(LOG_NOTICE, "Hello"); + + errcode = i2c_master_write( 0, I2CADRESS, data, 3 ); + + syslog(LOG_NOTICE, "i2c_master_write, error code = 0x%04x", errcode ); + + errcode = i2c_master_write_read( 0, I2CADRESS, data, 1, buf, 1 ); + + syslog(LOG_NOTICE, "i2c_master_write_read, error code = 0x%04x", errcode ); + syslog(LOG_NOTICE, "buf[0] = 0x%04x", buf[0] ); + + slp_tsk(); + + +} diff --git a/uzume_prototype/i2c-test.cfg b/uzume_prototype/i2c-test.cfg new file mode 100644 index 0000000..eba3fa3 --- /dev/null +++ b/uzume_prototype/i2c-test.cfg @@ -0,0 +1,19 @@ +/* + * @(#) $Id: sample1.cfg,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * サンプルプログラム(1)のシステムコンフィギュレーションファイル + */ + +#define _MACRO_ONLY +#include "i2c-test.h" + +INCLUDE("\"i2c-test.h\""); +CRE_TSK(MAIN_TASK, { TA_HLNG|TA_ACT, 0, main_task, MAIN_PRIORITY, + STACK_SIZE, NULL }); + +#include "kernel/systask/timer.cfg" +#include "kernel/systask/serial.cfg" +#include "kernel/systask/logtask.cfg" +#include "i2c0_m.cfg" diff --git a/uzume_prototype/i2c-test.h b/uzume_prototype/i2c-test.h new file mode 100644 index 0000000..9b65116 --- /dev/null +++ b/uzume_prototype/i2c-test.h @@ -0,0 +1,45 @@ + +#include + +/* + * 各タスクの優先度の定義 + */ + +#define MAIN_PRIORITY 5 /* メインタスクの優先度 */ + /* HIGH_PRIORITY より高くすること */ + +#define HIGH_PRIORITY 9 /* 並列に実行されるタスクの優先度 */ +#define MID_PRIORITY 10 +#define LOW_PRIORITY 11 + +/* + * ターゲット依存の定義(CPU例外ハンドラの起動方法など) + */ + + +#if defined(BLACKFIN) + +#define CPUEXC1 0 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm("excpt 0;") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 1024 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#endif + +/* + * ターゲットに依存する可能性のある定数の定義 + */ + +#ifndef TASK_PORTID +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ +#endif /* TASK_PORTID */ + + +/* + * 関数のプロトタイプ宣言 + */ +#ifndef _MACRO_ONLY + +extern void main_task(VP_INT exinf); + +#endif /* _MACRO_ONLY */ diff --git a/uzume_prototype/i2c0_m.cfg b/uzume_prototype/i2c0_m.cfg new file mode 100644 index 0000000..04478f2 --- /dev/null +++ b/uzume_prototype/i2c0_m.cfg @@ -0,0 +1,43 @@ + +INCLUDE("\"i2c_subsystem.h\""); + +ATT_INI({ + TA_NULL, /* 高級言語でインターフェースする */ + 0, /* イニシャライザに渡すパラメタ。0はTWI0 */ + i2c_master_initialize /* イニシャライザ本体 */ + }); + + + + /* I2C0の割り込みハンドラを登録する */ + +DEF_INH( + INHNO_TWI, + { + TA_HLNG, + i2c0_master_handler + } + ); + + + /* I2Cサブシステムの排他利用のためのセマフォ */ +CRE_SEM (SEM_I2C0_BLOCK, + { + TA_TPRI, /* タスク優先順位に基づいてセマフォを奪い合う。 */ + 1, /* 初期状態で資源数は1。すなわち、最初に排他領域を獲得しようとしたタスクは、待ちなしに獲得できる。 */ + 1 /* 最大返却資源数は1。これは PV セマフォによる排他処理を行う場合の普通の値。 */ + } + ); + + + /* I2Cサブシステムの割り込み通知用のためのセマフォ。割り込みハンドラは、依頼された送受信が完了したらこのセマフォをシグナルする */ +CRE_SEM (SEM_I2C0_SIGNAL, + { + TA_TPRI, /* タスク優先順位に基づいてセマフォを奪い合う。 */ + 0, /* 初期状態で資源数は0。すなわち、割り込みによる送受信完了待ちのタスクは、必ず最初に待ち状態になる。 */ + 1 /* 最大返却資源数は1。割り込みハンドラがタスクの依頼なしに送受を完了することはないから。 */ + } + ); + + + diff --git a/uzume_prototype/kernel/.project b/uzume_prototype/kernel/.project new file mode 100644 index 0000000..a38dab5 --- /dev/null +++ b/uzume_prototype/kernel/.project @@ -0,0 +1,11 @@ + + + jsp + + + + + + + + diff --git a/uzume_prototype/kernel/.settings/org.eclipse.core.resources.prefs b/uzume_prototype/kernel/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..3945f59 --- /dev/null +++ b/uzume_prototype/kernel/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +#Sat May 30 17:38:15 JST 2009 +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/uzume_prototype/kernel/.settings/org.eclipse.core.runtime.prefs b/uzume_prototype/kernel/.settings/org.eclipse.core.runtime.prefs new file mode 100644 index 0000000..9d8c041 --- /dev/null +++ b/uzume_prototype/kernel/.settings/org.eclipse.core.runtime.prefs @@ -0,0 +1,3 @@ +#Sat May 30 17:38:15 JST 2009 +eclipse.preferences.version=1 +line.separator=\n diff --git a/uzume_prototype/kernel/CHANGES.blackfin b/uzume_prototype/kernel/CHANGES.blackfin new file mode 100644 index 0000000..7b33b11 --- /dev/null +++ b/uzume_prototype/kernel/CHANGES.blackfin @@ -0,0 +1,69 @@ +*2012/Jul/28 Release 3.3.0 + +ADSP-BF506対応部を追加した。 +ADSP-BF548対応部を追加した。 +ADSP-BF592対応部を追加した。 +以下のチケットへの対策を行った。なお、チケットおよびその対策の詳細は以下のURLを参照 +http://sourceforge.jp/projects/toppersjsp4bf/ticket/ + +-チケット #29059 Visual DSP++用acb_bf592プロジェクトを追加 +-チケット #29058 Visual DSP++ビルド時chip_config.cの#include を削除する +-チケット #29051 Visual DSP++用ezkit_bf518プロジェクトを追加 +-チケット #29052 sample1_ezkit_bf533がVisual DSP++5 Update10でビルドが通らない +-チケット #28015 コアタイマ使用時hw_timer_int_clearの割り込み要求クリア +-チケット #24385 BF518依存部からcdefxxxx/defxxxxファイルを削除する +-チケット #27133 MMR表示用変数の削除 +-チケット #27205 バナーにコピーライト文字列を追加する +-チケット #28731 cfgスクリプトの暴走問題 +-チケット #28730 Perlスクリプトのdo関数呼び出しを修正する +-チケット #28729 cfgビルド時の警告を取り除く +-チケット #28727 JSPカーネルのcfgをUbuntu 12.04 でビルドできるようにする +-チケット #28726 インストーラーをUbuntu 12.04、Toolchain 2011に対応させる +-チケット #28891 BF518実装の、PLL初期化要不要判定が間違っている +-チケット #27204 ezkit_bf518_00依存部を削除する + +*2010/Jul/10 Release 3.2.0 +以下のチケットへの対策を行った。なお、チケットおよびその対策の詳細は以下のURLを参照 +http://sourceforge.jp/projects/toppersjsp4bf/ticket/ + +-チケット #21281 「著作権表示の改善」に対応。 +-チケット #16878 BF518のanomaly #05000431への対応 +-チケット #21564 BF518へMMRの定義を追加 +-チケット #21570 KOBANZAME対応部の追加 +-チケット #21732 BF518依存部のboot_for_gdbの引数 +-チケット #21733 boot_for_gdbの再ブート条件を引数だけにする +-チケット #20543 システム起動時にCORETIMERを止める必要があるか検討する +-チケット #21743 Rebun依存部の削除 +-チケット #21734 ポストモーテム、ダンプ機能を追加 + +*2009/Aug/16 Release 3.1.1 + +以下のチケットへの対策を行った。なお、チケットおよびその対策の詳細は以下のURLを参照 +http://sourceforge.jp/projects/toppersjsp4bf/ticket/ + +-チケット #18168 debug_bootは標準で呼ばないようにすべき + +*2009/Jul/25 Release 3.1.0 + +以下のチケットへの対策を行った。なお、チケットおよびその対策の詳細は以下のURLを参照 +http://sourceforge.jp/projects/toppersjsp4bf/ticket/ + +-チケット #17551 E!Kit BF533への対応 +-チケット #17210 g++ 4.3でコンフィグレータをビルド出来ない +-チケット #17065 BF537でvxget_timが正常動作しない +-チケット #17557 コールド・ブート時に再起動する +-チケット #17559 start.Sのインクルードファイル名が違う +-チケット #17560 gdbで使えるレジスタ定義がほしい +-チケット #17761 def_xxxx.hを排除する + +*2009/May/30 Release 3.0.1 + +以下のチケットへの対策を行った。なお、チケットおよびその対策の詳細は以下のURLを参照 +http://sourceforge.jp/projects/toppersjsp4bf/ticket/ + +-チケット #15329 コアタイマーのハンドラ名 +-チケット #16716 sample1.hのSTACK_SIZEが小さすぎる +-チケット #16820 コアタイマーは廃止の方向 +-チケット #16810 hw_timer_initialize()が、冗長なIMASK操作をしている +-チケット #16714 多重割り込み時にIMASKを変更すると、間違ったハンドラが呼ばれる +-チケット #16729 dis_int()が排他制御されていない \ No newline at end of file diff --git a/uzume_prototype/kernel/README b/uzume_prototype/kernel/README new file mode 100644 index 0000000..23ba4a7 --- /dev/null +++ b/uzume_prototype/kernel/README @@ -0,0 +1,63 @@ + + TOPPERS/JSP Kernel(Release 1.4.3) + Toyohashi Open Platform for Embedded Real-Time Systems/ + Just Standard Profile Kernel + +TOPPERS/JSPカーネルは,TOPPERSプロジェクトにおいて開発したμITRON4.0仕 +様に準拠したリアルタイムカーネルです.JSP(Just Standard Profile)の名 +前が示す通り,μITRON4.0仕様のスタンダードプロファイル規定に従って実装 +されています. + +ターゲットプロセッサとして,現時点で,M68040,SH3/4,SH1,SH2,H8,H8S, +ARMv4,M32R,MicroBlaze,TMS320C54x,Xstormy16,MIPS3,M16C,SC33, +PowerPC32,Nios2, v850をサポートしています.カーネルのできる限り多くの +部分をC言語で記述する,ターゲット独立部と依存部を明確に分離するなど, +他のターゲットプロセッサへのポーティングが容易な構造になっています.さ +らに,Linux上とWindows上で動作するシミュレーション環境を用意しています. + +TOPPERS/JSPカーネルは,オープンソースソフトウェアです.TOPPERS/JSPカー +ネルの配付キットの最新版は,以下のウェブサイトからダウンロードすること +ができます. + http://www.toppers.jp/ + +このページからダウンロードできる配付キットには,シミュレーション環境を +含むTOPPERS/JSPカーネルの全ソースファイルとコンフィギュレータのソース +ファイルが含まれています.TOPPERS/JSPカーネルの利用条件については,各 +ソースファイルの先頭に記述されている利用条件を参照してください. + +【ユーザズマニュアル】 + +TOPPERS/JSPカーネルのユーザズマニュアルは,doc/user.txt にあります. +TOPPERS/JSPカーネルを利用する場合には,まず,このマニュアルに目を通し +て下さい.インストール方法の説明は,このマニュアルの7章にあります. + +【TOPPERSユーザズメーリングリスト】 + +TOPPERS/JSPカーネルのユーザのために,TOPPERSユーザズメーリングリストを +用意しています.このメーリングリストには,誰でも自由にメールを送付する +ことができます.メールの送付先は,users@toppers.jp です.また,送付さ +れたメールは,上記のウェブサイトで読むことができます. + +TOPPERS/JSPカーネルに関する質問やバグレポートは,このメーリングリスト +宛てにお送り下さい.ただし,担当者の都合で迅速な返答ができない場合があ +るかと思いますが,ご了承下さい. + +TOPPERSユーザズメーリングリストへの登録を希望される方は, +users-ctl@toppers.jp 宛てに,本文に + + subscribe あなたの名前 + 例: subscribe Hiroaki Takada + +と書いたメールを送付してください(上記のコマンド中には半角英文字のみを +使うこと).折り返し,登録確認のためのメールをお送りしますので,その指 +示に従って下さい. + +---------------------------------------------------------------------- +・TRON は "The Real-time Operating system Nucleus" の略称です. +・ITRON は "Industrial TRON" の略称です. +・μITRON は "Micro Industrial TRON" の略称です. +・TRON,ITRON,およびμITRONは,特定の商品ないしは商品群を指す名称では + ありません. +・TOPPERS は "Toyohashi OPen Platform for Embedded Real-time Systems" + の略称,JSP は "Just Standard Profile" の略称です. +・本文中の商品名は,各社の商標または登録商標です. diff --git a/uzume_prototype/kernel/README.blackfin b/uzume_prototype/kernel/README.blackfin new file mode 100644 index 0000000..9a4aa61 --- /dev/null +++ b/uzume_prototype/kernel/README.blackfin @@ -0,0 +1,23 @@ +このディレクトリは、TOPPERS/JSP 1.4.3をベースにBlackfin対応を追加した +ものである。Blackfin実装に明らかに不要なディレクトリは削除している。例を +上げるとH8プロセッサ依存部およびそのツール等を削除している。 + +Blackfinプロセサに対応するために以下のディレクトリ及びファイルが追加され +ている。 + +jsp/config/blackfin/ +jsp/utils/blackfin-vdsp/ +jsp/tools/blackfin-vdsp/ +jsp/pdic/simple_sio/uart.c +jsp/pdic/simple_sio/uart.h + +また、以下のファイルにはBlackfinプロセッサ対応のための宣言を追加している。 + +jsp/sample/sample1.h +jsp/sample/Makefile + +このディレクトリの最新版およびドキュメントはTOPPERS/JSP for Blackfin +プロジェクトよりダウンロードできる。 + +http://sourceforge.jp/projects/toppersjsp4bf/ + diff --git a/uzume_prototype/kernel/cfg/.cvsignore b/uzume_prototype/kernel/cfg/.cvsignore new file mode 100644 index 0000000..70ebed0 --- /dev/null +++ b/uzume_prototype/kernel/cfg/.cvsignore @@ -0,0 +1,3 @@ +Makefile.depend +chk +cfg diff --git a/uzume_prototype/kernel/cfg/.gitignore b/uzume_prototype/kernel/cfg/.gitignore new file mode 100644 index 0000000..859f8de --- /dev/null +++ b/uzume_prototype/kernel/cfg/.gitignore @@ -0,0 +1,2 @@ +/chk +/cfg diff --git a/uzume_prototype/kernel/cfg/Makefile b/uzume_prototype/kernel/cfg/Makefile new file mode 100644 index 0000000..a220ee2 --- /dev/null +++ b/uzume_prototype/kernel/cfg/Makefile @@ -0,0 +1,139 @@ +# +# TOPPERS/JSP Kernel +# Toyohashi Open Platform for Embedded Real-Time Systems/ +# Just Standard Profile Kernel +# +# Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory +# Toyohashi Univ. of Technology, JAPAN +# +# 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation +# によって公表されている GNU General Public License の Version 2 に記 +# 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア +# を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, +# 利用と呼ぶ)することを無償で許諾する. +# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 +# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー +# スコード中に含まれていること. +# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 +# 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 +# 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 +# の無保証規定を掲載すること. +# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 +# 用できない形で再配布する場合には,次のいずれかの条件を満たすこ +# と. +# (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 +# 作権表示,この利用条件および下記の無保証規定を掲載すること. +# (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに +# 報告すること. +# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 +# 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. +# +# 本ソフトウェアは,無保証で提供されているものである.上記著作権者お +# よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も +# 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 +# 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. +# +# @(#) $Id: Makefile,v 1.3 2012/06/17 00:51:37 suikan Exp $ +# + +# +# コンパイルオプションの定義 +# +CFLAGS = -g -O2 -Wno-unused-result +INCLUDES = -I. + +# +# MinGWを使用しているときには、次のコメントを外す +# +#CFLAGS := $(CFLAGS) -D__MINGW__ + +# +# Filecontainerが使用する実装種別 +# +CFLAGS := $(CFLAGS) -DFILECONTAINER_BINUTILS +#CFLAGS := $(CFLAGS) -DFILECONTAINER_WINDOWS + +# +# リンク時に追加するライブラリ +# +#LIBS = -lstdc++ + +# +# オブジェクトファイル名の定義 +# +COMMON_OBJS = manager.o directorymap.o message.o garbage.o component.o \ + singleton.o except.o event.o collection.o option.o +CFG_OBJS = parser.o mpstrstream.o jsp_checkscript.o \ + jsp_parser.o jsp_staticapi.o jsp_common.o \ + $(COMMON_OBJS) +CHK_OBJS = filecontainer.o jsp_check.o fc_binutils.o $(COMMON_OBJS) + +VPATH = ./jsp ./base + +ifdef TINET + include tinet/Makefile.config +endif + +# +# ターゲットファイル +# +all: cfg chk + +# +# ソースファイルのあるディレクトリに関する定義 +# +vpath %.cpp $(VPATH) + +# +# cfg のリンク +# +cfg: $(CFG_OBJS) + $(CC) $(CFLAGS) -o cfg $(CFG_OBJS) $(LIBS) + +# +# chk のリンク +# +chk: $(CHK_OBJS) + $(CC) $(CFLAGS) -o chk $(CHK_OBJS) $(LIBS) + +# +# コンパイル結果の消去 +# +clean: + rm -f *.o + rm -f cfg chk + rm -f container.txt container.xml kernel_cfg.c kernel_id.h + rm -f settings.dat settings.txt + rm -f cfg.exe chk.exe + +cleandep: + rm -f Makefile.depend + +realclean: cleandep clean + +# +# 依存関係ファイルの生成 +# +depend: cleandep $(CFG_OBJS:.o=.d) $(CHK_OBJS:.o=.d) + +# +# 依存関係ファイルをインクルード +# +-include Makefile.depend + +# +# コンパイラドライバの定義 +# +CC = g++ + +# +# デフォルトのコンパイルルールの定義 +# +%.o: %.cpp + $(CC) -c $(CFLAGS) $(INCLUDES) $< + +# +# デフォルトの依存関係作成ルールの定義 +# +%.d: %.cpp + $(CC) -M $(CFLAGS) $(INCLUDES) $< >> Makefile.depend diff --git a/uzume_prototype/kernel/cfg/base/clause.cpp b/uzume_prototype/kernel/cfg/base/clause.cpp new file mode 100644 index 0000000..d8aa256 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/clause.cpp @@ -0,0 +1,946 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: clause.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/clause.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#include "base/clause.h" +#include "base/message.h" + +using namespace std; + +/* + * 構文上の一節を処理するクラス + */ + + //指定した名前空間の節マップを取得 +Clause::map_type * Clause::getClauseMap(string name) throw() +{ + map_type * result = NULL; + Namespace::iterator scope; + + Namespace * const ns = Singleton::getInstance(nothrow); + if(ns!= 0) { + scope = ns->find(name); + if(scope != ns->end()) + result = &(scope->second); + } + + return result; +} + + //節の登録 +void Clause::addClause(string _namespace, string _identifier) throw() +{ + if(isValid()) { + Namespace * const ns = Singleton::getInstance(nothrow); + if(ns != 0) + (*ns)[_namespace][_identifier] = this; +// ns->operator [](_namespace).insert(map_type::value_type(_identifier, this)); //上書きさせない場合 + } +} + + //トークンに対して節識別名を生成する +string Clause::getClauseIdentifier(Token token) throw() +{ + string result; + + switch(token.getType()) { + case Token::IDENTIFIER: + case Token::PUNCTUATOR: + result = token.getLiteral(); + break; + case Token::INTEGER: + result.assign(INTEGER_CLAUSE_IDENTIFIER); + break; + case Token::LITERAL: + result.assign(LITERAL_CLAUSE_IDENTIFIER); + break; + case Token::OPERATOR: + result.assign(OPERATOR_CLAUSE_IDENTIFIER); + break; + default: + result = string(); + } + + return result; +} + + //節の解析 +bool Clause::parseClause(string ns, Parser & p) +{ + bool result = false; + map_type::iterator scope; + map_type * clause = getClauseMap(ns); + + //ガード節 + if(clause == 0 || p.eof()) + return false; + + //トークンから識別名を取り出す + Token token; + string identifier; + + token = p.getToken(); + identifier = getClauseIdentifier(token); + + //節処理部の実行 + scope = clause->find(identifier); + if(scope != clause->end()) { + + //デバッグ用メッセージ出力 + DebugMessage("Clause::parseClause(%) - %\n") << ns << identifier; + + try { + scope->second->before(token, p); + scope->second->body(token, p); //ヒットしたものを実行 + scope->second->after(token, p); + result = true; + } + catch(...) { + scope->second->onFail(token, p); //失敗したときの後始末をお願いする + throw; + } + } + else + p.putback(token); //識別子にマッチするものが登録されていない + + return result; +} + + //firstで始まる節があるか +bool Clause::hasClause(string ns, string first) throw() +{ + map_type * clause = getClauseMap(ns); + if(clause == 0) + return false; + + return clause->find(first) != clause->end(); +} + + //パース前処理 +void Clause::before(const Token &, Parser &) +{} + + //パース後処理 +void Clause::after(const Token &, Parser &) +{} + + //標準の例外発生時の後始末ルーチン +void Clause::onFail(const Token &, Parser & p) throw() +{ + Token token; + + //最後まで読みきる + while(!p.eof()) + token = p.getToken(); +} + + //節を複数の識別名に対応付ける +void Clause::addMultipleClauses(string ns, string id_list) throw() +{ + string id; + string::size_type pos; + string::size_type prev; + + //カンマで区切られた要素毎にaddClauseを発行 + if(isValid()) { + prev = 0; + do { + pos = id_list.find_first_of(',', prev); + id = id_list.substr(prev, pos - prev); + + addClause(ns, id); + + prev = pos + 1; + } while(pos != string::npos); + } +} + + //[ヘルプ用] 登録されている節の一覧を作成する +std::string Clause::makeClauseList(string ns, int width) throw() +{ + string result; + map_type::iterator scope; + map_type * clause = getClauseMap(ns); + size_t max_length = 0; + + //最大の文字列長を求める + scope = clause->begin(); + while(scope != clause->end()) { + size_t i = scope->first.size(); + if(i > max_length) + max_length = i; + ++ scope; + } + + //一覧を作成 + size_t max_column = width/(max_length+1); + size_t column = 0; + scope = clause->begin(); + while(scope != clause->end()) { + size_t i = scope->first.size(); + + result += scope->first; + + ++ column; + ++ scope; + + //末尾処理 + if(column == max_column || scope == clause->end()) + result += '\n'; + else { + result += ','; + result += string(max_length - i, ' '); + } + } + + return result; +} + + + /* + * 静的API + */ + + //パース前処理 +void StaticAPI::before(const Token & first, Parser & p) +{ + Token token = p.getToken(); + if(token != Token::LPAREN) { + ExceptionMessage("StaticAPI [%] lacks left-parenthesis '('.","静的API[%]には括弧'('が欠けている") << first.getLiteral() << throwException; + } +} + + //パース後処理 +void StaticAPI::after(const Token & first, Parser & p) +{ + Token token = p.getToken(); + if(token != Token::RPAREN) { + ExceptionMessage("StaticAPI [%] lacks right-parenthesis ')'.","静的API[%]には括弧')'が欠けている") << first.getLiteral() << throwException; + } + else { + token = p.getToken(); + if(token != ";") + ExceptionMessage("StaticAPI [%] lacks ';' at the end of declaration.","静的API[%]の末尾に';'が欠けている") << first.getLiteral() << throwException; + } +} + + //失敗時の回復処理 +void StaticAPI::onFail(const Token & , Parser & p) throw() +{ skip(p, false); } + + + //スキップ + // invalid_api : 次に最初に読み出されるAPIは無効 +void StaticAPI::skip(Parser & p, bool invalid_api) throw() +{ + //セミコロン or 次の静的APIの出現まで + Token token; + bool condition; //アレ対策 + + if(invalid_api) + token = p.getToken(); //次のAPI名は読み飛ばす + + do { + token = p.getToken(true); + + condition = (!token.isValid()) || //無効なトークンか + (token == Token::PUNCTUATOR && token == ";") || //セミコロンか + (token == Token::IDENTIFIER && hasStaticAPI(token.getLiteral())); //静的APIか + + } while(!condition); + + if(token == Token::IDENTIFIER) + p.putback(token); +} + + /* + * プリプロセスディレクティブ + */ + + //パース後処理 +void Directives::after(const Token & first, Parser & p) throw(Exception) +{ + Token token = p.getToken(true); + if(!token.isValid() || !p.isLocatedonHeadofLine()) + ExceptionMessage("Directive [%] has a wrong parameter or misses a new-line.","ディレクティブ[%]に不正な引数があるか、改行がない") << first.getLiteral() << throwException; +} + + //パース失敗時の回復処理 +void Directives::onFail(const Token & , Parser & p) throw() +{ + //次の改行まで読み飛ばす + Token token; + + do { + token = p.getToken(true); + } while(token.isValid() && !p.isLocatedonHeadofLine()); +} + +/************************************************* テストスィート *************************************************/ + +#ifdef TESTSUITE + +#include "coverage_undefs.h" +#include + +namespace { + class Clause_test : public Clause + { + public: + Token first; + Token second; + bool throw_exception; + + Clause_test(void) throw() : first(Token::ERROR), throw_exception(false) {} + + void body(const Token & _first, Parser & _p) + { + TestSuite::check("Clause_test::body"); + first = _first; + second = _p.getToken(); + if(throw_exception) + throw 0; + } + + void before(const Token & , Parser & ) + { + TestSuite::check("Clause_test::before"); + } + + void after(const Token &, Parser &) + { + TestSuite::check("Clause_test::after"); + } + + void onFail(const Token & _first, Parser & p) throw() + { + TestSuite::check("Clause_test::onFail"); + first = _first; + } + + void onFail_super(const Token & _first, Parser & p) throw() + { Clause::onFail(_first, p); } + }; +} + +TESTSUITE(main, Clause) +{ + SingletonBase::ContextChain chain; + chain.saveContext(); + + BEGIN_CASE("getClauseIdentifier","getClauseIdentifier") { + BEGIN_CASE("1","普通の識別子はそのままが中身になる") { + Token token(Token::IDENTIFIER, "test"); + + if(getClauseIdentifier(token).compare("test") != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","数値は中身に関係なく" INTEGER_CLAUSE_IDENTIFIER "が返る") { + Token token(Token::INTEGER, "", "", 0); + + if(getClauseIdentifier(token).compare(INTEGER_CLAUSE_IDENTIFIER) != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3","リテラルは中身に関係なく" LITERAL_CLAUSE_IDENTIFIER "が返る") { + Token token(Token::LITERAL, ""); + + if(getClauseIdentifier(token).compare(LITERAL_CLAUSE_IDENTIFIER) != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("4","演算子は中身に関係なく" OPERATOR_CLAUSE_IDENTIFIER "が返る") { + Token token(Token::OPERATOR); + + if(getClauseIdentifier(token).compare(OPERATOR_CLAUSE_IDENTIFIER) != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("5","空白のトークンには空文字(==非受理)が返る") { + Token token(Token::SPACE); + + if(!getClauseIdentifier(token).empty()) + TEST_FAIL; + } END_CASE; + + TEST_CASE("6","エラートークンには空文字(==非受理)が返る", getClauseIdentifier(Token(Token::ERROR)).empty()); + TEST_CASE("7","EOSトークンには空文字(==非受理)が返る", getClauseIdentifier(Token(Token::END_OF_STREAM)).empty()); + + } END_CASE; + + BEGIN_CASE("getClauseMap","getClauseMap") { + BEGIN_CASE("1","何も登録していない空間にはNULLが返る") { + chain.renewInstance(); + if(Clause::getClauseMap("unknown") != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","要素があれば非0が返る") { + chain.renewInstance(); + Singleton::getInstance()->operator []("test"); + + if(Clause::getClauseMap("test") == 0) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("addClause","addClause") { + BEGIN_CASE("1","オブジェクトを登録できる") { + chain.renewInstance(); + Clause_test ct; + Clause_test ct2; + + BEGIN_CASE("1","普通に登録する") { + ct.addClause("test","first_literal"); + + TEST_CASE("1","名前空間が増えている", Singleton::getInstance()->size() == 1); + TEST_CASE("2","\"test\"という空間がある", Singleton::getInstance()->find("test") != Singleton::getInstance()->end()); + TEST_CASE("3","getClauseでアドレスが取れる", Clause::getClauseMap("test") != 0); + TEST_CASE("4","名前空間の節の数は1", Clause::getClauseMap("test")->size() == 1); + TEST_CASE("5","\"first_literal\"のノードがある", Clause::getClauseMap("test")->find("first_literal") != Clause::getClauseMap("test")->end()); + TEST_CASE("6","関連付けられた値が正しい", (*Clause::getClauseMap("test"))["first_literal"] == &ct); + } END_CASE; + + BEGIN_CASE("2","2個目を登録する") { + ct2.addClause("test","second_literal"); + + TEST_CASE("1","名前空間が増えていない", Singleton::getInstance()->size() == 1); + TEST_CASE("2","\"test\"という空間がある", Singleton::getInstance()->find("test") != Singleton::getInstance()->end()); + TEST_CASE("3","名前空間の節の数は2", Clause::getClauseMap("test")->size() == 2); + TEST_CASE("4","\"second_literal\"のノードがある", Clause::getClauseMap("test")->find("second_literal") != Clause::getClauseMap("test")->end()); + TEST_CASE("5","関連付けられた値が正しい", (*Clause::getClauseMap("test"))["second_literal"] == &ct2); + } END_CASE; + + BEGIN_CASE("3","2個目を1個目で上書き登録する") { + ct.addClause("test","second_literal"); + TEST_CASE("1","上書きされている", (*Clause::getClauseMap("test"))["second_literal"] == &ct); + } END_CASE; + + BEGIN_CASE("4","違う名前空間に登録する") { + ct.addClause("TEST","first_literal"); + + TEST_CASE("1","名前空間が増えている", Singleton::getInstance()->size() == 2); + TEST_CASE("2","\"TEST\"という空間がある", Singleton::getInstance()->find("TEST") != Singleton::getInstance()->end()); + TEST_CASE("3","getClauseでアドレスが取れる", Clause::getClauseMap("TEST") != 0); + TEST_CASE("4","名前空間の節の数は1", Clause::getClauseMap("TEST")->size() == 1); + TEST_CASE("5","\"first_literal\"のノードがある", Clause::getClauseMap("TEST")->find("first_literal") != Clause::getClauseMap("TEST")->end()); + TEST_CASE("6","関連付けられた値が正しい", (*Clause::getClauseMap("TEST"))["first_literal"] == &ct); + } END_CASE; + + } END_CASE; + + BEGIN_CASE("2","無効なオブジェクトは登録されない") { + chain.renewInstance(); + + ((Clause_test *)0)->addClause("test","first_literal"); + + TEST_CASE("1","名前空間が増えていない", Singleton::getInstance()->size() == 0); + } END_CASE; + + } END_CASE; + + BEGIN_CASE("hasClause","hasClause") { + Clause_test ct; + chain.renewInstance(); + + TEST_CASE("1","何も要素がないときにも正常に動作する", !Clause::hasClause("dummy","null")); + + ct.addClause("test","first_literal"); + + TEST_CASE("2","登録した要素を探せ、trueが返る", Clause::hasClause("test","first_literal")); + TEST_CASE("3","存在しない要素にfalseが返る", !Clause::hasClause("dummy","null")); + } END_CASE; + + BEGIN_CASE("addMultipleClauses","addMultipleClauses") { + BEGIN_CASE("1","単一の節を登録できる") { + chain.renewInstance(); + Clause_test ct; + + ct.addMultipleClauses("test","first"); + + TEST_CASE("1","登録した節がある", Clause::hasClause("test","first")); + } END_CASE; + + BEGIN_CASE("2","複数の節を登録する") { + chain.renewInstance(); + Clause_test ct; + + ct.addMultipleClauses("test","first,second,third"); + + TEST_CASE("1","登録した節がある", Clause::hasClause("test","first")); + TEST_CASE("2","登録した節がある", Clause::hasClause("test","second")); + TEST_CASE("3","登録した節がある", Clause::hasClause("test","third")); + } END_CASE; + + } END_CASE; + + BEGIN_CASE("Clause::onFail","Clause::onFail") { + stringstream buf; + Parser p(&buf, "test"); + Token token; + Clause_test ct; + + buf.str("first second third 4 5 6 siebt acht neunt 0xa"); + + ct.onFail_super(token, p); + TEST_CASE("1","ストリームは最後まで進んでいる", p.eof()); + } END_CASE; + + BEGIN_CASE("parseClause","parseClause") { + chain.renewInstance(); + Clause_test ct; + + ct.addClause("test","first"); + + BEGIN_CASE("1","名前空間を選択して正しく節を実行できる") { + stringstream buf; + Parser p(&buf, "test"); + buf.str("first second"); + + TestSuite::clearCheckpoints(); + TEST_CASE("1","関数は成功する", Clause::parseClause("test", p)); + TEST_CASE("2","Clause::beforeが実行されている", TestSuite::isReached("Clause_test::before")); + TEST_CASE("3","Clause::bodyが実行されている", TestSuite::isReached("Clause_test::body")); + TEST_CASE("4","bodyのfirstが正しい", ct.first == "first"); + TEST_CASE("5","bodyで読み出したトークンが正しい", ct.second == "second"); + TEST_CASE("6","Clause::afterが実行されている", TestSuite::isReached("Clause_test::after")); + } END_CASE; + + BEGIN_CASE("2","節の処理中に例外が起こるとonFailが呼ばれる") { + stringstream buf; + Parser p(&buf, "test"); + buf.str("first second"); + + ct.throw_exception = true; + TestSuite::clearCheckpoints(); + + bool result = false; + try { Clause::parseClause("test", p); } + catch(...){ result = true; } + + TEST_CASE("1","例外が起こる", result); + TEST_CASE("2","Clause::bodyが実行されている", TestSuite::isReached("Clause_test::body")); + TEST_CASE("3","Clause::onFailが実行されている", TestSuite::isReached("Clause_test::onFail")); + } END_CASE; + + BEGIN_CASE("3","存在しない名前空間を指定する") { + stringstream buf; + Parser p(&buf, "test"); + buf.str("first second"); + + TEST_CASE("1","関数は失敗する", !Clause::parseClause("unknown", p)); + } END_CASE; + + BEGIN_CASE("4","EOFに達したストリームを指定する") { + stringstream buf; + Parser p(&buf, "test"); + buf.str(""); + buf.get(); + + TEST_CASE("0","[前提]ストリームは終端に達している", buf.eof()); + TEST_CASE("1","関数は失敗する", !Clause::parseClause("unknown", p)); + } END_CASE; + } END_CASE; + + chain.restoreContext(); +} + + + + +namespace { + class StaticAPI_test : public StaticAPI + { + public: + StaticAPI_test(void) throw() : StaticAPI() {} + StaticAPI_test(string src) throw() : StaticAPI(src) {} + + void body(const Token & , Parser &) { TestSuite::check("StaticAPI::body"); } + void onFail_super(const Token & first, Parser & p) throw() { StaticAPI::onFail(first, p); } + }; +} + +TESTSUITE(main, StaticAPI) +{ + Singleton::Context context; + Singleton::saveContext(context); + + Exception::setThrowControl(true); + + BEGIN_CASE("regist","regist") { + BEGIN_CASE("1","単一の名前を指定して登録できる") { + Singleton::renewInstance(); + StaticAPI_test api; + + api.regist("VTST_API"); + + TEST_CASE("1","APIは正しく登録できている",StaticAPI::hasStaticAPI("VTST_API")); + } END_CASE; + + BEGIN_CASE("2","複数の名前を指定して登録する") { + Singleton::renewInstance(); + StaticAPI_test api; + + api.regist("API_1,API_2,API_3"); + + TEST_CASE("1","APIは正しく登録できている",StaticAPI::hasStaticAPI("API_1")); + TEST_CASE("2","APIは正しく登録できている",StaticAPI::hasStaticAPI("API_2")); + TEST_CASE("3","APIは正しく登録できている",StaticAPI::hasStaticAPI("API_3")); + } END_CASE; + + BEGIN_CASE("3","上書きする") { + Singleton::renewInstance(); + StaticAPI_test api; + StaticAPI_test api2; + StaticAPI_test api3; + + api.regist("test"); + TEST_CASE("1","APIは正しく登録できている",StaticAPI::hasStaticAPI("test")); + TEST_CASE("2","APIハンドラが正しい", (*StaticAPI::getClauseMap(NAMESPACE_STATICAPI))["test"] == &api); + + api2.regist("test"); + TEST_CASE("3","APIハンドラが上書きされている", (*StaticAPI::getClauseMap(NAMESPACE_STATICAPI))["test"] == &api2); + + api3.regist("test"); + TEST_CASE("4","APIハンドラが上書きされている", (*StaticAPI::getClauseMap(NAMESPACE_STATICAPI))["test"] == &api3); + } END_CASE; + + BEGIN_CASE("4","コンストラクタで登録") { + Singleton::renewInstance(); + StaticAPI_test api("API1,API2,API3"); + + TEST_CASE("1","APIは正しく登録できている",StaticAPI::hasStaticAPI("API1")); + TEST_CASE("2","APIは正しく登録できている",StaticAPI::hasStaticAPI("API2")); + TEST_CASE("3","APIは正しく登録できている",StaticAPI::hasStaticAPI("API3")); + } END_CASE; + } END_CASE; + + BEGIN_CASE("parseStaticAPI","parseStaticAPI") { + BEGIN_CASE("1","静的APIを正しく処理できる") { + Singleton::renewInstance(); + stringstream buf; + StaticAPI_test api("API"); + + buf.str("API();"); + Parser p(&buf, "test"); + + TestSuite::clearCheckpoints(); + bool result = true; + try { StaticAPI::parseStaticAPI(p); } + catch(...) { result = false; } + + TEST_CASE("1","例外は起らない", result); + TEST_CASE("2","静的APIの本体が呼ばれている", TestSuite::isReached("StaticAPI::body")); + } END_CASE; + + BEGIN_CASE("2","'('忘れで例外") { + Singleton::renewInstance(); + stringstream buf; + StaticAPI_test api("API"); + + buf.str("API);"); + Parser p(&buf, "test"); + + TestSuite::clearCheckpoints(); + bool result = false; + try { StaticAPI::parseStaticAPI(p); } + catch(...) { result = true; } + + TEST_CASE("1","例外が起る", result); + TEST_CASE("2","静的APIの本体が呼ばれない", !TestSuite::isReached("StaticAPI::body")); + } END_CASE; + + BEGIN_CASE("3","')'忘れで例外") { + Singleton::renewInstance(); + stringstream buf; + StaticAPI_test api("API"); + + buf.str("API(; NEXT"); + Parser p(&buf, "test"); + + TestSuite::clearCheckpoints(); + bool result = false; + try { StaticAPI::parseStaticAPI(p); } + catch(...) { result = true; } + + TEST_CASE("1","例外が起る", result); + TEST_CASE("2","静的APIの本体が呼ばれている", TestSuite::isReached("StaticAPI::body")); + } END_CASE; + + BEGIN_CASE("4","';'忘れで例外") { + Singleton::renewInstance(); + stringstream buf; + StaticAPI_test api("API"); + + buf.str("API() NEXT"); + Parser p(&buf, "test"); + + TestSuite::clearCheckpoints(); + bool result = false; + try { StaticAPI::parseStaticAPI(p); } + catch(...) { result = true; } + + TEST_CASE("1","例外が起る", result); + TEST_CASE("2","静的APIの本体が呼ばれている", TestSuite::isReached("StaticAPI::body")); + } END_CASE; + } END_CASE; + + BEGIN_CASE("onFail","onFail") { + BEGIN_CASE("1","セミコロンまで読み飛ばし") { + Singleton::renewInstance(); + stringstream buf; + Parser p(&buf, "test"); + StaticAPI_test api; + Token token; + buf.str("api parameter;next_api next_api_parameter;"); + + api.onFail_super(Token(), p); + + TEST_CASE("1","セミコロンの次が読める", p.getToken() == "next_api"); + } END_CASE; + + BEGIN_CASE("2","次のAPIまで読み飛ばし") { + Singleton::renewInstance(); + stringstream buf; + Parser p(&buf, "test"); + StaticAPI_test api("api,next_api"); + buf.str("api parameter_1 parameter_2 next_api next_api_parameter;"); + + api.onFail_super(p.getToken(), p); + + TEST_CASE("1","次のAPI名が読める", p.getToken() == "next_api"); + } END_CASE; + } END_CASE; + + BEGIN_CASE("skip","skip") { + BEGIN_CASE("1","セミコロンまで読み飛ばし") { + Singleton::renewInstance(); + stringstream buf; + Parser p(&buf, "test"); + StaticAPI_test api; + Token token; + buf.str("api parameter;next_api next_api_parameter;"); + + StaticAPI::skip(p); + + TEST_CASE("1","セミコロンの次が読める", p.getToken() == "next_api"); + } END_CASE; + + BEGIN_CASE("2","次のAPIまで読み飛ばし") { + Singleton::renewInstance(); + stringstream buf; + Parser p(&buf, "test"); + StaticAPI_test api("api,next_api"); + buf.str("parameter_1 parameter_2 next_api next_api_parameter;"); + + StaticAPI::skip(p); + + TEST_CASE("1","次のAPI名次が読める", p.getToken() == "next_api"); + } END_CASE; + + BEGIN_CASE("3","先頭がAPI名でも読み飛ばしできる") { + Singleton::renewInstance(); + stringstream buf; + Parser p(&buf, "test"); + StaticAPI_test api("api,next_api"); + buf.str("api parameter_1 parameter_2 next_api next_api_parameter;"); + + StaticAPI::skip(p); + + TEST_CASE("1","次のAPI名が読める", p.getToken() == "next_api"); + } END_CASE; + } END_CASE; + + Singleton::restoreContext(context); +} + + +namespace { + class Directives_test : public Directives + { + public: + bool throws; + + Directives_test(void) throw() : Directives(), throws(false) {} + Directives_test(string src) throw() : Directives(src), throws(false) {} + + void body(const Token & , Parser & ) throw(int) + { + TestSuite::check("Directives::body"); + if(throws) + throw 0; + } + }; +} + +TESTSUITE(main, Directives) +{ + Singleton::Context context; + Singleton::saveContext(context); + + Exception::setThrowControl(true); + + BEGIN_CASE("regist","regist") { + BEGIN_CASE("1","単一の名前を指定して登録できる") { + Singleton::renewInstance(); + Directives_test api; + + api.regist("include"); + + TEST_CASE("1","APIは正しく登録できている",Directives::hasDirectives("include")); + } END_CASE; + + BEGIN_CASE("2","複数の名前を指定して登録する") { + Singleton::renewInstance(); + Directives_test api; + + api.regist("pragma,define,endif"); + + TEST_CASE("1","ディレクティブは正しく登録できている",Directives::hasDirectives("pragma")); + TEST_CASE("2","ディレクティブは正しく登録できている",Directives::hasDirectives("define")); + TEST_CASE("3","ディレクティブは正しく登録できている",Directives::hasDirectives("endif")); + } END_CASE; + + BEGIN_CASE("3","上書きする") { + Singleton::renewInstance(); + Directives_test api; + Directives_test api2; + Directives_test api3; + + api.regist("test"); + TEST_CASE("1","ディレクティブは正しく登録できている",Directives::hasDirectives("test")); + TEST_CASE("2","ディレクティブハンドラが正しい", (*Directives::getClauseMap(NAMESPACE_DIRECTIVES))["test"] == &api); + + api2.regist("test"); + TEST_CASE("3","ディレクティブハンドラが上書きされている", (*Directives::getClauseMap(NAMESPACE_DIRECTIVES))["test"] == &api2); + + api3.regist("test"); + TEST_CASE("4","ディレクティブハンドラが上書きされている", (*Directives::getClauseMap(NAMESPACE_DIRECTIVES))["test"] == &api3); + } END_CASE; + + BEGIN_CASE("4","コンストラクタで登録") { + Singleton::renewInstance(); + Directives_test api("pragma,define,endif"); + + TEST_CASE("1","ディレクティブは正しく登録できている",Directives::hasDirectives("pragma")); + TEST_CASE("2","ディレクティブは正しく登録できている",Directives::hasDirectives("define")); + TEST_CASE("3","ディレクティブは正しく登録できている",Directives::hasDirectives("endif")); + } END_CASE; + } END_CASE; + + BEGIN_CASE("parseDirectives","parseDirectives") { + BEGIN_CASE("1","ディレクティブを正しく処理できる") { + Singleton::renewInstance(); + stringstream buf; + Directives_test api("pragma"); + + buf.str("pragma\nnext\n"); + Parser p(&buf, "test"); + + TestSuite::clearCheckpoints(); + bool result = true; + try { Directives::parseDirectives(p); } + catch(...) { result = false; } + + TEST_CASE("1","例外は起らない", result); + TEST_CASE("2","ディレクティブの本体が呼ばれている", TestSuite::isReached("Directives::body")); + } END_CASE; + + BEGIN_CASE("2","改行なし(不正パラメータ)で例外") { + Singleton::renewInstance(); + stringstream buf; + Directives_test api("pragma"); + + buf.str("pragma next\n"); + Parser p(&buf, "test"); + + TestSuite::clearCheckpoints(); + bool result = false; + try { Directives::parseDirectives(p); } + catch(...) { result = true; } + + TEST_CASE("1","例外が起る", result); + TEST_CASE("2","ディレクティブの本体が呼ばれている", TestSuite::isReached("Directives::body")); + } END_CASE; + + BEGIN_CASE("3","改行なし(EOF)で例外") { + Singleton::renewInstance(); + stringstream buf; + Directives_test api("pragma"); + + buf.str("pragma"); + Parser p(&buf, "test"); + + TestSuite::clearCheckpoints(); + bool result = false; + try { Directives::parseDirectives(p); } + catch(...) { result = true; } + + TEST_CASE("1","例外が起る", result); + TEST_CASE("2","ディレクティブの本体が呼ばれている", TestSuite::isReached("Directives::body")); + } END_CASE; + } END_CASE; + + BEGIN_CASE("onFail","onFail") { + BEGIN_CASE("1","bodyで例外が起るとonFailが次の改行まで読み飛ばす") { + Singleton::renewInstance(); + stringstream buf; + Directives_test api("pragma"); + buf.str("pragma parameter\nnext\n"); + Parser p(&buf, "test"); + + api.throws = true; + bool result = false; + try { Directives::parseDirectives(p); } + catch(...) { result = true; } + + TEST_CASE("1","例外が起る", result); + TEST_CASE("2","残った内容が正しい", p.getToken() == "next"); + TEST_CASE("3","トークンは行頭", p.isHeadofLine()); + } END_CASE; + } END_CASE; + + Singleton::restoreContext(context); +} + +#endif + + + diff --git a/uzume_prototype/kernel/cfg/base/clause.h b/uzume_prototype/kernel/cfg/base/clause.h new file mode 100644 index 0000000..491f2e7 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/clause.h @@ -0,0 +1,196 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: clause.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/clause.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#ifndef CLAUSE_H +#define CLAUSE_H + +#include "base/testsuite.h" +#include "base/parser.h" +#include "base/singleton.h" +#include "base/except.h" + +#include +#include + +#define INTEGER_CLAUSE_IDENTIFIER "##INTEGER" //2連の#と識別子を一気に取り出すことはできないので名前が重なることはない +#define LITERAL_CLAUSE_IDENTIFIER "##STRING" +#define OPERATOR_CLAUSE_IDENTIFIER "##OPERATOR" + + //構文上の一節を処理するクラス +class Clause +{ +public: + //ある名前空間に属する節のマップ + typedef std::map map_type; + + //名前空間 + class Namespace : public std::map + { public: SINGLETON_CONSTRUCTOR(Namespace) throw() {} }; + +protected: + static map_type * getClauseMap(std::string ns) throw(); + + //トークンから識別名を生成する + static std::string getClauseIdentifier(Token token) throw(); + + //自身を登録する + void addClause(std::string ns, std::string identifier) throw(); + + //自分を複数のleading identifierに対応付ける + void addMultipleClauses(std::string ns, std::string identifier_list) throw(); + +protected: /* インタフェース */ + + //パーサ本体 + virtual void before(const Token & first, Parser & p); + virtual void body (const Token & first, Parser & p) = 0; + virtual void after (const Token & first, Parser & p); + + //パース失敗時の回復処理 + virtual void onFail(const Token & first, Parser & p) throw(); + +public: + Clause(void) throw() {} + virtual ~Clause(void) throw() {} + + //有効判定 + inline bool isValid(void) const throw() + { return (this != 0); } + + //節の解析 + static bool parseClause(std::string ns, Parser & p); + + //firstで始まる節があるか + static bool hasClause(std::string ns, std::string first) throw(); + + //[ヘルプ用] 登録されている節の一覧を作成する + static std::string makeClauseList(std::string ns, int width = 80) throw(); + + TESTSUITE_PROTOTYPE(main) +}; + + + /* + * 静的API + */ +#define NAMESPACE_STATICAPI "StaticAPI" + +class StaticAPI : public Clause +{ +protected: + + virtual void before(const Token & first, Parser & p); + virtual void after (const Token & first, Parser & p); + + //パース失敗時の回復処理 + virtual void onFail(const Token & first, Parser & p) throw(); + +public: + //デフォルトコンストラクタ (何もしない) + StaticAPI(void) throw() {} + //API名を指定して生成 (registをよぶ) + StaticAPI(std::string apinamelist) throw() + { addMultipleClauses(NAMESPACE_STATICAPI, apinamelist); } + + inline void regist(std::string apinamelist) throw() + { addMultipleClauses(NAMESPACE_STATICAPI, apinamelist); } + + //節の解析 + static bool parseStaticAPI(Parser & p) + { return Clause::parseClause(NAMESPACE_STATICAPI, p); } + + //firstで始まる節があるか + inline static bool hasStaticAPI(std::string first) throw() + { return Clause::hasClause(NAMESPACE_STATICAPI, first); } + + //[ヘルプ用] 登録されている節の一覧を作成する + inline static std::string makeClauseList(int width = 80) throw() + { return Clause::makeClauseList(NAMESPACE_STATICAPI, width); } + + //スキップ + static void skip(Parser & p, bool invalid_api = true) throw(); + + TESTSUITE_PROTOTYPE(main) +}; + + + /* + * プリプロセスディレクティブ + */ +#define NAMESPACE_DIRECTIVES "Directives" + +class Directives : public Clause +{ +protected: + + virtual void after(const Token & first, Parser & p) throw(Exception); + + //パース失敗時の回復処理 + virtual void onFail(const Token & first, Parser & p) throw(); + +public: + //デフォルトコンストラクタ (何もしない) + Directives(void) throw() {} + //API名を指定して生成 (registをよぶ) + Directives(std::string apinamelist) throw() + { addMultipleClauses(NAMESPACE_DIRECTIVES, apinamelist); } + + inline void regist(std::string apinamelist) throw() + { addMultipleClauses(NAMESPACE_DIRECTIVES, apinamelist); } + + //節の解析 + inline static bool parseDirectives(Parser & p) + { return Clause::parseClause(NAMESPACE_DIRECTIVES, p); } + + //firstで始まる節があるか + inline static bool hasDirectives(std::string first) throw() + { return Clause::hasClause(NAMESPACE_DIRECTIVES, first); } + + //[ヘルプ用] 登録されている節の一覧を作成する + inline static std::string makeClauseList(int width = 80) throw() + { return Clause::makeClauseList(NAMESPACE_DIRECTIVES, width); } + + TESTSUITE_PROTOTYPE(main) +}; + +#endif + + + diff --git a/uzume_prototype/kernel/cfg/base/collection.cpp b/uzume_prototype/kernel/cfg/base/collection.cpp new file mode 100644 index 0000000..0901cd4 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/collection.cpp @@ -0,0 +1,840 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: collection.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/collection.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#include "base/collection.h" + + +using namespace std; + + //特に何もしないコンストラクタ +Collection::Collection(void) throw() +{} + + //デストラクタ +Collection::~Collection(void) throw() +{ + //念のために例外にふたをする + try { clear(); } + catch(...) {} +} + + //インスタンスをコレクションに追加 (順序は登録順) +bool Collection::addInstance(Collectable * _instance, bool _destruction) throw() +{ + bool result = false; + + if(isValid() && _instance != 0) { + + // 同じインスタンスを2回登録しないようにする + list::iterator scope; + + scope = container.begin(); + while(scope != container.end()) { + if(scope->instance == _instance) + break; + ++ scope; + } + + if(scope == container.end()) { + // 末尾に要素を追加 + struct Element element; + element.instance = _instance; + element.destruction = _destruction; + container.push_back(element); + } + else { + // 破棄指示は最新に直しておく + scope->destruction = _destruction; + } + + result = true; + } + + return result; +} + + //指定されたCollectableインスタンスに相当する場所を指すイテレータの取得 (getInstance) +list::const_iterator Collection::_findInstance(const Collectable * predecessor) const throw() +{ + list::const_iterator result; + + result = container.begin(); + + //predecessorが指定されていた場合は探す + if(predecessor != 0) { + while(result != container.end()) { + if(result->instance == predecessor) { + ++ result; //検索はpredecessorの次から + break; + } + ++ result; + } + } + + return result; +} + + //コレクションからインスタンスを取得 +Collectable * Collection::getInstance(const type_info & type, const Collectable * predecessor) const throw() +{ + Collectable * result; + + result = 0; + if(isValid()) { + + list::const_iterator scope; + + // 先行するインスタンスの場所を探す + scope = _findInstance(predecessor); + + // 指定された型を持つ次のインスタンスを探す + while(scope != container.end()) { + if(typeid(*scope->instance) == type) { + result = scope->instance; + break; + } + ++ scope; + } + } + + return result; +} + + //コレクションからインスタンスを除外 (破棄はしない) +bool Collection::removeInstance(const Collectable * instance) throw() +{ + bool result = false; + + if(isValid() && instance != 0) { + list::iterator scope; + + scope = container.begin(); + while(scope != container.end()) { + if(scope->instance == instance) { + //要素の削除 + container.erase(scope); + result = true; + break; + } + ++ scope; + } + } + + return result; +} + + //全要素の破棄 +void Collection::clear(void) +{ + if(isValid()) { + list::iterator scope; + list::iterator next; + + //破棄フラグがついているインスタンスを破棄 + scope = container.begin(); + while(scope != container.end()) { + + next = scope; //ROT系はdeleteすると自分を消しにかかるので、イテレータを保存するために先に次を取得しておく + ++ next; + + if(scope->destruction) + delete scope->instance; + + scope = next; + } + + container.clear(); + } +} + +/************************************************* テストスィート *************************************************/ + +#ifdef TESTSUITE +#include "coverage_undefs.h" + +class TestCollectable : public Collectable +{}; + +class TestCollectable2 : public Collectable +{ public: ~TestCollectable2(void) throw() { TestSuite::check("TestCollectable2::~TestCollectable2"); } }; + +#ifdef _MSC_VER +class TestCollectable3 : public Collectable +{ public: ~TestCollectable3(void) throw(int) { throw 0; } }; +#endif + +class TestCollectable4 : public TestCollectable2 +{ public: ~TestCollectable4(void) throw() { TestSuite::check("TestCollectable4::~TestCollectable4"); } }; + +TESTSUITE(main, Collection) +{ + BEGIN_CASE("addInstance","addInstance") { + BEGIN_CASE("1","インスタンスは正しく登録できる") { + Collection col; + TestCollectable test; + TestCollectable2 test2; + + BEGIN_CASE("1","登録できTRUEが返る (1個目)") { + if(!col.addInstance(&test, false)) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","登録できtrueが返る (2個目)") { + if(!col.addInstance(&test2, false)) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3","個数が合ってる") { + if(col.container.size() != 2) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("4","順番があってる") { + list::iterator scope; + scope = col.container.begin(); + if(scope->instance != &test || scope->destruction != false) + TEST_FAIL; + ++ scope; + if(scope->instance != &test2 || scope->destruction != false) + TEST_FAIL; + ++ scope; + if(scope != col.container.end()) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("2","NULLインスタンスは登録されない") { + Collection col; + + BEGIN_CASE("1","NULLインスタンスを渡すとfalseが返る") { + if(col.addInstance(0)) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","何も登録されていない") { + if(col.container.size() != 0) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("3","無効なインスタンスに対する操作でfalseが返る") { + Collection col; + + if(col.addInstance(0)) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("4","同一のインスタンスを2回登録しても1個だけしか登録されない") { + Collection col; + TestCollectable test; + + TEST_CASE("0","[前提] 一回目は正しく成功する", col.addInstance(&test, false)); + + TEST_CASE("1","関数は正しく終了する", col.addInstance(&test, false)); + TEST_CASE("2","インスタンス数は増えていない", col.container.size() == 1); + + } END_CASE; + + } END_CASE; + + BEGIN_CASE("getInstance(type_info)","getInstance(type_info)") { + Collection col; + TestCollectable test; + TestCollectable test_2; + TestCollectable test_3; + TestCollectable2 test2; + TestCollectable2 test2_2; + TestCollectable2 test2_3; + + col.addInstance(test); + col.addInstance(test2); + col.addInstance(test_2); + col.addInstance(test2_2); + col.addInstance(test_3); + col.addInstance(test2_3); + + Collectable * instance = 0; + + BEGIN_CASE("1","最初の要素を取得できる") { + instance = col.getInstance(typeid(TestCollectable)); + if(instance != &test) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","次の要素を取得できる") { + instance = col.getInstance(typeid(TestCollectable), instance); + if(instance != &test_2) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3","さらに次の要素を取得できる") { + instance = col.getInstance(typeid(TestCollectable), instance); + if(instance != &test_3) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("4","そのまた次の要素を取得したらNULLが返る") { + instance = col.getInstance(typeid(TestCollectable), instance); + if(instance != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("5","最初の要素を取得できる") { + instance = col.getInstance(typeid(TestCollectable2)); + if(instance != &test2) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("6","次の要素を取得できる") { + instance = col.getInstance(typeid(TestCollectable2), instance); + if(instance != &test2_2) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("7","さらに次の要素を取得できる") { + instance = col.getInstance(typeid(TestCollectable2), instance); + if(instance != &test2_3) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("8","そのまた次の要素を取得したらNULLが返る") { + instance = col.getInstance(typeid(TestCollectable), instance); + if(instance != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("9","基底クラスではひっかからない") { + instance = col.getInstance(typeid(Collectable)); + if(instance != 0) + TEST_FAIL; + } END_CASE; + + TEST_CASE("10","NULLに対して実行するとNULLが返る", ((Collection *)0)->getInstance(typeid(Collectable)) == 0); + } END_CASE; + + BEGIN_CASE("getInstance()","getInstance()") { + Collection col; + TestCollectable test; + TestCollectable test_2; + TestCollectable test_3; + TestCollectable2 test2; + TestCollectable2 test2_2; + TestCollectable2 test2_3; + + col.addInstance(test); + col.addInstance(test2); + col.addInstance(test_2); + col.addInstance(test2_2); + col.addInstance(test_3); + col.addInstance(test2_3); + + Collectable * instance = 0; + + BEGIN_CASE("1","最初の要素を取得できる") { + instance = col.getInstance(); + if(instance != &test) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","次の要素を取得できる") { + instance = col.getInstance(instance); + if(instance != &test_2) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3","さらに次の要素を取得できる") { + instance = col.getInstance(instance); + if(instance != &test_3) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("4","そのまた次の要素を取得したらNULLが返る") { + instance = col.getInstance(instance); + if(instance != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("5","最初の要素を取得できる") { + instance = col.getInstance(); + if(instance != &test2) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("6","次の要素を取得できる") { + instance = col.getInstance(instance); + if(instance != &test2_2) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("7","さらに次の要素を取得できる") { + instance = col.getInstance(instance); + if(instance != &test2_3) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("8","そのまた次の要素を取得したらNULLが返る") { + instance = col.getInstance(instance); + if(instance != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("9","基底クラスで引っ掛ける その1") { + instance = col.getInstance(); + if(instance != &test) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("10","基底クラスで引っ掛ける その2") { + instance = col.getInstance(instance); + if(instance != &test2) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("11","基底クラスで引っ掛ける その3") { + instance = col.getInstance(instance); + if(instance != &test_2) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("12","基底クラスで引っ掛ける その4") { + instance = col.getInstance(instance); + if(instance != &test2_2) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("13","基底クラスで引っ掛ける その5") { + instance = col.getInstance(instance); + if(instance != &test_3) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("14","基底クラスで引っ掛ける その6") { + instance = col.getInstance(instance); + if(instance != &test2_3) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("15","基底クラスで引っ掛ける その7") { + instance = col.getInstance(instance); + if(instance != 0) + TEST_FAIL; + } END_CASE; + + TEST_CASE("16","NULLに対して実行するとNULLが返る", ((Collection *)0)->getInstance() == 0); + + } END_CASE; + + BEGIN_CASE("removeInstance","removeInstance") { + + BEGIN_CASE("1","正常に削除できる") { + Collection col; + TestCollectable test; + TestCollectable test2; + + col.addInstance(test); + col.addInstance(test2); + + BEGIN_CASE("1","存在する要素をremoveしたらtrue") { + if(!col.removeInstance(&test)) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","ちゃんと消えている") { + if(col.container.size() != 1 || col.container.begin()->instance != &test2) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("2","NULLインスタンスに実行するとfalse") { + if(((Collection *)0)->removeInstance(0)) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3","登録していないインスタンスを指定すると失敗する") { + Collection col; + TestCollectable test; + TestCollectable test2; + + col.addInstance(test); + + if(col.removeInstance(&test2)) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("4","NULLインスタンスを渡すと失敗する") { + Collection col; + TestCollectable test; + col.addInstance(test); + + if(col.removeInstance(0)) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("clear","clear") { + BEGIN_CASE("1","実体を登録してclear") { + Collection col; + TestCollectable2 test2; + + TestSuite::clearCheckpoints(); + col.addInstance(test2); + col.clear(); + + BEGIN_CASE("1","要素がなくなっている") { + if(col.container.size() != 0) + TEST_FAIL; + } END_CASE; + + TEST_CASE("2","test2は破棄されない", !TestSuite::isReached("TestCollectable2::~TestCollectable2")); + } END_CASE; + + BEGIN_CASE("2","ポインタを登録してclear") { + Collection col; + TestCollectable2 * test2 = new TestCollectable2; + + TestSuite::clearCheckpoints(); + col.addInstance(test2); + col.clear(); + + BEGIN_CASE("1","要素がなくなっている") { + if(col.container.size() != 0) + TEST_FAIL; + } END_CASE; + + TEST_CASE("2","test2は破棄される", TestSuite::isReached("TestCollectable2::~TestCollectable2")); + } END_CASE; + + BEGIN_CASE("3","NULLオブジェクトに対して実行しても暴走しない") { + ((Collection *)0)->clear(); + } END_CASE; + +#ifdef _MSC_VER + BEGIN_CASE("4","例外が出るようなデストラクタをもつインスタンスを破棄すると例外が漏れる") { + Collection col; + bool result = false; + TestCollectable3 * test = new TestCollectable3; + + col.addInstance(test); + try { + col.clear(); + } + catch(...) { + result = true; + } + + + if(!result) + TEST_FAIL; + } END_CASE; +#endif + } END_CASE; + + BEGIN_CASE("destructor","destructor") { + BEGIN_CASE("1","実体を登録して破棄") { + Collection * col = new Collection; + TestCollectable2 test2; + + TestSuite::clearCheckpoints(); + col->addInstance(test2); + delete col; + + TEST_CASE("1","test2は破棄されない", !TestSuite::isReached("TestCollectable2::~TestCollectable2")); + } END_CASE; + + BEGIN_CASE("2","ポインタを登録してclear") { + Collection * col = new Collection; + TestCollectable2 * test2 = new TestCollectable2; + + TestSuite::clearCheckpoints(); + col->addInstance(test2); + delete col; + + TEST_CASE("1","test2は破棄される", TestSuite::isReached("TestCollectable2::~TestCollectable2")); + } END_CASE; + +#ifdef _MSC_VER + BEGIN_CASE("3","例外が出るようなデストラクタを持つインスタンスを破棄しても例外が漏れない") { + Collection * col = new Collection; + TestCollectable3 * test2 = new TestCollectable3; + bool result = true; + + TestSuite::clearCheckpoints(); + col->addInstance(test2); + + try { + delete col; + } + catch(...) { + result = false; + } + + if(!result) + TEST_FAIL; + } END_CASE; +#endif + } END_CASE; + + BEGIN_CASE("deleteInstance","deleteInstance") { + BEGIN_CASE("1","インスタンスを削除できる") { + Collection col; + TestCollectable2 * test = new TestCollectable2; + + TestSuite::clearCheckpoints(); + col.addInstance(test); + + TEST_CASE("0","[前提] ちゃんと登録されている", col.getInstance() != 0); + + col.deleteInstance(); + TEST_CASE("1","インスタンスが消えている", col.getInstance() == 0); + TEST_CASE("2","デストラクタが実行されている", TestSuite::isReached("TestCollectable2::~TestCollectable2")); + }END_CASE; + + BEGIN_CASE("2","関係ないクラスを指定したら削除されない") { + Collection col; + TestCollectable2 * test = new TestCollectable2; + + TestSuite::clearCheckpoints(); + col.addInstance(test); + + TEST_CASE("0","[前提] ちゃんと登録されている", col.getInstance() != 0); + + col.deleteInstance(); + TEST_CASE("1","インスタンスが消えていない", col.getInstance() != 0); + TEST_CASE("2","デストラクタが実行されていない", !TestSuite::isReached("TestCollectable2::~TestCollectable2")); + delete test; + }END_CASE; + + BEGIN_CASE("3","同じクラスだけでなく派生先も消える") { + Collection col; + TestCollectable2 * test = new TestCollectable2; + TestCollectable4 * test2 = new TestCollectable4; + + TestSuite::clearCheckpoints(); + col.addInstance(test); + col.addInstance(test2); + + TEST_CASE("0","[前提] ちゃんと登録されている", col.getInstance(typeid(TestCollectable2)) != 0); + TEST_CASE("0","[前提] ちゃんと登録されている", col.getInstance(typeid(TestCollectable4)) != 0); + + col.deleteInstance(); + TEST_CASE("1","インスタンスがすべて消えている", col.getInstance() == 0); + TEST_CASE("2","TestCollectable2のデストラクタが実行されている", TestSuite::isReached("TestCollectable2::~TestCollectable2")); + TEST_CASE("3","TestCollectable4のデストラクタが実行されている", TestSuite::isReached("TestCollectable4::~TestCollectable4")); + }END_CASE; + + BEGIN_CASE("4","実体は破棄対象にならない") { + Collection col; + TestCollectable2 test; + + TestSuite::clearCheckpoints(); + col.addInstance(test); + + TEST_CASE("0","[前提] ちゃんと登録されている", col.getInstance() != 0); + + col.deleteInstance(); + TEST_CASE("1","インスタンスが消えている", col.getInstance() == 0); + TEST_CASE("2","デストラクタが実行されていない", !TestSuite::isReached("TestCollectable2::~TestCollectable2")); + }END_CASE; + + BEGIN_CASE("5","NULLオブジェクトに対して発行しても暴走しない") { + ((Collection *)0)->deleteInstance(); + } END_CASE; + + } END_CASE; + + BEGIN_CASE("replaceInstance","replaceInstance") { + BEGIN_CASE("1","登録済みのインスタンスを入れ替える") { + Collection col; + TestCollectable2 test; + TestCollectable2 test2; + + TestSuite::clearCheckpoints(); + col.addInstance(test); + + TEST_CASE("0","[前提] ちゃんと登録されている", col.getInstance(typeid(TestCollectable2)) != 0); + + TEST_CASE("1", "関数は成功する", col.replaceInstance(test2)); + TEST_CASE("2", "インスタンスは入れ替わっている", col.getInstance(typeid(TestCollectable2)) == &test2); + TEST_CASE("3", "test2以外にインスタンスはない", col.getInstance(typeid(TestCollectable2), &test2) == 0); + TEST_CASE("4", "デストラクタは実行されてない", !TestSuite::isReached("TestCollectable2::~TestCollectable2")); + } END_CASE; + + BEGIN_CASE("2","登録済みのインスタンスを派生クラスのインスタンスで入れ替える") { + Collection col; + TestCollectable2 test; + TestCollectable4 test2; + + TestSuite::clearCheckpoints(); + col.addInstance(test); + + TEST_CASE("0","[前提] ちゃんと登録されている", col.getInstance(typeid(TestCollectable2)) != 0); + + TEST_CASE("1", "関数は成功する", col.replaceInstance(test2)); + TEST_CASE("2", "インスタンスは入れ替わっている", col.getInstance() == &test2); + TEST_CASE("3", "test2以外にインスタンスはない", col.getInstance(typeid(TestCollectable2)) == 0); + TEST_CASE("4", "デストラクタは実行されてない", !TestSuite::isReached("TestCollectable2::~TestCollectable2")); + } END_CASE; + + BEGIN_CASE("3","無関係なクラスを指定して入れ替える") { + Collection col; + TestCollectable2 test; + TestCollectable4 test2; + + TestSuite::clearCheckpoints(); + col.addInstance(test); + + TEST_CASE("0","[前提] ちゃんと登録されている", col.getInstance(typeid(TestCollectable2)) != 0); + + TEST_CASE("1", "関数は失敗する", !col.replaceInstance(test2)); + TEST_CASE("2", "インスタンスは残っている", col.getInstance() == &test); + } END_CASE; + + BEGIN_CASE("4","登録済みのインスタンスを入れ替える (動的確保)") { + Collection col; + TestCollectable2 * test = new TestCollectable2; + TestCollectable2 test2; + + TestSuite::clearCheckpoints(); + col.addInstance(test); + + TEST_CASE("0","[前提] ちゃんと登録されている", col.getInstance(typeid(TestCollectable2)) != 0); + + TEST_CASE("1", "関数は成功する", col.replaceInstance(test2)); + TEST_CASE("2", "インスタンスは入れ替わっている", col.getInstance(typeid(TestCollectable2)) == &test2); + TEST_CASE("3", "test2以外にインスタンスはない", col.getInstance(typeid(TestCollectable2), &test2) == 0); + TEST_CASE("4", "デストラクタは実行されてる", TestSuite::isReached("TestCollectable2::~TestCollectable2")); + } END_CASE; + + } END_CASE; +} + + +class TestRuntimeObject : public RuntimeObject +{ +public: + TestRuntimeObject(void) { CHECKPOINT("TestRuntimeObject::TestRuntimeObject"); } + ~TestRuntimeObject(void) { CHECKPOINT("TestRuntimeObject::~TestRuntimeObject"); } +}; + +class TestRuntimeObject2 : public RuntimeObject +{ +public: + TestRuntimeObject2(void) : RuntimeObject(true) { CHECKPOINT("TestRuntimeObject2::TestRuntimeObject2"); } + ~TestRuntimeObject2(void) { CHECKPOINT("TestRuntimeObject2::~TestRuntimeObject2"); } +}; + +TESTSUITE(main, RuntimeObjectTable) +{ + Singleton::Context context; + Singleton::saveContext(context); + + BEGIN_CASE("getInstance","getInstance") { + BEGIN_CASE("1","getInstanceは正しく機能する") { + Singleton::renewInstance(); + TestCollectable test; + + Singleton::getInstance()->addInstance(test); + + BEGIN_CASE("1","getInstance(typeid)") { + if(RuntimeObjectTable::getInstance(typeid(TestCollectable)) != &test) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","getInstance()") { + if(RuntimeObjectTable::getInstance() != &test) + TEST_FAIL; + } END_CASE; + } END_CASE; + } END_CASE; + + BEGIN_CASE("RuntimeObject","RuntimeObject") { + BEGIN_CASE("1","生成すると登録され、破棄で消滅する") { + TestRuntimeObject * ro; + + TestSuite::clearCheckpoints(); + + TEST_CASE("0","[前提] 登録されていない", RuntimeObjectTable::getInstance() == 0); + + ro = new TestRuntimeObject; + + TEST_CASE("1","コンストラクタが実行されている", TestSuite::isReached("TestRuntimeObject::TestRuntimeObject")); + TEST_CASE("2","登録されている", RuntimeObjectTable::getInstance() == ro); + + delete ro; + + TEST_CASE("3","デストラクタが実行されている", TestSuite::isReached("TestRuntimeObject::~TestRuntimeObject")); + TEST_CASE("4","登録が解除されている", RuntimeObjectTable::getInstance() == 0); + + } END_CASE; + + BEGIN_CASE("2","自動破棄のチェック") { + TestRuntimeObject * ro; + TestRuntimeObject2 * ro2; + + TestSuite::clearCheckpoints(); + + TEST_CASE("0","[前提] 登録されていない", RuntimeObjectTable::getInstance() == 0); + TEST_CASE("0","[前提] 登録されていない", RuntimeObjectTable::getInstance() == 0); + + ro = new TestRuntimeObject; + ro2 = new TestRuntimeObject2; + + TEST_CASE("1","コンストラクタが実行されている(ro)", TestSuite::isReached("TestRuntimeObject::TestRuntimeObject")); + TEST_CASE("2","コンストラクタが実行されている(ro2)", TestSuite::isReached("TestRuntimeObject2::TestRuntimeObject2")); + TEST_CASE("3","登録されている(ro)", RuntimeObjectTable::getInstance() == ro); + TEST_CASE("4","登録されている(ro2)", RuntimeObjectTable::getInstance() == ro2); + + Singleton::getInstance()->clear(); + + TEST_CASE("5","デストラクタは実行されていない (ro)", !TestSuite::isReached("TestRuntimeObject::~TestRuntimeObject")); + TEST_CASE("6","デストラクタは実行されている (ro2)", TestSuite::isReached("TestRuntimeObject2::~TestRuntimeObject2")); + TEST_CASE("7","登録が解除されている", RuntimeObjectTable::getInstance() == 0); + TEST_CASE("8","登録が解除されている", RuntimeObjectTable::getInstance() == 0); + + delete ro; + } END_CASE; + + } END_CASE; + + Singleton::restoreContext(context); +} + +#endif + diff --git a/uzume_prototype/kernel/cfg/base/collection.h b/uzume_prototype/kernel/cfg/base/collection.h new file mode 100644 index 0000000..6826c0f --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/collection.h @@ -0,0 +1,262 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: collection.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/collection.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#ifndef COLLECTION_H +#define COLLECTION_H + +#include "base/testsuite.h" +#include "base/singleton.h" + +#include +#include + + //Collectionに登録したいオブジェクトのクラスの基底クラス +class Collectable +{ +public: + Collectable(void) throw() {} //特に何もしない + virtual ~Collectable(void) throw() {} //特に何もしない +}; + + + + //ある型のインスタンスを登録して保持するためのクラス +class Collection +{ +public: + struct Element + { + Collectable * instance; + bool destruction; + }; + +protected: + std::list container; + + //predecessorの次を指すイテレータを得る (getInstance) + std::list::const_iterator _findInstance(const Collectable * predecesor) const throw(); + +public: + //コンストラクタ & デストラクタ + Collection(void) throw(); + virtual ~Collection(void) throw(); + + //有効判定 + inline bool isValid(void) const throw() + { return this != 0; } + + //コレクションへの追加 (ポインタ用) + bool addInstance(Collectable * instance, bool destruction = true) throw(); + + //コレクションへの追加 (実体用) + inline bool addInstance(Collectable & instance, bool destruction = false) throw() + { return addInstance(&instance, destruction); } + + //コレクションからの取得 (完全一致) + Collectable * getInstance(const std::type_info & type, const Collectable * predecessor = 0) const throw(); + + //コレクションからの取得 (派生したものもサーチ) + template T * getInstance(const Collectable * predecessor = 0) const throw() + { + T * result = 0; + + if(isValid()) { + std::list::const_iterator iterator = _findInstance(predecessor); + + while(iterator != container.end()) { + result = dynamic_cast(iterator->instance); + if(result != 0) + break; + ++ iterator; + } + } + return result; + } + + //コレクションから派生先を含む全てのクラスインスタンスを削除 (破棄対象の場合は破棄も行う) + template void deleteInstance(void) throw() + { + if(isValid()) { + std::list::iterator iterator; + + iterator = container.begin(); + while(iterator != container.end()) { + if(dynamic_cast(iterator->instance) != 0) { + + //削除対象ならインスタンスを削除 + if(iterator->destruction) + delete iterator->instance; + + //リストから除外 + std::list::iterator target = iterator; + ++ iterator; + container.erase(target); + } + else + ++ iterator; + } + } + } + + //関連付けられたインスタンスを入れ替える + template inline bool replaceInstance(Collectable * instance, bool destruction = true) throw() + { + //自分と無関係なクラスはインデックスとして指定できない + if(dynamic_cast(instance) == 0) + return false; + + deleteInstance(); + return addInstance(instance, destruction); + } + + //関連付けられたインスタンスを入れ替える + template inline bool replaceInstance(Collectable & instance, bool destruction = false) throw() + { + //自分と無関係なクラスはインデックスとして指定できない + if(dynamic_cast(&instance) == 0) + return false; + + deleteInstance(); + return addInstance(&instance, destruction); + } + + + //コレクションからインスタンスを除外 (破棄はしない) + bool removeInstance(const Collectable * instance) throw(); + + //全要素の破棄 + void clear(void); + + TESTSUITE_PROTOTYPE(main) +}; + + + //実行時オブジェクト参照テーブル +class RuntimeObjectTable : protected Collection +{ +friend class RuntimeObject; +public: + SINGLETON_CONSTRUCTOR(RuntimeObjectTable) throw() {} + + static Collectable * getInstance(const std::type_info & type, const Collectable * predecessor = 0) throw() + { + RuntimeObjectTable * table = Singleton::getInstance(std::nothrow); + Collectable * result = 0; + + if(table != 0) + result = table->Collection::getInstance(type, predecessor); + return result; + } + + //コレクションからの取得 (派生したものもサーチ) + template static T * getInstance(const Collectable * predecessor = 0) throw() + { + RuntimeObjectTable * table = Singleton::getInstance(); + T * result = 0; + + if(table != 0) { + std::list::const_iterator iterator = table->_findInstance(predecessor); + + while(iterator != table->container.end()) { + result = dynamic_cast(iterator->instance); + if(result != 0) + break; + ++ iterator; + } + } + return result; + } + + /* Visual C++ 6.0 Fatal error C1001対策 */ + template static T * getInstance(T ** dest, const Collectable * predecessor = 0) throw() + { + RuntimeObjectTable * table = Singleton::getInstance(); + T * result = 0; + + if(table != 0) { + std::list::const_iterator iterator = table->_findInstance(predecessor); + + while(iterator != table->container.end()) { + result = dynamic_cast(iterator->instance); + if(result != 0) + break; + ++ iterator; + } + } + if(dest != 0) + *dest = result; + + return result; + } + + TESTSUITE_PROTOTYPE(main) +}; + + //実行時オブジェクト +class RuntimeObject : public Collectable +{ +public: + RuntimeObject(bool destruction = false) throw() + { + RuntimeObjectTable * table = Singleton::getInstance(); + if(table != 0) + table->addInstance(this, destruction); + } + + virtual ~RuntimeObject(void) throw() + { + RuntimeObjectTable * table = Singleton::getInstance(); + if(table != 0) + table->removeInstance(this); + } +}; + + /* 呪 fatal error C1001: INTERNAL COMPILER ERROR (msc1.cpp:1794) */ +#if _MSC_VER < 1300 +# define getRuntimeObjectInstance(x) (dynamic_cast(RuntimeObjectTable::getInstance(typeid(x)))) //正確には透過ではないが、これで逃げるしかない +#else +# define getRuntimeObjectInstance(x) (RuntimeObjectTable::getInstance()) +#endif + + +#endif + + + diff --git a/uzume_prototype/kernel/cfg/base/component.cpp b/uzume_prototype/kernel/cfg/base/component.cpp new file mode 100644 index 0000000..78cf732 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/component.cpp @@ -0,0 +1,1581 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: component.cpp,v 1.2 2012/06/17 00:24:19 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/component.cpp,v 1.2 2012/06/17 00:24:19 suikan Exp $ + +#include "base/component.h" + +#include + +using namespace std; + + //コンポーネント全体が使用できるならtrue +bool Component::is_valid = true; + + //コンポーネントの登録 +bool Component::ComponentInfo::addComponent(Component * component, int order) throw() +{ + bool result = false; + + if(this != 0 && component != 0) { + componentList.insert(multimap::value_type(order, component)); + result = true; + } + + return result; +} + + //コンポーネントの登録解除 +void Component::ComponentInfo::removeComponent(Component * component, int order) throw() +{ + if(this != 0 && component != 0) { + multimap::iterator scope; + + scope = componentList.lower_bound(order); + while(scope != componentList.end()) { + //もう指定された優先度はすべて見た + if(scope->first != order) + break; + + //指定されたコンポーネントに一致したら削除 + if(scope->second == component) { + multimap::iterator target = scope; + ++ scope; + componentList.erase(target); + } + else + ++ scope; + } + } +} + + //コンポーネントの登録解除 +void Component::ComponentInfo::removeComponent(Component * component) throw() +{ + if(this != 0 && component != 0) { + multimap::iterator scope; + + //指定されたコンポーネントに一致するものを全て削除 + scope = componentList.begin(); + while(scope != componentList.end()) { + if(scope->second == component) { + multimap::iterator target = scope; + ++ scope; + componentList.erase(target); + } + else + ++ scope; + } + + } +} + + //コンポーネントの起動要求の発行 +bool Component::ComponentInfo::activateComponent(Component * component) throw() +{ + bool result = false; + + if(this != 0 && component != 0) { + //起動要求の末尾に加える + activatedComponentList.push_back(component); + result = true; + } + + return result; +} + + //オプションのパース +void Component::ComponentInfo::parseOption(OptionParameter & option) +{ + if(this != 0) { + multimap::iterator scope; + + //全てのコンポーネントのparseOptionを実行 + scope = componentList.begin(); + while(scope != componentList.end()) { + DebugMessage("Component::parseOption start - %\n") << typeid(*scope->second).name(); + scope->second->parseOption(option); + DebugMessage("Component::parseOption finish - %\n") << typeid(*scope->second).name(); + ++ scope; + } + } +} + + //コンポーネントの起動 +void Component::ComponentInfo::activateComponent(void) +{ + if(this != 0) { + list::iterator scope; + + try { + //起動要求のあった全てのコンポーネントを起動 + scope = activatedComponentList.begin(); + while(scope != activatedComponentList.end()) { + DebugMessage("Component::body start - %\n") << typeid(**scope).name(); + (*scope)->body(); + DebugMessage("Component::body finish - %\n") << typeid(**scope).name(); + ++ scope; + } + //要求リストをクリア + activatedComponentList.clear(); + } + catch(...) { + //onFatalExit用に、activatedComponentListを起動をかけたコンポーネントだけに絞る + ++ scope; + if(scope != activatedComponentList.end()) + activatedComponentList.erase(scope, activatedComponentList.end()); + + throw; + } + } +} + + //異常処理ハンドラの起動 +void Component::ComponentInfo::onFatalExit(void) +{ + if(this != 0) { + Component * handler; + + //起動要求のあった全てのコンポーネントを起動 + while(!activatedComponentList.empty()) { + handler = *activatedComponentList.begin(); + activatedComponentList.pop_front(); + + //ハンドラを起動 + DebugMessage("Component::onFatalExit start - %\n") << typeid(*handler).name(); + handler->onFatalExit(); + DebugMessage("Component::onFatalExit fihish - %\n") << typeid(*handler).name(); + } + //要求リストをクリア + activatedComponentList.clear(); + } +} + + +/* + * Component : コンポーネント + */ + + //コンストラクタ +Component::Component(int order) throw() : RuntimeObject() +{ + //ここで初めてシングルトンインスタンスにアクセスするので、bad_allocが発生する可能性がある + try { + Singleton::getInstance()->addComponent(this, order); + } + catch(bad_alloc) { + is_valid = false; + } +} + + //デストラクタ +Component::~Component(void) throw() +{ Singleton::getInstance()->removeComponent(this); } + + //コンポーネントの実行 +void Component::executeComponents(int argc, char * argv []) +{ + OptionParameter & option = getOptionParameter(); + + option.parseOption(argc, argv); + executeComponents(option); +} + + //コンポーネントの実行 +void Component::executeComponents(OptionParameter & option) +{ + if(isValid()) { + + _parseCommonOption(option); + + try { + //オプションのパース + Singleton::getInstance()->parseOption(option); + + //全てのオプションが使用済みでなければエラー + if(!option.validateOption()) { + CHECKPOINT("Exception_UnknownOption"); + ExceptionMessage("Unknown option [%] found.","不明なオプションが指定された : %") << option.getInvalidOptions() << throwException; + } + else { + //コンポーネントの実行 + Singleton::getInstance()->activateComponent(); + } + } + + //例外の発生 -> 異常終了ハンドラの起動 + catch(...) { + bool continuation; + do { + try { + continuation = true; + Singleton::getInstance()->onFatalExit(); + continuation = false; + } + catch(Exception & e) { + CHECKPOINT("Exception_onFatalExit"); + cerr << Message("[Internal error] onFatalExit threw an exception! : ","[内部エラー] onFatalExit中の例外! : ") << e.getDetails() << '\n'; + } + } while(continuation); + + throw; + } + } +} + + + //一般的なオプションの処理 +void Component::_parseCommonOption(OptionParameter & option) throw() +{ + //デバッグ処理 + if(option.find("debug")) { + DebugMessage::setStream(&cerr); + DebugMessage::setVerbose(true); + } + + //言語選択 + if(option.find("lj") || option.find("-japanese")) + Message::selectLanguage(Message::JAPANESE); + if(option.find("le") || option.find("-english")) + Message::selectLanguage(Message::ENGLISH); + + //冗長メッセージ + if(option.find("v") || option.find("-verbose")) { + VerboseMessage::setStream(&cout); + VerboseMessage::setVerbose(true); + } + + //バナー表示 + if((!getBanner().empty() && option.find("v")) || option.find("-verbose") || option.find("h") || option.find("-help")) + cout << getBanner() << endl; + + //ヘルプ表示 + if(option.find("h") || option.find("-help")) + cout << '\n' << Message( + "Global option\n" + " -lj, --japanese : Use Japanese as default language\n" + " -le, --english : Use English as default language\n" + " -v, --verbose : Verbose Message\n", + "全体のオプション\n" + " -lj, --japanese : 日本語で表示します\n" + " -le, --english : 英語で表示します\n" + " -v, --verbose : 冗長メッセージを出力します\n"); +} + + //バナーアクセサ +void Component::setBanner(string src) throw(bad_alloc) +{ + ComponentInfo * info = Singleton::getInstance(); + info->setBanner(src); +} + +string Component::getBanner(void) throw(bad_alloc) +{ + ComponentInfo * info = Singleton::getInstance(); + return info->getBanner(); +} + +/* + * 過去との互換性のためのパラメータ操作API + */ + + /* 指定されたオプションの存在を確認し、必要であればそのパラメータを取得する */ +bool Component::findOption(const char * key1, const char * key2, std::string * element) throw() +{ + OptionParameter::OptionItem item; + + item = getOption(key1, key2, true); + if(item.isValid() && element != 0 && item.hasParameter()) + *element = item[0]; + + return item.isValid(); +} + + /* 存在確認 + チェックをつける */ +bool Component::checkOption(const char * key1, const char * key2) throw() +{ return getOption(key1, key2, true).isValid(); } + + /* 指定された名前のオプションパラメータを取得 */ +OptionParameter::OptionItem Component::getOption(const char * key1, const char * key2, bool dirty) throw() +{ + OptionParameter::OptionItem item; + + if(key1 != 0) + item = getOptionParameter().get(key1, dirty); + + if(key2 != 0) { + if(item.isValid()) + item.mergeItem(getOptionParameter().get(string("-") + key2, dirty)); + else + item = getOptionParameter().get(string("-") + key2, dirty); + } + + return item; +} + + /* 2つのオプション項目をマージする (放っておいてもマージされるので気にしない) */ +OptionParameter::OptionItem Component::mergeOption(const char * key1, const char * key2) throw() +{ return getOption(key1, key2); } + + + +/****************************************************** テストスィート ******************************************************/ + +#ifdef TESTSUITE +#include "coverage_undefs.h" + +namespace { + int counter = 0; + + class TestComponent : public Component + { + public: + bool check_parseOption; + bool check_body; + bool check_onFatalExit; + bool activation; + bool throw_parseOption; + bool throw_body; + bool throw_onFatalExit; + int actcnt; + + TestComponent(int order = GENERAL_PURPOSE) : Component(order) + { + check_parseOption = false; + check_body = false; + check_onFatalExit = false; + activation = false; + throw_parseOption = false; + throw_body = false; + throw_onFatalExit = false; + } + + void parseOption(OptionParameter & option) throw(Exception) + { + actcnt = ++counter; + check_parseOption = true; + if(activation) + activateComponent(); + if(throw_parseOption) + ExceptionMessage("exception","exception").throwException(); + } + + void body(void) throw(Exception) + { + actcnt = ++counter; + check_body = true; + if(throw_body) + ExceptionMessage("exception","exception").throwException(); + } + + void onFatalExit(void) throw(Exception) + { + actcnt = ++counter; + check_onFatalExit = true; + if(throw_onFatalExit) + ExceptionMessage("exception","exception").throwException(); + } + }; + + class DerivedTestComponent : public TestComponent + {}; +} + + +TESTSUITE_(main,ComponentInfo,Component) +{ + Singleton::Context context; + Singleton::saveContext(context); + Singleton::renewInstance(); + + BEGIN_CASE("addComponent","addComponent") { + + BEGIN_CASE("1","正しく追加できる") { + ComponentInfo info; + + BEGIN_CASE("1","関数は成功する") { + if(!info.addComponent((Component *)0x1234, 10)) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","追加されている") { + if(info.componentList.size() != 1) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3", "内容が正しい") { + if(info.componentList.begin()->first != 10 || info.componentList.begin()->second != (Component *)0x1234) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("2","NULLインスタンスは登録できない") { + ComponentInfo info; + + BEGIN_CASE("1","関数は失敗する") { + if(info.addComponent(0, 10)) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","要素は追加されていない") { + if(info.componentList.size() != 0) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("3","NULLインスタンスに操作するとfalseが返る") { + if(((ComponentInfo *)0)->addComponent((Component *)0x1234, 10)) + TEST_FAIL; + } END_CASE; + + } END_CASE; + + BEGIN_CASE("removeComponent(Component *, int)","removeComponent(Component *, int)") { + BEGIN_CASE("1", "正しく解除できる") { + ComponentInfo info; + + info.addComponent((Component *)0x0123, 10); //38行目のifのelseを実行させるためのダミー + info.addComponent((Component *)0x1234, 10); + info.addComponent((Component *)0x1234, 20); + + info.removeComponent((Component *)0x1234, 10); + info.removeComponent((Component *)0x0123, 10); + + BEGIN_CASE("1","要素数が1") { + if(info.componentList.size() != 1) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","残った要素のorderは20") { + if(info.componentList.begin()->first != 20) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("2", "NULLオブジェクトから実行しても大丈夫") { + ((ComponentInfo *)0)->removeComponent(0, 0); + } END_CASE; + } END_CASE; + + BEGIN_CASE("removeComponent(Component *)","removeComponent(Component *)") { + BEGIN_CASE("1", "正しく解除できる") { + ComponentInfo info; + multimap::iterator scope; + + info.addComponent((Component *)0x1234, 10); + info.addComponent((Component *)0x1235, 10); + info.addComponent((Component *)0x1234, 20); + info.addComponent((Component *)0x1235, 20); + + info.removeComponent((Component *)0x1234); + + BEGIN_CASE("1","要素数が2") { + if(info.componentList.size() != 2) + TEST_FAIL; + } END_CASE; + + scope = info.componentList.begin(); + BEGIN_CASE("2","残った要素の内容は正しい") { + if(scope->first != 10 || scope->second != (Component *)0x1235) + TEST_FAIL; + ++ scope; + if(scope->first != 20 || scope->second != (Component *)0x1235) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("2", "NULLオブジェクトから実行しても大丈夫") { + ((ComponentInfo *)0)->removeComponent(0); + } END_CASE; + } END_CASE; + + BEGIN_CASE("activateComponent","activateComponent") { + BEGIN_CASE("1","正常に追加できる") { + ComponentInfo info; + + BEGIN_CASE("1","関数は成功する") { + if(!info.activateComponent((Component *)0x1234)) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","起動要求リストに正しく追加されている") { + if(info.activatedComponentList.size() != 1) + TEST_FAIL; + if(*info.activatedComponentList.begin() != (Component *)0x1234) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3","NULLオブジェクトから発行しても暴走しない") { + ((ComponentInfo *)0)->activateComponent(); + } END_CASE; + } END_CASE; + + BEGIN_CASE("1","NULLインスタンスは追加されない") { + ComponentInfo info; + + BEGIN_CASE("1","関数は失敗する") { + if(info.activateComponent((Component *)0)) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","起動要求リストは空のまま") { + if(!info.activatedComponentList.empty()) + TEST_FAIL; + } END_CASE; + } END_CASE; + } END_CASE; + + BEGIN_CASE("Component::Component","Component::Component") { + Singleton::renewInstance(); + TestComponent * test = 0; + + BEGIN_CASE("0","前提条件を満たす") { + if(Singleton::getInstance()->componentList.size() != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("1","Componentをインスタンス化すると、勝手に登録される") { + test = new TestComponent; + if(Singleton::getInstance()->componentList.size() != 1) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","登録されている内容は正しい") { + if(Singleton::getInstance()->componentList.begin()->second != test) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3","破棄するとエントリが消える") { + delete test; + if(Singleton::getInstance()->componentList.size() != 0) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("parseOption","parseOption") { + + BEGIN_CASE("1","parseOptionを実行すると登録されたコンポーネントのparseOptionが実行される") { + Singleton::renewInstance(); + + TestComponent test; + TestComponent test2; + + Singleton::getInstance()->parseOption(getOptionParameter()); + + if(!test.check_parseOption || !test2.check_parseOption) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","起動順序が正しい (同一レベルなら登録順)") { + Singleton::renewInstance(); + + TestComponent test; + TestComponent test2; + + counter = 0; + Singleton::getInstance()->parseOption(getOptionParameter()); + + if(test.actcnt != 1 || test2.actcnt != 2 ) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3","起動順序が正しい (優先度順)") { + Singleton::renewInstance(); + + TestComponent test(10); + TestComponent test2(1); + + counter = 0; + Singleton::getInstance()->parseOption(getOptionParameter()); + + if(test.actcnt != 2 || test2.actcnt != 1 ) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("4","activateをかけるとactivateListに登録される") { + Singleton::renewInstance(); + + TestComponent test; + TestComponent test2; + list::iterator scope; + + test.activation = true; + test2.activation = true; + Singleton::getInstance()->parseOption(getOptionParameter()); + + if(Singleton::getInstance()->activatedComponentList.size() != 2) + TEST_FAIL; + scope = Singleton::getInstance()->activatedComponentList.begin(); + if(*scope != &test) + TEST_FAIL; + ++ scope; + if(*scope != &test2) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("5","例外は抜けてくる") { + Singleton::renewInstance(); + + TestComponent test; + TestComponent test2; + list::iterator scope; + bool result = false; + + Exception::setThrowControl(true); + test.throw_parseOption = true; + try { + Singleton::getInstance()->parseOption(getOptionParameter()); + } + catch(...) { + result = true; + } + + if(!result) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("6","例外前に登録されたactivateは残る") { + Singleton::renewInstance(); + + TestComponent test; + TestComponent test2; + list::iterator scope; + bool result = false; + + Exception::setThrowControl(true); + test.activation = true; + test2.throw_parseOption = true; + try { + Singleton::getInstance()->parseOption(getOptionParameter()); + } + catch(...) { + result = true; + } + + if(!result) + TEST_FAIL; + + if(Singleton::getInstance()->activatedComponentList.size() != 1) + TEST_FAIL; + + if(*Singleton::getInstance()->activatedComponentList.begin() != &test) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("7","NULLインスタンスからのコールに耐える") { + ((ComponentInfo *)0)->parseOption(getOptionParameter()); + } END_CASE; + }END_CASE; + + BEGIN_CASE("activateCompoent/Component::body","activateCompoent/Component::body") { + BEGIN_CASE("1","activateComponentをすると、起動要求を出したコンポーネントが起動される") { + Singleton::renewInstance(); + + TestComponent test; + TestComponent test2; + + test.activation = true; + test2.activation = true; + Singleton::getInstance()->parseOption(getOptionParameter()); + Singleton::getInstance()->activateComponent(); + + if(!test.check_body || !test2.check_body) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","起動要求を出さないコンポーネントは起動されない") { + Singleton::renewInstance(); + + TestComponent test; + TestComponent test2; + + test.activation = false; + test2.activation = true; + Singleton::getInstance()->parseOption(getOptionParameter()); + Singleton::getInstance()->activateComponent(); + + if(test.check_body || !test2.check_body) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3","起動順序が正しい (同一レベルなら登録順)") { + Singleton::renewInstance(); + + TestComponent test; + TestComponent test2; + counter = 0; + + test.activation = test2.activation = true; + Singleton::getInstance()->parseOption(getOptionParameter()); + Singleton::getInstance()->activateComponent(); + + if(test.actcnt != 3 || test2.actcnt != 4 ) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("4","起動順序が正しい (優先度順)") { + Singleton::renewInstance(); + + TestComponent test(10); + TestComponent test2(4); + counter = 0; + + test.activation = test2.activation = true; + Singleton::getInstance()->parseOption(getOptionParameter()); + Singleton::getInstance()->activateComponent(); + + if(test.actcnt != 4 || test2.actcnt != 3 ) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("5","例外は抜けてくる") { + Singleton::renewInstance(); + + TestComponent test; + TestComponent test2; + list::iterator scope; + bool result = false; + + Exception::setThrowControl(true); + test.activation = test2.activation = true; + test.throw_body = true; + Singleton::getInstance()->parseOption(getOptionParameter()); + try { + Singleton::getInstance()->activateComponent(); + } + catch(...) { + result = true; + } + + if(!result) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("6","例外を起こしたら、それまでに起動したコンポーネントがactivatedComponentListに残る") { + Singleton::renewInstance(); + + TestComponent test; + TestComponent test2; + bool result = false; + + Exception::setThrowControl(true); + test.activation = test2.activation = true; + test.throw_body = true; + Singleton::getInstance()->parseOption(getOptionParameter()); + try { + Singleton::getInstance()->activateComponent(); + } + catch(...) { + result = true; + } + + if(!result) + TEST_FAIL; + + if(Singleton::getInstance()->activatedComponentList.size() != 1) + TEST_FAIL; + + if(*Singleton::getInstance()->activatedComponentList.begin() != &test) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("8","例外を起こしたら、それまでに起動したコンポーネントがactivatedComponentListに残る(2個目)") { + Singleton::renewInstance(); + + TestComponent test; + TestComponent test2; + list::iterator scope; + bool result = false; + + Exception::setThrowControl(true); + test.activation = test2.activation = true; + test2.throw_body = true; + Singleton::getInstance()->parseOption(getOptionParameter()); + try { + Singleton::getInstance()->activateComponent(); + } + catch(...) { + result = true; + } + + if(!result) + TEST_FAIL; + + if(Singleton::getInstance()->activatedComponentList.size() != 2) + TEST_FAIL; + scope = Singleton::getInstance()->activatedComponentList.begin(); + if(*scope != &test) + TEST_FAIL; + ++ scope; + if(*scope != &test2) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("onFatalExit","onFatalExit") { + BEGIN_CASE("1","OnFatalExitをすると起動要求リストにあるコンポーネントが呼ばれる") { + Singleton::renewInstance(); + + TestComponent test; + TestComponent test2; + + test.activation = test2.activation = true; + test2.throw_body = true; + Singleton::getInstance()->parseOption(getOptionParameter()); + try{ Singleton::getInstance()->activateComponent(); } catch(...) {} + Singleton::getInstance()->onFatalExit(); + + if(!test.check_onFatalExit || !test2.check_onFatalExit) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","起動要求を出さないコンポーネントは起動されない") { + Singleton::renewInstance(); + + TestComponent test; + TestComponent test2; + + test.activation = false; + test2.activation = true; + test2.throw_body = true; + Singleton::getInstance()->parseOption(getOptionParameter()); + try{ Singleton::getInstance()->activateComponent(); } catch(...) {} + Singleton::getInstance()->onFatalExit(); + + if(test.check_onFatalExit || !test2.check_onFatalExit) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("4","起動順序が正しい (同一レベルなら登録順)") { + Singleton::renewInstance(); + + TestComponent test; + TestComponent test2; + counter = 0; + + test2.throw_body = true; + test.activation = test2.activation = true; + Singleton::getInstance()->parseOption(getOptionParameter()); + try{ Singleton::getInstance()->activateComponent(); } catch(...) {} + Singleton::getInstance()->onFatalExit(); + + if(test.actcnt != 5 || test2.actcnt != 6 ) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("5","起動順序が正しい (優先度順)") { + Singleton::renewInstance(); + + TestComponent test(10); + TestComponent test2(4); + counter = 0; + + test.activation = test2.activation = true; + test.throw_body = true; + Singleton::getInstance()->parseOption(getOptionParameter()); + try{ Singleton::getInstance()->activateComponent(); } catch(...) {} + Singleton::getInstance()->onFatalExit(); + + if(test.actcnt != 6 || test2.actcnt != 5 ) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("6","例外は抜けてくる") { + Singleton::renewInstance(); + + TestComponent test; + TestComponent test2; + list::iterator scope; + bool result = false; + + Exception::setThrowControl(true); + test.activation = test2.activation = true; + test2.throw_body = true; + test.throw_onFatalExit = true; + Singleton::getInstance()->parseOption(getOptionParameter()); + try{ Singleton::getInstance()->activateComponent(); } catch(...) {} + try { + Singleton::getInstance()->onFatalExit(); + } + catch(...) { + result = true; + } + + if(!result) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("7","例外が起きたとき、まだ実行されていないコンポーネントのハンドラ起動要求は残る") { + Singleton::renewInstance(); + + TestComponent test; + TestComponent test2; + list::iterator scope; + bool result = false; + + Exception::setThrowControl(true); + test.activation = test2.activation = true; + test2.throw_body = true; + test.throw_onFatalExit = true; + Singleton::getInstance()->parseOption(getOptionParameter()); + try{ Singleton::getInstance()->activateComponent(); } catch(...) {} + try{ + Singleton::getInstance()->onFatalExit(); + } + catch(...) { + result = true; + } + + if(!result) + TEST_FAIL; + + if(Singleton::getInstance()->activatedComponentList.size() != 1) + TEST_FAIL; + + if(*Singleton::getInstance()->activatedComponentList.begin() != &test2) + TEST_FAIL; + + } END_CASE; + + BEGIN_CASE("8","NULLオブジェクトから発行しても大丈夫") { + ((ComponentInfo *)0)->onFatalExit(); + } END_CASE; + + } END_CASE; + + BEGIN_CASE("isActive","isActive") { + BEGIN_CASE("1","起動したコンポーネントを判定できる") { + Singleton::renewInstance(); + + TestComponent test; + Singleton::getInstance()->activateComponent(&test); + + if(!Singleton::getInstance()->isActive()) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","起動していないコンポーネントには反応しない") { + Singleton::renewInstance(); + + TestComponent test; + + if(Singleton::getInstance()->isActive()) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3","派生したコンポーネントのインスタンスには反応する") { + Singleton::renewInstance(); + + DerivedTestComponent test; + Singleton::getInstance()->activateComponent(&test); + + if(!Singleton::getInstance()->isActive()) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("4","複数起動していても要求に合ったものを探せる") { //isActiveのif(dynamic_cast(iterator->instance) != 0)のelse節を実行させるのが目的 + Singleton::renewInstance(); + + TestComponent test; + Singleton::getInstance()->activateComponent(&test); + DerivedTestComponent test2; + Singleton::getInstance()->activateComponent(&test2); + + if(!Singleton::getInstance()->isActive()) + TEST_FAIL; + } END_CASE; + } END_CASE; + + + Singleton::restoreContext(context); +} + +//-------- + + +TESTSUITE(main,Component) +{ + SingletonBase::ContextChain chain; + + chain.saveContext(); + chain.saveContext(); + chain.saveContext(); + chain.saveContext(); + chain.saveContext(); + + BEGIN_CASE("executeComponent","executeComponent") { + BEGIN_CASE("1","特に何もなけばparseOption/bodyが実行される") { + chain.renewInstance(); + + bool result = true; + TestComponent test; + test.activation = true; + + Exception::setThrowControl(true); + try { executeComponents(getOptionParameter()); } + catch(...) { result = false; } + + BEGIN_CASE("1","例外は起こらない") { + if(!result) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","parseOption/bodyは実行される") { + if(!test.check_parseOption || !test.check_body || test.check_onFatalExit) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("2","処理してないオプションがある") { + TestSuite::clearCheckpoints(); + chain.renewInstance(); + + char * argv[] = { "test.exe", "-test" }; + bool result = false; + TestComponent test; + test.activation = true; + + getOptionParameter().parseOption(2, argv); + Exception::setThrowControl(true); + try { executeComponents(getOptionParameter()); } + catch(...) { result = true; } + + BEGIN_CASE("1","例外が起こる") { + if(!result) + TEST_FAIL; + if(!TestSuite::isReached("Exception_UnknownOption")) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","parseOption/onFatalExitは実行されるがbodyは実行されない") { + if(!test.check_parseOption || test.check_body || !test.check_onFatalExit) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("3","オプションパース中に例外 (activateなし)") { + chain.renewInstance(); + + bool result = false; + TestComponent test; + test.throw_parseOption = true; + + Exception::setThrowControl(true); + try { executeComponents(getOptionParameter()); } + catch(...) { result = true; } + + BEGIN_CASE("1","例外が起こる") { + if(!result) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","parseOptionは実行されるがbody/onFatalExitは実行されない") { + if(!test.check_parseOption || test.check_body || test.check_onFatalExit) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("4","オプションパース中に例外 (activateあり)") { + chain.renewInstance(); + + bool result = false; + TestComponent test; + test.throw_parseOption = true; + test.activation = true; + + Exception::setThrowControl(true); + try { executeComponents(getOptionParameter()); } + catch(...) { result = true; } + + BEGIN_CASE("1","例外が起こる") { + if(!result) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","parseOption/onFatalExitは実行されるがbodyは実行されない") { + if(!test.check_parseOption || test.check_body || !test.check_onFatalExit) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("5","bodyで例外") { + chain.renewInstance(); + + bool result = false; + TestComponent test; + test.throw_body = true; + test.activation = true; + + Exception::setThrowControl(true); + try { executeComponents(getOptionParameter()); } + catch(...) { result = true; } + + BEGIN_CASE("1","例外が起こる") { + if(!result) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","parseOption/body/onFatalExitとも実行される") { + if(!test.check_parseOption || !test.check_body || !test.check_onFatalExit) + TEST_FAIL; + } END_CASE; + } END_CASE; + + + BEGIN_CASE("6","onFatalExitで例外") { + TestSuite::clearCheckpoints(); + chain.renewInstance(); + + bool result = false; + TestComponent test; + test.throw_onFatalExit = true; + test.activation = true; + TestComponent test2; + test2.throw_body = true; + test2.activation = true; + + Exception::setThrowControl(true); + try { executeComponents(getOptionParameter()); } + catch(...) { result = true; } + + BEGIN_CASE("1","例外が起こる") { + if(!result) + TEST_FAIL; + if(!TestSuite::isReached("Exception_onFatalExit")) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","最初のコンポーネントはparseOption/body/onFatalExitとも実行される") { + if(!test.check_parseOption || !test.check_body || !test.check_onFatalExit) + TEST_FAIL; + } END_CASE; + BEGIN_CASE("3","次のコンポーネントもparseOption/body/onFatalExitとも実行される") { + if(!test2.check_parseOption || !test2.check_body || !test2.check_onFatalExit) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("7","Component::is_validがfalseのときは実行されない") { + chain.renewInstance(); + + bool result = true; + TestComponent test; + test.activation = true; + + Component::is_valid = false; + Exception::setThrowControl(true); + try { executeComponents(getOptionParameter()); } + catch(...) { result = false; } + + BEGIN_CASE("1","例外は起こらない") { + if(!result) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","parseOption/bodyは実行されない") { + if(test.check_parseOption || test.check_body || test.check_onFatalExit) + TEST_FAIL; + } END_CASE; + + Component::is_valid = true; + } END_CASE; + } END_CASE; + + BEGIN_CASE("_parseCommonOption","_parseCommonOption") { + + BEGIN_CASE("1", "-debugでDebugMessageが有効になる") { + chain.renewInstance(); + + char * argv[] = { "test.exe", "-debug" }; + OptionParameter & param = getOptionParameter(); + + param.parseOption(2, argv); + Component::_parseCommonOption(param); + + if(!DebugMessage::getVerbose()) + TEST_FAIL; + + } END_CASE; + + BEGIN_CASE("2", "-v でVerboseMessageが有効になる") { + chain.renewInstance(); + + char * argv[] = { "test.exe", "-v" }; + OptionParameter & param = getOptionParameter(); + + param.parseOption(2, argv); + Component::_parseCommonOption(param); + + if(!VerboseMessage::getVerbose()) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3", "--verboseでVerboseMessageが有効になる") { + chain.renewInstance(); + + char * argv[] = { "test.exe", "--verbose" }; + OptionParameter & param = getOptionParameter(); + + param.parseOption(2, argv); + Component::_parseCommonOption(param); + + if(!VerboseMessage::getVerbose()) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("4", "-lj でMessageが日本語になる") { + chain.renewInstance(); + + char * argv[] = { "test.exe", "-lj" }; + OptionParameter & param = getOptionParameter(); + + param.parseOption(2, argv); + Component::_parseCommonOption(param); + + if(Message::getCurrentLanguage() != Message::JAPANESE) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("5", "--japanese でMessageが日本語になる") { + chain.renewInstance(); + + char * argv[] = { "test.exe", "--japanese" }; + OptionParameter & param = getOptionParameter(); + + param.parseOption(2, argv); + Component::_parseCommonOption(param); + + if(Message::getCurrentLanguage() != Message::JAPANESE) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("6", "-le でMessageが英語になる") { + chain.renewInstance(); + + char * argv[] = { "test.exe", "-le" }; + OptionParameter & param = getOptionParameter(); + + param.parseOption(2, argv); + Component::_parseCommonOption(param); + + if(Message::getCurrentLanguage() != Message::ENGLISH) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("7", "--english でMessageが英語になる") { + chain.renewInstance(); + + char * argv[] = { "test.exe", "--english" }; + OptionParameter & param = getOptionParameter(); + + param.parseOption(2, argv); + Component::_parseCommonOption(param); + + if(Message::getCurrentLanguage() != Message::ENGLISH) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("8","ヘルプがでる (-h)") { + chain.renewInstance(); + + char * argv[] = { "test.exe", "-h" }; + OptionParameter & param = getOptionParameter(); + + param.parseOption(2, argv); + cout.str(""); + Component::_parseCommonOption(param); + + //とりあえず何か出力されていることだけ確認しておく + if(cout.str().empty()) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("9","ヘルプがでる (--help)") { + chain.renewInstance(); + + char * argv[] = { "test.exe", "--help" }; + OptionParameter & param = getOptionParameter(); + + param.parseOption(2, argv); + cout.str(""); + Component::_parseCommonOption(param); + + //とりあえず何か出力されていることだけ確認しておく + if(cout.str().empty()) + TEST_FAIL; + } END_CASE; + + } END_CASE; + + BEGIN_CASE("getOption","オプションパラメータの取得") { + chain.renewInstance(); + + char * argv[] = { "test.exe","-test","param","-test2","param2", "--test","param3","--test2","param4" }; + getOptionParameter().parseOption(9, argv); + + BEGIN_CASE("1","getOption(test)でparamが取れる") { + OptionParameter::OptionItem item; + + item = getOption("test"); + TEST_CASE("1","有効な値が返る", item.isValid()); + TEST_CASE("2","チェック済みである", item.isChecked()); + TEST_CASE("3","1つのパラメータをもつ", item.countParameter() == 1); + TEST_CASE("4","パラメータの内容があっている", item[0].compare("param") == 0); + } END_CASE; + + BEGIN_CASE("2","getOption(test,test)で2つの連結が取れる") { + OptionParameter::OptionItem item; + + TEST_CASE("0","[前提] --testにチェックはついていない", !getOptionParameter().get("-test",false).isChecked()); + + item = getOption("test","test"); + + TEST_CASE("1","有効な値が返る", item.isValid()); + TEST_CASE("2","チェック済みである", item.isChecked()); + TEST_CASE("3","チェック済みである (test)", getOptionParameter().get("test",false).isChecked()); + TEST_CASE("4","チェック済みである (-test)", getOptionParameter().get("-test",false).isChecked()); + TEST_CASE("5","2つのパラメータを持つ", item.countParameter() == 2); + TEST_CASE("6","1つめのパラメータの値は正しい", item[0].compare("param") == 0); + TEST_CASE("7","2つめのパラメータの値は正しい", item[1].compare("param3") == 0); + } END_CASE; + + BEGIN_CASE("3","getOption(test,unknown)でtestのパラメータが取れる") { + OptionParameter::OptionItem item; + + item = getOption("test","unknown"); + + TEST_CASE("1","有効な値が返る", item.isValid()); + TEST_CASE("2","1つのパラメータを持つ", item.countParameter() == 1); + TEST_CASE("3","パラメータの値は正しい", item[0].compare("param") == 0); + } END_CASE; + + BEGIN_CASE("4","getOption(unknown,test)で -testのパラメータが取れる") { + OptionParameter::OptionItem item; + + item = getOption("unknown","test"); + + TEST_CASE("1","有効な値が返る", item.isValid()); + TEST_CASE("2","1つのパラメータを持つ", item.countParameter() == 1); + TEST_CASE("3","パラメータの値は正しい", item[0].compare("param3") == 0); + } END_CASE; + + BEGIN_CASE("5","getOption(unknown,unknown)で無効なアイテムが返る") { + OptionParameter::OptionItem item; + + item = getOption("unknown","unknown"); + + TEST_CASE("1","無効な値が返る", !item.isValid()); + } END_CASE; + + BEGIN_CASE("6","getOption(test2,test2,false)でチェックがつかない") { + OptionParameter::OptionItem item; + + TEST_CASE("0","[前提] -test2にチェックはついていない", !getOptionParameter().get("test2",false).isChecked()); + TEST_CASE("0","[前提] --test2にチェックはついていない", !getOptionParameter().get("-test2",false).isChecked()); + + item = getOption("test2","test2",false); + + TEST_CASE("1","有効な値が返る", item.isValid()); + TEST_CASE("2","チェック済みでない", !item.isChecked()); + TEST_CASE("3","チェック済みでない (test2)", !getOptionParameter().get("test2",false).isChecked()); + TEST_CASE("4","チェック済みでない (-test2)", !getOptionParameter().get("-test2",false).isChecked()); + TEST_CASE("5","2つのパラメータを持つ", item.countParameter() == 2); + TEST_CASE("6","1つめのパラメータの値は正しい", item[0].compare("param2") == 0); + TEST_CASE("7","2つめのパラメータの値は正しい", item[1].compare("param4") == 0); + } END_CASE; + + } END_CASE; + + BEGIN_CASE("findOption","オプションパラメータの取得") { + chain.renewInstance(); + + char * argv[] = { "test.exe","-test","param","--test","param3", "-noparam"}; + getOptionParameter().parseOption(6, argv); + + BEGIN_CASE("1","findOption(test,test)でparamが取れる") { + string result; + + TEST_CASE("0","[前提] チェック済みではない (test)", !getOptionParameter().get("test",false).isChecked()); + TEST_CASE("0","[前提] チェック済みではない (-test)", !getOptionParameter().get("-test",false).isChecked()); + TEST_CASE("1","関数は成功する", findOption("test","test",&result)); + TEST_CASE("2","文字列にparamが返る", result.compare("param") == 0); + TEST_CASE("3","チェック済み (test)", getOptionParameter().get("test",false).isChecked()); + TEST_CASE("3","チェック済み (-test)", getOptionParameter().get("-test",false).isChecked()); + } END_CASE; + + BEGIN_CASE("2","findOption(test,unknown)でparamが取れる") { + string result; + + TEST_CASE("1","関数は成功する", findOption("test","unknown",&result)); + TEST_CASE("2","文字列にparamが返る", result.compare("param") == 0); + } END_CASE; + + BEGIN_CASE("3","findOption(unknown,test)でparam3が取れる") { + string result; + + TEST_CASE("1","関数は成功する", findOption("unknown","test",&result)); + TEST_CASE("2","文字列にparamが返る", result.compare("param3") == 0); + } END_CASE; + + BEGIN_CASE("4","findOption(unknown,unknown)で無効なアイテムが返る") { + string result; + + result.assign("dummy"); + + TEST_CASE("1","関数は失敗する", !findOption("unknown","unknown",&result)); + TEST_CASE("2","文字列は書き換わらない", result.compare("dummy") == 0); + } END_CASE; + + BEGIN_CASE("5","findOption(noparam,NULL,&result)") { + string result; + result.assign("dummy"); + + TEST_CASE("1","関数は成功する", findOption("noparam", 0, &result)); + TEST_CASE("2","文字列は置き換わらない", result.compare("dummy") == 0); + } END_CASE; + } END_CASE; + + BEGIN_CASE("checkOption","オプションパラメータの存在確認 + チェック") { + chain.renewInstance(); + + char * argv[] = { "test.exe","-test","param","--test","param3", "-test2", "--test3"}; + getOptionParameter().parseOption(7, argv); + + BEGIN_CASE("1","checkOption(test,test)でparamが取れる") { + string result; + + TEST_CASE("0","[前提] チェック済みではない (test)", !getOptionParameter().get("test",false).isChecked()); + TEST_CASE("0","[前提] チェック済みではない (-test)", !getOptionParameter().get("-test",false).isChecked()); + TEST_CASE("1","関数は成功する", checkOption("test","test")); + TEST_CASE("2","チェック済み (test)", getOptionParameter().get("test",false).isChecked()); + TEST_CASE("3","チェック済み (-test)", getOptionParameter().get("-test",false).isChecked()); + } END_CASE; + + BEGIN_CASE("2","checkOption(test2,unknown)でparamが取れる") { + string result; + + TEST_CASE("0","[前提] チェック済みではない (test2)", !getOptionParameter().get("test2",false).isChecked()); + TEST_CASE("1","関数は成功する", checkOption("test2","unknown")); + TEST_CASE("2","チェック済み (test2)", getOptionParameter().get("test2",false).isChecked()); + } END_CASE; + + BEGIN_CASE("3","checkOption(unknown,test3)でparam3が取れる") { + string result; + + TEST_CASE("0","[前提] チェック済みではない (test3)", !getOptionParameter().get("-test3",false).isChecked()); + TEST_CASE("1","関数は成功する", checkOption("unknown","test3")); + TEST_CASE("2","チェック済み (test3)", getOptionParameter().get("-test3",false).isChecked()); + } END_CASE; + + BEGIN_CASE("4","checkOption(unknown,unknown)で無効なアイテムが返る") { + string result; + + result.assign("dummy"); + + TEST_CASE("1","関数は失敗する", !checkOption("unknown","unknown")); + } END_CASE; + } END_CASE; + + /* mergeOptionのチェック項目は、getOptionとほぼ同じ */ + BEGIN_CASE("mergeOption","オプションパラメータの結合") { + chain.renewInstance(); + + char * argv[] = { "test.exe","-test","param","-test2","param2", "--test","param3","--test2","param4" }; + getOptionParameter().parseOption(9, argv); + + BEGIN_CASE("1","mergeOption(test)でparamが取れる") { + OptionParameter::OptionItem item; + + item = mergeOption("test"); + TEST_CASE("1","有効な値が返る", item.isValid()); + TEST_CASE("2","チェック済みである", item.isChecked()); + TEST_CASE("3","1つのパラメータをもつ", item.countParameter() == 1); + TEST_CASE("4","パラメータの内容があっている", item[0].compare("param") == 0); + } END_CASE; + + BEGIN_CASE("2","mergeOption(test,test)で2つの連結が取れる") { + OptionParameter::OptionItem item; + + TEST_CASE("0","[前提] --testにチェックはついていない", !getOptionParameter().get("-test",false).isChecked()); + + item = mergeOption("test","test"); + + TEST_CASE("1","有効な値が返る", item.isValid()); + TEST_CASE("2","チェック済みである", item.isChecked()); + TEST_CASE("3","チェック済みである (test)", getOptionParameter().get("test",false).isChecked()); + TEST_CASE("4","チェック済みである (-test)", getOptionParameter().get("-test",false).isChecked()); + TEST_CASE("5","2つのパラメータを持つ", item.countParameter() == 2); + TEST_CASE("6","1つめのパラメータの値は正しい", item[0].compare("param") == 0); + TEST_CASE("7","2つめのパラメータの値は正しい", item[1].compare("param3") == 0); + } END_CASE; + + BEGIN_CASE("3","mergeOption(test,unknown)でtestのパラメータが取れる") { + OptionParameter::OptionItem item; + + item = mergeOption("test","unknown"); + + TEST_CASE("1","有効な値が返る", item.isValid()); + TEST_CASE("2","1つのパラメータを持つ", item.countParameter() == 1); + TEST_CASE("3","パラメータの値は正しい", item[0].compare("param") == 0); + } END_CASE; + + BEGIN_CASE("4","mergeOption(unknown,test)で -testのパラメータが取れる") { + OptionParameter::OptionItem item; + + item = mergeOption("unknown","test"); + + TEST_CASE("1","有効な値が返る", item.isValid()); + TEST_CASE("2","1つのパラメータを持つ", item.countParameter() == 1); + TEST_CASE("3","パラメータの値は正しい", item[0].compare("param3") == 0); + } END_CASE; + + BEGIN_CASE("5","mergeOption(unknown,unknown)で無効なアイテムが返る") { + OptionParameter::OptionItem item; + + item = mergeOption("unknown","unknown"); + + TEST_CASE("1","無効な値が返る", !item.isValid()); + } END_CASE; + + } END_CASE; + + chain.restoreContext(); +} +#endif + + diff --git a/uzume_prototype/kernel/cfg/base/component.h b/uzume_prototype/kernel/cfg/base/component.h new file mode 100644 index 0000000..99e2ceb --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/component.h @@ -0,0 +1,217 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: component.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/component.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#include "base/testsuite.h" +#include "base/singleton.h" +#include "base/except.h" +#include "base/message.h" +#include "base/option.h" +#include "base/collection.h" +#include "base/directorymap.h" + +#include +#include + +#ifndef COMPONENT_H +#define COMPONENT_H + +class Component : public RuntimeObject +{ +public: + //コンポーネントの起動優先度 + enum tagProcessStage { + INITIALIZE, //とにかく真っ先に動きたい処理 + + BEFORE_PARSE, //パース前 + PARSER, //パーサ + AFTER_PARSE, //パース後 + + PREDECESSOR, //汎用の前 + GENERAL_PURPOSE, //汎用 + SUCCESSOR, //汎用の後 + + BEFORE_CODEGENERATION, //コード生成前 + CODEGENERATOR, //コード生成 + AFTER_CODEGENERATION, //コード生成後 + + FINALIZE + }; + + //コンポーネントに共通のデータを持つ/操作するクラス + class ComponentInfo + { + protected: + std::string banner; + std::multimap componentList; + std::list activatedComponentList; + + //コンストラクタ (テスト用) + ComponentInfo(void) throw() {} + public: + //コンストラクタ + SINGLETON_CONSTRUCTOR(ComponentInfo) {} + + //コンポーネントの追加 + bool addComponent(Component * component, int order) throw(); + + //コンポーネントの登録解除 + void removeComponent(Component * component, int order) throw(); //特定の優先度だけを解除 + void removeComponent(Component * component) throw(); //全て解除 + + //コンポーネントの起動要求 + bool activateComponent(Component * component) throw(); + + //オプションのパース + void parseOption(OptionParameter & option); + + //コンポーネントの起動 + void activateComponent(void); + + //異常処理ハンドラの起動 + void onFatalExit(void); + + //コンポーネントTが起動しているかを判定 + template + bool isActive(void) const throw() + { + std::list::const_iterator scope; + + scope = activatedComponentList.begin(); + while(scope != activatedComponentList.end()) { + if(dynamic_cast(*scope) != 0) + return true; + ++ scope; + } + return false; + } + + //バナー変数へのアクセサ + inline void setBanner(std::string src) + { banner = src; } + inline std::string getBanner(void) const + { return banner; } + + + TESTSUITE_PROTOTYPE(main) + }; + + +protected: + static bool is_valid; //コンポーネントの初期化に成功したかどうかを持つフラグ + + /* + * 作業関数 + */ + + //コンポーネントの起動 + inline bool activateComponent(void) throw() + { return Singleton::getInstance()->activateComponent(this); } + + //一般的なオプションの処理 + static void _parseCommonOption(OptionParameter & option) throw(); + + + //自分に先行するコンポーネントの起動判定 + template + static bool isActive(void) throw() + { + bool result = false; + ComponentInfo * info = Singleton::getInstance(std::nothrow); + if(info != 0) + result = info->isActive(); + return result; + } + + + /* + * 過去との互換性のためのパラメータ操作API + */ + + static bool findOption (const char * key1, const char * key2 = 0, std::string * = 0) throw(); + static bool checkOption(const char * key1, const char * key2 = 0) throw(); + static OptionParameter::OptionItem getOption (const char * key1, const char * key2 = 0, bool dirty = true) throw(); + static OptionParameter::OptionItem mergeOption(const char * key1, const char * key2 = 0) throw(); + +public: + //コンストラクタ + Component(int order = GENERAL_PURPOSE) throw(); + + //デストラクタ + virtual ~Component(void) throw(); + + //有効判定 + static bool isValid(void) throw() + { return is_valid && SingletonBase::isValid(); } + + //コンポーネントの実行 + static void executeComponents(OptionParameter & option); + static void executeComponents(int argc, char * argv []); + + //バナーアクセサ + static void setBanner(std::string) throw(std::bad_alloc); + static std::string getBanner(void) throw(std::bad_alloc); + + /* + * イベントハンドラ + */ + + //オプションのパース + virtual void parseOption(OptionParameter &) + { parseOption(*Singleton::getInstance()); } + + virtual void parseOption(Directory &) {} + + //コンポーネントの本体 + virtual void body(void) { body(*Singleton::getInstance()); } + virtual void body(Directory &) {} + + //異常終了ハンドラ + virtual void onFatalExit(void) {} + + + + TESTSUITE_PROTOTYPE(main) +}; + + +#endif + + + diff --git a/uzume_prototype/kernel/cfg/base/coverage.cpp b/uzume_prototype/kernel/cfg/base/coverage.cpp new file mode 100644 index 0000000..3ae156c --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/coverage.cpp @@ -0,0 +1,294 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: coverage.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +#include "base/coverage_defs.h" +#include "base/coverage_undefs.h" + +#include +#include + +using namespace std; + +#if defined(COVERAGE) +/* + * 簡単なカバレッジチェック + */ + + //フォーマット済みファイル位置情報の取得 +string Coverage::Location::getDetails(void) const +{ + string result; + + result = string(filename) + ":" + String(lineno); + if(*additional != '\x0') + result += string("(") + additional + ")"; + + return result; +} + + + + //要素の全削除 +Coverage::BranchMap::~BranchMap(void) throw() +{ + iterator scope; + + scope = begin(); + while(scope != end()) { + delete scope->second; + ++ scope; + } + + clear(); +} + + //要素の登録 +Coverage::BranchBase::BranchBase(const Location & location) throw() +{ + BranchMap * bmap = Singleton::getInstance(); + NewBranchList * blist = Singleton::getInstance(); + + (*bmap)[location] = this; + blist->push_back(this); +} + + //locationに一致する要素の取得 +Coverage::BranchBase * Coverage::BranchBase::find(const Location & location) throw() +{ + BranchMap * bmap = Singleton::getInstance(); + BranchMap::iterator scope; + BranchBase * result = 0; + + scope = bmap->find(location); + if(scope != bmap->end()) + result = scope->second; + + return result; +} + + //BranchIfコンストラクタ +Coverage::If::If(const Location & location) throw() : BranchBase(location), true_case(false), false_case(false) +{} + + //ifの正当性判定 (成立/不成立の両方が起っている) +bool Coverage::If::checkValidity(void) const throw() +{ return true_case && false_case; } + + //通過情報の取得 +string Coverage::If::getDetails(void) const throw() +{ + string result; + + if(true_case) + result += "true"; + + if(false_case) { + if(true_case) + result += "/"; + result += "false"; + } + + return result; +} + + //if分岐のチェック +bool Coverage::If::branch(const Location & location, bool expression) throw() +{ + If * node = dynamic_cast(find(location)); + if(node == 0) + node = new(nothrow) If(location); + + if(node != 0) { + if(expression) + node->true_case = true; + else + node->false_case = true; + } + else + cerr << "[Coverage::Branch] Memory allocation error!\n"; + + return expression; +} + + + //Whileコンストラクタ +Coverage::While::While(const Location & location) throw() : BranchBase(location), valid(false) +{} + + //Whileの正当性判定 (少なくとも一回はループの中をまわっている) +bool Coverage::While::checkValidity(void) const throw() +{ return valid; } + + //通過情報の取得 +string Coverage::While::getDetails(void) const throw() +{ + string result; + + if(valid) + result = "valid"; + else + result = "invalid"; + + return result; +} + + //while分岐のチェック (少なくとも一回はループの中をまわっている) +bool Coverage::While::branch(const Location & location, bool expression) throw() +{ + While * node = dynamic_cast(find(location)); + if(node == 0) + node = new(nothrow) While(location); + + if(node != 0) { + if(expression) + node->valid = true; + } + else + cerr << "[Coverage::Branch] Memory allocation error!\n"; + + return expression; +} + + + //Switchコンストラクタ +Coverage::Switch::Switch(const Location & location) throw() : BranchBase(location) +{} + + //Switchの正当性判定 (通過した要素だけを覚えておく (後々判定も入れたい)) +bool Coverage::Switch::checkValidity(void) const throw() +{ return true; } + + //通過情報の取得 +string Coverage::Switch::getDetails(void) const throw() +{ + stringstream buf; + set::const_iterator scope; + + scope = checkpoint.begin(); + while(scope != checkpoint.end()) { + buf << *scope; + + ++ scope; + if(scope != checkpoint.end()) + buf << ", "; + } + + return buf.str(); +} + + //Switch分岐のチェック +void Coverage::Switch::_branch(const Location & location, int expression) throw() +{ + Switch * node = dynamic_cast(find(location)); + if(node == 0) + node = new(nothrow) Switch(location); + + if(node != 0) { + if(expression) + node->checkpoint.insert(expression); + } + else + cerr << "[Coverage::Branch] Memory allocation error!\n"; +} + + //全ての項目を表示 +void Coverage::printCoverage(ostream & out) +{ + BranchMap * bmap = Singleton::getInstance(); + BranchMap::iterator scope; + + unsigned long cases = 0; + unsigned long fails = 0; + + scope = bmap->begin(); + while(scope != bmap->end()) { + ++ cases; + + if(scope->second->checkValidity()) + out << "Success : "; + else { + out << "Failure : "; + ++ fails; + } + out << scope->first.getDetails() << ' ' << scope->second->getDetails() << '\n'; + + ++ scope; + } + + out << fails << " fails in " << cases << " cases (" << setprecision(2) << (fails * 100.0 / cases) << "%)\n"; +} + + //全て通過したかどうかのチェック +bool Coverage::checkValidity(void) +{ + bool result = true; + + NewBranchList * blist = Singleton::getInstance(); + NewBranchList::iterator scope; + + scope = blist->begin(); + while(scope != blist->end()) { + if(!(*scope)->checkValidity()) + result = false; + ++ scope; + } + + blist->clear(); + return result; +} + //名称の取得 +string Coverage::getBranchName(BranchBase * node) +{ + //一致する要素の検索 + BranchMap * bmap = Singleton::getInstance(); + BranchMap::iterator scope; + + scope = bmap->begin(); + while(scope != bmap->end()) { + if(scope->second == node) + break; + ++ scope; + } + + //assert(scope != bmap->end()); + + return scope->first.getDetails(); +} + +#endif /* COVERAGE */ + diff --git a/uzume_prototype/kernel/cfg/base/coverage_defs.h b/uzume_prototype/kernel/cfg/base/coverage_defs.h new file mode 100644 index 0000000..fd6af2e --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/coverage_defs.h @@ -0,0 +1,223 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: coverage_defs.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + #ifdef関係 + coverage_defsは、undefsで解除したあとに読み込む場合があるので、 + パートをいくつかに分割している. + - COVERAGE : カバレッジ機能を使用するかどうか + - COVERAGE_H : coverage.cppに関連する部分で、多重定義されては困るもの + - COVERAGE_DEFS : カバレッジに関連する部分で、coverage_undefs.hでundefでき、もう一度coverage_defs.hを読んでも大丈夫なもの +*/ + + +#ifdef COVERAGE + +#include "base/singleton.h" + + /* ヘッダ */ +#include +#include +#include +#include + + +#ifndef COVERAGE_H +#define COVERAGE_H +/* + * 簡単なカバレッジチェック + */ + +class Coverage { +public: + /* 場所を保持するクラス */ + class Location { + protected: + const char * filename; + unsigned int lineno; + const char * additional; + + public: + Location(const char * _filename, unsigned int _lineno, const char * _additional = "") : filename(_filename), lineno(_lineno), additional(_additional) {} + Location(const Location & src) : filename(src.filename), lineno(src.lineno), additional(src.additional) {} + + inline Location & operator = (const Location & right) + { + filename = right.filename; + lineno = right.lineno; + additional = right.additional; + + return *this; + } + + inline bool operator == (const Location & right) const + { return lineno == right.lineno && std::string(filename).compare(right.filename) == 0 && std::string(additional).compare(right.additional) == 0; } + + inline bool operator < (const Location & right) const + { + if(lineno < right.lineno) + return true; + if(std::string(filename).compare(right.filename) < 0) + return true; + + return false; + } + + inline std::string getFilename(void) const + { return std::string(filename); } + + inline unsigned int getLineno(void) const + { return lineno; } + + inline std::string getAdditional(void) const + { return std::string(additional); } + + //フォーマット済みファイル位置情報の取得 filename:lineno(additional) + std::string getDetails(void) const; + }; + + //分岐カバレッジ判定のベースクラス + class BranchBase { + protected: + BranchBase(const Location & location) throw(); //要素の登録 + static BranchBase * find(const Location & location) throw(); //locationに一致する要素の取得 + + public: + virtual ~BranchBase(void) throw() {} //デストラクタ + virtual bool checkValidity(void) const throw(...) = 0; //正当性判定 + virtual std::string getDetails(void) const throw(...) = 0; //データ表示 + }; + + //if-statementに引っかかるクラス + class If : public BranchBase { + protected: + bool true_case; + bool false_case; + + If(const Location & location) throw(); //branch経由で無いと生成させない + + public: + virtual bool checkValidity(void) const throw(); //正当性の判定 + virtual std::string getDetails(void) const throw(); //データ表示 + + static bool branch(const Location & location, bool expression) throw(); + }; + + //while-statementに引っかかるクラス + class While : public BranchBase { + protected: + bool valid; + + While(const Location & location) throw(); + public: + virtual bool checkValidity(void) const throw(); //正当性の判定 + virtual std::string getDetails(void) const throw(); //データ表示 + + static bool branch(const Location & location, bool expression) throw(); + }; + + //switch-statementに引っかかるクラス + class Switch : public BranchBase { + protected: + std::set checkpoint; + + Switch(const Location & location) throw(); + static void _branch(const Location & location, int expression) throw(); + + public: + virtual bool checkValidity(void) const throw(); //正当性の判定 + virtual std::string getDetails(void) const throw(); //データ表示 + + template + static T branch(const Location & location, T expression) throw() + { + _branch(location, (int)expression); + return expression; + } + }; + + +protected: + class BranchMap : public std::map { + public: + SINGLETON_CONSTRUCTOR(BranchMap) {} + ~BranchMap(void) throw(); + + }; + class NewBranchList : public std::list + { public: SINGLETON_CONSTRUCTOR(NewBranchList) {} }; + + //項目の表示 + static std::string getBranchName(BranchBase * node); + +public: + //全て通過したかどうかのチェック + static bool checkValidity(void); + + //全ての項目を表示 + static void printCoverage(std::ostream & out); + +}; + +#endif /* COVERAGE_H */ + + +#ifndef COVERAGE_DEFS +#define COVERAGE_DEFS + +#define if(x) i##f(Coverage::If::branch(Coverage::Location(__FILE__, __LINE__, "if"), (x) ? true : false)) +#define while(x) w##hile(Coverage::While::branch(Coverage::Location(__FILE__, __LINE__, "while"), (x) ? true : false)) +#define switch(x) s##witch(Coverage::Switch::branch(Coverage::Location(__FILE__, __LINE__, "switch"), (x))) + +#endif /* COVERAGE_DEFS */ + +#else + +#include + +#ifndef COVERAGE_H +#define COVERAGE_H +class Coverage { +public: + static bool checkValidity(void) { return true; } + static void printCoverage(std::ostream &) {} +}; +#endif /* COVERAGE_H */ + +#endif + diff --git a/uzume_prototype/kernel/cfg/base/coverage_undefs.h b/uzume_prototype/kernel/cfg/base/coverage_undefs.h new file mode 100644 index 0000000..2dedbbe --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/coverage_undefs.h @@ -0,0 +1,52 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: coverage_undefs.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/coverage_undefs.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#pragma warning(push, 1) +#pragma warning(disable:4702) +#pragma warning(disable:4701) + +#ifdef COVERAGE_DEFS + +#undef while +#undef if +#undef switch + +#endif /* COVERAGE_DEFS */ + diff --git a/uzume_prototype/kernel/cfg/base/defs.h b/uzume_prototype/kernel/cfg/base/defs.h new file mode 100644 index 0000000..0f07c2c --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/defs.h @@ -0,0 +1,101 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: defs.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/defs.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#ifndef DEFS_H +#define DEFS_H + + /* + * 処理系に依存する部分 + * 関数名称 : mktemp, popen, pclose + */ + +#ifdef CALL_EXTERNAL_PROGRAM + + /* Microsoft Visual C++ */ +#if defined(_MSC_VER) || defined(__MINGW__) +# include +# define popen _popen +# define pclose _pclose +# define mktemp _mktemp + + /* GNU Compiler Collection on Linux environment*/ +#elif defined(__GNUC__) +# include +# define mktemp mkstemp + + /* GNU Compiler Collection on Cygwin */ +#elif defined(__CYGWIN__) +# include +# define mktemp mkstemp + + /* Borland C++ Compiler */ +#elif defined(__BORLANDC__) +# include +# include +# define popen ::std::_popen +# define pclose ::std::_pclose +# define mktemp ::std::_mktemp + +#endif + + + /* + * fc_binutils.cppが使用するプログラムの定義 + */ + +#ifdef _MSC_VER +# define CMD_PREPROCESSOR "\"C:\\Program Files\\Microsoft Visual Studio\\VC98\\Bin\\cl.exe\" /E /nologo" +# define CMD_SYMBOLLISTER "nm.exe" +# define CMD_OBJDUMP "objdump.exe" +# define CMD_OBJCOPY "objcopy.exe" +# define CMD_GREP "grep.exe" +#else +# define CMD_PREPROCESSOR "cpp -ansi" +# define CMD_SYMBOLLISTER "nm" +# define CMD_OBJDUMP "objdump" +# define CMD_OBJCOPY "objcopy" +# define CMD_GREP "grep" +#endif + +#endif /* CALL_EXTERNAL_PROGRAM */ + +#endif /* DEFS_H */ + diff --git a/uzume_prototype/kernel/cfg/base/directorymap.cpp b/uzume_prototype/kernel/cfg/base/directorymap.cpp new file mode 100644 index 0000000..94fb3e8 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/directorymap.cpp @@ -0,0 +1,930 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: directorymap.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/directorymap.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +/* MEMO:メモ書き + Q: こういうクラスはテンプレートにしたほうがいいと思うが? + A: ファイルに吐き出した後、読み出したときにどうやってクラス生成すべきかがわからない + (クラスファクトリを作るのはやめたい) + 今と違う型を代入されたときの対処法がわからない +*/ + + +#include "base/directorymap.h" +#include "base/message.h" +#include +#include +#include +#include + +#ifdef _MSC_VER + #pragma warning(disable:4786) +#endif + +using namespace std; + +int Directory::defaultflag = Directory::NOTHING; + +Directory::Directory(const Directory & src) +{ + parent = 0; + flag = defaultflag; + defaultflag &= ~DESTRUCT; + + type = src.type; + switch(type) + { + case LITERAL: + content.literal = new string(*src.content.literal); + break; + default: + content = src.content; + break; + } +} + +Directory::~Directory(void) +{ + disconnect(); //親との連結を解除 + map::clear(); //子ノードの削除 + clearContent(); //自分の中身を削除する +} + +void Directory::clearContent(void) +{ + switch(this->getType()) + { + case LITERAL: + delete content.literal; + break; + case OBJECT: + delete content.instance; + break; + default: + break; + } + + type = UNKNOWN; + content.pointer = 0; +} + +Directory * Directory::findNode(bool automatic_creation, const string & path) +{ + string::size_type top, tail, length; + string work; + Directory::iterator scope; + Directory * node = this; + + if(this == NULL) + return NULL; + + if(path.empty()) + return this; + + length = path.length(); + top = 0; + if(path[0] == '/') + { + while(node->getParent() != 0) + node = node->getParent(); + if(path.size() == 1) + return node; + top = 1; + } + + do { + tail = path.find_first_of('/', top); + if(tail == string::npos) + work = path.substr(top); + else + work = path.substr(top, tail-top); + + if(work.compare(".") == 0 || work.compare("..") == 0) + { + if(work.size() > 1 && node->getParent() != 0) + node = node->getParent(); + }else + { + scope = node->begin(); + while(scope != node->end()) + { + if(work.compare((*scope).first) == 0) + break; + ++ scope; + } + + if(scope == node->end()) + { + if(!automatic_creation) + return 0; + node = node->addChild(work, new Directory); + }else + node = (*scope).second; + } + top = tail + 1; + } while( tail != string::npos && top < length ); + + return node; +} + +Directory * Directory::findNode(bool automatic_creation, const char * key, va_list vl) +{ + Directory::iterator scope; + Directory * node = this; + + if(this == NULL) + return NULL; + + if(key == NULL) + return this; + + if(*key == '/' && *(key+1) == '\x0') + { + while(node->getParent() != 0) + node = node->getParent(); + if(vl == 0) + return node; + key = va_arg(vl, const char *); + } + + do { + if(strcmp(key,".") != 0) + { + if(strcmp(key,"..") == 0) + { + node = node->parent; + }else + { + scope = node->begin(); + while(scope != node->end()) + { + if((*scope).first.compare(key) == 0) + break; + ++ scope; + } + + if(scope == node->end()) + { + if(!automatic_creation) + return 0; + node = node->addChild(key, new Directory); + }else + node = (*scope).second; + } + } + if(vl != 0) + key = va_arg(vl, const char *); + else + break; + } while( key != 0 && node != 0); + + return node; +} + +Directory & Directory::operator =(void * pointer) +{ + if(this->getType() != UNKNOWN && this->getType() != POINTER) + clearContent(); + + type = POINTER; + content.pointer = pointer; + return *this; +} + +Directory & Directory::operator =(long value) +{ + if(this->getType() != UNKNOWN && this->getType() != INTEGER) + clearContent(); + + type = INTEGER; + content.value = value; + return *this; +} + +Directory & Directory::operator =(const string & literal) +{ + if(this->getType() != UNKNOWN && this->getType() != LITERAL) + clearContent(); + + type = LITERAL; + content.literal = new string(literal); + + return *this; +} + +Directory & Directory::operator =(const char * constliteral) +{ + if(this->getType() != UNKNOWN && this->getType() != CONSTLITERAL) + clearContent(); + + type = CONSTLITERAL; + content.const_literal = constliteral; + return *this; +} + +Directory & Directory::operator =(Garbage * instance) +{ + if(this->getType() != UNKNOWN) + clearContent(); + + type = OBJECT; + content.instance = instance; + return *this; +} + +void * Directory::operator new(size_t sz) +{ + defaultflag |= DESTRUCT; + return ::operator new(sz); +} + +void * Directory::operator new(size_t sz, nothrow_t) +{ + defaultflag |= DESTRUCT; + return ::operator new(sz, nothrow); +} + +Directory::operator const long(void) const +{ + if( type == UNKNOWN ) + ExceptionMessage("Bad cast exception","不正キャスト例外") << throwException; + return content.value; +} + +void * Directory::operator * (void) const +{ + if( type == UNKNOWN ) + ExceptionMessage("Bad cast exception","不正キャスト例外") << throwException; + return content.pointer; +} + +Directory * Directory::addChild(const std::string & key, Directory * node) +{ + iterator scope; + std::pair work; + + if(node == 0) + node = new Directory; + else + if(node->parent != 0) + node->disconnect(); + + node->parent = this; + if((scope = find(key)) != end()) + { + Directory * old = (*scope).second; + old->disconnect(); + old->erase(); + } + + work = insert(value_type(key, node)); + node->myself = work.first; + + return node; +} + +Directory::iterator Directory::erase(iterator it) +{ + iterator result; + Directory * scope = (*it).second; + + //戻り値の作成 + if((result = it) == begin()) + ++ result; + else + -- result; + + //外したノードの後始末 + if((scope->flag & DESTRUCT) != 0) + delete scope; + else + scope->erase(); + + return result; +} + +void Directory::erase(void) +{ + iterator scope; + + if(this != NULL) + { + if(parent != 0) + { + parent->erase(myself); + }else + { + while(!empty()) + { + scope = begin(); + if((scope->second->flag & DESTRUCT) != 0) + delete scope->second; + else + scope->second->erase(); + } + } + } +} + +void Directory::disconnect(void) +{ + if(parent != 0) + { + parent->map::erase(myself); + parent = 0; + } +} + +Directory * Directory::getNext(void) const +{ + if(parent == 0) + return 0; + + iterator scope; + scope = myself; + ++ scope; + if(scope == parent->end()) + return 0; + + return (*scope).second; +} + +Directory * Directory::getPrev(void) const +{ + if(parent == 0 && myself == parent->begin()) + return 0; + + reverse_iterator scope; + + scope = parent->rbegin(); + while(scope != parent->rend() && (*scope).second != (*myself).second) + ++ scope; + + ++ scope; + return scope != parent->rend() ? (*scope).second : 0; +} + +bool Directory::changeKey(const string & key) +{ + Directory * scope; + + if( key.size() == 0) + return false; + + scope = parent; + + disconnect(); + scope->addChild(key, this); + return true; +} + + +void Directory::drawTree(ostream * out, int level, string * link) +{ + iterator scope; + iterator scope2; + + if(level == 0) + link = new string; + else + *out << (*link).substr(0, (level-1)*3) << " +-"; + + *out << '[' << getKey() << ']'; + switch(type) + { + case POINTER: + out->setf(ios::hex); + *out << " : PTR [" << content.pointer << "]"; + break; + case INTEGER: + out->setf(ios::dec); + *out << " : INT [" << content.value << "]"; + break; + case LITERAL: + *out << " : STR [" << *content.literal << "]"; + break; + case CONSTLITERAL: + *out << " : CSTR[" << content.const_literal << "]"; + break; + case OBJECT: + { + *out << " : OBJ"; + break; + } + case UNKNOWN: + break; + default: + *out << "UNKNOWN"; + } + *out << '\n'; + (*link) += " | "; + scope = begin(); + while(scope != end()) + { + scope2 = scope; + ++ scope; + + if(scope == end()) + (*link)[level*3+1] = ' '; + (*scope2).second->drawTree(out, level+1, link); + } + + + link->erase(level*3); + if(level == 0) + delete link; +} + +static string escapeXMLLiterals(const string & src) +{ + int index; + string::size_type pos; + string result; + const char literal[4] ="&<>"; + const char * escape[3] = {"&","<",">"}; + + result = src; + for(index = 0; index < 3; index++) + { + pos = 0; + while((pos = result.find_first_of(literal[index],pos)) != string::npos) + { + result.erase(pos,1); + result.insert(pos, escape[index]); + ++ pos; + } + } + + return result; +} + +static string encloseAttributes(const string & src) +{ + if(src.find_first_of('"') != string::npos) + return string("'") + src + "'"; + return string("\"") + src + "\""; +} + +void Directory::drawTree_byXML(ostream * out, int level) +{ + iterator scope; + + if(level == 0) + *out << "\n\n"; + + *out << "" << content.pointer << ""; + break; + case INTEGER: + out->setf(ios::dec); + *out << "INT'>" << content.value << ""; + break; + case LITERAL: + *out << "STR'>" << escapeXMLLiterals(*content.literal) << ""; + break; + case CONSTLITERAL: + *out << "CSTR'>" << escapeXMLLiterals(content.const_literal) << ""; + break; + case OBJECT: + *out << "OBJ'>"; + break; + case UNKNOWN: + *out << "'>"; + break; + default: + *out << "UNKNOWN'>"; + } + *out << '\n'; + + scope = begin(); + if(scope != end()) + { + *out << "\n"; + do{ + scope->second->drawTree_byXML(out, level+1); + ++ scope; + }while(scope != end()); + *out << "\n"; + } + *out << "\n"; +} + +Directory * Directory::findChild(const char * key) +{ + string work(key); + if(work.find_first_of('/') != string::npos) + return findChild(work); + return findNode(false, key, 0); +} + +Directory * Directory::findChild(const char * key, const char * second, ... ) +{ + va_list vl; + va_start(vl, second); + return findNode(false, key, 0)->findNode(false,second, vl); +} + +Directory * Directory::openChild(const char * key) +{ + string work(key); + if(work.find_first_of('/') != string::npos) + return openChild(work); + return findNode(true, key, 0); +} + + +Directory * Directory::openChild(const char * key, const char * second, ... ) +{ + va_list vl; + va_start(vl, second); + return findNode(true, key, 0)->findNode(true, second, vl); +} + + //指定したキーを持つ子孫を探す。サーチ順は中順 +Directory * Directory::findDescandant(const string & key, unsigned int level) const +{ + Directory::const_iterator scope; + const Directory * node = this; + + if(empty()) + return 0; + + //子で探す + scope = begin(); + while( scope != end() ) + { + if((*scope).first.compare(key) == 0) + return const_cast((*scope).second); + ++ scope; + } + + if(level > 0) + { + scope = begin(); + while( scope != end() ) + { + if((node = (*scope).second->findDescandant(key, level-1)) != 0) + return const_cast(node); + ++ scope; + } + } + return 0; +} + +void Directory::copyTo(Directory * dest, int nest) +{ + Directory::iterator scope; + Directory * node; + + if(this == NULL) + return; + + assert(dest != NULL); + + node = dest; + while(node != 0) + { + if(node == this) + ExceptionMessage("CopyTo: dest must not be a descendant node.","CopyTo: 子孫ノードへのコピーはできません") << throwException; + node = node->getParent(); + } + + scope = begin(); + while(scope != end()) + { + node = dest->findChild((*scope).first); + if(node != 0) + node->erase(); + + node = dest->addChild((*scope).first, new Directory(*(*scope).second)); + if(nest > 0) + (*scope).second->copyTo(node, nest-1); + + ++ scope; + } +} + +void Directory::Store(ostream * out) +{ + int i; + Directory * node; + + out->write((const char *)&type, sizeof(type)); + switch(type) + { + case INTEGER: + out->write((const char *)&content.value, sizeof(content.value)); + break; + case LITERAL: + i = content.literal->size(); + out->write((const char *)&i, sizeof(int)); + out->write(content.literal->c_str(), i); + break; + case CONSTLITERAL: + i = strlen(content.const_literal); + out->write((const char *)&i, sizeof(int)); + out->write(content.const_literal, i); + break; + default: + out->write((const char *)&content.pointer, sizeof(content.pointer)); + } + i = size(); + out->write((const char *)&i, sizeof(int)); + for(node = getFirstChild(); node != 0; node = node->getNext()) + { + const string & work = node->getKey(); + i = work.size(); + out->write((const char *)&i, sizeof(int)); + out->write(work.c_str(), i); + node->Store(out); + } +} + +void Directory::Load(istream * in) +{ + int i; + int count; + char buffer[1024]; + + in->read((char *)&type, sizeof(type)); + switch(type) + { + case INTEGER: + in->read((char *)&content.value, sizeof(content.value)); + break; + case CONSTLITERAL: + case LITERAL: + in->read((char *)&i, sizeof(int)); + in->read(buffer, i); + buffer[i] = '\x0'; + *this = string(buffer); + break; + default: + in->read((char *)&content.pointer, sizeof(content.pointer)); + } + in->read((char *)&count, sizeof(int)); + while(count-- > 0) + { + in->read((char *)&i, sizeof(int)); + in->read(buffer, i); + buffer[i] = '\x0'; + + addChild(buffer)->Load(in); + } +} + +string Directory::toString(const string & default_value) const +{ + if(this == 0) + return default_value; + + switch(type) + { + case POINTER: + case OBJECT: + { + char buffer[256]; + sprintf(buffer,"%08lx", (long)content.pointer); + return string(buffer); + } + case INTEGER: + { + char buffer[256]; + sprintf(buffer,"%ld", content.value); + return string(buffer); + } + case CONSTLITERAL: + return string(content.const_literal); + case LITERAL: + return string(*content.literal); + default: + return default_value; + } + + return default_value; +} + +void * Directory::toPointer(const void * default_value) const +{ + if(this == 0) + return (void *)default_value; + + switch(type) + { + case INTEGER: + return (void *)&content.value; + case CONSTLITERAL: + return (void *)content.const_literal; + case LITERAL: + return (void *)content.literal->c_str(); + case POINTER: + return (void *)content.pointer; + case OBJECT: + return (void *)content.instance; + default: + return (void *)default_value; + } + + return (void *)default_value; +} + +long Directory::toInteger(const long default_value) const +{ + bool minus = false; + long work; + const char * str; + + if(this == 0) + return default_value; + + switch(type) + { + case INTEGER: + return content.value; + + case POINTER: + return (long)content.pointer; + + case LITERAL: + case CONSTLITERAL: + if(type == CONSTLITERAL) + str = content.const_literal; + else + str = content.literal->c_str(); + + if(*str == '-') + { + minus = true; + str ++; + } + + if(*str == '0') + { + str ++; + if(*str == 'x' || *str == 'X') + { + if(sscanf(str+1, "%ux", (int *)&work) == 0) + return default_value; + }else + if(*str != '\x0') + { + if(sscanf(str, "%o", (int *)&work) == 0) + return default_value; + }else + return 0; + }else + if(sscanf(str, "%d", (int *)&work) == 0) + return default_value; + + if(minus) + work = -work; + return work; + default: + return default_value; + } + + return default_value; +} + +static string::size_type find_corresponding_parenthesis(const string & target, string::size_type pos = 0, char left = '(', char right = ')') +{ + int nest; + + nest = 1; + do { + if(target[pos] == left) + { + ++ nest; + }else + { + if(target[pos] == right) + { + -- nest; + if(nest == 0) + return static_cast(pos); + } + } + ++ pos; + }while(pos < target.size()); + + return string::npos; +} + + +string Directory::format(const string & fmt, int mode) +{ + Directory * node; + string work; + string key; + string default_value; + string::size_type top,tail; + string::size_type pos; + int i; + + default_value.assign("(null)"); + tail = 0; + while((top = fmt.find_first_of('$', tail)) != string::npos) + { + if(top != tail) + work += fmt.substr(tail, top - tail); + + switch(fmt[top+1]) + { + case '$': + tail = top+2; + work += '$'; + break; + + case '@': + work += (*myself).first; + tail = top + 2; + break; + + case '(': + top += 2; + i = find_corresponding_parenthesis(fmt, top); + key = fmt.substr(top, i - top); + + if(key.find_first_of('$') != string::npos) + key = format(key,mode); + + pos = key.find_first_of(','); + if(pos != string::npos) + { + default_value = key.substr(pos+1); + key.erase(pos); + } + + node = findNode(false,key); + if((mode & PTRPREFIX) != 0 && (node != NULL && node->type == POINTER)) + work += "0x"; + work += node->toString(default_value); + + tail = i+1; + break; + } + } + + work += fmt.substr(tail); + + return work; +} + +map::size_type Directory::size(map::size_type defval) const +{ + size_type i; + const_iterator scope; + + if(this == NULL) + return defval; + + i = 0; + scope = begin(); + while(scope != end()) + ++ i, ++ scope; + + return i; +} + diff --git a/uzume_prototype/kernel/cfg/base/directorymap.h b/uzume_prototype/kernel/cfg/base/directorymap.h new file mode 100644 index 0000000..fbb5ff4 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/directorymap.h @@ -0,0 +1,397 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: directorymap.h,v 1.2 2009/06/12 13:30:29 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/directorymap.h,v 1.2 2009/06/12 13:30:29 suikan Exp $ + +#ifndef DIRECTORYMAP_H +#define DIRECTORYMAP_H + +#ifdef _MSC_VER + #pragma warning(disable:4786) +#endif + +#include "base/message.h" +#include "base/garbage.h" +#include "base/singleton.h" + + //MSVC6.0が してもstdに入れてくれないので +#include + +#include +#include +#include +#include + +class Directory : public std::map +{ +private: + /* + * Directoryクラス : 設計メモ + * + * ・親子ノード間の関係 + * 生成 : 親が 子を直接いじってリンクを張る + * 破棄 : 子が 親からの独立を依頼する (親から一方的に勘当しない) + * + * ・NULLセーフ実装 + * 一部の関数は this != NULL を仮定しないで実装する (自分への利便性向上) + * - addChild + * - findChild, openChild (findNode() + * - erase(void) + * - getFirstChild, getLastChild, getNext, getPrev + */ + +public: + enum tagtype + { + UNKNOWN, + POINTER, + INTEGER, + LITERAL, + CONSTLITERAL, + OBJECT + }; + + enum tagflag + { + NOTHING = 0, + DESTRUCT = 1, + UNSIGNED = 2 + }; + + enum tagmode + { + PTRPREFIX = 1 + }; + +protected: + static int defaultflag; + + enum tagtype type; + int flag; + + Directory * parent; + std::map::iterator myself; + + union + { + void * pointer; + long value; + const char * const_literal; + std::string * literal; + class Garbage * instance; + } content; + + Directory(const Directory &); + void initialize(void); + void clearContent(void); + + Directory * findNode(bool, const std::string &); + Directory * findNode(bool automatic_creation, const char * key, va_list vl); + +public: + SINGLETON_CONSTRUCTOR(Directory) { initialize(); } + + Directory(void); + Directory(int); + Directory(long); + Directory(const std::string &); + Directory(void *); + explicit Directory(const char *); + explicit Directory(Garbage *); + ~Directory(void); + + Directory & operator =(void *); + Directory & operator =(long); + Directory & operator =(const char *); + Directory & operator =(const std::string &); + Directory & operator =(Garbage *); + + bool operator == (enum tagtype cmptype) + { return type == cmptype; }; + + Directory * operator ()(const std::string & src) + { return findChild(src); }; + Directory * operator ()(const char * src) + { return findChild(src); }; + + Directory & operator [](const std::string & src) + { return *openChild(src); }; + Directory & operator [](const char * src) + { return *openChild(std::string(src)); }; + + enum tagtype getType(void) const { return type; }; + Directory * getParent(void) const { return parent; }; + Directory * getParent(int) const; + Directory * getNext(void) const; + Directory * getPrev(void) const; + Directory * getFirstChild(void) const; + Directory * getLastChild(void) const; + Directory * findChild(const std::string &); + Directory * findChild(const char *); + Directory * findChild(const char *, const char * , ... ); + Directory * findDescandant(const std::string &, unsigned int = 0xffffffff) const; + Directory * openChild(const std::string &); + Directory * openChild(const char *); + Directory * openChild(const char *, const char *, ... ); + + void * operator new(size_t); + void * operator new(size_t, std::nothrow_t); + void * operator * (void) const; + + operator const long (void) const; + operator const unsigned long (void) const; + operator const int (void) const; + operator const unsigned int (void) const; + operator const char (void) const; + operator const unsigned char (void) const; + operator const char * (void); + operator const std::string & (void) const; + operator const Garbage * (void) const; + operator const void * (void) const; + + void * toPointer(const void * default_value = 0) const; + long toInteger(const long default_value = 0) const; + std::string toString(const std::string & default_value = "") const; + + bool operator == (int) const; + bool operator == (const std::string &) const; + bool operator == (const char *) const; + + template + bool operator != (T src) const + { return !(this->operator ==(src)); }; + + + Directory * addChild(const std::string &, Directory * = 0); + Directory * addChild(const char *, Directory * = 0); + Directory * addChild(const std::string &, Directory &); + Directory * addChild(const char *, Directory &); + Directory * addChild(Directory &); + Directory * addChild(Directory * = 0); + + void erase(void); + iterator erase(iterator); + void disconnect(void); + void copyTo(Directory *, int = 0x7fffffff); + void dropValue(void); + std::map::size_type size(std::map::size_type = 0) const; + + const std::string getKey(void) const; + bool changeKey(const std::string &); + bool changeKey(const char *); + + void Load(std::istream *); + void Store(std::ostream *); + + void drawTree(std::ostream * = &std::cerr, int = 0, std::string * = 0); + void drawTree_byXML(std::ostream * = &std::cerr, int = 0); + + std::string format(const char *, int mode = 0); + std::string format(const std::string &, int mode = 0); +}; + + +//------ + +inline void Directory::initialize(void) +{ + parent = 0; + type = UNKNOWN; + flag = defaultflag; + content.pointer = 0; + defaultflag &= ~DESTRUCT; +} + +inline Directory::Directory(void) +{ initialize(); } + +inline Directory::Directory(long val) +{ + initialize(); + *this = val; +} + +inline Directory::Directory(int val) +{ + initialize(); + *this = (long)val; +} + +inline Directory::Directory(void * val) +{ + initialize(); + *this = val; +} + +inline Directory::Directory(const std::string & val) +{ + initialize(); + *this = val; +} + +inline Directory::Directory(const char * val) +{ + initialize(); + *this = val; +} + +inline Directory::Directory(Garbage * val) +{ + initialize(); + *this = val; +} + +inline Directory * Directory::addChild(const char * key, Directory * node) +{ return addChild(std::string(key), node); } + +inline Directory * Directory::addChild(const std::string & key, Directory & node) +{ return addChild(key, &node); } + +inline Directory * Directory::addChild(const char * key, Directory & node) +{ return addChild(std::string(key), &node); } + +inline Directory * Directory::addChild(Directory & node) +{ return addChild(&node); } + + //このaddChildで追加した要素は、一括削除するか、消してはいけない +inline Directory * Directory::addChild(Directory * node) +{ + char buffer[32]; + sprintf(buffer,"%03d", (int)size()); + return addChild(buffer, node); +} + +inline bool Directory::changeKey(const char * key) +{ return changeKey(std::string(key)); } + +inline const std::string Directory::getKey(void) const +{ + if(parent == 0) + return std::string("/"); + return (*myself).first; +} + +inline Directory::operator const unsigned long (void) const +{ return static_cast(this->operator const long()); } + +inline Directory::operator const int (void) const +{ return static_cast(this->operator const long()); } + +inline Directory::operator const unsigned int (void) const +{ return static_cast(this->operator const long()); } + +inline Directory::operator const char (void) const +{ return static_cast(this->operator const long()); } + +inline Directory::operator const unsigned char (void) const +{ return static_cast(this->operator const long()); } + +inline Directory::operator const char * (void) +{ + if(type == CONSTLITERAL) + return content.const_literal; + if(type == LITERAL) + return content.literal->c_str(); + ExceptionMessage("Bad cast exception raised","不正キャスト例外").throwException(); + return 0; +} + +inline Directory::operator const std::string &(void) const +{ + if(type == LITERAL) + return *content.literal; + ExceptionMessage("Bad cast exception raised","不正キャスト例外").throwException(); + return *(std::string *)0; +} + +inline Directory::operator const Garbage * (void) const +{ + if(type == OBJECT) + return content.instance; + ExceptionMessage("Bad cast exception raised","不正キャスト例外").throwException(); + return 0; +} + +inline Directory::operator const void * (void) const +{ return **this; } + +inline Directory * Directory::findChild(const std::string & path) +{ return findNode(false, path); } + +inline Directory * Directory::openChild(const std::string & path) +{ return findNode(true, path); } + +inline Directory * Directory::getParent(int level) const +{ + const Directory * node = this; + while(level-- > 0 && node != 0) + node = node->parent; + return const_cast(node); +} + +inline Directory * Directory::getFirstChild(void) const +{ + if(this == 0 || size()== 0) + return 0; + return (*begin()).second; +} + +inline Directory * Directory::getLastChild(void) const +{ + if(this == 0 || size()== 0) + return 0; + return (*rbegin()).second; +} + +inline bool Directory::operator == (int src) const +{ return type == INTEGER && content.value == src; } + +inline bool Directory::operator == (const std::string & src) const +{ return (type == LITERAL && src.compare(*content.literal) == 0) || (type == CONSTLITERAL && src.compare(content.const_literal) == 0); } + +inline bool Directory::operator == (const char * src) const +{ return (type == LITERAL && content.literal->compare(src) == 0) || (type == CONSTLITERAL && strcmp(content.const_literal, src)== 0); } + +inline std::string Directory::format(const char * src, int mode) +{ return format(std::string(src), mode); } + +inline void Directory::dropValue(void) +{ clearContent(); } + +#endif + diff --git a/uzume_prototype/kernel/cfg/base/event.cpp b/uzume_prototype/kernel/cfg/base/event.cpp new file mode 100644 index 0000000..aafda25 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/event.cpp @@ -0,0 +1,197 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: event.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/event.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#include "base/event.h" + +using namespace std; + +/***************************** テストスィート *****************************/ + +#ifdef TESTSUITE +#include "base/coverage_undefs.h" + +namespace { + class Event_fortest : public Event + { TESTSUITE_PROTOTYPE(main) }; + + int * ptr_i_dummy_handler; + void dummy_handler(int & i) + { + ptr_i_dummy_handler = &i; + ++ i; + TestSuite::check("dummy_handler"); + } + + class EventHandler : public Event_fortest::Handler + { + public: + int * ptr_i; + + EventHandler(void) throw() { TestSuite::check("EventHandler::EventHandler"); } + ~EventHandler(void) throw() { TestSuite::check("EventHandler::~EventHandler"); } + void handler(Event_fortest::value_type & i) { ptr_i = &i; ++i; TestSuite::check("EventHandler::handler"); } + }; +} + +TESTSUITE(main,Event_fortest) +{ + BEGIN_CASE("add","add") { + BEGIN_CASE("1","addでハンドラが登録できる") { + Singleton::renewInstance(); + + Event_fortest::add(dummy_handler); + + TEST_CASE("1","ハンドラリストが1増えている", Singleton::getInstance()->size() == 1); + TEST_CASE("2","ハンドラリストの中身は正しい", *Singleton::getInstance()->begin() == dummy_handler); + } END_CASE; + + BEGIN_CASE("2","同じハンドラを複数回登録できる") { + Singleton::renewInstance(); + + Event_fortest::add(dummy_handler); + Event_fortest::add(dummy_handler); + Event_fortest::add(dummy_handler); + + TEST_CASE("1","ハンドラリストの中身は3", Singleton::getInstance()->size() == 3); + TEST_CASE("2","ハンドラリストの中身は正しい", *Singleton::getInstance()->begin() == dummy_handler); + } END_CASE; + } END_CASE; + + BEGIN_CASE("remove","remove") { + BEGIN_CASE("1","addで登録したハンドラを削除できる") { + Singleton::renewInstance(); + + Event_fortest::add(dummy_handler); + Event_fortest::remove(dummy_handler); + + TEST_CASE("1","ハンドラリストの要素数は0", Singleton::getInstance()->size() == 0); + } END_CASE; + + BEGIN_CASE("2","登録した全てのハンドラが消える") { + Singleton::renewInstance(); + + Event_fortest::add(dummy_handler); + Event_fortest::add(dummy_handler); + Event_fortest::add(dummy_handler); + Event_fortest::remove(dummy_handler); + + TEST_CASE("1","ハンドラリストの要素数は0", Singleton::getInstance()->size() == 0); + } END_CASE; + } END_CASE; + + BEGIN_CASE("constructor/destructor","constructor/destructor") { + Singleton::renewInstance(); + + TEST_CASE("0","[前提] ハンドラリストの中身は0", Singleton::getInstance()->size() == 0); + { + EventHandler evhdr; + TEST_CASE("1","ハンドラリストに登録されている", Singleton::getInstance()->size() == 1); + TEST_CASE("2","正しく登録されている", *Singleton::getInstance()->begin() == &evhdr); + } + TEST_CASE("3","ハンドラは解除されている", Singleton::getInstance()->size() == 0); + } END_CASE; + + BEGIN_CASE("raise","raise") { + BEGIN_CASE("1","登録した静的なハンドラが実行される") { + Singleton::renewInstance(); + TestSuite::clearCheckpoints(); + + Event_fortest::add(dummy_handler); + + int i = 0; + Event_fortest::raise(i); + + TEST_CASE("1","ハンドラが実行される",TestSuite::isReached("dummy_handler")); + TEST_CASE("2","引数間で見ている変数は同一", &i == ptr_i_dummy_handler); + TEST_CASE("3","値がインクリメントされている", i == 1); + } END_CASE; + + BEGIN_CASE("2","登録したインスタンスのハンドラが実行される") { + Singleton::renewInstance(); + TestSuite::clearCheckpoints(); + EventHandler evhdr; + + int i = 0; + Event_fortest::raise(i); + + TEST_CASE("1","ハンドラが実行される",TestSuite::isReached("EventHandler::handler")); + TEST_CASE("2","引数間で見ている変数は同一", &i == evhdr.ptr_i); + TEST_CASE("3","値がインクリメントされている", i == 1); + } END_CASE; + + BEGIN_CASE("3","両方同時 (順番は特に気にしない)") { + Singleton::renewInstance(); + TestSuite::clearCheckpoints(); + EventHandler evhdr; + + Event_fortest::add(dummy_handler); + + int i = 0; + Event_fortest::raise(i); + + TEST_CASE("1","ハンドラが実行される",TestSuite::isReached("dummy_handler")); + TEST_CASE("2","ハンドラが実行される",TestSuite::isReached("EventHandler::handler")); + TEST_CASE("3","値がインクリメントされている", i == 2); + } END_CASE; + + BEGIN_CASE("4","複数登録") { + Singleton::renewInstance(); + TestSuite::clearCheckpoints(); + EventHandler evhdr; + EventHandler evhdr2; + + Event_fortest::add(dummy_handler); + Event_fortest::add(dummy_handler); + + int i = 0; + Event_fortest::raise(i); + + TEST_CASE("1","ハンドラが実行される",TestSuite::isReached("dummy_handler")); + TEST_CASE("2","ハンドラが実行される",TestSuite::isReached("EventHandler::handler")); + TEST_CASE("3","値がインクリメントされている", i == 4); + } END_CASE; + } END_CASE; +} + + +#endif + + + diff --git a/uzume_prototype/kernel/cfg/base/event.h b/uzume_prototype/kernel/cfg/base/event.h new file mode 100644 index 0000000..c87a839 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/event.h @@ -0,0 +1,195 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: event.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/event.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#ifndef EVENT_H +#define EVENT_H + +#include "base/testsuite.h" +#include "base/singleton.h" + +#include + + //イベントフックの取りまとめ役 +template +class Event +{ +public: + typedef void (*handler_type)(T &); + + class handler_list_type : public std::list + { public: SINGLETON_CONSTRUCTOR(handler_list_type) throw() {} }; + + /* + * クラスの中のハンドラ用 + */ + + class Handler + { + friend class Event; + public: + class instance_list_type : public std::list + { public: SINGLETON_CONSTRUCTOR(instance_list_type) throw() {} }; + + virtual void handler(T & ev) = 0; + + protected: + //登録 + Handler(void) throw() + { Singleton::getInstance()->push_back(this); } + + //登録解除 + virtual ~Handler(void) throw() + { + typename Event::Handler::instance_list_type * list = Singleton::getInstance(std::nothrow); + typename Event::Handler::instance_list_type::iterator scope; + + if(list != 0) { + scope = list->begin(); + while(scope != list->end()) { + if(*scope == this) { + typename Event::Handler::instance_list_type::iterator target = scope; + ++ scope; + list->erase(target); + } + else + ++ scope; + } + } + } + }; + +public: + typedef T value_type; + + Event(void) {} + virtual ~Event(void) {} + + /* + * スタティックなハンドラ用 + */ + + //イベントにハンドラを追加 + inline static void add(handler_type func) throw(std::bad_alloc) + { Singleton::getInstance()->push_back(func); } + + //イベントからハンドラを削除 + static void remove(handler_type func) throw() + { + typename Event::handler_list_type * list; + typename Event::handler_list_type::iterator scope; + + list = Singleton::getInstance(std::nothrow); + if(list != 0) { + scope = list->begin(); + while(scope != list->end()) { + if(*scope == func) { + typename handler_list_type::iterator target = scope; + ++ scope; + list->erase(target); + } + else + ++ scope; + } + } + } + + /* + * 共通操作 + */ + //イベントの発生 + static void raise(T & ev) + { + typedef typename Event::handler_list_type handler_list_type_t; + typedef typename Event::Handler::instance_list_type instance_list_type_t; + + /* 登録された静的な関数にイベントを発行 */ { + handler_list_type_t * list; + typename handler_list_type_t::iterator scope; + + list = Singleton::getInstance(); //throw(bad_cast) + + scope = list->begin(); + while(scope != list->end()) { + (**scope)(ev); + ++ scope; + } + } + + /* 登録されたクラスインスタンスにイベントを発行 */ { + instance_list_type_t * list; + typename instance_list_type_t::iterator scope; + + list = Singleton::getInstance(); //throw(bad_cast) + + scope = list->begin(); + while(scope != list->end()) { + (*scope)->handler(ev); + ++ scope; + } + } + } + + //イベントの発生 (引数なし) + inline static void raise(void) + { + T ev; + raise(ev); + } +}; + + + /* + * 汎用イベント + */ + + //コンストラクタが起動し終わったあと、真っ先に起るイベント +class StartupEvent {}; + + + //成功失敗を問わず、プログラムが終わるときに起るイベント +struct ShutdownEvent +{ + int exit_code; +}; + +#endif + + + diff --git a/uzume_prototype/kernel/cfg/base/except.cpp b/uzume_prototype/kernel/cfg/base/except.cpp new file mode 100644 index 0000000..538d73c --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/except.cpp @@ -0,0 +1,75 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: except.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/except.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#include "base/except.h" + +using namespace std; + + //例外許可 +bool Exception::is_throwable = true; + + //コードと文字列を指定して生成 +Exception::Exception(string _classname, int _code, string _details) throw() +{ + classname = _classname; + code = _code; + details = _details.empty() ? _classname : _details; +} + + //詳細文字列を設定して生成 +Exception::Exception(string _classname, string _details) throw() +{ + classname = _classname; + code = 0; + details = _details; +} + + //コピーコンストラクタ +Exception::Exception(const Exception & src) throw() +{ + classname = src.classname; + code = src.code; + details = src.details; +} + + //デストラクタ +Exception::~Exception(void) throw() +{} + diff --git a/uzume_prototype/kernel/cfg/base/except.h b/uzume_prototype/kernel/cfg/base/except.h new file mode 100644 index 0000000..37e0630 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/except.h @@ -0,0 +1,113 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: except.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/except.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#ifndef EXCEPT_H +#define EXCEPT_H + +#ifdef _MSC_VER +# pragma warning(disable:4290) //C++ の例外の指定は無視されます。関数が __declspec(nothrow) でないことのみ表示されます。 +#endif + +//#include "testsuite.h" + +#include +#include + + //例外基底クラス +class Exception +{ +private: + static bool is_throwable; + +protected: + int code; //例外コード + std::string classname; //この例外を生成したクラスの名前 (識別用) + std::string details; //例外の説明 + + //コンストラクタ + Exception(std::string classname = "Exception", int code = 0, std::string details = "") throw(); + Exception(std::string classname, std::string details) throw(); + + //デストラクタ +public: + Exception(const Exception & src) throw(); + + virtual ~Exception(void) throw(); + + //is-an-instance-of関係の評価 + inline bool isInstanceOf(const char * _classname) const throw() + { return classname.compare(_classname) == 0; } + + //例外コードを取得する + inline int getCode(void) const throw() + { return code; } + + //例外の説明を取得する + inline std::string getDetails(void) const throw() + { return details; } + + //現在の例外制御フラグの状態に従って例外を発行する + inline bool throwException(void) + { + if(is_throwable) + throw *this; + return is_throwable; + } + + //is_throwableのアクセサ + static void setThrowControl(bool _throwable) throw() + { is_throwable = _throwable; } + + static bool getThrowControl(void) throw() + { return is_throwable; } + + +// TESTSUITE_PROTOTYPE(main) +}; + + +#define EXCEPTION(x) class x : public Exception { public: x(void) throw() : Exception(#x) {} }; +#define EXCEPTION_(x,y) class x : public Exception { public: x(void) throw() : Exception(#x, y) {} }; +#define EXCEPTION__(x,y,z) class x : public Exception { public: x(void) throw() : Exception(#x, y, z) {} }; + +#endif + + + diff --git a/uzume_prototype/kernel/cfg/base/fc_bfd.cpp b/uzume_prototype/kernel/cfg/base/fc_bfd.cpp new file mode 100644 index 0000000..2b6fa68 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/fc_bfd.cpp @@ -0,0 +1,236 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: fc_bfd.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + + +#include "base/filecontainer.h" + +#include "base/message.h" + +#include "bfd.h" +#include "libiberty.h" + +#include +#include + +using namespace std; + + +/* + * BFDを使ったファイルコンテナクラス + */ +class filecontainer_BFD : public filecontainer +{ +protected: + bfd * object; //オブジェクト + map symbol_table; //検索用ハッシュもどき + asymbol ** symbol_container; + +public: + filecontainer_BFD(void) throw(); + ~filecontainer_BFD(void) throw(); + + virtual bool attach_module(const char *); + virtual bool change_endian(void * target, unsigned int size); + virtual bool load_contents(void * dest, unsigned long address, unsigned int size); + virtual unsigned long get_symbol_address(const char *); + virtual const char * get_architecture(void); + +} Instance_of_filecontainer_BFD; + +filecontainer_BFD::filecontainer_BFD(void) throw() +{ + bfd_init(); + + object = NULL; + symbol_table.clear(); + symbol_container = NULL; + instance = this; +} + +filecontainer_BFD::~filecontainer_BFD(void) throw() +{ + if(object != NULL) + bfd_close(object); +} + +/* + * attach_module : 対象モジュールをアタッチする + */ +bool filecontainer_BFD::attach_module(const char * filename) +{ + char ** target_list; + asymbol ** symbols; + asymbol * sym; + int num_syms; + boolean result; + int i; + + if(object != NULL) + bfd_close(object); + symbol_table.clear(); + + //モジュールオープン (読込用) + object = bfd_openr(filename, "default"); + + //ターゲット解決 + target_list = (char **)bfd_target_list(); + result = bfd_check_format_matches(object, bfd_object, &target_list); + if(result == 0) + ExceptionMessage("Internel error: BFD could not recognize the target file format.","内部エラー: BFDはファイルの読み出しに失敗しました").throwException(); + + //シンボルのハッシュもどき作成 + symbols = (asymbol **)xmalloc( bfd_get_symtab_upper_bound(object) ); + num_syms = bfd_canonicalize_symtab(object, symbols); + + for(i=0;iname != NULL && *(sym->name) != '\x0') + symbol_table[string(sym->name)] = sym; + } + + symbol_container = symbols; + return true; +} + +bool filecontainer_BFD::change_endian(void * target, unsigned int size) +{ + //ホストはリトルと仮定 + enum bfd_endian host_endian = BFD_ENDIAN_LITTLE; + + char * top, * tail; + + if(object == NULL) + return false; + + if(object->xvec->byteorder == BFD_ENDIAN_UNKNOWN) + return false; + +/* + unsigned int __work = 0x1; + if( *(char *)__work == 0) + host_endian = BFD_ENDIAN_BIG; +*/ + + if(object->xvec->byteorder == host_endian) + return true; + + /* + * メインループ : bswapしないで、素直に書く + */ + + top = (char *)target; + tail = (char *)target+size -1; + + while(top < tail) + { + *top ^= *tail, *tail ^= *top, *top ^= *tail; + top ++; + tail --; + } + + return true; +} + + +bool filecontainer_BFD::load_contents(void * dest, unsigned long address, unsigned int size) +{ + struct sec * section; + + if(object == 0) + return false; + + //対象アドレスを保有するセクションを探す + section = object->sections; + while(section != 0) + { + if(address - (unsigned long)section->vma <= section->_raw_size + && (section->flags & (SEC_ALLOC|SEC_HAS_CONTENTS)) == (SEC_ALLOC|SEC_HAS_CONTENTS)) + { + //読み出し + bfd_get_section_contents(object, section, dest, address - (unsigned long)section->vma, size); + return true; + } + section = section->next; + } + + //どこにもない + ExceptionMessage("Internel error: Memory read with unmapped address","内部エラー; マップされてないアドレスを使ってメモリリードが行われました").throwException(); + + return false; +} + + +/* + * get_symbol_address : シンボル名からアドレス値を取得する + */ +unsigned long filecontainer_BFD::get_symbol_address(const char * symbol) +{ + map::iterator scope; + string symbol_name; + + if(object == 0) + ExceptionMessage("Not initialized","初期化されてません").throwException(); + + //シンボル名を生成する ("_"とかの処理) + if(object->xvec->symbol_leading_char != '\x0') + symbol_name += object->xvec->symbol_leading_char; + symbol_name += symbol; + + scope = symbol_table.find(symbol_name); + if(scope == symbol_table.end()) + return 0; + //Exception("Internal error: Unknown symbol [%s]","内部エラー: 不明なシンボル [%s]").format(symbol_name.c_str()); + + //Address = セクション内オフセット値 + セクションのVMA + return (*scope).second->value + (*scope).second->section->vma; +} + +/* + * get_architecture : アーキテクチャ名の取得 + */ +const char * filecontainer_BFD::get_architecture(void) +{ + if(object == NULL) + return "Unknown"; + + //とりあえずターゲット名を持ってアーキテクチャ名にしておく。 + // #どうせバナーにしか使ってないしね 今のところ + return object->xvec->name; +} + diff --git a/uzume_prototype/kernel/cfg/base/fc_binutils.cpp b/uzume_prototype/kernel/cfg/base/fc_binutils.cpp new file mode 100644 index 0000000..0961281 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/fc_binutils.cpp @@ -0,0 +1,1199 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: fc_binutils.cpp,v 1.2 2009/06/12 13:30:29 suikan Exp $ + */ + +#if defined(FILECONTAINER_BINUTILS) || defined(TESTSUITE) + +#ifdef _MSC_VER +#pragma warning(disable:4786) //デバッグ文字列を255文字に切り詰めた +#endif + +#include "base/filecontainer.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#define _isspace(x) isspace(x) +#define _isprint(x) isprint(x) + +#define SIZE_LOADPAGE 65536 //バイナリデータを格納するページ単位 + +#define SIZE_TO_CONFIRM_BINARYFILE 128 //ファイルがバイナリを含むかどうかを確認するのに読み出すデータの長さ (バッファを取るのであまり大きくしないこと) + +#define MAGIC_SYMBOL "_checker_magic_number" +#define MAGIC_NUMBER 0x01234567 //4バイトの整数 + +#define CMD_GNUNM "nm" +#define CMD_GNUOBJCOPY "objcopy" + +#define MAKE_BASEADDRESS(x) ((x) & ~(SIZE_LOADPAGE-1)) +#define MAKE_OFFSETADDRESS(x) ((x) & (SIZE_LOADPAGE-1)) + +using namespace std; + +namespace { + + class FileContainerBinutilsImpl : public FileContainer + { + public: + typedef void (interceptor_func_t)(fstream &, const string &); //不意に訪れたバイナリファイルの襲撃に対応する関数の型 + + protected: + string symbol_prefix; + map symbol_table; + map contents; + + address_t last_address; //キャッシュもどき + char * last_page; + + //データ取り込み + void loadSymbols(fstream & file) throw(Exception); + void loadDataContents(fstream & file) throw(Exception); + + //contentsへ1バイト書き込み + void writeByte(address_t address, unsigned int) throw(Exception); + + //自動処理 + void searchSymbolPrefix(void) throw(); + void searchByteOrder(void) throw(); + + public: + FileContainerBinutilsImpl(void) throw(); + virtual ~FileContainerBinutilsImpl(void) throw(); + + /* インタフェース部 */ + virtual void attachModule(const string & filename) throw(Exception); + virtual void loadContents(void * dest, address_t address, size_t size) throw(Exception); + virtual address_t getSymbolAddress(const string & symbol) throw(Exception); + virtual std::string getArchitecture(void) throw(); + + TESTSUITE_PROTOTYPE(main) + }; + + namespace { + FileContainerBinutilsImpl instance_of_FileContainerBinutilsImpl; + } + + /* コンストラクタ */ + FileContainerBinutilsImpl::FileContainerBinutilsImpl(void) throw() + : symbol_prefix(""), symbol_table(), contents(), last_address(0), last_page(0) + {} + + /* デストラクタ : データバッファの解放 */ + FileContainerBinutilsImpl::~FileContainerBinutilsImpl(void) throw() + { + map::iterator scope; + + scope = contents.begin(); + while(scope != contents.end()) { + delete [] scope->second; + ++ scope; + } + symbol_table.clear(); + contents.clear(); + } + + /* ファイル名をカンマで二つに分ける */ + void splitFilename(const string & src, string & first, string & second) throw(Exception) + { + if(!src.empty()) { + string::size_type pos; + + pos = src.find_first_of(','); + if(pos != string::npos) { + first = src.substr(0, pos); + second = src.substr(pos + 1); + } + else { + //ファイル名が一つしか指定されていない + first = src; + second = src; + } + } + else + ExceptionMessage("[FCBI] Empty filename could not be accepted.","[FCBI] ファイル名がありません").throwException(); + } + + /* ファイルがバイナリデータを持っているかどうかを判定 */ + bool hasBinaryContents(fstream & file) throw() + { + assert(file.is_open()); + + bool result = false; + char buffer[SIZE_TO_CONFIRM_BINARYFILE]; + streamsize length; + + file.read(buffer, SIZE_TO_CONFIRM_BINARYFILE); + length = file.gcount(); + + for(streamsize i = 0; i < length; ++ i) { + if(buffer[i] < 0 || !(_isprint(buffer[i]) || _isspace(buffer[i]))){ + result = true; + break; + } + } + + if(!result) { + file.clear(); + file.seekg(0, ios::beg); //先頭に戻しておく + } + + return result; + } + + /* テキストファイルを開く (バイナリだった場合には対処) */ + void openTextFile(fstream & file, const string & filename, FileContainerBinutilsImpl::interceptor_func_t * interceptor) throw(Exception) + { + assert(!filename.empty()); + assert(!file.is_open()); + + file.open(filename.c_str(), ios::in|ios::binary); + if(!file.is_open()) { + ExceptionMessage("File '%' could not be opened.","ファイル '%' は開けません") << filename << throwException; + return; + } + + /* バイナリファイルだったら... */ + while(hasBinaryContents(file)) { + file.close(); + + if(interceptor != 0) { + (*interceptor)(file, filename); + interceptor = 0; //対処は一回のみ + } + + if(!file.is_open()) { + break; + } + } + + /* ファイルが開けなかったら例外 */ + if(!file.is_open()) + ExceptionMessage("Program failed to convert the binary '%' into suitable style. Please specify a suitable TEXT file.", + "プログラムはバイナリファイル'%'の変換に失敗しました。正しいテキストファイルを指定し直してください。") + << filename << throwException; + } + + /* 一時的なファイル名の生成 */ + const char * makeTemporaryFilename(void) throw() + { + static char filename[10]; + + sprintf(filename, "cfg%06x", (int)(rand() & 0xffffffl)); + + return filename; + } + + + /* バイナリをGNU-NMを使って変換する */ + void interceptWithGnuNM(fstream & file, const string & filename) throw(Exception) + { + assert(!file.is_open()); + + string cmdline; + string symfile; + + symfile.assign(makeTemporaryFilename()); + cmdline = string(CMD_GNUNM) + " " + filename + " > " + symfile; + VerboseMessage("[EXEC] %\n") << cmdline; + + system(cmdline.c_str()); + + /* 正しく開けたらファイルを削除 */ + file.open(symfile.c_str(), ios::in); + if(file.is_open()) { + remove(symfile.c_str()); + } + } + + /* バイナリをGNU-OBJCOPYを使って変換する */ + void interceptWithGnuObjcopy(fstream & file, const string & filename) throw(Exception) + { + assert(!file.is_open()); + + string cmdline; + string srecfile; + + srecfile.assign(makeTemporaryFilename()); + cmdline = string(CMD_GNUOBJCOPY) + " -F srec " + filename + " " + srecfile; + VerboseMessage("[EXEC] %\n") << cmdline; + + system(cmdline.c_str()); + + /* 正しく開けたらファイルを削除 */ + file.open(srecfile.c_str(), ios::in); + if(file.is_open()) { + remove(srecfile.c_str()); + } + } + + /* 16進から10進への変換 (ポインタ移動, 長さ指定付き) */ + unsigned int hextodec(const char * & src, size_t length) throw() + { + assert(length <= sizeof(unsigned int) * 2); + + unsigned int result = 0; + unsigned int digit; + + while(length-- > 0) { + if(*src >= '0' && *src <= '9') + digit = *src - '0'; + else if(*src >= 'A' && *src <='F') + digit = *src - 'A' + 10; + else if(*src >= 'a' && *src <='f') + digit = *src - 'a' + 10; + else + break; + + ++ src; + result = (result << 4) | (digit & 0xf); + } + + return result; + } + + /* NMが出力した行をパース */ + bool readGnuNmLine(fstream & file, FileContainer::address_t & address, string & attribute, string & symbolname) throw() + { + assert(file.is_open()); + + string src; + string addr; + string::size_type pos1; + string::size_type pos2; + + /* 中身を空にしておく */ + address = 0; + if(!attribute.empty()) + attribute.erase(); + if(!symbolname.empty()) + symbolname.erase(); + + //次の行を取得 (空行, 未定義シンボルは読み飛ばす) + do { + if(file.eof()) + return false; + + getline(file, src, '\n'); + } while(src.empty() || src.at(0) == ' '); + + //行を分解 + pos1 = src.find_first_of(' '); + addr = src.substr(0, pos1); + + pos2 = src.find_first_of(' ', pos1 + 1); + attribute = src.substr(pos1 + 1, pos2 - pos1 - 1); + symbolname = src.substr(pos2 + 1); + + //アドレスのパース (注 : なんでこんなちまちまやってるかというと、アドレスが32bitを超えるターゲットがいるから) + while(!addr.empty()) { + size_t length = addr.size(); + const char * src = addr.c_str(); + if(length > sizeof(unsigned int) * 2) + length = sizeof(unsigned int) * 2; + address = (address << (length * 2)) | (hextodec(src, length)); + addr.erase(0, length); + } + + return true; + } + + /* シンボルの読み込み */ + void FileContainerBinutilsImpl::loadSymbols(fstream & file) throw(Exception) + { + assert(file.is_open()); + + address_t address; + string attribute; + string symbolname; + + while(readGnuNmLine(file, address, attribute, symbolname)) { + symbol_table.insert(map::value_type(symbolname, address)); + } + + VerboseMessage("% symbols loaded\n") << symbol_table.size() << &throwException; + + file.close(); + } + + /* contentsに1バイト書き込み */ + void FileContainerBinutilsImpl::writeByte(address_t address, unsigned int value) throw(Exception) + { + address_t & base = last_address; + char * & page = last_page; + + /* キャッシュもどきが使えないなら、ページを探す */ + if(MAKE_BASEADDRESS(address) != last_address || last_page == 0) { + map::iterator scope; + + base = MAKE_BASEADDRESS(address); + scope = contents.find(base); + if(scope == contents.end()) { + page = new(nothrow) char [SIZE_LOADPAGE]; + if(page == 0) { + ExceptionMessage("Not enough memory available to store the contents","空きメモリ不足のため、データの格納に失敗しました").throwException(); + return; + } + contents.insert(map::value_type(base, page)); + } + else + page = scope->second; + } + + *(page + (address - base)) = static_cast(value & 0xff); + } + + /* 末尾の空白文字を切り取る */ + void trimString(string & src) throw() + { + string::size_type pos; + + pos = src.find_last_not_of(" \t\r\n"); + if(pos != string::npos && pos != src.size()) + src.erase(pos + 1); + } + + /* モトローラSレコードを一行読み込む */ + /* + The general format of an S-record follows: + +-------------------//------------------//-----------------------+ + | type | count | address | data | checksum | + +-------------------//------------------//-----------------------+ + */ + bool readRecord(fstream & file, string & dest) throw(Exception) + { + unsigned int sum; + unsigned int count; + unsigned int i; + const char * pos; + + /* 次の行を読み込む */ + do { + //getlineがReadFileを呼んでブロックするので、確実にEOFを反応させるためにこうする + int ch = file.get(); + if(ch == EOF) + return false; + + file.putback(static_cast(ch)); + getline(file, dest); + } while(dest.empty()); + + trimString(dest); + + /* 正当性の判定 */ + + if(dest[0] != 'S') //行頭が'S'で始まらない + ExceptionMessage("The file is not a Motorola S-Record file.","モトローラSフォーマットで無い行が見つかりました") << throwException; + + pos = dest.c_str() + 2; + count = hextodec(pos, 2); + if(dest.size() != (count + 2)*2) + ExceptionMessage("Illegal S-Record found (count unmatched).","不正なSレコードがあります (サイズ不一致)") << throwException; + + sum = count; + for(i = 0; i < count; ++ i) + sum += hextodec(pos, 2); + + if((sum & 0xff) != 0xff) + ExceptionMessage("Illegal S-Record found (check-sum unmatched).","不正なSレコードがあります (チェックサム不一致)") << throwException; + + return true; + } + + /* 次の開始アドレスを得る */ + FileContainer::address_t parseRecordAddress(const string & src, FileContainer::address_t base) throw() + { + const char * record = src.c_str(); + FileContainer::address_t result = 0; + + record += 4; + switch(*(record - 3)) { + case '1': + result = hextodec(record, 4); + break; + case '2': + result = hextodec(record, 6); + break; + case '3': + result = hextodec(record, 8); + break; + case '5': + result = base; + break; + default: + break; + } + + return result; + } + + /* データ部分だけを残してチョップ */ + void chopRecord(string & src) throw() + { + string::size_type start; + + switch(src[1]) { + case '1': start = 4 + 4; break; + case '2': start = 4 + 6; break; + case '3': start = 4 + 8; break; + default: start = 4; break; + } + + //先頭4バイト + アドレス部 + 最後のサムを取り除く + src = src.substr(start, src.size() - start - 2); + } + + /* プログラムデータの読み込み */ + void FileContainerBinutilsImpl::loadDataContents(fstream & file) throw(Exception) + { + assert(file.is_open()); + + address_t address; + string line; + + address = 0; + while(readRecord(file, line)) { + + address = parseRecordAddress(line, address); + + chopRecord(line); + + /* データの格納 */ + const char * pos = line.c_str(); + while(*pos != '\x0') { + unsigned int data = hextodec(pos, 2); + writeByte(address, data); + ++ address; + } + } + + file.close(); + } + + /* シンボルプレフィクスの自動判定 */ + void FileContainerBinutilsImpl::searchSymbolPrefix(void) throw() + { + const char * candidate_list[] = {"", "_", NULL}; + const char ** candidate; + + for(candidate = candidate_list; *candidate != NULL; ++ candidate) { + map::const_iterator scope; + string symbol; + + symbol = string(*candidate) + MAGIC_SYMBOL; + scope = symbol_table.find(symbol); + + if(scope != symbol_table.end()) + break; + } + + if(*candidate != NULL) + symbol_prefix.assign(*candidate); + } + + /* エンディアンの自動判定 */ + void FileContainerBinutilsImpl::searchByteOrder(void) throw() + { + address_t address; + union { + char buffer[4]; + unsigned int value; + }; + + try { + value = 0; + address = getSymbolAddress(MAGIC_SYMBOL); + loadContents(buffer, address, 4); + + if(value == MAGIC_NUMBER) { + byteorder = HOSTORDER; + } + else { + buffer[0] ^= buffer[3], buffer[3] ^= buffer[0], buffer[0] ^= buffer[3]; // swap(buffer[0], buffer[3]) + buffer[1] ^= buffer[2], buffer[2] ^= buffer[1], buffer[1] ^= buffer[2]; // swap(buffer[1], buffer[2]) + + if(value == MAGIC_NUMBER) + byteorder = HOSTORDER == LITTLE ? BIG : LITTLE; + else + throw false; + } + } + catch(...) {} + } + + /* モジュールのアタッチ -> シンボル読出し, データ格納 */ + void FileContainerBinutilsImpl::attachModule(const string & filename) throw(Exception) + { + fstream file; + string symbol_filename; + string contents_filename; + + splitFilename(filename, symbol_filename, contents_filename); + + openTextFile(file, symbol_filename, interceptWithGnuNM); + loadSymbols(file); + + openTextFile(file, contents_filename, interceptWithGnuObjcopy); + loadDataContents(file); + + searchSymbolPrefix(); + searchByteOrder(); + } + + /* 格納している内容の取得 */ + void FileContainerBinutilsImpl::loadContents(void * _dest, address_t address, size_t size) throw(Exception) + { + char * dest = static_cast(_dest); + + while(size > 0) { + map::const_iterator scope; + + address_t base = MAKE_BASEADDRESS(address); + address_t offset = MAKE_OFFSETADDRESS(address); + size_t transfer_size = size; + + if(transfer_size > SIZE_LOADPAGE - offset) + transfer_size = SIZE_LOADPAGE - offset; + + scope = contents.find(base); + if(scope == contents.end()) + ExceptionMessage("[Internel error] Memory read with unmapped address","[内部エラー] マップされてないアドレスを使ってメモリリードが行われました").throwException(); + + memcpy(dest, scope->second + offset, transfer_size); + + dest += transfer_size; + size -= transfer_size; + } + } + + /* シンボルのアドレスの取得 */ + FileContainer::address_t FileContainerBinutilsImpl::getSymbolAddress(const string & symbol) throw(Exception) + { + string symbolname; + map::const_iterator scope; + + symbolname = symbol_prefix + symbol; + + scope = symbol_table.find(symbolname); + if(scope == symbol_table.end()) + ExceptionMessage("Unknown symbol '%'","不明なシンボル名 '%'") << symbol << throwException; + + return scope->second; + } + + /* アーキテクチャ名の取得 */ + string FileContainerBinutilsImpl::getArchitecture(void) throw() + { + if(byteorder == LITTLE) + return "Little endian target (with GNU/Binutils)"; + else + return "Big endian target (with GNU/Binutils)"; + } + +} + +//--------------------------------------------- + +#ifdef TESTSUITE +#include "base/coverage_undefs.h" + +namespace { + fstream * interceptor_file; + string interceptor_filename; + void interceptor(fstream & file, const string & filename) + { + CHECKPOINT("interceptor"); + interceptor_file = &file; + interceptor_filename = filename; + + if(filename.compare("textfile") == 0) { + remove(filename.c_str()); + file.open(filename.c_str(), ios::out); + file << "text"; + file.close(); + + file.open(filename.c_str(), ios::in|ios::binary); + } + else if(filename.compare("binaryfile") == 0) { + remove(filename.c_str()); + file.open(filename.c_str(), ios::out|ios::binary); + file.write("\x1",1); + file.close(); + + file.open(filename.c_str(), ios::in|ios::binary); + } + } +} + +TESTSUITE(main, FileContainerBinutilsImpl) +{ + PREDECESSOR("TFileContainer"); + + SingletonBase::ContextChain chain; + chain.saveContext(); + + BEGIN_CASE("splitFilename","splitFilename") { + BEGIN_CASE("1","カンマの前後で切れる") { + string first, second; + + splitFilename("a,b", first, second); + TEST_CASE("1","firstの中身は正しい", first.compare("a") == 0); + TEST_CASE("2","secondの中身は正しい", second.compare("b") == 0); + } END_CASE; + + BEGIN_CASE("2","カンマの無い引数を与えると、両方に同じ中身が入る") { + string first, second; + + splitFilename("abc", first, second); + TEST_CASE("1","firstの中身は正しい", first.compare("abc") == 0); + TEST_CASE("2","secondの中身は正しい", second.compare("abc") == 0); + } END_CASE; + + BEGIN_CASE("3","空文字を与えると例外") { + bool result = false; + string first, second; + try { splitFilename("", first, second); } catch(Exception &) { result = true; } + if(!result) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("hasBinaryContents","hasBinaryContents") { + BEGIN_CASE("1","テキストファイルを食わせる") { + fstream file("test", ios::out); + file << "This is a sample text file."; + file.close(); + + file.open("test",ios::in|ios::binary); + TEST_CASE("1","関数はfalseを返す", !hasBinaryContents(file)); + TEST_CASE("2","fileはeofに達していない", !file.eof()); + file.close(); + + remove("test"); + } END_CASE; + + BEGIN_CASE("2","バイナリデータを食わせる") { + fstream file("test", ios::out|ios::binary); + file << "This is a sample text file."; + file.write("\x0\x1\x2\x3", 4); + file.close(); + + file.open("test",ios::in|ios::binary); + TEST_CASE("1","関数はtrueを返す", hasBinaryContents(file)); + TEST_CASE("2","fileはeofに達していない", !file.eof()); + file.close(); + + remove("test"); + } END_CASE; + } END_CASE; + + BEGIN_CASE("openTextFile","openTextFile") { + BEGIN_CASE("1","テキストファイルを指定する") { + TestSuite::clearCheckpoints(); + fstream file("test", ios::out); + file << "This is a sample text file."; + file.close(); + + bool result = true; + try { openTextFile(file, "test", interceptor); } catch(Exception &) { result = false; } + + TEST_CASE("1","例外は起きない", result); + TEST_CASE("2","ファイルが開かれている", file.is_open()); + TEST_CASE("3","interceptorはコールされていない", !TestSuite::isReached("interceptor")); + + string work; + getline(file, work, '\n'); + TEST_CASE("4","読み出された内容が正しい", work.compare("This is a sample text file.") == 0); + + file.close(); + remove("test"); + } END_CASE; + + BEGIN_CASE("2","バイナリファイルを指定する (interceptorはファイルを開かない)") { + TestSuite::clearCheckpoints(); + fstream file("test", ios::out|ios::binary); + file.write("\x1", 1); + file.close(); + + bool result = false; + try { openTextFile(file, "test", interceptor); } catch(Exception &) { result = true; } + + TEST_CASE("1","例外が起きる", result); + TEST_CASE("2","ファイルが開かれている", !file.is_open()); + TEST_CASE("3","interceptorがコールされている", TestSuite::isReached("interceptor")); + TEST_CASE("4","interceptorの引数が正しい (file)", interceptor_file == &file); + TEST_CASE("5","interceptorの引数が正しい", interceptor_filename.compare("test") == 0); + + file.close(); + remove("test"); + } END_CASE; + + BEGIN_CASE("3","存在しないファイルを指定する") { + TestSuite::clearCheckpoints(); + fstream file; + bool result = false; + try { openTextFile(file, "___unknown___", interceptor); } catch(Exception &) { result = true; } + + TEST_CASE("1","例外が起きる", result); + TEST_CASE("2","ファイルが開かれていない", !file.is_open()); + TEST_CASE("3","interceptorがコールされていない", !TestSuite::isReached("interceptor")); + } END_CASE; + + BEGIN_CASE("4","interceptorがテキストファイルを生成する") { + TestSuite::clearCheckpoints(); + fstream file("textfile", ios::out|ios::binary); + file.write("\x1", 1); + file.close(); + + bool result = true; + try { openTextFile(file, "textfile", interceptor); } catch(Exception &) { result = false; } + + TEST_CASE("1","例外は起きない", result); + TEST_CASE("2","ファイルが開かれている", file.is_open()); + TEST_CASE("3","interceptorがコールされている", TestSuite::isReached("interceptor")); + TEST_CASE("4","interceptorの引数が正しい (file)", interceptor_file == &file); + TEST_CASE("5","interceptorの引数が正しい", interceptor_filename.compare("textfile") == 0); + + string work; + getline(file, work, '\n'); + TEST_CASE("4","読み出された内容が正しい", work.compare("text") == 0); + + file.close(); + remove("textfile"); + } END_CASE; + + BEGIN_CASE("5","interceptorがバイナリファイルを生成する") { + TestSuite::clearCheckpoints(); + fstream file("binaryfile", ios::out|ios::binary); + file.write("\x1", 1); + file.close(); + + bool result = false; + try { openTextFile(file, "binaryfile", interceptor); } catch(Exception &) { result = true; } + + TEST_CASE("1","例外は起きる", result); + TEST_CASE("2","ファイルが開かれていない", !file.is_open()); + TEST_CASE("3","interceptorがコールされている", TestSuite::isReached("interceptor")); + TEST_CASE("4","interceptorの引数が正しい (file)", interceptor_file == &file); + TEST_CASE("5","interceptorの引数が正しい", interceptor_filename.compare("binaryfile") == 0); + + file.close(); + remove("binaryfile"); + } END_CASE; + } END_CASE; + + BEGIN_CASE("hextodec","hextodec") { + const char * letter = "0123456789abcdEFg"; + const char * work = letter; + + TEST_CASE("1", "切り出された値が正しい", hextodec(work, 2) == 1); + TEST_CASE("2", "workが進んでいる", work == letter + 2); + TEST_CASE("3", "切り出された値が正しい", hextodec(work, 4) == 0x2345); + TEST_CASE("4", "workが進んでいる", work == letter + 6); + TEST_CASE("5", "切り出された値が正しい", hextodec(work, 8) == 0x6789abcd); + TEST_CASE("6", "workが進んでいる", work == letter + 14); + TEST_CASE("7", "切り出された値が正しい", hextodec(work, 8) == 0xef); + TEST_CASE("8", "workが'g'の位置でとまる", *work == 'g'); + TEST_CASE("9", "切り出された値が正しい", hextodec(work, 8) == 0); + TEST_CASE("10", "workが'g'の位置でとまる", *work == 'g'); + } END_CASE; + + BEGIN_CASE("readGnuNmLine","readGnuNmLine") { + fstream file("test", ios::out); + file << "0804aab0 T _kernel_task_initialize\n0805d8a0 B _kernel_tcb_table\n\n0804e560 R _kernel_tinib_table\n U getpid@@GLIBC_2.0\n"; + file.close(); + + address_t address; + string attribute; + string symbolname; + + file.open("test", ios::in); + BEGIN_CASE("1","普通のエントリが読める") { + TEST_CASE("1","関数は成功する", readGnuNmLine(file, address, attribute, symbolname)); + TEST_CASE("2","addressは正しい", address == 0x0804aab0); + TEST_CASE("3","attributeは正しい", attribute.compare("T") == 0); + TEST_CASE("4","symbolnameは正しい", symbolname.compare("_kernel_task_initialize") == 0); + } END_CASE; + + BEGIN_CASE("2","普通のエントリが読める (2)") { + TEST_CASE("1","関数は成功する", readGnuNmLine(file, address, attribute, symbolname)); + TEST_CASE("2","addressは正しい", address == 0x0805d8a0); + TEST_CASE("3","attributeは正しい", attribute.compare("B") == 0); + TEST_CASE("4","symbolnameは正しい", symbolname.compare("_kernel_tcb_table") == 0); + } END_CASE; + + BEGIN_CASE("3","空行を読み飛ばして次が読める") { + TEST_CASE("1","関数は成功する", readGnuNmLine(file, address, attribute, symbolname)); + TEST_CASE("2","addressは正しい", address == 0x0804e560); + TEST_CASE("3","attributeは正しい", attribute.compare("R") == 0); + TEST_CASE("4","symbolnameは正しい", symbolname.compare("_kernel_tinib_table") == 0); + } END_CASE; + + BEGIN_CASE("4","アドレスの無いエントリは無視する") { + TEST_CASE("1","関数は失敗する", !readGnuNmLine(file, address, attribute, symbolname)); + } END_CASE; + + file.close(); + remove("test"); + } END_CASE; + + BEGIN_CASE("loadSymbols","loadSymbols") { + fstream file("test", ios::out); + file << "0804aab0 T _kernel_task_initialize\n0805d8a0 B _kernel_tcb_table\n\n0804e560 R _kernel_tinib_table\n U getpid@@GLIBC_2.0\n"; + file.close(); + + file.open("test",ios::in); + + FileContainerBinutilsImpl fcbi; + fcbi.loadSymbols(file); + + TEST_CASE("1","読み込まれたエントリの数が正しい", fcbi.symbol_table.size() == 3); + TEST_CASE("2","ファイルは閉じられている", !file.is_open()); + + remove("test"); + } END_CASE; + + BEGIN_CASE("writeByte","writeByte") { + FileContainerBinutilsImpl fcbi; + + BEGIN_CASE("1","存在しないページへの書き込み") { + TEST_CASE("0", "[前提] contentsの要素数は0", fcbi.contents.size() == 0); + fcbi.writeByte(0x100, 0); + + TEST_CASE("1","contentsの要素が増えている", fcbi.contents.size() == 1); + + const char * scope = fcbi.contents.find(MAKE_BASEADDRESS(0x100))->second + MAKE_OFFSETADDRESS(0x100); + TEST_CASE("2","書き込まれている内容が正しい", *scope == 0); + } END_CASE; + + BEGIN_CASE("2","存在するページへの書き込み (連続アクセス)") { + fcbi.writeByte(0x100, 0xff); + + TEST_CASE("1","contentsの要素が増えていない", fcbi.contents.size() == 1); + + const char * scope = fcbi.contents.find(MAKE_BASEADDRESS(0x100))->second + MAKE_OFFSETADDRESS(0x100); + TEST_CASE("2","書き込まれている内容が正しい", *scope == 0xff); + } END_CASE; + + BEGIN_CASE("3","新しいページへの書き込み") { + fcbi.writeByte(0x10000000, 0xff); + + TEST_CASE("1","contentsの要素が増えている", fcbi.contents.size() == 2); + + const char * scope = fcbi.contents.find(MAKE_BASEADDRESS(0x10000000))->second + MAKE_OFFSETADDRESS(0x10000000); + TEST_CASE("2","書き込まれている内容が正しい", *scope == 0xff); + } END_CASE; + + BEGIN_CASE("4","既存のページへのアクセス") { + fcbi.writeByte(0x100, 0x0); + + TEST_CASE("1","contentsの要素が増えていない", fcbi.contents.size() == 2); + + const char * scope = fcbi.contents.find(MAKE_BASEADDRESS(0x100))->second + MAKE_OFFSETADDRESS(0x100); + TEST_CASE("2","書き込まれている内容が正しい", *scope == 0x0); + } END_CASE; + } END_CASE; + + BEGIN_CASE("readRecord","readRecord") { + fstream file("test",ios::out); + file << "S315080480F42F6C69622F6C642D6C696E75782E736F98\n\nS315080480F42F6C69622F6C642D6C696E75782E736F98\nS308080481042E320005\nDUMMY\nS31808048108040000001000000001000000474E550056\nS31008048108040000001000000001000000474E550056\n"; + file.close(); + + file.open("test",ios::in); + BEGIN_CASE("1","正常ケース") { + string work; + bool result; + bool exception = false; + try { result = readRecord(file, work); } catch(Exception &) { exception = true; } + TEST_CASE("1","例外は起こらない", !exception); + TEST_CASE("2","関数はtrueを返す", result); + TEST_CASE("3","読み出された内容が正しい", work.compare("S315080480F42F6C69622F6C642D6C696E75782E736F98") == 0); + } END_CASE; + + BEGIN_CASE("2","正常ケース (空行の読み飛ばし)") { + string work; + bool result; + bool exception = false; + try { result = readRecord(file, work); } catch(Exception &) { exception = true; } + TEST_CASE("1","例外は起こらない", !exception); + TEST_CASE("2","関数はtrueを返す", result); + TEST_CASE("3","読み出された内容が正しい", work.compare("S315080480F42F6C69622F6C642D6C696E75782E736F98") == 0); + } END_CASE; + + BEGIN_CASE("3","チェックサムが誤っているエントリ") { + string work; + bool result; + bool exception = false; + try { result = readRecord(file, work); } catch(Exception &) { exception = true; } + TEST_CASE("1","例外をおこす", exception); + } END_CASE; + + BEGIN_CASE("4","先頭がSで始まらないエントリ") { + string work; + bool result; + bool exception = false; + try { result = readRecord(file, work); } catch(Exception &) { exception = true; } + TEST_CASE("1","例外をおこす", exception); + } END_CASE; + + BEGIN_CASE("5","指定された長さよりも長いエントリ") { + string work; + bool result; + bool exception = false; + try { result = readRecord(file, work); } catch(Exception &) { exception = true; } + TEST_CASE("1","例外をおこす", exception); + } END_CASE; + + BEGIN_CASE("6","指定された長さよりも短いエントリ") { + string work; + bool result; + bool exception = false; + try { result = readRecord(file, work); } catch(Exception &) { exception = true; } + TEST_CASE("1","例外をおこす", exception); + } END_CASE; + + BEGIN_CASE("7","ファイル終端") { + string work; + bool result; + bool exception = false; + try { result = readRecord(file, work); } catch(Exception &) { exception = true; } + TEST_CASE("1","例外をおこさない", !exception); + TEST_CASE("2","関数はfalseを返す", !result); + } END_CASE; + + remove("test"); + } END_CASE; + + BEGIN_CASE("chopRecord","chopRecord") { + BEGIN_CASE("1","S1レコード") { + string src("S106080480F42F4A"); + + chopRecord(src); + TEST_CASE("1","値が正しい", src.compare("80F42F") == 0); + } END_CASE; + + BEGIN_CASE("2","S2レコード") { + string src("S206080480F42F4A"); + + chopRecord(src); + TEST_CASE("1","値が正しい", src.compare("F42F") == 0); + } END_CASE; + + BEGIN_CASE("3","S3レコード") { + string src("S306080480F42F4A"); + + chopRecord(src); + TEST_CASE("1","値が正しい", src.compare("2F") == 0); + } END_CASE; + + BEGIN_CASE("4","S4レコード") { + string src("S406080480F42F4A"); + + chopRecord(src); + TEST_CASE("1","値が正しい", src.compare("080480F42F") == 0); + } END_CASE; + + BEGIN_CASE("5","S5レコード") { + string src("S506080480F42F4A"); + + chopRecord(src); + TEST_CASE("1","値が正しい", src.compare("080480F42F") == 0); + } END_CASE; + + } END_CASE; + + BEGIN_CASE("loadDataContents/loadContents","loadDataContents/loadContents") { + fstream file("test", ios::out); + file << "S30D000000000123456789ABCDEF32\nS509FEDCBA9876543210BE"; + file.close(); + + BEGIN_CASE("1","正常ケース") { + FileContainerBinutilsImpl fcbi; + + file.open("test",ios::in); + bool exception = false; + try { fcbi.loadDataContents(file); } catch(...) { exception = true; } + + TEST_CASE("1","例外は起こらない", !exception); + TEST_CASE("2","データが確保されている", fcbi.contents.size() == 1); + TEST_CASE("3","ファイルは閉じられている", !file.is_open()); + BEGIN_CASE("4","格納した値が正しく読める") { + unsigned int i; + + assert(sizeof(unsigned int) >= 4); + i = 0; + + fcbi.loadContents(&i, 0, 4); + TEST_CASE("1","1-4バイト目", i == 0x67452301); + fcbi.loadContents(&i, 4, 4); + TEST_CASE("1","5-8バイト目", i == 0xefcdab89); + fcbi.loadContents(&i, 8, 4); + TEST_CASE("1","9-12バイト目", i == 0x98badcfe); + fcbi.loadContents(&i,12, 4); + TEST_CASE("1","13-16バイト目", i == 0x10325476); + } END_CASE; + } END_CASE; + remove("test"); + + BEGIN_CASE("2","loadContentsで一度にページサイズを超える量を要求する") { + FileContainerBinutilsImpl fcbi; + unsigned int i; + + for(i=0;i(MAGIC_SYMBOL, 0x100)); + + fcbi.searchSymbolPrefix(); + if(!fcbi.symbol_prefix.empty()) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","変数名に\"_\"がつくタイプ") { + FileContainerBinutilsImpl fcbi; + fcbi.symbol_table.insert(pair("_" MAGIC_SYMBOL, 0x100)); + + fcbi.searchSymbolPrefix(); + if(fcbi.symbol_prefix.compare("_") != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3","\"__\"には反応しない") { + FileContainerBinutilsImpl fcbi; + fcbi.symbol_table.insert(pair("__" MAGIC_SYMBOL, 0x100)); + + fcbi.searchSymbolPrefix(); + if(!fcbi.symbol_prefix.empty()) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("4","発見できない場合、変更しない") { + FileContainerBinutilsImpl fcbi; + fcbi.symbol_prefix.assign("test"); + + fcbi.searchSymbolPrefix(); + if(fcbi.symbol_prefix.compare("test") != 0) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("searchByteOrder","searchByteOrder") { + BEGIN_CASE("1","ホストと同じエンディアン") { + FileContainerBinutilsImpl fcbi; + unsigned int value = MAGIC_NUMBER; + fcbi.symbol_table.insert(pair(MAGIC_SYMBOL, 0x100)); + + for(int i=0;i<4;i++) + fcbi.writeByte(0x100 + i, *((char *)&value + i)); + + fcbi.byteorder = UNKNOWN; + fcbi.searchByteOrder(); + + if(fcbi.byteorder != HOSTORDER) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","ホストと違うエンディアン") { + FileContainerBinutilsImpl fcbi; + unsigned int value = MAGIC_NUMBER; + fcbi.symbol_table.insert(pair(MAGIC_SYMBOL, 0x100)); + + for(int i=0;i<4;i++) + fcbi.writeByte(0x100 + i, *((char *)&value + (3 - i))); + + fcbi.byteorder = UNKNOWN; + fcbi.searchByteOrder(); + + if(fcbi.byteorder == HOSTORDER) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3","シンボルが無い") { + FileContainerBinutilsImpl fcbi; + unsigned int value = MAGIC_NUMBER; + + for(int i=0;i<4;i++) + fcbi.writeByte(0x100 + i, *((char *)&value + (3 - i))); + + fcbi.byteorder = UNKNOWN; + fcbi.searchByteOrder(); + + if(fcbi.byteorder != UNKNOWN) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("4","データが無い") { + FileContainerBinutilsImpl fcbi; + unsigned int value = MAGIC_NUMBER; + fcbi.symbol_table.insert(pair(MAGIC_SYMBOL, 0x100)); + + fcbi.byteorder = UNKNOWN; + fcbi.searchByteOrder(); + + if(fcbi.byteorder != UNKNOWN) + TEST_FAIL; + } END_CASE; + } END_CASE; + + chain.restoreContext(); +} + +#endif /* TESTSUITE */ + +#endif /* FILECONTAINER_BINUTILS || TESTSUITE */ + diff --git a/uzume_prototype/kernel/cfg/base/fc_windows.cpp b/uzume_prototype/kernel/cfg/base/fc_windows.cpp new file mode 100644 index 0000000..8261420 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/fc_windows.cpp @@ -0,0 +1,268 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: fc_windows.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +#if (defined(FILECONTAINER_WINDOWS) || defined(TESTSUITE)) && defined(_MSC_VER) + +#pragma warning(disable:4786) + +#include "base/filecontainer.h" +#include +#include +#include + +using namespace std; + +namespace { + + class FileContainerWindowsImpl : public FileContainer + { + protected: + HANDLE process; + LOADED_IMAGE image; + DWORD base; + + inline bool isLoaded(void) const + { return base != 0; } + + public: + FileContainerWindowsImpl(void) throw(); + virtual ~FileContainerWindowsImpl(void) throw(); + + /* インタフェース部 */ + virtual void attachModule(const string & filename) throw(Exception); + virtual void loadContents(void * dest, address_t address, size_t size) throw(Exception); + virtual address_t getSymbolAddress(const string & symbol) throw(Exception); + virtual std::string getArchitecture(void) throw(); + + TESTSUITE_PROTOTYPE(main) + }; + + FileContainerWindowsImpl instance_of_FileContaienrWindowsImpl; + + /* コンストラクタ */ + FileContainerWindowsImpl::FileContainerWindowsImpl(void) throw() + : process(NULL), image(), base(0) + {} + + /* デストラクタ */ + FileContainerWindowsImpl::~FileContainerWindowsImpl(void) throw() + { + if(isLoaded()) { + ::UnMapAndLoad(&image); + ::SymUnloadModule(process, base); + process = NULL; + base = 0; + } + } + + /* 対象モジュールの割付 */ + void FileContainerWindowsImpl::attachModule(const std::string & _filename) throw(Exception) + { + string filename(_filename); + + process = ::GetCurrentProcess(); + if(::SymInitialize( process , NULL, FALSE) == FALSE) + ExceptionMessage("[Internal Error] ImageHelper API initialization failure","[内部エラー] 初期化に失敗しました (ImageHlp)").throwException(); + + base = ::SymLoadModule(process, NULL, (PSTR)filename.c_str(), NULL, 0, 0); + + image.SizeOfImage = sizeof(LOADED_IMAGE); + if(::MapAndLoad((PSTR)filename.c_str(), NULL, &image, FALSE, TRUE) == FALSE) + ExceptionMessage("[Internel error] Module loading failure [%]","[内部エラー] モジュールの読み込みに失敗しました [%]") << filename << throwException; + } + + /* 内容の取得 */ + void FileContainerWindowsImpl::loadContents(void * dest, address_t address, size_t size) throw(Exception) + { + PIMAGE_SECTION_HEADER header; + unsigned int i; + + address -= base; + for(i=0;i= header->VirtualAddress && address < header->VirtualAddress + header->SizeOfRawData) { + address -= header->VirtualAddress - header->PointerToRawData; + ::CopyMemory(dest,image.MappedAddress + address,size); + break; + } + } + + if(i == image.NumberOfSections) + ExceptionMessage("[Internel error] Memory read with unmapped address","[内部エラー] マップされてないアドレスを使ってメモリリードが行われました").throwException(); + } + + /* シンボルアドレスの解決 */ + FileContainer::address_t FileContainerWindowsImpl::getSymbolAddress(const string & _symbol) throw(Exception) + { + FileContainer::address_t result = 0; + string symbol(_symbol); + IMAGEHLP_SYMBOL sym; + + if(process == NULL || base == 0) + ExceptionMessage("Not initialized","初期化されてません").throwException(); + + sym.SizeOfStruct = sizeof(sym); + sym.MaxNameLength = 0; + + if(::SymGetSymFromName(process, (PSTR)symbol.c_str(), &sym) == TRUE) + result = static_cast(sym.Address); + + if(result == 0) + ExceptionMessage("Unknown symbol [%]","不正なシンボル名 [%]") << symbol << throwException; + + return static_cast(sym.Address); + } + + string FileContainerWindowsImpl::getArchitecture(void) throw() + { return "Windows (Win32)"; } + +} + +//--------------------------------------------- + +#ifdef TESTSUITE +#include "base/coverage_undefs.h" + +#pragma warning(disable:4311) //'reinterpret_cast' : ポインタを 'const int *__w64 ' から 'FileContainer::address_t' へ切り詰めます。 + +extern "C" const int FileContainerWindowsImplTestVariable = 0x01234567; +extern "C" const int _FileContainerWindowsImplTestVariableWithUnderbar = 0x89abcdef; + +TESTSUITE(main, FileContainerWindowsImpl) +{ + PREDECESSOR("TFileContainer"); + + SingletonBase::ContextChain chain; + chain.saveContext(); + chain.renewInstance(); + + BEGIN_CASE("attachModule","attachModule") { + BEGIN_CASE("1","実行しているプログラムが開けるか") { + FileContainerWindowsImpl fcwi; + bool result = true; + try { fcwi.attachModule(TestSuite::getProgName()); } catch(...) { result = false; } + + TEST_CASE("1", "例外は起きない", result); + } END_CASE; + + BEGIN_CASE("2","存在しないファイル名で例外") { + FileContainerWindowsImpl fcwi; + bool result = false; + try { fcwi.attachModule("..."); } catch(...) { result = true; } + + TEST_CASE("1", "例外が起きる", result); + } END_CASE; + } END_CASE; + + BEGIN_CASE("getSymbolAddress","getSymbolAddress") { + FileContainerWindowsImpl fcwi; + + BEGIN_CASE("1","初期化していない状態で検索する") { + bool result = false; + try { fcwi.getSymbolAddress("FileContainerWindowsImplTestVariable"); } catch(...) { result = true; } + TEST_CASE("1","例外がおきる", result); + } END_CASE; + + fcwi.attachModule(TestSuite::getProgName()); + + BEGIN_CASE("2","存在するシンボルを検索する") { + FileContainer::address_t addr = 0; + bool result = true; + + try { addr = fcwi.getSymbolAddress("FileContainerWindowsImplTestVariable"); } catch(...) { result = false; } + + TEST_CASE("1","例外は起きない", result); + TEST_CASE("2","アドレスが正しい", addr == reinterpret_cast(&FileContainerWindowsImplTestVariable)); + } END_CASE; + + BEGIN_CASE("3","余計な_を勝手に付加しない") { + FileContainer::address_t addr = 0; + bool result = false; + + try { addr = fcwi.getSymbolAddress("FileContainerWindowsImplTestVariableWithUnderbar"); } catch(...) { result = true; } + + TEST_CASE("1","例外が起きる", result); + TEST_CASE("2","アドレスは0のまま", addr == 0); + } END_CASE; + + BEGIN_CASE("4","存在しないシンボルを検索する") { + FileContainer::address_t addr = 0; + bool result = false; + + try { addr = fcwi.getSymbolAddress("____unknown____"); } catch(...) { result = true; } + + TEST_CASE("1","例外がおきる", result); + } END_CASE; + } END_CASE; + + BEGIN_CASE("loadContents","loadContents") { + FileContainerWindowsImpl fcwi; + fcwi.attachModule(TestSuite::getProgName()); + + BEGIN_CASE("1","存在する変数を読み出す") { + FileContainer::address_t addr; + int i; + + addr = fcwi.getSymbolAddress("FileContainerWindowsImplTestVariable"); + bool result = true; + try { fcwi.loadContents(&i, addr, sizeof(i)); } catch(...) { result = false; } + + TEST_CASE("1","例外は起きない", result); + TEST_CASE("2","読み出された内容は正しい", i == FileContainerWindowsImplTestVariable); + } END_CASE; + + BEGIN_CASE("2","存在しない変数を読み出す") { + FileContainer::address_t addr; + int i; + + addr = ~0; + bool result = false; + try { fcwi.loadContents(&i, addr, sizeof(i)); } catch(Exception &) { result = true; } + + TEST_CASE("1","例外が起こる", result); + } END_CASE; + + } END_CASE; + + chain.restoreContext(); +} + +#endif /* TESTSUITE */ + +#endif /* FILECONTAINER_WINDOWS || TESTSUITE */ + diff --git a/uzume_prototype/kernel/cfg/base/filecontainer.cpp b/uzume_prototype/kernel/cfg/base/filecontainer.cpp new file mode 100644 index 0000000..deedbe2 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/filecontainer.cpp @@ -0,0 +1,754 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: filecontainer.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +#ifdef _MSC_VER +#pragma warning(disable:4786) //デバッグ文字列を255文字に切り詰めた +#endif + +#include "base/filecontainer.h" +#include +#include + +using namespace std; + +namespace { + /* 符号なし10進文字列のパース */ + char * parse_uint(char * src, unsigned int * dest, unsigned int default_value = 0) + { + int result = 0; + + if(*src < '0' || *src > '9') { + *dest = default_value; + return src; + } + + do { + result = result * 10 + *(src++) - '0'; + } while(*src >= '0' && *src <='9'); + + *dest = result; + return src; + } +} + + /* 変数情報の読み込み */ +void FileContainer::attachInfo(const string & filename) throw(Exception) +{ + char buffer[256]; + fstream file; + + char * work; + struct tagVariableInfo info; + + memset(&info, 0, sizeof(info)); + + file.open(filename.c_str(), ios::in); + if(!file.is_open()) { + ExceptionMessage("Structure information file(%) was not found. ","構造体情報ファイル(%)が見つかりません ") << filename << throwException; + return; + } + + while(!file.eof()) + { + file.get(buffer, 256); + + if(!file.fail()) { + switch(buffer[0]) + { + case 's': + { + unsigned int address = 0; + unsigned int size = 0; + + work = buffer+1; + while(*work != ',' && *work != '\x0') + work++; + if(*work != '\x0') { + *work = '\x0'; + work = parse_uint(work+1,&size); + work = parse_uint(work+1,&address); + } + + info.address = static_cast(address); + info.size = static_cast(size); + variableinfo[string(buffer+1)] = info; + break; + } + + case 'd': //識別子名は無視 + break; + + default: + ExceptionMessage("Unknown information type identifier found - [%]","未知の型識別子 - [%]") << buffer[0] << throwException; + } + } + else + file.clear(); + + file.get(); + } + + file.close(); +} + + /* 変数情報の取得 */ +struct FileContainer::tagVariableInfo FileContainer::getVariableInfo(const string & name) throw(Exception) +{ + map::const_iterator scope; + + scope = variableinfo.find(name); + if(scope == variableinfo.end()) { + ExceptionMessage("Operation against the unknwon symbol [%] was rejected.","不明なシンボル名 [%] の情報を取得しようとしています") << name << throwException; + + struct tagVariableInfo dummy; + memset(&dummy, 0, sizeof(dummy)); + return dummy; + } + + return scope->second; +} + + + /* コンストラクタ (シンボル名を指定して初期化) */ +TargetVariableBase::TargetVariableBase(const std::string & sym) throw() + : address(0), size(0), offset(0), structure_size(0), loaded(false) +{ + try{ + FileContainer * fc = FileContainer::getInstance(); + address = fc->getSymbolAddress(sym); + size = fc->getVariableInfo(sym).size; + structure_size = size; + } + catch(...) { + address = 0; + size = 0; + } +} + + /* コンストラクタ (シンボル名, データ長を指定して初期化) */ +TargetVariableBase::TargetVariableBase(const string & sym, size_t _size) throw() + : address(0), size(_size), offset(0), structure_size(_size), loaded(false) +{ + try{ + FileContainer * fc = FileContainer::getInstance(); + address = fc->getSymbolAddress(sym); + } + catch(...) { + address = 0; + size = 0; + } +} + + /* コンストラクタ (シンボル名、メンバ名を指定して初期化) */ +TargetVariableBase::TargetVariableBase(const string & sym, const string & sz) throw() + : address(0), size(0), offset(0), structure_size(0), loaded(false) +{ + try{ + FileContainer * fc = FileContainer::getInstance(); + address = fc->getSymbolAddress(sym); //構造体の先頭アドレス + size = fc->getVariableInfo(sz).size; //メンバ変数の長さ + offset = static_cast(fc->getVariableInfo(sz).address); //メンバ変数のオフセット + structure_size = fc->getVariableInfo(sym).size; //構造体の長さ + } + catch(...) { + address = 0; + size = 0; + } +} + + /* コピーコンストラクタ */ +TargetVariableBase::TargetVariableBase(const TargetVariableBase & src) throw() + : address(0), size(0), offset(0), structure_size(0), loaded(false) +{ + if(src.isValid()) { + address = src.address; + size = src.size; + offset = src.offset; + structure_size = src.structure_size; + loaded = false; + } +} + + + /* オブジェクト内容の取得 */ +void TargetVariableBase::loadContent(void * dest, size_t dest_size) throw(Exception) +{ + char * buffer = 0; + + try { + if(isValid()) { + buffer = new char[getSize()]; + FileContainer * fc = FileContainer::getInstance(); + + fc->loadContents(buffer, getAddress() + getOffset(), getSize()); + if(fc->getByteOrder() != FileContainer::HOSTORDER) + changeEndian(buffer, getSize()); + + if(size < dest_size) + memset(dest, 0, dest_size); + else if(size > dest_size) + ExceptionMessage("[TargetVariableBase::loadContent] Destination storage is too small to store the contents.","[TargetVariableBase::loadContent] 出力先バッファのサイズが小さすぎます").throwException(); + memcpy(dest, buffer, getSize()); + + delete [] buffer; + loaded = true; + } + else { + ExceptionMessage("loadContent was performed with an illegal target variable.","不正なターゲット変数情報でloadContentが呼ばれました").throwException(); + } + } + catch(bad_alloc &) { + ExceptionMessage("No available memory [%B]","メモリ不足です [%B]") << (unsigned int)getSize() << throwException; + } + catch(Exception &) { + if(buffer) + delete [] buffer; + throw; + } +} + + /* バイトオーダの変更 */ +void TargetVariableBase::changeEndian(char * buffer, size_t size) throw() +{ + char * tail = buffer + size - 1; + + while(buffer < tail) { + char temporary = *buffer; + *buffer = *tail; + *tail = temporary; + + ++ buffer; + -- tail; + } +} + + + +//--------------------------------------------- + +#ifdef TESTSUITE +#include "base/coverage_undefs.h" + +#include +#define _isprint(x) isprint(x) + +class TFileContainer : public FileContainer +{ +public: + TFileContainer(void) throw() {} + virtual ~TFileContainer(void) throw() {} + + string module; + void attachModule(const std::string & _module) throw(Exception) + { + CHECKPOINT("attachModule"); + module = _module; + } + + void * dest; + address_t addr; + size_t sz; + void loadContents(void * _dest, address_t _addr, size_t _sz) throw(Exception) + { + CHECKPOINT("loadContents"); + dest = _dest; + addr = _addr; + sz = _sz; + memset(_dest, ~0, _sz); + } + + string symbol; + address_t getSymbolAddress(const std::string & _symbol) throw(Exception) + { + CHECKPOINT("getSymbolAddress"); + symbol = _symbol; + return 1; + } + + std::string getArchitecture(void) throw(Exception) + { return "TFileContainer"; } + + TESTSUITE_PROTOTYPE(main) +}; + +TESTSUITE(main, TFileContainer) +{ + PREDECESSOR("SingletonBase"); + PREDECESSOR("RuntimeObjectTable"); + + SingletonBase::ContextChain chain; + chain.saveContext(); + chain.renewInstance(); + + BEGIN_CASE("getInstance","getInstance") { + BEGIN_CASE("1","何も登録されていないときのgetInstanceで例外") { + bool result = false; + try { FileContainer::getInstance(); } catch(Exception &) { result = true; } + if(!result) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","getInstanceでインスタンスが返る") { + TFileContainer fc; + FileContainer * instance; + bool result = true; + try { instance = FileContainer::getInstance(); } catch(...) { result = false; } + TEST_CASE("1","例外はおきない", result); + TEST_CASE("2","取得できるインスタンスが正しい", instance == &fc); + } END_CASE; + } END_CASE; + + BEGIN_CASE("parse_uint","parse_uint") { + BEGIN_CASE("1","数字を切り出せる") { + unsigned int dest; + char * src = "123"; + char * result = parse_uint(src, &dest); + + TEST_CASE("1","resultが最後に来ている", result == src + 3); + TEST_CASE("2","値は正しい", dest == 123); + } END_CASE; + + BEGIN_CASE("2","数字で無い文字を与えるとデフォルト値が返る") { + unsigned int dest; + char * src = "abc"; + char * result = parse_uint(src, &dest, 1234567); + + TEST_CASE("1","resultは進んでいない", result == src); + TEST_CASE("2","デフォルト値が返る", dest == 1234567); + } END_CASE; + + BEGIN_CASE("3","デリミタでとまる") { + unsigned int dest; + char * src = "321,123"; + char * result = parse_uint(src, &dest); + + TEST_CASE("1","resultは進んでいない", result == src + 3); + TEST_CASE("2","デフォルト値が返る", dest == 321); + } END_CASE; + } END_CASE; + + BEGIN_CASE("attachInfo","attachInfo") { + BEGIN_CASE("1","普通に処理をさせる") { + fstream file("dummy",ios::out); + file << "s_kernel_tinib_table,32,0\nstask_initialization_block::texrtn,4,28\n"; + file.close(); + + TFileContainer fc; + + bool result = true; + try { fc.attachInfo("dummy"); } catch(...) { result = false; } + + TEST_CASE("1","例外はおきない", result); + + map::iterator scope = fc.variableinfo.find("_kernel_tinib_table"); + TEST_CASE("2","要素が追加されている (tinib)", scope != fc.variableinfo.end()); + TEST_CASE("3","値が正しい (tinib)", scope->second.size == 32); + + scope = fc.variableinfo.find("task_initialization_block::texrtn"); + TEST_CASE("4","要素が追加されている (texrtn)", scope != fc.variableinfo.end()); + TEST_CASE("5","値が正しい (texrtn.size)", scope->second.size == 4); + TEST_CASE("6","値が正しい (texrtn.address)", scope->second.address == 28); + } END_CASE; + remove("dummy"); + + BEGIN_CASE("2","識別文字 'd' を無視する") { + fstream file("dummy",ios::out); + file << "ddummy,0\ndtask_initialization_block::texrtn,4,28\n"; + file.close(); + + TFileContainer fc; + + bool result = true; + try { fc.attachInfo("dummy"); } catch(...) { result = false; } + + TEST_CASE("1","例外はおきない", result); + TEST_CASE("2","要素は追加されていない", fc.variableinfo.size() == 0); + } END_CASE; + remove("dummy"); + + BEGIN_CASE("3","空行を無視できる") { + fstream file("dummy",ios::out); + file << "s_kernel_tinib_table,32,0\n\nstask_initialization_block::texrtn,4,28\n"; + file.close(); + + TFileContainer fc; + + bool result = true; + try { fc.attachInfo("dummy"); } catch(...) { result = false; } + + TEST_CASE("1","例外はおきない", result); + + map::iterator scope = fc.variableinfo.find("_kernel_tinib_table"); + TEST_CASE("2","要素が追加されている (tinib)", scope != fc.variableinfo.end()); + TEST_CASE("3","値が正しい (tinib)", scope->second.size == 32); + + scope = fc.variableinfo.find("task_initialization_block::texrtn"); + TEST_CASE("4","要素が追加されている (texrtn)", scope != fc.variableinfo.end()); + TEST_CASE("5","値が正しい (texrtn.size)", scope->second.size == 4); + TEST_CASE("6","値が正しい (texrtn.address)", scope->second.address == 28); + } END_CASE; + remove("dummy"); + + BEGIN_CASE("4","'s'と'd'以外をはじく") { + char c; + char msg[2] = {0, 0}; + + for(c=0;c<128;++c) { + if(isprint(c) && (c != 's' && c != 'd')) { + fstream file("dummy",ios::out); + file << c; + file << "dummy,0\n"; + file.close(); + + TFileContainer fc; + + bool result = false; + try { fc.attachInfo("dummy"); } catch(...) { result = true; } + + msg[0] = c; + TEST_CASE_("1","例外がおきる", result, string(msg)); + TEST_CASE_("2","要素は追加されていない", fc.variableinfo.size() == 0, string(msg)); + } + } + } END_CASE; + remove("dummy"); + } END_CASE; + + chain.restoreContext(); +} + +class TTargetVariable : public TargetVariable +{ + TESTSUITE_PROTOTYPE(main) + + /* + * コンストラクタ (TargetVariableに回送) + */ + inline TTargetVariable(FileContainer::address_t addr) throw() + : TargetVariable(addr) + {} + + inline TTargetVariable(FileContainer::address_t addr, size_t sz) throw() + : TargetVariable(addr, sz) + {} + + inline TTargetVariable(FileContainer::address_t addr, size_t sz, size_t ofs, size_t ssz) throw() + : TargetVariable(addr, sz, ofs, ssz) + {} + + inline TTargetVariable(const std::string & sym) throw() + : TargetVariable(sym) + {} + + inline TTargetVariable(const std::string & sym, const std::string & sz) throw() + : TargetVariable(sym, sz) + {} + + /* デストラクタ (特に何もしない) */ + virtual ~TTargetVariable(void) throw() + {} +}; + +TESTSUITE(main, TTargetVariable) +{ + PREDECESSOR("SingletonBase"); + PREDECESSOR("TFileContainer"); + PREDECESSOR("RuntimeObjectTable"); + + SingletonBase::ContextChain chain; + chain.saveContext(); + chain.renewInstance(); + + TFileContainer fc; + fstream file("dummy",ios::out); + file << "s_test,4,0\ns_kernel_tinib_table,32,0\nstask_initialization_block::texrtn,4,28\n"; + file.close(); + + fc.attachInfo("dummy"); + + BEGIN_CASE("constructor","コンストラクタ") { + BEGIN_CASE("1", "(address_t, size_t)") { + TTargetVariable tv(1, 2); + + TEST_CASE("1","変数は有効", tv.isValid()); + TEST_CASE("2","アドレスは正しい", tv.getAddress() == 1); + TEST_CASE("3","サイズは正しい", tv.getSize() == 2); + TEST_CASE("4","オフセットは0", tv.getOffset() == 0); + TEST_CASE("5","構造体サイズは変数サイズと一緒", tv.getStructureSize() == tv.getSize()); + } END_CASE; + + BEGIN_CASE("2","(address_t, size_t, size_t, size_t)") { + TTargetVariable tv(1,2,3,4); + + TEST_CASE("1","変数は有効", tv.isValid()); + TEST_CASE("2","アドレスは正しい", tv.getAddress() == 1); + TEST_CASE("3","サイズは正しい", tv.getSize() == 2); + TEST_CASE("4","オフセットは正しい", tv.getOffset() == 3); + TEST_CASE("5","構造体サイズは正しい", tv.getStructureSize() == 4); + } END_CASE; + + BEGIN_CASE("3","(string)") { + TestSuite::clearCheckpoints(); + + TTargetVariable tv("_test"); + + TEST_CASE("1","変数は有効", tv.isValid()); + TEST_CASE("2","getSymbolAddressがコールされている", TestSuite::isReached("getSymbolAddress")); + TEST_CASE("3","getSymbolAddressの引数が正しい", fc.symbol.compare("_test") == 0); + TEST_CASE("3","アドレスは正しい", tv.getAddress() == 1); + TEST_CASE("4","サイズは正しい", tv.getSize() == 4); + TEST_CASE("5","オフセットは正しい", tv.getOffset() == 0); + TEST_CASE("6","構造体サイズは正しい", tv.getStructureSize() == 4); + } END_CASE; + + BEGIN_CASE("4","(string,string)") { + TestSuite::clearCheckpoints(); + + TTargetVariable tv("_kernel_tinib_table", "task_initialization_block::texrtn"); + + TEST_CASE("1","変数は有効", tv.isValid()); + TEST_CASE("2","getSymbolAddressがコールされている", TestSuite::isReached("getSymbolAddress")); + TEST_CASE("3","getSymbolAddressの引数が正しい", fc.symbol.compare("_kernel_tinib_table") == 0); + TEST_CASE("3","アドレスは正しい", tv.getAddress() == 1); + TEST_CASE("4","サイズは正しい", tv.getSize() == 4); + TEST_CASE("5","オフセットは正しい", tv.getOffset() == 28); + TEST_CASE("6","構造体サイズは正しい", tv.getStructureSize() == 32); + } END_CASE; + + BEGIN_CASE("5","無効なケース") { + TEST_CASE("1","アドレス0の変数は無効 (1)", !TTargetVariable(0,4).isValid()); + TEST_CASE("2","アドレス0の変数は無効 (2)", !TTargetVariable(0,4,4,4).isValid()); + TEST_CASE("3","サイズ0の変数は無効 (1)", !TTargetVariable(4,0).isValid()); + TEST_CASE("4","サイズ0の変数は無効 (2)", !TTargetVariable(4,0,4,4).isValid()); + TEST_CASE("5","構造体サイズ0の変数は無効", !TTargetVariable(4,4,4,0).isValid()); + + TEST_CASE("6","存在しないシンボル名の変数も無効(1)", !TTargetVariable("unknown").isValid()); + TEST_CASE("7","存在しないシンボル名の変数も無効(2)", !TTargetVariable("unknown","task_initialization_block::texrtn").isValid()); + TEST_CASE("8","存在しないメンバ名の変数も無効", !TTargetVariable("_kernel_tinib_table","unknown").isValid()); + + TEST_CASE("10","格納領域が不足している変数", !TTargetVariable("_kernel_tinib_table").isValid()); + TEST_CASE("11","無効な引数をもらった場合", !TTargetVariable(*((TTargetVariable *)0)).isValid()); + } END_CASE; + } END_CASE; + + BEGIN_CASE("loadContents", "loadContents") { + BEGIN_CASE("1","通常起動") { + int i; + TTargetVariable tv(0x100); + + bool result = true; + try { tv.loadContent(&i, sizeof(int)); } catch(...) { result = false; } + + TEST_CASE("1","例外は起こらない", result); + TEST_CASE("2","中身は~0でフィルされている", i == ~0); + } END_CASE; + + BEGIN_CASE("2","元よりも大きな型で受ける") { + struct { int first; int second; } i; + TTargetVariable tv(0x100); + + bool result = true; + try { tv.loadContent(&i, sizeof(i)); } catch(...) { result = false; } + + TEST_CASE("1","例外は起こらない", result); + TEST_CASE("2","中身は~0でフィルされている", i.first == ~0); + TEST_CASE("3","残りは0でフィルされている", i.second == 0); + } END_CASE; + + BEGIN_CASE("3","無効な要素に対して実行する") { + TTargetVariable tv(0, 0, 0, 0); + int i; + + bool result = false; + try{ tv.loadContent(&i, sizeof(i)); } catch(...) { result = true; } + TEST_CASE("1","例外が起きる", result); + } END_CASE; + + BEGIN_CASE("4","元よりも小さな型で受ける") { + char i; + TTargetVariable tv(0x100); + + bool result = false; + try { tv.loadContent(&i, sizeof(i)); } catch(...) { result = true; } + + TEST_CASE("1","例外が起こる", result); + } END_CASE; + + } END_CASE; + + BEGIN_CASE("pointer_operators","ポインタ風の演算") { + TargetVariable tv(0x100); + TargetVariable tvl(0x100); + + *tvl; + + TEST_CASE("0","[前提] tv:アドレスは0x100", tv.getAddress() == 0x100); + TEST_CASE("0","[前提] tv:サイズは4", tv.getSize() == 4); + TEST_CASE("0","[前提] tv:構造体サイズも4", tv.getStructureSize() == 4); + TEST_CASE("0","[前提] tv:読出し未了", !tv.isLoaded()); + TEST_CASE("0","[前提] tvl:アドレスは0x100", tvl.getAddress() == 0x100); + TEST_CASE("0","[前提] tvl:サイズは4", tvl.getSize() == 4); + TEST_CASE("0","[前提] tvl:構造体サイズも4", tvl.getStructureSize() == 4); + TEST_CASE("0","[前提] tvl:読出し完了", tvl.isLoaded()); + + BEGIN_CASE("1","operator +") { + TestSuite::clearCheckpoints(); + + TargetVariable work = tv + 0x10; + TEST_CASE("1","workのアドレスは0x140", work.getAddress() == 0x100 + sizeof(int) * 0x10); + TEST_CASE("2","workは読み込まれていない", !work.isLoaded()); + } END_CASE; + + BEGIN_CASE("2","operator -") { + TestSuite::clearCheckpoints(); + + TargetVariable work = tv - 0x10; + TEST_CASE("1","workのアドレスは0xc0", work.getAddress() == 0x100 - sizeof(int) * 0x10); + TEST_CASE("2","workは読み込まれていない", !work.isLoaded()); + } END_CASE; + + BEGIN_CASE("3","operator ++") { + TestSuite::clearCheckpoints(); + + TargetVariable work(tvl); + + TargetVariable result = (++ work); + + TEST_CASE("1","workのアドレスは0x104", work.getAddress() == 0x100 + sizeof(int)); + TEST_CASE("2","work == result", work == result); + TEST_CASE("3","読み込み未了状態", !result.isLoaded()); + } END_CASE; + + BEGIN_CASE("4","operator ++(int)") { + TestSuite::clearCheckpoints(); + + TargetVariable work(tvl); + + TargetVariable result = (work++); + + TEST_CASE("1","workのアドレスは0x104", work.getAddress() == 0x100 + sizeof(int)); + TEST_CASE("2","resultのアドレスは0x100", result.getAddress() == 0x100); + TEST_CASE("3","読み込み完了状態", result.isLoaded()); + } END_CASE; + + BEGIN_CASE("5","operator --") { + TestSuite::clearCheckpoints(); + + TargetVariable work(tvl); + + TargetVariable result = (-- work); + + TEST_CASE("1","workのアドレスは0x9c", work.getAddress() == 0x100 - sizeof(int)); + TEST_CASE("2","work == result", work == result); + TEST_CASE("3","読み込み未了状態", !result.isLoaded()); + } END_CASE; + + BEGIN_CASE("6","operator --(int)") { + TestSuite::clearCheckpoints(); + + TargetVariable work(tvl); + + TargetVariable result = (work--); + + TEST_CASE("1","workのアドレスは0x9c", work.getAddress() == 0x100 - sizeof(int)); + TEST_CASE("2","resultのアドレスは0x100", result.getAddress() == 0x100); + TEST_CASE("3","読み込み完了状態", result.isLoaded()); + } END_CASE; + + BEGIN_CASE("7","operator +=") { + TestSuite::clearCheckpoints(); + + TargetVariable work(tvl); + + work += 0x10; + + TEST_CASE("1","workのアドレスは0x140", work.getAddress() == 0x100 + sizeof(int) * 0x10); + TEST_CASE("2","読み込み未了状態", !work.isLoaded()); + } END_CASE; + + BEGIN_CASE("8","operator -=") { + TestSuite::clearCheckpoints(); + + TargetVariable work(tvl); + + work -= 0x10; + + TEST_CASE("1","workのアドレスは0xc0", work.getAddress() == 0x100 - sizeof(int) * 0x10); + TEST_CASE("2","読み込み未了状態", !work.isLoaded()); + } END_CASE; + + BEGIN_CASE("9", "operator &") { + TEST_CASE("1","アドレスが抜ける", &tv == 0x100); + TEST_CASE("2","NULLインスタンスには0が返る", &(*((TargetVariable *)0)) == 0); + } END_CASE; + + BEGIN_CASE("10", "operator *") { + TestSuite::clearCheckpoints(); + TargetVariable work(0x100); + + const void * result = &(*work); + + TEST_CASE("1","loadContentsが実行されている", TestSuite::isReached("loadContents")); + TEST_CASE("2","引数が正しい", fc.addr == 0x100); + TEST_CASE("3","引数が正しい", fc.sz == sizeof(int)); + + TestSuite::clearCheckpoints(); + *work; + + TEST_CASE("4","loadContentsは実行されない", !TestSuite::isReached("loadContents")); + } END_CASE; + + BEGIN_CASE("11","operator ==/!=") { + TEST_CASE("1","アドレスが一致すればOK", tv == TTargetVariable(tv.getAddress())); + TEST_CASE("2","NULLインスタンスとの比較もできる", tv != *((TTargetVariable *)0)); + } END_CASE; + + BEGIN_CASE("cvr","カバレッジ対策") { + + (*((TTargetVariable *)0)) ++; + + } END_CASE; + + } END_CASE; + + chain.restoreContext(); +} + + +#endif + diff --git a/uzume_prototype/kernel/cfg/base/filecontainer.h b/uzume_prototype/kernel/cfg/base/filecontainer.h new file mode 100644 index 0000000..43d5982 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/filecontainer.h @@ -0,0 +1,285 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: filecontainer.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/filecontainer.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#ifndef FILECONTAINER_H +#define FILECONTAINER_H + +#ifdef _MSC_VER +#pragma warning(disable:4786) //デバッグ情報を255文字に切り詰めました +#endif + +#include "testsuite.h" + +#include +#include + +#include "base/except.h" +#include "base/message.h" +#include "base/collection.h" + +class FileContainer : public RuntimeObject +{ +public: + typedef unsigned long address_t; + + struct tagVariableInfo { + address_t address; + union { + size_t size; + int value; + }; + }; + + enum tagByteOrder { LITTLE, BIG, HOSTORDER=LITTLE, UNKNOWN }; /* UNKNOWNはテスト用 */ + +protected: + enum tagByteOrder byteorder; + + std::map variableinfo; + + FileContainer(void) throw() : byteorder(HOSTORDER) {} + virtual ~FileContainer(void) throw() {} + +public: + /* インタフェース部 */ + virtual void attachModule(const std::string & filename) throw(Exception) = 0; + virtual void loadContents(void * dest, address_t address, size_t size) throw(Exception) = 0; + virtual address_t getSymbolAddress(const std::string & symbol) throw(Exception) = 0; + virtual std::string getArchitecture(void) throw(Exception) = 0; + + virtual struct tagVariableInfo getVariableInfo(const std::string & name) throw(Exception); + virtual void attachInfo(const std::string & filename) throw(Exception); + + /* 登録されているコンテナの呼び出し */ + static inline FileContainer * getInstance(void) throw(Exception) + { + FileContainer * result; + RuntimeObjectTable::getInstance(&result); + if(result == 0) + ExceptionMessage("[Internal error] Filecontainer has no instance.","[内部エラー] FileContainerのインスタンスがありません").throwException(); + return result; + } + + enum tagByteOrder getByteOrder(void) const + { return byteorder; } +}; + +class TargetVariableBase +{ +protected: + FileContainer::address_t address; //変数のアドレス + size_t size; //変数のサイズ + size_t offset; //属する構造体の先頭からのオフセット + size_t structure_size; //属する構造体の大きさ + bool loaded; //値が読出し済みであることを保持するフラグ + + inline TargetVariableBase(FileContainer::address_t _address, size_t _size) throw() + : address(_address), size(_size), offset(0), structure_size(_size), loaded(false) + {} + + inline TargetVariableBase(FileContainer::address_t addr, size_t sz, size_t ofs, size_t ssz) throw() + : address(addr), size(sz), offset(ofs), structure_size(ssz), loaded(false) + {} + + TargetVariableBase(const std::string & sym) throw(); + TargetVariableBase(const std::string & sym, size_t _size) throw(); + TargetVariableBase(const std::string & sym, const std::string & sz) throw(); + TargetVariableBase(const TargetVariableBase & src) throw(); + + virtual ~TargetVariableBase(void) throw() {} + + /* 内容の取得 */ + void loadContent(void * dest, size_t dest_size) throw(Exception); + + /* エンディアン変換 */ + void changeEndian(char * buffer, size_t size) throw(); + + /* アドレスの移動 (ついでにloadedを下げる) */ + inline void setAddress(int offset) throw() + { + if(isValid()) { + address += offset; + loaded = false; + } + } + +public: + inline bool isValid(void) const throw() + { return this != 0 && address != 0 && size != 0 && structure_size != 0; } + + inline size_t getSize(void) const throw() + { return this != 0 ? size : 0; } + + inline size_t getOffset(void) const throw() + { return this != 0 ? offset : 0; } + + inline size_t getStructureSize(void) const throw() + { return this != 0 ? structure_size : 0; } + + inline FileContainer::address_t getAddress(void) const throw() + { return this != 0 ? address : 0; } + + inline bool isLoaded(void) const throw() + { return this != 0 ? loaded : false; } + + /* 基本的な操作 */ + inline bool operator == (const TargetVariableBase & right) const throw() + { return isValid() && right.isValid() && address == right.address; } + + inline bool operator != (const TargetVariableBase & right) const throw() + { return ! operator ==(right); } + + inline FileContainer::address_t operator & (void) const throw() + { return isValid() ? address + offset : 0; } + + inline size_t sizeOf(void) const throw() + { return isValid() ? size : 0; } +}; + +template +class TargetVariable : public TargetVariableBase +{ +protected: + T entity; + +public: + /* + * コンストラクタ (TargetVariableBaseに回送) + */ + inline TargetVariable(FileContainer::address_t addr) throw() + : TargetVariableBase(addr, sizeof(T)), entity() + {} + + inline TargetVariable(FileContainer::address_t addr, size_t sz) throw() + : TargetVariableBase(addr, sz), entity() + {} + + inline TargetVariable(FileContainer::address_t addr, size_t sz, size_t ofs, size_t ssz) throw() + : TargetVariableBase(addr, sz, ofs, ssz), entity() + {} + + inline TargetVariable(const std::string & sym) throw() + : TargetVariableBase(sym), entity() + {} + + inline TargetVariable(const std::string & sym, const std::string & sz) throw() + : TargetVariableBase(sym, sz), entity() + {} + + inline TargetVariable(const TargetVariable & src) throw() + : TargetVariableBase(src), entity() + { + if(isValid() && src.isValid()) { + loaded = src.loaded; + entity = src.entity; + } + } + + /* デストラクタ (特に何もしない) */ + virtual ~TargetVariable(void) throw() + {} + + /* 正当判定に格納に十分なサイズがあるかどうかを追加しておく */ + inline bool isValid(void) const + { return TargetVariableBase::isValid() && (sizeof(T) >= getSize()); } + + /* + * ポインタ風の動作をするオペレータ群 + */ + inline TargetVariable offsetInBytes(int offset) const throw() + { return TargetVariable(getAddress() + offset, getSize(), getOffset(), getStructureSize()); } + + inline TargetVariable operator + (int index) const throw() + { return offsetInBytes(index * static_cast(getStructureSize())); } + + inline TargetVariable operator - (int index) const throw() + { return offsetInBytes(- index * static_cast(getStructureSize())); } + + inline TargetVariable operator ++ (int) throw() + { + TargetVariable result(*this); + ++ (*this); + return result; + } + + inline TargetVariable operator -- (int) throw() + { + TargetVariable result(*this); + -- (*this); + return result; + } + + inline TargetVariable & operator ++ (void) throw() + { + setAddress(static_cast(getStructureSize())); + return *this; + } + + inline TargetVariable & operator -- (void) throw() + { + setAddress(-static_cast(getStructureSize())); + return *this; + } + + inline TargetVariable & operator += (int sz) throw() + { + setAddress(static_cast(getStructureSize()) * sz); + return *this; + } + + inline TargetVariable & operator -= (int sz) throw() + { + setAddress(-static_cast(getStructureSize()) * sz); + return *this; + } + + inline const T & operator * (void) throw(Exception) + { + if(!isLoaded()) + loadContent(&entity, sizeof(T)); + return entity; + } + + inline T operator [] (int index) const throw(Exception) + { return * TargetVariable(getAddress() + index * getStructureSize(), getSize(), getOffset(), getStructureSize()); } +}; + +#endif + diff --git a/uzume_prototype/kernel/cfg/base/garbage.cpp b/uzume_prototype/kernel/cfg/base/garbage.cpp new file mode 100644 index 0000000..bbdee44 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/garbage.cpp @@ -0,0 +1,417 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: garbage.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/garbage.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#include "base/garbage.h" + +#include +#include + +using namespace std; + +TrashBox * TrashBox::current_box = 0; + +//---------------------------------------------------------------- +// Garbage : ゴミ + + //コンストラクタ +Garbage::Garbage(void) throw() +{ + //ゴミ箱に関連付ける + assigned_box = TrashBox::getCurrentTrashBox(); + if(assigned_box->isValid()) + cookie = assigned_box->addGarbage(this); +} + + //デストラクタ +Garbage::~Garbage(void) throw() +{ + rescue(); +} + + //ゴミ救出 +void Garbage::rescue(void) throw() +{ + if(assigned_box->isValid()) { + assigned_box->recoverGarbage(cookie); + assigned_box = 0; + } +} + + +//---------------------------------------------------------------- +// TrashBox : ゴミを入れる箱 + +TrashBox::TrashBox(void) throw() +{ + //ゴミ箱の差し替え + previous_box = current_box; + current_box = this; +} + +TrashBox::~TrashBox(void) throw() +{ + //ゴミがなくなるまで削除 + while(!garbage.empty()) { + //ふた + try{ cleanup(); } + catch(...) {} + } + + //ゴミ箱の差し替え + current_box = previous_box; +} + +/* + //ゴミ箱に入れたゴミを取り除く +void TrashBox::recoverGarbage(Garbage * _garbage, TrashBox::Cookie cookie) throw() +{ + if(isValid() && _garbage != 0) { + bool forward = true; + list::iterator scope; + + if(!garbage.empty()) { + scope = garbage.erase(cookie); + + //自分が始末した + if(scope != garbage.end() || garbage.empty()) + forward = false; + } + + //親ゴミ箱に回送 + if(forward && previous_box->isValid()) + previous_box->recoverGarbage(_garbage, cookie); + } +} +*/ + /* 修正時のメモ + 関連付けられたゴミ箱が消えることは無い(生成期間はゴミ箱のほうが長いはず)ので、親に回送する必要は無い。よってif(forward...節は不要。 + 自分が始末できないゴミは無いので(cleanupはrecoverGargabeを呼ばない)、eraseの返却値のチェックは不要。 + 個別削除要求はゴミから出されるので、実行された時点でゴミは1つ以上存在するはずなので、emptyチェックは不要. + この時点でeraseだけになり、第一引数は不要。 + */ + + //ゴミ箱に入れたゴミを取り除く +void TrashBox::recoverGarbage(TrashBox::Cookie cookie) throw() +{ garbage.erase(cookie); } + + //ゴミ箱を空にする +void TrashBox::cleanup(void) +{ + //自分がトップレベルゴミ箱でなかったら失敗 + if(current_box != this) + throw std::runtime_error("TrashBox::cleanup can be performed from the top level trash box only."); + + try { + while(!garbage.empty()) + delete *garbage.begin(); //ゴミリストから要素を外すのは子の役目 + } + catch(...) { + garbage.erase(garbage.begin()); //例外を起こした最初の要素を削除 + throw; //再送 + } +} + + + +/****************************************** テストスィート ******************************************/ + +#ifdef TESTSUITE +#include "coverage_undefs.h" + +namespace { int counter = 0; } + +#ifdef _MSC_VER + class DummyGarbage : public Garbage + { + public: + int * count; + bool throw_exception; + + DummyGarbage(int * _count = 0) : count(_count), throw_exception(false) + { TestSuite::check("DummyGarbage::DummyGarbage"); } + + ~DummyGarbage(void) throw(int) + { + if(count != 0) *count = ++counter; + if(throw_exception) throw 0; + TestSuite::check("DummyGarbage::~DummyGarbage"); + } + + }; +#elif __GNUC__ + class DummyGarbage : public Garbage + { + public: + int * count; + + DummyGarbage(int * _count = 0) : count(_count) + { TestSuite::check("DummyGarbage::DummyGarbage"); } + + ~DummyGarbage(void) throw() + { + if(count != 0) *count = ++counter; + TestSuite::check("DummyGarbage::~DummyGarbage"); + } + }; +#endif + +TESTSUITE(main, TrashBox) +{ + BEGIN_CASE("1","ゴミ箱を作ると登録される") { + TrashBox mybox; + TEST_CASE("1", "作ったゴミ箱が現在のゴミ箱になっている", TrashBox::current_box == &mybox); + + { + TrashBox mybox2; + TEST_CASE("2", "作ったゴミ箱が現在のゴミ箱になっている (2)", TrashBox::current_box == &mybox2); + TEST_CASE("3", "もともとのゴミ箱が保存されている", mybox2.previous_box == &mybox); + } + + TEST_CASE("4", "もとのゴミ箱に戻る", TrashBox::current_box == &mybox); + } END_CASE; + + BEGIN_CASE("2","isValid") { + TrashBox mybox; + + TEST_CASE("1","作ったゴミ箱は正常", mybox.isValid()); + TEST_CASE("2","NULL箱は異常", !((TrashBox *)0)->isValid()); + } END_CASE; + + BEGIN_CASE("3","operator new") { + BEGIN_CASE("1","new TrashBoxはbad_alloc例外を返す") { + bool result = false; + + try { TrashBox * box = new TrashBox; } + catch(bad_alloc) { result = true; } + + if(!result) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","new(nothrow) TrashBoxはNULLを返す") { + bool result = true; + TrashBox * box; + + try { box = new(nothrow) TrashBox; } + catch(...) { result = false; } + + TEST_CASE("1", "new(nothrow)は例外を返さない", result); + TEST_CASE("2", "new(nothrow)はNULLを返す", box == 0); + } END_CASE; + } END_CASE; + + BEGIN_CASE("4","基本的な生成削除") { + BEGIN_CASE("1","ちゃんとゴミ箱から外せる") { + TrashBox mybox; + + DummyGarbage * garbage = new DummyGarbage; + + TEST_CASE("0","[前提] ゴミが入っている", std::find(mybox.garbage.begin(), mybox.garbage.end(), garbage) != mybox.garbage.end()); + delete garbage; + TEST_CASE("1","ゴミが消えている", std::find(mybox.garbage.begin(), mybox.garbage.end(), garbage) == mybox.garbage.end()); + + + } END_CASE; + + BEGIN_CASE("2","親のゴミ箱に入っているものもゴミ箱から外せる") { + TrashBox mybox; + DummyGarbage * garbage = new DummyGarbage; + TEST_CASE("0","[前提] ゴミが入っている", find(mybox.garbage.begin(), mybox.garbage.end(), garbage) != mybox.garbage.end()); + + TrashBox secondbox; + delete garbage; + + TEST_CASE("1","ゴミが消えている", find(mybox.garbage.begin(), mybox.garbage.end(), garbage) == mybox.garbage.end()); + + } END_CASE; + } END_CASE; + + BEGIN_CASE("5","TrashBox::cleanup") { + BEGIN_CASE("1","動的に作ったオブジェクトが破棄できる") { + TrashBox mybox; + DummyGarbage * garbage; + + TestSuite::clearCheckpoints(); + + garbage = new DummyGarbage; + TEST_CASE("0","[前提] コンストラクタが起動されている", TestSuite::isReached("DummyGarbage::DummyGarbage")); + + mybox.cleanup(); + TEST_CASE("1","デストラクタが起動されている", TestSuite::isReached("DummyGarbage::~DummyGarbage")); + } END_CASE; + +#ifdef _MSC_VER + BEGIN_CASE("2","例外はもれる") { + TrashBox mybox; + DummyGarbage * garbage; + + TestSuite::clearCheckpoints(); + + garbage = new DummyGarbage; + garbage->throw_exception = true; + + bool result = false; + try { mybox.cleanup(); } + catch(...) { result = true; } + + if(!result) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3","例外を起こしたオブジェクトが破壊されている (2重破棄にならない)") { + TrashBox mybox; + DummyGarbage * garbage; + DummyGarbage * garbage2; + + TestSuite::clearCheckpoints(); + + garbage = new DummyGarbage; + garbage->throw_exception = true; + garbage2 = new DummyGarbage; + garbage2->throw_exception = true; + + try { mybox.cleanup(); } + catch(...) {} + try { mybox.cleanup(); } //ここでAccessViolationが起こらない + catch(...) {} + + if(!mybox.garbage.empty()) + TEST_FAIL; + } END_CASE; +#endif + + BEGIN_CASE("4","削除の順序が正しい") { + TrashBox mybox; + DummyGarbage * garbage; + DummyGarbage * garbage2; + DummyGarbage * garbage3; + int g = 0; + int g2 = 0; + int g3 = 0; + + TestSuite::clearCheckpoints(); + + garbage = new DummyGarbage(&g); + garbage2 = new DummyGarbage(&g2); + garbage3 = new DummyGarbage(&g3); + + mybox.cleanup(); + + TEST_CASE("1","最初に登録されたものは最後に削除",g == 3); + TEST_CASE("2","次に登録されたものは2番目に削除",g2 == 2); + TEST_CASE("3","次に登録されたものは最初に削除",g3 == 1); + } END_CASE; + + BEGIN_CASE("5","トップレベルでないゴミ箱はcleanupできない") { + TrashBox outerbox; + TrashBox innerbox; + + bool result = false; + try { outerbox.cleanup(); } + catch(std::runtime_error) + { result = true; } + + if(!result) + TEST_FAIL; + } END_CASE; + + } END_CASE; + + BEGIN_CASE("6","デストラクタによる破棄") { + BEGIN_CASE("1","動的に作ったオブジェクトが破棄できる (TrashBox::~TrashBox)") { + { + TrashBox mybox; + DummyGarbage * garbage; + + TestSuite::clearCheckpoints(); + + garbage = new DummyGarbage; + TEST_CASE("0","[前提] コンストラクタが起動されている", TestSuite::isReached("DummyGarbage::DummyGarbage")); + } + TEST_CASE("1","デストラクタが起動されている", TestSuite::isReached("DummyGarbage::~DummyGarbage")); + } END_CASE; + + BEGIN_CASE("2","例外はもれない") { + bool result = true; + try{ + TrashBox mybox; + DummyGarbage * garbage; + + TestSuite::clearCheckpoints(); + + garbage = new DummyGarbage; + TEST_CASE("0","[前提] コンストラクタが起動されている", TestSuite::isReached("DummyGarbage::DummyGarbage")); + } + catch(...) + { result = false; } + TEST_CASE("1","例外はもれない", result); + } END_CASE; + + } END_CASE; + + BEGIN_CASE("7","rescue") { + DummyGarbage * garbage; + { + TrashBox mybox; + garbage = new DummyGarbage; + garbage->rescue(); + + TestSuite::clearCheckpoints(); + } + TEST_CASE("1","rescueしたゴミは削除されない", !TestSuite::isReached("DummyGarbage::~DummyGarbage")); + delete garbage; + } END_CASE; + + BEGIN_CASE("8","静的なオブジェクトが多重破棄されない") { + TrashBox outerbox; + { + DummyGarbage garbage; + TrashBox innerbox; + DummyGarbage garbage2; + + TEST_CASE("0","[前提] コンストラクタが起動されている", TestSuite::isReached("DummyGarbage::DummyGarbage")); + } //ここで2重破棄でMACVにならない + } END_CASE; +} + +#endif + + + diff --git a/uzume_prototype/kernel/cfg/base/garbage.h b/uzume_prototype/kernel/cfg/base/garbage.h new file mode 100644 index 0000000..a76c1f0 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/garbage.h @@ -0,0 +1,118 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: garbage.h,v 1.2 2012/06/17 00:24:19 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/garbage.h,v 1.2 2012/06/17 00:24:19 suikan Exp $ + + +#ifndef GARBAGE_H +#define GARBAGE_H + +#ifdef _MSC_VER +# pragma warning(disable:4290) //C++ の例外の指定は無視されます。関数が __declspec(nothrow) でないことのみ表示されます。 +# pragma warning(disable:4786) //デバッグ情報で識別子が255文字に切り捨てられました。 +#endif + +#include "base/testsuite.h" +#include +#include + + //動的に生成したオブジェクトをちゃんと破棄するためのゴミ箱ルーチン +class TrashBox +{ +public: + typedef std::list::iterator Cookie; + +protected: + static TrashBox * current_box; //現在使用しているゴミ箱 + TrashBox * previous_box; //このゴミ箱の親 + + std::list garbage; //ごみ + +public: + //生成子 と 消滅子 + TrashBox(void) throw(); + ~TrashBox(void) throw(); + + inline bool isValid(void) const throw() + { return (this != 0); } + + //ゴミ箱に入っているゴミを破棄 + void cleanup(void); + + //今使っているゴミ箱を取得 + inline static TrashBox * getCurrentTrashBox(void) throw() + { return current_box; } + + //ゴミ投入 + inline Cookie addGarbage(class Garbage * _garbage) throw() + { return garbage.insert(garbage.begin(), _garbage); } + + //ゴミ回収 + void recoverGarbage(Cookie cookie) throw(); + + + //動的に確保させたくない + void * operator new (size_t) throw(std::bad_alloc) + { throw std::bad_alloc(); } + void * operator new (size_t, std::nothrow_t) throw() + { return 0; } + + TESTSUITE_PROTOTYPE(main) +}; + + + //ゴミ箱に入れるゴミオブジェクトの基底 +class Garbage +{ +private: + class TrashBox * assigned_box; + TrashBox::Cookie cookie; + +public: + //生成子 と 消滅子 + Garbage(void) throw(); + virtual ~Garbage(void) throw(); + + //投げたゴミを拾い上げる + void rescue(void) throw(); +}; + + +#endif + + diff --git a/uzume_prototype/kernel/cfg/base/manager.cpp b/uzume_prototype/kernel/cfg/base/manager.cpp new file mode 100644 index 0000000..120de83 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/manager.cpp @@ -0,0 +1,241 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: manager.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/manager.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#ifdef _MSC_VER +# pragma warning(disable:4786) +# define CDECL __cdecl +#else +# define CDECL +#endif + +#include +#include +#include + +#include "base/event.h" +#include "base/message.h" +#include "base/component.h" +#include "base/directorymap.h" + +using namespace std; + +Event startupEvent; +Event shutdownEvent; + +int CDECL main(int argc, char ** argv) +{ + ShutdownEvent evt; + OptionParameter & option= getOptionParameter(); + + evt.exit_code = EXIT_FAILURE; + + if(SingletonBase::isValid() && Component::isValid()) { + + option.parseOption(argc, argv, "-h"); + + try { + startupEvent.raise(); + Component::executeComponents(option); + evt.exit_code = EXIT_SUCCESS; + } + catch(Exception & e) + { + cerr << Message("Program failed in its process by following reason.\n","プログラムは致命的なエラーにより中断されました.\n"); + cerr << " " << e.getDetails() << '\n'; + } + catch(ExceptionMessage & e) { + CHECKPOINT("catch(ExceptionMessage)"); + cerr << "Program failed : " << e << '\n'; + } + catch(bad_alloc & e) { + CHECKPOINT("catch(bad_alloc)"); + cerr << "Program failed : bad_alloc (" << e.what() << ")\n"; + } + catch(...) { + CHECKPOINT("catch(...)"); + cerr << "Program filed : Unknown Exception Occured\n"; + } + } + else + cerr << "Program initialization failure\n"; + + try { + DebugMessage("shutdown event - exitcode(%)\n") << evt.exit_code; + shutdownEvent.raise(evt); + } + catch(Exception & e) + { + DebugMessage("exception was raised in the event - %\n") << e.getDetails(); + cerr << Message("Program failed in its process by following reason.\n","プログラムは致命的なエラーにより中断されました.\n"); + cerr << " " << e.getDetails() << '\n'; + } + + catch(...) { + DebugMessage("exception was raised in the event\n"); + CHECKPOINT("catch(...) in shutdownEvent::raise"); + evt.exit_code = EXIT_FAILURE; + } + + DebugMessage("Exit code (%)\n") << evt.exit_code; + + return evt.exit_code; +} + +/************************************* テストスィート *************************************/ + +#ifdef TESTSUITE +#include "coverage_undefs.h" + +namespace { + + extern void testsuite(TestSuiteControl & _suite_control); + TestSuite testsuite_onTop("Entrypoint(main)", testsuite); + + class TestComponent : public Component + { + public: + int mode; + + void parseOption(OptionParameter &) + { + switch(mode) { + case 0: + CHECKPOINT("TestComponent::case 0"); + break; + case 1: + ExceptionMessage("exception").throwException(); + case 2: + throw bad_alloc(); + } + } + }; + + void dummyStartupHandler(StartupEvent &) + { + TestSuite::check("dummyStartupHandler"); + } + + int dummyShutdownHandler_exit_code; + void dummyShutdownHandler(ShutdownEvent & evt) + { + dummyShutdownHandler_exit_code = evt.exit_code; + TestSuite::check("dummyShutdownHandler"); + } + + //テストスィートの本体 + void testsuite(TestSuiteControl & _suite_control) + { + SingletonBase::ContextChain chain; + + chain.saveContext(); + chain.saveContext::handler_list_type>(); + chain.saveContext::handler_list_type>(); + + BEGIN_CASE("1","main関数単体 + コンポーネントなし") { + chain.renewInstance(); + + Event::add(dummyStartupHandler); + Event::add(dummyShutdownHandler); + + BEGIN_CASE("1","普通に実行する") { + TestSuite::clearCheckpoints(); + + char * argv[] = { "test.exe" }; + + Exception::setThrowControl(true); + TestComponent test; + test.mode = 0; + + TEST_CASE("1","main関数はEXIT_SUCCESSを返す", main(1, argv) == EXIT_SUCCESS); + + TEST_CASE("2","例外が実行されない catch(Exception)", !TestSuite::isReached("catch(Exception)")); + TEST_CASE("3","例外が実行されない catch(bad_alloc)", !TestSuite::isReached("catch(bad_alloc)")); + TEST_CASE("4","例外が実行されない catch(...)", !TestSuite::isReached("catch(...)")); + TEST_CASE("5","Componentが実行されている", TestSuite::isReached("TestComponent::case 0")); + TEST_CASE("6","スタートアップハンドラが起動されている", TestSuite::isReached("dummyStartupHandler")); + TEST_CASE("7","シャットダウンハンドラが起動されている", TestSuite::isReached("dummyShutdownHandler")); + TEST_CASE("8","シャットダウンハンドラはEXIT_SUCCESSを受けている", dummyShutdownHandler_exit_code == EXIT_SUCCESS); + } END_CASE; + + BEGIN_CASE("2","Exception例外を返す") { + TestSuite::clearCheckpoints(); + + char * argv[] = { "test.exe" }; + + Exception::setThrowControl(true); + TestComponent test; + test.mode = 1; + + TEST_CASE("1","main関数はEXIT_FAILUREを返す", main(1, argv) == EXIT_FAILURE); + + TEST_CASE("2","例外が実行される catch(Exception)", TestSuite::isReached("catch(Exception)")); + TEST_CASE("3","例外が実行されない catch(bad_alloc)", !TestSuite::isReached("catch(bad_alloc)")); + TEST_CASE("4","例外が実行されない catch(...)", !TestSuite::isReached("catch(...)")); + TEST_CASE("5","スタートアップハンドラが起動されている", TestSuite::isReached("dummyStartupHandler")); + TEST_CASE("6","シャットダウンハンドラが起動されている", TestSuite::isReached("dummyShutdownHandler")); + TEST_CASE("7","シャットダウンハンドラはEXIT_FAILUREを受けている", dummyShutdownHandler_exit_code == EXIT_FAILURE); + } END_CASE; + + BEGIN_CASE("3","bad_alloc例外を返す") { + TestSuite::clearCheckpoints(); + + char * argv[] = { "test.exe" }; + + Exception::setThrowControl(true); + TestComponent test; + test.mode = 2; + + TEST_CASE("1","main関数はEXIT_FAILUREを返す", main(1, argv) == EXIT_FAILURE); + + TEST_CASE("2","対応するcatchのみが実行されている", !TestSuite::isReached("catch(Exception)") && TestSuite::isReached("catch(bad_alloc)") && !TestSuite::isReached("catch(...)")); + TEST_CASE("3","スタートアップハンドラが起動されている", TestSuite::isReached("dummyStartupHandler")); + TEST_CASE("4","シャットダウンハンドラが起動されている", TestSuite::isReached("dummyShutdownHandler")); + TEST_CASE("5","シャットダウンハンドラはEXIT_FAILUREを受けている", dummyShutdownHandler_exit_code == EXIT_FAILURE); + } END_CASE; + } END_CASE; + + chain.restoreContext(); + } + +} + +#endif + + diff --git a/uzume_prototype/kernel/cfg/base/message.cpp b/uzume_prototype/kernel/cfg/base/message.cpp new file mode 100644 index 0000000..5de3394 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/message.cpp @@ -0,0 +1,325 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: message.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/message.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#include "base/message.h" + +using namespace std; + + +/*****************************************************************************/ + +/* + * メッセージ出力用文字列整形ヘルパークラス + */ + + //デフォルトコンストラクタ +Formatter::Formatter(void) throw() : templatestring(""), accept(false) +{} + + //コンストラクタ +Formatter::Formatter(string src) throw() : templatestring(src) +{ shift(); } + + //コピーコンストラクタ +Formatter::Formatter(const Formatter & src) throw() : templatestring(src.templatestring), accept(src.accept) +{ + string work; + + work = src.content.str(); + content << work; +} + + //次の引数の挿入先へと移動 +void Formatter::shift(void) throw() +{ + string::size_type pos; + + accept = false; + if(!templatestring.empty()) { + + do { + pos = templatestring.find_first_of("%"); + + if(pos != string::npos) { + + /* %があってそれが\%という形なら、%をそのまま出す */ + if(pos != string::npos && pos != 0 && templatestring.at(pos - 1) == '\\') { + + if(pos > 1) + content << templatestring.substr(0, pos - 2); + content << '%'; + + templatestring = templatestring.substr(pos + 1); + + continue; + } + else { + /* %がまだある */ + if(pos != string::npos) + accept = true; + break; + } + } + } while(pos != string::npos); + + if(pos != string::npos) { + if(pos != 0) + content << templatestring.substr(0, pos); + templatestring = templatestring.substr(pos + 1); + } + else { + content << templatestring; + templatestring.erase(); + } + } +} + + + //未設定の引数を (null) で置換 +void Formatter::shift_all(void) throw() +{ + while(accept) + *this << "(null)"; +} + + //内部メッセージの取り出し +string Formatter::str(void) throw() +{ + shift_all(); + return content.str(); +} + + //テンプレート文字列の設定 (中身は消える) +void Formatter::assign(string src) throw() +{ + clear(); + templatestring.assign(src); + shift(); +} + + //内容の消去 +void Formatter::clear(void) throw() +{ + if(!templatestring.empty()) + templatestring.erase(); + content.str(string("")); + accept = false; +} + + //代入演算子 +Formatter & Formatter::operator =(const Formatter & src) throw() +{ + string work; + + templatestring = src.templatestring; + accept = src.accept; + + work = src.content.str(); + content << work; + + return *this; +} + + +/*****************************************************************************/ + +/* + * メッセージ出力用文字列整形ヘルパークラス + */ + +const char * Message::MessageControl::select(const char * msg1, const char * msg2, va_list vl) throw() +{ + const char * msg = msg1; + int i = language; + + if(i > 0) { + msg = msg2; + + while(--i > 0) + msg = va_arg(vl, const char *); + } + + return msg; +} + + //デフォルトコンストラクタ (テスト用) +Message::Message(void) throw() +{} + + //コンストラクタ +Message::Message(string src) throw() : Formatter(src) +{} + + //コンストラクタ (複数言語) +Message::Message(const char * src1, const char * src2, ...) throw() +{ + va_list vl; + + va_start(vl, src2); + templatestring.assign(Singleton::getInstance()->select(src1, src2, vl)); + shift(); +} + + //コピーコンストラクタ +Message::Message(const Message & src) throw() : Formatter(src) +{} + + //派生クラスの初期化用関数 (複数言語) +void Message::_initialize(const char * src1, const char * src2, va_list vl) throw() +{ + content.clear(); + accept = false; + templatestring.assign(Singleton::getInstance()->select(src1, src2, vl)); + shift(); +} + + //言語選択 +void Message::selectLanguage(enum tagLanguage lang) throw() +{ + if(lang >= 0 && lang < LAST_LANG) + Singleton::getInstance()->setLanguage(lang); +} + + //テンプレート文字列の設定 (中身は消える) +void Message::assign(const char * src1, const char * src2, ... ) throw() +{ + va_list vl; + + clear(); + + va_start(vl, src2); + templatestring.assign(Singleton::getInstance()->select(src1, src2, vl)); + shift(); +} + +/*****************************************************************************/ + +/* + * 冗長出力用文字列整形ヘルパークラス + */ + + //デフォルトコンストラクタ +VerboseMessage::VerboseMessage(void) throw() : Message() +{} + + //コンストラクタ +VerboseMessage::VerboseMessage(const char * src) throw() : Message(src) +{} + + //コンストラクタ +VerboseMessage::VerboseMessage(const string & src) throw() : Message(src) +{} + + //コンストラクタ +VerboseMessage::VerboseMessage(const char * src1, const char * src2, ... ) throw() : Message() +{ + va_list vl; + + va_start(vl, src2); + _initialize(src1, src2, vl); +} + + //デストラクタ +VerboseMessage::~VerboseMessage(void) throw() +{ Singleton< VerboseControl >::getInstance()->operator << (str()); } + +/*****************************************************************************/ + +/* + * 例外メッセージ用文字列整形ヘルパークラス + */ + + //コンストラクタ +ExceptionMessage::ExceptionMessage(const char * src) throw() : Message(src), level(DEFAULT) +{} + + //コンストラクタ +ExceptionMessage::ExceptionMessage(const std::string & src) throw() : Message(src), level(DEFAULT) +{} + + //コンストラクタ +ExceptionMessage::ExceptionMessage(const char * src1, const char * src2, ...) throw() : Message(), level(DEFAULT) +{ + va_list vl; + + va_start(vl, src2); + _initialize(src1, src2, vl); +} + + //コンストラクタ +ExceptionMessage::ExceptionMessage(enum tagLevel _level) throw() : Message(), level(_level) +{} + + //コンストラクタ +ExceptionMessage::ExceptionMessage(enum tagLevel _level, const char * src) throw() : Message(src), level(_level) +{} + + //コンストラクタ +ExceptionMessage::ExceptionMessage(enum tagLevel _level, const std::string & src) throw() : Message(src), level(_level) +{} + + //コンストラクタ +ExceptionMessage::ExceptionMessage(enum tagLevel _level, const char * src1, const char * src2, ...) throw() : Message(), level(_level) +{ + va_list vl; + + va_start(vl, src2); + _initialize(src1, src2, vl); +} + + //コピーコンストラクタ +ExceptionMessage::ExceptionMessage(const ExceptionMessage & src) throw() : Message(src), level(src.level) +{} + + +/*****************************************************************************/ + +/* + * デバッグメッセージ用文字列整形ヘルパークラス + */ + + //コンストラクタ +DebugMessage::DebugMessage(string src) throw() : Formatter(src) +{} + + //デストラクタ +DebugMessage::~DebugMessage(void) throw() +{ Singleton::getInstance()->operator << (str()); } + diff --git a/uzume_prototype/kernel/cfg/base/message.h b/uzume_prototype/kernel/cfg/base/message.h new file mode 100644 index 0000000..a7efde1 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/message.h @@ -0,0 +1,428 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: message.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/message.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#ifndef MESSAGE_H +#define MESSAGE_H + +#ifdef _MSC_VER +# pragma warning(disable:4290) //C++ の例外の指定は無視されます。関数が __declspec(nothrow) でないことのみ表示されます。 +# pragma warning(disable:4786) //デバッグ情報で識別子が255文字に切り捨てられました。 +#endif + +#include +#include +#include +#include + +//#include "base/testsuite.h" +#include "base/singleton.h" +#include "base/except.h" + + /* + * 文字列整形ヘルパークラス + */ +class Formatter +{ +protected: + std::string templatestring; //テンプレート文字列 + std::stringstream content; //文字列整形と書式済み文字列可能場所用ストリーム + bool accept; //引数を受入可能かどうか + + //次の引数の挿入先へと移動 + void shift(void) throw(); + + //未設定の引数を (null) で置換 + void shift_all(void) throw(); + +public: + //デフォルトコンストラクタ + Formatter(void) throw(); + + //コンストラクタ + Formatter(std::string src) throw(); + + //コピーコンストラクタ + Formatter(const Formatter & src) throw(); + + //テンプレート文字列の設定 (中身は消える) + void assign(std::string src) throw(); + + //内容のクリア + void clear(void) throw(); + + //代入演算子 + Formatter & operator =(const Formatter & src) throw(); + + //引数の設定 + template + Formatter & operator << (const T & src) throw() + { + std::string::size_type pos; + + //引数を受入可能なら + if(accept) { + pos = content.str().size(); + content << src; + + /* 空文字でなければ次の挿入場所に移動 */ + if(pos != content.str().size()) + shift(); + } + return *this; + } + + //内部メッセージの取り出し + std::string str(void) throw(); + + //標準出力ストリームへの出力用 operator << 定義 + friend inline std::ostream & operator << (std::ostream & out, Formatter msg) throw() + { + out << msg.content.str(); + return out; + } + +// TESTSUITE_PROTOTYPE(main) +}; + + /* + * メッセージ出力用に2言語対応を行った文字列整形ヘルパークラス + */ +class Message : public Formatter +{ +public: + enum tagLanguage + { + ENGLISH = 0, + JAPANESE = 1, + + LAST_LANG, //最後の位置 + NEUTRAL = ENGLISH, //標準言語 + }; + + /* 出力メッセージ言語制御クラス */ + class MessageControl + { + protected: + int language; //どの言語を使用するのか + + public: + //コンストラクタ + SINGLETON_CONSTRUCTOR(MessageControl) throw() : language(NEUTRAL) {}; + + //アクセサ + inline void setLanguage(int _language) throw() { language = _language; } + inline int getLanguage(void) const throw() { return language; } + + const char * select(const char * msg1, const char * msg2, va_list vl ) throw(); + }; + +protected: + + //派生クラス用コンストラクタ + void _initialize(const char * src1, const char * src2, va_list vl) throw(); + +public: + //デフォルトコンストラクタ + Message(void) throw(); + + //コンストラクタ (単一言語) + Message(std::string src) throw(); + + //コンストラクタ (複数言語) + Message(const char * src1, const char * src2, ... ) throw(); + + //コピーコンストラクタ + Message(const Message & src) throw(); + + //テンプレート文字列の設定 (中身は消える) + void assign(std::string src) throw() { Formatter::assign(src); } + void assign(const char * src1, const char * src2, ... ) throw(); + + //言語選択 + static void selectLanguage(enum tagLanguage lang = NEUTRAL) throw(); + + //言語の取得 + static enum tagLanguage getCurrentLanguage(void) throw() + { return static_cast(Singleton::getInstance()->getLanguage()); } + + //TESTSUITE_PROTOTYPE(main) +}; + + + /* + * 冗長出力用文字列整形ヘルパークラス + */ +class VerboseMessage : public Message +{ +public: + //共通の冗長出力情報を持つクラス + class VerboseControl + { + public: + bool verbose; //冗長出力を行うかどうか + std::ostream * out; //出力先 + + //コンストラクタ + SINGLETON_CONSTRUCTOR(VerboseControl) throw() : verbose(false), out(0) + {} + + //冗長出力制御 + template + inline const VerboseControl & operator << (const T & src) const throw() + { + if(verbose && out != 0) + (*out) << src; + return *this; + } + + //verboseアクセサ + void setVerbose(bool _verbose) throw() + { verbose = _verbose; } + bool getVerbose(void) const throw() + { return verbose; } + + //outアクセサ + void setStream(std::ostream * _out) throw() + { out = _out; } + std::ostream * getStream(void) throw() + { return out; } + }; + + //冗長出力ストリーム (単純な抑止機構つきラッパークラス) + class VerboseStream + { + protected: + std::ostream * out; + + public: + VerboseStream(std::ostream * _out = 0) throw() : out(_out) {}; + + template + VerboseStream & operator << (const T & src) throw() + { + if(out != 0) + (*out) << src; + return *this; + } + }; + +protected: + //デフォルトコンストラクタ (テスト用) + VerboseMessage(void) throw(); + +public: + + //コンストラクタ + VerboseMessage(const char * src) throw(); + VerboseMessage(const std::string & src) throw(); + VerboseMessage(const char * src1, const char * src2, ... ) throw(); + + //デストラクタ + ~VerboseMessage(void) throw(); + + //冗長出力制御 (アクセサ回送) + inline static void setVerbose(bool _verbose) throw() + { Singleton::getInstance()->setVerbose(_verbose); } + + //冗長出力先ストリーム設定 (アクセサ回送) + inline static void setStream(std::ostream * _stream) throw() + { Singleton::getInstance()->setStream(_stream); } + + //冗長出力制御の状態取得 + inline static bool getVerbose(void) throw() + { return Singleton::getInstance()->getVerbose(); } + + //冗長出力先ストリームの取得 (設定したものと同じものは出てこない) + inline static VerboseStream getStream(void) throw() + { return VerboseStream(getVerbose() ? Singleton::getInstance()->getStream() : 0); } + + //TESTSUITE_PROTOTYPE(main) +}; + + /* + * 例外メッセージ用文字列整形ヘルパークラス + */ +class ExceptionMessage : public Message +{ +public: + //例外の危険度レベル + enum tagLevel { + DEFAULT = 0, + FATAL = 1, + WARNING = 2 + }; + +#ifdef EXCEPT_H + class ExceptionMessageException : public Exception + { + friend class ExceptionMessage; + protected: + ExceptionMessageException(int _code, std::string _details) throw() : Exception("ExceptionMessage", _code, _details) {} + }; +#endif + +protected: + enum tagLevel level; + +public: + //コンストラクタ + ExceptionMessage(const char * src) throw(); + ExceptionMessage(const std::string & src) throw(); + ExceptionMessage(const char * src1, const char * src2, ...) throw(); + + ExceptionMessage(enum tagLevel level = DEFAULT) throw(); + ExceptionMessage(enum tagLevel level, const char * src) throw(); + ExceptionMessage(enum tagLevel level, const std::string & src) throw(); + ExceptionMessage(enum tagLevel level, const char * src1, const char * src2, ...) throw(); + + ExceptionMessage(const ExceptionMessage & src) throw(); + + + //危険度レベル参照 + inline bool operator == (enum tagLevel _level) const throw() + { return level == _level; } + + //危険度レベル参照 + inline bool operator != (enum tagLevel _level) const throw() + { return !(operator ==(_level)); } + + //引数の設定 (返却値の型をMessage & から ExceptionMessage & にするための小細工) + template + inline ExceptionMessage & operator << (const T & src) throw() + { + Message::operator << ( src ); + return *this; + } + +#ifdef EXCEPT_H //Exceptionクラスを使用する場合 + //例外の発生 + bool throwException(void) throw(Exception) + { + ExceptionMessageException exc(level, str()); + return exc.throwException(); + } + //マニピュレータ + inline ExceptionMessage & operator << ( ExceptionMessage & (* func)(ExceptionMessage &) ) throw(Exception) + { return (*func)(*this); } + +#else //stdexceptを使用する場合 + //例外の発生 + template + bool throwException(void) throw(T) + { + throw T(str()); + return true; + } + //マニピュレータ + inline ExceptionMessage & operator << ( ExceptionMessage & (* func)(ExceptionMessage &) ) throw(T) + { return (*func)(*this); } +#endif + + //TESTSUITE_PROTOTYPE(main) +}; + +#ifdef EXCEPT_H //Exceptionクラスを使用する場合 + + //例外をスローするためのマニピュレータ + inline ExceptionMessage & throwException(ExceptionMessage & excmsg) throw(Exception) + { + excmsg.throwException(); + return excmsg; + } + +#else + //例外をスローするためのマニピュレータ + template + inline ExceptionMessage & throwException(ExceptionMessage & excmsg) throw(T) + { + excmsg.throwException(); + return excmsg; + } + +#endif + + + + /* + * デバッグ情報出力用文字列整形ヘルパークラス + */ +class DebugMessage : public Formatter +{ +public: + //共通の冗長出力情報を持つクラス (シングルトンにするのでVerboseControlを同じものをクラス化する) + class DebugControl : public VerboseMessage::VerboseControl + { public: SINGLETON_CONSTRUCTOR_(DebugControl) throw() : VerboseMessage::VerboseControl(_singleton) {} }; + + +protected: + //デフォルトコンストラクタ (テスト用) + DebugMessage(void) throw(); + +public: + + //コンストラクタ + DebugMessage(std::string src) throw(); + + //デストラクタ + ~DebugMessage(void) throw(); + + //冗長出力制御 (アクセサ回送) + inline static void setVerbose(bool _verbose) throw() + { Singleton::getInstance()->setVerbose(_verbose); } + + //冗長出力先ストリーム設定 (アクセサ回送) + inline static void setStream(std::ostream * _stream) throw() + { Singleton::getInstance()->setStream(_stream); } + + //冗長出力制御の状態取得 + inline static bool getVerbose(void) throw() + { return Singleton::getInstance()->getVerbose(); } + + //冗長出力先ストリームの取得 (設定したものと同じものは出てこない) + inline static VerboseMessage::VerboseStream getStream(void) throw() + { return VerboseMessage::VerboseStream(getVerbose() ? Singleton::getInstance()->getStream() : 0); } + +// TESTSUITE_PROTOTYPE(main) +}; + + +#endif //MESSAGE_H + + diff --git a/uzume_prototype/kernel/cfg/base/mpstrstream.cpp b/uzume_prototype/kernel/cfg/base/mpstrstream.cpp new file mode 100644 index 0000000..e3bcdce --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/mpstrstream.cpp @@ -0,0 +1,886 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: mpstrstream.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/mpstrstream.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#include "base/mpstrstream.h" + +using namespace std; + +/* + * 複数部位からなるストリームの一部位に相当するクラス + */ + + //コンストラクタ +MultipartStream::Part::Part(string _name) throw() : name(_name) +{} + + //コピーコンストラクタ +MultipartStream::Part::Part(const MultipartStream::Part & src) throw() : name("") +{ + if(src.isValid()) { + name.assign(src.name); + setContents(src.getContents()); + } +} + + //ストリームに書いた内容を受け取る +string MultipartStream::Part::getContents(void) const throw(Exception) +{ + string result; + + if(isValid()) + result = stream.str(); + else + ExceptionMessage("Operation was performed against an invalid stream.","無効なストリームに対して操作が行われました").throwException(); + + return result; +} + + //ストリームの内容を直接設定する +void MultipartStream::Part::setContents(string contents) throw(Exception) +{ + if(isValid()) { + stream.clear(); + stream << contents; + } + else + ExceptionMessage("Operation was performed against an invalid stream.","無効なストリームに対して操作が行われました").throwException(); +} + + + +/* + * 複数部位からなるストリームの一部位に相当するクラス + */ + + //コンストラクタ +MultipartStream::MultipartStream(string _filename) throw() : filename(_filename), current(0), dirty(false), output(true) +{ + dirty = isValid(); //空であってもファイルを作らないといけないので... +} + +MultipartStream::~MultipartStream(void) throw() +{ + if(isValid() && dirty) { + //蓋 + try { serialize(); } + catch(...) {} + } +} + + //ファイル名の関連付け +string MultipartStream::setFilename(string _filename) throw(Exception) +{ + string result; + + if(this != 0) { + if(!_filename.empty()) { + result = filename; + filename = _filename; + dirty = isValid(); + } + else + ExceptionMessage("Empty filename should not be allowed.","空のファイル名は使用できない").throwException(); + } + else + ExceptionMessage("Invalid object can not perform the request.","無効なオブジェクトに対する要求は実行できない").throwException(); + + return result; +} + + //ファイル出力 (本当にファイルに出力したときだけtrue) +bool MultipartStream::serialize(void) throw(Exception) +{ + bool result = false; + + if(isValid() && dirty && output) { + + fstream file(filename.c_str(), ios::out); + if(file.is_open()) { + list::iterator scope; + + //全ての部位の内容を出力 + scope = parts.begin(); + while(scope != parts.end()) { + file << scope->getContents(); + ++ scope; + } + + file.close(); + dirty = false; + result = true; + } + else { + ExceptionMessage("File could not open [%]","ファイルが開けない [%]") << filename << throwException; + disableOutput(); //デストラクタがもう一度挑戦するので + } + } + else { + if(!isValid()) + ExceptionMessage("Invalid object can not perform the request.","無効なオブジェクトに対する要求は実行できない").throwException(); + } + + return result; +} + + //部位の作成 +MultipartStream & MultipartStream::createPart(string name, bool precedence) throw(Exception) +{ + if(this != 0) { + list::iterator scope; + list::iterator newnode; + + //同じ名前がないことを確認 + scope = parts.begin(); + while(scope != parts.end()) { + if(scope->getName().compare(name) == 0) { + ExceptionMessage("The part \"%\" is already created.","部位名[%]はすでに利用されている") << name << throwException; + break; + } + ++ scope; + } + + //同じ名前がないなら要素を追加 + if(scope == parts.end()) { + + //挿入位置の検索 + if(current != 0) { + scope = parts.begin(); + while(scope != parts.end() && &(*scope) != current) + ++ scope; + + //挿入位置の調節 (現在位置を後ろにずらす when precedence = false; ) + if(scope != parts.end() && !precedence) + ++ scope; + } + else + scope = parts.end(); + + //要素の挿入 + newnode = parts.insert(scope, Part(name)); + current = &(*newnode); + } + }else + ExceptionMessage("Invalid object can not perform the request.","無効なオブジェクトに対する要求は実行できない").throwException(); + + return *this; +} + + //部位の選択 +MultipartStream & MultipartStream::movePart(string name) throw(Exception) +{ + list::iterator scope; + + if(this != 0 && !name.empty()) { + + //名前が一致するものを探す + scope = parts.begin(); + while(scope != parts.end()) { + if(scope->getName() == name) { + current = &(*scope); + break; + } + ++ scope; + } + + //見つからなかった + if(scope == parts.end()) + ExceptionMessage("Unknown part [%] specified.","無効な識別名 [%]") << name << throwException; + } + else{ + if(this == 0) + ExceptionMessage("Invalid object can not perform the request.","無効なオブジェクトに対する要求は実行できない").throwException(); + else //if(name.empty()) //手前のifの条件より、このifは常に真 + ExceptionMessage("Empty identifier was passed as a name of part.","空文字が渡された").throwException(); + } + + return *this; +} + + +/********************************** テストスィート **********************************/ + +#ifdef TESTSUITE + +#include "coverage_undefs.h" + +#include +#include + +#ifdef _MSC_VER +# pragma warning(disable:4101) //ローカル変数は一度も使われていません +#endif + +TESTSUITE_(main,Part, MultipartStream) +{ + BEGIN_CASE("constructor/isValid","コンストラクタ / 正当性判定") { + BEGIN_CASE("1","名前つきで作成したら有効なパートが作れる") { + Part part("test"); + if(!part.isValid()) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","名前なしで作成したら無効なパートになる") { + Part part(""); + if(part.isValid()) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3","NULLは無効なパート") { + if(((Part *)0)->isValid()) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("4","NULLオブジェクトでコピーコンストラクタを起動しても失敗しない") { + Part * part = 0; + Part work(*part); + } END_CASE; + + } END_CASE; + + BEGIN_CASE("operator <<","operator <<") { + BEGIN_CASE("1", "出力できる") { + Part part("test"); + + part << "test"; + + if(part.stream.str().compare("test") != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2", "iomanipが使える") { + Part part("test"); + + part << setw(8) << setbase(16) << setfill('0') << 0x1234567; + + if(part.stream.str().compare("01234567") != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3", "無効なストリームに書いたら例外が起る") { + Part part(""); + bool result = false; + + if(part.isValid()) + TEST_FAIL; + + Exception::setThrowControl(true); + try { + Message::selectLanguage(Message::NEUTRAL); + part << setw(8) << setbase(16) << setfill('0') << 0x1234567; + } + catch(Exception & e) { + if(e.getDetails().compare("Operation was performed against an invalid stream.") == 0) + result = true; + } + if(!result) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("getContents","getContents") { + BEGIN_CASE("1", "書いた内容が取得できる") { + Part part("test"); + + part << "test"; + + if(part.getContents().compare("test") != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2", "書いて読んでまた書いて読める") { + Part part("test"); + + part << "abc"; + if(part.getContents().compare("abc") != 0) + TEST_FAIL; + + part << "def"; + if(part.getContents().compare("abcdef") != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3", "無効なストリームから読んだら例外が起る") { + Part part(""); + bool result = false; + + if(part.isValid()) + TEST_FAIL; + + Exception::setThrowControl(true); + try { + string work = part.getContents(); + } + catch(Exception & e) { + if(e.getDetails().compare("Operation was performed against an invalid stream.") == 0) + result = true; + } + if(!result) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("setContents","setContents") { + BEGIN_CASE("1", "設定した内容が取得できる") { + Part part("test"); + + part.setContents("test"); + + if(part.getContents().compare("test") != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2", "setContentsで設定したあとに追記できる") { + Part part("test"); + + part.setContents("abc"); + part << "def"; + if(part.getContents().compare("abcdef") != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3", "無効なストリームに設定したら例外が起る") { + Part part(""); + bool result = false; + + if(part.isValid()) + TEST_FAIL; + + Exception::setThrowControl(true); + try { + part.setContents("test"); + } + catch(Exception & e) { + if(e.getDetails().compare("Operation was performed against an invalid stream.") == 0) + result = true; + } + if(!result) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("getName","getName") { + BEGIN_CASE("1", "パート名が正しく取得できる") { + Part part("name_of_stream"); + + if(part.getName().compare("name_of_stream") != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2", "不正なパートの名前を取ると例外が起る") { + Part part(""); + bool result = false; + + Exception::setThrowControl(true); + try { string work = part.getName(); } + catch(Exception & e) { + if(e.getDetails().compare("Operation was performed against an invalid stream.") == 0) + result = true; + } + if(!result) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("CopyConstructor","コピーコンストラクタ") { + Part source("test"); + source << "abcdefg"; + + Part dest(source); + BEGIN_CASE("1","ストリームの内容が正しくコピーできている") { + if(dest.getContents().compare("abcdefg") != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","部位名が正しくコピーできている") { + if(dest.getName() != source.getName()) + TEST_FAIL; + } END_CASE; + } END_CASE; +} + +TESTSUITE(main,MultipartStream) +{ + BEGIN_CASE("constructor/isValid","constructor/isValid") { + BEGIN_CASE("1","ファイル名を指定して生成したオブジェクトは有効") { + MultipartStream mps("test.dat"); + + if(!mps.isValid()) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","ファイル名を持たないオブジェクトは無効") { + MultipartStream mps; + + if(mps.isValid()) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3","空のファイル名を持つオブジェクトは無効") { + MultipartStream mps(""); + + if(mps.isValid()) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("4","NULLオブジェクトは無効") { + if(((MultipartStream *)0)->isValid()) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("setFilename","setFilename") { + BEGIN_CASE("1","ファイル名を指定せずに生成したファイルに名前をつける") { + MultipartStream mps; + if(mps.isValid()) + TEST_FAIL; + + BEGIN_CASE("1","ストリームは有効になる") { + mps.setFilename("test"); + if(!mps.isValid()) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","ストリームの名前が変更されている") { + if(mps.filename.compare("test") != 0) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("2","ファイル名を指定して生成したファイルに名前をつける") { + MultipartStream mps("initialname"); + if(!mps.isValid()) + TEST_FAIL; + + BEGIN_CASE("1","ストリームは有効になる") { + mps.setFilename("test"); + if(!mps.isValid()) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","ストリームの名前が変更されている") { + if(mps.filename.compare("test") != 0) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("3","空文字を渡すと例外") { + MultipartStream mps; + bool result = false; + + Exception::setThrowControl(true); + try { mps.setFilename(""); } + catch(Exception & e) + { result = true; } + if(!result) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("4","NULLオブジェクトに名前をつけると例外") { + bool result = false; + + Exception::setThrowControl(true); + try { ((MultipartStream *)0)->setFilename("test"); } + catch(Exception & e) + { result = true; } + if(!result) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("serialize","serialize") { + + BEGIN_CASE("1", "NULLオブジェクトに対するシリアライズは例外") { + bool result = false; + + Exception::setThrowControl(true); + try + { ((MultipartStream *)0)->serialize(); } + catch(Exception & e) + { result = true; } + + if(!result) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2", "無効なオブジェクトに対するシリアライズも例外") { + bool result = false; + MultipartStream mps; + + Exception::setThrowControl(true); + try + { mps.serialize(); } + catch(Exception & e) + { result = true; } + + if(!result) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3", "正常にシリアライズできる") { + MultipartStream mps("debug.out"); + Part part("abc"); + + part << "abcdefg"; + mps.parts.push_back(part); + mps.dirty = true; + + ::remove("debug.out"); + BEGIN_CASE("1", "シリアライズはtrueを返す") { + if(!mps.serialize()) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2", "出力したファイルの内容が正しい") { + if(!TestSuite::compareFileContents("debug.out","abcdefg")) + TEST_FAIL; + } END_CASE; + + } END_CASE; + + BEGIN_CASE("4", "内容があってもdirty=falseなら出力されない") { + MultipartStream mps("debug.out"); + Part part("abc"); + + part << "abcdefg"; + mps.parts.push_back(part); + mps.dirty = false; + + ::remove("debug.out"); + BEGIN_CASE("1", "シリアライズはfalseを返す") { + if(mps.serialize()) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2", "ファイルは出力されていない") { + fstream file("debug.out",ios::in); + if(file.is_open()) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("5", "内容があっても出力禁止なら出力されない") { + MultipartStream mps("debug.out"); + Part part("abc"); + + part << "abcdefg"; + mps.parts.push_back(part); + mps.dirty = true; + + mps.disableOutput(); + + ::remove("debug.out"); + BEGIN_CASE("1", "シリアライズはfalseを返す") { + if(mps.serialize()) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2", "ファイルは出力されていない") { + fstream file("debug.out",ios::in); + if(file.is_open()) + TEST_FAIL; + } END_CASE; + } END_CASE; + } END_CASE; + + BEGIN_CASE("Destructor","Destructor") { + BEGIN_CASE("1","作って壊す") { + MultipartStream mps("debug.out"); + Part part("abc"); + + part << "abcdefg"; + mps.parts.push_back(part); + mps.dirty = true; + + ::remove("debug.out"); + } END_CASE; + + BEGIN_CASE("2","内容がファイルに格納されている") { + if(!TestSuite::compareFileContents("debug.out","abcdefg")) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("createPart","createPart") { + BEGIN_CASE("1","パートを登録する") { + MultipartStream mps("debug.out"); + mps.disableOutput(); + + BEGIN_CASE("1","例外なく登録できる") { + Exception::setThrowControl(true); + mps .createPart("abc") + .createPart("def") + .createPart("ghi"); + } END_CASE; + + BEGIN_CASE("2","中身が登録順で並んでいる") { + list::iterator scope; + scope = mps.parts.begin(); + if(scope->getName().compare("abc") != 0) + TEST_FAIL; + ++ scope; + if(scope->getName().compare("def") != 0) + TEST_FAIL; + ++ scope; + if(scope->getName().compare("ghi") != 0) + TEST_FAIL; + ++ scope; + if(scope != mps.parts.end()) + TEST_FAIL; + } END_CASE; + + } END_CASE; + + BEGIN_CASE("2","パートを逆順で登録する") { + MultipartStream mps("debug.out"); + mps.disableOutput(); + + BEGIN_CASE("1","例外なく登録できる") { + Exception::setThrowControl(true); + mps .createPart("abc",true) + .createPart("def",true) + .createPart("ghi",true); + } END_CASE; + + BEGIN_CASE("2","中身が登録した逆順で並んでいる") { + list::iterator scope; + scope = mps.parts.begin(); + if(scope->getName().compare("ghi") != 0) + TEST_FAIL; + ++ scope; + if(scope->getName().compare("def") != 0) + TEST_FAIL; + ++ scope; + if(scope->getName().compare("abc") != 0) + TEST_FAIL; + ++ scope; + if(scope != mps.parts.end()) + TEST_FAIL; + } END_CASE; + + } END_CASE; + + BEGIN_CASE("3","NULLに対する操作で例外が発生する") { + bool result = false; + Exception::setThrowControl(true); + try { + ((MultipartStream *)0)->createPart("test"); + } + catch(...) + { result = true; } + if(!result) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("4","同じ名前のパートを作ると例外が起る") { + BEGIN_CASE("1","同じ名前のパートを作ると例外が起る") { + bool result = false; + MultipartStream mps("debug.out"); + Exception::setThrowControl(true); + + try { + mps .createPart("abc") + .createPart("def") + .createPart("abc"); + } + catch(...) + { result = true; } + + if(!result) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","例外を封じても正しく動く") { + bool result = true; + MultipartStream mps("debug.out"); + Exception::setThrowControl(false); + + BEGIN_CASE("1","例外はスローされない") { + try { + mps .createPart("abc") + .createPart("def") + .createPart("abc"); + } + catch(...) + { result = false; } + + if(!result) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","現在位置は変化しない") { + if(mps.current == 0 || mps.current->getName().compare("def") != 0) + TEST_FAIL; + } END_CASE; + } END_CASE; + } END_CASE; + + Exception::setThrowControl(true); + + BEGIN_CASE("5","登録すると現在位置が変化する") { + MultipartStream mps("debug.out"); + mps.disableOutput(); + + BEGIN_CASE("1","登録すると位置が変化する (1)") { + mps.createPart("abc"); + if(mps.current == 0 || mps.current->getName().compare("abc") != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","登録すると位置が変化する (2)") { + mps.createPart("def"); + if(mps.current == 0 || mps.current->getName().compare("def") != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3","登録すると位置が変化する (3)") { + mps.createPart("ghi"); + if(mps.current == 0 || mps.current->getName().compare("ghi") != 0) + TEST_FAIL; + } END_CASE; + } END_CASE; + } END_CASE; + + BEGIN_CASE("opeator <<","operator <<") { + + BEGIN_CASE("1","operator <<が使える") { + MultipartStream mps("debug.out"); + + mps.createPart("test"); + + mps << "abcdefghijklmn"; + } END_CASE; + + BEGIN_CASE("2","出力された中身が正しい") { + if(!TestSuite::compareFileContents("debug.out","abcdefghijklmn")) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3","NULLオブジェクトに出力すると例外") { + bool result = false; + Exception::setThrowControl(true); + try { + *((MultipartStream *)0) << "test"; + } + catch(...) + { result = true; } + if(!result) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("4","パートを全く作っていないオブジェクトに出力すると例外") { + bool result = false; + Exception::setThrowControl(true); + try { + MultipartStream mps("debug.out"); + mps.disableOutput(); + *((MultipartStream *)0) << "test"; + } + catch(...) + { result = true; } + if(!result) + TEST_FAIL; + } END_CASE; + + } END_CASE; + + BEGIN_CASE("movePart/operator []","movePart/operator []") { + BEGIN_CASE("1","普通に移動する") { + MultipartStream mps("debug.out"); + mps.disableOutput(); + + mps .createPart("abc") + .createPart("def") + .createPart("ghi"); + + BEGIN_CASE("1","移動できる") { + mps.movePart("def"); + + if(mps.current->getName().compare("def") != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","無効な名前を入れると例外") { + bool result = false; + Exception::setThrowControl(true); + + try { + mps.movePart("unknwon"); + } + catch(...) + { result = true; } + if(!result) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3","空文字を入れると例外") { + bool result = false; + Exception::setThrowControl(true); + + try { + mps.movePart(""); + } + catch(...) + { result = true; } + if(!result) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("2", "NULLオブジェクト相手に操作すると例外") { + bool result = false; + Exception::setThrowControl(true); + + try { + ((MultipartStream *)0)->movePart(""); + } + catch(...) + { result = true; } + if(!result) + TEST_FAIL; + } END_CASE; + } END_CASE; +} + + +#endif + + + + diff --git a/uzume_prototype/kernel/cfg/base/mpstrstream.h b/uzume_prototype/kernel/cfg/base/mpstrstream.h new file mode 100644 index 0000000..eb5ba52 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/mpstrstream.h @@ -0,0 +1,187 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: mpstrstream.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/mpstrstream.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#ifndef MPSTRSTREAM_H +#define MPSTRSTREAM_H + +#ifdef _MSC_VER +# pragma warning(disable:4290) //C++ の例外の指定は無視されます。関数が __declspec(nothrow) でないことのみ表示されます。 +# pragma warning(disable:4786) //デバッグ情報で識別子が255文字に切り捨てられました。 +#endif + +#include "testsuite.h" +#include "base/except.h" +#include "base/message.h" +#include "base/event.h" + +#include +#include +#include +#include + + + //複数部位からなる出力用ストリームのクラス +class MultipartStream : public Event::Handler +{ +public: + + //複数部位からなる出力用ストリームの一部位に相当するクラス + class Part + { + protected: + std::string name; + std::stringstream stream; + + public: + //コンストラクタ + Part(std::string name) throw(); + Part(const Part & src) throw(); + + //正当性判定 + inline bool isValid(void) const throw() + { return (this != 0) && !name.empty() && stream.good(); } + + //ストリームへの書込み + template + Part & operator << ( T src ) throw(Exception) + { + if(isValid()) + stream << src; + else + ExceptionMessage("Operation was performed against an invalid stream.","無効なストリームに対して操作が行われました").throwException(); + + return *this; + } + + //ストリームに書いた内容を受け取る + std::string getContents(void) const throw(Exception); + + //ストリームの内容を直接設定する + void setContents(std::string contents) throw(Exception); + + //ストリーム名の参照 + inline const std::string & getName(void) const throw(Exception) + { + if(!isValid()) + ExceptionMessage("Operation was performed against an invalid stream.","無効なストリームに対して操作が行われました").throwException(); + return name; + } + + //代入演算子 + inline Part & operator = (const Part & src) throw() + { + name = src.name; + stream.clear(); + stream << src.stream.str(); + + return *this; + } + + TESTSUITE_PROTOTYPE(main) + }; + + +protected: + std::string filename; //関連付けられたファイル名 + std::list parts; //部位集合(順序つき) + Part * current; //今見ている部位 + bool dirty; //ファイルに出力する要あらばtrue (何か書き込んだら... ではなく、まだ出力してないかどうか) + bool output; //出力しても良いならtrue + + virtual void handler(ShutdownEvent & evt) + { serialize(); } + +public: + //コンストラクタ + MultipartStream(std::string filename = "") throw(); + + //デストラクタ + virtual ~MultipartStream(void) throw(); + + //正当性判定 + inline bool isValid(void) const throw() + { return (this != 0) && !filename.empty(); } + + //ファイル名 + std::string setFilename(std::string filename) throw(Exception); + std::string getFilename(void) const throw() { return filename; }; + + //ストリームの内容をファイルに出力 + bool serialize(void) throw(Exception); + + //部位の生成 + MultipartStream & createPart(std::string name, bool precedence = false) throw(Exception); + + //部位の選択 + MultipartStream & movePart(std::string name) throw(Exception); + + //出力するかどうかの設定 + inline void enableOutput(void) throw() + { if(isValid()) output = true; } + inline void disableOutput(void) throw() + { if(isValid()) output = false; } + + //ダーティビットの設定 + inline void setDirty(bool _dirty = true) throw() + { dirty = _dirty; } + + //出力 + template + inline MultipartStream & operator << ( T src ) throw(Exception) + { + if(this != 0 && current != 0) { + setDirty(); + (*current) << src; + } + else + ExceptionMessage("Invalid operation against an invalid object","無効なオブジェクトに対する要求").throwException(); + return *this; + } + + //部位の選択 (Synonym) + inline MultipartStream & operator[] (std::string name) throw(Exception) + { return movePart(name); } + + TESTSUITE_PROTOTYPE(main) +}; + +#endif + + diff --git a/uzume_prototype/kernel/cfg/base/option.cpp b/uzume_prototype/kernel/cfg/base/option.cpp new file mode 100644 index 0000000..48ed65d --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/option.cpp @@ -0,0 +1,913 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: option.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/option.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#include "base/option.h" +#include +#include + +using namespace std; + + //別のOptionItemが持つパラメータを自分に追加する +void OptionParameter::OptionItem::mergeItem(const OptionItem & src) +{ + vector::const_iterator scope; + + //全てのパラメータを自分の後ろに追加 + scope = src.param.begin(); + while(scope != src.param.end()) { + param.push_back(*scope); + ++ scope; + } +} + + //文字列の先頭にある空白文字を取り除く +namespace { + void TrimString(string & src) + { + string::size_type pos; + + pos = src.find_first_not_of(" \t\r\n"); + if(pos != 0) + src.erase(0, pos); + } +} + + //オプションパラメータを解析してOptionItemを生成する +bool OptionParameter::OptionItem::createItem(OptionItem & _dest, string & argv) +{ + bool result; + string param; + string::size_type pos; + OptionItem dest; + + result = true; + + TrimString(argv); + if(argv.empty()) + result = false; //中身が空っぽ + else { + //オプションのチェック + if(argv[0] == '-') { + pos = argv.find_first_of(" ="); + + if(argv.substr(0,pos).compare("-") == 0) { // - だけのオプションは受け付けない + result = false; + } + else { + if(pos != 1) { + if(pos != string::npos) { + dest = argv.substr(1, pos - 1); + argv.erase(0, pos + 1); + } + else { + dest = argv.substr(1); + argv.erase(); + } + } + } + } + + TrimString(argv); + while(!argv.empty() && argv[0] != '-') { + if(argv[0] == '"') { + + //対になるダブルクォートを探す + pos = argv.find_first_of('"',1); + if(pos == string::npos) { + result = false; + break; + } + + //ダブルクォートの中身を取る + param = argv.substr(1, pos - 1); + + //ダブルクォートを消す + ++ pos; + } + else { + + //次の区切りを探す + pos = argv.find_first_of(" \t\r\n"); + if(pos == string::npos) + param = argv; + else + param = argv.substr(0,pos); + } + + dest.addParameter(param); + argv.erase(0, pos); + + TrimString(argv); + } + } + + if(result) + _dest = dest; + + return result; +} + + //無効なオプションアイテムの生成 +OptionParameter::OptionItem OptionParameter::OptionItem::createInvalidItem(void) throw() +{ + OptionItem result; + + result.assign(""); + return result; +} + + + //全てのパラメータ結合したものを取得 +string OptionParameter::OptionItem::getParameters(string punctuator) const throw() +{ + string result; + + vector::const_iterator scope; + + if(isValid()) { + scope = param.begin(); + while(scope != param.end()) { + result += punctuator; + result += *scope; + ++ scope; + } + + if(!result.empty()) + result.erase(0, punctuator.size()); //先頭の区切り子を削除 + } + + return result; +} + + //オプションの個数のチェック +bool OptionParameter::OptionItem::checkParameterCount(size_t required, bool allow_zero) const throw() +{ + bool result = true; + if(isValid()) { + size_t count = countParameter(); + if(count != required || (!allow_zero && count == 0)) + result = false; + } + else + result = false; + return result; +} + + //オプションパラメータのパース +bool OptionParameter::parseOption(int _argc, char const * const * _argv, char const * _default) throw() +{ + bool result; + string arguments; + OptionItem work; + int i; + + map::iterator scope; + + //プログラム名の取得 + if(_argc > 0) + program_name.assign(_argv[0]); + + //全てつなげる + for(i=1;i<_argc;++i) { + arguments += _argv[i]; + arguments += ' '; + } + + if(arguments.empty() && _default != 0) + arguments.assign(_default); + + cmdline += arguments; + + result = true; + + //各オプションの解析 + while(!arguments.empty()) { + + if(!OptionItem::createItem(work, arguments)) { + result = false; + break; + } + + //同一のオプションがいたらマージする + scope = container.find(work); + if(scope != container.end()) + scope->second.mergeItem(work); + else + container.insert(std::map::value_type(work, work)); + } + + return result; +} + + //要素の検出 +map::iterator OptionParameter::_find(const std::string & name, bool check) throw() +{ + map::iterator scope; + + scope = container.find(name); + + //要素を使用したことを記録しておく + if(check && scope != container.end()) + scope->second._check(); + + return scope; +} + + + //オプションアイテムの参照 +OptionParameter::OptionItem OptionParameter::get(const std::string & name, bool check) throw() +{ + OptionItem result; + map::iterator scope; + + scope = _find(name, check); + if(scope != container.end()) + result = scope->second; + else + result = OptionItem::createInvalidItem(); + + return result; +} + + + //全てのオプションが使用されたかどうかの確認 +bool OptionParameter::validateOption(void) const throw() +{ + map::const_iterator scope; + bool result = true; + + //全てのオプションがチェック済みであることを確認 + scope = container.begin(); + while(scope != container.end()) { + if(!scope->second.isChecked()) { + result = false; + break; + } + ++ scope; + } + + return result; +} + + + //使用されなかったオプション列を取得 +string OptionParameter::getInvalidOptions(void) const throw() +{ + map::const_iterator scope; + string result; + + //使用されなかった全てのオプションに対して + scope = container.begin(); + while(scope != container.end()) { + const OptionItem & item = scope->second; + if(!item.isChecked()) { + result += " -"; + result += item; + + //オプションパラメータの列挙 + size_t params = item.countParameter(); + for(size_t i=0; i(DEFAULT_PARAMETER, OptionItem())); + if(param.countItem() != 1) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("opeator []","operator []で要素にアクセスできる") { + OptionParameter param; + OptionItem work; + string arg("-test param"); + + OptionItem::createItem(work, arg); + param.container.insert(pair(work, work)); + + BEGIN_CASE("1", "operator [] (const string &)で総祖にアクセスできる") { + if(param[string("test")][0].compare("param") != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2", "operator [] (const char *)で総祖にアクセスできる") { + if(param["test"][0].compare("param") != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3", "operator []で触ると、checkが入る") { + if(!param["test"].isChecked()) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("4", "operator []に無効なキーを入れると、無効なデータが返ってくる") { + if(param["nonexist"].isValid()) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("get","要素へのアクセス") { + OptionParameter param; + OptionItem work; + + OptionItem::createItem(work, string("-test param")); + param.container.insert(pair(work, work)); + OptionItem::createItem(work, string("-test2 param2")); + param.container.insert(pair(work, work)); + + BEGIN_CASE("1","get(test)で要素が取得でき、チェックが入る") { + TEST_CASE("1","要素が存在する", (work = param.get("test")).isValid()); + TEST_CASE("2","チェックが入っている", work.isChecked() ); + TEST_CASE("3","要素はパラメータを持つ", work.hasParameter() ); + } END_CASE; + + BEGIN_CASE("2","get(test2,false)で要素が取得でき、チェックはつかない") { + TEST_CASE("1","要素が存在する", (work = param.get("test2",false)).isValid()); + TEST_CASE("2","チェックが入っていない", !work.isChecked() ); + } END_CASE; + + BEGIN_CASE("3","すでにチェックのついたtestに対し、get(test,false)で要素が取得でき、チェック済み") { + TEST_CASE("1","要素が存在する", (work = param.get("test",false)).isValid()); + TEST_CASE("2","チェックが入っていない", work.isChecked() ); + } END_CASE; + + BEGIN_CASE("4","get(無効な名前)で無効な要素が返る") { + TEST_CASE("1","要素が存在する", !param.get("unknown").isValid()); + } END_CASE; + } END_CASE; + + + BEGIN_CASE("parseOption","パラメータのパースが正常にできるか") { + BEGIN_CASE("01","中身が何もないパラメータを与えても成功する") { + OptionParameter param; + char ** argv = { NULL }; + + if(!param.parseOption(0, argv)) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("02","プログラム名はオプションとして解析されない") { + OptionParameter param; + char * argv[] = { "test.exe", NULL }; + + if(!param.parseOption(1, argv)) + TEST_FAIL; + if(param.countItem() != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("03","パラメータがそれなりに解析される") { + OptionParameter param; + char * argv[] = { "test.exe", "-test", "param", "-test2=\"dummy\"", NULL }; + + if(!param.parseOption(4, argv)) + TEST_FAIL; + if(param.countItem() != 2) + TEST_FAIL; + + if(param[string("test")][0].compare("param") != 0) + TEST_FAIL; + + if(param["test2"][0].compare("dummy") != 0) + TEST_FAIL; + + if(param.getProgramName().compare("test.exe") != 0) + TEST_FAIL; + + } END_CASE; + + BEGIN_CASE("04","引数列が取れる") { + OptionParameter param; + char * argv[] = { "test.exe", "-test", "param", "-test2=\"dummy\"", NULL }; + + if(!param.parseOption(4, argv)) + TEST_FAIL; + + if(param.getCommandLine().compare("-test param -test2=\"dummy\" ") != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("05","何も引数が無いときにはデフォルト引数をひいてくる") { + OptionParameter param; + char * argv[] = { "test.exe", NULL }; + + if(!param.parseOption(1, argv, "-default=parameter")) + TEST_FAIL; + + if(param.getCommandLine().compare("-default=parameter ") != 0) + TEST_FAIL; + } END_CASE; + + } END_CASE; + + BEGIN_CASE("04","参照マークをつける") { + OptionParameter param; + char * argv[] = { "test.exe", "-test", "param", "-test2=\"dummy\"", NULL }; + + if(!param.parseOption(4, argv)) + TEST_FAIL; + + if(param.container.find(string("test"))->second.isChecked()) + TEST_FAIL; + + param.check("test"); + if(!param.container.find(string("test"))->second.isChecked()) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("05","validateOption") { + OptionParameter param; + char * argv[] = { "test.exe", "-test", "param", "-test2=\"dummy\"", NULL }; + + if(!param.parseOption(4, argv)) + TEST_FAIL; + + BEGIN_CASE("1","何も使用していないときにはfalse") { + if(param.validateOption()) + TEST_FAIL; + } END_CASE; + + param["test"]._check(); + BEGIN_CASE("2","ほかにチェックしていないオプションがあればfalse") { + if(param.validateOption()) + TEST_FAIL; + } END_CASE; + + param["test2"]._check(); + BEGIN_CASE("3","全て使用されればtrue") { + if(!param.validateOption()) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("06","getInvalidOptions") { + OptionParameter param; + char * argv[] = { "test.exe", "-test", "param", "-test2=\"dummy\"", NULL }; + + if(!param.parseOption(4, argv)) + TEST_FAIL; + + BEGIN_CASE("1","何も使用していないときには全てのオプションが無効") { + if(param.getInvalidOptions().compare("-test \"param\" -test2 \"dummy\"") != 0) + TEST_FAIL; + } END_CASE; + + param["test"]._check(); + BEGIN_CASE("2","ほかにチェックしていないオプションがあればそれが取れる") { + if(param.getInvalidOptions().compare("-test2 \"dummy\"") != 0) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("07","find") { + OptionParameter param; + char * argv[] = { "test.exe", "-test", "param", "-test2=\"dummy\"", NULL }; + + if(!param.parseOption(4, argv)) + TEST_FAIL; + + BEGIN_CASE("1","存在するオプションに対してtrueが返る") { + if(!param.find("test") || !param.find("test2")) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","存在しないオプションに対してfalseが返る") { + if(param.find("unknown")) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("3","空文字に対してfalseが返る") { + if(param.find("")) + TEST_FAIL; + } END_CASE; + } END_CASE; + + Singleton::restoreContext(context); +} + +#endif + + diff --git a/uzume_prototype/kernel/cfg/base/option.h b/uzume_prototype/kernel/cfg/base/option.h new file mode 100644 index 0000000..4a7574e --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/option.h @@ -0,0 +1,198 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: option.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/option.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#ifndef OPTION_H +#define OPTION_H + +#include "base/testsuite.h" +#include "base/singleton.h" + +#include +#include +#include + +#define DEFAULT_PARAMETER "#default" + +using namespace std; + +/* + * オプションパラメータを管理するクラス + */ +class OptionParameter +{ +public: + class OptionItem : public std::string + { + protected: + bool checked; //使用したかどうか + std::vector param; //オプション + + public: + //コンストラクタ + OptionItem(void) throw() : string(DEFAULT_PARAMETER), checked(false) {} + OptionItem(const std::string & name) throw() : string(name), checked(false) {} + OptionItem(const OptionItem & src) throw() : string(src), checked(src.checked), param(src.param) {} + + //オプションパラメータを解析してOptionItemを生成する + static bool createItem(OptionItem & item, string & argv); + + //別のOptionItemが持つパラメータを自分に追加する + void mergeItem(const OptionItem & src); + + //パラメータの追加 + inline void addParameter(const std::string & src) throw() + { param.push_back(src); } + + //パラメータ数の取得 + inline size_t countParameter(void) const throw() + { return param.size(); } + + //パラメータを持っているかどうか + inline bool hasParameter(void) const throw() + { return countParameter() != 0; } + + //位置を指定してパラメータを参照 (無効な位置だと空文字) + inline std::string operator[](std::vector::size_type offset) const throw() + { + string result; + + if(offset < countParameter()) + result = param[offset]; + + return result; + } + + //このオプションを使用したことを記す (OptionParameterを介しての利用のみなので "_" をつけておく) + inline void _check(void) throw() + { checked = true; } + + //このオプションに触ったかどうか + inline bool isChecked(void) const throw() + { return checked; } + + //有効かどうか (ななしは無効) + inline bool isValid(void) const throw() + { return !empty(); } + + //無効なオプションアイテムの生成 + static OptionItem createInvalidItem(void) throw(); + + //全てのパラメータ結合したものを取得 + std::string getParameters(std::string punctuator = " ") const throw(); + + //パラメータの個数をチェック + bool checkParameterCount(size_t count, bool allow_zero = false) const throw(); + + TESTSUITE_PROTOTYPE(main) + }; + +protected: + //オプションを格納する変数 + std::map container; //set::begin()はconst_iteratorしか返さないので仕方なくmapに変える (実装を考えれば当然か...) + + //プログラム名称 + std::string program_name; + + //コマンドラインに渡された引数そのもの + std::string cmdline; + + //デフォルトコンストラクタ (テスト用) + OptionParameter(void) throw() {} + + //要素の検出 + std::map::iterator _find(const std::string & name, bool check = true) throw(); + +public: + + //シングルトンコンストラクタ + SINGLETON_CONSTRUCTOR(OptionParameter) throw() {} + + //オプションパラメータのパース + bool parseOption(int _argc, char const * const * _argv, char const * _default = NULL) throw(); + + //全てのオプションが使用されたかどうかの確認 + bool validateOption(void) const throw(); + + //使用されなかったオプション列を取得 + std::string getInvalidOptions(void) const throw(); + + //アイテムの数を数える + inline size_t countItem(void) const throw() + { return container.size(); } + + //オプションアイテムの参照 + OptionItem get(const std::string & name, bool check = true) throw(); + + inline OptionItem operator [] (const std::string & name) throw() + { return get(name); } + + inline OptionItem operator [] (const char * name) throw() + { return get(string(name)); } + + //オプションの有無の検出 + inline bool find(std::string name) throw() + { return get(name).isValid(); } + + + //参照マークをつける + inline bool check(const std::string & name) throw() + { return _find(name) != container.end(); } + + inline bool check(const char * name) throw() + { return check(string(name)); } + + //プログラム名を取得する + inline const std::string & getProgramName(void) const throw() + { return program_name; } + + //引数列をそのまま取得する (プログラム名は含まず) + inline const std::string & getCommandLine(void) const throw() + { return cmdline; } + + TESTSUITE_PROTOTYPE(main) +}; + + /* システム内で単一のOptionParameterを取るための関数 */ +inline OptionParameter & getOptionParameter(void) throw() +{ return *Singleton::getInstance(); } + +#endif + + diff --git a/uzume_prototype/kernel/cfg/base/parser.cpp b/uzume_prototype/kernel/cfg/base/parser.cpp new file mode 100644 index 0000000..e18c59d --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/parser.cpp @@ -0,0 +1,1536 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: parser.cpp,v 1.2 2012/06/17 00:24:19 suikan Exp $ + */ + + + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/parser.cpp,v 1.2 2012/06/17 00:24:19 suikan Exp $ + +#include "base/defs.h" +#include "base/parser.h" +#include +#include +#include +#include + +using namespace std; + +/* + * 先頭と末尾にある空白文字を取り除く + */ +Token & Token::trim(void) +{ + string::iterator scope; + + /* あたま */ + scope = begin(); + while(*scope == ' ' || *scope == '\t' || *scope == '\r' || *scope == '\n') + ++ scope; + erase(begin(), scope); + + if(!empty()) + { + /* おしり */ + scope = end(); + do { + -- scope; + } while(*scope == ' ' || *scope == '\t' || *scope == '\r' || *scope == '\n'); + ++ scope; + erase(scope, end()); + } + return *this; +} + + + /* + * 文字列リテラルの展開 (ダブルクォートの取り除き + エスケープシーケンスの展開) + */ +Token & Token::chopLiteral(void) +{ + if(type != STRINGLITERAL) + return *this; + + string::iterator scope; + + //エラー処理のために非破壊処理をする + string src(*this); + string work; + + if(src[0] != '"' || src[src.length()-1] != '"') + return *this; + + src = src.substr(1, src.length()-2); + + scope = src.begin(); + while(scope != src.end()) + { + if(*scope == '\\') + { + //リテラルの末尾が\で終わることはないのでチェックしない + ++ scope; + switch(*scope) + { + case '"': work += '"'; break; + case 't': work += '\t'; break; + case 'r': work += '\r'; break; + case 'n': work += '\n'; break; + case 'b': work += '\b'; break; + case '\\': work += '\\'; break; + default: + ExceptionMessage("Illegal escape sequence [\\%]","エスケープシーケンス[\\%]は不正です") << *scope << throwException; + } + }else + work += *scope; + + ++ scope; + } + + type = STRING; + assign(work); + value = this->length(); + + return *this; +} + + /* 区切り文字 (一文字だけで意味を成す文字) */ +const char * Parser::Punctuator = + ",;(){}"; + + /* 演算子 (特殊文字からなる文字) */ +const char * Parser::Operator = + "+-*/&|%^~!?[]=:.#"; + +Token Parser::lastErrorToken; + + + /* + * ストリームから一文字だけ切り出す + */ +inline int Parser::getChar(void) +{ + int work = current->stream->get(); + + /* 行番号の処理 */ + if(work == '\n') + current->line ++; + + /* ストリームログのための処理 */ + if(PutBackCount == 0) + { + if(LogBuffer != 0 && isenabled(LOGGING)) + *LogBuffer += static_cast(work); + }else + PutBackCount --; //すでに読み込んでいる + + return work; +} + + /* + * 取り出しすぎた文字をストリームに返す + */ +inline void Parser::putBack(int ch) +{ + /* 行番号のための処理 */ + if(ch == '\n') + current->line --; + + /* ストリームログのための処理 */ + PutBackCount ++; + + current->stream->putback(ch); +} + + /* + * Parserクラスのデストラクタ + */ +Parser::~Parser(void) +{ + list::iterator scope; + + /* 最後までパースしてないなら、とりあえずスタックに入れておく */ + if(current != 0) + fileStack.push_front(current); + + /* スタックの中身全部を破棄 */ + scope = fileStack.begin(); + while(scope != fileStack.end()) + { + if((*scope)->stream != 0 && (*scope)->stream != &cin) + delete (*scope)->stream; //ストリームの破棄 + delete (*scope); //構造体のデータ領域の破棄 + + ++ scope; + } + + /* 念のため */ + fileStack.clear(); + TokenStack.clear(); +} + + + /* + * 識別子の切出し (識別子 = [a-zA-Z_][0-9a-zA-Z_]*) + */ +bool Parser::getIdentifier(Token & token,int ch) +{ + token.value = 0; + + do { + token.value ++; + token += static_cast(ch); + ch = getChar(); + } while( (ch >='a' && ch <= 'z') || (ch >='A' && ch <= 'Z') || (ch == '_') || (ch >= '0' && ch <= '9') ); + + if(ch != -1) + putBack(static_cast(ch)); + + token.type = Token::IDENTIFIER; + return true; +} + + + /* + * ディレクティブの切出しと処理 + */ +bool Parser::parseDirectives(Token & token, int ch, bool allow_space) +{ + Token directive; + map::iterator scope; + + //空白読み飛ばし + do { + token += static_cast(ch); + ch = getChar(); + } while(ch == ' ' || ch == '\t'); + + if(ch >= '0' && ch <= '9') + { + //GNU-cpp lineディレクティブ 対策 + directive.assign("line"); + this->putBack(ch); + }else + { + //ディレクティブの読み出し + putBack(ch); + getToken(directive); + token += directive; + } + + //lineディレクティブの解析 + if(directive.compare("line") == 0) + { + Token token; + + getToken(token, Token::INTEGER); + setCurrentLine(token.value -1); + + getToken(token, Token::STRINGLITERAL); + try { + token.chopLiteral(); + } + catch(Exception &) { + token.assign("Unknown"); + } + setStreamIdentifier(token); + + return true; + } + + //pragmaディレクティブの解析 + if(directive.compare("pragma") == 0) + { + getToken(directive); + token += " "; + token += directive; + + if((scope = Directive::container().find(directive)) != Directive::container().end()) + { + (*scope).second->body(directive, *Container, *this, string("")); + + //余分なトークンの読み飛ばし + if(!TokenStack.empty()) + { + do { + token = TokenStack.front(); + TokenStack.pop_front(); + } while(!TokenStack.empty() && !allow_space && token.type == Token::SPACE); + + return true; + } + } + } + + //includeディレクティブの解析 + if(directive.compare("include") == 0) + { + cerr << getStreamLocation() << Message(": Configurator found 'include' directive\nKernel configuration file must be preprocessed.\n",": #includeディレクティブを発見しました\n カーネル構成ファイルはCプリプロセッサを通過させる必要があります\n"); + ExceptionMessage("Illegal kernel configuration file","不正なカーネル構成ファイル").throwException(); + } + + putBack(directive); + return false; +} + + + /* + * 空白文字の切出し + * ・スペース, タブ ・#で始まって改行まで ・C言語のコメントブロック + * ・2連のスラッシュ(//)から改行まで + * ・上の4つを組み合わせたもの + */ +bool Parser::getWhitespace(Token & token, int ch, bool allow_space) +{ + int prev; + + token.type = Token::SPACE; + switch(ch) + { + case '/': + ch = getChar(); + + switch(ch) + { + /* コメントブロック */ + case '*': + token += "/*"; + prev = '\x0'; + while( ((ch = getChar()) != '/') || (prev!='*')) + { + token += static_cast(ch); + prev = ch; + } + token += static_cast(ch); + break; + + /* ダブルスラッシュ */ + case '/': + token += '/'; + do { + token += static_cast(ch); + } while( (ch = getChar()) != '\n' ); + break; + + /* ただ'/'で始まっただけでした */ + default: + putBack(ch); + return getOperator(token, '/');; + } + break; + + /* # で始まる行 */ + case '#': + /* ディレクティブが無効 or そんなディレクティブは知らない */ + if(! (isenabled(DIRECTIVE) && parseDirectives(token, ch, allow_space)) ) + { + //改行まで読み飛ばし + TokenStack.clear(); + do { + token += static_cast(ch); + ch = getChar(); + } while(ch != '\n'); + putBack(ch); + } + break; + + /* 俗に言う空白文字 */ + case ' ': + case '\t': + case '\n': + case '\r': + do { + token += static_cast(ch); + ch = getChar(); + } while((ch == ' ') || (ch == '\n') || (ch == '\r') || (ch == '\t')); + putBack(static_cast(ch)); + break; + } + return true; +} + + /* + * 整数値の切出し (8/10/16進, 正数/負数) + * ・2進は不評だったのでやめました + */ +bool Parser::getInteger(Token & token, int ch) +{ + bool minus = false; + + if(ch == '-') + { + minus = true; + ch = getChar(); + if(ch < '0' || ch >'9') + { + putBack(static_cast(ch)); + return false; + } + token += "-"; + } + + token.type = Token::INTEGER; + token.value = 0; + + if(ch == '0') + { + token += static_cast(ch); + ch = getChar(); + if(ch == 'x' || ch == 'X') + { + token += static_cast(ch); + ch = getChar(); + while((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F')) + { + token += static_cast(ch); + if((ch -= '0') >= 10) + { + ch = ch + '0' - 'A' + 10; + if(ch >= 16) + ch = ch - ('a' - 'A'); + } + token.value = token.value * 16 + ch; + ch = getChar(); + } + }else + { + while(ch >= '0' && ch <= '7') + { + token += static_cast(ch); + token.value = token.value * 8 + ch - '0'; + ch = getChar(); + } + } + }else + { + do { + token += static_cast(ch); + token.value = token.value * 10 + ch - '0'; + ch = getChar(); + } while(ch >= '0' && ch <= '9'); + } + + /* integer-suffix */ + if(ch != -1) + { + bool unsigned_suffix = false; + bool long_suffix = false; + + int first_longsuffix; + + if(ch == 'u' || ch == 'U') + { + unsigned_suffix = true; + token += static_cast(ch); + ch = getChar(); + } + + if(ch == 'i' || ch == 'I') //i8, i16, i32, i64 + { + int first, second; + bool accept = false; + const signed char suffix_list[10] = { -1, '6', -1, '2', -1, -1, '4', -1, 0, -1}; //8, 16, 32, 64のみを受理 + + first = getChar(); + second = -1; + if(first >= '0' && first <= '9') + { + if(suffix_list[first - '0'] > 0) + { + second = getChar(); + if(second == suffix_list[first - '0']) + accept = true; + }else + if(suffix_list[first - '0'] == 0) + accept = true; + } + + if(!accept) + { + if(second != -1) + putBack(second); + putBack(first); + } else + { + token += static_cast(ch); + token += static_cast(first); + if(second != -1) + token += static_cast(second); + ch = getChar(); + } + } else + { + if(ch == 'l' || ch == 'L') + { + first_longsuffix = ch; + long_suffix = true; + + token += static_cast(ch); + ch = getChar(); + if(ch == first_longsuffix) + { + token += static_cast(ch); + ch = getChar(); + } + } + + if(!unsigned_suffix && (ch == 'u' || ch == 'U')) + { + token += static_cast(ch); + ch = getChar(); + } + } + } + + if(minus) + token.value = - token.value; + + if(ch != -1) + putBack(static_cast(ch)); + + return true; +} + + + /* + * オペレータ(特殊文字の組合せからなるトークン)の切出し + */ +bool Parser::getOperator(Token & token, int ch) +{ + const char * work; + + /* chがオペレータ文字であるかどうか確かめる */ + for(work = Operator;*work != '\x0' && *work != ch;work++); + if(*work == '\x0') + return false; + + /* 後続する文字もオペレータ文字であるかどうか確かめる */ + do { + token += static_cast(ch); + ch = getChar(); + for(work = Operator;*work != '\x0' && *work != ch;work++); + } while(*work != '\x0'); + + putBack(ch); + token.type = Token::OPERATOR; + return true; +} + + + /* + * 文字列リテラル (ダブルクォートで括られた文字) + * ・シングルクォートも許すようにした + * + * VisualStudio6.0でコンパイルした場合、改行がLFのファイルに対してtellg後に + * getするとEOFが返るため、同処理をコメントアウトしておく。 + */ +bool Parser::getStringLiteral(Token & token, int delimitor) +{ + int ch; + int prev; + + ch = delimitor; + + token.value = 1; + token.type = Token::STRINGLITERAL; + token.assign(""); + token += static_cast(ch); + + while(!current->stream->bad() && !current->stream->eof()) + { + prev = ch; + ch = getChar(); + token += static_cast(ch); + token.value ++; + + if(ch == delimitor && prev != '\\') + return true; + } + + //いったん閉じて再オープンして、リテラル開始の " の次に移動 + + ExceptionMessage(ExceptionMessage::FATAL, "Unterminated string literal appeared.","閉じられていない文字リテラルを検出しました").throwException(); + return false; +} + + + /* + * トークンの切出し + */ +enum Token::tagTokenType Parser::getToken(Token & token, bool allow_space) +{ + int ch; + const char * work; + + do { + token.erase(); + token.type = Token::ERROR; + token.value = 0; + + //トークンスタックから切り出す + if(!TokenStack.empty()) + { + do { + token = TokenStack.front(); + TokenStack.pop_front(); + } while(!TokenStack.empty() && !allow_space && token.type == Token::SPACE); + + if(!allow_space && token.type != Token::SPACE) + return token.type; + } + + //ストリームから切り出す + if(current == NULL || current->stream == NULL || current->stream->bad()) + { + token.assign(""); + return (token.type = Token::EOS); + } + + ch = getChar(); + + //カレントのストリームが空になった + if(ch == -1) + { + //ファイルスタックから次のストリームを取る + if(!fileStack.empty()) + { + if(current->stream != &cin) + delete current->stream; + delete current; + + current = *fileStack.begin(); + fileStack.pop_front(); + }else + { + token.assign(""); + return (token.type = Token::EOS); + } + } + + //First(whitespaces) is [ \n\t\r/#] + if( (ch == ' ') || (ch == '\t') || (ch == '\n') || (ch == '\r') || (ch == '/') || (isHeadofLine && ch == '#')) + { + if(ch == '\n') + isHeadofLine = true; + + if(getWhitespace(token, ch, allow_space)) + if((token == Token::SPACE && allow_space) || !(token == Token::SPACE || token == Token::ERROR)) + return token.type; + + continue; + }else + break; + }while(true); + + isHeadofLine = false; + + token.line = current->line; + + //First(identifier) is [a-zA-Z_] + if( (ch >='a' && ch <= 'z') || (ch >='A' && ch <= 'Z') || (ch == '_') ) + if(getIdentifier(token, ch)) + return Token::IDENTIFIER; + + //First(integer) is [\-0-9] + if( (ch >='0' && ch <='9') || (ch == '-') ) + if(getInteger(token,ch)) + return Token::INTEGER; + + //First(string) is ["'] + if( ch == '"' || ch == '\'') + if(getStringLiteral(token,ch)) + return Token::STRINGLITERAL; + + //Operator + if(getOperator(token,ch)) + return Token::OPERATOR; + + //Punctuator + work = Punctuator; + while(*work != '\x0') + if( *(work++) == ch ) + { + token += static_cast(ch); + return (token.type = Token::PUNCTUATOR); + } + + token += static_cast(ch); + token.type = Token::UNKNOWN; + return Token::UNKNOWN; +} + + + /* + * トークン用 ストリームオペレータ (主にテスト目的) + */ +ostream & operator << (ostream & out, Token & src) +{ + switch(src.type) + { + case Token::IDENTIFIER: + out << ""; return out; + case Token::ERROR: + out << ""; return out; + default: + out << "(src) << "]("<"; +} + + /* + * 予約語の切出し(というよりも確認) + */ +void Parser::getToken(const char * term) throw(Exception) +{ + Token token; + + if(term == NULL) + ExceptionMessage("Internal: GetToken received an empty string as reserved word.","内部エラー: GetTokenに空文字列が渡されました").throwException(); + + getToken(token, false); + if(token.compare(term) != 0) { + lastErrorToken = token; + ExceptionMessage("Token [%] should be replaced by [%]","字句[%]は[%]であるべきです") << token << term << throwException; + } +} + +void Parser::getToken(const char * first, const char * second, const char * third, const char * fourth) throw(Exception) +{ + getToken(first); + if(second != NULL) + getToken(second); + if(third != NULL) + getToken(third); + if(fourth != NULL) + getToken(fourth); +} + +string Parser::getStreamLocation(void) +{ + list::iterator scope; + + string location; + char buffer[16]; + + if(current == 0) + return string(""); + + ::sprintf(buffer, ":%d", current->line); + location += current->identifier; + location += buffer; + + if(!fileStack.empty()) + { + location += " (included at "; + + scope = fileStack.begin(); + while(scope != fileStack.end()) + { + ::sprintf(buffer, ":%d, ", (*scope)->line); + location += (*scope)->identifier; + location += buffer; + + ++ scope; + + } + + location.erase(location.size()-2); + location += ")"; + } + + return location; +} + +void Parser::pushStream(const std::string & filename, std::string strid) +{ + fstream * fin; + + if(current != 0) + fileStack.push_front(current); + + fin = new fstream(filename.c_str(),ios::in); + + if(fin->is_open()) + { + if(strid.size() == 0) + strid = filename; + + current = new tagFile; + current->stream = fin; + current->identifier = strid; + current->line = 1; + }else + { + ExceptionMessage("File operation failure : [%]","ファイル操作に失敗しました [%]") << filename << throwException; + delete fin; + } +} + +void Parser::pushStdStream(std::string strid) +{ + stringstream * work = new stringstream; + char buffer[1024]; + int count; + + //標準入力の情報をすべて取り込む (エラー対処用に seekg/tellg を使いたい) + do { + cin.read(buffer, 1024); + count = cin.gcount(); + work->write(buffer, count); + } while(count != 0); + + if(current != 0) + fileStack.push_front(current); + + current = new tagFile; + current->stream = work; + current->identifier = strid; + current->line = 1; +} + +string * Parser::setLogBuffer(string * buffer) +{ + string * old = LogBuffer; + LogBuffer = buffer; + PutBackCount = 0; + return old; +} + +streampos Parser::getLogBufferPos(int offset) +{ + streampos pos; + + pos = 0; + if(LogBuffer != 0) + pos = LogBuffer->size(); + pos += static_cast(offset - PutBackCount); + return pos; +} + +#ifdef CALL_EXTERNAL_PROGRAM +void Parser::doPreProcess(const char * cmd) +{ + string tempfilename; + char buffer[1024]; + int count; + fstream tempfile; + string work; + stringstream * stream; + + if(current == NULL || current->stream == NULL) + ExceptionMessage("No stream specified for processing","処理対象となるストリームが設定されていません").throwException(); + + + /* 今のストリームの内容をすべてテンポラリに書き出す */ + + strcpy(buffer,"cfgXXXXXX"); + mktemp(buffer); + + tempfilename.assign(buffer); + tempfile.open(tempfilename.c_str(),ios::out); + + if(!tempfile.is_open()) + ExceptionMessage("Failed to open a temporary file","テンポラリファイルの作成に失敗しました").throwException(); + + do { + current->stream->read(buffer, 1024); + count = current->stream->gcount(); + tempfile.write(buffer, count); + } while(count != 0); + tempfile.close(); + + + /* ストリーム差し替え */ + + preprocessname = tempfilename; + originalname = current->identifier; + + if(current->stream != &cin) + delete current->stream; + stream = new stringstream; + current->stream = stream; + + + /* プリプロセッサの起動 & 出力の取り込み */ + + work = string(cmd) + " " + tempfilename; + VerboseMessage(" Start the external preprocessor [%]\n"," 外部プログラムを起動します [%]\n") << work; + + FILE * pipe = popen(work.c_str(),"r"); + while(feof(pipe) == 0) + stream->put((char)fgetc(pipe)); + + pclose(pipe); + remove(tempfilename.c_str()); + isHeadofLine = true; +} +#else +void Parser::doPreProcess(const char * cmd) +{} +#endif /* CALL_EXTERNAL_PROGRAM */ + + +ParseUnit::ParseUnit(void * _container, const char * name) +{ + map * container; + string work(name); + string apiname; + string::size_type i,j; + + i = 0; + container = reinterpret_cast *>(_container); + + do { + j = work.find_first_of(',', i); + apiname = work.substr(i, j-i); + + if(container->find(apiname) != container->end()) + ExceptionMessage("Multiple registration of [%]\n","[%]が重複して登録されようとしています") << apiname << throwException; + (*container)[apiname] = this; + i = j + 1; + }while(j != string::npos); +} + +void ParseUnit::printList(void * _container) +{ + int i; + map * container; + map::iterator scope; + + container = reinterpret_cast *>(_container); + if(container->empty()) + { + cerr << " " << Message("None of element registed\n", "登録されている要素はありません\n"); + return; + } + + i = 0; + scope = container->begin(); + while(scope != container->end()) + { + cerr << '[' << (*scope).first << "] "; + + if(i++ >= 6) + { + i = 0; + cerr << '\n'; + } + + ++ scope; + } + + if(i != 0) + cerr << '\n'; +} + +Token & ParseUnit::parseParameter(Parser & p) +{ + static Token result; + Token token; + int nest = 0; + + result.type = Token::ERROR; + result.value = 0; + result.assign(""); + + do + { + p.getToken(token); + if(token == Token::PUNCTUATOR) + { + if(token.compare("(") == 0) + nest ++; + else if(token.compare(")") == 0) + nest --; + else if(nest == 0) + break; + if(nest < 0) + ExceptionMessage("')' appeared before '('.","対応しない閉じ括弧があります").throwException(); + } + + if(result == Token::ERROR) + result = token; + else + { + result.type = Token::STRING; + result += ' '; + result += token; + } + + }while(true); + + p.putBack(token); + result.trim(); + return result; +} + +int ParseUnit::parseParameters(Parser & p, Directory * container, int min, int max) +{ + Token work; + int count = 0; + + if(max == 0) + max = min; + + do + { + Token & token = parseParameter(p); + if(token.type == Token::ERROR) + break; + + if(token == Token::INTEGER) + container->addChild(new Directory(token.value)); + else + container->addChild(new Directory((string &)token)); + + count ++; + p.getToken(work); + }while(work.compare(",")==0 && count < max); + + if(count < min) + ExceptionMessage("Too few parameters [%/%]","パラメータの数が少なすぎます [%/%]") << count << min << throwException; + + p.putBack(work); + return count; +} + +int ParseUnit::parseParameters(Parser & p, Directory * container, const char * paramlist) +{ + Token work; + int count; + string list; + string key; + string::size_type head,tail; + + list.assign(paramlist); + + count = 0; + head = 0; + tail = list.find_first_of(','); + key = list.substr(head,tail-head); + + do + { + if(head == string::npos) + ExceptionMessage("Too many parameters","パラメータの数が多すぎます").throwException(); + + Token & token = parseParameter(p); + if(token.type == Token::ERROR) + break; + + if(token == Token::INTEGER) + container->addChild(key,new Directory(token.value)); + else + container->addChild(key,new Directory((string &)token)); + + if(tail != string::npos) + { + head = tail + 1; + tail = list.find_first_of(',',head); + key = list.substr(head,tail != string::npos ? tail-head : string::npos); + count ++; + p.getToken(work); + }else + break; + }while(work.compare(",")==0); + + if(tail != string::npos) + ExceptionMessage("Too few parameters","パラメータの数が少なすぎます").throwException(); + + return count; +} + +//------ + +Directory * StaticAPI::last = NULL; + +map & StaticAPI::container(void) +{ + static map _container; + return _container; +} + +Directory * StaticAPI::allocate(Directory & container, const Token & token, const char * id, bool regist) +{ + static unsigned int assignment_count = 0; + Directory * node; + + if(!(token == Token::IDENTIFIER || token == Token::INTEGER)) + ExceptionMessage("Given token(%) is not suitable for an object identifier.","オブジェクトの識別名として利用できない字句(%)が指定されました") << token << throwException; + + if(regist && (token == Token::INTEGER && token.value <= 0)) + ExceptionMessage("Cannot assign an ID number less or equal to 0.","0以下のID番号を設定することはできません").throwException(); + + + node = container.findChild(id); + if(node != 0) + { + Directory::iterator scope; + + scope = node->begin(); + while(scope != node->end()) + { + if((*scope).first.compare(token) == 0) + ExceptionMessage("Identifier % is already used.","識別名%はすでに利用されています") << token << throwException; + ++ scope; + } + }else + node = container.addChild(id); + + node = node->addChild(token); + (*node)["#order"] = assignment_count++; + + if(token == Token::IDENTIFIER) + { + if(regist) + { + Directory * scope = container.openChild("/","identifier",token.c_str(),NULL); + if(*scope == Directory::INTEGER) + *node = scope->toInteger(); + } + }else + *node = token.value; + + last = node; + return node; +} + +//------ + +map & Directive::container(void) +{ + static map _container; + return _container; +} + +//------ + +ParserComponent::ParserComponent(void) throw() : Component(PARSER) +{} + +ParserComponent::~ParserComponent(void) throw() +{} + +void ParserComponent::parseOption(Directory & container) +{ + if(findOption("h", "help")) + { + cerr << Message( + "Static API parser\n" + " -s, --source=filename : Specify the source file\n" + " -idir ,--ignore-directive : Ignore directives\n" + " -iapi ,--ignore-api : Ignore unknown static api\n" + " -t, --through : Get unprocessed APIs through\n" + " --print-api : Show registered static api list\n", + "静的APIパーサ\n" + " -s, --source=ファイル名 : 入力ファイル名を指定します\n" + " -idir ,--ignore-directive : ディレクティブの解析を行いません\n" + " -iapi, --ignore-api : 登録されていないAPIを無視します\n" + " -t, --through : 処理しなかったAPIを通過させます\n" + " --print-api : 登録されているAPIの一覧を表示します\n"); + return; + } + + if(findOption("-print-api")) + { + cerr << Message("List of Registerd Static API\n","静的API 一覧\n"); + StaticAPI::printList(); + return; + } + + checkOption("idir", "ignore-directive"); + checkOption("iapi", "ignore-api"); + checkOption("t", "through"); + + if(checkOption("s","source") || checkOption(DEFAULT_PARAMETER)) + activateComponent(); +} + +bool ParserComponent::parseStaticAPI(Parser & p, Directory & container, Token token, const string domain) +{ + bool isParseErrorOccured = false; + map::iterator api; + Directory * node = NULL; + + if(token.type != Token::IDENTIFIER) + return false; + + StaticAPI::clearLastObject(); + node = container[PARSERESULT].addChild(); + + try { + node->addChild("api",new Directory(token)); + node->addChild("begin",new Directory((long)p.getLogBufferPos(-(int)token.size()-1))); + if(!domain.empty()) + node->addChild("domain", new Directory(domain)); + + api = StaticAPI::container().find(token); + if(api == StaticAPI::container().end()) + { + if(ignoreUnknownAPI) + { + cerr << Message("%: Unknown static api % was ignored. (skipped)\n","%: 非登録のAPI % は無視されます\n") << p.getStreamLocation() << token; + do { + p.getToken(token); + }while(token.compare(";") != 0); + node->addChild("end",new Directory((long)p.getLogBufferPos())); + (*node) = (long)0; + return true; + } + ExceptionMessage("Static API [%] is not registered in the configurator", "静的API[%]は未登録です") << token << throwException; + } + + DebugMessage(" StaticAPI [%]\n") << (*api).first; + + p.getToken("("); + + (*api).second->body(token, container, p, domain); + + p.getToken(")"); + p.getToken(";"); + + node->addChild("end",new Directory((long)p.getLogBufferPos())); + (*node) = (long)1; + } + catch(Exception & e) + { + int offset; + string work; + work = p.getStreamLocation() + Message(":[Error] ",":[エラー] ").str() + e.getDetails(); + isParseErrorOccured = true; + + StaticAPI::dropLastObject(); + failCount ++; + + offset = 0; + token = p.getLastErrorToken(); + while (token != Token::ERROR && token != Token::EOS) + { + if( token == ";" ) + break; + + //読み出したトークンが静的APIと同じ名前なら きっとセミコロン忘れ + api = StaticAPI::container().find(token); + if(api != StaticAPI::container().end()) + { + cerr << Message("\n","<次のエラーは直前行の';'忘れによる可能性が高いです>\n"); + offset = -(int)token.size(); + p.putBack(token); + break; + } + + p.getToken(token); + } + + node->addChild("end",new Directory((long)p.getLogBufferPos(offset))); + (*node) = (long)0; + + cerr << work << '\n'; + + ExceptionMessage("Fatal error on Static API parsing","静的APIの構文解析に失敗しました").throwException(); + } + + return true; +} + +/* + * 処理できなかったAPIを標準出力に吐き出す + */ +void ParserComponent::throughConfigurationFile(string & log, Directory & container) +{ + Directory * node; + string::size_type pos; + string::size_type begin; + string::size_type end; + + pos = 0; + end = 0; + + node = container[PARSERESULT].getFirstChild(); + while(node != NULL) + { + begin = static_cast((*node)["begin"].toInteger()); + end = static_cast((*node)["end"].toInteger()); + + if(pos < begin) + cout << log.substr(pos, begin - pos); + + if(node->toInteger() == 0) + { + cout << log.substr(begin, end - begin); + }else + { + for(pos = begin; pos < end; ++pos) + if( log.at(pos) == '\n' ) + cout << '\n'; + } + node = node->getNext(); + } + + if(end < log.size()) + cout << log.substr(end); + + ExceptionMessage("","").throwException(); +} + + +void ParserComponent::body(Directory & container) +{ + Token token; + Parser p(container); + string logbuffer; + OptionParameter::OptionItem item; + unsigned int itemcount = 0; + + failCount = 0; + + //idirオプションの処理 + if(findOption("idir","ignore-directive")) + p.disable(Parser::DIRECTIVE); + + ignoreUnknownAPI = findOption("iapi", "ignore-api"); + + if(findOption("t","through")) + { + p.setLogBuffer(&logbuffer); + ignoreUnknownAPI = true; + } + + //入力ソース + item = getOption("s", "source"); + item.mergeItem(getOption(DEFAULT_PARAMETER)); + if(item.countParameter() == 0) + { + p.pushStdStream(Message("Standard Input","標準入力").str()); + VerboseMessage("Starting parse with standard input\n","標準入力からの字句解析を開始しました\n"); + } + + try{ + do { + if(item.hasParameter()) + { + VerboseMessage("Starting parse with file[%]\n","ファイル[%]の字句解析を開始しました\n") << item[itemcount]; + p.pushStream(item[itemcount]); + } + + this->parse(p, container); + + if(p.getToken(token) != Token::EOS) + ExceptionMessage("Buffer has remaining tokens, parsing is not yet finished", "パースが中断されました").throwException(); + + if(failCount != 0) + ExceptionMessage("Total % failures found in this configuration.","%個の障害があります") << failCount << throwException; + + VerboseMessage("Parse finished\n","字句解析は正常に終了しました\n"); + + } while(++itemcount < item.countParameter()); + + if(findOption("t","through")) + throughConfigurationFile(logbuffer,container); + + container[PARSERESULT].erase(); + } + catch(Exception & e) + { + string work; + + work = p.getStreamLocation() + Message(":[Error] ",":[エラー] ").str() + e.getDetails(); + ExceptionMessage(work.c_str()).throwException(); + } +} + + // オプションノードから割付方法を取得する +enum Common::tagAssignmentOrder Common::parseOrder(Directory * node) +{ + Directory * scope; + int i; + + //割当パラメータ解析 + i = FCFS; + if(node != 0) + { + scope = node->getFirstChild(); + while(scope != 0) + { + string param = scope->toString(); + if(param.compare("alphabetic") == 0 || param.compare("ALPHABETIC") == 0) + i = (i & 0xf0) | ALPHABETIC; + else if(param.compare("fcfs") == 0 || param.compare("FCFS") == 0) + i = (i & 0xf0) | FCFS; + else if(param.compare("reverse") == 0 || param.compare("REVERSE") == 0) + i |= REVERSE; + + scope = scope->getNext(); + } + } + + return static_cast(i); +} + + // オプションノードから割付方法を取得する +enum Common::tagAssignmentOrder Common::parseOrder(OptionParameter::OptionItem item) +{ + Directory node; + unsigned int i; + + for(i=0;i idpool; + map sorter; + map::iterator p_sorter; + int i; + + //下準備 + node = container.findChild(top,category,NULL); + if(node == 0) + return 0; + + for(i=1;i< (signed int) node->size() + 32; i++) + idpool.insert(i); + + //割付順の決定と,割当済みIDの削除 + i = 0; + scope = node->getFirstChild(); + while(scope != 0) + { + if( *scope == Directory::INTEGER ) + idpool.erase(*scope); + else + { + //重複名称の存在チェック + work = container.openChild("/","identifier",scope->getKey().c_str(),NULL); + if( *work == Directory::INTEGER) + { + VerboseMessage("Assigning the same ID (%) since the name (%[%]) is duplicated\n","ID番号(%)を異種同名のオブジェクト(%[%])に割り当てます.\n") << work->toInteger() << scope->getKey() << category; + idpool.erase(*scope = work->toInteger()); + } else + { + //割当方法に従って割当候補に追加 + switch(order) + { + case ALPHABETIC: + sorter[i++] = scope; + break; + case REVERSE_ALPHABETIC: + sorter[i--] = scope; + break; + case FCFS: + default: + sorter[scope->openChild("#order")->toInteger()] = scope; + break; + case REVERSE_FCFS: + sorter[-scope->openChild("#order")->toInteger()] = scope; + break; + } + } + } + scope = scope->getNext(); + } + + //ID割当 + p_sorter = sorter.begin(); + while(p_sorter != sorter.end()) + { + scope = (*p_sorter).second; + if( !(*scope == Directory::INTEGER) ) + { + i = *(idpool.begin()); + idpool.erase(idpool.begin()); + + work = container.openChild("/","identifier",scope->getKey().c_str(),NULL); + *work = i; + *scope = i; + } + ++ p_sorter; + } + + //割当表作成 + if(node->size() != 0 && VerboseMessage::getVerbose()) + { + VerboseMessage("Object ID assignment list [%]\n","オブジェクトID割付表 [%]\n") << category; + + sorter.clear(); + scope = node->getFirstChild(); + while(scope != 0) + { + sorter[scope->toInteger()] = scope; + scope = scope->getNext(); + } + + p_sorter = sorter.begin(); + while(p_sorter != sorter.end()) + { + VerboseMessage(" % : %\n") << setw(3) << (*p_sorter).first << (*p_sorter).second->getKey(); + ++ p_sorter; + } + } + + //妥当性の判定 + if((signed)node->size()+1 != *(idpool.begin())) + ExceptionMessage("Discontinuous % ID assignment occured","不連続なオブジェクトID(%)") << category << throwException; + + return node->size(); +} + diff --git a/uzume_prototype/kernel/cfg/base/parser.h b/uzume_prototype/kernel/cfg/base/parser.h new file mode 100644 index 0000000..683e990 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/parser.h @@ -0,0 +1,363 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: parser.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/parser.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#ifndef PARSER_H +#define PARSER_H + +#include "base/defs.h" + +#include "base/message.h" + +#include "base/directorymap.h" +#include "base/component.h" + +#include +#include +#include +#include +#include +#include + +#define PARSERESULT "/parse_result" + +#ifndef ERROR +#undef ERROR /* MinGW環境だとwingdi.hでERRORが定義される */ +#endif + +class Token : public std::string +{ + //メンバの隠蔽はしない +public: + enum tagTokenType + { + IDENTIFIER = 0x01, + INTEGER = 0x02, + STRINGLITERAL = 0x03, + STRING = 0x04, + OPERATOR = 0x05, + PUNCTUATOR = 0x06, + RESERVEDWORD = 0x07, + SPECIAL = 0x80, + SPACE = 0x81, + UNKNOWN = 0xfd, + ERROR = 0xfe, + EOS = 0xff //End of Stream + }; + + enum tagTokenType type; + long value; + unsigned int line; + + Token(void) { type = UNKNOWN; value = 0; }; + Token(const Token & src) { (*this) = src; }; + Token(enum tagTokenType, const char *); + + operator const enum tagTokenType (void) const { return type; }; + + Token & operator =(const Token & src); + bool operator == (const Token & src) const; + + Token & trim(void); + Token & chopLiteral(void); + void confirm(const char *) const; +}; + +class Parser +{ +public: + enum tagFunctionarities + { UNKNOWN = 0, DIRECTIVE = 1, LOGGING = 2 }; + + struct tagFile + { + std::string identifier; + std::istream * stream; + unsigned int line; + }; + +protected: + static const char * Punctuator; + static const char * Operator; + static Token lastErrorToken; + + std::string * LogBuffer; + unsigned int PutBackCount; + bool isHeadofLine; + + Directory * Container; + + tagFile * current; + std::list TokenStack; + std::list fileStack; + int functionalities; + + std::string preprocessname; //プリプロセッサを通すときに使った名前 + std::string originalname; //本来の名前 + + bool parseDirectives(Token &, int, bool); + + bool getIdentifier(Token &, int); + bool getWhitespace(Token &, int, bool); + bool getInteger(Token &, int); + bool getStringLiteral(Token &, int); + bool getOperator(Token &, int); + + int getChar(void); + void putBack(int); + + void initialize(void) { current = 0; functionalities = DIRECTIVE|LOGGING; PutBackCount = 0; LogBuffer = 0; isHeadofLine = true; }; + + bool isenabled(enum tagFunctionarities func) { return (functionalities & (int)func) != 0; }; + +public: + Parser(Directory & cnt) : Container(&cnt) { initialize(); }; + Parser(Directory * cnt) : Container(cnt) { initialize(); }; + ~Parser(void); + + void pushStream(const std::string & filename, std::string = ""); + void pushStdStream(std::string = "Standard Input"); + + void setStreamIdentifier(const std::string & id); + void setCurrentLine(unsigned int pos) { current->line = pos; }; + unsigned int getCurrentLine(void); + const char * getStreamIdentifier(void); + std::string getStreamLocation(void); + + enum Token::tagTokenType getToken(Token &,bool = false); + void getToken(Token &,enum Token::tagTokenType, const char * = NULL); + void getToken(const char *) throw(Exception); + void getToken(const char *, const char * , const char * = 0, const char * = 0) throw(Exception); + + void putBack(Token &); + + static const Token & getLastErrorToken(void) { return lastErrorToken; }; + + void enable(enum tagFunctionarities func) { functionalities |= (int)func; }; + void disable(enum tagFunctionarities func) { functionalities &= ~(int)func; }; + + std::string * setLogBuffer(std::string * buffer); + std::streampos getLogBufferPos(int offset = 0); + + void doPreProcess(const char * cmd); +}; + + +//--- + +class ParseUnit +{ +protected: + static Token & parseParameter(Parser &); + static int parseParameters(Parser &, Directory *, int, int=0); + static int parseParameters(Parser &, Directory *, const char *); + +public: + ParseUnit(void *, const char *); + virtual ~ParseUnit(void) {}; + + const char * getIdentifier(void) const; + virtual void body(const std::string &, Directory &, Parser &, const std::string &) =0; + + static void printList(void * container); +}; + +#define __DECLARE_PARSEUNIT(x,y,z) class x##_##y : public x { public: x##_##y(void) : x(z) {}; protected: virtual void body(const std::string &, Directory &, Parser &, const std::string &); } instance_of_##x##_##y; void x##_##y::body(const std::string & identifier, Directory & container, Parser & p, const std::string & domain) + +//--- + +class StaticAPI : public ParseUnit +{ +protected: + static Directory * last; + Directory * allocate(Parser & p, Directory &, const Token &, const char *, bool = true); + Directory * allocate(Directory &, const Token &, const char *, bool = true); + Directory * find (Directory &, const Token &, const char *); + +public: + StaticAPI(const char * name) : ParseUnit(&(container()), name) {}; + + static void printList(void) { ParseUnit::printList(&(container())); }; + static void clearLastObject(void) { last = NULL; }; + static void dropLastObject(void); + + static std::map & container(void); +}; + +#define DECLARE_API(x,y) __DECLARE_PARSEUNIT(StaticAPI,x,y) + +//--- + +class Directive : public ParseUnit +{ +public: + static std::map & container(void); + + Directive(const char * name) : ParseUnit(&(container()), name) {}; + static void printList(void) { ParseUnit::printList(&(container())); } +}; + +#define DECLARE_DIRECTIVE(x,y) __DECLARE_PARSEUNIT(Directive,x,y) + +//--- + +class ParserComponent : public Component +{ +protected: + int failCount; + bool ignoreUnknownAPI; + + static void throughConfigurationFile(std::string & log, Directory & container); + + virtual void parseOption(Directory &); + virtual void body(Directory &); + + bool parseStaticAPI(Parser & p, Directory & container, Token token, const std::string = ""); + + virtual bool parse(Parser & p, Directory & container) = 0; + +public: + ParserComponent(void) throw(); + virtual ~ParserComponent(void) throw(); +}; + +//--- + +namespace Common { + + enum tagAssignmentOrder { UNKNOWN, ALPHABETIC, FCFS, REVERSE=0x80, REVERSE_ALPHABETIC, REVERSE_FCFS }; + + enum tagAssignmentOrder parseOrder(Directory * order_option_node); + enum tagAssignmentOrder parseOrder(OptionParameter::OptionItem order_option_node); + int assignID(Directory & container, const char * category, const char * top, enum tagAssignmentOrder = FCFS); +} + +//--- + +inline Token::Token(enum tagTokenType type, const char * term) +{ + type = type; + value = 0; + assign(term); +} + +inline Token & Token::operator =(const Token & src) +{ + type = src.type; + value = src.value; + line = src.line; + assign(src); + return *this; +} + +inline bool Token::operator ==(const Token & src) const +{ + if(type != src.type) + return false; + if(type == Token::INTEGER && value != src.value) + return false; + else + if(compare(src) != 0) + return false; + + return true; +} + +inline void Token::confirm(const char * str) const +{ + if(compare(str) != 0) + ExceptionMessage("Illegal token (%) appears during parse process.","字句解析の途中で不正なトークン(%)が出現しました") << str << throwException; +} + +inline void Parser::getToken(Token & token, enum Token::tagTokenType type, const char * term) +{ + getToken(token, type == Token::SPACE); + + if(type == Token::STRING && token == Token::STRINGLITERAL) + token.chopLiteral(); + + if((type != token) || (term != NULL && token.compare(term) != 0)) + { + lastErrorToken = token; + ExceptionMessage("Parse error on reading [%]","字句解析のエラー [%]") << token << throwException; + } +} + +inline void Parser::putBack(Token & token) +{ TokenStack.push_front(token); } + +inline Directory * StaticAPI::find(Directory & container, const Token & token, const char * id) +{ + Directory * node; + + node = container.findChild(id,token.c_str(),NULL); + if(node == 0) + ExceptionMessage("The object %(%) does not exist.","オブジェクト%(%)は未定義です") << token << throwException; + + return node; +} + +inline void StaticAPI::dropLastObject(void) +{ + if(last != NULL) + { + last->erase(); + last = NULL; + } +} + +inline Directory * StaticAPI::allocate(Parser & p, Directory & container, const Token & token, const char * category, bool regist) +{ + Directory * node = allocate(container, token, category, regist); + if(node != 0) + (*node)["position"] = p.getStreamLocation(); + return node; +} + +inline void Parser::setStreamIdentifier(const std::string & id) +{ + if(preprocessname.compare(id) != 0) + current->identifier = id; + else + current->identifier = originalname; +} + +#endif + diff --git a/uzume_prototype/kernel/cfg/base/singleton.cpp b/uzume_prototype/kernel/cfg/base/singleton.cpp new file mode 100644 index 0000000..e608091 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/singleton.cpp @@ -0,0 +1,168 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2002-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: singleton.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/singleton.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#include "base/singleton.h" +#include "base/testsuite.h" + +using namespace std; + + //Singleton 静的変数 +bool SingletonBase::initialize = false; //初期化済みフラグ +bool SingletonBase::is_valid = true; //インスタンス生成成功フラグ + +struct SingletonBase::chain * SingletonBase::top = 0; //デストラクタチェーンのトップ + + +/************************************* テストスィート *************************************/ + +#ifdef TESTSUITE +#include "base/coverage_undefs.h" + + bool throw_DummyType; + class DummyType { + public: + static int counter; + int dummy_value; + int order; + SINGLETON_CONSTRUCTOR(DummyType) throw(bad_alloc) : dummy_value(0), order(++counter) + { + CHECKPOINT("DummyType::DummyType"); + if(throw_DummyType) + throw bad_alloc(); + } + ~DummyType(void) throw(int) + { + CHECKPOINT("DummyType::~DummyType"); + if(throw_DummyType) + throw 0; + if(counter-- != order) + CHECKPOINT("illegal order"); + } + }; + + SINGLETON_WRAPPER(DummyType2, DummyType) + + int DummyType::counter = 0; + + TESTSUITE(main, SingletonBase) + { + struct chain * old_top = top; + + top = 0; + + BEGIN_CASE("getInstance","getInstance") { + BEGIN_CASE("1","単一のインスタンスが生成される") { + TestSuite::clearCheckpoints(); + DummyType * dummy = Singleton::getInstance(); + TEST_CASE("1","コンストラクタが起動されている", TestSuite::isReached("DummyType::DummyType")); + + TestSuite::clearCheckpoints(); + TEST_CASE("2","インスタンスが生成される", Singleton::getInstance() == dummy); + TEST_CASE("3","2回目以降はコンストラクタが起動されない", !TestSuite::isReached("DummyType::DummyType")); + TEST_CASE("4","シングルトンの初期化が終わっている", SingletonBase::initialize); + TEST_CASE("5","デストラクタチェーンが構成されている", SingletonBase::top != 0); + } END_CASE; + } END_CASE; + + BEGIN_CASE("final_release","final_release") { + BEGIN_CASE("1","インスタンスが削除できる") { + TEST_CASE("0","[前提] 削除すべき要素がある", SingletonBase::top != 0); + + TestSuite::clearCheckpoints(); + SingletonBase::final_release(); + + TEST_CASE("1","デストラクタが起動されている", TestSuite::isReached("DummyType::~DummyType")); + TEST_CASE("2","デストラクタチェーンがなくなっている", SingletonBase::top == 0); + } END_CASE; + + BEGIN_CASE("2","順番が正しい") { + DummyType::counter = 0; + + DummyType * dummy = Singleton::getInstance(); + DummyType2 * dummy2 = Singleton::getInstance(); + + TEST_CASE("0","[前提] 生成順序が正しい", dummy->order == 1 && dummy2->order == 2); + + TestSuite::clearCheckpoints(); + SingletonBase::final_release(); + + TEST_CASE("1","デストラクタが起動されている", TestSuite::isReached("DummyType::~DummyType")); + TEST_CASE("2","デストラクタチェーンがなくなっている", SingletonBase::top == 0); + TEST_CASE("3","破棄順序が正しい", !TestSuite::isReached("illegal order")); + } END_CASE; + + } END_CASE; + + BEGIN_CASE("getInstance","getInstance") { + BEGIN_CASE("1","生成時に例外") { + BEGIN_CASE("1","getInstance()") { + throw_DummyType = true; + bool result = false; + try { Singleton::getInstance(); } + catch(...) { result = true; } + + TEST_CASE("1","例外は起こる",result); + TEST_CASE("2","デストラクタチェーンには何もつながっていない", SingletonBase::top == 0); + } END_CASE; + + SingletonBase::final_release(); + + BEGIN_CASE("2","getInstance(nothrow)") { + + DummyType * dummy; + throw_DummyType = true; + bool result = true; + try { dummy = Singleton::getInstance(nothrow); } + catch(...) { result = false; } + + TEST_CASE("1","例外は起きない",result); + TEST_CASE("2","NULLが返る", dummy == 0); + TEST_CASE("3","デストラクタチェーンには何もつながっていない", SingletonBase::top == 0); + } END_CASE; + } END_CASE; + } END_CASE; + + top = old_top; + } + +#endif + + + diff --git a/uzume_prototype/kernel/cfg/base/singleton.h b/uzume_prototype/kernel/cfg/base/singleton.h new file mode 100644 index 0000000..e0f1d67 --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/singleton.h @@ -0,0 +1,317 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: singleton.h,v 1.3 2012/06/17 00:24:19 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/singleton.h,v 1.3 2012/06/17 00:24:19 suikan Exp $ + +#include "base/testsuite.h" + +#ifndef SINGLETON_H +#define SINGLETON_H + +#ifdef _MSC_VER +# pragma warning(disable:4290) //C++ の例外の指定は無視されます。関数が __declspec(nothrow) でないことのみ表示されます。 +# pragma warning(disable:4291) //初期化コ−ドが例外をスロ−すると、'new' 演算子を使用しているとメモリを解放しません。 +# pragma warning(disable:4786) //デバッグ情報で識別子が 255 文字に切り捨てられました。 +#endif + +#include +#include +#include + +/* + * シングルトンパターン 実装 + */ + + //シングルトン基底クラス + // #gccがfriend class Singletonを食ってくれないので基底を作る +class SingletonBase { +public: + //デストラクタのチェーン + struct chain { + struct chain * next; + void (*destructor)(void); + }; + + //シングルトンでインスタンスを生成したことを示すためのクラス + // このクラスはSingletonからしか実体化できないので、 + // ほかのクラスからこれを引数にもつコンストラクタを使用することはできない + class SingletonConstructionLocker + { + friend class SingletonBase; + protected: + SingletonConstructionLocker() {} + }; + +private: + static bool initialize; //初期化済みか (atexitを呼んだかどうか) + static bool is_valid; //生成に失敗したシングルトンガあるかどうか + static struct chain * top; //デストラクタチェーン + + //デストラクタの起動 + static void final_release(void) throw() + { + //先頭から削除 (先入れ後出し) + while(top != 0) { + struct chain * node = top; + top = node->next; + + (*node->destructor)(); + + delete node; + } + } + +protected: + //チェーンにデストラクタを追加 + static bool addDestructor(void (* destructor)(void)) throw() + { + bool result = false; + SingletonBase::chain * node = new(std::nothrow) SingletonBase::chain; + if(node != 0) { + + //新しい要素を先頭に追加 + node->next = top; + node->destructor = destructor; + + top = node; + + result = true; + + //要素破棄のために最後に破棄ルーチンを起動させる + if(!initialize) { + atexit(final_release); + initialize = true; + } + } + return result; + } + + //SingletonConstructionLockerファクトリ + inline static SingletonConstructionLocker getLocker(void) + { return SingletonConstructionLocker(); } + +public: + //生成に失敗したシングルトンがないことを取得 + static bool isValid(void) throw() + { return is_valid; } + +#ifdef TESTSUITE + /* + * コンテキストチェーン (テスト用シングルトンコンテキスト退避チェーン) + */ + class ContextChain { + protected: + struct chain { + struct chain * next; + void * context; + void (*restore)(void * & context) throw(); + void (*renew)(void) throw(); + void (*clear)(void); + } * top; + + public: + ContextChain(void) throw() : top(0) + {} + + ~ContextChain(void) throw() + { restoreContext(); } + + /* コンテキストの復帰 */ + void restoreContext(void) throw() + { + while(top != 0) { + struct chain * node = top; + top = top->next; + + (*node->restore)(node->context); + delete node; + } + } + + /* 全てのインスタンスを再生成 */ + void renewInstance(void) throw(std::bad_alloc) + { + struct chain * node = top; + while(node != 0) { + (*node->renew)(); + node = node->next; + } + } + + /* 全てのインスタンスを破棄 */ + void clearInstance(void) throw(std::bad_alloc) + { + struct chain * node = top; + while(node != 0) { + (*node->clear)(); + node = node->next; + } + } + + /* コンテキストの退避 */ + template void saveContext(void) throw(std::bad_alloc) + { + struct chain * node = new struct chain; + + node->next = top; + node->restore = reinterpret_cast(Singleton::restoreContext); + node->renew = Singleton::renewInstance; + node->clear = Singleton::clearInstance; + + Singleton::saveContext(reinterpret_cast::Context &>(node->context)); + + top = node; + } + }; +#endif + + + TESTSUITE_PROTOTYPE(main) +}; + + +template +class Singleton : SingletonBase +{ +protected: + Singleton(void); + ~Singleton(void); + + static T * instance; + + //デストラクタ + static void destructor(void) throw() + { + if(instance != 0) { + try{ delete instance; } catch(...) {} + instance = 0; + } + } + + //インスタンスの生成 (インスタンス生成 + デストラクタ登録 + エラー処理) + static T * createInstance(std::nothrow_t) throw() + { + T * instance = 0; + try { + instance = new(std::nothrow) T(getLocker()); + + if(instance != 0) { + if(!addDestructor(destructor)) + throw false; //catch節を実行させたい + } + } + catch(...) { + if(instance != 0) { + try { delete instance; } catch(...) {} + instance = 0; + } + } + return instance; + } + + //インスタンス生成 (bad_alloc例外をスローする実装) + static T * createInstance(void) throw(std::bad_alloc) + { + instance = createInstance(std::nothrow); + if(instance == 0) + throw std::bad_alloc(); + return instance; + } + +public: + //インスタンスの取得 + inline static T * getInstance(void) throw(std::bad_alloc) + { + if(instance == 0) + instance = createInstance(); + return instance; + } + + //インスタンスの取得 + inline static T * getInstance(std::nothrow_t) throw() + { + if(instance == 0) + instance = createInstance(std::nothrow); + return instance; + } + +#ifdef TESTSUITE /* テスト用 */ + + typedef T * Context; //退避用 + + //新しいインスタンスの生成 + static void renewInstance(void) throw(std::bad_alloc) + { + destructor(); //今のインスタンスを破棄 + instance = new T(getLocker()); //新しいインスタンスを生成 (デストラクタが登録されてしまうのでcreateInstanceを呼んではいけない) + } + + //インスタンス破棄 + static void clearInstance(void) throw() + { destructor(); } + + //コンテキスト退避 + static void saveContext(Context & context) throw() + { + context = instance; + instance = 0; + } + + //コンテキスト復帰 + static void restoreContext(Context & context) throw() + { + destructor(); //今のインスタンスを破棄 + instance = context; //退避したインスタンスを復帰 + } + +#endif /* TESTSUITE */ + +}; + + + + //Singleton 静的変数 +template T * Singleton::instance = 0; + +#define SINGLETON_CONSTRUCTOR(x) explicit x(const SingletonBase::SingletonConstructionLocker &) +#define SINGLETON_CONSTRUCTOR_(x) explicit x(const SingletonBase::SingletonConstructionLocker & _singleton) + +#define SINGLETON_WRAPPER(derived, base) class derived : public base { public: SINGLETON_CONSTRUCTOR_(derived) throw() : base(_singleton) {} }; + +#endif /* SINGLETON_H */ + diff --git a/uzume_prototype/kernel/cfg/base/testsuite.cpp b/uzume_prototype/kernel/cfg/base/testsuite.cpp new file mode 100644 index 0000000..c4c6fdf --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/testsuite.cpp @@ -0,0 +1,376 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: testsuite.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/testsuite.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#include "base/testsuite.h" + +#include "base/coverage_defs.h" +#include "base/coverage_undefs.h" + +#ifdef TESTSUITE + +#undef main //テストスィート用のmainを定義するのでundefする +#undef cin +#undef cout +#undef cerr + +#include //EXIT_SUCCESS|EXIT_FAILURE用 +#include //作業関数用 +#include +#include + +using namespace std; + +/* ストリーム入換え用の変数定義 */ +namespace std { + stringstream _cin; + stringstream _cout; + stringstream _cerr; +} + +/* + * テストスィートの実行制御クラス ; class TestSuiteControl + */ + + + //コンストラクタ +TestSuiteControl::TestSuiteControl(ostream & _out, const char * _pattern) : target_session(_pattern), out(&_out), fail(false), verbose(false), case_count(0), fail_count(0) +{} + + //シナリオ名の取得 +string TestSuiteControl::get_suitename(const char * name) const +{ + string result; + list::const_iterator scope; + + scope = session.begin(); + while(scope != session.end()) { + result += *scope; + result += '.'; + ++ scope; + } + + if(name != NULL) + result += name; + + return result; +} + + + //テストシナリオの表題設定 (返却値 : 実行する必要があるかどうか) +bool TestSuiteControl::_enter_case(const char * session, const char * description, const char * filename, long lineno) +{ + bool result; + stringstream buf; + + //表題の設定 + current_session.assign(get_suitename(session)); + + //詳細情報の設定 + if(description != 0) + buf << description; + + //ファイル名 (filename:lineno) の生成 + if(filename != 0) { + string work(filename); + string::size_type pos; + + //フルパスで来たら短く切る + pos = work.find_last_of("/\\"); + if(pos != string::npos) + work.erase(0, pos + 1); + + buf << '(' << work; + if(lineno != -1) + buf << ':' << lineno; + buf << ')'; + } + current_description = buf.str(); + + //実行する必要の有無の確認 + result = (target_session.empty() || current_session.find(target_session) != string::npos); + + if(result) { + if(verbose) { + string indent; + indent.assign(2 * this->session.size(), ' '); + (*out) << indent << '[' << session << "] " << current_description << endl; + + //(*out) << '[' << current_session << "] " << current_description << endl; + } + + enter_session(session); + ++ case_count; + } + + return result; +} + + //テストセッション名 (シナリオプレフィクス) の設定 +void TestSuiteControl::enter_session(const string & _session) +{ session.push_back(_session); } + + //テストセッション名 (シナリオプレフィクス) の解除 +void TestSuiteControl::leave_session(void) +{ session.pop_back(); } + + //テストシナリオの失敗報告 +void TestSuiteControl::fail_in_suite(string msg) +{ + fail = true; + (*out) << "Failed : [" << current_session << "]\n " << current_description << endl; + if(!msg.empty()) + (*out) << " #" << msg << endl; + ++ fail_count; +} + + + //スィート情報コンストラクタ +TestSuite::SuiteContainerNode::SuiteContainerNode(const char * _session, SuiteFunction _suite) : session(_session), suite(_suite) +{} + + //スィート情報コンストラクタ +TestSuite::SuiteContainerNode::SuiteContainerNode(const SuiteContainerNode & src) : session(src.session), suite(src.suite) +{} + + //スィートの実行 +bool TestSuite::SuiteContainerNode::invoke(TestSuiteControl & suite_control) +{ + if(suite != 0) { + suite_control.enter_session(session); + (*suite)(suite_control); + suite_control.leave_session(); + } + + return !suite_control.is_failed(); +} + +/* + * テストスィート実行クラス + */ + + //コンストラクタ +TestSuite::TestSuite(const char * session, SuiteFunction suite) : fail(false) +{ Singleton::getInstance()->push_back(SuiteContainerNode(session, suite)); } + + + //デストラクタ +TestSuite::~TestSuite(void) +{} + + + //テストスィートの実行 (返却値:スィートを実行したかどうか) +bool TestSuite::performTestSuite(int flags, const char * pattern) +{ + bool result; + TestSuiteControl suite_control(cerr, pattern); + SuiteContainer * container; + SuiteContainer::iterator scope; + + //実行スィートリストの参照 + container = Singleton::getInstance(); + + //冗長出力設定 + if( (flags & VERBOSE) != 0 ) + suite_control.set_verbose(); + + //全登録スィートの実行 + scope = container->begin(); + while(scope != container->end()) { + + result = scope->invoke(suite_control); + + //いちいち止める or 通しで実行 + if( !result && (flags & THROUGH) == 0) + break; + + ++ scope; + } + + //エラーがなければOK表示 + if(!suite_control.is_failed()) + cerr << "OK (" << suite_control.countCases() << " passed)" << endl; + else + cerr << "Failed (" << suite_control.countFails() << '/' << suite_control.countCases() << ')' << endl; + + return !suite_control.is_failed(); //スィートを正常に実行できたらtrue +} + + + //登録されているトップレベルスィートの一覧表示 +void TestSuite::listTestSuite(void) +{ + SuiteContainer::iterator scope; + int count; + SuiteContainer * container; + + count = 0; + container = Singleton::getInstance(); + + scope = container->begin(); + while(scope != container->end()) { + cout << " "; + cout.width(3); + cout << count << ':' << scope->getName() << endl; + + ++ count; + ++ scope; + } + cout << "Total " << count << " sets of suite exist.\n"; +} + + + +/* + * チェックポイント用関数 + */ + +bool TestSuite::isReached(std::string checkname) +{ + set::iterator scope; + + scope = Singleton::getInstance()->find(checkname); + + return scope != Singleton::getInstance()->end(); +} + + +/* + * テストスィート実行用作業関数 + */ + + //ファイル内容比較 +bool TestSuite::compareFileContents(const char * filename, const char * filecontents, bool _remove) +{ + fstream file(filename,ios::in); + int ch; + bool result = true; + + //内容チェック + while(result && *filecontents != '\x0' && file.good()) { + ch = file.get(); + + if(ch != (int)*filecontents) + result = false; + + ++ filecontents; + } + + //EOFに達しているか + if(result) { + if(!file.good() || file.get() != EOF) + result = false; + } + + file.close(); + + if(_remove) + ::remove(filename); + + return result; +} + + +/* + * テストスィート実行用main関数 + */ +int main(int argc, char ** argv) +{ + int result; + int pos; + int flags; + string category; + + flags = TestSuite::DEFAULT; + + for(pos = 1; pos < argc; ++ pos) { + if(*argv[pos] == '-') { + switch(argv[pos][1]) { + case 'v': + flags |= TestSuite::VERBOSE; + break; + case 'V': + flags &= ~TestSuite::VERBOSE; + break; + case 't': + flags |= TestSuite::THROUGH; + break; + case 'T': + flags &= ~TestSuite::THROUGH; + break; + case 'l': + TestSuite::listTestSuite(); + return EXIT_SUCCESS; + case 'h': + cerr << "Usage : program (option) (suite)\n" + " -v, -V : Verbose output on(-v) / off(-V)\n" + " -t, -T : Go through with the suite, on(-t) / off(-T)\n" + " -l : List the top level suites\n"; + return EXIT_SUCCESS; + default: + cerr << "Unknown option [" << argv[pos] << "]\n"; + return EXIT_FAILURE; + } + } + else { + if(!category.empty()) { + cerr << "Two or more category specified.\n"; + return EXIT_FAILURE; + } + category.assign(argv[pos]); + } + } + + result = EXIT_FAILURE; + if(TestSuite::performTestSuite(flags, category.c_str())) + result = EXIT_SUCCESS; + +#ifdef COVERAGE + fstream fout("coverage.txt",ios::out); + if(fout.is_open()) { + Coverage::printCoverage(fout); + fout.close(); + } +#endif + + return result; +} + +#endif //TESTSUITE + diff --git a/uzume_prototype/kernel/cfg/base/testsuite.h b/uzume_prototype/kernel/cfg/base/testsuite.h new file mode 100644 index 0000000..700ce7d --- /dev/null +++ b/uzume_prototype/kernel/cfg/base/testsuite.h @@ -0,0 +1,330 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: testsuite.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * テストスィート実行補助 クラス/マクロライブラリ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/testsuite.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + + +#ifdef TESTSUITE + + //シナリオ終端マクロ(Exceptionクラスの有無によって中身を替えたいのでここにおく) +# undef END_CASE +# ifdef EXCEPT_H +# define END_CASE }catch(TestSuite::Fail & x) { _suite_control.fail_in_suite(x.getMessage()); } catch(Exception & exc) { _suite_control.fail_in_suite(string("不明な例外 : ") + exc.getDetails()); } catch(...) { _suite_control.fail_in_suite("テスト実行中に不明な例外を受け取ったため中断された"); } _suite_control.leave_case(); } +# else +# define END_CASE }catch(TestSuite::Fail & x) { _suite_control.fail_in_suite(x.getMessage()); } catch(...) { _suite_control.fail_in_suite("テスト実行中に不明な例外を受け取ったため中断された"); } _suite_control.leave_case(); } +# endif + +#endif + + +#ifndef TESTSUITE_H +#define TESTSUITE_H + + //テストスィートをかけるかどうか +//#define TESTSUITE + + +#if defined(TESTSUITE) //&& defined(_DEBUG) + + //ストリームの内容をテストで使いたいので入れ替える +#include +#define cin _cin +#define cout _cout +#define cerr _cerr + +#include + +namespace std { + extern stringstream _cin; + extern stringstream _cout; + extern stringstream _cerr; +} + +#include +#include +#include +#include + + + //標準のテストスィート関数のプロトタイプ宣言用マクロ +#define TESTSUITE_PROTOTYPE(suite) \ + public: \ + static void test_suite_##suite(TestSuiteControl & _suite_control); + + + //標準のテストスィート関数の定義用マクロ (わざとスィート実行の条件コンパイル用の定義名と同じ名前にする) +#undef TESTSUITE +#define TESTSUITE(suite,cls) \ + TestSuite TestSuite_##cls##_##suite(#cls "(" #suite ")", cls::test_suite_##suite); \ + void cls::test_suite_##suite(TestSuiteControl & _suite_control) + +#define TESTSUITE_(suite,cls,spr) \ + TestSuite TestSuite_##spr##_##cls##_##suite(#spr "::" #cls "(" #suite ")", spr::cls::test_suite_##suite); \ + void spr::cls::test_suite_##suite(TestSuiteControl & _suite_control) + + //多重実行防止用マクロ +#define PROCEED_ONCE static bool _proceed_once_flag_ = false; if(_proceed_once_flag_) return; else _proceed_once_flag_ = true; + + //シナリオ開始マクロ +#define BEGIN_CASE(x,y) if(_suite_control.enter_case(x,y,__FILE__,__LINE__)) { try { + + //シナリオ失敗マクロ +#define TEST_FAIL throw TestSuite::Fail(); +#define TEST_FAIL_(x) throw TestSuite::Fail(x); + + //短いシナリオ用マクロ +#define TEST_CASE(x,y,z) BEGIN_CASE(x,y) { if(!(z)) TEST_FAIL; } END_CASE +#define TEST_CASE_(x,y,z,u) BEGIN_CASE(x,y) { if(!(z)) TEST_FAIL_(u); } END_CASE + + //到達判定マクロ +#define CHECKPOINT(x) TestSuite::check(x); + + //シングルトン退避 +#define SINGLETON(x) Singleton::Context context; Singleton::saveContext(context); +#define SINGLETON_(x,y) Singleton::Context context_##y; Singleton::saveContext(context_##y); + +/* + * テストスィートの実行制御クラス + */ +class TestSuiteControl { +protected: + std::list session; //現在のセッション名スタック + + std::string target_session; //処理対象セッション名 + std::string current_session; //現在のスィートシナリオ名 + std::string current_description; //現在のスィートシナリオの説明 + std::ostream * out; //説明の出力先 + bool fail; //失敗したシナリオがあったかどうか + bool verbose; //冗長出力するか否か + + unsigned int case_count; //ケースの総数 + unsigned int fail_count; //失敗したケースの数 + + //シナリオ名の取得 + std::string get_suitename(const char * name = "") const; + + +public: + //コンストラクタ + TestSuiteControl(std::ostream & _out, const char * _pattern = ""); + + //テストシナリオの表題設定 (返却値 : 実行する必要があるかどうか) + bool _enter_case(const char * session, const char * description, const char * filename = "", long lineno = -1); + inline void leave_case(void) { leave_session(); } + + //シングルステップ実行時に中に飛び込まないためのラッパ + inline bool enter_case(const char * session, const char * description, const char * filename = "", long lineno = -1) + { return _enter_case(session, description, filename, lineno); } + + //テストセッション名 (シナリオプレフィクス) の設定/解除 + void enter_session(const std::string & session); + void leave_session(void); + + //テストシナリオの失敗報告 + void fail_in_suite(std::string msg=""); + + //失敗したシナリオの有無の確認 + inline bool is_failed(void) const + { return fail; } + + //冗長出力の設定 + inline void set_verbose(bool _verbose = true) + { verbose = _verbose; } + + //実行したテストケースの数 + inline unsigned int countCases(void) const + { return case_count; } + + //失敗したテストケースの数 + inline unsigned int countFails(void) const + { return fail_count; } +}; + + //シングルトンのテストスィートのためにここでインクルード +#include "base/singleton.h" + +/* + * テストスィート実行クラス + */ +class TestSuite { +public: + class Fail //テストケース失敗通知に用いる例外用クラス + { + protected: + std::string msg; + + public: + //コンストラクタ + Fail(std::string src = "") throw() : msg(src) {} + + //コピーコンストラクタ + Fail(const Fail & src) throw() : msg(src.msg) {} + + //メッセージを取得 + inline const std::string & getMessage(void) const throw() + { return msg; } + }; + + typedef void (*SuiteFunction)(TestSuiteControl &); + + /* クラス毎のテストスィートに関する情報を保持するクラス */ + class SuiteContainerNode + { + protected: + std::string session; + SuiteFunction suite; + + public: + //スィート情報コンストラクタ + SuiteContainerNode(const char * session, SuiteFunction suite); + SuiteContainerNode(const SuiteContainerNode & src); + + //スィートの実行 + bool invoke(TestSuiteControl & suite_control); + + //スィート名の取得 + inline const std::string & getName(void) const throw() + { return session; } + }; + + //実行すべきテストスィートを持つインスタンスのリストの型 + class SuiteContainer : public std::list + { public: SINGLETON_CONSTRUCTOR(SuiteContainer) {} }; + + /* 実行オプション */ + enum tagPerformOption { + THROUGH = 1, //すべて通しで実行する (いちいち止めない) + VERBOSE = 2, //冗長出力 + + DEFAULT = THROUGH + }; + + /* チェックポイントを格納するクラス */ + class Checkpoint : public std::set + { public: SINGLETON_CONSTRUCTOR(Checkpoint) throw() {} }; + +protected: + bool fail; //最後に実行したスィートが失敗したがどうかを保持する変数 + static bool starvated; //newに失敗するかどうか + +public: + //コンストラクタ + TestSuite(const char * session, SuiteFunction suite); + + //デストラクタ + ~TestSuite(void); + + //テストスィートの実行 (返却値:スィートが正しく実行されたかどうか) + static bool performTestSuite(int flags = THROUGH, const char * pattern = ""); + + //テストスィートの実行 (引数変換) + inline static bool performTestSuite(const char * pattern) + { return performTestSuite(THROUGH, pattern); } + + //登録されているトップレベルスィートの一覧表示 + static void listTestSuite(void); + + /* + * チェックポイント用関数 + */ + + //通過したことを報告 + inline static void check(std::string checkname) + { Singleton::getInstance()->insert(checkname); } + + //これまでに受けた報告を削除 + inline static void clearCheckpoints(void) + { Singleton::getInstance()->clear(); } + + //その位置に来たか + static bool isReached(std::string checkname); + + /* + * テスト用作業関数 + */ + + //ファイルの中身を開いてチェックする + static bool compareFileContents(const char * filename, const char * filecontents, bool remove = true); +}; + +/* + * スィート実行用main関数 + */ +extern int main(int argc, char ** argv); + +#define main pseudo_main //通常のmainを差し換え + + //簡易ソフトウェアトレース機能のインクルード +#include "base/coverage_defs.h" + +#else + +/*********************************************************************************************/ +/* + * テストを実行しないときのクラス定義 + */ + +#define TESTABLEOBJECT(x) +#define TESTABLEOBJECT_(x,y) +#define TESTSUITE_PROTOTYPE(x) +#define TESTSUITE_(x,y) +#define PROCEED_ONCE + +#define BEGIN_CASE(x,y) +#define END_CASE +#define TEST_FAIL + +#define CHECKPOINT(x) + +/* + * テストスィート実行クラス + */ +class TestSuite { +public: + //テストスィートの実行 (返却値:スィートを正しく実行したかどうか) + inline static bool performTestSuite(void) { return true; }; +}; + +#endif + +#endif /* TESTSUITE_H */ + diff --git a/uzume_prototype/kernel/cfg/jsp/jsp_check.cpp b/uzume_prototype/kernel/cfg/jsp/jsp_check.cpp new file mode 100644 index 0000000..38022fa --- /dev/null +++ b/uzume_prototype/kernel/cfg/jsp/jsp_check.cpp @@ -0,0 +1,771 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: jsp_check.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/jsp/jsp_check.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#include "base/defs.h" +#include "jsp/jsp_defs.h" +#include "base/message.h" +#include "base/component.h" +#include "base/filecontainer.h" + +#include +#include + +class ConfigurationChecker : public Component +{ +public: + + enum tagCheckLevel + { + UNKNOWN = 0, + LAZY = 1, /* 致命的 (行き過ぎ改造防止用) */ + STANDARD = 2, /* ITRON仕様の範囲 (改造を許容) */ + TOPPERS = 4, /* TOPPERS/JSPの範囲内 */ + RESTRICTED = 8, /* 片っ端から捕まえる */ + + NORMAL = 8 + }; + +protected: + enum tagCheckLevel current_level; + + unsigned int error_count; + std::string banner; + + void set_banner(Directory &, Formatter , const char *, int); + void notify(enum tagCheckLevel, Formatter , 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 &); + +public: + ConfigurationChecker(void) throw(); + ~ConfigurationChecker(void) throw() {} +}; + +//------------------------------------------------------ +using namespace std; + +static ConfigurationChecker instance_of_ConfigurationChecker; + +//------------------------------------------------------ + //ターゲットの同名の型よりも大きな型の定義 + // (注) 値比較, 演算が可能な型であること + +typedef int DT_INT; +typedef unsigned int DT_UINT; +typedef unsigned long DT_FP; +typedef unsigned long DT_VP_INT; +typedef unsigned long DT_VP; +typedef long DT_RELTIM; + +//------------------------------------------------------ + +ConfigurationChecker::ConfigurationChecker(void) throw() +{ + setBanner("--- TOPPERS/JSP Configuration Checker (ver 2.4) ---"); +} + +void ConfigurationChecker::set_banner(Directory & container, Formatter object, const char * type, int id) +{ + Directory * node; + char buffer[32]; + + banner = string(" ") + object.str() + " : "; + + sprintf(buffer, "id = %d", id); + + node = container.findChild(OBJECTTREE, type, NULL)->getFirstChild(); + while(node != 0 && node->toInteger() != id) + node = node->getNext(); + + if( node != 0 ) { + banner += node->getKey() + " (" + buffer + ") "; + + node = node->findChild("position"); + if(node != 0) + banner += string("at ") + node->toString(); + } + else + banner += buffer; + + if(VerboseMessage::getVerbose()) + { + cout << banner << endl; + banner.erase(); + } +} + +void ConfigurationChecker::notify(enum tagCheckLevel level, Formatter msg, bool error) +{ + if((level & current_level) != 0) + { + + 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 old_error_count = error_count; + + TargetVariable _kernel_tmax_tskid("_kernel_tmax_tskid"); + + Message object("Task","タスク"); + + if(!_kernel_tmax_tskid.isValid()) + ExceptionMessage( + "Internal error: Unknown symbol (Probably, Symbol table was stripped)", + "内部エラー: 不正なシンボル名 (実行形式がシンボルテーブルを含んでない可能性があります)").throwException(); + + if(*_kernel_tmax_tskid < 1) + { + notify(RESTRICTED, + Message(" [Task] : No tasks created\n"," [タスク] : タスクオブジェクトがありません\n")); + return true; + } + + TargetVariable tskatr("_kernel_tinib_table", "task_initialization_block::tskatr"); + TargetVariable task("_kernel_tinib_table", "task_initialization_block::task"); + TargetVariable ipriority("_kernel_tinib_table", "task_initialization_block::ipriority"); + TargetVariable texatr("_kernel_tinib_table", "task_initialization_block::texatr"); + TargetVariable stksz("_kernel_tinib_table", "task_initialization_block::stksz"); + + maxpri = container->getVariableInfo("TMAX_TPRI").value; + minpri = container->getVariableInfo("TMIN_TPRI").value; + + VerboseMessage("% object : % items\n","%オブジェクト : % 個\n") << object << *_kernel_tmax_tskid; + for(id = 1; id <= *_kernel_tmax_tskid; id++) + { + set_banner(parameter, object, TASK, id); + + /* + * 属性チェック + */ + + // 属性値が TA_HLNG|TA_ASM|TA_ACT 以外の値をとっている + if((*tskatr & ~0x3) != 0) + notify( STANDARD, + Message("Illegal task attribute (It should be ((TA_HLNG||TA_ASM)|TA_ACT))", + "不正なタスク属性 ((TA_HLNG||TA_ASM)|TA_ACT)以外")); + + // 属性値に TA_ASM が含まれている + if((*tskatr & 0x1) != 0) + notify( RESTRICTED, + Message("TA_ASM specified as task attribute takes no effect.", + "タスク属性にTA_ASMが指定されている")); + + /* 起動番地が0 */ + if(*task == 0) + notify(RESTRICTED, + Message("The address of task routine is equal to zero.", + "開始番地に0が設定されています")); + + /* + * 優先度チェック + */ + + // 最大優先度と最小優先度の設定がおかしい + if(maxpri < minpri) + notify(LAZY, + Message("Illegal Priority Settings found (TMAX_TPRI(%) < TMIN_TPRI).", + "初期優先度が最低優先度(%)を超えている") << minpri); + + // 優先度の範囲が[最小優先度, 最大優先度]の範囲を超えている + if(*ipriority > (signed)(maxpri - minpri)) + notify(TOPPERS, + Message("Initial priority is greater than maximum priority (%).", + "初期優先度が最大優先度(%)を超えている") << maxpri); + if(*ipriority < 0) + notify(STANDARD, + Message("Initial priority is less than the minimum priority (%).", + "初期優先度が最低優先度(%)を下回る") << minpri); + + /* + * タスク例外属性チェック + */ + + // 属性値がTA_HLNG or TA_ASMでない + if((*texatr & ~0x3) != 0) + notify(STANDARD, + Message("Task exception routine has an illegal attribute specifier.", + "タスク例外に無効な属性(TA_HLNG,TA_ASM以外) が設定されています")); + + // 属性値に TA_ASM が含まれている + if((*texatr & 0x1) != 0) + notify( RESTRICTED, + Message("TA_ASM, specified as texatr, does not always take effect.", + "タスク例外にTA_ASMが指定されています")); + + /* + * スタックチェック + */ + + // スタックサイズが0 + if(*stksz == 0) + notify(RESTRICTED, + Message("Stack size is equal to zero.", + "スタックサイズに0が設定されています")); + + // スタックの番地が0 + if(*stksz == 0) + notify(RESTRICTED, + Message("The address of task stack is equal to zero.", + "スタック開始番地に0が設定されています")); + + ++ tskatr, ++ task, ++ ipriority, ++ texatr, ++ stksz; + } + + return old_error_count == error_count; +} + +bool ConfigurationChecker::check_semaphoreblock(Directory & parameter, FileContainer * container) +{ + unsigned int id; + unsigned int old_error_count = error_count; + + Message object("Semaphore","セマフォ"); + + TargetVariable _kernel_tmax_semid("_kernel_tmax_semid"); + if(*_kernel_tmax_semid < 1) + return true; + + TargetVariable sematr("_kernel_seminib_table","semaphore_initialization_block::sematr"); + TargetVariable maxsem("_kernel_seminib_table","semaphore_initialization_block::maxsem"); + TargetVariable isemcnt("_kernel_seminib_table","semaphore_initialization_block::isemcnt"); + + VerboseMessage("% object : % items\n","%オブジェクト : % 個\n") + << object << *_kernel_tmax_semid; + + for(id = 1; id <= *_kernel_tmax_semid; id++) + { + set_banner(parameter, object, SEMAPHORE, id); + + //attribute validation check + if((*sematr & ~0x1) != 0) + notify(STANDARD, + Message("Illegal attribute (It should be (TA_TFIFO||TA_TPRI)).", + "(TA_TFIFO||TA_TPRI)以外の属性が指定されている")); + + //maxcnt < isemcnt + if(*maxsem < *isemcnt) + notify(STANDARD, + Message("Initial count[%] is greater than the maximum count[%] of this semaphore", + "初期値[%]が最大値[%]を超えている") << *isemcnt << *maxsem); + + if(*maxsem == 0) + notify(STANDARD, + Message("Maximum count must be greater than zero.", + "セマフォの最大カウントは1以上でなければいけません")); + + ++ sematr, ++ maxsem, ++ isemcnt; + } + + return old_error_count == error_count; +} + + +bool ConfigurationChecker::check_eventflagblock(Directory & parameter, FileContainer * container) +{ + unsigned int id; + unsigned int old_error_count = error_count; + + Message object("Event flag","イベントフラグ"); + + TargetVariable _kernel_tmax_flgid("_kernel_tmax_flgid"); + if(*_kernel_tmax_flgid < 1) + return true; + + TargetVariable flgatr("_kernel_flginib_table","eventflag_initialization_block::flgatr"); + + VerboseMessage("% object : % items\n","%オブジェクト : % 個\n") + << object << *_kernel_tmax_flgid; + + for(id = 1; id <= *_kernel_tmax_flgid; id++) + { + set_banner(parameter, object, EVENTFLAG, id); + + //attribute validation check + if((*flgatr & ~0x7) != 0) + notify(STANDARD, + Message("Illegal attribute value [0x%]", + "おかしな属性値 [0x%]") << setbase(16) << (*flgatr & ~0x7)); + + if((*flgatr & 0x2) != 0) + notify(TOPPERS, //依存部で直らないのでRESTRICTEDにしない + Message("Attribute TA_WMUL is not supported in current version.", + "TA_WMULはサポート外")); + + ++ flgatr; + } + + return old_error_count == error_count; +} + + +bool ConfigurationChecker::check_dataqueueblock(Directory & parameter, FileContainer * container) +{ + unsigned int id; + unsigned int old_error_count = error_count; + + Message object("Data queue","データキュー"); + + TargetVariable _kernel_tmax_dtqid("_kernel_tmax_dtqid"); + if(*_kernel_tmax_dtqid < 1) + return true; + + TargetVariable dtqatr("_kernel_dtqinib_table", "dataqueue_initialization_block::dtqatr"); + TargetVariable dtqcnt("_kernel_dtqinib_table", "dataqueue_initialization_block::dtqcnt"); + TargetVariable dtq("_kernel_dtqinib_table", "dataqueue_initialization_block::dtq"); + + VerboseMessage("% object : % items\n","%オブジェクト : % 個\n") + << object << *_kernel_tmax_dtqid; + + for(id = 1; id <= *_kernel_tmax_dtqid; id++) + { + set_banner(parameter, object, DATAQUEUE, id); + + //attribute validation check + if((*dtqatr & ~0x1) != 0) + notify(STANDARD, + Message("Illegal attribute value [0x%]", + "おかしな属性値 [0x%]") << setbase(16) << (*dtqatr & ~0x1)); + + if(*dtqcnt != 0 && *dtq == 0) + notify(TOPPERS, + Message("Dataqueue buffer should not be NULL", "データキューのバッファがNULL値")); + + ++ dtqatr, ++ dtqcnt, ++ dtq; + } + + return old_error_count == error_count; +} + + +bool ConfigurationChecker::check_mailboxblock(Directory & parameter, FileContainer * container) +{ + unsigned int id; + unsigned int old_error_count = error_count; + + Message object("Mailbox","メールボックス"); + + TargetVariable _kernel_tmax_mbxid("_kernel_tmax_mbxid"); + if(*_kernel_tmax_mbxid < 1) + return true; + + TargetVariable mbxatr("_kernel_mbxinib_table","mailbox_initialization_block::mbxatr"); + TargetVariable maxmpri("_kernel_mbxinib_table","mailbox_initialization_block::maxmpri"); + + DT_INT maxpri = container->getVariableInfo("TMAX_MPRI").value; + DT_INT minpri = container->getVariableInfo("TMIN_MPRI").value; + + VerboseMessage("% object : % items\n","%オブジェクト : % 個\n") << object << *_kernel_tmax_mbxid; + for(id = 1; id <= *_kernel_tmax_mbxid; id++) + { + set_banner(parameter, object, MAILBOX, id); + + //attribute validation check + if((*mbxatr & ~0x3) != 0) + notify(STANDARD, + Message("Illegal attribute value [0x%]", + "おかしな属性値 [0x%]") << setbase(16) << (*mbxatr & ~0x3)); + + //mailbox message priority check + if(*maxmpri < 0) + notify(STANDARD, + Message("Priority must not be a negative number.","優先度が負値")); + + if(*maxmpri < minpri) + notify(STANDARD, + Message("Message priority should be greater than or equal to %.", + "メッセージ優先度は%以上でなければいけません") << minpri); + + if(*maxmpri > maxpri) + notify(STANDARD, + Message("Message priority should be less than or equal to %.", + "メッセージ優先度は%以下でなければいけません") << maxpri); + + ++ mbxatr, ++ maxmpri; + } + + return old_error_count == error_count; +} + +bool ConfigurationChecker::check_fixed_memorypoolblock(Directory & parameter, FileContainer * container) +{ + unsigned int id; + unsigned int old_error_count = error_count; + + Message object("Fixed size memory pool","固定長メモリプール"); + + TargetVariable _kernel_tmax_mpfid("_kernel_tmax_mpfid"); + if(*_kernel_tmax_mpfid < 1) + return true; + + TargetVariable mpfatr("_kernel_mpfinib_table", "fixed_memorypool_initialization_block::mpfatr"); + TargetVariable limit ("_kernel_mpfinib_table", "fixed_memorypool_initialization_block::limit"); + TargetVariable mpf ("_kernel_mpfinib_table", "fixed_memorypool_initialization_block::mpf"); + TargetVariable blksz ("_kernel_mpfinib_table", "fixed_memorypool_initialization_block::blksz"); + + VerboseMessage("% object : % items\n","%オブジェクト : % 個\n") << object << *_kernel_tmax_mpfid; + for(id = 1; id <= *_kernel_tmax_mpfid; id++) + { + set_banner(parameter, object, FIXEDSIZEMEMORYPOOL, id); + + //attribute validation check + if((*mpfatr & ~0x1) != 0) + notify(STANDARD, + Message("Illegal attribute value [0x%]","おかしな属性値 [0x%]") << (*mpfatr & ~0x1)); + + //ブロック数が0 + if(*mpf == *limit) + notify(STANDARD, + Message("blkcnt should be a non-zero value.","ブロック数が0です")); + + //ブロックサイズが0 + if(*blksz == 0) + notify(STANDARD, + Message("blksz should be a non-zero value.","ブロックサイズが0です")); + + //バッファアドレスが0 + if(*mpf == 0) + notify(TOPPERS, + Message("buffer address is a NULL pointer.","バッファアドレスがNULLポインタになっています")); + + ++ mpfatr, ++ limit, ++ mpf, ++ blksz; + } + + return old_error_count == error_count; +} + + +bool ConfigurationChecker::check_cyclic_handlerblock(Directory & parameter, FileContainer * container) +{ + unsigned int id; + unsigned int old_error_count = error_count; + + Message object("Cyclic handler","周期ハンドラ"); + + TargetVariable _kernel_tmax_cycid("_kernel_tmax_cycid"); + if(*_kernel_tmax_cycid < 1) + return true; + + DT_RELTIM maxreltim = container->getVariableInfo("TMAX_RELTIM").value; + TargetVariable cycatr("_kernel_cycinib_table", "cyclic_handler_initialization_block::cycatr"); + TargetVariable cyctim("_kernel_cycinib_table", "cyclic_handler_initialization_block::cyctim"); + TargetVariable cycphs("_kernel_cycinib_table", "cyclic_handler_initialization_block::cycphs"); + + VerboseMessage("% object : % items\n","%オブジェクト : % 個\n") << object << *_kernel_tmax_cycid; + for(id = 1; id <= *_kernel_tmax_cycid; id++) + { + set_banner(parameter, object, CYCLICHANDLER, id); + + //attribute validation check + if((*cycatr & ~0x7) != 0) + notify(STANDARD, + Message("Illegal attribute value [0x%]","おかしな属性値 [0x%]") << (*cycatr & ~0x1)); + + if((*cycatr & 0x4) != 0) + notify(TOPPERS, //非依存部なのでRESTRICTEDにしない + Message("TA_PHS is not supported in this kernel.","TA_PHSはサポート外")); + + // 属性値に TA_ASM が含まれている + if((*cycatr & 0x1) != 0) + notify( RESTRICTED, + Message("TOPPERS/JSP Kernel never minds the flag 'TA_ASM'.", + "TOPPERS/JSPカーネルの全ての機種依存部でTA_ASMをサポートするとは限らない")); + + //RELTIMでの表現範囲内にあるかどうかのチェック + if(*cyctim > maxreltim) + notify(STANDARD, + Message("The cyclic object has a period (%) that exceeds the maximum period (%)", + "起動周期(%)が表現可能な相対時間の範囲(%)を超えています") << *cyctim << maxreltim); + + //起動周期が0でないことのチェック + if(*cyctim == 0) + notify(STANDARD, + Message("The cyclic object has a ZERO period.", + "起動周期が0になっています")); + + if(*cycphs > maxreltim) + notify(STANDARD, + Message("The cyclic object has a initial delay (%) that exceeds the maximum period (%)", + "起動位相(%)が表現可能な相対時間の範囲(%)を超えています") << *cycphs << maxreltim); + + ++ cycatr, ++ cyctim, ++ cycphs; + } + + return old_error_count == error_count; +} + +bool ConfigurationChecker::check_interrupt_handlerblock(Directory & parameter, FileContainer * container) +{ + unsigned int id; + unsigned int old_error_count = error_count; + + Message object("Interrupt handler","割込みハンドラ"); + + TargetVariable _kernel_tnum_inhno("_kernel_tnum_inhno"); + if(*_kernel_tnum_inhno == 0) + return true; + + TargetVariable inhatr("_kernel_inhinib_table", "interrupt_handler_initialization_block::inhatr"); + TargetVariable inthdr("_kernel_inhinib_table", "interrupt_handler_initialization_block::inthdr"); + + VerboseMessage("% object : % items\n","%オブジェクト : % 個\n") << object << *_kernel_tnum_inhno; + for(id = 0; id < *_kernel_tnum_inhno; id++) + { + set_banner(parameter, object, INTERRUPTHANDLER, id); + + //attribute validation check + if((*inhatr & 0x1) != 0) + notify(STANDARD, + Message("The attribute can take only TA_HLNG|TA_ASM", + "TA_HLNG|TA_ASM以外の属性は設定できません")); + + // 属性値に TA_ASM が含まれている + if((*inhatr & 0x1) != 0) + notify(RESTRICTED, + Message("TOPPERS/JSP Kernel never minds the flag 'TA_ASM'.", + "TA_ASMが使用されている")); + + // 起動番地チェック + if(*inthdr == 0) + notify(RESTRICTED, + Message("NULL pointer is specified as an inthdr address.", + "割込みハンドラの番地がNULLです")); + + ++ inhatr, ++ inthdr; + } + + return old_error_count == error_count; +} + +bool ConfigurationChecker::check_exception_handlerblock(Directory & parameter, FileContainer * container) +{ + unsigned int id; + unsigned int old_error_count = error_count; + + Message object("Exception handler","例外ハンドラ"); + + TargetVariable _kernel_tnum_excno("_kernel_tnum_excno"); + if(*_kernel_tnum_excno == 0) + return true; + + TargetVariable excatr("_kernel_excinib_table", "cpu_exception_handler_initialization_block::excatr"); + TargetVariable exchdr("_kernel_excinib_table", "cpu_exception_handler_initialization_block::exchdr"); + + VerboseMessage("% object : % items\n","%オブジェクト : % 個\n") << object << *_kernel_tnum_excno; + for(id = 0; id < *_kernel_tnum_excno; id++) + { + set_banner(parameter, object, EXCEPTIONHANDLER, id); + + //attribute validation check + if((*excatr & 0x1) != 0) + notify(STANDARD, + Message("The attribute can take only TA_HLNG|TA_ASM", + "TA_HLNG|TA_ASM以外の属性は設定できません")); + + // 属性値に TA_ASM が含まれている + if((*excatr & 0x1) != 0) + notify(RESTRICTED, + Message("TOPPERS/JSP Kernel never minds the flag 'TA_ASM'.", + "TOPPERS/JSPカーネルの全ての機種依存部でTA_ASMをサポートするとは限らない")); + + // 起動番地チェック + if(*exchdr == 0) + notify(RESTRICTED, + Message("NULL pointer is specified as an exchdr address.", + "例外ハンドラの番地がNULLです")); + + ++ excatr, ++ exchdr; + } + + return old_error_count == error_count; +} + +//------------------------------------------------------ + +void ConfigurationChecker::parseOption(Directory & parameter) +{ + string loadmodule; + string work; + + if(findOption("h","help")) + { + cout << endl << Message( + "Configuration checker - option\n" + " -m, --module=filename : Specify the load module (essential option)\n" + " -cs, --script=filename : Specify the checker script file\n" + " -cl, --checklevel=level : Specify one of the check levels below \n" + " l(azy) : Minimum check will be performed.\n" + " s(tandard) : includes some ITRON Standard check items.\n" + " t(oppers) : checks whether it meets TOPPERS/JSP restrictions\n" + " r(estricted) : All of check items will be performed.\n", + "コンフィギュレーションチェッカ - オプション\n" + " -m, --module=ファイル名 : ロードモジュール名を指定します (必須項目)\n" + " -cs, --script=ファイル名 : チェッカスクリプトを指定します\n" + " -cl, --checklevel=level : Specify one of the check levels below \n" + " l(azy) : 最小限のチェックのみを行います\n" + " s(tandard) : ITRON仕様の範囲でチェックを行います\n" + " t(oppers) : TOPPERS/JSPカーネルの制限を満たすことを確認します\n" + " r(estricted) : 機種依存部を含め全てのチェック項目を実施します\n"); + cout << endl + << Message("Supported architecture : ", "対応アーキテクチャ : ") + << FileContainer::getInstance()->getArchitecture() + << endl; + return; + } + + if(findOption("m","module",&loadmodule) || findOption(DEFAULT_PARAMETER,NULL,&loadmodule)) + { + if(findOption("s","source")) + ExceptionMessage("Configuration checker can not execute while Configurator executes","コンフィギュレータとチェッカは同時に起動できません").throwException(); + + parameter["/file/loadmodule"] = loadmodule; + activateComponent(); + } + + if(!findOption("cs","script",&work)) + work = loadmodule.substr(0,loadmodule.find_last_of('.')) + ".chk"; + parameter["/file/checkerscript"] = work; + + work.erase(); + if(findOption("obj","load-object",&work)) + { + if(work.empty()) + work.assign("kernel_obj.dat"); + + fstream f(work.c_str(), ios::in|ios::binary); + if(f.is_open()) + { + parameter["/object"].Load(&f); + f.close(); + }else + ExceptionMessage(" Failed to open the file '%' for storing object definitions"," オブジェクト情報を格納するためのファイル(%)が開けません") << work << throwException; + } + + if(findOption("cl","checklevel",&work)) + { + current_level = UNKNOWN; + + if(work.compare("lazy") == 0 || work[0] == 'l') + current_level = LAZY; + if(work.compare("standard") == 0 || work[0] == 's') + current_level = STANDARD; + if(work.compare("toppers") == 0 || work[0] == 't') + current_level = TOPPERS; + if(work.compare("restricted") == 0 || work[0] == 'r') + current_level = RESTRICTED; + + if(current_level == UNKNOWN) + ExceptionMessage(" Unknown check level [%] specified"," 無効なチェックレベル指定 [%]") << work << throwException; + }else + current_level = NORMAL; + + checkOption("cpu", "cpu"); + checkOption("system", "system"); +} + +void ConfigurationChecker::body(Directory & parameter) +{ + FileContainer * container; + bool result = true; + + /* より優先度の高いエラーも対象に */ + current_level = static_cast(static_cast(current_level) * 2 - 1); + + container = FileContainer::getInstance(); + container->attachInfo(parameter["/file/checkerscript"].toString()); + container->attachModule(parameter["/file/loadmodule"].toString()); + + if(VerboseMessage::getVerbose()) + { + cout << Message(" Target architecture : "," ターゲットアーキテクチャ : ") + << container->getArchitecture() << endl; + } + + error_count = 0; + result &= check_taskblock(parameter,container); + result &= check_semaphoreblock(parameter,container); + result &= check_eventflagblock(parameter,container); + result &= check_dataqueueblock(parameter,container); + result &= check_mailboxblock(parameter,container); + result &= check_fixed_memorypoolblock(parameter,container); + result &= check_cyclic_handlerblock(parameter,container); + result &= check_interrupt_handlerblock(parameter,container); + result &= check_exception_handlerblock(parameter,container); + + if(!result) + ExceptionMessage("Total % errors found in current configuration.\n","全部で%個のエラーが検出されました\n") << error_count << throwException; + + VerboseMessage("No error found in current configuration\n","構成に異常はありませんでした\n"); +} + diff --git a/uzume_prototype/kernel/cfg/jsp/jsp_checkscript.cpp b/uzume_prototype/kernel/cfg/jsp/jsp_checkscript.cpp new file mode 100644 index 0000000..55fdd4e --- /dev/null +++ b/uzume_prototype/kernel/cfg/jsp/jsp_checkscript.cpp @@ -0,0 +1,231 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: jsp_checkscript.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/jsp/jsp_checkscript.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#include "jsp/jsp_defs.h" +#include "jsp/jsp_common.h" + +#include +#include + +#include "base/component.h" +#include "base/mpstrstream.h" + +using namespace std; +using namespace ToppersJsp; + +class CheckScriptGenerator : public Component +{ +protected: + virtual void parseOption(Directory & container); + virtual void body(Directory & container); + + void insertMagic(void) throw(Exception); + +public: + CheckScriptGenerator(void) : Component(FINALIZE) {}; +} instance_of_CheckScriptGenerator; + +void CheckScriptGenerator::parseOption(Directory & container) +{ + MultipartStream * stream; + string work; + + if(findOption("h","help")) + { + cerr << '\n' << Message( + "Configuration Checker Script Generation Option\n" + " -c, --check : Generate a checker script\n", + "カーネル構成チェックスクリプト生成用オプション\n" + " -c, --check : チェックスクリプトを生成します\n"); + return; + } + + if(findOption("c","check",&work)) + { + if(work.empty()) + work.assign("kernel_chk.c"); + + stream = new MultipartStream(work); + stream->createPart("header") + .createPart("body") + .createPart("footer"); + + container["/file/kernel_chk"] = stream; + + checkOption("ci","checker-macro"); + activateComponent(); + } +} + +static void createScriptEntry(Directory & container, MultipartStream * out, const char * objname, const char * member, bool mode = true) +{ + string work; + string inib; + Directory * scope; + int i, j; + + (*out) << container.format("\n\t\t/* $@ */\n\n"); + + if(mode) + { + scope = container.getFirstChild(); + while(scope != 0) + { + work = scope->getKey(); + if(work[0] < '0' || work[1] > '9') + (*out) << "\tOBJECT(" << container.getKey() << '_' << scope->toInteger() << ',' << work << ");\n"; + + scope = scope->getNext(); + } + + (*out) << container.format("\tEVAR(ID,_kernel_tmax_$(/prefix/$@/id)id);\n"); + }else + { + i = 0; + scope = container.getFirstChild(); + while(scope != 0) + { + work = scope->getKey(); + (*out) << "\tOBJECT(" << container.getKey() << '_' << (i++) << ',' << scope->getKey() << ");\n"; + scope = scope->getNext(); + } + + (*out) << container.format("\tEVAR(ID,_kernel_tnum_$(/prefix/$@/id)no);\n"); + } + + (*out) << container.format("\tEVAR($(/prefix/$@/SID)INIB,_kernel_$(/prefix/$@/sid)inib_table);\n"); + + work.assign(member); + i = 0; + j = work.find_first_of(','); + if(objname == NULL) + inib = container.getKey(); + else + inib = objname; + + do { + (*out) << "\tMEMBER(" << inib << "_initialization_block," << work.substr(i, j-i) << ");\n"; + + i = j + 1; + j = work.find_first_of(',', i); + } while(i != string::npos+1); + (*out) << '\n'; +} + +inline void createScriptEntry(Directory & container, MultipartStream * out, const char * member) +{ createScriptEntry(container, out, NULL, member, true); } + +void CheckScriptGenerator::insertMagic(void) throw(Exception) +{ + KernelCfg * out = dynamic_cast(RuntimeObjectTable::getInstance(typeid(KernelCfg))); + if(out != 0) { + out->movePart("others"); + out->createPart("checkscript"); + (*out) << Message("\t/* Variables for kernel checker */\n", "\t/* カーネルチェッカ用変数 */\n"); + (*out) << "const UW _checker_magic_number = 0x01234567;\n\n"; + } +} + +void CheckScriptGenerator::body(Directory & container) +{ + MultipartStream * out; + + out = reinterpret_cast(container["/file/kernel_chk"].toPointer()); + + out->movePart("header") << + "#include \"jsp_kernel.h\"\n" + "#include \"logtask.h\"\n" + "#include \"timer.h\"\n\n"; + + + string work; + if(findOption("ci","checker-macro",&work)) { + + /* 中身が空でなかったらincludeをするが,空ならincludeすら吐かない */ + if(!work.empty()) + (*out) << "#include \"" << work << "\"\n\n"; + } + else { + (*out) << "#define OBJECT(x,y) __asm(\"d\" #x \",\" #y \"@\");\n" + "#define MEMBER(x,y) __asm(\"s\" #x \"::\" #y \",(%0),(%1)@\" ::\\\n" + " \"i\"(sizeof(((struct x *)0)->y)), \"i\"(&((struct x *)0)->y));\n" + "#define VAR(x) __asm(\"s\" #x \",(%0),(0)@\" :: \"i\"(sizeof(x)));\n" + "#define EVAR(x,y) __asm(\"s\" #y \",(%0),(0)@\" :: \"i\"(sizeof(x)));\n" + "#define SVAR(x) __asm(\"s\" #x \",(%0),(0)@\" :: \"i\"(sizeof(x[0])));\n" + "#define DEFS(x) __asm(\"s\" #x \",(%0),(0)@\" :: \"i\"((unsigned long)x));\n\n"; + } + + (*out) << "#include \"queue.h\"\n\n" + "#include \"task.h\"\n" + "#include \"semaphore.h\"\n" + "#include \"eventflag.h\"\n" + "#include \"dataqueue.h\"\n" + "#include \"mailbox.h\"\n" + "#include \"mempfix.h\"\n" + "#include \"cyclic.h\"\n" + "#include \"../kernel/exception.h\"\n" + "#include \"interrupt.h\"\n" + "#include \"wait.h\"\n\n" + "void checker_function(void)\n{\n"; + + out->movePart("footer") << "}\n"; + + out->movePart("body") << + "\tDEFS(TMAX_TPRI);\n\tDEFS(TMIN_TPRI);\n\n" + "\tDEFS(TMAX_MPRI);\n\tDEFS(TMIN_MPRI);\n\n" +// "\tDEFS(TMAX_MAXSEM);\n\n" + "\tDEFS(TMAX_RELTIM);\n\n" + "\tMEMBER(queue,next);\n\tMEMBER(queue,prev);\n\n"; + + createScriptEntry(container[OBJECTTREE "/" TASK], out, "tskatr,exinf,task,ipriority,stksz,stk,texatr,texrtn"); + createScriptEntry(container[OBJECTTREE "/" SEMAPHORE], out, "sematr,isemcnt,maxsem"); + createScriptEntry(container[OBJECTTREE "/" EVENTFLAG], out, "flgatr,iflgptn"); + createScriptEntry(container[OBJECTTREE "/" DATAQUEUE], out, "dtqatr,dtqcnt,dtq"); + createScriptEntry(container[OBJECTTREE "/" MAILBOX], out, "mbxatr,maxmpri"); + createScriptEntry(container[OBJECTTREE "/" FIXEDSIZEMEMORYPOOL], out, "fixed_memorypool", "mpfatr,blksz,mpf,limit"); + createScriptEntry(container[OBJECTTREE "/" CYCLICHANDLER], out, "cyclic_handler", "cycatr,exinf,cychdr,cyctim,cycphs"); + createScriptEntry(container[OBJECTTREE "/" INTERRUPTHANDLER], out, "interrupt_handler", "inhno,inhatr,inthdr", false); + createScriptEntry(container[OBJECTTREE "/" EXCEPTIONHANDLER], out, "cpu_exception_handler", "excno,excatr,exchdr", false); + + insertMagic(); + + VerboseMessage("Configuration check script generation was finished successfully.\n","カーネル構成チェックスクリプトファイルを出力しました\n"); +} + diff --git a/uzume_prototype/kernel/cfg/jsp/jsp_common.cpp b/uzume_prototype/kernel/cfg/jsp/jsp_common.cpp new file mode 100644 index 0000000..03f8162 --- /dev/null +++ b/uzume_prototype/kernel/cfg/jsp/jsp_common.cpp @@ -0,0 +1,290 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: jsp_common.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +#include "jsp/jsp_common.h" + +#include "base/option.h" + +#include + +#if defined(_MSC_VER) || defined(__BORLANDC__) +# define GETLOGINNAME_WINDOWS +# include +#elif __GNUC__ +# define GETLOGINNAME_UNIX +# include +#endif + +using namespace std; + +#if 0 +namespace { + string get_loginname(void) throw() + { + string result("TOPPERS/JSP KernelConfigurator"); + +#ifdef GETLOGINNAME_WINDOWS + char buffer[1024]; + DWORD sz = 1024; + ::GetUserName(buffer, &sz); + result.assign(buffer); +#elif defined(GETLOGINNAME_UNIX) + result.assign(getlogin()); +#endif + + return result; + } +} +#endif + + + //インクルードファイルの形を変更する +string ToppersJsp::conv_includefile(string file) throw() +{ + OptionParameter & option = getOptionParameter(); + string result; + + //ilオプションが付いたときには "<...>" 形式で出力 + if(option["il"].isValid()) + result = string("<") + file + ">"; + else + result = string("\"") + file + "\""; + + return result; +} + + //カーネルの変数名の形を変更する +string ToppersJsp::conv_kernelobject(string obj) throw() +{ + OptionParameter & option = getOptionParameter(); + string result; + + result = obj; + + // TOPPERS/JSP rel 1.3より後はカーネル変数の頭に _kernel_ をつける + if(!option["1.3"].isValid()) + result = string("_kernel_") + obj; + + return result; +} + +ToppersJsp::SpecialtyFile::SpecialtyFile(void) throw() : MultipartStream(), RuntimeObject(true) +{} + +#if 0 +string ToppersJsp::get_agreement(string filename) throw() +{ + const char * base_agreement = + "/*\n" + " * TOPPERS/JSP Kernel\n" + " * Toyohashi Open Platform for Embedded Real-Time Systems/\n" + " * Just Standard Profile Kernel\n" + " * \n" + " * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory\n" + " * Toyohashi Univ. of Technology, JAPAN\n" + " * \n" + " * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation \n" + " * によって公表されている GNU General Public License の Version 2 に記\n" + " * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア\n" + " * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,\n" + " * 利用と呼ぶ)することを無償で許諾する.\n" + " * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作\n" + " * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー\n" + " * スコード中に含まれていること.\n" + " * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使\n" + " * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用\n" + " * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記\n" + " * の無保証規定を掲載すること.\n" + " * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使\n" + " * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ\n" + " * と.\n" + " * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著\n" + " * 作権表示,この利用条件および下記の無保証規定を掲載すること.\n" + " * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに\n" + " * 報告すること.\n" + " * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損\n" + " * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.\n" + " * \n" + " * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お\n" + " * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も\n" + " * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直\n" + " * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.\n" + " * \n"; + + string work(base_agreement); + + //CVSのID風のものをくっつける + time_t t; + time(&t); + + work += string(" * @(#)$Id: "); + work += filename; + work += " "; + work += static_cast(asctime(localtime(&t))); + + work.erase(work.size() - 1); //asctimeで改行が入るのでchomp + + work += " "; + work += get_loginname(); + work += " Exp $\n */\n\n"; + + return work; +} +#endif + + +/***************************************** テストスィート *****************************************/ + +#ifdef TESTSUITE + +class SpecialtyFile_test : public ToppersJsp::SpecialtyFile +{ +public: + ~SpecialtyFile_test(void) throw() { TestSuite::check("SpecialtyFile::~SpecialtyFile"); } + TESTSUITE_PROTOTYPE(main) +}; + +TESTSUITE(main, SpecialtyFile_test) +{ + BEGIN_CASE("constructor","constructor") { + BEGIN_CASE("1","生成するとROTに乗る") { + SpecialtyFile_test file; + + if(RuntimeObjectTable::getInstance() == 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("2","破棄の対象になっている") { + Singleton::Context context; + Singleton::saveContext(context); + + Singleton::renewInstance(); + + new SpecialtyFile_test; + + TEST_CASE("0","[前提] 登録されている", RuntimeObjectTable::getInstance() != 0); + + TestSuite::clearCheckpoints(); + Singleton::renewInstance(); //インスタンスの再生成でROTが削除される + + TEST_CASE("1","ROTから解除されている", RuntimeObjectTable::getInstance() == 0); + TEST_CASE("2","デストラクタが起動されている", TestSuite::isReached("SpecialtyFile::~SpecialtyFile")); + + Singleton::restoreContext(context); + } END_CASE; + } END_CASE; + + BEGIN_CASE("createInstance","createInstance") { + BEGIN_CASE("1","インスタンスが生成できる") { + SpecialtyFile_test * file = SpecialtyFile::createInstance("test.txt"); + + file->disableOutput(); //出力されても困るので + + TEST_CASE("1","非NULLが返る", file != 0); + TEST_CASE("2","ファイル名が正常", file->getFilename().compare("test.txt") == 0); + } END_CASE; + + BEGIN_CASE("2","空文字を渡すと例外") { + + bool result = false; + try { + SpecialtyFile::createInstance(""); + } + catch(Exception &) { + result = true; + } + + TEST_CASE("1","例外が起こる", result); + TEST_CASE("2","オブジェクトはない", RuntimeObjectTable::getInstance() == 0); + } END_CASE; + } END_CASE; +} + +namespace { + extern void testsuite(TestSuiteControl & _suite_control); + TestSuite testsuite_onTop("TOPPERS/JSP Common Function(main)", testsuite); + + //テストスィートの本体 + void testsuite(TestSuiteControl & _suite_control) + { + Singleton::Context context; + Singleton::saveContext(context); + + BEGIN_CASE("conv_includefile","conv_includefile") { + BEGIN_CASE("1","-ilが付いていないとダブルクォートでくくる") { + Singleton::renewInstance(); + + if(ToppersJsp::conv_includefile("test.h").compare("\"test.h\"") != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("1","-ilが付いていると<>でくくる") { + Singleton::renewInstance(); + char * argv[] = {"test.exe","-il"}; + getOptionParameter().parseOption(2, argv); + + if(ToppersJsp::conv_includefile("test.h").compare("") != 0) + TEST_FAIL; + } END_CASE; + } END_CASE; + + BEGIN_CASE("conv_kernelobject","conv_kernelobject") { + BEGIN_CASE("1","-1.3が付いていないと_kernel_が付く") { + Singleton::renewInstance(); + + if(ToppersJsp::conv_kernelobject("test").compare("_kernel_test") != 0) + TEST_FAIL; + } END_CASE; + + BEGIN_CASE("1","-1.3が付いているとそのまま出てくる") { + Singleton::renewInstance(); + char * argv[] = {"test.exe","-1.3"}; + getOptionParameter().parseOption(2, argv); + + if(ToppersJsp::conv_kernelobject("test").compare("test") != 0) + TEST_FAIL; + } END_CASE; + } END_CASE; + + Singleton::restoreContext(context); + + } +} +#endif + + diff --git a/uzume_prototype/kernel/cfg/jsp/jsp_common.h b/uzume_prototype/kernel/cfg/jsp/jsp_common.h new file mode 100644 index 0000000..745f871 --- /dev/null +++ b/uzume_prototype/kernel/cfg/jsp/jsp_common.h @@ -0,0 +1,132 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: jsp_common.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/jsp/jsp_common.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + + +#ifndef JSP_COMMON_H +#define JSP_COMMON_H + +#include "base/testsuite.h" + +#include "base/mpstrstream.h" +#include "base/collection.h" +#include "base/except.h" +#include "base/event.h" + +#include + + +namespace ToppersJsp { + + //カーネル構成ファイル + class SpecialtyFile : public MultipartStream, public RuntimeObject + { + protected: + SpecialtyFile(void) throw(); + + template + static T * createInstance(std::string filename) throw(Exception) + { + T * old; + T * result = 0; + + //ROT登録解除 オブジェクト削除 (唯一性の保障 (だけどシングルトンではない) ) + old = dynamic_cast(RuntimeObjectTable::getInstance(typeid(T))); + if(old != 0) + delete old; + + result = new(std::nothrow) T; + if(result == 0) + ExceptionMessage("Internal error : Object creation failure [ToppersJsp::KernelCfg::createKernelCfg]","内部エラー : オブジェクト生成時エラー [createKernelCfg]") << throwException; + + try { + result->setFilename(filename); + } + catch(...) { + if(result != 0) + delete result; + throw; + } + return result; + } + + }; + + + /* + * Visual C++ 6.0 : fatal error C1001: INTERNAL COMPILER ERROR (msc1.cpp:1794) 対策 + * (というより、多重登録しても古いインスタンスの登録チェックをしない) + */ +#if defined(_MSC_VER) && (_MSC_VER < 1300) +# define SPECIALTY_FILE(x) \ + class x : public SpecialtyFile { \ + public: \ + struct CreationEvent { class x * file; }; \ + static inline x * createInstance(std::string filename) throw(Exception) \ + { \ + x * instance = new(std::nothrow) x; \ + if(instance != 0) \ + instance->setFilename(filename); \ + return instance; \ + } \ + } +#else +# define SPECIALTY_FILE(x) \ + class x : public SpecialtyFile { \ + public: \ + struct CreationEvent { class x * file; }; \ + static inline x * createInstance(std::string filename) throw(Exception) \ + { return SpecialtyFile::createInstance(filename); } \ + } +#endif + + //TOPPERS/JSPのコンフィギュレーションで出てくる特殊なファイル + SPECIALTY_FILE(KernelCfg); + SPECIALTY_FILE(KernelID); + + //バージョン間を越えた変換など + std::string conv_includefile(std::string file) throw(); //インクルードファイル名 + std::string conv_kernelobject(std::string obj) throw(); //カーネルの変数名 + + //定数など +// std::string get_agreement(std::string filename = "") throw(); //文言の取得 +} + +#endif + diff --git a/uzume_prototype/kernel/cfg/jsp/jsp_defs.h b/uzume_prototype/kernel/cfg/jsp/jsp_defs.h new file mode 100644 index 0000000..df14674 --- /dev/null +++ b/uzume_prototype/kernel/cfg/jsp/jsp_defs.h @@ -0,0 +1,67 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: jsp_defs.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/jsp/jsp_defs.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#ifndef JSP_DEFS_H +#define JSP_DEFS_H + +#define OBJECTTREE "object" + +#define TASK "task" +#define SEMAPHORE "semaphore" +#define EVENTFLAG "eventflag" +#define DATAQUEUE "dataqueue" +#define MAILBOX "mailbox" +#define FIXEDSIZEMEMORYPOOL "mempfix" +#define CYCLICHANDLER "cyclic" +#define INTERRUPTHANDLER "interrupt" +#define EXCEPTIONHANDLER "exception" +#define INITIALIZER "initializer" +#define TERMINATOR "terminator" +#define INCLUDEFILE "include" +#define OBJECT_INITIALIZER "object_initializer" +#define IDENTIFIER_VARIABLE "identifier" + +#define KERNEL_CFG "/file/kernel_cfg" +#define KERNEL_ID "/file/kernel_id" + +#define PREFIX "/prefix" + +#endif + diff --git a/uzume_prototype/kernel/cfg/jsp/jsp_parser.cpp b/uzume_prototype/kernel/cfg/jsp/jsp_parser.cpp new file mode 100644 index 0000000..b575734 --- /dev/null +++ b/uzume_prototype/kernel/cfg/jsp/jsp_parser.cpp @@ -0,0 +1,1016 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: jsp_parser.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/jsp/jsp_parser.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#include + +#include "jsp/jsp_defs.h" +#include "base/parser.h" +#include "base/mpstrstream.h" +#include "jsp/jsp_common.h" + +#include +#include +#include +#include +#include + +using namespace ToppersJsp; +using namespace std; + +class CoreParser : public ParserComponent +{ +protected: + virtual void parseOption(Directory &); + void outputContainer(Directory & container) throw(); + void assignID(Directory & container) throw(); + +public: + CoreParser(void); + virtual bool parse(Parser & p, Directory & container); +} instance_of_Parser; + +CoreParser::CoreParser(void) +{ + setBanner("=== TOPPERS/JSP Kernel Configurator ver.9.4 (for JSP rel 1.4) ==="); +} + +void CoreParser::parseOption(Directory & container) +{ + ParserComponent::parseOption(container); + + if(findOption("h","help")) + { + cerr << Message( + " -obj, --dump-object=filename : Dump the object tree into the file specified\n" + " -ao, --assign-order=order : Specify the order of automatic ID assignment\n" + " You can use three terms below as ordering rule.\n" + " alphabetic (in alphabetic order)\n" + " fcfs (in arrival order [as default])\n" + " reverse (reverse the order)\n" + " -var, --variable-id : Prepare ID-variable for storing its identifier number\n", + " -obj, --dump-object=ファイル名 : 指定したファイルにオブジェクト情報を出力します\n" + " -ao, --assign-order=順序 : 自動ID割当の割当順序を指定します\n" + " 割当順序は次の3つの組合せで指定します.\n" + " alphabetic (ABC順), fcfs (宣言順 [デフォルト]), reverse (逆順)\n" + " -var, --variable-id : ID番号を格納する変数を用意します"); + return; + } + + checkOption("D","dump"); + checkOption("cpu","cpu"); + checkOption("system","system"); + checkOption("var","variable-id"); +} + +namespace { + int displayHandler(Directory & container, const char * category, const char * format) + { + Directory * node = 0; + Directory * scope = 0; + + node = container.findChild(OBJECTTREE,category,NULL); + if(node == 0 || node->size() == 0) + return 0; + + VerboseMessage("Handler assignment list [%]\n","ハンドラ割付表 [%]\n") << category; + + scope = node->getFirstChild(); + while(scope != 0) + { + VerboseMessage::getStream() << scope->format(format); + scope = scope->getNext(); + } + + return node->size(); + } + + //マクロ化されたtoupperを関数化する (STL-algorithm用) + int toupper_function(int c) + { return toupper(c); } +} +/* + * outputContainer - デバッグ時 or ダンプ指定時にオブジェクト情報を所定のファイル形式で出力する + */ +void CoreParser::outputContainer(Directory & container) throw() +{ + try { + + if(findOption("D","dump") || findOption("debug","debug")) { + fstream file("container.txt", ios::out); + container.drawTree(&file); + file.close(); + } + + if(findOption("Dx","dump-xml") || findOption("debug","debug")) { + fstream file("container.xml", ios::out); + container.drawTree_byXML(&file); + file.close(); + } + } + catch (...) { + } +} + +/* + * assignID - オブジェクトに対してIDを割り付ける + * 取り込んだオブジェクト名をユーザに提示する + */ +void CoreParser::assignID(Directory & container) throw() +{ + multimap sorter; + multimap::iterator scope; + enum Common::tagAssignmentOrder order = Common::FCFS; + + sorter.insert(pair(container[OBJECTTREE "/" TASK].size(), TASK)); + sorter.insert(pair(container[OBJECTTREE "/" SEMAPHORE].size(), SEMAPHORE)); + sorter.insert(pair(container[OBJECTTREE "/" EVENTFLAG].size(), EVENTFLAG)); + sorter.insert(pair(container[OBJECTTREE "/" DATAQUEUE].size(), DATAQUEUE)); + sorter.insert(pair(container[OBJECTTREE "/" MAILBOX].size(), MAILBOX)); + sorter.insert(pair(container[OBJECTTREE "/" FIXEDSIZEMEMORYPOOL].size(), FIXEDSIZEMEMORYPOOL)); + sorter.insert(pair(container[OBJECTTREE "/" CYCLICHANDLER].size(), CYCLICHANDLER)); + + order = Common::parseOrder(getOption("ao", "assign-order")); + scope = sorter.begin(); + while(scope != sorter.end()) + { + if( (*scope).first != 0 ) + Common::assignID(container, (*scope).second, OBJECTTREE, order); + ++ scope; + } + + displayHandler(container, INTERRUPTHANDLER, " $@ : $(inthdr)\n"); + displayHandler(container, EXCEPTIONHANDLER, " $@ : $(exchdr)\n"); + displayHandler(container, INITIALIZER, " $@ : $(inirtn)($(exinf))\n"); + displayHandler(container, TERMINATOR, " $@ : $(terrtn)($(exinf))\n"); +} + + +bool CoreParser::parse(Parser & p, Directory & container) +{ + Token token; + string work; + bool isParseErrorOccured; + + if(findOption("cpu","cpu", &work)) + container["/cpu"] = work; + + try{ + isParseErrorOccured = false; + do { + p.getToken(token); + if(token == Token::IDENTIFIER) + { + /* エラーが起きても極力続けたいので、 + 起きたことだけ覚えておいてどんどん続ける */ + try + { this->parseStaticAPI(p, container, token); } + catch(...) + { isParseErrorOccured = true; } + + } + }while(token != Token::EOS); + + p.setLogBuffer(NULL); + + if(isParseErrorOccured) + ExceptionMessage(ExceptionMessage::FATAL,"The configuration process was aborted due to occurence of parse error","構文解析に失敗したため処理を中断します").throwException(); + + if(container[OBJECTTREE "/" TASK].size() == 0) + ExceptionMessage("Kernel requires one or more task objects.","タスクオブジェクトがありません").throwException(); + + /* ID割付 & オブジェクト名表示 */ + assignID(container); + + /* オブジェクト情報をファイルに出力 */ + outputContainer(container); + + return true; + } + catch(Exception &) + { + /* 例外を投げなおす前に 現在のオブジェクト情報を格納する */ + outputContainer(container); + throw; + } +} + +/* ======================================================================== */ + +DECLARE_DIRECTIVE(assigner,"assign_id") +{ + Token name; + Token value; + + p.getToken(name, Token::IDENTIFIER); + p.getToken(value, Token::INTEGER); + + if(value.value <= 0) + ExceptionMessage("Cannot assign an ID number less or equal to 0.","0以下のID番号を設定することはできません").throwException(); + + *container.openChild("/","identifier",name.c_str(),NULL) = value.value; +} + +DECLARE_DIRECTIVE(parameter,"parameter") +{ + Token token; + string key; + string::size_type i,j; + + do { + p.getToken(token); + if(!(token == Token::STRINGLITERAL)) + ExceptionMessage("parameter pragma requires additional parameter put in '\"...\"'","parameterプラグマには\"...\"で括られた追加パラメータが必要です").throwException(); + + token.chopLiteral(); + + if(token[0] == '-') + { + i = token.find_first_of('='); + j = token.find_first_not_of('-'); + if(i == j || j == string::npos) + ExceptionMessage(ExceptionMessage::FATAL,"Wrong option [%]","不正なオプション [%]") << token << throwException; + + if(i != string::npos) + { + key = DEFAULT_PARAMETER; + *container.openChild(string("/Parameter/") + token.substr(1, i-1)) = token.substr(i+1); + } + else + { + key = token.substr(1); + *container.openChild(string("/Parameter/") + key) = string(""); + } + }else + *container.openChild(string("/Parameter/") + key) = token; + + p.getToken(token); + } while(token.compare(",") == 0); + + p.putBack(token); +} + + +/* ======================================================================== */ +class ConfigurationFileGenerator : public Component +{ +protected: + bool backward_compatible; + bool libstyle_include; + bool restrict_zero; + bool def_prototype; + + enum tagDefinition { HEADER=1, TNUM=2, BUFFER=4, DEFINITION=8, CONTROLBLOCK=16, SHORT_ID=32, TNUMNO=64, INIT=128, PROTOTYPE=256, INITLIST=512 }; + void createObjectDefinition(MultipartStream *, Directory &, int, ...); + + virtual void parseOption(Directory &); + virtual void body(Directory &); + virtual void onFatalExit(Directory &); + +public: + ConfigurationFileGenerator(void) : Component(CODEGENERATOR) {}; +} instance_of_Configurator; + + + +namespace { + + //ファイル名の取得 + string get_filename(string category, string _default) throw(Exception) + { + string result(_default); + OptionParameter::OptionItem item = getOptionParameter()[category]; + + if(item.isValid()) { + if(item.countParameter() == 1) + result = item[0]; + else + ExceptionMessage("-% should have just ONE filename.","-%オプションに指定できるファイルは1つのみ") << category << throwException; + } + + if(result.empty()) + ExceptionMessage("-% has illegal file name.","-%オプションに渡されたファイル名は不正") << category << throwException; + + return result; + } + + // カーネル構成ファイルの生成 + KernelCfg * createKernelCfg(void) + { + KernelCfg * cfg; + + cfg = KernelCfg::createInstance(get_filename("kernel_cfg","kernel_cfg.c")); + cfg->disableOutput(); //処理が完了するまで出力させない + + //基本的なオブジェクトの格納場所はここで指定しておく + cfg->createPart("header") + .createPart("include") + .createPart(IDENTIFIER_VARIABLE) + .createPart(TASK) + .createPart(SEMAPHORE) + .createPart(EVENTFLAG) + .createPart(DATAQUEUE) + .createPart(MAILBOX) + .createPart(FIXEDSIZEMEMORYPOOL) + .createPart(CYCLICHANDLER) + .createPart(INTERRUPTHANDLER) + .createPart(EXCEPTIONHANDLER) + .createPart(INITIALIZER) + .createPart(OBJECT_INITIALIZER) + .createPart("others"); + + //カーネル構成ファイル生成イベントの実行 + KernelCfg::CreationEvent ev; + ev.file = cfg; + Event::raise(ev); + + //エラーチェック + if(ev.file == 0) + ExceptionMessage("Internal error : kernel_cfg event handler eliminates the instance.","内部エラー : kernel_cfgのハンドラがインスタンスを削除した") << throwException; + if(RuntimeObjectTable::getInstance(typeid(KernelCfg)) != ev.file) + ExceptionMessage("Internal error : kernel_cfg event handler creates the illegal instance.","内部エラー : kernel_cfgのハンドラが不正なインスタンスを生成した") << throwException; + + return ev.file; //cfgではダメ + } + + //ファイル名から衝突回避用の名前を生成する + string convert_filename_to_definition(string filename) + { + string result; + string::iterator scope; + + scope = filename.begin(); + while(scope != filename.end()) { + if(isalnum(*scope)) + result += static_cast(toupper(*scope)); + else + result += '_'; + ++ scope; + } + + return result; + } + + //自動ID割付結果ファイルの生成 + KernelID * createKernelID(void) + { + KernelID * id = 0; + + id = KernelID::createInstance(get_filename("kernel_id","kernel_id.h")); + id->disableOutput(); + + //基本的なオブジェクトの格納場所はここで指定しておく + id-> createPart("__header__") + .createPart("body") + .createPart("__footer__"); + + //ファイル生成イベントの実行 + KernelID::CreationEvent ev; + ev.file = id; + Event::raise(ev); + + //エラーチェック + if(ev.file == 0) + ExceptionMessage("Internal error : kernel_id event handler eliminates the instance.","内部エラー : kernel_idのハンドラがインスタンスを削除した") << throwException; + if(RuntimeObjectTable::getInstance(typeid(KernelID)) != ev.file) + ExceptionMessage("Internal error : kernel_id event handler creates the illegal instance.","内部エラー : kernel_idのハンドラが不正なインスタンスを生成した") << throwException; + + //多重インクルード回避用定義の追加 + string defname = convert_filename_to_definition(id->getFilename()); + id->movePart("__header__"); + (*id) // << get_agreement(id->getFilename()) //文言の付与 + << "#ifndef " << defname << '\n' //#ifndef KERNELID_H + << "#define " << defname << "\n\n"; //#define KERNELID_H + + id->movePart("__footer__"); + (*id) << "\n#endif /* " << defname << " */\n\n"; //#endif /* KERNELID_H */ + + return ev.file; //idではダメ + } + + //登録されている文字の最大長を得る + unsigned int countLongestSymbolName(const std::map & identifiers) throw() + { + unsigned int max_length = 0; + std::map::const_iterator scope; + + // もっとも長い名前を持つシンボル名を検索 + scope = identifiers.begin(); + while(scope != identifiers.end()) { + if(max_length < scope->first.size()) + max_length = scope->first.size(); + ++ scope; + } + + return max_length; + } + + //自動ID割付結果出力 (これまでとの互換モード) + void serializeIdentifiers_defineStyle(KernelID * out, std::map & identifier_pool) + { + std::map::const_iterator scope; + string::size_type max_length; + + (*out) << "\t/* object identifier deifnition */\n\n"; + + // もっとも長い名前を持つシンボル名を検索 + max_length = countLongestSymbolName(identifier_pool); + + scope = identifier_pool.begin(); + while(scope != identifier_pool.end()) { + (*out) << "#define " << scope->first + << string(max_length - scope->first.size() + 4, ' ') //値をそろえる + << setw(3) + << scope->second << '\n'; + ++ scope; + } + } + + //自動ID割付結果出力 (定数変数格納方式) + void serializeIdentifiers_variableStyle(KernelID * id, std::map & identifier) throw(Exception) + { + std::map::const_iterator scope; + string::size_type max_length; + KernelCfg * cfg = getRuntimeObjectInstance(KernelCfg); + + /* kernel_id.hに出力 */ + + (*id) << "#ifdef __cplusplus\n" + "#define KERNELID_EXPORT extern \"C\"\n" + "#else\n" + "#define KERNELID_EXPORT extern\n" + "#endif\n\n"; + + // もっとも長い名前を持つシンボル名を検索 + max_length = countLongestSymbolName(identifier); + + scope = identifier.begin(); + while(scope != identifier.end()) { + (*id) << "KERNELID_EXPORT const int " + << scope->first + << ";\n"; + + ++ scope; + } + + (*id) << "\n#undef KERNELID_EXPORT\n\n"; + + /* kernel_cfg.cに定数定義を出力 */ + + cfg->movePart(IDENTIFIER_VARIABLE); + (*cfg) << "\t/* Identifier storage variables */\n"; + scope = identifier.begin(); + while(scope != identifier.end()) { + (*cfg) << "const int " + << scope->first + << string(max_length - scope->first.size() + 4, ' ') + << " = " + << scope->second << ";\n"; + ++ scope; + } + } + + //自動ID割付結果出力 (併用方式 - (toppers-dev 28)) + void serializeIdentifiers_blendedStyle(KernelID * id, std::map & identifier) throw(Exception) + { + /* kernel_id.hへの出力は従来と同じ */ + serializeIdentifiers_defineStyle(id, identifier); + + /* kernel_cfg.cに定数定義を出力 */ + + std::map::const_iterator scope; + string::size_type max_length; + KernelCfg * cfg = getRuntimeObjectInstance(KernelCfg); + + max_length = countLongestSymbolName(identifier); + + cfg->movePart(IDENTIFIER_VARIABLE); + (*cfg) << "\t/* Identifier storage variables */\n"; + scope = identifier.begin(); + while(scope != identifier.end()) { + (*cfg) << "const int " + << scope->first + << "_id" + << string(max_length - scope->first.size() + 1, ' ') + << " = " + << scope->second << ";\n"; + ++ scope; + } + } + + //自動ID割付結果の出力 + void serializeIdentifiers(bool varid_style = false) throw(Exception) + { + KernelID * out = getRuntimeObjectInstance(KernelID); + std::map identifier_pool; + + //識別子プールを生成 + { + Directory * scope = Singleton::getInstance()->findChild("/identifier")->getFirstChild(); + while(scope != 0) + { + identifier_pool[scope->getKey()] = scope->toInteger(); + scope = scope->getNext(); + } + } + + //割付結果の出力 + out->movePart("body"); + if(varid_style) { + serializeIdentifiers_blendedStyle(out, identifier_pool); +// serializeIdentifiers_variableStyle(out, identifier_pool); + } + else { + serializeIdentifiers_defineStyle(out, identifier_pool); + } + + out->enableOutput(); + } + + void serializeConfiguration_headerPart(KernelCfg & out) throw(Exception) + { + const bool backward_compatible = getOptionParameter()["1.3"].isValid(); + + //頭の部分の出力 + out.movePart("header"); + + out // << get_agreement(out.getFilename()) //文言の添付 + << "/* Configured with [" //コンフィギュレーションオプションを出力しておく + << getOptionParameter().getCommandLine() + << "] */\n\n"; + + //1.4以降はkernel_cfg.hを使用 + if(!backward_compatible) + out << "#include " << conv_includefile("kernel_cfg.h") << '\n'; + + //kernel_id.hのinclude (kernel_idはダブルクォートでくくる) + out << "#include \"" << dynamic_cast(RuntimeObjectTable::getInstance(typeid(KernelID)))->getFilename() <<"\"\n" + << '\n'; + + + //CFG_INT/EXCHDR_ENTRY + // Q: "<<"があったりなかったりするのはなぜ? A: 2行目から5行目まではelseブロックで出力している内容とまったく同じ。こうすればコンパイラによってはシュリンクされて一つになるし、可読性も悪くならない。 + if(backward_compatible) { + out << "#if TKERNEL_PRVER >= 0x1040\n" + << "#error \"This configuration file has no compatibility with" + << " TOPPERS/JSP rel 1.4 or later version.\"\n" + "#elif TKERNEL_PRVER >= 0x1011\n" + << "#define CFG_INTHDR_ENTRY(inthdr) INTHDR_ENTRY(inthdr)\n" + "#define CFG_EXCHDR_ENTRY(exchdr) EXCHDR_ENTRY(exchdr)\n" + "#define CFG_INT_ENTRY(inthdr) INT_ENTRY(inthdr)\n" + "#define CFG_EXC_ENTRY(exchdr) EXC_ENTRY(exchdr)\n" + << "#else\n" + << "#define CFG_INTHDR_ENTRY(inthdr) INTHDR_ENTRY(ENTRY(inthdr), inthdr)\n" + "#define CFG_EXCHDR_ENTRY(exchdr) EXCHDR_ENTRY(ENTRY(exchdr), exchdr)\n" + "#define CFG_INT_ENTRY(inthdr) ENTRY(inthdr)\n" + "#define CFG_EXC_ENTRY(exchdr) ENTRY(exchdr)\n" + << "#endif\n\n"; + } + else { + out << "#if TKERNEL_PRVER >= 0x1040\n" + << "#define CFG_INTHDR_ENTRY(inthdr) INTHDR_ENTRY(inthdr)\n" + "#define CFG_EXCHDR_ENTRY(exchdr) EXCHDR_ENTRY(exchdr)\n" + "#define CFG_INT_ENTRY(inthdr) INT_ENTRY(inthdr)\n" + "#define CFG_EXC_ENTRY(exchdr) EXC_ENTRY(exchdr)\n" + << "#else\n" + << "#error \"This configuration file has no compatibility with" + << " TOPPERS/JSP rel 1.3 or earlier.\"\n" + << "#endif\n\n"; + } + + //__EMPTY_LABELマクロの出力 + if(!getOptionParameter()["z"].isValid()) { + + string zeromacro; + + if(getOptionParameter()["ZERO"].isValid()) + zeromacro = getOptionParameter()["ZERO"][0]; + else + zeromacro.assign("x y[0]"); + + out << "#ifndef __EMPTY_LABEL\n" + "#define __EMPTY_LABEL(x,y) " << zeromacro << "\n" + "#endif\n\n"; + } + + /* PRIDのチェック */ + out << "#if TKERNEL_PRID != 0x0001u /* TOPPERS/JSP */\n" + "#error \"You can not use this configuration file without TOPPERS/JSP\"\n" + "#endif\n\n"; + } +} + +void ConfigurationFileGenerator::parseOption(Directory & parameter) +{ + string work; + + if(findOption("h","help")) + { + cerr << endl << Message( + "Kernel configuration file generator\n" + " -id, --kernel_id=filename : Specify the name of ID assignment file\n" + " -cfg,--kernel_cfg=filename : Specify the name of kernel configuration file\n" + " -il, --include-libstyle : Use #include <...> style for kernel headers\n" + " -oproto, --output-prototype: Output task prototype definitions in kernel_cfg\n" + " -z, --nonzero : Do not output __EMPTY_LABEL macro and related definitions\n" + " -1.3 : Generates kernel_cfg.c for TOPPERS/JSP rel 1.3\n", + "カーネル構成ファイルの生成\n" + " -id, --kernel_id=ファイル名 : ID割当ファイルの名前を指定します\n" + " -cfg,--kernel_cfg=ファイル名 : カーネル構成ファイルの名前を指定します\n" + " -il, --include-libstyle : カーネルのヘッダファイルを<...>の形で出力します\n" + " -oproto, --output-prototype : タスク本体などの定義をkernel_cfg.cに生成します\n" + " -z, --nonzero : __EMPTY_LABELマクロの使用を制限します\n" + " -1.3 : TOPPERS/JSP rel 1.3 用のコンフィギュレーションファイルを生成します\n"); + return; + } + + checkOption("cfg","cfg"); + checkOption("id","id"); + + /* + * カーネルコンフィギュレーション結果のファイル (kernel_cfg.c) の初期設定 + */ + + createKernelCfg(); + + /* + * ID割付結果のファイル (kernel_id.h) の初期設定 + */ + + createKernelID(); + + /* その他オプション */ + restrict_zero = findOption("z","zero"); + def_prototype = findOption("oproto","output-prototype"); + libstyle_include = findOption("il","include-libstyle"); + backward_compatible = findOption("1.3","1.3"); + + checkOption("mcfg","minimize-cfg"); + checkOption("ZERO","ZERO"); + checkOption("obj", "dump-object"); + checkOption("ext"); + + activateComponent(); +} + +void ConfigurationFileGenerator::onFatalExit(Directory & container) +{ + //例外で異常終了したら、ファイルを生成しない + dynamic_cast(RuntimeObjectTable::getInstance(typeid(KernelCfg)))->disableOutput(); + dynamic_cast(RuntimeObjectTable::getInstance(typeid(KernelID)))->disableOutput(); +} + +void ConfigurationFileGenerator::createObjectDefinition(MultipartStream * out, Directory & container, int flag, ...) +{ + Directory * scope; + const char * buffer; + string work; + + map sorter; + map::iterator psorter; + + va_list vl; + int i; + + Directory & id = container[string(PREFIX "/") + container.getKey().c_str()]; + + if(container.size() == 0 && findOption("mcfg","minimize-cfg")) + { + if(!getOptionParameter().find("ext")) + ExceptionMessage("Use of the extended option --minimize-cfg. Please use -ext option together.","--minimizeオプションは拡張機能です。使用するには-extを指定してください。").throwException(); + return; + } + va_start(vl, flag); + + + //必要な情報の作成 + work = string(va_arg(vl, const char *)); + id["id"] = work; + transform(work.begin(), work.end(), work.begin(), toupper_function); + id["ID"] = work; + + + if((flag & SHORT_ID) != 0) + { + work = string(va_arg(vl, const char *)); + id["sid"] = work; + for(i=0; i<(signed)work.size(); i++) { + if (work[i] >= 'a' && work[i] <= 'z') + work[i] = work[i] - 'a' + 'A'; + } + id["SID"] = work; + }else + { + id["sid"] = id["id"].toString(); + id["SID"] = id["ID"].toString(); + } + + if(!backward_compatible) + id["symbolprefix"] = "_kernel_"; + + work = container.getKey(); + id["name"] = work; + out->movePart(work); + + //オブジェクト初期化関数を追加 + if((flag & INIT) != 0 && container.size() != 0) + container["/" OBJECT_INITIALIZER].addChild(new Directory(work)); + + (*out) << "\n\t/* " << (Message("Object initializer [%]","オブジェクト初期化ブロック [%]") << work) << " */\n\n"; + + if(((flag & HEADER) != 0) && backward_compatible) + (*out) << "#include " << conv_includefile(work) << "\n\n"; + + if((flag & TNUM) != 0) + { + (*out) << id.format("#define TNUM_$(ID)ID ") << container.size() << "\n\n"; + (*out) << id.format("const ID $(symbolprefix,)tmax_$(id)id = (TMIN_$(ID)ID + TNUM_$(ID)ID - 1);\n\n"); + } + + if((flag & TNUMNO) != 0) + { + (*out) << id.format("#define TNUM_$(ID)NO ") << container.size() << "\n\n"; + (*out) << id.format("const UINT $(symbolprefix,)tnum_$(id)no = TNUM_$(ID)NO;\n\n"); + } + + /* ID順にソート (この時点で連番が確定しているはずなので,チェックはしない) */ + if((flag & (BUFFER|DEFINITION)) != 0) + { + const bool is_identifier = (flag & TNUMNO) == 0; + + i = 0; + scope = container.getFirstChild(); + while(scope != 0) + { + if(is_identifier) + sorter[scope->toInteger(i++)] = scope; + else + sorter[i++] = scope; + + scope = scope->getNext(); + } + } + + //プロトタイプ定義の出力 + if((flag & PROTOTYPE) != 0) + { + buffer = va_arg(vl, const char *); + + if(def_prototype) + { + set func; + set::iterator pfunc; + + scope = container.getFirstChild(); + while(scope != NULL) + { + func.insert(scope->format(buffer)); + scope = scope->getNext(); + } + + pfunc = func.begin(); + while(pfunc != func.end()) + { + (*out) << (*pfunc) << '\n'; + ++ pfunc; + } + } + } + + //バッファの作成 + if((flag & BUFFER) != 0 && container.size() != 0) + { + buffer = va_arg(vl, const char *); + psorter = sorter.begin(); + while(psorter != sorter.end()) + { + (*out) << (*psorter).second->format(buffer) << '\n'; + ++ psorter; + } + (*out) << '\n'; + } + + //定義ブロック(xINIB)の出力 + if((flag & DEFINITION) != 0) + { + buffer = va_arg(vl, const char *); + if(container.size() != 0) + { + (*out) << id.format("const $(SID)INIB $(symbolprefix,)$(sid)inib_table[TNUM_$(ID)") << ( (flag & TNUMNO) != 0 ? "NO" : "ID") << "] = {\n"; + psorter = sorter.begin(); + while(psorter != sorter.end()) + { + (*out) << "\t{" << (*psorter).second->format(buffer) << '}'; + ++ psorter; + if(psorter != sorter.end()) + (*out) << ','; + (*out) << '\n'; + } + (*out) << "};\n\n"; + }else + if( !restrict_zero ) + (*out) << id.format("__EMPTY_LABEL(const $(SID)INIB, $(symbolprefix,)$(sid)inib_table);\n"); + } + + if((flag & INITLIST) != 0) + { + Directory * node; + + /* 宣言順でID番号をソート */ + sorter.clear(); + node = container.getFirstChild(); + while(node != NULL) + { + sorter.insert(pair(node->findChild("#order")->toInteger(), node)); + node = node->getNext(); + } + + *out << id.format("const ID $(symbolprefix,)$(sid)order_table[TNUM_$(ID)ID] = {"); + psorter = sorter.begin(); + while(psorter != sorter.end()) + { + *out << psorter->second->toInteger(); + ++ psorter; + if(psorter != sorter.end()) + *out << ','; + } + *out << "};\n\n"; + } + + //制御ブロック(xCB)の出力 + if((flag & CONTROLBLOCK) != 0) + { + if(container.size() != 0) + (*out) << id.format("$(SID)CB $(symbolprefix,)$(sid)cb_table[TNUM_$(ID)ID];\n\n"); + else + if( !restrict_zero ) + (*out) << id.format("__EMPTY_LABEL($(SID)CB, $(symbolprefix,)$(sid)cb_table);\n\n"); + } +} + +void ConfigurationFileGenerator::body(Directory & container) +{ + Directory * scope; + KernelCfg * out; + string work; + const bool varid_style = findOption("var","variable-id"); + + /* kernel_id.hの出力 */ + serializeIdentifiers(varid_style); + + /* kernel_cfg.cの出力 */ + out = dynamic_cast(RuntimeObjectTable::getInstance(typeid(KernelCfg))); + if(out == 0) { + ExceptionMessage("[Internal error] The stream buffer of kernel_cfg disappeared.","[内部エラー] ファイルストリームが開けません (kernel_cfg.c)").throwException(); + return; + } + + /* 頭の定義部分の作成 */ + serializeConfiguration_headerPart(*out); + + /* INCLUDE */ + out->movePart(INCLUDEFILE); + scope = container(OBJECTTREE "/" INCLUDEFILE)->getFirstChild(); + (*out) << "\t/* " << Message("User specified include files","ユーザ定義のインクルードファイル") << "*/\n"; + while(scope != 0) + { + (*out) << "#include " << scope->toString() << '\n'; + scope = scope->getNext(); + } + (*out) << '\n'; + + /* TASK */ + work.assign("$(tskatr), (VP_INT)($(exinf)), (FP)($(task)), INT_PRIORITY($(itskpri)), __TROUND_STK_UNIT($(stksz)), __stack_$@, $(texatr), (FP)($(texrtn))"); + if(container["/cpu"].toString().compare("nios32") == 0) + work += ", $(hi_limit), $(lo_limit)"; + createObjectDefinition(out, container[OBJECTTREE "/" TASK], HEADER|TNUM|SHORT_ID|BUFFER|DEFINITION|CONTROLBLOCK|INIT|PROTOTYPE|INITLIST,"tsk", "t", "void $(task)(VP_INT exinf);", "static __STK_UNIT __stack_$@[__TCOUNT_STK_UNIT($(stksz))];",work.c_str()); + + /* SEMAPHORE */ + createObjectDefinition(out, container[OBJECTTREE "/" SEMAPHORE], HEADER|TNUM|DEFINITION|CONTROLBLOCK|INIT,"sem", "$(sematr), $(isemcnt), $(maxsem)"); + + /* EVENTFLAG */ + createObjectDefinition(out, container[OBJECTTREE "/" EVENTFLAG], HEADER|TNUM|DEFINITION|CONTROLBLOCK|INIT,"flg", "$(flgatr), $(iflgptn)"); + + /* DATAQUEUE */ + createObjectDefinition(out, container[OBJECTTREE "/" DATAQUEUE], HEADER|TNUM|BUFFER|DEFINITION|CONTROLBLOCK|INIT,"dtq", "#if ($(dtqcnt)) > 0\n static VP_INT __dataqueue_$@[$(dtqcnt)];\n#else\n #define __dataqueue_$@ NULL\n#endif","$(dtqatr), $(dtqcnt), __dataqueue_$@"); + + /* MAILBOX */ + createObjectDefinition(out, container[OBJECTTREE "/" MAILBOX], HEADER|TNUM|DEFINITION|CONTROLBLOCK|INIT,"mbx","$(mbxatr), $(maxmpri)"); + + /* FIXEDSIZEMEMORYPOOL */ + createObjectDefinition(out, container[OBJECTTREE "/" FIXEDSIZEMEMORYPOOL], HEADER|TNUM|BUFFER|DEFINITION|CONTROLBLOCK|INIT,"mpf","static __MPF_UNIT __fixedsize_memorypool_$@[__TCOUNT_MPF_UNIT($(blksz)) * (($(blkcnt)))];","$(mpfatr), __TROUND_MPF_UNIT($(blksz)), __fixedsize_memorypool_$@, (VP)((VB *)__fixedsize_memorypool_$@ + sizeof(__fixedsize_memorypool_$@))"); + + /* CYCLICHANDLER */ + createObjectDefinition(out, container[OBJECTTREE "/" CYCLICHANDLER], HEADER|TNUM|DEFINITION|CONTROLBLOCK|INIT|PROTOTYPE,"cyc","void $(cychdr)(VP_INT exinf);","$(cycatr),$(exinf),(FP)($(cychdr)),$(cyctim),$(cycphs)"); + + /* INTERRUPTHANDLER */ + createObjectDefinition(out, container[OBJECTTREE "/" INTERRUPTHANDLER], HEADER|BUFFER|TNUMNO|DEFINITION|INIT|PROTOTYPE,"inh","void $(inthdr)(void);","CFG_INTHDR_ENTRY($(inthdr));","$@,$(inhatr),(FP)CFG_INT_ENTRY($(inthdr))"); + + /* EXCEPTIONHANDLER */ + createObjectDefinition(out, container[OBJECTTREE "/" EXCEPTIONHANDLER], HEADER|BUFFER|TNUMNO|DEFINITION|INIT|PROTOTYPE,"exc","void $(exchdr)(VP p_excinf);","CFG_EXCHDR_ENTRY($(exchdr));","$@,$(excatr),(FP)CFG_EXC_ENTRY($(exchdr))"); + + + /* オブジェクト初期化ルーチン */ + out->movePart(OBJECT_INITIALIZER); + (*out) << "\t/* " << Message("Object initialization routine","オブジェクト初期化ルーチン") << " */\n\n"; + (*out) << "void\n" << conv_kernelobject("object_initialize") << "(void)\n{\n"; + scope = container["/" OBJECT_INITIALIZER].getFirstChild(); + while(scope != 0) + { + (*out) << '\t' << conv_kernelobject(scope->toString() + "_initialize") << "();\n"; + scope = scope->getNext(); + } + (*out) << "}\n\n"; + + + /* 初期化ハンドラ */ + out->movePart(INITIALIZER); + (*out) << "\t/* " << Message("Initialization handler","初期化ハンドラ起動ルーチン") << " */\n\n"; + (*out) << "void\n" << conv_kernelobject("call_inirtn") << "(void)\n{\n"; + scope = container[OBJECTTREE "/" INITIALIZER].getFirstChild(); + while(scope != 0) + { + (*out) << scope->format("\t$(inirtn)( (VP_INT)($(exinf)) );\n"); + scope = scope->getNext(); + } + (*out) << "}\n\n"; + + /* 終了ハンドラ */ + scope = container[OBJECTTREE "/" TERMINATOR].getLastChild(); + if(!backward_compatible) { + (*out) << "void\n" << conv_kernelobject("call_terrtn") << "(void)\n{\n"; + while(scope != 0) + { + (*out) << scope->format("\t$(terrtn)( (VP_INT)($(exinf)) );\n"); + scope = scope->getPrev(); + } + (*out) << "}\n\n"; + } + else { + if(scope->size() != 0) + ExceptionMessage("VATT_TER is not supported for TOPPERS/JSP rel 1.3 or earlier.", + "VATT_TERはTOPPERS/JSP rel 1.3以前ではサポートされません").throwException(); + } + + out->movePart("others"); + (*out) << "TMEVTN " << conv_kernelobject("tmevt_heap") << "[TNUM_TSKID + TNUM_CYCID];\n\n"; + + container["/object_initializer"].erase(); + + string filename; + if(findOption("obj","dump-object",&filename)) + { + if(filename.empty()) + filename.assign("kernel_obj.dat"); + + fstream f(filename.c_str(),ios::out|ios::binary); + if(f.is_open()) + { + container[OBJECTTREE].Store(&f); + f.close(); + }else + ExceptionMessage(" Failed to open the file % for storing object definitions"," オブジェクト情報を格納するためのファイル(%)が開けません") << filename << throwException; + } + + out->enableOutput(); +} + + +/* ======================================================================== */ + diff --git a/uzume_prototype/kernel/cfg/jsp/jsp_staticapi.cpp b/uzume_prototype/kernel/cfg/jsp/jsp_staticapi.cpp new file mode 100644 index 0000000..7b7d941 --- /dev/null +++ b/uzume_prototype/kernel/cfg/jsp/jsp_staticapi.cpp @@ -0,0 +1,276 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: jsp_staticapi.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +// $Header: /cvsroot/toppersjsp4bf/jsp/cfg/jsp/jsp_staticapi.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + +#include "jsp/jsp_defs.h" + +#include "base/parser.h" +#include "base/mpstrstream.h" +#include + +using namespace std; + +DECLARE_API(INCLUDE,"INCLUDE") +{ + Token token; + Directory * node; + Directory * scope; + + last = NULL; + p.getToken(token, Token::STRINGLITERAL); + token.chopLiteral(); + + if( (token[0] != '\"' || token[token.size()-1] != '\"') && + (token[0] != '<' || token[token.size()-1] != '>') ) + ExceptionMessage("An include filename must be enclosed with \"...\" or <...>","ファイル名は \"...\" か <...> の形でなければなりません").throwException(); + + node = container.openChild(OBJECTTREE,INCLUDEFILE,NULL); + last = node; + + //重複チェック + scope = node->getFirstChild(); + while(scope != 0) + { + if(token.compare((*scope).toString()) == 0) + { + cerr << p.getStreamLocation() << ' ' << (Message("Include file % was already specified (ignored).","インクルードファイル%が複数回指定されました (無視します)") << token) << endl; + return; + } + scope = scope->getNext(); + } + + node->addChild(new Directory(token)); +} + +DECLARE_API(CRE_TSK,"CRE_TSK") +{ + Token token; + string work; + Directory * node; + + p.getToken(token); + node = allocate(container[OBJECTTREE], token, TASK); + (*node)["position"] = p.getStreamLocation(); + + p.getToken(",","{",NULL); + parseParameters(p,node,"tskatr,exinf,task,itskpri,stksz"); + p.getToken(",","NULL","}",NULL); + + (*node)["texatr"] = "TA_NULL"; + (*node)["texrtn"] = "NULL"; + + if(container["/cpu"].toString().compare("nios32") == 0) + { + (*node)["hi_limit"] = "TSK_HI_LIMIT"; + (*node)["lo_limit"] = "TSK_LO_LIMIT"; + } +} + +DECLARE_API(VATT_TRW,"VATT_TRW") +{ + Token token; + Directory * node; + + if(container["/cpu"].toString().compare("nios32") != 0) + ExceptionMessage("VATT_TRW is not supported except for the processor 'nios32'.","VATT_TRWはnios32プロセッサでのみサポートされます").throwException(); + + p.getToken(token); + node = find(container[OBJECTTREE], token, TASK); + + p.getToken(",","{",NULL); + parseParameters(p, node, "hi_limit,lo_limit"); + p.getToken("}"); +} + +DECLARE_API(DEF_TEX,"DEF_TEX") +{ + Token token; + Directory * node; + + p.getToken(token); + node = find(container[OBJECTTREE], token, TASK); + + p.getToken(",","{",NULL); + parseParameters(p, node, "texatr,texrtn"); + p.getToken("}"); +} + +DECLARE_API(CRE_SEM,"CRE_SEM") +{ + Token token; + Directory * node; + + p.getToken(token); + node = allocate(container[OBJECTTREE], token, SEMAPHORE); + (*node)["position"] = p.getStreamLocation(); + + p.getToken(",","{",NULL); + parseParameters(p,node,"sematr,isemcnt,maxsem"); + p.getToken("}"); +} + +DECLARE_API(CRE_FLG,"CRE_FLG") +{ + Token token; + Directory * node; + + p.getToken(token); + node = allocate(container[OBJECTTREE], token, EVENTFLAG); + (*node)["position"] = p.getStreamLocation(); + + p.getToken(",","{",NULL); + parseParameters(p,node,"flgatr,iflgptn"); + p.getToken("}"); +} + +DECLARE_API(CRE_DTQ,"CRE_DTQ") +{ + Token token; + Directory * node; + + p.getToken(token); + node = allocate(container[OBJECTTREE], token, DATAQUEUE); + (*node)["position"] = p.getStreamLocation(); + + p.getToken(",","{",NULL); + parseParameters(p,node,"dtqatr,dtqcnt"); + p.getToken(",","NULL","}",NULL); +} + +DECLARE_API(CRE_MBX,"CRE_MBX") +{ + Token token; + Directory * node; + + p.getToken(token); + node = allocate(container[OBJECTTREE], token, MAILBOX); + (*node)["position"] = p.getStreamLocation(); + + p.getToken(",","{",NULL); + parseParameters(p,node,"mbxatr,maxmpri"); + p.getToken(",","NULL","}",NULL); +} + +DECLARE_API(CRE_MPF,"CRE_MPF") +{ + Token token; + Directory * node; + + p.getToken(token); + node = allocate(container[OBJECTTREE], token, FIXEDSIZEMEMORYPOOL); + (*node)["position"] = p.getStreamLocation(); + + p.getToken(",","{",NULL); + parseParameters(p,node,"mpfatr,blkcnt,blksz"); + p.getToken(",","NULL","}",NULL); +} + +DECLARE_API(CRE_CYC,"CRE_CYC") +{ + Token token; + Directory * node; + + p.getToken(token); + node = allocate(container[OBJECTTREE], token, CYCLICHANDLER); + (*node)["position"] = p.getStreamLocation(); + + p.getToken(",","{",NULL); + parseParameters(p,node,"cycatr,exinf,cychdr,cyctim,cycphs"); + p.getToken("}"); +} + +DECLARE_API(DEF_INH,"DEF_INH") +{ + Token token; + Directory * node; + + p.getToken(token); + node = allocate(container[OBJECTTREE], token, INTERRUPTHANDLER, false); + (*node)["position"] = p.getStreamLocation(); + + p.getToken(",","{",NULL); + parseParameters(p,node,"inhatr,inthdr"); + p.getToken("}"); +} + +DECLARE_API(DEF_EXC,"DEF_EXC") +{ + Token token; + Directory * node; + + p.getToken(token); + node = allocate(container[OBJECTTREE], token, EXCEPTIONHANDLER, false); + (*node)["position"] = p.getStreamLocation(); + + p.getToken(",","{",NULL); + parseParameters(p,node,"excatr,exchdr"); + p.getToken("}"); +} + +DECLARE_API(ATT_INI,"ATT_INI") +{ + Token token; + Directory * node; + + node = container.openChild(OBJECTTREE,INITIALIZER,NULL)->addChild(); + last = node; + + (*node)["position"] = p.getStreamLocation(); + + p.getToken("{",NULL); + parseParameters(p,node,"iniatr,exinf,inirtn"); + p.getToken("}"); +} + +DECLARE_API(ATT_FIN, "VATT_TER") +{ + Token token; + Directory * node; + + node = container.openChild(OBJECTTREE,TERMINATOR,NULL)->addChild(); + last = node; + + (*node)["position"] = p.getStreamLocation(); + + p.getToken("{",NULL); + parseParameters(p,node,"teratr,exinf,terrtn"); + p.getToken("}"); +} + + diff --git a/uzume_prototype/kernel/config/blackfin/Makefile.config b/uzume_prototype/kernel/config/blackfin/Makefile.config new file mode 100644 index 0000000..c6474b5 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/Makefile.config @@ -0,0 +1,60 @@ +# +# + +# +# Makefile のプロセッサ依存部(Blackfin用) +# + +# +# ターゲットアーキテクチャの定義 +# +TARGET = bfin-elf + +# +# コンパイルオプション +# -fno-optimize-sibling-calls は、spurious_int_handler()を正常動作させるために必須。削除してはいけない。 +# +INCLUDES := $(INCLUDES) -I$(SRCDIR)/config/$(CPU) +COPTS := $(COPTS) -Wall -g2 -O -fno-optimize-sibling-calls +CDEFS := $(CDEFS) -D __ADSPLPBLACKFIN__ -DLABEL_ASM + +# +# カーネルに関する定義 +# cpu_mmr.oは、gdbのためのcore mmr用デバッグ・シンボル。 +# +KERNEL_DIR := $(KERNEL_DIR):$(SRCDIR)/config/$(CPU) +KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) cpu_support.o +KERNEL_COBJS := $(KERNEL_COBJS) cpu_config.o cpu_defs.o + +# +# スタートアップモジュールに関する定義 +# +START_OBJS = start.o + +$(START_OBJS): %.o: %.S + $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $< + +$(START_OBJS:.o=.d): %.d: %.S + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \ + -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend + +# +# C++大域オブジェクト初期化モジュールに関する定義 +# +CXX_BEGIN_OBJS = cpu_crtbegin.o +CXX_END_OBJS = cpu_crtend.o + +$(CXX_BEGIN_OBJS): %.o: %.c + $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $< + +$(CXX_END_OBJS): %.o: %.c + $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $< + +$(CXX_BEGIN_OBJS:.o=.d): %.d: %.c + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \ + -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend + +$(CXX_END_OBJS:.o=.d): %.d: %.c + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \ + -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend + \ No newline at end of file diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf506/bf506elf.ld b/uzume_prototype/kernel/config/blackfin/_common_bf506/bf506elf.ld new file mode 100644 index 0000000..33c4105 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf506/bf506elf.ld @@ -0,0 +1,267 @@ + +OUTPUT_FORMAT("elf32-bfin","elf32-bfin","elf32-bfin") +OUTPUT_ARCH(bfin) + +PROVIDE (ldf_stack_end = 0xffb00FFC ) ; +PROVIDE (hardware_init_hook = 0) ; +PROVIDE (software_init_hook = 0) ; +PROVIDE (software_term_hook = 0) ; +PROVIDE (__kernel_boot_for_gdb = 0); + +ENTRY (start); + +MEMORY + { + /* BF506は外部メモリが接続できないため、MEM_SDRAM/MEM_ASYNC_Xは削除する */ +/* MEM_SDRAM (XW) : ORIGIN = 0x00000000, LENGTH = 128M */ +/* MEM_ASYNC_0 (XW) : ORIGIN = 0x20000000, LENGTH = 1M */ +/* MEM_ASYNC_1 (XW) : ORIGIN = 0x20100000, LENGTH = 1M */ +/* MEM_ASYNC_2 (XW) : ORIGIN = 0x20200000, LENGTH = 1M */ +/* MEM_ASYNC_3 (XW) : ORIGIN = 0x20300000, LENGTH = 1M */ + + MEM_FLASH (XR) : ORIGIN = 0x20000000, LENGTH = 4M + + MEM_L1_DATA_A (W!X) : ORIGIN = 0xff800000, LENGTH = 16K /* BF506のバンクAは32kBだが、キャッシュ用に16kBあけておく */ + MEM_L1_CODE (XR) : ORIGIN = 0xffa00000, LENGTH = 32K /* BF506のバンクAは32kBだが、キャッシュ用に16kBあけておく */ + MEM_L1_SCRATCH (W!X) : ORIGIN = 0xffb00000, LENGTH = 4K + + MEM_L2 : ORIGIN = 0xffe00000, LENGTH = 0 /* DUMMY */ + + MEM_SYSMMR (W!X) : ORIGIN = 0xffc00000, LENGTH = 2M + MEM_COREMMR (W!X) : ORIGIN = 0xffe00000, LENGTH = 2M + } + +SECTIONS +{ + +/* Read-only sections, merged into text segment: */ + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } + .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } + .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } + .rel.data.rel.ro : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) } + .rela.data.rel.ro : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) } + .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } + .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } + .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } + .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } + .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } + .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.sdata : { *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*) } + .rela.sdata : { *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*) } + .rel.sbss : { *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*) } + .rela.sbss : { *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*) } + .rel.sdata2 : { *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*) } + .rela.sdata2 : { *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*) } + .rel.sbss2 : { *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*) } + .rela.sbss2 : { *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*) } + .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } + .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + .l2 : + { + *(.l2 .l2.*) +/* } >MEM_FLASH */ + } >MEM_L1_CODE + + .start : + { + KEEP (*(.start)) + } >MEM_L1_CODE =0 + + .text : + { + *(.text .stub .text.* .gnu.linkonce.t.*) + KEEP (*(.text.*personality*)) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + } >MEM_L1_CODE =0 + + .init : + { + KEEP (*(.init)) + } >MEM_L1_CODE =0 + + .plt : { *(.plt) } >MEM_L1_CODE + + .fini : + { + KEEP (*(.fini)) + } >MEM_L1_CODE =0 + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } >MEM_L1_DATA_A + .rodata1 : { *(.rodata1) } >MEM_L1_DATA_A + + .sdata2 : + { + *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) + } >MEM_L1_DATA_A + + .sbss2 : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) } >MEM_L1_DATA_A + .eh_frame_hdr : { *(.eh_frame_hdr) } >MEM_L1_DATA_A + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } >MEM_L1_DATA_A + .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } >MEM_L1_DATA_A + + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = ALIGN(0x1000) + (. & (0x1000 - 1)); + /* Exception handling */ + .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } >MEM_L1_DATA_A + .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } >MEM_L1_DATA_A + /* Thread Local Storage sections */ + .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } >MEM_L1_DATA_A + .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } >MEM_L1_DATA_A + .preinit_array : + { + PROVIDE_HIDDEN (___preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (___preinit_array_end = .); + } >MEM_L1_DATA_A + .init_array : + { + PROVIDE_HIDDEN (___init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE_HIDDEN (___init_array_end = .); + } >MEM_L1_DATA_A + .fini_array : + { + PROVIDE_HIDDEN (___fini_array_start = .); + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + PROVIDE_HIDDEN (___fini_array_end = .); + } >MEM_L1_DATA_A + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin*.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*crtend*.o(.ctors)) + } >MEM_L1_DATA_A + .dtors : + { + KEEP (*crtbegin*.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*crtend*.o(.dtors)) + } >MEM_L1_DATA_A + .jcr : { KEEP (*(.jcr)) } >MEM_L1_DATA_A + .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) } >MEM_L1_DATA_A + .dynamic : { *(.dynamic) } >MEM_L1_DATA_A + .data : + { + *(.data .data.* .gnu.linkonce.d.*) + KEEP (*(.gnu.linkonce.d.*personality*)) + SORT(CONSTRUCTORS) + } >MEM_L1_DATA_A + .data1 : { *(.data1) } >MEM_L1_DATA_A + .got : { *(.got.plt) *(.got) } >MEM_L1_DATA_A + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : + { + *(.sdata .sdata.* .gnu.linkonce.s.*) + } >MEM_L1_DATA_A + __edata = .; PROVIDE (_edata = .); + .sbss : + { + __bss_start = .; + *(.dynsbss) + *(.sbss .sbss.* .gnu.linkonce.sb.*) + *(.scommon) + } >MEM_L1_DATA_A + .bss : + { + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. + FIXME: Why do we need it? When there is no .bss section, we don't + pad the .data section. */ + . = ALIGN(. != 0 ? 32 / 8 : 1); + __bss_end = .; + } >MEM_L1_DATA_A + . = ALIGN(32 / 8); + . = ALIGN(32 / 8); + __end = .; PROVIDE (_end = .); + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + + __stack_end = ORIGIN(MEM_L1_SCRATCH) + LENGTH(MEM_L1_SCRATCH); + + __heap_start = ORIGIN(MEM_L1_DATA_A); + __heap_end = ORIGIN(MEM_L1_DATA_A) + LENGTH(MEM_L1_DATA_A); + + PROVIDE (end = .) ; + +} diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf506/chip_config.c b/uzume_prototype/kernel/config/blackfin/_common_bf506/chip_config.c new file mode 100644 index 0000000..928b7e4 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf506/chip_config.c @@ -0,0 +1,383 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * Copyright (C) 2010,2011 by Kaneko System Co., Ltd. + * + * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + +/* + * ターゲットシステム依存モジュール(ADSP-BF506用) + */ + +#include "jsp_kernel.h" +#include + +#ifdef __GNUC__ +#include /* gnu tool chain */ +#elif defined(__ECC__) +#include /* VisualDSP++ */ +#include +#include +#else +#error "Compiler is not supported" +#endif + + +/* + * ターゲットシステム依存の初期化 + */ +void +sys_initialize() +{ + /* + * スプリアス割り込みハンドラの設定 + * + * cpu_initialize()が行うダミーの割り込みハンドラの設定を上書きする。 + * アプリケーションが割り込みハンドラを設定すると、以下の設定も上書き + * される。 + */ + int i; + + for ( i=0; i> 8; + *pUART0_LCR &= ~DLAB; + + /* モード設定, パリティ無し 8bit data, 1 stop bit */ + *pUART0_LCR = 0x03; + + /* 割込み禁止 */ + *pUART0_IER_CLEAR = 0xFFFF; + + *pPORTG_MUX &= ~(0x3000); // bit13:12 だけを0にする + *pPORTG_FER |= 0x3000; // PG12,PG13をUART0に割り振る + +#if TNUM_SIOP_UART > 1 + *pPORTF_MUX &= ~(0x00C0); // bit7:6 だけを0にする + *pPORTF_FER |= 0x00C0; // PF6,7をUART1に割り振る +#endif +} + +/* + * priority_maskは、event順位0..15に応じた割り込み要求のビットマップを保持する。 + * priority_mask[]のインデックスはevent順位と同じである。割り込み要因は BF51xでは + * 64要因あるので、unsigned long longによる64bit型としている。 + * + * device_dispatch()はpriority_mask[]を参照して、現在起きたイベントがどの割り込み + * 要因であるか決定する助けとする。 + * + * この変数はmake_priority_mask()を呼ぶ度に、実際のIARxの値に応じて上書きされる。 + * + */ +unsigned long long int priority_mask[16]={ + 0x0000000000000000ull, /* EMU */ + 0x0000000000000000ull, /* RST */ + 0x0000000000000000ull, /* NMI */ + 0x0000000000000000ull, /* EVX */ + 0x0000000000000000ull, + 0x0000000000000000ull, /* IVHW */ + 0x0000000000000000ull, /* IVTMR */ + 0xFF680000000007FFull, /* IVG7 */ + 0x0000000000003800ull, /* IVG8 */ + 0x00000000000FC000ull, /* IVG9 */ + 0x00F9000003F00000ull, /* IVG10 */ + 0x00000000FC000000ull, /* IVG11 */ + 0x000003FF00000000ull, /* IVG12 */ + 0x00007C0000000000ull, /* IVG13 */ + 0x0000000000000000ull, /* IVG14 */ + 0x0000000000000000ull /* IVG15 */ +}; + + +/* +* SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み +* のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので +* その分補正する。 +*/ +#define INSTALL_PRIORITY \ + for ( i=0; i<8; i++ ){ \ + priority = iar & 0xf; /* IARから優先順位を取り出す */ \ + priority_mask[priority + 7] |= device; /* 取り出した優先順位に基づきデバイスを登録 */ \ + device <<= 1; /* 次のデバイス */ \ + iar >>= 4; /* 次のIARフィールド */ \ + } + +/* +* 割り込み順位ごとのISRビットマップの作成SIC_IARxの設定はこの部分より前に済ませること。 +* この関数はuITRONのイニシャライザで使用することを想定しており、特に割り込みから保護していない。 +*/ +void make_priority_mask( void ) +{ + unsigned int i, priority, iar; + unsigned long long int device; + + // priority_maskは、event順位0..15に応じた割り込み要求のビットマップを保持する。 + // 最初にクリアする + for ( i=0; i<16; i++ ){ + priority_mask[i] = 0; + } + + device = 1; + iar = *pSIC_IAR0; + INSTALL_PRIORITY + + iar = *pSIC_IAR1; + INSTALL_PRIORITY + + iar = *pSIC_IAR2; + INSTALL_PRIORITY + + iar = *pSIC_IAR3; + INSTALL_PRIORITY + + iar = *pSIC_IAR4; + INSTALL_PRIORITY + + iar = *pSIC_IAR5; + INSTALL_PRIORITY + + iar = *pSIC_IAR6; + INSTALL_PRIORITY +} + + +/* + * 割り込みの許可。ADSP-BF51xは効率的な割り込み処理と安全な割り込み禁止を両立する + * 手段を持たないため、禁止関数は置いていない。 + * + * 不便ではあるが、プログラマに注意を促すためにそうしている。 + */ +ER ena_int( INTNO intno ) +{ + unsigned int mask; + SIL_PRE_LOC; + + if ( intno >= DEVICE_INTERRUPT_COUNT ) + return ( E_PAR ); + else { + if ( intno < 32 ){ + mask = 1 << intno; + SIL_LOC_INT(); + *pSIC_IMASK0 |= mask; + asm volatile( "ssync;" ); + SIL_UNL_INT(); + } + else{ + mask = 1 << (intno-32); + SIL_LOC_INT(); + *pSIC_IMASK1 |= mask; + asm volatile( "ssync;" ); + SIL_UNL_INT(); + } + return (0); + } +} + + +/* + * 割り込みマスクの取得。ADSP-BF51xは効率的な割り込み処理と安全な割り込み禁止を両立する + * 手段を持たないため、禁止関数は置いていない。 + * + * 不便ではあるが、プログラマに注意を促すためにそうしている。 + */ + + +extern ER get_ims( IMS * p_ims ) +{ + SIL_PRE_LOC; + + SIL_LOC_INT(); + *p_ims = (((IMS)*pSIC_IMASK1)<<32 ) | (IMS)*pSIC_IMASK0; + SIL_UNL_INT(); + return( 0 ); +} + + +/* + * 割り込みをデバイスに割り当てる。 + * + * この間数は割り込み発生時に共通割り込みハンドラの一部としてアセンブリ言語から割り込み禁止状態で + * 呼ばれる。実割り込みハンドラを割り込み可能にするため、asm文を使って途中で割り込み可能にしている。 + * 割り込み禁止状態で呼ぶのは割り込み源の特定を安全におこなうためである。 + * + */ +void device_dispatcher( unsigned int priority, unsigned int imask ) +{ + unsigned int device, candidates; + unsigned long long int longcandidates, sic_isr, sic_imask; + + // 以下では SIC_IMASK0,1をまとめて64bitレジスタとして扱っている。SIC_ISRも同じである。 + get_ims(&sic_imask); + sic_isr = (((IMS)*pSIC_ISR1)<<32 ) | (IMS)*pSIC_ISR0; + + // 現在のプライオリティに相当する割込み源を特定する。 + longcandidates = priority_mask[priority] & sic_isr & sic_imask; + + asm volatile("sti %0;": : "d"(imask) ); + + if ( ! longcandidates ) // 割り込み源が特定できないなら、コア由来である + { + if ( priority == ik_hardware_err) + dev_vector[INHNO_HW_ERROR](); + else + if ( priority == ik_timer) + dev_vector[INHNO_TIMER](); + else + dev_vector[INHNO_RAISE](); // ソフトウェア割り込み + + } + else if ( longcandidates & 0xFFFFFFFF00000000ull ) + { + candidates = longcandidates >> 32; + if ( candidates & 0x80000000 ) + device = 31; + else + { +#ifdef __GNUC__ + asm ( "r1.L = signbits %1; %0 = r1.L(z);":"=d"(device) :"d"(candidates): "R1" ); +#elif defined(__ECC__) + asm( "%0 = signbits %1;" : "=l"( device ) : "d"( candidates ) ); +#else +#error "Compiler is not supported" +#endif + device = 30 - device; // bit mask is converted to bit number + } + dev_vector[device+32](); + } + else + { + candidates = (unsigned int)longcandidates; + if ( candidates & 0x80000000 ) + device = 31; + else + { +#ifdef __GNUC__ + asm ( "r1.L = signbits %1; %0 = r1.L(z);":"=d"(device) :"d"(candidates): "R1" ); +#elif defined(__ECC__) + asm( "%0 = signbits %1;" : "=l"( device ) : "d"( candidates ) ); +#else +#error "Compiler is not supported" +#endif + device = 30 - device; // bit mask is converted to bit number + } + dev_vector[device](); + } +} + + + +/* + * ターゲットシステムの終了。TOPPERS/JSPは対話型ROMモニタに戻ることを想定しているが、 + * このボードにROMはない。 + */ +void +sys_exit() +{ + while(1) + ; +} + +/* + * ターゲットシステムの文字出力。割り込みが無効な状態でポーリングによる出力を行う。 + */ +void +sys_putc(char c) +{ + if ( c== 0x0A ) /* もし LF ならば */ + sys_putc( 0x0D ); /* CRを一文字送信 */ + + while( !( *pUART0_LSR & (1<<5)) ) + ; /* UART0 LSRのTHREが1になるまで待つ。1ならば送信レジスタ空き。*/ + + *pUART0_THR = c; /* 一文字送信 */ +} + + + diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf506/chip_config.h b/uzume_prototype/kernel/config/blackfin/_common_bf506/chip_config.h new file mode 100644 index 0000000..e4863ea --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf506/chip_config.h @@ -0,0 +1,344 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2009 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * Copyright (C) 2010,2011 by Kaneko System Co., Ltd. + * + * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +#ifndef _CHIP_CONFIG_H_ +#define _CHIP_CONFIG_H_ + + +/* + * ターゲットシステム依存モジュール(EZKIT-BF534,6,7用) + * + * このインクルードファイルは,t_config.h のみからインクルードされる. + * 他のファイルから直接インクルードしてはならない. +*/ + +/* + * ターゲットシステムのハードウェア資源の定義 + * + * DEVICE_INTERRUPT_COUNTはSIC_IMASKのビット数 + * を与える。 + * ADSP-BF506のビット数は56なので、値は56である。 + */ + +#define DEVICE_INTERRUPT_COUNT 56 + + + +/* + * PLLクロック周波数 + */ +#define PLLCLOCK (CLKIN*MSELVAL) +#define SYSCLOCK (PLLCLOCK / SSELVAL) +#define CORECLOCK (PLLCLOCK / CSELVAL) + + + +/* + * TICの割込みハンドラのベクタ番号 + */ +#ifdef USE_TIC_CORE +#define INHNO_TIMER INHNO_CORE_TIMER +#else +#define INHNO_TIMER INHNO_TIMER7 +#endif + + +/* + * 微少時間待ちのための定義 + * sil_dly_nseの呼び出しオーバーヘッドとループボディーサイクルを + * nSで表す。関数はcpu_support.asmに定義してある。 + * SIL_DLY_TIM1は24サイクル。32nS( 750MHz ), 40nS( 600MHz ) + * SIL_DLY_TIM2は12サイクル。16nS( 750MHz ), 20nS( 600MHz ) + */ + + +#define SIL_DLY_TIM1 (24*1000000000/CORECLOCK) +#define SIL_DLY_TIM2 (12*1000000000/CORECLOCK) + +/************************************************************************* + * uart.c用構成マクロ + */ + +/* シリアルの割込みハンドラのベクタ番号 */ +#define INHNO_SIO0_TX INHNO_UART0_TX +#define INHNO_SIO0_RX INHNO_UART0_RX +#define INHNO_SIO1_TX INHNO_UART1_TX +#define INHNO_SIO1_RX INHNO_UART1_RX + +/* + * UARTレジスタの配置境界。ADSP-BF506の内蔵UARTは4バイト周期でレジスタが + * 並んでいるので、ここには4を指定する。 + */ +#define UART_BOUNDARY 4 + +/* UARTレジスタにsil_xxb_iop()を使ってアクセスするときにはUART_IOP_ACCESSを 宣言する。*/ +#define UART_IOP_ACCESS + +/* シリアルポートのアドレス。 */ +#define UART0_ADDRESS 0xFFC00400 // 内蔵UART0 DLLのアドレス。 +#define UART1_ADDRESS 0xFFC02000 // 内蔵UART1 DLLのアドレス。 + +/* UARTのボーレートジェネレータに設定すべき値. */ +#define UART0_DIVISOR SYSCLOCK/16/UART0_BAUD_RATE +#define UART1_DIVISOR SYSCLOCK/16/UART1_BAUD_RATE + +/* 内蔵UARTを使う場合は、UARTx_BLACKFIN_UCENを宣言してUCENを初期化しなければならない。*/ +#define UART0_BLACKFIN_UCEN +#define UART1_BLACKFIN_UCEN + + +/* + * uart.c用構成マクロ終わり + *************************************************************************/ + + + +/* + * 割り込みベクトル番号 + * + * この定義はコンフィグレーションファイルでDEF_INHの引数として使う + * SIC_ISRにおけるビット番号である。 + * + */ + +#define INHNO_PLL 0 +#define INHNO_DMA_ERROR 1 +#define INHNO_PPI_ERROR 2 +#define INHNO_SPORT0_ERROR 3 +#define INHNO_SPORT1_ERROR 4 +#define INHNO_UART0_ERROR 5 +#define INHNO_UART1_ERROR 6 +#define INHNO_SPI0_ERROR 7 +#define INHNO_SPI1_ERROR 8 +#define INHNO_CAN_ERROR 9 +#define INHNO_RSI_INT0 10 +/* reserved */ +#define INHNO_CNT0 12 +#define INHNO_CNT1 13 +#define INHNO_PPI 14 +#define INHNO_RSI 15 +#define INHNO_SPORT0_RX 16 +#define INHNO_SPORT0_TX 17 +#define INHNO_SPORT1_RX 18 +#define INHNO_SPORT1_TX 19 +#define INHNO_SPI0 20 +#define INHNO_SPI1 21 +#define INHNO_UART0_RX 22 +#define INHNO_UART0_TX 23 +#define INHNO_UART1_RX 24 +#define INHNO_UART1_TX 25 +#define INHNO_CAN_RX 26 +#define INHNO_CAN_TX 27 +#define INHNO_TWI 28 +#define INHNO_PFA_PORT 29 +#define INHNO_PFB_PORT 30 +/* reserved */ + +#define INHNO_TIMER0 32 +#define INHNO_TIMER1 33 +#define INHNO_TIMER2 34 +#define INHNO_TIMER3 35 +#define INHNO_TIMER4 36 +#define INHNO_TIMER5 37 +#define INHNO_TIMER6 38 +#define INHNO_TIMER7 39 +#define INHNO_PFA_PORTG 40 +#define INHNO_PFB_PORTG 41 +#define INHNO_MDMA_DST 42 +#define INHNO_MDMA_SRC 43 +#define INHNO_WDOG 44 +#define INHNO_PFA_PORTH 44 +#define INHNO_PFB_PORTH 45 +#define INHNO_ACM_ERROR 46 +#define INHNO_ACM 47 +/* reserved */ +/* reserved */ +#define INHNO_PWM0_TRIPINT 51 +#define INHNO_PWM0_SYNCINT 52 +#define INHN1_PWM0_TRIPINT 53 +#define INHN1_PWM0_SYNCINT 54 +#define INHNO_RSI_INT1 55 + +// SIC_ISRにない特殊な割り込み +#define INHNO_HW_ERROR 56 +#define INHNO_CORE_TIMER 57 +#define INHNO_RAISE 58 + + +/* + * SIC_ISRの割り込みのベクタ番号 + * + * この定義はena_int, dis_intの引数として使う。 + */ + +#define INTNO_PLL 0 +#define INTNO_DMA_ERROR 1 +#define INTNO_PPI_ERROR 2 +#define INTNO_SPORT0_ERROR 3 +#define INTNO_SPORT1_ERROR 4 +#define INTNO_UART0_ERROR 5 +#define INTNO_UART1_ERROR 6 +#define INTNO_SPI0_ERROR 7 +#define INTNO_SPI1_ERROR 8 +#define INTNO_CAN_ERROR 9 +#define INTNO_RSI_INT0 10 +/* reserved */ +#define INTNO_CNT0 12 +#define INTNO_CNT1 13 +#define INTNO_PPI 14 +#define INTNO_RSI 15 +#define INTNO_SPORT0_RX 16 +#define INTNO_SPORT0_TX 17 +#define INTNO_SPORT1_RX 18 +#define INTNO_SPORT1_TX 19 +#define INTNO_SPI0 20 +#define INTNO_SPI1 21 +#define INTNO_UART0_RX 22 +#define INTNO_UART0_TX 23 +#define INTNO_UART1_RX 24 +#define INTNO_UART1_TX 25 +#define INTNO_CAN_RX 26 +#define INTNO_CAN_TX 27 +#define INTNO_TWI 28 +#define INTNO_PFA_PORT 29 +#define INTNO_PFB_PORT 30 +/* reserved */ + +#define INTNO_TIMER0 32 +#define INTNO_TIMER1 33 +#define INTNO_TIMER2 34 +#define INTNO_TIMER3 35 +#define INTNO_TIMER4 36 +#define INTNO_TIMER5 37 +#define INTNO_TIMER6 38 +#define INTNO_TIMER7 39 +#define INTNO_PFA_PORTG 40 +#define INTNO_PFB_PORTG 41 +#define INTNO_MDMA_DST 42 +#define INTNO_MDMA_SRC 43 +#define INTNO_WDOG 44 +#define INTNO_PFA_PORTH 44 +#define INTNO_PFB_PORTH 45 +#define INTNO_ACM_ERROR 46 +#define INTNO_ACM 47 +/* reserved */ +/* reserved */ +#define INTNO_PWM0_TRIPINT 51 +#define INTNO_PWM0_SYNCINT 52 +#define INHN1_PWM0_TRIPINT 53 +#define INHN1_PWM0_SYNCINT 54 +#define INTNO_RSI_INT1 55 + +// SIC_ISRにない特殊な割り込み +#define INTNO_HW_ERROR 56 +#define INTNO_CORE_TIMER 57 +#define INTNO_RAISE 58 + +#ifndef _MACRO_ONLY + +/* +* SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み +* のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので +* その分補正する。 +*/ +void make_priority_mask( void ); + +/* + * ターゲットシステム依存の初期化 + */ +extern void sys_initialize(void); + +/* + * ターゲットシステムの終了 + * + * システムを終了する時に使う.ROMモニタ/GDB STUB呼出しで実現する. + */ +extern void sys_exit(void); + +/* + * ターゲットシステムの文字出力 + * + * システムの低レベルの文字出力ルーチン.ROMモニタ/GDB STUB呼出しで実 + * 現する. + */ +extern void sys_putc(char c); + +/* +* SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み +* のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので +* その分補正する。 +*/ +void make_priority_mask( void ); + +/* + * 割り込みの許可、禁止 + * + */ +typedef unsigned int INTNO; +extern ER ena_int( INTNO intno ); +extern ER dis_int( INTNO intno ); + +/* + * 割り込みマスクの操作 + * + * + */ +typedef unsigned long long int IMS; +extern ER chg_ims( IMS ims ); +extern ER get_ims( IMS * p_ims ); + +/* + * 割り込みをデバイスに割り当てる + */ +extern void device_dispatcher( unsigned int priority, unsigned int imask ); + +/** + * スプリアス・イベント・ハンドラ + */ +void spurious_exc_handler(VP p_excinf); +void spurious_int_handler(); + +#endif /* _MACRO_ONLY */ +#endif /* _SYS_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf506/chip_debugboot.c b/uzume_prototype/kernel/config/blackfin/_common_bf506/chip_debugboot.c new file mode 100644 index 0000000..5d7becd --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf506/chip_debugboot.c @@ -0,0 +1,35 @@ +#include "jsp_kernel.h" + +#ifdef __GNUC__ +#include "cdefBF506F.h" /* gnu tool chain */ +#elif defined(__ECC__) +#error "Don't use sys_debugboot.c for VDSP " +#else +#error "Compiler is not supported" +#endif + + +/* +* gdbserverがターゲットのリセット機能を提供しないため、gdb経由でターゲット +* にアプリッケーションをダウンロードすると正しく動作しないことがある。 +* このルーチンはターゲットを一度だけリセットする。 +*/ +void boot_for_gdb( void ) +{ + if ( enable_boot_for_gdb ){ /* ソフトウェアリセットが起きていないなら以下実行 */ + enable_boot_for_gdb = 0; /* リブートは一回だけ */ + *pSWRST = 0x07; /* 内蔵ペリフェラルのリセット */ + asm volatile( "ssync;" ); + *pSWRST = 0x00; /* 内蔵ペリフェラルのリセット解除。 */ + asm volatile( "ssync;" ); + *pSYSCR |= 0x10; /* no boot on core reset */ + asm volatile( "ssync;" ); + asm volatile( "raise 1;" ); /* コアリセット */ + while( 1 ) + ; /*リセットが発生するまでループ*/ + } + else + { + *pPLL_LOCKCNT = 0x200; /* Fix the anormaly 05000430 */ + } +} diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf506/chip_defs.h b/uzume_prototype/kernel/config/blackfin/_common_bf506/chip_defs.h new file mode 100644 index 0000000..8de6321 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf506/chip_defs.h @@ -0,0 +1,92 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2009 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * Copyright (C) 2010-2012 by Kaneko System Co., Ltd. + * + * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +/* + * ターゲットシステムに依存する定義(ADSP-BF504,6用) + * + * このインクルードファイルは,kernel.h と sil.h でインクルードされる. + * 他のファイルから直接インクルードすることはない.このファイルをイン + * クルードする前に,t_stddef.h と itron.h がインクルードされるので, + * それらに依存してもよい. + */ + +#ifndef _CHIP_DEFS_H_ +#define _CHIP_DEFS_H_ + +/* チップ共通部略称  jsp/doc/config.txtの 2.(8)を参照 */ +#define _COMMON_BF506 + +/* + * タイムティックの定義 + */ +#define TIC_NUME 1u /* タイムティックの周期の分子 */ +#define TIC_DENO 1u /* タイムティックの周期の分母 */ + +/* + * 破壊性読み出しレジスタの判別式 + * 与えられたアドレス iop が破壊性読み出しレジスタの + * 場合には真を返す。 + */ +#ifndef DESTRUCTIVE_READ +#define DESTRUCTIVE_READ( iop ) (iop<(VP)0xF0000000) +#endif + +#ifndef _MACRO_ONLY + +/* + * システムの停止処理 + */ + +Inline void +kernel_abort() +{ +} + +#define COPYRIGHT_CHIP \ +"Copyright (C) 2010-2012 by Kaneko System Co., Ltd.\n" + + +#endif /* _MACRO_ONLY */ +#endif /* _SYS_DEFS_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf506/chip_dump.c b/uzume_prototype/kernel/config/blackfin/_common_bf506/chip_dump.c new file mode 100644 index 0000000..9e91471 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf506/chip_dump.c @@ -0,0 +1,339 @@ +/** + * \file postmotem533.c + * \brief ADSP-BF533用のポストモーテムダンプルーチン群 + * + * ハードウェアエラー用のハンドラと、例外用のハンドラからなる。いずれも呼び出されるとUARTから + * ポストモーテム出力を表示する。 + */ +#include "jsp_kernel.h" +#ifdef __GNUC__ +#include /* gnu tool chain */ +#elif defined(__ECC__) +#include /* VisualDSP++ */ +#else +#error "Compiler is not supported" +#endif + +/** + * \brief UARTおよび付随するDMAの動作を停止し、すべての割り込みを禁止する。 + * + * 最後にUART_IERをクリアするのは、UART割り込みを禁止すると同時にDMAも禁止するため。 + * UART DMAは、UARTの割り込み線で駆動されているので、割り込みを禁止すればDMAリクエスト + * も停止する。 + * + * UARTの初期化をどうするか悩ましいが、ここではそのまま以前の設定を利用することにする。 + * + * ポストモーテム・ダンプを目的としているので、この状態からの回復は考えない。 + */ +static void pm_occupy_uart() +{ + /* すべてのコア割り込みを禁止する */ + asm( "cli r0;" : : : "R0" ); + + /* すべてのシステム割り込みソースを禁止する */ + *pSIC_IMASK0 = 0; + *pSIC_IMASK1 = 0; + + /* UART_IERをディセーブルにすることで、DMAを殺せる */ + *pUART0_IER_CLEAR = 0xFFFF; +} + +/** + * \brief 一文字出力 + * + * UARTの送信レジスタが空になるのを待って一文字出力する。 + */ +static void pm_putc( unsigned char c ) +{ + + /* THRが空になるまで待つ */ + while ( ! ( *pUART0_LSR & THRE ) ) + ; + + /* THRが空になったら1文字送信 */ + *pUART0_THR = c; +} + +/** + * \brief コンソール入力監視 + * + * UARTの受信レジスタにデータがあれば、読み込む。データが"!"なら真、 + * それ以外なら偽を返す。 + */ +static BOOL is_ready() +{ + /* 受信データはあるか。 */ + if ( *pUART0_LSR & DR ) + + { + char c; + + c= *pUART0_RBR; + if ( c == '!' ) + return TRUE; + } + return FALSE; +} + + +/** + * \brief 文字列出力 + * + * 受け取った文字列をUARTに出力する。 + */ +static void pm_putstr( char * s ) +{ + int i; + + i=0; + while( s[i] ) /* 末端のNULLが現れるまで出力 */ + pm_putc(s[i++]); +} + +/** + * \brief 1バイトをヘキサデシマルで出力する。 + */ +static void pm_puthex1byte( unsigned int data ) +{ + int i; + int nibble; + + /* 8bit内のすべてのニブルを処理 */ + for ( i=0; i<2; i++ ) + { + /* 最上位ニブルを抽出 */ + nibble = ( data >> 4 ) & 0xF; + /* 抽出したニブルを出力 */ + if ( nibble < 10 ) + pm_putc( nibble + '0' ); + else + pm_putc( nibble - 10 + 'A' ); + /* 次のニブル */ + data <<= 4; + } +} + +/* + * \brief 改行記号を出力する + */ +static void pm_putrtn() +{ + pm_putstr("\r\n"); +} + +/** + * \brief 4バイトをヘキサデシマルで出力する。 + */ +static void pm_puthex4byte( unsigned int data ) +{ + int i; + int nibble; + + /* 32bit内のすべてのニブルを処理 */ + for ( i=0; i<8; i++ ) + { + /* 最上位ニブルを抽出 */ + nibble = ( data >> 28 ) & 0xF; + /* 抽出したニブルを出力 */ + if ( nibble < 10 ) + pm_putc( nibble + '0' ); + else + pm_putc( nibble - 10 + 'A' ); + /* 次のニブル */ + data <<= 4; + } + +} + +/** + * \brief 例外フラグ + * + * 例外が発生したときには真、そうでなければ偽。hwei_handler()に例外か否かを伝える。 + * + * GCCが張り切ってlink/unlink命令の位置を最適化するため、hwei_hanlder()の + * 中で性格にfpを手繰れない。そのため、dummyをアクセスすることでlink/unlinkの位置 + * 最適化の抑止を図る役目もある。効果があるかどうかは不明。 + */ +static volatile int expFlag =0; +/** + * \brief ハードウェア・エラー・ハンドラ + * + * ハードウェア・エラー時に呼び出されて、ハードウェア・エラー・割り込みのポストモーテム処理を行う。 + * 最初にFPを手繰って、割り込みのスタックフレームを探す。次にすべての割り込みを禁止し、 + * UART0を占有したあと、ポーリングを使ってスタックに保存された各レジスタのダンプを行う。 + * DEF_INH(INHNO_HW_ERROR, { TA_HLNG, hwei_handler }); + * + */ +void spurious_int_handler() +{ + unsigned int * fp, *ptr ; /* フレーム・ポインタを手繰っていくための変数 */ + unsigned int reg; /* システムレジスタを受け取るための変数 */ + unsigned int imask, sic_imask0, sic_imask1; /*マスク記録レジスタ*/ + + /* あとで使う */ + imask = *pIMASK; + sic_imask0 = *pSIC_IMASK0; + sic_imask1 = *pSIC_IMASK1; + /* UART0を初期化し、DMAと割り込みを禁止する */ + pm_occupy_uart(); + + while (1) + { + int count = 0; + + pm_putstr( "Type '!' to display post mortem dump" ); pm_putrtn(); + + while ( ! is_ready() ) + { + int i; + for ( i=0; i<100000000; i++) + asm volatile ("nop;"); + if ( count > 30 ) + { + pm_putstr( "Type '!' to display post mortem dump" ); pm_putrtn(); + count = 0; + } + else + count ++; + } + pm_putrtn(); + + + /* 現在の関数のFPを取得する */ + asm ( "%0=fp;" : "=d"((unsigned int)fp) ); + + /* + * この関数を呼び出した関数 ( interrupt_dispatcher ) のFPを取得する。 + * FPは呼び出し関数のFPの格納番地を指していることを利用する + */ + fp = (void *)*fp; + /* + * interrupt_dispatcher を呼び出した関数のFPを取得する。 + * その関数は割り込みハンドラの入り口処理部に他ならない。 + */ + fp = (void *)*fp; + + /* いまや、FPは割り込み受付時の保存されたレジスタ群を指している */ + + /* プッシュされた P0を指す */ + ptr = fp + 2; + /* + * 上位 + * 0 1 2 3 4 5 6 7 8 9 + * ----------------------------------------------- + * 00 P0 RTS FP R0 R1 R2 R3 R4 R5 R6 + * 10 R7 P1 P2 P3 P4 P5 I3 I2 I1 I0 + * 20 M3 M2 M1 M0 B3 B2 B1 B0 L3 L2 + * 30 L1 L0 A0x A0w A1x A1w LC1 LC0 LT1 LT0 + * 40 LB1 LB0 AST RETI + * 下位 + * + */ + if ( expFlag ) + pm_putstr( "Spurious Exception !!" ); + else + pm_putstr( "Spurious Interrupt !!" ); + pm_putrtn(); + + pm_putstr( "Registers On Stack :" ); pm_putrtn(); + pm_putstr( "P0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "RETS " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "FP " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R4 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R5 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R6 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R7 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P4 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P5 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "A0 " ); pm_puthex1byte( *(ptr--) ); pm_putstr( ":" ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "A1 " ); pm_puthex1byte( *(ptr--) ); pm_putstr( ":" ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LC1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LC0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LT1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LT0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LB1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LB0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "ASTAT " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "RETI " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putrtn(); + pm_putstr( "System Registers :" ); pm_putrtn(); + pm_putstr( "SIC_IMASK1:0 " ); pm_puthex4byte( sic_imask1 );pm_putstr( " : " );pm_puthex4byte( sic_imask0 ); pm_putrtn(); + pm_putstr( "SIC_ISR1:0 " ); pm_puthex4byte( *pSIC_ISR1 );pm_putstr( " : " );pm_puthex4byte( *pSIC_ISR0 ); pm_putrtn(); + pm_putstr( "IMASK " ); pm_puthex4byte( imask ); pm_putrtn(); + pm_putstr( "ILAT " ); pm_puthex4byte( *pILAT ); pm_putrtn(); + pm_putstr( "IPEND " ); pm_puthex4byte( *pIPEND ); pm_putrtn(); + asm( "%0=SEQSTAT;" : "=d"(reg) ); + pm_putstr( "SEQSTAT " ); pm_puthex4byte( reg ); pm_putrtn(); + pm_putstr( " EXCAUSE " ); pm_puthex1byte( reg & 0x3F ); pm_putrtn(); + pm_putstr( " HWERRCAUSE " ); pm_puthex1byte( (reg>>14)&0x1F ); pm_putrtn(); + pm_putstr( "DMA0_IRQ_STATUS " ); pm_puthex4byte( *pDMA0_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA1_IRQ_STATUS " ); pm_puthex4byte( *pDMA1_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA2_IRQ_STATUS " ); pm_puthex4byte( *pDMA2_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA3_IRQ_STATUS " ); pm_puthex4byte( *pDMA3_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA4_IRQ_STATUS " ); pm_puthex4byte( *pDMA4_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA5_IRQ_STATUS " ); pm_puthex4byte( *pDMA5_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA6_IRQ_STATUS " ); pm_puthex4byte( *pDMA6_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA7_IRQ_STATUS " ); pm_puthex4byte( *pDMA7_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA8_IRQ_STATUS " ); pm_puthex4byte( *pDMA8_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA9_IRQ_STATUS " ); pm_puthex4byte( *pDMA9_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA10_IRQ_STATUS " ); pm_puthex4byte( *pDMA10_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA11_IRQ_STATUS " ); pm_puthex4byte( *pDMA11_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_D0_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_D0_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_S0_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_S0_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_D1_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_D1_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_S1_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_S1_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "SPI_STAT " ); pm_puthex4byte( *pSPI_STAT ); pm_putrtn(); + pm_putstr( "PPI_STATUS " ); pm_puthex4byte( *pPPI_STATUS ); pm_putrtn(); + pm_putstr( "SPORT0_STAT " ); pm_puthex4byte( *pSPORT0_STAT ); pm_putrtn(); + pm_putstr( "SPORT1_STAT " ); pm_puthex4byte( *pSPORT1_STAT ); pm_putrtn(); + pm_putstr( "TIMER_STATUS " ); pm_puthex4byte( *pTIMER_STATUS ); pm_putrtn(); + pm_putrtn(); + pm_putstr( "Calling Stack :" ); pm_putrtn(); + + while( fp ) + { + pm_putstr( "Called from " ); pm_puthex4byte( *(fp+1) ); pm_putrtn(); + fp = *fp; + } + } +} + +/** + * \brief CPU例外ハンドラ + * + * CPU例外ハンドラとしてcfgファイルに登録する。 hwei_handler()は呼ばれたら戻ってこないが、 + * そのあとにもexpFlagに値を代入しているのは、最適化によってunlink命令の値がルーチン呼び出しの + * 前に移動することを防ぐためである。 + * + * DEF_EXC(CPUEXC1, { TA_HLNG, excp_handler} ); + * + */ +void spurious_exc_handler(VP p_excinf) +{ + expFlag = TRUE; + spurious_int_handler(); +} + diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf506/chip_mmr.c b/uzume_prototype/kernel/config/blackfin/_common_bf506/chip_mmr.c new file mode 100644 index 0000000..f1b984e --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf506/chip_mmr.c @@ -0,0 +1,674 @@ +/* + * 注意:このファイルはBF506のMMR定義用にまだ修正してない + * + * ADSP-BF506の System MMR 定義。アドレスの指定は .ldファイルとの組み合わせで行う。 + * .ldファイルのサンプルは、 config/blackfin/ezkit_bf506を参照。 + * + * アドレスが正しく割り当てられているかは、次の方法で検証した. + * + $ cat /opt/uClinux/bfin-elf/bfin-elf/include/def_LPBlackfin.h ../jsp/config/blackfin/_common_bf506/defBF51x_base.h ../jsp/config/blackfin/_common_bf506/defBF506.h | tr '[a-z]' '[A-Z]' | grep '0XFF[CE]0' | grep "#DEFINE" | awk '{print $2, $3}' - | grep 0X | sed 's/0X//' | sort -k 2 > regdef.txt + $ awk '{ print $3,$1 }' jsp.syms | grep _mmr | sed 's/_mmr//p'| sort -k 2 | uniq | tr '[a-z]' '[A-Z]'> regelf.txt + $ diff regelf.txt regdef.txt > diff.txt + +31a32,34 +> RTC_PREN FFC00314 +> UART0_DLL FFC00400 +> UART0_RBR FFC00400 +32a36 +> UART0_DLH FFC00404 +149a154 +> DMA_TCPER FFC00B0C +150a156 +> DMA_TCCNT FFC00B10 +414a421,422 +> UART1_DLL FFC02000 +> UART1_RBR FFC02000 +415a424 +> UART1_DLH FFC02004 +567a577,580 +> OTP_CONTROL FFC03600 +> OTP_BEN FFC03604 +> OTP_STATUS FFC03608 +> OTP_TIMING FFC0360C +619a633 +> DCPLB_FAULT_STATUS FFE00008 +657d670 +< IMEM_DUMMY FFE01000 +658a672 +> CODE_FAULT_STATUS FFE01008 +659a674 +> CODE_FAULT_ADDR FFE0100C +712d726 +< IDUMMY FFE02100 +722d735 +< DBGDUMMY FFE05004 + + * これらのうち、ELF側にだけ存在するレジスタはDUMMYレジスタであり、これはコアレジスタである。 + * ツールのバージョン違いでインクルードファイルの内容が改変されたためであり、無視していい。 + * + * DEF側にだけ存在するレジスタには2種類ある。 + * 1. 他のレジスタのエイリアス + * 2. def***.hには存在するが、cdef***.hには存在しないレジスタ + * + * いずれも小さな問題であり、したがって、上の結果は問題ないと言える。 + * + */ + +volatile unsigned short mmrPLL_CTL __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrPLL_DIV __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrVR_CTL __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrPLL_STAT __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrPLL_LOCKCNT __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned long mmrCHIPID __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrSWRST __attribute ((aligned(4), section("SYSMMR1"))); +volatile unsigned short mmrSYSCR __attribute ((aligned(4), section("SYSMMR1"))); +volatile unsigned long mmrSIC_IMASK0 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IAR0 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IAR1 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IAR2 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IAR3 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_ISR0 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IWR0 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IMASK1 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_IAR4 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_IAR5 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_IAR6 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_IAR7 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_ISR1 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_IWR1 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned short mmrWDOG_CTL __attribute ((aligned(4), section("SYSMMR4"))); +volatile unsigned long mmrWDOG_CNT __attribute ((aligned(4), section("SYSMMR4"))); +volatile unsigned long mmrWDOG_STAT __attribute ((aligned(4), section("SYSMMR4"))); +volatile unsigned long mmrRTC_STAT __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned short mmrRTC_ICTL __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned short mmrRTC_ISTAT __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned short mmrRTC_SWCNT __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned long mmrRTC_ALARM __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned short mmrRTC_FAST __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned short mmrUART0_THR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_IER __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_IIR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_LCR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_MCR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_LSR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_SCR __attribute ((aligned(4), section("SYSMMR7"))); +volatile unsigned short mmrUART0_GCTL __attribute ((aligned(4), section("SYSMMR8"))); +volatile unsigned short mmrSPI0_CTL __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_FLG __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_STAT __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_TDBR __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_RDBR __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_BAUD __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_SHADOW __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrTIMER0_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER0_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER0_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER0_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER1_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER1_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER1_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER1_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER2_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER2_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER2_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER2_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER3_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER3_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER3_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER3_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER4_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER4_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER4_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER4_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER5_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER5_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER5_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER5_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER6_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER6_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER6_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER6_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER7_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER7_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER7_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER7_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER_ENABLE __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER_DISABLE __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER_STATUS __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrPORTFIO __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_CLEAR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_SET __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_TOGGLE __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKA __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKA_CLEAR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKA_SET __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKA_TOGGLE __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKB __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKB_CLEAR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKB_SET __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKB_TOGGLE __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_DIR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_POLAR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_EDGE __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_BOTH __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_INEN __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrSPORT0_TCR1 __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned short mmrSPORT0_TCR2 __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned short mmrSPORT0_TCLKDIV __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned short mmrSPORT0_TFSDIV __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned long mmrSPORT0_TX __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned long mmrSPORT0_RX __attribute ((aligned(4), section("SYSMMR13"))); +volatile unsigned short mmrSPORT0_RCR1 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_RCR2 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_RCLKDIV __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_RFSDIV __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_STAT __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_CHNL __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_MCMC1 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_MCMC2 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MTCS0 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MTCS1 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MTCS2 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MTCS3 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MRCS0 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MRCS1 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MRCS2 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MRCS3 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT1_TCR1 __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned short mmrSPORT1_TCR2 __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned short mmrSPORT1_TCLKDIV __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned short mmrSPORT1_TFSDIV __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned long mmrSPORT1_TX __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned long mmrSPORT1_RX __attribute ((aligned(4), section("SYSMMR16"))); +volatile unsigned short mmrSPORT1_RCR1 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_RCR2 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_RCLKDIV __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_RFSDIV __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_STAT __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_CHNL __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_MCMC1 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_MCMC2 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MTCS0 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MTCS1 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MTCS2 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MTCS3 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MRCS0 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MRCS1 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MRCS2 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MRCS3 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrEBIU_AMGCTL __attribute ((aligned(4), section("SYSMMR18"))); +volatile unsigned long mmrEBIU_AMBCTL0 __attribute ((aligned(4), section("SYSMMR18"))); +volatile unsigned long mmrEBIU_AMBCTL1 __attribute ((aligned(4), section("SYSMMR18"))); +volatile unsigned long mmrEBIU_SDGCTL __attribute ((aligned(4), section("SYSMMR19"))); +volatile unsigned short mmrEBIU_SDBCTL __attribute ((aligned(4), section("SYSMMR19"))); +volatile unsigned short mmrEBIU_SDRRC __attribute ((aligned(4), section("SYSMMR19"))); +volatile unsigned short mmrEBIU_SDSTAT __attribute ((aligned(4), section("SYSMMR19"))); +volatile unsigned short mmrDMA_TC_PER __attribute ((aligned(4), section("SYSMMR20"))); +volatile unsigned short mmrDMA_TC_CNT __attribute ((aligned(4), section("SYSMMR20"))); +volatile unsigned long mmrDMA0_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR21"))); +volatile unsigned long mmrDMA0_START_ADDR __attribute ((aligned(4), section("SYSMMR21"))); +volatile unsigned short mmrDMA0_CONFIG __attribute ((aligned(4), section("SYSMMR21"))); +volatile unsigned short mmrDMA0_X_COUNT __attribute ((aligned(4), section("SYSMMR22"))); +volatile signed short mmrDMA0_X_MODIFY __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_Y_COUNT __attribute ((aligned(4), section("SYSMMR22"))); +volatile signed short mmrDMA0_Y_MODIFY __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned long mmrDMA0_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned long mmrDMA0_CURR_ADDR __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR23"))); +volatile unsigned long mmrDMA1_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR24"))); +volatile unsigned long mmrDMA1_START_ADDR __attribute ((aligned(4), section("SYSMMR24"))); +volatile unsigned short mmrDMA1_CONFIG __attribute ((aligned(4), section("SYSMMR24"))); +volatile unsigned short mmrDMA1_X_COUNT __attribute ((aligned(4), section("SYSMMR25"))); +volatile signed short mmrDMA1_X_MODIFY __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_Y_COUNT __attribute ((aligned(4), section("SYSMMR25"))); +volatile signed short mmrDMA1_Y_MODIFY __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned long mmrDMA1_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned long mmrDMA1_CURR_ADDR __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR26"))); +volatile unsigned long mmrDMA2_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR27"))); +volatile unsigned long mmrDMA2_START_ADDR __attribute ((aligned(4), section("SYSMMR27"))); +volatile unsigned short mmrDMA2_CONFIG __attribute ((aligned(4), section("SYSMMR27"))); +volatile unsigned short mmrDMA2_X_COUNT __attribute ((aligned(4), section("SYSMMR28"))); +volatile signed short mmrDMA2_X_MODIFY __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_Y_COUNT __attribute ((aligned(4), section("SYSMMR28"))); +volatile signed short mmrDMA2_Y_MODIFY __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned long mmrDMA2_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned long mmrDMA2_CURR_ADDR __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR29"))); +volatile unsigned long mmrDMA3_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR30"))); +volatile unsigned long mmrDMA3_START_ADDR __attribute ((aligned(4), section("SYSMMR30"))); +volatile unsigned short mmrDMA3_CONFIG __attribute ((aligned(4), section("SYSMMR30"))); +volatile unsigned short mmrDMA3_X_COUNT __attribute ((aligned(4), section("SYSMMR31"))); +volatile signed short mmrDMA3_X_MODIFY __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_Y_COUNT __attribute ((aligned(4), section("SYSMMR31"))); +volatile signed short mmrDMA3_Y_MODIFY __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned long mmrDMA3_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned long mmrDMA3_CURR_ADDR __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR32"))); +volatile unsigned long mmrDMA4_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR33"))); +volatile unsigned long mmrDMA4_START_ADDR __attribute ((aligned(4), section("SYSMMR33"))); +volatile unsigned short mmrDMA4_CONFIG __attribute ((aligned(4), section("SYSMMR33"))); +volatile unsigned short mmrDMA4_X_COUNT __attribute ((aligned(4), section("SYSMMR34"))); +volatile signed short mmrDMA4_X_MODIFY __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_Y_COUNT __attribute ((aligned(4), section("SYSMMR34"))); +volatile signed short mmrDMA4_Y_MODIFY __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned long mmrDMA4_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned long mmrDMA4_CURR_ADDR __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR35"))); +volatile unsigned long mmrDMA5_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR36"))); +volatile unsigned long mmrDMA5_START_ADDR __attribute ((aligned(4), section("SYSMMR36"))); +volatile unsigned short mmrDMA5_CONFIG __attribute ((aligned(4), section("SYSMMR36"))); +volatile unsigned short mmrDMA5_X_COUNT __attribute ((aligned(4), section("SYSMMR37"))); +volatile signed short mmrDMA5_X_MODIFY __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_Y_COUNT __attribute ((aligned(4), section("SYSMMR37"))); +volatile signed short mmrDMA5_Y_MODIFY __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned long mmrDMA5_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned long mmrDMA5_CURR_ADDR __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR38"))); +volatile unsigned long mmrDMA6_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR39"))); +volatile unsigned long mmrDMA6_START_ADDR __attribute ((aligned(4), section("SYSMMR39"))); +volatile unsigned short mmrDMA6_CONFIG __attribute ((aligned(4), section("SYSMMR39"))); +volatile unsigned short mmrDMA6_X_COUNT __attribute ((aligned(4), section("SYSMMR40"))); +volatile signed short mmrDMA6_X_MODIFY __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_Y_COUNT __attribute ((aligned(4), section("SYSMMR40"))); +volatile signed short mmrDMA6_Y_MODIFY __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned long mmrDMA6_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned long mmrDMA6_CURR_ADDR __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR41"))); +volatile unsigned long mmrDMA7_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR42"))); +volatile unsigned long mmrDMA7_START_ADDR __attribute ((aligned(4), section("SYSMMR42"))); +volatile unsigned short mmrDMA7_CONFIG __attribute ((aligned(4), section("SYSMMR42"))); +volatile unsigned short mmrDMA7_X_COUNT __attribute ((aligned(4), section("SYSMMR43"))); +volatile signed short mmrDMA7_X_MODIFY __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_Y_COUNT __attribute ((aligned(4), section("SYSMMR43"))); +volatile signed short mmrDMA7_Y_MODIFY __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned long mmrDMA7_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned long mmrDMA7_CURR_ADDR __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR44"))); +volatile unsigned long mmrDMA8_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR45"))); +volatile unsigned long mmrDMA8_START_ADDR __attribute ((aligned(4), section("SYSMMR45"))); +volatile unsigned short mmrDMA8_CONFIG __attribute ((aligned(4), section("SYSMMR45"))); +volatile unsigned short mmrDMA8_X_COUNT __attribute ((aligned(4), section("SYSMMR46"))); +volatile signed short mmrDMA8_X_MODIFY __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_Y_COUNT __attribute ((aligned(4), section("SYSMMR46"))); +volatile signed short mmrDMA8_Y_MODIFY __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned long mmrDMA8_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned long mmrDMA8_CURR_ADDR __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR47"))); +volatile unsigned long mmrDMA9_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR48"))); +volatile unsigned long mmrDMA9_START_ADDR __attribute ((aligned(4), section("SYSMMR48"))); +volatile unsigned short mmrDMA9_CONFIG __attribute ((aligned(4), section("SYSMMR48"))); +volatile unsigned short mmrDMA9_X_COUNT __attribute ((aligned(4), section("SYSMMR49"))); +volatile signed short mmrDMA9_X_MODIFY __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned short mmrDMA9_Y_COUNT __attribute ((aligned(4), section("SYSMMR49"))); +volatile signed short mmrDMA9_Y_MODIFY __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned long mmrDMA9_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned long mmrDMA9_CURR_ADDR __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned short mmrDMA9_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned short mmrDMA9_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned short mmrDMA9_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned short mmrDMA9_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR50"))); +volatile unsigned long mmrDMA10_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR51"))); +volatile unsigned long mmrDMA10_START_ADDR __attribute ((aligned(4), section("SYSMMR51"))); +volatile unsigned short mmrDMA10_CONFIG __attribute ((aligned(4), section("SYSMMR51"))); +volatile unsigned short mmrDMA10_X_COUNT __attribute ((aligned(4), section("SYSMMR52"))); +volatile signed short mmrDMA10_X_MODIFY __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned short mmrDMA10_Y_COUNT __attribute ((aligned(4), section("SYSMMR52"))); +volatile signed short mmrDMA10_Y_MODIFY __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned long mmrDMA10_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned long mmrDMA10_CURR_ADDR __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned short mmrDMA10_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned short mmrDMA10_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned short mmrDMA10_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned short mmrDMA10_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR53"))); +volatile unsigned long mmrDMA11_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR54"))); +volatile unsigned long mmrDMA11_START_ADDR __attribute ((aligned(4), section("SYSMMR54"))); +volatile unsigned short mmrDMA11_CONFIG __attribute ((aligned(4), section("SYSMMR54"))); +volatile unsigned short mmrDMA11_X_COUNT __attribute ((aligned(4), section("SYSMMR55"))); +volatile signed short mmrDMA11_X_MODIFY __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned short mmrDMA11_Y_COUNT __attribute ((aligned(4), section("SYSMMR55"))); +volatile signed short mmrDMA11_Y_MODIFY __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned long mmrDMA11_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned long mmrDMA11_CURR_ADDR __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned short mmrDMA11_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned short mmrDMA11_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned short mmrDMA11_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned short mmrDMA11_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR56"))); +volatile unsigned long mmrMDMA_D0_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR57"))); +volatile unsigned long mmrMDMA_D0_START_ADDR __attribute ((aligned(4), section("SYSMMR57"))); +volatile unsigned short mmrMDMA_D0_CONFIG __attribute ((aligned(4), section("SYSMMR57"))); +volatile unsigned short mmrMDMA_D0_X_COUNT __attribute ((aligned(4), section("SYSMMR58"))); +volatile signed short mmrMDMA_D0_X_MODIFY __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_Y_COUNT __attribute ((aligned(4), section("SYSMMR58"))); +volatile signed short mmrMDMA_D0_Y_MODIFY __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned long mmrMDMA_D0_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned long mmrMDMA_D0_CURR_ADDR __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR59"))); +volatile unsigned long mmrMDMA_S0_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR60"))); +volatile unsigned long mmrMDMA_S0_START_ADDR __attribute ((aligned(4), section("SYSMMR60"))); +volatile unsigned short mmrMDMA_S0_CONFIG __attribute ((aligned(4), section("SYSMMR60"))); +volatile unsigned short mmrMDMA_S0_X_COUNT __attribute ((aligned(4), section("SYSMMR61"))); +volatile signed short mmrMDMA_S0_X_MODIFY __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_Y_COUNT __attribute ((aligned(4), section("SYSMMR61"))); +volatile signed short mmrMDMA_S0_Y_MODIFY __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned long mmrMDMA_S0_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned long mmrMDMA_S0_CURR_ADDR __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR62"))); +volatile unsigned long mmrMDMA_D1_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR63"))); +volatile unsigned long mmrMDMA_D1_START_ADDR __attribute ((aligned(4), section("SYSMMR63"))); +volatile unsigned short mmrMDMA_D1_CONFIG __attribute ((aligned(4), section("SYSMMR63"))); +volatile unsigned short mmrMDMA_D1_X_COUNT __attribute ((aligned(4), section("SYSMMR64"))); +volatile signed short mmrMDMA_D1_X_MODIFY __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_Y_COUNT __attribute ((aligned(4), section("SYSMMR64"))); +volatile signed short mmrMDMA_D1_Y_MODIFY __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned long mmrMDMA_D1_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned long mmrMDMA_D1_CURR_ADDR __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR65"))); +volatile unsigned long mmrMDMA_S1_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR66"))); +volatile unsigned long mmrMDMA_S1_START_ADDR __attribute ((aligned(4), section("SYSMMR66"))); +volatile unsigned short mmrMDMA_S1_CONFIG __attribute ((aligned(4), section("SYSMMR66"))); +volatile unsigned short mmrMDMA_S1_X_COUNT __attribute ((aligned(4), section("SYSMMR67"))); +volatile signed short mmrMDMA_S1_X_MODIFY __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_Y_COUNT __attribute ((aligned(4), section("SYSMMR67"))); +volatile signed short mmrMDMA_S1_Y_MODIFY __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned long mmrMDMA_S1_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned long mmrMDMA_S1_CURR_ADDR __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR68"))); +volatile unsigned short mmrPPI_CONTROL __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrPPI_STATUS __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrPPI_COUNT __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrPPI_DELAY __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrPPI_FRAME __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrTWI_CLKDIV __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_CONTROL __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_SLAVE_CTL __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_SLAVE_STAT __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_SLAVE_ADDR __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_MASTER_CTL __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_MASTER_STAT __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_MASTER_ADDR __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_INT_STAT __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_INT_MASK __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_FIFO_CTL __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_FIFO_STAT __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_XMT_DATA8 __attribute ((aligned(4), section("SYSMMR71"))); +volatile unsigned short mmrTWI_XMT_DATA16 __attribute ((aligned(4), section("SYSMMR71"))); +volatile unsigned short mmrTWI_RCV_DATA8 __attribute ((aligned(4), section("SYSMMR71"))); +volatile unsigned short mmrTWI_RCV_DATA16 __attribute ((aligned(4), section("SYSMMR71"))); +volatile unsigned short mmrPORTGIO __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_CLEAR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_SET __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_TOGGLE __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKA __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKA_CLEAR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKA_SET __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKA_TOGGLE __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKB __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKB_CLEAR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKB_SET __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKB_TOGGLE __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_DIR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_POLAR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_EDGE __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_BOTH __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_INEN __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTHIO __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_CLEAR __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_SET __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_TOGGLE __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKA __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKA_CLEAR __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKA_SET __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKA_TOGGLE __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKB __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKB_CLEAR __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKB_SET __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKB_TOGGLE __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_DIR __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_POLAR __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_EDGE __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_BOTH __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_INEN __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrUART1_THR __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_IER __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_IIR __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_LCR __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_MCR __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_LSR __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_SCR __attribute ((aligned(4), section("SYSMMR75"))); +volatile unsigned short mmrUART1_GCTL __attribute ((aligned(4), section("SYSMMR76"))); +volatile unsigned long mmrEMAC_OPMODE __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_ADDRLO __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_ADDRHI __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_HASHLO __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_HASHHI __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_STAADD __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_STADAT __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_FLC __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_VLAN1 __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_VLAN2 __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_WKUP_CTL __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK0 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK1 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK2 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK3 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFCMD __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFOFF __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFCRC0 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFCRC1 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_SYSCTL __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_SYSTAT __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_RX_STAT __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_RX_STKY __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_RX_IRQE __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_TX_STAT __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_TX_STKY __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_TX_IRQE __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_MMC_CTL __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_MMC_RIRQS __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_MMC_RIRQE __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_MMC_TIRQS __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_MMC_TIRQE __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned short mmrEMAC_PTP_CTL __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned short mmrEMAC_PTP_IE __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned short mmrEMAC_PTP_ISTAT __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_FOFF __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_FV1 __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_FV2 __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_FV3 __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_ADDEND __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_ACCR __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_OFFSET __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_TIMELO __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_TIMEHI __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_RXSNAPLO __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_RXSNAPHI __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_TXSNAPLO __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_TXSNAPHI __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_ALARMLO __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_ALARMHI __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned short mmrEMAC_PTP_ID_OFF __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_ID_SNAP __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_PPS_STARTLOP __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_PPS_STARTHIP __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_PPS_PERIOD __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_RXC_OK __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_FCS __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_ALIGN __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_OCTET __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_DMAOVF __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_UNICST __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_MULTI __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_BROAD __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LNERRI __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LNERRO __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LONG __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_MACCTL __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_OPCODE __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_PAUSE __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_ALLFRM __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_ALLOCT __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_TYPED __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_SHORT __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_EQ64 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LT128 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LT256 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LT512 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LT1024 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_GE1024 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_TXC_OK __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_1COL __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_GT1COL __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_OCTET __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_DEFER __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_LATECL __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_XS_COL __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_DMAUND __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_CRSERR __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_UNICST __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_MULTI __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_BROAD __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_XS_DFR __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_MACCTL __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_ALLFRM __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_ALLOCT __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_EQ64 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_LT128 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_LT256 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_LT512 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_LT1024 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_GE1024 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_ABORT __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned short mmrPORTF_FER __attribute ((aligned(4), section("SYSMMR83"))); +volatile unsigned short mmrPORTG_FER __attribute ((aligned(4), section("SYSMMR83"))); +volatile unsigned short mmrPORTH_FER __attribute ((aligned(4), section("SYSMMR83"))); +volatile unsigned short mmrPORTF_MUX __attribute ((aligned(4), section("SYSMMR84"))); +volatile unsigned short mmrPORTG_MUX __attribute ((aligned(4), section("SYSMMR84"))); +volatile unsigned short mmrPORTH_MUX __attribute ((aligned(4), section("SYSMMR84"))); +volatile unsigned short mmrPORTF_DRIVE __attribute ((aligned(4), section("SYSMMR85"))); +volatile unsigned short mmrPORTG_DRIVE __attribute ((aligned(4), section("SYSMMR85"))); +volatile unsigned short mmrPORTH_DRIVE __attribute ((aligned(4), section("SYSMMR85"))); +volatile unsigned short mmrPORTF_HYSTERESIS __attribute ((aligned(4), section("SYSMMR86"))); +volatile unsigned short mmrPORTG_HYSTERESIS __attribute ((aligned(4), section("SYSMMR86"))); +volatile unsigned short mmrPORTH_HYSTERESIS __attribute ((aligned(4), section("SYSMMR86"))); +volatile unsigned short mmrNONGPIO_DRIVE __attribute ((aligned(4), section("SYSMMR87"))); +volatile unsigned short mmrNONGPIO_HYSTERESIS __attribute ((aligned(4), section("SYSMMR88"))); +volatile unsigned short mmrHMDMA0_CONTROL __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_ECINIT __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_BCINIT __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_ECURGENT __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_ECOVERFLOW __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_ECOUNT __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_BCOUNT __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA1_CONTROL __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_ECINIT __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_BCINIT __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_ECURGENT __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_ECOVERFLOW __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_ECOUNT __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_BCOUNT __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrSPI1_CTL __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_FLG __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_STAT __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_TDBR __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_RDBR __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_BAUD __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_SHADOW __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrCNT_CONFIG __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned short mmrCNT_IMASK __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned short mmrCNT_STATUS __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned short mmrCNT_COMMAND __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned short mmrCNT_DEBOUNCE __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned long mmrCNT_COUNTER __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned long mmrCNT_MAX __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned long mmrCNT_MIN __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned long mmrSECURE_SYSSWT __attribute ((aligned(4), section("SYSMMR93"))); +volatile unsigned short mmrSECURE_CONTROL __attribute ((aligned(4), section("SYSMMR93"))); +volatile unsigned short mmrSECURE_STATUS __attribute ((aligned(4), section("SYSMMR93"))); +volatile unsigned long mmrOTP_DATA0 __attribute ((aligned(4), section("SYSMMR94"))); +volatile unsigned long mmrOTP_DATA1 __attribute ((aligned(4), section("SYSMMR94"))); +volatile unsigned long mmrOTP_DATA2 __attribute ((aligned(4), section("SYSMMR94"))); +volatile unsigned long mmrOTP_DATA3 __attribute ((aligned(4), section("SYSMMR94"))); +volatile unsigned short mmrPWM_CTRL __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_STAT __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_TM __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_DT __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_GATE __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHA __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHB __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHC __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_SEG __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_SYNCWT __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHAL __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHBL __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHCL __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_LSI __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_STAT2 __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrRSI_PWR_CONTROL __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_CLK_CONTROL __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_ARGUMENT __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_COMMAND __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_RESP_CMD __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_RESPONSE0 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_RESPONSE1 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_RESPONSE2 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_RESPONSE3 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_DATA_TIMER __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_DATA_LGTH __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_DATA_CONTROL __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_DATA_CNT __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_STATUS __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_STATUSCL __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_MASK0 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_MASK1 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_FIFO_CNT __attribute ((aligned(4), section("SYSMMR97"))); +volatile unsigned short mmrRSI_CEATA_CONTROL __attribute ((aligned(4), section("SYSMMR97"))); +volatile unsigned long mmrRSI_FIFO __attribute ((aligned(4), section("SYSMMR98"))); +volatile unsigned short mmrRSI_ESTAT __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_EMASK __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_CONFIG __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_RD_WAIT_EN __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_PID0 __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_PID1 __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_PID2 __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_PID3 __attribute ((aligned(4), section("SYSMMR99"))); + diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf506/hw_serial.cfg b/uzume_prototype/kernel/config/blackfin/_common_bf506/hw_serial.cfg new file mode 100644 index 0000000..4901b2c --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf506/hw_serial.cfg @@ -0,0 +1,6 @@ +/* + * SIOドライバ(ADSP-BF537用)のコンフィギュレーションファイル + */ +INCLUDE("\"hw_serial.h\""); +DEF_INH(INHNO_SIO0_RX, { TA_HLNG, sio0_rx_handler }); +DEF_INH(INHNO_SIO0_TX, { TA_HLNG, sio0_tx_handler }); diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf506/hw_serial.h b/uzume_prototype/kernel/config/blackfin/_common_bf506/hw_serial.h new file mode 100644 index 0000000..ddf163b --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf506/hw_serial.h @@ -0,0 +1,166 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2009 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * Copyright (C) 2010,2011 by Kaneko System Co., Ltd. + * + * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + +/* + * シリアルI/Oデバイス(SIO)ドライバ(Blackfin UART用) + * + * このファイルは、TOPPERS/JSP 1.4.2の config/sh3/ms7727cp01/hw_serial.hを + * リネームし、内部の識別子を変更したものである。 + * + * このファイルは下位のデバイス・アクセス・ルーチンを束ねて上位の層に渡す + * ためのものである。Blackfinの外部にあるシリアルをTOPPERS/JSPで管理しない + * のなら、変更する必要はない。 + */ + +#ifndef _HW_SERIAL_H_ +#define _HW_SERIAL_H_ + +#include + +#include "uart.h" + +#ifdef __GNUC__ // gcc +#include "cdefBF506F.h" +#elif defined(__ECC__) // visualdsp +#include +#else +#error "Compiler is not supported" +#endif + + +/* + * SIOドライバの初期化ルーチン + */ +#define sio_initialize uart_initialize + +#ifndef _MACRO_ONLY +/* + * シリアルI/Oポートのオープン + */ +Inline SIOPCB * +sio_opn_por(ID siopid, VP_INT exinf) +{ + SIOPCB *siopcb; + UW regBase; + + /* + * デバイス依存のオープン処理. + */ + siopcb = uart_opn_por(siopid, exinf); + + /* + * Enable Corrensponding Interrupt at IMASK + */ + regBase = siopcb->siopinib->reg_base; + if ( regBase == UART0_ADDRESS ) { // UART0の場合 + ena_int( INTNO_UART0_TX ); + ena_int( INTNO_UART0_RX ); + *pPORTG_MUX &= ~(0x3000); // bit13:12 だけを0にする + *pPORTG_FER |= 0x3000; // PG12,PG13をUART0に割り振る + } + else if ( regBase == UART1_ADDRESS ){ // uart1の場合 + ena_int( INTNO_UART1_TX ); + ena_int( INTNO_UART1_RX ); + *pPORTH_MUX &= ~(0x00F0); // bit7:6, bit5:4 だけを0にする + *pPORTH_MUX |= (0x01<<6) | (0x01<<4); // bit7:6, bit5:4 を01にする + *pPORTH_FER |= 0x00C0; // PH7,6をUART1に割り振る + } + + return(siopcb); +} + +/* + * シリアルI/Oポートのクローズ + */ +Inline void +sio_cls_por(SIOPCB *siopcb) +{ + + /* + * デバイス依存のクローズ処理. + */ + uart_cls_por(siopcb); +} + + +/* + * SIOの割込みハンドラ + */ +#define sio0_rx_handler uart0_rx_isr +#define sio0_tx_handler uart0_tx_isr +#define sio1_rx_handler uart1_rx_isr +#define sio1_tx_handler uart1_tx_isr + +/* + * シリアルI/Oポートへの文字送信 + */ +#define sio_snd_chr uart_snd_chr + +/* + * シリアルI/Oポートからの文字受信 + */ +#define sio_rcv_chr uart_rcv_chr + +/* + * シリアルI/Oポートからのコールバックの許可 + */ +#define sio_ena_cbr uart_ena_cbr + +/* + * シリアルI/Oポートからのコールバックの禁止 + */ +#define sio_dis_cbr uart_dis_cbr + +/* + * シリアルI/Oポートからの送信可能コールバック + */ +#define sio_ierdy_snd uart_ierdy_snd + +/* + * シリアルI/Oポートからの受信通知コールバック + */ +#define sio_ierdy_rcv uart_ierdy_rcv + +#endif /* _MACRO_ONLY */ +#endif /* _HW_SERIAL_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf506/hw_timer.h b/uzume_prototype/kernel/config/blackfin/_common_bf506/hw_timer.h new file mode 100644 index 0000000..62f70aa --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf506/hw_timer.h @@ -0,0 +1,142 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2009 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * Copyright (C) 2010,2011 by Kaneko System Co., Ltd. + * + * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + +/* + * タイマドライバ(ADSP-BF506用) + * + */ + +#ifndef _HW_TIMER_H_ +#define _HW_TIMER_H_ + +#include + + +#ifndef _MACRO_ONLY + +#ifdef __GNUC__ // gcc +#include "cdefBF506F.h" +#elif defined(__ECC__) // visualdsp +#include +#else +#error "Compiler is not supported" +#endif + +//#include + + + + +/************************************************************** + * タイマの起動処理 + * + * タイマを初期化し,周期的なタイマ割込み要求を発生させる. + * + **************************************************************/ +Inline void +hw_timer_initialize() +{ + +#ifdef USE_TIC_CORE + // Core timer + *pTCNTL = TMPWR; // power up timer; + *pTPERIOD = CORECLOCK/1000; // CORE CLOCK is defined in sys_config.h + *pTCNTL = TMPWR | TMREN | TAUTORLD; +#else + // GPT7(General-purpose timer7) + + *pTIMER7_CONFIG = PERIOD_CNT | OUT_DIS |IRQ_ENA | PWM_OUT; // PWM_OUT, Output Pad disable + *pTIMER7_PERIOD = SYSCLOCK/1000; // SYS CLOCK is defined in sys_config.h + *pTIMER7_WIDTH = 1; // 0 < width < period + *pTIMER_ENABLE = TIMEN7; // timer7 start + + ena_int( INHNO_TIMER ); // enable Timer Interrupt + +#endif + asm("ssync;"); + +} + +/************************************************************** + * タイマ割込み要求のクリア + **************************************************************/ +Inline void +hw_timer_int_clear() +{ +#ifdef USE_TIC_CORE + // Core timer + /* TINTはW1Cではないので、TINTのTINTビットは0を書き込む */ + *pTCNTL = TMPWR | TMREN | TAUTORLD; +#else + // GPT7(General-purpose timer7) + *pTIMER_STATUS = TIMIL7; +#endif + asm("ssync;"); +} + +/************************************************************** + * タイマの停止処理 + * + * タイマの動作を停止させる. + **************************************************************/ +Inline void +hw_timer_terminate() +{ + /* + * タイマの動作を停止する. + */ +#ifdef USE_TIC_CORE + // Core timer + *pTCNTL = TMPWR | TAUTORLD; // 停止 + *pTCNTL = 0; // パワーダウンモード +#else + // GPT2(General-purpose timer7) + *pTIMER_DISABLE = TIMDIS7; // timer7 disable +#endif + asm("ssync;"); +} + + +#endif /* _MACRO_ONLY */ +#endif /* _HW_TIMER_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf506/sys_rename.def b/uzume_prototype/kernel/config/blackfin/_common_bf506/sys_rename.def new file mode 100644 index 0000000..f51964c --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf506/sys_rename.def @@ -0,0 +1,6 @@ +make_priority_mask +device_dispatcher +boot_for_gdb +siopinib_table +sprious_int_handler +sprious_exp_handler diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf506/sys_rename.h b/uzume_prototype/kernel/config/blackfin/_common_bf506/sys_rename.h new file mode 100644 index 0000000..5c47631 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf506/sys_rename.h @@ -0,0 +1,27 @@ +/* This file is generated from sys_rename.def by genrename. */ + +#ifndef _SYS_RENAME_H_ +#define _SYS_RENAME_H_ + +#define make_priority_mask _kernel_make_priority_mask +#define device_dispatcher _kernel_device_dispatcher +#define boot_for_gdb _kernel_boot_for_gdb +#define siopinib_table _kernel_siopinib_table +#define sprious_int_handler _kernel_sprious_int_handler +#define sprious_exp_handler _kernel_sprious_exp_handler + + + + + +#ifdef LABEL_ASM + +#define _make_priority_mask __kernel_make_priority_mask +#define _device_dispatcher __kernel_device_dispatcher +#define _boot_for_gdb __kernel_boot_for_gdb +#define _siopinib_table __kernel_siopinib_table +#define _sprious_int_handler __kernel_sprious_int_handler +#define _sprious_exp_handler __kernel_sprious_exp_handler + +#endif /* LABEL_ASM */ +#endif /* _SYS_RENAME_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf506/sys_unrename.h b/uzume_prototype/kernel/config/blackfin/_common_bf506/sys_unrename.h new file mode 100644 index 0000000..ee9dd28 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf506/sys_unrename.h @@ -0,0 +1,23 @@ +/* This file is generated from sys_rename.def by genrename. */ + +#ifdef _SYS_UNRENAME_H_ +#undef _SYS_UNRENAME_H_ + +#undef make_priority_mask +#undef device_dispatcher +#undef boot_for_gdb +#undef siopinib_table +#undef sprious_int_handler +#undef sprious_exp_handler + +#ifdef LABEL_ASM + +#undef _make_priority_mask +#undef _device_dispatcher +#undef _boot_for_gdb +#undef _siopinib_table +#undef _sprious_int_handler +#undef _sprious_exp_handler + +#endif /* LABEL_ASM */ +#endif /* _SYS_UNRENAME_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf518/bf518elf.ld b/uzume_prototype/kernel/config/blackfin/_common_bf518/bf518elf.ld new file mode 100644 index 0000000..1ddaca4 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf518/bf518elf.ld @@ -0,0 +1,410 @@ +/* +* ADSP-BF518 Rev 0.0ではアノーマリ05000444の影響でこのファイルを使用できない。 +* Rev 0.0 に対しては bf518elf_00.ldを使用すること。 +*/ +OUTPUT_FORMAT("elf32-bfin","elf32-bfin","elf32-bfin") +OUTPUT_ARCH(bfin) + +PROVIDE (ldf_stack_end = 0xffb00FFC ) ; +PROVIDE (hardware_init_hook = 0) ; +PROVIDE (software_init_hook = 0) ; +PROVIDE (software_term_hook = 0) ; +PROVIDE (__kernel_boot_for_gdb = 0); + +ENTRY (start); + +MEMORY + { + MEM_SDRAM (XW) : ORIGIN = 0x00000000, LENGTH = 128M + MEM_ASYNC_0 (XW) : ORIGIN = 0x20000000, LENGTH = 1M + MEM_ASYNC_1 (XW) : ORIGIN = 0x20100000, LENGTH = 1M + MEM_ASYNC_2 (XW) : ORIGIN = 0x20200000, LENGTH = 1M + MEM_ASYNC_3 (XW) : ORIGIN = 0x20300000, LENGTH = 1M + + MEM_L1_DATA_A (W!X) : ORIGIN = 0xff800000, LENGTH = 32K + MEM_L1_DATA_B (W!X) : ORIGIN = 0xff900000, LENGTH = 16K /* BF518のバンクBは32kBだが、キャッシュ用に16kBあけておく */ + MEM_L1_CODE (XR) : ORIGIN = 0xffa00000, LENGTH = 32K +/* MEM_L1_INST_C (XR) : ORIGIN = 0xffa10000, LENGTH = 16K BF518のバンクCは16kBだが、キャッシュ用にあけておく */ + MEM_L1_SCRATCH (W!X) : ORIGIN = 0xffb00000, LENGTH = 4K + + MEM_L2 : ORIGIN = 0xffe00000, LENGTH = 0 /* DUMMY */ + + MEM_SYSMMR (W!X) : ORIGIN = 0xffc00000, LENGTH = 2M + MEM_COREMMR (W!X) : ORIGIN = 0xffe00000, LENGTH = 2M + } + +SECTIONS +{ + +/* Read-only sections, merged into text segment: */ + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } + .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } + .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } + .rel.data.rel.ro : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) } + .rela.data.rel.ro : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) } + .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } + .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } + .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } + .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } + .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } + .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.sdata : { *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*) } + .rela.sdata : { *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*) } + .rel.sbss : { *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*) } + .rela.sbss : { *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*) } + .rel.sdata2 : { *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*) } + .rela.sdata2 : { *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*) } + .rel.sbss2 : { *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*) } + .rela.sbss2 : { *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*) } + .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } + .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + .l2 : + { + *(.l2 .l2.*) + } >MEM_SDRAM + + .start : + { + KEEP (*(.start)) + } >MEM_L1_CODE =0 + + .text : + { + *(.text .stub .text.* .gnu.linkonce.t.*) + KEEP (*(.text.*personality*)) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + } >MEM_L1_CODE =0 + + .init : + { + KEEP (*(.init)) + } >MEM_L1_CODE =0 + + .plt : { *(.plt) } >MEM_L1_CODE + + .fini : + { + KEEP (*(.fini)) + } >MEM_L1_CODE =0 + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } >MEM_L1_DATA_A + .rodata1 : { *(.rodata1) } >MEM_L1_DATA_A + + .sdata2 : + { + *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) + } >MEM_L1_DATA_A + + .sbss2 : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) } >MEM_L1_DATA_A + .eh_frame_hdr : { *(.eh_frame_hdr) } >MEM_L1_DATA_A + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } >MEM_L1_DATA_A + .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } >MEM_L1_DATA_A + + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = ALIGN(0x1000) + (. & (0x1000 - 1)); + /* Exception handling */ + .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } >MEM_L1_DATA_A + .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } >MEM_L1_DATA_A + /* Thread Local Storage sections */ + .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } >MEM_L1_DATA_A + .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } >MEM_L1_DATA_A + .preinit_array : + { + PROVIDE_HIDDEN (___preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (___preinit_array_end = .); + } >MEM_L1_DATA_A + .init_array : + { + PROVIDE_HIDDEN (___init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE_HIDDEN (___init_array_end = .); + } >MEM_L1_DATA_A + .fini_array : + { + PROVIDE_HIDDEN (___fini_array_start = .); + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + PROVIDE_HIDDEN (___fini_array_end = .); + } >MEM_L1_DATA_A + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin*.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*crtend*.o(.ctors)) + } >MEM_L1_DATA_A + .dtors : + { + KEEP (*crtbegin*.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*crtend*.o(.dtors)) + } >MEM_L1_DATA_A + .jcr : { KEEP (*(.jcr)) } >MEM_L1_DATA_A + .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) } >MEM_L1_DATA_A + .dynamic : { *(.dynamic) } >MEM_L1_DATA_A + .data : + { + *(.data .data.* .gnu.linkonce.d.*) + KEEP (*(.gnu.linkonce.d.*personality*)) + SORT(CONSTRUCTORS) + } >MEM_L1_DATA_A + .data1 : { *(.data1) } >MEM_L1_DATA_A + .got : { *(.got.plt) *(.got) } >MEM_L1_DATA_A + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : + { + *(.sdata .sdata.* .gnu.linkonce.s.*) + } >MEM_L1_DATA_A + __edata = .; PROVIDE (_edata = .); + .sbss : + { + __bss_start = .; + *(.dynsbss) + *(.sbss .sbss.* .gnu.linkonce.sb.*) + *(.scommon) + } >MEM_L1_DATA_A + .bss : + { + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. + FIXME: Why do we need it? When there is no .bss section, we don't + pad the .data section. */ + . = ALIGN(. != 0 ? 32 / 8 : 1); + __bss_end = .; + } >MEM_L1_DATA_A + . = ALIGN(32 / 8); + . = ALIGN(32 / 8); + __end = .; PROVIDE (_end = .); + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + + __stack_end = ORIGIN(MEM_L1_SCRATCH) + LENGTH(MEM_L1_SCRATCH); + + __heap_start = ORIGIN(MEM_L1_DATA_B); + __heap_end = ORIGIN(MEM_L1_DATA_B) + LENGTH(MEM_L1_DATA_B); + + + PROVIDE (end = .) ; + +/* ADSP-BF518依存のSYSTEM MMR + .bss.sysmmr (NOLOAD) : { . = 0x0000; chip_mmr.o(SYSMMR0)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0100; chip_mmr.o(SYSMMR1)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x010C; chip_mmr.o(SYSMMR2)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x014C; chip_mmr.o(SYSMMR3)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0200; chip_mmr.o(SYSMMR4)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0300; chip_mmr.o(SYSMMR5)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0400; chip_mmr.o(SYSMMR6)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x041C; chip_mmr.o(SYSMMR7)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0424; chip_mmr.o(SYSMMR8)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0500; chip_mmr.o(SYSMMR9)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0600; chip_mmr.o(SYSMMR10)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0700; chip_mmr.o(SYSMMR11)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0800; chip_mmr.o(SYSMMR12)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0818; chip_mmr.o(SYSMMR13)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0820; chip_mmr.o(SYSMMR14)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0900; chip_mmr.o(SYSMMR15)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0918; chip_mmr.o(SYSMMR16)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0920; chip_mmr.o(SYSMMR17)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0A00; chip_mmr.o(SYSMMR18)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0A10; chip_mmr.o(SYSMMR19)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0B0C; chip_mmr.o(SYSMMR20)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C00; chip_mmr.o(SYSMMR21)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C10; chip_mmr.o(SYSMMR22)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C38; chip_mmr.o(SYSMMR23)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C40; chip_mmr.o(SYSMMR24)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C50; chip_mmr.o(SYSMMR25)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C78; chip_mmr.o(SYSMMR26)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C80; chip_mmr.o(SYSMMR27)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C90; chip_mmr.o(SYSMMR28)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0CB8; chip_mmr.o(SYSMMR29)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0CC0; chip_mmr.o(SYSMMR30)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0CD0; chip_mmr.o(SYSMMR31)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0CF8; chip_mmr.o(SYSMMR32)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D00; chip_mmr.o(SYSMMR33)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D10; chip_mmr.o(SYSMMR34)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D38; chip_mmr.o(SYSMMR35)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D40; chip_mmr.o(SYSMMR36)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D50; chip_mmr.o(SYSMMR37)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D78; chip_mmr.o(SYSMMR38)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D80; chip_mmr.o(SYSMMR39)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D90; chip_mmr.o(SYSMMR40)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0DB8; chip_mmr.o(SYSMMR41)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0DC0; chip_mmr.o(SYSMMR42)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0DD0; chip_mmr.o(SYSMMR43)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0DF8; chip_mmr.o(SYSMMR44)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E00; chip_mmr.o(SYSMMR45)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E10; chip_mmr.o(SYSMMR46)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E38; chip_mmr.o(SYSMMR47)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E40; chip_mmr.o(SYSMMR48)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E50; chip_mmr.o(SYSMMR49)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E78; chip_mmr.o(SYSMMR50)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E80; chip_mmr.o(SYSMMR51)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E90; chip_mmr.o(SYSMMR52)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0EB8; chip_mmr.o(SYSMMR53)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0EC0; chip_mmr.o(SYSMMR54)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0ED0; chip_mmr.o(SYSMMR55)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0EF8; chip_mmr.o(SYSMMR56)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F00; chip_mmr.o(SYSMMR57)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F10; chip_mmr.o(SYSMMR58)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F38; chip_mmr.o(SYSMMR59)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F40; chip_mmr.o(SYSMMR60)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F50; chip_mmr.o(SYSMMR61)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F78; chip_mmr.o(SYSMMR62)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F80; chip_mmr.o(SYSMMR63)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F90; chip_mmr.o(SYSMMR64)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0FB8; chip_mmr.o(SYSMMR65)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0FC0; chip_mmr.o(SYSMMR66)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0FD0; chip_mmr.o(SYSMMR67)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0FF8; chip_mmr.o(SYSMMR68)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1000; chip_mmr.o(SYSMMR69)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1400; chip_mmr.o(SYSMMR70)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1480; chip_mmr.o(SYSMMR71)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1500; chip_mmr.o(SYSMMR72)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1700; chip_mmr.o(SYSMMR73)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x2000; chip_mmr.o(SYSMMR74)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x201C; chip_mmr.o(SYSMMR75)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x2024; chip_mmr.o(SYSMMR76)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3000; chip_mmr.o(SYSMMR77)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x302C; chip_mmr.o(SYSMMR78)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3060; chip_mmr.o(SYSMMR79)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x30A0; chip_mmr.o(SYSMMR80)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3100; chip_mmr.o(SYSMMR81)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3180; chip_mmr.o(SYSMMR82)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3200; chip_mmr.o(SYSMMR83)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3210; chip_mmr.o(SYSMMR84)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3220; chip_mmr.o(SYSMMR85)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3240; chip_mmr.o(SYSMMR86)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3280; chip_mmr.o(SYSMMR87)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3288; chip_mmr.o(SYSMMR88)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3300; chip_mmr.o(SYSMMR89)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3340; chip_mmr.o(SYSMMR90)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3400; chip_mmr.o(SYSMMR91)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3500; chip_mmr.o(SYSMMR92)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3620; chip_mmr.o(SYSMMR93)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3680; chip_mmr.o(SYSMMR94)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3700; chip_mmr.o(SYSMMR95)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3800; chip_mmr.o(SYSMMR96)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3848; chip_mmr.o(SYSMMR97)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3880; chip_mmr.o(SYSMMR98)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x38C0; chip_mmr.o(SYSMMR99)}>MEM_SYSMMR +*/ + + + + +/* Blackfin 共有のCORE MMR + .bss.coremmr (NOLOAD) : { cpu_mmr.o(DMEMCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DCPLBA)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DCPLBD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DTESTC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DTESTD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(IMEMCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ICPLBA)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ICPLBD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ITESTC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ITESTD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(EVT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(CEC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(CTMR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000)+0x1000; cpu_mmr.o(DBG)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(TBCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(TBUF)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(WPICTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPIADDR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPICNT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(WPDCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPDADDR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPDCNT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(WPSTAT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(PFCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(PFCNT)}> MEM_COREMMR + +*/ + .comment 0 : { *(.comment) } + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } +} diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf518/bf518elf_00.ld b/uzume_prototype/kernel/config/blackfin/_common_bf518/bf518elf_00.ld new file mode 100644 index 0000000..fe34699 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf518/bf518elf_00.ld @@ -0,0 +1,417 @@ +/* +* ADSP-BF518 Rev 0.0用ELFファイル。命令SRAMバンクBの配置が間違っているアノーマリ05000444へ対応している。 +* このあのーまりを修正した Rev 0.1以降では使用できない。 +*/ + +OUTPUT_FORMAT("elf32-bfin","elf32-bfin","elf32-bfin") +OUTPUT_ARCH(bfin) + +PROVIDE (ldf_stack_end = 0xffb00FFC ) ; +PROVIDE (hardware_init_hook = 0) ; +PROVIDE (software_init_hook = 0) ; +PROVIDE (software_term_hook = 0) ; +PROVIDE (__kernel_boot_for_gdb = 0); + +ENTRY (start); + +MEMORY + { + MEM_SDRAM (XW) : ORIGIN = 0x00000000, LENGTH = 128M + MEM_ASYNC_0 (XW) : ORIGIN = 0x20000000, LENGTH = 1M + MEM_ASYNC_1 (XW) : ORIGIN = 0x20100000, LENGTH = 1M + MEM_ASYNC_2 (XW) : ORIGIN = 0x20200000, LENGTH = 1M + MEM_ASYNC_3 (XW) : ORIGIN = 0x20300000, LENGTH = 1M + + MEM_DATA_A (W!X) : ORIGIN = 0xff800000, LENGTH = 32K + MEM_DATA_B (W!X) : ORIGIN = 0xff900000, LENGTH = 16K /* BF518のバンクBは32kBだが、キャッシュ用に16kBあけておく */ + MEM_INST_A (XR) : ORIGIN = 0xffa00000, LENGTH = 16K + MEM_INST_B (XR) : ORIGIN = 0xffa08000, LENGTH = 16K +/* MEM_INST_C (XR) : ORIGIN = 0xffa10000, LENGTH = 16K BF518のバンクCは16kBだが、キャッシュ用にあけておく */ + MEM_SCRATCH (W!X) : ORIGIN = 0xffb00000, LENGTH = 4K + + MEM_SYSMMR (W!X) : ORIGIN = 0xffc00000, LENGTH = 2M + MEM_COREMMR (W!X) : ORIGIN = 0xffe00000, LENGTH = 2M + } +SECTIONS +{ + +/* Read-only sections, merged into text segment: */ + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } + .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } + .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } + .rel.data.rel.ro : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) } + .rela.data.rel.ro : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) } + .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } + .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } + .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } + .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } + .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } + .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.sdata : { *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*) } + .rela.sdata : { *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*) } + .rel.sbss : { *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*) } + .rela.sbss : { *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*) } + .rel.sdata2 : { *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*) } + .rela.sdata2 : { *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*) } + .rel.sbss2 : { *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*) } + .rela.sbss2 : { *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*) } + .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } + .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + .l2 : + { + *(.l2 .l2.*) + } >MEM_SDRAM + + .start : + { + KEEP (*(.start)) + } >MEM_INST_A =0 + + .text : + { + libkernel.a (.text .stub .text.* .gnu.linkonce.t.*) + KEEP (libkernel.a (.text.*personality*)) + } >MEM_INST_A =0 + + /* GNU LDは、同じ名前のセクションを同じ領域に配置しようとする。そのため、セクションを分割したければ + 違うセクション名をつけなければならない */ + .text_b : + { + *(EXCLUDE_FILE(libkernel.a) .text .stub .text.* .gnu.linkonce.t.*) + KEEP (*(EXCLUDE_FILE(libkernel.a) .text.*personality*)) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + } >MEM_INST_B = 0 + + .init : + { + KEEP (*(.init)) + } >MEM_INST_B =0 + + .plt : { *(.plt) } >MEM_INST_B + + .fini : + { + KEEP (*(.fini)) + } >MEM_INST_B =0 + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } >MEM_DATA_A + .rodata1 : { *(.rodata1) } >MEM_DATA_A + + .sdata2 : + { + *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) + } >MEM_DATA_A + + .sbss2 : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) } >MEM_DATA_A + .eh_frame_hdr : { *(.eh_frame_hdr) } >MEM_DATA_A + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } >MEM_DATA_A + .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } >MEM_DATA_A + + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = ALIGN(0x1000) + (. & (0x1000 - 1)); + /* Exception handling */ + .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } >MEM_DATA_A + .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } >MEM_DATA_A + /* Thread Local Storage sections */ + .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } >MEM_DATA_A + .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } >MEM_DATA_A + .preinit_array : + { + PROVIDE_HIDDEN (___preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (___preinit_array_end = .); + } >MEM_DATA_A + .init_array : + { + PROVIDE_HIDDEN (___init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE_HIDDEN (___init_array_end = .); + } >MEM_DATA_A + .fini_array : + { + PROVIDE_HIDDEN (___fini_array_start = .); + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + PROVIDE_HIDDEN (___fini_array_end = .); + } >MEM_DATA_A + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin*.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*crtend*.o(.ctors)) + } >MEM_DATA_A + .dtors : + { + KEEP (*crtbegin*.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*crtend*.o(.dtors)) + } >MEM_DATA_A + .jcr : { KEEP (*(.jcr)) } >MEM_DATA_A + .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) } >MEM_DATA_A + .dynamic : { *(.dynamic) } >MEM_DATA_A + .data : + { + *(.data .data.* .gnu.linkonce.d.*) + KEEP (*(.gnu.linkonce.d.*personality*)) + SORT(CONSTRUCTORS) + } >MEM_DATA_A + .data1 : { *(.data1) } >MEM_DATA_A + .got : { *(.got.plt) *(.got) } >MEM_DATA_A + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : + { + *(.sdata .sdata.* .gnu.linkonce.s.*) + } >MEM_DATA_A + __edata = .; PROVIDE (_edata = .); + .sbss : + { + __bss_start = .; + *(.dynsbss) + *(.sbss .sbss.* .gnu.linkonce.sb.*) + *(.scommon) + } >MEM_DATA_A + .bss : + { + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. + FIXME: Why do we need it? When there is no .bss section, we don't + pad the .data section. */ + . = ALIGN(. != 0 ? 32 / 8 : 1); + __bss_end = .; + } >MEM_DATA_A + . = ALIGN(32 / 8); + . = ALIGN(32 / 8); + __end = .; PROVIDE (_end = .); + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + + __stack_end = ORIGIN(MEM_SCRATCH) + LENGTH(MEM_SCRATCH); + + __heap_start = ORIGIN(MEM_DATA_B); + __heap_end = ORIGIN(MEM_DATA_B) + LENGTH(MEM_DATA_B); + + + PROVIDE (end = .) ; + + +/* ADSP-BF518依存のSYSTEM MMR + .bss.sysmmr (NOLOAD) : { . = 0x0000; chip_mmr.o(SYSMMR0)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0100; chip_mmr.o(SYSMMR1)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x010C; chip_mmr.o(SYSMMR2)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x014C; chip_mmr.o(SYSMMR3)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0200; chip_mmr.o(SYSMMR4)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0300; chip_mmr.o(SYSMMR5)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0400; chip_mmr.o(SYSMMR6)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x041C; chip_mmr.o(SYSMMR7)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0424; chip_mmr.o(SYSMMR8)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0500; chip_mmr.o(SYSMMR9)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0600; chip_mmr.o(SYSMMR10)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0700; chip_mmr.o(SYSMMR11)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0800; chip_mmr.o(SYSMMR12)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0818; chip_mmr.o(SYSMMR13)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0820; chip_mmr.o(SYSMMR14)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0900; chip_mmr.o(SYSMMR15)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0918; chip_mmr.o(SYSMMR16)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0920; chip_mmr.o(SYSMMR17)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0A00; chip_mmr.o(SYSMMR18)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0A10; chip_mmr.o(SYSMMR19)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0B0C; chip_mmr.o(SYSMMR20)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C00; chip_mmr.o(SYSMMR21)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C10; chip_mmr.o(SYSMMR22)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C38; chip_mmr.o(SYSMMR23)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C40; chip_mmr.o(SYSMMR24)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C50; chip_mmr.o(SYSMMR25)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C78; chip_mmr.o(SYSMMR26)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C80; chip_mmr.o(SYSMMR27)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C90; chip_mmr.o(SYSMMR28)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0CB8; chip_mmr.o(SYSMMR29)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0CC0; chip_mmr.o(SYSMMR30)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0CD0; chip_mmr.o(SYSMMR31)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0CF8; chip_mmr.o(SYSMMR32)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D00; chip_mmr.o(SYSMMR33)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D10; chip_mmr.o(SYSMMR34)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D38; chip_mmr.o(SYSMMR35)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D40; chip_mmr.o(SYSMMR36)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D50; chip_mmr.o(SYSMMR37)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D78; chip_mmr.o(SYSMMR38)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D80; chip_mmr.o(SYSMMR39)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D90; chip_mmr.o(SYSMMR40)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0DB8; chip_mmr.o(SYSMMR41)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0DC0; chip_mmr.o(SYSMMR42)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0DD0; chip_mmr.o(SYSMMR43)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0DF8; chip_mmr.o(SYSMMR44)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E00; chip_mmr.o(SYSMMR45)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E10; chip_mmr.o(SYSMMR46)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E38; chip_mmr.o(SYSMMR47)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E40; chip_mmr.o(SYSMMR48)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E50; chip_mmr.o(SYSMMR49)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E78; chip_mmr.o(SYSMMR50)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E80; chip_mmr.o(SYSMMR51)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E90; chip_mmr.o(SYSMMR52)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0EB8; chip_mmr.o(SYSMMR53)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0EC0; chip_mmr.o(SYSMMR54)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0ED0; chip_mmr.o(SYSMMR55)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0EF8; chip_mmr.o(SYSMMR56)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F00; chip_mmr.o(SYSMMR57)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F10; chip_mmr.o(SYSMMR58)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F38; chip_mmr.o(SYSMMR59)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F40; chip_mmr.o(SYSMMR60)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F50; chip_mmr.o(SYSMMR61)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F78; chip_mmr.o(SYSMMR62)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F80; chip_mmr.o(SYSMMR63)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F90; chip_mmr.o(SYSMMR64)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0FB8; chip_mmr.o(SYSMMR65)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0FC0; chip_mmr.o(SYSMMR66)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0FD0; chip_mmr.o(SYSMMR67)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0FF8; chip_mmr.o(SYSMMR68)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1000; chip_mmr.o(SYSMMR69)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1400; chip_mmr.o(SYSMMR70)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1480; chip_mmr.o(SYSMMR71)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1500; chip_mmr.o(SYSMMR72)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1700; chip_mmr.o(SYSMMR73)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x2000; chip_mmr.o(SYSMMR74)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x201C; chip_mmr.o(SYSMMR75)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x2024; chip_mmr.o(SYSMMR76)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3000; chip_mmr.o(SYSMMR77)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x302C; chip_mmr.o(SYSMMR78)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3060; chip_mmr.o(SYSMMR79)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x30A0; chip_mmr.o(SYSMMR80)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3100; chip_mmr.o(SYSMMR81)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3180; chip_mmr.o(SYSMMR82)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3200; chip_mmr.o(SYSMMR83)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3210; chip_mmr.o(SYSMMR84)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3220; chip_mmr.o(SYSMMR85)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3240; chip_mmr.o(SYSMMR86)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3280; chip_mmr.o(SYSMMR87)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3288; chip_mmr.o(SYSMMR88)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3300; chip_mmr.o(SYSMMR89)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3340; chip_mmr.o(SYSMMR90)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3400; chip_mmr.o(SYSMMR91)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3500; chip_mmr.o(SYSMMR92)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3620; chip_mmr.o(SYSMMR93)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3680; chip_mmr.o(SYSMMR94)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3700; chip_mmr.o(SYSMMR95)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3800; chip_mmr.o(SYSMMR96)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3848; chip_mmr.o(SYSMMR97)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3880; chip_mmr.o(SYSMMR98)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x38C0; chip_mmr.o(SYSMMR99)}>MEM_SYSMMR + +*/ + + + +/* Blackfin 共有のCORE MMR + .bss.coremmr (NOLOAD) : { cpu_mmr.o(DMEMCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DCPLBA)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DCPLBD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DTESTC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DTESTD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(IMEMCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ICPLBA)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ICPLBD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ITESTC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ITESTD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(EVT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(CEC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(CTMR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000)+0x1000; cpu_mmr.o(DBG)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(TBCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(TBUF)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(WPICTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPIADDR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPICNT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(WPDCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPDADDR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPDCNT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(WPSTAT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(PFCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(PFCNT)}> MEM_COREMMR +*/ + .comment 0 : { *(.comment) } + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } +} diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf518/chip_config.c b/uzume_prototype/kernel/config/blackfin/_common_bf518/chip_config.c new file mode 100644 index 0000000..9ab01b3 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf518/chip_config.c @@ -0,0 +1,398 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)縲鰀(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + +/* + * ターゲットシステム依存モジュール(ADSP-BF518用) + */ + +#include "jsp_kernel.h" +#include + +#ifdef __GNUC__ +#include /* gnu tool chain */ +#elif defined(__ECC__) +#include /* VisualDSP++ */ +#include +#include +#else +#error "Compiler is not supported" +#endif + + + +/* + * ターゲットシステム依存の初期化 + */ +void +sys_initialize() +{ + /* + * チップのシリコンリビジョンに応じたPLL_CTLのデフォルト値. + * Silicon RevによるPLL_CTLの変化については anomaly および + * http://ez.analog.com/thread/14209 を参照。 + */ + int plldefault; + + if (( *pDSPID & 0xFF ) < 2 ) + plldefault = 0x0A00; + else + plldefault = 0x0b00; + + /* + * スプリアス割り込みハンドラの設定 + * + * cpu_initialize()が行うダミーの割り込みハンドラの設定を上書きする。 + * アプリケーションが割り込みハンドラを設定すると、以下の設定も上書き + * される。 + */ + int i; + + for ( i=0; i> 8; + *pUART0_LCR &= ~DLAB; + + /* モード設定, パリティ無し 8bit data, 1 stop bit */ + *pUART0_LCR = 0x03; + + /* 割込み禁止 */ + *pUART0_IER = 0; + + *pPORTG_MUX &= ~(0x0C00); // bit11:10 だけを0にする + *pPORTG_MUX |= 0x01<<10; // bit11:10 だけを01にする + *pPORTG_FER |= 0x0600; // PG9,PG10をUART0に割り振る +} + +/* + * priority_maskは、event順位0..15に応じた割り込み要求のビットマップを保持する。 + * priority_mask[]のインデックスはevent順位と同じである。割り込み要因は BF51xでは + * 64要因あるので、unsigned long longによる64bit型としている。 + * + * device_dispatch()はpriority_mask[]を参照して、現在起きたイベントがどの割り込み + * 要因であるか決定する助けとする。 + * + * この変数はmake_priority_mask()を呼ぶ度に、実際のIARxの値に応じて上書きされる。 + * + */ +unsigned long long int priority_mask[16]={ + 0x0000000000000000ull, /* EMU */ + 0x0000000000000000ull, /* RST */ + 0x0000000000000000ull, /* NMI */ + 0x0000000000000000ull, /* EVX */ + 0x0000000000000000ull, + 0x0000000000000000ull, /* IVHW */ + 0x0000000000000000ull, /* IVTMR */ + 0x0007800000003FFFull, /* IVG7 */ + 0x000000000000C000ull, /* IVG8 */ + 0x00000000000F0000ull, /* IVG9 */ + 0x00F8000003F00000ull, /* IVG10 */ + 0x00000000FC000000ull, /* IVG11 */ + 0x000003FF00000000ull, /* IVG12 */ + 0x00007C0000000000ull, /* IVG13 */ + 0x0000000000000000ull, /* IVG14 */ + 0x0000000000000000ull /* IVG15 */ +}; + + +/* +* SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み +* のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので +* その分補正する。 +*/ +#define INSTALL_PRIORITY \ + for ( i=0; i<8; i++ ){ \ + priority = iar & 0xf; /* IARから優先順位を取り出す */ \ + priority_mask[priority + 7] |= device; /* 取り出した優先順位に基づきデバイスを登録 */ \ + device <<= 1; /* 次のデバイス */ \ + iar >>= 4; /* 次のIARフィールド */ \ + } + +/* +* 割り込み順位ごとのISRビットマップの作成SIC_IARxの設定はこの部分より前に済ませること。 +* この関数はuITRONのイニシャライザで使用することを想定しており、特に割り込みから保護していない。 +*/ +void make_priority_mask( void ) +{ + unsigned int i, priority, iar; + unsigned long long int device; + + + + // priority_maskは、event順位0..15に応じた割り込み要求のビットマップを保持する。 + // 最初にクリアする + for ( i=0; i<16; i++ ){ + priority_mask[i] = 0; + } + + device = 1; + iar = *pSIC_IAR0; + INSTALL_PRIORITY + + iar = *pSIC_IAR1; + INSTALL_PRIORITY + + iar = *pSIC_IAR2; + INSTALL_PRIORITY + + iar = *pSIC_IAR3; + INSTALL_PRIORITY + + iar = *pSIC_IAR4; + INSTALL_PRIORITY + + iar = *pSIC_IAR5; + INSTALL_PRIORITY + + iar = *pSIC_IAR6; + INSTALL_PRIORITY + + iar = *pSIC_IAR7; + INSTALL_PRIORITY + +} + + +/* + * 割り込みの許可。ADSP-BF51xは効率的な割り込み処理と安全な割り込み禁止を両立する + * 手段を持たないため、禁止関数は置いていない。 + * + * 不便ではあるが、プログラマに注意を促すためにそうしている。 + */ +ER ena_int( INTNO intno ) +{ + unsigned int mask; + SIL_PRE_LOC; + + if ( intno >= DEVICE_INTERRUPT_COUNT ) + return ( E_PAR ); + else { + if ( intno < 32 ){ + mask = 1 << intno; + SIL_LOC_INT(); + *pSIC_IMASK0 |= mask; + asm volatile( "ssync;" ); + SIL_UNL_INT(); + } + else{ + mask = 1 << (intno-32); + SIL_LOC_INT(); + *pSIC_IMASK1 |= mask; + asm volatile( "ssync;" ); + SIL_UNL_INT(); + } + return (0); + } +} + + +/* + * 割り込みマスクの取得。ADSP-BF51xは効率的な割り込み処理と安全な割り込み禁止を両立する + * 手段を持たないため、禁止関数は置いていない。 + * + * 不便ではあるが、プログラマに注意を促すためにそうしている。 + */ + + +extern ER get_ims( IMS * p_ims ) +{ + SIL_PRE_LOC; + + SIL_LOC_INT(); + *p_ims = (((IMS)*pSIC_IMASK1)<<32 ) | (IMS)*pSIC_IMASK0; + SIL_UNL_INT(); + return( 0 ); +} + + +/* + * 割り込みをデバイスに割り当てる。 + * + * この間数は割り込み発生時に共通割り込みハンドラの一部としてアセンブリ言語から割り込み禁止状態で + * 呼ばれる。実割り込みハンドラを割り込み可能にするため、asm文を使って途中で割り込み可能にしている。 + * 割り込み禁止状態で呼ぶのは割り込み源の特定を安全におこなうためである。 + * + */ +void device_dispatcher( unsigned int priority, unsigned int imask ) +{ + unsigned int device, candidates; + unsigned long long int longcandidates, sic_isr, sic_imask; + + // 以下では SIC_IMASK0,1をまとめて64bitレジスタとして扱っている。SIC_ISRも同じである。 + get_ims(&sic_imask); + sic_isr = (((IMS)*pSIC_ISR1)<<32 ) | (IMS)*pSIC_ISR0; + + // 現在のプライオリティに相当する割込み源を特定する。 + longcandidates = priority_mask[priority] & sic_isr & sic_imask; + + asm volatile("sti %0;": : "d"(imask) ); + + if ( ! longcandidates ) // 割り込み源が特定できないなら、コア由来である + { + if ( priority == ik_hardware_err) + dev_vector[INHNO_HW_ERROR](); + else + if ( priority == ik_timer) + dev_vector[INHNO_TIMER](); + else + dev_vector[INHNO_RAISE](); // ソフトウェア割り込み + + } + else if ( longcandidates & 0xFFFFFFFF00000000ull ) + { + candidates = longcandidates >> 32; + if ( candidates & 0x80000000 ) + device = 31; + else + { +#ifdef __GNUC__ + asm ( "r1.L = signbits %1; %0 = r1.L(z);":"=d"(device) :"d"(candidates): "R1" ); +#elif defined(__ECC__) + asm( "%0 = signbits %1;" : "=l"( device ) : "d"( candidates ) ); +#else +#error "Compiler is not supported" +#endif + device = 30 - device; // bit mask is converted to bit number + } + dev_vector[device+32](); + } + else + { + candidates = (unsigned int)longcandidates; + if ( candidates & 0x80000000 ) + device = 31; + else + { +#ifdef __GNUC__ + asm ( "r1.L = signbits %1; %0 = r1.L(z);":"=d"(device) :"d"(candidates): "R1" ); +#elif defined(__ECC__) + asm( "%0 = signbits %1;" : "=l"( device ) : "d"( candidates ) ); +#else +#error "Compiler is not supported" +#endif + device = 30 - device; // bit mask is converted to bit number + } + dev_vector[device](); + } +} + + + +/* + * ターゲットシステムの終了。TOPPERS/JSPは対話型ROMモニタに戻ることを想定しているが、 + * このボードにROMはない。 + */ +void +sys_exit() +{ + while(1) + ; +} + +/* + * ターゲットシステムの文字出力。割り込みが無効な状態でポーリングによる出力を行う。 + */ +void +sys_putc(char c) +{ + if ( c== 0x0A ) /* もし LF ならば */ + sys_putc( 0x0D ); /* CRを一文字送信 */ + + while( !( *pUART0_LSR & (1<<5)) ) + ; /* UART0 LSRのTHREが1になるまで待つ。1ならば送信レジスタ空き。*/ + + *pUART0_THR = c; /* 一文字送信 */ +} + + + diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf518/chip_config.h b/uzume_prototype/kernel/config/blackfin/_common_bf518/chip_config.h new file mode 100644 index 0000000..9a4e323 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf518/chip_config.h @@ -0,0 +1,350 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2009 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +#ifndef _CHIP_CONFIG_H_ +#define _CHIP_CONFIG_H_ + + +/* + * ターゲットシステム依存モジュール(EZKIT-BF534,6,7用) + * + * このインクルードファイルは,t_config.h のみからインクルードされる. + * 他のファイルから直接インクルードしてはならない. +*/ + +/* + * ターゲットシステムのハードウェア資源の定義 + * + * DEVICE_INTERRUPT_COUNTはSIC_IMASKのビット数 + * を与える。 + * ADSP-BF518のビット数は56なので、値は56である。 + */ + +#define DEVICE_INTERRUPT_COUNT 56 + + + +/* + * PLLクロック周波数 + */ +#define PLLCLOCK (CLKIN*MSELVAL) +#define SYSCLOCK (PLLCLOCK / SSELVAL) +#define CORECLOCK (PLLCLOCK / CSELVAL) + + + +/* + * TICの割込みハンドラのベクタ番号 + */ +#ifdef USE_TIC_CORE +#define INHNO_TIMER INHNO_CORE_TIMER +#else +#define INHNO_TIMER INHNO_TIMER7 +#endif + + +/* + * 微少時間待ちのための定義 + * sil_dly_nseの呼び出しオーバーヘッドとループボディーサイクルを + * nSで表す。関数はcpu_support.asmに定義してある。 + * SIL_DLY_TIM1は24サイクル。32nS( 750MHz ), 40nS( 600MHz ) + * SIL_DLY_TIM2は12サイクル。16nS( 750MHz ), 20nS( 600MHz ) + */ + + +#define SIL_DLY_TIM1 (24*1000000000/CORECLOCK) +#define SIL_DLY_TIM2 (12*1000000000/CORECLOCK) + +/************************************************************************* + * uart.c用構成マクロ + */ + +/* シリアルの割込みハンドラのベクタ番号 */ +#define INHNO_SIO0_TX INHNO_UART0_TX +#define INHNO_SIO0_RX INHNO_UART0_RX +#define INHNO_SIO1_TX INHNO_UART1_TX +#define INHNO_SIO1_RX INHNO_UART1_RX + +/* + * UARTレジスタの配置境界。ADSP-BF518の内蔵UARTは4バイト周期でレジスタが + * 並んでいるので、ここには4を指定する。 + */ +#define UART_BOUNDARY 4 + +/* UARTレジスタにsil_xxb_iop()を使ってアクセスするときにはUART_IOP_ACCESSを 宣言する。*/ +#define UART_IOP_ACCESS + +/* シリアルポートのアドレス。 */ +#define UART0_ADDRESS 0xFFC00400 // 内蔵UART0 THRのアドレス。 +#define UART1_ADDRESS 0xFFC02000 // 内蔵UART0 THRのアドレス。 + +/* UARTのボーレートジェネレータに設定すべき値. */ +#define UART0_DIVISOR SYSCLOCK/16/UART0_BAUD_RATE +#define UART1_DIVISOR SYSCLOCK/16/UART1_BAUD_RATE + +/* 内蔵UARTを使う場合は、UARTx_BLACKFIN_UCENを宣言してUCENを初期化しなければならない。*/ +#define UART0_BLACKFIN_UCEN +#define UART1_BLACKFIN_UCEN + + +/* + * uart.c用構成マクロ終わり + *************************************************************************/ + + + +/* + * 割り込みベクトル番号 + * + * この定義はコンフィグレーションファイルでDEF_INHの引数として使う + * SIC_ISRにおけるビット番号である。 + * + */ + +/* Peripheral Masks For SIC_ISR0, SIC_IWR0, SIC_IMASK0 */ +#define INHNO_PLL_WAKEUP 0 /* PLL Wakeup Interrupt */ +#define INHNO_DMA_ERR0 1 /* Error Interrupt (DMA error 0 interrupt (generic)) */ +#define INHNO_DMAR0 2 /* DMAR0 Block (DMAR0 block interrupt) */ +#define INHNO_DMAR1 3 /* DMAR1 Block (DMAR1 block interrupt) */ +#define INHNO_DMAR0_ERR 4 /* Error Interrupt (DMAR0 overflow error interrupt) */ +#define INHNO_DMAR1_ERR 5 /* Error Interrupt (DMAR1 overflow error interrupt) */ +#define INHNO_PPI_ERR 6 /* Error Interrupt (PPI error interrupt) */ +#define INHNO_MAC_ERR 7 /* Error Interrupt (MAC status interrupt) */ +#define INHNO_SPORT0_ERR 8 /* Error Interrupt (SPORT0 status interrupt) */ +#define INHNO_SPORT1_ERR 9 /* Error Interrupt (SPORT1 status interrupt) */ +#define INHNO_PTP_ERR 10 /* Error Interrupt (PTP error interrupt) */ +/* reserved */ +#define INHNO_UART0_ERR 12 /* Error Interrupt (UART0 status interrupt) */ +#define INHNO_UART1_ERR 13 /* Error Interrupt (UART1 status interrupt) */ +#define INHNO_RTC 14 /* Real Time Clock Interrupt */ +#define INHNO_PPI 15 /* DMA channel 0 (PPI/NFC) Interrupt */ +#define INHNO_SPORT0_RX 16 /* DMA Channel 3 (SPORT0 RX) Interrupt */ +#define INHNO_SPORT0_TX 17 /* DMA Channel 4 (SPORT0 TX) Interrupt */ +#define INHNO_SPORT1_RX 18 /* DMA Channel 5 (SPORT1 RX) Interrupt */ +#define INHNO_SPORT1_TX 19 /* DMA Channel 6 (SPORT1 TX) Interrupt */ +#define INHNO_TWI 20 /* TWI Interrupt */ +#define INHNO_SPI 21 /* DMA Channel 7 (SPI) Interrupt */ +#define INHNO_UART0_RX 22 /* DMA Channel 8 (UART0 RX) Interrupt */ +#define INHNO_UART0_TX 23 /* DMA Channel 9 (UART0 TX) Interrupt */ +#define INHNO_UART1_RX 24 /* DMA Channel 10 (UART1 RX) Interrupt */ +#define INHNO_UART1_TX 25 /* DMA Channel 11 (UART1 TX) Interrupt */ +#define INHNO_OTP 26 /* OTP Interrupt */ +#define INHNO_CNT 27 /* GP Counter Interrupt */ +#define INHNO_ETHERNET_RX 28 /* DMA Channel 1 (EthernetRX/HOSTDP) Interrupt */ +#define INHNO_PFA_PORTH 29 /* PF Port H Interrupt A */ +#define INHNO_ETHERNET_TX 30 /* DMA Channel 2 (Ethernet TX/NFC) Interrupt */ +#define INHNO_PFB_PORTH 31 /* PF Port H Interrupt B */ + +/* Peripheral Masks For SIC_ISR1, SIC_IWR1, SIC_IMASK1 */ +#define INHNO_TIMER0 32 /* Timer 0 Interrupt */ +#define INHNO_TIMER1 33 /* Timer 1 Interrupt */ +#define INHNO_TIMER2 34 /* Timer 2 Interrupt */ +#define INHNO_TIMER3 35 /* Timer 3 Interrupt */ +#define INHNO_TIMER4 36 /* Timer 4 Interrupt */ +#define INHNO_TIMER5 37 /* Timer 5 Interrupt */ +#define INHNO_TIMER6 38 /* Timer 6 Interrupt */ +#define INHNO_TIMER7 39 /* Timer 7 Interrupt */ +#define INHNO_PFA_PORTG 40 /* PF Port G Interrupt A */ +#define INHNO_PFB_PORTG 41 /* PF Port G Interrupt B */ +#define INHNO_MDMA0_DST 42 /* DMA Channels 12 (MDMA0 Destination) TX Interrupt */ +#define INHNO_MDMA0_SRC 42 /* DMA Channels 13 (MDMA0 Source) RX Interrupt */ +#define INHNO_MDMA1_DST 43 /* DMA Channels 14 (MDMA1 Destination) TX Interrupt */ +#define INHNO_MDMA1_SRC 43 /* DMA Channels 15 (MDMA1 Source) RX Interrupt */ +#define INHNO_WDOG 44 /* Software Watchdog Timer Interrupt */ +#define INHNO_PFA_PORTF 45 /* PF Port F Interrupt A */ +#define INHNO_PFB_PORTF 46 /* PF Port F Interrupt B */ +#define INHNO_SPI0_ERR 47 /* Error Interrupt (SPI0 status interrupt) */ +#define INHNO_SPI1_ERR 48 /* Error Interrupt (SPI1 status interrupt) */ +/* reserved */ +/* reserved */ +#define INHNO_RSI_INT0 51 /* USB EINT interrupt */ +#define INHNO_RSI_INT1 52 /* USB INT0 interrupt */ +#define INHNO_PWM_TRIPINT 53 /* USB INT1 interrupt */ +#define INHNO_PWM_SYNCINT 54 /* USB INT1 interrupt */ +#define INHNO_PTP_STATINT 55 /* USB DMAINT interrupt */ + + +// SIC_ISRにない特殊な割り込み + +#define INHNO_HW_ERROR 56 +#define INHNO_CORE_TIMER 57 +#define INHNO_RAISE 58 + + +/* + * SIC_ISRの割り込みのベクタ番号 + * + * この定義はena_int, dis_intの引数として使う。 + */ + +/* Peripheral Masks For SIC_ISR0, SIC_IWR0, SIC_IMASK0 */ +#define INTNO_PLL_WAKEUP 0 /* PLL Wakeup Interrupt */ +#define INTNO_DMA_ERR0 1 /* Error Interrupt (DMA error 0 interrupt (generic)) */ +#define INTNO_DMAR0 2 /* DMAR0 Block (DMAR0 block interrupt) */ +#define INTNO_DMAR1 3 /* DMAR1 Block (DMAR1 block interrupt) */ +#define INTNO_DMAR0_ERR 4 /* Error Interrupt (DMAR0 overflow error interrupt) */ +#define INTNO_DMAR1_ERR 5 /* Error Interrupt (DMAR1 overflow error interrupt) */ +#define INTNO_PPI_ERR 6 /* Error Interrupt (PPI error interrupt) */ +#define INTNO_MAC_ERR 7 /* Error Interrupt (MAC status interrupt) */ +#define INTNO_SPORT0_ERR 8 /* Error Interrupt (SPORT0 status interrupt) */ +#define INTNO_SPORT1_ERR 9 /* Error Interrupt (SPORT1 status interrupt) */ +#define INTNO_PTP_ERR 10 /* Error Interrupt (PTP error interrupt) */ +/* reserved */ +#define INTNO_UART0_ERR 12 /* Error Interrupt (UART0 status interrupt) */ +#define INTNO_UART1_ERR 13 /* Error Interrupt (UART1 status interrupt) */ +#define INTNO_RTC 14 /* Real Time Clock Interrupt */ +#define INTNO_PPI 15 /* DMA channel 0 (PPI/NFC) Interrupt */ +#define INTNO_SPORT0_RX 16 /* DMA Channel 3 (SPORT0 RX) Interrupt */ +#define INTNO_SPORT0_TX 17 /* DMA Channel 4 (SPORT0 TX) Interrupt */ +#define INTNO_SPORT1_RX 18 /* DMA Channel 5 (SPORT1 RX) Interrupt */ +#define INTNO_SPORT1_TX 19 /* DMA Channel 6 (SPORT1 TX) Interrupt */ +#define INTNO_TWI 20 /* TWI Interrupt */ +#define INTNO_SPI 21 /* DMA Channel 7 (SPI) Interrupt */ +#define INTNO_UART0_RX 22 /* DMA Channel 8 (UART0 RX) Interrupt */ +#define INTNO_UART0_TX 23 /* DMA Channel 9 (UART0 TX) Interrupt */ +#define INTNO_UART1_RX 24 /* DMA Channel 10 (UART1 RX) Interrupt */ +#define INTNO_UART1_TX 25 /* DMA Channel 11 (UART1 TX) Interrupt */ +#define INTNO_OTP 26 /* OTP Interrupt */ +#define INTNO_CNT 27 /* GP Counter Interrupt */ +#define INTNO_ETHERNET_RX 28 /* DMA Channel 1 (EthernetRX/HOSTDP) Interrupt */ +#define INTNO_PFA_PORTH 29 /* PF Port H Interrupt A */ +#define INTNO_ETHERNET_TX 30 /* DMA Channel 2 (Ethernet TX/NFC) Interrupt */ +#define INTNO_PFB_PORTH 31 /* PF Port H Interrupt B */ + +/* Peripheral Masks For SIC_ISR1, SIC_IWR1, SIC_IMASK1 */ +#define INTNO_TIMER0 32 /* Timer 0 Interrupt */ +#define INTNO_TIMER1 33 /* Timer 1 Interrupt */ +#define INTNO_TIMER2 34 /* Timer 2 Interrupt */ +#define INTNO_TIMER3 35 /* Timer 3 Interrupt */ +#define INTNO_TIMER4 36 /* Timer 4 Interrupt */ +#define INTNO_TIMER5 37 /* Timer 5 Interrupt */ +#define INTNO_TIMER6 38 /* Timer 6 Interrupt */ +#define INTNO_TIMER7 39 /* Timer 7 Interrupt */ +#define INTNO_PFA_PORTG 40 /* PF Port G Interrupt A */ +#define INTNO_PFB_PORTG 41 /* PF Port G Interrupt B */ +#define INTNO_MDMA0_DST 42 /* DMA Channels 12 (MDMA0 Destination) TX Interrupt */ +#define INTNO_MDMA0_SRC 42 /* DMA Channels 13 (MDMA0 Source) RX Interrupt */ +#define INTNO_MDMA1_DST 43 /* DMA Channels 14 (MDMA1 Destination) TX Interrupt */ +#define INTNO_MDMA1_SRC 43 /* DMA Channels 15 (MDMA1 Source) RX Interrupt */ +#define INTNO_WDOG 44 /* Software Watchdog Timer Interrupt */ +#define INTNO_PFA_PORTF 45 /* PF Port F Interrupt A */ +#define INTNO_PFB_PORTF 46 /* PF Port F Interrupt B */ +#define INTNO_SPI0_ERR 47 /* Error Interrupt (SPI0 status interrupt) */ +#define INTNO_SPI1_ERR 48 /* Error Interrupt (SPI1 status interrupt) */ +/* reserved */ +/* reserved */ +#define INTNO_RSI_INT0 51 /* USB EINT interrupt */ +#define INTNO_RSI_INT1 52 /* USB INT0 interrupt */ +#define INTNO_PWM_TRIPINT 53 /* USB INT1 interrupt */ +#define INTNO_PWM_SYNCINT 54 /* USB INT1 interrupt */ +#define INTNO_PTP_STATINT 55 /* USB DMAINT interrupt */ + + + +#ifndef _MACRO_ONLY + +/* +* SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み +* のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので +* その分補正する。 +*/ +void make_priority_mask( void ); + +/* + * ターゲットシステム依存の初期化 + */ +extern void sys_initialize(void); + +/* + * ターゲットシステムの終了 + * + * システムを終了する時に使う.ROMモニタ/GDB STUB呼出しで実現する. + */ +extern void sys_exit(void); + +/* + * ターゲットシステムの文字出力 + * + * システムの低レベルの文字出力ルーチン.ROMモニタ/GDB STUB呼出しで実 + * 現する. + */ +extern void sys_putc(char c); + +/* +* SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み +* のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので +* その分補正する。 +*/ +void make_priority_mask( void ); + +/* + * 割り込みの許可、禁止 + * + */ +typedef unsigned int INTNO; +extern ER ena_int( INTNO intno ); +extern ER dis_int( INTNO intno ); + +/* + * 割り込みマスクの操作 + * + * + */ +typedef unsigned long long int IMS; +extern ER chg_ims( IMS ims ); +extern ER get_ims( IMS * p_ims ); + +/* + * 割り込みをデバイスに割り当てる + */ +extern void device_dispatcher( unsigned int priority, unsigned int imask ); + +/** + * スプリアス・イベント・ハンドラ + */ +void spurious_exc_handler(VP p_excinf); +void spurious_int_handler(); + +#endif /* _MACRO_ONLY */ +#endif /* _SYS_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf518/chip_debugboot.c b/uzume_prototype/kernel/config/blackfin/_common_bf518/chip_debugboot.c new file mode 100644 index 0000000..85c7efa --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf518/chip_debugboot.c @@ -0,0 +1,35 @@ +#include "jsp_kernel.h" + +#ifdef __GNUC__ +#include "cdefBF518.h" /* gnu tool chain */ +#elif defined(__ECC__) +#error "Don't use sys_debugboot.c for VDSP " +#else +#error "Compiler is not supported" +#endif + + +/* +* gdbserverがターゲットのリセット機能を提供しないため、gdb経由でターゲット +* にアプリッケーションをダウンロードすると正しく動作しないことがある。 +* このルーチンはターゲットを一度だけリセットする。 +*/ +void boot_for_gdb( void ) +{ + if ( enable_boot_for_gdb ){ /* ソフトウェアリセットが起きていないなら以下実行 */ + enable_boot_for_gdb = 0; /* リブートは一回だけ */ + *pSWRST = 0x07; /* 内蔵ペリフェラルのリセット */ + asm volatile( "ssync;" ); + *pSWRST = 0x00; /* 内蔵ペリフェラルのリセット解除。 */ + asm volatile( "ssync;" ); + *pSYSCR |= 0x10; /* no boot on core reset */ + asm volatile( "ssync;" ); + asm volatile( "raise 1;" ); /* コアリセット */ + while( 1 ) + ; /*リセットが発生するまでループ*/ + } + else + { + *pPLL_LOCKCNT = 0x200; /* Fix the anormaly 05000430 */ + } +} diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf518/chip_defs.h b/uzume_prototype/kernel/config/blackfin/_common_bf518/chip_defs.h new file mode 100644 index 0000000..4220bd3 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf518/chip_defs.h @@ -0,0 +1,87 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2009 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +/* + * ターゲットシステムに依存する定義(ADSP-BF534,6,7用) + * + * このインクルードファイルは,kernel.h と sil.h でインクルードされる. + * 他のファイルから直接インクルードすることはない.このファイルをイン + * クルードする前に,t_stddef.h と itron.h がインクルードされるので, + * それらに依存してもよい. + */ + +#ifndef _CHIP_DEFS_H_ +#define _CHIP_DEFS_H_ + + /* チップ共通部略称  jsp/doc/config.txtの 2.(8)を参照 */ +#define _COMMON_BF518 + +/* + * タイムティックの定義 + */ +#define TIC_NUME 1u /* タイムティックの周期の分子 */ +#define TIC_DENO 1u /* タイムティックの周期の分母 */ + +/* + * 破壊性読み出しレジスタの判別式 + * 与えられたアドレス iop が破壊性読み出しレジスタの + * 場合には真を返す。 + */ +#ifndef DESTRUCTIVE_READ +#define DESTRUCTIVE_READ( iop ) (iop<(VP)0xF0000000) +#endif + +#ifndef _MACRO_ONLY + +/* + * システムの停止処理 + */ + +Inline void +kernel_abort() +{ +} + +#endif /* _MACRO_ONLY */ +#endif /* _SYS_DEFS_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf518/chip_dump.c b/uzume_prototype/kernel/config/blackfin/_common_bf518/chip_dump.c new file mode 100644 index 0000000..c1f056b --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf518/chip_dump.c @@ -0,0 +1,334 @@ +/** + * \file postmotem533.c + * \brief ADSP-BF533用のポストモーテムダンプルーチン群 + * + * ハードウェアエラー用のハンドラと、例外用のハンドラからなる。いずれも呼び出されるとUARTから + * ポストモーテム出力を表示する。 + */ +#include "jsp_kernel.h" +#include + +/** + * \brief UARTおよび付随するDMAの動作を停止し、すべての割り込みを禁止する。 + * + * 最後にUART_IERをクリアするのは、UART割り込みを禁止すると同時にDMAも禁止するため。 + * UART DMAは、UARTの割り込み線で駆動されているので、割り込みを禁止すればDMAリクエスト + * も停止する。 + * + * UARTの初期化をどうするか悩ましいが、ここではそのまま以前の設定を利用することにする。 + * + * ポストモーテム・ダンプを目的としているので、この状態からの回復は考えない。 + */ +static void pm_occupy_uart() +{ + /* すべてのコア割り込みを禁止する */ + asm( "cli r0;" : : : "R0" ); + + /* すべてのシステム割り込みソースを禁止する */ + *pSIC_IMASK0 = 0; + *pSIC_IMASK1 = 0; + + /* UART_IERをディセーブルにすることで、DMAを殺せる */ + *pUART0_IER = 0; +} + +/** + * \brief 一文字出力 + * + * UARTの送信レジスタが空になるのを待って一文字出力する。 + */ +static void pm_putc( unsigned char c ) +{ + + /* THRが空になるまで待つ */ + while ( ! ( *pUART0_LSR & THRE ) ) + ; + + /* THRが空になったら1文字送信 */ + *pUART0_THR = c; +} + +/** + * \brief コンソール入力監視 + * + * UARTの受信レジスタにデータがあれば、読み込む。データが"!"なら真、 + * それ以外なら偽を返す。 + */ +static BOOL is_ready() +{ + /* 受信データはあるか。 */ + if ( *pUART0_LSR & DR ) + + { + char c; + + c= *pUART0_RBR; + if ( c == '!' ) + return TRUE; + } + return FALSE; +} + + +/** + * \brief 文字列出力 + * + * 受け取った文字列をUARTに出力する。 + */ +static void pm_putstr( char * s ) +{ + int i; + + i=0; + while( s[i] ) /* 末端のNULLが現れるまで出力 */ + pm_putc(s[i++]); +} + +/** + * \brief 1バイトをヘキサデシマルで出力する。 + */ +static void pm_puthex1byte( unsigned int data ) +{ + int i; + int nibble; + + /* 8bit内のすべてのニブルを処理 */ + for ( i=0; i<2; i++ ) + { + /* 最上位ニブルを抽出 */ + nibble = ( data >> 4 ) & 0xF; + /* 抽出したニブルを出力 */ + if ( nibble < 10 ) + pm_putc( nibble + '0' ); + else + pm_putc( nibble - 10 + 'A' ); + /* 次のニブル */ + data <<= 4; + } +} + +/* + * \brief 改行記号を出力する + */ +static void pm_putrtn() +{ + pm_putstr("\r\n"); +} + +/** + * \brief 4バイトをヘキサデシマルで出力する。 + */ +static void pm_puthex4byte( unsigned int data ) +{ + int i; + int nibble; + + /* 32bit内のすべてのニブルを処理 */ + for ( i=0; i<8; i++ ) + { + /* 最上位ニブルを抽出 */ + nibble = ( data >> 28 ) & 0xF; + /* 抽出したニブルを出力 */ + if ( nibble < 10 ) + pm_putc( nibble + '0' ); + else + pm_putc( nibble - 10 + 'A' ); + /* 次のニブル */ + data <<= 4; + } + +} + +/** + * \brief 例外フラグ + * + * 例外が発生したときには真、そうでなければ偽。hwei_handler()に例外か否かを伝える。 + * + * GCCが張り切ってlink/unlink命令の位置を最適化するため、hwei_hanlder()の + * 中で性格にfpを手繰れない。そのため、dummyをアクセスすることでlink/unlinkの位置 + * 最適化の抑止を図る役目もある。効果があるかどうかは不明。 + */ +static volatile int expFlag =0; +/** + * \brief ハードウェア・エラー・ハンドラ + * + * ハードウェア・エラー時に呼び出されて、ハードウェア・エラー・割り込みのポストモーテム処理を行う。 + * 最初にFPを手繰って、割り込みのスタックフレームを探す。次にすべての割り込みを禁止し、 + * UART0を占有したあと、ポーリングを使ってスタックに保存された各レジスタのダンプを行う。 + * DEF_INH(INHNO_HW_ERROR, { TA_HLNG, hwei_handler }); + * + */ +void spurious_int_handler() +{ + unsigned int * fp, *ptr ; /* フレーム・ポインタを手繰っていくための変数 */ + unsigned int reg; /* システムレジスタを受け取るための変数 */ + unsigned int imask, sic_imask0, sic_imask1; /*マスク記録レジスタ*/ + + /* あとで使う */ + imask = *pIMASK; + sic_imask0 = *pSIC_IMASK0; + sic_imask1 = *pSIC_IMASK1; + /* UART0を初期化し、DMAと割り込みを禁止する */ + pm_occupy_uart(); + + while (1) + { + int count = 0; + + pm_putstr( "Type '!' to display post mortem dump" ); pm_putrtn(); + + while ( ! is_ready() ) + { + int i; + for ( i=0; i<100000000; i++) + asm volatile ("nop;"); + if ( count > 30 ) + { + pm_putstr( "Type '!' to display post mortem dump" ); pm_putrtn(); + count = 0; + } + else + count ++; + } + pm_putrtn(); + + + /* 現在の関数のFPを取得する */ + asm ( "%0=fp;" : "=d"((unsigned int)fp) ); + + /* + * この関数を呼び出した関数 ( interrupt_dispatcher ) のFPを取得する。 + * FPは呼び出し関数のFPの格納番地を指していることを利用する + */ + fp = (void *)*fp; + /* + * interrupt_dispatcher を呼び出した関数のFPを取得する。 + * その関数は割り込みハンドラの入り口処理部に他ならない。 + */ + fp = (void *)*fp; + + /* いまや、FPは割り込み受付時の保存されたレジスタ群を指している */ + + /* プッシュされた P0を指す */ + ptr = fp + 2; + /* + * 上位 + * 0 1 2 3 4 5 6 7 8 9 + * ----------------------------------------------- + * 00 P0 RTS FP R0 R1 R2 R3 R4 R5 R6 + * 10 R7 P1 P2 P3 P4 P5 I3 I2 I1 I0 + * 20 M3 M2 M1 M0 B3 B2 B1 B0 L3 L2 + * 30 L1 L0 A0x A0w A1x A1w LC1 LC0 LT1 LT0 + * 40 LB1 LB0 AST RETI + * 下位 + * + */ + if ( expFlag ) + pm_putstr( "Spurious Exception !!" ); + else + pm_putstr( "Spurious Interrupt !!" ); + pm_putrtn(); + + pm_putstr( "Registers On Stack :" ); pm_putrtn(); + pm_putstr( "P0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "RETS " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "FP " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R4 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R5 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R6 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R7 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P4 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P5 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "A0 " ); pm_puthex1byte( *(ptr--) ); pm_putstr( ":" ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "A1 " ); pm_puthex1byte( *(ptr--) ); pm_putstr( ":" ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LC1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LC0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LT1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LT0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LB1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LB0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "ASTAT " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "RETI " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putrtn(); + pm_putstr( "System Registers :" ); pm_putrtn(); + pm_putstr( "SIC_IMASK1:0 " ); pm_puthex4byte( sic_imask1 );pm_putstr( " : " );pm_puthex4byte( sic_imask0 ); pm_putrtn(); + pm_putstr( "SIC_ISR1:0 " ); pm_puthex4byte( *pSIC_ISR1 );pm_putstr( " : " );pm_puthex4byte( *pSIC_ISR0 ); pm_putrtn(); + pm_putstr( "IMASK " ); pm_puthex4byte( imask ); pm_putrtn(); + pm_putstr( "ILAT " ); pm_puthex4byte( *pILAT ); pm_putrtn(); + pm_putstr( "IPEND " ); pm_puthex4byte( *pIPEND ); pm_putrtn(); + asm( "%0=SEQSTAT;" : "=d"(reg) ); + pm_putstr( "SEQSTAT " ); pm_puthex4byte( reg ); pm_putrtn(); + pm_putstr( " EXCAUSE " ); pm_puthex1byte( reg & 0x3F ); pm_putrtn(); + pm_putstr( " HWERRCAUSE " ); pm_puthex1byte( (reg>>14)&0x1F ); pm_putrtn(); + pm_putstr( "DMA0_IRQ_STATUS " ); pm_puthex4byte( *pDMA0_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA1_IRQ_STATUS " ); pm_puthex4byte( *pDMA1_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA2_IRQ_STATUS " ); pm_puthex4byte( *pDMA2_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA3_IRQ_STATUS " ); pm_puthex4byte( *pDMA3_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA4_IRQ_STATUS " ); pm_puthex4byte( *pDMA4_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA5_IRQ_STATUS " ); pm_puthex4byte( *pDMA5_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA6_IRQ_STATUS " ); pm_puthex4byte( *pDMA6_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA7_IRQ_STATUS " ); pm_puthex4byte( *pDMA7_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA8_IRQ_STATUS " ); pm_puthex4byte( *pDMA8_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA9_IRQ_STATUS " ); pm_puthex4byte( *pDMA9_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA10_IRQ_STATUS " ); pm_puthex4byte( *pDMA10_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA11_IRQ_STATUS " ); pm_puthex4byte( *pDMA11_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_D0_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_D0_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_S0_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_S0_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_D1_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_D1_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_S1_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_S1_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "SPI_STAT " ); pm_puthex4byte( *pSPI_STAT ); pm_putrtn(); + pm_putstr( "PPI_STATUS " ); pm_puthex4byte( *pPPI_STATUS ); pm_putrtn(); + pm_putstr( "SPORT0_STAT " ); pm_puthex4byte( *pSPORT0_STAT ); pm_putrtn(); + pm_putstr( "SPORT1_STAT " ); pm_puthex4byte( *pSPORT1_STAT ); pm_putrtn(); + pm_putstr( "TIMER_STATUS " ); pm_puthex4byte( *pTIMER_STATUS ); pm_putrtn(); + pm_putstr( "EBIU_SDSTAT " ); pm_puthex4byte( *pEBIU_SDSTAT ); pm_putrtn(); + pm_putrtn(); + pm_putstr( "Calling Stack :" ); pm_putrtn(); + + while( fp ) + { + pm_putstr( "Called from " ); pm_puthex4byte( *(fp+1) ); pm_putrtn(); + fp = *fp; + } + } +} + +/** + * \brief CPU例外ハンドラ + * + * CPU例外ハンドラとしてcfgファイルに登録する。 hwei_handler()は呼ばれたら戻ってこないが、 + * そのあとにもexpFlagに値を代入しているのは、最適化によってunlink命令の値がルーチン呼び出しの + * 前に移動することを防ぐためである。 + * + * DEF_EXC(CPUEXC1, { TA_HLNG, excp_handler} ); + * + */ +void spurious_exc_handler(VP p_excinf) +{ + expFlag = TRUE; + spurious_int_handler(); +} + diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf518/chip_mmr.c b/uzume_prototype/kernel/config/blackfin/_common_bf518/chip_mmr.c new file mode 100644 index 0000000..bb5cab7 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf518/chip_mmr.c @@ -0,0 +1,672 @@ +/* + * ADSP-BF518の System MMR 定義。アドレスの指定は .ldファイルとの組み合わせで行う。 + * .ldファイルのサンプルは、 config/blackfin/ezkit_bf518を参照。 + * + * アドレスが正しく割り当てられているかは、次の方法で検証した. + * + $ cat /opt/uClinux/bfin-elf/bfin-elf/include/def_LPBlackfin.h ../jsp/config/blackfin/_common_bf518/defBF51x_base.h ../jsp/config/blackfin/_common_bf518/defBF518.h | tr '[a-z]' '[A-Z]' | grep '0XFF[CE]0' | grep "#DEFINE" | awk '{print $2, $3}' - | grep 0X | sed 's/0X//' | sort -k 2 > regdef.txt + $ awk '{ print $3,$1 }' jsp.syms | grep _mmr | sed 's/_mmr//p'| sort -k 2 | uniq | tr '[a-z]' '[A-Z]'> regelf.txt + $ diff regelf.txt regdef.txt > diff.txt + +31a32,34 +> RTC_PREN FFC00314 +> UART0_DLL FFC00400 +> UART0_RBR FFC00400 +32a36 +> UART0_DLH FFC00404 +149a154 +> DMA_TCPER FFC00B0C +150a156 +> DMA_TCCNT FFC00B10 +414a421,422 +> UART1_DLL FFC02000 +> UART1_RBR FFC02000 +415a424 +> UART1_DLH FFC02004 +567a577,580 +> OTP_CONTROL FFC03600 +> OTP_BEN FFC03604 +> OTP_STATUS FFC03608 +> OTP_TIMING FFC0360C +619a633 +> DCPLB_FAULT_STATUS FFE00008 +657d670 +< IMEM_DUMMY FFE01000 +658a672 +> CODE_FAULT_STATUS FFE01008 +659a674 +> CODE_FAULT_ADDR FFE0100C +712d726 +< IDUMMY FFE02100 +722d735 +< DBGDUMMY FFE05004 + + * これらのうち、ELF側にだけ存在するレジスタはDUMMYレジスタであり、これはコアレジスタである。 + * ツールのバージョン違いでインクルードファイルの内容が改変されたためであり、無視していい。 + * + * DEF側にだけ存在するレジスタには2種類ある。 + * 1. 他のレジスタのエイリアス + * 2. def***.hには存在するが、cdef***.hには存在しないレジスタ + * + * いずれも小さな問題であり、したがって、上の結果は問題ないと言える。 + * + */ + +volatile unsigned short mmrPLL_CTL __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrPLL_DIV __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrVR_CTL __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrPLL_STAT __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrPLL_LOCKCNT __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned long mmrCHIPID __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrSWRST __attribute ((aligned(4), section("SYSMMR1"))); +volatile unsigned short mmrSYSCR __attribute ((aligned(4), section("SYSMMR1"))); +volatile unsigned long mmrSIC_IMASK0 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IAR0 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IAR1 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IAR2 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IAR3 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_ISR0 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IWR0 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IMASK1 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_IAR4 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_IAR5 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_IAR6 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_IAR7 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_ISR1 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_IWR1 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned short mmrWDOG_CTL __attribute ((aligned(4), section("SYSMMR4"))); +volatile unsigned long mmrWDOG_CNT __attribute ((aligned(4), section("SYSMMR4"))); +volatile unsigned long mmrWDOG_STAT __attribute ((aligned(4), section("SYSMMR4"))); +volatile unsigned long mmrRTC_STAT __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned short mmrRTC_ICTL __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned short mmrRTC_ISTAT __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned short mmrRTC_SWCNT __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned long mmrRTC_ALARM __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned short mmrRTC_FAST __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned short mmrUART0_THR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_IER __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_IIR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_LCR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_MCR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_LSR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_SCR __attribute ((aligned(4), section("SYSMMR7"))); +volatile unsigned short mmrUART0_GCTL __attribute ((aligned(4), section("SYSMMR8"))); +volatile unsigned short mmrSPI0_CTL __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_FLG __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_STAT __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_TDBR __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_RDBR __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_BAUD __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_SHADOW __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrTIMER0_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER0_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER0_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER0_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER1_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER1_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER1_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER1_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER2_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER2_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER2_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER2_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER3_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER3_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER3_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER3_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER4_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER4_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER4_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER4_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER5_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER5_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER5_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER5_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER6_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER6_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER6_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER6_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER7_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER7_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER7_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER7_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER_ENABLE __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER_DISABLE __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER_STATUS __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrPORTFIO __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_CLEAR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_SET __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_TOGGLE __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKA __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKA_CLEAR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKA_SET __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKA_TOGGLE __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKB __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKB_CLEAR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKB_SET __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKB_TOGGLE __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_DIR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_POLAR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_EDGE __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_BOTH __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_INEN __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrSPORT0_TCR1 __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned short mmrSPORT0_TCR2 __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned short mmrSPORT0_TCLKDIV __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned short mmrSPORT0_TFSDIV __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned long mmrSPORT0_TX __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned long mmrSPORT0_RX __attribute ((aligned(4), section("SYSMMR13"))); +volatile unsigned short mmrSPORT0_RCR1 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_RCR2 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_RCLKDIV __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_RFSDIV __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_STAT __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_CHNL __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_MCMC1 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_MCMC2 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MTCS0 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MTCS1 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MTCS2 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MTCS3 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MRCS0 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MRCS1 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MRCS2 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MRCS3 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT1_TCR1 __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned short mmrSPORT1_TCR2 __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned short mmrSPORT1_TCLKDIV __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned short mmrSPORT1_TFSDIV __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned long mmrSPORT1_TX __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned long mmrSPORT1_RX __attribute ((aligned(4), section("SYSMMR16"))); +volatile unsigned short mmrSPORT1_RCR1 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_RCR2 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_RCLKDIV __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_RFSDIV __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_STAT __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_CHNL __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_MCMC1 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_MCMC2 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MTCS0 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MTCS1 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MTCS2 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MTCS3 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MRCS0 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MRCS1 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MRCS2 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MRCS3 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrEBIU_AMGCTL __attribute ((aligned(4), section("SYSMMR18"))); +volatile unsigned long mmrEBIU_AMBCTL0 __attribute ((aligned(4), section("SYSMMR18"))); +volatile unsigned long mmrEBIU_AMBCTL1 __attribute ((aligned(4), section("SYSMMR18"))); +volatile unsigned long mmrEBIU_SDGCTL __attribute ((aligned(4), section("SYSMMR19"))); +volatile unsigned short mmrEBIU_SDBCTL __attribute ((aligned(4), section("SYSMMR19"))); +volatile unsigned short mmrEBIU_SDRRC __attribute ((aligned(4), section("SYSMMR19"))); +volatile unsigned short mmrEBIU_SDSTAT __attribute ((aligned(4), section("SYSMMR19"))); +volatile unsigned short mmrDMA_TC_PER __attribute ((aligned(4), section("SYSMMR20"))); +volatile unsigned short mmrDMA_TC_CNT __attribute ((aligned(4), section("SYSMMR20"))); +volatile unsigned long mmrDMA0_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR21"))); +volatile unsigned long mmrDMA0_START_ADDR __attribute ((aligned(4), section("SYSMMR21"))); +volatile unsigned short mmrDMA0_CONFIG __attribute ((aligned(4), section("SYSMMR21"))); +volatile unsigned short mmrDMA0_X_COUNT __attribute ((aligned(4), section("SYSMMR22"))); +volatile signed short mmrDMA0_X_MODIFY __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_Y_COUNT __attribute ((aligned(4), section("SYSMMR22"))); +volatile signed short mmrDMA0_Y_MODIFY __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned long mmrDMA0_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned long mmrDMA0_CURR_ADDR __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR23"))); +volatile unsigned long mmrDMA1_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR24"))); +volatile unsigned long mmrDMA1_START_ADDR __attribute ((aligned(4), section("SYSMMR24"))); +volatile unsigned short mmrDMA1_CONFIG __attribute ((aligned(4), section("SYSMMR24"))); +volatile unsigned short mmrDMA1_X_COUNT __attribute ((aligned(4), section("SYSMMR25"))); +volatile signed short mmrDMA1_X_MODIFY __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_Y_COUNT __attribute ((aligned(4), section("SYSMMR25"))); +volatile signed short mmrDMA1_Y_MODIFY __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned long mmrDMA1_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned long mmrDMA1_CURR_ADDR __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR26"))); +volatile unsigned long mmrDMA2_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR27"))); +volatile unsigned long mmrDMA2_START_ADDR __attribute ((aligned(4), section("SYSMMR27"))); +volatile unsigned short mmrDMA2_CONFIG __attribute ((aligned(4), section("SYSMMR27"))); +volatile unsigned short mmrDMA2_X_COUNT __attribute ((aligned(4), section("SYSMMR28"))); +volatile signed short mmrDMA2_X_MODIFY __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_Y_COUNT __attribute ((aligned(4), section("SYSMMR28"))); +volatile signed short mmrDMA2_Y_MODIFY __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned long mmrDMA2_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned long mmrDMA2_CURR_ADDR __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR29"))); +volatile unsigned long mmrDMA3_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR30"))); +volatile unsigned long mmrDMA3_START_ADDR __attribute ((aligned(4), section("SYSMMR30"))); +volatile unsigned short mmrDMA3_CONFIG __attribute ((aligned(4), section("SYSMMR30"))); +volatile unsigned short mmrDMA3_X_COUNT __attribute ((aligned(4), section("SYSMMR31"))); +volatile signed short mmrDMA3_X_MODIFY __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_Y_COUNT __attribute ((aligned(4), section("SYSMMR31"))); +volatile signed short mmrDMA3_Y_MODIFY __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned long mmrDMA3_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned long mmrDMA3_CURR_ADDR __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR32"))); +volatile unsigned long mmrDMA4_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR33"))); +volatile unsigned long mmrDMA4_START_ADDR __attribute ((aligned(4), section("SYSMMR33"))); +volatile unsigned short mmrDMA4_CONFIG __attribute ((aligned(4), section("SYSMMR33"))); +volatile unsigned short mmrDMA4_X_COUNT __attribute ((aligned(4), section("SYSMMR34"))); +volatile signed short mmrDMA4_X_MODIFY __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_Y_COUNT __attribute ((aligned(4), section("SYSMMR34"))); +volatile signed short mmrDMA4_Y_MODIFY __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned long mmrDMA4_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned long mmrDMA4_CURR_ADDR __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR35"))); +volatile unsigned long mmrDMA5_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR36"))); +volatile unsigned long mmrDMA5_START_ADDR __attribute ((aligned(4), section("SYSMMR36"))); +volatile unsigned short mmrDMA5_CONFIG __attribute ((aligned(4), section("SYSMMR36"))); +volatile unsigned short mmrDMA5_X_COUNT __attribute ((aligned(4), section("SYSMMR37"))); +volatile signed short mmrDMA5_X_MODIFY __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_Y_COUNT __attribute ((aligned(4), section("SYSMMR37"))); +volatile signed short mmrDMA5_Y_MODIFY __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned long mmrDMA5_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned long mmrDMA5_CURR_ADDR __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR38"))); +volatile unsigned long mmrDMA6_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR39"))); +volatile unsigned long mmrDMA6_START_ADDR __attribute ((aligned(4), section("SYSMMR39"))); +volatile unsigned short mmrDMA6_CONFIG __attribute ((aligned(4), section("SYSMMR39"))); +volatile unsigned short mmrDMA6_X_COUNT __attribute ((aligned(4), section("SYSMMR40"))); +volatile signed short mmrDMA6_X_MODIFY __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_Y_COUNT __attribute ((aligned(4), section("SYSMMR40"))); +volatile signed short mmrDMA6_Y_MODIFY __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned long mmrDMA6_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned long mmrDMA6_CURR_ADDR __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR41"))); +volatile unsigned long mmrDMA7_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR42"))); +volatile unsigned long mmrDMA7_START_ADDR __attribute ((aligned(4), section("SYSMMR42"))); +volatile unsigned short mmrDMA7_CONFIG __attribute ((aligned(4), section("SYSMMR42"))); +volatile unsigned short mmrDMA7_X_COUNT __attribute ((aligned(4), section("SYSMMR43"))); +volatile signed short mmrDMA7_X_MODIFY __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_Y_COUNT __attribute ((aligned(4), section("SYSMMR43"))); +volatile signed short mmrDMA7_Y_MODIFY __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned long mmrDMA7_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned long mmrDMA7_CURR_ADDR __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR44"))); +volatile unsigned long mmrDMA8_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR45"))); +volatile unsigned long mmrDMA8_START_ADDR __attribute ((aligned(4), section("SYSMMR45"))); +volatile unsigned short mmrDMA8_CONFIG __attribute ((aligned(4), section("SYSMMR45"))); +volatile unsigned short mmrDMA8_X_COUNT __attribute ((aligned(4), section("SYSMMR46"))); +volatile signed short mmrDMA8_X_MODIFY __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_Y_COUNT __attribute ((aligned(4), section("SYSMMR46"))); +volatile signed short mmrDMA8_Y_MODIFY __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned long mmrDMA8_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned long mmrDMA8_CURR_ADDR __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR47"))); +volatile unsigned long mmrDMA9_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR48"))); +volatile unsigned long mmrDMA9_START_ADDR __attribute ((aligned(4), section("SYSMMR48"))); +volatile unsigned short mmrDMA9_CONFIG __attribute ((aligned(4), section("SYSMMR48"))); +volatile unsigned short mmrDMA9_X_COUNT __attribute ((aligned(4), section("SYSMMR49"))); +volatile signed short mmrDMA9_X_MODIFY __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned short mmrDMA9_Y_COUNT __attribute ((aligned(4), section("SYSMMR49"))); +volatile signed short mmrDMA9_Y_MODIFY __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned long mmrDMA9_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned long mmrDMA9_CURR_ADDR __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned short mmrDMA9_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned short mmrDMA9_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned short mmrDMA9_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned short mmrDMA9_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR50"))); +volatile unsigned long mmrDMA10_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR51"))); +volatile unsigned long mmrDMA10_START_ADDR __attribute ((aligned(4), section("SYSMMR51"))); +volatile unsigned short mmrDMA10_CONFIG __attribute ((aligned(4), section("SYSMMR51"))); +volatile unsigned short mmrDMA10_X_COUNT __attribute ((aligned(4), section("SYSMMR52"))); +volatile signed short mmrDMA10_X_MODIFY __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned short mmrDMA10_Y_COUNT __attribute ((aligned(4), section("SYSMMR52"))); +volatile signed short mmrDMA10_Y_MODIFY __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned long mmrDMA10_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned long mmrDMA10_CURR_ADDR __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned short mmrDMA10_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned short mmrDMA10_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned short mmrDMA10_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned short mmrDMA10_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR53"))); +volatile unsigned long mmrDMA11_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR54"))); +volatile unsigned long mmrDMA11_START_ADDR __attribute ((aligned(4), section("SYSMMR54"))); +volatile unsigned short mmrDMA11_CONFIG __attribute ((aligned(4), section("SYSMMR54"))); +volatile unsigned short mmrDMA11_X_COUNT __attribute ((aligned(4), section("SYSMMR55"))); +volatile signed short mmrDMA11_X_MODIFY __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned short mmrDMA11_Y_COUNT __attribute ((aligned(4), section("SYSMMR55"))); +volatile signed short mmrDMA11_Y_MODIFY __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned long mmrDMA11_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned long mmrDMA11_CURR_ADDR __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned short mmrDMA11_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned short mmrDMA11_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned short mmrDMA11_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned short mmrDMA11_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR56"))); +volatile unsigned long mmrMDMA_D0_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR57"))); +volatile unsigned long mmrMDMA_D0_START_ADDR __attribute ((aligned(4), section("SYSMMR57"))); +volatile unsigned short mmrMDMA_D0_CONFIG __attribute ((aligned(4), section("SYSMMR57"))); +volatile unsigned short mmrMDMA_D0_X_COUNT __attribute ((aligned(4), section("SYSMMR58"))); +volatile signed short mmrMDMA_D0_X_MODIFY __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_Y_COUNT __attribute ((aligned(4), section("SYSMMR58"))); +volatile signed short mmrMDMA_D0_Y_MODIFY __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned long mmrMDMA_D0_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned long mmrMDMA_D0_CURR_ADDR __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR59"))); +volatile unsigned long mmrMDMA_S0_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR60"))); +volatile unsigned long mmrMDMA_S0_START_ADDR __attribute ((aligned(4), section("SYSMMR60"))); +volatile unsigned short mmrMDMA_S0_CONFIG __attribute ((aligned(4), section("SYSMMR60"))); +volatile unsigned short mmrMDMA_S0_X_COUNT __attribute ((aligned(4), section("SYSMMR61"))); +volatile signed short mmrMDMA_S0_X_MODIFY __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_Y_COUNT __attribute ((aligned(4), section("SYSMMR61"))); +volatile signed short mmrMDMA_S0_Y_MODIFY __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned long mmrMDMA_S0_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned long mmrMDMA_S0_CURR_ADDR __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR62"))); +volatile unsigned long mmrMDMA_D1_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR63"))); +volatile unsigned long mmrMDMA_D1_START_ADDR __attribute ((aligned(4), section("SYSMMR63"))); +volatile unsigned short mmrMDMA_D1_CONFIG __attribute ((aligned(4), section("SYSMMR63"))); +volatile unsigned short mmrMDMA_D1_X_COUNT __attribute ((aligned(4), section("SYSMMR64"))); +volatile signed short mmrMDMA_D1_X_MODIFY __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_Y_COUNT __attribute ((aligned(4), section("SYSMMR64"))); +volatile signed short mmrMDMA_D1_Y_MODIFY __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned long mmrMDMA_D1_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned long mmrMDMA_D1_CURR_ADDR __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR65"))); +volatile unsigned long mmrMDMA_S1_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR66"))); +volatile unsigned long mmrMDMA_S1_START_ADDR __attribute ((aligned(4), section("SYSMMR66"))); +volatile unsigned short mmrMDMA_S1_CONFIG __attribute ((aligned(4), section("SYSMMR66"))); +volatile unsigned short mmrMDMA_S1_X_COUNT __attribute ((aligned(4), section("SYSMMR67"))); +volatile signed short mmrMDMA_S1_X_MODIFY __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_Y_COUNT __attribute ((aligned(4), section("SYSMMR67"))); +volatile signed short mmrMDMA_S1_Y_MODIFY __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned long mmrMDMA_S1_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned long mmrMDMA_S1_CURR_ADDR __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR68"))); +volatile unsigned short mmrPPI_CONTROL __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrPPI_STATUS __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrPPI_COUNT __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrPPI_DELAY __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrPPI_FRAME __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrTWI_CLKDIV __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_CONTROL __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_SLAVE_CTL __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_SLAVE_STAT __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_SLAVE_ADDR __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_MASTER_CTL __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_MASTER_STAT __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_MASTER_ADDR __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_INT_STAT __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_INT_MASK __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_FIFO_CTL __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_FIFO_STAT __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_XMT_DATA8 __attribute ((aligned(4), section("SYSMMR71"))); +volatile unsigned short mmrTWI_XMT_DATA16 __attribute ((aligned(4), section("SYSMMR71"))); +volatile unsigned short mmrTWI_RCV_DATA8 __attribute ((aligned(4), section("SYSMMR71"))); +volatile unsigned short mmrTWI_RCV_DATA16 __attribute ((aligned(4), section("SYSMMR71"))); +volatile unsigned short mmrPORTGIO __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_CLEAR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_SET __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_TOGGLE __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKA __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKA_CLEAR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKA_SET __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKA_TOGGLE __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKB __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKB_CLEAR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKB_SET __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKB_TOGGLE __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_DIR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_POLAR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_EDGE __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_BOTH __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_INEN __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTHIO __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_CLEAR __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_SET __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_TOGGLE __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKA __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKA_CLEAR __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKA_SET __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKA_TOGGLE __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKB __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKB_CLEAR __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKB_SET __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKB_TOGGLE __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_DIR __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_POLAR __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_EDGE __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_BOTH __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_INEN __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrUART1_THR __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_IER __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_IIR __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_LCR __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_MCR __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_LSR __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_SCR __attribute ((aligned(4), section("SYSMMR75"))); +volatile unsigned short mmrUART1_GCTL __attribute ((aligned(4), section("SYSMMR76"))); +volatile unsigned long mmrEMAC_OPMODE __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_ADDRLO __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_ADDRHI __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_HASHLO __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_HASHHI __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_STAADD __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_STADAT __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_FLC __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_VLAN1 __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_VLAN2 __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_WKUP_CTL __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK0 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK1 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK2 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK3 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFCMD __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFOFF __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFCRC0 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFCRC1 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_SYSCTL __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_SYSTAT __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_RX_STAT __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_RX_STKY __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_RX_IRQE __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_TX_STAT __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_TX_STKY __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_TX_IRQE __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_MMC_CTL __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_MMC_RIRQS __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_MMC_RIRQE __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_MMC_TIRQS __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_MMC_TIRQE __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned short mmrEMAC_PTP_CTL __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned short mmrEMAC_PTP_IE __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned short mmrEMAC_PTP_ISTAT __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_FOFF __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_FV1 __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_FV2 __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_FV3 __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_ADDEND __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_ACCR __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_OFFSET __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_TIMELO __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_TIMEHI __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_RXSNAPLO __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_RXSNAPHI __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_TXSNAPLO __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_TXSNAPHI __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_ALARMLO __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_ALARMHI __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned short mmrEMAC_PTP_ID_OFF __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_ID_SNAP __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_PPS_STARTLOP __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_PPS_STARTHIP __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_PPS_PERIOD __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_RXC_OK __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_FCS __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_ALIGN __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_OCTET __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_DMAOVF __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_UNICST __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_MULTI __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_BROAD __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LNERRI __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LNERRO __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LONG __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_MACCTL __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_OPCODE __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_PAUSE __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_ALLFRM __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_ALLOCT __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_TYPED __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_SHORT __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_EQ64 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LT128 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LT256 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LT512 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LT1024 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_GE1024 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_TXC_OK __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_1COL __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_GT1COL __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_OCTET __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_DEFER __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_LATECL __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_XS_COL __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_DMAUND __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_CRSERR __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_UNICST __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_MULTI __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_BROAD __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_XS_DFR __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_MACCTL __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_ALLFRM __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_ALLOCT __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_EQ64 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_LT128 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_LT256 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_LT512 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_LT1024 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_GE1024 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_ABORT __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned short mmrPORTF_FER __attribute ((aligned(4), section("SYSMMR83"))); +volatile unsigned short mmrPORTG_FER __attribute ((aligned(4), section("SYSMMR83"))); +volatile unsigned short mmrPORTH_FER __attribute ((aligned(4), section("SYSMMR83"))); +volatile unsigned short mmrPORTF_MUX __attribute ((aligned(4), section("SYSMMR84"))); +volatile unsigned short mmrPORTG_MUX __attribute ((aligned(4), section("SYSMMR84"))); +volatile unsigned short mmrPORTH_MUX __attribute ((aligned(4), section("SYSMMR84"))); +volatile unsigned short mmrPORTF_DRIVE __attribute ((aligned(4), section("SYSMMR85"))); +volatile unsigned short mmrPORTG_DRIVE __attribute ((aligned(4), section("SYSMMR85"))); +volatile unsigned short mmrPORTH_DRIVE __attribute ((aligned(4), section("SYSMMR85"))); +volatile unsigned short mmrPORTF_HYSTERESIS __attribute ((aligned(4), section("SYSMMR86"))); +volatile unsigned short mmrPORTG_HYSTERESIS __attribute ((aligned(4), section("SYSMMR86"))); +volatile unsigned short mmrPORTH_HYSTERESIS __attribute ((aligned(4), section("SYSMMR86"))); +volatile unsigned short mmrNONGPIO_DRIVE __attribute ((aligned(4), section("SYSMMR87"))); +volatile unsigned short mmrNONGPIO_HYSTERESIS __attribute ((aligned(4), section("SYSMMR88"))); +volatile unsigned short mmrHMDMA0_CONTROL __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_ECINIT __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_BCINIT __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_ECURGENT __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_ECOVERFLOW __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_ECOUNT __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_BCOUNT __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA1_CONTROL __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_ECINIT __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_BCINIT __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_ECURGENT __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_ECOVERFLOW __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_ECOUNT __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_BCOUNT __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrSPI1_CTL __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_FLG __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_STAT __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_TDBR __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_RDBR __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_BAUD __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_SHADOW __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrCNT_CONFIG __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned short mmrCNT_IMASK __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned short mmrCNT_STATUS __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned short mmrCNT_COMMAND __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned short mmrCNT_DEBOUNCE __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned long mmrCNT_COUNTER __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned long mmrCNT_MAX __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned long mmrCNT_MIN __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned long mmrSECURE_SYSSWT __attribute ((aligned(4), section("SYSMMR93"))); +volatile unsigned short mmrSECURE_CONTROL __attribute ((aligned(4), section("SYSMMR93"))); +volatile unsigned short mmrSECURE_STATUS __attribute ((aligned(4), section("SYSMMR93"))); +volatile unsigned long mmrOTP_DATA0 __attribute ((aligned(4), section("SYSMMR94"))); +volatile unsigned long mmrOTP_DATA1 __attribute ((aligned(4), section("SYSMMR94"))); +volatile unsigned long mmrOTP_DATA2 __attribute ((aligned(4), section("SYSMMR94"))); +volatile unsigned long mmrOTP_DATA3 __attribute ((aligned(4), section("SYSMMR94"))); +volatile unsigned short mmrPWM_CTRL __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_STAT __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_TM __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_DT __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_GATE __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHA __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHB __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHC __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_SEG __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_SYNCWT __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHAL __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHBL __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHCL __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_LSI __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_STAT2 __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrRSI_PWR_CONTROL __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_CLK_CONTROL __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_ARGUMENT __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_COMMAND __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_RESP_CMD __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_RESPONSE0 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_RESPONSE1 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_RESPONSE2 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_RESPONSE3 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_DATA_TIMER __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_DATA_LGTH __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_DATA_CONTROL __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_DATA_CNT __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_STATUS __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_STATUSCL __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_MASK0 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_MASK1 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_FIFO_CNT __attribute ((aligned(4), section("SYSMMR97"))); +volatile unsigned short mmrRSI_CEATA_CONTROL __attribute ((aligned(4), section("SYSMMR97"))); +volatile unsigned long mmrRSI_FIFO __attribute ((aligned(4), section("SYSMMR98"))); +volatile unsigned short mmrRSI_ESTAT __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_EMASK __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_CONFIG __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_RD_WAIT_EN __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_PID0 __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_PID1 __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_PID2 __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_PID3 __attribute ((aligned(4), section("SYSMMR99"))); + diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf518/hw_serial.cfg b/uzume_prototype/kernel/config/blackfin/_common_bf518/hw_serial.cfg new file mode 100644 index 0000000..c55da13 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf518/hw_serial.cfg @@ -0,0 +1,6 @@ +/* + * SIOドライバ(ADSP-BF537用)のコンフィギュレーションファイル + */ +INCLUDE("\"hw_serial.h\""); +DEF_INH(INHNO_SIO0_RX, { TA_HLNG, sio0_rx_handler }); +DEF_INH(INHNO_SIO0_TX, { TA_HLNG, sio0_tx_handler }); diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf518/hw_serial.h b/uzume_prototype/kernel/config/blackfin/_common_bf518/hw_serial.h new file mode 100644 index 0000000..192a75a --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf518/hw_serial.h @@ -0,0 +1,160 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + */ + +/* + * シリアルI/Oデバイス(SIO)ドライバ(Blackfin UART用) + * + * このファイルは、TOPPERS/JSP 1.4.2の config/sh3/ms7727cp01/hw_serial.hを + * リネームし、内部の識別子を変更したものである。 + * + * このファイルは下位のデバイス・アクセス・ルーチンを束ねて上位の層に渡す + * ためのものである。Blackfinの外部にあるシリアルをTOPPERS/JSPで管理しない + * のなら、変更する必要はない。 + */ + +#ifndef _HW_SERIAL_H_ +#define _HW_SERIAL_H_ + +#include + +#include "uart.h" + +#ifdef __GNUC__ // gcc +#include "cdefBF518.h" +#elif defined(__ECC__) // visualdsp +#include +#else +#error "Compiler is not supported" +#endif + + +/* + * SIOドライバの初期化ルーチン + */ +#define sio_initialize uart_initialize + +#ifndef _MACRO_ONLY +/* + * シリアルI/Oポートのオープン + */ +Inline SIOPCB * +sio_opn_por(ID siopid, VP_INT exinf) +{ + SIOPCB *siopcb; + UW regBase; + + /* + * デバイス依存のオープン処理. + */ + siopcb = uart_opn_por(siopid, exinf); + + /* + * Enable Corrensponding Interrupt at IMASK + */ + regBase = siopcb->siopinib->reg_base; + if ( regBase == UART0_ADDRESS ) { // UART0の場合 + ena_int( INTNO_UART0_TX ); + ena_int( INTNO_UART0_RX ); + *pPORTG_MUX &= ~(0x0C00); // bit11:10 だけを0にする + *pPORTG_MUX |= 0x01<<10; // bit11:10 だけを01にする + *pPORTG_FER |= 0x0600; // PG9,PG10をUART0に割り振る + } + else if ( regBase == UART1_ADDRESS ){ // uart1の場合 + ena_int( INTNO_UART1_TX ); + ena_int( INTNO_UART1_RX ); + *pPORTH_MUX &= ~(0x00F0); // bit7:6, bit5:4 だけを0にする + *pPORTH_MUX |= (0x01<<6) | (0x01<<4); // bit7:6, bit5:4 を01にする + *pPORTH_FER |= 0x00C0; // PH7,6をUART1に割り振る + } + + return(siopcb); +} + +/* + * シリアルI/Oポートのクローズ + */ +Inline void +sio_cls_por(SIOPCB *siopcb) +{ + + /* + * デバイス依存のクローズ処理. + */ + uart_cls_por(siopcb); +} + + +/* + * SIOの割込みハンドラ + */ +#define sio0_rx_handler uart0_rx_isr +#define sio0_tx_handler uart0_tx_isr +#define sio1_rx_handler uart1_rx_isr +#define sio1_tx_handler uart1_tx_isr + +/* + * シリアルI/Oポートへの文字送信 + */ +#define sio_snd_chr uart_snd_chr + +/* + * シリアルI/Oポートからの文字受信 + */ +#define sio_rcv_chr uart_rcv_chr + +/* + * シリアルI/Oポートからのコールバックの許可 + */ +#define sio_ena_cbr uart_ena_cbr + +/* + * シリアルI/Oポートからのコールバックの禁止 + */ +#define sio_dis_cbr uart_dis_cbr + +/* + * シリアルI/Oポートからの送信可能コールバック + */ +#define sio_ierdy_snd uart_ierdy_snd + +/* + * シリアルI/Oポートからの受信通知コールバック + */ +#define sio_ierdy_rcv uart_ierdy_rcv + +#endif /* _MACRO_ONLY */ +#endif /* _HW_SERIAL_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf518/hw_timer.h b/uzume_prototype/kernel/config/blackfin/_common_bf518/hw_timer.h new file mode 100644 index 0000000..fe0d6ba --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf518/hw_timer.h @@ -0,0 +1,141 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2009 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)縲鰀(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + +/* + * タイマドライバ(ADSP-BF518用) + * + */ + +#ifndef _HW_TIMER_H_ +#define _HW_TIMER_H_ + +#include + + +#ifndef _MACRO_ONLY + +#ifdef __GNUC__ // gcc +#include "cdefBF518.h" +#elif defined(__ECC__) // visualdsp +#include +#else +#error "Compiler is not supported" +#endif + +//#include + + + + +/************************************************************** + * タイマの起動処理 + * + * タイマを初期化し,周期的なタイマ割込み要求を発生させる. + * + **************************************************************/ +Inline void +hw_timer_initialize() +{ + +#ifdef USE_TIC_CORE + // Core timer + *pTCNTL = TMPWR; // power up timer; + *pTPERIOD = CORECLOCK/1000; // CORE CLOCK is defined in sys_config.h + *pTCNTL = TMPWR | TMREN | TAUTORLD; +#else + // GPT7(General-purpose timer7) + + *pTIMER7_CONFIG = PERIOD_CNT | OUT_DIS |IRQ_ENA | PWM_OUT; // PWM_OUT, Output Pad disable + *pTIMER7_PERIOD = SYSCLOCK/1000; // SYS CLOCK is defined in sys_config.h + *pTIMER7_WIDTH = 1; // 0 < width < period + *pTIMER_ENABLE = TIMEN7; // timer7 start + + ena_int( INHNO_TIMER ); // enable Timer Interrupt + +#endif + asm("ssync;"); + +} + +/************************************************************** + * タイマ割込み要求のクリア + **************************************************************/ +Inline void +hw_timer_int_clear() +{ +#ifdef USE_TIC_CORE + // Core timer + /* TINTはW1Cではないので、TINTのTINTビットは0を書き込む */ + *pTCNTL = TMPWR | TMREN | TAUTORLD; +#else + // GPT7(General-purpose timer7) + *pTIMER_STATUS = TIMIL7; +#endif + asm("ssync;"); +} + +/************************************************************** + * タイマの停止処理 + * + * タイマの動作を停止させる. + **************************************************************/ +Inline void +hw_timer_terminate() +{ + /* + * タイマの動作を停止する. + */ +#ifdef USE_TIC_CORE + // Core timer + *pTCNTL = TMPWR | TAUTORLD; // 停止 + *pTCNTL = 0; // パワーダウンモード +#else + // GPT2(General-purpose timer7) + *pTIMER_DISABLE = TIMDIS7; // timer7 disable +#endif + asm("ssync;"); +} + + +#endif /* _MACRO_ONLY */ +#endif /* _HW_TIMER_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf518/sys_rename.def b/uzume_prototype/kernel/config/blackfin/_common_bf518/sys_rename.def new file mode 100644 index 0000000..6b882a6 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf518/sys_rename.def @@ -0,0 +1,6 @@ +make_priority_mask +device_dispatcher +boot_for_gdb +siopinib_table +sprious_int_handler +sprious_exp_handler diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf518/sys_rename.h b/uzume_prototype/kernel/config/blackfin/_common_bf518/sys_rename.h new file mode 100644 index 0000000..5c47631 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf518/sys_rename.h @@ -0,0 +1,27 @@ +/* This file is generated from sys_rename.def by genrename. */ + +#ifndef _SYS_RENAME_H_ +#define _SYS_RENAME_H_ + +#define make_priority_mask _kernel_make_priority_mask +#define device_dispatcher _kernel_device_dispatcher +#define boot_for_gdb _kernel_boot_for_gdb +#define siopinib_table _kernel_siopinib_table +#define sprious_int_handler _kernel_sprious_int_handler +#define sprious_exp_handler _kernel_sprious_exp_handler + + + + + +#ifdef LABEL_ASM + +#define _make_priority_mask __kernel_make_priority_mask +#define _device_dispatcher __kernel_device_dispatcher +#define _boot_for_gdb __kernel_boot_for_gdb +#define _siopinib_table __kernel_siopinib_table +#define _sprious_int_handler __kernel_sprious_int_handler +#define _sprious_exp_handler __kernel_sprious_exp_handler + +#endif /* LABEL_ASM */ +#endif /* _SYS_RENAME_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf518/sys_unrename.h b/uzume_prototype/kernel/config/blackfin/_common_bf518/sys_unrename.h new file mode 100644 index 0000000..ee9dd28 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf518/sys_unrename.h @@ -0,0 +1,23 @@ +/* This file is generated from sys_rename.def by genrename. */ + +#ifdef _SYS_UNRENAME_H_ +#undef _SYS_UNRENAME_H_ + +#undef make_priority_mask +#undef device_dispatcher +#undef boot_for_gdb +#undef siopinib_table +#undef sprious_int_handler +#undef sprious_exp_handler + +#ifdef LABEL_ASM + +#undef _make_priority_mask +#undef _device_dispatcher +#undef _boot_for_gdb +#undef _siopinib_table +#undef _sprious_int_handler +#undef _sprious_exp_handler + +#endif /* LABEL_ASM */ +#endif /* _SYS_UNRENAME_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf533/bf532elf.ld b/uzume_prototype/kernel/config/blackfin/_common_bf533/bf532elf.ld new file mode 100644 index 0000000..6dbc711 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf533/bf532elf.ld @@ -0,0 +1,318 @@ + +OUTPUT_FORMAT("elf32-bfin","elf32-bfin","elf32-bfin") +OUTPUT_ARCH(bfin) + +PROVIDE (ldf_stack_end = 0xffb00FFC ) ; +PROVIDE (hardware_init_hook = 0) ; +PROVIDE (software_init_hook = 0) ; +PROVIDE (software_term_hook = 0) ; +PROVIDE (__kernel_boot_for_gdb = 0); +ENTRY (start); + +MEMORY + { + MEM_SDRAM (XW) : ORIGIN = 0x00000000, LENGTH = 128M + MEM_ASYNC_0 (XW) : ORIGIN = 0x20000000, LENGTH = 1M + MEM_ASYNC_1 (XW) : ORIGIN = 0x20100000, LENGTH = 1M + MEM_ASYNC_2 (XW) : ORIGIN = 0x20200000, LENGTH = 1M + MEM_ASYNC_3 (XW) : ORIGIN = 0x20300000, LENGTH = 1M + + MEM_L1_DATA_A (W!X) : ORIGIN = 0xff804000, LENGTH = 16K + MEM_L1_CODE (XR) : ORIGIN = 0xffa08000, LENGTH = 48K + MEM_L1_SCRATCH (W!X) : ORIGIN = 0xffb00000, LENGTH = 4K + + MEM_L2 : ORIGIN = 0xffe00000, LENGTH = 0 /* DUMMY */ + + MEM_SYSMMR (W!X) : ORIGIN = 0xffc00000, LENGTH = 2M + MEM_COREMMR (W!X) : ORIGIN = 0xffe00000, LENGTH = 2M + } +SECTIONS +{ + +/* Read-only sections, merged into text segment: */ + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } + .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } + .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } + .rel.data.rel.ro : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) } + .rela.data.rel.ro : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) } + .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } + .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } + .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } + .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } + .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } + .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.sdata : { *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*) } + .rela.sdata : { *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*) } + .rel.sbss : { *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*) } + .rela.sbss : { *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*) } + .rel.sdata2 : { *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*) } + .rela.sdata2 : { *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*) } + .rel.sbss2 : { *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*) } + .rela.sbss2 : { *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*) } + .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } + .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + .l2 : + { + *(.l2 .l2.*) + } >MEM_SDRAM + + .start : + { + KEEP (*(.start)) + } >MEM_L1_CODE =0 + + .text : + { + *(.text .stub .text.* .gnu.linkonce.t.*) + KEEP (*(.text.*personality*)) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + } >MEM_L1_CODE =0 + + .init : + { + KEEP (*(.init)) + } >MEM_L1_CODE =0 + + .plt : { *(.plt) } >MEM_L1_CODE + + .fini : + { + KEEP (*(.fini)) + } >MEM_L1_CODE =0 + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } >MEM_L1_DATA_A + .rodata1 : { *(.rodata1) } >MEM_L1_DATA_A + + .sdata2 : + { + *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) + } >MEM_L1_DATA_A + + .sbss2 : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) } >MEM_L1_DATA_A + .eh_frame_hdr : { *(.eh_frame_hdr) } >MEM_L1_DATA_A + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } >MEM_L1_DATA_A + .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } >MEM_L1_DATA_A + + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = ALIGN(0x1000) + (. & (0x1000 - 1)); + /* Exception handling */ + .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } >MEM_L1_DATA_A + .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } >MEM_L1_DATA_A + /* Thread Local Storage sections */ + .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } >MEM_L1_DATA_A + .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } >MEM_L1_DATA_A + .preinit_array : + { + PROVIDE_HIDDEN (___preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (___preinit_array_end = .); + } >MEM_L1_DATA_A + .init_array : + { + PROVIDE_HIDDEN (___init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE_HIDDEN (___init_array_end = .); + } >MEM_L1_DATA_A + .fini_array : + { + PROVIDE_HIDDEN (___fini_array_start = .); + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + PROVIDE_HIDDEN (___fini_array_end = .); + } >MEM_L1_DATA_A + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin*.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*crtend*.o(.ctors)) + } >MEM_L1_DATA_A + .dtors : + { + KEEP (*crtbegin*.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*crtend*.o(.dtors)) + } >MEM_L1_DATA_A + .jcr : { KEEP (*(.jcr)) } >MEM_L1_DATA_A + .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) } >MEM_L1_DATA_A + .dynamic : { *(.dynamic) } >MEM_L1_DATA_A + .data : + { + *(.data .data.* .gnu.linkonce.d.*) + KEEP (*(.gnu.linkonce.d.*personality*)) + SORT(CONSTRUCTORS) + } >MEM_L1_DATA_A + .data1 : { *(.data1) } >MEM_L1_DATA_A + .got : { *(.got.plt) *(.got) } >MEM_L1_DATA_A + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : + { + *(.sdata .sdata.* .gnu.linkonce.s.*) + } >MEM_L1_DATA_A + __edata = .; PROVIDE (_edata = .); + .sbss : + { + __bss_start = .; + *(.dynsbss) + *(.sbss .sbss.* .gnu.linkonce.sb.*) + *(.scommon) + } >MEM_L1_DATA_A + .bss : + { + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. + FIXME: Why do we need it? When there is no .bss section, we don't + pad the .data section. */ + . = ALIGN(. != 0 ? 32 / 8 : 1); + __bss_end = .; + } >MEM_L1_DATA_A + . = ALIGN(32 / 8); + . = ALIGN(32 / 8); + __end = .; PROVIDE (_end = .); + + __heap_start = .; + __heap_end = ORIGIN(MEM_L1_DATA_A) + LENGTH(MEM_L1_DATA_A); + + + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + + __stack_end = ORIGIN(MEM_L1_SCRATCH) + LENGTH(MEM_L1_SCRATCH); + + + + PROVIDE (end = .) ; + +/* ADSP-BF533依存のSYSTEM MMR + .bss.sysmmr (NOLOAD) : { chip_mmr.o(PWRMGMT)}> MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(SYSRST)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(WDOG)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(RTC)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(UART)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(SPI)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(TIMER)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0040); chip_mmr.o(TMRCTL)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(FLAG)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(SPORT0)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(SPORT1)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(EBIU)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(DMATC)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(DMA)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x1000); chip_mmr.o(PPI)} > MEM_SYSMMR +*/ +/* Blackfin 共有のCORE MMR + .bss.coremmr (NOLOAD) : { cpu_mmr.o(DMEMCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DCPLBA)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DCPLBD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DTESTC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DTESTD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(IMEMCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ICPLBA)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ICPLBD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ITESTC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ITESTD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(EVT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(CEC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(CTMR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000)+0x1000; cpu_mmr.o(DBG)}> MEM_COREMMR */ /* 1000飛ばす */ /* + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(TBCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(TBUF)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(WPICTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPIADDR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPICNT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(WPDCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPDADDR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPDCNT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(WPSTAT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(PFCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(PFCNT)}> MEM_COREMMR + */ + + .comment 0 : { *(.comment) } + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } +} diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf533/bf533elf.ld b/uzume_prototype/kernel/config/blackfin/_common_bf533/bf533elf.ld new file mode 100644 index 0000000..b853b7f --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf533/bf533elf.ld @@ -0,0 +1,320 @@ + +OUTPUT_FORMAT("elf32-bfin","elf32-bfin","elf32-bfin") +OUTPUT_ARCH(bfin) + +PROVIDE (ldf_stack_end = 0xffb00FFC ) ; +PROVIDE (hardware_init_hook = 0) ; +PROVIDE (software_init_hook = 0) ; +PROVIDE (software_term_hook = 0) ; +PROVIDE (__kernel_boot_for_gdb = 0); +PROVIDE (__init = 0); +PROVIDE (__fini = 0); + + +ENTRY (start); + +MEMORY + { + MEM_SDRAM (XW) : ORIGIN = 0x00000000, LENGTH = 128M + MEM_ASYNC_0 (XW) : ORIGIN = 0x20000000, LENGTH = 1M + MEM_ASYNC_1 (XW) : ORIGIN = 0x20100000, LENGTH = 1M + MEM_ASYNC_2 (XW) : ORIGIN = 0x20200000, LENGTH = 1M + MEM_ASYNC_3 (XW) : ORIGIN = 0x20300000, LENGTH = 1M + + MEM_L1_DATA_A (W!X) : ORIGIN = 0xff800000, LENGTH = 32K + MEM_L1_DATA_B (W!X) : ORIGIN = 0xff900000, LENGTH = 16K + MEM_L1_CODE (XR) : ORIGIN = 0xffa00000, LENGTH = 64K + MEM_L1_SCRATCH (W!X) : ORIGIN = 0xffb00000, LENGTH = 4K + + MEM_L2 : ORIGIN = 0xffe00000, LENGTH = 0 /* DUMMY */ + + MEM_SYSMMR (W!X) : ORIGIN = 0xffc00000, LENGTH = 2M + MEM_COREMMR (W!X) : ORIGIN = 0xffe00000, LENGTH = 2M + } + +SECTIONS +{ + +/* Read-only sections, merged into text segment: */ + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } + .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } + .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } + .rel.data.rel.ro : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) } + .rela.data.rel.ro : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) } + .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } + .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } + .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } + .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } + .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } + .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.sdata : { *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*) } + .rela.sdata : { *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*) } + .rel.sbss : { *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*) } + .rela.sbss : { *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*) } + .rel.sdata2 : { *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*) } + .rela.sdata2 : { *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*) } + .rel.sbss2 : { *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*) } + .rela.sbss2 : { *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*) } + .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } + .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + .l2 : + { + *(.l2 .l2.*) + } >MEM_SDRAM + + .start : + { + KEEP (*(.start)) + } >MEM_L1_CODE =0 + + .text : + { + *(.text .stub .text.* .gnu.linkonce.t.*) + KEEP (*(.text.*personality*)) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + } >MEM_L1_CODE =0 + + .init : + { + KEEP (*(.init)) + } >MEM_L1_CODE =0 + + .plt : { *(.plt) } >MEM_L1_CODE + + .fini : + { + KEEP (*(.fini)) + } >MEM_L1_CODE =0 + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } >MEM_L1_DATA_A + .rodata1 : { *(.rodata1) } >MEM_L1_DATA_A + + .sdata2 : + { + *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) + } >MEM_L1_DATA_A + + .sbss2 : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) } >MEM_L1_DATA_A + .eh_frame_hdr : { *(.eh_frame_hdr) } >MEM_L1_DATA_A + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } >MEM_L1_DATA_A + .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } >MEM_L1_DATA_A + + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = ALIGN(0x1000) + (. & (0x1000 - 1)); + /* Exception handling */ + .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } >MEM_L1_DATA_A + .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } >MEM_L1_DATA_A + /* Thread Local Storage sections */ + .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } >MEM_L1_DATA_A + .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } >MEM_L1_DATA_A + .preinit_array : + { + PROVIDE_HIDDEN (___preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (___preinit_array_end = .); + } >MEM_L1_DATA_A + .init_array : + { + PROVIDE_HIDDEN (___init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE_HIDDEN (___init_array_end = .); + } >MEM_L1_DATA_A + .fini_array : + { + PROVIDE_HIDDEN (___fini_array_start = .); + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + PROVIDE_HIDDEN (___fini_array_end = .); + } >MEM_L1_DATA_A + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin*.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*crtend*.o(.ctors)) + } >MEM_L1_DATA_A + .dtors : + { + KEEP (*crtbegin*.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*crtend*.o(.dtors)) + } >MEM_L1_DATA_A + .jcr : { KEEP (*(.jcr)) } >MEM_L1_DATA_A + .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) } >MEM_L1_DATA_A + .dynamic : { *(.dynamic) } >MEM_L1_DATA_A + .data : + { + *(.data .data.* .gnu.linkonce.d.*) + KEEP (*(.gnu.linkonce.d.*personality*)) + SORT(CONSTRUCTORS) + } >MEM_L1_DATA_A + .data1 : { *(.data1) } >MEM_L1_DATA_A + .got : { *(.got.plt) *(.got) } >MEM_L1_DATA_A + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : + { + *(.sdata .sdata.* .gnu.linkonce.s.*) + } >MEM_L1_DATA_A + __edata = .; PROVIDE (_edata = .); + .sbss : + { + __bss_start = .; + *(.dynsbss) + *(.sbss .sbss.* .gnu.linkonce.sb.*) + *(.scommon) + } >MEM_L1_DATA_A + .bss : + { + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. + FIXME: Why do we need it? When there is no .bss section, we don't + pad the .data section. */ + . = ALIGN(. != 0 ? 32 / 8 : 1); + __bss_end = .; + } >MEM_L1_DATA_A + . = ALIGN(32 / 8); + . = ALIGN(32 / 8); + __end = .; PROVIDE (_end = .); + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + + __stack_end = ORIGIN(MEM_L1_SCRATCH) + LENGTH(MEM_L1_SCRATCH); + + __heap_start = ORIGIN(MEM_L1_DATA_B); + __heap_end = ORIGIN(MEM_L1_DATA_B) + LENGTH(MEM_L1_DATA_B); + + + PROVIDE (end = .) ; + +/* ADSP-BF533依存のSYSTEM MMR + .bss.sysmmr (NOLOAD) : { chip_mmr.o(PWRMGMT)}> MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(SYSRST)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(WDOG)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(RTC)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(UART)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(SPI)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(TIMER)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0040); chip_mmr.o(TMRCTL)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(FLAG)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(SPORT0)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(SPORT1)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(EBIU)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(DMATC)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(DMA)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x1000); chip_mmr.o(PPI)} > MEM_SYSMMR +*/ +/* Blackfin 共有のCORE MMR + .bss.coremmr (NOLOAD) : { cpu_mmr.o(DMEMCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DCPLBA)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DCPLBD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DTESTC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DTESTD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(IMEMCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ICPLBA)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ICPLBD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ITESTC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ITESTD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(EVT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(CEC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(CTMR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000)+0x1000; cpu_mmr.o(DBG)}> MEM_COREMMR */ /* 1000飛ばす */ /* + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(TBCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(TBUF)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(WPICTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPIADDR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPICNT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(WPDCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPDADDR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPDCNT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(WPSTAT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(PFCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(PFCNT)}> MEM_COREMMR +*/ + + .comment 0 : { *(.comment) } + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } +} diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf533/chip_config.c b/uzume_prototype/kernel/config/blackfin/_common_bf533/chip_config.c new file mode 100644 index 0000000..9728e0b --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf533/chip_config.c @@ -0,0 +1,337 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + +/* + * ターゲットシステム依存モジュール(ADSP-BF531/2/3用) + */ + +#include "jsp_kernel.h" +#include +#include + + +#define SYSCFG_VALUE 0x36 + +/* + * ターゲットシステム依存の初期化 + */ +void +sys_initialize() +{ + // BF531/2/3のアノーマリー対策 rev 0.1, 0.2用 + Asm( "SYSCFG=%0;" : :"d"(SYSCFG_VALUE) ) ; + + /* + * スプリアス割り込みハンドラの設定 + * + * cpu_initialize()が行うダミーの割り込みハンドラの設定を上書きする。 + * アプリケーションが割り込みハンドラを設定すると、以下の設定も上書き + * される。 + */ + int i; + + for ( i=0; i> 8; + *pUART_LCR &= ~DLAB; + + /* モード設定, パリティ無し 8bit data, 1 stop bit */ + *pUART_LCR = 0x03; + + /* 割込み禁止 */ + *pUART_IER = 0; + + +} + + +unsigned int priority_mask[16]={ +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x0000007F, +0x00000180, +0x00001E00, +0x0000E000, +0x00070000, +0x00180000, +0x00E00000, +0x00000000, +0x00000000 +}; + + +/* +* SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み +* のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので +* その分補正する。 +*/ +#define INSTALL_PRIORITY \ + for ( i=0; i<8; i++ ){ \ + priority = iar & 0xf; /* IARから優先順位を取り出す */ \ + priority_mask[priority + 7] |= device; /* 取り出した優先順位に基づきデバイスを登録 */ \ + device <<= 1; /* 次のデバイス */ \ + iar >>= 4; /* 次のIARフィールド */ \ + } + +void make_priority_mask( void ) +{ + unsigned int i, priority, device, iar; + + + /* + * 割り込み順位ごとのISRビットマップの作成 + * SIC_IARxの設定はこの部分より前に済ませること + */ + + for ( i=0; i<16; i++ ){ + priority_mask[i] = 0; + } + + device = 1; + iar = *__pSIC_IAR0; + INSTALL_PRIORITY + + iar = *__pSIC_IAR1; + INSTALL_PRIORITY + + iar = *__pSIC_IAR2; + INSTALL_PRIORITY + +} + + +/* + * 割り込みの許可、禁止 + * + */ +ER ena_int( INTNO intno ) +{ + unsigned int mask; + + if ( intno >= DEVICE_INTERRUPT_COUNT ) + return ( E_PAR ); + else { + SIL_PRE_LOC; + + mask = 1 << intno; + SIL_LOC_INT(); // 管理外割り込みまで禁止する + *__pSIC_IMASK |= mask; + asm volatile( "ssync;" ); + SIL_UNL_INT(); // 割り込み再許可 + return (0); + } +} +/* + * dis_int()は、この実装ではSIC_IMASKの指定ビットをクリアする。 + * + * しかし、SIC_IMASKのクリアはアプリケーション実行中には危険であり、 + * Blackfinのマニュアルでも婉曲的に禁止されている。そのため、TOPPERS/JSP for Blackfin + * では、この関数を実装しない。 + * +ER dis_int( INTNO intno ) +{ + unsigned int mask; + + if ( intno >= DEVICE_INTERRUPT_COUNT ) + return ( E_PAR ); + else { + mask = 1 << intno; + mask = ~mask; + *__pSIC_IMASK &= mask; + return (0); + } +} +*/ + +/* + * chg_ims()は、この実装ではSIC_IMASKを変更する。 + * + * しかし、SIC_IMASKのビットのクリアはアプリケーション実行中には危険であり、 + * Blackfinのマニュアルでも婉曲的に禁止されている。そのため、TOPPERS/JSP for + * Blackfinでは、この関数を実装しない。 + * +ER chg_ims( IMS ims ) +{ + *__pSIC_IMASK = ims; + return( 0 ); +} +*/ + + +extern ER get_ims( IMS * p_ims ) +{ + *p_ims = *__pSIC_IMASK; + return( 0 ); +} + + +/* + * 割り込みをデバイスに割り当てる + */ +void device_dispatcher( unsigned int priority, unsigned int imask ) +{ + unsigned int candidates, device; + + candidates = priority_mask[priority] & *__pSIC_ISR & *__pSIC_IMASK; // 現在のプライオリティに相当する割込み源を特定する + + asm volatile("sti %0;": : "d"(imask) ); + + if ( ! candidates ) // 割り込み源が特定できないなら、コア由来である + { + if ( priority == ik_hardware_err) + dev_vector[INHNO_HW_ERROR](); + else + if ( priority == ik_timer) + dev_vector[INHNO_TIMER](); + else + dev_vector[INHNO_RAISE](); // ソフトウェア割り込み + + } + else + { + if ( candidates & 0x80000000 ) + device = 31; + else + { +#ifdef __GNUC__ + asm ( "r1.L = signbits %1; %0 = r1.L(z);":"=d"(device) :"d"(candidates): "R1" ); +#elif defined(__ECC__) + asm( "%0 = signbits %1;" : "=l"( device ) : "d"( candidates ) ); +#else +#error "Compiler is not supported" +#endif + device = 30 - device; // bit mask is converted to bit number + } + dev_vector[device](); + } +} + + + +/* + * ターゲットシステムの終了 + */ +void +sys_exit() +{ + while(1) + ; +} +/* + * ターゲットシステムの文字出力 + */ +void +sys_putc(char c) +{ + if ( c== 0x0A ) /* もし LF ならば */ + sys_putc( 0x0D ); /* CRを一文字送信 */ + + while( !( *pUART_LSR & (1<<5)) ) + ; /* UART0 LSRのTHREが1になるまで待つ。1ならば送信レジスタ空き。*/ + + *pUART_THR = c; /* 一文字送信 */ +} + + + diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf533/chip_config.h b/uzume_prototype/kernel/config/blackfin/_common_bf533/chip_config.h new file mode 100644 index 0000000..ad96faf --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf533/chip_config.h @@ -0,0 +1,268 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +#ifndef _CHIP_CONFIG_H_ +#define _CHIP_CONFIG_H_ + + +/* + * ターゲットシステム依存モジュール(ADSP-BF531/2/3共用) + * + * このインクルードファイルは,t_config.h のみからインクルードされる. + * 他のファイルから直接インクルードしてはならない. +*/ + +/* + * ターゲットシステムのハードウェア資源の定義 + * + * DEVICE_INTERRUPT_COUNTはSIC_IMASKのビット数 + * を与える。 + * ADSP-BF533のビット数は24なので、値は24である。 + */ + +#define DEVICE_INTERRUPT_COUNT 24 + + + +/* + * PLLクロック周波数 + */ +#define PLLCLOCK (CLKIN*MSELVAL) +#define SYSCLOCK (PLLCLOCK / SSELVAL) +#define CORECLOCK (PLLCLOCK / CSELVAL) + + + +/* + * TICの割込みハンドラのベクタ番号 + */ +#ifdef USE_TIC_CORE +#define INHNO_TIMER INHNO_CORE_TIMER +#else +#define INHNO_TIMER INHNO_GP_TIMER2 +#endif + + +/* + * 微少時間待ちのための定義 + * sil_dly_nseの呼び出しオーバーヘッドとループボディーサイクルを + * nSで表す。関数はcpu_support.asmに定義してある。 + * SIL_DLY_TIM1は24サイクル。32nS( 750MHz ), 40nS( 600MHz ) + * SIL_DLY_TIM2は12サイクル。16nS( 750MHz ), 20nS( 600MHz ) + */ + + +#define SIL_DLY_TIM1 (24*1000000000/CORECLOCK) +#define SIL_DLY_TIM2 (12*1000000000/CORECLOCK) + +/************************************************************************* + * uart.c用構成マクロ + */ + +/* シリアルの割込みハンドラのベクタ番号 */ +#define INHNO_SIO0_TX INHNO_UART_TX +#define INHNO_SIO0_RX INHNO_UART_RX + +/* + * UARTレジスタの配置境界。ADSP-BF533の内蔵UARTは4バイト周期でレジスタが + * 並んでいるので、ここには4を指定する。 + */ +#define UART_BOUNDARY 4 + +/* UARTレジスタにsil_xxb_iop()を使ってアクセスするときにはUART_IOP_ACCESSを 宣言する。*/ +#define UART_IOP_ACCESS + +/* シリアルポートのアドレス。 */ +#define UART0_ADDRESS 0xFFC00400 // 内蔵UART THRのアドレス。 + +/* UARTのボーレートジェネレータに設定すべき値. */ +#define UART0_DIVISOR SYSCLOCK/16/UART0_BAUD_RATE + +/* 内蔵UARTを使う場合は、UARTx_BLACKFIN_UCENを宣言してUCENを初期化しなければならない。*/ +#define UART0_BLACKFIN_UCEN + + +/* + * uart.c用構成マクロ終わり + *************************************************************************/ + + + +/* + * 割り込みベクトル番号 + * + * この定義はコンフィグレーションファイルでDEF_INHの引数として使う + * SIC_ISRにおけるビット番号である。 + * + */ +#define INHNO_PLL 0 +#define INHNO_DMA_ERROR 1 +#define INHNO_PPI_ERROR 2 +#define INHNO_SPORT0_ERROR 3 +#define INHNO_SPORT2_ERROR 4 +#define INHNO_SPI_ERROR 5 +#define INHNO_UART_ERROR 6 +#define INHNO_RTC 7 +#define INHNO_PPI 8 +#define INHNO_SPORT0_RX 9 +#define INHNO_SPORT0_TX 10 +#define INHNO_SPORT1_RX 11 +#define INHNO_SPORT1_TX 12 +#define INHNO_SPI 13 +#define INHNO_UART_RX 14 +#define INHNO_UART_TX 15 +#define INHNO_GP_TIMER0 16 +#define INHNO_GP_TIMER1 17 +#define INHNO_GP_TIMER2 18 +#define INHNO_PFA 19 +#define INHNO_PFB 20 +#define INHNO_MEMORY_DMA0 21 +#define INHNO_MEMORY_DMA1 22 +#define INHNO_WDG 23 + +// SIC_ISRにない特殊な割り込み +#define INHNO_HW_ERROR 24 +#define INHNO_CORE_TIMER 25 +#define INHNO_RAISE 26 + + +/* + * SIC_ISRの割り込みのベクタ番号 + * + * この定義はena_int, dis_intの引数として使う。 + */ + +#define INTNO_PLL 0 +#define INTNO_DMA_ERROR 1 +#define INTNO_PPI_ERROR 2 +#define INTNO_SPORT0_ERROR 3 +#define INTNO_SPORT2_ERROR 4 +#define INTNO_SPI_ERROR 5 +#define INTNO_UART_ERROR 6 +#define INTNO_RTC 7 +#define INTNO_PPI 8 +#define INTNO_SPORT0_RX 9 +#define INTNO_SPORT0_TX 10 +#define INTNO_SPORT1_RX 11 +#define INTNO_SPORT1_TX 12 +#define INTNO_SPI 13 +#define INTNO_UART_RX 14 +#define INTNO_UART_TX 15 +#define INTNO_GP_TIMER0 16 +#define INTNO_GP_TIMER1 17 +#define INTNO_GP_TIMER2 18 +#define INTNO_PFA 19 +#define INTNO_PFB 20 +#define INTNO_MEMORY_DMA0 21 +#define INTNO_MEMORY_DMA1 22 +#define INTNO_WDG 23 + + + +#ifndef _MACRO_ONLY + +/* +* SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み +* のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので +* その分補正する。 +*/ +void make_priority_mask( void ); + +/* + * ターゲットシステム依存の初期化 + */ +extern void sys_initialize(void); + +/* + * ターゲットシステムの終了 + * + * システムを終了する時に使う.ROMモニタ/GDB STUB呼出しで実現する. + */ +extern void sys_exit(void); + +/* + * ターゲットシステムの文字出力 + * + * システムの低レベルの文字出力ルーチン.ROMモニタ/GDB STUB呼出しで実 + * 現する. + */ +extern void sys_putc(char c); + +/* +* SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み +* のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので +* その分補正する。 +*/ +void make_priority_mask( void ); + +/* + * 割り込みの許可、禁止 + * + */ +typedef unsigned int INTNO; +extern ER ena_int( INTNO intno ); +extern ER dis_int( INTNO intno ); + +/* + * 割り込みマスクの操作 + * + * + */ +typedef unsigned int IMS; +extern ER chg_ims( IMS ims ); +extern ER get_ims( IMS * p_ims ); + +/** + * スプリアス・イベント・ハンドラ + */ +void spurious_exc_handler(VP p_excinf); +void spurious_int_handler(); + +/* + * 割り込みを起こしたデバイスを調べる +*/ +extern void device_dispatcher( unsigned int priority, unsigned int imask ); + +#endif /* _MACRO_ONLY */ +#endif /* _CHIP_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf533/chip_debugboot.c b/uzume_prototype/kernel/config/blackfin/_common_bf533/chip_debugboot.c new file mode 100644 index 0000000..c7b9fc3 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf533/chip_debugboot.c @@ -0,0 +1,30 @@ +#include "jsp_kernel.h" +#include "sil.h" + +/* +* gdbserverがターゲットのリセット機能を提供しないため、gdb経由でターゲット +* にアプリッケーションをダウンロードすると正しく動作しないことがある。 +* このルーチンはターゲットを一度だけリセットする。 +* +* なお、パラメータ debugが FALSEの場合、リセットはしない +*/ +void boot_for_gdb(void) +{ + // SYSTEM_RESET 0x0007 + // DOUBLE_FAULT 0x0008 + // RESET_DOUBLE 0x2000 + // RESET_WDOG 0x4000 + // RESET_SOFTWARE 0x8000 + if ( enable_boot_for_gdb ){ + enable_boot_for_gdb = 0; /* 次はブートしない */ + *__pSWRST = 0x07; /* 内蔵ペリフェラルのリセット */ + asm volatile( "ssync;" ); + *__pSWRST = 0x00; /* 内蔵ペリフェラルのリセット解除。 */ + asm volatile( "ssync;" ); + *__pSYSCR |= 0x10; /* no boot on core reset */ + asm volatile( "ssync;" ); + asm volatile( "raise 1;" ); /* コアリセット */ + while( 1 ) + ; /*リセットが発生するまでループ*/ + } +} diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf533/chip_defs.h b/uzume_prototype/kernel/config/blackfin/_common_bf533/chip_defs.h new file mode 100644 index 0000000..d38886f --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf533/chip_defs.h @@ -0,0 +1,140 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +/* + * ターゲットシステムに依存する定義(ADSP-BF533用) + * + * このインクルードファイルは,kernel.h と sil.h でインクルードされる. + * 他のファイルから直接インクルードすることはない.このファイルをイン + * クルードする前に,t_stddef.h と itron.h がインクルードされるので, + * それらに依存してもよい. + */ + +#ifndef _CHIP_DEFS_H_ +#define _CHIP_DEFS_H_ + + /* チップ共通部略称  jsp/doc/config.txtの 2.(8)を参照 */ +#define _COMMON_BF533 + +/* + * システム MMRの定義 + */ +#define __PLL_CTL 0xFFC00000 +#define __PLL_DIV 0xFFC00004 + +#define __SWRST 0xFFC00100 +#define __SYSCR 0xFFC00104 +#define __SIC_IMASK 0xFFC0010C +#define __SIC_IAR0 0xFFC00110 +#define __SIC_IAR1 0xFFC00114 +#define __SIC_IAR2 0xFFC00118 +#define __SIC_ISR 0xFFC00120 +#define __SIC_IWR 0xFFC00124 + +#define __TIMER2_CONFIG 0xFFC00620 +#define __TIMER2_COUNTER 0xFFC00624 +#define __TIMER2_PERIOD 0xFFC00628 +#define __TIMER2_WIDTH 0xFFC0062C + +#define __TIMER_ENABLE 0xFFC00640 +#define __TIMER_DISABLE 0xFFC00644 +#define __TIMER_STATUS 0xFFC00648 + +#define __EBIU_SDBCTL 0xFFC00A14 + +#define __pPLL_CTL ((volatile unsigned short *)__PLL_CTL) +#define __pPLL_DIV ((volatile unsigned short *)__PLL_DIV) + +#define __pSWRST ((volatile unsigned short *)__SWRST) +#define __pSYSCR ((volatile unsigned short *)__SYSCR) +#define __pSIC_IMASK ((volatile unsigned long *)__SIC_IMASK) +#define __pSIC_IAR0 ((volatile unsigned long *)__SIC_IAR0) +#define __pSIC_IAR1 ((volatile unsigned long *)__SIC_IAR1) +#define __pSIC_IAR2 ((volatile unsigned long *)__SIC_IAR2) +#define __pSIC_ISR ((volatile unsigned long *)__SIC_ISR) +#define __pSIC_IWR ((volatile unsigned long *)__SIC_IWR) + +#define __pTIMER2_CONFIG ((volatile unsigned short *)__TIMER2_CONFIG) +#define __pTIMER2_COUNTER ((volatile unsigned long *)__TIMER2_COUNTER) +#define __pTIMER2_PERIOD ((volatile unsigned long *)__TIMER2_PERIOD) +#define __pTIMER2_WIDTH ((volatile unsigned long *)__TIMER2_WIDTH) + +#define __pTIMER_ENABLE ((volatile unsigned short *)__TIMER_ENABLE) +#define __pTIMER_DISABLE ((volatile unsigned short *)__TIMER_DISABLE) +#define __pTIMER_STATUS ((volatile unsigned short *)__TIMER_STATUS) + +#define __pEBIU_SDGCTL ((volatile unsigned long *)__EBIU_SDGCTL) +#define __pEBIU_SDBCTL ((volatile unsigned short *)__EBIU_SDBCTL) +#define __pEBIU_SDRRC ((volatile unsigned short *)__EBIU_SDRRC) +#define __pEBIU_SDSTAT ((volatile unsigned short *)__EBIU_SDSTAT) + + +/* + * タイムティックの定義 + */ +#define TIC_NUME 1u /* タイムティックの周期の分子 */ +#define TIC_DENO 1u /* タイムティックの周期の分母 */ + +/* + * 破壊性読み出しレジスタの判別式 + * 与えられたアドレス iop が破壊性読み出しレジスタの + * 場合には真を返す。 + */ +#ifndef DESTRUCTIVE_READ +#define DESTRUCTIVE_READ( iop ) (iop<(VP)0xF0000000) +#endif + +#ifndef _MACRO_ONLY + +/* + * システムの停止処理 + */ + +Inline void +kernel_abort() +{ +} + +#endif /* _MACRO_ONLY */ +#endif /* _CHIP_DEFS_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf533/chip_dump.c b/uzume_prototype/kernel/config/blackfin/_common_bf533/chip_dump.c new file mode 100644 index 0000000..5974ac2 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf533/chip_dump.c @@ -0,0 +1,328 @@ +/** + * \file postmotem533.c + * \brief ADSP-BF533用のポストモーテムダンプルーチン群 + * + * ハードウェアエラー用のハンドラと、例外用のハンドラからなる。いずれも呼び出されるとUARTから + * ポストモーテム出力を表示する。 + */ +#include "jsp_kernel.h" +#include + +/** + * \brief UARTおよび付随するDMAの動作を停止し、すべての割り込みを禁止する。 + * + * 最後にUART_IERをクリアするのは、UART割り込みを禁止すると同時にDMAも禁止するため。 + * UART DMAは、UARTの割り込み線で駆動されているので、割り込みを禁止すればDMAリクエスト + * も停止する。 + * + * UARTの初期化をどうするか悩ましいが、ここではそのまま以前の設定を利用することにする。 + * + * ポストモーテム・ダンプを目的としているので、この状態からの回復は考えない。 + */ +static void pm_occupy_uart() +{ + /* すべてのコア割り込みを禁止する */ + asm( "cli r0;" : : : "R0" ); + + /* すべてのシステム割り込みソースを禁止する */ + *pSIC_IMASK = 0; + + /* UART_IERをディセーブルにすることで、DMAを殺せる */ + *pUART_IER = 0; +} + +/** + * \brief 一文字出力 + * + * UARTの送信レジスタが空になるのを待って一文字出力する。 + */ +static void pm_putc( unsigned char c ) +{ + + /* THRが空になるまで待つ */ + while ( ! ( *pUART_LSR & THRE ) ) + ; + + /* THRが空になったら1文字送信 */ + *pUART_THR = c; +} + +/** + * \brief コンソール入力監視 + * + * UARTの受信レジスタにデータがあれば、読み込む。データが"!"なら真、 + * それ以外なら偽を返す。 + */ +static BOOL is_ready() +{ + /* 受信データはあるか。 */ + if ( *pUART_LSR & DR ) + + { + char c; + + c= *pUART_RBR; + if ( c == '!' ) + return TRUE; + } + return FALSE; +} + + +/** + * \brief 文字列出力 + * + * 受け取った文字列をUARTに出力する。 + */ +static void pm_putstr( char * s ) +{ + int i; + + i=0; + while( s[i] ) /* 末端のNULLが現れるまで出力 */ + pm_putc(s[i++]); +} + +/** + * \brief 1バイトをヘキサデシマルで出力する。 + */ +static void pm_puthex1byte( unsigned int data ) +{ + int i; + int nibble; + + /* 8bit内のすべてのニブルを処理 */ + for ( i=0; i<2; i++ ) + { + /* 最上位ニブルを抽出 */ + nibble = ( data >> 4 ) & 0xF; + /* 抽出したニブルを出力 */ + if ( nibble < 10 ) + pm_putc( nibble + '0' ); + else + pm_putc( nibble - 10 + 'A' ); + /* 次のニブル */ + data <<= 4; + } +} + +/* + * \brief 改行記号を出力する + */ +static void pm_putrtn() +{ + pm_putstr("\r\n"); +} + +/** + * \brief 4バイトをヘキサデシマルで出力する。 + */ +static void pm_puthex4byte( unsigned int data ) +{ + int i; + int nibble; + + /* 32bit内のすべてのニブルを処理 */ + for ( i=0; i<8; i++ ) + { + /* 最上位ニブルを抽出 */ + nibble = ( data >> 28 ) & 0xF; + /* 抽出したニブルを出力 */ + if ( nibble < 10 ) + pm_putc( nibble + '0' ); + else + pm_putc( nibble - 10 + 'A' ); + /* 次のニブル */ + data <<= 4; + } + +} + +/** + * \brief 例外フラグ + * + * 例外が発生したときには真、そうでなければ偽。hwei_handler()に例外か否かを伝える。 + * + * GCCが張り切ってlink/unlink命令の位置を最適化するため、hwei_hanlder()の + * 中で性格にfpを手繰れない。そのため、dummyをアクセスすることでlink/unlinkの位置 + * 最適化の抑止を図る役目もある。効果があるかどうかは不明。 + */ +static volatile int expFlag =0; +/** + * \brief ハードウェア・エラー・ハンドラ + * + * ハードウェア・エラー時に呼び出されて、ハードウェア・エラー・割り込みのポストモーテム処理を行う。 + * 最初にFPを手繰って、割り込みのスタックフレームを探す。次にすべての割り込みを禁止し、 + * UART0を占有したあと、ポーリングを使ってスタックに保存された各レジスタのダンプを行う。 + * DEF_INH(INHNO_HW_ERROR, { TA_HLNG, hwei_handler }); + * + */ +void spurious_int_handler() +{ + unsigned int * fp, *ptr ; /* フレーム・ポインタを手繰っていくための変数 */ + unsigned int reg; /* システムレジスタを受け取るための変数 */ + unsigned int imask, sic_imask; /*マスク記録レジスタ*/ + + /* あとで使う */ + imask = *pIMASK; + sic_imask = *pSIC_IMASK; + /* UART0を初期化し、DMAと割り込みを禁止する */ + pm_occupy_uart(); + + while (1) + { + int count = 0; + + pm_putstr( "Type '!' to display post mortem dump" ); pm_putrtn(); + + while ( ! is_ready() ) + { + int i; + for ( i=0; i<100000000; i++) + asm volatile ("nop;"); + if ( count > 30 ) + { + pm_putstr( "Type '!' to display post mortem dump" ); pm_putrtn(); + count = 0; + } + else + count ++; + } + pm_putrtn(); + + + /* 現在の関数のFPを取得する */ + asm ( "%0=fp;" : "=d"((unsigned int)fp) ); + + /* + * この関数を呼び出した関数 ( interrupt_dispatcher ) のFPを取得する。 + * FPは呼び出し関数のFPの格納番地を指していることを利用する + */ + fp = (void *)*fp; + /* + * interrupt_dispatcher を呼び出した関数のFPを取得する。 + * その関数は割り込みハンドラの入り口処理部に他ならない。 + */ + fp = (void *)*fp; + + /* いまや、FPは割り込み受付時の保存されたレジスタ群を指している */ + + /* プッシュされた P0を指す */ + ptr = fp + 2; + /* + * 上位 + * 0 1 2 3 4 5 6 7 8 9 + * ----------------------------------------------- + * 00 P0 RTS FP R0 R1 R2 R3 R4 R5 R6 + * 10 R7 P1 P2 P3 P4 P5 I3 I2 I1 I0 + * 20 M3 M2 M1 M0 B3 B2 B1 B0 L3 L2 + * 30 L1 L0 A0x A0w A1x A1w LC1 LC0 LT1 LT0 + * 40 LB1 LB0 AST RETI + * 下位 + * + */ + if ( expFlag ) + pm_putstr( "Spurious Exception !!" ); + else + pm_putstr( "Spurious Interrupt !!" ); + pm_putrtn(); + + pm_putstr( "Registers On Stack :" ); pm_putrtn(); + pm_putstr( "P0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "RETS " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "FP " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R4 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R5 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R6 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R7 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P4 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P5 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "A0 " ); pm_puthex1byte( *(ptr--) ); pm_putstr( ":" ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "A1 " ); pm_puthex1byte( *(ptr--) ); pm_putstr( ":" ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LC1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LC0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LT1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LT0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LB1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LB0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "ASTAT " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "RETI " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putrtn(); + pm_putstr( "System Registers :" ); pm_putrtn(); + pm_putstr( "SIC_IMASK " ); pm_puthex4byte( sic_imask ); pm_putrtn(); + pm_putstr( "SIC_ISR " ); pm_puthex4byte( *pSIC_ISR ); pm_putrtn(); + pm_putstr( "IMASK " ); pm_puthex4byte( imask ); pm_putrtn(); + pm_putstr( "ILAT " ); pm_puthex4byte( *pILAT ); pm_putrtn(); + pm_putstr( "IPEND " ); pm_puthex4byte( *pIPEND ); pm_putrtn(); + asm( "%0=SEQSTAT;" : "=d"(reg) ); + pm_putstr( "SEQSTAT " ); pm_puthex4byte( reg ); pm_putrtn(); + pm_putstr( " EXCAUSE " ); pm_puthex1byte( reg & 0x3F ); pm_putrtn(); + pm_putstr( " HWERRCAUSE " ); pm_puthex1byte( (reg>>14)&0x1F ); pm_putrtn(); + pm_putstr( "DMA0_IRQ_STATUS " ); pm_puthex4byte( *pDMA0_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA1_IRQ_STATUS " ); pm_puthex4byte( *pDMA1_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA2_IRQ_STATUS " ); pm_puthex4byte( *pDMA2_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA3_IRQ_STATUS " ); pm_puthex4byte( *pDMA3_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA4_IRQ_STATUS " ); pm_puthex4byte( *pDMA4_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA5_IRQ_STATUS " ); pm_puthex4byte( *pDMA5_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA6_IRQ_STATUS " ); pm_puthex4byte( *pDMA6_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA7_IRQ_STATUS " ); pm_puthex4byte( *pDMA7_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_D0_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_D0_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_S0_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_S0_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_D1_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_D1_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_S1_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_S1_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "SPI_STAT " ); pm_puthex4byte( *pSPI_STAT ); pm_putrtn(); + pm_putstr( "PPI_STATUS " ); pm_puthex4byte( *pPPI_STATUS ); pm_putrtn(); + pm_putstr( "SPORT0_STAT " ); pm_puthex4byte( *pSPORT0_STAT ); pm_putrtn(); + pm_putstr( "SPORT1_STAT " ); pm_puthex4byte( *pSPORT1_STAT ); pm_putrtn(); + pm_putstr( "TIMER_STATUS " ); pm_puthex4byte( *pTIMER_STATUS ); pm_putrtn(); + pm_putstr( "EBIU_SDSTAT " ); pm_puthex4byte( *pEBIU_SDSTAT ); pm_putrtn(); + pm_putrtn(); + pm_putstr( "Calling Stack :" ); pm_putrtn(); + + while( fp ) + { + pm_putstr( "Called from " ); pm_puthex4byte( *(fp+1) ); pm_putrtn(); + fp = (void *)*fp; + } + } +} + +/** + * \brief CPU例外ハンドラ + * + * CPU例外ハンドラとしてcfgファイルに登録する。 hwei_handler()は呼ばれたら戻ってこないが、 + * そのあとにもexpFlagに値を代入しているのは、最適化によってunlink命令の値がルーチン呼び出しの + * 前に移動することを防ぐためである。 + * + * DEF_EXC(CPUEXC1, { TA_HLNG, excp_handler} ); + * + */ +void spurious_exc_handler(VP p_excinf) +{ + expFlag = TRUE; + spurious_int_handler(); +} + diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf533/chip_mmr.c b/uzume_prototype/kernel/config/blackfin/_common_bf533/chip_mmr.c new file mode 100644 index 0000000..75c369a --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf533/chip_mmr.c @@ -0,0 +1,413 @@ +/* + * ADSP-BF533の System MMR 定義。アドレスの指定は .ldファイルとの組み合わせで行う。 + * .ldファイルのサンプルは、 config/blackfin/bf533cbを参照。 + * + * アドレスが正しく割り当てられているかは、次の方法で検証した. + * (Makefileの$(OBJCOPY) -R .sysmmr -R .coremmr jsp をコメントアウトすること) + * +$ readelf -s -W jsp | grep mmr | grep -v DUMMY | grep -v blackfin | sort -k 2 | awk '/_mmr/{print $8, $2}' - | sed 's/_mmr//p' | uniq > regelf.txt +$ cat ../jsp/config/blackfin/def_lpblackfin.h ../jsp/config/blackfin/defbf532.h | grep '0xFF[CE]0' | grep "#define" | sed 's/_MA /_MAP /' - | awk '{print $2,$3}' - | sort -k 2 | sed 's/0x//' - > regdef.txt +$ diff -i -w regelf.txt regdef.txt +24a25,27 +> RTC_PREN FFC00314 +> UART_DLL FFC00400 +> UART_RBR FFC00400 +25a29 +> UART_DLH FFC00404 +123a128 +> DMA_TCPER FFC00B0C +124a130 +> DMA_TCCNT FFC00B10 +288a295 +> DCPLB_FAULT_STATUS FFE00008 +326a334 +> CODE_FAULT_STATUS FFE01008 +327a336 +> CODE_FAULT_ADDR FFE0100C + + + * + * つまり、いくつかのレジスタの宣言がELF側から抜けていることになる。ここで、 + * それぞれのレジスタは別のレジスタのエイリアスであることに注目する。 + * RTC_PREN -> RTC_FAST + * UART_DLL -> UART_THR + * UART_RBR -> UART_THR + * UART_DLH -> UART_IER + * DMA_TCPER -> DMA_TC_PER + * DMA_TCCNT -> DMA_TC_CNT + * + * したがって、上の結果は問題ないと言える。 + * + */ + + +volatile unsigned short mmrPLL_CTL __attribute__ ((aligned(4), section("PWRMGMT"))); +volatile unsigned short mmrPLL_DIV __attribute__ ((aligned(4), section("PWRMGMT"))); +volatile unsigned short mmrVR_CTL __attribute__ ((aligned(4), section("PWRMGMT"))); +volatile unsigned short mmrPLL_STAT __attribute__ ((aligned(4), section("PWRMGMT"))); +volatile unsigned short mmrPLL_LOCKCNT __attribute__ ((aligned(4), section("PWRMGMT"))); +volatile unsigned short mmrCHIPID __attribute__ ((aligned(4), section("PWRMGMT"))); + +volatile unsigned short mmrSWRST __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned short mmrSYSCR __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_RVECT __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IMASK __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IAR0 __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IAR1 __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IAR2 __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IARDUMMY __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_ISR __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IWR __attribute__ ((aligned(4), section("SYSRST"))); + +volatile unsigned short mmrWDOG_CTL __attribute__ ((aligned(4), section("WDOG"))); +volatile unsigned long mmrWDOG_CNT __attribute__ ((aligned(4), section("WDOG"))); +volatile unsigned long mmrWDOG_STAT __attribute__ ((aligned(4), section("WDOG"))); + +volatile unsigned long mmrRTC_STAT __attribute__ ((aligned(4), section("RTC"))); +volatile unsigned short mmrRTC_ICTL __attribute__ ((aligned(4), section("RTC"))); +volatile unsigned short mmrRTC_ISTAT __attribute__ ((aligned(4), section("RTC"))); +volatile unsigned short mmrRTC_SWCNT __attribute__ ((aligned(4), section("RTC"))); +volatile unsigned long mmrRTC_ALARM __attribute__ ((aligned(4), section("RTC"))); +volatile unsigned short mmrRTC_FAST __attribute__ ((aligned(4), section("RTC"))); + +volatile unsigned short mmrUART_THR __attribute__ ((aligned(4), section("UART"))); +volatile unsigned short mmrUART_IER __attribute__ ((aligned(4), section("UART"))); +volatile unsigned short mmrUART_IIR __attribute__ ((aligned(4), section("UART"))); +volatile unsigned short mmrUART_LCR __attribute__ ((aligned(4), section("UART"))); +volatile unsigned short mmrUART_MCR __attribute__ ((aligned(4), section("UART"))); +volatile unsigned short mmrUART_LSR __attribute__ ((aligned(4), section("UART"))); +volatile unsigned short mmrUART_MSR __attribute__ ((aligned(4), section("UART"))); +volatile unsigned short mmrUART_SCR __attribute__ ((aligned(4), section("UART"))); +volatile unsigned short mmrUART_DUMMY0 __attribute__ ((aligned(4), section("UART"))); +volatile unsigned short mmrUART_GCTL __attribute__ ((aligned(4), section("UART"))); + +volatile unsigned short mmrSPI_CTL __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_FLG __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_STAT __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_TDBR __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_RDBR __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_BAUD __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_SHADOW __attribute__ ((aligned(4), section("SPI"))); + +volatile unsigned short mmrTIMER0_CONFIG __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER0_COUNTER __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER0_PERIOD __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER0_WIDTH __attribute__ ((aligned(4), section("TIMER"))); + +volatile unsigned short mmrTIMER1_CONFIG __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER1_COUNTER __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER1_PERIOD __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER1_WIDTH __attribute__ ((aligned(4), section("TIMER"))); + +volatile unsigned short mmrTIMER2_CONFIG __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER2_COUNTER __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER2_PERIOD __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER2_WIDTH __attribute__ ((aligned(4), section("TIMER"))); + +volatile unsigned short mmrTIMER_ENABLE __attribute__ ((aligned(4), section("TMRCTL"))); +volatile unsigned short mmrTIMER_DISABLE __attribute__ ((aligned(4), section("TMRCTL"))); +volatile unsigned short mmrTIMER_STATUS __attribute__ ((aligned(4), section("TMRCTL"))); + + +volatile unsigned short mmrFIO_FLAG_D __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_FLAG_C __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_FLAG_S __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_FLAG_T __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_MASKA_D __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_MASKA_C __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_MASKA_S __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_MASKA_T __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_MASKB_D __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_MASKB_C __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_MASKB_S __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_MASKB_T __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_DIR __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_POLAR __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_EDGE __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_BOTH __attribute__ ((aligned(4), section("FLAG"))); +volatile unsigned short mmrFIO_INEN __attribute__ ((aligned(4), section("FLAG"))); + + + +volatile unsigned short mmrSPORT0_TCR1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_TCR2 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_TCLKDIV __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_TFSDIV __attribute__ ((aligned(4), section("SPORT0"))); +volatile long mmrSPORT0_TX __attribute__ ((aligned(4), section("SPORT0"))); +volatile long mmrSPORT0_DUMMY0 __attribute__ ((aligned(4), section("SPORT0"))); +volatile long mmrSPORT0_RX __attribute__ ((aligned(4), section("SPORT0"))); +volatile long mmrSPORT0_DUMMY1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_RCR1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_RCR2 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_RCLKDIV __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_RFSDIV __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_STAT __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_CHNL __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_MCMC1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_MCMC2 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MTCS0 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MTCS1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MTCS2 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MTCS3 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MRCS0 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MRCS1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MRCS2 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MRCS3 __attribute__ ((aligned(4), section("SPORT0"))); + + +volatile unsigned short mmrSPORT1_TCR1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_TCR2 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_TCLKDIV __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_TFSDIV __attribute__ ((aligned(4), section("SPORT1"))); +volatile long mmrSPORT1_TX __attribute__ ((aligned(4), section("SPORT1"))); +volatile long mmrSPORT1_DUMMY0 __attribute__ ((aligned(4), section("SPORT1"))); +volatile long mmrSPORT1_RX __attribute__ ((aligned(4), section("SPORT1"))); +volatile long mmrSPORT1_DUMMY1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_RCR1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_RCR2 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_RCLKDIV __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_RFSDIV __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_STAT __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_CHNL __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_MCMC1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_MCMC2 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MTCS0 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MTCS1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MTCS2 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MTCS3 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MRCS0 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MRCS1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MRCS2 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MRCS3 __attribute__ ((aligned(4), section("SPORT1"))); + + + +volatile unsigned short mmrEBIU_AMGCTL __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned long mmrEBIU_AMBCTL0 __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned long mmrEBIU_AMBCTL1 __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned long mmrEBIU_DUMMY0 __attribute__ ((aligned(4), section("EBIU"))); + + +volatile unsigned long mmrEBIU_SDGCTL __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned short mmrEBIU_SDBCTL __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned short mmrEBIU_SDRRC __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned short mmrEBIU_SDSTAT __attribute__ ((aligned(4), section("EBIU"))); + + + +volatile unsigned short mmrDMA_TC_DUMMY0 __attribute__ ((aligned(4), section("DMATC"))); +volatile unsigned short mmrDMA_TC_DUMMY1 __attribute__ ((aligned(4), section("DMATC"))); +volatile unsigned short mmrDMA_TC_DUMMY3 __attribute__ ((aligned(4), section("DMATC"))); +volatile unsigned short mmrDMA_TC_PER __attribute__ ((aligned(4), section("DMATC"))); +volatile unsigned short mmrDMA_TC_CNT __attribute__ ((aligned(4), section("DMATC"))); + + +volatile void * volatile mmrDMA0_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA0_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA0_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA0_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA0_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA0_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA1_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA1_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA1_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA1_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA1_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA1_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA2_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA2_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA2_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA2_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA2_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA2_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA3_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA3_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA3_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA3_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA3_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA3_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA4_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA4_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA4_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA4_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA4_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA4_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA5_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA5_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA5_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA5_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA5_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA5_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA6_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA6_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA6_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA6_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA6_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA6_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA7_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA7_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA7_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA7_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA7_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA7_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrMDMA_D0_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D0_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_D0_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_D0_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D0_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D0_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrMDMA_S0_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S0_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_S0_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_S0_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S0_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S0_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrMDMA_D1_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D1_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_D1_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_D1_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D1_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D1_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrMDMA_S1_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S1_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_S1_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_S1_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S1_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S1_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile unsigned short mmrPPI_CONTROL __attribute__ ((aligned(4), section("PPI"))); +volatile unsigned short mmrPPI_STATUS __attribute__ ((aligned(4), section("PPI"))); +volatile unsigned short mmrPPI_COUNT __attribute__ ((aligned(4), section("PPI"))); +volatile unsigned short mmrPPI_DELAY __attribute__ ((aligned(4), section("PPI"))); +volatile unsigned short mmrPPI_FRAME __attribute__ ((aligned(4), section("PPI"))); diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf533/hw_serial.cfg b/uzume_prototype/kernel/config/blackfin/_common_bf533/hw_serial.cfg new file mode 100644 index 0000000..cb1f83f --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf533/hw_serial.cfg @@ -0,0 +1,10 @@ +/* + + */ + +/* + * SIOドライバ(ADSP-BF533用)のコンフィギュレーションファイル + */ +INCLUDE("\"hw_serial.h\""); +DEF_INH(INHNO_SIO0_RX, { TA_HLNG, sio0_rx_handler }); +DEF_INH(INHNO_SIO0_TX, { TA_HLNG, sio0_tx_handler }); diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf533/hw_serial.h b/uzume_prototype/kernel/config/blackfin/_common_bf533/hw_serial.h new file mode 100644 index 0000000..c9c25f6 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf533/hw_serial.h @@ -0,0 +1,144 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + */ + +/* + * シリアルI/Oデバイス(SIO)ドライバ(Blackfin UART用) + * + * このファイルは、TOPPERS/JSP 1.4.2の config/sh3/ms7727cp01/hw_serial.hを + * リネームし、内部の識別子を変更したものである。 + * + * このファイルは下位のデバイス・アクセス・ルーチンを束ねて上位の層に渡す + * ためのものである。Blackfinの外部にあるシリアルをTOPPERS/JSPで管理しない + * のなら、変更する必要はない。 + */ + +#ifndef _HW_SERIAL_H_ +#define _HW_SERIAL_H_ + +#include + +#include "uart.h" + + + +/* + * SIOドライバの初期化ルーチン + */ +#define sio_initialize uart_initialize + +#ifndef _MACRO_ONLY +/* + * シリアルI/Oポートのオープン + */ +Inline SIOPCB * +sio_opn_por(ID siopid, VP_INT exinf) +{ + SIOPCB *siopcb; + + /* + * デバイス依存のオープン処理. + */ + siopcb = uart_opn_por(siopid, exinf); + + /* + * Enable Corrensponding Interrupt at IMASK + * Note that, this implementation has only 1 SIO in a system + */ + ena_int( INTNO_UART_TX ); + ena_int( INTNO_UART_RX ); + + return(siopcb); +} + +/* + * シリアルI/Oポートのクローズ + */ +Inline void +sio_cls_por(SIOPCB *siopcb) +{ + + /* + * ここではSIC_IMASKの対応ビットをクリアしない。SIC_IMASKのクリアは + * 危険である。UARTからの割り込みは uart_cls_por内部で禁止するので + * 充分である。 + */ + + /* + * デバイス依存のクローズ処理. + */ + uart_cls_por(siopcb); +} + + +/* + * SIOの割込みハンドラ + */ +#define sio0_rx_handler uart0_rx_isr +#define sio0_tx_handler uart0_tx_isr + +/* + * シリアルI/Oポートへの文字送信 + */ +#define sio_snd_chr uart_snd_chr + +/* + * シリアルI/Oポートからの文字受信 + */ +#define sio_rcv_chr uart_rcv_chr + +/* + * シリアルI/Oポートからのコールバックの許可 + */ +#define sio_ena_cbr uart_ena_cbr + +/* + * シリアルI/Oポートからのコールバックの禁止 + */ +#define sio_dis_cbr uart_dis_cbr + +/* + * シリアルI/Oポートからの送信可能コールバック + */ +#define sio_ierdy_snd uart_ierdy_snd + +/* + * シリアルI/Oポートからの受信通知コールバック + */ +#define sio_ierdy_rcv uart_ierdy_rcv + +#endif /* _MACRO_ONLY */ +#endif /* _HW_SERIAL_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf533/hw_timer.h b/uzume_prototype/kernel/config/blackfin/_common_bf533/hw_timer.h new file mode 100644 index 0000000..9ef8d7b --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf533/hw_timer.h @@ -0,0 +1,170 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)縲鰀(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + +/* + * タイマドライバ(ADSP-BF533用) + * + */ + +#ifndef _HW_TIMER_H_ +#define _HW_TIMER_H_ + +#include +#include + +#ifndef _MACRO_ONLY + + + + +/************************************************************** + * タイマの起動処理 + * + * タイマを初期化し,周期的なタイマ割込み要求を発生させる. + * + **************************************************************/ +Inline void +hw_timer_initialize() +{ +#ifdef USE_TIC_CORE + // Core timer + // TCNTL bit assignement + // TMPWR 0x00000001 + // TMREN 0x00000002 + // TAUTORLD 0x00000004 + // TINT 0x00000008 + *__pTCNTL = 0x00000001; // TMPWR : power up timer; + *__pTPERIOD = CORECLOCK/1000; // CORE CLOCK is defined in sys_config.h + *__pTCNTL = 0x00000007; // TMPWR | TMREN | TAUTORLD; +#else + // GPT2(General-purpose timer2) + + + /* TIMERx_CONFIG Registers */ + // PWM_OUT 0x0001 + // WDTH_CAP 0x0002 + // EXT_CLK 0x0003 + // PULSE_HI 0x0004 + // PERIOD_CNT 0x0008 + // IRQ_ENA 0x0010 + // TIN_SEL 0x0020 + // OUT_DIS 0x0040 + // CLK_SEL 0x0080 + // TOGGLE_HI 0x0100 + // EMU_RUN 0x0200 + + *__pTIMER2_CONFIG = 0x0059; // PERIOD_CNT | OUT_DIS |IRQ_ENA | PWM_OUT ( PWM_OUT, Output Pad disable) + *__pTIMER2_PERIOD = SYSCLOCK/1000; // SYS CLOCK is defined in sys_config.h + *__pTIMER2_WIDTH = 1; // 0 < width < period + + // TIMEN0 0x0001 + // TIMEN1 0x0002 + // TIMEN2 0x0004 + *__pTIMER_ENABLE = 0x004; // TIMEN2 timer2 start + + ena_int( INHNO_TIMER ); // enable Timer Interrupt +#endif + asm("ssync;"); + +} + +/************************************************************** + * タイマ割込み要求のクリア + **************************************************************/ +Inline void +hw_timer_int_clear() +{ +#ifdef USE_TIC_CORE + // Core timer + // TCNTL bit assignement + // TMPWR 0x00000001 + // TMREN 0x00000002 + // TAUTORLD 0x00000004 + // TINT 0x00000008 + + /* TINTはW1Cではないので、TINTのTINTビットは0を書き込む */ + *__pTCNTL = 0x00000007; // TMPWR | TMREN | TAUTORLD; +#else + // GPT2(General-purpose timer2) + + // TIMIL0 0x0001 + // TIMIL1 0x0002 + // TIMIL2 0x0004 + *__pTIMER_STATUS = 0x004; // TIMIL2, Clear interrupt +#endif + asm("ssync;"); +} + +/************************************************************** + * タイマの停止処理 + * + * タイマの動作を停止させる. + **************************************************************/ +Inline void +hw_timer_terminate() +{ + /* + * タイマの動作を停止する. + */ +#ifdef USE_TIC_CORE + // Core timer + // TCNTL bit assignement + // TMPWR 0x00000001 + // TMREN 0x00000002 + // TAUTORLD 0x00000004 + // TINT 0x00000008 + *__pTCNTL = 0x00000005; //TMPWR | TAUTORLD | TINT; // 停止 + *__pTCNTL = 0; // パワーダウンモード +#else + // GPT2(General-purpose timer2) + // TIMDIS0 0x0001 + // TIMDIS1 0x0002 + // TIMDIS2 0x0004 + *__pTIMER_DISABLE = 0x004; // TIMDIS2, timer2 disable +#endif + asm("ssync;"); +} + + +#endif /* _MACRO_ONLY */ +#endif /* _HW_TIMER_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf533/sys_rename.def b/uzume_prototype/kernel/config/blackfin/_common_bf533/sys_rename.def new file mode 100644 index 0000000..6b882a6 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf533/sys_rename.def @@ -0,0 +1,6 @@ +make_priority_mask +device_dispatcher +boot_for_gdb +siopinib_table +sprious_int_handler +sprious_exp_handler diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf533/sys_rename.h b/uzume_prototype/kernel/config/blackfin/_common_bf533/sys_rename.h new file mode 100644 index 0000000..5d3ef27 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf533/sys_rename.h @@ -0,0 +1,23 @@ +/* This file is generated from sys_rename.def by genrename. */ + +#ifndef _SYS_RENAME_COMMON_H_ +#define _SYS_RENAME_COMMON_H_ + +#define make_priority_mask _kernel_make_priority_mask +#define device_dispatcher _kernel_device_dispatcher +#define boot_for_gdb _kernel_boot_for_gdb +#define siopinib_table _kernel_siopinib_table +#define sprious_int_handler _kernel_sprious_int_handler +#define sprious_exp_handler _kernel_sprious_exp_handler + +#ifdef LABEL_ASM + +#define _make_priority_mask __kernel_make_priority_mask +#define _device_dispatcher __kernel_device_dispatcher +#define _boot_for_gdb __kernel_boot_for_gdb +#define _siopinib_table __kernel_siopinib_table +#define _sprious_int_handler __kernel_sprious_int_handler +#define _sprious_exp_handler __kernel_sprious_exp_handler + +#endif /* LABEL_ASM */ +#endif /* _SYS_RENAME_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf533/sys_unrename.h b/uzume_prototype/kernel/config/blackfin/_common_bf533/sys_unrename.h new file mode 100644 index 0000000..4beabaa --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf533/sys_unrename.h @@ -0,0 +1,23 @@ +/* This file is generated from sys_rename.def by genrename. */ + +#ifdef _SYS_UNRENAME_COMMON_H_ +#undef _SYS_UNRENAME_COMMON_H_ + +#undef make_priority_mask +#undef device_dispatcher +#undef boot_for_gdb +#undef siopinib_table +#undef sprious_int_handler +#undef sprious_exp_handler + +#ifdef LABEL_ASM + +#undef _make_priority_mask +#undef _device_dispatcher +#undef _boot_for_gdb +#undef _siopinib_table +#undef _sprious_int_handler +#undef _sprious_exp_handler + +#endif /* LABEL_ASM */ +#endif /* _SYS_UNRENAME_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf537/bf537elf.ld b/uzume_prototype/kernel/config/blackfin/_common_bf537/bf537elf.ld new file mode 100644 index 0000000..d52271e --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf537/bf537elf.ld @@ -0,0 +1,332 @@ + +OUTPUT_FORMAT("elf32-bfin","elf32-bfin","elf32-bfin") +OUTPUT_ARCH(bfin) + +PROVIDE (ldf_stack_end = 0xffb00FFC ) ; +PROVIDE (hardware_init_hook = 0) ; +PROVIDE (software_init_hook = 0) ; +PROVIDE (software_term_hook = 0) ; +PROVIDE (__kernel_boot_for_gdb = 0); +ENTRY (start); + +MEMORY + { + MEM_SDRAM (XW) : ORIGIN = 0x00000000, LENGTH = 128M + MEM_ASYNC_0 (XW) : ORIGIN = 0x20000000, LENGTH = 1M + MEM_ASYNC_1 (XW) : ORIGIN = 0x20100000, LENGTH = 1M + MEM_ASYNC_2 (XW) : ORIGIN = 0x20200000, LENGTH = 1M + MEM_ASYNC_3 (XW) : ORIGIN = 0x20300000, LENGTH = 1M + + MEM_L1_DATA_A (W!X) : ORIGIN = 0xff800000, LENGTH = 32K + MEM_L1_DATA_B (W!X) : ORIGIN = 0xff900000, LENGTH = 16K + MEM_L1_CODE (XR) : ORIGIN = 0xffa00000, LENGTH = 48K + MEM_L1_SCRATCH (W!X) : ORIGIN = 0xffb00000, LENGTH = 4K + + MEM_L2 : ORIGIN = 0xffe00000, LENGTH = 0 /* DUMMY */ + + MEM_SYSMMR (W!X) : ORIGIN = 0xffc00000, LENGTH = 2M + MEM_COREMMR (W!X) : ORIGIN = 0xffe00000, LENGTH = 2M + } + +SECTIONS +{ + +/* Read-only sections, merged into text segment: */ + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } + .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } + .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } + .rel.data.rel.ro : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) } + .rela.data.rel.ro : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) } + .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } + .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } + .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } + .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } + .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } + .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.sdata : { *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*) } + .rela.sdata : { *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*) } + .rel.sbss : { *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*) } + .rela.sbss : { *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*) } + .rel.sdata2 : { *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*) } + .rela.sdata2 : { *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*) } + .rel.sbss2 : { *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*) } + .rela.sbss2 : { *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*) } + .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } + .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + .l2 : + { + *(.l2 .l2.*) + } >MEM_SDRAM + + .start : + { + KEEP (*(.start)) + } >MEM_L1_CODE =0 + + .text : + { + *(.text .stub .text.* .gnu.linkonce.t.*) + KEEP (*(.text.*personality*)) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + } >MEM_L1_CODE =0 + + .init : + { + KEEP (*(.init)) + } >MEM_L1_CODE =0 + + .plt : { *(.plt) } >MEM_L1_CODE + + .fini : + { + KEEP (*(.fini)) + } >MEM_L1_CODE =0 + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } >MEM_L1_DATA_A + .rodata1 : { *(.rodata1) } >MEM_L1_DATA_A + + .sdata2 : + { + *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) + } >MEM_L1_DATA_A + + .sbss2 : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) } >MEM_L1_DATA_A + .eh_frame_hdr : { *(.eh_frame_hdr) } >MEM_L1_DATA_A + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } >MEM_L1_DATA_A + .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } >MEM_L1_DATA_A + + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = ALIGN(0x1000) + (. & (0x1000 - 1)); + /* Exception handling */ + .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } >MEM_L1_DATA_A + .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } >MEM_L1_DATA_A + /* Thread Local Storage sections */ + .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } >MEM_L1_DATA_A + .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } >MEM_L1_DATA_A + .preinit_array : + { + PROVIDE_HIDDEN (___preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (___preinit_array_end = .); + } >MEM_L1_DATA_A + .init_array : + { + PROVIDE_HIDDEN (___init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE_HIDDEN (___init_array_end = .); + } >MEM_L1_DATA_A + .fini_array : + { + PROVIDE_HIDDEN (___fini_array_start = .); + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + PROVIDE_HIDDEN (___fini_array_end = .); + } >MEM_L1_DATA_A + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin*.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*crtend*.o(.ctors)) + } >MEM_L1_DATA_A + .dtors : + { + KEEP (*crtbegin*.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*crtend*.o(.dtors)) + } >MEM_L1_DATA_A + .jcr : { KEEP (*(.jcr)) } >MEM_L1_DATA_A + .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) } >MEM_L1_DATA_A + .dynamic : { *(.dynamic) } >MEM_L1_DATA_A + .data : + { + *(.data .data.* .gnu.linkonce.d.*) + KEEP (*(.gnu.linkonce.d.*personality*)) + SORT(CONSTRUCTORS) + } >MEM_L1_DATA_A + .data1 : { *(.data1) } >MEM_L1_DATA_A + .got : { *(.got.plt) *(.got) } >MEM_L1_DATA_A + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : + { + *(.sdata .sdata.* .gnu.linkonce.s.*) + } >MEM_L1_DATA_A + __edata = .; PROVIDE (_edata = .); + .sbss : + { + __bss_start = .; + *(.dynsbss) + *(.sbss .sbss.* .gnu.linkonce.sb.*) + *(.scommon) + } >MEM_L1_DATA_A + .bss : + { + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. + FIXME: Why do we need it? When there is no .bss section, we don't + pad the .data section. */ + . = ALIGN(. != 0 ? 32 / 8 : 1); + __bss_end = .; + } >MEM_L1_DATA_A + . = ALIGN(32 / 8); + . = ALIGN(32 / 8); + __end = .; PROVIDE (_end = .); + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + + __stack_end = ORIGIN(MEM_L1_SCRATCH) + LENGTH(MEM_L1_SCRATCH); + + __heap_start = ORIGIN(MEM_L1_DATA_B); + __heap_end = ORIGIN(MEM_L1_DATA_B) + LENGTH(MEM_L1_DATA_B); + + + PROVIDE (end = .) ; + +/* ADSP-BF533依存のSYSTEM MMR + .bss.sysmmr (NOLOAD) : { chip_mmr.o(PWRMGMT)}> MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(SYSRST)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(WDOG)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(RTC)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(UART0)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(SPI)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(TIMER)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0040); chip_mmr.o(TMRCTL)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(FLAGF)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(SPORT0)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(SPORT1)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(EBIU)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(DMATC)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(DMA)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x1000); chip_mmr.o(PPI)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0400); chip_mmr.o(TWI)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0080); chip_mmr.o(TWIDATA)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(FLAGG)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100)+0x0100; chip_mmr.o(FLAGH)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x1000); chip_mmr.o(UART1)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0800)+0x0200; chip_mmr.o(CANCTL0)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0040); chip_mmr.o(CANCTL1)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0040); chip_mmr.o(CANCTL2)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(CANMBX)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x1000); chip_mmr.o(EMAC)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(EMACR)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0080); chip_mmr.o(EMACT)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0200); chip_mmr.o(PORTFER)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0100); chip_mmr.o(HDMA0)} > MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = ALIGN(0x0040); chip_mmr.o(HDMA1)} > MEM_SYSMMR +*/ +/* Blackfin 共有のCORE MMR + .bss.coremmr (NOLOAD) : { cpu_mmr.o(DMEMCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DCPLBA)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DCPLBD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DTESTC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DTESTD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(IMEMCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ICPLBA)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ICPLBD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ITESTC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ITESTD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(EVT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(CEC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(CTMR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000)+0x1000; cpu_mmr.o(DBG)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(TBCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(TBUF)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(WPICTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPIADDR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPICNT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(WPDCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPDADDR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPDCNT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(WPSTAT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(PFCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(PFCNT)}> MEM_COREMMR + +*/ + + .comment 0 : { *(.comment) } + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } +} diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf537/chip_config.c b/uzume_prototype/kernel/config/blackfin/_common_bf537/chip_config.c new file mode 100644 index 0000000..22dbf1a --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf537/chip_config.c @@ -0,0 +1,329 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + +/* + * ターゲットシステム依存モジュール(ADSP-BF537用) + */ + +#include "jsp_kernel.h" +#include +#include + + +/* + * ターゲットシステム依存の初期化 + */ +void +sys_initialize() +{ + + /* + * スプリアス割り込みハンドラの設定 + * + * cpu_initialize()が行うダミーの割り込みハンドラの設定を上書きする。 + * アプリケーションが割り込みハンドラを設定すると、以下の設定も上書き + * される。 + */ + int i; + + for ( i=0; i> 8; + *pUART0_LCR &= ~DLAB; + + /* モード設定, パリティ無し 8bit data, 1 stop bit */ + *pUART0_LCR = 0x03; + + /* 割込み禁止 */ + *pUART0_IER = 0; +} + + // priority_maskは、event順位0..15に応じた + // 割り込み要求のビットマップを保持する。 +unsigned int priority_mask[16]={ +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000007, +0x00000018, +0x000001E0, +0x00007E00, +0x00078000, +0x1FF80000, +0xE0000000, +0x00000000, +0x00000000 +}; + + +/* +* SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み +* のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので +* その分補正する。 +*/ +#define INSTALL_PRIORITY \ + for ( i=0; i<8; i++ ){ \ + priority = iar & 0xf; /* IARから優先順位を取り出す */ \ + priority_mask[priority + 7] |= device; /* 取り出した優先順位に基づきデバイスを登録 */ \ + device <<= 1; /* 次のデバイス */ \ + iar >>= 4; /* 次のIARフィールド */ \ + } + +void make_priority_mask( void ) +{ + unsigned int i, priority, device, iar; + + + /* + * 割り込み順位ごとのISRビットマップの作成 + * SIC_IARxの設定はこの部分より前に済ませること + */ + + // priority_maskは、event順位0..15に応じた + // 割り込み要求のビットマップを保持する。 + for ( i=0; i<16; i++ ){ + priority_mask[i] = 0; + } + + device = 1; + iar = *__pSIC_IAR0; + INSTALL_PRIORITY + + iar = *__pSIC_IAR1; + INSTALL_PRIORITY + + iar = *__pSIC_IAR2; + INSTALL_PRIORITY + + iar = *__pSIC_IAR3; + INSTALL_PRIORITY + +} + + +/* + * 割り込みの許可、禁止 + * + */ +ER ena_int( INTNO intno ) +{ + unsigned int mask; + + if ( intno >= DEVICE_INTERRUPT_COUNT ) + return ( E_PAR ); + else { + SIL_PRE_LOC; + + mask = 1 << intno; + SIL_LOC_INT(); // 管理外割り込みまで禁止する + *__pSIC_IMASK |= mask; + asm volatile( "ssync;" ); + SIL_UNL_INT(); // 割り込み再許可 + return (0); + } +} + +/* + * dis_int()は、この実装ではSIC_IMASKの指定ビットをクリアする。 + * + * しかし、SIC_IMASKのクリアはアプリケーション実行中には危険であり、 + * Blackfinのマニュアルでも婉曲的に禁止されている。そのため、TOPPERS/JSP for Blackfin + * では、この関数を実装しない。 + * + ER dis_int( INTNO intno ) +{ + unsigned int mask; + + if ( intno >= DEVICE_INTERRUPT_COUNT ) + return ( E_PAR ); + else { + mask = 1 << intno; + mask = ~mask; + *__pSIC_IMASK &= mask; + return (0); + } +} +*/ + +/* + * chg_ims()は、この実装ではSIC_IMASKを変更する。 + * + * しかし、SIC_IMASKのビットのクリアはアプリケーション実行中には危険であり、 + * Blackfinのマニュアルでも婉曲的に禁止されている。そのため、TOPPERS/JSP for + * Blackfinでは、この関数を実装しない。 + * ER chg_ims( IMS ims ) +{ + *__pSIC_IMASK = ims; + return( 0 ); +} +*/ + +extern ER get_ims( IMS * p_ims ) +{ + *p_ims = *__pSIC_IMASK; + return( 0 );; +} + + +/* + * 割り込みをデバイスに割り当てる + */ +void device_dispatcher( unsigned int priority, unsigned int imask ) +{ + unsigned int candidates, device; + + candidates = priority_mask[priority] & *__pSIC_ISR & *__pSIC_IMASK; // 現在のプライオリティに相当する割込み源を特定する + + asm volatile("sti %0;": : "d"(imask) ); + + if ( ! candidates ) // 割り込み源が特定できないなら、コア由来である + { + if ( priority == ik_hardware_err) + dev_vector[INHNO_HW_ERROR](); + else + if ( priority == ik_timer) + dev_vector[INHNO_TIMER](); + else + dev_vector[INHNO_RAISE](); // ソフトウェア割り込み + + } + else + { + if ( candidates & 0x80000000 ) + device = 31; + else + { +#ifdef __GNUC__ + asm ( "r1.L = signbits %1; %0 = r1.L(z);":"=d"(device) :"d"(candidates): "R1" ); +#elif defined(__ECC__) + asm( "%0 = signbits %1;" : "=l"( device ) : "d"( candidates ) ); +#else +#error "Compiler is not supported" +#endif + device = 30 - device; // bit mask is converted to bit number + } + dev_vector[device](); + } +} + + + +/* + * ターゲットシステムの終了 + */ +void +sys_exit() +{ + while(1) + ; +} + +/* + * ターゲットシステムの文字出力 + */ +void +sys_putc(char c) +{ + if ( c== 0x0A ) /* もし LF ならば */ + sys_putc( 0x0D ); /* CRを一文字送信 */ + + while( !( *pUART0_LSR & (1<<5)) ) + ; /* UART0 LSRのTHREが1になるまで待つ。1ならば送信レジスタ空き。*/ + + *pUART0_THR = c; /* 一文字送信 */ +} + + + diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf537/chip_config.h b/uzume_prototype/kernel/config/blackfin/_common_bf537/chip_config.h new file mode 100644 index 0000000..e56dabc --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf537/chip_config.h @@ -0,0 +1,298 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +#ifndef _CHIP_CONFIG_H_ +#define _CHIP_CONFIG_H_ + + +/* + * ターゲットシステム依存モジュール(EZKIT-BF534,6,7用) + * + * このインクルードファイルは,t_config.h のみからインクルードされる. + * 他のファイルから直接インクルードしてはならない. +*/ + +/* + * ターゲットシステムのハードウェア資源の定義 + * + * DEVICE_INTERRUPT_COUNTはSIC_IMASKのビット数 + * を与える。 + * ADSP-BF537のビット数は32なので、値は32である。 + */ + +#define DEVICE_INTERRUPT_COUNT 32 + + + +/* + * PLLクロック周波数 + */ +#define PLLCLOCK (CLKIN*MSELVAL) +#define SYSCLOCK (PLLCLOCK / SSELVAL) +#define CORECLOCK (PLLCLOCK / CSELVAL) + + + +/* + * TICの割込みハンドラのベクタ番号 + */ +#ifdef USE_TIC_CORE +#define INHNO_TIMER INHNO_CORE_TIMER +#else +#define INHNO_TIMER INHNO_GP_TIMER7 +#endif + + +/* + * 微少時間待ちのための定義 + * sil_dly_nseの呼び出しオーバーヘッドとループボディーサイクルを + * nSで表す。関数はcpu_support.asmに定義してある。 + * SIL_DLY_TIM1は24サイクル。32nS( 750MHz ), 40nS( 600MHz ) + * SIL_DLY_TIM2は12サイクル。16nS( 750MHz ), 20nS( 600MHz ) + */ + + +#define SIL_DLY_TIM1 (24*1000000000/CORECLOCK) +#define SIL_DLY_TIM2 (12*1000000000/CORECLOCK) + +/************************************************************************* + * uart.c用構成マクロ + */ + +/* シリアルの割込みハンドラのベクタ番号 */ +#define INHNO_SIO0_TX INHNO_UART0_TX +#define INHNO_SIO0_RX INHNO_UART0_RX +#define INHNO_SIO1_TX INHNO_UART1_TX +#define INHNO_SIO1_RX INHNO_UART1_RX + +/* + * UARTレジスタの配置境界。ADSP-BF537の内蔵UARTは4バイト周期でレジスタが + * 並んでいるので、ここには4を指定する。 + */ +#define UART_BOUNDARY 4 + +/* UARTレジスタにsil_xxb_iop()を使ってアクセスするときにはUART_IOP_ACCESSを 宣言する。*/ +#define UART_IOP_ACCESS + +/* シリアルポートのアドレス。 */ +#define UART0_ADDRESS 0xFFC00400 // 内蔵UART0 THRのアドレス。 +#define UART1_ADDRESS 0xFFC02000 // 内蔵UART0 THRのアドレス。 + +/* UARTのボーレートジェネレータに設定すべき値. */ +#define UART0_DIVISOR SYSCLOCK/16/UART0_BAUD_RATE +#define UART1_DIVISOR SYSCLOCK/16/UART1_BAUD_RATE + +/* 内蔵UARTを使う場合は、UARTx_BLACKFIN_UCENを宣言してUCENを初期化しなければならない。*/ +#define UART0_BLACKFIN_UCEN + + +/* + * uart.c用構成マクロ終わり + *************************************************************************/ + + + +/* + * 割り込みベクトル番号 + * + * この定義はコンフィグレーションファイルでDEF_INHの引数として使う + * SIC_ISRにおけるビット番号である。 + * + */ + +#define INHNO_PLL 0 +#define INHNO_DMA_ERROR 1 +#define INHNO_PERIPHERAL_ERROR 2 +#define INHNO_RTC 3 +#define INHNO_PPI 4 +#define INHNO_SPORT0_RX 5 +#define INHNO_SPORT0_TX 6 +#define INHNO_SPORT1_RX 7 +#define INHNO_SPORT1_TX 8 +#define INHNO_TWI 9 +#define INHNO_SPI 10 +#define INHNO_UART0_RX 11 +#define INHNO_UART0_TX 12 +#define INHNO_UART1_RX 13 +#define INHNO_UART1_TX 14 +#define INHNO_CAN_RX 15 +#define INHNO_CAN_TX 16 +#define INHNO_MAC_RX 17 +#define INHNO_PORT_H_A 17 +#define INHNO_MAC_TX 18 +#define INHNO_PORT_H_B 18 +#define INHNO_GP_TIMER0 19 +#define INHNO_GP_TIMER1 20 +#define INHNO_GP_TIMER2 21 +#define INHNO_GP_TIMER3 22 +#define INHNO_GP_TIMER4 23 +#define INHNO_GP_TIMER5 24 +#define INHNO_GP_TIMER6 25 +#define INHNO_GP_TIMER7 26 +#define INHNO_PORT_FG_A 27 +#define INHNO_PORT_G_B 28 +#define INHNO_MEMORY_DMA0 29 +#define INHNO_MEMORY_DMA1 30 +#define INHNO_WDG 31 +#define INHNO_PORT_F_B 31 + + +// SIC_ISRにない特殊な割り込み + +#define INHNO_HW_ERROR 32 +#define INHNO_CORE_TIMER 33 +#define INHNO_RAISE 34 + + +/* + * SIC_ISRの割り込みのベクタ番号 + * + * この定義はena_int, dis_intの引数として使う。 + */ + +#define INTNO_PLL 0 +#define INTNO_DMA_ERROR 1 +#define INTNO_PERIPHERAL_ERROR 2 +#define INTNO_RTC 3 +#define INTNO_PPI 4 +#define INTNO_SPORT0_RX 5 +#define INTNO_SPORT0_TX 6 +#define INTNO_SPORT1_RX 7 +#define INTNO_SPORT1_TX 8 +#define INTNO_TWI 9 +#define INTNO_SPI 10 +#define INTNO_UART0_RX 11 +#define INTNO_UART0_TX 12 +#define INTNO_UART1_RX 13 +#define INTNO_UART1_TX 14 +#define INTNO_CAN_RX 15 +#define INTNO_CAN_TX 16 +#define INTNO_MAC_RX 17 +#define INTNO_PORT_H_A 17 +#define INTNO_MAC_TX 18 +#define INTNO_PORT_H_B 18 +#define INTNO_GP_TIMER0 19 +#define INTNO_GP_TIMER1 20 +#define INTNO_GP_TIMER2 21 +#define INTNO_GP_TIMER3 22 +#define INTNO_GP_TIMER4 23 +#define INTNO_GP_TIMER5 24 +#define INTNO_GP_TIMER6 25 +#define INTNO_GP_TIMER7 26 +#define INTNO_PORT_FG_A 27 +#define INTNO_PORT_G_B 28 +#define INTNO_MEMORY_DMA0 29 +#define INTNO_MEMORY_DMA1 30 +#define INTNO_WDG 31 +#define INTNO_PORT_F_B 31 + + + +#ifndef _MACRO_ONLY + +/* +* SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み +* のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので +* その分補正する。 +*/ +void make_priority_mask( void ); + +/* + * ターゲットシステム依存の初期化 + */ +extern void sys_initialize(void); + +/* + * ターゲットシステムの終了 + * + * システムを終了する時に使う.ROMモニタ/GDB STUB呼出しで実現する. + */ +extern void sys_exit(void); + +/* + * ターゲットシステムの文字出力 + * + * システムの低レベルの文字出力ルーチン.ROMモニタ/GDB STUB呼出しで実 + * 現する. + */ +extern void sys_putc(char c); + +/* +* SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み +* のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので +* その分補正する。 +*/ +void make_priority_mask( void ); + +/* + * 割り込みの許可、禁止 + * + */ +typedef unsigned int INTNO; +extern ER ena_int( INTNO intno ); +extern ER dis_int( INTNO intno ); + +/* + * 割り込みマスクの操作 + * + * + */ +typedef unsigned int IMS; +extern ER chg_ims( IMS ims ); +extern ER get_ims( IMS * p_ims ); + +/* + * 割り込みを起こしたデバイスを調べる +*/ +extern void device_dispatcher( unsigned int priority, unsigned int imask ); + + +/** + * スプリアス・イベント・ハンドラ + */ +void spurious_exc_handler(VP p_excinf); +void spurious_int_handler(); + +#endif /* _MACRO_ONLY */ +#endif /* _SYS_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf537/chip_debugboot.c b/uzume_prototype/kernel/config/blackfin/_common_bf537/chip_debugboot.c new file mode 100644 index 0000000..2d55f37 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf537/chip_debugboot.c @@ -0,0 +1,28 @@ +#include "jsp_kernel.h" +#include "sil.h" + + + +/* +* gdbserverがターゲットのリセット機能を提供しないため、gdb経由でターゲット +* にアプリッケーションをダウンロードすると正しく動作しないことがある。 +* このルーチンはターゲットを一度だけリセットする。 +* +* なお、パラメータ debugが FALSEの場合、リセットはしない +*/ +void boot_for_gdb(void) +{ + // RESET_SOFTWARE 0x8000 + if ( enable_boot_for_gdb ){ + enable_boot_for_gdb = 0; /* rebootは一回だけ*/ + *__pSWRST = 0x07; /* 内蔵ペリフェラルのリセット */ + asm volatile( "ssync;" ); + *__pSWRST = 0x00; /* 内蔵ペリフェラルのリセット解除。 */ + asm volatile( "ssync;" ); + *__pSYSCR |= 0x10; /* no boot on core reset */ + asm volatile( "ssync;" ); + asm volatile( "raise 1;" ); /* コアリセット */ + while( 1 ) + ; /*リセットが発生するまでループ*/ + } +} diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf537/chip_defs.h b/uzume_prototype/kernel/config/blackfin/_common_bf537/chip_defs.h new file mode 100644 index 0000000..75eeb22 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf537/chip_defs.h @@ -0,0 +1,150 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +/* + * ターゲットシステムに依存する定義(ADSP-BF534,6,7用) + * + * このインクルードファイルは,kernel.h と sil.h でインクルードされる. + * 他のファイルから直接インクルードすることはない.このファイルをイン + * クルードする前に,t_stddef.h と itron.h がインクルードされるので, + * それらに依存してもよい. + */ + +#ifndef _CHIP_DEFS_H_ +#define _CHIP_DEFS_H_ + + /* チップ共通部略称  jsp/doc/config.txtの 2.(8)を参照 */ +#define _COMMON_BF537 + +/* + * システム依存部用のMMR定義 + */ +#define __PLL_CTL 0xFFC00000 +#define __PLL_DIV 0xFFC00004 + +#define __SWRST 0xFFC00100 +#define __SYSCR 0xFFC00104 +#define __SIC_IMASK 0xFFC0010C +#define __SIC_IAR0 0xFFC00110 +#define __SIC_IAR1 0xFFC00114 +#define __SIC_IAR2 0xFFC00118 +#define __SIC_IAR3 0xFFC0011C +#define __SIC_ISR 0xFFC00120 +#define __SIC_IWR 0xFFC00124 + +#define __TIMER7_CONFIG 0xFFC00670 +#define __TIMER7_COUNTER 0xFFC00674 +#define __TIMER7_PERIOD 0xFFC00678 +#define __TIMER7_WIDTH 0xFFC0067C + +#define __TIMER_ENABLE 0xFFC00680 +#define __TIMER_DISABLE 0xFFC00684 +#define __TIMER_STATUS 0xFFC00688 + +#define __EBIU_SDBCTL 0xFFC00A14 + +#define __PORTF_FER 0xFFC03200 +#define __PORTG_FER 0xFFC03204 +#define __PORTH_FER 0xFFC03208 +#define __PORT_MUX 0xFFC0320C + + +#define __pPLL_CTL ((volatile unsigned short *)__PLL_CTL) +#define __pPLL_DIV ((volatile unsigned short *)__PLL_DIV) + +#define __pSWRST ((volatile unsigned short *)__SWRST) +#define __pSYSCR ((volatile unsigned short *)__SYSCR) +#define __pSIC_IMASK ((volatile unsigned long *)__SIC_IMASK) +#define __pSIC_IAR0 ((volatile unsigned long *)__SIC_IAR0) +#define __pSIC_IAR1 ((volatile unsigned long *)__SIC_IAR1) +#define __pSIC_IAR2 ((volatile unsigned long *)__SIC_IAR2) +#define __pSIC_IAR3 ((volatile unsigned long *)__SIC_IAR2) +#define __pSIC_ISR ((volatile unsigned long *)__SIC_ISR) +#define __pSIC_IWR ((volatile unsigned long *)__SIC_IWR) + +#define __pTIMER7_CONFIG ((volatile unsigned short *)__TIMER7_CONFIG) +#define __pTIMER7_COUNTER ((volatile unsigned long *)__TIMER7_COUNTER) +#define __pTIMER7_PERIOD ((volatile unsigned long *)__TIMER7_PERIOD) +#define __pTIMER7_WIDTH ((volatile unsigned long *)__TIMER7_WIDTH) + +#define __pTIMER_ENABLE ((volatile unsigned short *)__TIMER_ENABLE) +#define __pTIMER_DISABLE ((volatile unsigned short *)__TIMER_DISABLE) +#define __pTIMER_STATUS ((volatile unsigned long *)__TIMER_STATUS) + +#define __pEBIU_SDBCTL ((volatile unsigned short *)__EBIU_SDBCTL) + +#define __pPORTF_FER ((volatile unsigned short *)__PORTF_FER) +#define __pPORTG_FER ((volatile unsigned short *)__PORTG_FER) +#define __pPORTH_FER ((volatile unsigned short *)__PORTH_FER) +#define __pPORT_MUX ((volatile unsigned short *)__PORT_MUX) + + +/* + * タイムティックの定義 + */ +#define TIC_NUME 1u /* タイムティックの周期の分子 */ +#define TIC_DENO 1u /* タイムティックの周期の分母 */ + +/* + * 破壊性読み出しレジスタの判別式 + * 与えられたアドレス iop が破壊性読み出しレジスタの + * 場合には真を返す。 + */ +#ifndef DESTRUCTIVE_READ +#define DESTRUCTIVE_READ( iop ) (iop<(VP)0xF0000000) +#endif + +#ifndef _MACRO_ONLY + +/* + * システムの停止処理 + */ + +Inline void +kernel_abort() +{ +} + +#endif /* _MACRO_ONLY */ +#endif /* _SYS_DEFS_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf537/chip_dump.c b/uzume_prototype/kernel/config/blackfin/_common_bf537/chip_dump.c new file mode 100644 index 0000000..8a51c29 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf537/chip_dump.c @@ -0,0 +1,332 @@ +/** + * \file postmotem533.c + * \brief ADSP-BF533用のポストモーテムダンプルーチン群 + * + * ハードウェアエラー用のハンドラと、例外用のハンドラからなる。いずれも呼び出されるとUARTから + * ポストモーテム出力を表示する。 + */ +#include "jsp_kernel.h" +#include + +/** + * \brief UARTおよび付随するDMAの動作を停止し、すべての割り込みを禁止する。 + * + * 最後にUART_IERをクリアするのは、UART割り込みを禁止すると同時にDMAも禁止するため。 + * UART DMAは、UARTの割り込み線で駆動されているので、割り込みを禁止すればDMAリクエスト + * も停止する。 + * + * UARTの初期化をどうするか悩ましいが、ここではそのまま以前の設定を利用することにする。 + * + * ポストモーテム・ダンプを目的としているので、この状態からの回復は考えない。 + */ +static void pm_occupy_uart() +{ + /* すべてのコア割り込みを禁止する */ + asm( "cli r0;" : : : "R0" ); + + /* すべてのシステム割り込みソースを禁止する */ + *pSIC_IMASK = 0; + + /* UART_IERをディセーブルにすることで、DMAを殺せる */ + *pUART0_IER = 0; +} + +/** + * \brief 一文字出力 + * + * UARTの送信レジスタが空になるのを待って一文字出力する。 + */ +static void pm_putc( unsigned char c ) +{ + + /* THRが空になるまで待つ */ + while ( ! ( *pUART0_LSR & THRE ) ) + ; + + /* THRが空になったら1文字送信 */ + *pUART0_THR = c; +} + +/** + * \brief コンソール入力監視 + * + * UARTの受信レジスタにデータがあれば、読み込む。データが"!"なら真、 + * それ以外なら偽を返す。 + */ +static BOOL is_ready() +{ + /* 受信データはあるか。 */ + if ( *pUART0_LSR & DR ) + + { + char c; + + c= *pUART0_RBR; + if ( c == '!' ) + return TRUE; + } + return FALSE; +} + + +/** + * \brief 文字列出力 + * + * 受け取った文字列をUARTに出力する。 + */ +static void pm_putstr( char * s ) +{ + int i; + + i=0; + while( s[i] ) /* 末端のNULLが現れるまで出力 */ + pm_putc(s[i++]); +} + +/** + * \brief 1バイトをヘキサデシマルで出力する。 + */ +static void pm_puthex1byte( unsigned int data ) +{ + int i; + int nibble; + + /* 8bit内のすべてのニブルを処理 */ + for ( i=0; i<2; i++ ) + { + /* 最上位ニブルを抽出 */ + nibble = ( data >> 4 ) & 0xF; + /* 抽出したニブルを出力 */ + if ( nibble < 10 ) + pm_putc( nibble + '0' ); + else + pm_putc( nibble - 10 + 'A' ); + /* 次のニブル */ + data <<= 4; + } +} + +/* + * \brief 改行記号を出力する + */ +static void pm_putrtn() +{ + pm_putstr("\r\n"); +} + +/** + * \brief 4バイトをヘキサデシマルで出力する。 + */ +static void pm_puthex4byte( unsigned int data ) +{ + int i; + int nibble; + + /* 32bit内のすべてのニブルを処理 */ + for ( i=0; i<8; i++ ) + { + /* 最上位ニブルを抽出 */ + nibble = ( data >> 28 ) & 0xF; + /* 抽出したニブルを出力 */ + if ( nibble < 10 ) + pm_putc( nibble + '0' ); + else + pm_putc( nibble - 10 + 'A' ); + /* 次のニブル */ + data <<= 4; + } + +} + +/** + * \brief 例外フラグ + * + * 例外が発生したときには真、そうでなければ偽。hwei_handler()に例外か否かを伝える。 + * + * GCCが張り切ってlink/unlink命令の位置を最適化するため、hwei_hanlder()の + * 中で性格にfpを手繰れない。そのため、dummyをアクセスすることでlink/unlinkの位置 + * 最適化の抑止を図る役目もある。効果があるかどうかは不明。 + */ +static volatile int expFlag =0; +/** + * \brief ハードウェア・エラー・ハンドラ + * + * ハードウェア・エラー時に呼び出されて、ハードウェア・エラー・割り込みのポストモーテム処理を行う。 + * 最初にFPを手繰って、割り込みのスタックフレームを探す。次にすべての割り込みを禁止し、 + * UART0を占有したあと、ポーリングを使ってスタックに保存された各レジスタのダンプを行う。 + * DEF_INH(INHNO_HW_ERROR, { TA_HLNG, hwei_handler }); + * + */ +void spurious_int_handler() +{ + unsigned int * fp, *ptr ; /* フレーム・ポインタを手繰っていくための変数 */ + unsigned int reg; /* システムレジスタを受け取るための変数 */ + unsigned int imask, sic_imask; /*マスク記録レジスタ*/ + + /* あとで使う */ + imask = *pIMASK; + sic_imask = *pSIC_IMASK; + /* UART0を初期化し、DMAと割り込みを禁止する */ + pm_occupy_uart(); + + while (1) + { + int count = 0; + + pm_putstr( "Type '!' to display post mortem dump" ); pm_putrtn(); + + while ( ! is_ready() ) + { + int i; + for ( i=0; i<100000000; i++) + asm volatile ("nop;"); + if ( count > 30 ) + { + pm_putstr( "Type '!' to display post mortem dump" ); pm_putrtn(); + count = 0; + } + else + count ++; + } + pm_putrtn(); + + + /* 現在の関数のFPを取得する */ + asm ( "%0=fp;" : "=d"((unsigned int)fp) ); + + /* + * この関数を呼び出した関数 ( interrupt_dispatcher ) のFPを取得する。 + * FPは呼び出し関数のFPの格納番地を指していることを利用する + */ + fp = (void *)*fp; + /* + * interrupt_dispatcher を呼び出した関数のFPを取得する。 + * その関数は割り込みハンドラの入り口処理部に他ならない。 + */ + fp = (void *)*fp; + + /* いまや、FPは割り込み受付時の保存されたレジスタ群を指している */ + + /* プッシュされた P0を指す */ + ptr = fp + 2; + /* + * 上位 + * 0 1 2 3 4 5 6 7 8 9 + * ----------------------------------------------- + * 00 P0 RTS FP R0 R1 R2 R3 R4 R5 R6 + * 10 R7 P1 P2 P3 P4 P5 I3 I2 I1 I0 + * 20 M3 M2 M1 M0 B3 B2 B1 B0 L3 L2 + * 30 L1 L0 A0x A0w A1x A1w LC1 LC0 LT1 LT0 + * 40 LB1 LB0 AST RETI + * 下位 + * + */ + if ( expFlag ) + pm_putstr( "Spurious Exception !!" ); + else + pm_putstr( "Spurious Interrupt !!" ); + pm_putrtn(); + + pm_putstr( "Registers On Stack :" ); pm_putrtn(); + pm_putstr( "P0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "RETS " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "FP " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R4 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R5 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R6 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R7 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P4 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P5 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "A0 " ); pm_puthex1byte( *(ptr--) ); pm_putstr( ":" ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "A1 " ); pm_puthex1byte( *(ptr--) ); pm_putstr( ":" ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LC1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LC0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LT1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LT0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LB1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LB0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "ASTAT " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "RETI " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putrtn(); + pm_putstr( "System Registers :" ); pm_putrtn(); + pm_putstr( "SIC_IMASK " ); pm_puthex4byte( sic_imask ); pm_putrtn(); + pm_putstr( "SIC_ISR " ); pm_puthex4byte( *pSIC_ISR ); pm_putrtn(); + pm_putstr( "IMASK " ); pm_puthex4byte( imask ); pm_putrtn(); + pm_putstr( "ILAT " ); pm_puthex4byte( *pILAT ); pm_putrtn(); + pm_putstr( "IPEND " ); pm_puthex4byte( *pIPEND ); pm_putrtn(); + asm( "%0=SEQSTAT;" : "=d"(reg) ); + pm_putstr( "SEQSTAT " ); pm_puthex4byte( reg ); pm_putrtn(); + pm_putstr( " EXCAUSE " ); pm_puthex1byte( reg & 0x3F ); pm_putrtn(); + pm_putstr( " HWERRCAUSE " ); pm_puthex1byte( (reg>>14)&0x1F ); pm_putrtn(); + pm_putstr( "DMA0_IRQ_STATUS " ); pm_puthex4byte( *pDMA0_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA1_IRQ_STATUS " ); pm_puthex4byte( *pDMA1_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA2_IRQ_STATUS " ); pm_puthex4byte( *pDMA2_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA3_IRQ_STATUS " ); pm_puthex4byte( *pDMA3_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA4_IRQ_STATUS " ); pm_puthex4byte( *pDMA4_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA5_IRQ_STATUS " ); pm_puthex4byte( *pDMA5_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA6_IRQ_STATUS " ); pm_puthex4byte( *pDMA6_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA7_IRQ_STATUS " ); pm_puthex4byte( *pDMA7_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA8_IRQ_STATUS " ); pm_puthex4byte( *pDMA8_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA9_IRQ_STATUS " ); pm_puthex4byte( *pDMA9_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA10_IRQ_STATUS " ); pm_puthex4byte( *pDMA10_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA11_IRQ_STATUS " ); pm_puthex4byte( *pDMA11_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_D0_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_D0_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_S0_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_S0_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_D1_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_D1_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_S1_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_S1_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "SPI_STAT " ); pm_puthex4byte( *pSPI_STAT ); pm_putrtn(); + pm_putstr( "PPI_STATUS " ); pm_puthex4byte( *pPPI_STATUS ); pm_putrtn(); + pm_putstr( "SPORT0_STAT " ); pm_puthex4byte( *pSPORT0_STAT ); pm_putrtn(); + pm_putstr( "SPORT1_STAT " ); pm_puthex4byte( *pSPORT1_STAT ); pm_putrtn(); + pm_putstr( "TIMER_STATUS " ); pm_puthex4byte( *pTIMER_STATUS ); pm_putrtn(); + pm_putstr( "EBIU_SDSTAT " ); pm_puthex4byte( *pEBIU_SDSTAT ); pm_putrtn(); + pm_putrtn(); + pm_putstr( "Calling Stack :" ); pm_putrtn(); + + while( fp ) + { + pm_putstr( "Called from " ); pm_puthex4byte( *(fp+1) ); pm_putrtn(); + fp = *fp; + } + } +} + +/** + * \brief CPU例外ハンドラ + * + * CPU例外ハンドラとしてcfgファイルに登録する。 hwei_handler()は呼ばれたら戻ってこないが、 + * そのあとにもexpFlagに値を代入しているのは、最適化によってunlink命令の値がルーチン呼び出しの + * 前に移動することを防ぐためである。 + * + * DEF_EXC(CPUEXC1, { TA_HLNG, excp_handler} ); + * + */ +void spurious_exc_handler(VP p_excinf) +{ + expFlag = TRUE; + spurious_int_handler(); +} + diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf537/chip_mmr.c b/uzume_prototype/kernel/config/blackfin/_common_bf537/chip_mmr.c new file mode 100644 index 0000000..74d7146 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf537/chip_mmr.c @@ -0,0 +1,1117 @@ +/* + * ADSP-BF537の System MMR 定義。アドレスの指定は .ldファイルとの組み合わせで行う。 + * .ldファイルのサンプルは、 config/blackfin/ezkit_bf537を参照。 + * + * アドレスが正しく割り当てられているかは、次の方法で検証した. + * (Makefileの$(OBJCOPY) -R .sysmmr -R .coremmr jsp をコメントアウトすること) + * +$ readelf -s -W jsp | grep mmr | grep -v DUMMY | grep -v blackfin | sort -k 2 | awk '/_mmr/{print $8, $2}' - | sed 's/_mmr//p' | uniq > regelf.txt +$ cat ../jsp/config/blackfin/def_lpblackfin.h ../jsp/config/blackfin/defbf537.h ../jsp/config/blackfin/defbf534.h | grep '0xFF[CE]0' | grep "#define" | sed 's/_MA /_MAP /' - | awk '{print $2,$3}' - | sort -k 2 | sed 's/0x//' - > regdef.txt +$ diff -i -w regelf.txt regdef.txt + +24a25,27 +> RTC_PREN FFC00314 +> UART0_DLL FFC00400 +> UART0_RBR FFC00400 +25a29 +> UART0_DLH FFC00404 +143a148 +> DMA_TCPER FFC00B0C +144a150 +> DMA_TCCNT FFC00B10 +408a415,416 +> UART1_DLL FFC02000 +> UART1_RBR FFC02000 +409a418 +> UART1_DLH FFC02004 +879a889 +> DCPLB_FAULT_STATUS FFE00008 +917a928 +> CODE_FAULT_STATUS FFE01008 +918a930 +> CODE_FAULT_ADDR FFE0100C + * + * つまり、いくつかのレジスタの宣言がELF側から抜けていることになる。ここで、 + * それぞれのレジスタは別のレジスタのエイリアスであることに注目する。 + * RTC_PREN -> RTC_FAST + * UARTx_DLL -> UARTx_THR + * UARTx_RBR -> UARTx_THR + * UARTx_DLH -> UARTx_IER + * DMA_TCPER -> DMA_TC_PER + * DMA_TCCNT -> DMA_TC_CNT + * + * したがって、上の結果は問題ないと言える。 + * + */ + + +volatile unsigned short mmrPLL_CTL __attribute__ ((aligned(4), section("PWRMGMT"))); +volatile unsigned short mmrPLL_DIV __attribute__ ((aligned(4), section("PWRMGMT"))); +volatile unsigned short mmrVR_CTL __attribute__ ((aligned(4), section("PWRMGMT"))); +volatile unsigned short mmrPLL_STAT __attribute__ ((aligned(4), section("PWRMGMT"))); +volatile unsigned short mmrPLL_LOCKCNT __attribute__ ((aligned(4), section("PWRMGMT"))); + + + +volatile unsigned short mmrSWRST __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned short mmrSYSCR __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_RVECT __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IMASK __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IAR0 __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IAR1 __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IAR2 __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IAR3 __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_ISR __attribute__ ((aligned(4), section("SYSRST"))); +volatile unsigned long mmrSIC_IWR __attribute__ ((aligned(4), section("SYSRST"))); + + + +volatile unsigned short mmrWDOG_CTL __attribute__ ((aligned(4), section("WDOG"))); +volatile unsigned long mmrWDOG_CNT __attribute__ ((aligned(4), section("WDOG"))); +volatile unsigned long mmrWDOG_STAT __attribute__ ((aligned(4), section("WDOG"))); + + + +volatile unsigned long mmrRTC_STAT __attribute__ ((aligned(4), section("RTC"))); +volatile unsigned short mmrRTC_ICTL __attribute__ ((aligned(4), section("RTC"))); +volatile unsigned short mmrRTC_ISTAT __attribute__ ((aligned(4), section("RTC"))); +volatile unsigned short mmrRTC_SWCNT __attribute__ ((aligned(4), section("RTC"))); +volatile unsigned long mmrRTC_ALARM __attribute__ ((aligned(4), section("RTC"))); +volatile unsigned short mmrRTC_FAST __attribute__ ((aligned(4), section("RTC"))); + + + +volatile unsigned short mmrUART0_THR __attribute__ ((aligned(4), section("UART0"))); +volatile unsigned short mmrUART0_IER __attribute__ ((aligned(4), section("UART0"))); +volatile unsigned short mmrUART0_IIR __attribute__ ((aligned(4), section("UART0"))); +volatile unsigned short mmrUART0_LCR __attribute__ ((aligned(4), section("UART0"))); +volatile unsigned short mmrUART0_MCR __attribute__ ((aligned(4), section("UART0"))); +volatile unsigned short mmrUART0_LSR __attribute__ ((aligned(4), section("UART0"))); +volatile unsigned short mmrUART0_MSR __attribute__ ((aligned(4), section("UART0"))); +volatile unsigned short mmrUART0_SCR __attribute__ ((aligned(4), section("UART0"))); +volatile unsigned short mmrUART0_DUMMY0 __attribute__ ((aligned(4), section("UART0"))); +volatile unsigned short mmrUART0_GCTL __attribute__ ((aligned(4), section("UART0"))); + + + +volatile unsigned short mmrSPI_CTL __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_FLG __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_STAT __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_TDBR __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_RDBR __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_BAUD __attribute__ ((aligned(4), section("SPI"))); +volatile unsigned short mmrSPI_SHADOW __attribute__ ((aligned(4), section("SPI"))); + + + +volatile unsigned short mmrTIMER0_CONFIG __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER0_COUNTER __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER0_PERIOD __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER0_WIDTH __attribute__ ((aligned(4), section("TIMER"))); + +volatile unsigned short mmrTIMER1_CONFIG __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER1_COUNTER __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER1_PERIOD __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER1_WIDTH __attribute__ ((aligned(4), section("TIMER"))); + +volatile unsigned short mmrTIMER2_CONFIG __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER2_COUNTER __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER2_PERIOD __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER2_WIDTH __attribute__ ((aligned(4), section("TIMER"))); + +volatile unsigned short mmrTIMER3_CONFIG __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER3_COUNTER __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER3_PERIOD __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER3_WIDTH __attribute__ ((aligned(4), section("TIMER"))); + +volatile unsigned short mmrTIMER4_CONFIG __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER4_COUNTER __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER4_PERIOD __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER4_WIDTH __attribute__ ((aligned(4), section("TIMER"))); + +volatile unsigned short mmrTIMER5_CONFIG __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER5_COUNTER __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER5_PERIOD __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER5_WIDTH __attribute__ ((aligned(4), section("TIMER"))); + +volatile unsigned short mmrTIMER6_CONFIG __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER6_COUNTER __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER6_PERIOD __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER6_WIDTH __attribute__ ((aligned(4), section("TIMER"))); + +volatile unsigned short mmrTIMER7_CONFIG __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER7_COUNTER __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER7_PERIOD __attribute__ ((aligned(4), section("TIMER"))); +volatile unsigned long mmrTIMER7_WIDTH __attribute__ ((aligned(4), section("TIMER"))); + +volatile unsigned short mmrTIMER_ENABLE __attribute__ ((aligned(4), section("TMRCTL"))); +volatile unsigned short mmrTIMER_DISABLE __attribute__ ((aligned(4), section("TMRCTL"))); +volatile unsigned long mmrTIMER_STATUS __attribute__ ((aligned(4), section("TMRCTL"))); + + + +volatile unsigned short mmrPORTFIO __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_CLEAR __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_SET __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_TOGGLE __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_MASKA __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_MASKA_CLEAR __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_MASKA_SET __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_MASKA_TOGGLE __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_MASKB __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_MASKB_CLEAR __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_MASKB_SET __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_MASKB_TOGGLE __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_DIR __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_POLAR __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_EDGE __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_BOTH __attribute__ ((aligned(4), section("FLAGF"))); +volatile unsigned short mmrPORTFIO_INEN __attribute__ ((aligned(4), section("FLAGF"))); + + + +volatile unsigned short mmrSPORT0_TCR1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_TCR2 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_TCLKDIV __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_TFSDIV __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_TX __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_DUMMY0 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_RX __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_DUMMY1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_RCR1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_RCR2 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_RCLKDIV __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_RFSDIV __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_STAT __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_CHNL __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_MCMC1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned short mmrSPORT0_MCMC2 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MTCS0 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MTCS1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MTCS2 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MTCS3 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MRCS0 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MRCS1 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MRCS2 __attribute__ ((aligned(4), section("SPORT0"))); +volatile unsigned long mmrSPORT0_MRCS3 __attribute__ ((aligned(4), section("SPORT0"))); + + + +volatile unsigned short mmrSPORT1_TCR1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_TCR2 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_TCLKDIV __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_TFSDIV __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_TX __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_DUMMY0 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_RX __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_DUMMY1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_RCR1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_RCR2 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_RCLKDIV __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_RFSDIV __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_STAT __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_CHNL __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_MCMC1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned short mmrSPORT1_MCMC2 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MTCS0 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MTCS1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MTCS2 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MTCS3 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MRCS0 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MRCS1 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MRCS2 __attribute__ ((aligned(4), section("SPORT1"))); +volatile unsigned long mmrSPORT1_MRCS3 __attribute__ ((aligned(4), section("SPORT1"))); + + + +volatile unsigned short mmrEBIU_AMGCTL __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned long mmrEBIU_AMBCTL0 __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned long mmrEBIU_AMBCTL1 __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned short mmrEBIU_DUMMY __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned long mmrEBIU_SDGCTL __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned short mmrEBIU_SDBCTL __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned short mmrEBIU_SDRRC __attribute__ ((aligned(4), section("EBIU"))); +volatile unsigned short mmrEBIU_SDSTAT __attribute__ ((aligned(4), section("EBIU"))); + + + +volatile unsigned short mmrDMA_TC_DUMMY0 __attribute__ ((aligned(4), section("DMATC"))); +volatile unsigned short mmrDMA_TC_DUMMY1 __attribute__ ((aligned(4), section("DMATC"))); +volatile unsigned short mmrDMA_TC_DUMMY3 __attribute__ ((aligned(4), section("DMATC"))); +volatile unsigned short mmrDMA_TC_PER __attribute__ ((aligned(4), section("DMATC"))); +volatile unsigned short mmrDMA_TC_CNT __attribute__ ((aligned(4), section("DMATC"))); + + + +volatile void * volatile mmrDMA0_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA0_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA0_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA0_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA0_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA0_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA0_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA1_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA1_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA1_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA1_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA1_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA1_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA1_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA2_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA2_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA2_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA2_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA2_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA2_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA2_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA3_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA3_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA3_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA3_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA3_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA3_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA3_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA4_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA4_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA4_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA4_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA4_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA4_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA4_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA5_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA5_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA5_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA5_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA5_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA5_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA5_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA6_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA6_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA6_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA6_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA6_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA6_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA6_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA7_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA7_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA7_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA7_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA7_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA7_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA7_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA8_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA8_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA8_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA8_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA8_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA8_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA8_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA8_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA8_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA8_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA8_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA8_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA8_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA8_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA8_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA8_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA9_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA9_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA9_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA9_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA9_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA9_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA9_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA9_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA9_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA9_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA9_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA9_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA9_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA9_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA9_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA9_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA10_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA10_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA10_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA10_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA10_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA10_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA10_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA10_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA10_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA10_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA10_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA10_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA10_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA10_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA10_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA10_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrDMA11_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA11_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA11_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA11_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA11_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA11_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA11_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrDMA11_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA11_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrDMA11_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA11_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA11_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA11_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA11_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA11_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrDMA11_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrMDMA_D0_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D0_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_D0_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_D0_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D0_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D0_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D0_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrMDMA_S0_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S0_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_S0_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_S0_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S0_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S0_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S0_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrMDMA_D1_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D1_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_D1_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_D1_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D1_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_D1_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_D1_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + +volatile void * volatile mmrMDMA_S1_NEXT_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S1_START_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_CONFIG __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_DUMMY0 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_S1_X_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile signed short mmrMDMA_S1_Y_MODIFY __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S1_CURR_DESC_PTR __attribute__ ((aligned(4), section("DMA"))); +volatile void * volatile mmrMDMA_S1_CURR_ADDR __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_IRQ_STATUS __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_PERIPHERAL_MAP __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_CURR_X_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_DUMMY1 __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_CURR_Y_COUNT __attribute__ ((aligned(4), section("DMA"))); +volatile unsigned short mmrMDMA_S1_DUMMY2 __attribute__ ((aligned(4), section("DMA"))); + + +volatile unsigned short mmrPPI_CONTROL __attribute__ ((aligned(4), section("PPI"))); +volatile unsigned short mmrPPI_STATUS __attribute__ ((aligned(4), section("PPI"))); +volatile unsigned short mmrPPI_COUNT __attribute__ ((aligned(4), section("PPI"))); +volatile unsigned short mmrPPI_DELAY __attribute__ ((aligned(4), section("PPI"))); +volatile unsigned short mmrPPI_FRAME __attribute__ ((aligned(4), section("PPI"))); + + +volatile unsigned short mmrTWI_CLKDIV __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_CONTROL __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_SLAVE_CTL __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_SLAVE_STAT __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_SLAVE_ADDR __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_MASTER_CTL __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_MASTER_STAT __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_MASTER_ADDR __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_INT_STAT __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_INT_MASK __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_FIFO_CTL __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_FIFO_STAT __attribute__ ((aligned(4), section("TWI"))); +volatile unsigned short mmrTWI_XMT_DATA8 __attribute__ ((aligned(4), section("TWIDATA"))); +volatile unsigned short mmrTWI_XMT_DATA16 __attribute__ ((aligned(4), section("TWIDATA"))); +volatile unsigned short mmrTWI_RCV_DATA8 __attribute__ ((aligned(4), section("TWIDATA"))); +volatile unsigned short mmrTWI_RCV_DATA16 __attribute__ ((aligned(4), section("TWIDATA"))); + + + +volatile unsigned short mmrPORTGIO __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_CLEAR __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_SET __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_TOGGLE __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_MASKA __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_MASKA_CLEAR __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_MASKA_SET __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_MASKA_TOGGLE __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_MASKB __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_MASKB_CLEAR __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_MASKB_SET __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_MASKB_TOGGLE __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_DIR __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_POLAR __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_EDGE __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_BOTH __attribute__ ((aligned(4), section("FLAGG"))); +volatile unsigned short mmrPORTGIO_INEN __attribute__ ((aligned(4), section("FLAGG"))); + + + +volatile unsigned short mmrPORTHIO __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_CLEAR __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_SET __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_TOGGLE __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_MASKA __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_MASKA_CLEAR __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_MASKA_SET __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_MASKA_TOGGLE __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_MASKB __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_MASKB_CLEAR __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_MASKB_SET __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_MASKB_TOGGLE __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_DIR __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_POLAR __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_EDGE __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_BOTH __attribute__ ((aligned(4), section("FLAGH"))); +volatile unsigned short mmrPORTHIO_INEN __attribute__ ((aligned(4), section("FLAGH"))); + + + +volatile unsigned short mmrUART1_THR __attribute__ ((aligned(4), section("UART1"))); +volatile unsigned short mmrUART1_IER __attribute__ ((aligned(4), section("UART1"))); +volatile unsigned short mmrUART1_IIR __attribute__ ((aligned(4), section("UART1"))); +volatile unsigned short mmrUART1_LCR __attribute__ ((aligned(4), section("UART1"))); +volatile unsigned short mmrUART1_MCR __attribute__ ((aligned(4), section("UART1"))); +volatile unsigned short mmrUART1_LSR __attribute__ ((aligned(4), section("UART1"))); +volatile unsigned short mmrUART1_MSR __attribute__ ((aligned(4), section("UART1"))); +volatile unsigned short mmrUART1_SCR __attribute__ ((aligned(4), section("UART1"))); +volatile unsigned short mmrUART1_DUMMY0 __attribute__ ((aligned(4), section("UART1"))); +volatile unsigned short mmrUART1_GCTL __attribute__ ((aligned(4), section("UART1"))); + + + + +volatile unsigned short mmrCAN_MC1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_MD1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_TRS1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_TRR1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_TA1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_AA1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_RMP1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_RML1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_MBTIF1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_MBRIF1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_MBIM1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_RFH1 __attribute__ ((aligned(4), section("CANCTL0"))); +volatile unsigned short mmrCAN_OPSS1 __attribute__ ((aligned(4), section("CANCTL0"))); + + +volatile unsigned short mmrCAN_MC2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_MD2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_TRS2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_TRR2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_TA2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_AA2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_RMP2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_RML2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_MBTIF2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_MBRIF2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_MBIM2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_RFH2 __attribute__ ((aligned(4), section("CANCTL1"))); +volatile unsigned short mmrCAN_OPSS2 __attribute__ ((aligned(4), section("CANCTL1"))); + +volatile unsigned short mmrCAN_CLOCK __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_TIMING __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_DEBUG __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_STATUS __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_CEC __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_GIS __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_GIM __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_GIF __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_CONTROL __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_INTR __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_DUMMY0 __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_MBTD __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_EWR __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_ESR __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_DUMMY1 __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_DUMMY2 __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_UCREG __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_UCCNT __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_UCRC __attribute__ ((aligned(4), section("CANCTL2"))); +volatile unsigned short mmrCAN_UCCNF __attribute__ ((aligned(4), section("CANCTL2"))); + + +volatile unsigned short mmrCAN_AM00L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM00H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM01L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM01H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM02L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM02H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM03L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM03H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM04L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM04H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM05L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM05H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM06L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM06H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM07L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM07H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM08L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM08H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM09L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM09H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM10L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM10H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM11L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM11H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM12L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM12H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM13L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM13H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM14L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM14H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM15L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM15H __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_AM16L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM16H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM17L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM17H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM18L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM18H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM19L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM19H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM20L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM20H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM21L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM21H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM22L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM22H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM23L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM23H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM24L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM24H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM25L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM25H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM26L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM26H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM27L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM27H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM28L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM28H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM29L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM29H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM30L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM30H __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM31L __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_AM31H __attribute__ ((aligned(4), section("CANMBX"))); + + +volatile unsigned short mmrCAN_MB00_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB00_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB00_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB00_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB00_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB00_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB00_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB00_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB01_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB01_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB01_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB01_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB01_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB01_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB01_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB01_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB02_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB02_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB02_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB02_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB02_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB02_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB02_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB02_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB03_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB03_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB03_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB03_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB03_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB03_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB03_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB03_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB04_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB04_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB04_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB04_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB04_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB04_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB04_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB04_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB05_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB05_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB05_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB05_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB05_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB05_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB05_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB05_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB06_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB06_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB06_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB06_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB06_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB06_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB06_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB06_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB07_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB07_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB07_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB07_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB07_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB07_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB07_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB07_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB08_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB08_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB08_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB08_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB08_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB08_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB08_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB08_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB09_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB09_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB09_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB09_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB09_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB09_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB09_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB09_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB10_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB10_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB10_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB10_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB10_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB10_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB10_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB10_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB11_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB11_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB11_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB11_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB11_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB11_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB11_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB11_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB12_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB12_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB12_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB12_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB12_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB12_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB12_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB12_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB13_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB13_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB13_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB13_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB13_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB13_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB13_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB13_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB14_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB14_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB14_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB14_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB14_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB14_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB14_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB14_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB15_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB15_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB15_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB15_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB15_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB15_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB15_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB15_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB16_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB16_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB16_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB16_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB16_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB16_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB16_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB16_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB17_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB17_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB17_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB17_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB17_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB17_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB17_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB17_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB18_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB18_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB18_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB18_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB18_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB18_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB18_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB18_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB19_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB19_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB19_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB19_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB19_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB19_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB19_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB19_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB20_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB20_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB20_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB20_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB20_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB20_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB20_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB20_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB21_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB21_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB21_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB21_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB21_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB21_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB21_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB21_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB22_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB22_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB22_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB22_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB22_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB22_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB22_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB22_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB23_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB23_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB23_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB23_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB23_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB23_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB23_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB23_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB24_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB24_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB24_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB24_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB24_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB24_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB24_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB24_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB25_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB25_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB25_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB25_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB25_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB25_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB25_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB25_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB26_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB26_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB26_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB26_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB26_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB26_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB26_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB26_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB27_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB27_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB27_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB27_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB27_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB27_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB27_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB27_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB28_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB28_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB28_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB28_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB28_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB28_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB28_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB28_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB29_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB29_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB29_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB29_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB29_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB29_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB29_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB29_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB30_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB30_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB30_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB30_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB30_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB30_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB30_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB30_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + +volatile unsigned short mmrCAN_MB31_DATA0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB31_DATA1 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB31_DATA2 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB31_DATA3 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB31_LENGTH __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB31_TIMESTAMP __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB31_ID0 __attribute__ ((aligned(4), section("CANMBX"))); +volatile unsigned short mmrCAN_MB31_ID1 __attribute__ ((aligned(4), section("CANMBX"))); + + +volatile unsigned short mmrPORTF_FER __attribute__ ((aligned(4), section("PORTFER"))); +volatile unsigned short mmrPORTG_FER __attribute__ ((aligned(4), section("PORTFER"))); +volatile unsigned short mmrPORTH_FER __attribute__ ((aligned(4), section("PORTFER"))); +volatile unsigned short mmrPORT_MUX __attribute__ ((aligned(4), section("PORTFER"))); + +volatile unsigned short mmrHMDMA0_CONTROL __attribute__ ((aligned(4), section("HDMA0"))); +volatile unsigned short mmrHMDMA0_ECINIT __attribute__ ((aligned(4), section("HDMA0"))); +volatile unsigned short mmrHMDMA0_BCINIT __attribute__ ((aligned(4), section("HDMA0"))); +volatile unsigned short mmrHMDMA0_ECURGENT __attribute__ ((aligned(4), section("HDMA0"))); +volatile unsigned short mmrHMDMA0_ECOVERFLOW __attribute__ ((aligned(4), section("HDMA0"))); +volatile unsigned short mmrHMDMA0_ECOUNT __attribute__ ((aligned(4), section("HDMA0"))); +volatile unsigned short mmrHMDMA0_BCOUNT __attribute__ ((aligned(4), section("HDMA0"))); + +volatile unsigned short mmrHMDMA1_CONTROL __attribute__ ((aligned(4), section("HDMA1"))); +volatile unsigned short mmrHMDMA1_ECINIT __attribute__ ((aligned(4), section("HDMA1"))); +volatile unsigned short mmrHMDMA1_BCINIT __attribute__ ((aligned(4), section("HDMA1"))); +volatile unsigned short mmrHMDMA1_ECURGENT __attribute__ ((aligned(4), section("HDMA1"))); +volatile unsigned short mmrHMDMA1_ECOVERFLOW __attribute__ ((aligned(4), section("HDMA1"))); +volatile unsigned short mmrHMDMA1_ECOUNT __attribute__ ((aligned(4), section("HDMA1"))); +volatile unsigned short mmrHMDMA1_BCOUNT __attribute__ ((aligned(4), section("HDMA1"))); + + +volatile unsigned long mmrEMAC_OPMODE __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_ADDRLO __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_ADDRHI __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_HASHLO __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_HASHHI __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_STAADD __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_STADAT __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_FLC __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_VLAN1 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_VLAN2 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_DUMMY0 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_WKUP_CTL __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK0 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK1 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK2 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK3 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_WKUP_FFCMD __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_WKUP_FFOFF __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_WKUP_FFCRC0 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_WKUP_FFCRC1 __attribute__ ((aligned(4), section("EMAC"))); + +volatile unsigned long mmrEMAC_DUMMY1 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_DUMMY2 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_DUMMY3 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_DUMMY4 __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_SYSCTL __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_SYSTAT __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_RX_STAT __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_RX_STKY __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_RX_IRQE __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_TX_STAT __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_TX_STKY __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_TX_IRQE __attribute__ ((aligned(4), section("EMAC"))); + +volatile unsigned long mmrEMAC_MMC_CTL __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_MMC_RIRQS __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_MMC_RIRQE __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_MMC_TIRQS __attribute__ ((aligned(4), section("EMAC"))); +volatile unsigned long mmrEMAC_MMC_TIRQE __attribute__ ((aligned(4), section("EMAC"))); + + +volatile unsigned long mmrEMAC_RXC_OK __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_FCS __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_ALIGN __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_OCTET __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_DMAOVF __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_UNICST __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_MULTI __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_BROAD __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_LNERRI __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_LNERRO __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_LONG __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_MACCTL __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_OPCODE __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_PAUSE __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_ALLFRM __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_ALLOCT __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_TYPED __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_SHORT __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_EQ64 __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_LT128 __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_LT256 __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_LT512 __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_LT1024 __attribute__ ((aligned(4), section("EMACR"))); +volatile unsigned long mmrEMAC_RXC_GE1024 __attribute__ ((aligned(4), section("EMACR"))); + +volatile unsigned long mmrEMAC_TXC_OK __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_1COL __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_GT1COL __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_OCTET __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_DEFER __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_LATECL __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_XS_COL __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_DMAUND __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_CRSERR __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_UNICST __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_MULTI __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_BROAD __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_XS_DFR __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_MACCTL __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_ALLFRM __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_ALLOCT __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_EQ64 __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_LT128 __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_LT256 __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_LT512 __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_LT1024 __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_GE1024 __attribute__ ((aligned(4), section("EMACT"))); +volatile unsigned long mmrEMAC_TXC_ABORT __attribute__ ((aligned(4), section("EMACT"))); + diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf537/hw_serial.cfg b/uzume_prototype/kernel/config/blackfin/_common_bf537/hw_serial.cfg new file mode 100644 index 0000000..c55da13 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf537/hw_serial.cfg @@ -0,0 +1,6 @@ +/* + * SIOドライバ(ADSP-BF537用)のコンフィギュレーションファイル + */ +INCLUDE("\"hw_serial.h\""); +DEF_INH(INHNO_SIO0_RX, { TA_HLNG, sio0_rx_handler }); +DEF_INH(INHNO_SIO0_TX, { TA_HLNG, sio0_tx_handler }); diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf537/hw_serial.h b/uzume_prototype/kernel/config/blackfin/_common_bf537/hw_serial.h new file mode 100644 index 0000000..ab0ebcb --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf537/hw_serial.h @@ -0,0 +1,156 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + */ + +/* + * シリアルI/Oデバイス(SIO)ドライバ(Blackfin UART用) + * + * このファイルは、TOPPERS/JSP 1.4.2の config/sh3/ms7727cp01/hw_serial.hを + * リネームし、内部の識別子を変更したものである。 + * + * このファイルは下位のデバイス・アクセス・ルーチンを束ねて上位の層に渡す + * ためのものである。Blackfinの外部にあるシリアルをTOPPERS/JSPで管理しない + * のなら、変更する必要はない。 + */ + +#ifndef _HW_SERIAL_H_ +#define _HW_SERIAL_H_ + +#include +#include + +#include "uart.h" + + +/* + * SIOドライバの初期化ルーチン + */ +#define sio_initialize uart_initialize + +#ifndef _MACRO_ONLY +/* + * シリアルI/Oポートのオープン + */ +Inline SIOPCB * +sio_opn_por(ID siopid, VP_INT exinf) +{ + SIOPCB *siopcb; + UW regBase; + + /* + * デバイス依存のオープン処理. + */ + siopcb = uart_opn_por(siopid, exinf); + + /* + * Enable Corrensponding Interrupt at IMASK + */ + regBase = siopcb->siopinib->reg_base; + if ( regBase == UART0_ADDRESS ) { // UART0の場合 + ena_int( INTNO_UART0_TX ); + ena_int( INTNO_UART0_RX ); + *__pPORT_MUX &= ~0x0008; // 機能をUART0に割り振る + *__pPORTF_FER |= 0x0003; // PF0,PF1をUART0に割り振る + } + else if ( regBase == UART1_ADDRESS ){ // uart1の場合 + ena_int( INTNO_UART1_TX ); + ena_int( INTNO_UART1_RX ); + *__pPORT_MUX &= ~0x0010; // 機能をUART0に割り振る + *__pPORTF_FER |= 0x000C; // PF2,PF3をUART0に割り振る + } + + return(siopcb); +} + +/* + * シリアルI/Oポートのクローズ + */ +Inline void +sio_cls_por(SIOPCB *siopcb) +{ + /* + * ここではSIC_IMASKの対応ビットをクリアしない。SIC_IMASKのクリアは + * 危険である。UARTからの割り込みは uart_cls_por内部で禁止するので + * 充分である。 + */ + + /* + * デバイス依存のクローズ処理. + */ + uart_cls_por(siopcb); +} + + +/* + * SIOの割込みハンドラ + */ +#define sio0_rx_handler uart0_rx_isr +#define sio0_tx_handler uart0_tx_isr +#define sio1_rx_handler uart1_rx_isr +#define sio1_tx_handler uart1_tx_isr + +/* + * シリアルI/Oポートへの文字送信 + */ +#define sio_snd_chr uart_snd_chr + +/* + * シリアルI/Oポートからの文字受信 + */ +#define sio_rcv_chr uart_rcv_chr + +/* + * シリアルI/Oポートからのコールバックの許可 + */ +#define sio_ena_cbr uart_ena_cbr + +/* + * シリアルI/Oポートからのコールバックの禁止 + */ +#define sio_dis_cbr uart_dis_cbr + +/* + * シリアルI/Oポートからの送信可能コールバック + */ +#define sio_ierdy_snd uart_ierdy_snd + +/* + * シリアルI/Oポートからの受信通知コールバック + */ +#define sio_ierdy_rcv uart_ierdy_rcv + +#endif /* _MACRO_ONLY */ +#endif /* _HW_SERIAL_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf537/hw_timer.h b/uzume_prototype/kernel/config/blackfin/_common_bf537/hw_timer.h new file mode 100644 index 0000000..ee8741d --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf537/hw_timer.h @@ -0,0 +1,169 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)縲鰀(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + +/* + * タイマドライバ(ADSP-BF537用) + * + */ + +#ifndef _HW_TIMER_H_ +#define _HW_TIMER_H_ + +#include +#include "sil.h" + +#ifndef _MACRO_ONLY + + + +//#include + + + + +/************************************************************** + * タイマの起動処理 + * + * タイマを初期化し,周期的なタイマ割込み要求を発生させる. + * + **************************************************************/ +Inline void +hw_timer_initialize() +{ +#ifdef USE_TIC_CORE + // Core timer + // TCNTL bit assignement + // TMPWR 0x00000001 + // TMREN 0x00000002 + // TAUTORLD 0x00000004 + // TINT 0x00000008 + *__pTCNTL = 0x00000001; // TMPWR : power up timer; + *__pTPERIOD = CORECLOCK/1000; // CORE CLOCK is defined in sys_config.h + *__pTCNTL = 0x00000007; // TMPWR | TMREN | TAUTORLD; +#else + // GPT7(General-purpose timer7) + // PWM_OUT 0x0001 + // WDTH_CAP 0x0002 + // EXT_CLK 0x0003 + // PULSE_HI 0x0004 + // PERIOD_CNT 0x0008 + // IRQ_ENA 0x0010 + // TIN_SEL 0x0020 + // OUT_DIS 0x0040 + // CLK_SEL 0x0080 + // TOGGLE_HI 0x0100 + // EMU_RUN 0x0200 + // ERR_TYP 0xC000 + *__pTIMER7_CONFIG = 0x0059;// PERIOD_CNT | OUT_DIS |IRQ_ENA | PWM_OUT; // PWM_OUT, Output Pad disable + *__pTIMER7_PERIOD = SYSCLOCK/1000; // SYS CLOCK is defined in sys_config.h + *__pTIMER7_WIDTH = 1; // 0 < width < period + // TIMEN0 0x0001 + // TIMEN1 0x0002 + // TIMEN2 0x0004 + // TIMEN3 0x0008 + // TIMEN4 0x0010 + // TIMEN5 0x0020 + // TIMEN6 0x0040 + // TIMEN7 0x0080 + *__pTIMER_ENABLE = 0x0080; //TIMEN7; // timer7 start + ena_int( INHNO_TIMER ); // enable Timer Interrupt + +#endif + asm("ssync;"); + +} + +/************************************************************** + * タイマ割込み要求のクリア + **************************************************************/ +Inline void +hw_timer_int_clear() +{ +#ifdef USE_TIC_CORE + // Core timer + // TCNTL bit assignement + // TMPWR 0x00000001 + // TMREN 0x00000002 + // TAUTORLD 0x00000004 + // TINT 0x00000008 + /* TINTはW1Cではないので、TINTのTINTビットは0を書き込む */ + *__pTCNTL = 0x00000007; // TMPWR | TMREN | TAUTORLD; +#else + // GPT7(General-purpose timer7) + // TIMIL7 0x00080000 + *__pTIMER_STATUS = 0x00080000; // TIMIL7; +#endif + asm("ssync;"); +} + +/************************************************************** + * タイマの停止処理 + * + * タイマの動作を停止させる. + **************************************************************/ +Inline void +hw_timer_terminate() +{ + /* + * タイマの動作を停止する. + */ +#ifdef USE_TIC_CORE + // Core timer + // TCNTL bit assignement + // TMPWR 0x00000001 + // TMREN 0x00000002 + // TAUTORLD 0x00000004 + // TINT 0x00000008 + *__pTCNTL = 0x00000005; //TMPWR | TAUTORLD | TINT; // 停止 + *__pTCNTL = 0; // パワーダウンモード +#else + // GPT2(General-purpose timer7) + // TIMDIS7 0x0080 + *__pTIMER_DISABLE = 0x0080; // TIMDIS7; // timer7 disable +#endif + asm("ssync;"); +} + + +#endif /* _MACRO_ONLY */ +#endif /* _HW_TIMER_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf537/sys_rename.def b/uzume_prototype/kernel/config/blackfin/_common_bf537/sys_rename.def new file mode 100644 index 0000000..6b882a6 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf537/sys_rename.def @@ -0,0 +1,6 @@ +make_priority_mask +device_dispatcher +boot_for_gdb +siopinib_table +sprious_int_handler +sprious_exp_handler diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf537/sys_rename.h b/uzume_prototype/kernel/config/blackfin/_common_bf537/sys_rename.h new file mode 100644 index 0000000..5c47631 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf537/sys_rename.h @@ -0,0 +1,27 @@ +/* This file is generated from sys_rename.def by genrename. */ + +#ifndef _SYS_RENAME_H_ +#define _SYS_RENAME_H_ + +#define make_priority_mask _kernel_make_priority_mask +#define device_dispatcher _kernel_device_dispatcher +#define boot_for_gdb _kernel_boot_for_gdb +#define siopinib_table _kernel_siopinib_table +#define sprious_int_handler _kernel_sprious_int_handler +#define sprious_exp_handler _kernel_sprious_exp_handler + + + + + +#ifdef LABEL_ASM + +#define _make_priority_mask __kernel_make_priority_mask +#define _device_dispatcher __kernel_device_dispatcher +#define _boot_for_gdb __kernel_boot_for_gdb +#define _siopinib_table __kernel_siopinib_table +#define _sprious_int_handler __kernel_sprious_int_handler +#define _sprious_exp_handler __kernel_sprious_exp_handler + +#endif /* LABEL_ASM */ +#endif /* _SYS_RENAME_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf537/sys_unrename.h b/uzume_prototype/kernel/config/blackfin/_common_bf537/sys_unrename.h new file mode 100644 index 0000000..ee9dd28 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf537/sys_unrename.h @@ -0,0 +1,23 @@ +/* This file is generated from sys_rename.def by genrename. */ + +#ifdef _SYS_UNRENAME_H_ +#undef _SYS_UNRENAME_H_ + +#undef make_priority_mask +#undef device_dispatcher +#undef boot_for_gdb +#undef siopinib_table +#undef sprious_int_handler +#undef sprious_exp_handler + +#ifdef LABEL_ASM + +#undef _make_priority_mask +#undef _device_dispatcher +#undef _boot_for_gdb +#undef _siopinib_table +#undef _sprious_int_handler +#undef _sprious_exp_handler + +#endif /* LABEL_ASM */ +#endif /* _SYS_UNRENAME_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf548/bf548elf.ld b/uzume_prototype/kernel/config/blackfin/_common_bf548/bf548elf.ld new file mode 100644 index 0000000..2d56d43 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf548/bf548elf.ld @@ -0,0 +1,410 @@ + +OUTPUT_FORMAT("elf32-bfin","elf32-bfin","elf32-bfin") +OUTPUT_ARCH(bfin) + +PROVIDE (ldf_stack_end = 0xffb00FFC ) ; +PROVIDE (hardware_init_hook = 0) ; +PROVIDE (software_init_hook = 0) ; +PROVIDE (software_term_hook = 0) ; +PROVIDE (__kernel_boot_for_gdb = 0); + +ENTRY (start); + +MEMORY + { + MEM_SDRAM (XW) : ORIGIN = 0x00000000, LENGTH = 256M + MEM_ASYNC_0 (XW) : ORIGIN = 0x20000000, LENGTH = 1M + MEM_ASYNC_1 (XW) : ORIGIN = 0x20100000, LENGTH = 1M + MEM_ASYNC_2 (XW) : ORIGIN = 0x20200000, LENGTH = 1M + MEM_ASYNC_3 (XW) : ORIGIN = 0x20300000, LENGTH = 1M + + MEM_L1_DATA_A (W!X) : ORIGIN = 0xff800000, LENGTH = 32K + MEM_L1_DATA_B (W!X) : ORIGIN = 0xff900000, LENGTH = 16K /* BF548のバンクBは32kBだが、キャッシュ用に16kBあけておく */ + MEM_L1_CODE (XR) : ORIGIN = 0xffa00000, LENGTH = 48K + MEM_L1_INST_C (XR) : ORIGIN = 0xffa10000, LENGTH = 16K + MEM_L1_ROM (XR) : ORIGIN = 0xffa14000, LENGTH = 64K + MEM_L1_SCRATCH (W!X) : ORIGIN = 0xffb00000, LENGTH = 4K + + MEM_L2_SRAM : ORIGIN = 0xfeb00000, LENGTH = 128K + + MEM_SYSMMR (W!X) : ORIGIN = 0xffc00000, LENGTH = 2M + MEM_COREMMR (W!X) : ORIGIN = 0xffe00000, LENGTH = 2M + } + +SECTIONS +{ + +/* Read-only sections, merged into text segment: */ + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } + .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } + .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } + .rel.data.rel.ro : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) } + .rela.data.rel.ro : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) } + .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } + .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } + .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } + .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } + .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } + .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.sdata : { *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*) } + .rela.sdata : { *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*) } + .rel.sbss : { *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*) } + .rela.sbss : { *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*) } + .rel.sdata2 : { *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*) } + .rela.sdata2 : { *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*) } + .rel.sbss2 : { *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*) } + .rela.sbss2 : { *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*) } + .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } + .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + .l2 : + { + *(.l2 .l2.*) + } >MEM_SDRAM + + .start : + { + KEEP (*(.start)) + } >MEM_L1_CODE =0 + + .text : + { + *(.text .stub .text.* .gnu.linkonce.t.*) + KEEP (*(.text.*personality*)) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + } >MEM_L1_CODE =0 + + .init : + { + KEEP (*(.init)) + } >MEM_L1_CODE =0 + + .plt : { *(.plt) } >MEM_L1_CODE + + .fini : + { + KEEP (*(.fini)) + } >MEM_L1_CODE =0 + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } >MEM_L1_DATA_A + .rodata1 : { *(.rodata1) } >MEM_L1_DATA_A + + .sdata2 : + { + *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) + } >MEM_L1_DATA_A + + .sbss2 : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) } >MEM_L1_DATA_A + .eh_frame_hdr : { *(.eh_frame_hdr) } >MEM_L1_DATA_A + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } >MEM_L1_DATA_A + .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } >MEM_L1_DATA_A + + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = ALIGN(0x1000) + (. & (0x1000 - 1)); + /* Exception handling */ + .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } >MEM_L1_DATA_A + .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } >MEM_L1_DATA_A + /* Thread Local Storage sections */ + .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } >MEM_L1_DATA_A + .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } >MEM_L1_DATA_A + .preinit_array : + { + PROVIDE_HIDDEN (___preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (___preinit_array_end = .); + } >MEM_L1_DATA_A + .init_array : + { + PROVIDE_HIDDEN (___init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE_HIDDEN (___init_array_end = .); + } >MEM_L1_DATA_A + .fini_array : + { + PROVIDE_HIDDEN (___fini_array_start = .); + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + PROVIDE_HIDDEN (___fini_array_end = .); + } >MEM_L1_DATA_A + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin*.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*crtend*.o(.ctors)) + } >MEM_L1_DATA_A + .dtors : + { + KEEP (*crtbegin*.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*crtend*.o(.dtors)) + } >MEM_L1_DATA_A + .jcr : { KEEP (*(.jcr)) } >MEM_L1_DATA_A + .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) } >MEM_L1_DATA_A + .dynamic : { *(.dynamic) } >MEM_L1_DATA_A + .data : + { + *(.data .data.* .gnu.linkonce.d.*) + KEEP (*(.gnu.linkonce.d.*personality*)) + SORT(CONSTRUCTORS) + } >MEM_L1_DATA_A + .data1 : { *(.data1) } >MEM_L1_DATA_A + .got : { *(.got.plt) *(.got) } >MEM_L1_DATA_A + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : + { + *(.sdata .sdata.* .gnu.linkonce.s.*) + } >MEM_L1_DATA_A + __edata = .; PROVIDE (_edata = .); + .sbss : + { + __bss_start = .; + *(.dynsbss) + *(.sbss .sbss.* .gnu.linkonce.sb.*) + *(.scommon) + } >MEM_L1_DATA_A + .bss : + { + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. + FIXME: Why do we need it? When there is no .bss section, we don't + pad the .data section. */ + . = ALIGN(. != 0 ? 32 / 8 : 1); + __bss_end = .; + } >MEM_L1_DATA_A + . = ALIGN(32 / 8); + . = ALIGN(32 / 8); + __end = .; PROVIDE (_end = .); + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + + __stack_end = ORIGIN(MEM_L1_SCRATCH) + LENGTH(MEM_L1_SCRATCH); + + __heap_start = ORIGIN(MEM_L1_DATA_B); + __heap_end = ORIGIN(MEM_L1_DATA_B) + LENGTH(MEM_L1_DATA_B); + + + PROVIDE (end = .) ; + +/* ADSP-BF548依存のSYSTEM MMR */ +/* + .bss.sysmmr (NOLOAD) : { . = 0x0000; chip_mmr.o(SYSMMR0)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0100; chip_mmr.o(SYSMMR1)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x010C; chip_mmr.o(SYSMMR2)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x014C; chip_mmr.o(SYSMMR3)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0200; chip_mmr.o(SYSMMR4)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0300; chip_mmr.o(SYSMMR5)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0400; chip_mmr.o(SYSMMR6)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x041C; chip_mmr.o(SYSMMR7)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0424; chip_mmr.o(SYSMMR8)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0500; chip_mmr.o(SYSMMR9)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0600; chip_mmr.o(SYSMMR10)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0700; chip_mmr.o(SYSMMR11)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0800; chip_mmr.o(SYSMMR12)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0818; chip_mmr.o(SYSMMR13)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0820; chip_mmr.o(SYSMMR14)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0900; chip_mmr.o(SYSMMR15)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0918; chip_mmr.o(SYSMMR16)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0920; chip_mmr.o(SYSMMR17)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0A00; chip_mmr.o(SYSMMR18)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0A10; chip_mmr.o(SYSMMR19)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0B0C; chip_mmr.o(SYSMMR20)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C00; chip_mmr.o(SYSMMR21)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C10; chip_mmr.o(SYSMMR22)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C38; chip_mmr.o(SYSMMR23)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C40; chip_mmr.o(SYSMMR24)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C50; chip_mmr.o(SYSMMR25)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C78; chip_mmr.o(SYSMMR26)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C80; chip_mmr.o(SYSMMR27)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0C90; chip_mmr.o(SYSMMR28)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0CB8; chip_mmr.o(SYSMMR29)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0CC0; chip_mmr.o(SYSMMR30)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0CD0; chip_mmr.o(SYSMMR31)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0CF8; chip_mmr.o(SYSMMR32)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D00; chip_mmr.o(SYSMMR33)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D10; chip_mmr.o(SYSMMR34)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D38; chip_mmr.o(SYSMMR35)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D40; chip_mmr.o(SYSMMR36)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D50; chip_mmr.o(SYSMMR37)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D78; chip_mmr.o(SYSMMR38)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D80; chip_mmr.o(SYSMMR39)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0D90; chip_mmr.o(SYSMMR40)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0DB8; chip_mmr.o(SYSMMR41)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0DC0; chip_mmr.o(SYSMMR42)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0DD0; chip_mmr.o(SYSMMR43)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0DF8; chip_mmr.o(SYSMMR44)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E00; chip_mmr.o(SYSMMR45)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E10; chip_mmr.o(SYSMMR46)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E38; chip_mmr.o(SYSMMR47)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E40; chip_mmr.o(SYSMMR48)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E50; chip_mmr.o(SYSMMR49)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E78; chip_mmr.o(SYSMMR50)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E80; chip_mmr.o(SYSMMR51)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0E90; chip_mmr.o(SYSMMR52)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0EB8; chip_mmr.o(SYSMMR53)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0EC0; chip_mmr.o(SYSMMR54)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0ED0; chip_mmr.o(SYSMMR55)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0EF8; chip_mmr.o(SYSMMR56)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F00; chip_mmr.o(SYSMMR57)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F10; chip_mmr.o(SYSMMR58)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F38; chip_mmr.o(SYSMMR59)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F40; chip_mmr.o(SYSMMR60)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F50; chip_mmr.o(SYSMMR61)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F78; chip_mmr.o(SYSMMR62)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F80; chip_mmr.o(SYSMMR63)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0F90; chip_mmr.o(SYSMMR64)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0FB8; chip_mmr.o(SYSMMR65)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0FC0; chip_mmr.o(SYSMMR66)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0FD0; chip_mmr.o(SYSMMR67)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x0FF8; chip_mmr.o(SYSMMR68)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1000; chip_mmr.o(SYSMMR69)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1400; chip_mmr.o(SYSMMR70)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1480; chip_mmr.o(SYSMMR71)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1500; chip_mmr.o(SYSMMR72)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x1700; chip_mmr.o(SYSMMR73)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x2000; chip_mmr.o(SYSMMR74)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x201C; chip_mmr.o(SYSMMR75)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x2024; chip_mmr.o(SYSMMR76)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3000; chip_mmr.o(SYSMMR77)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x302C; chip_mmr.o(SYSMMR78)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3060; chip_mmr.o(SYSMMR79)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x30A0; chip_mmr.o(SYSMMR80)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3100; chip_mmr.o(SYSMMR81)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3180; chip_mmr.o(SYSMMR82)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3200; chip_mmr.o(SYSMMR83)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3210; chip_mmr.o(SYSMMR84)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3220; chip_mmr.o(SYSMMR85)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3240; chip_mmr.o(SYSMMR86)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3280; chip_mmr.o(SYSMMR87)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3288; chip_mmr.o(SYSMMR88)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3300; chip_mmr.o(SYSMMR89)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3340; chip_mmr.o(SYSMMR90)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3400; chip_mmr.o(SYSMMR91)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3500; chip_mmr.o(SYSMMR92)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3620; chip_mmr.o(SYSMMR93)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3680; chip_mmr.o(SYSMMR94)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3700; chip_mmr.o(SYSMMR95)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3800; chip_mmr.o(SYSMMR96)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3848; chip_mmr.o(SYSMMR97)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x3880; chip_mmr.o(SYSMMR98)}>MEM_SYSMMR + .bss.sysmmr (NOLOAD) : { . = 0x38C0; chip_mmr.o(SYSMMR99)}>MEM_SYSMMR +*/ + + + + +/* Blackfin 共有のCORE MMR */ +/* + .bss.coremmr (NOLOAD) : { cpu_mmr.o(DMEMCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DCPLBA)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DCPLBD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DTESTC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(DTESTD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(IMEMCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ICPLBA)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ICPLBD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ITESTC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(ITESTD)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(EVT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(CEC)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(CTMR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000)+0x1000; cpu_mmr.o(DBG)}> MEM_COREMMR *//* 1000飛ばす *//* + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(TBCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(TBUF)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(WPICTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPIADDR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPICNT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(WPDCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPDADDR)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0040); cpu_mmr.o(WPDCNT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(WPSTAT)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x1000); cpu_mmr.o(PFCTL)}> MEM_COREMMR + .bss.coremmr (NOLOAD) : { . = ALIGN(0x0100); cpu_mmr.o(PFCNT)}> MEM_COREMMR +*/ + + .comment 0 : { *(.comment) } + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } +} diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf548/chip_config.c b/uzume_prototype/kernel/config/blackfin/_common_bf548/chip_config.c new file mode 100644 index 0000000..33ad587 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf548/chip_config.c @@ -0,0 +1,450 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * Copyright (C) 2010,2011 by Kaneko System Co., Ltd. + * + * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + +/* + * ターゲットシステム依存モジュール(ADSP-BF548用) + */ + +#include "jsp_kernel.h" +#include + +#ifdef __GNUC__ +#include /* gnu tool chain */ +#elif defined(__ECC__) +#include /* VisualDSP++ */ +#include +#include +#else +#error "Compiler is not supported" +#endif + + + + +/* + * ターゲットシステム依存の初期化 + */ +void +sys_initialize() +{ + /* + * スプリアス割り込みハンドラの設定 + * + * cpu_initialize()が行うダミーの割り込みハンドラの設定を上書きする。 + * アプリケーションが割り込みハンドラを設定すると、以下の設定も上書き + * される。 + */ + int i; + + for ( i=0; i> 8; + *pUART0_LCR &= ~DLAB; + + /* モード設定, パリティ無し 8bit data, 1 stop bit */ + *pUART0_LCR = 0x03; + + /* 割込み禁止 */ + *pUART0_IER_CLEAR = 0xFFFF; + + *pPORTH_MUX &= ~(0x0003C000); // bit3:0 だけを0にする + *pPORTH_FER |= 0x0180; // PE7,PE8をUART0に割り振る +#else + /* Blackfin 固有の設定。UART1イネーブル */ + *pUART1_GCTL = 1; + + /* クロックの設定 */ + *pUART1_LCR |= DLAB; + *pUART1_DLL = UART1_DIVISOR & 0xFF ; + *pUART1_DLH = UART1_DIVISOR >> 8; + *pUART1_LCR &= ~DLAB; + + /* モード設定, パリティ無し 8bit data, 1 stop bit */ + *pUART1_LCR = 0x03; + + /* 割込み禁止 */ + *pUART1_IER_CLEAR = 0xFFFF; + + *pPORTH_MUX &= ~(0x000F); // bit3:0 だけを0にする + *pPORTH_FER |= 0x0003; // PH0,PH1をUART1に割り振る +#endif +} + +/* + * priority_maskは、event順位0..15に応じた割り込み要求のビットマップを保持する。 + * priority_mask[]のインデックスはevent順位と同じである。割り込み要因は BF54xでは + * 96要因あるので、unsigned int型の3個の配列による96bit型としている。 + * (chip_config.hのIMSの定義参照) + * + * device_dispatch()はpriority_mask[]を参照して、現在起きたイベントがどの割り込み + * 要因であるか決定する助けとする。 + * + * この変数はmake_priority_mask()を呼ぶ度に、実際のIARxの値に応じて上書きされる。 + * + */ +IMS priority_mask[16]={ + {0x00000000u, 0x00000000u, 0x00000000u}, /* EMU */ + {0x00000000u, 0x00000000u, 0x00000000u}, /* RST */ + {0x00000000u, 0x00000000u, 0x00000000u}, /* NMI */ + {0x00000000u, 0x00000000u, 0x00000000u}, /* EVX */ + {0x00000000u, 0x00000000u, 0x00000000u}, + {0x00000000u, 0x00000000u, 0x00000000u}, /* IVHW */ + {0x00000000u, 0x00000000u, 0x00000000u}, /* IVTMR */ + {0xFF00007Fu, 0xFFC00001u, 0x00000000u}, /* IVG7 */ + {0x00000180u, 0x00000000u, 0x0000003Fu}, /* IVG8 */ + {0x00001E00u, 0x0000007Eu, 0x00000000u}, /* IVG9 */ + {0x0000E000u, 0x00001F80u, 0x00000000u}, /* IVG10 */ + {0x00070000u, 0x0039E000u, 0x3FFFFFC0u}, /* IVG11 */ + {0x00180000u, 0x00000000u, 0x00000000u}, /* IVG12 */ + {0x00E00000u, 0x00060000u, 0x00000000u}, /* IVG13 */ + {0x00000000u, 0x00000000u, 0x00000000u}, /* IVG14 */ + {0x00000000u, 0x00000000u, 0x00000000u} /* IVG15 */ +}; + + +/* +* SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み +* のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので +* その分補正する。 +*/ +#define INSTALL_PRIORITY(imask_idx) \ + for ( i=0; i<8; i++ ){ \ + priority = iar & 0xf; /* IARから優先順位を取り出す */ \ + priority_mask[priority + 7].imask[imask_idx] |= device; /* 取り出した優先順位に基づきデバイスを登録 */ \ + device <<= 1; /* 次のデバイス */ \ + iar >>= 4; /* 次のIARフィールド */ \ + } + +/* +* 割り込み順位ごとのISRビットマップの作成SIC_IARxの設定はこの部分より前に済ませること。 +* この関数はuITRONのイニシャライザで使用することを想定しており、特に割り込みから保護していない。 +*/ +void make_priority_mask( void ) +{ + unsigned int i, priority, iar; + unsigned int device; + + // priority_maskは、event順位0..15に応じた割り込み要求のビットマップを保持する。 + // 最初にクリアする + for ( i=0; i<16; i++ ){ + priority_mask[i].imask[0] = 0; + priority_mask[i].imask[1] = 0; + priority_mask[i].imask[2] = 0; + } + + device = 1; + iar = *pSIC_IAR0; + INSTALL_PRIORITY(0) + + iar = *pSIC_IAR1; + INSTALL_PRIORITY(0) + + iar = *pSIC_IAR2; + INSTALL_PRIORITY(0) + + iar = *pSIC_IAR3; + INSTALL_PRIORITY(0) + + device = 1; + iar = *pSIC_IAR4; + INSTALL_PRIORITY(1) + + iar = *pSIC_IAR5; + INSTALL_PRIORITY(1) + + iar = *pSIC_IAR6; + INSTALL_PRIORITY(1) + + iar = *pSIC_IAR7; + INSTALL_PRIORITY(1) + + device = 1; + iar = *pSIC_IAR8; + INSTALL_PRIORITY(2) + + iar = *pSIC_IAR9; + INSTALL_PRIORITY(2) + + iar = *pSIC_IAR10; + INSTALL_PRIORITY(2) + + iar = *pSIC_IAR11; + INSTALL_PRIORITY(2) +} + + +/* + * 割り込みの許可。ADSP-BF54xは効率的な割り込み処理と安全な割り込み禁止を両立する + * 手段を持たないため、禁止関数は置いていない。 + * + * 不便ではあるが、プログラマに注意を促すためにそうしている。 + */ +ER ena_int( INTNO intno ) +{ + unsigned int mask; + SIL_PRE_LOC; + + if ( intno >= DEVICE_INTERRUPT_COUNT ) + return ( E_PAR ); + else { + if ( intno < 32 ){ + mask = 1 << intno; + SIL_LOC_INT(); + *pSIC_IMASK0 |= mask; + asm volatile( "ssync;" ); + SIL_UNL_INT(); + } + else if ( intno < 64 ){ + mask = 1 << (intno-32); + SIL_LOC_INT(); + *pSIC_IMASK1 |= mask; + asm volatile( "ssync;" ); + SIL_UNL_INT(); + } + else { + mask = 1 << (intno-64); + SIL_LOC_INT(); + *pSIC_IMASK2 |= mask; + asm volatile( "ssync;" ); + SIL_UNL_INT(); + } + return (0); + } +} + + +/* + * 割り込みマスクの取得。ADSP-BF54xは効率的な割り込み処理と安全な割り込み禁止を両立する + * 手段を持たないため、禁止関数は置いていない。 + * + * 不便ではあるが、プログラマに注意を促すためにそうしている。 + */ + + +extern ER get_ims( IMS * p_ims ) +{ + SIL_PRE_LOC; + + SIL_LOC_INT(); + p_ims->imask[0] = *pSIC_IMASK0; + p_ims->imask[1] = *pSIC_IMASK1; + p_ims->imask[2] = *pSIC_IMASK2; + SIL_UNL_INT(); + return( 0 ); +} + + +/* + * 割り込みをデバイスに割り当てる。 + * + * この間数は割り込み発生時に共通割り込みハンドラの一部としてアセンブリ言語から割り込み禁止状態で + * 呼ばれる。実割り込みハンドラを割り込み可能にするため、asm文を使って途中で割り込み可能にしている。 + * 割り込み禁止状態で呼ぶのは割り込み源の特定を安全におこなうためである。 + * + */ +void device_dispatcher( unsigned int priority, unsigned int imask ) +{ + unsigned int device; + unsigned int candidates[3], sic_isr[3]; + IMS sic_imask; + + // 各レジスタの値を取得する。 + get_ims(&sic_imask); + sic_isr[0] = *pSIC_ISR0; + sic_isr[1] = *pSIC_ISR1; + sic_isr[2] = *pSIC_ISR2; + + // 現在のプライオリティに相当する割込み源を特定する。 + candidates[0] = priority_mask[priority].imask[0] & sic_isr[0] & sic_imask.imask[0]; + candidates[1] = priority_mask[priority].imask[1] & sic_isr[1] & sic_imask.imask[1]; + candidates[2] = priority_mask[priority].imask[2] & sic_isr[2] & sic_imask.imask[2]; + + asm volatile("sti %0;": : "d"(imask) ); + + // 割り込み源が特定できないなら、コア由来である + if ( (0u == candidates[0]) && (0u == candidates[1]) && (0u == candidates[2]) ) + { + if ( priority == ik_hardware_err ) + dev_vector[INHNO_HW_ERROR](); + else + if ( priority == ik_timer ) + dev_vector[INHNO_TIMER](); + else + dev_vector[INHNO_RAISE](); // ソフトウェア割り込み + + } + else if ((0u != candidates[0])) + { + if ( candidates[0] & 0x80000000 ) + device = 31; + else + { +#ifdef __GNUC__ + asm ( "r1.L = signbits %1; %0 = r1.L(z);":"=d"(device) :"d"(candidates[0]): "R1" ); +#elif defined(__ECC__) + asm( "%0 = signbits %1;" : "=l"( device ) : "d"( candidates[0] ) ); +#else +#error "Compiler is not supported" +#endif + device = 30 - device; // bit mask is converted to bit number + } + dev_vector[device](); + } + else if ((0u != candidates[1])) + { + if ( candidates[1] & 0x80000000 ) + device = 31; + else + { +#ifdef __GNUC__ + asm ( "r1.L = signbits %1; %0 = r1.L(z);":"=d"(device) :"d"(candidates[1]): "R1" ); +#elif defined(__ECC__) + asm( "%0 = signbits %1;" : "=l"( device ) : "d"( candidates[1] ) ); +#else +#error "Compiler is not supported" +#endif + device = 30 - device; // bit mask is converted to bit number + } + dev_vector[device + 32](); + } + else + { + if ( candidates[2] & 0x80000000 ) + device = 31; + else + { +#ifdef __GNUC__ + asm ( "r1.L = signbits %1; %0 = r1.L(z);":"=d"(device) :"d"(candidates[2]): "R1" ); +#elif defined(__ECC__) + asm( "%0 = signbits %1;" : "=l"( device ) : "d"( candidates[2] ) ); +#else +#error "Compiler is not supported" +#endif + device = 30 - device; // bit mask is converted to bit number + } + dev_vector[device + 64](); + } +} + + + +/* + * ターゲットシステムの終了。TOPPERS/JSPは対話型ROMモニタに戻ることを想定しているが、 + * このボードにROMはない。 + */ +void +sys_exit() +{ + while(1) + ; +} + +/* + * ターゲットシステムの文字出力。割り込みが無効な状態でポーリングによる出力を行う。 + */ +void +sys_putc(char c) +{ + if ( c== 0x0A ) /* もし LF ならば */ + sys_putc( 0x0D ); /* CRを一文字送信 */ + + while( !( *pUART1_LSR & (1<<5)) ) + ; /* UART0 LSRのTHREが1になるまで待つ。1ならば送信レジスタ空き。*/ + + *pUART1_THR = c; /* 一文字送信 */ +} + + + diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf548/chip_config.h b/uzume_prototype/kernel/config/blackfin/_common_bf548/chip_config.h new file mode 100644 index 0000000..b29e389 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf548/chip_config.h @@ -0,0 +1,490 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2009 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * Copyright (C) 2010,2011 by Kaneko System Co., Ltd. + * + * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +#ifndef _CHIP_CONFIG_H_ +#define _CHIP_CONFIG_H_ + + +/* + * ターゲットシステム依存モジュール(EZKIT-BF534,6,7用) + * + * このインクルードファイルは,t_config.h のみからインクルードされる. + * 他のファイルから直接インクルードしてはならない. +*/ + +/* + * ターゲットシステムのハードウェア資源の定義 + * + * DEVICE_INTERRUPT_COUNTはSIC_IMASKのビット数 + * を与える。 + * ADSP-BF548のビット数は96なので、値は96である。 + */ + +#define DEVICE_INTERRUPT_COUNT 96 + + + +/* + * PLLクロック周波数 + */ +#define PLLCLOCK (CLKIN*MSELVAL) +#define SYSCLOCK (PLLCLOCK / SSELVAL) +#define CORECLOCK (PLLCLOCK / CSELVAL) + + + +/* + * TICの割込みハンドラのベクタ番号 + */ +#ifdef USE_TIC_CORE +#define INHNO_TIMER INHNO_CORE_TIMER +#else +#define INHNO_TIMER INHNO_TIMER7 +#endif + + +/* + * 微少時間待ちのための定義 + * sil_dly_nseの呼び出しオーバーヘッドとループボディーサイクルを + * nSで表す。関数はcpu_support.asmに定義してある。 + * SIL_DLY_TIM1は24サイクル。32nS( 750MHz ), 40nS( 600MHz ) + * SIL_DLY_TIM2は12サイクル。16nS( 750MHz ), 20nS( 600MHz ) + */ + + +#define SIL_DLY_TIM1 (24*1000000000/CORECLOCK) +#define SIL_DLY_TIM2 (12*1000000000/CORECLOCK) + +/************************************************************************* + * uart.c用構成マクロ + */ + +/* シリアルの割込みハンドラのベクタ番号 */ +#define INHNO_SIO0_TX INHNO_UART0_TX +#define INHNO_SIO0_RX INHNO_UART0_RX +#define INHNO_SIO1_TX INHNO_UART1_TX +#define INHNO_SIO1_RX INHNO_UART1_RX + +/* + * UARTレジスタの配置境界。ADSP-BF548の内蔵UARTは4バイト周期でレジスタが + * 並んでいるので、ここには4を指定する。 + */ +#define UART_BOUNDARY 4 + +/* UARTレジスタにsil_xxb_iop()を使ってアクセスするときにはUART_IOP_ACCESSを 宣言する。*/ +#define UART_IOP_ACCESS + +/* シリアルポートのアドレス。 */ +#define UART0_ADDRESS 0xFFC00400 // 内蔵UART0 DLLのアドレス。 +#define UART1_ADDRESS 0xFFC02000 // 内蔵UART1 DLLのアドレス。 + +/* UARTのボーレートジェネレータに設定すべき値. */ +#define UART0_DIVISOR SYSCLOCK/16/UART0_BAUD_RATE +#define UART1_DIVISOR SYSCLOCK/16/UART1_BAUD_RATE + +/* 内蔵UARTを使う場合は、UARTx_BLACKFIN_UCENを宣言してUCENを初期化しなければならない。*/ +#define UART0_BLACKFIN_UCEN +#define UART1_BLACKFIN_UCEN + + +/* + * uart.c用構成マクロ終わり + *************************************************************************/ + + + +/* + * 割り込みベクトル番号 + * + * この定義はコンフィグレーションファイルでDEF_INHの引数として使う + * SIC_ISRにおけるビット番号である。 + * + */ + +/* Peripheral Masks For SIC_ISR0, SIC_IWR0, SIC_IMASK0 */ +#define INHNO_PLL_WAKEUP 0 /* PLL Wakeup Interrupt */ +#define INHNO_DMA0_ERR 1 /* DMA Controller 0 Error */ +#define INHNO_EPPI0_ERR 2 /* EPPI0 Error */ +#define INHNO_SPORT0_ERR 3 /* SPORT0 Error */ +#define INHNO_SPORT1_ERR 4 /* SPORT1 Error */ +#define INHNO_SPI0_ERR 5 /* SPI0 Error */ +#define INHNO_UART0_ERR 6 /* UART0 Error */ +#define INHNO_RTC 7 /* Real-Time Clock */ +#define INHNO_DMA12 8 /* DMA Channel 12 (EPPI0) */ +#define INHNO_EPPI0 8 /* DMA Channel 12 (EPPI0) */ +#define INHNO_DMA0 9 /* DMA Channel 0 (SPORT0 RX) */ +#define INHNO_SPORT0_RX 9 /* DMA Channel 0 (SPORT0 RX) */ +#define INHNO_DMA1 10 /* DMA Channel 1 (SPORT0 TX) */ +#define INHNO_SPORT0_TX 10 /* DMA Channel 1 (SPORT0 TX) */ +#define INHNO_DMA2 11 /* DMA Channel 2 (SPORT1 RX) */ +#define INHNO_SPORT1_RX 11 /* DMA Channel 2 (SPORT1 RX) */ +#define INHNO_DMA3 12 /* DMA Channel 3 (SPORT1 TX) */ +#define INHNO_SPORT1_TX 12 /* DMA Channel 3 (SPORT1 TX) */ +#define INHNO_DMA4 13 /* DMA Channel 4 (SPI0) */ +#define INHNO_SPI0 13 /* DMA Channel 4 (SPI0) */ +#define INHNO_DMA6 14 /* DMA Channel 6 (UART0 RX) */ +#define INHNO_UART0_RX 14 /* DMA Channel 6 (UART0 RX) */ +#define INHNO_DMA7 15 /* DMA Channel 7 (UART0 TX) */ +#define INHNO_UART0_TX 15 /* DMA Channel 7 (UART0 TX) */ +#define INHNO_TIMER8 16 /* Timer 8 */ +#define INHNO_TIMER9 17 /* Timer 9 */ +#define INHNO_TIMER10 18 /* Timer 10 */ +#define INHNO_PINT0 19 /* Pin Interrupt 0 */ +#define INHNO_PINT1 20 /* Pin Interrupt 1 */ +#define INHNO_MDMA0 21 /* Memory DMA Stream 0 */ +#define INHNO_MDMA1 22 /* Memory DMA Stream 1 */ +#define INHNO_WDOG 23 /* Watchdog Timer */ +#define INHNO_DMA1_ERR 24 /* DMA Controller 1 Error */ +#define INHNO_SPORT2_ERR 25 /* SPORT2 Error */ +#define INHNO_SPORT3_ERR 26 /* SPORT3 Error */ +#define INHNO_MXVR_SD 27 /* MXVR Synchronous Data */ +#define INHNO_SPI1_ERR 28 /* SPI1 Error */ +#define INHNO_SPI2_ERR 29 /* SPI2 Error */ +#define INHNO_UART1_ERR 30 /* UART1 Error */ +#define INHNO_UART2_ERR 31 /* UART2 Error */ + +/* Peripheral Masks For SIC_ISR1, SIC_IWR1, SIC_IMASK1 */ +#define INHNO_CAN0_ERR 32 /* CAN0 Error */ +#define INHNO_DMA18 33 /* DMA Channel 18 (SPORT2 RX) */ +#define INHNO_SPORT2_RX 33 /* DMA Channel 18 (SPORT2 RX) */ +#define INHNO_DMA19 34 /* DMA Channel 19 (SPORT2 TX) */ +#define INHNO_SPORT2_TX 34 /* DMA Channel 19 (SPORT2 TX) */ +#define INHNO_DMA20 35 /* DMA Channel 20 (SPORT3 RX) */ +#define INHNO_SPORT3_RX 35 /* DMA Channel 20 (SPORT3 RX) */ +#define INHNO_DMA21 36 /* DMA Channel 21 (SPORT3 TX) */ +#define INHNO_SPORT3_TX 36 /* DMA Channel 21 (SPORT3 TX) */ +#define INHNO_DMA13 37 /* DMA Channel 13 (EPPI1) */ +#define INHNO_EPPI1 37 /* DMA Channel 13 (EPPI1) */ +#define INHNO_DMA14 38 /* DMA Channel 14 (EPPI2, HOSTDP) */ +#define INHNO_EPPI2 38 /* DMA Channel 14 (EPPI2, HOSTDP) */ +#define INHNO_HOSTDP 38 /* DMA Channel 14 (EPPI2, HOSTDP) */ +#define INHNO_DMA5 39 /* DMA Channel 5 (SPI1) */ +#define INHNO_SPI1 39 /* DMA Channel 5 (SPI1) */ +#define INHNO_DMA23 40 /* DMA Channel 23 (SPI2) */ +#define INHNO_SPI2 40 /* DMA Channel 23 (SPI2) */ +#define INHNO_DMA8 41 /* DMA Channel 8 (UART1 RX) */ +#define INHNO_UART1_RX 41 /* DMA Channel 8 (UART1 RX) */ +#define INHNO_DMA9 42 /* DMA Channel 9 (UART1 TX) */ +#define INHNO_UART1_TX 42 /* DMA Channel 9 (UART1 TX) */ +#define INHNO_DMA10 43 /* DMA Channel 10 (ATAPI RX) */ +#define INHNO_ATAPI_RX 43 /* DMA Channel 10 (ATAPI RX) */ +#define INHNO_DMA11 44 /* DMA Channel 11 (ATAPI TX) */ +#define INHNO_ATAPI_TX 44 /* DMA Channel 11 (ATAPI TX) */ +#define INHNO_TWI0 45 /* TWI0 */ +#define INHNO_TWI1 46 /* TWI1 */ +#define INHNO_CAN0_RX 47 /* CAN0 Receive */ +#define INHNO_CAN0_TX 48 /* CAN0 Transmit */ +#define INHNO_MDMA2 49 /* Memory DMA Stream 0 */ +#define INHNO_MDMA3 50 /* Memory DMA Stream 1 */ +#define INHNO_MXVR_STAT 51 /* MXVR Status */ +#define INHNO_MXVR_CM 52 /* MXVR Control Message */ +#define INHNO_MXVR_AP 53 /* MXVR Asynchronous Packet */ +#define INHNO_EPPI1_ERR 54 /* EPPI1 Error */ +#define INHNO_EPPI2_ERR 55 /* EPPI2 Error */ +#define INHNO_UART3_ERR 56 /* UART3 Error */ +#define INHNO_HOSTDP_STATUS 57 /* Host DMA Port Error */ +/* reserved */ +#define INHNO_PIXC_ERR 59 /* Pixel Compositor Error */ +#define INHNO_NFC_ERR 60 /* Nand Flash Controller Error */ +#define INHNO_ATAPI_ERR 61 /* ATAPI Error */ +#define INHNO_CAN1_ERR 62 /* CAN1 Error */ +#define INHNO_DMAR0_ERR 63 /* DMAR0 Overflow Error */ +#define INHNO_DMAR1_ERR 63 /* DMAR1 Overflow Error */ +#define INHNO_DMAR0 63 /* DMAR0 Block */ +#define INHNO_DMAR1 63 /* DMAR1 Block */ + +/* Peripheral Masks For SIC_ISR2, SIC_IWR2, SIC_IMASK2 */ +#define INHNO_DMA15 64 /* DMA Channel 15 (PIXC IN0) */ +#define INHNO_PIXC_IN0 64 /* DMA Channel 15 (PIXC IN0) */ +#define INHNO_DMA16 65 /* DMA Channel 16 (PIXC IN1) */ +#define INHNO_PIXC_IN1 65 /* DMA Channel 16 (PIXC IN1) */ +#define INHNO_DMA17 66 /* DMA Channel 17 (PIXC OUT) */ +#define INHNO_PIXC_OUT 66 /* DMA Channel 17 (PIXC OUT) */ +#define INHNO_DMA22 67 /* DMA Channel 22 (SHD/NFC) */ +#define INHNO_SDH 67 /* DMA Channel 22 (SHD/NFC) */ +#define INHNO_NFC 67 /* DMA Channel 22 (SHD/NFC) */ +#define INHNO_CNT 68 /* Counter */ +#define INHNO_KEY 69 /* Keypad */ +#define INHNO_CAN1_RX 70 /* CAN1 Receive */ +#define INHNO_CAN1_TX 71 /* CAN1 Transmit */ +#define INHNO_SDH_MASK0 72 /* SDH Mask 0 */ +#define INHNO_SDH_MASK1 73 /* SDH Mask 1 */ +/* reserved */ +#define INHNO_USB_INT0 75 /* USB Interrupt 0 */ +#define INHNO_USB_INT1 76 /* USB Interrupt 1 */ +#define INHNO_USB_INT2 77 /* USB Interrupt 2 */ +#define INHNO_USB_DMAINT 78 /* USB DMA */ +#define INHNO_OTP 79 /* OTP Access Complete */ +/* reserved */ +/* reserved */ +/* reserved */ +/* reserved */ +/* reserved */ +/* reserved */ +#define INHNO_TIMER0 86 /* Timer 0 */ +#define INHNO_TIMER1 87 /* Timer 1 */ +#define INHNO_TIMER2 88 /* Timer 2 */ +#define INHNO_TIMER3 89 /* Timer 3 */ +#define INHNO_TIMER4 90 /* Timer 4 */ +#define INHNO_TIMER5 91 /* Timer 5 */ +#define INHNO_TIMER6 92 /* Timer 6 */ +#define INHNO_TIMER7 93 /* Timer 7 */ +#define INHNO_PINT2 94 /* Pin Interrupt 2 */ +#define INHNO_PINT3 95 /* Pin Interrupt 3 */ + + +// SIC_ISRにない特殊な割り込み + +#define INHNO_HW_ERROR 96 +#define INHNO_CORE_TIMER 97 +#define INHNO_RAISE 98 + + +/* + * SIC_ISRの割り込みのベクタ番号 + * + * この定義はena_int, dis_intの引数として使う。 + */ + +/* Peripheral Masks For SIC_ISR0, SIC_IWR0, SIC_IMASK0 */ +#define INTNO_PLL_WAKEUP 0 /* PLL Wakeup Interrupt */ +#define INTNO_DMA0_ERR 1 /* DMA Controller 0 Error */ +#define INTNO_EPPI0_ERR 2 /* EPPI0 Error */ +#define INTNO_SPORT0_ERR 3 /* SPORT0 Error */ +#define INTNO_SPORT1_ERR 4 /* SPORT1 Error */ +#define INTNO_SPI0_ERR 5 /* SPI0 Error */ +#define INTNO_UART0_ERR 6 /* UART0 Error */ +#define INTNO_RTC 7 /* Real-Time Clock */ +#define INTNO_DMA12 8 /* DMA Channel 12 (EPPI0) */ +#define INTNO_EPPI0 8 /* DMA Channel 12 (EPPI0) */ +#define INTNO_DMA0 9 /* DMA Channel 0 (SPORT0 RX) */ +#define INTNO_SPORT0_RX 9 /* DMA Channel 0 (SPORT0 RX) */ +#define INTNO_DMA1 10 /* DMA Channel 1 (SPORT0 TX) */ +#define INTNO_SPORT0_TX 10 /* DMA Channel 1 (SPORT0 TX) */ +#define INTNO_DMA2 11 /* DMA Channel 2 (SPORT1 RX) */ +#define INTNO_SPORT1_RX 11 /* DMA Channel 2 (SPORT1 RX) */ +#define INTNO_DMA3 12 /* DMA Channel 3 (SPORT1 TX) */ +#define INTNO_SPORT1_TX 12 /* DMA Channel 3 (SPORT1 TX) */ +#define INTNO_DMA4 13 /* DMA Channel 4 (SPI0) */ +#define INTNO_SPI0 13 /* DMA Channel 4 (SPI0) */ +#define INTNO_DMA6 14 /* DMA Channel 6 (UART0 RX) */ +#define INTNO_UART0_RX 14 /* DMA Channel 6 (UART0 RX) */ +#define INTNO_DMA7 15 /* DMA Channel 7 (UART0 TX) */ +#define INTNO_UART0_TX 15 /* DMA Channel 7 (UART0 TX) */ +#define INTNO_TIMER8 16 /* Timer 8 */ +#define INTNO_TIMER9 17 /* Timer 9 */ +#define INTNO_TIMER10 18 /* Timer 10 */ +#define INTNO_PINT0 19 /* Pin Interrupt 0 */ +#define INTNO_PINT1 20 /* Pin Interrupt 1 */ +#define INTNO_MDMA0 21 /* Memory DMA Stream 0 */ +#define INTNO_MDMA1 22 /* Memory DMA Stream 1 */ +#define INTNO_WDOG 23 /* Watchdog Timer */ +#define INTNO_DMA1_ERR 24 /* DMA Controller 1 Error */ +#define INTNO_SPORT2_ERR 25 /* SPORT2 Error */ +#define INTNO_SPORT3_ERR 26 /* SPORT3 Error */ +#define INTNO_MXVR_SD 27 /* MXVR Synchronous Data */ +#define INTNO_SPI1_ERR 28 /* SPI1 Error */ +#define INTNO_SPI2_ERR 29 /* SPI2 Error */ +#define INTNO_UART1_ERR 30 /* UART1 Error */ +#define INTNO_UART2_ERR 31 /* UART2 Error */ + +/* Peripheral Masks For SIC_ISR1, SIC_IWR1, SIC_IMASK1 */ +#define INTNO_CAN0_ERR 32 /* CAN0 Error */ +#define INTNO_DMA18 33 /* DMA Channel 18 (SPORT2 RX) */ +#define INTNO_SPORT2_RX 33 /* DMA Channel 18 (SPORT2 RX) */ +#define INTNO_DMA19 34 /* DMA Channel 19 (SPORT2 TX) */ +#define INTNO_SPORT2_TX 34 /* DMA Channel 19 (SPORT2 TX) */ +#define INTNO_DMA20 35 /* DMA Channel 20 (SPORT3 RX) */ +#define INTNO_SPORT3_RX 35 /* DMA Channel 20 (SPORT3 RX) */ +#define INTNO_DMA21 36 /* DMA Channel 21 (SPORT3 TX) */ +#define INTNO_SPORT3_TX 36 /* DMA Channel 21 (SPORT3 TX) */ +#define INTNO_DMA13 37 /* DMA Channel 13 (EPPI1) */ +#define INTNO_EPPI1 37 /* DMA Channel 13 (EPPI1) */ +#define INTNO_DMA14 38 /* DMA Channel 14 (EPPI2, HOSTDP) */ +#define INTNO_EPPI2 38 /* DMA Channel 14 (EPPI2, HOSTDP) */ +#define INTNO_HOSTDP 38 /* DMA Channel 14 (EPPI2, HOSTDP) */ +#define INTNO_DMA5 39 /* DMA Channel 5 (SPI1) */ +#define INTNO_SPI1 39 /* DMA Channel 5 (SPI1) */ +#define INTNO_DMA23 40 /* DMA Channel 23 (SPI2) */ +#define INTNO_SPI2 40 /* DMA Channel 23 (SPI2) */ +#define INTNO_DMA8 41 /* DMA Channel 8 (UART1 RX) */ +#define INTNO_UART1_RX 41 /* DMA Channel 8 (UART1 RX) */ +#define INTNO_DMA9 42 /* DMA Channel 9 (UART1 TX) */ +#define INTNO_UART1_TX 42 /* DMA Channel 9 (UART1 TX) */ +#define INTNO_DMA10 43 /* DMA Channel 10 (ATAPI RX) */ +#define INTNO_ATAPI_RX 43 /* DMA Channel 10 (ATAPI RX) */ +#define INTNO_DMA11 44 /* DMA Channel 11 (ATAPI TX) */ +#define INTNO_ATAPI_TX 44 /* DMA Channel 11 (ATAPI TX) */ +#define INTNO_TWI0 45 /* TWI0 */ +#define INTNO_TWI1 46 /* TWI1 */ +#define INTNO_CAN0_RX 47 /* CAN0 Receive */ +#define INTNO_CAN0_TX 48 /* CAN0 Transmit */ +#define INTNO_MDMA2 49 /* Memory DMA Stream 0 */ +#define INTNO_MDMA3 50 /* Memory DMA Stream 1 */ +#define INTNO_MXVR_STAT 51 /* MXVR Status */ +#define INTNO_MXVR_CM 52 /* MXVR Control Message */ +#define INTNO_MXVR_AP 53 /* MXVR Asynchronous Packet */ +#define INTNO_EPPI1_ERR 54 /* EPPI1 Error */ +#define INTNO_EPPI2_ERR 55 /* EPPI2 Error */ +#define INTNO_UART3_ERR 56 /* UART3 Error */ +#define INTNO_HOSTDP_STATUS 57 /* Host DMA Port Error */ +/* reserved */ +#define INTNO_PIXC_ERR 59 /* Pixel Compositor Error */ +#define INTNO_NFC_ERR 60 /* Nand Flash Controller Error */ +#define INTNO_ATAPI_ERR 61 /* ATAPI Error */ +#define INTNO_CAN1_ERR 62 /* CAN1 Error */ +#define INTNO_DMAR0_ERR 63 /* DMAR0 Overflow Error */ +#define INTNO_DMAR1_ERR 63 /* DMAR1 Overflow Error */ +#define INTNO_DMAR0 63 /* DMAR0 Block */ +#define INTNO_DMAR1 63 /* DMAR1 Block */ + +/* Peripheral Masks For SIC_ISR2, SIC_IWR2, SIC_IMASK2 */ +#define INTNO_DMA15 64 /* DMA Channel 15 (PIXC IN0) */ +#define INTNO_PIXC_IN0 64 /* DMA Channel 15 (PIXC IN0) */ +#define INTNO_DMA16 65 /* DMA Channel 16 (PIXC IN1) */ +#define INTNO_PIXC_IN1 65 /* DMA Channel 16 (PIXC IN1) */ +#define INTNO_DMA17 66 /* DMA Channel 17 (PIXC OUT) */ +#define INTNO_PIXC_OUT 66 /* DMA Channel 17 (PIXC OUT) */ +#define INTNO_DMA22 67 /* DMA Channel 22 (SHD/NFC) */ +#define INTNO_SDH 67 /* DMA Channel 22 (SHD/NFC) */ +#define INTNO_NFC 67 /* DMA Channel 22 (SHD/NFC) */ +#define INTNO_CNT 68 /* Counter */ +#define INTNO_KEY 69 /* Keypad */ +#define INTNO_CAN1_RX 70 /* CAN1 Receive */ +#define INTNO_CAN1_TX 71 /* CAN1 Transmit */ +#define INTNO_SDH_MASK0 72 /* SDH Mask 0 */ +#define INTNO_SDH_MASK1 73 /* SDH Mask 1 */ +/* reserved */ +#define INTNO_USB_INT0 75 /* USB Interrupt 0 */ +#define INTNO_USB_INT1 76 /* USB Interrupt 1 */ +#define INTNO_USB_INT2 77 /* USB Interrupt 2 */ +#define INTNO_USB_DMAINT 78 /* USB DMA */ +#define INTNO_OTP 79 /* OTP Access Complete */ +/* reserved */ +/* reserved */ +/* reserved */ +/* reserved */ +/* reserved */ +/* reserved */ +#define INTNO_TIMER0 86 /* Timer 0 */ +#define INTNO_TIMER1 87 /* Timer 1 */ +#define INTNO_TIMER2 88 /* Timer 2 */ +#define INTNO_TIMER3 89 /* Timer 3 */ +#define INTNO_TIMER4 90 /* Timer 4 */ +#define INTNO_TIMER5 91 /* Timer 5 */ +#define INTNO_TIMER6 92 /* Timer 6 */ +#define INTNO_TIMER7 93 /* Timer 7 */ +#define INTNO_PINT2 94 /* Pin Interrupt 2 */ +#define INTNO_PINT3 95 /* Pin Interrupt 3 */ + +#ifndef _MACRO_ONLY + +/* +* SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み +* のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので +* その分補正する。 +*/ +void make_priority_mask( void ); + +/* + * ターゲットシステム依存の初期化 + */ +extern void sys_initialize(void); + +/* + * ターゲットシステムの終了 + * + * システムを終了する時に使う.ROMモニタ/GDB STUB呼出しで実現する. + */ +extern void sys_exit(void); + +/* + * ターゲットシステムの文字出力 + * + * システムの低レベルの文字出力ルーチン.ROMモニタ/GDB STUB呼出しで実 + * 現する. + */ +extern void sys_putc(char c); + +/* +* SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み +* のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので +* その分補正する。 +*/ +void make_priority_mask( void ); + +/* + * 割り込みの許可、禁止 + * + */ +typedef unsigned int INTNO; +extern ER ena_int( INTNO intno ); +extern ER dis_int( INTNO intno ); + +/* + * 割り込みマスクの操作 + * + * + */ +typedef struct +{ + unsigned int imask[3]; +} IMS; +extern ER chg_ims( IMS ims ); +extern ER get_ims( IMS * p_ims ); + +/* + * 割り込みをデバイスに割り当てる + */ +extern void device_dispatcher( unsigned int priority, unsigned int imask ); + +/** + * スプリアス・イベント・ハンドラ + */ +void spurious_exc_handler(VP p_excinf); +void spurious_int_handler(); + +#endif /* _MACRO_ONLY */ +#endif /* _SYS_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf548/chip_debugboot.c b/uzume_prototype/kernel/config/blackfin/_common_bf548/chip_debugboot.c new file mode 100644 index 0000000..cecf194 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf548/chip_debugboot.c @@ -0,0 +1,35 @@ +#include "jsp_kernel.h" + +#ifdef __GNUC__ +#include "cdefBF548.h" /* gnu tool chain */ +#elif defined(__ECC__) +#error "Don't use sys_debugboot.c for VDSP " +#else +#error "Compiler is not supported" +#endif + + +/* +* gdbserverがターゲットのリセット機能を提供しないため、gdb経由でターゲット +* にアプリッケーションをダウンロードすると正しく動作しないことがある。 +* このルーチンはターゲットを一度だけリセットする。 +*/ +void boot_for_gdb( void ) +{ + if ( enable_boot_for_gdb ){ /* ソフトウェアリセットが起きていないなら以下実行 */ + enable_boot_for_gdb = 0; /* リブートは一回だけ */ + *pSWRST = 0x07; /* 内蔵ペリフェラルのリセット */ + asm volatile( "ssync;" ); + *pSWRST = 0x00; /* 内蔵ペリフェラルのリセット解除。 */ + asm volatile( "ssync;" ); + *pSYSCR |= 0x10; /* no boot on core reset */ + asm volatile( "ssync;" ); + asm volatile( "raise 1;" ); /* コアリセット */ + while( 1 ) + ; /*リセットが発生するまでループ*/ + } + else + { + *pPLL_LOCKCNT = 0x200; /* Fix the anormaly 05000430 */ + } +} diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf548/chip_defs.h b/uzume_prototype/kernel/config/blackfin/_common_bf548/chip_defs.h new file mode 100644 index 0000000..adff55a --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf548/chip_defs.h @@ -0,0 +1,91 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2009 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * Copyright (C) 2010-2012 by Kaneko System Co., Ltd. + * + * 上記著作権者は,以下の (1)縲鰀(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +/* + * ターゲットシステムに依存する定義(ADSP-BF534,6,7用) + * + * このインクルードファイルは,kernel.h と sil.h でインクルードされる. + * 他のファイルから直接インクルードすることはない.このファイルをイン + * クルードする前に,t_stddef.h と itron.h がインクルードされるので, + * それらに依存してもよい. + */ + +#ifndef _CHIP_DEFS_H_ +#define _CHIP_DEFS_H_ + +/* チップ共通部略称  jsp/doc/config.txtの 2.(8)を参照 */ +#define _COMMON_BF548 + +/* + * タイムティックの定義 + */ +#define TIC_NUME 1u /* タイムティックの周期の分子 */ +#define TIC_DENO 1u /* タイムティックの周期の分母 */ + +/* + * 破壊性読み出しレジスタの判別式 + * 与えられたアドレス iop が破壊性読み出しレジスタの + * 場合には真を返す。 + */ +#ifndef DESTRUCTIVE_READ +#define DESTRUCTIVE_READ( iop ) (iop<(VP)0xF0000000) +#endif + +#ifndef _MACRO_ONLY + +/* + * システムの停止処理 + */ + +Inline void +kernel_abort() +{ +} + +#define COPYRIGHT_CHIP \ +"Copyright (C) 2010-2012 by Kaneko System Co., Ltd.\n" + +#endif /* _MACRO_ONLY */ +#endif /* _SYS_DEFS_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf548/chip_dump.c b/uzume_prototype/kernel/config/blackfin/_common_bf548/chip_dump.c new file mode 100644 index 0000000..719ad95 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf548/chip_dump.c @@ -0,0 +1,342 @@ +/** + * \file postmotem533.c + * \brief ADSP-BF533用のポストモーテムダンプルーチン群 + * + * ハードウェアエラー用のハンドラと、例外用のハンドラからなる。いずれも呼び出されるとUARTから + * ポストモーテム出力を表示する。 + */ +#include "jsp_kernel.h" +#include + +/** + * \brief UARTおよび付随するDMAの動作を停止し、すべての割り込みを禁止する。 + * + * 最後にUART_IERをクリアするのは、UART割り込みを禁止すると同時にDMAも禁止するため。 + * UART DMAは、UARTの割り込み線で駆動されているので、割り込みを禁止すればDMAリクエスト + * も停止する。 + * + * UARTの初期化をどうするか悩ましいが、ここではそのまま以前の設定を利用することにする。 + * + * ポストモーテム・ダンプを目的としているので、この状態からの回復は考えない。 + */ +static void pm_occupy_uart() +{ + /* すべてのコア割り込みを禁止する */ + asm( "cli r0;" : : : "R0" ); + + /* すべてのシステム割り込みソースを禁止する */ + *pSIC_IMASK0 = 0; + *pSIC_IMASK1 = 0; + *pSIC_IMASK2 = 0; + + /* UART_IERをディセーブルにすることで、DMAを殺せる */ + *pUART0_IER_CLEAR = 0xFFFFU; +} + +/** + * \brief 一文字出力 + * + * UARTの送信レジスタが空になるのを待って一文字出力する。 + */ +static void pm_putc( unsigned char c ) +{ + + /* THRが空になるまで待つ */ + while ( ! ( *pUART0_LSR & THRE ) ) + ; + + /* THRが空になったら1文字送信 */ + *pUART0_THR = c; +} + +/** + * \brief コンソール入力監視 + * + * UARTの受信レジスタにデータがあれば、読み込む。データが"!"なら真、 + * それ以外なら偽を返す。 + */ +static BOOL is_ready() +{ + /* 受信データはあるか。 */ + if ( *pUART0_LSR & DR ) + + { + char c; + + c= *pUART0_RBR; + if ( c == '!' ) + return TRUE; + } + return FALSE; +} + + +/** + * \brief 文字列出力 + * + * 受け取った文字列をUARTに出力する。 + */ +static void pm_putstr( char * s ) +{ + int i; + + i=0; + while( s[i] ) /* 末端のNULLが現れるまで出力 */ + pm_putc(s[i++]); +} + +/** + * \brief 1バイトをヘキサデシマルで出力する。 + */ +static void pm_puthex1byte( unsigned int data ) +{ + int i; + int nibble; + + /* 8bit内のすべてのニブルを処理 */ + for ( i=0; i<2; i++ ) + { + /* 最上位ニブルを抽出 */ + nibble = ( data >> 4 ) & 0xF; + /* 抽出したニブルを出力 */ + if ( nibble < 10 ) + pm_putc( nibble + '0' ); + else + pm_putc( nibble - 10 + 'A' ); + /* 次のニブル */ + data <<= 4; + } +} + +/* + * \brief 改行記号を出力する + */ +static void pm_putrtn() +{ + pm_putstr("\r\n"); +} + +/** + * \brief 4バイトをヘキサデシマルで出力する。 + */ +static void pm_puthex4byte( unsigned int data ) +{ + int i; + int nibble; + + /* 32bit内のすべてのニブルを処理 */ + for ( i=0; i<8; i++ ) + { + /* 最上位ニブルを抽出 */ + nibble = ( data >> 28 ) & 0xF; + /* 抽出したニブルを出力 */ + if ( nibble < 10 ) + pm_putc( nibble + '0' ); + else + pm_putc( nibble - 10 + 'A' ); + /* 次のニブル */ + data <<= 4; + } + +} + +/** + * \brief 例外フラグ + * + * 例外が発生したときには真、そうでなければ偽。hwei_handler()に例外か否かを伝える。 + * + * GCCが張り切ってlink/unlink命令の位置を最適化するため、hwei_hanlder()の + * 中で性格にfpを手繰れない。そのため、dummyをアクセスすることでlink/unlinkの位置 + * 最適化の抑止を図る役目もある。効果があるかどうかは不明。 + */ +static volatile int expFlag =0; +/** + * \brief ハードウェア・エラー・ハンドラ + * + * ハードウェア・エラー時に呼び出されて、ハードウェア・エラー・割り込みのポストモーテム処理を行う。 + * 最初にFPを手繰って、割り込みのスタックフレームを探す。次にすべての割り込みを禁止し、 + * UART0を占有したあと、ポーリングを使ってスタックに保存された各レジスタのダンプを行う。 + * DEF_INH(INHNO_HW_ERROR, { TA_HLNG, hwei_handler }); + * + */ +void spurious_int_handler() +{ + unsigned int * fp, *ptr ; /* フレーム・ポインタを手繰っていくための変数 */ + unsigned int reg; /* システムレジスタを受け取るための変数 */ + unsigned int imask, sic_imask0, sic_imask1, sic_imask2; /*マスク記録レジスタ*/ + + /* あとで使う */ + imask = *pIMASK; + sic_imask0 = *pSIC_IMASK0; + sic_imask1 = *pSIC_IMASK1; + sic_imask2 = *pSIC_IMASK2; + /* UART0を初期化し、DMAと割り込みを禁止する */ + pm_occupy_uart(); + + while (1) + { + int count = 0; + + pm_putstr( "Type '!' to display post mortem dump" ); pm_putrtn(); + + while ( ! is_ready() ) + { + int i; + for ( i=0; i<100000000; i++) + asm volatile ("nop;"); + if ( count > 30 ) + { + pm_putstr( "Type '!' to display post mortem dump" ); pm_putrtn(); + count = 0; + } + else + count ++; + } + pm_putrtn(); + + + /* 現在の関数のFPを取得する */ + asm ( "%0=fp;" : "=d"((unsigned int)fp) ); + + /* + * この関数を呼び出した関数 ( interrupt_dispatcher ) のFPを取得する。 + * FPは呼び出し関数のFPの格納番地を指していることを利用する + */ + fp = (void *)*fp; + /* + * interrupt_dispatcher を呼び出した関数のFPを取得する。 + * その関数は割り込みハンドラの入り口処理部に他ならない。 + */ + fp = (void *)*fp; + + /* いまや、FPは割り込み受付時の保存されたレジスタ群を指している */ + + /* プッシュされた P0を指す */ + ptr = fp + 2; + /* + * 上位 + * 0 1 2 3 4 5 6 7 8 9 + * ----------------------------------------------- + * 00 P0 RTS FP R0 R1 R2 R3 R4 R5 R6 + * 10 R7 P1 P2 P3 P4 P5 I3 I2 I1 I0 + * 20 M3 M2 M1 M0 B3 B2 B1 B0 L3 L2 + * 30 L1 L0 A0x A0w A1x A1w LC1 LC0 LT1 LT0 + * 40 LB1 LB0 AST RETI + * 下位 + * + */ + if ( expFlag ) + pm_putstr( "Spurious Exception !!" ); + else + pm_putstr( "Spurious Interrupt !!" ); + pm_putrtn(); + + pm_putstr( "Registers On Stack :" ); pm_putrtn(); + pm_putstr( "P0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "RETS " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "FP " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R4 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R5 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R6 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R7 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P4 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P5 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "A0 " ); pm_puthex1byte( *(ptr--) ); pm_putstr( ":" ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "A1 " ); pm_puthex1byte( *(ptr--) ); pm_putstr( ":" ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LC1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LC0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LT1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LT0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LB1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LB0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "ASTAT " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "RETI " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putrtn(); + pm_putstr( "System Registers :" ); pm_putrtn(); + pm_putstr( "SIC_IMASK2:1:0 " ); pm_puthex4byte( sic_imask2 );pm_puthex4byte( sic_imask1 );pm_putstr( " : " );pm_puthex4byte( sic_imask0 ); pm_putrtn(); + pm_putstr( "SIC_ISR1:0 " ); pm_puthex4byte( *pSIC_ISR1 );pm_putstr( " : " );pm_puthex4byte( *pSIC_ISR0 ); pm_putrtn(); + pm_putstr( "IMASK " ); pm_puthex4byte( imask ); pm_putrtn(); + pm_putstr( "ILAT " ); pm_puthex4byte( *pILAT ); pm_putrtn(); + pm_putstr( "IPEND " ); pm_puthex4byte( *pIPEND ); pm_putrtn(); + asm( "%0=SEQSTAT;" : "=d"(reg) ); + pm_putstr( "SEQSTAT " ); pm_puthex4byte( reg ); pm_putrtn(); + pm_putstr( " EXCAUSE " ); pm_puthex1byte( reg & 0x3F ); pm_putrtn(); + pm_putstr( " HWERRCAUSE " ); pm_puthex1byte( (reg>>14)&0x1F ); pm_putrtn(); + pm_putstr( "DMA0_IRQ_STATUS " ); pm_puthex4byte( *pDMA0_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA1_IRQ_STATUS " ); pm_puthex4byte( *pDMA1_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA2_IRQ_STATUS " ); pm_puthex4byte( *pDMA2_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA3_IRQ_STATUS " ); pm_puthex4byte( *pDMA3_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA4_IRQ_STATUS " ); pm_puthex4byte( *pDMA4_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA5_IRQ_STATUS " ); pm_puthex4byte( *pDMA5_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA6_IRQ_STATUS " ); pm_puthex4byte( *pDMA6_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA7_IRQ_STATUS " ); pm_puthex4byte( *pDMA7_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA8_IRQ_STATUS " ); pm_puthex4byte( *pDMA8_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA9_IRQ_STATUS " ); pm_puthex4byte( *pDMA9_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA10_IRQ_STATUS " ); pm_puthex4byte( *pDMA10_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA11_IRQ_STATUS " ); pm_puthex4byte( *pDMA11_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_D0_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_D0_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_S0_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_S0_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_D1_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_D1_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_S1_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_S1_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "SPI0_STAT " ); pm_puthex4byte( *pSPI0_STAT ); pm_putrtn(); + pm_putstr( "SPI1_STAT " ); pm_puthex4byte( *pSPI1_STAT ); pm_putrtn(); + pm_putstr( "SPI2_STAT " ); pm_puthex4byte( *pSPI2_STAT ); pm_putrtn(); + pm_putstr( "EPPI0_STATUS " ); pm_puthex4byte( *pEPPI0_STATUS ); pm_putrtn(); + pm_putstr( "EPPI1_STATUS " ); pm_puthex4byte( *pEPPI1_STATUS ); pm_putrtn(); + pm_putstr( "EPPI2_STATUS " ); pm_puthex4byte( *pEPPI2_STATUS ); pm_putrtn(); + pm_putstr( "SPORT0_STAT " ); pm_puthex4byte( *pSPORT0_STAT ); pm_putrtn(); + pm_putstr( "SPORT1_STAT " ); pm_puthex4byte( *pSPORT1_STAT ); pm_putrtn(); + pm_putstr( "SPORT2_STAT " ); pm_puthex4byte( *pSPORT2_STAT ); pm_putrtn(); + pm_putstr( "SPORT3_STAT " ); pm_puthex4byte( *pSPORT3_STAT ); pm_putrtn(); + pm_putstr( "TIMER_STATUS0 " ); pm_puthex4byte( *pTIMER_STATUS0 ); pm_putrtn(); + pm_putstr( "TIMER_STATUS1 " ); pm_puthex4byte( *pTIMER_STATUS1 ); pm_putrtn(); + pm_putrtn(); + pm_putstr( "Calling Stack :" ); pm_putrtn(); + + while( fp ) + { + pm_putstr( "Called from " ); pm_puthex4byte( *(fp+1) ); pm_putrtn(); + fp = *fp; + } + } +} + +/** + * \brief CPU例外ハンドラ + * + * CPU例外ハンドラとしてcfgファイルに登録する。 hwei_handler()は呼ばれたら戻ってこないが、 + * そのあとにもexpFlagに値を代入しているのは、最適化によってunlink命令の値がルーチン呼び出しの + * 前に移動することを防ぐためである。 + * + * DEF_EXC(CPUEXC1, { TA_HLNG, excp_handler} ); + * + */ +void spurious_exc_handler(VP p_excinf) +{ + expFlag = TRUE; + spurious_int_handler(); +} + diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf548/chip_mmr.c b/uzume_prototype/kernel/config/blackfin/_common_bf548/chip_mmr.c new file mode 100644 index 0000000..e28dea6 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf548/chip_mmr.c @@ -0,0 +1,674 @@ +/* + * 注意:このファイルはBF548のMMR定義用にまだ修正してない + * + * ADSP-BF548の System MMR 定義。アドレスの指定は .ldファイルとの組み合わせで行う。 + * .ldファイルのサンプルは、 config/blackfin/ezkit_bf548を参照。 + * + * アドレスが正しく割り当てられているかは、次の方法で検証した. + * + $ cat /opt/uClinux/bfin-elf/bfin-elf/include/def_LPBlackfin.h ../jsp/config/blackfin/_common_bf548/defBF54x_base.h ../jsp/config/blackfin/_common_bf548/defBF548.h | tr '[a-z]' '[A-Z]' | grep '0XFF[CE]0' | grep "#DEFINE" | awk '{print $2, $3}' - | grep 0X | sed 's/0X//' | sort -k 2 > regdef.txt + $ awk '{ print $3,$1 }' jsp.syms | grep _mmr | sed 's/_mmr//p'| sort -k 2 | uniq | tr '[a-z]' '[A-Z]'> regelf.txt + $ diff regelf.txt regdef.txt > diff.txt + +31a32,34 +> RTC_PREN FFC00314 +> UART0_DLL FFC00400 +> UART0_RBR FFC00400 +32a36 +> UART0_DLH FFC00404 +149a154 +> DMA_TCPER FFC00B0C +150a156 +> DMA_TCCNT FFC00B10 +414a421,422 +> UART1_DLL FFC02000 +> UART1_RBR FFC02000 +415a424 +> UART1_DLH FFC02004 +567a577,580 +> OTP_CONTROL FFC03600 +> OTP_BEN FFC03604 +> OTP_STATUS FFC03608 +> OTP_TIMING FFC0360C +619a633 +> DCPLB_FAULT_STATUS FFE00008 +657d670 +< IMEM_DUMMY FFE01000 +658a672 +> CODE_FAULT_STATUS FFE01008 +659a674 +> CODE_FAULT_ADDR FFE0100C +712d726 +< IDUMMY FFE02100 +722d735 +< DBGDUMMY FFE05004 + + * これらのうち、ELF側にだけ存在するレジスタはDUMMYレジスタであり、これはコアレジスタである。 + * ツールのバージョン違いでインクルードファイルの内容が改変されたためであり、無視していい。 + * + * DEF側にだけ存在するレジスタには2種類ある。 + * 1. 他のレジスタのエイリアス + * 2. def***.hには存在するが、cdef***.hには存在しないレジスタ + * + * いずれも小さな問題であり、したがって、上の結果は問題ないと言える。 + * + */ + +volatile unsigned short mmrPLL_CTL __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrPLL_DIV __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrVR_CTL __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrPLL_STAT __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrPLL_LOCKCNT __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned long mmrCHIPID __attribute ((aligned(4), section("SYSMMR0"))); +volatile unsigned short mmrSWRST __attribute ((aligned(4), section("SYSMMR1"))); +volatile unsigned short mmrSYSCR __attribute ((aligned(4), section("SYSMMR1"))); +volatile unsigned long mmrSIC_IMASK0 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IAR0 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IAR1 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IAR2 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IAR3 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_ISR0 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IWR0 __attribute ((aligned(4), section("SYSMMR2"))); +volatile unsigned long mmrSIC_IMASK1 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_IAR4 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_IAR5 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_IAR6 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_IAR7 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_ISR1 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned long mmrSIC_IWR1 __attribute ((aligned(4), section("SYSMMR3"))); +volatile unsigned short mmrWDOG_CTL __attribute ((aligned(4), section("SYSMMR4"))); +volatile unsigned long mmrWDOG_CNT __attribute ((aligned(4), section("SYSMMR4"))); +volatile unsigned long mmrWDOG_STAT __attribute ((aligned(4), section("SYSMMR4"))); +volatile unsigned long mmrRTC_STAT __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned short mmrRTC_ICTL __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned short mmrRTC_ISTAT __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned short mmrRTC_SWCNT __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned long mmrRTC_ALARM __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned short mmrRTC_FAST __attribute ((aligned(4), section("SYSMMR5"))); +volatile unsigned short mmrUART0_THR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_IER __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_IIR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_LCR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_MCR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_LSR __attribute ((aligned(4), section("SYSMMR6"))); +volatile unsigned short mmrUART0_SCR __attribute ((aligned(4), section("SYSMMR7"))); +volatile unsigned short mmrUART0_GCTL __attribute ((aligned(4), section("SYSMMR8"))); +volatile unsigned short mmrSPI0_CTL __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_FLG __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_STAT __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_TDBR __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_RDBR __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_BAUD __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrSPI0_SHADOW __attribute ((aligned(4), section("SYSMMR9"))); +volatile unsigned short mmrTIMER0_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER0_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER0_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER0_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER1_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER1_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER1_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER1_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER2_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER2_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER2_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER2_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER3_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER3_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER3_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER3_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER4_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER4_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER4_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER4_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER5_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER5_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER5_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER5_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER6_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER6_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER6_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER6_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER7_CONFIG __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER7_COUNTER __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER7_PERIOD __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER7_WIDTH __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER_ENABLE __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrTIMER_DISABLE __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned long mmrTIMER_STATUS __attribute ((aligned(4), section("SYSMMR10"))); +volatile unsigned short mmrPORTFIO __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_CLEAR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_SET __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_TOGGLE __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKA __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKA_CLEAR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKA_SET __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKA_TOGGLE __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKB __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKB_CLEAR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKB_SET __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_MASKB_TOGGLE __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_DIR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_POLAR __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_EDGE __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_BOTH __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrPORTFIO_INEN __attribute ((aligned(4), section("SYSMMR11"))); +volatile unsigned short mmrSPORT0_TCR1 __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned short mmrSPORT0_TCR2 __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned short mmrSPORT0_TCLKDIV __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned short mmrSPORT0_TFSDIV __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned long mmrSPORT0_TX __attribute ((aligned(4), section("SYSMMR12"))); +volatile unsigned long mmrSPORT0_RX __attribute ((aligned(4), section("SYSMMR13"))); +volatile unsigned short mmrSPORT0_RCR1 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_RCR2 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_RCLKDIV __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_RFSDIV __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_STAT __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_CHNL __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_MCMC1 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT0_MCMC2 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MTCS0 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MTCS1 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MTCS2 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MTCS3 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MRCS0 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MRCS1 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MRCS2 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned long mmrSPORT0_MRCS3 __attribute ((aligned(4), section("SYSMMR14"))); +volatile unsigned short mmrSPORT1_TCR1 __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned short mmrSPORT1_TCR2 __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned short mmrSPORT1_TCLKDIV __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned short mmrSPORT1_TFSDIV __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned long mmrSPORT1_TX __attribute ((aligned(4), section("SYSMMR15"))); +volatile unsigned long mmrSPORT1_RX __attribute ((aligned(4), section("SYSMMR16"))); +volatile unsigned short mmrSPORT1_RCR1 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_RCR2 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_RCLKDIV __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_RFSDIV __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_STAT __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_CHNL __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_MCMC1 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrSPORT1_MCMC2 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MTCS0 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MTCS1 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MTCS2 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MTCS3 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MRCS0 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MRCS1 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MRCS2 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned long mmrSPORT1_MRCS3 __attribute ((aligned(4), section("SYSMMR17"))); +volatile unsigned short mmrEBIU_AMGCTL __attribute ((aligned(4), section("SYSMMR18"))); +volatile unsigned long mmrEBIU_AMBCTL0 __attribute ((aligned(4), section("SYSMMR18"))); +volatile unsigned long mmrEBIU_AMBCTL1 __attribute ((aligned(4), section("SYSMMR18"))); +volatile unsigned long mmrEBIU_SDGCTL __attribute ((aligned(4), section("SYSMMR19"))); +volatile unsigned short mmrEBIU_SDBCTL __attribute ((aligned(4), section("SYSMMR19"))); +volatile unsigned short mmrEBIU_SDRRC __attribute ((aligned(4), section("SYSMMR19"))); +volatile unsigned short mmrEBIU_SDSTAT __attribute ((aligned(4), section("SYSMMR19"))); +volatile unsigned short mmrDMA_TC_PER __attribute ((aligned(4), section("SYSMMR20"))); +volatile unsigned short mmrDMA_TC_CNT __attribute ((aligned(4), section("SYSMMR20"))); +volatile unsigned long mmrDMA0_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR21"))); +volatile unsigned long mmrDMA0_START_ADDR __attribute ((aligned(4), section("SYSMMR21"))); +volatile unsigned short mmrDMA0_CONFIG __attribute ((aligned(4), section("SYSMMR21"))); +volatile unsigned short mmrDMA0_X_COUNT __attribute ((aligned(4), section("SYSMMR22"))); +volatile signed short mmrDMA0_X_MODIFY __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_Y_COUNT __attribute ((aligned(4), section("SYSMMR22"))); +volatile signed short mmrDMA0_Y_MODIFY __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned long mmrDMA0_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned long mmrDMA0_CURR_ADDR __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR22"))); +volatile unsigned short mmrDMA0_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR23"))); +volatile unsigned long mmrDMA1_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR24"))); +volatile unsigned long mmrDMA1_START_ADDR __attribute ((aligned(4), section("SYSMMR24"))); +volatile unsigned short mmrDMA1_CONFIG __attribute ((aligned(4), section("SYSMMR24"))); +volatile unsigned short mmrDMA1_X_COUNT __attribute ((aligned(4), section("SYSMMR25"))); +volatile signed short mmrDMA1_X_MODIFY __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_Y_COUNT __attribute ((aligned(4), section("SYSMMR25"))); +volatile signed short mmrDMA1_Y_MODIFY __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned long mmrDMA1_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned long mmrDMA1_CURR_ADDR __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR25"))); +volatile unsigned short mmrDMA1_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR26"))); +volatile unsigned long mmrDMA2_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR27"))); +volatile unsigned long mmrDMA2_START_ADDR __attribute ((aligned(4), section("SYSMMR27"))); +volatile unsigned short mmrDMA2_CONFIG __attribute ((aligned(4), section("SYSMMR27"))); +volatile unsigned short mmrDMA2_X_COUNT __attribute ((aligned(4), section("SYSMMR28"))); +volatile signed short mmrDMA2_X_MODIFY __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_Y_COUNT __attribute ((aligned(4), section("SYSMMR28"))); +volatile signed short mmrDMA2_Y_MODIFY __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned long mmrDMA2_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned long mmrDMA2_CURR_ADDR __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR28"))); +volatile unsigned short mmrDMA2_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR29"))); +volatile unsigned long mmrDMA3_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR30"))); +volatile unsigned long mmrDMA3_START_ADDR __attribute ((aligned(4), section("SYSMMR30"))); +volatile unsigned short mmrDMA3_CONFIG __attribute ((aligned(4), section("SYSMMR30"))); +volatile unsigned short mmrDMA3_X_COUNT __attribute ((aligned(4), section("SYSMMR31"))); +volatile signed short mmrDMA3_X_MODIFY __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_Y_COUNT __attribute ((aligned(4), section("SYSMMR31"))); +volatile signed short mmrDMA3_Y_MODIFY __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned long mmrDMA3_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned long mmrDMA3_CURR_ADDR __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR31"))); +volatile unsigned short mmrDMA3_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR32"))); +volatile unsigned long mmrDMA4_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR33"))); +volatile unsigned long mmrDMA4_START_ADDR __attribute ((aligned(4), section("SYSMMR33"))); +volatile unsigned short mmrDMA4_CONFIG __attribute ((aligned(4), section("SYSMMR33"))); +volatile unsigned short mmrDMA4_X_COUNT __attribute ((aligned(4), section("SYSMMR34"))); +volatile signed short mmrDMA4_X_MODIFY __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_Y_COUNT __attribute ((aligned(4), section("SYSMMR34"))); +volatile signed short mmrDMA4_Y_MODIFY __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned long mmrDMA4_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned long mmrDMA4_CURR_ADDR __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR34"))); +volatile unsigned short mmrDMA4_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR35"))); +volatile unsigned long mmrDMA5_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR36"))); +volatile unsigned long mmrDMA5_START_ADDR __attribute ((aligned(4), section("SYSMMR36"))); +volatile unsigned short mmrDMA5_CONFIG __attribute ((aligned(4), section("SYSMMR36"))); +volatile unsigned short mmrDMA5_X_COUNT __attribute ((aligned(4), section("SYSMMR37"))); +volatile signed short mmrDMA5_X_MODIFY __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_Y_COUNT __attribute ((aligned(4), section("SYSMMR37"))); +volatile signed short mmrDMA5_Y_MODIFY __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned long mmrDMA5_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned long mmrDMA5_CURR_ADDR __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR37"))); +volatile unsigned short mmrDMA5_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR38"))); +volatile unsigned long mmrDMA6_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR39"))); +volatile unsigned long mmrDMA6_START_ADDR __attribute ((aligned(4), section("SYSMMR39"))); +volatile unsigned short mmrDMA6_CONFIG __attribute ((aligned(4), section("SYSMMR39"))); +volatile unsigned short mmrDMA6_X_COUNT __attribute ((aligned(4), section("SYSMMR40"))); +volatile signed short mmrDMA6_X_MODIFY __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_Y_COUNT __attribute ((aligned(4), section("SYSMMR40"))); +volatile signed short mmrDMA6_Y_MODIFY __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned long mmrDMA6_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned long mmrDMA6_CURR_ADDR __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR40"))); +volatile unsigned short mmrDMA6_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR41"))); +volatile unsigned long mmrDMA7_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR42"))); +volatile unsigned long mmrDMA7_START_ADDR __attribute ((aligned(4), section("SYSMMR42"))); +volatile unsigned short mmrDMA7_CONFIG __attribute ((aligned(4), section("SYSMMR42"))); +volatile unsigned short mmrDMA7_X_COUNT __attribute ((aligned(4), section("SYSMMR43"))); +volatile signed short mmrDMA7_X_MODIFY __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_Y_COUNT __attribute ((aligned(4), section("SYSMMR43"))); +volatile signed short mmrDMA7_Y_MODIFY __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned long mmrDMA7_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned long mmrDMA7_CURR_ADDR __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR43"))); +volatile unsigned short mmrDMA7_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR44"))); +volatile unsigned long mmrDMA8_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR45"))); +volatile unsigned long mmrDMA8_START_ADDR __attribute ((aligned(4), section("SYSMMR45"))); +volatile unsigned short mmrDMA8_CONFIG __attribute ((aligned(4), section("SYSMMR45"))); +volatile unsigned short mmrDMA8_X_COUNT __attribute ((aligned(4), section("SYSMMR46"))); +volatile signed short mmrDMA8_X_MODIFY __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_Y_COUNT __attribute ((aligned(4), section("SYSMMR46"))); +volatile signed short mmrDMA8_Y_MODIFY __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned long mmrDMA8_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned long mmrDMA8_CURR_ADDR __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR46"))); +volatile unsigned short mmrDMA8_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR47"))); +volatile unsigned long mmrDMA9_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR48"))); +volatile unsigned long mmrDMA9_START_ADDR __attribute ((aligned(4), section("SYSMMR48"))); +volatile unsigned short mmrDMA9_CONFIG __attribute ((aligned(4), section("SYSMMR48"))); +volatile unsigned short mmrDMA9_X_COUNT __attribute ((aligned(4), section("SYSMMR49"))); +volatile signed short mmrDMA9_X_MODIFY __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned short mmrDMA9_Y_COUNT __attribute ((aligned(4), section("SYSMMR49"))); +volatile signed short mmrDMA9_Y_MODIFY __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned long mmrDMA9_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned long mmrDMA9_CURR_ADDR __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned short mmrDMA9_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned short mmrDMA9_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned short mmrDMA9_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR49"))); +volatile unsigned short mmrDMA9_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR50"))); +volatile unsigned long mmrDMA10_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR51"))); +volatile unsigned long mmrDMA10_START_ADDR __attribute ((aligned(4), section("SYSMMR51"))); +volatile unsigned short mmrDMA10_CONFIG __attribute ((aligned(4), section("SYSMMR51"))); +volatile unsigned short mmrDMA10_X_COUNT __attribute ((aligned(4), section("SYSMMR52"))); +volatile signed short mmrDMA10_X_MODIFY __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned short mmrDMA10_Y_COUNT __attribute ((aligned(4), section("SYSMMR52"))); +volatile signed short mmrDMA10_Y_MODIFY __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned long mmrDMA10_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned long mmrDMA10_CURR_ADDR __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned short mmrDMA10_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned short mmrDMA10_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned short mmrDMA10_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR52"))); +volatile unsigned short mmrDMA10_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR53"))); +volatile unsigned long mmrDMA11_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR54"))); +volatile unsigned long mmrDMA11_START_ADDR __attribute ((aligned(4), section("SYSMMR54"))); +volatile unsigned short mmrDMA11_CONFIG __attribute ((aligned(4), section("SYSMMR54"))); +volatile unsigned short mmrDMA11_X_COUNT __attribute ((aligned(4), section("SYSMMR55"))); +volatile signed short mmrDMA11_X_MODIFY __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned short mmrDMA11_Y_COUNT __attribute ((aligned(4), section("SYSMMR55"))); +volatile signed short mmrDMA11_Y_MODIFY __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned long mmrDMA11_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned long mmrDMA11_CURR_ADDR __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned short mmrDMA11_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned short mmrDMA11_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned short mmrDMA11_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR55"))); +volatile unsigned short mmrDMA11_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR56"))); +volatile unsigned long mmrMDMA_D0_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR57"))); +volatile unsigned long mmrMDMA_D0_START_ADDR __attribute ((aligned(4), section("SYSMMR57"))); +volatile unsigned short mmrMDMA_D0_CONFIG __attribute ((aligned(4), section("SYSMMR57"))); +volatile unsigned short mmrMDMA_D0_X_COUNT __attribute ((aligned(4), section("SYSMMR58"))); +volatile signed short mmrMDMA_D0_X_MODIFY __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_Y_COUNT __attribute ((aligned(4), section("SYSMMR58"))); +volatile signed short mmrMDMA_D0_Y_MODIFY __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned long mmrMDMA_D0_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned long mmrMDMA_D0_CURR_ADDR __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR58"))); +volatile unsigned short mmrMDMA_D0_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR59"))); +volatile unsigned long mmrMDMA_S0_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR60"))); +volatile unsigned long mmrMDMA_S0_START_ADDR __attribute ((aligned(4), section("SYSMMR60"))); +volatile unsigned short mmrMDMA_S0_CONFIG __attribute ((aligned(4), section("SYSMMR60"))); +volatile unsigned short mmrMDMA_S0_X_COUNT __attribute ((aligned(4), section("SYSMMR61"))); +volatile signed short mmrMDMA_S0_X_MODIFY __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_Y_COUNT __attribute ((aligned(4), section("SYSMMR61"))); +volatile signed short mmrMDMA_S0_Y_MODIFY __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned long mmrMDMA_S0_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned long mmrMDMA_S0_CURR_ADDR __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR61"))); +volatile unsigned short mmrMDMA_S0_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR62"))); +volatile unsigned long mmrMDMA_D1_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR63"))); +volatile unsigned long mmrMDMA_D1_START_ADDR __attribute ((aligned(4), section("SYSMMR63"))); +volatile unsigned short mmrMDMA_D1_CONFIG __attribute ((aligned(4), section("SYSMMR63"))); +volatile unsigned short mmrMDMA_D1_X_COUNT __attribute ((aligned(4), section("SYSMMR64"))); +volatile signed short mmrMDMA_D1_X_MODIFY __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_Y_COUNT __attribute ((aligned(4), section("SYSMMR64"))); +volatile signed short mmrMDMA_D1_Y_MODIFY __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned long mmrMDMA_D1_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned long mmrMDMA_D1_CURR_ADDR __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR64"))); +volatile unsigned short mmrMDMA_D1_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR65"))); +volatile unsigned long mmrMDMA_S1_NEXT_DESC_PTR __attribute ((aligned(4), section("SYSMMR66"))); +volatile unsigned long mmrMDMA_S1_START_ADDR __attribute ((aligned(4), section("SYSMMR66"))); +volatile unsigned short mmrMDMA_S1_CONFIG __attribute ((aligned(4), section("SYSMMR66"))); +volatile unsigned short mmrMDMA_S1_X_COUNT __attribute ((aligned(4), section("SYSMMR67"))); +volatile signed short mmrMDMA_S1_X_MODIFY __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_Y_COUNT __attribute ((aligned(4), section("SYSMMR67"))); +volatile signed short mmrMDMA_S1_Y_MODIFY __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned long mmrMDMA_S1_CURR_DESC_PTR __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned long mmrMDMA_S1_CURR_ADDR __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_IRQ_STATUS __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_PERIPHERAL_MAP __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_CURR_X_COUNT __attribute ((aligned(4), section("SYSMMR67"))); +volatile unsigned short mmrMDMA_S1_CURR_Y_COUNT __attribute ((aligned(4), section("SYSMMR68"))); +volatile unsigned short mmrPPI_CONTROL __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrPPI_STATUS __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrPPI_COUNT __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrPPI_DELAY __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrPPI_FRAME __attribute ((aligned(4), section("SYSMMR69"))); +volatile unsigned short mmrTWI_CLKDIV __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_CONTROL __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_SLAVE_CTL __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_SLAVE_STAT __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_SLAVE_ADDR __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_MASTER_CTL __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_MASTER_STAT __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_MASTER_ADDR __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_INT_STAT __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_INT_MASK __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_FIFO_CTL __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_FIFO_STAT __attribute ((aligned(4), section("SYSMMR70"))); +volatile unsigned short mmrTWI_XMT_DATA8 __attribute ((aligned(4), section("SYSMMR71"))); +volatile unsigned short mmrTWI_XMT_DATA16 __attribute ((aligned(4), section("SYSMMR71"))); +volatile unsigned short mmrTWI_RCV_DATA8 __attribute ((aligned(4), section("SYSMMR71"))); +volatile unsigned short mmrTWI_RCV_DATA16 __attribute ((aligned(4), section("SYSMMR71"))); +volatile unsigned short mmrPORTGIO __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_CLEAR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_SET __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_TOGGLE __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKA __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKA_CLEAR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKA_SET __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKA_TOGGLE __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKB __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKB_CLEAR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKB_SET __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_MASKB_TOGGLE __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_DIR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_POLAR __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_EDGE __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_BOTH __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTGIO_INEN __attribute ((aligned(4), section("SYSMMR72"))); +volatile unsigned short mmrPORTHIO __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_CLEAR __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_SET __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_TOGGLE __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKA __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKA_CLEAR __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKA_SET __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKA_TOGGLE __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKB __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKB_CLEAR __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKB_SET __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_MASKB_TOGGLE __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_DIR __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_POLAR __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_EDGE __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_BOTH __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrPORTHIO_INEN __attribute ((aligned(4), section("SYSMMR73"))); +volatile unsigned short mmrUART1_THR __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_IER __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_IIR __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_LCR __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_MCR __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_LSR __attribute ((aligned(4), section("SYSMMR74"))); +volatile unsigned short mmrUART1_SCR __attribute ((aligned(4), section("SYSMMR75"))); +volatile unsigned short mmrUART1_GCTL __attribute ((aligned(4), section("SYSMMR76"))); +volatile unsigned long mmrEMAC_OPMODE __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_ADDRLO __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_ADDRHI __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_HASHLO __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_HASHHI __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_STAADD __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_STADAT __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_FLC __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_VLAN1 __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_VLAN2 __attribute ((aligned(4), section("SYSMMR77"))); +volatile unsigned long mmrEMAC_WKUP_CTL __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK0 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK1 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK2 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFMSK3 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFCMD __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFOFF __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFCRC0 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_WKUP_FFCRC1 __attribute ((aligned(4), section("SYSMMR78"))); +volatile unsigned long mmrEMAC_SYSCTL __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_SYSTAT __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_RX_STAT __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_RX_STKY __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_RX_IRQE __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_TX_STAT __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_TX_STKY __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_TX_IRQE __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_MMC_CTL __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_MMC_RIRQS __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_MMC_RIRQE __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_MMC_TIRQS __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned long mmrEMAC_MMC_TIRQE __attribute ((aligned(4), section("SYSMMR79"))); +volatile unsigned short mmrEMAC_PTP_CTL __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned short mmrEMAC_PTP_IE __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned short mmrEMAC_PTP_ISTAT __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_FOFF __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_FV1 __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_FV2 __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_FV3 __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_ADDEND __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_ACCR __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_OFFSET __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_TIMELO __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_TIMEHI __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_RXSNAPLO __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_RXSNAPHI __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_TXSNAPLO __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_TXSNAPHI __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_ALARMLO __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_ALARMHI __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned short mmrEMAC_PTP_ID_OFF __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_ID_SNAP __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_PPS_STARTLOP __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_PPS_STARTHIP __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_PTP_PPS_PERIOD __attribute ((aligned(4), section("SYSMMR80"))); +volatile unsigned long mmrEMAC_RXC_OK __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_FCS __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_ALIGN __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_OCTET __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_DMAOVF __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_UNICST __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_MULTI __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_BROAD __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LNERRI __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LNERRO __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LONG __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_MACCTL __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_OPCODE __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_PAUSE __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_ALLFRM __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_ALLOCT __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_TYPED __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_SHORT __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_EQ64 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LT128 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LT256 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LT512 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_LT1024 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_RXC_GE1024 __attribute ((aligned(4), section("SYSMMR81"))); +volatile unsigned long mmrEMAC_TXC_OK __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_1COL __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_GT1COL __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_OCTET __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_DEFER __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_LATECL __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_XS_COL __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_DMAUND __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_CRSERR __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_UNICST __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_MULTI __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_BROAD __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_XS_DFR __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_MACCTL __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_ALLFRM __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_ALLOCT __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_EQ64 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_LT128 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_LT256 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_LT512 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_LT1024 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_GE1024 __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned long mmrEMAC_TXC_ABORT __attribute ((aligned(4), section("SYSMMR82"))); +volatile unsigned short mmrPORTF_FER __attribute ((aligned(4), section("SYSMMR83"))); +volatile unsigned short mmrPORTG_FER __attribute ((aligned(4), section("SYSMMR83"))); +volatile unsigned short mmrPORTH_FER __attribute ((aligned(4), section("SYSMMR83"))); +volatile unsigned short mmrPORTF_MUX __attribute ((aligned(4), section("SYSMMR84"))); +volatile unsigned short mmrPORTG_MUX __attribute ((aligned(4), section("SYSMMR84"))); +volatile unsigned short mmrPORTH_MUX __attribute ((aligned(4), section("SYSMMR84"))); +volatile unsigned short mmrPORTF_DRIVE __attribute ((aligned(4), section("SYSMMR85"))); +volatile unsigned short mmrPORTG_DRIVE __attribute ((aligned(4), section("SYSMMR85"))); +volatile unsigned short mmrPORTH_DRIVE __attribute ((aligned(4), section("SYSMMR85"))); +volatile unsigned short mmrPORTF_HYSTERESIS __attribute ((aligned(4), section("SYSMMR86"))); +volatile unsigned short mmrPORTG_HYSTERESIS __attribute ((aligned(4), section("SYSMMR86"))); +volatile unsigned short mmrPORTH_HYSTERESIS __attribute ((aligned(4), section("SYSMMR86"))); +volatile unsigned short mmrNONGPIO_DRIVE __attribute ((aligned(4), section("SYSMMR87"))); +volatile unsigned short mmrNONGPIO_HYSTERESIS __attribute ((aligned(4), section("SYSMMR88"))); +volatile unsigned short mmrHMDMA0_CONTROL __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_ECINIT __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_BCINIT __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_ECURGENT __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_ECOVERFLOW __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_ECOUNT __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA0_BCOUNT __attribute ((aligned(4), section("SYSMMR89"))); +volatile unsigned short mmrHMDMA1_CONTROL __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_ECINIT __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_BCINIT __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_ECURGENT __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_ECOVERFLOW __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_ECOUNT __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrHMDMA1_BCOUNT __attribute ((aligned(4), section("SYSMMR90"))); +volatile unsigned short mmrSPI1_CTL __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_FLG __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_STAT __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_TDBR __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_RDBR __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_BAUD __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrSPI1_SHADOW __attribute ((aligned(4), section("SYSMMR91"))); +volatile unsigned short mmrCNT_CONFIG __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned short mmrCNT_IMASK __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned short mmrCNT_STATUS __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned short mmrCNT_COMMAND __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned short mmrCNT_DEBOUNCE __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned long mmrCNT_COUNTER __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned long mmrCNT_MAX __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned long mmrCNT_MIN __attribute ((aligned(4), section("SYSMMR92"))); +volatile unsigned long mmrSECURE_SYSSWT __attribute ((aligned(4), section("SYSMMR93"))); +volatile unsigned short mmrSECURE_CONTROL __attribute ((aligned(4), section("SYSMMR93"))); +volatile unsigned short mmrSECURE_STATUS __attribute ((aligned(4), section("SYSMMR93"))); +volatile unsigned long mmrOTP_DATA0 __attribute ((aligned(4), section("SYSMMR94"))); +volatile unsigned long mmrOTP_DATA1 __attribute ((aligned(4), section("SYSMMR94"))); +volatile unsigned long mmrOTP_DATA2 __attribute ((aligned(4), section("SYSMMR94"))); +volatile unsigned long mmrOTP_DATA3 __attribute ((aligned(4), section("SYSMMR94"))); +volatile unsigned short mmrPWM_CTRL __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_STAT __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_TM __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_DT __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_GATE __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHA __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHB __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHC __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_SEG __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_SYNCWT __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHAL __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHBL __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_CHCL __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_LSI __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrPWM_STAT2 __attribute ((aligned(4), section("SYSMMR95"))); +volatile unsigned short mmrRSI_PWR_CONTROL __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_CLK_CONTROL __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_ARGUMENT __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_COMMAND __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_RESP_CMD __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_RESPONSE0 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_RESPONSE1 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_RESPONSE2 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_RESPONSE3 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_DATA_TIMER __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_DATA_LGTH __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_DATA_CONTROL __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_DATA_CNT __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_STATUS __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_STATUSCL __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_MASK0 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned long mmrRSI_MASK1 __attribute ((aligned(4), section("SYSMMR96"))); +volatile unsigned short mmrRSI_FIFO_CNT __attribute ((aligned(4), section("SYSMMR97"))); +volatile unsigned short mmrRSI_CEATA_CONTROL __attribute ((aligned(4), section("SYSMMR97"))); +volatile unsigned long mmrRSI_FIFO __attribute ((aligned(4), section("SYSMMR98"))); +volatile unsigned short mmrRSI_ESTAT __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_EMASK __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_CONFIG __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_RD_WAIT_EN __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_PID0 __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_PID1 __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_PID2 __attribute ((aligned(4), section("SYSMMR99"))); +volatile unsigned short mmrRSI_PID3 __attribute ((aligned(4), section("SYSMMR99"))); + diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf548/hw_serial.cfg b/uzume_prototype/kernel/config/blackfin/_common_bf548/hw_serial.cfg new file mode 100644 index 0000000..1995579 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf548/hw_serial.cfg @@ -0,0 +1,6 @@ +/* + * SIOドライバ(ADSP-BF548用)のコンフィギュレーションファイル + */ +INCLUDE("\"hw_serial.h\""); +DEF_INH(INHNO_SIO1_RX, { TA_HLNG, sio1_rx_handler }); +DEF_INH(INHNO_SIO1_TX, { TA_HLNG, sio1_tx_handler }); diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf548/hw_serial.h b/uzume_prototype/kernel/config/blackfin/_common_bf548/hw_serial.h new file mode 100644 index 0000000..3bd39e4 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf548/hw_serial.h @@ -0,0 +1,158 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + */ + +/* + * シリアルI/Oデバイス(SIO)ドライバ(Blackfin UART用) + * + * このファイルは、TOPPERS/JSP 1.4.2の config/sh3/ms7727cp01/hw_serial.hを + * リネームし、内部の識別子を変更したものである。 + * + * このファイルは下位のデバイス・アクセス・ルーチンを束ねて上位の層に渡す + * ためのものである。Blackfinの外部にあるシリアルをTOPPERS/JSPで管理しない + * のなら、変更する必要はない。 + */ + +#ifndef _HW_SERIAL_H_ +#define _HW_SERIAL_H_ + +#include + +#include "uart.h" + +#ifdef __GNUC__ // gcc +#include "cdefBF548.h" +#elif defined(__ECC__) // visualdsp +#include +#else +#error "Compiler is not supported" +#endif + + +/* + * SIOドライバの初期化ルーチン + */ +#define sio_initialize uart_initialize + +#ifndef _MACRO_ONLY +/* + * シリアルI/Oポートのオープン + */ +Inline SIOPCB * +sio_opn_por(ID siopid, VP_INT exinf) +{ + SIOPCB *siopcb; + UW regBase; + + /* + * デバイス依存のオープン処理. + */ + siopcb = uart_opn_por(siopid, exinf); + + /* + * Enable Corrensponding Interrupt at IMASK + */ + regBase = siopcb->siopinib->reg_base; + if ( regBase == UART0_ADDRESS ) { // UART0の場合 + ena_int( INTNO_UART0_TX ); + ena_int( INTNO_UART0_RX ); + *pPORTH_MUX &= ~(0x0003C000); // bit3:0 だけを0にする + *pPORTH_FER |= 0x0180; // PE7,PE8をUART0に割り振る + } + else if ( regBase == UART1_ADDRESS ){ // uart1の場合 + ena_int( INTNO_UART1_TX ); + ena_int( INTNO_UART1_RX ); + *pPORTH_MUX &= ~(0x000F); // bit3:0 だけを0にする + *pPORTH_FER |= 0x0003; // PH0,PH1をUART1に割り振る + } + + return(siopcb); +} + +/* + * シリアルI/Oポートのクローズ + */ +Inline void +sio_cls_por(SIOPCB *siopcb) +{ + + /* + * デバイス依存のクローズ処理. + */ + uart_cls_por(siopcb); +} + + +/* + * SIOの割込みハンドラ + */ +#define sio0_rx_handler uart0_rx_isr +#define sio0_tx_handler uart0_tx_isr +#define sio1_rx_handler uart1_rx_isr +#define sio1_tx_handler uart1_tx_isr + +/* + * シリアルI/Oポートへの文字送信 + */ +#define sio_snd_chr uart_snd_chr + +/* + * シリアルI/Oポートからの文字受信 + */ +#define sio_rcv_chr uart_rcv_chr + +/* + * シリアルI/Oポートからのコールバックの許可 + */ +#define sio_ena_cbr uart_ena_cbr + +/* + * シリアルI/Oポートからのコールバックの禁止 + */ +#define sio_dis_cbr uart_dis_cbr + +/* + * シリアルI/Oポートからの送信可能コールバック + */ +#define sio_ierdy_snd uart_ierdy_snd + +/* + * シリアルI/Oポートからの受信通知コールバック + */ +#define sio_ierdy_rcv uart_ierdy_rcv + +#endif /* _MACRO_ONLY */ +#endif /* _HW_SERIAL_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf548/hw_timer.h b/uzume_prototype/kernel/config/blackfin/_common_bf548/hw_timer.h new file mode 100644 index 0000000..75ae793 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf548/hw_timer.h @@ -0,0 +1,142 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2009 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * Copyright (C) 2010,2011 by Kaneko System Co., Ltd. + * + * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + +/* + * タイマドライバ(ADSP-BF548用) + * + */ + +#ifndef _HW_TIMER_H_ +#define _HW_TIMER_H_ + +#include + + +#ifndef _MACRO_ONLY + +#ifdef __GNUC__ // gcc +#include "cdefBF548.h" +#elif defined(__ECC__) // visualdsp +#include +#else +#error "Compiler is not supported" +#endif + +//#include + + + + +/************************************************************** + * タイマの起動処理 + * + * タイマを初期化し,周期的なタイマ割込み要求を発生させる. + * + **************************************************************/ +Inline void +hw_timer_initialize() +{ + +#ifdef USE_TIC_CORE + // Core timer + *pTCNTL = TMPWR; // power up timer; + *pTPERIOD = CORECLOCK/1000; // CORE CLOCK is defined in sys_config.h + *pTCNTL = TMPWR | TMREN | TAUTORLD; +#else + // GPT7(General-purpose timer7) + + *pTIMER7_CONFIG = PERIOD_CNT | OUT_DIS |IRQ_ENA | PWM_OUT; // PWM_OUT, Output Pad disable + *pTIMER7_PERIOD = SYSCLOCK/1000; // SYS CLOCK is defined in sys_config.h + *pTIMER7_WIDTH = 1; // 0 < width < period + *pTIMER_ENABLE0 = TIMEN7; // timer7 start + + ena_int( INHNO_TIMER ); // enable Timer Interrupt + +#endif + asm("ssync;"); + +} + +/************************************************************** + * タイマ割込み要求のクリア + **************************************************************/ +Inline void +hw_timer_int_clear() +{ +#ifdef USE_TIC_CORE + // Core timer + /* TINTはW1Cではないので、TINTのTINTビットは0を書き込む */ + *pTCNTL = TMPWR | TMREN | TAUTORLD; +#else + // GPT7(General-purpose timer7) + *pTIMER_STATUS0 = TIMIL7; +#endif + asm("ssync;"); +} + +/************************************************************** + * タイマの停止処理 + * + * タイマの動作を停止させる. + **************************************************************/ +Inline void +hw_timer_terminate() +{ + /* + * タイマの動作を停止する. + */ +#ifdef USE_TIC_CORE + // Core timer + *pTCNTL = TMPWR | TAUTORLD; // 停止 + *pTCNTL = 0; // パワーダウンモード +#else + // GPT2(General-purpose timer7) + *pTIMER_DISABLE0 = TIMDIS7; // timer7 disable +#endif + asm("ssync;"); +} + + +#endif /* _MACRO_ONLY */ +#endif /* _HW_TIMER_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf548/sys_rename.def b/uzume_prototype/kernel/config/blackfin/_common_bf548/sys_rename.def new file mode 100644 index 0000000..6b882a6 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf548/sys_rename.def @@ -0,0 +1,6 @@ +make_priority_mask +device_dispatcher +boot_for_gdb +siopinib_table +sprious_int_handler +sprious_exp_handler diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf548/sys_rename.h b/uzume_prototype/kernel/config/blackfin/_common_bf548/sys_rename.h new file mode 100644 index 0000000..5c47631 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf548/sys_rename.h @@ -0,0 +1,27 @@ +/* This file is generated from sys_rename.def by genrename. */ + +#ifndef _SYS_RENAME_H_ +#define _SYS_RENAME_H_ + +#define make_priority_mask _kernel_make_priority_mask +#define device_dispatcher _kernel_device_dispatcher +#define boot_for_gdb _kernel_boot_for_gdb +#define siopinib_table _kernel_siopinib_table +#define sprious_int_handler _kernel_sprious_int_handler +#define sprious_exp_handler _kernel_sprious_exp_handler + + + + + +#ifdef LABEL_ASM + +#define _make_priority_mask __kernel_make_priority_mask +#define _device_dispatcher __kernel_device_dispatcher +#define _boot_for_gdb __kernel_boot_for_gdb +#define _siopinib_table __kernel_siopinib_table +#define _sprious_int_handler __kernel_sprious_int_handler +#define _sprious_exp_handler __kernel_sprious_exp_handler + +#endif /* LABEL_ASM */ +#endif /* _SYS_RENAME_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf548/sys_unrename.h b/uzume_prototype/kernel/config/blackfin/_common_bf548/sys_unrename.h new file mode 100644 index 0000000..ee9dd28 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf548/sys_unrename.h @@ -0,0 +1,23 @@ +/* This file is generated from sys_rename.def by genrename. */ + +#ifdef _SYS_UNRENAME_H_ +#undef _SYS_UNRENAME_H_ + +#undef make_priority_mask +#undef device_dispatcher +#undef boot_for_gdb +#undef siopinib_table +#undef sprious_int_handler +#undef sprious_exp_handler + +#ifdef LABEL_ASM + +#undef _make_priority_mask +#undef _device_dispatcher +#undef _boot_for_gdb +#undef _siopinib_table +#undef _sprious_int_handler +#undef _sprious_exp_handler + +#endif /* LABEL_ASM */ +#endif /* _SYS_UNRENAME_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf592/bf592elf.ld b/uzume_prototype/kernel/config/blackfin/_common_bf592/bf592elf.ld new file mode 100644 index 0000000..a451f46 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf592/bf592elf.ld @@ -0,0 +1,266 @@ + +OUTPUT_FORMAT("elf32-bfin","elf32-bfin","elf32-bfin") +OUTPUT_ARCH(bfin) + +PROVIDE (ldf_stack_end = 0xffb00FFC ) ; +PROVIDE (hardware_init_hook = 0) ; +PROVIDE (software_init_hook = 0) ; +PROVIDE (software_term_hook = 0) ; +PROVIDE (__kernel_boot_for_gdb = 0); +ENTRY (start); + +MEMORY + { + + MEM_L1_DATA_A (W!X) : ORIGIN = 0xff800000, LENGTH = 32K + MEM_L1_CODE (XR) : ORIGIN = 0xffa00000, LENGTH = 32K + MEM_L1_SCRATCH (W!X) : ORIGIN = 0xffb00000, LENGTH = 4K + + } + +SECTIONS +{ + +/* Read-only sections, merged into text segment: */ + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } + .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } + .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } + .rel.data.rel.ro : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) } + .rela.data.rel.ro : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) } + .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } + .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } + .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } + .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } + .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } + .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.sdata : { *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*) } + .rela.sdata : { *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*) } + .rel.sbss : { *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*) } + .rela.sbss : { *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*) } + .rel.sdata2 : { *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*) } + .rela.sdata2 : { *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*) } + .rel.sbss2 : { *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*) } + .rela.sbss2 : { *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*) } + .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } + .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + .l2 : + { + *(.l2 .l2.*) + } >MEM_L1_DATA_A + + .start : + { + KEEP (*(.start)) + } >MEM_L1_CODE =0 + + .text : + { + *(.text .stub .text.* .gnu.linkonce.t.*) + KEEP (*(.text.*personality*)) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + } >MEM_L1_CODE =0 + + .init : + { + KEEP (*(.init)) + } >MEM_L1_CODE =0 + + .plt : { *(.plt) } >MEM_L1_CODE + + .fini : + { + KEEP (*(.fini)) + } >MEM_L1_CODE =0 + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } >MEM_L1_DATA_A + .rodata1 : { *(.rodata1) } >MEM_L1_DATA_A + + .sdata2 : + { + *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) + } >MEM_L1_DATA_A + + .sbss2 : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) } >MEM_L1_DATA_A + .eh_frame_hdr : { *(.eh_frame_hdr) } >MEM_L1_DATA_A + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } >MEM_L1_DATA_A + .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } >MEM_L1_DATA_A + + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = ALIGN(0x1000) + (. & (0x1000 - 1)); + /* Exception handling */ + .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } >MEM_L1_DATA_A + .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } >MEM_L1_DATA_A + /* Thread Local Storage sections */ + .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } >MEM_L1_DATA_A + .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } >MEM_L1_DATA_A + .preinit_array : + { + PROVIDE_HIDDEN (___preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (___preinit_array_end = .); + } >MEM_L1_DATA_A + .init_array : + { + PROVIDE_HIDDEN (___init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE_HIDDEN (___init_array_end = .); + } >MEM_L1_DATA_A + .fini_array : + { + PROVIDE_HIDDEN (___fini_array_start = .); + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + PROVIDE_HIDDEN (___fini_array_end = .); + } >MEM_L1_DATA_A + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin*.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*crtend*.o(.ctors)) + } >MEM_L1_DATA_A + .dtors : + { + KEEP (*crtbegin*.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*crtend*.o(.dtors)) + } >MEM_L1_DATA_A + .jcr : { KEEP (*(.jcr)) } >MEM_L1_DATA_A + .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) } >MEM_L1_DATA_A + .dynamic : { *(.dynamic) } >MEM_L1_DATA_A + .data : + { + *(.data .data.* .gnu.linkonce.d.*) + KEEP (*(.gnu.linkonce.d.*personality*)) + SORT(CONSTRUCTORS) + } >MEM_L1_DATA_A + .data1 : { *(.data1) } >MEM_L1_DATA_A + .got : { *(.got.plt) *(.got) } >MEM_L1_DATA_A + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : + { + *(.sdata .sdata.* .gnu.linkonce.s.*) + } >MEM_L1_DATA_A + __edata = .; PROVIDE (_edata = .); + .sbss : + { + __bss_start = .; + *(.dynsbss) + *(.sbss .sbss.* .gnu.linkonce.sb.*) + *(.scommon) + } >MEM_L1_DATA_A + .bss : + { + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. + FIXME: Why do we need it? When there is no .bss section, we don't + pad the .data section. */ + . = ALIGN(. != 0 ? 32 / 8 : 1); + __bss_end = .; + } >MEM_L1_DATA_A + . = ALIGN(32 / 8); + . = ALIGN(32 / 8); + __end = .; PROVIDE (_end = .); + + __heap_start = .; + __heap_end = ORIGIN(MEM_L1_DATA_A) + LENGTH(MEM_L1_DATA_A); + + + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + + __stack_end = ORIGIN(MEM_L1_SCRATCH) + LENGTH(MEM_L1_SCRATCH); + + + + PROVIDE (end = .) ; + + + .comment 0 : { *(.comment) } + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } +} diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf592/chip_config.c b/uzume_prototype/kernel/config/blackfin/_common_bf592/chip_config.c new file mode 100644 index 0000000..f5c2fac --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf592/chip_config.c @@ -0,0 +1,350 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)縲鰀(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + +/* + * ターゲットシステム依存モジュール(ADSP-BF592用) + */ + + +#include "jsp_kernel.h" +#include + +#ifdef __GNUC__ +#include /* gnu tool chain */ +#elif defined(__ECC__) +#include /* VisualDSP++ */ +#include +#include +#else +#error "Compiler is not supported" +#endif + + + // セルフネストと64bitカウンタをイネーブルにする +#define SYSCFG_VALUE 0x36 + +/* + * ターゲットシステム依存の初期化 + */ +void +sys_initialize() +{ + Asm( "SYSCFG=%0;" : :"d"(SYSCFG_VALUE) ) ; + + /* + * スプリアス割り込みハンドラの設定 + * + * cpu_initialize()が行うダミーの割り込みハンドラの設定を上書きする。 + * アプリケーションが割り込みハンドラを設定すると、以下の設定も上書き + * される。 + */ + int i; + + for ( i=0; i> 8; + *pUART0_LCR &= ~DLAB; + + /* モード設定, パリティ無し 8bit data, 1 stop bit */ + *pUART0_LCR = 0x03; + + /* 割込み禁止 */ + *pUART0_IER = 0; + + /* ADSP-BF592のUART0をPINに割り当てる */ + *pPORTF_MUX &= 0xE7FF; // bit 11,12を0に + *pPORTF_FER |= 0x1800; // bit 11,12を1に + + +} + +/* リセット直後のIVGx SIC_IARx対応表。16エントリがIVG0からIVG15を + * 表現している。ビットマップはSIC_ISRのビットマップに対応しており、 + * リセット直後、SIC_IARxによってSICのどの割り込みがどの優先順位に + * 対応しているかを表す。 ADSP-BF59x Blackfin Processor Hardware + * Referenceの Fig 4-3を参照 */ + +unsigned int priority_mask[16]={ +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x1E0000FF, +0x00000100, +0x00001E00, +0x0001E000, +0x003E0000, +0x01C00000, +0xE0000000, +0x00000000, +0x00000000 +}; + + +/* +* SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み +* のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので +* その分補正する。 +*/ +#define INSTALL_PRIORITY \ + for ( i=0; i<8; i++ ){ \ + priority = iar & 0xf; /* IARから優先順位を取り出す */ \ + priority_mask[priority + 7] |= device; /* 取り出した優先順位に基づきデバイスを登録 */ \ + device <<= 1; /* 次のデバイス */ \ + iar >>= 4; /* 次のIARフィールド */ \ + } + +void make_priority_mask( void ) +{ + unsigned int i, priority, device, iar; + + + /* + * 割り込み順位ごとのISRビットマップの作成 + * SIC_IARxの設定はこの部分より前に済ませること + */ + + for ( i=0; i<16; i++ ){ + priority_mask[i] = 0; + } + + device = 1; + iar = *pSIC_IAR0; + INSTALL_PRIORITY + + iar = *pSIC_IAR1; + INSTALL_PRIORITY + + iar = *pSIC_IAR2; + INSTALL_PRIORITY + +} + + +/* + * 割り込みの許可、禁止 + * + */ +ER ena_int( INTNO intno ) +{ + unsigned int mask; + + if ( intno >= DEVICE_INTERRUPT_COUNT ) + return ( E_PAR ); + else { + SIL_PRE_LOC; + + mask = 1 << intno; + SIL_LOC_INT(); // 管理外割り込みまで禁止する + *pSIC_IMASK |= mask; + asm volatile( "ssync;" ); + SIL_UNL_INT(); // 割り込み再許可 + return (0); + } +} +/* + * dis_int()は、この実装ではSIC_IMASKの指定ビットをクリアする。 + * + * しかし、SIC_IMASKのクリアはアプリケーション実行中には危険であり、 + * Blackfinのマニュアルでも婉曲的に禁止されている。そのため、TOPPERS/JSP for Blackfin + * では、この関数を実装しない。 + * +ER dis_int( INTNO intno ) +{ + unsigned int mask; + + if ( intno >= DEVICE_INTERRUPT_COUNT ) + return ( E_PAR ); + else { + mask = 1 << intno; + mask = ~mask; + *pSIC_IMASK &= mask; + return (0); + } +} +*/ + +/* + * chg_ims()は、この実装ではSIC_IMASKを変更する。 + * + * しかし、SIC_IMASKのビットのクリアはアプリケーション実行中には危険であり、 + * Blackfinのマニュアルでも婉曲的に禁止されている。そのため、TOPPERS/JSP for + * Blackfinでは、この関数を実装しない。 + * +ER chg_ims( IMS ims ) +{ + *pSIC_IMASK = ims; + return( 0 ); +} +*/ + + +extern ER get_ims( IMS * p_ims ) +{ + *p_ims = *pSIC_IMASK; + return( 0 ); +} + + +/* + * 割り込みをデバイスに割り当てる + */ +void device_dispatcher( unsigned int priority, unsigned int imask ) +{ + unsigned int candidates, device; + + candidates = priority_mask[priority] & *pSIC_ISR & *pSIC_IMASK; // 現在のプライオリティに相当する割込み源を特定する + + asm volatile("sti %0;": : "d"(imask) ); + + if ( ! candidates ) // 割り込み源が特定できないなら、コア由来である + { + if ( priority == ik_hardware_err) + dev_vector[INHNO_HW_ERROR](); + else + if ( priority == ik_timer) + dev_vector[INHNO_TIMER](); + else + dev_vector[INHNO_RAISE](); // ソフトウェア割り込み + + } + else + { + if ( candidates & 0x80000000 ) + device = 31; + else + { +#ifdef __GNUC__ + asm ( "r1.L = signbits %1; %0 = r1.L(z);":"=d"(device) :"d"(candidates): "R1" ); +#elif defined(__ECC__) + asm( "%0 = signbits %1;" : "=l"( device ) : "d"( candidates ) ); +#else +#error "Compiler is not supported" +#endif + device = 30 - device; // bit mask is converted to bit number + } + dev_vector[device](); + } +} + + + +/* + * ターゲットシステムの終了 + */ +void +sys_exit() +{ + while(1) + ; +} +/* + * ターゲットシステムの文字出力 + */ +void +sys_putc(char c) +{ + if ( c== 0x0A ) /* もし LF ならば */ + sys_putc( 0x0D ); /* CRを一文字送信 */ + + while( !( *pUART0_LSR & (1<<5)) ) + ; /* UART0 LSRのTHREが1になるまで待つ。1ならば送信レジスタ空き。*/ + + *pUART0_THR = c; /* 一文字送信 */ +} + + + diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf592/chip_config.h b/uzume_prototype/kernel/config/blackfin/_common_bf592/chip_config.h new file mode 100644 index 0000000..90f5354 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf592/chip_config.h @@ -0,0 +1,278 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +#ifndef _CHIP_CONFIG_H_ +#define _CHIP_CONFIG_H_ + + +/* + * ターゲットシステム依存モジュール(ADSP-BF592共用) + * + * このインクルードファイルは,t_config.h のみからインクルードされる. + * 他のファイルから直接インクルードしてはならない. +*/ + +/* + * ターゲットシステムのハードウェア資源の定義 + * + * DEVICE_INTERRUPT_COUNTはSIC_IMASKのビット数 + * を与える。 + * ADSP-BF592のビット数は32なので、値は32である。 + */ + +#define DEVICE_INTERRUPT_COUNT 32 + + + +/* + * PLLクロック周波数計算マクロ + * + * 変更してはならない。パラメータはsys_config.hで与える。 + */ +#define PLLCLOCK (CLKIN*MSELVAL) +#define SYSCLOCK (PLLCLOCK / SSELVAL) +#define CORECLOCK (PLLCLOCK / CSELVAL) + + + +/* + * TICの割込みハンドラのベクタ番号 + */ +#ifdef USE_TIC_CORE +#define INHNO_TIMER INHNO_CORE_TIMER +#else +#define INHNO_TIMER INHNO_GP_TIMER2 +#endif + + +/* + * 微少時間待ちのための定義 + * sil_dly_nseの呼び出しオーバーヘッドとループボディーサイクルを + * nSで表す。関数はcpu_support.asmに定義してある。 + * SIL_DLY_TIM1は24サイクル。60nS( 400MHz ) + * SIL_DLY_TIM2は12サイクル。30nS( 400MHz ) + */ + + +#define SIL_DLY_TIM1 (24*1000000000/CORECLOCK) +#define SIL_DLY_TIM2 (12*1000000000/CORECLOCK) + +/************************************************************************* + * uart.c用構成マクロ + */ + +/* シリアルの割込みハンドラのベクタ番号 */ +#define INHNO_SIO0_TX INHNO_UART0_TX +#define INHNO_SIO0_RX INHNO_UART0_RX + +/* + * UARTレジスタの配置境界。ADSP-BF592の内蔵UARTは4バイト周期でレジスタが + * 並んでいるので、ここには4を指定する。 + */ +#define UART_BOUNDARY 4 + +/* UARTレジスタにsil_xxb_iop()を使ってアクセスするときにはUART_IOP_ACCESSを 宣言する。*/ +#define UART_IOP_ACCESS + +/* シリアルポートのアドレス。 */ +#define UART0_ADDRESS 0xFFC00400 // 内蔵UART THRのアドレス。 + +/* UARTのボーレートジェネレータに設定すべき値. */ +#define UART0_DIVISOR SYSCLOCK/16/UART0_BAUD_RATE + +/* 内蔵UARTを使う場合は、UARTx_BLACKFIN_UCENを宣言してUCENを初期化しなければならない。*/ +#define UART0_BLACKFIN_UCEN + + +/* + * uart.c用構成マクロ終わり + *************************************************************************/ + + + +/* + * 割り込みベクトル番号 + * + * この定義はコンフィグレーションファイルでDEF_INHの引数として使う + * SIC_ISRにおけるビット番号である。 + * + */ +#define INHNO_PLL 0 +#define INHNO_DMA_ERROR 1 +#define INHNO_PPI_ERROR 2 +#define INHNO_SPORT0_ERROR 3 +#define INHNO_SPORT1_ERROR 4 +#define INHNO_SPI0_ERROR 5 +#define INHNO_SPI1_ERROR 6 +#define INHNO_UART0_ERROR 7 +#define INHNO_PPI 8 +#define INHNO_SPORT0_RX 9 +#define INHNO_SPORT0_TX 10 +#define INHNO_SPORT1_RX 11 +#define INHNO_SPORT1_TX 12 +#define INHNO_SPI0 13 +#define INHNO_SPI1 14 +#define INHNO_UART0_RX 15 +#define INHNO_UART0_TX 16 +#define INHNO_PFA 17 +#define INHNO_PFB 18 +#define INHNO_GP_TIMER0 19 +#define INHNO_GP_TIMER1 20 +#define INHNO_GP_TIMER2 21 +#define INHNO_PGA 22 +#define INHNO_PGB 23 +#define INHNO_TWI 24 +#define INHNO_MEMORY_DMA0 29 +#define INHNO_MEMORY_DMA1 30 +#define INHNO_WDG 31 + +// SIC_ISRにない特殊な割り込み +#define INHNO_HW_ERROR 32 +#define INHNO_CORE_TIMER 33 +#define INHNO_RAISE 34 + + +/* + * SIC_ISRの割り込みのベクタ番号 + * + * この定義はena_int, dis_intの引数として使う。 + */ + +#define INTNO_PLL 0 +#define INTNO_DMA_ERROR 1 +#define INTNO_PPI_ERROR 2 +#define INTNO_SPORT0_ERROR 3 +#define INTNO_SPORT1_ERROR 4 +#define INTNO_SPI0_ERROR 5 +#define INTNO_SPI1_ERROR 6 +#define INTNO_UART0_ERROR 7 +#define INTNO_PPI 8 +#define INTNO_SPORT0_RX 9 +#define INTNO_SPORT0_TX 10 +#define INTNO_SPORT1_RX 11 +#define INTNO_SPORT1_TX 12 +#define INTNO_SPI0 13 +#define INTNO_SPI1 14 +#define INTNO_UART0_RX 15 +#define INTNO_UART0_TX 16 +#define INTNO_PFA 17 +#define INTNO_PFB 18 +#define INTNO_GP_TIMER0 19 +#define INTNO_GP_TIMER1 20 +#define INTNO_GP_TIMER2 21 +#define INTNO_PGA 22 +#define INTNO_PGB 23 +#define INTNO_TWI 24 +#define INTNO_MEMORY_DMA0 29 +#define INTNO_MEMORY_DMA1 30 +#define INTNO_WDG 31 + + + +#ifndef _MACRO_ONLY + +/* +* SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み +* のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので +* その分補正する。 +*/ +void make_priority_mask( void ); + +/* + * ターゲットシステム依存の初期化 + */ +extern void sys_initialize(void); + +/* + * ターゲットシステムの終了 + * + * システムを終了する時に使う.ROMモニタ/GDB STUB呼出しで実現する. + */ +extern void sys_exit(void); + +/* + * ターゲットシステムの文字出力 + * + * システムの低レベルの文字出力ルーチン.ROMモニタ/GDB STUB呼出しで実 + * 現する. + */ +extern void sys_putc(char c); + +/* +* SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み +* のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので +* その分補正する。 +*/ +void make_priority_mask( void ); + +/* + * 割り込みの許可、禁止 + * + */ +typedef unsigned int INTNO; +extern ER ena_int( INTNO intno ); +extern ER dis_int( INTNO intno ); + +/* + * 割り込みマスクの操作 + * + * + */ +typedef unsigned int IMS; +extern ER chg_ims( IMS ims ); +extern ER get_ims( IMS * p_ims ); + +/** + * スプリアス・イベント・ハンドラ + */ +void spurious_exc_handler(VP p_excinf); +void spurious_int_handler(); + +/* + * 割り込みを起こしたデバイスを調べる +*/ +extern void device_dispatcher( unsigned int priority, unsigned int imask ); + +#endif /* _MACRO_ONLY */ +#endif /* _CHIP_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf592/chip_debugboot.c b/uzume_prototype/kernel/config/blackfin/_common_bf592/chip_debugboot.c new file mode 100644 index 0000000..e25984e --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf592/chip_debugboot.c @@ -0,0 +1,40 @@ +#include "jsp_kernel.h" +#include "sil.h" + +#ifdef __GNUC__ +#include /* gnu tool chain */ +#elif defined(__ECC__) +#include /* VisualDSP++ */ +#include +#include +#else +#error "Compiler is not supported" +#endif + +/* +* gdbserverがターゲットのリセット機能を提供しないため、gdb経由でターゲット +* にアプリッケーションをダウンロードすると正しく動作しないことがある。 +* このルーチンはターゲットを一度だけリセットする。 +* +* なお、パラメータ debugが FALSEの場合、リセットはしない +*/ +void boot_for_gdb(void) +{ + // SYSTEM_RESET 0x0007 + // DOUBLE_FAULT 0x0008 + // RESET_DOUBLE 0x2000 + // RESET_WDOG 0x4000 + // RESET_SOFTWARE 0x8000 + if ( enable_boot_for_gdb ){ + enable_boot_for_gdb = 0; /* 次はブートしない */ + *pSWRST = 0x07; /* 内蔵ペリフェラルのリセット */ + asm volatile( "ssync;" ); + *pSWRST = 0x00; /* 内蔵ペリフェラルのリセット解除。 */ + asm volatile( "ssync;" ); + *pSYSCR |= 0x10; /* no boot on core reset */ + asm volatile( "ssync;" ); + asm volatile( "raise 1;" ); /* コアリセット */ + while( 1 ) + ; /*リセットが発生するまでループ*/ + } +} diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf592/chip_defs.h b/uzume_prototype/kernel/config/blackfin/_common_bf592/chip_defs.h new file mode 100644 index 0000000..6d37c3d --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf592/chip_defs.h @@ -0,0 +1,89 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +/* + * ターゲットシステムに依存する定義(ADSP-BF592用) + * + * このインクルードファイルは,kernel.h と sil.h でインクルードされる. + * 他のファイルから直接インクルードすることはない.このファイルをイン + * クルードする前に,t_stddef.h と itron.h がインクルードされるので, + * それらに依存してもよい. + */ + +#ifndef _CHIP_DEFS_H_ +#define _CHIP_DEFS_H_ + + /* チップ共通部略称  jsp/doc/config.txtの 2.(8)を参照 */ +#define _COMMON_BF592 + + + +/* + * タイムティックの定義 + */ +#define TIC_NUME 1u /* タイムティックの周期の分子 */ +#define TIC_DENO 1u /* タイムティックの周期の分母 */ + +/* + * 破壊性読み出しレジスタの判別式 + * 与えられたアドレス iop が破壊性読み出しレジスタの + * 場合には真を返す。 + */ +#ifndef DESTRUCTIVE_READ +#define DESTRUCTIVE_READ( iop ) (iop<(VP)0xF0000000) +#endif + +#ifndef _MACRO_ONLY + +/* + * システムの停止処理 + */ + +Inline void +kernel_abort() +{ +} + +#endif /* _MACRO_ONLY */ +#endif /* _CHIP_DEFS_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf592/chip_dump.c b/uzume_prototype/kernel/config/blackfin/_common_bf592/chip_dump.c new file mode 100644 index 0000000..585f667 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf592/chip_dump.c @@ -0,0 +1,339 @@ +/** + * \file postmotem592.c + * \brief ADSP-BF592用のポストモーテムダンプルーチン群 + * + * ハードウェアエラー用のハンドラと、例外用のハンドラからなる。いずれも呼び出されるとUARTから + * ポストモーテム出力を表示する。 + */ +#include "jsp_kernel.h" + +#ifdef __GNUC__ +#include /* gnu tool chain */ +#elif defined(__ECC__) +#include /* VisualDSP++ */ +#include +#include +#else +#error "Compiler is not supported" +#endif + +/** + * \brief UARTおよび付随するDMAの動作を停止し、すべての割り込みを禁止する。 + * + * 最後にUART_IERをクリアするのは、UART割り込みを禁止すると同時にDMAも禁止するため。 + * UART DMAは、UARTの割り込み線で駆動されているので、割り込みを禁止すればDMAリクエスト + * も停止する。 + * + * UARTの初期化をどうするか悩ましいが、ここではそのまま以前の設定を利用することにする。 + * + * ポストモーテム・ダンプを目的としているので、この状態からの回復は考えない。 + */ +static void pm_occupy_uart() +{ + /* すべてのコア割り込みを禁止する */ + asm( "cli r0;" : : : "R0" ); + + /* すべてのシステム割り込みソースを禁止する */ + *pSIC_IMASK = 0; + + /* UART_IERをディセーブルにすることで、DMAを殺せる */ + *pUART0_IER = 0; +} + +/** + * \brief 一文字出力 + * + * UARTの送信レジスタが空になるのを待って一文字出力する。 + */ +static void pm_putc( unsigned char c ) +{ + + /* THRが空になるまで待つ */ + while ( ! ( *pUART0_LSR & THRE ) ) + ; + + /* THRが空になったら1文字送信 */ + *pUART0_THR = c; +} + +/** + * \brief コンソール入力監視 + * + * UARTの受信レジスタにデータがあれば、読み込む。データが"!"なら真、 + * それ以外なら偽を返す。 + */ +static BOOL is_ready() +{ + /* 受信データはあるか。 */ + if ( *pUART0_LSR & DR ) + + { + char c; + + c= *pUART0_RBR; + if ( c == '!' ) + return TRUE; + } + return FALSE; +} + + +/** + * \brief 文字列出力 + * + * 受け取った文字列をUARTに出力する。 + */ +static void pm_putstr( char * s ) +{ + int i; + + i=0; + while( s[i] ) /* 末端のNULLが現れるまで出力 */ + pm_putc(s[i++]); +} + +/** + * \brief 1バイトをヘキサデシマルで出力する。 + */ +static void pm_puthex1byte( unsigned int data ) +{ + int i; + int nibble; + + /* 8bit内のすべてのニブルを処理 */ + for ( i=0; i<2; i++ ) + { + /* 最上位ニブルを抽出 */ + nibble = ( data >> 4 ) & 0xF; + /* 抽出したニブルを出力 */ + if ( nibble < 10 ) + pm_putc( nibble + '0' ); + else + pm_putc( nibble - 10 + 'A' ); + /* 次のニブル */ + data <<= 4; + } +} + +/* + * \brief 改行記号を出力する + */ +static void pm_putrtn() +{ + pm_putstr("\r\n"); +} + +/** + * \brief 4バイトをヘキサデシマルで出力する。 + */ +static void pm_puthex4byte( unsigned int data ) +{ + int i; + int nibble; + + /* 32bit内のすべてのニブルを処理 */ + for ( i=0; i<8; i++ ) + { + /* 最上位ニブルを抽出 */ + nibble = ( data >> 28 ) & 0xF; + /* 抽出したニブルを出力 */ + if ( nibble < 10 ) + pm_putc( nibble + '0' ); + else + pm_putc( nibble - 10 + 'A' ); + /* 次のニブル */ + data <<= 4; + } + +} + +/** + * \brief 例外フラグ + * + * 例外が発生したときには真、そうでなければ偽。hwei_handler()に例外か否かを伝える。 + * + * GCCが張り切ってlink/unlink命令の位置を最適化するため、hwei_hanlder()の + * 中で性格にfpを手繰れない。そのため、dummyをアクセスすることでlink/unlinkの位置 + * 最適化の抑止を図る役目もある。効果があるかどうかは不明。 + */ +static volatile int expFlag =0; +/** + * \brief ハードウェア・エラー・ハンドラ + * + * ハードウェア・エラー時に呼び出されて、ハードウェア・エラー・割り込みのポストモーテム処理を行う。 + * 最初にFPを手繰って、割り込みのスタックフレームを探す。次にすべての割り込みを禁止し、 + * UART0を占有したあと、ポーリングを使ってスタックに保存された各レジスタのダンプを行う。 + * DEF_INH(INHNO_HW_ERROR, { TA_HLNG, hwei_handler }); + * + */ +void spurious_int_handler() +{ + unsigned int * fp, *ptr ; /* フレーム・ポインタを手繰っていくための変数 */ + unsigned int reg; /* システムレジスタを受け取るための変数 */ + unsigned int imask, sic_imask; /*マスク記録レジスタ*/ + + /* あとで使う */ + imask = *pIMASK; + sic_imask = *pSIC_IMASK; + /* UART0を初期化し、DMAと割り込みを禁止する */ + pm_occupy_uart(); + + while (1) + { + int count = 0; + + pm_putstr( "Type '!' to display post mortem dump" ); pm_putrtn(); + + while ( ! is_ready() ) + { + int i; + for ( i=0; i<100000000; i++) + asm volatile ("nop;"); + if ( count > 30 ) + { + pm_putstr( "Type '!' to display post mortem dump" ); pm_putrtn(); + count = 0; + } + else + count ++; + } + pm_putrtn(); + + + /* 現在の関数のFPを取得する */ + asm ( "%0=fp;" : "=d"((unsigned int)fp) ); + + /* + * この関数を呼び出した関数 ( interrupt_dispatcher ) のFPを取得する。 + * FPは呼び出し関数のFPの格納番地を指していることを利用する + */ + fp = (void *)*fp; + /* + * interrupt_dispatcher を呼び出した関数のFPを取得する。 + * その関数は割り込みハンドラの入り口処理部に他ならない。 + */ + fp = (void *)*fp; + + /* いまや、FPは割り込み受付時の保存されたレジスタ群を指している */ + + /* プッシュされた P0を指す */ + ptr = fp + 2; + /* + * 上位 + * 0 1 2 3 4 5 6 7 8 9 + * ----------------------------------------------- + * 00 P0 RTS FP R0 R1 R2 R3 R4 R5 R6 + * 10 R7 P1 P2 P3 P4 P5 I3 I2 I1 I0 + * 20 M3 M2 M1 M0 B3 B2 B1 B0 L3 L2 + * 30 L1 L0 A0x A0w A1x A1w LC1 LC0 LT1 LT0 + * 40 LB1 LB0 AST RETI + * 下位 + * + */ + if ( expFlag ) + pm_putstr( "Spurious Exception !!" ); + else + pm_putstr( "Spurious Interrupt !!" ); + pm_putrtn(); + + pm_putstr( "Registers On Stack :" ); pm_putrtn(); + pm_putstr( "P0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "RETS " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "FP " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R4 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R5 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R6 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "R7 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P4 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "P5 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "I0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "M0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "B0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L3 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L2 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "L0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "A0 " ); pm_puthex1byte( *(ptr--) ); pm_putstr( ":" ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "A1 " ); pm_puthex1byte( *(ptr--) ); pm_putstr( ":" ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LC1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LC0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LT1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LT0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LB1 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "LB0 " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "ASTAT " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putstr( "RETI " ); pm_puthex4byte( *(ptr--) ); pm_putrtn(); + pm_putrtn(); + pm_putstr( "System Registers :" ); pm_putrtn(); + pm_putstr( "SIC_IMASK " ); pm_puthex4byte( sic_imask ); pm_putrtn(); + pm_putstr( "SIC_ISR " ); pm_puthex4byte( *pSIC_ISR ); pm_putrtn(); + pm_putstr( "IMASK " ); pm_puthex4byte( imask ); pm_putrtn(); + pm_putstr( "ILAT " ); pm_puthex4byte( *pILAT ); pm_putrtn(); + pm_putstr( "IPEND " ); pm_puthex4byte( *pIPEND ); pm_putrtn(); + asm( "%0=SEQSTAT;" : "=d"(reg) ); + pm_putstr( "SEQSTAT " ); pm_puthex4byte( reg ); pm_putrtn(); + pm_putstr( " EXCAUSE " ); pm_puthex1byte( reg & 0x3F ); pm_putrtn(); + pm_putstr( " HWERRCAUSE " ); pm_puthex1byte( (reg>>14)&0x1F ); pm_putrtn(); + pm_putstr( "DMA0_IRQ_STATUS " ); pm_puthex4byte( *pDMA0_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA1_IRQ_STATUS " ); pm_puthex4byte( *pDMA1_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA2_IRQ_STATUS " ); pm_puthex4byte( *pDMA2_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA3_IRQ_STATUS " ); pm_puthex4byte( *pDMA3_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA4_IRQ_STATUS " ); pm_puthex4byte( *pDMA4_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA5_IRQ_STATUS " ); pm_puthex4byte( *pDMA5_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA6_IRQ_STATUS " ); pm_puthex4byte( *pDMA6_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "DMA7_IRQ_STATUS " ); pm_puthex4byte( *pDMA7_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_D0_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_D0_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_S0_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_S0_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_D1_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_D1_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "MDMA_S1_IRQ_STATUS " ); pm_puthex4byte( *pMDMA_S1_IRQ_STATUS ); pm_putrtn(); + pm_putstr( "SPI0_STAT " ); pm_puthex4byte( *pSPI0_STAT ); pm_putrtn(); + pm_putstr( "SPI1_STAT " ); pm_puthex4byte( *pSPI1_STAT ); pm_putrtn(); + pm_putstr( "TWI_SLAVE_STAT " ); pm_puthex4byte( *pTWI_SLAVE_STAT ); pm_putrtn(); + pm_putstr( "TWI_MASTER_STAT " ); pm_puthex4byte( *pTWI_MASTER_STAT ); pm_putrtn(); + pm_putstr( "PPI_STATUS " ); pm_puthex4byte( *pPPI_STATUS ); pm_putrtn(); + pm_putstr( "SPORT0_STAT " ); pm_puthex4byte( *pSPORT0_STAT ); pm_putrtn(); + pm_putstr( "SPORT1_STAT " ); pm_puthex4byte( *pSPORT1_STAT ); pm_putrtn(); + pm_putstr( "TIMER_STATUS " ); pm_puthex4byte( *pTIMER_STATUS ); pm_putrtn(); + pm_putrtn(); + pm_putstr( "Calling Stack :" ); pm_putrtn(); + + while( fp ) + { + pm_putstr( "Called from " ); pm_puthex4byte( *(fp+1) ); pm_putrtn(); + fp = (void *)*fp; + } + } +} + +/** + * \brief CPU例外ハンドラ + * + * CPU例外ハンドラとしてcfgファイルに登録する。 hwei_handler()は呼ばれたら戻ってこないが、 + * そのあとにもexpFlagに値を代入しているのは、最適化によってunlink命令の値がルーチン呼び出しの + * 前に移動することを防ぐためである。 + * + * DEF_EXC(CPUEXC1, { TA_HLNG, excp_handler} ); + * + */ +void spurious_exc_handler(VP p_excinf) +{ + expFlag = TRUE; + spurious_int_handler(); +} + diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf592/hw_serial.cfg b/uzume_prototype/kernel/config/blackfin/_common_bf592/hw_serial.cfg new file mode 100644 index 0000000..1c5037c --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf592/hw_serial.cfg @@ -0,0 +1,10 @@ +/* + + */ + +/* + * SIOドライバ(ADSP-BF592用)のコンフィギュレーションファイル + */ +INCLUDE("\"hw_serial.h\""); +DEF_INH(INHNO_SIO0_RX, { TA_HLNG, sio0_rx_handler }); +DEF_INH(INHNO_SIO0_TX, { TA_HLNG, sio0_tx_handler }); diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf592/hw_serial.h b/uzume_prototype/kernel/config/blackfin/_common_bf592/hw_serial.h new file mode 100644 index 0000000..708e28b --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf592/hw_serial.h @@ -0,0 +1,144 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + */ + +/* + * シリアルI/Oデバイス(SIO)ドライバ(Blackfin UART用) + * + * このファイルは、TOPPERS/JSP 1.4.2の config/sh3/ms7727cp01/hw_serial.hを + * リネームし、内部の識別子を変更したものである。 + * + * このファイルは下位のデバイス・アクセス・ルーチンを束ねて上位の層に渡す + * ためのものである。Blackfinの外部にあるシリアルをTOPPERS/JSPで管理しない + * のなら、変更する必要はない。 + */ + +#ifndef _HW_SERIAL_H_ +#define _HW_SERIAL_H_ + +#include + +#include "uart.h" + + + +/* + * SIOドライバの初期化ルーチン + */ +#define sio_initialize uart_initialize + +#ifndef _MACRO_ONLY +/* + * シリアルI/Oポートのオープン + */ +Inline SIOPCB * +sio_opn_por(ID siopid, VP_INT exinf) +{ + SIOPCB *siopcb; + + /* + * デバイス依存のオープン処理. + */ + siopcb = uart_opn_por(siopid, exinf); + + /* + * Enable Corrensponding Interrupt at IMASK + * Note that, this implementation has only 1 SIO in a system + */ + ena_int( INTNO_UART0_TX ); + ena_int( INTNO_UART0_RX ); + + return(siopcb); +} + +/* + * シリアルI/Oポートのクローズ + */ +Inline void +sio_cls_por(SIOPCB *siopcb) +{ + + /* + * ここではSIC_IMASKの対応ビットをクリアしない。SIC_IMASKのクリアは + * 危険である。UARTからの割り込みは uart_cls_por内部で禁止するので + * 充分である。 + */ + + /* + * デバイス依存のクローズ処理. + */ + uart_cls_por(siopcb); +} + + +/* + * SIOの割込みハンドラ + */ +#define sio0_rx_handler uart0_rx_isr +#define sio0_tx_handler uart0_tx_isr + +/* + * シリアルI/Oポートへの文字送信 + */ +#define sio_snd_chr uart_snd_chr + +/* + * シリアルI/Oポートからの文字受信 + */ +#define sio_rcv_chr uart_rcv_chr + +/* + * シリアルI/Oポートからのコールバックの許可 + */ +#define sio_ena_cbr uart_ena_cbr + +/* + * シリアルI/Oポートからのコールバックの禁止 + */ +#define sio_dis_cbr uart_dis_cbr + +/* + * シリアルI/Oポートからの送信可能コールバック + */ +#define sio_ierdy_snd uart_ierdy_snd + +/* + * シリアルI/Oポートからの受信通知コールバック + */ +#define sio_ierdy_rcv uart_ierdy_rcv + +#endif /* _MACRO_ONLY */ +#endif /* _HW_SERIAL_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf592/hw_timer.h b/uzume_prototype/kernel/config/blackfin/_common_bf592/hw_timer.h new file mode 100644 index 0000000..3af4374 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf592/hw_timer.h @@ -0,0 +1,178 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)縲鰀(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + +/* + * タイマドライバ(ADSP-BF592用) + * + */ + +#ifndef _HW_TIMER_H_ +#define _HW_TIMER_H_ + +#include +#include + +#ifndef _MACRO_ONLY + +#ifdef __GNUC__ +#include /* gnu tool chain */ +#elif defined(__ECC__) +#include /* VisualDSP++ */ +#include +#include +#else +#error "Compiler is not supported" +#endif + + + +/************************************************************** + * タイマの起動処理 + * + * タイマを初期化し,周期的なタイマ割込み要求を発生させる. + * + **************************************************************/ +Inline void +hw_timer_initialize() +{ +#ifdef USE_TIC_CORE + // Core timer + // TCNTL bit assignement + // TMPWR 0x00000001 + // TMREN 0x00000002 + // TAUTORLD 0x00000004 + // TINT 0x00000008 + *pTCNTL = 0x00000001; // TMPWR : power up timer; + *pTPERIOD = CORECLOCK/1000; // CORE CLOCK is defined in sys_config.h + *pTCNTL = 0x00000007; // TMPWR | TMREN | TAUTORLD; +#else + // GPT2(General-purpose timer2) + + + /* TIMERx_CONFIG Registers */ + // PWM_OUT 0x0001 + // WDTH_CAP 0x0002 + // EXT_CLK 0x0003 + // PULSE_HI 0x0004 + // PERIOD_CNT 0x0008 + // IRQ_ENA 0x0010 + // TIN_SEL 0x0020 + // OUT_DIS 0x0040 + // CLK_SEL 0x0080 + // TOGGLE_HI 0x0100 + // EMU_RUN 0x0200 + + *pTIMER2_CONFIG = 0x0059; // PERIOD_CNT | OUT_DIS |IRQ_ENA | PWM_OUT ( PWM_OUT, Output Pad disable) + *pTIMER2_PERIOD = SYSCLOCK/1000; // SYS CLOCK is defined in sys_config.h + *pTIMER2_WIDTH = 1; // 0 < width < period + + // TIMEN0 0x0001 + // TIMEN1 0x0002 + // TIMEN2 0x0004 + *pTIMER_ENABLE = 0x004; // TIMEN2 timer2 start + + ena_int( INHNO_TIMER ); // enable Timer Interrupt +#endif + asm("ssync;"); + +} + +/************************************************************** + * タイマ割込み要求のクリア + **************************************************************/ +Inline void +hw_timer_int_clear() +{ +#ifdef USE_TIC_CORE + // Core timer + // TCNTL bit assignement + // TMPWR 0x00000001 + // TMREN 0x00000002 + // TAUTORLD 0x00000004 + // TINT 0x00000008 + /* TINTはW1Cではないので、TINTのTINTビットは0を書き込む */ + *__pTCNTL = 0x00000007; // TMPWR | TMREN | TAUTORLD; +#else + // GPT2(General-purpose timer2) + + // TIMIL0 0x0001 + // TIMIL1 0x0002 + // TIMIL2 0x0004 + *pTIMER_STATUS = 0x004; // TIMIL2, Clear interrupt +#endif + asm("ssync;"); +} + +/************************************************************** + * タイマの停止処理 + * + * タイマの動作を停止させる. + **************************************************************/ +Inline void +hw_timer_terminate() +{ + /* + * タイマの動作を停止する. + */ +#ifdef USE_TIC_CORE + // Core timer + // TCNTL bit assignement + // TMPWR 0x00000001 + // TMREN 0x00000002 + // TAUTORLD 0x00000004 + // TINT 0x00000008 + *pTCNTL = 0x00000005; //TMPWR | TAUTORLD | TINT; // 停止 + *pTCNTL = 0; // パワーダウンモード +#else + // GPT2(General-purpose timer2) + // TIMDIS0 0x0001 + // TIMDIS1 0x0002 + // TIMDIS2 0x0004 + *pTIMER_DISABLE = 0x004; // TIMDIS2, timer2 disable +#endif + asm("ssync;"); +} + + +#endif /* _MACRO_ONLY */ +#endif /* _HW_TIMER_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf592/sys_rename.def b/uzume_prototype/kernel/config/blackfin/_common_bf592/sys_rename.def new file mode 100644 index 0000000..6b882a6 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf592/sys_rename.def @@ -0,0 +1,6 @@ +make_priority_mask +device_dispatcher +boot_for_gdb +siopinib_table +sprious_int_handler +sprious_exp_handler diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf592/sys_rename.h b/uzume_prototype/kernel/config/blackfin/_common_bf592/sys_rename.h new file mode 100644 index 0000000..5d3ef27 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf592/sys_rename.h @@ -0,0 +1,23 @@ +/* This file is generated from sys_rename.def by genrename. */ + +#ifndef _SYS_RENAME_COMMON_H_ +#define _SYS_RENAME_COMMON_H_ + +#define make_priority_mask _kernel_make_priority_mask +#define device_dispatcher _kernel_device_dispatcher +#define boot_for_gdb _kernel_boot_for_gdb +#define siopinib_table _kernel_siopinib_table +#define sprious_int_handler _kernel_sprious_int_handler +#define sprious_exp_handler _kernel_sprious_exp_handler + +#ifdef LABEL_ASM + +#define _make_priority_mask __kernel_make_priority_mask +#define _device_dispatcher __kernel_device_dispatcher +#define _boot_for_gdb __kernel_boot_for_gdb +#define _siopinib_table __kernel_siopinib_table +#define _sprious_int_handler __kernel_sprious_int_handler +#define _sprious_exp_handler __kernel_sprious_exp_handler + +#endif /* LABEL_ASM */ +#endif /* _SYS_RENAME_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/_common_bf592/sys_unrename.h b/uzume_prototype/kernel/config/blackfin/_common_bf592/sys_unrename.h new file mode 100644 index 0000000..4beabaa --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/_common_bf592/sys_unrename.h @@ -0,0 +1,23 @@ +/* This file is generated from sys_rename.def by genrename. */ + +#ifdef _SYS_UNRENAME_COMMON_H_ +#undef _SYS_UNRENAME_COMMON_H_ + +#undef make_priority_mask +#undef device_dispatcher +#undef boot_for_gdb +#undef siopinib_table +#undef sprious_int_handler +#undef sprious_exp_handler + +#ifdef LABEL_ASM + +#undef _make_priority_mask +#undef _device_dispatcher +#undef _boot_for_gdb +#undef _siopinib_table +#undef _sprious_int_handler +#undef _sprious_exp_handler + +#endif /* LABEL_ASM */ +#endif /* _SYS_UNRENAME_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/acb_bf592/Makefile.config b/uzume_prototype/kernel/config/blackfin/acb_bf592/Makefile.config new file mode 100644 index 0000000..b08c47f --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/acb_bf592/Makefile.config @@ -0,0 +1,26 @@ +# +# Makefile のターゲットシステム依存部(EZ-KIT lite BF592用) +# + +# +# コンパイルオプション +# +INCLUDES := $(INCLUDES) -I$(SRCDIR)/config/$(CPU)/$(SYS) \ + -I$(SRCDIR)/config/$(CPU)/_common_bf592 \ + -I$(SRCDIR)/pdic/simple_sio +COPTS := $(COPTS) +LDFLAGS := $(LDFLAGS) + +# +# カーネルに関する定義 +# +KERNEL_DIR := $(KERNEL_DIR) :$(SRCDIR)/config/$(CPU)/$(SYS) :$(SRCDIR)/config/$(CPU)/_common_bf592 :$(SRCDIR)/pdic/simple_sio +KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) +KERNEL_COBJS := $(KERNEL_COBJS) chip_config.o uart.o chip_debugboot.o chip_dump.o + + +# +# リンカスクリプトの定義 +# +LDSCRIPT = $(CPU)/_common_bf592/bf592elf.ld + diff --git a/uzume_prototype/kernel/config/blackfin/acb_bf592/i2c_subsystem.c b/uzume_prototype/kernel/config/blackfin/acb_bf592/i2c_subsystem.c new file mode 100644 index 0000000..b8927d9 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/acb_bf592/i2c_subsystem.c @@ -0,0 +1,346 @@ +/** + * \file i2c_subsystem.c + * \brief i2cペリフェラルをマスターモードで使うためのサブシステム + * \details + * CMSISを使い、i2cペリフェラルをマスターモードで使用する + */ +#include "i2c_subsystem.h" +#include "kernel_id.h" +#include "s_services.h" +#include + +#ifdef _COMMON_BF592 +#include +#elif defined(_COMMON_BF506) +#include +#elif defined(_COMMON_BF518) +#include +#elif defined(_COMMON_BF537) +#include +#else +#error "This processor is not supported" +#endif + +#include + + +#define I2C_DEBUG + +#ifdef I2C_DEBUG +#define I2C_SYSLOG(level,msg) syslog( level, msg ) +#else +#define I2C_SYSLOG(level,msg) +#endif + + +/** + * \brief チップ上のI2Cペリフェラルの数 + */ +#define I2CNUM 1 + +/** + * \brief I2C ペリフェラルのタイムアウト時間(mSec) + */ +#define I2C_TIMEOUT 100 + +/** + * \brief TWIペリフェラルの管理用ステート型。内部ステートマシンの状態値。 + */ +enum I2C_STATE { + I2C_XMT_ENTRY, + I2C_XMTRCV_ENTRY, + I2C_XMT_WAIT, + I2C_XMT_INT, + I2C_XMT_NEXT_BYTE, + I2C_RCV_ENTRY, + I2C_RCV_WAIT, + I2C_RCV_INT, + I2C_RCV_NEXT_BYTE, + I2C_EXIT +}; + + +/** + * \brief I2C管理用構造体 + */ +struct I2C_MASTER_CONTROL_TYPE { + ID signal; /**< データの送受信が全部終わったときに割り込みハンドラからタスクに知らせるためのセマフォ */ + ID blocking; /**< I2Cペリフェラルへの排他アクセスのためのセマフォ */ + unsigned short intr_state; /**< TWIペリフェラルの割り込みステータスのコピー **/ + volatile unsigned short * clkdiv; /**< TWI_CLCKDIVレジスタのアドレス **/ + volatile unsigned short * control; /**< TWI_CONTROLレジスタのアドレス **/ + volatile unsigned short * master_ctl; /**< TWI_MASTER_CTLレジスタのアドレス **/ + volatile unsigned short * master_stat; /**< TWI_MASTER_STATレジスタのアドレス **/ + volatile unsigned short * master_addr; /**< TWI_MASTER_ADDRレジスタのアドレス **/ + volatile unsigned short * int_stat; /**< TWI_MASTER_STATレジスタのアドレス **/ + volatile unsigned short * int_mask; /**< TWI_INT_MASKレジスタのアドレス **/ + volatile unsigned short * fifo_ctl; /**< TWI_FIFO_CTLレジスタのアドレス **/ + volatile unsigned short * fifo_stat; /**< TWI_FIFO_STATレジスタのアドレス **/ + volatile unsigned short * xmt_data8; /**< TWI_XMT_DATA8レジスタのアドレス **/ + volatile unsigned short * rcv_data8; /**< TWI_RCV_DATA8レジスタのアドレス **/ + volatile unsigned short * slave_ctl; /**< TWI_MASTER_CTLレジスタのアドレス **/ + +}; + +/** + * \brief i2cペリフェラルを管理するための構造体群。 + */ +static struct I2C_MASTER_CONTROL_TYPE i2c_control[I2CNUM]; + + +int i2c_master_write( int peripheral, int slave, unsigned char write_data[], int write_count ) +{ + // read のための引数を0にしておくと、writeのみがおこなわれる + return i2c_master_write_read( peripheral, slave, write_data, write_count, 0, 0); +} + +int i2c_master_read( int peripheral, int slave, unsigned char read_data[], int read_count ) +{ + // write のための引数を0にしておくと、readのみがおこなわれる + return i2c_master_write_read( peripheral, slave, 0, 0, read_data, read_count); +} + + +int i2c_master_write_read( int peripheral, int slave, unsigned char write_data[], int write_count, unsigned char read_data[], int read_count) +{ + struct I2C_MASTER_CONTROL_TYPE *twi; + BOOL read, write, rstart, quit; + unsigned char *wptr, *rptr; + enum I2C_STATE state; /**< I2Cペリフェラルハンドラの内部状態 */ + PRI old_priority; // タスクの優先順位を保存しておくための変数 + + // 可読性向上のため、TWI管理構造体のポインタを設定する。 + twi = &i2c_control[peripheral]; + + // 送受信ポインタ.とかくこの世は生きにくい + wptr = write_data; + rptr = read_data; + + // この代入は必要ないが、警告がうるさいので + rstart= FALSE; + + // ループ終了条件の成立フラグ + quit = FALSE; + + // 読み書きの有無の確認 + // バッファがNULLだったり長さが0のパラメタは転送に使わない + write = ( write_data != NULL ) && ( write_count != 0 ); + read = ( read_data != NULL ) && ( read_count != 0 ); + + // パラメタの組み合わせによって初期状態が変わる + if ( read && write ) + state = I2C_XMTRCV_ENTRY; + else if ( write && ! read ) + state = I2C_XMT_ENTRY; + else if ( ! write && read ) + state = I2C_RCV_ENTRY; + else + return I2C_ERR_WRONGPARAM; + + if ( write_count > 254 || read_count > 254 ) + return I2C_ERR_TOOLONGBUFFER; + + + // peripheral 引数で指定されたi2cペリフェラルを排他的に使うためのPV処理。 + // これでスレッドセーフにできる + wai_sem(twi->blocking); + + // タスクの優先順位を一旦引き上げる。これは、TWIのレスポンスを保証するためである + get_pri( TSK_SELF, &old_priority ); + chg_pri( TSK_SELF, TMAX_TPRI ); + + // SPIスレーブデバイスのアドレスを設定(7bit) + *twi->master_addr = slave; + + // FIFO フラッシュ + *twi->fifo_ctl = XMTFLUSH | RCVFLUSH; + ssync(); + + // FIFO 設定 + *twi->fifo_ctl = XMTINTLEN; // 割り込みスレシホールドは送受とも1バイト、FLUSHはクリアする + + // TWIステートマシン + do { + switch (state) + { + case I2C_XMT_ENTRY : + I2C_SYSLOG(LOG_NOTICE, "I2C_XMT_ENTRY" ); + rstart = FALSE; + *twi->master_ctl = ( write_count<<6 ) | MEN; // no rstart, transmit, no fast mode; + state = I2C_XMT_NEXT_BYTE; + break; + case I2C_XMTRCV_ENTRY : + I2C_SYSLOG(LOG_NOTICE, "I2C_XMTRCV_ENTRY" ); + rstart = TRUE; + *twi->master_ctl = ( write_count<<6 ) | RSTART | MEN; // rstart, transmit, no fast mode; + state = I2C_XMT_NEXT_BYTE; + break; + case I2C_RCV_ENTRY : + I2C_SYSLOG(LOG_NOTICE, "I2C_RCV_ENTRY" ); + rstart = FALSE; + *twi->master_ctl = ( read_count<<6 ) | MDIR | MEN; // no rstart, receive, no fast mode; + state = I2C_RCV_WAIT; + break; + case I2C_XMT_WAIT : + I2C_SYSLOG(LOG_NOTICE, "I2C_XMT_WAIT" ); + // 割り込みハンドラが送信割り込みを通知するまで待つ + if ( E_OK != twai_sem(twi->signal, I2C_TIMEOUT)) + { + twi->intr_state = I2C_ERR_TIMEOUT | *twi->int_stat; // エラーなら割り込みステータスを併記 + state = I2C_EXIT; + } + else + state = I2C_XMT_INT; + break; + case I2C_XMT_INT : + I2C_SYSLOG(LOG_NOTICE, "I2C_XMT_INT" ); + if ( twi->intr_state & MERR ) // エラーならすぐ終了 + state = I2C_EXIT; + else if ( ( twi->intr_state & MCOMP ) && rstart) // MCOMP かつ RSTARTなら受信へ + state = I2C_RCV_ENTRY; + else if ( twi->intr_state & MCOMP ){ // RSTARTがないMCOMPなら終了 + twi->intr_state &= ~MCOMP; + state = I2C_EXIT; + } + else // それ以外は送信割り込み + state = I2C_XMT_NEXT_BYTE; + break; + case I2C_XMT_NEXT_BYTE : + I2C_SYSLOG(LOG_NOTICE, "I2C_XMT_NEXT_BYTE" ); + *twi->xmt_data8 = *(wptr++); // 1バイト送信 + state = I2C_XMT_WAIT; // 次の送信待 + break; + case I2C_RCV_WAIT : + I2C_SYSLOG(LOG_NOTICE, "I2C_RCV_WAIT" ); + // 割り込みハンドラが受信割り込みを通知するまで待つ + if ( E_OK != twai_sem(twi->signal, I2C_TIMEOUT)) + { + twi->intr_state = I2C_ERR_TIMEOUT | *twi->int_stat; // エラーなら割り込みステータスを併記 + state = I2C_EXIT; + } + else + state = I2C_RCV_INT; + break; + case I2C_RCV_INT : + I2C_SYSLOG(LOG_NOTICE, "I2C_RCV_INT" ); + if ( twi->intr_state & MERR) // エラーならすぐ終了 + state = I2C_EXIT; + else if ( twi->intr_state & MCOMP ){ // 終了ならエラークリア + twi->intr_state &= ~MCOMP; + state = I2C_EXIT; + } + else // それ以外は受信割り込み + state = I2C_RCV_NEXT_BYTE; + break; + case I2C_RCV_NEXT_BYTE : + I2C_SYSLOG(LOG_NOTICE, "I2C_RCV_NEXT_BYTE" ); + *(rptr++) = *twi->rcv_data8; // 1バイト受信 + state = I2C_RCV_WAIT; // 次の受信待 + break; + case I2C_EXIT : + I2C_SYSLOG(LOG_NOTICE, "I2C_EXIT" ); + * twi->master_ctl = 0; // マスターをディセーブルして終了 + quit = TRUE; + break; + } + } while ( !quit ); + + // タスクの優先順位を元に戻す + chg_pri( TSK_SELF, old_priority); + + // 排他区間の終了 + sig_sem(twi->blocking); + + // 割り込みステータスを返す。正常終了なら0 + return twi->intr_state; +} + +/** + * \brief i2c 割り込みサービスルーチン本体 + * \param peripheral I2Cペリフェラル番号。0から始まる。 + * \details + * 割り込みサービスルーチンから呼び出す。この関数が割り込みハンドラの実体である。 + * チップに複数のTWIペリフェラルがある場合には、引数に当該TWIペリフェラル番号を与えて呼び出す。 + * + * 関数内部では、タスクに割り込みが入ったことを知らせ、ペリフェラルの割り込みステータスを + * 変数に退避してから戻る。 + */ +static void i2c_master_handler( int peripheral ) +{ + struct I2C_MASTER_CONTROL_TYPE *twi; + + // 可読性向上のため、TWI管理構造体のポインタを設定する。 + twi = &i2c_control[peripheral]; + + // TWIペリフェラルの割り込みステータスを取得し、コピーを保存する。 + // コピーを保存するのは、このあと割り込みクリアで消えるからである。 + twi->intr_state = *twi->int_stat; + + // 割り込みクリア。すべての割り込み要素をクリアしてしまう。ステータスはコピーしているのでタスクで処理する。 + *twi->int_stat = 0xFF; + + // 割り込みクリアが確定するまで待つ。 + ssync(); + + /* 通知はセマフォを使う。タスクは i2c_master_write_read()の中で待っている。 */ + isig_sem(twi->signal); +} + + +/** + * \details + * TOPPERS/JSPでは、DEF_INHから割り込みハンドラに引数を渡せない。そのため、この関数内で + * i2c_master_handler() を引数0決め打ちで呼ぶ。 + */ +void i2c0_master_handler(void) +{ + i2c_master_handler( 0 ); +} + + +/** + * \brief i2c イニシャライザ + * \param exinf ペリフェラル番号。TWI0ならば、0を渡す。 + * \details + * I2C用のコントロールブロックのI2C相当部分を初期化する。 + */ +void i2c_master_initialize(VP_INT exinf) +{ + struct I2C_MASTER_CONTROL_TYPE *twi; + unsigned int peripheral = (unsigned int)exinf; + + // 可読性向上のため、TWI管理構造体のポインタを設定する。 + twi = &i2c_control[peripheral]; + + twi->blocking = SEM_I2C0_BLOCK; // ペリフェラルブロック用セマフォ + twi->signal = SEM_I2C0_SIGNAL; // 割り込み・タスク通信用セマフォ + // レジスタアドレスを設定 + twi->clkdiv = pTWI_CLKDIV ; + twi->control = pTWI_CONTROL ; + twi->master_ctl = pTWI_MASTER_CTL ; + twi->master_stat = pTWI_MASTER_STAT ; + twi->master_addr = pTWI_MASTER_ADDR ; + twi->int_stat = pTWI_INT_STAT ; + twi->int_mask = pTWI_INT_MASK ; + twi->fifo_ctl = pTWI_FIFO_CTL ; + twi->fifo_stat = pTWI_FIFO_STAT ; + twi->xmt_data8 = pTWI_XMT_DATA8 ; + twi->rcv_data8 = pTWI_RCV_DATA8 ; + twi->slave_ctl = pTWI_SLAVE_CTL ; + + + *twi->control = 0; // TWI をディセーブル + *twi->master_ctl = 0; // マスター機能をディセーブル + *twi->slave_ctl = 0; // スレーブ機能をディセーブル + + *twi->control = TWI_ENA | (SYSCLOCK/10000000); // HWRによると、プリスケール値はSYSCLKを10MHzで割ったものでなければならない。 + *twi->clkdiv = 30<<8 | 70; // TWI内部クロック10MHzに対して、100kHzのI2Cクロックは100分の1である + + // 割り込みイネーブル設定。送受割り込み、完了割り込み及びエラー割り込み。 + *twi->int_mask = MCOMP | MERR | XMTSERV | RCVSERV; + + // システム割り込みをイネーブルにする。 + ena_int(INTNO_TWI); +} + + diff --git a/uzume_prototype/kernel/config/blackfin/acb_bf592/i2c_subsystem.h b/uzume_prototype/kernel/config/blackfin/acb_bf592/i2c_subsystem.h new file mode 100644 index 0000000..f929ef0 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/acb_bf592/i2c_subsystem.h @@ -0,0 +1,152 @@ +/** + * \file i2c_subsystem.h + * + * \date 2012/09/01 + * \author: takemasa + * \brief twiペリフェラルをマスターモードで使用する + * + */ +#include + +#ifndef I2C_SUBSYSTEM_H_ +#define I2C_SUBSYSTEM_H_ + +/** + * \defgroup I2C_SUBSYSTEM I2Cを使用するためのサブシステム + * \details + * i2c_subsystemは、LPC1768の内蔵I2Cペリフェラルを使用するための関数群である。この関数群はTOPPERS/ASP用に開発されており、CMSISの下位 + * ライブラリを使用して、割り込みを使ったポーリングなしの制御を実現している。タスクから呼び出された関数は割り込みハンドラとセマフォを使って + * 通信しながら指定されたI2Cスレーブ・デバイスの制御を行う。また、関数群は排他制御されており、一つのi2Cペリフェラルを複数のタスクが同時に使用 + * しないよう保護されている。 + * + * アプリケーションが使用するのは i2c_master_write(), i2c_master_read(), i2c_master_write_read() の三つの関数だけである。 + * この他にI2Cの初期化関数と割り込みISRがあるが、これらは TOPPERS/ASP のコンフィギュレーション・ファイルに記述されており、アプリケーション・ + * プログラマが直接呼び出してはならない。 + * + * I2Cx ペリフェラルを使用する場合には、アプリケーションのコンフィギュレーションファイルから、i2cx_m.cfgファイルを読み込んでおく。 + * 例えば、I2C1を使いたいのであれば、i2c1_m.cfg ファイルを読み込む。i2c0_m.cfg から i2c2_m.cfg までのファイルがあり、 + * どのファイルをどの組み合わせでどの順番で読み込んでもかまわない。 + * + * I2Cxペリフェラルの初期化は、cfgファイルによって記述されたイニシャライザが行う。また、割り込みISRもcfgファイルによって登録 + * される。このほか、ペリフェラル電源のオン、クロックの設定もイニシャライザ内部で完結している。 + * + * I2Cxペリフェラルへのピンの割り当てが必要な場合は、アプリケーションで行う。 + * + * なお、I2Cサブシステムは、イニシャライザ内部でCMSISの SystemCoreClockUpdate() 関数を使用してCPUのクロック周波数を + * 測定している。この関数が常に正しく動作するのはCPUが内部RCオシレータを使用する場合と、RTCの32768Hzクロックを使用する場合のみである。 + * 外部クリスタルを使ったメインオシレータを使用する場合は、クリスタルの共振周波数とCMSIS内部のクロック設定値をあわせてCMSISを再ビルド + * しなければならない。 + */ +/*@{*/ + +/** + * \brief TWIデバイス制御関数への引き数値が間違っている。 + */ +#define I2C_ERR_WRONGPARAM 0x4000 +/** + * \brief TWIデバイス制御関数へ指定した送受信データ長が長すぎる。 + */ +#define I2C_ERR_TOOLONGBUFFER 0x2000 +/** + * \brief TWIデバイスがタイムアウトした。 + */ +#define I2C_ERR_TIMEOUT 0x1000 + +/** + * \brief i2cマスターモードの割り込みサービスルーチン + * \param exinf i2cペリフェラルの番号。TWI0なら、0 + * \details + * この間数は、i2cをマスターモードとして使う際の割り込みサービスルーチン本体である。 i2c_master_read()等の関数と強調しながら + * 動作する。データ転送が終わると、あらかじめ設定されたコールバックを呼び出してタスクに通知する。 + * + * exinfには、コンフィギュレーションファイルのDEF_INHから値を与える + */ +void i2c0_master_handler(void); + + +/** + * \brief i2cマスターモード動作用の初期化を行う + * \param exinf ペリフェラル番号を渡す. TWI0なら0。 + * \details + * この関数は i2c0_master_handler() が i2c_master_read() 等の関数と同期するためのセマフォの設定を行う。 + * 呼び出しは明示的に行わず、コンフィギュレーションファイルからATT_INIを使ってシステムに登録する。 + * + */ +void i2c_master_initialize(VP_INT exinf); + + +/** + * \brief I2C マスター書き込み関数 + * \param peripheral マイコンのI2Cペリフェラルの番号。TWI0なら0 + * \param slave 7bitで表すI2Cペリフェラルの番号。bit0:6のみ使い、bit7以上は0にすること。 + * \param write_data ペリフェラルに書き込むデータ・バイト列 + * \param write_count ペリフェラルに書き込むデータの長さ。単位はバイト。最大254。 + * \return エラーがなければ0 + * \details + * 引数 peripheral を使って、アドレス slave のI2Cデバイスに対する書き込みを行う関数。 + + * この関数はブロッキング関数である。つまり、読み込みを開始すると、その終了まで待って + * 帰ってくる。 + * + * また、複数のタスクが同時にこの関数を呼んだ場合には、うち一つだけが関数を実行し、他のタスクは + * 待ち状態になる。 + * + * 返り値はTWI_ERROR_XXXXと、TWIペリフェラルの割り込みステータスのビット論理和である。 + * 正常終了ならオール0である。 + * + */ +int i2c_master_write( int peripheral, int slave, unsigned char write_data[], int write_count ); + +/** + * \brief I2C マスター読み込み関数 + * \param peripheral マイコンのI2Cペリフェラルの番号。TWI0なら0 + * \param slave 7bitで表すI2Cペリフェラルの番号。bit0:6のみ使い、bit7以上は0にすること。 + * \param read_data ペリフェラルから読み込むデータ・バッファ + * \param read_count ペリフェラルから読み込むデータの長さ。単位はバイト。最大254。 + * \return エラーがなければ0。処理がタイムアウトならば処理ステータス + * \details + * 引数 peripheral を使って、アドレス slave のI2Cデバイスからの読み込みを行う関数。 + + * この関数はブロッキング関数である。つまり、読み込みを開始すると、その終了まで待って + * 帰ってくる。 + * + * また、複数のタスクが同時にこの関数を呼んだ場合には、うち一つだけが関数を実行し、他のタスクは + * 待ち状態になる。 + * + * 返り値はTWI_ERROR_XXXXと、TWIペリフェラルの割り込みステータスのビット論理和である。 + * 正常終了ならオール0である。 + * + */ +int i2c_master_read( int peripheral, int slave, unsigned char read_data[], int read_count); + +/** + * \brief I2C マスター書き込み読み込み関数 + * \param peripheral マイコンのI2Cペリフェラルの番号。TWI0なら0。 + * \param slave 7bitで表すI2Cペリフェラルの番号。bit0:6のみ使い、bit7以上は0にすること。 + * \param write_data ペリフェラルに書き込むデータ・バイト列 + * \param write_count ペリフェラルに書き込むデータの長さ。単位はバイト。最大254。 + * \param read_data ペリフェラルから読み込むデータ・バッファ + * \param read_count ペリフェラルから読み込むデータの長さ。単位はバイト。最大254。 + * \return エラーがなければ0。 + * \details + * 引数 peripheral を使って、アドレス slave のI2Cデバイスに対する書き込みを行う関数。 + * + * この間数は、まず slave に対して write_data バッファから write_count 個のデータを + * 書き込む。続いて I2C の repeated start を使って同じ slave に対する read_count個の + * 読み出しを行う。 + * + * この関数はブロッキング関数である。つまり、読み込みを開始すると、その終了まで待って + * 帰ってくる。 + * + * また、複数のタスクが同時にこの関数を呼んだ場合には、うち一つだけが関数を実行し、他のタスクは + * 待ち状態になる。 + * + * 返り値はTWI_ERROR_XXXXと、TWIペリフェラルの割り込みステータスのビット論理和である。 + * 正常終了ならオール0である。 + * + */ +int i2c_master_write_read( int peripheral, int slave, unsigned char write_data[], int write_count, unsigned char read_data[], int read_count ); + +/*@}*/ + +#endif /* I2C_SUBSYSTEM_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/acb_bf592/jsp_acb_bf592.dpj b/uzume_prototype/kernel/config/blackfin/acb_bf592/jsp_acb_bf592.dpj new file mode 100644 index 0000000..6df5d35 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/acb_bf592/jsp_acb_bf592.dpj @@ -0,0 +1,617 @@ + + + + + ADSP-BF592-A + .dlb + Library file + + + + + .\Debug + . + 0 + + + + + + + + + + + + + + + + + + + + + + + .\Release + . + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + diff --git a/uzume_prototype/kernel/config/blackfin/acb_bf592/readme.txt b/uzume_prototype/kernel/config/blackfin/acb_bf592/readme.txt new file mode 100644 index 0000000..87911c2 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/acb_bf592/readme.txt @@ -0,0 +1,18 @@ +金子システム製 ACB-BF592対応システム依存部。 + + +Makefile.configは、インクルード・パスおよびソースファイルへのパスとしてblackfin/_common_bf592を +指定している。 + +- Makefile.config : gnu環境のためのシステム依存部定義ファイル +- readme.txt : このファイル +- sys_config.h : システム依存部のうち、アプリケーションから見えない宣言 +- sys_defs.h : システム依存部のうち、アプリケーションから見える宣言 + +2012/2/18 メモ +システムタイマーをGPTimer 2に変更。 +sample1の動作は確認できている。 + +2012/2/1 メモ。 +とりあえずビルドできた。 +タイマーは、まだコアタイマーを使っている。 \ No newline at end of file diff --git a/uzume_prototype/kernel/config/blackfin/acb_bf592/sys_config.h b/uzume_prototype/kernel/config/blackfin/acb_bf592/sys_config.h new file mode 100644 index 0000000..152ebe1 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/acb_bf592/sys_config.h @@ -0,0 +1,173 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +#ifndef _SYS_CONFIG_H_ +#define _SYS_CONFIG_H_ + +/* + * カーネルの内部識別名のリネーム + */ +#include + +/* blackfin/_common_bf533から読み込む */ +#include + +/* + * ターゲットシステム依存モジュール(EZKIT-BF592用) + * + * このインクルードファイルは,t_config.h のみからインクルードされる. + * 他のファイルから直接インクルードしてはならない. +*/ + +/* + * どのようなクロック入力にも対応できるよう、以下でCSEL, SSEL, MSELの値 + * とクロック入力周波数(Hz)を指定する。PLLのプログラムはsys_config.cの + * sys_initialize()関数で行われる。 + * + * CSELVALは1,2,4,8の中から選ぶ。CLKINの単位はHz + */ + +#define CSELVAL 1 +#define SSELVAL 4 +#define MSELVAL 16 +#define CLKIN 25000000 + +/* + * システムタイマーの選択 + * USE_TIC_COREをdefineすると、COREタイマーが使用される + * コメントアウトすると、GP_TIMER_2を使用する + * + * COREタイマーはwakeup信号を生成しないため、ディスパッチャ + * はidle命令を使ってCOREタイマーイベントを待つことができない。 + * そのため、USE_TIC_COREを使うとディスパッチャはidle命令を + * 使わずに割り込み発生をポーリングで待つ。これは消費電力の + * 点で不利である。 + * + * システムタイマーにコアタイマーを使うことは、推奨しない。 + * この機能は、移植時の利便性のために残しており、実アプリケーションで + * つかうことは想定していない。 + * + */ +//#define USE_TIC_CORE + +/* + * ハードウェア・エラー割り込みの許可 + * QUICK_HW_ERRORをdefineすると、ハードウェア・エラー・イベント + * が即座に受理される。defineしない場合には、割り込み待ち状態で + * ハードウェア・エラー・割り込みが発生した場合、次の割り込みまで + * 待たされることになる。 + * + */ +//#define QUICK_HW_ERROR + + +/* + * 実行時初期化関数の使用 + * + * マクロ USE_RUNTIME_INIT を定義すると、start.asmのなかで _mi_initialize + * を呼び出す。この関数はノーブートモードで起動するときにのみ必要になるので + * 通常は USE_RUNTIME_INITを使う必要はない。 + * 詳細はADIのEE239に詳しい。http://tinyurl.com/2hpbk (tinyURL) + * +*/ +//#define USE_RUNTIME_INIT + +/* + * カーネル管理外割り込みの宣言 + * + * マクロUNMANAGED_INTはカーネル管理外割り込みを宣言する。この + * マクロは16ビットのビットマップになっており、以下にあるパターン + * のうちひとつを使う。なお、どのようなパターンを選んでもNMIは管理外 + * 割込みとして扱われる。 + * UNMANAGED_INTを宣言しない場合、NMIだけが管理外割込みとして扱われる。 + * +*/ +//#define UNMANAGED_INT 0x0020 // IVHWがカーネル管理外. +//#define UNMANAGED_INT 0x0060 // IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x00E0 // IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x01E0 // IVG8 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x03E0 // IVG9 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x07E0 // IVG10 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x0FE0 // IVG11 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x1FE0 // IVG12 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x3FE0 // IVG13 ... IVG7, IVTMRとIVHWがカーネル管理外. + +/* + * C++関連資源を用意する + * + * マクロINIT_C_PLUS_PLUSを定義すると、C++言語用のテーブルを + * 初期化コードを実行する。また、C++言語用のテーブルを宣言する + * +*/ +// #define INIT_C_PLUS_PLUS + +/* + * 起動メッセージのターゲットシステム名 + */ +#define TARGET_NAME "ACB-BF592" + + +/* + * シリアルポート数の定義 + * TNUM_SIOP_XXXは、UARTの種別ごとに宣言する。 + * TNUM_SIOP_UARTはBF592内蔵UARTのうち、PDICが使用するもの。 + * BF592はUARTをひとつしかもっていないので、1か0を宣言する。 + * TNUM_PORTは、TNUM_SIOP_XXXのうち、GDICが使用するものの総和。 + * uart.cで使う。 + */ +#define TNUM_PORT 1 /* GDICがサポートするシリアルポートの数 */ +#define TNUM_SIOP_UART 1 /* PIDCがサポートするシリアルポートの数 */ + +/* + * シリアルポート番号に関する定義 + * ログタスクがシリアルポートを使わない場合は無視していい。 + */ +#define LOGTASK_PORTID 1 /* システムログに用いるシリアルポート番号。UART0はシリアルポート1である */ + +/* UART0のボーレート. */ +#define UART0_BAUD_RATE 57600 /* 57600 bps*/ + + + +#endif /* _SYS_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/acb_bf592/sys_defs.h b/uzume_prototype/kernel/config/blackfin/acb_bf592/sys_defs.h new file mode 100644 index 0000000..8b762d5 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/acb_bf592/sys_defs.h @@ -0,0 +1,80 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +/* + * ターゲットシステムに依存する定義(EZKIT-BF592用) + * + * このインクルードファイルは,kernel.h と sil.h でインクルードされる. + * 他のファイルから直接インクルードすることはない.このファイルをイン + * クルードする前に,t_stddef.h と itron.h がインクルードされるので, + * それらに依存してもよい. + */ + +#ifndef _SYS_DEFS_H_ +#define _SYS_DEFS_H_ + +/* blackfin/_common_bf592から読む */ +#include + + /* システム略称  jsp/doc/config.txtの 2.(8)を参照 */ +#define ACB_BF592 + +/* + * 破壊性読み出しレジスタの判別式 + * 与えられたアドレス iop が破壊性読み出しレジスタの + * 場合には真を返す。 + * + * ADSP-BF592の内蔵ペリフェラルについて考慮する必要はない + * 宣言しない場合は、デフォルトで外部ペリフェラルはすべて + * 破壊性読み出しとして扱われる + * + * ADSP-BF592は外部ペリフェラルを持つことができないので、 + * 無視していい + * + */ +// #define DESTRUCTIVE_READ( iop ) (iop<(VP)0xF0000000) + + + +#endif /* _SYS_DEFS_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/amakusa_bf592/Makefile.config b/uzume_prototype/kernel/config/blackfin/amakusa_bf592/Makefile.config new file mode 100644 index 0000000..5107ebd --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/amakusa_bf592/Makefile.config @@ -0,0 +1,26 @@ +# +# Makefile のターゲットシステム依存部(Amakusa board + ACB-BF592用) +# + +# +# コンパイルオプション +# +INCLUDES := $(INCLUDES) -I$(SRCDIR)/config/$(CPU)/$(SYS) \ + -I$(SRCDIR)/config/$(CPU)/_common_bf592 \ + -I$(SRCDIR)/pdic/simple_sio +COPTS := $(COPTS) +LDFLAGS := $(LDFLAGS) + +# +# カーネルに関する定義 +# +KERNEL_DIR := $(KERNEL_DIR) :$(SRCDIR)/config/$(CPU)/$(SYS) :$(SRCDIR)/config/$(CPU)/_common_bf592 :$(SRCDIR)/pdic/simple_sio +KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) +KERNEL_COBJS := $(KERNEL_COBJS) chip_config.o uart.o chip_debugboot.o chip_dump.o + + +# +# リンカスクリプトの定義 +# +LDSCRIPT = $(CPU)/_common_bf592/bf592elf.ld + diff --git a/uzume_prototype/kernel/config/blackfin/amakusa_bf592/i2c_subsystem.c b/uzume_prototype/kernel/config/blackfin/amakusa_bf592/i2c_subsystem.c new file mode 100644 index 0000000..b8927d9 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/amakusa_bf592/i2c_subsystem.c @@ -0,0 +1,346 @@ +/** + * \file i2c_subsystem.c + * \brief i2cペリフェラルをマスターモードで使うためのサブシステム + * \details + * CMSISを使い、i2cペリフェラルをマスターモードで使用する + */ +#include "i2c_subsystem.h" +#include "kernel_id.h" +#include "s_services.h" +#include + +#ifdef _COMMON_BF592 +#include +#elif defined(_COMMON_BF506) +#include +#elif defined(_COMMON_BF518) +#include +#elif defined(_COMMON_BF537) +#include +#else +#error "This processor is not supported" +#endif + +#include + + +#define I2C_DEBUG + +#ifdef I2C_DEBUG +#define I2C_SYSLOG(level,msg) syslog( level, msg ) +#else +#define I2C_SYSLOG(level,msg) +#endif + + +/** + * \brief チップ上のI2Cペリフェラルの数 + */ +#define I2CNUM 1 + +/** + * \brief I2C ペリフェラルのタイムアウト時間(mSec) + */ +#define I2C_TIMEOUT 100 + +/** + * \brief TWIペリフェラルの管理用ステート型。内部ステートマシンの状態値。 + */ +enum I2C_STATE { + I2C_XMT_ENTRY, + I2C_XMTRCV_ENTRY, + I2C_XMT_WAIT, + I2C_XMT_INT, + I2C_XMT_NEXT_BYTE, + I2C_RCV_ENTRY, + I2C_RCV_WAIT, + I2C_RCV_INT, + I2C_RCV_NEXT_BYTE, + I2C_EXIT +}; + + +/** + * \brief I2C管理用構造体 + */ +struct I2C_MASTER_CONTROL_TYPE { + ID signal; /**< データの送受信が全部終わったときに割り込みハンドラからタスクに知らせるためのセマフォ */ + ID blocking; /**< I2Cペリフェラルへの排他アクセスのためのセマフォ */ + unsigned short intr_state; /**< TWIペリフェラルの割り込みステータスのコピー **/ + volatile unsigned short * clkdiv; /**< TWI_CLCKDIVレジスタのアドレス **/ + volatile unsigned short * control; /**< TWI_CONTROLレジスタのアドレス **/ + volatile unsigned short * master_ctl; /**< TWI_MASTER_CTLレジスタのアドレス **/ + volatile unsigned short * master_stat; /**< TWI_MASTER_STATレジスタのアドレス **/ + volatile unsigned short * master_addr; /**< TWI_MASTER_ADDRレジスタのアドレス **/ + volatile unsigned short * int_stat; /**< TWI_MASTER_STATレジスタのアドレス **/ + volatile unsigned short * int_mask; /**< TWI_INT_MASKレジスタのアドレス **/ + volatile unsigned short * fifo_ctl; /**< TWI_FIFO_CTLレジスタのアドレス **/ + volatile unsigned short * fifo_stat; /**< TWI_FIFO_STATレジスタのアドレス **/ + volatile unsigned short * xmt_data8; /**< TWI_XMT_DATA8レジスタのアドレス **/ + volatile unsigned short * rcv_data8; /**< TWI_RCV_DATA8レジスタのアドレス **/ + volatile unsigned short * slave_ctl; /**< TWI_MASTER_CTLレジスタのアドレス **/ + +}; + +/** + * \brief i2cペリフェラルを管理するための構造体群。 + */ +static struct I2C_MASTER_CONTROL_TYPE i2c_control[I2CNUM]; + + +int i2c_master_write( int peripheral, int slave, unsigned char write_data[], int write_count ) +{ + // read のための引数を0にしておくと、writeのみがおこなわれる + return i2c_master_write_read( peripheral, slave, write_data, write_count, 0, 0); +} + +int i2c_master_read( int peripheral, int slave, unsigned char read_data[], int read_count ) +{ + // write のための引数を0にしておくと、readのみがおこなわれる + return i2c_master_write_read( peripheral, slave, 0, 0, read_data, read_count); +} + + +int i2c_master_write_read( int peripheral, int slave, unsigned char write_data[], int write_count, unsigned char read_data[], int read_count) +{ + struct I2C_MASTER_CONTROL_TYPE *twi; + BOOL read, write, rstart, quit; + unsigned char *wptr, *rptr; + enum I2C_STATE state; /**< I2Cペリフェラルハンドラの内部状態 */ + PRI old_priority; // タスクの優先順位を保存しておくための変数 + + // 可読性向上のため、TWI管理構造体のポインタを設定する。 + twi = &i2c_control[peripheral]; + + // 送受信ポインタ.とかくこの世は生きにくい + wptr = write_data; + rptr = read_data; + + // この代入は必要ないが、警告がうるさいので + rstart= FALSE; + + // ループ終了条件の成立フラグ + quit = FALSE; + + // 読み書きの有無の確認 + // バッファがNULLだったり長さが0のパラメタは転送に使わない + write = ( write_data != NULL ) && ( write_count != 0 ); + read = ( read_data != NULL ) && ( read_count != 0 ); + + // パラメタの組み合わせによって初期状態が変わる + if ( read && write ) + state = I2C_XMTRCV_ENTRY; + else if ( write && ! read ) + state = I2C_XMT_ENTRY; + else if ( ! write && read ) + state = I2C_RCV_ENTRY; + else + return I2C_ERR_WRONGPARAM; + + if ( write_count > 254 || read_count > 254 ) + return I2C_ERR_TOOLONGBUFFER; + + + // peripheral 引数で指定されたi2cペリフェラルを排他的に使うためのPV処理。 + // これでスレッドセーフにできる + wai_sem(twi->blocking); + + // タスクの優先順位を一旦引き上げる。これは、TWIのレスポンスを保証するためである + get_pri( TSK_SELF, &old_priority ); + chg_pri( TSK_SELF, TMAX_TPRI ); + + // SPIスレーブデバイスのアドレスを設定(7bit) + *twi->master_addr = slave; + + // FIFO フラッシュ + *twi->fifo_ctl = XMTFLUSH | RCVFLUSH; + ssync(); + + // FIFO 設定 + *twi->fifo_ctl = XMTINTLEN; // 割り込みスレシホールドは送受とも1バイト、FLUSHはクリアする + + // TWIステートマシン + do { + switch (state) + { + case I2C_XMT_ENTRY : + I2C_SYSLOG(LOG_NOTICE, "I2C_XMT_ENTRY" ); + rstart = FALSE; + *twi->master_ctl = ( write_count<<6 ) | MEN; // no rstart, transmit, no fast mode; + state = I2C_XMT_NEXT_BYTE; + break; + case I2C_XMTRCV_ENTRY : + I2C_SYSLOG(LOG_NOTICE, "I2C_XMTRCV_ENTRY" ); + rstart = TRUE; + *twi->master_ctl = ( write_count<<6 ) | RSTART | MEN; // rstart, transmit, no fast mode; + state = I2C_XMT_NEXT_BYTE; + break; + case I2C_RCV_ENTRY : + I2C_SYSLOG(LOG_NOTICE, "I2C_RCV_ENTRY" ); + rstart = FALSE; + *twi->master_ctl = ( read_count<<6 ) | MDIR | MEN; // no rstart, receive, no fast mode; + state = I2C_RCV_WAIT; + break; + case I2C_XMT_WAIT : + I2C_SYSLOG(LOG_NOTICE, "I2C_XMT_WAIT" ); + // 割り込みハンドラが送信割り込みを通知するまで待つ + if ( E_OK != twai_sem(twi->signal, I2C_TIMEOUT)) + { + twi->intr_state = I2C_ERR_TIMEOUT | *twi->int_stat; // エラーなら割り込みステータスを併記 + state = I2C_EXIT; + } + else + state = I2C_XMT_INT; + break; + case I2C_XMT_INT : + I2C_SYSLOG(LOG_NOTICE, "I2C_XMT_INT" ); + if ( twi->intr_state & MERR ) // エラーならすぐ終了 + state = I2C_EXIT; + else if ( ( twi->intr_state & MCOMP ) && rstart) // MCOMP かつ RSTARTなら受信へ + state = I2C_RCV_ENTRY; + else if ( twi->intr_state & MCOMP ){ // RSTARTがないMCOMPなら終了 + twi->intr_state &= ~MCOMP; + state = I2C_EXIT; + } + else // それ以外は送信割り込み + state = I2C_XMT_NEXT_BYTE; + break; + case I2C_XMT_NEXT_BYTE : + I2C_SYSLOG(LOG_NOTICE, "I2C_XMT_NEXT_BYTE" ); + *twi->xmt_data8 = *(wptr++); // 1バイト送信 + state = I2C_XMT_WAIT; // 次の送信待 + break; + case I2C_RCV_WAIT : + I2C_SYSLOG(LOG_NOTICE, "I2C_RCV_WAIT" ); + // 割り込みハンドラが受信割り込みを通知するまで待つ + if ( E_OK != twai_sem(twi->signal, I2C_TIMEOUT)) + { + twi->intr_state = I2C_ERR_TIMEOUT | *twi->int_stat; // エラーなら割り込みステータスを併記 + state = I2C_EXIT; + } + else + state = I2C_RCV_INT; + break; + case I2C_RCV_INT : + I2C_SYSLOG(LOG_NOTICE, "I2C_RCV_INT" ); + if ( twi->intr_state & MERR) // エラーならすぐ終了 + state = I2C_EXIT; + else if ( twi->intr_state & MCOMP ){ // 終了ならエラークリア + twi->intr_state &= ~MCOMP; + state = I2C_EXIT; + } + else // それ以外は受信割り込み + state = I2C_RCV_NEXT_BYTE; + break; + case I2C_RCV_NEXT_BYTE : + I2C_SYSLOG(LOG_NOTICE, "I2C_RCV_NEXT_BYTE" ); + *(rptr++) = *twi->rcv_data8; // 1バイト受信 + state = I2C_RCV_WAIT; // 次の受信待 + break; + case I2C_EXIT : + I2C_SYSLOG(LOG_NOTICE, "I2C_EXIT" ); + * twi->master_ctl = 0; // マスターをディセーブルして終了 + quit = TRUE; + break; + } + } while ( !quit ); + + // タスクの優先順位を元に戻す + chg_pri( TSK_SELF, old_priority); + + // 排他区間の終了 + sig_sem(twi->blocking); + + // 割り込みステータスを返す。正常終了なら0 + return twi->intr_state; +} + +/** + * \brief i2c 割り込みサービスルーチン本体 + * \param peripheral I2Cペリフェラル番号。0から始まる。 + * \details + * 割り込みサービスルーチンから呼び出す。この関数が割り込みハンドラの実体である。 + * チップに複数のTWIペリフェラルがある場合には、引数に当該TWIペリフェラル番号を与えて呼び出す。 + * + * 関数内部では、タスクに割り込みが入ったことを知らせ、ペリフェラルの割り込みステータスを + * 変数に退避してから戻る。 + */ +static void i2c_master_handler( int peripheral ) +{ + struct I2C_MASTER_CONTROL_TYPE *twi; + + // 可読性向上のため、TWI管理構造体のポインタを設定する。 + twi = &i2c_control[peripheral]; + + // TWIペリフェラルの割り込みステータスを取得し、コピーを保存する。 + // コピーを保存するのは、このあと割り込みクリアで消えるからである。 + twi->intr_state = *twi->int_stat; + + // 割り込みクリア。すべての割り込み要素をクリアしてしまう。ステータスはコピーしているのでタスクで処理する。 + *twi->int_stat = 0xFF; + + // 割り込みクリアが確定するまで待つ。 + ssync(); + + /* 通知はセマフォを使う。タスクは i2c_master_write_read()の中で待っている。 */ + isig_sem(twi->signal); +} + + +/** + * \details + * TOPPERS/JSPでは、DEF_INHから割り込みハンドラに引数を渡せない。そのため、この関数内で + * i2c_master_handler() を引数0決め打ちで呼ぶ。 + */ +void i2c0_master_handler(void) +{ + i2c_master_handler( 0 ); +} + + +/** + * \brief i2c イニシャライザ + * \param exinf ペリフェラル番号。TWI0ならば、0を渡す。 + * \details + * I2C用のコントロールブロックのI2C相当部分を初期化する。 + */ +void i2c_master_initialize(VP_INT exinf) +{ + struct I2C_MASTER_CONTROL_TYPE *twi; + unsigned int peripheral = (unsigned int)exinf; + + // 可読性向上のため、TWI管理構造体のポインタを設定する。 + twi = &i2c_control[peripheral]; + + twi->blocking = SEM_I2C0_BLOCK; // ペリフェラルブロック用セマフォ + twi->signal = SEM_I2C0_SIGNAL; // 割り込み・タスク通信用セマフォ + // レジスタアドレスを設定 + twi->clkdiv = pTWI_CLKDIV ; + twi->control = pTWI_CONTROL ; + twi->master_ctl = pTWI_MASTER_CTL ; + twi->master_stat = pTWI_MASTER_STAT ; + twi->master_addr = pTWI_MASTER_ADDR ; + twi->int_stat = pTWI_INT_STAT ; + twi->int_mask = pTWI_INT_MASK ; + twi->fifo_ctl = pTWI_FIFO_CTL ; + twi->fifo_stat = pTWI_FIFO_STAT ; + twi->xmt_data8 = pTWI_XMT_DATA8 ; + twi->rcv_data8 = pTWI_RCV_DATA8 ; + twi->slave_ctl = pTWI_SLAVE_CTL ; + + + *twi->control = 0; // TWI をディセーブル + *twi->master_ctl = 0; // マスター機能をディセーブル + *twi->slave_ctl = 0; // スレーブ機能をディセーブル + + *twi->control = TWI_ENA | (SYSCLOCK/10000000); // HWRによると、プリスケール値はSYSCLKを10MHzで割ったものでなければならない。 + *twi->clkdiv = 30<<8 | 70; // TWI内部クロック10MHzに対して、100kHzのI2Cクロックは100分の1である + + // 割り込みイネーブル設定。送受割り込み、完了割り込み及びエラー割り込み。 + *twi->int_mask = MCOMP | MERR | XMTSERV | RCVSERV; + + // システム割り込みをイネーブルにする。 + ena_int(INTNO_TWI); +} + + diff --git a/uzume_prototype/kernel/config/blackfin/amakusa_bf592/i2c_subsystem.h b/uzume_prototype/kernel/config/blackfin/amakusa_bf592/i2c_subsystem.h new file mode 100644 index 0000000..f929ef0 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/amakusa_bf592/i2c_subsystem.h @@ -0,0 +1,152 @@ +/** + * \file i2c_subsystem.h + * + * \date 2012/09/01 + * \author: takemasa + * \brief twiペリフェラルをマスターモードで使用する + * + */ +#include + +#ifndef I2C_SUBSYSTEM_H_ +#define I2C_SUBSYSTEM_H_ + +/** + * \defgroup I2C_SUBSYSTEM I2Cを使用するためのサブシステム + * \details + * i2c_subsystemは、LPC1768の内蔵I2Cペリフェラルを使用するための関数群である。この関数群はTOPPERS/ASP用に開発されており、CMSISの下位 + * ライブラリを使用して、割り込みを使ったポーリングなしの制御を実現している。タスクから呼び出された関数は割り込みハンドラとセマフォを使って + * 通信しながら指定されたI2Cスレーブ・デバイスの制御を行う。また、関数群は排他制御されており、一つのi2Cペリフェラルを複数のタスクが同時に使用 + * しないよう保護されている。 + * + * アプリケーションが使用するのは i2c_master_write(), i2c_master_read(), i2c_master_write_read() の三つの関数だけである。 + * この他にI2Cの初期化関数と割り込みISRがあるが、これらは TOPPERS/ASP のコンフィギュレーション・ファイルに記述されており、アプリケーション・ + * プログラマが直接呼び出してはならない。 + * + * I2Cx ペリフェラルを使用する場合には、アプリケーションのコンフィギュレーションファイルから、i2cx_m.cfgファイルを読み込んでおく。 + * 例えば、I2C1を使いたいのであれば、i2c1_m.cfg ファイルを読み込む。i2c0_m.cfg から i2c2_m.cfg までのファイルがあり、 + * どのファイルをどの組み合わせでどの順番で読み込んでもかまわない。 + * + * I2Cxペリフェラルの初期化は、cfgファイルによって記述されたイニシャライザが行う。また、割り込みISRもcfgファイルによって登録 + * される。このほか、ペリフェラル電源のオン、クロックの設定もイニシャライザ内部で完結している。 + * + * I2Cxペリフェラルへのピンの割り当てが必要な場合は、アプリケーションで行う。 + * + * なお、I2Cサブシステムは、イニシャライザ内部でCMSISの SystemCoreClockUpdate() 関数を使用してCPUのクロック周波数を + * 測定している。この関数が常に正しく動作するのはCPUが内部RCオシレータを使用する場合と、RTCの32768Hzクロックを使用する場合のみである。 + * 外部クリスタルを使ったメインオシレータを使用する場合は、クリスタルの共振周波数とCMSIS内部のクロック設定値をあわせてCMSISを再ビルド + * しなければならない。 + */ +/*@{*/ + +/** + * \brief TWIデバイス制御関数への引き数値が間違っている。 + */ +#define I2C_ERR_WRONGPARAM 0x4000 +/** + * \brief TWIデバイス制御関数へ指定した送受信データ長が長すぎる。 + */ +#define I2C_ERR_TOOLONGBUFFER 0x2000 +/** + * \brief TWIデバイスがタイムアウトした。 + */ +#define I2C_ERR_TIMEOUT 0x1000 + +/** + * \brief i2cマスターモードの割り込みサービスルーチン + * \param exinf i2cペリフェラルの番号。TWI0なら、0 + * \details + * この間数は、i2cをマスターモードとして使う際の割り込みサービスルーチン本体である。 i2c_master_read()等の関数と強調しながら + * 動作する。データ転送が終わると、あらかじめ設定されたコールバックを呼び出してタスクに通知する。 + * + * exinfには、コンフィギュレーションファイルのDEF_INHから値を与える + */ +void i2c0_master_handler(void); + + +/** + * \brief i2cマスターモード動作用の初期化を行う + * \param exinf ペリフェラル番号を渡す. TWI0なら0。 + * \details + * この関数は i2c0_master_handler() が i2c_master_read() 等の関数と同期するためのセマフォの設定を行う。 + * 呼び出しは明示的に行わず、コンフィギュレーションファイルからATT_INIを使ってシステムに登録する。 + * + */ +void i2c_master_initialize(VP_INT exinf); + + +/** + * \brief I2C マスター書き込み関数 + * \param peripheral マイコンのI2Cペリフェラルの番号。TWI0なら0 + * \param slave 7bitで表すI2Cペリフェラルの番号。bit0:6のみ使い、bit7以上は0にすること。 + * \param write_data ペリフェラルに書き込むデータ・バイト列 + * \param write_count ペリフェラルに書き込むデータの長さ。単位はバイト。最大254。 + * \return エラーがなければ0 + * \details + * 引数 peripheral を使って、アドレス slave のI2Cデバイスに対する書き込みを行う関数。 + + * この関数はブロッキング関数である。つまり、読み込みを開始すると、その終了まで待って + * 帰ってくる。 + * + * また、複数のタスクが同時にこの関数を呼んだ場合には、うち一つだけが関数を実行し、他のタスクは + * 待ち状態になる。 + * + * 返り値はTWI_ERROR_XXXXと、TWIペリフェラルの割り込みステータスのビット論理和である。 + * 正常終了ならオール0である。 + * + */ +int i2c_master_write( int peripheral, int slave, unsigned char write_data[], int write_count ); + +/** + * \brief I2C マスター読み込み関数 + * \param peripheral マイコンのI2Cペリフェラルの番号。TWI0なら0 + * \param slave 7bitで表すI2Cペリフェラルの番号。bit0:6のみ使い、bit7以上は0にすること。 + * \param read_data ペリフェラルから読み込むデータ・バッファ + * \param read_count ペリフェラルから読み込むデータの長さ。単位はバイト。最大254。 + * \return エラーがなければ0。処理がタイムアウトならば処理ステータス + * \details + * 引数 peripheral を使って、アドレス slave のI2Cデバイスからの読み込みを行う関数。 + + * この関数はブロッキング関数である。つまり、読み込みを開始すると、その終了まで待って + * 帰ってくる。 + * + * また、複数のタスクが同時にこの関数を呼んだ場合には、うち一つだけが関数を実行し、他のタスクは + * 待ち状態になる。 + * + * 返り値はTWI_ERROR_XXXXと、TWIペリフェラルの割り込みステータスのビット論理和である。 + * 正常終了ならオール0である。 + * + */ +int i2c_master_read( int peripheral, int slave, unsigned char read_data[], int read_count); + +/** + * \brief I2C マスター書き込み読み込み関数 + * \param peripheral マイコンのI2Cペリフェラルの番号。TWI0なら0。 + * \param slave 7bitで表すI2Cペリフェラルの番号。bit0:6のみ使い、bit7以上は0にすること。 + * \param write_data ペリフェラルに書き込むデータ・バイト列 + * \param write_count ペリフェラルに書き込むデータの長さ。単位はバイト。最大254。 + * \param read_data ペリフェラルから読み込むデータ・バッファ + * \param read_count ペリフェラルから読み込むデータの長さ。単位はバイト。最大254。 + * \return エラーがなければ0。 + * \details + * 引数 peripheral を使って、アドレス slave のI2Cデバイスに対する書き込みを行う関数。 + * + * この間数は、まず slave に対して write_data バッファから write_count 個のデータを + * 書き込む。続いて I2C の repeated start を使って同じ slave に対する read_count個の + * 読み出しを行う。 + * + * この関数はブロッキング関数である。つまり、読み込みを開始すると、その終了まで待って + * 帰ってくる。 + * + * また、複数のタスクが同時にこの関数を呼んだ場合には、うち一つだけが関数を実行し、他のタスクは + * 待ち状態になる。 + * + * 返り値はTWI_ERROR_XXXXと、TWIペリフェラルの割り込みステータスのビット論理和である。 + * 正常終了ならオール0である。 + * + */ +int i2c_master_write_read( int peripheral, int slave, unsigned char write_data[], int write_count, unsigned char read_data[], int read_count ); + +/*@}*/ + +#endif /* I2C_SUBSYSTEM_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/amakusa_bf592/jsp_acb_bf592.dpj b/uzume_prototype/kernel/config/blackfin/amakusa_bf592/jsp_acb_bf592.dpj new file mode 100644 index 0000000..6df5d35 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/amakusa_bf592/jsp_acb_bf592.dpj @@ -0,0 +1,617 @@ + + + + + ADSP-BF592-A + .dlb + Library file + + + + + .\Debug + . + 0 + + + + + + + + + + + + + + + + + + + + + + + .\Release + . + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + diff --git a/uzume_prototype/kernel/config/blackfin/amakusa_bf592/readme.txt b/uzume_prototype/kernel/config/blackfin/amakusa_bf592/readme.txt new file mode 100644 index 0000000..87911c2 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/amakusa_bf592/readme.txt @@ -0,0 +1,18 @@ +金子システム製 ACB-BF592対応システム依存部。 + + +Makefile.configは、インクルード・パスおよびソースファイルへのパスとしてblackfin/_common_bf592を +指定している。 + +- Makefile.config : gnu環境のためのシステム依存部定義ファイル +- readme.txt : このファイル +- sys_config.h : システム依存部のうち、アプリケーションから見えない宣言 +- sys_defs.h : システム依存部のうち、アプリケーションから見える宣言 + +2012/2/18 メモ +システムタイマーをGPTimer 2に変更。 +sample1の動作は確認できている。 + +2012/2/1 メモ。 +とりあえずビルドできた。 +タイマーは、まだコアタイマーを使っている。 \ No newline at end of file diff --git a/uzume_prototype/kernel/config/blackfin/amakusa_bf592/sys_config.h b/uzume_prototype/kernel/config/blackfin/amakusa_bf592/sys_config.h new file mode 100644 index 0000000..b0f60d0 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/amakusa_bf592/sys_config.h @@ -0,0 +1,173 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +#ifndef _SYS_CONFIG_H_ +#define _SYS_CONFIG_H_ + +/* + * カーネルの内部識別名のリネーム + */ +#include + +/* blackfin/_common_bf533から読み込む */ +#include + +/* + * ターゲットシステム依存モジュール(EZKIT-BF592用) + * + * このインクルードファイルは,t_config.h のみからインクルードされる. + * 他のファイルから直接インクルードしてはならない. +*/ + +/* + * どのようなクロック入力にも対応できるよう、以下でCSEL, SSEL, MSELの値 + * とクロック入力周波数(Hz)を指定する。PLLのプログラムはsys_config.cの + * sys_initialize()関数で行われる。 + * + * CSELVALは1,2,4,8の中から選ぶ。CLKINの単位はHz + */ + +#define CSELVAL 1 +#define SSELVAL 4 +#define MSELVAL 16 +#define CLKIN 25000000 + +/* + * システムタイマーの選択 + * USE_TIC_COREをdefineすると、COREタイマーが使用される + * コメントアウトすると、GP_TIMER_2を使用する + * + * COREタイマーはwakeup信号を生成しないため、ディスパッチャ + * はidle命令を使ってCOREタイマーイベントを待つことができない。 + * そのため、USE_TIC_COREを使うとディスパッチャはidle命令を + * 使わずに割り込み発生をポーリングで待つ。これは消費電力の + * 点で不利である。 + * + * システムタイマーにコアタイマーを使うことは、推奨しない。 + * この機能は、移植時の利便性のために残しており、実アプリケーションで + * つかうことは想定していない。 + * + */ +//#define USE_TIC_CORE + +/* + * ハードウェア・エラー割り込みの許可 + * QUICK_HW_ERRORをdefineすると、ハードウェア・エラー・イベント + * が即座に受理される。defineしない場合には、割り込み待ち状態で + * ハードウェア・エラー・割り込みが発生した場合、次の割り込みまで + * 待たされることになる。 + * + */ +//#define QUICK_HW_ERROR + + +/* + * 実行時初期化関数の使用 + * + * マクロ USE_RUNTIME_INIT を定義すると、start.asmのなかで _mi_initialize + * を呼び出す。この関数はノーブートモードで起動するときにのみ必要になるので + * 通常は USE_RUNTIME_INITを使う必要はない。 + * 詳細はADIのEE239に詳しい。http://tinyurl.com/2hpbk (tinyURL) + * +*/ +//#define USE_RUNTIME_INIT + +/* + * カーネル管理外割り込みの宣言 + * + * マクロUNMANAGED_INTはカーネル管理外割り込みを宣言する。この + * マクロは16ビットのビットマップになっており、以下にあるパターン + * のうちひとつを使う。なお、どのようなパターンを選んでもNMIは管理外 + * 割込みとして扱われる。 + * UNMANAGED_INTを宣言しない場合、NMIだけが管理外割込みとして扱われる。 + * +*/ +//#define UNMANAGED_INT 0x0020 // IVHWがカーネル管理外. +//#define UNMANAGED_INT 0x0060 // IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x00E0 // IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x01E0 // IVG8 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x03E0 // IVG9 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x07E0 // IVG10 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x0FE0 // IVG11 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x1FE0 // IVG12 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x3FE0 // IVG13 ... IVG7, IVTMRとIVHWがカーネル管理外. + +/* + * C++関連資源を用意する + * + * マクロINIT_C_PLUS_PLUSを定義すると、C++言語用のテーブルを + * 初期化コードを実行する。また、C++言語用のテーブルを宣言する + * +*/ +// #define INIT_C_PLUS_PLUS + +/* + * 起動メッセージのターゲットシステム名 + */ +#define TARGET_NAME "Amakusa + ACB-BF592" + + +/* + * シリアルポート数の定義 + * TNUM_SIOP_XXXは、UARTの種別ごとに宣言する。 + * TNUM_SIOP_UARTはBF592内蔵UARTのうち、PDICが使用するもの。 + * BF592はUARTをひとつしかもっていないので、1か0を宣言する。 + * TNUM_PORTは、TNUM_SIOP_XXXのうち、GDICが使用するものの総和。 + * uart.cで使う。 + */ +#define TNUM_PORT 1 /* GDICがサポートするシリアルポートの数 */ +#define TNUM_SIOP_UART 1 /* PIDCがサポートするシリアルポートの数 */ + +/* + * シリアルポート番号に関する定義 + * ログタスクがシリアルポートを使わない場合は無視していい。 + */ +#define LOGTASK_PORTID 1 /* システムログに用いるシリアルポート番号。UART0はシリアルポート1である */ + +/* UART0のボーレート. */ +#define UART0_BAUD_RATE 57600 /* 57600 bps*/ + + + +#endif /* _SYS_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/amakusa_bf592/sys_defs.h b/uzume_prototype/kernel/config/blackfin/amakusa_bf592/sys_defs.h new file mode 100644 index 0000000..1319958 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/amakusa_bf592/sys_defs.h @@ -0,0 +1,80 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +/* + * ターゲットシステムに依存する定義(Amakusa + ACB-BF592用) + * + * このインクルードファイルは,kernel.h と sil.h でインクルードされる. + * 他のファイルから直接インクルードすることはない.このファイルをイン + * クルードする前に,t_stddef.h と itron.h がインクルードされるので, + * それらに依存してもよい. + */ + +#ifndef _SYS_DEFS_H_ +#define _SYS_DEFS_H_ + +/* blackfin/_common_bf592から読む */ +#include + + /* システム略称  jsp/doc/config.txtの 2.(8)を参照 */ +#define AMAKUSA_BF592 + +/* + * 破壊性読み出しレジスタの判別式 + * 与えられたアドレス iop が破壊性読み出しレジスタの + * 場合には真を返す。 + * + * ADSP-BF592の内蔵ペリフェラルについて考慮する必要はない + * 宣言しない場合は、デフォルトで外部ペリフェラルはすべて + * 破壊性読み出しとして扱われる + * + * ADSP-BF592は外部ペリフェラルを持つことができないので、 + * 無視していい + * + */ +// #define DESTRUCTIVE_READ( iop ) (iop<(VP)0xF0000000) + + + +#endif /* _SYS_DEFS_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/api.h b/uzume_prototype/kernel/config/blackfin/api.h new file mode 100644 index 0000000..b308dfd --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/api.h @@ -0,0 +1,166 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + */ + +#ifndef __INCL_API_H__ +#define __INCL_API_H__ + +#define __cycini +#define __cycenq +#define __sta_cyc +#define __stp_cyc +#define __cyccal +#define __dtqini +#define __dtqenq +#define __dtqfenq +#define __dtqdeq +#define __dtqsnd +#define __dtqrcv +#define __snd_dtq +#define __psnd_dtq +#define __ipsnd_dtq +#define __tsnd_dtq +#define __fsnd_dtq +#define __ifsnd_dtq +#define __rcv_dtq +#define __prcv_dtq +#define __trcv_dtq +#define __flgini +#define __flgcnd +#define __set_flg +#define __iset_flg +#define __clr_flg +#define __wai_flg +#define __pol_flg +#define __twai_flg +#define __excini +#define __vxsns_ctx +#define __vxsns_loc +#define __vxsns_dsp +#define __vxsns_dpn +#define __vxsns_tex +#define __inhini +#define __mbxini +#define __snd_mbx +#define __rcv_mbx +#define __prcv_mbx +#define __trcv_mbx +#define __mpfini +#define __mpfget +#define __get_mpf +#define __pget_mpf +#define __tget_mpf +#define __rel_mpf +#define __semini +#define __sig_sem +#define __isig_sem +#define __wai_sem +#define __pol_sem +#define __twai_sem +#define __rot_rdq +#define __irot_rdq +#define __get_tid +#define __iget_tid +#define __loc_cpu +#define __iloc_cpu +#define __unl_cpu +#define __iunl_cpu +#define __dis_dsp +#define __ena_dsp +#define __sns_ctx +#define __sns_loc +#define __sns_dsp +#define __sns_dpn +#define __logini +#define __vwri_log +#define __vrea_log +#define __vmsk_log +#define __logter +#define __tskini +#define __tsksched +#define __tskrun +#define __tsknrun +#define __tskdmt +#define __tskact +#define __tskext +#define __tskpri +#define __tskrot +#define __tsktex +#define __ras_tex +#define __iras_tex +#define __dis_tex +#define __ena_tex +#define __sns_tex +#define __act_tsk +#define __iact_tsk +#define __can_act +#define __ext_tsk +#define __ter_tsk +#define __chg_pri +#define __get_pri +#define __slp_tsk +#define __tslp_tsk +#define __wup_tsk +#define __iwup_tsk +#define __can_wup +#define __rel_wai +#define __irel_wai +#define __sus_tsk +#define __rsm_tsk +#define __frsm_tsk +#define __dly_tsk +#define __tmeini +#define __tmeup +#define __tmedown +#define __tmeins +#define __tmedel +#define __isig_tim +#define __set_tim +#define __get_tim +#define __vxget_tim +#define __waimake +#define __waicmp +#define __waitmo +#define __waitmook +#define __waican +#define __wairel +#define __wobjwai +#define __wobjwaitmo +#define __wobjpri + + +#endif + diff --git a/uzume_prototype/kernel/config/blackfin/bf533cb/Makefile.config b/uzume_prototype/kernel/config/blackfin/bf533cb/Makefile.config new file mode 100644 index 0000000..a7869d0 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/bf533cb/Makefile.config @@ -0,0 +1,25 @@ +# +# Makefile のターゲットシステム依存部(BF533CB用) +# + +# +# コンパイルオプション +# +INCLUDES := $(INCLUDES) -I$(SRCDIR)/config/$(CPU)/$(SYS) \ + -I$(SRCDIR)/config/$(CPU)/_common_bf533 \ + -I$(SRCDIR)/pdic/simple_sio +COPTS := $(COPTS) +LDFLAGS := $(LDFLAGS) + +# +# カーネルに関する定義 +# +KERNEL_DIR := $(KERNEL_DIR) :$(SRCDIR)/config/$(CPU)/$(SYS) :$(SRCDIR)/config/$(CPU)/_common_bf533 :$(SRCDIR)/pdic/simple_sio +KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) +KERNEL_COBJS := $(KERNEL_COBJS) chip_config.o uart.o chip_debugboot.o chip_mmr.o chip_dump.o + + +# +# リンカスクリプトの定義 +# +LDSCRIPT = $(CPU)/_common_bf533/bf533elf.ld diff --git a/uzume_prototype/kernel/config/blackfin/bf533cb/readme.txt b/uzume_prototype/kernel/config/blackfin/bf533cb/readme.txt new file mode 100644 index 0000000..979b0ac --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/bf533cb/readme.txt @@ -0,0 +1,12 @@ +Analog Devices製 BF533CB対応システム依存部。 + +sys_config.hとsys_defs.hは、#include_nextを使って、それぞれblackfin/_common_bf533/sys_config.h +とblackfin/_common_bf533/sys_defs.hを読み込んでいる。 + +Makefile.configは、インクルード・パスおよびソースファイルへのパスとしてblackfin/_common_bf533も +指定している。 + +- Makefile.config : gnu環境のためのシステム依存部定義ファイル +- readme.txt : このファイル +- sys_config.h : システム依存部のうち、アプリケーションから見えない宣言 +- sys_defs.h : システム依存部のうち、アプリケーションから見える宣言 \ No newline at end of file diff --git a/uzume_prototype/kernel/config/blackfin/bf533cb/sys_config.h b/uzume_prototype/kernel/config/blackfin/bf533cb/sys_config.h new file mode 100644 index 0000000..98f1691 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/bf533cb/sys_config.h @@ -0,0 +1,168 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +#ifndef _SYS_CONFIG_H_ +#define _SYS_CONFIG_H_ + + +/* + * カーネルの内部識別名のリネーム + */ +#include + + +/* blackfin/_common_bf533から読み込む */ +#include + +/* + * ターゲットシステム依存モジュール(BF533CB用) + * + * このインクルードファイルは,t_config.h のみからインクルードされる. + * 他のファイルから直接インクルードしてはならない. +*/ + +/* + * どのようなクロック入力にも対応できるよう、以下でCSEL, SSEL, MSELの値 + * とクロック入力周波数(Hz)を指定する。PLLのプログラムはsys_config.cの + * sys_initialize()関数で行われる。 + * + * CSELVALは1,2,4,8の中から選ぶ。CLKINの単位はHz + */ + +#define CSELVAL 1 +#define SSELVAL 4 +#define MSELVAL 25 +#define CLKIN 20000000 + + +/* + * ハードウェア・エラー割り込みの許可 + * QUICK_HW_ERRORをdefineすると、ハードウェア・エラー・イベント + * が即座に受理される。defineしない場合には、割り込み待ち状態で + * ハードウェア・エラー・割り込みが発生した場合、次の割り込みまで + * 待たされることになる。 + * + */ +//#define QUICK_HW_ERROR + + +/* + * 実行時初期化関数の使用 + * + * マクロ USE_RUNTIME_INIT を定義すると、start.asmのなかで _mi_initialize + * を呼び出す。この関数はノーブートモードで起動するときにのみ必要になるので + * 通常は USE_RUNTIME_INITを使う必要はない。 + * 詳細はADIのEE239に詳しい。http://tinyurl.com/2hpbk (tinyURL) + * +*/ +//#define USE_RUNTIME_INIT + +/* + * カーネル管理外割り込みの宣言 + * + * マクロUNMANAGED_INTはカーネル管理外割り込みを宣言する。この + * マクロは16ビットのビットマップになっており、以下にあるパターン + * のうちひとつを使う。なお、どのようなパターンを選んでもNMIは管理外 + * 割込みとして扱われる。 + * UNMANAGED_INTを宣言しない場合、NMIだけが管理外割込みとして扱われる。 + * +*/ +//#define UNMANAGED_INT 0x0020 // IVHWがカーネル管理外. +//#define UNMANAGED_INT 0x0060 // IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x00E0 // IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x01E0 // IVG8 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x03E0 // IVG9 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x07E0 // IVG10 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x0FE0 // IVG11 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x1FE0 // IVG12 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x3FE0 // IVG13 ... IVG7, IVTMRとIVHWがカーネル管理外. + +/* + * C++関連資源を用意する + * + * マクロINIT_C_PLUS_PLUSを定義すると、C++言語用のテーブルを + * 初期化コードを実行する。また、C++言語用のテーブルを宣言する + * +*/ +// #define INIT_C_PLUS_PLUS + +/* + * 起動メッセージのターゲットシステム名 + */ +#define TARGET_NAME "BF533CB" + + +/* + * シリアルポート数の定義 + * TNUM_SIOP_XXXは、UARTの種別ごとに宣言する。 + * TNUM_SIOP_UARTはBF533内蔵UARTのうち、PDICが使用するもの。 + * BF533はUARTをひとつしかもっていないので、1か0を宣言する。 + * TNUM_PORTは、TNUM_SIOP_XXXのうち、GDICが使用するものの総和。 + * uart.cで使う。 + */ +#define TNUM_PORT 1 /* GDICがサポートするシリアルポートの数 */ +#define TNUM_SIOP_UART 1 /* PIDCがサポートするシリアルポートの数 */ + +/* + * シリアルポート番号に関する定義 + * ログタスクがシリアルポートを使わない場合は無視していい。 + */ +#define LOGTASK_PORTID 1 /* システムログに用いるシリアルポート番号 */ + +/* UART0のボーレート. */ +#define UART0_BAUD_RATE 57600 /* 57600 baud */ + +/* + * PLLの初期化の強制 + * PLLは、PLL_CTLレジスタがデフォルト値で、かつ、SDRAMコントローラが + * ディセーブルのときに限り初期化を行うようになっている。これは、ブート + * ローダーなどの初期化ソフトがSDRAMを初期化したときにそれを保護するため + * である。一方でVisualDSP++のデバッガはSDRAMを自分で初期化するため、 + * この機能とうまく折り合いがつかない場合がある。 + * 状況に関わらず常に初期化したい時には FORCE_PLL_INITIALIZE マクロを + * 宣言する。 + */ +// #deinfe FORCE_PLL_INITIALIZE + +#endif /* _SYS_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/bf533cb/sys_defs.h b/uzume_prototype/kernel/config/blackfin/bf533cb/sys_defs.h new file mode 100644 index 0000000..b256873 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/bf533cb/sys_defs.h @@ -0,0 +1,81 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +/* + * ターゲットシステムに依存する定義(BF533CB用) + * + * このインクルードファイルは,kernel.h と sil.h でインクルードされる. + * 他のファイルから直接インクルードすることはない.このファイルをイン + * クルードする前に,t_stddef.h と itron.h がインクルードされるので, + * それらに依存してもよい. + */ + +#ifndef _SYS_DEFS_H_ +#define _SYS_DEFS_H_ + +/* blackfin/_common_bf533から読む */ +#include + + /* システム略称  jsp/doc/config.txtの 2.(8)を参照 */ +#define BF533CB + + +/* + * タイムティックの定義 + */ +#define TIC_NUME 1u /* タイムティックの周期の分子 */ +#define TIC_DENO 1u /* タイムティックの周期の分母 */ + +/* + * 破壊性読み出しレジスタの判別式 + * 与えられたアドレス iop が破壊性読み出しレジスタの + * 場合には真を返す。 + * + * ADSP-BF533の内蔵ペリフェラルについて考慮する必要はない + * 宣言しない場合は、デフォルトで外部ペリフェラルはすべて + * 破壊性読み出しとして扱われる + */ +// #define DESTRUCTIVE_READ( iop ) (iop<(VP)0xF0000000) + +#endif /* _SYS_DEFS_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/cpu_config.c b/uzume_prototype/kernel/config/blackfin/cpu_config.c new file mode 100644 index 0000000..210e7dc --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/cpu_config.c @@ -0,0 +1,109 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + + +/* + * プロセッサ依存モジュール(BLACKfin用) + */ + +#include "jsp_kernel.h" +#include "check.h" +#include "task.h" + +/* +* イベントハンドラの入り口で保存するFPの格納変数 +*/ +VP event_fp; + +/* + * GDBでデバッグ時にブートを行うかどうか制御する変数 + * 通常は偽なので、ロード後、gdbで1に修正して使う + */ +#ifdef __GNUC__ +unsigned int enable_boot_for_gdb __attribute__((section(".data"), used)) = 0; +#elif defined(__ECC__) +#else +#error "Compiler is not supported" +#endif + +static void dummy_exception_handler(VP exc_info); +void (* exc_vector)(VP) = &dummy_exception_handler; +void (* dev_vector[DEVICE_INTERRUPT_COUNT+3])(void) ; + + +static void dummy_interrupt_handler(void) +{ + while(1) + ; +} + +static void dummy_exception_handler(VP exc_info) +{ + while(1) + ; +} + + +/* + * プロセッサ依存の初期化 + */ +void +cpu_initialize() +{ + int i; + + for ( i=0; i +#elif defined(__ECC__) +/* +* サービスコール選択は、IPAが行うので、VisualDSP++環境ではすべて選択しておく +*/ +#include +#else +#error "Compiler is not supported" +#endif + +/* +* イベントプライオリティ宣言. sys_config.h の device_dispatcher()で使う。 +*/ +#ifndef ik_timer +#define ik_timer 6 +#endif + +#ifndef ik_hardware +#define ik_hardware_err 5 +#endif + +/* + * カーネルの内部識別名のリネーム + */ +#include + +/* +* BLACKfinのビットマップ検索機能を使う +* BLACKfinはMSBから数える。 +*/ +#define CPU_BITMAP_SEARCH +#define PRIMAP_BIT(pri) (0x40000000u >> (pri)) + + +/* + * TCB 中のフィールドのビット幅の定義 + * + * cpu_context.h に入れる方がエレガントだが,参照の依存性の関係で, + * cpu_context.h には入れられない. + */ +#define TBIT_TCB_TSTAT 8 /* tstat フィールドのビット幅 */ +#define TBIT_TCB_PRIORITY 8 /* priority フィールドのビット幅 */ + + +/* +* BLACKfinのIMASKへの設定パターン +* +*/ +#define IMASK_LOCK 0xc01f +#define IMASK_UNLOCK 0xffff + +#ifndef _MACRO_ONLY +/* + * プロセッサの特殊命令のインライン関数定義 + */ +/* + * レディキューサーチのためのビットマップサーチ関数 + * + * ビットマップの下位16ビットを使用し,最下位ビットを最低優先度に対応 + * させる. + */ + + +Inline UINT +bitmap_search(UINT bitmap) +{ + UINT numOfSign; + + /* + * このコードは,bitmap(UINT型)が32ビットであることを仮定し + * ている.Signbits 命令は32ビット整数を取ってMSBから連続する + * 符号ビット - 1 を返す。all 0のときは31を返す。LSBのみが1の + * ときは30を返す。 + */ +#ifdef __GNUC__ // gcc + // gcc 3.4.1 の時点では、オペランドに下位ハーフレジスタを指定 + // できないため、余計なコードが必要になる。 + Asm( "r0.L=signbits %1; %0 = r0.L;": "=d"(numOfSign) : "d"(bitmap) : "R0" ); +#elif defined(__ECC__) // visualdsp + Asm( "%0=signbits %1;": "=l"(numOfSign) : "d"(bitmap) ); +#else +#error "Compiler is not supported" +#endif + return( numOfSign ); +} + + + +/* + * タスクコンテキストブロックの定義 + */ +typedef struct task_context_block { + VP sp; /* スタックポインタ */ + FP pc; /* プログラムカウンタ */ +} CTXB; + + +/* + * システム状態参照 + * 返す値は以下のとおり + * TRUE : 非タスクコンテキスト + * FALSE: タスクコンテキスト + * IPENDが$8000か$8010の時、タスクコンテキストである。それ以外のときは非タスクコンテキスト。 + */ + +Inline BOOL +sense_context() +{ + return( *__pIPEND & 0x7FEF ); +} + +/* +* 現在のロック状態を調べる。管理外割り込みまでロックするsil_loc_int()に +* よるロック状態は、このsense_lock()では無視する。 +*/ +Inline BOOL +sense_lock() +{ +#ifdef UNMANAGED_INT + return((*__pIMASK & ~UNMANAGED_INT )== 0xC01F ); +#else + return(*__pIMASK == 0xC01F ); +#endif +} + +#define t_sense_lock sense_lock +#define i_sense_lock sense_lock + + +/* + * CPUロックとその解除(タスクコンテキスト用) + * + * task_intmask は,chg_ipm をサポートするための変数.chg_ipm をサポー + * トしない場合には,task_intmask が常に 0 になっていると考えればよい. + * + */ + +#ifdef SUPPORT_CHG_IPM +extern UH task_intmask; /* タスクコンテキストでの割込みマスク */ +#endif /* SUPPORT_CHG_IPM */ + +#ifdef UNMANAGED_INT +#if UNMANAGED_INT & 0xC01F +// 管理外割り込みの範囲チェック。管理外割り込みはIVHWからIVG13の間でなければならない +#error "Illegal un-managed interrupt : must be IVHW-IVG13" +#endif +#endif + + +// BLACKfinではIMASKに0xC01Fを書き込んでCPUをロックする。 +Inline void +t_lock_cpu() +{ +#ifdef UNMANAGED_INT + unsigned int imask; + Asm( "cli %0;" :"=d"(imask) ); + Asm( "sti %0;" : :"d"(0xC01f | (imask & UNMANAGED_INT) ) ); +#else + Asm( "cli r0;" : : :"R0" ); + Asm( "sti %0;" : :"d"(0xC01F) ); +#endif +} + +Inline void +t_unlock_cpu() +{ +#ifdef UNMANAGED_INT + unsigned int imask; + Asm( "cli %0;" :"=d"(imask) ); + Asm( "sti %0;" : :"d"( (0xffff & ~UNMANAGED_INT) | (imask & UNMANAGED_INT) ) ); +#else + Asm( "sti %0;" : :"d"(0xffff) ); +#endif +} + +/* + * CPUロックとその解除(非タスクコンテキスト用) + */ + + +Inline void +i_lock_cpu() +{ +#ifdef UNMANAGED_INT + unsigned int imask; + Asm( "cli %0;" :"=d"(imask) ); + Asm( "sti %0;" : :"d"(0xC01f | (imask & UNMANAGED_INT) ) ); +#else + Asm( "cli r0;" : : :"R0" ); + Asm( "sti %0;" : :"d"(0xC01F) ); +#endif +} + +Inline void +i_unlock_cpu() +{ +#ifdef UNMANAGED_INT + unsigned int imask; + Asm( "cli %0;" :"=d"(imask) ); + Asm( "sti %0;" : :"d"( (0xffff & ~UNMANAGED_INT) | (imask & UNMANAGED_INT) ) ); +#else + Asm( "sti %0;" : :"d"(0xffff) ); +#endif +} + +/* + * タスクディスパッチャ + */ + +/* + * 最高優先順位タスクへのディスパッチ(cpu_support.S) + * + * dispatch は,タスクコンテキストから呼び出されたサービスコール処理 + * 内で,CPUロック状態で呼び出さなければならない. + */ +extern void dispatch(void); + +/* + * 現在のコンテキストを捨ててディスパッチ(cpu_support.S) + * + * exit_and_dispatch は,CPUロック状態で呼び出さなければならない. + */ +extern void exit_and_dispatch(void); + + +/* + * ブート時にシステムリセットをするなら真。デフォルトでは偽。 + */ +extern unsigned int enable_boot_for_gdb; +/* + * 割込みハンドラ/CPU例外ハンドラの設定 + */ + + +/* + * 割込みハンドラの設定 + * + * ベクトル番号 inhno の割込みハンドラの起動番地を inthdr に設定する. + * evtvector はstart.asmで定義されている。 + */ +extern void (* dev_vector[])(void) ; + +extern void (* exc_vector)(VP) ; +Inline void +define_inh(INHNO inhno, FP inthdr) +{ + dev_vector[inhno] = inthdr; +} + +/* + * CPU例外ハンドラの設定 + * + * ベクトル番号 excno のCPU例外ハンドラの起動番地を exchdr に設定する. + */ +Inline void +define_exc(EXCNO excno, FP exchdr) +{ +// exc_vector[excno] = exchdr; // 例外ハンドラを配列に格納 + exc_vector = (void (*)(VP))exchdr; // 例外ハンドラを格納 +} + +/* + * 割込みハンドラ/CPU例外ハンドラの出入口処理 + */ + +/* + * 割込みハンドラの出入口処理の生成マクロ + * + * reqflg をチェックする前に割込みを禁止しないと,reqflg をチェック後 + * に起動された割込みハンドラ内でディスパッチが要求された場合に,ディ + * スパッチされない. + */ + +#define INTHDR_ENTRY(inthdr) extern void inthdr(void); +#define INT_ENTRY(inthdr) inthdr + +/* + * CPU例外ハンドラの出入口処理の生成マクロ + * + * reqflg をチェックする前に割込みを禁止しないと,reqflg をチェック後 + * に起動された割込みハンドラ内でディスパッチが要求された場合に,ディ + * スパッチされない. + */ + +#define EXCHDR_ENTRY(exchdr) extern void exchdr( VP ); +#define EXC_ENTRY(exchdr) exchdr + +/* + * CPU例外の発生した時のシステム状態の参照 + */ + +/* + * CPU例外の発生した時のコンテキストの参照 + */ +Inline BOOL +exc_sense_context(VP p_excinf) +{ + return( *__pIPEND & 0x7FE6 ); // IVG15, GIE, EXP, EMU 以外のビットが立っていれば非タスクコンテキスト +} + +/* + * CPU例外の発生した時のCPUロック状態の参照。管理外割り込みの状態は無視する。 + */ +Inline BOOL +exc_sense_lock(VP p_excinf) +{ +#ifdef UNMANAGED_INT + return((*__pIMASK | UNMANAGED_INT) != 0xFFFF ); // 0xFFFFならアンロック +#else + return(*__pIMASK != 0xFFFF ); // 0xFFFFならアンロック +#endif +} + +/* + * プロセッサ依存の初期化 + */ +extern void cpu_initialize(void); + +/* + * プロセッサ依存の終了時処理 + */ +extern void cpu_terminate(void); + +#endif /* _MACRO_ONLY */ +#endif /* _CPU_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/cpu_context.h b/uzume_prototype/kernel/config/blackfin/cpu_context.h new file mode 100644 index 0000000..4d36ef4 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/cpu_context.h @@ -0,0 +1,96 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + */ +/* + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + */ + +/* + * タスクコンテキスト操作ルーチン(BLACKfin用) + * + * このファイルを cpu_config.h と分離しているのは,このファイルは TCB + * が定義された後に読む必要があるのに対して,cpu_config.h には TCB を + * 定義する前に読む必要がある定義を含んでいるためである. + */ + +#ifndef _CPU_CONTEXT_H_ +#define _CPU_CONTEXT_H_ + +#include "task.h" + +/* + * タスクコンテキストの初期化 + * + * タスクが休止状態に移行する時(タスクの生成時,タスクの終了時)に呼 + * ばれる.基本的には,タスクコンテキストをタスクが起動できる状態に設 + * 定する処理を,create_context と activate_context で行えばよい. + */ +Inline void +create_context(TCB *tcb) +{ +} + +/* + * タスクの起動準備 + * + * タスクが休止状態から実行できる状態に移行する時に呼ばれる. + */ +extern void activate_r(void); + +Inline void +activate_context(TCB *tcb) +{ + VW *sp; + + sp = (VW *)((SIZE)(tcb->tinib->stk) + tcb->tinib->stksz); + *--sp = (VW)(tcb->tinib->exinf); // ext_infをプッシュ + *--sp = (VW) ext_tsk; // ext_tsk()のアドレスをプッシュ + *--sp = (VW)(tcb->tinib->task); // タスクのアドレスをプッシュ + tcb->tskctxb.sp = sp; + tcb->tskctxb.pc = activate_r; +} + +/* + * ext_tsk がスタック上に確保するダミー領域のサイズ + */ +#define ACTIVATED_STACK_SIZE (sizeof(VW) * 3) + +/* + * calltex は使用しない + */ +#define OMIT_CALLTEX + +#endif /* _CPU_CONTEXT_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/cpu_crtbegin.c b/uzume_prototype/kernel/config/blackfin/cpu_crtbegin.c new file mode 100644 index 0000000..28702e2 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/cpu_crtbegin.c @@ -0,0 +1,44 @@ + +typedef void (*fptr)(void); + +/* + * ctor_list_beginとdtor_list_beginはマジックナンバー(-1)から始まる。gccはそれぞれの1番の + * エントリから順に大域オブジェクトの初期化のためのコンストラクタのポインタを埋めていき、 + * 最後にNULLを置く。 + */ +static fptr ctor_list_begin[1] __attribute__((section(".ctors"), used)) = { (fptr) -1 }; +static fptr dtor_list_begin[1] __attribute__((section(".dtors"), used)) = { (fptr) -1 }; + + +/* + * _initと_finiは特殊なセクション .initと.finiに格納される。これはgccの推奨である。 + * 詳しくはgccのマニュアル参照 + */ +extern void _init(void) __attribute__((section(".init"))); +extern void _fini(void) __attribute__((section(".fini"))); + +void +_init(void) +{ + fptr *fpp; + + // 最後のコンストラクタを探す + for(fpp = ctor_list_begin + 1; *fpp != 0; ++fpp) + ; + // 後ろから前へ実行する + while(--fpp > ctor_list_begin) + (**fpp)(); +} + + +void +_fini(void) +{ + fptr *fpp; + + // デストラクタを初期化と逆順に実行する + for(fpp = dtor_list_begin + 1; *fpp != 0; ++fpp) + (**fpp)(); + +} + diff --git a/uzume_prototype/kernel/config/blackfin/cpu_crtend.c b/uzume_prototype/kernel/config/blackfin/cpu_crtend.c new file mode 100644 index 0000000..a1a07d2 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/cpu_crtend.c @@ -0,0 +1,11 @@ + +typedef void (*fptr)(void); + +/* + * ctor_list_endとdtor_list_endはctor_listとdtor_listの番兵役である。必ず0で終わる。 + */ +static fptr ctor_list_end[1] __attribute__((section(".ctors"), used)) = { (fptr) 0 }; +static fptr dtor_list_end[1] __attribute__((section(".dtors"), used)) = { (fptr) 0 }; + + + diff --git a/uzume_prototype/kernel/config/blackfin/cpu_defs.c b/uzume_prototype/kernel/config/blackfin/cpu_defs.c new file mode 100644 index 0000000..1b6dbe1 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/cpu_defs.c @@ -0,0 +1,118 @@ +/* + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ +// DESTRUCTIVE_READはsys_defs.hで定義する。 + +// 破壊性読み出しレジスタにアクセスする場合は +// 割り込みロックをかける + +#include + +#define __SIL_LOCK_INTERRUPT( x ) \ + if (DESTRUCTIVE_READ(iop)){\ + SIL_PRE_LOC;\ + SIL_LOC_INT();\ + x;\ + SIL_UNL_INT();\ + }\ + else\ + x; + + VB sil_reb_iop(VP iop) +{ + VH temp; +// PROLOGUE + + __SIL_LOCK_INTERRUPT( temp = sil_reh_mem((VP)iop) ); + +// EPILOGUE; + return temp; +} + + VH sil_reh_iop(VP iop) +{ + VH temp; + + __SIL_LOCK_INTERRUPT( temp = sil_reh_mem((VP)iop) ); + + return temp; +} + + VW sil_rew_iop(VP iop) +{ + VW temp; + + __SIL_LOCK_INTERRUPT( temp = sil_rew_mem((VP)iop) ); + + return temp; +} + + + VH sil_reh_lep(VP iop) +{ + VH temp; + + __SIL_LOCK_INTERRUPT( temp = sil_reh_lem((VP)iop) ); + + return temp; +} + + + VW sil_rew_lep(VP iop) +{ + VW temp; + + __SIL_LOCK_INTERRUPT( temp = sil_rew_lem((VP)iop) ); + + return temp; +} + + VH sil_reh_bep(VP iop) +{ + VH temp; + + __SIL_LOCK_INTERRUPT( temp = sil_reh_bem((VP)iop) ); + + return temp; +} + + VW sil_rew_bep(VP iop) +{ + VW temp; + + __SIL_LOCK_INTERRUPT( temp = sil_rew_bem((VP)iop) ); + + return temp; +} + diff --git a/uzume_prototype/kernel/config/blackfin/cpu_defs.h b/uzume_prototype/kernel/config/blackfin/cpu_defs.h new file mode 100644 index 0000000..13c1034 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/cpu_defs.h @@ -0,0 +1,166 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +/* + * プロセッサに依存するアプリケーション用資源の定義(BLACKfin用) + * + * このインクルードファイルは,kernel.h と sil.h でインクルードされる. + * 他のファイルから直接インクルードすることはない.このファイルをイン + * クルードする前に,t_stddef.h と itron.h がインクルードされるので, + * それらに依存してもよい. + */ + +#ifndef _CPU_DEFS_H_ +#define _CPU_DEFS_H_ + +#define BLACKFIN /* プロセッサ略称 */ + +#define COPYRIGHT_CPU \ +"Copyright (C) 2004-2012 by TOPPERS/JSP for Blackfin project\n"\ +" http://sourceforge.jp/projects/toppersjsp4bf/\n" + + +/* + * Core MMR + */ + +#define __IMASK 0xFFE02104 +#define __IPEND 0xFFE02108 +#define __EVT0 0xFFE02000 + +#define __TCNTL 0xFFE03000 +#define __TPERIOD 0xFFE03004 + + +#define __pIMASK ((volatile unsigned long *)__IMASK) +#define __pIPEND ((volatile unsigned long *)__IPEND) +#define __pEVT0 ((volatile void * volatile) __EVT0) + +#define __pTCNTL ((volatile unsigned long *)__TCNTL) +#define __pTPERIOD ((volatile unsigned long *)__TPERIOD) +/* + * システム・インターフェース・レイヤー + */ + +/* + * プロセッサのエンディアン + */ +#define SIL_ENDIAN SIL_ENDIAN_LITTLE /* リトルエンディアン */ + + +/* +* 割り込みロック制御 +*/ + +#define SIL_PRE_LOC UINT _intmask_ +#define SIL_LOC_INT() asm volatile ( "cli %0;": "=d"(_intmask_) ) +#define SIL_UNL_INT() asm volatile ( "sti %0;": :"d"(_intmask_) ) + + + + + +#ifndef _MACRO_ONLY + +/* + * 割込み/CPU例外ハンドラ番号の型 + */ +typedef UINT INHNO; /* 割込みハンドラ番号 */ +typedef UINT EXCNO; /* CPU例外ハンドラ番号 */ + + + +/* + * 微少時間待ち + * システム依存部で SIL_DLY_TIM1とSIL_DLY_TIM2を定義しておく。 + * SIL_DLY_TIM1はsil_dly_nseの呼び出しオーバーヘッド(nS) + * SIL_DLY_TIM2はsil_dly_nseのループの長さ(nS) + */ +void sil_dly_nse(UINT dlytim); + + + +/* + * 性能評価用システム時刻の参照 + * cycleカウンタから64ビットの値を取り出す。 + */ +typedef long long SYSUTIM; /* 性能評価用システム時刻 */ + +Inline ER vxget_tim(SYSUTIM *p_sysutim) +{ + unsigned int lo, hi; + + Asm( "%0=CYCLES; %1=CYCLES2;" :"=d"(lo), "=d"(hi) ); + ((unsigned int *)p_sysutim)[0] = lo; + ((unsigned int *)p_sysutim)[1] = hi; + return(0); +} + +/* +* システム・メモリ・アクセス +*/ + +#define sil_wrb_iop(iop, data) sil_wrh_mem( iop, (UB)data ) +#define sil_wrh_iop sil_wrh_mem +#define sil_wrw_iop sil_wrw_mem +#define sil_wrh_lep sil_wrh_lem +#define sil_wrw_lep sil_wrw_lem +#define sil_wrh_bep sil_wrh_bem +#define sil_wrw_bep sil_wrw_bem + +VB sil_reb_iop(VP iop); +VH sil_reh_iop(VP iop); +VW sil_rew_iop(VP iop); +VH sil_reh_lep(VP iop); +VW sil_rew_lep(VP iop); +VH sil_reh_bep(VP iop); +VW sil_rew_bep(VP iop); + + +#endif /* _MACRO_ONLY */ + + + + +#endif /* _CPU_DEFS_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/cpu_malloc.c b/uzume_prototype/kernel/config/blackfin/cpu_malloc.c new file mode 100644 index 0000000..6dff7e2 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/cpu_malloc.c @@ -0,0 +1,40 @@ +#include + +static void * heapPtr = 0; +extern void *_heap_start, *_heap_end; + +/* + * 要求があればヒープ上にメモリ領域を割り当てる。freeは使わないことを仮定している。 + */ + +void * malloc(size_t size) +{ + void * retPtr; + SIL_PRE_LOC; + + SIL_LOC_INT(); + // 最初の呼び出しでヒープを初期化する + if (! heapPtr) + heapPtr = _heap_start; + + retPtr = heapPtr; + + if ((heapPtr+size) >= _heap_end) + retPtr = NULL; + else + { + heapPtr += size; + // ポインタを32bit境界に揃える + while ((unsigned int)heapPtr % 4) + heapPtr++; + } + SIL_UNL_INT(); + return retPtr; +} + +/* + * なにもせずに戻る + */ +void free( void * ptr ) +{ +} diff --git a/uzume_prototype/kernel/config/blackfin/cpu_mmr.c b/uzume_prototype/kernel/config/blackfin/cpu_mmr.c new file mode 100644 index 0000000..fcaf802 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/cpu_mmr.c @@ -0,0 +1,177 @@ +/* + * Blackfin Core MMR定義ファイル。 + * + * このファイルはGDBでのデバッグの支援用に開発したものである。GCC環境での開発に用いても構わないが、 + * VisualDSP++への移行は少々複雑になる。また、開発に使うための検証は行っていない。 + * + * アドレスの正しさの検証は、以下の比較によって行っている。 + * +$ readelf -s -W jsp | grep mmr | grep -v DUMMY | grep -v blackfin | sort -k 2 | awk '/_mmr/{print $8, $2}' - | sed 's/_mmr//p' | uniq > regelf.txt +$ cat ../jsp/config/blackfin/def_lpblackfin.h ../jsp/config/blackfin/defbf532.h | grep '0xFF[CE]0' | grep "#define" | sed 's/_MA /_MAP /' - | awk '{print $2,$3}' - | sort -k 2 | sed 's/0x//' - > regdef.txt +$ diff -i -w regelf.txt regdef.txt 24a25,27 +> RTC_PREN FFC00314 +> UART_DLL FFC00400 +> UART_RBR FFC00400 +25a29 +> UART_DLH FFC00404 +123a128 +> DMA_TCPER FFC00B0C +124a130 +> DMA_TCCNT FFC00B10 +288a295 +> DCPLB_FAULT_STATUS FFE00008 +326a334 +> CODE_FAULT_STATUS FFE01008 +327a336 +> CODE_FAULT_ADDR FFE0100C + * + * 得られた結果では、def_lpblackfin.hにある3つのレジスタがcore_mmr.cでは無視されていることを指摘している。 + * これらのレジスタはエイリアスであり、同じアドレスに別レジスタがあるので、この結果で正しい。 + * + */ +volatile void * volatile mmrSRAM_BASE_ADDRESS __attribute__ ((aligned(4), section("DMEMCTL"))); +volatile unsigned long mmrDMEM_CONTROL __attribute__ ((aligned(4), section("DMEMCTL"))); +volatile unsigned long mmrDCPLB_STATUS __attribute__ ((aligned(4), section("DMEMCTL"))); +volatile void * volatile mmrDCPLB_FAULT_ADDR __attribute__ ((aligned(4), section("DMEMCTL"))); +volatile void * volatile mmrDCPLB_ADDR0 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR1 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR2 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR3 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR4 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR5 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR6 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR7 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR8 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR9 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR10 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR11 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR12 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR13 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR14 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile void * volatile mmrDCPLB_ADDR15 __attribute__ ((aligned(4), section("DCPLBA"))); +volatile unsigned long mmrDCPLB_DATA0 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA1 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA2 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA3 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA4 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA5 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA6 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA7 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA8 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA9 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA10 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA11 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA12 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA13 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA14 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDCPLB_DATA15 __attribute__ ((aligned(4), section("DCPLBD"))); +volatile unsigned long mmrDTEST_COMMAND __attribute__ ((aligned(4), section("DTESTC"))); +volatile unsigned long mmrDTEST_DATA0 __attribute__ ((aligned(4), section("DTESTD"))); +volatile unsigned long mmrDTEST_DATA1 __attribute__ ((aligned(4), section("DTESTD"))); + + +volatile unsigned long mmrIMEM_DUMMY __attribute__ ((aligned(4), section("IMEMCTL"))); +volatile unsigned long mmrIMEM_CONTROL __attribute__ ((aligned(4), section("IMEMCTL"))); +volatile unsigned long mmrICPLB_STATUS __attribute__ ((aligned(4), section("IMEMCTL"))); +volatile void * volatile mmrICPLB_FAULT_ADDR __attribute__ ((aligned(4), section("IMEMCTL"))); +volatile void * volatile mmrICPLB_ADDR0 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR1 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR2 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR3 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR4 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR5 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR6 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR7 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR8 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR9 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR10 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR11 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR12 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR13 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR14 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile void * volatile mmrICPLB_ADDR15 __attribute__ ((aligned(4), section("ICPLBA"))); +volatile unsigned long mmrICPLB_DATA0 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA1 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA2 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA3 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA4 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA5 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA6 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA7 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA8 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA9 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA10 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA11 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA12 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA13 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA14 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrICPLB_DATA15 __attribute__ ((aligned(4), section("ICPLBD"))); +volatile unsigned long mmrITEST_COMMAND __attribute__ ((aligned(4), section("ITESTC"))); +volatile unsigned long mmrITEST_DATA0 __attribute__ ((aligned(4), section("ITESTD"))); +volatile unsigned long mmrITEST_DATA1 __attribute__ ((aligned(4), section("ITESTD"))); + + +volatile void * volatile mmrEVT0 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT1 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT2 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT3 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT4 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT5 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT6 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT7 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT8 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT9 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT10 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT11 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT12 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT13 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT14 __attribute__ ((aligned(4), section("EVT"))); +volatile void * volatile mmrEVT15 __attribute__ ((aligned(4), section("EVT"))); +volatile unsigned long mmrIDUMMY __attribute__ ((aligned(4), section("CEC"))); +volatile unsigned long mmrIMASK __attribute__ ((aligned(4), section("CEC"))); +volatile unsigned long mmrIPEND __attribute__ ((aligned(4), section("CEC"))); +volatile unsigned long mmrILAT __attribute__ ((aligned(4), section("CEC"))); +volatile unsigned long mmrIPRIO __attribute__ ((aligned(4), section("CEC"))); + + +volatile unsigned long mmrTCNTL __attribute__ ((aligned(4), section("CTMR"))); +volatile unsigned long mmrTPERIOD __attribute__ ((aligned(4), section("CTMR"))); +volatile unsigned long mmrTSCALE __attribute__ ((aligned(4), section("CTMR"))); +volatile unsigned long mmrTCOUNT __attribute__ ((aligned(4), section("CTMR"))); + + +volatile unsigned long mmrDSPID __attribute__ ((aligned(4), section("DBG"))); +volatile unsigned short mmrDBGDUMMY __attribute__ ((aligned(4), section("DBG"))); +volatile unsigned long mmrDBGSTAT __attribute__ ((aligned(4), section("DBG"))); + + +volatile unsigned long mmrTBUFCTL __attribute__ ((aligned(4), section("TBCTL"))); +volatile unsigned long mmrTBUFSTAT __attribute__ ((aligned(4), section("TBCTL"))); +volatile void * volatile mmrTBUF __attribute__ ((aligned(4), section("TBUF"))); + + +volatile unsigned long mmrWPIACTL __attribute__ ((aligned(4), section("WPICTL"))); +volatile void * volatile mmrWPIA0 __attribute__ ((aligned(4), section("WPIADDR"))); +volatile void * volatile mmrWPIA1 __attribute__ ((aligned(4), section("WPIADDR"))); +volatile void * volatile mmrWPIA2 __attribute__ ((aligned(4), section("WPIADDR"))); +volatile void * volatile mmrWPIA3 __attribute__ ((aligned(4), section("WPIADDR"))); +volatile void * volatile mmrWPIA4 __attribute__ ((aligned(4), section("WPIADDR"))); +volatile void * volatile mmrWPIA5 __attribute__ ((aligned(4), section("WPIADDR"))); +volatile unsigned long mmrWPIACNT0 __attribute__ ((aligned(4), section("WPICNT"))); +volatile unsigned long mmrWPIACNT1 __attribute__ ((aligned(4), section("WPICNT"))); +volatile unsigned long mmrWPIACNT2 __attribute__ ((aligned(4), section("WPICNT"))); +volatile unsigned long mmrWPIACNT3 __attribute__ ((aligned(4), section("WPICNT"))); +volatile unsigned long mmrWPIACNT4 __attribute__ ((aligned(4), section("WPICNT"))); +volatile unsigned long mmrWPIACNT5 __attribute__ ((aligned(4), section("WPICNT"))); +volatile unsigned long mmrWPDACTL __attribute__ ((aligned(4), section("WPDCTL"))); +volatile void * volatile mmrWPDA0 __attribute__ ((aligned(4), section("WPDADDR"))); +volatile void * volatile mmrWPDA1 __attribute__ ((aligned(4), section("WPDADDR"))); +volatile unsigned long mmrWPDACNT0 __attribute__ ((aligned(4), section("WPDCNT"))); +volatile unsigned long mmrWPDACNT1 __attribute__ ((aligned(4), section("WPDCNT"))); +volatile unsigned long mmrWPSTAT __attribute__ ((aligned(4), section("WPSTAT"))); + + +volatile unsigned long mmrPFCTL __attribute__ ((aligned(4), section("PFCTL"))); +volatile unsigned long mmrPFCNTR0 __attribute__ ((aligned(4), section("PFCNT"))); +volatile unsigned long mmrPFCNTR1 __attribute__ ((aligned(4), section("PFCNT"))); + diff --git a/uzume_prototype/kernel/config/blackfin/cpu_rename.def b/uzume_prototype/kernel/config/blackfin/cpu_rename.def new file mode 100644 index 0000000..813d901 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/cpu_rename.def @@ -0,0 +1,20 @@ +activate_r +dispatch +dev_vector +exc_vector +device_dispatcher +interrupt_dispatcher +task_context +expEntry +nmiEntry +ivTMREntry +ivHWEntry +ivg7Entry +ivg8Entry +ivg9Entry +ivg10Entry +ivg11Entry +ivg12Entry +ivg13Entry +ivg14Entry +enable_boot_for_gdb \ No newline at end of file diff --git a/uzume_prototype/kernel/config/blackfin/cpu_rename.h b/uzume_prototype/kernel/config/blackfin/cpu_rename.h new file mode 100644 index 0000000..5802e26 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/cpu_rename.h @@ -0,0 +1,51 @@ +/* This file is generated from cpu_rename.def by genrename. */ + +#ifndef _CPU_RENAME_H_ +#define _CPU_RENAME_H_ + +#define activate_r _kernel_activate_r +#define dispatch _kernel_dispatch +#define dev_vector _kernel_dev_vector +#define exc_vector _kernel_exc_vector +#define device_dispatcher _kernel_device_dispatcher +#define interrupt_dispatcher _kernel_interrupt_dispatcher +#define task_context _kernel_task_context +#define expEntry _kernel_expEntry +#define nmiEntry _kernel_nmiEntry +#define ivTMREntry _kernel_ivTMREntry +#define ivHWEntry _kernel_ivHWEntry +#define ivg7Entry _kernel_ivg7Entry +#define ivg8Entry _kernel_ivg8Entry +#define ivg9Entry _kernel_ivg9Entry +#define ivg10Entry _kernel_ivg10Entry +#define ivg11Entry _kernel_ivg11Entry +#define ivg12Entry _kernel_ivg12Entry +#define ivg13Entry _kernel_ivg13Entry +#define ivg14Entry _kernel_ivg14Entry +#define enable_boot_for_gdb _kernel_enable_boot_for_gdb + +#ifdef LABEL_ASM + +#define _activate_r __kernel_activate_r +#define _dispatch __kernel_dispatch +#define _dev_vector __kernel_dev_vector +#define _exc_vector __kernel_exc_vector +#define _device_dispatcher __kernel_device_dispatcher +#define _interrupt_dispatcher __kernel_interrupt_dispatcher +#define _task_context __kernel_task_context +#define _expEntry __kernel_expEntry +#define _nmiEntry __kernel_nmiEntry +#define _ivTMREntry __kernel_ivTMREntry +#define _ivHWEntry __kernel_ivHWEntry +#define _ivg7Entry __kernel_ivg7Entry +#define _ivg8Entry __kernel_ivg8Entry +#define _ivg9Entry __kernel_ivg9Entry +#define _ivg10Entry __kernel_ivg10Entry +#define _ivg11Entry __kernel_ivg11Entry +#define _ivg12Entry __kernel_ivg12Entry +#define _ivg13Entry __kernel_ivg13Entry +#define _ivg14Entry __kernel_ivg14Entry +#define _enable_boot_for_gdb __kernel_enable_boot_for_gdb + +#endif /* LABEL_ASM */ +#endif /* _CPU_RENAME_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/cpu_support.S b/uzume_prototype/kernel/config/blackfin/cpu_support.S new file mode 100644 index 0000000..d95e287 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/cpu_support.S @@ -0,0 +1,701 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +/* + * プロセッサ依存モジュール アセンブリ言語部(BLACKfin用) + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + */ + + // 32bit レジスタに即値をロードするマクロ +#ifdef __GNUC__ +#define LOADLABEL( reg, value32 ) reg##.h = value32; reg##.l = value32; +#define LOADVALUE( reg, value32 ) reg##.h = ( value32 >> 16 ) &0xFFFF; reg##.l = value32 & 0xFFFF; +#elif defined(__ECC__) +#define LOADVALUE( reg, value32 ) reg##.h = hi(value32); reg##.l = lo(value32); +#define LOADLABEL LOADVALUE +#else +#error "Compiler is not supported" +#endif + + + +#define _MACRO_ONLY +#include "jsp_kernel.h" +#include "offset.h" + +/* + * タスクディスパッチャ + * + * dispatch は,割込み禁止状態で呼び出さなければならな + * い.exit_and_dispatch も,割込み禁止状態で呼び出す。 + * p0 : &runtsk + * p1 : &schedtsk + * p2 : runtsk + * p3 : schedtsk + * p4 : &reqflg + */ +#ifdef __GNUC__ +.section .text; +#elif defined(__ECC__) +.section program; +#else +#error "Compiler is not supported" +#endif + +.global _dispatch; +.global _exit_and_dispatch; +.extern ldf_stack_end; +.extern _reqflg; +.extern _call_texrtn; +.extern _runtsk, _schedtsk; +#ifdef __GNUC__ +.type _dispatch, STT_FUNC; +#elif defined(__ECC__) +#else +#error "Compiler is not supported" +#endif +_dispatch: + [--sp] = (r7:4, p5:3); + [--sp] = rets; + [--sp] = fp; + LOADLABEL( p0, _runtsk ) + LOADLABEL( p1, _schedtsk) + p2 = [p0]; // p2 を runtsk に + [p2+TCB_sp] = sp; // タスクスタックを保存 + LOADLABEL( r1, dispatch_r ) // 実行再開番地を保存 + [p2+TCB_pc] = r1; + // スケジュールされたタスクを取り出す +dispatcher: + r0 = [p1]; + [p0] = r0; // runtsk = schedtsk + cc = r0; + if !cc jump dispatcher_1; // runtskが無ければ割り込み待ちに。 + p3 = r0; // p3はschedtsk + sp = [p3+TCB_sp]; // タスクスタック復帰 + p5 = [p3+TCB_pc]; // 実行再開番地復帰 + jump (p5); // 実行再開番地へ飛ぶ + + // ready タスクがない場合の割込み待ち +dispatcher_1: + LOADLABEL( r0, ldf_stack_end) // イベントスタックポインタを設定 + sp = r0; + LOADLABEL( p4, _reqflg ) +wait_for_intr: + csync; + raise 14; // 割り込み待ち状態に移行 + csync; + /* + * 割り込み待ちはIVG14の割り込み状態で行う。ここでIVG14に遷移するのは + * どのスタックを使うかという問題の解決と,割込みハンドラ内で + * のタスクディスパッチの防止という2つの意味がある. + * + * 割込みを待つ間は,runtsk を NULL(=0)に設定しなければなら + * ない.このように設定しないと,割込みハンドラから iget_tid + * を呼び出した際の動作が仕様に合致しなくなる. + * + * 割り込み待ち状態はidleになるため、実際には割り込みではなくwakeup + * イベントが捕捉され、それに伴う割り込みを処理することになる。 + * したがって割り込み待ちをおこなうためには、対応するSIC_IWRのビットを + * 1にしておかなければならない。 + * これはアプリケーションプログラマの責任で行う。 + */ + r0 = [p4]; // reqflag取得 + cc = r0; + if !cc jump wait_for_intr; // reqflgが0なら割り込み待ち + r0 = 0; + [p4] = r0; // reqflgをクリア + jump dispatcher; + + + // タスクの再開番地。タスク例外の処理をおこない、 + // dispatch()から戻る + // このアドレスへは必ず dispatcherから飛んでくる。 + // したがって、p3は必ずschedtskの内容になっている。 +dispatch_r: + fp = [sp++]; + r2 = [p3+TCB_texptn]; // schedtsk->texptn + cc = r2 == 0; // texptrnが0ならcc => 1 +// r0 = [p3+TCB_enatex]; +// LOADVALUE( r1, TCB_enatex_mask ) + r0 = b[p3+TCB_enatex](z); + r1 = TCB_enatex_mask; + r0 = r0 & r1; // enatexが0なら、az => 1 + cc |= az; // cc = ( !enatex || ! texptn ) = !( enatex && texptn ) + if cc jump dispatch_r_1(bp); // if ( !enatex || !texptn ) 即リターン + sp += -12; // ダミー引数領域確保 + call _call_texrtn; + sp += 12; // ダミー引数領域開放 +dispatch_r_1: + rets = [sp++]; + (r7:4, p5:3) = [sp++]; + rts; +_dispatch.end: + +#ifdef __GNUC__ +.size _dispatch, .-_dispatch +#elif defined(__ECC__) +#else +#error "Compiler is not supported" +#endif + + +/* + * TOPPERS/JSP開始処理: + * start.asm は kernel_startをCPUロック状態、タスク優先順位で呼ぶ。 + * kernel_startはそのままexit_and_dispatchを呼ぶ。 + * _exit_and_dispatchは、それまでのスタック状態などを単に廃棄し、 + * スケジュールされたタスクを開始する。 +*/ +_exit_and_dispatch: + // dispatcher以降で使うポインタを設定 + LOADLABEL( p0, _runtsk ) + LOADLABEL( p1, _schedtsk) + jump dispatcher; +_exit_and_dispatch.end: + +/* + * タスク起動時処理 + * _activate_rへはかならずdispatcherから飛んでくる。そのため、CPUロックを + * はずさなければならない。 + */ + + .global _activate_r; +_activate_r: + fp = 0; + r1 = 0xffff(z); + cli r0; // 現在のマスクを取り出す。 + // 管理外割り込みを使わないときにも、割り込み禁止のためcliが必要 +#ifdef UNMANAGED_INT + r2 = UNMANAGED_INT(z); + r0 = r0 & r2; // 管理外割り込みのみ取り出す + r2 = ~r2; // 逆マスク + r1 = r1 & r2; // + r1 = r1 | r0; // 管理外割り込みを考慮したマスク +#endif + sti r1; // CPU アンロック + p0 = [sp++]; // タスクエントリーを取り出す + r0 = [sp++]; // ext_tskの番地を取り出す + rets = r0; // ext_tskをダミーの戻り番地にする + r0 = [sp++]; // ext_infを取り出す : r0 は引数1 + sp += -12; + jump (p0); // タスクの開始 +_activate_r.end: + + +/* +* 割込み処理のエントリ +* +* interrupt_handlerへはivgXXEntryからジャンプしてくる。p0レジスタには +* 割り込みレベル番号が格納されている。 +* 割り込みとのネスト関係を調べ、ネストしていないならイベントスタックをセットする。 +* p2 : reqflgのアドレス +* r6 : タスクスタック +* r7 : ASTATの退避情報 +* +*/ + +#include "saverestore.h" + +.global interrupt_dispatcher; +.global task_context; +.extern _device_dispatcher, _enadsp; +.extern _event_fp; + +#ifdef __GNUC__ +.type interrupt_dispatcher, STT_FUNC; +#elif defined(__ECC__) +#else +#error "Compiler is not supported" +#endif +interrupt_dispatcher: + // save all task context register + save_regs; // ユーザーレジスタの退避 + r0 = 0; + l0 = r0; + l1 = r0; + l2 = r0; + l3 = r0; + lc0 = r0; // 性能低下抑制のためにLCxをクリア + lc1 = r0; + LOADVALUE( p1, __IPEND ) // IPENDレジスタのアドレス + r0 = [p1]; // IPENDの値を取得 + r1 = 0x7fef; // + r0 = r0 & r1; // IVG15とGID以外を調べる + r0.L = ones r0; // 処理中のイベントの数を数える + r0 += -1; // イベントの数-1。ネストしていなければ0になる。 + cc = az; // ネストしてなければ真 + if !cc jump call_interrupt; // もしネストしていればハンドラを呼ぶ + // ネストしていない割り込みなら、スタックを切り替える + r6 = sp; // タスクスタックポインタを退避 + LOADLABEL( r0, ldf_stack_end) // イベントスタックポインタを設定 + sp = r0; + +call_interrupt: + cli r1; // IMASKの古い値を第二パラメータに + [--sp] = reti; // ここで割り込み可能になる + r7 = astat; // ccにはネスト情報が入っている。それを退避 + r0 = p0; // 割り込み順位を第一パラメータに + LOADLABEL( p0, _device_dispatcher) + sp += -12; // ダミー引数確保 (A) + call (p0); // C言語で書かれたデバイスディスパッチャを呼ぶ + sp += 12; // ダミー引数開放 (A) + astat = r7; // ccを復帰 + reti = [sp++]; // ここで再び割り込み禁止 + if !cc jump get_back; // もしネストしているならば、このまま帰る + + // ここでは割り込みはネストしていない + sp = r6; // スタックをタスクスタックに設定 + + LOADLABEL( p2, _reqflg) // reqflgのアドレス + r0 = [p2]; // reqflgの値を取得 + cc = r0; // ディスパッチかタスク例外の要求は出ているか + if !cc jump get_back(bp); // 出ていないならば割り込まれたタスクに戻る + + // コンテキスト切り替え作業開始 + r0 = 0; // + [p2] = r0; // reqflgをクリアする. + r0 = reti; // タスクの戻り番地を取り出す + r1 = 1; + r0 = r1 | r0; // セルフ・ネストであると偽装する + [--sp] = r0; // 戻り番地をスタックにつむ + LOADLABEL( p0, task_context) + + cli r0; // 現在のCPUロック状態を取得 + [--sp] = r0; // ロック状態を退避 + + r1 = 0xC01F(z); // タスクコンテキストははCPUロック状態で実行する +#ifdef UNMANAGED_INT + r2 = UNMANAGED_INT(z); + r0 = r0 & r2; // 管理外割り込みのマスク状態を抽出 + r1 = r0 | r1; // タスクコンテキストはCPUロック状態で実行する +#endif + sti r1; // CPUロック (B) + + reti = p0; // ラベル"task_context"を割り込みからの戻り番地にする + rti; // 割り込みから戻る。コンテキストはタスクになる + csync; +task_context: // ここはタスクコンテキストで、CPUロック状態である + LOADLABEL( p0, _enadsp) + LOADLABEL( p1, _runtsk) + + + r2 = [p0]; // load enadsp + cc = r2; // ディスパッチ可能か? + if !cc jump go_tex; // もしディスパッチ禁止なら例外チェックに + + LOADLABEL( p0, _schedtsk) // ディスパッチ可能の場合 + r1 = [p1]; // runtsk + r0 = [p0]; // schedtsk + cc = r0 == r1; // schedtsk == runtsk か? + if cc jump go_tex(bp); // もし schedtsk == runtsk ならば、タスク例外に行く + // そうでなければディスパッチする + sp += -12; // ダミー引数領域確保 (C) + call _dispatch; // レッツゴー + sp += 12; // ダミー引数領域開放 (C) + jump return_as_task; // タスクに戻る + +go_tex: + p1 = [p1]; // runtsk + r0 = [p1 + TCB_texptn]; // runtsk->texptrnを取得 ( UINT ) + cc = r0 == 0; // texptnが0なら1 +// r0 = [p1 + TCB_enatex]; // runtsk->enatexを取得 +// LOADVALUE( r1, TCB_enatex_mask) + r0 = b[p1 + TCB_enatex](z); // runtsk->enatexを取得 + r1 = TCB_enatex_mask; + r1 = r0 & r1; // タスク例外が許可されていなければ1 + cc |= az; // 例外が許可されていないか、texptnが0ならば即帰る + if cc jump return_as_task(bp); // 許可されていなければタスクに戻る + sp += -12; // ダミー引数領域確保 (D) + call _call_texrtn; // 条件がそろったのでタスク例外処理を行う。 + sp += 12; // ダミー引数領域開放 (D) + +return_as_task: // タスクコンテキスト状態での戻り + r0 = [sp++]; // 退避していたロック状態 + reti = [sp++]; // 戻り番地を復帰。以後rtiまで割込み禁止 + cli r1; // 現在のロック状態を取り出す + // 管理外割り込みを使わない場合もこのcliは保護のため必要 +#ifdef UNMANAGED_INT + r2 = UNMANAGED_INT(z); + r1 = r1 & r2; // 実行中のマスクから管理外割り込みの状態を抽出 + r2 = ~ r2; // UNMANAGED_INTの逆マスク + r0 = r0 & r2; // 退避中のロック状態から管理外割り込みマスクをクリア + r0 = r0 | r1; // 退避していたロック状態をアップデート +#endif + sti r0; // CPUロックを解除(B)(F) + + +get_back: // 非タスクコンテキスト状態での戻り + restore_regs; // 退避したレジスタを全て戻す + p0=[sp++]; + rti; // タスクに戻る + + +#ifdef __GNUC__ +.size interrupt_dispatcher, .-interrupt_dispatcher +#elif defined(__ECC__) +interrupt_dispatcher.end: +#else +#error "Compiler is not supported" +#endif + + +.global expEntry +.global expEntry; +.global nmiEntry; +.global ivHWEntry; +.global ivTMREntry; +.global ivg7Entry; +.global ivg8Entry; +.global ivg9Entry; +.global ivg10Entry; +.global ivg11Entry; +.global ivg12Entry; +.global ivg13Entry; +.global ivg14Entry; +#ifdef __GNUC__ +.section .text; +.type expEntry, STT_FUNC; +.type nmiEntry, STT_FUNC; +.type ivTMREntry, STT_FUNC; +.type ivHWEntry, STT_FUNC; +.type ivg7Entry, STT_FUNC; +.type ivg8Entry, STT_FUNC; +.type ivg9Entry, STT_FUNC; +.type ivg10Entry, STT_FUNC; +.type ivg11Entry, STT_FUNC; +.type ivg12Entry, STT_FUNC; +.type ivg13Entry, STT_FUNC; +.type ivg14Entry, STT_FUNC; +#elif defined(__ECC__) +.section program; +#else +#error "Compiler is not supported" +#endif + + +/* +* 例外処理のエントリ +* +* 割り込みとのネスト関係を調べ、ネストしていないならイベントスタックをセットする。 +* p0 : ユーザー定義の例外ハンドラのアドレス +* p1 : IPENDのアドレス +* p2 : reqflgのアドレス +* r6 : タスクスタック +* r7 : ASTATの退避情報 +* +*/ +expEntry: + [--sp] = p0; + save_regs; // ユーザーレジスタの退避 + + LOADLABEL( p0, _exc_vector) // ユーザー定義例外ハンドラの格納アドレス + LOADVALUE( p1, __IPEND ) // IPENDレジスタのアドレス + + l0 = r0; + l1 = r0; + l2 = r0; + l3 = r0; + lc0 = r0; // 性能低下抑制のためにLCxをクリア + lc1 = r0; + + p0 = [p0]; // p0 = exc_vector + r0 = [p1]; // IPENDの値を取得 + r1 = 0x7fef; // + r0 = r0 & r1; // IVG15とGID以外を調べる. r0.Hは必ず0 + r0.L = ones r0; // 処理中のイベントの数を数える + r0 += -1; // イベントの数-1。ネストしていなければ0になる。 + cc = r0 == 0; // ネストしてなければ真 + if !cc jump call_exception; // もしネストしていればハンドラを呼ぶ + // ネストしていないイベントなら、スタックを切り替える + r6 = sp; // タスクスタックポインタを退避 + LOADLABEL( r0, ldf_stack_end) // イベントスタックポインタを設定 + sp = r0; + +call_exception: + r7 = astat; // ccにはネスト情報が入っている。それを退避 + r0 = p1; // 第一引数はIPENDのアドレス + sp += -12; // ダミー引数領域確保 (E) + call (p0); // C言語で書かれた例外ハンドラを呼ぶ + sp += 12; // ダミー引数領域開放 (E) + astat = r7; // ccを復帰 + if !cc jump get_back_x; // もしネストしているならば、このまま帰る + + // ここではイベントはネストしていない + sp = r6; // スタックをタスクスタックに設定 + + LOADLABEL( p2, _reqflg ) + r0 = [p2]; // reqflgの値を取得 + cc = r0; // ディスパッチかタスク例外の要求は出ているか + if !cc jump get_back_x; // 出ていないならば割り込まれたタスクに戻る + + // コンテキスト切り替え作業開始 + r0 = 0; // + [p2] = r0; // reqflgをクリアする. + r0 = retx; // タスクの戻り番地を取り出す + r1 = 1; + r0 = r1 | r0; // セルフ・ネストであると偽装する + [--sp] = r0; // 戻り番地をスタックにつむ + LOADLABEL( p0, task_context) + + cli r0; // 現在のCPUロック状態を取得 + [--sp] = r0; // ロック状態を退避 + r1 = 0xC01F(z); // タスクコンテキストははCPUロック状態で実行する + +#ifdef UNMANAGED_INT + r2 = UNMANAGED_INT(z); + r0 = r0 & r2; // 管理外割り込みのマスク状態を抽出 + r1 = r0 | r1; // タスクコンテキストはCPUロック状態で実行する +#endif + sti r1; // CPUロック (F) + + retx = p0; // ラベル"taskiv_context"を例外からの戻り番地にする + rtx; // 例外から戻る。コンテキストはタスクになる + +get_back_x: + restore_regs; // 退避したレジスタを全て戻す + p0=[sp++]; + rtx; + + +#ifdef __GNUC__ +.size expEntry, .-expEntry +#elif defined(__ECC__) +expEntry.end: +#else +#error "Compiler is not supported" +#endif + + + +// イベントハンドラのエントリーコード群。 +// EVTのエントリには対応する以下のコードのラベルが格納される。 +// それぞれのコードはイベント中にをp0に格納した後、 +// interrupt_dispatcherにジャンプする +// evtvectorはユーザーハンドラへのポインタの配列 + + + + +ivHWEntry: + [--sp] = p0; + p0 = 5; + jump.x interrupt_dispatcher; +#ifdef __GNUC__ +.size ivHWEntry, .-ivHWEntry +#elif defined(__ECC__) +ivHWEntry.end: +#else +#error "Compiler is not supported" +#endif + + +ivTMREntry: + [--sp] = p0; + p0 = 6; + jump.x interrupt_dispatcher; +#ifdef __GNUC__ +.size ivTMREntry, .-ivTMREntry +#elif defined(__ECC__) +ivTMREntry.end: +#else +#error "Compiler is not supported" +#endif + + +ivg7Entry: + [--sp] = p0; + p0 = 7; + jump.x interrupt_dispatcher; +#ifdef __GNUC__ +.size ivg7Entry, .-ivg7Entry +#elif defined(__ECC__) +ivg7Entry.end: +#else +#error "Compiler is not supported" +#endif + +ivg8Entry: + [--sp] = p0; + p0 = 8; + jump.x interrupt_dispatcher; +#ifdef __GNUC__ +.size ivg8Entry, .-ivg8Entry +#elif defined(__ECC__) +ivg8Entry.end: +#else +#error "Compiler is not supported" +#endif + +ivg9Entry: + [--sp] = p0; + p0 = 9; + jump.x interrupt_dispatcher; +#ifdef __GNUC__ +.size ivg9Entry, .-ivg8Entry +#elif defined(__ECC__) +ivg9Entry.end: +#else +#error "Compiler is not supported" +#endif + +ivg10Entry: + [--sp] = p0; + p0 = 10; + jump.x interrupt_dispatcher; +#ifdef __GNUC__ +.size ivg10Entry, .-ivg10Entry +#elif defined(__ECC__) +ivg10Entry.end: +#else +#error "Compiler is not supported" +#endif + +ivg11Entry: + [--sp] = p0; + p0 = 11; + jump.x interrupt_dispatcher; +#ifdef __GNUC__ +.size ivg11Entry, .-ivg11Entry +#elif defined(__ECC__) +ivg11Entry.end: +#else +#error "Compiler is not supported" +#endif + +ivg12Entry: + [--sp] = p0; + p0 = 12; + jump.x interrupt_dispatcher; +#ifdef __GNUC__ +.size ivg12Entry, .-ivg12Entry +#elif defined(__ECC__) +ivg12Entry.end: +#else +#error "Compiler is not supported" +#endif + +ivg13Entry: + [--sp] = p0; + p0 = 13; + jump.x interrupt_dispatcher; +#ifdef __GNUC__ +.size ivg13Entry, .-ivg13Entry +#elif defined(__ECC__) +ivg13Entry.end: +#else +#error "Compiler is not supported" +#endif + +ivg14Entry: // dispatch()の割り込み待ち部 + // USE_HW_ERRORは互換性の為だけに残してある。 +#if !defined(USE_TIC_CORE) && !defined(USE_HW_ERROR) && !defined(QUICK_HW_ERROR) + csync; // コアタイマーでティックを刻むときにはidle命令を使えない。 + idle; // イベント待ち + csync; +#endif + [--sp] = reti; // 割込みネスト許可 + r1 = 0xffff(z); // CPU アンロック用パターン +#ifdef UNMANAGED_INT + cli r0; // 現在のマスクを取り出す + r2 = UNMANAGED_INT(z); + r0 = r0 & r2; // 管理外割り込みのみ取り出す + r2 = ~r2; // 逆マスク + r1 = r1 & r2; // + r1 = r1 | r0; // 管理外割り込みを考慮したマスク +#endif + sti r1; // CPU アンロック + r1 = 0xC01F(z); // CPU ロック用パターン + cli r0; // 現在のマスクを取り出す + // 管理外割り込みを使わない場合も、保護のため必要 +#ifdef UNMANAGED_INT + r2 = UNMANAGED_INT(z); + r0 = r0 & r2; // 管理外割り込みのみ取り出す + r1 = r1 | r0; // 管理外割り込みを考慮したマスク +#endif + sti r1; + reti=[sp++]; // 割込みネスト禁止 + rti; +#ifdef __GNUC__ +.size ivg14Entry, .-ivg14Entry +#elif defined(__ECC__) +ivg14Entry.end: +#else +#error "Compiler is not supported" +#endif + + +nmiEntry: + jump nmiEntry; + rtn; +#ifdef __GNUC__ +.size nmiEntry, .-nmiEntry +#elif defined(__ECC__) +nmiEntry.end: +#else +#error "Compiler is not supported" +#endif + + + + +/* + * 微少時間待ち + * 内側のループは12サイクルで回る。 + */ + .global _sil_dly_nse; +_sil_dly_nse: + r1 = SIL_DLY_TIM1; + r2 = SIL_DLY_TIM2; + r0 = r0 - r1; // dilay - SIL_DLY_TIM1 + cc = an; // 結果が0より大きければ + if !cc jump _sil_dly_nse_1; // ループ + rts; +_sil_dly_nse_1: + r0 = r0 - r2; + nop; + cc = an; // 結果が0より大きければ + if !cc jump _sil_dly_nse_1; // ループ + rts; +_sil_dly_nse.end: + diff --git a/uzume_prototype/kernel/config/blackfin/cpu_unrename.h b/uzume_prototype/kernel/config/blackfin/cpu_unrename.h new file mode 100644 index 0000000..51a86f3 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/cpu_unrename.h @@ -0,0 +1,49 @@ +/* This file is generated from cpu_rename.def by genrename. */ + +#ifdef _CPU_UNRENAME_H_ +#undef _CPU_UNRENAME_H_ + +#undef activate_r +#undef dispatch +#undef dev_vector +#undef exc_vector +#undef device_dispatcher +#undef interrupt_dispatcher +#undef task_context +#undef expEntry +#undef nmiEntry +#undef ivTMREntry +#undef ivHWEntry +#undef ivg7Entry +#undef ivg8Entry +#undef ivg9Entry +#undef ivg10Entry +#undef ivg11Entry +#undef ivg12Entry +#undef ivg13Entry +#undef ivg14Entry + +#ifdef LABEL_ASM + +#undef _activate_r +#undef _dispatch +#undef _dev_vector +#undef _exc_vector +#undef _device_dispatcher +#undef _interrupt_dispatcher +#undef _task_context +#undef _expEntry +#undef _nmiEntry +#undef _ivTMREntry +#undef _ivHWEntry +#undef _ivg7Entry +#undef _ivg8Entry +#undef _ivg9Entry +#undef _ivg10Entry +#undef _ivg11Entry +#undef _ivg12Entry +#undef _ivg13Entry +#undef _ivg14Entry + +#endif /* LABEL_ASM */ +#endif /* _CPU_UNRENAME_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/ekit_bf533/Makefile.config b/uzume_prototype/kernel/config/blackfin/ekit_bf533/Makefile.config new file mode 100644 index 0000000..30706cd --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ekit_bf533/Makefile.config @@ -0,0 +1,26 @@ +# +# Makefile のターゲットシステム依存部(E!Kit-BF533用) +# + +# +# コンパイルオプション +# +INCLUDES := $(INCLUDES) -I$(SRCDIR)/config/$(CPU)/$(SYS) \ + -I$(SRCDIR)/config/$(CPU)/_common_bf533 \ + -I$(SRCDIR)/pdic/simple_sio +COPTS := $(COPTS) +LDFLAGS := $(LDFLAGS) + +# +# カーネルに関する定義 +# +KERNEL_DIR := $(KERNEL_DIR) :$(SRCDIR)/config/$(CPU)/$(SYS) :$(SRCDIR)/config/$(CPU)/_common_bf533 :$(SRCDIR)/pdic/simple_sio +KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) +KERNEL_COBJS := $(KERNEL_COBJS) chip_config.o uart.o chip_debugboot.o chip_dump.o + + +# +# リンカスクリプトの定義 +# +LDSCRIPT = $(CPU)/_common_bf533/bf533elf.ld + diff --git a/uzume_prototype/kernel/config/blackfin/ekit_bf533/readme.txt b/uzume_prototype/kernel/config/blackfin/ekit_bf533/readme.txt new file mode 100644 index 0000000..9727525 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ekit_bf533/readme.txt @@ -0,0 +1,13 @@ +Device Drivers製 E!Kit-BF533対応システム依存部。 + +sys_config.hとsys_defs.hは、#include_nextを使って、それぞれblackfin/_common_bf533/sys_config.h +とblackfin/_common_bf533/sys_defs.hを読み込んでいる。 + +Makefile.configは、インクルード・パスおよびソースファイルへのパスとしてblackfin/_common_bf533も +指定している。 + +- Makefile.config : gnu環境のためのシステム依存部定義ファイル +- readme.txt : このファイル +- sys_config.h : システム依存部のうち、アプリケーションから見えない宣言 +- sys_defs.h : システム依存部のうち、アプリケーションから見える宣言 + diff --git a/uzume_prototype/kernel/config/blackfin/ekit_bf533/sys_config.h b/uzume_prototype/kernel/config/blackfin/ekit_bf533/sys_config.h new file mode 100644 index 0000000..eb54e71 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ekit_bf533/sys_config.h @@ -0,0 +1,169 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +#ifndef _SYS_CONFIG_H_ +#define _SYS_CONFIG_H_ + +/* + * カーネルの内部識別名のリネーム + */ +#include + +/* blackfin/_common_bf533から読み込む */ +#include + +/* + * ターゲットシステム依存モジュール(E!Kit-BF533用) + * + * このインクルードファイルは,t_config.h のみからインクルードされる. + * 他のファイルから直接インクルードしてはならない. +*/ + +/* + * どのようなクロック入力にも対応できるよう、以下でCSEL, SSEL, MSELの値 + * とクロック入力周波数(Hz)を指定する。PLLのプログラムはsys_config.cの + * sys_initialize()関数で行われる。 + * + * CSELVALは1,2,4,8の中から選ぶ。CLKINの単位はHz + */ + +#define CSELVAL 1 +#define SSELVAL 5 +#define MSELVAL 50 +#define CLKIN 12000000 + + +/* + * ハードウェア・エラー割り込みの許可 + * QUICK_HW_ERRORをdefineすると、ハードウェア・エラー・イベント + * が即座に受理される。defineしない場合には、割り込み待ち状態で + * ハードウェア・エラー・割り込みが発生した場合、次の割り込みまで + * 待たされることになる。 + * + */ +//#define QUICK_HW_ERROR + + +/* + * 実行時初期化関数の使用 + * + * マクロ USE_RUNTIME_INIT を定義すると、start.asmのなかで _mi_initialize + * を呼び出す。この関数はノーブートモードで起動するときにのみ必要になるので + * 通常は USE_RUNTIME_INITを使う必要はない。 + * 詳細はADIのEE239に詳しい。http://tinyurl.com/2hpbk (tinyURL) + * +*/ +//#define USE_RUNTIME_INIT + +/* + * カーネル管理外割り込みの宣言 + * + * マクロUNMANAGED_INTはカーネル管理外割り込みを宣言する。この + * マクロは16ビットのビットマップになっており、以下にあるパターン + * のうちひとつを使う。なお、どのようなパターンを選んでもNMIは管理外 + * 割込みとして扱われる。 + * UNMANAGED_INTを宣言しない場合、NMIだけが管理外割込みとして扱われる。 + * +*/ +//#define UNMANAGED_INT 0x0020 // IVHWがカーネル管理外. +//#define UNMANAGED_INT 0x0060 // IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x00E0 // IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x01E0 // IVG8 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x03E0 // IVG9 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x07E0 // IVG10 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x0FE0 // IVG11 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x1FE0 // IVG12 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x3FE0 // IVG13 ... IVG7, IVTMRとIVHWがカーネル管理外. + +/* + * C++関連資源を用意する + * + * マクロINIT_C_PLUS_PLUSを定義すると、C++言語用のテーブルを + * 初期化コードを実行する。また、C++言語用のテーブルを宣言する + * +*/ +// #define INIT_C_PLUS_PLUS + +/* + * 起動メッセージのターゲットシステム名 + */ +#define TARGET_NAME "E!Kit-BF533" + + +/* + * シリアルポート数の定義 + * TNUM_SIOP_XXXは、UARTの種別ごとに宣言する。 + * TNUM_SIOP_UARTはBF533内蔵UARTのうち、PDICが使用するもの。 + * BF533はUARTをひとつしかもっていないので、1か0を宣言する。 + * TNUM_PORTは、TNUM_SIOP_XXXのうち、GDICが使用するものの総和。 + * uart.cで使う。 + */ +#define TNUM_PORT 1 /* GDICがサポートするシリアルポートの数 */ +#define TNUM_SIOP_UART 1 /* PIDCがサポートするシリアルポートの数 */ + +/* + * シリアルポート番号に関する定義 + * ログタスクがシリアルポートを使わない場合は無視していい。 + */ +#define LOGTASK_PORTID 1 /* システムログに用いるシリアルポート番号 */ + +/* UART0のボーレート. */ +#define UART0_BAUD_RATE 57600 /* 57600 bps*/ + +/* + * PLLの初期化の強制 + * PLLは、PLL_CTLレジスタがデフォルト値で、かつ、SDRAMコントローラが + * ディセーブルのときに限り初期化を行うようになっている。これは、ブート + * ローダーなどの初期化ソフトがSDRAMを初期化したときにそれを保護するため + * である。一方でVisualDSP++のデバッガはSDRAMを自分で初期化するため、 + * この機能とうまく折り合いがつかない場合がある。 + * 状況に関わらず常に初期化したい時には FORCE_PLL_INITIALIZE マクロを + * 宣言する。 + */ +// #deinfe FORCE_PLL_INITIALIZE + + + + +#endif /* _SYS_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/ekit_bf533/sys_defs.h b/uzume_prototype/kernel/config/blackfin/ekit_bf533/sys_defs.h new file mode 100644 index 0000000..03453e0 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ekit_bf533/sys_defs.h @@ -0,0 +1,76 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +/* + * ターゲットシステムに依存する定義(E!Kit-BF533用) + * + * このインクルードファイルは,kernel.h と sil.h でインクルードされる. + * 他のファイルから直接インクルードすることはない.このファイルをイン + * クルードする前に,t_stddef.h と itron.h がインクルードされるので, + * それらに依存してもよい. + */ + +#ifndef _SYS_DEFS_H_ +#define _SYS_DEFS_H_ + +/* blackfin/_common_bf533から読む */ +#include + + /* システム略称  jsp/doc/config.txtの 2.(8)を参照 */ +#define EKIT_BF533 + +/* + * 破壊性読み出しレジスタの判別式 + * 与えられたアドレス iop が破壊性読み出しレジスタの + * 場合には真を返す。 + * + * ADSP-BF533の内蔵ペリフェラルについて考慮する必要はない + * 宣言しない場合は、デフォルトで外部ペリフェラルはすべて + * 破壊性読み出しとして扱われる + */ +// #define DESTRUCTIVE_READ( iop ) (iop<(VP)0xF0000000) + + + +#endif /* _SYS_DEFS_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf506/Makefile.config b/uzume_prototype/kernel/config/blackfin/ezkit_bf506/Makefile.config new file mode 100644 index 0000000..e76fe8e --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf506/Makefile.config @@ -0,0 +1,25 @@ +# +# Makefile のターゲットシステム依存部(EZ-KIT Lite BF506用) +# + +# +# コンパイルオプション +# +INCLUDES := $(INCLUDES) -I$(SRCDIR)/config/$(CPU)/$(SYS) -I$(SRCDIR)/config/$(CPU)/_common_bf506 \ + -I$(SRCDIR)/pdic/simple_sio +COPTS := $(COPTS) +LDFLAGS := $(LDFLAGS) + +# +# カーネルに関する定義 +# +KERNEL_DIR := $(KERNEL_DIR):$(SRCDIR)/config/$(CPU)/$(SYS):$(SRCDIR)/config/$(CPU)/_common_bf506 \ + :$(SRCDIR)/pdic/simple_sio +KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) +KERNEL_COBJS := $(KERNEL_COBJS) chip_config.o uart.o chip_debugboot.o chip_dump.o + +# +# リンカスクリプトの定義 +# +LDSCRIPT = $(CPU)/_common_bf506/bf506elf.ld + diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf506/jsp_ezkit_bf506.dpj b/uzume_prototype/kernel/config/blackfin/ezkit_bf506/jsp_ezkit_bf506.dpj new file mode 100644 index 0000000..40de046 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf506/jsp_ezkit_bf506.dpj @@ -0,0 +1,617 @@ + + + + + ADSP-BF506F + .dlb + Library file + + + + + .\Debug + . + 0 + + + + + + + + + + + + + + + + + + + + + + + .\Release + . + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf506/readme.txt b/uzume_prototype/kernel/config/blackfin/ezkit_bf506/readme.txt new file mode 100644 index 0000000..3f5145b --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf506/readme.txt @@ -0,0 +1,16 @@ +Analog Devices製 EZ-KIT Lite BF506対応システム依存部。 + +sys_config.hとsys_defs.hは、#include_nextを使って、それぞれblackfin/_common_bf508/sys_config.h +とblackfin/_common_bf506/sys_defs.hを読み込んでいる。 + +Makefile.configは、インクルード・パスおよびソースファイルへのパスとしてblackfin/_common_bf506も +指定している。 + +- Makefile.config : gnu環境のためのシステム依存部定義ファイル +- readme.txt : このファイル +- sys_config.h : システム依存部のうち、アプリケーションから見えない宣言 +- sys_defs.h : システム依存部のうち、アプリケーションから見える宣言 + +gdbからリセットがかけられないのか、gdbを使ってgnICE+などのデバッガからjsp(dxe)をロードしても +BootMode 111(Boot through UART0)だと起動メッセージが表示しない。 +他のモードに切り替えてからブートを行うこと。 diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf506/sys_config.h b/uzume_prototype/kernel/config/blackfin/ezkit_bf506/sys_config.h new file mode 100644 index 0000000..7a1d2bc --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf506/sys_config.h @@ -0,0 +1,187 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2009 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * Copyright (C) 2010,2011 by Kaneko System Co., Ltd. + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +#ifndef _SYS_CONFIG_H_ +#define _SYS_CONFIG_H_ + + +/* + * カーネルの内部識別名のリネーム + */ +#include + +#include + +/* + * ターゲットシステム依存モジュール(EZKIT-BF506用) + * + * このインクルードファイルは,t_config.h のみからインクルードされる. + * 他のファイルから直接インクルードしてはならない. +*/ + +/* + * ADSP-BF506に依存せず、ボードへの実装によって決まるパラメータを + * ここで定義する。 + */ + + +/* + * どのようなクロック入力にも対応できるよう、以下でCSEL, SSEL, MSELの値 + * とクロック入力周波数(Hz)を指定する。PLLのプログラムはsys_config.cの + * sys_initialize()関数で行われる。 + * + * CSELVALは1,2,4,8の中から選ぶ。CLKINの単位はHz + */ + +#define CSELVAL 1 +#define SSELVAL 5 +#define MSELVAL 16 +#define CLKIN 25000000 + +/* + * TIC用タイマーの選択 + * USE_TIC_COREをdefineすると、COREタイマーが使用される + * コメントアウトすると、GP_TIMER_2を使用する + * + * COREタイマーはwakeup信号を生成しないため、ディスパッチャ + * はidle命令を使ってCOREタイマーイベントを待つことができない。 + * そのため、USE_TIC_COREを使うとディスパッチャはidle命令を + * 使わずに割り込み発生をポーリングで待つ。これは消費電力の + * 点で不利である。 + * + */ +//#define USE_TIC_CORE + +/* + * ハードウェア・エラー割り込みの許可 + * QUICK_HW_ERRORをdefineすると、ハードウェア・エラー・イベント + * が即座に受理される。defineしない場合には、割り込み待ち状態で + * ハードウェア・エラー・割り込みが発生した場合、次の割り込みまで + * 待たされることになる。 + * + */ +//#define QUICK_HW_ERROR + + +/* + * 実行時初期化関数の使用 + * + * マクロ USE_RUNTIME_INIT を定義すると、start.asmのなかで _mi_initialize + * を呼び出す。この関数はノーブートモードで起動するときにのみ必要になるので + * 通常は USE_RUNTIME_INITを使う必要はない。 + * 詳細はADIのEE239に詳しい。http://tinyurl.com/2hpbk (tinyURL) + * +*/ +//#define USE_RUNTIME_INIT + +/* + * カーネル管理外割り込みの宣言 + * + * マクロUNMANAGED_INTはカーネル管理外割り込みを宣言する。この + * マクロは16ビットのビットマップになっており、以下にあるパターン + * のうちひとつを使う。なお、どのようなパターンを選んでもNMIは管理外 + * 割込みとして扱われる。 + * UNMANAGED_INTを宣言しない場合、NMIだけが管理外割込みとして扱われる。 + * +*/ +//#define UNMANAGED_INT 0x0020 // IVHWがカーネル管理外. +//#define UNMANAGED_INT 0x0060 // IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x00E0 // IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x01E0 // IVG8 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x03E0 // IVG9 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x07E0 // IVG10 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x0FE0 // IVG11 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x1FE0 // IVG12 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x3FE0 // IVG13 ... IVG7, IVTMRとIVHWがカーネル管理外. + +/* + * C++関連資源を用意する + * + * マクロINIT_C_PLUS_PLUSを定義すると、C++言語用のテーブルを + * 初期化コードを実行する。また、C++言語用のテーブルを宣言する + * +*/ +//#define INIT_C_PLUS_PLUS + +/* + * 起動メッセージのターゲットシステム名 + */ +#define TARGET_NAME "EZ-KIT Lite BF506" + + +/* + * シリアルポート数の定義 + * TNUM_SIOP_XXXは、UARTの種別ごとに宣言する。 + * TNUM_SIOP_UARTはBF506内蔵UARTのうち、PDICが使用するもの。 + * BF506はUARTをふたつもっているので、2,1か0を宣言する。 + * TNUM_PORTは、TNUM_SIOP_XXXのうち、GDICが使用するものの総和。 + * uart.cで使う。 + */ +#define TNUM_PORT 1 /* GDICがサポートするシリアルポートの数 */ +#define TNUM_SIOP_UART 2 /* PIDCがサポートするシリアルポートの数 */ + +/* + * シリアルポート番号に関する定義 + * ログタスクがシリアルポートを使わない場合は無視していい。 + */ +#define LOGTASK_PORTID 1 /* システムログに用いるシリアルポート番号 */ + +/* UART0のボーレート. */ +#define UART0_BAUD_RATE 57600 /* 57600 bps*/ +#define UART1_BAUD_RATE 31250 /* 31250 bps*/ + +/* + * PLLの初期化の強制 + * PLLは、PLL_CTLレジスタがデフォルト値で、かつ、SDRAMコントローラが + * ディセーブルのときに限り初期化を行うようになっている。これは、ブート + * ローダーなどの初期化ソフトがSDRAMを初期化したときにそれを保護するため + * である。一方でVisualDSP++のデバッガはSDRAMを自分で初期化するため、 + * この機能とうまく折り合いがつかない場合がある。 + * 上京に関わらず常に初期化したい時には FORCE_PLL_INITIALIZE マクロを + * 宣言する。 + */ +#define FORCE_PLL_INITIALIZE + +#endif /* _SYS_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf506/sys_defs.h b/uzume_prototype/kernel/config/blackfin/ezkit_bf506/sys_defs.h new file mode 100644 index 0000000..f3079e3 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf506/sys_defs.h @@ -0,0 +1,76 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2009 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * Copyright (C) 2010,2011 by Kaneko System Co., Ltd. + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +/* + * ターゲットシステムに依存する定義(EZ Kit Lite-BF506用) + * + * このインクルードファイルは,kernel.h と sil.h でインクルードされる. + * 他のファイルから直接インクルードすることはない.このファイルをイン + * クルードする前に,t_stddef.h と itron.h がインクルードされるので, + * それらに依存してもよい. + */ + +#ifndef _SYS_DEFS_H_ +#define _SYS_DEFS_H_ + +#include + + /* システム略称 */ +#define EZKIT_BF506 + + +/* + * 破壊性読み出しレジスタの判別式 + * 与えられたアドレス iop が破壊性読み出しレジスタの + * 場合には真を返す。 + * + * ADSP-BF506の内蔵ペリフェラルについて考慮する必要はない + * 宣言しない場合は、デフォルトで外部ペリフェラルはすべて + * 破壊性読み出しとして扱われる + */ +// #define DESTRUCTIVE_READ( iop ) (iop<(VP)0xF0000000) + + +#endif /* _SYS_DEFS_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf518/Makefile.config b/uzume_prototype/kernel/config/blackfin/ezkit_bf518/Makefile.config new file mode 100644 index 0000000..4df0d0b --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf518/Makefile.config @@ -0,0 +1,25 @@ +# +# Makefile のターゲットシステム依存部(EZ-KIT Lite BF518用) +# + +# +# コンパイルオプション +# +INCLUDES := $(INCLUDES) -I$(SRCDIR)/config/$(CPU)/$(SYS) -I$(SRCDIR)/config/$(CPU)/_common_bf518 \ + -I$(SRCDIR)/pdic/simple_sio +COPTS := $(COPTS) +LDFLAGS := $(LDFLAGS) + +# +# カーネルに関する定義 +# +KERNEL_DIR := $(KERNEL_DIR):$(SRCDIR)/config/$(CPU)/$(SYS):$(SRCDIR)/config/$(CPU)/_common_bf518 \ + :$(SRCDIR)/pdic/simple_sio +KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) +KERNEL_COBJS := $(KERNEL_COBJS) chip_config.o uart.o chip_debugboot.o chip_dump.o + +# +# リンカスクリプトの定義 +# +LDSCRIPT = $(CPU)/_common_bf518/bf518elf.ld + diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf518/jsp_ezkit_bf518.dpj b/uzume_prototype/kernel/config/blackfin/ezkit_bf518/jsp_ezkit_bf518.dpj new file mode 100755 index 0000000..07e9283 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf518/jsp_ezkit_bf518.dpj @@ -0,0 +1,617 @@ + + + + + ADSP-BF518 + .dlb + Library file + + + + + .\Debug + . + 0 + + + + + + + + + + + + + + + + + + + + + + + .\Release + . + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf518/readme.txt b/uzume_prototype/kernel/config/blackfin/ezkit_bf518/readme.txt new file mode 100644 index 0000000..51b826b --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf518/readme.txt @@ -0,0 +1,15 @@ +Analog Devices製 EZ-KIT Lite BF518対応システム依存部。 + +sys_config.hとsys_defs.hは、#include_nextを使って、それぞれblackfin/_common_bf518/sys_config.h +とblackfin/_common_bf518/sys_defs.hを読み込んでいる。 + +Makefile.configは、インクルード・パスおよびソースファイルへのパスとしてblackfin/_common_bf518も +指定している。 + +- Makefile.config : gnu環境のためのシステム依存部定義ファイル +- readme.txt : このファイル +- sys_config.h : システム依存部のうち、アプリケーションから見えない宣言 +- sys_defs.h : システム依存部のうち、アプリケーションから見える宣言 + +このシステム依存部は、Rev 0.0 シリコンでは使用できない。Rev 0.0を使う場合にはezkit_bf518_00依存部を +使用すること。 \ No newline at end of file diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf518/sys_config.h b/uzume_prototype/kernel/config/blackfin/ezkit_bf518/sys_config.h new file mode 100644 index 0000000..c19f26c --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf518/sys_config.h @@ -0,0 +1,186 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +#ifndef _SYS_CONFIG_H_ +#define _SYS_CONFIG_H_ + + +/* + * カーネルの内部識別名のリネーム + */ +#include + +#include + +/* + * ターゲットシステム依存モジュール(EZKIT-BF518用) + * + * このインクルードファイルは,t_config.h のみからインクルードされる. + * 他のファイルから直接インクルードしてはならない. +*/ + +/* + * ADSP-BF518に依存せず、ボードへの実装によって決まるパラメータを + * ここで定義する。 + */ + + +/* + * どのようなクロック入力にも対応できるよう、以下でCSEL, SSEL, MSELの値 + * とクロック入力周波数(Hz)を指定する。PLLのプログラムはsys_config.cの + * sys_initialize()関数で行われる。 + * + * CSELVALは1,2,4,8の中から選ぶ。CLKINの単位はHz + */ + +#define CSELVAL 1 +#define SSELVAL 5 +#define MSELVAL 16 +#define CLKIN 25000000 + +/* + * TIC用タイマーの選択 + * USE_TIC_COREをdefineすると、COREタイマーが使用される + * コメントアウトすると、GP_TIMER_2を使用する + * + * COREタイマーはwakeup信号を生成しないため、ディスパッチャ + * はidle命令を使ってCOREタイマーイベントを待つことができない。 + * そのため、USE_TIC_COREを使うとディスパッチャはidle命令を + * 使わずに割り込み発生をポーリングで待つ。これは消費電力の + * 点で不利である。 + * + */ +//#define USE_TIC_CORE + +/* + * ハードウェア・エラー割り込みの許可 + * QUICK_HW_ERRORをdefineすると、ハードウェア・エラー・イベント + * が即座に受理される。defineしない場合には、割り込み待ち状態で + * ハードウェア・エラー・割り込みが発生した場合、次の割り込みまで + * 待たされることになる。 + * + */ +//#define QUICK_HW_ERROR + + +/* + * 実行時初期化関数の使用 + * + * マクロ USE_RUNTIME_INIT を定義すると、start.asmのなかで _mi_initialize + * を呼び出す。この関数はノーブートモードで起動するときにのみ必要になるので + * 通常は USE_RUNTIME_INITを使う必要はない。 + * 詳細はADIのEE239に詳しい。http://tinyurl.com/2hpbk (tinyURL) + * +*/ +//#define USE_RUNTIME_INIT + +/* + * カーネル管理外割り込みの宣言 + * + * マクロUNMANAGED_INTはカーネル管理外割り込みを宣言する。この + * マクロは16ビットのビットマップになっており、以下にあるパターン + * のうちひとつを使う。なお、どのようなパターンを選んでもNMIは管理外 + * 割込みとして扱われる。 + * UNMANAGED_INTを宣言しない場合、NMIだけが管理外割込みとして扱われる。 + * +*/ +//#define UNMANAGED_INT 0x0020 // IVHWがカーネル管理外. +//#define UNMANAGED_INT 0x0060 // IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x00E0 // IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x01E0 // IVG8 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x03E0 // IVG9 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x07E0 // IVG10 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x0FE0 // IVG11 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x1FE0 // IVG12 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x3FE0 // IVG13 ... IVG7, IVTMRとIVHWがカーネル管理外. + +/* + * C++関連資源を用意する + * + * マクロINIT_C_PLUS_PLUSを定義すると、C++言語用のテーブルを + * 初期化コードを実行する。また、C++言語用のテーブルを宣言する + * +*/ +//#define INIT_C_PLUS_PLUS + +/* + * 起動メッセージのターゲットシステム名 + */ +#define TARGET_NAME "EZ-KIT Lite BF518" + + +/* + * シリアルポート数の定義 + * TNUM_SIOP_XXXは、UARTの種別ごとに宣言する。 + * TNUM_SIOP_UARTはBF518内蔵UARTのうち、PDICが使用するもの。 + * BF518はUARTをふたつもっているので、2,1か0を宣言する。 + * TNUM_PORTは、TNUM_SIOP_XXXのうち、GDICが使用するものの総和。 + * uart.cで使う。 + */ +#define TNUM_PORT 1 /* GDICがサポートするシリアルポートの数 */ +#define TNUM_SIOP_UART 1 /* PIDCがサポートするシリアルポートの数 */ + +/* + * シリアルポート番号に関する定義 + * ログタスクがシリアルポートを使わない場合は無視していい。 + */ +#define LOGTASK_PORTID 1 /* システムログに用いるシリアルポート番号 */ + +/* UART0のボーレート. */ +#define UART0_BAUD_RATE 57600 /* 57600 bps*/ +#define UART1_BAUD_RATE 57600 /* 57600 bps*/ + +/* + * PLLの初期化の強制 + * PLLは、PLL_CTLレジスタがデフォルト値で、かつ、SDRAMコントローラが + * ディセーブルのときに限り初期化を行うようになっている。これは、ブート + * ローダーなどの初期化ソフトがSDRAMを初期化したときにそれを保護するため + * である。一方でVisualDSP++のデバッガはSDRAMを自分で初期化するため、 + * この機能とうまく折り合いがつかない場合がある。 + * 上京に関わらず常に初期化したい時には FORCE_PLL_INITIALIZE マクロを + * 宣言する。 + */ +// #deinfe FORCE_PLL_INITIALIZE + +#endif /* _SYS_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf518/sys_defs.h b/uzume_prototype/kernel/config/blackfin/ezkit_bf518/sys_defs.h new file mode 100644 index 0000000..666fd1a --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf518/sys_defs.h @@ -0,0 +1,75 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +/* + * ターゲットシステムに依存する定義(EZ Kit Lite-BF518用) + * + * このインクルードファイルは,kernel.h と sil.h でインクルードされる. + * 他のファイルから直接インクルードすることはない.このファイルをイン + * クルードする前に,t_stddef.h と itron.h がインクルードされるので, + * それらに依存してもよい. + */ + +#ifndef _SYS_DEFS_H_ +#define _SYS_DEFS_H_ + +#include + + /* システム略称 */ +#define EZKIT_BF518 + + +/* + * 破壊性読み出しレジスタの判別式 + * 与えられたアドレス iop が破壊性読み出しレジスタの + * 場合には真を返す。 + * + * ADSP-BF518の内蔵ペリフェラルについて考慮する必要はない + * 宣言しない場合は、デフォルトで外部ペリフェラルはすべて + * 破壊性読み出しとして扱われる + */ +// #define DESTRUCTIVE_READ( iop ) (iop<(VP)0xF0000000) + + +#endif /* _SYS_DEFS_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf518_00/Makefile.config b/uzume_prototype/kernel/config/blackfin/ezkit_bf518_00/Makefile.config new file mode 100644 index 0000000..2fd49db --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf518_00/Makefile.config @@ -0,0 +1,25 @@ +# +# Makefile のターゲットシステム依存部(EZ-KIT Lite BF518用) +# + +# +# コンパイルオプション +# +INCLUDES := $(INCLUDES) -I$(SRCDIR)/config/$(CPU)/$(SYS) -I$(SRCDIR)/config/$(CPU)/_common_bf518 \ + -I$(SRCDIR)/pdic/simple_sio +COPTS := $(COPTS) +LDFLAGS := $(LDFLAGS) + +# +# カーネルに関する定義 +# +KERNEL_DIR := $(KERNEL_DIR):$(SRCDIR)/config/$(CPU)/$(SYS):$(SRCDIR)/config/$(CPU)/_common_bf518 \ + :$(SRCDIR)/pdic/simple_sio +KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) +KERNEL_COBJS := $(KERNEL_COBJS) chip_config.o uart.o chip_debugboot.o chip_dump.o + +# +# リンカスクリプトの定義 +# +LDSCRIPT = $(CPU)/_common_bf518/bf518elf_00.ld + diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf518_00/readme.txt b/uzume_prototype/kernel/config/blackfin/ezkit_bf518_00/readme.txt new file mode 100644 index 0000000..ab41bea --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf518_00/readme.txt @@ -0,0 +1,15 @@ +Analog Devices製 EZ-KIT Lite BF518 Rev 0.0 対応システム依存部。 + +sys_config.hとsys_defs.hは、#include_nextを使って、それぞれblackfin/_common_bf518/sys_config.h +とblackfin/_common_bf518/sys_defs.hを読み込んでいる。 + +Makefile.configは、インクルード・パスおよびソースファイルへのパスとしてblackfin/_common_bf518も +指定している。 + +- Makefile.config : gnu環境のためのシステム依存部定義ファイル +- readme.txt : このファイル +- sys_config.h : システム依存部のうち、アプリケーションから見えない宣言 +- sys_defs.h : システム依存部のうち、アプリケーションから見える宣言 + +このシステム依存部は、Rev 0.1以降のシリコンでは使用できない。Rev 0.1以降を使う場合にはezkit_bf518 +依存部を使用すること。 \ No newline at end of file diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf518_00/sys_config.h b/uzume_prototype/kernel/config/blackfin/ezkit_bf518_00/sys_config.h new file mode 100644 index 0000000..4eaf84c --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf518_00/sys_config.h @@ -0,0 +1,186 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +#ifndef _SYS_CONFIG_H_ +#define _SYS_CONFIG_H_ + + +/* + * カーネルの内部識別名のリネーム + */ +#include + +#include + +/* + * ターゲットシステム依存モジュール(EZKIT-BF518用) + * + * このインクルードファイルは,t_config.h のみからインクルードされる. + * 他のファイルから直接インクルードしてはならない. +*/ + +/* + * ADSP-BF518に依存せず、ボードへの実装によって決まるパラメータを + * ここで定義する。 + */ + + +/* + * どのようなクロック入力にも対応できるよう、以下でCSEL, SSEL, MSELの値 + * とクロック入力周波数(Hz)を指定する。PLLのプログラムはsys_config.cの + * sys_initialize()関数で行われる。 + * + * CSELVALは1,2,4,8の中から選ぶ。CLKINの単位はHz + */ + +#define CSELVAL 1 +#define SSELVAL 5 +#define MSELVAL 16 +#define CLKIN 25000000 + +/* + * TIC用タイマーの選択 + * USE_TIC_COREをdefineすると、COREタイマーが使用される + * コメントアウトすると、GP_TIMER_2を使用する + * + * COREタイマーはwakeup信号を生成しないため、ディスパッチャ + * はidle命令を使ってCOREタイマーイベントを待つことができない。 + * そのため、USE_TIC_COREを使うとディスパッチャはidle命令を + * 使わずに割り込み発生をポーリングで待つ。これは消費電力の + * 点で不利である。 + * + */ +//#define USE_TIC_CORE + +/* + * ハードウェア・エラー割り込みの許可 + * QUICK_HW_ERRORをdefineすると、ハードウェア・エラー・イベント + * が即座に受理される。defineしない場合には、割り込み待ち状態で + * ハードウェア・エラー・割り込みが発生した場合、次の割り込みまで + * 待たされることになる。 + * + */ +//#define QUICK_HW_ERROR + + +/* + * 実行時初期化関数の使用 + * + * マクロ USE_RUNTIME_INIT を定義すると、start.asmのなかで _mi_initialize + * を呼び出す。この関数はノーブートモードで起動するときにのみ必要になるので + * 通常は USE_RUNTIME_INITを使う必要はない。 + * 詳細はADIのEE239に詳しい。http://tinyurl.com/2hpbk (tinyURL) + * +*/ +//#define USE_RUNTIME_INIT + +/* + * カーネル管理外割り込みの宣言 + * + * マクロUNMANAGED_INTはカーネル管理外割り込みを宣言する。この + * マクロは16ビットのビットマップになっており、以下にあるパターン + * のうちひとつを使う。なお、どのようなパターンを選んでもNMIは管理外 + * 割込みとして扱われる。 + * UNMANAGED_INTを宣言しない場合、NMIだけが管理外割込みとして扱われる。 + * +*/ +//#define UNMANAGED_INT 0x0020 // IVHWがカーネル管理外. +//#define UNMANAGED_INT 0x0060 // IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x00E0 // IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x01E0 // IVG8 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x03E0 // IVG9 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x07E0 // IVG10 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x0FE0 // IVG11 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x1FE0 // IVG12 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x3FE0 // IVG13 ... IVG7, IVTMRとIVHWがカーネル管理外. + +/* + * C++関連資源を用意する + * + * マクロINIT_C_PLUS_PLUSを定義すると、C++言語用のテーブルを + * 初期化コードを実行する。また、C++言語用のテーブルを宣言する + * +*/ +//#define INIT_C_PLUS_PLUS + +/* + * 起動メッセージのターゲットシステム名 + */ +#define TARGET_NAME "EZ-KIT Lite BF518 (Silicon Rev 0.0)" + + +/* + * シリアルポート数の定義 + * TNUM_SIOP_XXXは、UARTの種別ごとに宣言する。 + * TNUM_SIOP_UARTはBF518内蔵UARTのうち、PDICが使用するもの。 + * BF518はUARTをふたつもっているので、2,1か0を宣言する。 + * TNUM_PORTは、TNUM_SIOP_XXXのうち、GDICが使用するものの総和。 + * uart.cで使う。 + */ +#define TNUM_PORT 1 /* GDICがサポートするシリアルポートの数 */ +#define TNUM_SIOP_UART 1 /* PIDCがサポートするシリアルポートの数 */ + +/* + * シリアルポート番号に関する定義 + * ログタスクがシリアルポートを使わない場合は無視していい。 + */ +#define LOGTASK_PORTID 1 /* システムログに用いるシリアルポート番号 */ + +/* UART0のボーレート. */ +#define UART0_BAUD_RATE 57600 /* 57600 bps*/ +#define UART1_BAUD_RATE 57600 /* 57600 bps*/ + +/* + * PLLの初期化の強制 + * PLLは、PLL_CTLレジスタがデフォルト値で、かつ、SDRAMコントローラが + * ディセーブルのときに限り初期化を行うようになっている。これは、ブート + * ローダーなどの初期化ソフトがSDRAMを初期化したときにそれを保護するため + * である。一方でVisualDSP++のデバッガはSDRAMを自分で初期化するため、 + * この機能とうまく折り合いがつかない場合がある。 + * 上京に関わらず常に初期化したい時には FORCE_PLL_INITIALIZE マクロを + * 宣言する。 + */ +// #deinfe FORCE_PLL_INITIALIZE + +#endif /* _SYS_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf518_00/sys_defs.h b/uzume_prototype/kernel/config/blackfin/ezkit_bf518_00/sys_defs.h new file mode 100644 index 0000000..88ea8c5 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf518_00/sys_defs.h @@ -0,0 +1,75 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +/* + * ターゲットシステムに依存する定義(EZ Kit Lite-BF518用) + * + * このインクルードファイルは,kernel.h と sil.h でインクルードされる. + * 他のファイルから直接インクルードすることはない.このファイルをイン + * クルードする前に,t_stddef.h と itron.h がインクルードされるので, + * それらに依存してもよい. + */ + +#ifndef _SYS_DEFS_H_ +#define _SYS_DEFS_H_ + +#include + + /* システム略称 */ +#define EZKIT_BF518_00 + + +/* + * 破壊性読み出しレジスタの判別式 + * 与えられたアドレス iop が破壊性読み出しレジスタの + * 場合には真を返す。 + * + * ADSP-BF518の内蔵ペリフェラルについて考慮する必要はない + * 宣言しない場合は、デフォルトで外部ペリフェラルはすべて + * 破壊性読み出しとして扱われる + */ +// #define DESTRUCTIVE_READ( iop ) (iop<(VP)0xF0000000) + + +#endif /* _SYS_DEFS_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf533/Makefile.config b/uzume_prototype/kernel/config/blackfin/ezkit_bf533/Makefile.config new file mode 100644 index 0000000..937b37d --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf533/Makefile.config @@ -0,0 +1,26 @@ +# +# Makefile のターゲットシステム依存部(EZ-KIT lite BF533用) +# + +# +# コンパイルオプション +# +INCLUDES := $(INCLUDES) -I$(SRCDIR)/config/$(CPU)/$(SYS) \ + -I$(SRCDIR)/config/$(CPU)/_common_bf533 \ + -I$(SRCDIR)/pdic/simple_sio +COPTS := $(COPTS) +LDFLAGS := $(LDFLAGS) + +# +# カーネルに関する定義 +# +KERNEL_DIR := $(KERNEL_DIR) :$(SRCDIR)/config/$(CPU)/$(SYS) :$(SRCDIR)/config/$(CPU)/_common_bf533 :$(SRCDIR)/pdic/simple_sio +KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) +KERNEL_COBJS := $(KERNEL_COBJS) chip_config.o uart.o chip_debugboot.o chip_dump.o + + +# +# リンカスクリプトの定義 +# +LDSCRIPT = $(CPU)/_common_bf533/bf533elf.ld + diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf533/jsp_ezkit_bf533.dpj b/uzume_prototype/kernel/config/blackfin/ezkit_bf533/jsp_ezkit_bf533.dpj new file mode 100755 index 0000000..20b48c8 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf533/jsp_ezkit_bf533.dpj @@ -0,0 +1,633 @@ + + + + + ADSP-BF533 + .dlb + Library file + + + + + .\Debug + . + 0 + + + + + + + + + + + + + + + + + + + + + + + .\Release + . + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf533/readme.txt b/uzume_prototype/kernel/config/blackfin/ezkit_bf533/readme.txt new file mode 100644 index 0000000..69e9828 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf533/readme.txt @@ -0,0 +1,13 @@ +Analog Devices製 EZ-KIT Lite BF533対応システム依存部。 + +sys_config.hとsys_defs.hは、#include_nextを使って、それぞれblackfin/_common_bf533/sys_config.h +とblackfin/_common_bf533/sys_defs.hを読み込んでいる。 + +Makefile.configは、インクルード・パスおよびソースファイルへのパスとしてblackfin/_common_bf533も +指定している。 + +- jsp_ezkit_bf533.dpj : VisualDSP++のためのプロジェクトファイル +- Makefile.config : gnu環境のためのシステム依存部定義ファイル +- readme.txt : このファイル +- sys_config.h : システム依存部のうち、アプリケーションから見えない宣言 +- sys_defs.h : システム依存部のうち、アプリケーションから見える宣言 \ No newline at end of file diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf533/sys_config.h b/uzume_prototype/kernel/config/blackfin/ezkit_bf533/sys_config.h new file mode 100644 index 0000000..b8d4067 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf533/sys_config.h @@ -0,0 +1,189 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +#ifndef _SYS_CONFIG_H_ +#define _SYS_CONFIG_H_ + +/* + * カーネルの内部識別名のリネーム + */ +#include + +/* blackfin/_common_bf533から読み込む */ +#include + +/* + * ターゲットシステム依存モジュール(EZKIT-BF533用) + * + * このインクルードファイルは,t_config.h のみからインクルードされる. + * 他のファイルから直接インクルードしてはならない. +*/ + +/* + * どのようなクロック入力にも対応できるよう、以下でCSEL, SSEL, MSELの値 + * とクロック入力周波数(Hz)を指定する。PLLのプログラムはsys_config.cの + * sys_initialize()関数で行われる。 + * + * CSELVALは1,2,4,8の中から選ぶ。CLKINの単位はHz + */ + +#define CSELVAL 1 +#define SSELVAL 5 +#define MSELVAL 22 +#define CLKIN 27000000 + +/* + * システムタイマーの選択 + * USE_TIC_COREをdefineすると、COREタイマーが使用される + * コメントアウトすると、GP_TIMER_2を使用する + * + * COREタイマーはwakeup信号を生成しないため、ディスパッチャ + * はidle命令を使ってCOREタイマーイベントを待つことができない。 + * そのため、USE_TIC_COREを使うとディスパッチャはidle命令を + * 使わずに割り込み発生をポーリングで待つ。これは消費電力の + * 点で不利である。 + * + * システムタイマーにコアタイマーを使うことは、推奨しない。 + * この機能は、移植時の利便性のために残しており、実アプリケーションで + * つかうことは想定していない。 + * + */ +//#define USE_TIC_CORE + +/* + * ハードウェア・エラー割り込みの許可 + * QUICK_HW_ERRORをdefineすると、ハードウェア・エラー・イベント + * が即座に受理される。defineしない場合には、割り込み待ち状態で + * ハードウェア・エラー・割り込みが発生した場合、次の割り込みまで + * 待たされることになる。 + * + */ +//#define QUICK_HW_ERROR + + +/* + * 実行時初期化関数の使用 + * + * マクロ USE_RUNTIME_INIT を定義すると、start.asmのなかで _mi_initialize + * を呼び出す。この関数はノーブートモードで起動するときにのみ必要になるので + * 通常は USE_RUNTIME_INITを使う必要はない。 + * 詳細はADIのEE239に詳しい。http://tinyurl.com/2hpbk (tinyURL) + * +*/ +//#define USE_RUNTIME_INIT + +/* + * カーネル管理外割り込みの宣言 + * + * マクロUNMANAGED_INTはカーネル管理外割り込みを宣言する。この + * マクロは16ビットのビットマップになっており、以下にあるパターン + * のうちひとつを使う。なお、どのようなパターンを選んでもNMIは管理外 + * 割込みとして扱われる。 + * UNMANAGED_INTを宣言しない場合、NMIだけが管理外割込みとして扱われる。 + * +*/ +//#define UNMANAGED_INT 0x0020 // IVHWがカーネル管理外. +//#define UNMANAGED_INT 0x0060 // IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x00E0 // IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x01E0 // IVG8 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x03E0 // IVG9 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x07E0 // IVG10 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x0FE0 // IVG11 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x1FE0 // IVG12 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x3FE0 // IVG13 ... IVG7, IVTMRとIVHWがカーネル管理外. + +/* + * C++関連資源を用意する + * + * マクロINIT_C_PLUS_PLUSを定義すると、C++言語用のテーブルを + * 初期化コードを実行する。また、C++言語用のテーブルを宣言する + * +*/ +// #define INIT_C_PLUS_PLUS + +/* + * 起動メッセージのターゲットシステム名 + */ +#define TARGET_NAME "EZ-KIT Lite BF533" + + +/* + * シリアルポート数の定義 + * TNUM_SIOP_XXXは、UARTの種別ごとに宣言する。 + * TNUM_SIOP_UARTはBF533内蔵UARTのうち、PDICが使用するもの。 + * BF533はUARTをひとつしかもっていないので、1か0を宣言する。 + * TNUM_PORTは、TNUM_SIOP_XXXのうち、GDICが使用するものの総和。 + * uart.cで使う。 + */ +#define TNUM_PORT 1 /* GDICがサポートするシリアルポートの数 */ +#define TNUM_SIOP_UART 1 /* PIDCがサポートするシリアルポートの数 */ + +/* + * シリアルポート番号に関する定義 + * ログタスクがシリアルポートを使わない場合は無視していい。 + */ +#define LOGTASK_PORTID 1 /* システムログに用いるシリアルポート番号 */ + +/* UART0のボーレート. */ +#define UART0_BAUD_RATE 57600 /* 57600 bps*/ + +/* + * PLLの初期化の強制 + * PLLは、PLL_CTLレジスタがデフォルト値で、かつ、SDRAMコントローラが + * ディセーブルのときに限り初期化を行うようになっている。これは、ブート + * ローダーなどの初期化ソフトがSDRAMを初期化したときにそれを保護するため + * である。一方でVisualDSP++のデバッガはSDRAMを自分で初期化するため、 + * この機能とうまく折り合いがつかない場合がある。 + * 状況に関わらず常に初期化したい時には FORCE_PLL_INITIALIZE マクロを + * 宣言する。 + */ +// #deinfe FORCE_PLL_INITIALIZE + + +#ifndef __SILICON_REVISION__ +#define __SILICON_REVISION__ 0x02 +#endif + + +#endif /* _SYS_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf533/sys_defs.h b/uzume_prototype/kernel/config/blackfin/ezkit_bf533/sys_defs.h new file mode 100644 index 0000000..54f7ed0 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf533/sys_defs.h @@ -0,0 +1,76 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +/* + * ターゲットシステムに依存する定義(EZKIT-BF533用) + * + * このインクルードファイルは,kernel.h と sil.h でインクルードされる. + * 他のファイルから直接インクルードすることはない.このファイルをイン + * クルードする前に,t_stddef.h と itron.h がインクルードされるので, + * それらに依存してもよい. + */ + +#ifndef _SYS_DEFS_H_ +#define _SYS_DEFS_H_ + +/* blackfin/_common_bf533から読む */ +#include + + /* システム略称  jsp/doc/config.txtの 2.(8)を参照 */ +#define EZKIT_BF533 + +/* + * 破壊性読み出しレジスタの判別式 + * 与えられたアドレス iop が破壊性読み出しレジスタの + * 場合には真を返す。 + * + * ADSP-BF533の内蔵ペリフェラルについて考慮する必要はない + * 宣言しない場合は、デフォルトで外部ペリフェラルはすべて + * 破壊性読み出しとして扱われる + */ +// #define DESTRUCTIVE_READ( iop ) (iop<(VP)0xF0000000) + + + +#endif /* _SYS_DEFS_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf537/Makefile.config b/uzume_prototype/kernel/config/blackfin/ezkit_bf537/Makefile.config new file mode 100644 index 0000000..ca67cf3 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf537/Makefile.config @@ -0,0 +1,25 @@ +# +# Makefile のターゲットシステム依存部(EZ-KIT Lite BF537用) +# + +# +# コンパイルオプション +# +INCLUDES := $(INCLUDES) -I$(SRCDIR)/config/$(CPU)/$(SYS) -I$(SRCDIR)/config/$(CPU)/_common_bf537 \ + -I$(SRCDIR)/pdic/simple_sio +COPTS := $(COPTS) +LDFLAGS := $(LDFLAGS) + +# +# カーネルに関する定義 +# +KERNEL_DIR := $(KERNEL_DIR):$(SRCDIR)/config/$(CPU)/$(SYS):$(SRCDIR)/config/$(CPU)/_common_bf537 \ + :$(SRCDIR)/pdic/simple_sio +KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) +KERNEL_COBJS := $(KERNEL_COBJS) chip_config.o uart.o chip_debugboot.o chip_mmr.o chip_dump.o + +# +# リンカスクリプトの定義 +# +LDSCRIPT = $(CPU)/_common_bf537/bf537elf.ld + diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf537/jsp_ezkit_bf537.dpj b/uzume_prototype/kernel/config/blackfin/ezkit_bf537/jsp_ezkit_bf537.dpj new file mode 100755 index 0000000..e0be4b6 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf537/jsp_ezkit_bf537.dpj @@ -0,0 +1,617 @@ + + + + + ADSP-BF537 + .dlb + Library file + + + + + .\Debug + . + 0 + + + + + + + + + + + + + + + + + + + + + + + .\Release + . + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf537/readme.txt b/uzume_prototype/kernel/config/blackfin/ezkit_bf537/readme.txt new file mode 100644 index 0000000..55a2599 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf537/readme.txt @@ -0,0 +1,13 @@ +Analog Devices製 EZ-KIT Lite BF537対応システム依存部。 + +sys_config.hとsys_defs.hは、#include_nextを使って、それぞれblackfin/_common_bf537/sys_config.h +とblackfin/_common_bf537/sys_defs.hを読み込んでいる。 + +Makefile.configは、インクルード・パスおよびソースファイルへのパスとしてblackfin/_common_bf537も +指定している。 + +- jsp_ezkit_bf537.dpj : VisualDSP++のためのプロジェクトファイル +- Makefile.config : gnu環境のためのシステム依存部定義ファイル +- readme.txt : このファイル +- sys_config.h : システム依存部のうち、アプリケーションから見えない宣言 +- sys_defs.h : システム依存部のうち、アプリケーションから見える宣言 \ No newline at end of file diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf537/sys_config.h b/uzume_prototype/kernel/config/blackfin/ezkit_bf537/sys_config.h new file mode 100644 index 0000000..7df331a --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf537/sys_config.h @@ -0,0 +1,174 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +#ifndef _SYS_CONFIG_H_ +#define _SYS_CONFIG_H_ + + +/* + * カーネルの内部識別名のリネーム + */ +#include + +#include + +/* + * ターゲットシステム依存モジュール(EZKIT-BF537用) + * + * このインクルードファイルは,t_config.h のみからインクルードされる. + * 他のファイルから直接インクルードしてはならない. +*/ + +/* + * ADSP-BF537に依存せず、ボードへの実装によって決まるパラメータを + * ここで定義する。 + */ + + +/* + * どのようなクロック入力にも対応できるよう、以下でCSEL, SSEL, MSELの値 + * とクロック入力周波数(Hz)を指定する。PLLのプログラムはsys_config.cの + * sys_initialize()関数で行われる。 + * + * CSELVALは1,2,4,8の中から選ぶ。CLKINの単位はHz + */ + +#define CSELVAL 1 +#define SSELVAL 5 +#define MSELVAL 24 +#define CLKIN 25000000 + + + +/* + * ハードウェア・エラー割り込みの許可 + * QUICK_HW_ERRORをdefineすると、ハードウェア・エラー・イベント + * が即座に受理される。defineしない場合には、割り込み待ち状態で + * ハードウェア・エラー・割り込みが発生した場合、次の割り込みまで + * 待たされることになる。 + * + */ +//#define QUICK_HW_ERROR + + +/* + * 実行時初期化関数の使用 + * + * マクロ USE_RUNTIME_INIT を定義すると、start.asmのなかで _mi_initialize + * を呼び出す。この関数はノーブートモードで起動するときにのみ必要になるので + * 通常は USE_RUNTIME_INITを使う必要はない。 + * 詳細はADIのEE239に詳しい。http://tinyurl.com/2hpbk (tinyURL) + * +*/ +//#define USE_RUNTIME_INIT + +/* + * カーネル管理外割り込みの宣言 + * + * マクロUNMANAGED_INTはカーネル管理外割り込みを宣言する。この + * マクロは16ビットのビットマップになっており、以下にあるパターン + * のうちひとつを使う。なお、どのようなパターンを選んでもNMIは管理外 + * 割込みとして扱われる。 + * UNMANAGED_INTを宣言しない場合、NMIだけが管理外割込みとして扱われる。 + * +*/ +//#define UNMANAGED_INT 0x0020 // IVHWがカーネル管理外. +//#define UNMANAGED_INT 0x0060 // IVTMRã¨IVHWがカーネル管理外. +//#define UNMANAGED_INT 0x00E0 // IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x01E0 // IVG8 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x03E0 // IVG9 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x07E0 // IVG10 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x0FE0 // IVG11 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x1FE0 // IVG12 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x3FE0 // IVG13 ... IVG7, IVTMRとIVHWがカーネル管理外. + +/* + * C++関連資源を用意する + * + * マクロINIT_C_PLUS_PLUSを定義すると、C++言語用のテーブルを + * 初期化コードを実行する。また、C++言語用のテーブルを宣言する + * +*/ +//#define INIT_C_PLUS_PLUS + +/* + * 起動メッセージのターゲットシステム名 + */ +#define TARGET_NAME "EZ-KIT Lite BF537" + + +/* + * シリアルポート数の定義 + * TNUM_SIOP_XXXは、UARTの種別ごとに宣言する。 + * TNUM_SIOP_UARTはBF537内蔵UARTのうち、PDICが使用するもの。 + * BF537はUARTをふたつもっているので、2,1か0を宣言する。 + * TNUM_PORTは、TNUM_SIOP_XXXのうち、GDICが使用するものの総和。 + * uart.cで使う。 + */ +#define TNUM_PORT 1 /* GDICがサポートするシリアルポートの数 */ +#define TNUM_SIOP_UART 1 /* PIDCがサポートするシリアルポートの数 */ + +/* + * シリアルポート番号に関する定義 + * ログタスクがシリアルポートを使わない場合は無視していい。 + */ +#define LOGTASK_PORTID 1 /* システムログに用いるシリアルポート番号 */ + +/* UART0のボーレート. */ +#define UART0_BAUD_RATE 57600 /* 57600 bps*/ +#define UART1_BAUD_RATE 57600 /* 57600 bps*/ + +/* + * PLLの初期化の強制 + * PLLは、PLL_CTLレジスタがデフォルト値で、かつ、SDRAMコントローラが + * ディセーブルのときに限り初期化を行うようになっている。これは、ブート + * ローダーなどの初期化ソフトがSDRAMを初期化したときにそれを保護するため + * である。一方でVisualDSP++のデバッガはSDRAMを自分で初期化するため、 + * この機能とうまく折り合いがつかない場合がある。 + * 状況に関わらず常に初期化したい時には FORCE_PLL_INITIALIZE マクロを + * 宣言する。 + */ +// #deinfe FORCE_PLL_INITIALIZE + +#endif /* _SYS_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf537/sys_defs.h b/uzume_prototype/kernel/config/blackfin/ezkit_bf537/sys_defs.h new file mode 100644 index 0000000..11e8ed3 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf537/sys_defs.h @@ -0,0 +1,75 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +/* + * ターゲットシステムに依存する定義(EZ Kit Lite-BF537用) + * + * このインクルードファイルは,kernel.h と sil.h でインクルードされる. + * 他のファイルから直接インクルードすることはない.このファイルをイン + * クルードする前に,t_stddef.h と itron.h がインクルードされるので, + * それらに依存してもよい. + */ + +#ifndef _SYS_DEFS_H_ +#define _SYS_DEFS_H_ + +#include + + /* システム略称 */ +#define EZKIT_BF537 + + +/* + * 破壊性読み出しレジスタの判別式 + * 与えられたアドレス iop が破壊性読み出しレジスタの + * 場合には真を返す。 + * + * ADSP-BF537の内蔵ペリフェラルについて考慮する必要はない + * 宣言しない場合は、デフォルトで外部ペリフェラルはすべて + * 破壊性読み出しとして扱われる + */ +// #define DESTRUCTIVE_READ( iop ) (iop<(VP)0xF0000000) + + +#endif /* _SYS_DEFS_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf548/Makefile.config b/uzume_prototype/kernel/config/blackfin/ezkit_bf548/Makefile.config new file mode 100644 index 0000000..d596918 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf548/Makefile.config @@ -0,0 +1,25 @@ +# +# Makefile のターゲットシステム依存部(EZ-KIT Lite BF548用) +# + +# +# コンパイルオプション +# +INCLUDES := $(INCLUDES) -I$(SRCDIR)/config/$(CPU)/$(SYS) -I$(SRCDIR)/config/$(CPU)/_common_bf548 \ + -I$(SRCDIR)/pdic/simple_sio +COPTS := $(COPTS) +LDFLAGS := $(LDFLAGS) + +# +# カーネルに関する定義 +# +KERNEL_DIR := $(KERNEL_DIR):$(SRCDIR)/config/$(CPU)/$(SYS):$(SRCDIR)/config/$(CPU)/_common_bf548 \ + :$(SRCDIR)/pdic/simple_sio +KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) +KERNEL_COBJS := $(KERNEL_COBJS) chip_config.o uart.o chip_debugboot.o chip_dump.o + +# +# リンカスクリプトの定義 +# +LDSCRIPT = $(CPU)/_common_bf548/bf548elf.ld + diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf548/jsp_ezkit_bf548.dpj b/uzume_prototype/kernel/config/blackfin/ezkit_bf548/jsp_ezkit_bf548.dpj new file mode 100644 index 0000000..3e4d2e9 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf548/jsp_ezkit_bf548.dpj @@ -0,0 +1,633 @@ + + + + + ADSP-BF548 + .dlb + Library file + + + + + .\Debug + . + 0 + + + + + + + + + + + + + + + + + + + + + + + .\Release + . + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + . + + + + + .\Release + . + + + + + + + + + + + diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf548/readme.txt b/uzume_prototype/kernel/config/blackfin/ezkit_bf548/readme.txt new file mode 100644 index 0000000..5b8b0ac --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf548/readme.txt @@ -0,0 +1,13 @@ +Analog Devices製 EZ-KIT Lite BF548対応システム依存部。 + +sys_config.hとsys_defs.hは、#include_nextを使って、それぞれblackfin/_common_bf508/sys_config.h +とblackfin/_common_bf548/sys_defs.hを読み込んでいる。 + +Makefile.configは、インクルード・パスおよびソースファイルへのパスとしてblackfin/_common_bf548も +指定している。 + +- Makefile.config : gnu環境のためのシステム依存部定義ファイル +- readme.txt : このファイル +- sys_config.h : システム依存部のうち、アプリケーションから見えない宣言 +- sys_defs.h : システム依存部のうち、アプリケーションから見える宣言 + diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf548/readme_gcc_build_sample1.txt b/uzume_prototype/kernel/config/blackfin/ezkit_bf548/readme_gcc_build_sample1.txt new file mode 100644 index 0000000..d86d8c2 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf548/readme_gcc_build_sample1.txt @@ -0,0 +1,6 @@ +【注意】 +gcc環境でBF548 EZ-KITのsample1をビルドする場合、sample1.hのTASK_PORTID定義を変更すること。 + +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ + +EZ-KITでは、UART1が割り当てられているため、出力先を変更しなくてはならないためである。 diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf548/sys_config.h b/uzume_prototype/kernel/config/blackfin/ezkit_bf548/sys_config.h new file mode 100644 index 0000000..497d8ed --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf548/sys_config.h @@ -0,0 +1,188 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2009 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * Copyright (C) 2010,2011 by Kaneko System Co., Ltd. + * + * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +#ifndef _SYS_CONFIG_H_ +#define _SYS_CONFIG_H_ + + +/* + * カーネルの内部識別名のリネーム + */ +#include + +#include + +/* + * ターゲットシステム依存モジュール(EZKIT-BF548用) + * + * このインクルードファイルは,t_config.h のみからインクルードされる. + * 他のファイルから直接インクルードしてはならない. +*/ + +/* + * ADSP-BF548に依存せず、ボードへの実装によって決まるパラメータを + * ここで定義する。 + */ + + +/* + * どのようなクロック入力にも対応できるよう、以下でCSEL, SSEL, MSELの値 + * とクロック入力周波数(Hz)を指定する。PLLのプログラムはsys_config.cの + * sys_initialize()関数で行われる。 + * + * CSELVALは1,2,4,8の中から選ぶ。CLKINの単位はHz + */ + +#define CSELVAL 1 +#define SSELVAL 4 +#define MSELVAL 21 +#define CLKIN 25000000 + +/* + * TIC用タイマーの選択 + * USE_TIC_COREをdefineすると、COREタイマーが使用される + * コメントアウトすると、GP_TIMER_2を使用する + * + * COREタイマーはwakeup信号を生成しないため、ディスパッチャ + * はidle命令を使ってCOREタイマーイベントを待つことができない。 + * そのため、USE_TIC_COREを使うとディスパッチャはidle命令を + * 使わずに割り込み発生をポーリングで待つ。これは消費電力の + * 点で不利である。 + * + */ +//#define USE_TIC_CORE + +/* + * ハードウェア・エラー割り込みの許可 + * QUICK_HW_ERRORをdefineすると、ハードウェア・エラー・イベント + * が即座に受理される。defineしない場合には、割り込み待ち状態で + * ハードウェア・エラー・割り込みが発生した場合、次の割り込みまで + * 待たされることになる。 + * + */ +//#define QUICK_HW_ERROR + + +/* + * 実行時初期化関数の使用 + * + * マクロ USE_RUNTIME_INIT を定義すると、start.asmのなかで _mi_initialize + * を呼び出す。この関数はノーブートモードで起動するときにのみ必要になるので + * 通常は USE_RUNTIME_INITを使う必要はない。 + * 詳細はADIのEE239に詳しい。http://tinyurl.com/2hpbk (tinyURL) + * +*/ +//#define USE_RUNTIME_INIT + +/* + * カーネル管理外割り込みの宣言 + * + * マクロUNMANAGED_INTはカーネル管理外割り込みを宣言する。この + * マクロは16ビットのビットマップになっており、以下にあるパターン + * のうちひとつを使う。なお、どのようなパターンを選んでもNMIは管理外 + * 割込みとして扱われる。 + * UNMANAGED_INTを宣言しない場合、NMIだけが管理外割込みとして扱われる。 + * +*/ +//#define UNMANAGED_INT 0x0020 // IVHWがカーネル管理外. +//#define UNMANAGED_INT 0x0060 // IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x00E0 // IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x01E0 // IVG8 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x03E0 // IVG9 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x07E0 // IVG10 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x0FE0 // IVG11 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x1FE0 // IVG12 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x3FE0 // IVG13 ... IVG7, IVTMRとIVHWがカーネル管理外. + +/* + * C++関連資源を用意する + * + * マクロINIT_C_PLUS_PLUSを定義すると、C++言語用のテーブルを + * 初期化コードを実行する。また、C++言語用のテーブルを宣言する + * +*/ +//#define INIT_C_PLUS_PLUS + +/* + * 起動メッセージのターゲットシステム名 + */ +#define TARGET_NAME "EZ-KIT Lite BF548" + + +/* + * シリアルポート数の定義 + * TNUM_SIOP_XXXは、UARTの種別ごとに宣言する。 + * TNUM_SIOP_UARTはBF548内蔵UARTのうち、PDICが使用するもの。 + * BF548はUARTを4つもっているが、UART2,3は割り込みをサポートしていないので、 + * ふたつに限定する。よって、2,1か0を宣言する。 + * TNUM_PORTは、TNUM_SIOP_XXXのうち、GDICが使用するものの総和。 + * uart.cで使う。 + */ +#define TNUM_PORT 2 /* GDICがサポートするシリアルポートの数 */ +#define TNUM_SIOP_UART 2 /* PIDCがサポートするシリアルポートの数 */ + +/* + * シリアルポート番号に関する定義 + * ログタスクがシリアルポートを使わない場合は無視していい。 + */ +#define LOGTASK_PORTID 2 /* システムログに用いるシリアルポート番号 */ + +/* UART0のボーレート. */ +#define UART0_BAUD_RATE 57600 /* 57600 bps*/ +#define UART1_BAUD_RATE 57600 /* 57600 bps*/ + +/* + * PLLの初期化の強制 + * PLLは、PLL_CTLレジスタがデフォルト値で、かつ、SDRAMコントローラが + * ディセーブルのときに限り初期化を行うようになっている。これは、ブート + * ローダーなどの初期化ソフトがSDRAMを初期化したときにそれを保護するため + * である。一方でVisualDSP++のデバッガはSDRAMを自分で初期化するため、 + * この機能とうまく折り合いがつかない場合がある。 + * 上京に関わらず常に初期化したい時には FORCE_PLL_INITIALIZE マクロを + * 宣言する。 + */ +#define FORCE_PLL_INITIALIZE + +#endif /* _SYS_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/ezkit_bf548/sys_defs.h b/uzume_prototype/kernel/config/blackfin/ezkit_bf548/sys_defs.h new file mode 100644 index 0000000..c4d3b20 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/ezkit_bf548/sys_defs.h @@ -0,0 +1,76 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2009 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * Copyright (C) 2010,2011 by Kaneko System Co., Ltd. + * + * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +/* + * ターゲットシステムに依存する定義(EZ Kit Lite-BF548用) + * + * このインクルードファイルは,kernel.h と sil.h でインクルードされる. + * 他のファイルから直接インクルードすることはない.このファイルをイン + * クルードする前に,t_stddef.h と itron.h がインクルードされるので, + * それらに依存してもよい. + */ + +#ifndef _SYS_DEFS_H_ +#define _SYS_DEFS_H_ + +#include + + /* システム略称 */ +#define EZKIT_BF548 + + +/* + * 破壊性読み出しレジスタの判別式 + * 与えられたアドレス iop が破壊性読み出しレジスタの + * 場合には真を返す。 + * + * ADSP-BF548の内蔵ペリフェラルについて考慮する必要はない + * 宣言しない場合は、デフォルトで外部ペリフェラルはすべて + * 破壊性読み出しとして扱われる + */ +// #define DESTRUCTIVE_READ( iop ) (iop<(VP)0xF0000000) + + +#endif /* _SYS_DEFS_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/kobanzame/Makefile.config b/uzume_prototype/kernel/config/blackfin/kobanzame/Makefile.config new file mode 100644 index 0000000..f8d5b4f --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/kobanzame/Makefile.config @@ -0,0 +1,25 @@ +# +# Makefile のターゲットシステム依存部(BF533CB用) +# + +# +# コンパイルオプション +# +INCLUDES := $(INCLUDES) -I$(SRCDIR)/config/$(CPU)/$(SYS) \ + -I$(SRCDIR)/config/$(CPU)/_common_bf533 \ + -I$(SRCDIR)/pdic/simple_sio +COPTS := $(COPTS) +LDFLAGS := $(LDFLAGS) + +# +# カーネルに関する定義 +# +KERNEL_DIR := $(KERNEL_DIR) :$(SRCDIR)/config/$(CPU)/$(SYS) :$(SRCDIR)/config/$(CPU)/_common_bf533 :$(SRCDIR)/pdic/simple_sio +KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) +KERNEL_COBJS := $(KERNEL_COBJS) chip_config.o uart.o chip_debugboot.o chip_dump.o + + +# +# リンカスクリプトの定義 +# +LDSCRIPT = $(CPU)/_common_bf533/bf533elf.ld diff --git a/uzume_prototype/kernel/config/blackfin/kobanzame/readme.txt b/uzume_prototype/kernel/config/blackfin/kobanzame/readme.txt new file mode 100644 index 0000000..df9d78a --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/kobanzame/readme.txt @@ -0,0 +1,12 @@ +J-Person製 J-DSP-BF533SEB (KOBANZAME) 対応システム依存部。 + +sys_config.hとsys_defs.hは、#include_nextを使って、それぞれblackfin/_common_bf533/sys_config.h +とblackfin/_common_bf533/sys_defs.hを読み込んでいる。 + +Makefile.configは、インクルード・パスおよびソースファイルへのパスとしてblackfin/_common_bf533も +指定している。 + +- Makefile.config : gnu環境のためのシステム依存部定義ファイル +- readme.txt : このファイル +- sys_config.h : システム依存部のうち、アプリケーションから見えない宣言 +- sys_defs.h : システム依存部のうち、アプリケーションから見える宣言 \ No newline at end of file diff --git a/uzume_prototype/kernel/config/blackfin/kobanzame/sys_config.h b/uzume_prototype/kernel/config/blackfin/kobanzame/sys_config.h new file mode 100644 index 0000000..3aae624 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/kobanzame/sys_config.h @@ -0,0 +1,168 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +#ifndef _SYS_CONFIG_H_ +#define _SYS_CONFIG_H_ + + +/* + * カーネルの内部識別名のリネーム + */ +#include + + +/* blackfin/_common_bf533から読み込む */ +#include + +/* + * ターゲットシステム依存モジュール(KOBANZAME用) + * + * このインクルードファイルは,t_config.h のみからインクルードされる. + * 他のファイルから直接インクルードしてはならない. +*/ + +/* + * どのようなクロック入力にも対応できるよう、以下でCSEL, SSEL, MSELの値 + * とクロック入力周波数(Hz)を指定する。PLLのプログラムはsys_config.cの + * sys_initialize()関数で行われる。 + * + * CSELVALは1,2,4,8の中から選ぶ。CLKINの単位はHz + */ + +#define CSELVAL 1 +#define SSELVAL 4 +#define MSELVAL 25 +#define CLKIN 20000000 + + +/* + * ハードウェア・エラー割り込みの許可 + * QUICK_HW_ERRORをdefineすると、ハードウェア・エラー・イベント + * が即座に受理される。defineしない場合には、割り込み待ち状態で + * ハードウェア・エラー・割り込みが発生した場合、次の割り込みまで + * 待たされることになる。 + * + */ +//#define QUICK_HW_ERROR + + +/* + * 実行時初期化関数の使用 + * + * マクロ USE_RUNTIME_INIT を定義すると、start.asmのなかで _mi_initialize + * を呼び出す。この関数はノーブートモードで起動するときにのみ必要になるので + * 通常は USE_RUNTIME_INITを使う必要はない。 + * 詳細はADIのEE239に詳しい。http://tinyurl.com/2hpbk (tinyURL) + * +*/ +//#define USE_RUNTIME_INIT + +/* + * カーネル管理外割り込みの宣言 + * + * マクロUNMANAGED_INTはカーネル管理外割り込みを宣言する。この + * マクロは16ビットのビットマップになっており、以下にあるパターン + * のうちひとつを使う。なお、どのようなパターンを選んでもNMIは管理外 + * 割込みとして扱われる。 + * UNMANAGED_INTを宣言しない場合、NMIだけが管理外割込みとして扱われる。 + * +*/ +//#define UNMANAGED_INT 0x0020 // IVHWがカーネル管理外. +//#define UNMANAGED_INT 0x0060 // IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x00E0 // IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x01E0 // IVG8 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x03E0 // IVG9 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x07E0 // IVG10 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x0FE0 // IVG11 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x1FE0 // IVG12 ... IVG7, IVTMRとIVHWがカーネル管理外. +//#define UNMANAGED_INT 0x3FE0 // IVG13 ... IVG7, IVTMRとIVHWがカーネル管理外. + +/* + * C++関連資源を用意する + * + * マクロINIT_C_PLUS_PLUSを定義すると、C++言語用のテーブルを + * 初期化コードを実行する。また、C++言語用のテーブルを宣言する + * +*/ +// #define INIT_C_PLUS_PLUS + +/* + * 起動メッセージのターゲットシステム名 + */ +#define TARGET_NAME "KOBANZAME (J-DSP-BF533SEB)" + + +/* + * シリアルポート数の定義 + * TNUM_SIOP_XXXは、UARTの種別ごとに宣言する。 + * TNUM_SIOP_UARTはBF533内蔵UARTのうち、PDICが使用するもの。 + * BF533はUARTをひとつしかもっていないので、1か0を宣言する。 + * TNUM_PORTは、TNUM_SIOP_XXXのうち、GDICが使用するものの総和。 + * uart.cで使う。 + */ +#define TNUM_PORT 1 /* GDICがサポートするシリアルポートの数 */ +#define TNUM_SIOP_UART 1 /* PIDCがサポートするシリアルポートの数 */ + +/* + * シリアルポート番号に関する定義 + * ログタスクがシリアルポートを使わない場合は無視していい。 + */ +#define LOGTASK_PORTID 1 /* システムログに用いるシリアルポート番号 */ + +/* UART0のボーレート. */ +#define UART0_BAUD_RATE 57600 /* 57600 baud */ + +/* + * PLLの初期化の強制 + * PLLは、PLL_CTLレジスタがデフォルト値で、かつ、SDRAMコントローラが + * ディセーブルのときに限り初期化を行うようになっている。これは、ブート + * ローダーなどの初期化ソフトがSDRAMを初期化したときにそれを保護するため + * である。一方でVisualDSP++のデバッガはSDRAMを自分で初期化するため、 + * この機能とうまく折り合いがつかない場合がある。 + * 状況に関わらず常に初期化したい時には FORCE_PLL_INITIALIZE マクロを + * 宣言する。 + */ +// #deinfe FORCE_PLL_INITIALIZE + +#endif /* _SYS_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/kobanzame/sys_defs.h b/uzume_prototype/kernel/config/blackfin/kobanzame/sys_defs.h new file mode 100644 index 0000000..7a540f4 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/kobanzame/sys_defs.h @@ -0,0 +1,81 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +/* + * ターゲットシステムに依存する定義(BF533CB用) + * + * このインクルードファイルは,kernel.h と sil.h でインクルードされる. + * 他のファイルから直接インクルードすることはない.このファイルをイン + * クルードする前に,t_stddef.h と itron.h がインクルードされるので, + * それらに依存してもよい. + */ + +#ifndef _SYS_DEFS_H_ +#define _SYS_DEFS_H_ + +/* blackfin/_common_bf533から読む */ +#include + + /* システム略称  jsp/doc/config.txtの 2.(8)を参照 */ +#define KOBANZAME + + +/* + * タイムティックの定義 + */ +#define TIC_NUME 1u /* タイムティックの周期の分子 */ +#define TIC_DENO 1u /* タイムティックの周期の分母 */ + +/* + * 破壊性読み出しレジスタの判別式 + * 与えられたアドレス iop が破壊性読み出しレジスタの + * 場合には真を返す。 + * + * ADSP-BF533の内蔵ペリフェラルについて考慮する必要はない + * 宣言しない場合は、デフォルトで外部ペリフェラルはすべて + * 破壊性読み出しとして扱われる + */ +// #define DESTRUCTIVE_READ( iop ) (iop<(VP)0xF0000000) + +#endif /* _SYS_DEFS_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/makeoffset.c b/uzume_prototype/kernel/config/blackfin/makeoffset.c new file mode 100644 index 0000000..8714efa --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/makeoffset.c @@ -0,0 +1,74 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2004 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: makeoffset.c,v 1.1 2009/01/31 13:26:27 suikan Exp $ + */ + +#include "jsp_kernel.h" +#include "task.h" + +#undef offsetof +#define offsetof(structure, field) \ + ((INT) &(((structure *) 0)->field)) + +#define OFFSET_DEF(TYPE, FIELD) \ + Asm("OFFSET_DEF " #TYPE "_" #FIELD " = %0" \ + : /* no output */ \ + : "g"(offsetof(TYPE, FIELD))) + +#define OFFSET_DEF2(TYPE, FIELD, FIELDNAME) \ + Asm("OFFSET_DEF " #TYPE "_" #FIELDNAME " = %0" \ + : /* no output */ \ + : "g"(offsetof(TYPE, FIELD))) + +void +makeoffset() +{ + OFFSET_DEF(TCB, texptn); + OFFSET_DEF2(TCB, tskctxb.sp, sp); + OFFSET_DEF2(TCB, tskctxb.pc, pc); +} + +UW BIT_REF_4 = 0x12345678; +UH BIT_REF_2 = 0x1234; +UB BIT_REF_1 = 0x12; + +TCB BIT_LB_TCB_enatex = { + { NULL, NULL }, NULL, 0, 0, + FALSE, FALSE, TRUE, + 0, NULL, { NULL, NULL } + }; diff --git a/uzume_prototype/kernel/config/blackfin/readme.txt b/uzume_prototype/kernel/config/blackfin/readme.txt new file mode 100644 index 0000000..5324234 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/readme.txt @@ -0,0 +1,2 @@ +ドキュメントはsourceforgeを参照されたい。 +http://sourceforge.jp/projects/toppersjsp4bf/ diff --git a/uzume_prototype/kernel/config/blackfin/saverestore.h b/uzume_prototype/kernel/config/blackfin/saverestore.h new file mode 100644 index 0000000..a0f6bfa --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/saverestore.h @@ -0,0 +1,103 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + */ + +// Save task registers except P0. +#define save_regs\ + link 0;\ + [--SP] = (R7:0,P5:1);\ + [--SP] = I3;\ + [--SP] = I2;\ + [--SP] = I1;\ + [--SP] = I0;\ + [--SP] = M3;\ + [--SP] = M2;\ + [--SP] = M1;\ + [--SP] = M0;\ + [--SP] = B3;\ + [--SP] = B2;\ + [--SP] = B1;\ + [--SP] = B0;\ + [--SP] = L3;\ + [--SP] = L2;\ + [--SP] = L1;\ + [--SP] = L0;\ + [--SP] = A0.x;\ + [--SP] = A0.w;\ + [--SP] = A1.x;\ + [--SP] = A1.w;\ + [--SP] = LC1;\ + [--SP] = LC0;\ + [--SP] = LT1;\ + [--SP] = LT0;\ + [--SP] = LB1;\ + [--SP] = LB0;\ + [--SP] = ASTAT;\ + LOADLABEL( p1, _event_fp )\ + [P1]=FP + +// Save task registers except P0. +#define restore_regs\ + ASTAT=[SP++];\ + LB0 = [SP++];\ + LB1 = [SP++];\ + LT0 = [SP++];\ + LT1 = [SP++];\ + LC0 = [SP++];\ + LC1 = [SP++];\ + A1.w = [SP++];\ + A1.x = [SP++];\ + A0.w = [SP++];\ + A0.x = [SP++];\ + L0 = [SP++];\ + L1 = [SP++];\ + L2 = [SP++];\ + L3 = [SP++];\ + B0 = [SP++];\ + B1 = [SP++];\ + B2 = [SP++];\ + B3 = [SP++];\ + M0 = [SP++];\ + M1 = [SP++];\ + M2 = [SP++];\ + M3 = [SP++];\ + I0 = [SP++];\ + I1 = [SP++];\ + I2 = [SP++];\ + I3 = [SP++];\ + (R7:0,P5:1) = [SP++];\ + unlink + diff --git a/uzume_prototype/kernel/config/blackfin/start.S b/uzume_prototype/kernel/config/blackfin/start.S new file mode 100644 index 0000000..ee2d89b --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/start.S @@ -0,0 +1,279 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + + +#define _MACRO_ONLY + +/* + * カーネル用のスタートアップモジュール(BLACKfin用) + */ + +#include "jsp_kernel.h" + + + + // 割込み、例外からの戻りをリクエストする例外引数 +#define RETURNREQ 0xf + // コアタイマーレジスタのアドレス +#define TCNTL 0xFFE03000 + + // 32bit レジスタに即値をロードするマクロ +#ifdef __GNUC__ +#define LOADLABEL( reg, value32 ) reg##.h = value32; reg##.l = value32; +#define LOADVALUE( reg, value32 ) reg##.h = ( value32 >> 16 ) &0xFFFF; reg##.l = value32 & 0xFFFF; +#elif defined(__ECC__) +#define LOADVALUE( reg, value32 ) reg##.h = hi(value32); reg##.l = lo(value32); +#define LOADLABEL LOADVALUE +#else +#error "Compiler is not supported" +#endif + + +#include "saverestore.h" + + + +#ifdef __GNUC__ +.section .start, "ax"; +.extern _boot_for_gdb; +.extern __bss_start, __bss_end; +.extern __init; +#elif defined(__ECC__) +.section program; +#else +#error "Compiler is not supported" +#endif + +.global start; +.extern _exc_vector; +.extern ldf_stack_end; +.extern _kernel_start; +.extern _reqflg; +.extern expEntry; +.extern nmiEntry; +.extern ivHWEntry; +.extern ivTMREntry; +.extern ivg7Entry; +.extern ivg8Entry; +.extern ivg9Entry; +.extern ivg10Entry; +.extern ivg11Entry; +.extern ivg12Entry; +.extern ivg13Entry; +.extern ivg14Entry; + +#ifdef USE_RUNTIME_INIT +.extern _mi_initialize; +#endif + +start: + R0 = 0; + LC0 = R0; + LC1 = R0; + L0 = R0; + L1 = R0; + L2 = R0; + L3 = R0; + LOADLABEL( p0, ldf_stack_end ) + sp = p0; +#ifdef __GNUC__ // bss領域の初期化 + LOADLABEL( r0, __bss_start) // bss開始番地 + LOADLABEL( r1, __bss_end ) + r2 = r1 - r0; // bssのサイズ + p0 = r0; // 開始アドレス + p2 = r2; + r0 = 0; + loop bssfill lc0 = p2; +loop_begin bssfill + b[p0++] = r0; +loop_end bssfill; + // boot_for_gdb()は定義されているか。 + LOADLABEL( p0, _boot_for_gdb ) + cc = p0 == 0; + if cc jump skip_boot_for_gdb; // 定義されていないならスキップ + sp += -12; + call (p0); // gdbでロードしたときにリセットを確実にするためのコード + sp += 12; +skip_boot_for_gdb: +#elif defined(__ECC__) +#else +#error "Compiler is not supported" +#endif + + // コアタイマーをディセーブルする + LOADVALUE( p0, TCNTL ) + r0 = 0; + [p0] = r0; + + +#ifdef USE_RUNTIME_INIT // board_config.h を参照 + sp += -12; + call _mi_initialize; // テーブル初期化 + sp += 12; + cc = r0; // 返り値をチェック +invalid : + if cc jump invalid; // 非0ならエラー +#endif + // TOPPERS/JSP for BLACKfinは emu,rst,nmiを管理しない + LOADVALUE( p0,__EVT0+2*4) // NMIベクトル + p1 = 4; + + + LOADLABEL( r0, nmiEntry ) // NMI + [p0++p1] = r0; + + LOADLABEL( r0, expEntry) // EXP + [p0++p1] = r0; + + p0 = p0+p1; // 予約領域をスキップ + + LOADLABEL( r0, ivHWEntry) // ハードウェアエラー + [p0++p1] = r0; + + LOADLABEL( r0, ivTMREntry) // タイマー + [p0++p1] = r0; + + LOADLABEL( r0, ivg7Entry) // IVG7 + [p0++p1] = r0; + + LOADLABEL( r0, ivg8Entry) // IVG8 + r0.H = ivg8Entry; + [p0++p1] = r0; + + LOADLABEL( r0, ivg9Entry) // IVG9 + [p0++p1] = r0; + + LOADLABEL( r0, ivg10Entry) // IVG10 + [p0++p1] = r0; + + LOADLABEL( r0, ivg11Entry) // IVG11 + [p0++p1] = r0; + + LOADLABEL( r0, ivg12Entry) // IVG12 + [p0++p1] = r0; + + LOADLABEL( r0, ivg13Entry) // IVG13 + [p0++p1] = r0; + + LOADLABEL( r0, ivg14Entry) // IVG14 + [p0++p1] = r0; + + LOADLABEL( r0, task_level) // IVG15はタスクに遷移するためのエントリー + [p0++p1] = r0; + + LOADLABEL( p2, user) // ダミーの戻り番地を設定 + reti = p2; + csync; + raise 15; // IVG15を生起する。割り込みは遅延発生する。 + + r0 = 0xC01F(z); // IVG15を受付可能に(CPUロック状態) + sti r0; + + // ここからIVG15への遷移が始まる。rti命令を実行するたびに、IPENDに + // 基づいてイベント・レベルが落ちていくが、レベルにかかわらず戻り番地は + // retiレジスタの値、つまり user: である。結局、user:からrti;命令までの + // ループを繰り返す。最終的にユーザー・レベルに戻ると、今度はトリガーを + // かけていたIVG15による遅延割り込みが発生して task_level:へとジャンプする。 +user: + csync; + rti; // ユーザーモードへ遷移する + +task_level: // ここからタスクの実行順位 + r0 = syscfg; + r1 = 0x6; // セルフ・ネスティング割込み及びCYCLESカウンタ + r0 = r0 | r1; + syscfg = r0; // セルフ・ネストを有効に + + sp += -12; +#ifdef __GNUC__ /* GCC */ + call.x __init; /* 大域オブジェクトを初期化 */ +#elif defined(__ECC__) /* VisualDSP++ */ +#ifdef INIT_C_PLUS_PLUS + r0 = 0; + r1 = 0; + call.x ___ctorloop; +#endif +#else +#error "Compiler is not supported" +#endif + + [--sp] = reti; // 戻り番地を捨てて割り込み可能にする + jump.x _kernel_start; // kernel_stgart()からは戻ってこない + csync; +start.end: + + + + + + + +#ifdef __GNUC__ +#elif defined(__ECC__) + +#ifdef INIT_C_PLUS_PLUS +.section ctor; + .align 4; +___ctor_table: + .byte4=0; +.global ___ctor_table; +.type ___ctor_table,STT_OBJECT; +.extern ___ctorloop; +.section .gdt; + .align 4; +___eh_gdt: +.global ___eh_gdt; + .byte4=0; +.type ___eh_gdt,STT_OBJECT; +.section .frt; + .align 4; +___eh_frt: +.global ___eh_frt; + .byte4=0; +.type ___eh_frt,STT_OBJECT; +#endif /* INIT_C_PLUS_PLUS */ + +#else +#error "Compiler is not supported" +#endif + diff --git a/uzume_prototype/kernel/config/blackfin/tool_config.h b/uzume_prototype/kernel/config/blackfin/tool_config.h new file mode 100644 index 0000000..6488bf4 --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/tool_config.h @@ -0,0 +1,266 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + +/* + * 開発環境依存モジュール + * + * このインクルードファイルは,t_config.h のみからインクルードされる. + * 他のファイルから直接インクルードしてはならない. + */ + +#ifndef _TOOL_CONFIG_H_ +#define _TOOL_CONFIG_H_ + +/* + * ラベルの別名を定義するためのマクロ + * config.txtによるとこのマクロは定義できないときには定義しなくていい。 + * VDSP++3.5 for 16bitでは定義できそうにないので止めておく。 + */ +//#define _LABEL_ALIAS(new_label, defined_label) asm(".globl " #new_label "\n" #new_label " = " #defined_label); +//#define LABEL_ALIAS(x, y) _LABEL_ALIAS(x, y) + +/* + * 開発環境依存の初期化は使用しない + * VisualDSP++は特に開発環境依存の初期化を必要としない。 + */ +#define tool_initialize() + +/* + * atexit の処理とデストラクタの実行は行わない + * VisualDSP++は特に開発環境依存の終了処理を必要としない。 + */ +#define call_atexit() + + +/* + * __EMPTY_LABEL + * VisualDSP++3.5は長さ0の配列宣言を受け付けるが、領域を確保する + * JSP 1.4で長さ0の配列を作る理由がわからないので何も定義しないでおく。 + */ + + + +/* + * トレースログの設定 + */ + +#define LOG_INH_ENTER(inhno) /* プロセッサ依存部 */ +#define LOG_INH_LEAVE(inhno) /* プロセッサ依存部 */ + +#define LOG_ISR_ENTER(intno) /* プロセッサ依存部 */ +#define LOG_ISR_LEAVE(intno) /* プロセッサ依存部 */ + +#define LOG_CYC_ENTER(cyccb) +#define LOG_CYC_LEAVE(cyccb) + +#define LOG_EXC_ENTER(excno) /* プロセッサ依存部 */ +#define LOG_EXC_LEAVE(excno) /* プロセッサ依存部 */ + +#define LOG_TEX_ENTER(texptn) +#define LOG_TEX_LEAVE(texptn) + +#define LOG_TSKSTAT(tcb) + +#define LOG_DSP_ENTER(tcb) /* プロセッサ依存部 */ +#define LOG_DSP_LEAVE(tcb) /* プロセッサ依存部 */ + +#define LOG_ACT_TSK_ENTER(tskid) +#define LOG_ACT_TSK_LEAVE(ercd) +#define LOG_IACT_TSK_ENTER(tskid) +#define LOG_IACT_TSK_LEAVE(ercd) +#define LOG_CAN_ACT_ENTER(tskid) +#define LOG_CAN_ACT_LEAVE(ercd) +#define LOG_EXT_TSK_ENTER() +#define LOG_TER_TSK_ENTER(tskid) +#define LOG_TER_TSK_LEAVE(ercd) +#define LOG_CHG_PRI_ENTER(tskid, tskpri) +#define LOG_CHG_PRI_LEAVE(ercd) +#define LOG_GET_PRI_ENTER(tskid, p_tskpri) +#define LOG_GET_PRI_LEAVE(ercd, tskpri) +#define LOG_SLP_TSK_ENTER() +#define LOG_SLP_TSK_LEAVE(ercd) +#define LOG_TSLP_TSK_ENTER(tmout) +#define LOG_TSLP_TSK_LEAVE(ercd) +#define LOG_WUP_TSK_ENTER(tskid) +#define LOG_WUP_TSK_LEAVE(ercd) +#define LOG_IWUP_TSK_ENTER(tskid) +#define LOG_IWUP_TSK_LEAVE(ercd) +#define LOG_CAN_WUP_ENTER(tskid) +#define LOG_CAN_WUP_LEAVE(ercd) +#define LOG_REL_WAI_ENTER(tskid) +#define LOG_REL_WAI_LEAVE(ercd) +#define LOG_IREL_WAI_ENTER(tskid) +#define LOG_IREL_WAI_LEAVE(ercd) +#define LOG_SUS_TSK_ENTER(tskid) +#define LOG_SUS_TSK_LEAVE(ercd) +#define LOG_RSM_TSK_ENTER(tskid) +#define LOG_RSM_TSK_LEAVE(ercd) +#define LOG_FRSM_TSK_ENTER(tskid) +#define LOG_FRSM_TSK_LEAVE(ercd) +#define LOG_DLY_TSK_ENTER(dlytim) +#define LOG_DLY_TSK_LEAVE(ercd) +#define LOG_RAS_TEX_ENTER(tskid, rasptn) +#define LOG_RAS_TEX_LEAVE(ercd) +#define LOG_IRAS_TEX_ENTER(tskid, rasptn) +#define LOG_IRAS_TEX_LEAVE(ercd) +#define LOG_DIS_TEX_ENTER() +#define LOG_DIS_TEX_LEAVE(ercd) +#define LOG_ENA_TEX_ENTER() +#define LOG_ENA_TEX_LEAVE(ercd) +#define LOG_SNS_TEX_ENTER() +#define LOG_SNS_TEX_LEAVE(state) +#define LOG_SIG_SEM_ENTER(semid) +#define LOG_SIG_SEM_LEAVE(ercd) +#define LOG_ISIG_SEM_ENTER(semid) +#define LOG_ISIG_SEM_LEAVE(ercd) +#define LOG_WAI_SEM_ENTER(semid) +#define LOG_WAI_SEM_LEAVE(ercd) +#define LOG_POL_SEM_ENTER(semid) +#define LOG_POL_SEM_LEAVE(ercd) +#define LOG_TWAI_SEM_ENTER(semid, tmout) +#define LOG_TWAI_SEM_LEAVE(ercd) +#define LOG_SET_FLG_ENTER(flgid, setptn) +#define LOG_SET_FLG_LEAVE(ercd) +#define LOG_ISET_FLG_ENTER(flgid, setptn) +#define LOG_ISET_FLG_LEAVE(ercd) +#define LOG_CLR_FLG_ENTER(flgid, clrptn) +#define LOG_CLR_FLG_LEAVE(ercd) +#define LOG_WAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn) +#define LOG_WAI_FLG_LEAVE(ercd, flgptn) +#define LOG_POL_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn) +#define LOG_POL_FLG_LEAVE(ercd, flgptn) +#define LOG_TWAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn, tmout) +#define LOG_TWAI_FLG_LEAVE(ercd, flgptn) +#define LOG_SND_DTQ_ENTER(dtqid, data) +#define LOG_SND_DTQ_LEAVE(ercd) +#define LOG_PSND_DTQ_ENTER(dtqid, data) +#define LOG_PSND_DTQ_LEAVE(ercd) +#define LOG_IPSND_DTQ_ENTER(dtqid, data) +#define LOG_IPSND_DTQ_LEAVE(ercd) +#define LOG_TSND_DTQ_ENTER(dtqid, data, tmout) +#define LOG_TSND_DTQ_LEAVE(ercd) +#define LOG_FSND_DTQ_ENTER(dtqid, data) +#define LOG_FSND_DTQ_LEAVE(ercd) +#define LOG_IFSND_DTQ_ENTER(dtqid, data) +#define LOG_IFSND_DTQ_LEAVE(ercd) +#define LOG_RCV_DTQ_ENTER(dtqid, p_data) +#define LOG_RCV_DTQ_LEAVE(ercd, data) +#define LOG_PRCV_DTQ_ENTER(dtqid, p_data) +#define LOG_PRCV_DTQ_LEAVE(ercd, data) +#define LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout) +#define LOG_TRCV_DTQ_LEAVE(ercd, data) +#define LOG_SND_MBX_ENTER(mbxid, pk_msg) +#define LOG_SND_MBX_LEAVE(ercd) +#define LOG_RCV_MBX_ENTER(mbxid, ppk_msg) +#define LOG_RCV_MBX_LEAVE(ercd, pk_msg) +#define LOG_PRCV_MBX_ENTER(mbxid, ppk_msg) +#define LOG_PRCV_MBX_LEAVE(ercd, pk_msg) +#define LOG_TRCV_MBX_ENTER(mbxid, ppk_msg, tmout) +#define LOG_TRCV_MBX_LEAVE(ercd, pk_msg) +#define LOG_GET_MPF_ENTER(mpfid, p_blk) +#define LOG_GET_MPF_LEAVE(ercd, blk) +#define LOG_PGET_MPF_ENTER(mpfid, p_blk) +#define LOG_PGET_MPF_LEAVE(ercd, blk) +#define LOG_TGET_MPF_ENTER(mpfid, p_blk, tmout) +#define LOG_TGET_MPF_LEAVE(ercd, blk) +#define LOG_REL_MPF_ENTER(mpfid, blk) +#define LOG_REL_MPF_LEAVE(ercd) +#define LOG_SET_TIM_ENTER(p_systim) +#define LOG_SET_TIM_LEAVE(ercd) +#define LOG_GET_TIM_ENTER(p_systim) +#define LOG_GET_TIM_LEAVE(ercd, systim) +#define LOG_ISIG_TIM_ENTER() +#define LOG_ISIG_TIM_LEAVE(ercd) +#define LOG_STA_CYC_ENTER(cycid) +#define LOG_STA_CYC_LEAVE(ercd) +#define LOG_STP_CYC_ENTER(cycid) +#define LOG_STP_CYC_LEAVE(ercd) +#define LOG_ROT_RDQ_ENTER(tskpri) +#define LOG_ROT_RDQ_LEAVE(ercd) +#define LOG_IROT_RDQ_ENTER(tskpri) +#define LOG_IROT_RDQ_LEAVE(ercd) +#define LOG_GET_TID_ENTER(p_tskid) +#define LOG_GET_TID_LEAVE(ercd, tskid) +#define LOG_IGET_TID_ENTER(p_tskid) +#define LOG_IGET_TID_LEAVE(ercd, tskid) +#define LOG_LOC_CPU_ENTER() +#define LOG_LOC_CPU_LEAVE(ercd) +#define LOG_ILOC_CPU_ENTER() +#define LOG_ILOC_CPU_LEAVE(ercd) +#define LOG_UNL_CPU_ENTER() +#define LOG_UNL_CPU_LEAVE(ercd) +#define LOG_IUNL_CPU_ENTER() +#define LOG_IUNL_CPU_LEAVE(ercd) +#define LOG_DIS_DSP_ENTER() +#define LOG_DIS_DSP_LEAVE(ercd) +#define LOG_ENA_DSP_ENTER() +#define LOG_ENA_DSP_LEAVE(ercd) +#define LOG_SNS_CTX_ENTER() +#define LOG_SNS_CTX_LEAVE(state) +#define LOG_SNS_LOC_ENTER() +#define LOG_SNS_LOC_LEAVE(state) +#define LOG_SNS_DSP_ENTER() +#define LOG_SNS_DSP_LEAVE(state) +#define LOG_SNS_DPN_ENTER() +#define LOG_SNS_DPN_LEAVE(state) +#define LOG_VSNS_INI_ENTER() +#define LOG_VSNS_INI_LEAVE(state) +#define LOG_VXSNS_CTX_ENTER(p_excinf) +#define LOG_VXSNS_CTX_LEAVE(state) +#define LOG_VXSNS_LOC_ENTER(p_excinf) +#define LOG_VXSNS_LOC_LEAVE(state) +#define LOG_VXSNS_DSP_ENTER(p_excinf) +#define LOG_VXSNS_DSP_LEAVE(state) +#define LOG_VXSNS_DPN_ENTER(p_excinf) +#define LOG_VXSNS_DPN_LEAVE(state) +#define LOG_VXSNS_TEX_ENTER(p_excinf) +#define LOG_VXSNS_TEX_LEAVE(state) +#define LOG_VXGET_TIM_ENTER(p_sysutim) +#define LOG_VXGET_TIM_LEAVE(ercd, sysutim) + +#define LOG_CHG_IPM_ENTER(ipm) +#define LOG_CHG_IPM_LEAVE(ercd) +#define LOG_GET_IPM_ENTER(p_ipm) +#define LOG_GET_IPM_LEAVE(ercd, ipm) + +#endif /* _TOOL_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/config/blackfin/tool_defs.h b/uzume_prototype/kernel/config/blackfin/tool_defs.h new file mode 100644 index 0000000..5cfadfe --- /dev/null +++ b/uzume_prototype/kernel/config/blackfin/tool_defs.h @@ -0,0 +1,128 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * TOPPERS/JSP for Blackfin + * + * Copyright (C) 2004,2006,2006 by Takemasa Nakamura + * Copyright (C) 2004 by Ujinosuke + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * + */ + +/* + * 開発環境に依存する定義 + * + * このインクルードファイルは,t_stddef.h と itron.h の先頭でインクルー + * ドされる.他のファイルからは直接インクルードすることはない.他のイ + * ンクルードファイルに先立って処理されるため,他のインクルードファイ + * ルに依存してはならない. + */ + +#ifndef _TOOL_DEFS_H_ +#define _TOOL_DEFS_H_ + +/************************************************** +* +* GNU Tool Chain +* +***************************************************/ +#ifdef __GNUC__ /* GCC */ + +/* + * コンパイラ依存のデータ型の定義 + */ +#define _int8_ char /* 8ビットの整数型 */ +#define _int16_ short /* 16ビットの整数型 */ +#define _int32_ int /* 32ビットの整数型 */ +#define _int64_ long long /* 64ビットの整数型 */ + + // GCCを使う場合に、defbfxxx.h, cdefbf5xx.hを使えるようにするためのマクロ宣言 +#ifndef __ADSPLPBLACKFIN__ +#define __ADSPLPBLACKFIN__ +#endif + + +/* + * コンパイラの拡張機能のためのマクロ定義 + */ +#ifndef __cplusplus /* C++ には inline がある */ +#if __STDC_VERSION__ < 199901L /* C99 には inline がある */ +#define inline __inline__ +#endif /* __STDC_VERSION__ < 199901L */ +#endif /* __cplusplus */ + +#define Inline static inline + +#ifndef __cplusplus /* C++ には asm がある */ +#define asm __asm__ +#endif /* __cplusplus */ + +#define Asm __asm__ volatile + +/************************************************** +* +* VisualDSP++ +* +***************************************************/ +#elif defined(__ECC__) /* Visual DSP++ tool chain*/ + +/* + * コンパイラ依存のデータ型の定義 + */ +#define _int8_ char /* 8ビットの整数型 */ +#define _int16_ short /* 16ビットの整数型 */ +#define _int32_ int /* 32ビットの整数型 */ +#define _int64_ long long /* 64ビットの整数型 */ + + // ファイル内にしか適用しないインライン化 +#define Inline inline + + // インラインアセンブラ +#define Asm asm volatile + + +/************************************************** +* +* その他の環境 +* +***************************************************/ +#else +#error "Compiler is not supported" +#endif + + + + +#endif /* _TOOL_DEFS_H_ */ diff --git a/uzume_prototype/kernel/config/m68k/Makefile.config b/uzume_prototype/kernel/config/m68k/Makefile.config new file mode 100644 index 0000000..ad3094c --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/Makefile.config @@ -0,0 +1,37 @@ +# +# @(#) $Id: Makefile.config,v 1.1 2009/01/31 05:27:37 suikan Exp $ +# + +# +# Makefile のプロセッサ依存部(M68040用) +# + +# +# ターゲットアーキテクチャの定義 +# +TARGET = m68k-unknown-elf + +# +# コンパイルオプション +# +INCLUDES := $(INCLUDES) -I$(SRCDIR)/config/$(CPU) +COPTS := $(COPTS) -Wall -g -O2 -m68020-40 + +# +# カーネルに関する定義 +# +KERNEL_DIR := $(KERNEL_DIR):$(SRCDIR)/config/$(CPU) +KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) cpu_support.o +KERNEL_COBJS := $(KERNEL_COBJS) cpu_config.o + +# +# スタートアップモジュールに関する定義 +# +START_OBJS = start.o + +$(START_OBJS): %.o: %.S + $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $< + +$(START_OBJS:.o=.d): %.d: %.S + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \ + -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend diff --git a/uzume_prototype/kernel/config/m68k/cpu_config.c b/uzume_prototype/kernel/config/m68k/cpu_config.c new file mode 100644 index 0000000..d1726e6 --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/cpu_config.c @@ -0,0 +1,150 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2005 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: cpu_config.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * プロセッサ依存モジュール(M68040用) + */ + +#include "jsp_kernel.h" +#include "check.h" +#include "task.h" + +/* + * タスクコンテキストでの割込みマスク + */ +#ifdef SUPPORT_CHG_IPM +UH task_intmask; +#endif /* SUPPORT_CHG_IPM */ + +/* + * 非タスクコンテキストでの割込みマスク + */ +UH int_intmask; + +/* + * プロセッサ依存の初期化 + */ +void +cpu_initialize() +{ + /* + * タスクコンテキストでの割込みマスクの初期化 + */ +#ifdef SUPPORT_CHG_IPM + task_intmask = 0x0000; +#endif /* SUPPORT_CHG_IPM */ + + /* + * 例外ベクタテーブルの初期化 + */ +#ifdef EXCVT_KERNEL + memcpy(EXCVT_KERNEL, EXCVT_ORIG, EXCVT_LEN); + set_vbr(EXCVT_KERNEL); +#endif /* EXCVT_KERNEL */ +} + +/* + * プロセッサ依存の終了処理 + */ +void +cpu_terminate() +{ +#ifdef EXCVT_KERNEL + set_vbr(EXCVT_ORIG); +#endif /* EXCVT_KERNEL */ +} + +#ifdef SUPPORT_CHG_IPM + +/* + * 割込みマスクの変更 + * + * chg_ipm を使って IPM を 7(NMI 以外のすべての割込みを禁止)に変更 + * することはできない.NMI 以外のすべての割込みを禁止したい場合には, + * loc_cpu によりCPUロック状態にすればよい. + * IPM が 0 以外の時にも,タスクディスパッチは保留されない.IPM は, + * タスクディスパッチによって,新しく実行状態になったタスクへ引き継が + * れる.そのため,タスクが実行中に,別のタスクによって IPM が変更さ + * れる場合がある.JSPカーネルでは,IPM の変更はタスク例外処理ルーチ + * ンによっても起こるので,別のタスクによって IPM が変更されることに + * よって,扱いが難しくなる状況は少ないと思われる.IPM の値によってタ + * スクディスパッチを禁止したい場合には,dis_dsp を併用すればよい. + */ +SYSCALL ER +chg_ipm(IPM ipm) +{ + ER ercd; + + LOG_CHG_IPM_ENTER(ipm); + CHECK_TSKCTX_UNL(); + CHECK_PAR(0 <= ipm && ipm <= 6); + + t_lock_cpu(); + task_intmask = (ipm << 8); + ercd = E_OK; + t_unlock_cpu(); + + exit: + LOG_CHG_IPM_LEAVE(ercd); + return(ercd); +} + +/* + * 割込みマスクの参照 + */ +SYSCALL ER +get_ipm(IPM *p_ipm) +{ + ER ercd; + + LOG_GET_IPM_ENTER(p_ipm); + CHECK_TSKCTX_UNL(); + + t_lock_cpu(); + *p_ipm = (task_intmask >> 8); + ercd = E_OK; + t_unlock_cpu(); + + exit: + LOG_GET_IPM_LEAVE(ercd, *p_ipm); + return(ercd); +} + +#endif /* SUPPORT_CHG_IPM */ diff --git a/uzume_prototype/kernel/config/m68k/cpu_config.h b/uzume_prototype/kernel/config/m68k/cpu_config.h new file mode 100644 index 0000000..cfed431 --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/cpu_config.h @@ -0,0 +1,346 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: cpu_config.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * プロセッサ依存モジュール(M68040用) + * + * このインクルードファイルは,t_config.h のみからインクルードされる. + * 他のファイルから直接インクルードしてはならない. + */ + +#ifndef _CPU_CONFIG_H_ +#define _CPU_CONFIG_H_ + +/* + * カーネルの内部識別名のリネーム + */ +#include + +/* + * プロセッサの特殊命令のインライン関数定義 + */ +#ifndef _MACRO_ONLY +#include +#endif /* _MACRO_ONLY */ + +/* + * chg_ipm/get_ipm をサポートするかどうかの定義 + */ +#define SUPPORT_CHG_IPM + +/* + * TCB 中のフィールドのビット幅の定義 + * + * cpu_context.h に入れる方がエレガントだが,参照の依存性の関係で, + * cpu_context.h には入れられない. + */ +#define TBIT_TCB_TSTAT 8 /* tstat フィールドのビット幅 */ +#define TBIT_TCB_PRIORITY 8 /* priority フィールドのビット幅 */ + +#ifndef _MACRO_ONLY +/* + * タスクコンテキストブロックの定義 + */ +typedef struct task_context_block { + VP msp; /* スタックポインタ */ + FP pc; /* プログラムカウンタ */ +} CTXB; + +/* + * 割込みマスク操作ライブラリ + * + * 割込みマスク(intmask)は,IPM(Interrupt Priority Mask)を8ビット + * 左にシフトしたものである. + */ + +/* + * 現在の割込みマスクの読出し + */ +Inline UH +current_intmask() +{ + return(current_sr() & 0x0700); +} + +/* + * 割込みマスクの設定 + */ +Inline void +set_intmask(UH intmask) +{ + set_sr((current_sr() & ~0x0700) | intmask); +} + +/* + * システム状態参照 + */ + +Inline BOOL +sense_context() +{ + return((current_sr() & 0x1000) == 0); +} + +Inline BOOL +sense_lock() +{ + return(current_intmask() == 0x0700); +} + +#define t_sense_lock sense_lock +#define i_sense_lock sense_lock + +/* + * CPUロックとその解除(タスクコンテキスト用) + * + * task_intmask は,chg_ipm をサポートするための変数.chg_ipm をサポー + * トしない場合には,task_intmask が常に 0 になっていると考えればよい. + */ + +#ifdef SUPPORT_CHG_IPM +extern UH task_intmask; /* タスクコンテキストでの割込みマスク */ +#endif /* SUPPORT_CHG_IPM */ + +Inline void +t_lock_cpu() +{ + disint(); +} + +Inline void +t_unlock_cpu() +{ +#ifdef SUPPORT_CHG_IPM + /* + * t_unlock_cpu が呼び出されるのは CPUロック状態のみであるた + * め,処理の途中で task_intmask が書き換わることはない. + */ + set_intmask(task_intmask); +#else /* SUPPORT_CHG_IPM */ + enaint(); +#endif /* SUPPORT_CHG_IPM */ +} + +/* + * CPUロックとその解除(非タスクコンテキスト用) + */ + +extern UH int_intmask; /* 非タスクコンテキストでの割込みマスク */ + +Inline void +i_lock_cpu() +{ + UH intmask; + + /* + * 一時変数 intmask を使っているのは,current_intmask() を呼 + * んだ直後に割込みが発生し,起動された割込みハンドラ内で + * int_intmask が変更される可能性があるためである. + */ + intmask = current_intmask(); + disint(); + int_intmask = intmask; +} + +Inline void +i_unlock_cpu() +{ + set_intmask(int_intmask); +} + +/* + * タスクディスパッチャ + */ + +/* + * 最高優先順位タスクへのディスパッチ(cpu_support.S) + * + * dispatch は,タスクコンテキストから呼び出されたサービスコール処理 + * 内で,CPUロック状態で呼び出さなければならない. + */ +extern void dispatch(void); + +/* + * 現在のコンテキストを捨ててディスパッチ(cpu_support.S) + * + * exit_and_dispatch は,CPUロック状態で呼び出さなければならない. + */ +extern void exit_and_dispatch(void); + +/* + * 割込みハンドラ/CPU例外ハンドラの設定 + */ + +/* + * 例外ベクタテーブルの構造の定義 + */ +typedef struct exc_vector_entry { + FP exchdr; /* 例外ハンドラの起動番地 */ +} EXCVE; + +/* + * 割込みハンドラの設定 + * + * ベクトル番号 inhno の割込みハンドラの起動番地を inthdr に設定する. + */ +Inline void +define_inh(INHNO inhno, FP inthdr) +{ + EXCVE *excvt; + +#ifdef EXCVT_KERNEL + /* + * EXCVT_KERNEL が定義されている時は,初期化処理の中で VBR を + * EXCVT_KERNEL に設定するので,EXCVT_KERNEL を使う. + */ + excvt = (EXCVE *) EXCVT_KERNEL; +#else /* EXCVT_KERNEL */ + excvt = (EXCVE *) current_vbr(); +#endif /* EXCVT_KERNEL */ + excvt[inhno].exchdr = inthdr; +} + +/* + * CPU例外ハンドラの設定 + * + * ベクトル番号 excno のCPU例外ハンドラの起動番地を exchdr に設定する. + */ +Inline void +define_exc(EXCNO excno, FP exchdr) +{ + define_inh(excno, exchdr); +} + +/* + * 割込みハンドラ/CPU例外ハンドラの出入口処理 + */ + +/* + * 割込みハンドラの出入口処理の生成マクロ + * + * reqflg をチェックする前に割込みを禁止しないと,reqflg をチェック後 + * に起動された割込みハンドラ内でディスパッチが要求された場合に,ディ + * スパッチされない. + */ + +#define INTHDR_ENTRY(inthdr) \ +extern void inthdr##_entry(void); \ +asm(".text \n" \ +#inthdr "_entry: \n" \ +" movem.l %d0-%d1/%a0-%a1, -(%sp) \n" /* スクラッチレジスタを保存 */ \ +" jsr " #inthdr " \n" /* 割込みハンドラを呼び出す */ \ +" movem.l (%sp)+, %d0-%d1/%a0-%a1 \n" /* スクラッチレジスタを復帰 */ \ +" btst.b #4, (%sp) \n" /* 戻り先が割込みモードなら */ \ +" jbeq 1f \n" /* すぐにリターン */ \ +" or.w #0x0700, %sr \n" /* 割込み禁止 */ \ +" tst.l _kernel_reqflg \n" /* reqflg が TRUE であれば */ \ +" jbne _kernel_ret_int \n" /* ret_int へ */ \ +"1: rte \n") + +#define INT_ENTRY(inthdr) inthdr##_entry + +/* + * CPU例外ハンドラの出入口処理の生成マクロ + * + * CPU例外ハンドラは,非タスクコンテキストで実行する.そのため,CPU例 + * 外ハンドラを呼び出す前に割込みモードに移行し,リターンしてきた後に + * 元のモードに戻す.元のモードに戻すために,割込みモードに移行する前 + * の SR を割込みスタック上に保存する.CPU例外がタスクコンテキストで + * 発生し,reqflg が TRUE になった時に,ret_exc へ分岐する. + * reqflg をチェックする前に割込みを禁止しないと,reqflg をチェック後 + * に起動された割込みハンドラ内でディスパッチが要求された場合に,ディ + * スパッチされない. + */ + +#define EXCHDR_ENTRY(exchdr) \ +extern void exchdr##_entry(VP sp); \ +asm(".text \n" \ +#exchdr "_entry: \n" \ +" movem.l %d0-%d1/%a0-%a1, -(%sp) \n" /* スクラッチレジスタを保存 */ \ +" lea.l 16(%sp), %a0 \n" /* 例外フレームの先頭を A0 に */ \ +" move.w %sr, %d0 \n" /* SR を D0 に */ \ +" and.w #~0x1000, %sr \n" /* 割込みモード */ \ +" move.l %d0, -(%sp) \n" /* 元の SR をスタックに保存 */ \ +" move.l %a0, -(%sp) \n" /* A0 を引数として渡す */ \ +" jsr " #exchdr " \n" /* CPU例外ハンドラを呼び出す */ \ +" addq.l #4, %sp \n" \ +" move.l (%sp)+, %d0 \n" \ +" and.w #0x1000, %d0 \n" /* 元が割込みモードなら */ \ +" jbeq 1f \n" /* すぐにリターン */ \ +" or.w #0x1700, %sr \n" /* マスタモード・割込み禁止 */ \ +" tst.l _kernel_reqflg \n" /* reqflg が TRUE であれば */ \ +" jbne _kernel_ret_exc \n" /* ret_exc へ */ \ +"1: movem.l (%sp)+, %d0-%d1/%a0-%a1 \n" /* スクラッチレジスタを復帰 */ \ +" rte \n") + +#define EXC_ENTRY(exchdr) exchdr##_entry + +/* + * CPU例外の発生した時のシステム状態の参照 + */ + +/* + * CPU例外の発生した時のコンテキストの参照 + */ +Inline BOOL +exc_sense_context(VP p_excinf) +{ + return((*((UH *) p_excinf) & 0x1000) == 0); +} + +/* + * CPU例外の発生した時のCPUロック状態の参照 + */ +Inline BOOL +exc_sense_lock(VP p_excinf) +{ + return((*((UH *) p_excinf) & 0x0700) == 0x0700); +} + +/* + * プロセッサ依存の初期化 + */ +extern void cpu_initialize(void); + +/* + * プロセッサ依存の終了時処理 + */ +extern void cpu_terminate(void); + +#endif /* _MACRO_ONLY */ +#endif /* _CPU_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/config/m68k/cpu_context.h b/uzume_prototype/kernel/config/m68k/cpu_context.h new file mode 100644 index 0000000..8ef2838 --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/cpu_context.h @@ -0,0 +1,94 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: cpu_context.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * タスクコンテキスト操作ルーチン(M68040用) + * + * このファイルを cpu_config.h と分離しているのは,このファイルは TCB + * が定義された後に読む必要があるのに対して,cpu_config.h には TCB を + * 定義する前に読む必要がある定義を含んでいるためである. + */ + +#ifndef _CPU_CONTEXT_H_ +#define _CPU_CONTEXT_H_ + +#include "task.h" + +/* + * タスクコンテキストの初期化 + * + * タスクが休止状態に移行する時(タスクの生成時,タスクの終了時)に呼 + * ばれる.基本的には,タスクコンテキストをタスクが起動できる状態に設 + * 定する処理を,create_context と activate_context で行えばよい. + */ +Inline void +create_context(TCB *tcb) +{ +} + +/* + * タスクの起動準備 + * + * タスクが休止状態から実行できる状態に移行する時に呼ばれる. + */ +extern void activate_r(void); + +Inline void +activate_context(TCB *tcb) +{ + VW *sp; + + sp = (VW *)((SIZE)(tcb->tinib->stk) + tcb->tinib->stksz); + *--sp = (VW)(tcb->tinib->exinf); + *--sp = (VW) ext_tsk; + *--sp = (VW)(tcb->tinib->task); + tcb->tskctxb.msp = sp; + tcb->tskctxb.pc = activate_r; +} + +/* + * ext_tsk がスタック上に確保するダミー領域のサイズ + */ +#define ACTIVATED_STACK_SIZE (sizeof(VW) * 3) + +/* + * calltex は使用しない + */ +#define OMIT_CALLTEX + +#endif /* _CPU_CONTEXT_H_ */ diff --git a/uzume_prototype/kernel/config/m68k/cpu_defs.h b/uzume_prototype/kernel/config/m68k/cpu_defs.h new file mode 100644 index 0000000..a472b2b --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/cpu_defs.h @@ -0,0 +1,88 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2005 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: cpu_defs.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * プロセッサに依存する定義(M68040用) + * + * このインクルードファイルは,kernel.h と sil.h でインクルードされる. + * 他のファイルから直接インクルードすることはない.このファイルをイン + * クルードする前に,t_stddef.h と itron.h がインクルードされるので, + * それらに依存してもよい. + */ + +#ifndef _CPU_DEFS_H_ +#define _CPU_DEFS_H_ + +#define M68K /* プロセッサ略称 */ + +#ifndef _MACRO_ONLY + +/* + * 割込み/CPU例外ハンドラ番号の型 + */ +typedef UINT INHNO; /* 割込みハンドラ番号 */ +typedef UINT EXCNO; /* CPU例外ハンドラ番号 */ + +/* + * 割込みマスクの型と割込みマスクの変更/参照 + */ +typedef UINT IPM; /* 割込みマスク */ + +extern ER chg_ipm(IPM ipm) throw(); +extern ER get_ipm(IPM *p_ipm) throw(); + +/* + * 微少時間待ち + */ +Inline void +sil_dly_nse(UINT dlytim) +{ + register VW d0 asm("d0") = (VW) dlytim; + Asm("jsr _sil_dly_nse" : "=g"(d0) : "0"(d0)); +} + +#endif /* _MACRO_ONLY */ + +/* + * プロセッサのエンディアン + */ +#define SIL_ENDIAN SIL_ENDIAN_BIG /* ビッグエンディアン */ + +#endif /* _CPU_DEFS_H_ */ diff --git a/uzume_prototype/kernel/config/m68k/cpu_insn.h b/uzume_prototype/kernel/config/m68k/cpu_insn.h new file mode 100644 index 0000000..4cf7294 --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/cpu_insn.h @@ -0,0 +1,128 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: cpu_insn.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * プロセッサの特殊命令のインライン関数定義(M68040用) + */ + +#ifndef _CPU_INSN_H_ +#define _CPU_INSN_H_ + +/* + * ステータスレジスタ(SR)の現在値の読出し + */ +Inline UH +current_sr() +{ + UH sr; + + Asm("move.w %%sr, %0" : "=g"(sr)); + return(sr); +} + +/* + * ステータスレジスタ(SR)の現在値の変更 + */ +Inline void +set_sr(UH sr) +{ + Asm("move.w %0, %%sr" : : "g"(sr)); +} + +/* + * NMIを除くすべての割込みを禁止 + */ +Inline void +disint() +{ + Asm("or.w #0x0700, %sr"); +} + +/* + * すべての割込みを許可 + */ +Inline void +enaint() +{ + Asm("and.w #~0x0700, %sr"); +} + +/* + * ベクタベースレジスタ(VBR)の現在値の読出し + */ +Inline VP +current_vbr() +{ + VP vbr; + + Asm("movec.l %%vbr, %0" : "=r"(vbr)); + return(vbr); +} + +/* + * ベクタベースレジスタ(VBR)の設定 + */ +Inline void +set_vbr(VP vbr) +{ + Asm("movec.l %0, %%vbr" : : "r"(vbr)); +} + +/* + * レディキューサーチのためのビットマップサーチ関数 + * + * ビットマップの下位16ビットを使用し,最下位ビットを最低優先度に対応 + * させる. + */ +#define CPU_BITMAP_SEARCH +#define PRIMAP_BIT(pri) (0x8000u >> (pri)) + +Inline UINT +bitmap_search(UINT bitmap) +{ + UINT offset; + + /* + * このコードは,bitmap(UINT型)が32ビットであることを仮定し + * ている. + */ + Asm("bfffo %1{16,16}, %0" : "=d"(offset) : "g"(bitmap)); + return(offset - 16); +} + +#endif /* _CPU_INSN_H_ */ diff --git a/uzume_prototype/kernel/config/m68k/cpu_rename.def b/uzume_prototype/kernel/config/m68k/cpu_rename.def new file mode 100644 index 0000000..8ae3ce2 --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/cpu_rename.def @@ -0,0 +1,5 @@ +activate_r +ret_int +ret_exc +task_intmask +int_intmask diff --git a/uzume_prototype/kernel/config/m68k/cpu_rename.h b/uzume_prototype/kernel/config/m68k/cpu_rename.h new file mode 100644 index 0000000..87036b0 --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/cpu_rename.h @@ -0,0 +1,21 @@ +/* This file is generated from cpu_rename.def by genrename. */ + +#ifndef _CPU_RENAME_H_ +#define _CPU_RENAME_H_ + +#define activate_r _kernel_activate_r +#define ret_int _kernel_ret_int +#define ret_exc _kernel_ret_exc +#define task_intmask _kernel_task_intmask +#define int_intmask _kernel_int_intmask + +#ifdef LABEL_ASM + +#define _activate_r __kernel_activate_r +#define _ret_int __kernel_ret_int +#define _ret_exc __kernel_ret_exc +#define _task_intmask __kernel_task_intmask +#define _int_intmask __kernel_int_intmask + +#endif /* LABEL_ASM */ +#endif /* _CPU_RENAME_H_ */ diff --git a/uzume_prototype/kernel/config/m68k/cpu_support.S b/uzume_prototype/kernel/config/m68k/cpu_support.S new file mode 100644 index 0000000..184aa41 --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/cpu_support.S @@ -0,0 +1,192 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: cpu_support.S,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * プロセッサ依存モジュール アセンブリ言語部(M68040用) + */ + +#define _MACRO_ONLY +#include "jsp_kernel.h" +#include "offset.h" + +/* + * タスクディスパッチャ + * + * dispatch は,マスタモード・割込み禁止状態で呼び出さなければならな + * い.exit_and_dispatch も,マスタモード・割込み禁止状態で呼び出すの + * が原則であるが,カーネル起動時に対応するため,割込みモードで呼び出 + * した場合にも対応している. + */ + .text + .globl dispatch + .globl exit_and_dispatch +dispatch: + movem.l %d2-%d7/%a2-%a6, -(%sp) /* レジスタを保存 */ + move.l runtsk, %a0 /* A0 を runtsk に */ + move.l %sp, TCB_msp(%a0) /* タスクスタックを保存 */ + move.l #dispatch_r, TCB_pc(%a0) /* 実行再開番地を保存 */ + jbra dispatcher + +dispatch_r: + movem.l (%sp)+, %d2-%d7/%a2-%a6 /* レジスタを復帰 */ + btst.b #TCB_enatex_bit, TCB_enatex(%a0) + jbeq dispatch_r_1 /* enatex が FALSE ならリターン */ + tst.l TCB_texptn(%a0) /* texptn が 0 でなければ */ + jbne call_texrtn /* タスク例外処理ルーチンの呼出し */ +dispatch_r_1: + rts + +exit_and_dispatch: + or.w #0x1000, %sr /* マスタモード */ +dispatcher: + /* + * ここではマスタモード・割込み禁止状態でなければならない. + */ + move.l schedtsk, %a0 + move.l %a0, runtsk /* schedtsk を runtsk に */ + jbeq dispatcher_1 /* runtsk があるか? */ + move.l TCB_msp(%a0), %sp /* タスクスタックを復帰 */ + move.l TCB_pc(%a0), %a1 /* 実行再開番地を復帰 */ + jmp (%a1) +dispatcher_1: + stop #0x2000 /* 割込み待ち(割込みモード) */ + /* + * ここで割込みモードに切り換えるのは,ここで発生する割込み処理 + * にどのスタックを使うかという問題の解決と,割込みハンドラ内で + * のタスクディスパッチの防止という2つの意味がある. + * + * この stop命令は,IPM を 0 にするが,本来は task_intmask に + * 設定すべきである.M68040 では,stop 命令のパラメータに定数 + * しかとれないため,やむをえず 0 にしている(stop 命令を 8つ + * 並べて,task_intmask の値で飛び分ける手はあるが,そこまで + * やる意義はないと考えた). + * + * プロセッサを待ちモードに移行させる処理と,割込み許可とは, + * 不可分に行なう必要がある(M68040 では stop命令で両方行なう + * ので問題ない).これを不可分に行なわない場合,割込みを許可 + * した直後に割込みが入り,その中でタスクが実行可能状態になる + * と,実行すべきタスクがあるにもかかわらずプロセッサが待ちモー + * ドになってしまう. + * + * 割込みを待つ間は,runtsk を NULL(=0)に設定しなければなら + * ない.このように設定しないと,割込みハンドラから iget_tid + * を呼び出した際の動作が仕様に合致しなくなる. + */ + or.w #0x1700, %sr /* マスタモード・割込み禁止 */ + tst.l reqflg /* reqflg が FALSE なら */ + jbeq dispatcher_1 /* dispatcher_1 へ */ + clr.l reqflg /* reqflg を FALSE に */ + jbra dispatcher + +/* + * タスク起動時処理 + */ + .text + .globl activate_r +activate_r: + /* + * タスク起動直後はタスク例外処理が禁止されているため,ここでタ + * スク例外処理ルーチンを呼び出す条件は成り立たない. + */ +#ifdef SUPPORT_CHG_IPM /* t_unlock_cpu 相当の処理 */ + move.w %sr, %d0 /* 割込みマスクを task_intmask に */ + and.w #~0x0700, %d0 + or.w task_intmask, %d0 + move.w %d0, %sr +#else /* SUPPORT_CHG_IPM */ + and.w #~0x0700, %sr /* 割込み許可 */ +#endif /* SUPPORT_CHG_IPM */ + move.l (%sp)+, %a0 /* タスクの起動番地を a0 に */ + jmp (%a0) + +/* + * 割込みハンドラ/CPU例外ハンドラ出口処理 + * + * ret_int は割込みモード・割込み禁止状態で,ret_exc はマスタモード・ + * 割込み禁止状態で呼び出さなければならない.また ret_exc は,スクラッ + * チレジスタを保存した状態で呼び出すこと. + */ + .text + .globl ret_int + .globl ret_exc +ret_int: + addq.l #8, %sp /* スローアウェイフレームを捨てる */ + or.w #0x1000, %sr /* マスタモード */ + movem.l %d0-%d1/%a0-%a1, -(%sp) /* スクラッチレジスタを保存 */ +ret_exc: + clr.l reqflg /* reqflg を FALSE に */ + move.l runtsk, %a0 /* A0 ← runtsk */ + tst.l enadsp /* enadsp が FALSE なら */ + jbeq ret_int_1 /* ret_int_1 へ */ + cmp.l schedtsk, %a0 /* runtsk と schedtsk が同じなら */ + jbeq ret_int_1 /* ret_int_1 へ */ + movem.l %d2-%d7/%a2-%a6, -(%sp) /* 残りのレジスタを保存 */ + move.l %sp, TCB_msp(%a0) /* タスクスタックを保存 */ + move.l #ret_int_r, TCB_pc(%a0) /* 実行再開番地を保存 */ + jbra dispatcher + +ret_int_r: + movem.l (%sp)+, %d2-%d7/%a2-%a6 /* レジスタを復帰 */ +ret_int_1: + btst.b #TCB_enatex_bit, TCB_enatex(%a0) + jbeq ret_int_2 /* enatex が FALSE ならリターン */ + tst.l TCB_texptn(%a0) /* texptn が 0 ならリターン */ + jbeq ret_int_2 + jsr call_texrtn /* タスク例外処理ルーチンの呼出し */ +ret_int_2: +#ifdef SUPPORT_CHG_IPM + move.w 16(%sp), %d0 /* 戻り先の割込みマスクを */ + and.w #~0x0700, %d0 /* task_intmask に */ + or.w task_intmask, %d0 + move.w %d0, 16(%sp) +#endif /* SUPPORT_CHG_IPM */ + movem.l (%sp)+, %d0-%d1/%a0-%a1 /* スクラッチレジスタを復帰 */ + rte + +/* + * 微少時間待ち + */ + .globl _sil_dly_nse +_sil_dly_nse: + subi.l #SIL_DLY_TIM1, %d0 /* D0 から SIL_DLY_TIM1 を引く */ + jbhi _sil_dly_nse_1 /* 結果が 0 以下ならリターン */ + rts +_sil_dly_nse_1: + subi.l #SIL_DLY_TIM2, %d0 /* D0 から SIL_DLY_TIM2 を引く */ + jbhi _sil_dly_nse_1 /* 結果が 0 より大きければループ */ + rts diff --git a/uzume_prototype/kernel/config/m68k/cpu_unrename.h b/uzume_prototype/kernel/config/m68k/cpu_unrename.h new file mode 100644 index 0000000..e986892 --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/cpu_unrename.h @@ -0,0 +1,21 @@ +/* This file is generated from cpu_rename.def by genrename. */ + +#ifdef _CPU_UNRENAME_H_ +#undef _CPU_UNRENAME_H_ + +#undef activate_r +#undef ret_int +#undef ret_exc +#undef task_intmask +#undef int_intmask + +#ifdef LABEL_ASM + +#undef _activate_r +#undef _ret_int +#undef _ret_exc +#undef _task_intmask +#undef _int_intmask + +#endif /* LABEL_ASM */ +#endif /* _CPU_UNRENAME_H_ */ diff --git a/uzume_prototype/kernel/config/m68k/dve68k/Makefile.config b/uzume_prototype/kernel/config/m68k/dve68k/Makefile.config new file mode 100644 index 0000000..bb78cf6 --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/dve68k/Makefile.config @@ -0,0 +1,34 @@ +# +# @(#) $Id: Makefile.config,v 1.1 2009/01/31 05:27:37 suikan Exp $ +# + +# +# Makefile のターゲットシステム依存部(DVE68K/40用) +# + +# +# コンパイルオプション +# +INCLUDES := $(INCLUDES) -I$(SRCDIR)/config/$(CPU)/$(SYS) \ + -I$(SRCDIR)/pdic/simple_sio +COPTS := $(COPTS) -msoft-float +LDFLAGS := $(LDFLAGS) -msoft-float + +# +# カーネルに関する定義 +# +KERNEL_DIR := $(KERNEL_DIR):$(SRCDIR)/config/$(CPU)/$(SYS) \ + :$(SRCDIR)/pdic/simple_sio +KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) sys_support.o +KERNEL_COBJS := $(KERNEL_COBJS) sys_config.o upd72001.o + +# +# 各セグメントの開始アドレスの定義 +# +TEXT_START_ADDRESS = 00010000 +DATA_START_ADDRESS = 00100000 + +# +# リンカスクリプトの定義 +# +LDSCRIPT = $(CPU)/m68kelf.ld diff --git a/uzume_prototype/kernel/config/m68k/dve68k/dve68k.h b/uzume_prototype/kernel/config/m68k/dve68k/dve68k.h new file mode 100644 index 0000000..0bea3c5 --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/dve68k/dve68k.h @@ -0,0 +1,164 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: dve68k.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * DVE68K/40 CPUボードのハードウェア資源の定義 + */ + +#ifndef _DVE68K_H_ +#define _DVE68K_H_ + +/* + * 割込みベクトルの定義 + */ +#define TVEC_G0I 0x40u /* グループ0 割込みベクトル */ +#define TVEC_SQR 0x42u /* SQR 割込みベクトル */ +#define TVEC_ABT 0x46u /* アボート割込みベクトル */ + +#define TVEC_G1I 0x48u /* グループ1 割込みベクトル */ +#define TVEC_GP0 0x48u /* シリアルI/O 割込みベクトル */ +#define TVEC_TT0 0x4cu /* タイマ0 割込みベクトル */ + +#define TVEC_SWI 0X50u /* ソフトウェア割込みベクトル */ +#define TVEC_SPRI 0x40u /* スプリアス割込みベクトル */ + +/* + * CPUボード上のレジスタ + */ +#define TADR_BOARD_REG0 0xfff48000 +#define TADR_BOARD_REG1 0xfff48004 +#define TADR_BOARD_REG2 0xfff48008 + +/* + * DGA-001のレジスタのアドレス + */ +#define TADR_DGA_CSR0 0xfff44000 +#define TADR_DGA_CSR1 0xfff44004 +#define TADR_DGA_CSR3 0xfff4400c +#define TADR_DGA_CSR4 0xfff44010 +#define TADR_DGA_CSR5 0xfff44014 +#define TADR_DGA_CSR12 0xfff44030 +#define TADR_DGA_CSR13 0xfff44034 +#define TADR_DGA_CSR19 0xfff4404c +#define TADR_DGA_CSR20 0xfff44050 +#define TADR_DGA_CSR21 0xfff44054 +#define TADR_DGA_CSR23 0xfff4405c +#define TADR_DGA_CSR24 0xfff44060 +#define TADR_DGA_CSR25 0xfff44064 +#define TADR_DGA_IFR0 0xfff44070 +#define TADR_DGA_IFR3 0xfff4407c + +/* + * DGAへのアクセス関数 + */ +#define dga_rew_reg(addr) sil_rew_mem(addr) +#define dga_wrw_reg(addr, val) sil_wrw_mem(addr, val) + +/* + * μPD72001(MPSC)のレジスタのアドレス + */ +#define TADR_UPD72001_DATAA 0xfff45003 +#define TADR_UPD72001_CTRLA 0xfff45007 +#define TADR_UPD72001_DATAB 0xfff4500b +#define TADR_UPD72001_CTRLB 0xfff4500f + +/* + * μPD72001へのアクセス関数 + */ +#define upd72001_reb_reg(addr) sil_reb_mem(addr) +#define upd72001_wrb_reg(addr, val) sil_wrb_mem(addr, val) + +/* + * GDB STUB呼出しルーチン + */ +#ifndef _MACRO_ONLY +#ifdef GDB_STUB + +Inline void +dve68k_exit() +{ + Asm("trap #2"); +} + +Inline void +dve68k_putc(char c) +{ + Asm("move.l %0, %%d1; trap #3" + : /* no output */ + : "g"((INT) c) + : "d0", "d1", "d2", "d6", "d7"); +} + +/* + * モニタ呼出しルーチン + */ +#else /* GDB_STUB */ + +Inline void +dve68k_exit() +{ + Asm("clr.l %%d0; trap #3" + : /* no output */ + : /* no input */ + : "d0", "d1", "d2", "d6", "d7"); +} + +Inline char +dve68k_getc() +{ + INT c; + + Asm("moveq.l #3, %%d0; trap #3; move.l %%d0, %0" + : "=g"(c) + : /* no input */ + : "d0", "d1", "d2", "d6", "d7"); + return((char) c); +} + +Inline void +dve68k_putc(char c) +{ + Asm("moveq.l #5, %%d0; move.l %0, %%d1; trap #3" + : /* no output */ + : "g"((INT) c) + : "d0", "d1", "d2", "d6", "d7"); +} + +#endif /* GDB_STUB */ +#endif /* _MACRO_ONLY */ +#endif /* _DVE68K_H_ */ diff --git a/uzume_prototype/kernel/config/m68k/dve68k/dve68k_dga.h b/uzume_prototype/kernel/config/m68k/dve68k/dve68k_dga.h new file mode 100644 index 0000000..018f55e --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/dve68k/dve68k_dga.h @@ -0,0 +1,109 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: dve68k_dga.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * DGAのアクセスユーティリティ + */ + +#ifndef _DVE68K_DGA_H_ +#define _DVE68K_DGA_H_ + +/* + * DGAの割込み制御ビットの定義 + */ +#define TBIT_ABT 0x40000000u /* アボート割込みビット */ +#define TBIT_SQR 0x04000000u /* SQR 割込みビット */ +#define TBIT_TT0 0x00100000u /* タイマ0 割込みビット */ +#define TBIT_GP0 0x00010000u /* シリアルI/O 割込みビット */ + +/* + * DGAの割込みレベル設定のための定義 + */ +#define TIRQ_NMI 0x7u /* ノンマスカブル割込み */ +#define TIRQ_LEVEL6 0x6u /* 割込みレベル6 */ +#define TIRQ_LEVEL5 0x5u /* 割込みレベル5 */ +#define TIRQ_LEVEL4 0x4u /* 割込みレベル4 */ +#define TIRQ_LEVEL3 0x3u /* 割込みレベル3 */ +#define TIRQ_LEVEL2 0x2u /* 割込みレベル2 */ +#define TIRQ_LEVEL1 0x1u /* 割込みレベル1 */ + +#define TBIT_ABTIL 24 /* アボート割込み */ +#define TBIT_SQRIL 8 /* SRQ 割込み */ + +#define TBIT_TT0IL 16 /* タイマ0 割込み */ +#define TBIT_GP0IL 0 /* シリアルI/O 割込み */ + +#ifndef _MACRO_ONLY + +/* + * DGAのレジスタへのアクセス関数 + */ + +Inline UW +dga_read(VP addr) +{ + return((UW) dga_rew_reg(addr)); +} + +Inline void +dga_write(VP addr, UW val) +{ + dga_wrw_reg(addr, (VW) val); +} + +Inline void +dga_bit_or(VP addr, UW bitpat) +{ + dga_write(addr, dga_read(addr) | bitpat); +} + +Inline void +dga_bit_and(VP addr, UW bitpat) +{ + dga_write(addr, dga_read(addr) & bitpat); +} + +Inline void +dga_set_ilv(VP addr, UINT shift, UINT level) +{ + dga_write(addr, (dga_read(addr) & ~(0x07 << shift)) + | (level << shift)); +} + +#endif /* _MACRO_ONLY */ +#endif /* _DVE68K_DGA_H_ */ diff --git a/uzume_prototype/kernel/config/m68k/dve68k/hw_serial.cfg b/uzume_prototype/kernel/config/m68k/dve68k/hw_serial.cfg new file mode 100644 index 0000000..afc3d37 --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/dve68k/hw_serial.cfg @@ -0,0 +1,11 @@ +/* + * @(#) $Id: hw_serial.cfg,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * SIOドライバ(DVE68K/40用)のコンフィギュレーションファイル + */ + +#include +INCLUDE(""); +DEF_INH(INHNO_SIO, { TA_HLNG, sio_handler }); diff --git a/uzume_prototype/kernel/config/m68k/dve68k/hw_serial.h b/uzume_prototype/kernel/config/m68k/dve68k/hw_serial.h new file mode 100644 index 0000000..6a5e7be --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/dve68k/hw_serial.h @@ -0,0 +1,148 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: hw_serial.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * シリアルI/Oデバイス(SIO)ドライバ(DVE68K/40用) + */ + +#ifndef _HW_SERIAL_H_ +#define _HW_SERIAL_H_ + +#include +#include +#ifndef _MACRO_ONLY +#include +#endif /* _MACRO_ONLY */ + +/* + * SIOの割込みハンドラのベクタ番号 + */ +#define INHNO_SIO TVEC_GP0 + +#ifndef _MACRO_ONLY + +/* + * SIOドライバの初期化ルーチン + */ +#define sio_initialize upd72001_initialize + +/* + * シリアルI/Oポートのオープン + */ +Inline SIOPCB * +sio_opn_por(ID siopid, VP_INT exinf) +{ + SIOPCB *siopcb; + BOOL openflag; + + /* + * オープンしたポートがあるかを openflag に読んでおく. + */ + openflag = upd72001_openflag(); + + /* + * デバイス依存のオープン処理. + */ + siopcb = upd72001_opn_por(siopid, exinf); + + /* + * シリアルI/O割込みの割込みレベルを設定し,マスクを解除する. + */ + if (!openflag) { + dga_set_ilv((VP) TADR_DGA_CSR25, TBIT_GP0IL, TIRQ_LEVEL6); + dga_bit_or((VP) TADR_DGA_CSR21, TBIT_GP0); + } + return(siopcb); +} + +/* + * シリアルI/Oポートのクローズ + */ +Inline void +sio_cls_por(SIOPCB *siopcb) +{ + /* + * デバイス依存のクローズ処理. + */ + upd72001_cls_por(siopcb); + + /* + * シリアルI/O割込みをマスクする. + */ + if (!upd72001_openflag()) { + dga_bit_and((VP) TADR_DGA_CSR21, ~TBIT_GP0); + } +} + +/* + * SIOの割込みハンドラ + */ +#define sio_handler upd72001_isr + +/* + * シリアルI/Oポートへの文字送信 + */ +#define sio_snd_chr upd72001_snd_chr + +/* + * シリアルI/Oポートからの文字受信 + */ +#define sio_rcv_chr upd72001_rcv_chr + +/* + * シリアルI/Oポートからのコールバックの許可 + */ +#define sio_ena_cbr upd72001_ena_cbr + +/* + * シリアルI/Oポートからのコールバックの禁止 + */ +#define sio_dis_cbr upd72001_dis_cbr + +/* + * シリアルI/Oポートからの送信可能コールバック + */ +#define sio_ierdy_snd upd72001_ierdy_snd + +/* + * シリアルI/Oポートからの受信通知コールバック + */ +#define sio_ierdy_rcv upd72001_ierdy_rcv + +#endif /* _MACRO_ONLY */ +#endif /* _HW_SERIAL_H_ */ diff --git a/uzume_prototype/kernel/config/m68k/dve68k/hw_timer.h b/uzume_prototype/kernel/config/m68k/dve68k/hw_timer.h new file mode 100644 index 0000000..7066e6e --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/dve68k/hw_timer.h @@ -0,0 +1,176 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: hw_timer.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * タイマドライバ(DVE68K/40用) + */ + +#ifndef _HW_TIMER_H_ +#define _HW_TIMER_H_ + +#include +#include + +/* + * タイマ割込みハンドラのベクタ番号 + */ +#define INHNO_TIMER TVEC_TT0 + +#ifndef _MACRO_ONLY + +/* + * タイマ値の内部表現の型 + */ +typedef UW CLOCK; + +/* + * タイマ値の内部表現とミリ秒・μ秒単位との変換 + * + * DVE68K/40 CPUボードでは,タイマは1μ秒毎にカウントアップする. + */ +#define TIMER_CLOCK 1000 +#define TO_CLOCK(nume, deno) (TIMER_CLOCK * (nume) / (deno)) +#define TO_USEC(clock) ((clock) * 1000 / TIMER_CLOCK) + +/* + * 設定できる最大のタイマ周期(単位は内部表現) + */ +#define MAX_CLOCK ((CLOCK) 0xffffff) + +/* + * タイマの現在値を割込み発生前の値とみなすかの判断 + */ +#define GET_TOLERANCE 100 /* 処理遅れの見積り値(単位は内部表現)*/ +#define BEFORE_IREQ(clock) \ + ((clock) >= TO_CLOCK(TIC_NUME, TIC_DENO) - GET_TOLERANCE) + +/* + * タイマ停止までの時間(nsec単位) + * + * 値に根拠はない. + */ +#define TIMER_STOP_DELAY 200 + +/* + * レジスタの設定値 + */ +#define CSR12_START 0x80000000u /* タイマ動作 */ + +/* + * タイマの起動処理 + * + * タイマを初期化し,周期的なタイマ割込み要求を発生させる. + */ +Inline void +hw_timer_initialize() +{ + CLOCK cyc = TO_CLOCK(TIC_NUME, TIC_DENO); + + /* + * タイマ周期を設定し,タイマの動作を開始する. + */ + assert(cyc <= MAX_CLOCK); + dga_write((VP) TADR_DGA_CSR12, CSR12_START | cyc); + + /* + * タイマ割込みの割込みレベルを設定し,要求をクリアした後, + * マスクを解除する. + */ + dga_set_ilv((VP) TADR_DGA_CSR25, TBIT_TT0IL, TIRQ_LEVEL4); + dga_write((VP) TADR_DGA_CSR23, TBIT_TT0); + dga_bit_or((VP) TADR_DGA_CSR21, TBIT_TT0); +} + +/* + * タイマ割込み要求のクリア + */ +Inline void +hw_timer_int_clear() +{ + dga_write((VP) TADR_DGA_CSR23, TBIT_TT0); +} + +/* + * タイマの停止処理 + * + * タイマの動作を停止させる. + */ +Inline void +hw_timer_terminate() +{ + /* + * タイマの動作を停止する. + */ + dga_bit_and((VP) TADR_DGA_CSR12, ~CSR12_START); + + /* + * タイマ割込みをマスクし,要求をクリアする. + */ + dga_bit_and((VP) TADR_DGA_CSR21, ~TBIT_TT0); + dga_write((VP) TADR_DGA_CSR23, TBIT_TT0); +} + +/* + * タイマの現在値の読出し + */ +Inline CLOCK +hw_timer_get_current() +{ + CLOCK clk; + + /* + * タイマの動作を一時的に停止し,タイマ値を読み出す. + */ + dga_bit_and((VP) TADR_DGA_CSR12, ~CSR12_START); + sil_dly_nse(TIMER_STOP_DELAY); + clk = dga_read((VP) TADR_DGA_CSR13) & 0x00ffffffu; + dga_bit_or((VP) TADR_DGA_CSR12, CSR12_START); + return(clk); +} + +/* + * タイマ割込み要求のチェック + */ +Inline BOOL +hw_timer_fetch_interrupt() +{ + return((dga_read((VP) TADR_DGA_CSR20) & TBIT_TT0) != 0); +} + +#endif /* _MACRO_ONLY */ +#endif /* _HW_TIMER_H_ */ diff --git a/uzume_prototype/kernel/config/m68k/dve68k/sys_config.c b/uzume_prototype/kernel/config/m68k/dve68k/sys_config.c new file mode 100644 index 0000000..a1ae5a9 --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/dve68k/sys_config.c @@ -0,0 +1,132 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: sys_config.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * ターゲットシステム依存モジュール(DVE68K/40用) + */ + +#include "jsp_kernel.h" +#include +#include + +/* + * プロセッサ識別のための変数(マルチプロセッサ対応) + */ +UINT board_id; /* ボードID */ +VP board_addr; /* ローカルメモリの先頭アドレス */ + +/* + * ターゲットシステム依存の初期化 + */ +void +sys_initialize() +{ + /* + * プロセッサ識別のための変数の初期化 + */ + board_id = ((UINT)(sil_rew_mem((VP) TADR_BOARD_REG0)) & 0x1f); + board_addr = (VP)(board_id << 24); + + /* + * 割込み関連の初期化 + * + * すべての割込みをマスク・クリアし,割込みベクトルを設定する. + */ + dga_write((VP) TADR_DGA_CSR21, 0); + dga_write((VP) TADR_DGA_CSR23, ~0); + dga_write((VP) TADR_DGA_CSR19, (TVEC_G0I << 24) | (TVEC_G1I << 16) + | (TVEC_SWI << 8) | TVEC_SPRI); + + /* + * アボート割込みの設定(NMI) + * + * アボート割込みの割込みレベルを設定し,要求をクリアした後, + * マスクを解除する. + */ + dga_set_ilv((VP) TADR_DGA_CSR24, TBIT_ABTIL, TIRQ_NMI); + dga_write((VP) TADR_DGA_CSR23, TBIT_ABT); + dga_bit_or((VP) TADR_DGA_CSR21, TBIT_ABT); + + /* + * メモリ領域の設定 + * + * ローカルメモリのVMEバス上での先頭アドレスとサイズ(16MB) + * し,アクセスを受け付けるように設定する.また,VMEバスから + * 拡張アドレスアクセスを受け付けるようにに設定する. + */ + dga_write((VP) TADR_DGA_CSR4, (UW) board_addr | 0x00ff); + dga_write((VP) TADR_DGA_CSR5, 0x0000012fu); + + /* + * インタフェースレジスタ(IFR)の設定 + * + * インタフェースレジスタのベースアドレスを設定する.また,イ + * ンタフェースレジスタ0のサービスリクエストフラグをクリア. + * インタフェースレジスタ3にボードのID番号を設定. + */ + dga_write((VP) TADR_DGA_CSR3, (board_id << 4) | 0x3); + dga_write((VP) TADR_DGA_IFR0, 0x80000000u); + dga_write((VP) TADR_DGA_IFR3, board_id); + + /* + * ラウンドロビンモードに設定(マルチプロセッサ対応) + */ + dga_write((VP) TADR_DGA_CSR1, (dga_read((VP) TADR_DGA_CSR1) + & 0xffeffcff) | (1u << 20) | ((board_id % 4) << 8)); +} + +/* + * ターゲットシステムの終了 + */ +void +sys_exit() +{ + dve68k_exit(); +} + +/* + * ターゲットシステムの文字出力 + */ +void +sys_putc(char c) +{ + if (c == '\n') { + dve68k_putc('\r'); + } + dve68k_putc(c); +} diff --git a/uzume_prototype/kernel/config/m68k/dve68k/sys_config.h b/uzume_prototype/kernel/config/m68k/dve68k/sys_config.h new file mode 100644 index 0000000..54fd9b4 --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/dve68k/sys_config.h @@ -0,0 +1,132 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: sys_config.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * ターゲットシステム依存モジュール(DVE68K/40用) + * + * このインクルードファイルは,t_config.h のみからインクルードされる. + * 他のファイルから直接インクルードしてはならない. + */ + +#ifndef _SYS_CONFIG_H_ +#define _SYS_CONFIG_H_ + +/* + * カーネルの内部識別名のリネーム + */ +#include + +/* + * ターゲットシステムのハードウェア資源の定義 + */ +#include + +/* + * 起動メッセージのターゲットシステム名 + */ +#define TARGET_NAME "DVE-68K/40" + +/* + * vxget_tim をサポートするかどうかの定義 + */ +#define SUPPORT_VXGET_TIM + +/* + * JSPカーネル動作時のメモリマップと関連する定義 + * + * 00000000 - 0000ffff ROMモニタ/スタブワークエリア (64KB) + * 00010000 - 000fffff コード領域 (約1MB) + * 00100000 - データ領域 (約3MB) + * - 003fffff 非タスクコンテキスト用のスタック領域 + */ +#define STACKTOP 0x00400000 /* 非タスクコンテキスト用のスタックの初期値 */ + +/* + * シリアルポート数の定義 + */ +#define TNUM_PORT 2 /* サポートするシリアルポートの数 */ +#define TNUM_SIOP 2 /* サポートするシリアルI/Oポートの数 */ + +/* + * シリアルポート番号に関する定義 + */ +#define LOGTASK_PORTID 1 /* システムログに用いるシリアルポート番号 */ + +/* + * シリアルポートのボーレートに関する定義 + * + * μPD72001のボーレートジェネレータに設定すべき値. + */ +#define BRG1_DEF 0x00u /* 9600bps(上位)*/ +#define BRG2_DEF 0x1eu /* 9600bps(下位)*/ + +/* + * 微少時間待ちのための定義 + */ +#define SIL_DLY_TIM1 420 +#define SIL_DLY_TIM2 90 + +#ifndef _MACRO_ONLY +/* + * プロセッサ識別のための変数(マルチプロセッサ対応) + */ +extern UINT board_id; /* ボードID */ +extern VP board_addr; /* ローカルメモリの先頭アドレス */ + +/* + * ターゲットシステム依存の初期化 + */ +extern void sys_initialize(void); + +/* + * ターゲットシステムの終了 + * + * システムを終了する時に使う.ROMモニタ/GDB STUB呼出しで実現する. + */ +extern void sys_exit(void); + +/* + * ターゲットシステムの文字出力 + * + * システムの低レベルの文字出力ルーチン.ROMモニタ/GDB STUB呼出しで実 + * 現する. + */ +extern void sys_putc(char c); + +#endif /* _MACRO_ONLY */ +#endif /* _SYS_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/config/m68k/dve68k/sys_defs.h b/uzume_prototype/kernel/config/m68k/dve68k/sys_defs.h new file mode 100644 index 0000000..975e6d2 --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/dve68k/sys_defs.h @@ -0,0 +1,108 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: sys_defs.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * ターゲットシステムに依存する定義(DVE68K/40用) + * + * このインクルードファイルは,kernel.h と sil.h でインクルードされる. + * 他のファイルから直接インクルードすることはない.このファイルをイン + * クルードする前に,t_stddef.h と itron.h がインクルードされるので, + * それらに依存してもよい. + */ + +#ifndef _SYS_DEFS_H_ +#define _SYS_DEFS_H_ + +#define DVE68K /* システム略称 */ + +#ifndef _MACRO_ONLY + +/* + * 割込み番号の型と割込みの禁止/許可 + */ +#if 0 /* 現時点ではサポートしていない */ + +typedef UINT INTNO; /* 割込み番号 */ + +extern ER dis_int(INTNO intno) throw(); +extern ER ena_int(INTNO intno) throw(); + +#endif /* 0 */ + +/* + * 性能評価用システム時刻の参照 + */ +typedef UD SYSUTIM; /* 性能評価用システム時刻 */ + +extern ER vxget_tim(SYSUTIM *p_sysutim) throw(); + +#endif /* _MACRO_ONLY */ + +/* + * タイムティックの定義 + */ +#define TIC_NUME 1u /* タイムティックの周期の分子 */ +#define TIC_DENO 1u /* タイムティックの周期の分母 */ + +#ifndef _MACRO_ONLY + +/* + * システムの停止処理 + */ +#ifdef GDB_STUB + +Inline void +kernel_abort() +{ + Asm("trap #2"); +} + +#else /* GDB_STUB */ + +Inline void +kernel_abort() +{ + Asm("clr.l %%d0; trap #3" + : /* no output */ + : /* no input */ + : "d0", "d1", "d2", "d6", "d7"); +} + +#endif /* GDB_STUB */ +#endif /* _MACRO_ONLY */ +#endif /* _SYS_DEFS_H_ */ diff --git a/uzume_prototype/kernel/config/m68k/dve68k/sys_rename.def b/uzume_prototype/kernel/config/m68k/dve68k/sys_rename.def new file mode 100644 index 0000000..e4fc964 --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/dve68k/sys_rename.def @@ -0,0 +1,2 @@ +board_id +board_addr diff --git a/uzume_prototype/kernel/config/m68k/dve68k/sys_rename.h b/uzume_prototype/kernel/config/m68k/dve68k/sys_rename.h new file mode 100644 index 0000000..bdc6247 --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/dve68k/sys_rename.h @@ -0,0 +1,15 @@ +/* This file is generated from sys_rename.def by genrename. */ + +#ifndef _SYS_RENAME_H_ +#define _SYS_RENAME_H_ + +#define board_id _kernel_board_id +#define board_addr _kernel_board_addr + +#ifdef LABEL_ASM + +#define _board_id __kernel_board_id +#define _board_addr __kernel_board_addr + +#endif /* LABEL_ASM */ +#endif /* _SYS_RENAME_H_ */ diff --git a/uzume_prototype/kernel/config/m68k/dve68k/sys_support.S b/uzume_prototype/kernel/config/m68k/dve68k/sys_support.S new file mode 100644 index 0000000..214c0a0 --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/dve68k/sys_support.S @@ -0,0 +1,57 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: sys_support.S,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * ターゲットシステム依存モジュール アセンブリ言語部(DVE68K/40用) + */ + +#define _MACRO_ONLY +#include "jsp_kernel.h" + +/* + * 低レベルのターゲットシステム依存の初期化 + * + * スタートアップモジュールの中で,メモリの初期化の前に呼び出される. + */ + .text + .globl hardware_init_hook +hardware_init_hook: + move.l #0x09, TADR_BOARD_REG1 + move.l #0x2c07e000, TADR_DGA_CSR0 + move.l #0x60000300, TADR_DGA_CSR1 + rts diff --git a/uzume_prototype/kernel/config/m68k/dve68k/sys_unrename.h b/uzume_prototype/kernel/config/m68k/dve68k/sys_unrename.h new file mode 100644 index 0000000..a9dbd6a --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/dve68k/sys_unrename.h @@ -0,0 +1,15 @@ +/* This file is generated from sys_rename.def by genrename. */ + +#ifdef _SYS_UNRENAME_H_ +#undef _SYS_UNRENAME_H_ + +#undef board_id +#undef board_addr + +#ifdef LABEL_ASM + +#undef _board_id +#undef _board_addr + +#endif /* LABEL_ASM */ +#endif /* _SYS_UNRENAME_H_ */ diff --git a/uzume_prototype/kernel/config/m68k/m68kelf.ld b/uzume_prototype/kernel/config/m68k/m68kelf.ld new file mode 100644 index 0000000..d823212 --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/m68kelf.ld @@ -0,0 +1,77 @@ +/* + * @(#) $Id: m68kelf.ld,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +OUTPUT_FORMAT("elf32-m68k","elf32-m68k","elf32-m68k") +OUTPUT_ARCH(m68k) + +PROVIDE (__stack = 0) ; +PROVIDE (hardware_init_hook = 0) ; +PROVIDE (software_init_hook = 0) ; +PROVIDE (software_term_hook = 0) ; +SECTIONS +{ + .init : + { + KEEP (*(.init)) + } + .text : + { + __text = . ; + *(.text .stub .text.* .gnu.linkonce.t.*) + + } + .fini : + { + KEEP (*(.fini)) + } + _etext = . ; + PROVIDE (etext = .) ; + .rodata : + { + *(.rodata .rodata.* .gnu.linkonce.r.*) + } + . = ALIGN(4) ; + __idata_start = . ; + .data : AT(__idata_start) + { + __data_start = . ; + *(.data) + } + .eh_frame : { KEEP (*(.eh_frame)) } + .gcc_except_table : { *(.gcc_except_table) } + .ctors : + { + KEEP (*crtbegin.o(.ctors)) + KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } + __idata_end = __idata_start + SIZEOF(.data) ; + _edata = . ; + PROVIDE (edata = .) ; + . = ALIGN(4) ; + __bss_start = . ; + .bss : + { + *(.bss) + *(COMMON) + } + _end = . ; + __bss_end = . ; + PROVIDE (end = .) ; + .comment 0 : { *(.comment) } + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } +} diff --git a/uzume_prototype/kernel/config/m68k/makeoffset.c b/uzume_prototype/kernel/config/m68k/makeoffset.c new file mode 100644 index 0000000..092913d --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/makeoffset.c @@ -0,0 +1,74 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2004 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: makeoffset.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +#include "jsp_kernel.h" +#include "task.h" + +#undef offsetof +#define offsetof(structure, field) \ + ((INT) &(((structure *) 0)->field)) + +#define OFFSET_DEF(TYPE, FIELD) \ + Asm("OFFSET_DEF " #TYPE "_" #FIELD " = %0" \ + : /* no output */ \ + : "g"(offsetof(TYPE, FIELD))) + +#define OFFSET_DEF2(TYPE, FIELD, FIELDNAME) \ + Asm("OFFSET_DEF " #TYPE "_" #FIELDNAME " = %0" \ + : /* no output */ \ + : "g"(offsetof(TYPE, FIELD))) + +void +makeoffset() +{ + OFFSET_DEF(TCB, texptn); + OFFSET_DEF2(TCB, tskctxb.msp, msp); + OFFSET_DEF2(TCB, tskctxb.pc, pc); +} + +UW BIT_REF_4 = 0x12345678; +UH BIT_REF_2 = 0x1234; +UB BIT_REF_1 = 0x12; + +TCB BIT_BB_TCB_enatex = { + { NULL, NULL }, NULL, 0, 0, + FALSE, FALSE, TRUE, + 0, NULL, { NULL, NULL } + }; diff --git a/uzume_prototype/kernel/config/m68k/start.S b/uzume_prototype/kernel/config/m68k/start.S new file mode 100644 index 0000000..e3447f2 --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/start.S @@ -0,0 +1,126 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: start.S,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * カーネル用のスタートアップモジュール(M68040用) + */ + +#define _MACRO_ONLY +#include + + .text + .globl start +start: + /* + * プロセッサモードとスタックポインタの初期化 + */ + cinva %bc /* すべてのキャッシュを無効化 */ + move.l #0x80008000, %d0 /* 両方のキャッシュを ON */ + movec.l %d0, %cacr + + move.w %sr, %d0 + or.w #0x2700, %d0 /* スーパバイザモード,IPM=7に設定 */ + and.w #0xefff ,%d0 /* 割込みモードに設定 */ + move.w %d0, %sr + + movea.l #STACKTOP, %sp /* スタックポインタ(SPI)の初期化 */ + movea.l #0, %fp /* フレームポインタの初期化 */ + + /* + * hardware_init_hook の呼出し(0 でない場合) + * + * ターゲットハードウェアに依存して必要な初期化処理がある場合 + * は,hardware_init_hook という関数を用意する. + */ + move.l #hardware_init_hook, %a0 + cmp.l #0, %a0 + jbeq start_1 + jsr (%a0) + + /* + * bssセクションのクリア + */ +start_1: + move.l #__bss_start, %a0 + move.l #_end, %d0 + sub.l %a0, %d0 + jbeq start_3 +start_2: + clr.b (%a0)+ + dbra %d0, start_2 + clr.w %d0 + subq.l #1, %d0 + jbcc start_2 + + /* + * dataセクションの初期化(ROM化対応) + * + * __idata_start から __idata_end までを,__data_start 以降に + * コピーする. + */ +start_3: + move.l #__idata_end, %d0 + sub.l #__idata_start, %d0 + jbls start_5 + move.l #__idata_start, %a0 + move.l #__data_start, %a1 +start_4: + move.b (%a0)+, (%a1)+ + dbra %d0, start_4 + clr.w %d0 + subq.l #1, %d0 + jbcc start_4 + + /* + * software_init_hook を呼出し(0 でない場合) + * + * ソフトウェア環境(特にライブラリ)に依存して必要な初期化処 + * 理がある場合は,software_init_hook という関数を用意すれば + * よい. + */ +start_5: + move.l #software_init_hook, %a0 + cmp.l #0, %a0 + jbeq start_6 + jsr (%a0) + + /* + * カーネルを起動する. + */ +start_6: + jmp kernel_start diff --git a/uzume_prototype/kernel/config/m68k/tool_config.h b/uzume_prototype/kernel/config/m68k/tool_config.h new file mode 100644 index 0000000..049da6e --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/tool_config.h @@ -0,0 +1,269 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2006 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: tool_config.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * 開発環境依存モジュール + * + * このインクルードファイルは,t_config.h のみからインクルードされる. + * 他のファイルから直接インクルードしてはならない. + */ + +#ifndef _TOOL_CONFIG_H_ +#define _TOOL_CONFIG_H_ + +/* + * ラベルの別名を定義するためのマクロ + */ +#define _LABEL_ALIAS(new_label, defined_label) \ + asm(".globl " #new_label "\n" #new_label " = " #defined_label); +#define LABEL_ALIAS(x, y) _LABEL_ALIAS(x, y) + +/* + * 開発環境依存の初期化は使用しない + */ +#define tool_initialize() + +/* + * atexit の処理とデストラクタの実行 + */ +#ifndef _MACRO_ONLY + +Inline void +call_atexit() +{ + extern void software_term_hook(void); + volatile FP fp = software_term_hook; + + /* + * software_term_hookへのポインタを,一旦volatile FP型のfpに + * 代入してから使うのは,0との比較が最適化で削除されないよう + * にするためである. + */ + if (fp != 0) { + (*fp)(); + } +} + +#endif /* _MACRO_ONLY */ + +/* + * トレースログの設定 + */ + +#define LOG_INH_ENTER(inhno) /* プロセッサ依存部 */ +#define LOG_INH_LEAVE(inhno) /* プロセッサ依存部 */ + +#define LOG_ISR_ENTER(intno) /* プロセッサ依存部 */ +#define LOG_ISR_LEAVE(intno) /* プロセッサ依存部 */ + +#define LOG_CYC_ENTER(cyccb) +#define LOG_CYC_LEAVE(cyccb) + +#define LOG_EXC_ENTER(excno) /* プロセッサ依存部 */ +#define LOG_EXC_LEAVE(excno) /* プロセッサ依存部 */ + +#define LOG_TEX_ENTER(texptn) +#define LOG_TEX_LEAVE(texptn) + +#define LOG_TSKSTAT(tcb) + +#define LOG_DSP_ENTER(tcb) /* プロセッサ依存部 */ +#define LOG_DSP_LEAVE(tcb) /* プロセッサ依存部 */ + +#define LOG_ACT_TSK_ENTER(tskid) +#define LOG_ACT_TSK_LEAVE(ercd) +#define LOG_IACT_TSK_ENTER(tskid) +#define LOG_IACT_TSK_LEAVE(ercd) +#define LOG_CAN_ACT_ENTER(tskid) +#define LOG_CAN_ACT_LEAVE(ercd) +#define LOG_EXT_TSK_ENTER() +#define LOG_TER_TSK_ENTER(tskid) +#define LOG_TER_TSK_LEAVE(ercd) +#define LOG_CHG_PRI_ENTER(tskid, tskpri) +#define LOG_CHG_PRI_LEAVE(ercd) +#define LOG_GET_PRI_ENTER(tskid, p_tskpri) +#define LOG_GET_PRI_LEAVE(ercd, tskpri) +#define LOG_SLP_TSK_ENTER() +#define LOG_SLP_TSK_LEAVE(ercd) +#define LOG_TSLP_TSK_ENTER(tmout) +#define LOG_TSLP_TSK_LEAVE(ercd) +#define LOG_WUP_TSK_ENTER(tskid) +#define LOG_WUP_TSK_LEAVE(ercd) +#define LOG_IWUP_TSK_ENTER(tskid) +#define LOG_IWUP_TSK_LEAVE(ercd) +#define LOG_CAN_WUP_ENTER(tskid) +#define LOG_CAN_WUP_LEAVE(ercd) +#define LOG_REL_WAI_ENTER(tskid) +#define LOG_REL_WAI_LEAVE(ercd) +#define LOG_IREL_WAI_ENTER(tskid) +#define LOG_IREL_WAI_LEAVE(ercd) +#define LOG_SUS_TSK_ENTER(tskid) +#define LOG_SUS_TSK_LEAVE(ercd) +#define LOG_RSM_TSK_ENTER(tskid) +#define LOG_RSM_TSK_LEAVE(ercd) +#define LOG_FRSM_TSK_ENTER(tskid) +#define LOG_FRSM_TSK_LEAVE(ercd) +#define LOG_DLY_TSK_ENTER(dlytim) +#define LOG_DLY_TSK_LEAVE(ercd) +#define LOG_RAS_TEX_ENTER(tskid, rasptn) +#define LOG_RAS_TEX_LEAVE(ercd) +#define LOG_IRAS_TEX_ENTER(tskid, rasptn) +#define LOG_IRAS_TEX_LEAVE(ercd) +#define LOG_DIS_TEX_ENTER() +#define LOG_DIS_TEX_LEAVE(ercd) +#define LOG_ENA_TEX_ENTER() +#define LOG_ENA_TEX_LEAVE(ercd) +#define LOG_SNS_TEX_ENTER() +#define LOG_SNS_TEX_LEAVE(state) +#define LOG_SIG_SEM_ENTER(semid) +#define LOG_SIG_SEM_LEAVE(ercd) +#define LOG_ISIG_SEM_ENTER(semid) +#define LOG_ISIG_SEM_LEAVE(ercd) +#define LOG_WAI_SEM_ENTER(semid) +#define LOG_WAI_SEM_LEAVE(ercd) +#define LOG_POL_SEM_ENTER(semid) +#define LOG_POL_SEM_LEAVE(ercd) +#define LOG_TWAI_SEM_ENTER(semid, tmout) +#define LOG_TWAI_SEM_LEAVE(ercd) +#define LOG_SET_FLG_ENTER(flgid, setptn) +#define LOG_SET_FLG_LEAVE(ercd) +#define LOG_ISET_FLG_ENTER(flgid, setptn) +#define LOG_ISET_FLG_LEAVE(ercd) +#define LOG_CLR_FLG_ENTER(flgid, clrptn) +#define LOG_CLR_FLG_LEAVE(ercd) +#define LOG_WAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn) +#define LOG_WAI_FLG_LEAVE(ercd, flgptn) +#define LOG_POL_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn) +#define LOG_POL_FLG_LEAVE(ercd, flgptn) +#define LOG_TWAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn, tmout) +#define LOG_TWAI_FLG_LEAVE(ercd, flgptn) +#define LOG_SND_DTQ_ENTER(dtqid, data) +#define LOG_SND_DTQ_LEAVE(ercd) +#define LOG_PSND_DTQ_ENTER(dtqid, data) +#define LOG_PSND_DTQ_LEAVE(ercd) +#define LOG_IPSND_DTQ_ENTER(dtqid, data) +#define LOG_IPSND_DTQ_LEAVE(ercd) +#define LOG_TSND_DTQ_ENTER(dtqid, data, tmout) +#define LOG_TSND_DTQ_LEAVE(ercd) +#define LOG_FSND_DTQ_ENTER(dtqid, data) +#define LOG_FSND_DTQ_LEAVE(ercd) +#define LOG_IFSND_DTQ_ENTER(dtqid, data) +#define LOG_IFSND_DTQ_LEAVE(ercd) +#define LOG_RCV_DTQ_ENTER(dtqid, p_data) +#define LOG_RCV_DTQ_LEAVE(ercd, data) +#define LOG_PRCV_DTQ_ENTER(dtqid, p_data) +#define LOG_PRCV_DTQ_LEAVE(ercd, data) +#define LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout) +#define LOG_TRCV_DTQ_LEAVE(ercd, data) +#define LOG_SND_MBX_ENTER(mbxid, pk_msg) +#define LOG_SND_MBX_LEAVE(ercd) +#define LOG_RCV_MBX_ENTER(mbxid, ppk_msg) +#define LOG_RCV_MBX_LEAVE(ercd, pk_msg) +#define LOG_PRCV_MBX_ENTER(mbxid, ppk_msg) +#define LOG_PRCV_MBX_LEAVE(ercd, pk_msg) +#define LOG_TRCV_MBX_ENTER(mbxid, ppk_msg, tmout) +#define LOG_TRCV_MBX_LEAVE(ercd, pk_msg) +#define LOG_GET_MPF_ENTER(mpfid, p_blk) +#define LOG_GET_MPF_LEAVE(ercd, blk) +#define LOG_PGET_MPF_ENTER(mpfid, p_blk) +#define LOG_PGET_MPF_LEAVE(ercd, blk) +#define LOG_TGET_MPF_ENTER(mpfid, p_blk, tmout) +#define LOG_TGET_MPF_LEAVE(ercd, blk) +#define LOG_REL_MPF_ENTER(mpfid, blk) +#define LOG_REL_MPF_LEAVE(ercd) +#define LOG_SET_TIM_ENTER(p_systim) +#define LOG_SET_TIM_LEAVE(ercd) +#define LOG_GET_TIM_ENTER(p_systim) +#define LOG_GET_TIM_LEAVE(ercd, systim) +#define LOG_ISIG_TIM_ENTER() +#define LOG_ISIG_TIM_LEAVE(ercd) +#define LOG_STA_CYC_ENTER(cycid) +#define LOG_STA_CYC_LEAVE(ercd) +#define LOG_STP_CYC_ENTER(cycid) +#define LOG_STP_CYC_LEAVE(ercd) +#define LOG_ROT_RDQ_ENTER(tskpri) +#define LOG_ROT_RDQ_LEAVE(ercd) +#define LOG_IROT_RDQ_ENTER(tskpri) +#define LOG_IROT_RDQ_LEAVE(ercd) +#define LOG_GET_TID_ENTER(p_tskid) +#define LOG_GET_TID_LEAVE(ercd, tskid) +#define LOG_IGET_TID_ENTER(p_tskid) +#define LOG_IGET_TID_LEAVE(ercd, tskid) +#define LOG_LOC_CPU_ENTER() +#define LOG_LOC_CPU_LEAVE(ercd) +#define LOG_ILOC_CPU_ENTER() +#define LOG_ILOC_CPU_LEAVE(ercd) +#define LOG_UNL_CPU_ENTER() +#define LOG_UNL_CPU_LEAVE(ercd) +#define LOG_IUNL_CPU_ENTER() +#define LOG_IUNL_CPU_LEAVE(ercd) +#define LOG_DIS_DSP_ENTER() +#define LOG_DIS_DSP_LEAVE(ercd) +#define LOG_ENA_DSP_ENTER() +#define LOG_ENA_DSP_LEAVE(ercd) +#define LOG_SNS_CTX_ENTER() +#define LOG_SNS_CTX_LEAVE(state) +#define LOG_SNS_LOC_ENTER() +#define LOG_SNS_LOC_LEAVE(state) +#define LOG_SNS_DSP_ENTER() +#define LOG_SNS_DSP_LEAVE(state) +#define LOG_SNS_DPN_ENTER() +#define LOG_SNS_DPN_LEAVE(state) +#define LOG_VSNS_INI_ENTER() +#define LOG_VSNS_INI_LEAVE(state) +#define LOG_VXSNS_CTX_ENTER(p_excinf) +#define LOG_VXSNS_CTX_LEAVE(state) +#define LOG_VXSNS_LOC_ENTER(p_excinf) +#define LOG_VXSNS_LOC_LEAVE(state) +#define LOG_VXSNS_DSP_ENTER(p_excinf) +#define LOG_VXSNS_DSP_LEAVE(state) +#define LOG_VXSNS_DPN_ENTER(p_excinf) +#define LOG_VXSNS_DPN_LEAVE(state) +#define LOG_VXSNS_TEX_ENTER(p_excinf) +#define LOG_VXSNS_TEX_LEAVE(state) +#define LOG_VXGET_TIM_ENTER(p_sysutim) +#define LOG_VXGET_TIM_LEAVE(ercd, sysutim) + +#define LOG_CHG_IPM_ENTER(ipm) /* プロセッサ依存部 */ +#define LOG_CHG_IPM_LEAVE(ercd) /* プロセッサ依存部 */ +#define LOG_GET_IPM_ENTER(p_ipm) /* プロセッサ依存部 */ +#define LOG_GET_IPM_LEAVE(ercd, ipm) /* プロセッサ依存部 */ + +#endif /* _TOOL_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/config/m68k/tool_defs.h b/uzume_prototype/kernel/config/m68k/tool_defs.h new file mode 100644 index 0000000..56cf4f7 --- /dev/null +++ b/uzume_prototype/kernel/config/m68k/tool_defs.h @@ -0,0 +1,76 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: tool_defs.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * 開発環境に依存する定義 + * + * このインクルードファイルは,t_stddef.h と itron.h の先頭でインクルー + * ドされる.他のファイルからは直接インクルードすることはない.他のイ + * ンクルードファイルに先立って処理されるため,他のインクルードファイ + * ルに依存してはならない. + */ + +#ifndef _TOOL_DEFS_H_ +#define _TOOL_DEFS_H_ + +/* + * コンパイラ依存のデータ型の定義 + */ +#define _int8_ char /* 8ビットの整数型 */ +#define _int16_ short /* 16ビットの整数型 */ +#define _int32_ int /* 32ビットの整数型 */ +#define _int64_ long long /* 64ビットの整数型 */ + +/* + * コンパイラの拡張機能のためのマクロ定義 + */ +#ifndef __cplusplus /* C++ には inline がある */ +#if __STDC_VERSION__ < 199901L /* C99 には inline がある */ +#define inline __inline__ +#endif /* __STDC_VERSION__ < 199901L */ +#endif /* __cplusplus */ + +#define Inline static inline + +#ifndef __cplusplus /* C++ には asm がある */ +#define asm __asm__ +#endif /* __cplusplus */ + +#define Asm __asm__ volatile + +#endif /* _TOOL_DEFS_H_ */ diff --git a/uzume_prototype/kernel/configure b/uzume_prototype/kernel/configure new file mode 100755 index 0000000..4507d6b --- /dev/null +++ b/uzume_prototype/kernel/configure @@ -0,0 +1,257 @@ +#! /usr/bin/perl +# +# TOPPERS/JSP Kernel +# Toyohashi Open Platform for Embedded Real-Time Systems/ +# Just Standard Profile Kernel +# +# Copyright (C) 2001-2003 by Embedded and Real-Time Systems Laboratory +# Toyohashi Univ. of Technology, JAPAN +# +# 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation +# によって公表されている GNU General Public License の Version 2 に記 +# 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア +# を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, +# 利用と呼ぶ)することを無償で許諾する. +# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 +# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー +# スコード中に含まれていること. +# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 +# 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 +# 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 +# の無保証規定を掲載すること. +# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 +# 用できない形で再配布する場合には,次のいずれかの条件を満たすこ +# と. +# (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 +# 作権表示,この利用条件および下記の無保証規定を掲載すること. +# (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに +# 報告すること. +# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 +# 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. +# +# 本ソフトウェアは,無保証で提供されているものである.上記著作権者お +# よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も +# 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 +# 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. +# +# @(#) $Id: configure,v 1.2 2012/06/17 00:24:19 suikan Exp $ +# + +require "getopt.pl"; + +# オプションの定義 +# +# -C プロセッサ名(必須) +# -S システム名 +# -T 開発環境名 +# -A アプリケーションプログラム名 +# -U 他のアプリケーションプログラムファイル +# (.o ファイル名で指定.複数指定可) +# -L カーネルライブラリ(libkernel.a)のディレクトリ名 +# (省略した場合,カーネルライブラリも make する) +# -D カーネル等のソースの置かれているディレクトリ +# -P 開発環境インストール時の PREFIX +# (現在は PREFIX を使っているファイルはない) +# -p perl のパス名(明示的に指定する場合) +# -l プログラミング言語(現時点ではC++のみサポート) +# -d テンプレートディレクトリを指定(デフォルトはsample) + +# 使用例(1) +# +# % ../configure -C m68k -S dve68k -A test1 -U test_support.o -L . +# +# 使用例(2) +# +# % ../configure -C linux +# アプリケーションプログラムは sample1 になる. + +# +# オプションの処理 +# +Getopt("CSTAULDPpld"); +unless ($opt_C) { + print STDERR "configure: -C option is mandatory\n"; + exit(1); +} + +$cpu = $opt_C; +$sys = $opt_S ? $opt_S : ""; +$tool = $opt_T ? $opt_T : ""; +$uname = $opt_A ? $opt_A : "sample1"; +$utask = $opt_U ? $opt_U : ""; +$kernel_lib = $opt_L ? $opt_L : ""; +$prefix = $opt_P ? $opt_P : "/usr/local"; +$perl = opt_p ? $opt_p : get_path("perl", ("/usr/local/bin", "/usr/bin")); +$lang = $opt_l ? $opt_l : ""; +$templatedir = $opt_d ? $opt_d : "sample"; + +# +# オブジェクトファイル名の拡張子を返す +# +sub get_objext { + local(@uname); + + use POSIX; + @uname = uname(); + if ($uname[0] =~ /^cygwin/i) { + return("exe"); + } + else { + return(""); + } +} + +# +# プログラムの場所を検索する +# +sub get_path { + local($progname, @pathlist) = @_; + local($path); + + foreach $path (@pathlist) { + if (-x $path."/".$progname) { + return($path."/".$progname); + } + } + return(""); +} + +# +# ファイルを変換する +# +sub convert { + local($infile, $outfile) = @_; + local($line, $varname, $varval); + + print STDERR "configure: Generating $outfile from $infile.\n"; + if (-f $outfile) { + print STDERR "configure: $outfile exists.", + " Save as $outfile.bak.\n"; + rename($outfile, $outfile.".bak"); + } + unless (open(INFILE, $infile)) { + print STDERR "configure: can't open $infile\n"; + exit(1); + } + unless (open(OUTFILE, "> ".$outfile)) { + print STDERR "configure: can't open $outfile\n"; + exit(1); + } + + while ($line = ) { + chop $line; + while ($line =~ /^(.*)\@\(([A-Za-z_]+)\)(.*)$/) { + $line = $1.$vartable{$2}.$3; + } + print OUTFILE $line,"\n"; + } + + close(INFILE); + close(OUTFILE); +} + +# +# サンプルを見つけてファイルを生成する +# +sub generate { + local($file, $mandatory) = @_; + local($path); + + if ($sys) { + $path = $sampledir.$file.".".$cpu."-".$sys; + if (-f $path) { + convert($path, $file); + return; + } + + $path = $sampledir.$file.".".$sys; + if (-f $path) { + convert($path, $file); + return; + } + } + + $path = $sampledir.$file.".".$cpu; + if (-f $path) { + convert($path, $file); + return; + } + + $path = $sampledir.$file; + if ($mandatory || -f $path) { + convert($path, $file); + } +} + +# +# 変数の初期化 +# + +# +# ソースディレクトリ名を取り出す +# +$pwd = `pwd`; chop $pwd; +if ($opt_D) { + $srcabsdir = $srcdir = $opt_D; +} +elsif ($0 =~ /(.*)\/configure/) { + $srcdir = $1; + if ($srcdir =~ /^\//) { + $srcabsdir = $srcdir; + } + else { + $srcabsdir = $pwd."/".$srcdir; + } +} +else { + $srcabsdir = $srcdir = $pwd; +} +$sampledir = $srcdir."/".$templatedir."/"; + +# +# 変数テーブルの作成 +# +%vartable = (); +$vartable{"CPU"} = $cpu; +$vartable{"SYS"} = $sys; +$vartable{"TOOL"} = $tool; +$vartable{"UNAME"} = $uname; +$vartable{"UTASK"} = $utask; +$vartable{"KERNEL_LIB"} = $kernel_lib; +$vartable{"SRCDIR"} = $srcdir; +$vartable{"SRCABSDIR"} = $srcabsdir; +$vartable{"PREFIX"} = $prefix; +$vartable{"OBJEXT"} = get_objext(); +$vartable{"PERL"} = $perl; +$vartable{"LANG"} = $lang; + +# +# ディレクトリのチェック +# + +if (! -d $srcdir."/config/".$cpu) { + print STDERR "configure: $srcdir/config/$cpu not exist\n"; + exit(1); +} +if ($sys && ! -d $srcdir."/config/".$cpu."/".$sys) { + print STDERR "configure: $srcdir/config/$cpu/$sys not exist\n"; + exit(1); +} +if ($tool && ! -d $srcdir."/config/".$cpu."-".$tool."/".$sys) { + print STDERR "configure: $srcdir/config/$cpu-$tool/$sys not exist\n"; + exit(1); +} +if ($tool && $sys && ! -d $srcdir."/config/".$cpu."-".$tool."/".$sys) { + print STDERR "configure: $srcdir/config/$cpu-$tool/$sys not exist\n"; + exit(1); +} + +# +# Makefile とアプリケーションファイルの生成 +# + +generate("Makefile", 1); +generate($uname.".c", 0); +generate($uname.".cpp", 0); +generate($uname.".h", 0); +generate($uname.".cfg", 0); diff --git a/uzume_prototype/kernel/doc/c++.txt b/uzume_prototype/kernel/doc/c++.txt new file mode 100644 index 0000000..42395c1 --- /dev/null +++ b/uzume_prototype/kernel/doc/c++.txt @@ -0,0 +1,735 @@ + + = TOPPERS/JSPカーネル ユーザズマニュアル = + (C++バインディング) + + (Release 1.4.1 対応,最終更新: 16-Sep-2004) + +------------------------------------------------------------------------ + TOPPERS/JSP Kernel + Toyohashi Open Platform for Embedded Real-Time Systems/ + Just Standard Profile Kernel + + Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + Toyohashi Univ. of Technology, JAPAN + Copyright (C) 2003-2004 by Takagi Nobuhisa + + 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + によって公表されている GNU General Public License の Version 2 に記 + 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + 利用と呼ぶ)することを無償で許諾する. + (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + スコード中に含まれていること. + (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + の無保証規定を掲載すること. + (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + と. + (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + 作権表示,この利用条件および下記の無保証規定を掲載すること. + (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + 報告すること. + (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + + 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. +------------------------------------------------------------------------ + +1.C++バインディングの概要 + +1.1 目的 + +TOPPERS/JSPカーネルは、本来C言語APIを提供するものであり、そのままでは +C++を用いたアプリケーション開発を行う上で支障がある。 +C++バインディングは、TOPPERS/JSPカーネルが提供するサービスコールをC++ +から呼出すことを可能にし、かつTOPPERS/JSPカーネル上で標準C++の機能を +利用できるようにするものである。 + +1.2 開発環境と実行環境 + +C++バインディングでは、GCC等のGNU開発環境を使用する。なお、Windows上 +のシミュレーション環境(Visual C++)でC++を使用する際は、C++バインデ +ィングの機能を必要としない。 + +現在、C++バインディングがサポートする実行環境は、MS7727CP01(SH3)およ +びAKI-H8/3069Fである。他の実行環境で使用するには、ターゲット依存部の +Makefile.configおよびリンカスクリプトの修正が必要となる。 +また、Linux上のシミュレーション環境では使用することができない。 + +1.3 C++バインディングの機能の概要 + +標準C++の機能のうち、実行環境に依存する部分について、TOPPERS/JSPカー +ネルに対応させている。具体的には、非ローカルオブジェクトの初期化処理、 +終了処理、グローバルなnew演算子とdelete演算子、例外処理、およびフリー +スタンディング環境における標準ライブラリ関数である。 + +GCC自体が未サポートの機能(export、ユニバーサル文字名等)を補完するも +のではない。 + +1.4 C++バインディングの使用方法 + +TOPPERS/JSPカーネルでC++バインディングを使用するには、コンフィギュレ +ーションファイル(.cfg)から、jsp/systask/cxxrt.cfgをインクルードする +だけでよい。(静的APIのINCLUDEではなく、プロプロセッサ指令の#include +を使用すること) + +TOPPERS/JSPカーネルのconfigureを使用する場合、C++を使うには"-l c++" +オプションを付加する必要がある。 + + +2.C++バインディングの機能 + +2.1 非ローカルオブジェクトの初期化処理 + +関数の外部で宣言されたオブジェクト(特定の名前空間やクラスの静的デー +タメンバを含む)のコンストラクタを、起動時に呼出す機能を提供する。 + +非ローカルオブジェクトのコンストラクタは、kernel_start関数の呼出しよ +り前に実行され、syslogの機能を使用することはできない。 +また、コンストラクタの内部では、vsns_iniを除くサービスコールを呼出す +ことはできない。 + +関数の内部で宣言されたオブジェクトは、起動時ではなく、宣言された箇所 +に最初に実行パスが差し掛かったときにコンストラクタが呼出されるため、 +起動時の初期化処理には含まれない。 +そうしたコンストラクタの呼出しはマルチタスクに対応しないため、ユーザ +は必要に応じて排他制御を独自に行う必要がある。 + +2.2 終了処理 + +静的なオブジェクト(関数内で宣言されたものを含む)のデストラクタは、 +std::exit関数の中から呼出される。明示的にstd::exit関数を呼出さない限 +り、全タスクが終了したとしてもデストラクタが呼出されることはない。 +なお、kernel_exit関数を呼出した場合も、std::exit関数を呼出した場合と +同様に、静的なオブジェクトのデストラクタは呼出される。 + +終了時の動作順序は、静的APIのVATT_TERで登録した終了処理ルーチンが呼出 +された後、std::atexit関数で登録した終了時関数が呼出され、最後にデスト +ラクタが呼出される。 +デフォルトの標準ストリーム(stdin, stdout, stderr)をサポートする場合、 +それらのクローズ処理はデストラクタの呼出し後に行わなければならない。 +(ユーザの手でカスタマイズする必要がある) + +2.3 グローバルなnew演算子とdelete演算子 + +TOPPERS/JSPカーネルのマルチタスク環境および非マルチタスク環境(初期化 +または終了処理時)で動作するnewおよびdelete演算子を提供する。 +GCCはグローバルなnewおよびdelete演算子をstd::mallocおよびstd:free関数 +を用いて実装しているため、NEWLIBのmallocおよびfree関数に排他制御を追 +加することで実現している。 + +C++バインディングは、C++のフリースタンディング環境を対象としているが、 +上記の理由により、本来フリースタンディング環境ではサポートされない、 +std::mallocおよびstd::free関数も結果的にサポートしている。 +おそらくはstd::callocおよびstd::realloc関数も動作すると思われるが、検 +証は行っていない。 + +標準C++のグローバルなnewおよびdelete演算子には、例外をスローすること +がない、const std::nothrow_t&を引数にとる配置構文型のものもあるが、通 +常のもの同様に使用することができる。 + +2.4 例外処理 + +C++の言語機能である例外処理機能(try、catchおよびthrow)を提供する。 +例外処理はコンパイラの実装に密接に絡むため、コンパイラ自体にパッチが +必要になる。 + +例外処理は、tryおよびcatchの位置と、throwからcatchまでの間に存在する +ローカルオブジェクトのデストラクタを管理する必要がある。したがって、 +コンパイラにとって未知の方法でコンテキストが切り替わった場合には、例 +外処理用の管理情報も切り替える必要が生じる。 +C++バインディングは、マルチタスク環境および非マルチタスク環境(初期化 +または終了処理時)で、コンテキストに応じて管理情報を切り替える機能や +同期機能を実現している。 + +GCCでは、コンパイル時に-fno-exceptionsオプションを指定することで、例 +外処理を無効にすることができるが、これはオプションを指定した翻訳単位 +に対してのみ通用することであり、ライブラリ等は、通常通り、例外処理が +使える場合と同様に振舞うことになる。したがって、new、dynamic_cast、 +あるいはtypeid演算子が失敗した場合等には、予期せぬ誤動作につながる危 +険性があるため、必ずしも推奨しない。 + +2.5 標準ライブラリ関数 + +フリースタンディング環境のC++では、終了処理に関する標準ライブラリ関数 +として、std::abort、std::atexit、およびstd::exit関数がサポートされる。 +C++バインディングでも、これら3種類の関数を提供している。 + +(1) std::abort + +std::abort関数は、静的APIのVATT_TERで登録された終了処理ルーチンや、 +std::atexit関数で登録された終了時関数、オブジェクトのデストラクタを呼 +出すことなく、システムを異常終了する。 +システムの終了処理は、マルチタスク動作中はターゲット依存部で定義され +るkernel_abort関数に従い、非マルチタスク動作中(初期化または終了処理時) +はNEWLIBの_exit関数に従う。 + +C++バインディングでは、関数へのポインタvoid (*_atabort)(void)が0以外 +に定義されている場合、実際の終了処理より前にそれを呼出すようになって +いる。 +ホスト環境のstd::abortは、実際の終了処理の前にstd::raise(SIGABRT);を +呼出すが、_atabortを適切に設定することで同様の機能をエミュレートする +ことができる。 + +(2) std::atexit + +std::atexit関数は、std::exitまたはkernel_exit関数から呼出される終了時 +関数を登録する。std::atexit関数で登録した関数は、std::abort関数で終了 +した場合や、vsns_iniがTRUEを返す期間にstd::exit関数を用いた場合には、 +呼出されることがない。 + +静的なオブジェクトのデストラクタは、実際にはstd::atexit関数を用いるこ +とで実現している。ただし、デストラクタの呼出しは、std::atexit関数で登 +録されたその他のいかなる終了時関数よりも後に呼出される。 + +std::atexit関数で登録できる終了時関数は、(デストラクタの登録を除いて) +32個までである。 + +(3) std::exit + +std::exit関数は、C++の標準的な終了処理を行う。詳細な動作は、2.2 終了 +処理を参照のこと。 + +std::exit関数を用いて終了した場合、ローカルオブジェクトのデストラクタ +が呼出されることはない。 + + +3.C++実行環境としてのTOPPERS/JSPカーネル + +3.1 BOOL型 + +標準C++には、論理型であるbool型と、論理値であるtrueおよびfalseが存在 +する。しかし、TOPPERS/JSPカーネルがC言語で実装されているため、言語間 +の互換性をとる意味でもBOOL型にはint型を使用する必要がある。 +カーネルのコンパイルにC99を用いた場合でも、_Bool型とbool型の間には、 +厳密な互換性があるとは言いがたいため、やはりint型を使用した方が無難で +ある。 + +3.2 タスクからの例外リーク + +タスクのエントリ関数からキャッチされない例外がリークした場合の動作は +未定義である。 + +3.3 ATT_INIとVATT_TER + +静的APIのATT_INIおよびVATT_TERで登録された関数から例外がリークした場 +合の動作は未定義である。 + +3.4 非タスクコンテキストとタスク例外処理ルーチン + +非タスクコンテキストとタスク例外処理ルーチンでは、例外処理、newおよび +delete演算子を使用することができない。参照型に対するdynamic_castや、 +仮想関数を持つクラスへの参照やポインタに対するtypeidも、例外が発生す +る可能性があるため、使用することができない。また、標準ライブラリ関数 +を呼出すこともできない。 + +なお、タスク例外許可状態で自タスクに対するras_texによって呼出されたタ +スク例外処理ルーチンに限り、上記の制約は受けない。ただし、タスク例外 +処理ルーチンから例外をリークした場合の動作は未定義である。 + +3.5 サービスコールの例外指定 + +TOPPERS/JSPカーネルが提供する全サービスコールは例外をスローすることが +ないため、例外指定throw()が付加される。 +これにより、例外処理のためのテーブルが生成されることを最小限に抑えら +れる場合があり、主として空間効率の向上が期待できる。 + + +4.開発環境の構築 + +C++開発環境の構築は、基本的には「GNU開発環境構築マニュアル」の内容に +従うが、一部異なる点があるので、相違点を中心に解説する。 +なお、動作確認には、ホスト環境としてはCygwin 1.3.22を使用した。 + +4.1 必要なソフトウェア + +C++開発環境を構築するには、GCC-COREおよびG++、またはGCCが必要になる。 +また、NEWLIBは必須である。 + + GNU開発環境 + BINUTILS(アセンブラ,リンカなど) + GCC(C/C++コンパイラ) + GDB(デバッガ) + NEWLIB(標準Cライブラリ) + Perl(動作確認は 5.8.0) + GNU Make(動作確認は 3.80) + GNU sed(動作確認は 4.0.7) + patch(動作確認は 2.5.8) + +4.2 BINUTILSのインストール + +BINUTILSは、GCCのインストールに必要なため,GCCに先だってインストール +する。BINUTILSのインストール手順は次の通り。 + + % mkdir + % cd + % /configure --target= --prefix=\ + --disable-nls + % make + % make install + +4.3 GCCへのパッチ + +Cygwin上でGCC 3.2.3をmakeする場合に一部障害が発生するため、次のパッチ +が必要となる。(SH版のみ。GCC 3.3.x以降では不要) + + % cp gcc-3.2.3_fixinc_gnu-regex.patch + % cd + % patch -p1 < gcc-3.2.3_fixinc_gnu-regex.patch + +以下の手順に従って、GCCをTOPPERS/JSPカーネルに対応させるためのパッチ +をあてる。 + + % cp gcc-3.2.3_gthr-toppers-1.patch + % cd + % patch -p1 < gcc-3.2.3_gthr-toppers-1.patch + +4.4 GCCのインストール(1) + +GCCのインストールにはNEWLIBが必要であるが、NEWLIBをインストールするに +はGCCが必要なため、若干の工夫が必要になる。 + + % mkdir + % cd + % /configure --target= --prefix=\ + --enable-languages=c,c++ --enable-threads=toppers\ + --disable-nls + % make all-gcc + % make install-host + +4.5 NEWLIBのインストール + +次の手順に従って、NEWLIBをインストールする. + + % mkdir + % cd + % /configure --target= --prefix= + % make + % make install + +なお、CygwinのバージョンによってはNEWLIBのインストールに失敗する場合 +がある。そのような場合は、Cygwinのバージョンを変更するか、NEWLIBをバ +イナリで入手すること。 + +4.6 GCCのインストール(2) + +次の手順に従って、GCCの残り部分をインストールする. + + % cd + % make + % make install + + +5.C++バインディングの実装詳細 + +5.1 ファイル構成 + +(1) cxxrt.cfg + +cxxrt.cfgはC++対応ランタイムの内部で使用するオブジェクトを生成する。 +C++の機能を使用する場合には、必ずコンフィギュレーションファイルから、 +cxxrt.cfgをインクルードする必要がある。 + +(2) cxxrt.c + +cxxrt.cはC++対応ランタイムの本体であり、例外処理等で必要となる関数や +変数の定義が行われる。 + +(3) newlibrt.c + +newlibrt.cはNEWLIBの関数をTOPPERS/JSPカーネルに対応させるためのランタ +イムであり、C++を使用する場合には必須である。 +このランタイムは、C++を使用しない場合でも、NEWLIBを使用する際には単独 +で使用することができる。 + +5.2 同期機能 + +例外処理および標準C++ライブラリ内部で使用する同期機能を提供する関数群。 +標準C++ライブラリはフリースタンディング環境ではサポートされないが、お +そらくlibstdc++の全機能を使用することができると思われる。(ただし、動 +作は確認していない) + +(1) int _toppers_cxxrt_lock(_toppers_cxxrt_sync_t *sync); + +マルチタスク動作時では、ロックを掛け、クリティカルセクションを開始す +る。非マルチタスク動作時には何もしない。 +成功時には0を返し、失敗時には負の値を返す。 + +この関数はネスティング可能である。 + +(2) int _toppers_cxxrt_trylock(_toppers_cxxrt_sync_t *sync); + +_toppers_cxxrt_lock関数とほぼ同じであるが、既に他のタスクによってロック +中の場合でも待機状態には移行せず、単に呼出しに失敗する。 +現在の実装では、_toppers_cxxrt_lock関数はディスパッチ禁止を用いて実現し +ているため、どちらも同じである。 + +(3) int _toppers_cxxrt_unlock(_toppers_cxxrt_sync_t *sync); + +マルチタスク動作時では、ロックを解除し、クリティカルセクションを終了 +する。非マルチタスク動作時には何もしない。 +成功時には0を返し、失敗時には負の値を返す。 + +(4) int _toppers_cxxrt_once(_toppers_cxxrt_once_t *once, + void (*func)(void)); + +指定した関数を、システム全体で一度だけ実行させる。funcを実行中に、異 +なるタスクでも同じ関数を実行させようとした場合、funcの実行が完了する +まで待機状態に移行する。 +成功時には0を返し、失敗時には負の値を返す。 + +5.3 タスクローカル記憶域機能 + +タスクごとに用意される、見かけ上静的な記憶域を提供する関数群であり、 +例外処理で使用される。 +タスクローカル記憶域として確保できるのは、デフォルトでは2個までである +が、_CXXRT_KEY_MAXマクロをユーザ定義することで、3個以上に拡張すること +ができる。 + +(1) int _toppers_cxxrt_key_create(struct _toppers_cxxrt_tls **key, + void (*dtor)(void*)) + +タスクローカル記憶域に確保する変数を新規作成する。 +成功時には0を返し、*keyに変数を識別するためのキーが格納される。 +dtorには、キーを削除する際に、タスクごとの各変数に対して実行すべき終 +了処理を指定する。 +失敗時には負の値を返す。 + +(2) int _toppers_cxxrt_key_delete(struct _toppers_cxxrt_tls *key); + +_toppers_cxxrt_key_create関数で作成したキーを削除する。 +成功時には0を返し、失敗時には負の値を返す。 + +5.4 NEWLIBのカスタマイズ + +(1) void __malloc_lock(struct _reent *ptr); + +mallocおよびfreeの排他制御を行う。他のタスクによってロックされている +状況で呼出された場合は待機状態に移行する。 + +(2) void __malloc_unlock(struct _reent *ptr); + +__malloc_lock関数によるロックを解除する。 + +(3) void *_sbrk_r(struct _reent *ptr, ptrdiff_t nbytes); + +プログラムのヒープ領域をnbyteだけ拡大する。成功時には、新しい領域の先 +頭へのポインタを返す。失敗時は負の値を返し、errnoおよびptr->_errnoに +ENOMEMを設定する。 + +ヒープ領域には、外部識別子end(.bssセクションの終端)から、マルチタス +ク動作開始前のスタックポインタまでを使用する。 +メモリマップ上、複数のメモリイメージが発生するターゲットでは、.bssセ +クションとスタックポインタの初期値を同一イメージ上に配置する必要があ +る。 +ヒープ領域と起動時のスタック領域が連続していない場合、sys_config.h内 +でHEAP_TOPマクロをヒープの終端アドレスに定義する必要がある。 + +本来であれば、_sbrk_r関数の原始関数にあたる_sbrk関数をカスタマイズす +べきであるが、ターゲットによっては、_write関数等と同一の翻訳単位にオ +リジナルの_sbrk関数が定義されており、リンク時に障害が発生する原因とな +るため、_sbrk_r関数をカスタマイズしている。 + +5.5 その他 + +(1) int main(); + +JSPカーネル上で動作するC/C++プログラムはフリースタンディング環境であ +るため、エントリ関数はmainではなくkernel_startである。しかし、NEWLIB +ではエントリポイントとしてmainが使用されることを期待しているため、 +main関数がなければリンクエラーになる場合がある。 +C++対応ランタイムでは、リンクを解決することのみを目的としてmain関数を +定義する。 + + +6.ターゲット依存部の実装 + +現在、C++バインディングがサポートする実行環境は、MS7727CP01(SH3)およ +びAKI-H8/3069Fである。 +また、GNU開発環境のターゲットとして、SH用にはsh-hitachi-elf、H8用には +h8300-hmsを使用している。 + +6.1 GNU開発環境に関するもの + +GNU開発環境全般に関する要素として、以下のものがある。 + +(1) リンカスクリプトの対応 + +C++を用いる場合のリンカスクリプトには、.ctorおよび.dtor、すなわちグロ +ーバルなコンストラクタやデストラクタのポインタテーブルを形成するため +のセクション定義が必要である。 +また、.eh_frameや.gcc_except_tableなどの例外処理用のセクション定義も +必要になる。 + +6.2 ELF形式に関連するもの + +SHに限らず、ELF形式に依存する要素として、下記内容の対応が必要である。 + +(1) crti.o, crtbegin.o, crtend.o, crtn.oのリンク + +グローバルなコンストラクタおよびデストラクタの呼出しや、例外処理関連 +に必要なため、これらのファイルを正しい順序でリンクする必要がある。 +リンクの順序は、 + +start.o crti.o crtbegin.o ユーザプログラム libkernel.a libstdc++.a +libm.a libc.a libgcc.a crtend.o crtn.o + +である。 +この指定には、ターゲット依存部のconfig/sh3/Makefile.configにおいて、 + +START_OBJS = \ + start.o \ + $(shell $(CC) $(COPTS) -print-file-name=crti.o | sed -e 's/\\/\//g') \ + $(shell $(CC) $(COPTS) -print-file-name=crtbegin.o | sed -e 's/\\/\//g') +END_OBJS = \ + $(shell $(CC) $(COPTS) -print-file-name=crtend.o | sed -e 's/\\/\//g') \ + $(shell $(CC) $(COPTS) -print-file-name=crtn.o | sed -e 's/\\/\//g') + +のように定義されている。 +なお、文字'\'を'/'に置換しているのは、MinGW + MSysの環境で使用できる +ようにするためである。 +また、make時に誤ってcrti.oなどのコンパイルを試みようとすることを回避 +する目的で、START_OBJSとEND_OBJS(およびstart.o)のmakeルールを特化し +ている。 + +(2) リンカスクリプトの対応 + +.initや.fini等のELF形式特有のセクション定義が必要である。 + +6.3 SHに特有のもの + +ターゲットがSHの場合に特有な要素として、以下のものがある。 + +(1) _init関数および_fini関数 + +GCCの多くのターゲットでは、ELF形式の場合、初期化関数および終了時関数 +として、_init関数と_fini関数を使用する。しかし、SHの場合にはinit関数 +とfini関数(先頭の下線がない)を使用している。そのため、tool_defs.h +において、initおよびfiniにそれぞれマクロ置換している。 + + +7.アプリケーション作成におけるヒント + +7.1 静的なオブジェクト + +静的なオブジェクトは普通に定義することができるが、以下の点に注意する +必要がある。 + +(1) カーネル非動作状態 + +グローバルなコンストラクタやデストラクタは、カーネル非動作状態で呼出 +される。したがって、これらの関数内では、μITRONのサービスコールを呼出 +すことは出来ない。唯一呼出すことが出来るサービスコールは、JSPカーネル +の独自拡張であるvsns_iniだけである。 + +クラスをグローバルでもローカルでも使えるようにするには、必要に応じて、 +vsns_iniでカーネルの動作状態を判別し、状態に応じて処理を分ける必要が +ある。 + +(2) 関数内の静的オブジェクト + +関数内で定義された静的オブジェクトのコンストラクタは、必ずしも起動時 +に呼出される訳ではなく、実行パスが最初にそのオブジェクトの定義箇所に +差掛かった時点で呼出される。 +したがって、コンストラクタがカーネル動作状態で呼出されるか、非動作状 +態で呼出されるかは、そのオブジェクトが定義された関数が最初に呼出され +るタイミングに依存する。 + +一般的に、この問題を回避するにはDouble-Checked Lockingと呼ばれる手法 +が用いられる。 + +class foo +{ + // クラス定義 +}; + +void func() +{ + static foo* ptr = 0; + if (ptr == 0) + { + wai_sem(SEMID); + if (ptr == 0) + { + static foo x; + ptr = &x; + } + sig_sem(SEMID); + } + // 関数本体の処理 +} + +(3) システムログの使用 + +デストラクタでは、システムログを制限なく使用することができるが、グロ +ーバルなコンストラクタでは、デフォルトではシステムログを使用すること +ができない。 + +7.2 new演算子とdelete演算子 + +(1) 排他制御について + +new演算子とdelete演算子は、処理速度を向上するため、フリーストアからの +メモリ割付け(std::malloc関数を用いて実装)はディスパッチ禁止状態で行 +っている。 +アプリケーションの要求によって、他の方法で排他制御を行う必要がある場 +合には、systask/cxxrt.cの中の__malloc_lock関数と__malloc_unlock関数を +カスタマイズすればよい。 + +(2) 使用に関する制約 + +非タスクコンテキストやタスク例外処理ルーチンで呼出すことはできない。 +カーネル非動作状態(vsns_ini関数がTRUEを返す期間)では、通常通り使用 +することができる。 + +(3) オーバーロードについて + +グローバルなnew演算子とdelete演算子は、実行効率はまずまずであるが、空 +間効率は決して高いとはいえない。また、特定のクラスの最低生成数につい +ても評価しにくいため、厳密な動作保証を必要とするクラスに関しては、new +演算子とdelete演算子をオーバーロードすることを推奨する。 + +オーバーロードに際しては、固定長メモリプール等を用いることが出来る。 +例えば、以下のようにクラスを定義することが出来る。 + +#include +#include +#include "kernel_id.h" + +class foo +{ + static ID mpfid_; +public: + static void* operator new(std::size_t size) throw() + { + VP ptr; + get_mpf(mpfid_, &ptr); + assert(ptr != 0); + return ptr; + } + static void operator delete(void* ptr) throw() + { + rel_mpf(mpfid_, ptr); + } +}; + +static ID foo::mpfid_ = FOO_MPF; // 固定長メモリプールのID番号 + +また、new演算子の配置構文を使用することで、タイムアウト指定等の機能を +追加することも可能である。 + +static void* operator new(std::size_t size, TMO tmout); +static void operator delete(void* ptr, TMO) throw(); + +なお、new演算子をオーバーロードする場合、必ず対応するdelete演算子も合 +わせてオーバーロードしなければならない。 +上記の場合、delete演算子でTMO型の引数を使用することはないが、newされ +たクラスのコンストラクタから例外がスローされた場合(new演算子そのもの +ではない)、対応するdelete演算子が必要になる。 + +7.3 例外処理 + +(1) 例外処理の内部処理 + +GCCでは、configure時に--enable-sjlj-exceptionsを指定した場合、例外処 +理を実現するためにsetjmpおよびlongjmp関数を使用している。ターゲットに +よっては他の実現方法を選択することもできるが、動作確認は行っていない。 + +例外をT型のオブジェクトをthrowした場合、内部的には以下の順序で処理が +行われる。 + + 1) std::malloc関数により、T型のオブジェクトを格納可能なメモリブロ + ックが割付けられる。 + 割付けに失敗した場合、緊急用の静的なバッファが当てられる。 + + 2) T型のコピーコンストラクタが呼出され、throwされたオブジェクトの + コピーが、1)で割付けたブロックを用いて生成される。 + コピーコンストラクタ内で例外がthrowされた場合はstd::terminate + 関数が呼出された後、std::abort関数により異常終了する。 + + 3) 例外処理フレームを検索し、catchされるまでの経路に存在するロー + カルなオブジェクトのデストラクタが呼出される。 + ここで、デストラクタ内で例外がthrowされた場合はstd::terminate + 関数が呼出された後、std::abort関数により異常終了する。 + + 4) T型(またはその基底クラス)に対応するcatchブロックが見つかった + 場合は、そのブロックに広域分岐する。catchブロックのパラメータ + が値渡しの場合、コピーコンストラクタによって新しいローカルなオ + ブジェクトが生成される。 + 対応するcatchブロックが見つからなかった場合や値渡しの際に例外 + がthrowされた場合はstd::terminate関数が呼出された後、std::abort + 関数により異常終了する。 + + 5) catchブロック内の処理が実行される。 + + 6) 上記2)で生成されたオブジェクトのデストラクタが呼出される。 + +(2) タスク再起動時の初期化 + +JSP 1.4では再起動時の初期化処理として_toppers_cxxrt_reset_specific関 +数を呼び出す必要があったが、JSP 1.4.1では_toppers_cxxrt_reset_specific +関数の呼び出しは必要としない。 +その代わり、タスクのエントリ関数から例外が動作した場合の動作は未定義 +である。 + +(3) 効率の向上 + +configure時に--enable-sjlj-exceptionsを指定した場合、例外をthrowしな +い場合でも、若干の実行効率の低下が起こる。また、空間効率が著しく低下 +する場合がある。 +効率を少しでも改善するには、以下の方法が有効である。 + + 1) できるだけインライン関数を使用する。例外処理に関するオーバーヘ + ッドの多くは、関数の呼出しに付随して発生する。 + + 2) 決して例外を発生しない関数には、必ず例外指定throw()を付加する。 + 特に、C言語で実装された関数は、必ずthrow()を付けること。 + + 3) 例外が発生するかもしれない関数には例外指定を付けない。 + 例外指定を付けるとフィルタリング処理が暗黙的に展開される。 + + 4) 可能な限りデストラクタを定義しない。 + 関数内でデストラクタを持つローカルなオブジェクトを使わなければ、 + 例外をthrowするかもしれない関数を呼んでも、オーバーヘッドにな + らない場合がある。 + + 5) 一時オブジェクトの生成を避ける + 一時オブジェクト生成はそれ自体がオーバーヘッドであるだけでなく、 + コンストラクタで例外が発生する機会を作り、またデストラクタが呼 + び出される機会を増やす。 + +7.4 C言語との混在 + +C++からC言語で定義した関数を呼出す場合、extern "C"により"C"リンケージ +であることを明示的に指定しなければならない。 + +extern "C" int foo(); + +extern "C" { + void hoge(); + void bar(); +} + +また、C言語から呼出す可能性のある関数をC++で定義する場合もextern "C" +を関数定義に付加する必要がある。 + +CとC++では互換性のない型もあるため、両方から使用する関数に、そうした +型を使用すべきではない。例えば、boolやクラス型などである。 +特に、kernel_cfg.cはC言語であるため、タスク等の拡張情報にクラスのポイ +ンタを指定することはできない。 + +C関数からC++関数の呼出しは、原則として行うべきではない。内部で例外が +発生した場合、動作が保証できないのがその理由である。 +通常の呼出しの他、コールバック関数を用いる場合も例外ではない。 + +C++関数からC関数を呼出す場合、C関数には例外指定throw()を付加すべきで +ある。こうすることで大幅に効率の向上が期待できる。 + +以上 + diff --git a/uzume_prototype/kernel/doc/config.txt b/uzume_prototype/kernel/doc/config.txt new file mode 100644 index 0000000..2289373 --- /dev/null +++ b/uzume_prototype/kernel/doc/config.txt @@ -0,0 +1,1665 @@ + + = JSPカーネル ターゲット依存部 ポーティングガイド = + + (Release 1.4.3対応,最終更新: 22-Apr-2007) + +------------------------------------------------------------------------ + TOPPERS/JSP Kernel + Toyohashi Open Platform for Embedded Real-Time Systems/ + Just Standard Profile Kernel + + Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + Toyohashi Univ. of Technology, JAPAN + Copyright (C) 2004-2005 by Embedded and Real-Time Systems Laboratory + Graduate School of Information Science, Nagoya Univ., JAPAN + + 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + によって公表されている GNU General Public License の Version 2 に記 + 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + 利用と呼ぶ)することを無償で許諾する. + (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + スコード中に含まれていること. + (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + の無保証規定を掲載すること. + (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + と. + (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + 作権表示,この利用条件および下記の無保証規定を掲載すること. + (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + 報告すること. + (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + + 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + + @(#) $Id: config.txt,v 1.1 2009/01/31 05:27:37 suikan Exp $ +------------------------------------------------------------------------ + + +このドキュメントでは,JSPカーネルのターゲット依存部で提供すべきデータ +型や関数などについて解説する. + +JSPカーネルのターゲット依存部は,依存部の再利用性を考慮し,プロセッサ +依存部,システム依存部,開発環境依存部に分離している.開発環境依存部に +関しては,おおよその役割分担を決まっているが,プロセッサ依存部とシステ +ム依存部については,役割分担が明確なわけではない.以下のデータ型や関数 +の多くは,どの依存部で定義してもかまわない.シミュレーション環境などの +極端なケースでは,システム依存部を全く使わないことも考えられる. + +JSPカーネルのデバイスドライバ等は,トロン協会において検討されているデ +バイスドライバ設計ガイドラインに沿う形で実装している.デバイスドライバ +設計ガイドラインWGの中間報告は,以下のURLからダウンロードすることがで +きる. + http://www.ertl.jp/ITRON/GUIDE/device-j.html + + +1.システム構築環境 + +JSPカーネルは,GNU開発環境を標準としており,コンフィギュレータや開発支 +援ユーティリティは,主にGNU開発環境と組み合わせて動作するように実装さ +れている.そこで以下では,GNU開発環境を用いる場合を中心に説明する.そ +れ以外の開発環境を用いる場合には,開発支援ユーティリティの改造が必要に +なったり,一部のユーティリティが使用できないケースがある. + +(1) ターゲット略称の決定 + +新しいターゲット依存部を作成する時は,プロセッサ略称とシステム略称を定 +める.また,GNU以外の開発環境を用いる場合には,開発環境略称を定める. +これらの略称に用いる文字は,英文字,数字および "_" に限定する. + +(2) ターゲット依存部のファイルを置くためのディレクトリ + +ターゲット依存部のファイルを置くためのディレクトリを,config の下に作 +成する.ディレクトリ名は,ターゲット略称から以下のように決定する.ただ +し,ディレクトリ名に含まれる英文字はすべて小文字とする.すなわち,ディ +レクトリ名には,英小文字,数字および "_" のみを使うことができる. + +GNU開発環境を用いる場合には,config の下にプロセッサ略称を用いてプロセッ +サ依存部のファイルを置くためのディレクトリ(プロセッサ依存部ディレクト +リ)を,さらにその下にシステム略称を用いてシステム依存部のファイルを置 +くためのディレクトリ(システム依存部ディレクトリ)を作成する. + +GNU以外の開発環境を用いる場合には,config の下にプロセッサ略称と開発環 +境略称を "-" で連結した名称(例えば,"sh3-hitachi")で,プロセッサ依存 +部ディレクトリを作成する.さらにその下に,システム略称を用いてシステム +依存部ディレクトリを作成する.これらのディレクトリには,GNU開発環境用 +のディレクトリに置かれているファイルと異なるファイルのみを置く.ファイ +ルが置かれていない場合には,GNU開発環境用のディレクトリを参照する.た +だし,Makefile.config に関しては,GNU開発環境用のディレクトリを参照し +ないため,同じ内容であっても用意しなければならない. + +(3) システム構築方法の設定 + +プロセッサ依存部ディレクトリおよびシステム依存部ディレクトリの下に,そ +れぞれ,システム構築方法を設定するための Makefile.config ファイルを用 +意する.これらのファイルは,Makefile からインクルードされる. + +プロセッサ依存部およびシステム依存部の Makefile.config で定義すべき変 +数には,開発環境のコマンド名を設定するもの,コンパイルオプションを設定 +するもの,その他のものがある.ここでは,その他の変数とその定義の方法に +ついて説明する. + +(3-1) TEXT_START_ADDRESS テキストセクションの先頭番地 +(3-2) DATA_START_ADDRESS データセクションの先頭番地 + +各セクションの先頭番地の指定が必要な場合には,これらの変数に先頭番地を +定義する. + +(3-3) LDSCRIPT リンカスクリプトのファイル名 + +専用のリンカスクリプトを用いる場合には,この変数にリンカスクリプトのファ +イル名を定義する.ファイル名は,config ディレクトリからの相対パスで指 +定する. + +(4) 開発環境のコマンド名の設定 + +(4-1) TARGET ターゲット名 + +GNU開発環境を configure する場合に指定するターゲット名で,コンパイラ等 +のコマンド名の先頭に付与される文字列(最後の "-" は不要)に定義する. +例えば,TARGET が m68k-unknown-elf に定義された場合には,コンパイラと +して m68k-unknown-elf-gcc が使われる.この変数が定義されない場合には, +単なる gcc が使われる.GNU以外の開発環境を用いる場合には,定義する必要 +がない. + +(4-2) CC Cコンパイラドライバの名称 +(4-3) CXX C++コンパイラドライバの名称 +(4-4) AS アセンブラの名称 +(4-5) LD リンカの名称 +(4-6) AR アーカイバの名称 +(4-7) NM nmプログラムの名称 +(4-8) RANLIB ranlibプログラムの名称 +(4-9) OBJCOPY objcopyプログラムの名称 +(4-10) OBJDUMP objdumpプログラムの名称 + +GNU以外の開発環境を用いる場合に,それぞれのコマンドの名称に定義する. +対応するコマンドがない場合や,コマンドパラメータが異なる場合には, +Makefile 中のそのコマンドを呼び出している部分を変更する必要がある.GNU +開発環境では,これらは TARGET を用いて定義されるので,定義する必要はな +い. + +(5) コンパイルオプションの設定 + +(5-1) CDEFS マクロ定義オプション(-D) +(5-2) INCLUDES インクルードファイルのディレクトリ指定オプション(-I) +(5-3) COPTS コンパイラに対するその他のオプション +(5-4) LDFLAGS リンカに対するオプション +(5-5) LIBS ライブラリリンク指定のためのオプション + +ターゲットに依存して,すべてのソースファイルに共通するコンパイルオプショ +ンの追加が必要な場合には,オプションの種類毎に上に示した変数に定義する. + +システム依存部の Makefile.config でこれらの変数を定義する時は,":=" を +用いて,それまでの定義に追加する形で行う.例えば,プロセッサ依存部で +「-Wall -g -O2 -m68020-40」というオプションを追加したい場合には,以下 +の記述をプロセッサ依存部の Makefile.config に含める. + + COPTS := $(COPTS) -Wall -g -O2 -m68020-40 + +それに対して,システム依存部の Makefile.config は Makefile の最初でイ +ンクルードされるため,このような配慮は必要ないが,変更に強くするために +同様に扱うことにする. + +ほとんどの場合に,プロセッサ依存部の Makefile.config には以下の記述を +含める必要がある. + + GNU開発環境を用いる場合 + INCLUDES := -I$(SRCDIR)/config/$(CPU) + + その他の開発環境を用いる場合 + INCLUDES := -I$(SRCDIR)/config/$(CPU)-$(TOOL) -I$(SRCDIR)/config/$(CPU) + +また,システム依存部の Makefile.config には以下の記述を含める必要があ +る. + + GNU開発環境を用いる場合 + INCLUDES := $(INCLUDES) -I$(SRCDIR)/config/$(CPU)/$(SYS) + + その他の開発環境を用いる場合 + INCLUDES := $(INCLUDES) -I$(SRCDIR)/config/$(CPU)-$(TOOL)/$(SYS) \ + -I$(SRCDIR)/config/$(CPU)/$(SYS) + +また,アセンブリ言語レベルの識別名が,C言語レベルの識別名の先頭に "_" +が付いたものになる場合には,いずれかの Makefile.config で CDEFS に +-DLABEL_ASM を追加する. + +(5-6) STASK_DIR システムサービスのソースが置かれたディレクトリ +(5-7) STASK_ASMOBJS アセンブラで記述されたシステムサービスのオブジェクト +(5-8) STASK_COBJS C言語で記述されたシステムサービスのオブジェクト +(5-9) STASK_CFLAGS システムサービスに対するコンパイルオプション +(5-10) STASK_LIBS システムサービスに対するライブラリリンク指定 + +システムサービス(システムログタスクやデバイスドライバなど)のソースが +置かれたディレクトリ,それを構成するオブジェクトファイルのリスト,それ +らをコンパイルする際に適用するコンパイルオプション,その構成に必要なラ +イブラリリンク指定を行う場合には,上に示した変数に定義する. + +システム依存部の Makefile.config でこれらの変数を定義する時は,CDEFS +などと同様の扱いが必要である. + +(5-11) KERNEL_DIR カーネルのソースが置かれたディレクトリ +(5-12) KERNEL_ASMOBJS アセンブラで記述されたカーネルのオブジェクト +(5-13) KERNEL_COBJS C言語で記述されたカーネルのオブジェクト +(5-14) KERNEL_CFLAGS カーネルに対するコンパイルオプション + +カーネルのソースが置かれたディレクトリ,それを構成するオブジェクトファ +イルのリスト,それらをコンパイルする際に適用するコンパイルオプションを +指定する場合には,上に示した変数に定義する. + +システム依存部の Makefile.config でこれらの変数を定義する時は,CDEFS +などと同様の扱いが必要である. + +ほとんどの場合に,プロセッサ依存部の Makefile.config には以下の記述を +含める必要がある. + + GNU開発環境を用いる場合 + KERNEL_DIR := $(KERNEL_DIR):$(SRCDIR)/config/$(CPU) + KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) cpu_support.o + KERNEL_COBJS := $(KERNEL_COBJS) cpu_config.o + + その他の開発環境を用いる場合 + KERNEL_DIR := $(KERNEL_DIR):$(SRCDIR)/config/$(CPU)-$(TOOL) + KERNEL_DIR := $(KERNEL_DIR):$(SRCDIR)/config/$(CPU) + KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) cpu_support.o + KERNEL_COBJS := $(KERNEL_COBJS) cpu_config.o + +また,システム依存部ディレクトリの Makefile.config には以下の記述を含 +める必要がある. + + GNU開発環境を用いる場合 + KERNEL_DIR := $(KERNEL_DIR):$(SRCDIR)/config/$(CPU)/$(SYS) + KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) sys_support.o + KERNEL_COBJS := $(KERNEL_COBJS) sys_config.o + + その他の開発環境を用いる場合 + KERNEL_DIR := $(KERNEL_DIR):$(SRCDIR)/config/$(CPU)-$(TOOL)/$(SYS) + KERNEL_DIR := $(KERNEL_DIR):$(SRCDIR)/config/$(CPU)/$(SYS) + KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) sys_support.o + KERNEL_COBJS := $(KERNEL_COBJS) sys_config.o + +(6) オフセットファイルの生成 + +アセンブリ言語で記述されるプログラムから,C言語の構造体にアクセスする +場合には,構造体の各フィールドのオフセットを参照することが必要である. +JSPカーネルでは,必要なオフセット値をファイル(標準では offset.h)に出 +力するための仕組みとして,makeoffset.c と genoffset を用意している. +makeoffset.c は,どのオフセット値をファイルに出力するかを指定するもの +で,ターゲット依存部で用意する必要がある.genoffset は,現時点ではGNU +開発環境にのみ対応している. + +makeoffset.c と genoffset を使うことで,例えば,TCB 中の texptn フィー +ルドのオフセット値を TCB_texptn にマクロ定義することや,TCB 中のタスク +コンテキストブロック(tskctxb)に含まれる pc フィールドのオフセット値 +を TCB_pc にマクロ定義することができる.また,TCB 中の enatex フィール +ドのオフセット値,ビット位置,ビットマスクを,それぞれ TCB_enatex, +TCB_enatex_bit,TCB_enatex_mask にマクロ定義することができる.マクロ定 +義するビット位置やビットマスクは,アクセスするサイズやエンディアンを指 +定することができる. + +GNU開発環境以外を用いる場合など,この仕組みでオフセットファイルを生成 +できない時には,offset.h をターゲット依存部で用意し,Makefile.config +で OMIT_MAKEOFFSET をヌルストリング以外に定義する. + +makeoffset.c と genoffset に関するマニュアルは,現時点では用意できてい +ない.使い方がわからない場合や,機能が足りない場合には,相談されたい. + +(7) スタートアップモジュールなど + +ターゲットによっては,ロードモジュールの先頭と最後にリンクすべきプログ +ラムを,ターゲット依存部で用意する必要がある.多くの場合,スタートアッ +プモジュールをロードモジュールの先頭にリンクする必要がある. + +ロードモジュールの先頭にリンクすべきプログラムがある場合には, +Makefile.config において,そのオブジェクトファイル名を START_OBJS に定 +義し,それに対するコンパイルルールと依存関係作成ルールを定義しなければ +ならない.ロードモジュールの最後にリンクすべきプログラムがある場合には, +そのオブジェクトファイル名を END_OBJS に定義し,それに対するコンパイル +ルールと依存関係作成ルールを定義しなければならない. + +例えば,スタートアップモジュールのソースファイルが start.S の場合には, +Makefile.config に次のような記述を入れるとよい. + + # スタートアップモジュールのオブジェクトファイル名 + START_OBJS = start.o + + # スタートアップモジュールのコンパイルルール + $(START_OBJS): %.o: %.S + $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $< + + # スタートアップモジュールの依存関係作成ルール + $(START_OBJS:.o=.d): %.d: %.S + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \ + -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend + +また,コンパイラに標準の crtbegin.o と crtend.o を用いる場合には, +Makefile.config に次のような記述を入れるとよい. + + # オブジェクトファイル名 + START_OBJS = $(shell $(CC) -print-file-name=crtbegin.o) + END_OBJS = $(shell $(CC) -print-file-name=crtend.o) + + # 依存関係作成ルール + $(START_OBJS:.o=.d): %.d: + $(END_OBJS:.o=.d): %.d: + +この場合,これらのファイルをコンパイルすることはないため,コンパイルルー +ルは不要である.また,依存関係作成ルールはダミーでよい(依存関係作成ルー +ルがないとエラーになる). + +なお,カーネル用のスタートアップモジュールからは,main 関数ではなく, +kernel_start 関数を起動する必要がある. + +(8) リンカスクリプト + +開発環境に標準のリンカスクリプトが使用できない場合には,ターゲット依存 +部で用意する. + + +2.アプリケーション用のインクルードファイル + +ターゲット依存部で提供すべきアプリケーション用の定義は次の通りである. +これらの定義の中で,(1) および (2) は tool_defs.h に含めなければならな +い.その他の定義は,cpu_defs.h または sys_defs.h(またはそれらからイン +クルードされるファイル)に含める. + +(1) コンパイラ依存のデータ型の定義 + +コンパイラ依存のデータ型を以下のシンボルに定義する.これらの定義は, +typedef ではなく,#define によりマクロ定義しなければならない. + +(1-1) _int8_ 8ビットの整数型 +(1-2) _int16_ 16ビットの整数型 +(1-3) _int32_ 32ビットの整数型 +(1-4) _int64_ 64ビットの整数型 + +各サイズの整数型を,これらのシンボルにマクロ定義する._int32_ 以外は, +コンパイラがサポートしていない場合には定義する必要がない._int32_ の定 +義は必須である. + +(1-5) _bool_ BOOLの型 + +BOOL は,標準では int に型定義されるが,それで不都合な場合には,適切な +型を _bool_ にマクロ定義する. + +(1-6) _vp_int_ VP_INTの型 + +VP_INT は,標準では VP に型定義されるが,それで不都合な場合(例えば, +ポインタが16ビットで,int が32ビットの場合)には,適切な型を _vp_int_ +にマクロ定義する. + +(1-7) _intptr_ ポインタを格納できる整数型 + +_intptr_ は,フォーマット出力において,int型もポインタ型も格納できる整 +数型として使用する.これを定義しない場合,long が使われる. + +(2) コンパイラの拡張機能のためのマクロ定義 + +(2-1) inline インライン指定 +(2-2) Inline ファイル内のみに有効なインライン指定 +(2-3) asm インラインアセンブラ(最適化を許す) +(2-4) Asm インラインアセンブラ(最適化を抑止) + +これらの中で,asm と Asm は,ターゲット依存部で用いていなければ定義す +る必要がない. + +(3) タイムティックの定義 + +(3-1) TIC_NUME タイムティックの周期の分子(単位: 1ミリ秒) +(3-2) TIC_DENO タイムティックの周期の分母(単位: 1ミリ秒) + +(4) 割込みハンドラ/CPU例外ハンドラ関連の定義 + +(4-1) INHNO 割込みハンドラ番号のデータ型 +(4-2) EXCNO CPU例外ハンドラ番号のデータ型 + +(5) 割込みマスクと割込みマスクの変更/参照関連の定義(オプション) + +chg_ixx,get_ixx をターゲット依存にサポートする場合には,以下の定義お +よび宣言をターゲット依存部で提供する.xx,xxxx,XXXX は,ターゲット毎 +に適切な文字列に定める.xxxx および XXXX は,4文字でなくてもよい. + +(5-1) IXXXX 割込みマスクのデータ型 +(5-2) ER chg_ixx(IXXXX ixxxx) chg_ixx のプロトタイプ宣言 +(5-3) ER get_ixx(IXXXX *p_ixxxx) get_ixx のプロトタイプ宣言 + +(6) 割込み番号と割込みの禁止/許可関連の定義(オプション) + +dis_int,ena_int をターゲット依存にサポートする場合には,以下の定義お +よび宣言をターゲット依存部で提供する. + +(6-1) INTNO 割込み番号のデータ型 +(6-2) ER dis_int(INTNO intno) dis_int のプロトタイプ宣言 +(6-3) ER ena_int(INTNO intno) ena_int のプロトタイプ宣言 + +(7) 性能評価用システム時刻関連の定義(オプション) + +JSPカーネルは,研究への利用を主目的の一つとしていることから,ターゲッ +ト依存に,性能評価用のサービスコール vxget_tim をサポート可能としてい +る.vxget_tim をサポートする場合には,以下の定義および宣言をターゲット +依存部で提供する. + +(7-1) SYSUTIM 性能評価用システム時刻のデータ型 +(7-2) ER vxget_tim(SYSUTIM *p_sysutim) vxget_tim のプロトタイプ宣言 + +(8) ターゲット識別マクロの定義 + +cpu_defs.h ではプロセッサ略称(cpu_defs.h の置かれているディレクトリ名 +を大文字にしたもの),sys_defs.h ではシステム略称(sys_defs.h の置かれ +ているディレクトリ名を大文字にしたもの)をマクロ定義する. + +(9) プロセッサのエンディアンの定義 + +(9-1) SIL_ENDIAN + +プロセッサがビッグエンディアンの場合には SIL_ENDIAN_BIG(=1),リトル +エンディアンの場合には SIL_ENDIAN_LITTLE(=0)にマクロ定義する. + +(10) システムの停止処理の定義 + +(10-1) kernel_abort(void) + +assertマクロにおけるアサーションの失敗や,サービスコールが致命的なエラー +を返した場合に,システムを停止させる関数またはマクロ.kernel_exit を呼 +び出す方法も考えられるが,デバッグを容易にするためには,インライン関数 +かマクロで定義し,その場でシステムを停止させる処理に定義するのが望まし +い(kernel_exit を呼び出すと,エラーが発生した時点の状態から変化してし +まう). + + +3.カーネル用のデータ型や関数など + +ターゲット依存部で提供すべきカーネル用のデータ型や関数などは次の通りで +ある.これらのデータ型やマクロの定義と関数のプロトタイプ宣言は,別に記 +述がない限り,cpu_config.h または sys_config.h(またはそれらからインク +ルードされるファイル)に含める.また,関数の実体は,C言語の場合は +cpu_config.c または sys_config.c に,アセンブリ言語の場合は +cpu_support.S または sys_support.S に記述する. + +(0) インクルード方法に関するルール + +ヘッダファイルをインクルードする記述は,以下のルールに従うのを原則とす +る. + +ANSI Cの標準インクルードファイルは,#include <…> でインクルードする. +また,Makefile または Makefile.config で INCLUDES に -Iオプションで指 +定したディレクトリにあるファイルは,#include <…> でインクルードする. +カーネルを構成するファイルからのインクルードに対しては,以下のディレク +トリにあるファイルがこれに該当する(ターゲットにも依存). + jsp/include/ + jsp/config/$(CPU) + jsp/config/$(CPU)/$(SYS) + jsp/config/$(CPU)-$(TOOL) + jsp/config/$(CPU)-$(TOOL)/$(SYS) + pdic/simple_sio + +その他のインクルードファイルは #include "…" でインクルードする.カー +ネルを構成するファイルからのインクルードに対しては,以下のディレクトリ +にあるファイルがこれに該当する(ターゲットにも依存). + jsp/kernel + jsp/systask + +(1) タスクコンテキストブロックのデータ型 + +(1-1) CTXB + +ターゲット依存のタスクコンテキストを保存するために,TCB 中に持つことが +必要なデータ構造の型. + +(2) システム状態参照 + +(2-1) BOOL sense_context(void) + +現在の実行コンテキストが,タスクコンテキストの場合は FALSE,非タスクコ +ンテキストの場合は TRUE を返す関数. + +(2-2) BOOL sense_lock(void) + +現在のシステム状態が,CPUロック状態の場合は TRUE,CPUロック解除状態の +時は FALSE を返す関数. + +(2-3) BOOL t_sense_lock(void) + +タスクコンテキストにおいて,現在のシステム状態が,CPUロック状態の場合 +は TRUE,CPUロック解除状態の時は FALSE を返す関数.この関数が,非タス +クコンテキストから呼ばれることはない. + +(2-4) BOOL i_sense_lock(void) + +非タスクコンテキストにおいて,現在のシステム状態が,CPUロック状態の場 +合は TRUE,CPUロック解除状態の時は FALSE を返す関数.この関数が,タス +クコンテキストから呼ばれることはない. + +※ 原理的には,sense_lock が提供されていれば t_sense_lock と +i_sense_lock は必要なく,逆に t_sense_lock と i_sense_lock が提供され +ていれば sense_lock を実現することはできるが,ターゲットに依存せずに高 +い実行効率を実現するために,ターゲット依存部が3つの関数を提供すること +としている. + +(3) CPUロックとその解除 + +(3-1) void t_lock_cpu(void) + +タスクコンテキストにおいて,CPUロック解除状態から,CPUロック状態に遷移 +させる関数.この関数が,CPUロック状態で呼ばれることはない.また,非タ +スクコンテキストから呼ばれることもない. + +(3-2) void t_unlock_cpu(void) + +タスクコンテキストにおいて,CPUロック状態から,CPUロック解除状態に遷移 +させる関数.この関数が,CPUロック解除状態で呼ばれることはない.また, +非タスクコンテキストから呼ばれることもない. + +(3-3) void i_lock_cpu(void) + +非タスクコンテキストにおいて,CPUロック解除状態から,CPUロック状態に遷 +移させる関数.この関数が,CPUロック状態で呼ばれることはない.また,タ +スクコンテキストから呼ばれることもない. + +(3-4) void i_unlock_cpu(void) + +非タスクコンテキストにおいて,CPUロック状態から,CPUロック解除状態に遷 +移させる関数.この関数が,CPUロック解除状態で呼ばれることはない.また, +タスクコンテキストから呼ばれることもない. + +(4) タスクディスパッチャ + +(4-1) void dispatch(void) + +タスクディスパッチャ(以下,単にディスパッチャと言う)を明示的に呼ぶた +めの関数.タスクコンテキストから呼ばれたサービスコール処理から,CPUロッ +ク状態で呼ばれる. + +この関数が呼ばれると,関数を呼んだタスクのコンテキストを保存し, 実行 +できるタスクの中で最高優先順位のタスク(schedtsk)のコンテキストを復帰 +して実行状態とする.実行できるタスクがない場合(schedtsk が NULL の場 +合)には,割込みを許可して,実行できるタスクができるまで待つ.ここで, +実行できるタスクができるのを待つ間に起動された割込みハンドラの出口で, +ディスパッチャが呼ばれないように対策することが必要である.具体的には, +実行できるタスクができるのを待つ間,一時的に非タスクコンテキストに切り +換えるか,ディスパッチを保留するようにする. + +新たに実行状態になったタスクが,タスク例外処理ルーチンの起動条件を満た +していれば,タスク例外処理ルーチンを起動する.また,この関数を呼び出し +たタスクが次に実行状態になった時,タスク例外処理ルーチンの起動条件を満 +たしていれば,タスク例外処理ルーチンの起動を行う.タスク例外処理ルーチ +ンの起動には,ターゲット非依存部が提供する calltex または call_texrtn +を用いることができる. + +(4-2) void exit_and_dispatch(void) + +現在実行中のコンテキストを捨て,ディスパッチャを呼び出すための関数.タ +スクコンテキストから呼ばれたサービスコール(具体的には,ext_tsk)処理 +またはカーネルの初期化処理から,CPUロック状態で呼ばれる. + +この関数が呼ばれると,関数を呼んだタスクのコンテキストを保存せず,実行 +できるタスクの中で最高優先順位のタスク(schedtsk)のコンテキストを復帰 +して実行状態とする.実行できるタスクがない場合(schedtsk が NULL の場 +合)の処理は,dispatch と同様である. + +新たに実行状態になったタスクが,タスク例外処理ルーチンの起動条件を満た +していれば,タスク例外処理ルーチンを起動する. + +この関数は,カーネルの初期化処理からも呼ばれるために,非タスクコンテキ +ストからも呼ばれても正しく処理できることが必要である.なお,この関数か +らはリターンしない. + +(5) 割込みハンドラ/CPU例外ハンドラの出入口処理 + +(5-1) INTHDR_ENTRY(inthdr) +(5-2) INT_ENTRY(inthdr) + +INTHDR_ENTRY(inthdr) は起動番地が inthdr の割込みハンドラを呼び出す出 +入口処理ルーチンを生成するマクロ,INT_ENTRY(inthdr) は生成する出入口処 +理ルーチンの先頭のラベルを得るためのマクロである.INT_ENTRY(inthdr) で +得られるラベルは,割込みハンドラ初期化ブロックに出入口処理ルーチンの先 +頭番地を登録するために使われる.出入口処理ルーチンを生成する必要がない +場合には,INTHDR_ENTRY(inthdr) を単に extern 宣言に展開すればよい. + +割込みハンドラの出入口処理は,実行コンテキストを非タスクコンテキストに +切り換え,スクラッチレジスタを保存して,割込みハンドラを呼び出す.割込 +みハンドラから戻ると,元の実行コンテキストに戻すとともに,必要に応じて +ディスパッチとタスク例外処理ルーチンの起動処理を行う.ディスパッチとタ +スク例外処理ルーチンの起動処理は,具体的には次のように行う. + +(a) 以下の処理は,割込みハンドラがタスクコンテキスト実行中に起動された +場合で,reqflg が TRUE の時のみ行う. + +(b) enadsp が TRUE で,実行状態のタスク(runtsk)と実行できるタスクの +中で最高優先順位のタスク(schedtsk)が一致していない場合には,前者のタ +スクのコンテキストを保存し,後者のタスクのコンテキストを復帰して実行状 +態とする.実行できるタスクがない場合(schedtsk が NULL の場合)には, +割込みを許可して,実行できるタスクができるまで待つ.ここでも,実行でき +るタスクができるのを待つ間に起動された割込みハンドラの出口で,タスクディ +スパッチャが呼ばれないようにすることが必要であるが,出入口処理を非タス +クコンテキストで実行していれば,特に対策する必要はない. + +(c) 実行状態のタスク((b) でタスクディスパッチを行った場合は,新たに実 +行状態となったタスク)がタスク例外処理ルーチンの起動条件を満たしていれ +ば,タスク例外処理ルーチンを起動する.また,(b) でタスクディスパッチを +行った場合は,それまで実行状態であったタスクが次に実行状態になった時, +タスク例外処理ルーチンの起動条件を満たしていれば,タスク例外処理ルーチ +ンの起動を行う.タスク例外処理ルーチンの起動には,ターゲット非依存部が +提供する calltex または call_texrtn を用いることができる. + +このマクロで生成するルーチンでは,上記の処理の一部のみを行い,残りの処 +理は別に用意したルーチンに任せてもよい.具体的には,タスクディスパッチ +とタスク例外処理ルーチンの起動処理は,別にルーチンとして用意するのが適 +当であろう. + +(5-3) EXCHDR_ENTRY(exchdr) +(5-4) EXC_ENTRY(exchdr) + +EXCHDR_ENTRY(exchdr) は起動番地が exchdr のCPU例外ハンドラを呼び出す出 +入口処理ルーチンを生成するマクロ,EXC_ENTRY(exchdr) は生成する出入口処 +理ルーチンの先頭のラベルを得るためのマクロである.EXC_ENTRY(exchdr) で +得られるラベルは,CPU例外ハンドラ初期化ブロックに出入口処理ルーチンの +先頭番地を登録するために使われる.出入口処理ルーチンを生成する必要がな +い場合には,EXCHDR_ENTRY(exchdr) を単に extern 宣言に展開すればよい. + +CPU例外ハンドラの出入口処理は,実行コンテキストを非タスクコンテキスト +に切り換え,スクラッチレジスタを保存して,CPU例外ハンドラを呼び出す. +CPU例外ハンドラには,VP型のパラメータ p_excinf を渡す.このパラメータ +は,CPU例外に関する情報を保存したスタック領域へのポインタであることを +想定しているが,具体的にはターゲット毎に定める. + +CPU例外ハンドラから戻ると,元の実行コンテキストに戻すとともに,必要に +応じてタスクディスパッチとタスク例外処理ルーチンの起動処理を行う.タス +クディスパッチとタスク例外処理ルーチンの起動処理は,割込みハンドラの出 +入口処理の場合と同様である(上記の (a)〜(c)). + +(6) タスクコンテキスト設定処理(cpu_context.h) + +ターゲット依存のタスクコンテキストを設定するために create_context と +activate_context の2つの関数を用意する.2つの関数を呼び出すことで,タ +スクのコンテキスト(具体的には,タスクコンテキストブロックの内容とタス +クのスタック領域)をタスクが起動できる状態に設定する.2つの関数は呼ば +れるタイミングが異なるだけで明確な役割分担はなく,どのような処理はどち +らの関数で行わなければならないという制約はない. + +これらの関数の宣言およびマクロの定義は,cpu_context.h に含める.これは, +cpu_config.h を処理する時点では TCB が定義されていないためである. + +(6-1) void create_context(TCB *tcb) + +タスクが休止状態に移行する時に呼ばれる.具体的には,タスクの生成時 +(JSPカーネルでは,CRE_TSK でタスクを生成するため,タスク管理モジュー +ルの初期化)とタスクの終了時(ext_tsk,ter_tsk)に呼ばれる. + +(6-2) void activate_context(TCB *tcb) + +タスクが実行できる状態に移行する時に呼ばれる.具体的には,act_tsk でタ +スクを起動する時,タスクの終了時(ext_tsk,ter_tsk)に起動要求のキュー +イングにより再起動する時,TA_ACT 属性を指定してタスクを生成した時(タ +スク管理モジュールの初期化)に呼ばれる. + +(6-3) ACTIVATED_STACK_SIZE(オプション) + +ext_tsk がスタック上に確保するダミー領域のサイズを定義するためのマクロ. +ダミー領域が必要ない場合は,このマクロを定義する必要はない. + +ext_tsk は,自タスクを終了させた後,自タスクに対して create_context を +呼ぶ.また,タスクの起動要求がキューイングされていた場合には,自タスク +に対して activate_context も呼ぶ.create_context と activate_context +は,対象タスクのスタック領域を書き換える場合があるが,これが ext_tsk +(およびそこから呼ばれる関数)が使用しているスタック領域と重なった場合, +自分の使用しているスタック領域を自分で破壊する結果になる. + +ACTIVATE_STACK_SIZE を,create_context と activate_context が書き換え +るスタック領域のサイズ(厳密には,スタックの底から何バイトめまでを書き +換えるか)にマクロ定義しておくと,ext_tsk 内でスタック上に定義したサイ +ズのダミー領域を確保し,自分の使用しているスタック領域を破壊するのを防 +ぐ. + +なお,これを実現するために,処理系依存の機能である alloca を用いている. +gcc は alloca をサポートしているが,他のコンパイラを用いる場合には, +alloca をサポートしているか確認が必要である.また,alloca を用いる場合 +にインクルードファイルが必要な場合には,tool_config.h からインクルード +する必要がある. + +(7) ターゲット依存の初期化/終了処理 + +(7-1) void cpu_initialize(void) + +プロセッサ依存の初期化処理.カーネルの初期化処理で,カーネル内の各モジュ +ールを初期化する前に呼ばれる. + +(7-2) void sys_initialize(void) + +システム依存の初期化処理.カーネルの初期化処理で,cpu_initialize に続 +いて呼ばれる. + +(7-3) void tool_initialize(void) + +開発環境依存の初期化処理.カーネルの初期化処理で,sys_initialize に続 +いて呼ばれる. + +上の3つの関数は,カーネル起動処理(kernel_start 関数)の最初でこの順に +呼び出される.3つの関数を呼び出した後の時点で,CPUロック状態になってい +なければならない. + +(7-4) void cpu_terminate(void); + +プロセッサ依存の終了時処理.カーネルの終了処理で呼ばれる. + +(7-5) sys_exit(void) + +システムの終了処理.カーネルの終了処理で,cpu_terminate に続いて呼ばれ +る.この関数からはリターンしない.ROMモニタを持つシステムでは,ROMモニ +タ呼出しで実現することを想定している. + +(7-6) call_atexit(void) + +開発環境依存の終了処理.必要に応じて,atexit によって登録された関数の +実行や C++ におけるデストラクタの実行を行う. + +(8) 割込みハンドラ/CPU例外ハンドラの定義 + +(8-1) void define_inh(INHNO inhno, FP inthdr) + +割込みハンドラ番号 inhno の起動番地を inthdr に設定する.割込み管理機 +能の初期化処理から呼ばれる. + +(8-2) void define_exc(EXCNO excno, FP exchdr) + +CPU例外ハンドラ番号 excno の起動番地を exchdr に設定する.CPU例外ハン +ドラ管理機能の初期化処理から呼ばれる. + +(9) CPU例外発生時点のシステム状態の参照 + +(9-1) BOOL exc_sense_context(VP p_excinf) + +CPU例外が発生したコンテキストが,タスクコンテキストの場合は FALSE,非 +タスクコンテキストの場合は TRUE を返す関数.CPU例外ハンドラから呼ばれ +たサービスコール処理から呼ばれる.p_excinf には,CPU例外ハンドラへの引 +数がそのまま渡される. + +(9-2) BOOL exc_sense_lock(VP p_excinf) + +CPU例外が発生したコンテキストが,CPUロック状態の場合は TRUE,CPUロック +解除状態の時は FALSE を返す関数.CPU例外ハンドラから呼ばれたサービスコ +ール処理から呼ばれる.p_excinf には,CPU例外ハンドラへの引数がそのまま +渡される. + +(10) TCB 中のフィールドのビット幅の定義(オプション) + +TCB 中のフィールドの配置は性能に大きく影響すると思われるため,ターゲッ +ト依存にフィールドのビット幅を変更できるようにしている.具体的には,以 +下の2つのフィールドのビット幅を変更できる.これらのマクロを定義しない +場合,最小ビット幅となる. + +(10-1) TBIT_TCB_TSTAT tstat(タスク状態)のビット幅 +(10-2) TBIT_TCB_PRIORITY priority(優先度)フィールドのビット幅 + +32ビットプロセッサの場合には,これらを 8 に定義するのが効率的である. + +(11) ビットマップサーチにビットサーチ命令を使うための定義(オプション) + +プロセッサがビットサーチ命令を持つ場合,レディキューのビットマップサー +チにその命令を用いた方が効率がよい.その場合,以下の関数およびマクロを +ターゲット依存部で定義する. + +(11-1) CPU_BITMAP_SEARCH + +プロセッサのビットサーチ命令を用いる場合,このマクロを定義する.このマ +クロを定義することにより,ターゲット非依存部から bitmap_search が取り +除かれる. + +(11-2) UINT bitmap_search(UINT bitmap) + +ビットサーチを行う関数.bitmap 内の 1 のビットの内,最も下位のものをサ +ーチし,そのビット番号を返す.ビット番号は,最下位ビット(LSB)を 0 と +する.bitmap の下位16ビットに,必ず 1 のビットがある(すなわち,bitmap +に 0 が指定されることはない)ことを仮定してよい. + +標準ライブラリにビットサーチ命令を用いた ffs がある場合,ffs を用いて +bitmap_search を次のように定義すればよい. + #define bitmap_search(bitmap) (ffs(bitmap) - 1) + +プロセッサの持つビットサーチ命令が,最も上位の 1 のビットをサーチする +ものである場合には,次のマクロを定義して,ビットの割付けを変更すること +ができる. + +(11-3) UINT PRIMAP_BIT(pri) + +タスク優先度の内部表現(最高優先度を 0 とする)を,それに対応するビッ +トマップに変換する.デフォルトの定義は次の通り. + #define PRIMAP_BIT(pri) (1 << (pri)) + +(12) ターゲット依存のサービスコール(オプション) + +以下のサービスコールをターゲット依存にサポートする場合には,その処理ル +ーチンをターゲット依存部で定義する. + +(12-1) chg_ixx +(12-2) get_ixx +(12-3) dis_int +(12-4) ena_int + +(13) 性能評価用システム時刻関連の定義(オプション) + +(13-1) SUPPORT_VXGET_TIM + +ターゲット非依存部の vxget_timサービスコール処理を用いる場合に,このマ +クロを定義する. + +(13-2) hw_timer.h + +ターゲット依存のタイマモジュールのインクルードファイル.ターゲット非依 +存部の vxget_timサービスコール処理を用いる場合,ターゲット依存のタイマ +モジュールが必要になる.そのためのインクルードファイルである +hw_timer.h は,システムサービスのシステムクロックドライバで用いるもの +と共通にしている. + +(14) カーネルの内部識別名のリネームとその解除(cpu_rename.h, + cpu_unrename.h,sys_rename.h,sys_unrename.h) + +ターゲット依存部で用いている識別名(モジュール内に閉じた識別名を除く) +を,μITRON4.0仕様に従って _kernel_ で始まるものにリネームする必要があ +る. + +具体的には,プロセッサ依存部で用いている識別子をリストアップしたファイ +ルを cpu_rename.def に,システム依存部で用いている識別子をリストアップ +したファイルを sys_rename.def に作成する.genrename 使って,これらのファ +イルから,それぞれ cpu_rename.h と cpu_unrename.h,sys_rename.h と +sys_unrename.h を生成する.xxx_rename.def から xxx_rename.h と +xxx_unrename.h を生成するには,「$(KERNEL_DIR)/utils/genrename xxx」を +実行すればよい. + +また,cpu_config.h の先頭から cpu_rename.h を,sys_config.h の先頭から +sys_rename.h をインクルードする. + +genrename が生成するファイルは次のような内容である.xxx_rename.def に +xxxx という識別子が含まれている場合,xxx_rename.h には次のようなマクロ +定義が生成される. + +#define xxxx _kernel_xxxx +#ifdef LABEL_ASM +#define _xxxx __kernel_xxxx +#endif /* LABEL_ASM */ + +ここで,LABEL_ASM は,アセンブリ言語レベルの識別名が,C言語レベルの識 +別名の先頭に "_" が付いたものになる場合に定義すべきマクロである(定義 +の方法については「システム構築方法の設定」を参照). + +また,xxx_unrename.h には次のようなマクロ定義解除が生成される. + +#undef xxxx +#ifdef LABEL_ASM +#undef _xxxx +#endif /* LABEL_ASM */ + +(15) トレースログのためのマクロ定義(tool_config.h) + +カーネルのトレースログの取得は,開発環境依存部でトレースログのためのマ +クロを定義することによって行う.トレースログのためのマクロは約150種類 +あり,取得したいログ情報に対応するマクロを定義する.トレースログを取得 +しない場合には,これらのマクロを空に定義すればよい. + +(16) その他 + +(16-1) TARGET_NAME + +起動メッセージのターゲット名. + +(16-2) void sys_putc(char c) + +ターゲットシステムの低レベルの文字出力ルーチン.ROMモニタを持つシステ +ムでは,ROMモニタ呼び出しで実現することを想定している. + +(16-3) OMIT_CALLTEX(オプション) + +ターゲット非依存部が calltex を提供する必要がない場合に,このマクロを +定義する.詳しくは,「タスク例外処理ルーチンの起動関数とその中で参照す +る TCB のフィールド」の節を参照のこと. + +(16-4) LABEL_ALIAS(new_label, defined_label)(オプション,tool_config.h) + +new_label を defined_label と同じアドレスに定義するためのマクロ.この +ようなマクロを実現できない場合には,定義を省略することができる.このマ +クロ定義は,tool_config.h の中で行うのを標準とする. + +(16-5) COPYRIGHT_CPU(オプション) +(16-6) COPYRIGHT_SYS(オプション) + +カーネル起動時のメッセージに,それぞれプロセッサ依存部およびシステム依 +存部の著作権表示を追加するためのマクロ. + +(16-7) __STK_UNIT(オプション) +(16-8) __MPF_UNIT(オプション) + +標準では,スタック領域と固定長メモリプール領域は,VP型のサイズにアライ +ンする.これを,より大きい単位でアラインさせる必要がある場合には, +__STK_UNIT と __MPF_UNIT を,それぞれアラインさせる単位のデータ型に定 +義する.ただし,__STK_UNIT および __MPF_UNIT のサイズは,2の巾乗でなけ +ればならない. + +(16-9) __EMPTY_LABEL(x, y)(オプション,tool_config.h) + +型 x のサイズ 0 の配列 y を定義するためのマクロ.サイズ 0 の配列を定義 +できるコンパイラ(GNU開発環境はこれに該当)では定義を省略することがで +きる.このマクロ定義は,tool_config.h の中で行うのを標準とする. + + +4.ターゲット依存部が用いることができるターゲット非依存部の変数・関数 + +(1) タスク管理関連の変数 + +(1-1) TCB *runtsk + +実行状態のタスク(=プロセッサがコンテキストを持っているタスク)の TCB +を指すポインタ.実行状態のタスクがない場合は NULL にする.サービスコー +ルの処理中で,自タスク(サービスコールを呼び出したタスク)に関する情報 +を参照する場合は runtsk を使う.カーネルの初期化処理以外で,この変数を +書き換えるのは,タスクディスパッチャ(すなわち,ターゲット依存部)のみ +である. + +(1-2) TCB *schedtsk + +実行できるタスクの中で最高優先順位のタスクの TCB を指すポインタ.実行 +できるタスクがない場合は NULL となる.ディスパッチ禁止状態など,ディス +パッチが保留されている間は,runtsk と一致しているとは限らない.この変 +数を書き換えるのはスケジューラのみで,ターゲット依存部はこの変数を書き +換えてはならない. + +(1-3) BOOL reqflg + +割込みハンドラ/CPU例外ハンドラの出口処理に,タスクディスパッチまたは +タスク例外処理ルーチンの起動を要求することを示すフラグ.この変数はサー +ビスコール処理(ターゲット非依存部)でセットし,割込みハンドラ/CPU例 +外ハンドラの出口処理(ターゲット依存部)で参照/クリアする. + +(1-4) BOOL enadsp + +タスクディスパッチ許可状態である(すなわち,タスクディスパッチ禁止状態 +でない)ことを示すフラグ.この変数はサービスコール(dis_dsp,ena_dsp, +ターゲット依存に chg_ixx)処理の中で書き換える. + +また,タスクディスパッチャ(ターゲット依存部)の中で,実行できるタスク +ができるのを待つ間に起動された割込みハンドラの出口でタスクディスパッチャ +が呼ばれないようにするために,この変数を一時的に FALSE に設定すること +ができる. + +(2) タスク例外処理ルーチンの起動関数とその中で参照する TCB のフィールド + +(2-1) void calltex(void) +(2-2) void call_texrtn(void) + +タスク例外処理ルーチンの起動を行う関数.calltex は,実行状態のタスクが +タスク例外処理ルーチンの起動条件を満たしていれば,call_texrtn を呼び出 +す.call_texrtn は,タスク例外処理ルーチンの呼び出しを行う.タスク例外 +処理ルーチンを呼び出す時は,一時的にCPUロックを解除する. + +これらの関数は,ディスパッチャや割込みハンドラ/CPU例外ハンドラの出口 +処理から,CPUロック状態で呼ばれることを想定している.calltex を呼び出 +すのが最も簡単であるが,実行効率を上げるためには,起動条件のチェックを +アセンブリ言語で記述し,call_texrtn を呼び出した方がよい.チェックすべ +き起動条件については,ターゲット非依存部の calltex のソースコードを参 +照すること.またその場合には,OMIT_CALLTEX をマクロ定義することで,タ +ーゲット非依存部から calltex が取り除かれる. + +(2-3) BOOL enatex +(2-4) TEXPTN texptn + +call_texrtn を呼び出すために,起動条件のチェックをアセンブリ言語で記述 +する場合には,TCB 内のこれらのフィールドを参照する必要がある. + +(3) システムログ機能 + +異常事象を通知するために,システムログ機能へのログ出力関数を用いること +ができる.システムログ機能については,ユーザズマニュアルを参照すること. + + +5.システムサービス用のデータ型や関数など + +5.1 システムインタフェースレイヤ(SIL)のための定義 + +ターゲット依存部で提供すべきシステムインタフェースレイヤ(SIL)のため +の定義は次の通りである.これらの定義は,cpu_defs.hまたはsys_defs.h(ま +たはそれらからインクルードされるファイル)に含める.また,関数の実体が +必要な場合,C言語の場合はcpu_config.cまたはsys_config.cに,アセンブリ +言語の場合はcpu_support.Sまたはsys_support.Sに記述する. + +(1) 微少時間待ち関連 + +(1-1) void sil_dly_nse(UINT dlytim) + +dlytimで指定される時間(単位: 1ナノ秒)待つ関数をターゲット依存部で提 +供する. + +実現方法はターゲット依存であるが,以下の関数をアセンブリ言語で記述した +ものを,プロセッサ依存部に含めるのを標準的な方法とする.アセンブリ言語 +で記述するのは,コンパイラの最適化に依存しないようにするためである.ま +たこの関数は,できる限りメモリアクセスを行わないように実装すべきである. + + void sil_dly_nse(UINT dlytim) + { + if (dlytim > SIL_DLY_TIM1) { + dlytim -= SIL_DLY_TIM1; + while (dlytim > SIL_DLY_TIM2) { + dlytim -= SIL_DLY_TIM2; + } + } + } + +(1-2) SIL_DLY_TIM1(オプション) +(1-3) SIL_DLY_TIM2(オプション) + +sil_dly_nseを上記の標準的な方法で実現した場合,この2つの定数をシステム +依存部でマクロ定義する.なお,この2つの定数の決定を助けるプログラムを +用意している.希望される方は,相談されたい. + +(2) 割込みロック状態の制御関連(オプション) + +(2-1) SIL_PRE_LOC +(2-2) SIL_LOC_INT() +(2-3) SIL_UNL_INT() + +ターゲット依存で割込みロック状態の制御方法を変更したい場合には,これら +のマクロにその方法を定義する.これらマクロを定義しない場合には, ター +ゲット非依存部において,カーネルのCPUロックの機能を用いて割込みロック +状態が実現される. + +(3) プロセッサのエンディアンの定義 + +(3-1) SIL_ENDIAN + +リトルエンディアンプロセッサではSIL_ENDIAN_LITTLE(=0),ビッグエンディ +アンプロセッサではSIL_ENDIAN_BIG(=1)にマクロ定義する. + +(4) エンディアンの反転(オプション) + +(4-1) VH SIL_REV_ENDIAN_H(VH data) +(4-2) VW SIL_REV_ENDIAN_W(VW data) + +エンディアンの反転を効率よく実現する方法がある場合には,これらのマクロ +にその方法を定義する.これらのマクロを定義しない場合には,標準的な方法 +でエンディアンの反転が行われる. + +(5) エンディアン反転付きのメモリ空間アクセス(オプション) + +エンディアンを反転してメモリを読出し/書込みする効率的な方法がある場合, +該当するメモリ空間アクセス関数をターゲット依存部で用意し,ターゲット非 +依存部の標準的な定義を無効にするためのマクロを定義する. + +(5-1) VH sil_reh_bem(VP mem) OMIT_SIL_REH_BEM +(5-2) void sil_wrh_bem(VP mem, VH data) OMIT_SIL_WRH_BEM +(5-3) VW sil_rew_bem(VP mem) OMIT_SIL_REW_BEM +(5-4) void sil_wrw_bem(VP mem, VW data) OMIT_SIL_WRW_BEM + +リトルエンディアンプロセッサでは,これらのメモリ空間アクセス関数をター +ゲット依存部で用意し,右に示すマクロを定義する. + +(5-5) VH sil_reh_lem(VP mem) OMIT_SIL_REH_LEM +(5-6) void sil_wrh_lem(VP mem, VH data) OMIT_SIL_WRH_LEM +(5-7) VW sil_rew_lem(VP mem) OMIT_SIL_REW_LEM +(5-8) void sil_wrw_lem(VP mem, VW data) OMIT_SIL_WRW_LEM + +ビッグエンディアンプロセッサでは,これらのメモリ空間アクセス関数をター +ゲット依存部で用意し,右に示すマクロを定義する. + +(6) 標準のアクセス関数の無効化(オプション) + +(6-1) OMIT_SIL_ACCESS + +シミュレーション環境などで,すべてのメモリ空間アクセス関数をターゲット +依存部で用意する場合には,ターゲット非依存部の標準的な定義を無効にする +ために,このマクロを定義する. + +5.2 システムクロックドライバ用のデータ型や関数など + +ターゲット依存部で提供すべきシステムクロックドライバ用のデータ型や関数 +などは次の通りである.これらの定義は,hw_timer.h(またはそれらからイン +クルードされるファイル)に含める.関数の実体が必要な場合には,適切なファ +イルを用意する. + +(1) INHNO_TIMER + +タイマ割込みハンドラのベクタ番号を定義したマクロを,ターゲット依存部で +提供する. + +(2) タイマの制御 + +(2-1) void hw_timer_initialize(void) + +タイマを初期化し,タイマ割込みを周期的に発生させる関数を,ターゲット依 +存部で提供する.タイマ割込みの周期は,TIC_NUMEとTIC_DENOで指定された時 +間と一致させる. + +(2-2) void hw_timer_int_clear(void) + +タイマ割込み要求をクリアする関数を,ターゲット依存部で提供する. + +(2-3) void hw_timer_terminate(void) + +タイマの動作を停止させ,タイマ割込みを発生しないようにする関数を,ター +ゲット依存部で提供する. + +(3) 性能評価用システム時刻参照機能関連(オプション) + +ターゲット非依存部のvxget_timサービスコール処理を用いる場合に,以下の +データ型や関数などをターゲット依存部で提供する. + +(3-1) CLOCK + +タイマ値の内部表現のためのデータ型. + +(3-2) CLOCK hw_timer_get_current(void) + +タイマの現在値を読み出し,内部表現で返す関数. + +(3-3) BOOL hw_timer_fetch_interrupt(void) + +タイマ割込み要求をチェックする関数.タイマ割込みが要求されている場合に +TRUE,要求されていない場合にFALSEを返す. + +(3-4) UINT TO_USEC(CLOCK clock) + +タイマ値の内部表現を,1μ秒単位に変換するためのマクロ(または関数). +hw_timer_get_currentで読み出した値を,タイマ割込み発生からの経過時間 +(単位: 1μ秒)に変換するために用いる. + +(3-5) BOOL BEFORE_IREQ(CLOCK clock) + +割込みを禁止した状態で,まずhw_timer_get_currentを呼び出し,続いて +hw_timer_fetch_interruptを呼び出す場合を考える.hw_timer_get_current +を呼び出した直後にタイマが周期に達し,タイマ割込みが要求されると, +hw_timer_get_currentは周期に達する直前のタイマ値(これを,clockとする) +を返し,hw_timer_fetch_interruptがTRUEを返すことになる.この状況でも正 +しい現在時刻を得るために,clockがある一定値以上の場合には, +hw_timer_fetch_interruptがTRUEを返しても,割込み発生前の値とみなすこと +にする.BEFORE_IREQは,clockが割込み発生前の値とみなすべき場合にTRUEを, +そうでない場合にFALSEを返すマクロ(または関数)である. + +5.3 シリアルインタフェースドライバ用のデータ型や関数など + +ターゲット依存部で提供すべきシリアルインタフェースドライバ用のデータ型 +や関数などは次の通りである.これらの定義は,別に記述がない限り, +hw_serial.h(またはそこからインクルードされるファイル)に含め,必要な +コンフィギュレーション情報をhw_serial.cfgに記述する.関数の実体が必要 +な場合には,適切なファイルを用意する. + +シリアルインタフェースドライバの中で,ターゲットのシリアルI/Oデバイス +に依存する部分を,シリアルI/Oデバイスドライバと呼ぶ.シリアルI/Oデバイ +スドライバは,おおよそ,ITRONデバイスドライバ設計ガイドラインのPDICに +相当する.PDICに相当するファイルで,他のシステムにも共通に使える可能性 +がある場合には,pdic/simple_sioディレクトリに置く. + +(1) TNUM_PORT + +シリアルインタフェースドライバがサポートするシリアルポート数を定義する +マクロ.このマクロは,cpu_config.hまたはsys_config.h(またはそれらから +インクルードされるファイル)で定義する. + +(2) シリアルI/Oデバイスの割込みハンドラとその登録 + +シリアルI/Oデバイスの割込みハンドラをターゲット依存部で提供し,それを +カーネルに登録する静的APIをhw_serial.cfgに含める.シリアルI/Oデバイス +の割込ハンドラのベクタ番号は,hw_serial.h(またはそこからインクルード +されるファイル)でマクロ定義し,hw_serial.cfgからhw_serial.hをインクル +ードする方法を標準とする. + +(3) void sio_initialize(void) + +シリアルI/Oデバイスドライバを初期化するルーチン.この関数は,シリアル +インタフェースドライバのターゲット非依存部の初期化ルーチンから呼び出さ +れる. + +(4) SIOPCB + +シリアルI/Oポート管理ブロックのデータ型(hw_serial.hには,型宣言だけ含 +まれていればよい). + +(5) SIO_ERDY_SNDとSIO_ERDY_RCV + +送信可能コールバックの識別番号をSIO_ERDY_SNDに,受信通知コールバックの +識別番号をSIO_ERDY_RCVにマクロ定義する.コールバックの禁止/許可を行な +うサービスコール(sio_ena_cbrとsio_dis_cbr)で用いる. + +(6) デバイスサービスルーチン + +以下のデバイスサービルルーチンは,(少なくとも)シリアルI/Oポートから +の割込みが禁止された状態で呼び出される.また,タスクコンテキスト,非タ +スクコンテキストのいずれで呼び出される場合もある(いずれで呼び出されて +も動作するようにしなければならない). + +(6-1) SIOPCB *sio_opn_por(ID siopid, VP_INT exinf) + +siopidで指定されるシリアルI/Oポートをオープンする関数.exinfはシリアル +I/Oポートに対する拡張情報で,コールバックを呼ぶ時にポートを区別するた +めに渡す. + +(6-2) void sio_cls_por(SIOPCB *siopcb) + +siopcbで指定されるシリアルI/Oポートをクローズする関数. + +(6-3) BOOL sio_snd_chr(SIOPCB *siopcb, char c) + +siopcbで指定されるシリアルI/Oポートに,cで示される文字を送信する関数. +文字を送信レジスタに入れた場合にはTRUEを,前に送信した文字の送信が終わっ +ていないために,文字を送信レジスタに入れられなかった場合にはFALSEを返 +す. + +(6-4) INT sio_rcv_chr(SIOPCB *siopcb) + +siopcbで指定されるシリアルI/Oポートから文字を読む関数.文字を受信して +いた場合,読んだ文字のコードは正の値として返し,文字を受信していない場 +合には-1を返す. + +(6-5) sio_ena_cbr(SIOPCB *siopcb, UINT cbrtn) + +siopcbで指定されるシリアルI/Oポートからの,cbrtnで指定されるコールバッ +クを許可する.cbrtnには,SIO_ERDY_SNDかSIO_ERDY_RCVを指定できる. + +(6-6) sio_dis_cbr(SIOPCB *siopcb, UINT cbrtn) + +siopcbで指定されるシリアルI/Oポートからの,cbrtnで指定されるコールバッ +クを禁止する.cbrtnには,SIO_ERDY_SNDかSIO_ERDY_RCVを指定できる. + +(7) コールバックルーチン + +ターゲット依存部は,必要なタイミングで,シリアルインタフェースドライバ +のターゲット非依存部に含まれる以下のコールバックルーチンを呼び出びださ +なければならない.ただし,それぞれのコールバックが禁止されている時は, +コールバックルーチンを呼び出してはならない. + +コールバックルーチンは,(少なくとも)シリアルI/Oポートからの割込みが +禁止された状態で,非タスクコンテキストで呼び出す.exinfには,シリアル +I/Oポートのオープン時に指定された拡張情報を渡す. + +(7-1) void sio_ierdy_snd(VP_INT exinf) + +送信可能コールバックルーチン.シリアルI/Oポートに対して文字が送信でき +る状態になった場合に呼び出す.シリアルインタフェースドライバは,このコ +ールバックルーチンの中で,sio_snd_chrを呼び出して次の文字を送信するか, +送信すべき文字がない場合には送信可能コールバックを禁止する. + +(7-2) void sio_ierdy_rcv(VP_INT exinf) + +受信通知コールバックルーチン.シリアルI/Oポートから文字を受信した場合 +に呼び出す.シリアルインタフェースドライバは,このコールバックルーチン +の中で,必ずsio_rcv_chrを呼び出して受信した文字を取り出す. + +5.4 システムログタスク用のための定義 + +ターゲット依存部で提供すべきシステムログタスクのための定義は次の通りで +ある.これらの定義は,cpu_config.hまたはsys_config.h(またはそれらから +インクルードされるファイル)に含める. + +(1) LOGTASK_PORTID + +システムログタスクが,システムログを出力するシリアルポートのIDを定義し +たマクロをターゲット依存部で提供する. + +(2) システムログタスク関連の定義(オプション) + +システムログタスクに関する以下のマクロをターゲット依存部で提供する.こ +れらのマクロをターゲット依存部で定義しない場合には,デフォルトの値が使 +われる. + +(2-1) LOGTASK_PRIORITY システムログタスクの初期優先度 +(2-2) LOGTASK_STACK_SIZE システムログタスクのスタックサイズ +(2-3) LOGTASK_INTERVAL システムログタスクの動作間隔(単位: ミリ秒) + + +6.ターゲット依存部実装上のヒント + +(1) タスクディスパッチャの2通りの実装方針 + +タスクディスパッチャの実装方針として,コンテキストの保存・復帰とタスク +例外処理ルーチンの起動を一連のルーチンで行う方針(これを方針Aと呼ぶ) +と,コンテキストの保存・実行するタスクの選択・コンテキストの復帰とタス +ク例外処理ルーチンの起動をばらばらのルーチンで行う方針(これを方針Bと +呼ぶ)がある.方針Bは,保存するコンテキスト情報を状況に応じて必要最少 +限にすることが容易になるという利点がある.ただし,シミュレーション環境 +の場合,実現方法によっては方針Bが採れない可能性も考えられる. + +タスク例外処理ルーチンの起動箇所という観点からみた場合,2つの方針には +留意すべき違いがある.以下,例により説明する.タスク1とタスク2の2つの +タスクがあり,タスク1の方が優先度が高いものとする.最初,タスク2が実行 +中に割込みハンドラが起動され,その中からタスク1が起動された結果,タス +ク2がタスク1によってプリエンプトされたものとする.ここで,タスク1がタ +スク2に対してタスク例外処理ルーチンの起動を要求した後,待ち状態に入る +サービスコールを発行し,その結果タスク2にディスパッチされる状況を考え +る.この時,タスクディスパッチャは,タスク2に対してタスク例外処理ルー +チンの起動処理を行う必要があるが,方式Aの場合には,タスク1から明示的に +呼ばれたディスパッチャの中でタスク例外処理ルーチンの起動が行われるのに +対して,方針Bの場合には,タスク2のコンテキストを復帰するルーチンへ分岐 +した後,コンテキストを復帰する処理に続く処理としてタスク例外処理ルーチ +ンの起動が行われる. + +JSPカーネルでは,方針Aを採るか方針Bを採るかをターゲット依存部に任せる +こととする.そのために,タスク例外処理ルーチンの起動をタスクディスパッ +チャに含める仕様としている. + +(2) 割込みハンドラの出入口処理 + +割込みハンドラの出入口処理の内容は,プロセッサの割込みアーキテクチャに +より大きく異なるが,おおよその処理の流れは次の通りである.CPU例外ハン +ドラの出入口処理も,引数を渡すことを除いては,おおよその処理の流れは同 +様である.ただし,プロセッサが割込みとCPU例外で異なる扱いをする場合は, +実際の出入口処理はかなり異なったものとなる. + + ------------------------------------------------------------ + レジスタの保存(主にスクラッチレジスタ) + 割込みスタックへ切換え(最も外側のハンドラのみ) + + 登録された割込みハンドラの呼出し + + タスクスタックへ切換え(最も外側のハンドラのみ) + if (最も外側のハンドラ && reqflg) { + if (enadsp && runtsk != schedtsk) { + タスクディスパッチ処理 + タスク例外処理ルーチンの起動処理(calltex) + } + else { + タスク例外処理ルーチンの起動処理(calltex) + } + } + レジスタの復帰(主にスクラッチレジスタ) + 割込み処理からのリターン + + ※「ハンドラ」は,割込みハンドラとCPU例外ハンドラの総称. + ※「最も外側のハンドラ」は「戻り先がタスク」と言い換えることが + できる. + ------------------------------------------------------------ + +この中で,内側のif文がいずれの場合でもタスク例外処理ルーチンの起動処理 +を行う必要があることから(ただし,タスク例外処理ルーチンの起動を行う対 +象タスクは異なる),内側のif文は次のように最適化できる場合がある. + + ------------------------------------------------------------ + if (enadsp && runtsk != schedtsk) { + タスクディスパッチ処理 + } + タスク例外処理ルーチンの起動処理(calltex) + ------------------------------------------------------------ + + +7.M68K(68LC040)用のターゲット依存部 + +(1) 前提 + +すべてのタスクをスーパーバイザモードで実行することとし,ユーザモードは +用いない. + +(2) 実行コンテキストとCPUロック状態 + +タスクコンテキストはマスタモード,非タスクコンテキストは割込みモードで +実行する.sense_context は,SR 中のマスタ/割込みモードビットを参照す +る方法で実現する. + +IPM が 7 の時(NMI を除くすべての割込みが禁止される)かつその時に限り, +CPUロック状態であるものとする.sense_lock は,SR 中の IPM を参照する方 +法で実現する.NMI はカーネルの管理外の割込みなので,CPUロック状態で +NMI が受け付けられるのは差し支えない. + +chg_ipm をサポートするかどうかを,SUPPORT_CHG_IPM を定義するかどうかで +変更できる.タスクコンテキストで IPM を変更する場合には,chg_ipm を使 +わなければならない.chg_ipm をサポートしない場合には,タスクコンテキス +トで IPM を変更することはできない.つまり,タスクコンテキストでは,IPM +は常に 0 になっている. + +chg_ipm をサポートする場合でも,chg_ipm を使って IPM を 7 に変更するこ +とは許さない.これは,chg_ipm と loc_cpu/unl_cpu の関係が複雑になるた +めである.また,IPM が 1〜6 の時にも,タスクディスパッチは保留されない. +IPM は,タスクディスパッチによって,新しく実行状態になったタスクへ引き +継がれる.そのため,タスクが実行中に,別のタスクによって IPM が変更さ +れる場合がある.これは,ディスパッチャを方針Bで実装する場合には素直に +実装できるが,方針Aで実装する場合にはあちこちに IPM の設定処理が入る. +方針Aで実装する場合には,IPM が 1〜6 の時にもタスクディスパッチは保留 +されるとする方が楽である. + +(3) 割込みハンドラ出入口処理 + +M68K(M68020以上)では,割込みハンドラの起動によって,使用するスタック +が自動的に割込みスタックへ切り換わるため,割込みスタックへの切換え処理 +は必要ない.最も外側のハンドラであるかどうかは,スタック上に積まれた +SR 中のマスタ/割込みモードビットを参照して判定している.タスクディス +パッチとタスク例外処理ルーチンの起動処理は,ret_int ルーチンに任せてい +る. + +reqflg をチェックする前に割込みを禁止するのは,割込みを禁止しないと, +reqflg をチェックした後に起動された割込みハンドラ内でディスパッチが要 +求された場合に,ディスパッチが行われないためである. + +interrupt_entry: + movem.l %d0-%d1/%a0-%a1, -(%sp) /* スクラッチレジスタを保存 */ + jsr <割込みハンドラ> /* 割込みハンドラを呼び出す */ + movem.l (%sp)+, %d0-%d1/%a0-%a1 /* スクラッチレジスタを復帰 */ + btst.b #4, (%sp) /* 戻り先が割込みモードなら */ + jbeq 1f /* すぐにリターン */ + ori.w #0x0700, %sr /* 割込み禁止 */ + tst.l reqflg /* reqflg が TRUE であれば */ + jbne ret_int /* ret_int へ */ +1: rte + +(4) CPU例外ハンドラ出入口処理 + +M68Kでは,CPU例外ハンドラの起動によって割込みモードへの移行はおこらず, +使用するスタックは切り換わらない.そのため,CPU例外ハンドラ内で割込み +モードに切り換えている.また,最も外側のハンドラであるかどうかを判定す +るために,割込みモードに切り換える前の SR をスタック上に保存する.タス +クディスパッチとタスク例外処理ルーチンの起動処理は,ret_exc ルーチンに +任せている. + +CPU例外ハンドラへの引数は,例外スタックフレームの先頭番地(すなわち, +CPU例外ハンドラの出入口処理が呼ばれた直後のスタックポインタ)としてい +る. + +reqflg をチェックする前に割込みを禁止するのは,割込みを禁止しないと, +reqflg をチェックした後に起動された割込みハンドラ内でディスパッチが要 +求された場合に,ディスパッチが行われないためである. + +exception_entry: + movem.l %d0-%d1/%a0-%a1, -(%sp) /* スクラッチレジスタを保存 */ + lea.l 16(%sp), %a0 /* 例外フレームの先頭を A0 に */ + move.w %sr, %d0 /* SR を D0 に */ + and.w #~0x1000, %sr /* 割込みモード */ + move.l %d0, -(%sp) /* 元の SR をスタックに保存 */ + move.l %a0, -(%sp) /* A0 を引数として渡す */ + jsr /* CPU例外ハンドラを呼び出す */ + addq.l #4, %sp /* 引数を捨てる */ + move.l (%sp)+, %d0 + and.w #0x1000, %d0 /* 元が割込みモードなら */ + jbeq 1f /* すぐにリターン */ + or.w #0x1700, %sr /* マスタモード・割込み禁止 */ + tst.l reqflg /* reqflg が TRUE であれば */ + jbne ret_exc /* ret_exc へ */ +1: movem.l (%sp)+, %d0-%d1/%a0-%a1 /* スクラッチレジスタを復帰 */ + rte + +(5) 方針Aのディスパッチャ + +以下のコードでは,chg_ipm はサポートしていない.また,採用しなかったコ +ートであるため,動作テストをしていない. + +CTXB は「VP msp」のみを含む構造体とする.タスクのコンテキストは,次の +図のようにタスクのスタック上に保存する.スクラッチレジスタ(D0〜D1,A0 +〜A1)とその他のレジスタを別々に積むのは,タスク例外処理ルーチンの起動 +に都合がよいためである. + + * 小 +-----------------------------------+ ← TCB 中に保存されている MSP + * ↑ | D2 | + * +-----------------------------------+ + * . . . . . . + * +-----------------------------------+ + * | D7 | + * +-----------------------------------+ + * | A2 | + * +-----------------------------------+ + * . . . . . . + * +-----------------------------------+ + * | A6 | + * +-----------------------------------+ + * | D0 | + * +-----------------------------------+ + * | D1 | + * +-----------------------------------+ + * | A0 | + * +-----------------------------------+ + * | A1 | + * +-----------------+-----------------+ + * | SR | PC (上16bit) | + * +-----------------+-----------------+ + * ↓ | PC (下16bit) | 例外情報 | + * 大 +-----------------+-----------------+ ← ディスパッチャ起動前の MSP + +dispatch は,trap_dispatch を TRAP命令で呼ぶ関数とする. + +exit_and_dispatch: + or.w #0x1000, %sr /* マスタモード */ + jbra dispatch_1 + +trap_dispatch: + movem.l %d0-%d1/%a0-%a1, -(%sp) /* スクラッチレジスタを保存 */ + movem.l %d2-%d7/%a2-%a6, -(%sp) /* 残りのレジスタを保存 */ + move.l runtsk, %a0 /* コンテキストを保存 */ + move.l %sp, TCB_msp(%a0) +dispatch_1: + move.l schedtsk, %a0 + move.l %a0, runtsk /* schedtsk を runtsk に */ + jbeq dispatch_3 /* schedtsk があるか? */ + move.l TCB_msp(%a0), %sp /* コンテキストを復帰 */ + movem.l (%sp)+, %d2-%d7/%a2-%a6 /* レジスタを復帰 */ + btst.b #TCB_enatex_bit, TCB_enatex(%a0) + jbeq dispatch_2 /* enatex が FALSE ならリターン */ + tst.l TCB_texptn(%a0) /* texptn が 0 ならリターン */ + jbeq dispatch_2 + jsr call_texrtn /* タスク例外処理ルーチンの呼出し */ +dispatch_2: + movem.l (%sp)+, %d0-%d1/%a0-%a1 /* スクラッチレジスタを復帰 */ + rte + +dispatch_3: + stop #0x2000 /* 割込み待ち(割込みモード) */ + /* + * ここで割込みモードに切り換えるのは,ここで発生する割込み処理 + * にどのスタックを使うかという問題の解決と,割込みハンドラ内で + * のタスクディスパッチの防止という2つの意味がある. + */ + or.w #0x1700, %sr /* マスタモード・割込み禁止 */ + tst.l reqflg /* reqflg が FALSE なら */ + jbeq dispatch_3 /* dispatch_3 へ */ + clr.l reqflg /* reqflg をクリア */ + jbra dispatch_1 + +ret_int: + /* + * ここでは,割込みモード・割込み禁止状態. + */ + move.l %a1, -(%sp) /* A1 を割込みスタックに保存 */ + movec.l %msp, %a1 /* タスクスタックを A1 に */ + move.l (%sp)+, -(%a1) /* A1 をタスクスタックに積む */ + movem.l %d0-%d1/%a0, -(%a1) /* スクラッチレジスタを積む */ + clr.l reqflg /* reqflg をクリア */ + move.l runtsk, %a0 /* A0 ← runtsk */ + tst.l enadsp /* enadsp が FALSE なら */ + jbeq ret_int_3 /* ret_int_3 へ */ + cmp.l schedtsk, %a0 /* runtsk と schedtsk が同じなら */ + jbeq ret_int_3 /* ret_int_3 へ */ + + /* ディスパッチ処理 */ + movem.l %d2-%d7/%a2-%a6, -(%a1) /* レジスタを保存 */ + move.l %a1, TCB_msp(%a0) /* タスクスタックを保存 */ +ret_int_1: + move.l schedtsk, %a0 + move.l %a0, runtsk /* schedtsk を runtsk に */ + jbne ret_int_2 /* schedtsk があるか? */ +ret_int_1x: + stop #0x2000 /* 割込み待ち(割込みハンドラ内) */ + or.w #0x0700, %sr /* 割込み禁止 */ + tst.l reqflg /* reqflg が FALSE なら */ + jbeq ret_int_1x /* ret_int_1x へ */ + clr.l reqflg /* reqflg をクリア */ + jbra ret_int_1 +ret_int_2: + move.l TCB_msp(%a0), %a1 /* タスクスタックを A1 に */ + movem.l (%a1)+, %d2-%d7/%a2-%a6 /* レジスタを復帰 */ + +ret_int_3: + btst.b #TCB_enatex_bit, TCB_enatex(%a0) + jbeq ret_int_4 /* enatex が FALSE ならリターン */ + tst.l TCB_texptn(%a0) /* texptn が 0 でなければ */ + jbne ret_int_5 /* ret_int_5 へ */ +ret_int_4 + movem.l (%a1)+, %d0-%d1/%a0 /* スクラッチレジスタを復帰 */ + move.l (%a1)+, -(%sp) /* A1 を割込みスタックに保存 */ + movec.l %a1, %msp /* A1 をタスクスタックに */ + move.l (%sp)+, %a1 /* A1 を割込みスタックから復帰 */ + rte + +ret_int_5: + move.w 16(%a1), %d0 /* 戻り先の SR を D0 に */ + move.l TCB_exinf(%a0), -(%a1) /* exinf をタスクスタックに */ + move.l TCB_texptn(%a0), -(%a1) /* texptn をタスクスタックに */ + move.l #ret_tex, -(%a1) /* #ret_tex をタスクスタックに */ + clr.l TCB_enatex(%a0) /* runtsk->enatex をクリア */ + clr.l TCB_texptn(%a0) /* runtsk->texptn をクリア */ + move.w #例外情報, -(%a1) /* 例外スタックフレームを作る */ + move.l TCB_texrtn(%a0), -(%a1) + move.w %d0, -(%a1) + movec.l %a1, %msp /* A1 をタスクスタックに */ + rte + +タスク例外処理ルーチン呼出し時のスタック + + * 小 +-----------------------------------+ + * ↑ | ret_tex | + * +-----------------------------------+ + * | texptn | + * +-----------------------------------+ + * | exinf | + * +-----------------------------------+ + * | D0 | + * +-----------------------------------+ + * | D1 | + * +-----------------------------------+ + * | A0 | + * +-----------------------------------+ + * | A1 | + * +-----------------+-----------------+ + * | SR | PC (上16bit) | + * +-----------------+-----------------+ + * ↓ | PC (下16bit) | 例外情報 | + * 大 +-----------------+-----------------+ + +ret_tex: + addq.l #8, %sp /* 引数エリアを捨てる */ + or.w #0x0700, %sr /* 割込み禁止 */ + jsr call_texrtn /* タスク例外処理ルーチンの起動 */ + movem.l (%sp)+, %d0-%d1/%a0-%a1 /* スクラッチレジスタを復帰 */ + rte + +(6) 方針B(採用) + +ソースコードを参照. + + +8.ターゲット依存部実装上の注意点 + +以下は,ターゲット依存部を実装する上でミスしがちな点をリストアップした +ものである. + +(1) タスク終了時 + +ext_tsk を呼ばずにタスクのメイン関数からリターンした場合,ext_tsk を呼 +び出したのと同等の処理を行うようにしなければならない.タスク起動時に, +メイン関数からのリターンアドレスを ext_tsk の番地に設定しておく方法を +推奨する. + +(2) タスクコンテキストでの割込みマスクの変更 + +chg_iXX をサポートする場合,タスク切替えの際に,chg_iXX によって設定し +た割込みマスクの値(タスクコンテキストにおける割込みマスクの値)を新し +いタスクに引き継ぐことを推奨する.特に,割込みの出口でタスク切替えを行 +う箇所は注意が必要である.具体的には,以前に同じタスクが動いていた時の +割込みマスクがスタックに積まれている場合に,これをそのまま書き戻しては +ならない. + +(3) タスク例外処理の実行コンテキスト + +タスク例外処理ルーチンはタスクコンテキストで実行されるため,タスク例外 +処理ルーチン実行時にはスタックポインタがタスクスタックを指している必要 +がある(特に割込みの出口処理で注意すること) . + +(4) CPU例外ハンドラ + +CPU例外ハンドラ実行時は,割込みマスクの値がCPU例外発生直前と同じになる +ようにすること. + +(5) 実行すべきタスクがない場合の処理 + +実行すべきタスクがない(schedtsk が NULL)場合に,プロセッサを待ちモー +ド(スリープモード)に移行させる処理と,割込みを許可する処理とは,不可 +分に行なう必要がある.これを不可分に行なわない場合,割込みを許可した直 +後に割込みが入り,その中でタスクが実行可能状態になると,実行すべきタス +クがあるにもかかわらずプロセッサが待ちモードになってしまう. + +また,実行すべきタスクがなく,割込みを許可して割込みを待つ間は,runtsk +を NULL に設定しなければならない.このように設定しないと,割込みハンド +ラから iget_tid を呼び出した際の動作が仕様に合致しなくなる(μITRON4.0 +仕様では,実行状態のタスクがない場合に,iget_tid は TSK_NONE を返すこ +とになっており,iget_tid のコードは,runtsk が NULL の時に TSK_NONE を +返すようになっている). + +m68k の実装は(config/m68k/cpu_support.S より), + +dispatcher: + move.l schedtsk, %a0 + move.l %a0, runtsk /* schedtsk を runtsk に */ + jbeq dispatcher_1 /* runtsk があるか? */ + +となっており,schedtsk が NULL の時に,runtsk を NULL にしてから,割込 +み待ちに入る.しかしながら,この処理が抜けていると,schedtsk が NULL +の時には,runtsk をすぐに更新しない.そのため,実行状態のタスクがない +場合に iget_tid を呼ぶと,前に実行されていたタスクのID が返る. + +以上 diff --git a/uzume_prototype/kernel/doc/configurator.txt b/uzume_prototype/kernel/doc/configurator.txt new file mode 100644 index 0000000..df5b4c1 --- /dev/null +++ b/uzume_prototype/kernel/doc/configurator.txt @@ -0,0 +1,619 @@ + + = JSPカーネル コンフィギュレータ仕様 = + + (Release 1.4対応,最終更新: 20-Dec-2003) + +------------------------------------------------------------------------ + TOPPERS/JSP Kernel + Toyohashi Open Platform for Embedded Real-Time Systems/ + Just Standard Profile Kernel + + Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + Toyohashi Univ. of Technology, JAPAN + + 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + によって公表されている GNU General Public License の Version 2 に記 + 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + 利用と呼ぶ)することを無償で許諾する. + (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + スコード中に含まれていること. + (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + の無保証規定を掲載すること. + (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + と. + (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + 作権表示,この利用条件および下記の無保証規定を掲載すること. + (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + 報告すること. + (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + + 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + + @(#) $Id: configurator.txt,v 1.1 2009/01/31 05:27:37 suikan Exp $ +------------------------------------------------------------------------ + + +このドキュメントでは,JSPカーネルのコンフィギュレータが生成すべきファ +イルの内容について解説する. + +JSPカーネルのコンフィギュレータは,システムコンフィギュレーションファ +イルを処理して,カーネル構成ファイル(kernel_cfg.c)とID自動割付け結果 +ファイル(kernel_id.h)を生成する.また,静的APIのパラメータチェックに +用いるファイル(kernel_chk.c)を生成する. + +ID自動割付け結果ファイルは,コンフィギュレータがID番号を割り付けたオブ +ジェクトの名前を,割り付けたID番号に定義するファイルである. + +以下では,カーネル構成ファイルの内容について解説する. + +(1) 固定生成部分 + +(1-1) 標準インクルードファイル + +kernel_cfg.c 用のインクルードファイルをインクルードするプリプロセッサ +ディレクティブ(#include)を生成する.具体的には,次の行を生成する. + +#include "kernel_cfg.h" + +また,必要であれば,ID自動割付け結果ファイルをインクルードするプリプロ +セッサディレクティブ(#include)を生成する.具体的には,次の行を生成す +る. + +#include "kernel_id.h" + +(1-2) マクロの置換順序の制御 + +マクロの置換順序を変えるために,以下のマクロ定義行を生成する. + +#define CFG_INTHDR_ENTRY(inthdr) INTHDR_ENTRY(inthdr) +#define CFG_EXCHDR_ENTRY(exchdr) EXCHDR_ENTRY(exchdr) +#define CFG_INT_ENTRY(inthdr) INT_ENTRY(inthdr) +#define CFG_EXC_ENTRY(exchdr) EXC_ENTRY(exchdr) + +なお,これらのマクロは,元々は過去のバージョンとの互換性を保つために入 +れたものである.ただし,過去のバージョンとの互換性が必要なくても,マク +ロの置換順序を変えるために必要である. + +(2)「INCLUDE」静的APIの処理 + +システムコンフィギュレーションファイルに含まれる「INCLUDE」静的APIに対 +応するプリプロセッサディレクティブ(#include)を生成する.例えば, + +INCLUDE("\"sample1.h\""); + +という静的APIに対して, + +#include "sample1.h" + +というディレクティブを生成する.生成するディレクティブの順序は,システ +ムコンフィギュレーションファイル中での静的APIの順序に一致させる. + +(3) 各カーネルオブジェクトに関する定義 + +システムコンフィギュレーションファイル中に,オブジェクトを生成する静的 +API「CRE_XXX」が含まれる各カーネルオブジェクトに関して,オブジェクト生 +成のための定義を生成する. + +コンフィギュレータは,同じ種類のオブジェクトを生成する静的APIを集め, +それらをID番号の順に並べ替える.同じID番号のオブジェクトを生成する静的 +APIが複数含まれている場合には,コンフィギュレータがエラーを報告する. +JSPカーネルは,オブジェクトのID番号が連続していることを仮定して実装し +てある.ID番号が連続していない場合には,コンフィギュレータがエラーを報 +告する. + +また,コンフィギュレータは,オブジェクトのID番号の代わりに識別子が記述 +されている場合に,そのオブジェクトにID番号を割り付ける.ID番号は,他の +オブジェクトのID番号と重複がなく,ID番号ができる限り連続するように割り +付ける.それでもID番号が連続にならない場合には,コンフィギュレータがエ +ラーを報告する. + +各カーネルオブジェクトに関する定義の標準的な構成は,次の通りである.オ +ブジェクトによって例外がある場合には,オブジェクト毎の項で説明する. + +(a) オブジェクトの数 + +オブジェクトの数をマクロ定義するプリプロセッサディレクティブ(#define) +を生成する.具体的には,オブジェクトの省略記号を「XXX」とすると,次の +ような行を生成する. + +#define TNUM_XXXID <オブジェクトの数> + +(b) 最大のオブジェクトIDの変数の定義 + +最大のオブジェクトIDを持つ変数の定義を生成する.具体的には,オブジェク +トの省略記号を「XXX/xxx」とすると,次のような行を生成する. + +const ID tmax_xxxid = (TMIN_XXXID + TNUM_XXXID - 1); + +(c) オブジェクトに必要なメモリ領域の定義 + +オブジェクトによっては,オブジェクトに必要なメモリ領域の定義を生成する. +具体的には,オブジェクト毎の項で説明する. + +(d) オブジェクトの初期化ブロックの定義 + +オブジェクトの初期化ブロックの定義を生成する.具体的には,オブジェクト +の省略記号を「XXX/xxx」とすると,次のような行を生成する. + +const XXXINIB xxxinib_table[TNUM_XXXID] = { + <オブジェクトIDが 1 のオブジェクトの初期化情報>, + <オブジェクトIDが 2 のオブジェクトの初期化情報>, + …… + <オブジェクトIDが tmax_xxxid のオブジェクトの初期化情報> +}; + +オブジェクトの初期化情報の形式は,オブジェクト毎に異なる.具体的には, +オブジェクト毎の項で説明する. + +(e) オブジェクトのコントロールブロックの定義 + +オブジェクトのコントロールブロックの定義を生成する.具体的には,オブジェ +クトの省略記号を「XXX/xxx」とすると,次のような行を生成する. + +XXXCB xxxcb_table[TNUM_XXXID]; + +(3-1) タスクに関する定義 + +JSPカーネルは,タスクが一つもないケースに対応していないため,タスクに +関する定義は必ず生成しなければならない. + +タスクに関する定義のインクルードファイル名とオブジェクトの省略記号は次 +の通りである.ただし,タスク初期化ブロックのデータ型は TINIB,変数名は +tinib_table,タスクコントロールブロックのデータ型は TCB,変数名は +tcb_table である(いずれも「TSK/tsk」に代えて「T/t」を用いている). + + インクルードファイル名: task.h + オブジェクトの省略記号: TSK + +タスク初期化ブロックには,「CRE_TSK」静的APIで指定される情報に加えて, +「DEF_TEX」静的APIで指定される情報を含める. + +以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ +ている時に生成すべき情報について述べる. + +CRE_TSK(tskid, { tskatr, exinf, task, itskpri, stksz, stack }); +DEF_TEX(tskid, { texatr, texrtn }); + +(3-1-1) タスクに必要なメモリ領域の定義 + +タスクに必要なメモリ領域として,タスクのスタック領域がある.生成する各 +タスク毎に,指定されたサイズのスタック領域を定義する.具体的には,上記 +の静的APIに対して,次の定義を生成する. + +static __STK_UNIT <スタック領域の変数名>[__TCOUNT_STK_UNIT(stksz)]; + +ここで,<スタック領域の変数名> は,タスク毎に異なる識別子を生成して用 +いる. + +(3-1-2) タスクの初期化情報 + +タスク初期化ブロック中に生成するタスクの初期化情報は,次の形式とする. + + { tskatr, (VP_INT)(exinf), (FP)(task), INT_PRIORITY(itskpri), + __TROUND_UNIT_STK(stksz), <スタック領域の変数名>, + texatr, (FP)(texrtn) } + +ここで,CRE_TSK に対応する DEF_TEX がない場合には,texatr を TA_NULL, +texrtn を NULL とする. + +(3-1-3) タスク生成順序テーブルの定義 + +タスクに対しては,生成された順序(タスクを生成する静的APIが記述された +順序)をテーブルに出力する必要がある.これは,タスクの生成された順序で, +タスクの初期化(より具体的には,タスクの起動)を行う必要があるためであ +る. + +具体的には,次のような行を生成する. + +const ID torder_table[TNUM_TSKID] = { + <最初に生成されたタスクのタスクID>, + <2番目に生成されたタスクのタスクID>, + …… + <最後に生成されたタスクのタスクID> +}; + +(3-1-4) エラー条件 + +タスクの初期化に関するエラー条件は次の通りである. + +・DEF_TEX に対応する CRE_TSK がない場合(E_NOEXS) +・(tskatr & ~(TA_ACT)) が 0 でない場合(E_RSATR) +・(TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI) でない場合(E_PAR) +・stack が NULL でない場合(E_NOSPT) +・texatr が 0 でない場合(E_RSATR) + +※ この他に,task や texrtn がプログラムの開始番地として正しいない場合 +や,stksz が小さすぎる場合にもエラーとすべきだが,エラー条件がターゲッ +トに依存してしまうため,今後の課題とする. + +(3-2) セマフォに関する定義 + +セマフォに関する定義のインクルードファイル名とオブジェクトの省略記号は +次の通りである. + + インクルードファイル名: semaphore.h + オブジェクトの省略記号: SEM + +以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ +ている時に生成すべき情報について述べる.なお,セマフォに必要なメモリ領 +域はない. + +CRE_SEM(semid, { sematr, isemcnt, maxsem }); + +(3-2-1) セマフォの初期化情報 + +セマフォ初期化ブロック中に生成するセマフォの初期化情報は,次の形式とす +る. + + { sematr, isemcnt, maxsem } + +(3-2-2) エラー条件 + +セマフォの初期化に関するエラー条件は次の通りである. + +・(sematr & ~(TA_TPRI)) が 0 でない場合(E_RSATR) +・(isemcnt > maxsem) の場合(E_PAR) +・(1 <= maxsem && maxsem <= TMAX_MAXSEM) でない場合(E_PAR) + +(3-3) イベントフラグに関する定義 + +イベントフラグに関する定義のインクルードファイル名とオブジェクトの省略 +記号は次の通りである. + + インクルードファイル名: eventflag.h + オブジェクトの省略記号: FLG + +以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ +ている時に生成すべき情報について述べる.なお,イベントフラグに必要なメ +モリ領域はない. + +CRE_FLG(flgid, { flgatr, iflgptn }); + +(3-3-1) イベントフラグの初期化情報 + +イベントフラグ初期化ブロック中に生成するイベントフラグの初期化情報は, +次の形式とする. + + { flgatr, iflgptn } + +(3-3-2) エラー条件 + +イベントフラグの初期化に関するエラー条件は次の通りである. + +・(flgatr & ~(TA_TPRI|TA_CLR)) が 0 でない場合(E_RSATR) + +(3-4) データキューに関する定義 + +データキューに関する定義のインクルードファイル名とオブジェクトの省略記 +号は次の通りである. + + インクルードファイル名: dataqueue.h + オブジェクトの省略記号: DTQ + +以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ +ている時に生成すべき情報について述べる. + +CRE_DTQ(dtqid, { dtqatr, dtqcnt, dtq }); + +(3-4-1) データキューに必要なメモリ領域の定義 + +データキューに必要なメモリ領域として,データキュー領域がある.生成する +各データキュー毎に,必要なサイズのデータキュー領域を定義する.具体的に +は,上記の静的APIに対して,次の定義を生成する. + +#if (dtqcnt) > 0 +static VP_INT <データキュー領域の変数名>[dtqcnt]; +#else +#define <データキュー領域の変数名> NULL +#endif + +ここで,<データキュー領域の変数名> は,データキュー毎に異なる識別子を +生成して用いる. + +(3-4-2) データキューの初期化情報 + +データキュー初期化ブロック中に生成するデータキューの初期化情報は,次の +形式とする. + + { dtqatr, dtqcnt, <データキュー領域の変数名> } + +(3-4-3) エラー条件 + +データキューの初期化に関するエラー条件は次の通りである. + +・(dtqatr & ~(TA_TPRI)) が 0 でない場合(E_RSATR) +・dtq が NULL でない場合(E_NOSPT) + +(3-5) メールボックスに関する定義 + +メールボックスに関する定義のインクルードファイル名とオブジェクトの省略 +記号は次の通りである. + + インクルードファイル名: mailbox.h + オブジェクトの省略記号: MBX + +以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ +ている時に生成すべき情報について述べる.なお,メールボックスに必要なメ +モリ領域はない. + +CRE_MBX(mbxid, { mbxatr, maxmpri, mprihd }); + +(3-5-1) メールボックスの初期化情報 + +メールボックス初期化ブロック中に生成するメールボックスの初期化情報は, +次の形式とする. + + { mbxatr, maxmpri } + +(3-5-2) エラー条件 + +メールボックスの初期化に関するエラー条件は次の通りである. + +・(mbxatr & ~(TA_TPRI|TA_MPRI)) が 0 でない場合(E_RSATR) +・(TMIN_MPRI <= maxmpri && maxmpri <= TMAX_MPRI) でない場合(E_PAR) +・mprihd が NULL でない場合(E_NOSPT) + +(3-6) 固定長メモリプールに関する定義 + +固定長メモリプールに関する定義のインクルードファイル名とオブジェクトの +省略記号は次の通りである. + + インクルードファイル名: mempfix.h + オブジェクトの省略記号: MPF + +以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ +ている時に生成すべき情報について述べる. + +CRE_MPF(mpfid, { mpfatr, blkcnt, blksz, mpf }); + +(3-6-1) 固定長メモリプールに必要なメモリ領域の定義 + +固定長メモリプールに必要なメモリ領域として,固定長メモリプール領域があ +る.生成する各固定長メモリプール毎に,必要なサイズの固定長メモリプール +領域を定義する.具体的には,上記の静的APIに対して,次の定義を生成する. + +static __MPF_UNIT <固定長メモリプール領域の変数名> + [__TCOUNT_MPF_UNIT(blksz) * (blkcnt)]; + +ここで,<固定長メモリプール領域の変数名> は,固定長メモリプール毎に異 +なる識別子を生成して用いる. + +(3-6-2) 固定長メモリプールの初期化情報 + +固定長メモリプール初期化ブロック中に生成する固定長メモリプールの初期化 +情報は,次の形式とする. + + { mpfatr, __TROUND_MPF_UNIT(blksz), <固定長メモリプール領域の変数名>, + (VP)(((VB *) <固定長メモリプール領域の変数名>) + + sizeof(<固定長メモリプール領域の変数名>)) } + +(3-6-3) エラー条件 + +固定長メモリプールの初期化に関するエラー条件は次の通りである. + +・(mpfatr & ~(TA_TPRI)) が 0 でない場合(E_RSATR) +・blkcnt が 0 の場合(E_PAR) +・blksz が 0 の場合(E_PAR) +・mpf が NULL でない場合(E_NOSPT) + +(3-7) 周期ハンドラに関する定義 + +周期ハンドラに関する定義のインクルードファイル名とオブジェクトの省略記 +号は次の通りである. + + インクルードファイル名: cyclic.h + オブジェクトの省略記号: CYC + +以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ +ている時に生成すべき情報について述べる.なお,周期ハンドラに必要なメモ +リ領域はない. + +CRE_CYC(cycid, { cycatr, exinf, cychdr, cyctim, cycphs }); + +(3-7-1) 周期ハンドラの初期化情報 + +周期ハンドラ初期化ブロック中に生成する周期ハンドラの初期化情報は,次の +形式とする. + + { cycatr, exinf, (FP)(cychdr), cyctim, cycphs } + +(3-7-2) エラー条件 + +周期ハンドラの初期化に関するエラー条件は次の通りである. + +・(cycatr & ~(TA_STA)) が 0 でない場合(E_RSATR) +・(cyctim > TMAX_RELTIM) の場合(E_PAR) +・(cycphs > TMAX_RELTIM) の場合(E_PAR) + +※ この他に,cychdr がプログラムの開始番地として正しいない場合にもエラー +とすべきだが,エラー条件がターゲットに依存してしまうため,今後の課題と +する. + +(4) 割込みハンドラに関する定義 + +システムコンフィギュレーションファイル中に,割込みハンドラを定義する静 +的API「DEF_INH」が含まれている場合に,割込みハンドラに関する定義を生成 +する.具体的には次の通り. + +(4-1) 定義する割込みハンドラの数 + +定義する割込みハンドラの数をマクロ定義するプリプロセッサディレクティブ +(#define)を生成する.また,その値を持つ変数の定義を生成する.具体的 +には,次のような行を生成する. + +#define TNUM_INHNO <定義する割込みハンドラの数> +const UINT tnum_inhno = TNUM_INHNO; + +(4-2) 割込みハンドラの出入口処理 + +定義する各割込みハンドラ毎に,割込みハンドラの出入口処理ルーチンを生成 +する.具体的には, + +DEF_INH(inhno, { inhatr, inthdr }); + +という静的APIに対して, + +CFG_INTHDR_ENTRY(inthdr); + +という行を生成する. + +(4-3) 割込みハンドラ初期化ブロックの定義 + +割込みハンドラ初期化ブロックを生成する.具体的には,次のような行を生成 +する. + +const INHINIB inhinib_table[TNUM_INHNO] = { + <割込みハンドラ 1 の初期化情報>, + <割込みハンドラ 2 の初期化情報>, + …… + <割込みハンドラ TNUM_INHNO の初期化情報> +}; + +この中の割込みハンドラの初期化情報は,次の形式とする. + + { inhno, inhatr, (FP)CFG_INT_ENTRY(inthdr) } + +(4-4) エラー条件 + +割込みハンドラに関するエラー条件は次の通りである. + +・inhatr が 0 でない場合(E_RSATR) + +※ この他に,inthdr がプログラムの開始番地として正しいない場合や, +inhno が割込みハンドラ番号として正しくない場合にもエラーとすべきだが, +エラー条件がターゲットに依存してしまうため,今後の課題とする. + +(5) CPU例外ハンドラに関する定義 + +システムコンフィギュレーションファイル中に,CPU例外ハンドラを定義する +静的API「DEF_EXC」が含まれている場合に,CPU例外ハンドラに関する定義を +生成する.具体的には次の通り. + +(5-1) 定義するCPU例外ハンドラの数 + +定義するCPU例外ハンドラの数をマクロ定義するプリプロセッサディレクティ +ブ(#define)を生成する.また,その値を持つ変数の定義を生成する.具体 +的には,次のような行を生成する. + +#define TNUM_EXCNO <定義するCPU例外ハンドラの数> +const UINT tnum_excno = TNUM_EXCNO; + +(5-2) CPU例外ハンドラの出入口処理 + +定義する各CPU例外ハンドラ毎に,CPU例外ハンドラの出入口処理ルーチンを生 +成する.具体的には, + +DEF_EXC(excno, { excatr, exchdr }); + +という静的APIに対して, + +CFG_EXCHDR_ENTRY(exchdr); + +という行を生成する. + +(5-3) CPU例外ハンドラ初期化ブロックの定義 + +CPU例外ハンドラ初期化ブロックを生成する.具体的には,次のような行を生 +成する. + +const EXCINIB excinib_table[TNUM_EXCNO] = { + , + , + …… + +}; + +この中のCPU例外ハンドラの初期化情報は,次の形式とする. + + { excno, excatr, (FP)CFG_EXC_ENTRY(exchdr) } + +(5-4) エラー条件 + +CPU例外ハンドラに関するエラー条件は次の通りである. + +・excatr が 0 でない場合(E_RSATR) + +※ この他に,excthdr がプログラムの開始番地として正しいない場合や, +excno がCPU例外ハンドラ番号として正しくない場合にもエラーとすべきだが, +エラー条件がターゲットに依存してしまうため,今後の課題とする. + +(6) タイムイベント管理に関する定義 + +タイムイベント管理に関連して,次の定義を生成する. + +TMEVTN tmevt_heap[TNUM_TSKID + TNUM_CYCID]; + +(7) 各モジュールの初期化関数の定義 + +各カーネルオブジェクトの管理,割込み管理,CPU例外ハンドラ管理の各機能 +を初期化関数を順に呼び出す関数(object_initialize)を生成する.使用し +ない機能の初期化関数は,呼び出さない. + +すべての機能を使った場合に生成される関数は次の通りである. + +void +object_initialize() +{ + task_initialize(); + semaphore_initialize(); + eventflag_initialize(); + dataqueue_initialize(); + mailbox_initialize(); + mempfix_initialize(); + cyclic_initialize(); + interrupt_initialize(); + exception_initialize(); +} + +(8) 初期化ルーチンの実行関数の定義 + +「ATT_INI」静的APIで追加した初期化ルーチンを順に呼び出す関数を生成する. +具体的には, + +ATT_INI({ iniatr, exinf, inirtn }); + +という静的APIに対して, + +inirtn((VP_INT)(exinf)); + +を呼び出す関数を,call_inirtn という名前で生成する.初期化ルーチンを呼 +び出す順序は,システムコンフィギュレーションファイル中での静的APIの順 +序に一致させる. + +例えば, + +ATT_INI({ TA_HLNG, 0, timer_initialize }); +ATT_INI({ TA_HLNG, (INT) CONSOLE_PORTID, serial_initialize }); + +という二つの静的APIがこの順序で記述された時に生成する関数は次の通りで +ある. + +void +call_inirtn() +{ + timer_initialize((VP_INT)(0)); + serial_initialize((VP_INT)((INT) CONSOLE_PORTID)); +} + +(8-1) エラー条件 + +初期化ルーチンに関するエラー条件は次の通りである. + +・iniatr が 0 でない場合(E_RSATR) + +※ この他に,inirtn がプログラムの開始番地として正しいない場合にもエラー +とすべきだが,エラー条件がターゲットに依存してしまうため,今後の課題と +する. + +以上 + + diff --git a/uzume_prototype/kernel/doc/design.txt b/uzume_prototype/kernel/doc/design.txt new file mode 100644 index 0000000..a387352 --- /dev/null +++ b/uzume_prototype/kernel/doc/design.txt @@ -0,0 +1,406 @@ + + = JSPカーネル 設計メモ = + + (Release 1.4対応,最終更新: 15-Mar-2005) + +------------------------------------------------------------------------ + TOPPERS/JSP Kernel + Toyohashi Open Platform for Embedded Real-Time Systems/ + Just Standard Profile Kernel + + Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + Toyohashi Univ. of Technology, JAPAN + + 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + によって公表されている GNU General Public License の Version 2 に記 + 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + 利用と呼ぶ)することを無償で許諾する. + (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + スコード中に含まれていること. + (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + の無保証規定を掲載すること. + (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + と. + (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + 作権表示,この利用条件および下記の無保証規定を掲載すること. + (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + 報告すること. + (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + + 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + + @(#) $Id: design.txt,v 1.1 2009/01/31 05:27:37 suikan Exp $ +------------------------------------------------------------------------ + + +1.JSPカーネルにおける制限事項 + +(1) サポートする機能 + +JSPカーネルは,名前の通りスタンダードプロファイルに含まれる機能のみを +サポートする.スタンダードプロファイル外の機能は,原則としてサポートし +ない. + +内部構造の設計にあたっては,スタンダードプロファイル外の機能をサポート +するための拡張性は考慮せず,スタンダードプロファイルに含まれる機能を効 +率良く実現することを目指す. + +(2) サービスコール内での割込みの扱い + +JSPカーネルでは,サービスコールはすべて割込み禁止で実行する.スタンダー +ドプロファイルの機能の範囲内では,この方法で十分と考えられるが,拡張機 +能を追加する時には設計を見直すべきである.具体的には,非タスクコンテキ +ストから呼び出されたサービスコールを遅延実行する方法が有力である. + +(3) CPU例外ハンドラの実行コンテキスト + +JSPカーネルでは,CPU例外ハンドラは非タスクコンテキストで実行する. + +参考: μITRON4.0仕様では,タスクコンテキストで発生したCPU例外に対する +CPU例外ハンドラを,タスクコンテキストで実行するか非タスクコンテキスト +で実行するかは,実装定義としている. + + +2.実行コンテキストとシステム状態の仮想化 + +(1) 実行コンテキスト + +実行コンテキストは,タスクコンテキストと非タスクコンテキストのいずれか +に分類される. + +実行コンテキストの管理はターゲット依存部で行う.具体的には,タスクコン +テキストと非タスクコンテキストを判別する関数(sense_context)を,ター +ゲット依存部で用意する. + +また,タスクコンテキストと非タスクコンテキストの間の遷移も,ターゲット +依存部の責任である.具体的には,割込みハンドラ/CPU例外ハンドラが起動 +されると非タスクコンテキストに切り換わり,割込みハンドラ/CPU例外ハン +ドラからリターンすると元の実行コンテキストに戻るよう,ターゲット依存部 +を実装する. + +(2) CPUロック状態 + +システムは,CPUロック状態か,CPUロック解除状態のいずれかにある.CPUロッ +ク状態では,すべての割込み(カーネルの管理外のものを除く.以下同じ)が +禁止されている. + +CPUロック状態の管理はターゲット依存部で行う.具体的には,CPUロック状態/ +CPUロック解除状態のいずれの状態であるかを判別する関数(sense_lock, +t_sense_lock,i_sense_lock)と,CPUロック状態とCPUロック解除状態の間を +遷移させる関数(t_lock_cpu,t_unlock_cpu,i_lock_cpu,i_unlock_cpu)を, +ターゲット依存部で用意する.これらの関数を呼び出す以外の方法で,CPUロッ +ク状態とCPUロック解除状態の間を遷移することはない. + + +3.ディスパッチとタスク例外処理ルーチン起動の方法 + +(1) ディスパッチが必要なタイミング + +ディスパッチを行う必要があるのは,以下のタイミングである. + +(a) サービスコール内での明示的なタスクディスパッチ要求 + +タスクコンテキストから呼び出されたサービスコール処理において,明示的に +タスクディスパッチが要求された場合.具体的には,実行状態のタスクよりも +優先順位の高く実行できる状態のタスクが生じる場合と,実行状態のタスク +(自タスク)を待ち状態にする場合がある.いずれの場合にも,サービスコー +ル処理内でディスパッチャを明示的に呼び出すことで,ディスパッチを行う. + +(b) 割込みハンドラ/CPU例外ハンドラの出口 + +割込みハンドラ/CPU例外ハンドラ(以下,ハンドラと総称する)から呼び出 +されたサービスコールでタスクディスパッチが要求された場合,ハンドラの出 +口でタスクディスパッチが必要かチェックし,必要であればタスクディスパッ +チを行う.ハンドラが多重に起動されている場合,最も外側のハンドラの出口 +でのみ行う(※). + +※ プロセッサによっては,CPU例外ハンドラの入口処理の先頭では,非タスク +コンテキストであると認識させられない場合がある.このような場合,入口処 +理の途中でハンドラが多重に起動されても,内側のハンドラでさらに外側のハ +ンドラがあることを認識できず,内側のハンドラでタスクディスパッチを行う +ことになる.この場合でも,入口処理の非タスクコンテキストであると認識さ +れない部分は,ハンドラの一部ではないと解釈すれば,上記の原則は守られて +いることになる.この注記は,以下の記述にも同様にあてはまる. + +(2) タスク例外処理ルーチンの起動が必要なタイミング + +タスク例外処理ルーチンを起動するのは,仕様書によると,「タスク例外処理 +許可状態」「保留例外要因が 0 でない」「タスクが実行状態である」「非タ +スクコンテキストまたはCPU例外ハンドラが実行されていない」の四つの条件 +が揃った場合である.このことから,タスク例外処理ルーチンの起動を行う必 +要があるのは,以下のタイミングである. + +(a) タスクディスパッチの直後 + +タスクディスパッチにより,実行状態のタスク(runtsk)が変化する.新しく +実行状態になったタスクが起動条件を満たしていれば,タスク例外処理ルーチ +ンを起動する. + +(b) 割込みハンドラ/CPU例外ハンドラの出口 + +割込みハンドラ/CPU例外ハンドラ(以下,ハンドラと総称する)の出口では, +タスクディスパッチを行う場合がある.その場合には,(a) の理由で必要なら, +タスク例外処理ルーチンを起動する. + +ハンドラの出口でタスクディスパッチを行わない場合でも,ハンドラ内で実行 +状態のタスクに対してタスク例外処理が要求された場合には,ハンドラの出口 +で起動条件をチェックし,起動条件を満たしていればタスク例外処理ルーチン +を起動する.ハンドラが多重に起動されている場合,最も外側のハンドラの出 +口でのみ行う(※). + +(c) 自タスクに対するタスク例外処理の要求 + +自タスクに対してタスク例外処理を要求した結果,自タスクが起動条件を満た +すようになれば,タスク例外処理ルーチンを起動する. + +(d) タスク例外処理の許可 + +タスク例外処理許可状態に移行した結果,自タスクが起動条件を満たすように +なれば,タスク例外処理ルーチンを起動する.タスク例外処理許可状態への移 +行は,ena_tex の呼出しによって起こる. + +(3) サービスコール処理内での明示的なディスパッチャの呼出し + +タスクコンテキストから呼び出されたサービスコール処理においてディスパッ +チが必要になった場合,サービスコールの処理を中断すべきタイミングで +dispatch を呼び出す.dispatch を呼び出すと,その時点で最も優先順位の高 +いタスクが実行される.dispatch は,呼び出したタスクが次に実行状態にな +るとタスク例外処理ルーチンの起動条件をチェックし,起動条件を満たしてい +ればタスク例外処理ルーチンを起動する. + +そのため,dispatch を呼び出したサービスコールへ処理が戻ってくるのは, +呼び出したタスクが次に実行状態となり,起動すべきタスク例外処理ルーチン +がなくなった時点である. + +なお,dispatch の処理は,ターゲット依存部で提供される. + +(4) 割込みハンドラ/CPU例外ハンドラの出口での処理 + +割込みハンドラ/CPU例外ハンドラ(以下,ハンドラと総称する)の出口処理 +では,ディスパッチが必要か,タスク例外処理ルーチンの起動が必要かをチェッ +クし,必要な処理を行う.ハンドラが多重に起動されている場合,最も外側の +ハンドラの出口でのみこの処理を行う. + +具体的には,ディスパッチとタスク例外処理ルーチンの起動のいずれかの処理 +が必要な場合には reqflg を TRUE にすることとし,最も外側のハンドラの出 +口で reqflg が TRUE になっていれば,まずディスパッチが必要かチェックし, +必要ならディスパッチを行う.ディスパッチにより新たに実行状態になったタ +スクがタスク例外処理ルーチンの起動条件を満たしていれば,タスク例外処理 +ルーチンを起動する.ディスパッチが必要なかった場合には,実行中のタスク +がタスク例外処理ルーチンの起動条件を満たしているかチェックし,満たして +いればタスク例外処理ルーチンを起動する.二つのタスク例外処理ルーチンの +起動処理は,意味的には異なるものだが,ルーチン的には共通化できる可能性 +がある. + +なお,ハンドラの出口処理は,ターゲット依存部で提供される. + +(5) タスクの起動と終了時の処理 + +タスク起動時のレジスタ復帰と,タスク終了時のレジスタ保存は,ターゲット +依存部の実装によっては省略できる. + +タスクの起動は,create_context と activate_context によって,次にその +タスクへのディスパッチが起こった時に,タスクの起動番地から実行するよう +にタスクコンテキストを設定することで行う. + +タスク終了時には,unlock_cpu に代えて,exit_and_dispatch を呼び出す. +exit_and_dispatch は,現在実行中のコンテキストを保存せずに,ディスパッ +チを行う関数である. + +なお,create_context,activate_context,exit_and_dispatch の処理は,ター +ゲット依存部で提供される. + +(6) 実行できる状態のタスクがない場合の扱い + +実行できる状態のタスクがない場合の対策として,アイドルタスクを導入する +方法がある.アイドルタスクを導入すると,ディスパッチャの途中で割込み待 +ちをする必要がないので,ソフトウェアの構造的にはエレガントになる.また, +ディスパッチャ中での条件分岐も減る.逆に,RAM の使用量がどうしても増え +てしまうという問題がある.このことから,アイドルタスクは使わない方針と +する. + +(7) ディスパッチ保留状態の保持方法 + +ディスパッチが保留されるのは,次のいずれかの場合である. + + ・ディスパッチ禁止状態 + ・非タスクコンテキスト実行中 + +CPU例外ハンドラは非タスクコンテキストで実行するとしたため,CPU例外ハン +ドラ実行中は,非タスクコンテキスト実行中に含めて考えることができる.ま +た,サービスコールはすべて割込み禁止で実行するため,サービスコール実行 +中も考慮する必要がない. + +この中で,非タスクコンテキスト実行中は,sense_context() で判定できる. +そこで,ディスパッチ禁止状態を表すBOOL型の変数を用意すれば,ディスパッ +チ保留状態が保持できることになる.実際には,ディスパッチ許可状態を表す +BOOL型の変数 enatex を導入した. + +※ サービスコール実行中に割込みを許可する(ディスパッチは許可しない) +場合には,サービスコール処理の途中で起動された割込みハンドラの出口では, +ディスパッチもタスク例外処理ルーチンの起動も行ってはならない.参照する +場所が違うことから,両者の禁止を別々の変数にする方法も考えられるが,設 +定する方の効率を考えると,一つの変数で両方禁止できる方が良いと思われる. +すなわち,ディスパッチ禁止状態とサービスコール実行中状態を,同じ変数を +ビットフィールドに分けて記憶するのが妥当と考えられる.さらに,CPU例外 +ハンドラをタスクコンテキストで実行する実装では,同じ変数にCPU例外ハン +ドラのネスト回数も記憶したくなる.例えば,次のような変数 pndflg を導入 +する方法が考えられる. + + ・最下位ビット … サービスコール実行中 + → 1 なら両者保留 + ・下から2ビットめ … ディスパッチ禁止状態 + → 1 ならタスク切替え保留 + ・残りのビット … CPU例外ハンドラのネスト回数 + → 0 以外ならタスク切替え保留 + + +4.サービスコールの記述方法 + +(1) sns_xxx + +sns_ctx,sns_loc,sns_dsp,sns_tex は,サービスコール内部でクリティカ +ルセクションを作らなくても実装できる. + +(2) タスクコンテキスト専用のサービスコール + +※ CPUロック状態で呼ばれるとエラーになることに注意. + +(2-1) タスク切換えを起こさないもの(例: get_pri) + + エラーチェック + t_lock_cpu(); + /* + * クリティカルセクション実行 + */ + t_unlock_cpu(); + +(2-2) タスク切換えを起こす可能性のあるもの(例: act_tsk) + + エラーチェック + t_lock_cpu(); + /* + * クリティカルセクション実行 + */ + if (タスクディスパッチが必要 && enadsp) { + /* 自タスクを待ち状態にするサービスコールでは, + 上で enadsp をチェックする必要はない.*/ + dispatch(); + } + t_unlock_cpu(); + +(2-3) 自タスクを終了するもの(ext_tsk) + + エラーチェック + t_lock_cpu(); + /* + * クリティカルセクション実行 + */ + exit_and_dispatch(); + +(2-4) ras_tex + + エラーチェック + tcb = get_tcb_self(tskid); + t_lock_cpu(); + + E_OBJエラーのチェック + + tcb->texptn |= rasptn; + if (tcb == runtsk && runtsk->enatex) { + texptn = runtsk->texptn; + runtsk->enatex = FALSE; + runtsk->texptn = 0; + + t_unlock_cpu(); + (*runtsk->tinib->texrtn)(texptn, runtsk->tinib->exinf); + + /* CPUロック状態のままリターンした場合を対策 */ + if (!t_sense_lock()) { + t_lock_cpu(); + } + + タスク例外処理ルーチンの起動条件を再度チェック&起動 + (runtsk->texptn が 0 になるまで上の処理を繰り返す) + + runtsk->enatex = TRUE; + } + t_unlock_cpu(); + +(2-5) ena_tex + + エラーチェック + t_lock_cpu(); + + E_OBJエラーのチェック + + runtsk->enatex = TRUE; + if (runtsk->texptn != 0) { + texptn = runtsk->texptn; + runtsk->enatex = FALSE; + runtsk->texptn = 0; + + t_unlock_cpu(); + (*runtsk->tinib->texrtn)(texptn, runtsk->tinib->exinf); + + /* CPUロック状態のままリターンした場合を対策 */ + if (!t_sense_lock()) { + t_lock_cpu(); + } + + タスク例外処理ルーチンの起動条件を再度チェック&起動 + (runtsk->texptn が 0 になるまで上の処理を繰り返す) + + runtsk->enatex = TRUE; + } + t_unlock_cpu(); + +(3) 非タスクコンテキスト専用のサービスコール + +※ CPUロック状態で呼ばれるとエラーになることに注意. + +(3-1) タスク切替えを起こさないもの + + i_lock_cpu(); + /* + * クリティカルセクション実行 + */ + i_unlock_cpu(); + +(3-2) タスク切替えを起こす可能性のあるもの(例: iact_tsk) + + i_lock_cpu(); + /* + * クリティカルセクション実行 + * + * タスクディスパッチが必要な場合には,reqflg を TRUE にする. + * ただし,enadsp が FALSE の時は,reqflg を TRUE にしない. + */ + i_unlock_cpu(); + +(3-3) iras_tex + + エラーチェック + tcb = get_tcb(tskid); + i_lock_cpu(); + + E_OBJエラーのチェック + + tcb->texptn |= rasptn; + if (tcb == runtsk && runtsk->enatex) { + reqflg = TRUE; + } + i_unlock_cpu(); + +以上 + + diff --git a/uzume_prototype/kernel/doc/gnu_install.txt b/uzume_prototype/kernel/doc/gnu_install.txt new file mode 100644 index 0000000..3b22640 --- /dev/null +++ b/uzume_prototype/kernel/doc/gnu_install.txt @@ -0,0 +1,376 @@ + + = GNU開発環境構築マニュアル = + + (Release 1.4対応,最終更新: 20-Dec-2003) + +------------------------------------------------------------------------ + TOPPERS/JSP Kernel + Toyohashi Open Platform for Embedded Real-Time Systems/ + Just Standard Profile Kernel + + Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + Toyohashi Univ. of Technology, JAPAN + + 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + によって公表されている GNU General Public License の Version 2 に記 + 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + 利用と呼ぶ)することを無償で許諾する. + (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + スコード中に含まれていること. + (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + の無保証規定を掲載すること. + (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + と. + (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + 作権表示,この利用条件および下記の無保証規定を掲載すること. + (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + 報告すること. + (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + + 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + + @(#) $Id: gnu_install.txt,v 1.1 2009/01/31 05:27:37 suikan Exp $ +------------------------------------------------------------------------ + + +1.GNU開発環境の構築 + + +1.1 開発環境の概要 + +カーネルをインストールするには,JSPカーネルの配布キットに含まれる以外 +に,以下のツールおよびライブラリが必要である. + + GNU開発環境 + BINUTILS(アセンブラ,リンカなど) + GCC-CORE(Cコンパイラ) + GDB(デバッガ) + NEWLIB(標準Cライブラリ) + perl(動作確認は 5.005) + GNU Make(動作確認は 3.77) + +各ツールのバージョンについては,ターゲット毎に異なるため,ターゲット毎 +のマニュアルを参照のこと. + +アプリケーションが標準Cライブラリを使用しない場合には NEWLIB は必要な +いが,GCC をインストールする際に NEWLIB があった方が都合がよいため, +NEWLIB も含めてインストールする方法を標準とする.NEWLIB をインストール +しない場合には,GCC のソースの修正が必要となり, GCC の 2.95.3 を対象 +として後述する.ターゲットへのダウンロードと実行を ROMモニタ(GDB に対 +応していないもの)によって行う場合には,GDB をインストールする必要はな +い. + +perl と GNU Make は,ほとんどの Linux と Cygwin では標準でインストール +されるため,新たにインストールする必要はない.インストールされている +perl または make のバージョンを知りたい場合には,-v オプションをつけて +実行すればよい(-v オプションをサポートしていない make は GNU make で +はない).なお,以下の説明では,makeコマンドが GNU Make であるものとす +る. + +また,これらの開発環境を Windows上に構築するためには Cygwin を用いる. + + Cygwin(動作確認は 1.5.5) + +Cygwinのインストールについては後述する.また,ツールのソースコードを修 +正する必要があるが,これも後述する. + +これらのツールおよびライブラリのソースコードは,次のサイトから入手する +ことができる. + + BINUTILS,GCC-CORE,GDB,GNU Make: + GNUプロジェクト http://www.gnu.org/ + Ring Server http://www.ring.gr.jp/ + + NEWLIB: + Red Hat http://sources.redhat.com/newlib/ + または ftp://sources.redhat.com/pub/newlib/ + + Cygwin: + Red Hat http://sources.redhat.com/cygwin/ + または ftp://sources.redhat.com/pub/cygwin/ + Ring Server http://www.ring.gr.jp/ + + +1.2 開発環境の構築方法 + +この節では,開発環境の構築方法を説明する.開発環境を Windows上に構築す +る場合には,あらかじめ Cygwin をインストールしておくことが必要である. +Cygwin のインストール時の注意事項は,1.3節で述べる. + +(1) 準備作業 + +ホスト上に必要なツールが足りない場合には,あらかじめインストールしてお +く.具体的には,perl と GNU Make が必要である.さらに,開発環境の構築 +に使うために,ホスト上にも最新の GCC をインストールしておくことが望ま +しい. + +なお,JSPカーネルの配布キットに含まれる perlスクリプトは,perl のプロ +グラムが /usr/bin/perl にあるものと仮定して記述している.perl のプログ +ラムのパスがこれと異なる場合は,各 perlスクリプトの先頭の perl の絶対 +パスを修正する必要がある. + +(2) ソースファイルの展開 + +BINUTILS,GCC-CORE,GDB,NEWLIB のソースファイルを展開する.以下では, +展開により作成されたディレクトリ名をそれぞれ次のように表記する. + + BINUTILS のソースを展開したディレクトリ + GCC-CORE のソースを展開したディレクトリ + GDB のソースを展開したディレクトリ + NEWLIB のソースを展開したディレクトリ + +(3) 開発環境構築のためのディレクトリの決定 + +開発環境を構築するために,以下のディレクトリを用意する. + + 開発環境をインストールするディレクトリ + BITUTILS のオブジェクトを生成するディレクトリ + GCC-CORE のオブジェクトを生成するディレクトリ + GDB のオブジェクトを生成するディレクトリ + NEWLIB のオブジェクトを生成するディレクトリ + +/bin が実行パスに含まれるようにシェルの設定を行っておく.また, +make install は, 以下に書き込み権限があるユーザで行う必要があ +る. + +(4) ターゲットの選択 + +ターゲットプロセッサに応じて,ターゲット環境を選択する.具体的には,次 +の通り. + + プロセッサ ターゲット環境() + M68040 m68k-unknown-elf + SH1, SH3 sh-hitachi-elf + V850 v850-nec-elf + H8 h8300-hms + ARM arm-elf + M32R m32r-elf + Microblaze mb + mips3 mipsel-nec-elf + Xstormy16 xstormy16-elf + +以下,ターゲット環境を表す文字列を と表記する. + +なお,ターゲットによっては,ツールまたはライブラリのソースコードの修正 +が必要な場合がある.修正内容については,ターゲット毎のマニュアルに記述 +する. + +(5) BINUTILS のインストール + +BINUTILS は,GCC-CORE のインストールに必要なため,GCC-CORE に先だって +インストールする.BINUTILS のインストール手順は次の通り. + + % mkdir + % cd + % /configure --target= --prefix=\ + --disable-nls + % make + % make install + +(6) GCC-CORE のインストール + +・NELIB をインストールする場合 +NEWLIB のインストールには GCC-CORE が必要なため,GCC-CORE のインストー +ルを先に行う.configure は,newlib のヘッダーファイルを 以下 +にインストールするため, 以下に書き込み権限のあるユーザーで行 +う必要がある.GCC-CORE のインストール手順は次の通り. + + % mkdir + % cd + % /configure \ + --target= --prefix= \ + --with-gnu-as --with-gnu-ld --with-newlib \ + --with-headers=/newlib/libc/include + % make + % make install + +・NEWLIB をインストールしない場合. +NEWLIB をインストールしない場合,ソースファイルの修正が必要となる.修 +正個所は, + /gcc/libgcc2.c の 41,42行目の + #include + #include + の二行をコメントアウトする. + + /gcc/frame.c の 42,43行目の + #include + #include + の二行をコメントアウトする. + +修正後の GCC-CORE のインストール手順は次の通り. + + % mkdir + % cd + % /configure \ + --target= --prefix= \ + --with-gnu-as --with-gnu-ld + % make + % make install + +(7) GDB のインストール + +次の手順に従って,GDB をインストールする. + + % mkdir + % cd + % /configure --target= --prefix= + % make + % make install + +(8) NEWLIB のインストール + +次の手順に従って,NEWLIB をインストールする. + + % mkdir + % cd + % /configure --target= --prefix= + % make + % make install + + + +2.ターゲットへのダウンロードと実行 + +ユーザズマニュアルの手順にしたがって,JSPカーネルおよびアプリケーショ +ンプログラムが構築できると,ターゲットシステムへダウンロードして実行す +る.ダウンロードと実行の方法には,ROMモニタを用いる方法と,gdb+スタブ +を用いる方法がある. + +(A) ROMモニタを用いる方法 + +ターゲットシステムが ROMモニタを持っている場合には,バイナリ形式または +モトローラ S形式のファイルを,ROMモニタのダウンロードコマンドを使って +ダウンロードし,実行コマンドを使ってダウンロードした番地から実行すれば +よい. + +(B) スタブを用いる方法 + +JSPカーネルと一緒に使えるように改造したスタブのソースコードは,JSPカー +ネルのウェブサイトからダウンロードすることができる.スタブをダウンロー +ドしたら,READMEファイルに従ってスタブを構築し,ROM またはフラッシュメ +モリに書き込む. + +gdb+スタブを用いてプログラムをダウンロード・実行する手順は次の通り. + + % -gdb jsp + GNU gdb 4.18 + Copyright 1998 Free Software Foundation, Inc. + .......... 以下メッセージが続く .......... + (gdb) + +gdb が起動したら,次のコマンドを実行して,ターゲットシステムと接続する. + + (gdb) set remotebaud + (gdb) target remote /dev/ttyXX + +,/dev/ttyXX には,それぞれ,ターゲットシステムを接続しているシリ +アルポートのボーレートと,デバイス名を指定する.次に,load コマンドに +より,プログラムをダウンロードする. + + (gdb) load + +プログラムの実行は,continue コマンドで行う. + + (gdb) continue + +ターゲットシステムによっては,プログラムの実行中にコントロール-C を入 +力する,または NMI をかけることで,プログラムを停止させて gdb に制御が +戻すことができる.ただし,割込み禁止状態では,コントロール-C で停止さ +せることはできない.詳しくは,スタブの READMEファイルまたはターゲット +毎のマニュアルを参照すること. + + + +3.Cygwinのインストール + +本インストールマニュアルは,cygwinの1.5.5バージョンを対象にしている. +また,以下のサイトではCygwinに関する情報やドキュメントがまとめられている. +http://www.sixnine.net/cygwin/cygwin-doc/ + +3.1必要なファイル +Cygwinのインストールに必要なファイルは次のサイトから入手することができる. + + Red Hat http://www.cygwin.com/ + または ftp://sources.redhat.com/pub/cygwin/ + Ring Server http://www.ring.gr.jp/ + +上記のサイトから最新版の setup.exe をダウンロードする. + +3.2インストール +setup.exe を実行すると, + +・インターネットからダウンロードする +・インターネットからインストールする +・ローカルディレクトリからインストールする + +該当するインストール手法にチェックし次に進む.何台かのマシンにインストー +ルするなら,1台目はインターネットからインストールイメージをダウンロー +ドし,後のマシンにはそれらのファイルをコピーしてローカルディレクトリか +らインストールすればよい. + +以下,インターネットからダウンロードする場合について説明する.ダウンロー +ドを選択すると必要ならば proxy の設定の後,ミラーサイトの一覧が示され +るので,近くのサイトを選択する. + +次に,パッケージ一覧が示されるため,必要なパッケージを選択する.特に回 +線等の問題がないかぎりすべてのパッケージをインストールするのが望ましい. + +ダウンロードが終了したらもう一度 setup.exe を実行して,ローカルディレ +クトリからのインストールを選択する.次にインストール元のディレクトリ +(上でダウンロードしたファイルが存在するディレクトリ,デフォルトで選択 +されているはず)を選択する.次にインストール先の選択に移るが,特に理由 +がない限りデフォルトの C:\Cygwin にインストールする.次にインストール +するパッケージを選択する.先ほどダウンロードされたファイルが表示され, +ディフォルトでは全てインストールされることになっているため,単に next +を押してインストールを開始する. + + +3.3.開発環境のインストール + +3.3.1 バイナリからのインストール + +特に最新版のコンパイラが必要でなければ,TOPPERS/JSP のホームページ +(http://www.toppers.jp/)から SH 用の BINUTILS,GCC-CORE,GDB のバイナ +リ(gnu_cygwin_sh.tar.gz)をc:\Cygwin\usr\localにダウンロードして以下 +の手順で展開する.なお,このファイルにはNEWLIBは含まれていないが, +GDB-Stub,TOPPERS/JSP の sample1 のコンパイルには支障はない.ユーザー +アプリケーションを作成するさい,必要なら別途ソースからコンパイル,イン +ストールする.バイナリ(gnu_cygwin_sh.tar.gz)は,Cygwin の /usr/local +で展開する. + + $ cd /usr/local + $ tar xvfz gnu_cygwin_sh.tar.gz + +これで/usr/local/sh以下に開発ツールがインストールされる.次に +/usr/local/sh/bin にパスを通す.具体的にはホーム(cygwin実行時のカレン +トディレクトリ)にbashの設定ファイル".bashrc"を作成して次の一行を追加す +る. + +export PATH=/usr/local/sh/bin:${PATH} + +後は,JSPの各ターゲットのMakefile先頭にある"CYGWIN = ture"の部分のコメ +ントアウトを外せばCygwin上でJSPのコンパイルが可能である. + + +3.4.gdbによるデバッグ +GDBのコマンドラインからCOM1経由でターゲットに接続する場合は, + +(gdb)target remote /dev/ttyS0 + +COM2経由の場合は + +(gdb)target remote /dev/ttyS1 + +とする. + + +以上 diff --git a/uzume_prototype/kernel/doc/m68k.txt b/uzume_prototype/kernel/doc/m68k.txt new file mode 100644 index 0000000..bd2c9f4 --- /dev/null +++ b/uzume_prototype/kernel/doc/m68k.txt @@ -0,0 +1,356 @@ + + = TOPPERS/JSPカーネル ユーザズマニュアル = + (M68040 ターゲット依存部) + + (Release 1.4.1対応,最終更新: 6-Oct-2004) + +------------------------------------------------------------------------ + TOPPERS/JSP Kernel + Toyohashi Open Platform for Embedded Real-Time Systems/ + Just Standard Profile Kernel + + Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + Toyohashi Univ. of Technology, JAPAN + + 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + によって公表されている GNU General Public License の Version 2 に記 + 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + 利用と呼ぶ)することを無償で許諾する. + (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + スコード中に含まれていること. + (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + の無保証規定を掲載すること. + (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + と. + (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + 作権表示,この利用条件および下記の無保証規定を掲載すること. + (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + 報告すること. + (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + + 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + + @(#) $Id: m68k.txt,v 1.1 2009/01/31 05:27:37 suikan Exp $ +------------------------------------------------------------------------ + + +1.M68040 ターゲット依存部の概要 + +1.1 ターゲットシステム + +M68040プロセッサのターゲットシステムとしては,(æ ª)電産製の DVE-68K/40 +CPUボード(CPU: MC68LC040)のみをサポートしている. + +1.2 開発環境と実行環境 + +開発環境には,GCCなどのGNU開発環境を用い,オブジェクトファイルフォーマッ +トはELFを標準とする. + +実行環境として,ROMモニタを用いる方法とGDBスタブを用いる方法をサポート +している.GDBスタブを用いる場合には,Makefile中で,DBGENVにGDB_STUBを +定義する(デフォルト).ROMモニタを用いる場合には,DBGENVを定義しない. + +1.3 サポートする機能の概要 + +M68040依存の機能として,割込みマスクの変更・参照(chg_ixx,get_ixx)を +サポートしている.また,DVE-68K/40 CPUボード依存の機能として,性能評価 +用システム時刻参照機能(vxget_tim)をサポートしている.割込みの禁止と +許可(dis_int,ena_int)はサポートしていない. + +1.4 他のターゲットへのポーティング + +現バージョンでは,FPUを持たないMC68LC040のみをサポートしている.FPUを +用いない場合には,FPU内蔵のM68040にも適用可能なはずである.FPUを活用し +たい場合には,ディスパッチャでFPUレジスタを保存/復帰する必要があるな +ど,若干の改造が必要である. + +他のM68K系列のプロセッサへのポーティングについては,マスタスタックと別 +に割込みスタックを持つM68020以降のプロセッサへは比較的容易にポーティン +グ可能と思われるが,それより前のプロセッサへのポーティングはやや面倒で +あろう. + + +2.M68040プロセッサ依存部の機能 + +この節では,カーネルおよびシステムサービスの機能の中で,M68040依存の部 +分について解説する. + +2.1 データ型 + +signed int型,unsigned int型,size_t型のサイズは,いずれも32ビットであ +る. + +2.2 割込み管理機能と割込みハンドラ + +カーネル管理外の割込みはNMIのみである.よって,CPUロック状態や初期化ルー +チン内では,NMI以外の割込みはすべて禁止されている.具体的には,IPM +(Interrupt Priority Mask)が7に設定される. + +DEF_INHで指定する割込みハンドラ番号(inhno)は,M68040での例外ベクタ番 +号を表し,そのデータ型(INHNO)はunsigned int型に定義されている. +DEF_INHで,例外ベクタ番号として有効でない値や,外部割込みに対応しない +番号を指定した場合の動作は保証されない. + +M68040依存の機能として,SR(Status Register)中のIPM(Interrupt +Priority Mask)の値を変更するためのサービスコールchg_ipmと,参照するた +めのサービスコールget_ipmをサポートしている.なお,IPMの値を表すデータ +型IPMは,unsigned int型に定義されている. + +これらのサービスコールは,タスクコンテキストでCPUロック解除状態の場合 +にのみ呼び出すことができる.chg_ipmによりIPMを0以外(すなわち,何らか +の割込みが禁止されている状態)にした場合でも,ディスパッチは禁止されず, +chg_ipmにより変更したIPMの値は,ディスパッチ後のタスクに引き継がれる. +例えば,あるタスクでIPMを1に変更した後,何らかの割込みにより別のタスク +に切り替わると,切り替わった後のタスクでもIPMは1になる.ただし,IPMを0 +以外に設定していても,実行できるタスクがなくなった場合にはIPMは一時的 +に0になる.これは,M68040の命令セットからくる制限事項である(解決手段 +がないわけではない). + +chg_ipmをサポートするために,割込みハンドラの出入口処理などにオーバヘッ +ドを生じている.そこで,SUPPORT_CHG_IPMというマクロにより,これらのサー +ビスコールをサポートするかどうかを切り替えられるようにしている. +SUPPORT_CHG_IPMは,cpu_config.hの中でマクロ定義されている. + +M68040依存の割込みマスクの変更・参照のためのサービスコールの仕様は次の +通り. + +(1) chg_ipm 割込みマスクの変更 + +【C言語API】 + ER ercd = chg_ipm(IPM ipm); + +【パラメータ】 + IPM ipm 設定すべき IPM の値 + +【リターンパラメータ】 + ER ercd エラーコード + +【エラーコード】 + E_CTX コンテキストエラー + E_PAR パラメータエラー(ipm が不正) + +【機能】 + +IPM(Interrupt Priority Mask)を ipm で指定された値に設定する.指定し +た値が 0〜6 以外の場合,E_PARエラーとなる.IPM を 1〜6 に設定した場合 +でも,ディスパッチは禁止されない.また,設定した IPM の値は,ディスパッ +チ後も引き継がれる.ディスパッチを禁止したい場合には,dis_dsp と併用す +ればよい. + +なお,このサービスコールを用いて,IPM を 7 (すべての割込みを禁止)に +設定することはできない.IPM を 7 にしたい場合には,loc_cpu を使うべき +である. + +このサービスコールは,タスクコンテキストで CPUロック解除状態の時のみ呼 +び出すことができる.非タスクコンテキストや CPUロック状態で呼び出した場 +合には,E_CTXエラーとなる. + +(2) get_ipm 割込みマスクの参照 + +【C言語API】 + ER ercd = get_ipm(IPM *p_ipm); + +【パラメータ】 + なし + +【リターンパラメータ】 + ER ercd エラーコード + IPM ipm 現在の IPM の値 + +【エラーコード】 + E_CTX コンテキストエラー + +【機能】 + +現在の IPM(Interrupt Priority Mask)の値を読み出し,ipm に返す. + +このサービスコールは,タスクコンテキストで CPUロック解除状態の時のみ呼 +び出すことができる.非タスクコンテキストや CPUロック状態で呼び出した場 +合には,E_CTXエラーとなる. + +2.3 CPU例外管理機能とCPU例外ハンドラ + +DEF_EXC で指定する割込みハンドラ番号(excno)は,M68040 での例外ベクタ +番号を表し,そのデータ型(EXCNO)は unsigned int型に定義されている. +DEF_EXC で,例外ベクタ番号として有効でない値や,CPU例外に対応しない番 +号を指定した場合の動作は保証されない. + +2.4 スタートアップモジュール + +M68040依存のスタートアップモジュール(start.S)では,次の初期化処理を +行う. + +(A) プロセッサモードの初期化とスタックポインタの初期化 + +最初に,すべてのキャッシュを無効化した後,コードキャッシュとデータキャッ +シュを共に有効にする.また,プロセッサのモードを,スーパバイザモード・ +割込みモードに設定し,NMI 以外のすべての割込みを禁止する.スタートアッ +プモジュールは,スーパバイザモードで起動しなければならないので,ここで +スーパバイザモードに設定するのは,本当はムダである. + +次に,割込みスタックポインタ(SPI)を STACKTOP に設定する.ここで割込 +みスタックポインタに設定されたスタック領域は,カーネル起動後は非タスク +コンテキスト用のスタック領域として使われる.STACKTOP は,sys_config.h +部で定義することを想定している.また,フレームポインタを 0 に初期化す +る. + +(B) hardware_init_hook の呼出し + +hardware_init_hook が 0 でない場合には,hardware_init_hook を呼び出す. +hardware_init_hook は,カーネルが起動される前に行う必要があるターゲッ +ト依存の初期化を行うために用意している.hardware_init_hook がどこでも +定義されていない場合,リンカでこのシンボルを 0 に定義する(リンカスク +リプト内に記述あり). + +(C) bssセクションと dataセクションの初期化 + +bssセクションをゼロクリアする.また,dataセクションを初期化する. + +(D) software_init_hook の呼出し + +software_init_hook が 0 でない場合には,software_init_hook を呼び出す. +software_init_hook は,カーネルが起動される前に行う必要があるソフトウェ +ア環境(具体的には,ライブラリ)依存の初期化を行うために用意している. +software_init_hook がどこでも定義されていない場合,リンカでこのシンボ +ルを 0 に定義する(リンカスクリプト内に記述あり). + +(E) カーネルの起動 + +kernel_start へ分岐し,カーネルを起動する.kernel_start からリターンし +てくることは想定していない. + + +3.DVE-68K/40 システム依存部の機能 + +3.1 システムクロックドライバ + +システムクロックドライバがisig_timを呼び出す周期は,sys_defs.h中の +TIC_NUMEとTIC_DENOで定義されている(標準は 1ミリ秒周期).この定義を変 +更することで,isig_timを呼び出す周期を変更することができる.ただし,タ +イマの精度が1μ秒であるため,1μ秒単位で端数になる値を設定した場合には, +isig_timの呼出し周期に誤差が生じることになる. + +3.2 性能評価用システム時刻参照機能 + +DVE-68K/40依存部では,性能評価用システム時刻参照機能(vxget_tim)をサ +ポートしている.性能評価用システム時刻の精度は1μ秒単位であるが,タイ +マの現在値を読み出すために一時的にタイマを停止させる必要があるため, +vxget_timを呼ぶ度にシステムクロックが少しづつ遅れることになる.なお, +SYSUTIM型はUD型(64ビットの符号無し整数型)に定義している. + +3.3 シリアルインタフェースドライバ + +DVE-68K/40依存部のシリアルインタフェースドライバは,DVE-68K/40 CPUボー +ドの2つのシリアルインタフェースをサポートしている.ポートID=1がポートB, +ポートID=2がポートAに対応している.ポートの割当てを逆にしているのは, +GDBスタブまたはROMモニタがポートAを使用するためである. + +3.4 メモリマップ + +DVE-68K/40依存部では,CPUボード上のメモリが4MBの場合を想定し,コード領 +域を0x10000〜0xfffffの約1MB,データ領域を0x100000〜の約3MB,非タスクコ +ンテキスト用のスタック領域を〜0x3fffffに確保している.0〜0xffffの64KB +は,ROMモニタまたはGDBスタブのワークエリアとなっており,使用することが +できない. + + +4.開発環境の構築 + +開発環境の構築方法については,GNU開発環境構築マニュアルを参照すること. + +4.1 開発環境のバージョン + +動作確認したツールのバージョンは以下の通りである. + + BINUTILS : 2.13.2.1 + GCC-CORE : 2.95.3 + GDB : 5.3 + NEWLIB : 1.9.0 + +GCC 2.95.3では,アプリケーションが標準Cライブラリを使用しないなら, +NEWLIBは必要ない. + +GCC 3.3を用いる場合,コンパイラが標準Cライブラリ関数を呼び出すコードを +生成するため,NEWLIBが必要になる.NEWLIBの標準Cライブラリをリンクする +ために,Makefile中のLIBSの定義に以下のように -lc を追加する必要がある. + + LIBS := $(LIBS) $(CXXLIBS) -lc -lgcc + + +5.その他 + +5.1 ディレクトリ・ファイル構成 + +M68040ターゲット依存部の各ファイルの概要は次の通り. + + config/m68k/ + Makefile.config MakefileのM68040依存定義 + cpu_defs.h プロセッサ依存部のアプリケーション用定義 + cpu_config.h プロセッサ依存部の構成定義 + cpu_config.c プロセッサ依存部の関数 + cpu_support.S プロセッサ依存部のサブルーチン + cpu_context.h コンテキスト操作 + cpu_rename.def カーネルの内部識別名のリネーム定義 + cpu_rename.h カーネルの内部識別名のリネーム + cpu_unrename.h カーネルの内部識別名のリネーム解除 + tool_defs.h 開発環境依存部のアプリケーション用定義(GNU開発環境用) + tool_config.h 開発環境依存部の構成定義(GNU開発環境用) + makeoffset.c offset.h生成サポートプログラム + cpu_insn.h 低レベルのプロセッサ操作ルーチン + start.S スタートアップモジュール + m68kelf.ld リンカスクリプト + + config/m68k/dve68k/ + Makefile.config MakefileのDVE-68K/40依存定義 + sys_defs.h システム依存部のアプリケーション用定義 + sys_config.h システム依存部の構成定義 + sys_config.c システム依存部の関数 + sys_support.S システム依存部のサブルーチン + sys_rename.def カーネルの内部識別名のリネーム定義 + sys_rename.h カーネルの内部識別名のリネーム + sys_unrename.h カーネルの内部識別名のリネーム解除 + hw_timer.h タイマ操作ルーチン + hw_serial.h SIOドライバ + hw_serial.cfg SIOドライバのコンフィギュレーションファイル + dve68k.h DVE-68K/40 CPUボードのハードウェア資源の定義 + dve68k_dga.h DGAのアクセスユーティリティ + + pdic/simple_sio/ + upd72001.h μPD72001用 簡易SIOドライバ関連の定義 + upd72001.c μPD72001用 簡易SIOドライバ + +5.2 ターゲットへのダウンロードと実行 + +ターゲットへのダウンロードと実行手順については,GNU開発環境構築マニュ +アルに説明されているが,以下では,M68040およびDVE-68K/40 CPUボードの場 +合に特有の事項について説明する. + +(A) ROMモニタを用いる方法 + +DVE-68K/40 CPUボードの場合,別売りのROMモニタとそれに対応した端末ソフ +トを用いると,Rコマンドでバイナリ形式のファイルをダウンロードすること +ができる. + + #R 10000 + \up jsp.bin + +プログラムの実行は,gコマンドで行う. + + #g 10000 + +(B) GDBスタブを用いる方法 + +M68040では,プログラムを実行中にNMIをかける(DVE-68K/40 CPUボードでは, +ABORTスイッチを押す)ことで,プログラムを停止させて,gdbに制御を戻すこ +とができる. + +以上 diff --git a/uzume_prototype/kernel/doc/user.txt b/uzume_prototype/kernel/doc/user.txt new file mode 100644 index 0000000..a2778b1 --- /dev/null +++ b/uzume_prototype/kernel/doc/user.txt @@ -0,0 +1,2771 @@ + + = TOPPERS/JSPカーネル ユーザズマニュアル = + + (Release 1.4.3対応,最終更新: 23-Apr-2007) + +※ このユーザズマニュアルは,μITRON4.0仕様書(Ver. 4.02.00)の内容を +前提に記述してあります.μITRON4.0仕様書は,以下のURLからダウンロード +することができます. + http://www.ertl.jp/ITRON/SPEC/mitron4-j.html + +---------------------------------------------------------------------- + TOPPERS/JSP Kernel + Toyohashi Open Platform for Embedded Real-Time Systems/ + Just Standard Profile Kernel + + Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + Toyohashi Univ. of Technology, JAPAN + Copyright (C) 2004-2007 by Embedded and Real-Time Systems Laboratory + Graduate School of Information Science, Nagoya Univ., JAPAN + + 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + によって公表されている GNU General Public License の Version 2 に記 + 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + 利用と呼ぶ)することを無償で許諾する. + (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + スコード中に含まれていること. + (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + の無保証規定を掲載すること. + (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + と. + (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + 作権表示,この利用条件および下記の無保証規定を掲載すること. + (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + 報告すること. + (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + + 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + + @(#) $Id: user.txt,v 1.1 2009/01/31 05:27:37 suikan Exp $ +---------------------------------------------------------------------- + * μITRON4.0仕様は,トロン協会が中心となって策定されたオープンなリア + ルタイムカーネル仕様です.μITRON4.0仕様の仕様書は,トロン協会のホー + ムページ(http://www.assoc.tron.org/)から入手することができます. +---------------------------------------------------------------------- + * TRON は "The Real-time Operating system Nucleus" の略称です. + * ITRON は "Industrial TRON" の略称です. + * μITRON は "Micro Industrial TRON" の略称です. + * TRON,ITRON,およびμITRONは,特定の商品ないしは商品群を指す名称で + はありません. + * TOPPERS は "Toyohashi OPen Platform for Embedded Real-time Systems" + の略称,JSP は "Just Standard Profile" の略称です. + * 本マニュアル中の商品名は,各社の商標または登録商標です. +---------------------------------------------------------------------- + + +1.TOPPERS/JSPカーネルの概要 + +TOPPERS/JSPカーネル(以下,単にJSPカーネルと書く)は,TOPPERSプロジェ +クトにおいて開発したμITRON4.0仕様に準拠したリアルタイムカーネルである. +JSP(Just Standard Profile)の名前が示す通り,μITRON4.0仕様のスタンダ +ードプロファイル規定に従って実装されている. + +1.1 ターゲットプロセッサ/ターゲットシステム + +JSPカーネルは,現時点で,以下のターゲットプロセッサ/ターゲットシステ +ムをサポートしている. + + ディレクトリ名 開発環境 + プロセッサ(型番) システム(メーカ名) + + m68k GNU開発環境 + M68040(MC68LC040) DVE-68K/40(電産) + + sh1 GNU開発環境 + SH1(SH7032) KZ-SH1-01(京都マイクロコンピュータ) + ※ RISC評価キットSH-1(CQ出版)でも動作 + SH1(SH7034) μITRON搭載SH1CPUボード((æ ª)中央製作所) + + + sh2 GNU開発環境 + SH2(SH7145) AP_SH2F_6A(アルファプロジェクト) + SH2(SH7615) HSB7615IT (北斗電子) + + sh3 GNU開発環境 + SH3(SH7709A) MS7709ASE01 (日立超LSIシステムズ) + SH3(SH7729R) MS7729RSE01 (日立超LSIシステムズ) + SH3(SH7727) MS7727CP01 (日立超LSIシステムズ) + SH4(SH7750) MS7750SE01 (日立超LSIシステムズ) + + sh3-ghs GHS開発環境 + SH3(SH7709A) MS7709ASE01 (日立超LSIシステムズ) + SH3(SH7727) MS7727CP01 (日立超LSIシステムズ) + + h8 GNU開発環境 + H8(H8/3052F) AKI-H8/3052F(秋月電子通商) + H8(H8/3069F) AKI-H8/3069F(秋月電子通商) + + h8-renesas Renesas社の開発環境 + H8(HSB8F3048BF25) H8/3048F-ONEスタータキット((æ ª)北斗電子) + + h8s-renesas Renesas社の開発環境 + H8S(H8S/2339F) MiNET-H8S/2339F(株式会社ミスポ製) + + armv4 GNU開発環境 + ARM9(ARM922T) Integrator/AP+CM922T(ARM) + ARM9(ARM926EJ-S) AZ9360MB(YDK) + + armv4-ghs GHS開発環境 + ARM9 (ARM920T) Integrator/AP+CM920T(ARM) + ARM9E(ARM966E-S) Integrator/AP+CM966E-S(ARM) + + m32r GNU開発環境 + M32R(M32102S6FP) M3A-2131G50(三菱電機) + M32R(M32102S6FP) M3A-ZA36 (三菱電機) + + m32c-renesas Renesas社の開発環境 + M32C OAKS32(オークス電子) + + microblaze GNU開発環境 + MicroBlaze MIREF(YDK) + MicroBlaze MIRE_MULTI3000(YDK) + MicroBlaze MultiMedia Board(Xilinx) + MicroBlaze Suzaku(アットマークテクノ) + + tms320c54x TI社の開発環境 + TMS320C54x(TSM320C5402)TMS320VC5402 DSK(TI) + + xstormy16 GNU開発環境 + Xstormy16 三洋マイコン開発ツール(三洋電機) + + m16c-renesas Renesas社の開発環境 + M16C(M30620FCAFP-CPU) OASKS16(オークス電子) + M16C(M30262F8FG-CPU) OAKS16-MINI(オークス電子) + + s1c33 GNU開発環境 + SC33 DMT33209(EPSON) + SC33 LUXUN2(EPSON) + + s1c33-gnu33 GNU33開発環境 + SC33 DMT33209(EPSON) + SC33 LUXUN2(EPSON) + + nios2 GNU開発環境 + Nios2 NiosII Development Board(アルテラ) + + v850 GNU開発環境 + V850 TK-850/KJ1+ (Application Corp.) + V850 TK-850/SG2 (Application Corp.) + + tlcs900 東芝セミコンダクタ社製の開発環境 + TMP91CY22-CPU Zup-F16拡張ボード(タマデン工業株式会社) + +また,以下のターゲットは,以前のバージョン(1.4.1)のコードからアップデ +ートされておらず,動作確認を行っていないため,1.4.2以降では,参考実装 +扱いとする. + + h8 GNU開発環境 + H8(H8/3048F) AKI-H8/3048F(秋月電子通商) + H8 (H8/3069F) NKEV-010H8 (品川通信計装サービス) + + h8s GNU開発環境 + H8S(2350) H8S/2350 評価ボード(ミスポ) + + powerpc32 GNU開発環境 + PowerPC32(MPC860T) TB6102S(タンバック) + + mips3 GNU開発環境 + MIPS3(VR4131) KZ-Vr4131PCI-01(京都マイクロコンピュータ) + MIPS3(VR5500) RTE-VR5500-CB(64)(マイダス・ラボ) + + +JSPカーネルは,カーネルのできる限り多くの部分をC言語で記述する,ターゲッ +ト非依存部と依存部を明確に分離するなど,他のターゲットプロセッサへのポ +ーティングが容易な構造になっている.ただし,ポーティングにどの程度の手 +間がかかるかは,ターゲットプロセッサのアーキテクチャやシステムの構成な +どに依存する. + +このユーザズマニュアルでは,ターゲット(ターゲットプロセッサおよびター +ゲットシステム)に依存しない機能についてのみ説明している.ターゲットに +依存する機能については,ターゲット毎のマニュアルを参照すること. + +1.2 開発環境 + +JSPカーネルは,GCCなどのGNU開発環境を標準のソフトウェア開発環境として +いるが,他の種類の開発環境も利用できるように考慮している.利用できる開 +発環境については,ターゲット毎または開発環境毎のマニュアルで説明する. + +ターゲット非依存部は,大部分は標準的なC言語によって記述されているが, +性能と可読性を両立させるために,一部でインライン関数を用いている.イン +ライン関数の機能を持たない開発環境の場合でも,改造なしに対応可能ではあ +るが,非効率/無駄なコードが生成されるおそれがある. + +カーネル本体は,外部のライブラリ関数に依存しないように記述している.た +だし,コンパイラが標準Cライブラリ関数を呼び出すコードを生成する場合が +あり,その場合には標準Cライブラリが必要である.また,システムサービス +やサポートライブラリ,アプリケーションプログラムで標準Cライブラリが必 +要になる場合も考えられる.実際,標準配布キットに含まれる中で,システム +ログ機能を呼び出すためのライブラリ関数内で,可変数引数を処理するための +機能(stdarg.h, va_list, va_start, va_arg)を用いている(実際には,GNU +開発環境では,可変数引数を処理するための機能はGCC本体でサポートしてい +るため,標準Cライブラリは必要ない).これらの理由により,標準Cライブラ +リを用いる構成もとれるようにしている. + +1.3 シミュレーション環境 + +JSPカーネルのシミュレーション環境として,Linux上で動作する環境と +Windows上で動作する環境を用意している.これらのシミュレーション環境は, +LinuxおよびWindowsの一つのプロセスの中で複数のタスクを切り替えて動作さ +せるもので,スレッドライブラリとして使うこともできる. + +これらのシミュレーション環境についての詳細は,シミュレーション環境毎の +マニュアルを参照すること. + +1.4 カーネルがサポートする機能 + +JSPカーネルは,名前が示す通り,μITRON4.0仕様のスタンダードプロファイ +ルに含まれる機能をすべてサポートしている.スタンダードプロファイルでは, +割込みハンドラと割込みサービスルーチンのいずれかをサポートすればよいが, +JSPカーネルは,現状では割込みハンドラのみをサポートしている. + +スタンダードプロファイルに含まれない機能として,ターゲット依存に以下の +割込み管理機能およびサービスコールをサポートする場合がある.これらの機 +能の具体的な内容については,ターゲット毎に異なる.詳しくは,ターゲット +毎のマニュアルを参照すること. + + dis_int 割込みの禁止 + ena_int 割込みの許可 + chg_ixx 割込みマスクの変更 + get_ixx 割込みマスクの参照 + ※ xx はターゲット毎に定められる. + +また,μITRON4.0仕様に定義されている以外に,以下の独自の拡張機能および +サービスコールをサポートしている. + +(1) CPU例外発生時のシステム状態の参照 + +スタンダードプロファイルでは,CPU例外ハンドラ内で,CPU例外が発生したコ +ンテキストや状態を参照できることが必要であるが,そのためのAPIは定めて +いない.JSPカーネルでは,CPU例外が発生した処理でsns_yyyを呼び出した場 +合の結果を,CPU例外ハンドラ内で取り出せるようにするために,以下の五つ +のサービスコールを独自にサポートしている. + + vxsns_ctx CPU例外発生時のコンテキストの参照 + vxsns_loc CPU例外発生時のCPUロック状態の参照 + vxsns_dsp CPU例外発生時のディスパッチ禁止状態の参照 + vxsns_dpn CPU例外発生時のディスパッチ保留状態の参照 + vxsns_tex CPU例外発生時のタスク例外処理禁止状態の参照 + +(2) 性能評価用システム時刻参照機能 + +性能評価用システム時刻参照機能とは,JSPカーネル上で動作するタスクやJSP +カーネル自身の性能を計測するための,システム時刻をμ秒単位で読み出す機 +能である.この機能のために追加したサービスコールは次の通りである. + + vxget_tim 性能評価用システム時刻の参照 + +性能評価用システム時刻参照機能をサポートするかどうかは,ターゲット依存 +部の定義ファイルで指定することができる.また,ターゲットシステムの制限 +により,この機能をサポートできない場合もある. + +(3) 終了処理ルーチン機能 + +JSPカーネルでは,システムの終了時に呼び出される終了処理ルーチンを登録 +するための機能をサポートしている.この機能のために追加した静的APIは次 +の通りである. + + VATT_TER 終了処理ルーチンの追加(静的API) + +終了処理ルーチンについては,「2.12 システム終了手順と終了処理ルーチン」 +を参照のこと. + +(4) カーネル動作状態の参照 + +カーネル上で動作するタスクから呼び出される関数が,カーネルの初期化完了 +前や終了処理開始後にも呼び出される可能性がある場合には,その中でカーネ +ルのサービスコールを呼び出せるかを判別することが必要となる.JSPカーネ +ルでは,この判別を可能にするために,次のサービスコールを追加している. + + vsns_ini カーネル動作状態の参照 + +1.5 既知の問題点 + +現バージョンでは,静的APIの処理中のエラーの検出機能の中で,ターゲット +依存のエラーの検出が不十分である.例えば,割込みハンドラ番号が不正な値 +である場合,カーネルとコンフィギュレータのいずれもエラーを検出せず,カー +ネルが正しく動作しない結果となる. + +kernel_cfg.cは,カーネル,システムサービス,アプリケーションのいずれの +インクルードファイルもインクルードし,いずれのシンボルも参照する可能性 +がある.そのため,カーネル,システムサービス,アプリケーションでシンボ +ル等が衝突している場合や,コンパイルオプションが食い違っている場合に, +kernel_cfg.cが正しくコンパイルできなくなる場合が考えられる.カーネルの +シンボルをリネームするなどの方法でかなり軽減されてはいるが,問題がなく +なっているわけではない. + +シリアルインタフェースドライバで,シリアルポートをクローズした後にオー +プンしなおした場合に,正しく動作しない.これは,シリアルインタフェース +ドライバが使用しているセマフォが初期化されないためである. + +1.6 注意事項 + +CRE_DTQのパラメータdtqcntは,μITRON4.0仕様のVer. 4.01.00では一般定数 +式パラメータと規定されているが,JSPカーネルではVer. 4.02.00に準拠して, +プリプロセッサ定数式パラメータと扱っている. + + +2.JSPカーネルの機能 + +この節では,μITRON4.0仕様で実装定義となっている事項を中心に,JSPカー +ネルの機能について解説する. + +2.1 実装方針とモデル + +μITRON4.0仕様のスタンダードプロファイルは,システム全体を一つのモジュー +ルにリンクすることを想定して規定されている.また,サービスコールの呼出 +しは,単なるサブルーチンコールによって行うことが想定されている.JSPカー +ネルは,この想定に従い,アプリケーションとカーネルを一つのモジュールに +リンクし,サブルーチンコールによってサービスコールを呼び出す方法のみを +サポートしている. + +JSPカーネル上で動作するアプリケーションは,すべてC言語で記述することを +原則としている.そのため,タスクや割込みハンドラなどの処理単位をアセン +ブリ言語で記述する方法は,特別には用意していない(もちろん,インタフェー +スさえC言語の関数にあわせれば,記述にアセンブリ言語を使うことは問題な +い). + +JSPカーネルでは,サービスコールの大部分を一つの割込み禁止区間として実 +装しているため,サービスコールの不可分性は厳密に保証される.逆に欠点と +しては,最大割込み禁止時間(最大割込み応答時間も同様)が,待ちキューに +つながれるタスクの最大数やタイムイベントの最大数に依存することになるが, +スタンダードプロファイルの機能セットの範囲内では,この方法でもそれほど +問題にならないと思われる. + +2.2 データ型 + +JSPカーネルでは,以下にリストアップするデータ型を,signed int型, +unsigned int型,またはsize_t型に定義している.これらの型のサイズは, +JSPカーネルがポーティングされているターゲットプロセッサ/コンパイラの +多くにおいて 32ビットであるため,そうでない場合にのみターゲット毎のマ +ニュアルに明示する.すなわち,ターゲット毎のマニュアルに明示されていな +い限り,以下にリストアップするデータ型のサイズは 32ビットである. + + signed int型に定義しているデータ型 + + INT 符号付き整数 + BOOL 真偽値 + FN 機能コード + ER エラーコード + ID ID番号 + PRI 優先度 + TMO タイムアウト値 + ER_BOOL ER または BOOL + ER_ID ER または ID + ER_UINT ER または UINT + + unsigned int型に定義しているデータ型 + + UINT 符号無し整数 + ATR 属性 + STAT 状態 + MODE 動作モード + RELTIM 相対時間 + TEXPTN タスク例外要因のビットパターン + FLGPTN イベントフラグのビットパターン + + size_t型に定義しているデータ型 + SIZE サイズ + +ただし,RELTIM型の有効ビット数は31ビットを越えることはない.すなわち, +unsigned int型のサイズが32ビットの場合には,RELTIM型の有効ビット数は +31ビットであり,(2^31 - 1)を越える値を RELTIM型のパラメータに渡した場 +合,E_PARエラーとなる.unsigned int型のサイズが16ビットの場合には, +RELTIM型の有効ビット数も16ビットである.スタンダードプロファイルでは, +RELTIM型は16ビット以上と規定しており,この仕様でスタンダードプロファイ +ル規定に準拠している. + +SYSTIM型は,32ビットの符号無し整数型に定義しており,構造体として定義す +る方法は用いていない. + +時間をあらわすデータ型(TMO,RELTIM,SYSTIM)の時間単位は,スタンダー +ドプロファイルの規定に従い,すべて1ミリ秒としている. + +2.3 オブジェクトのID番号と優先度 + +オブジェクトのID番号には,1から連続した正の値を用いる.オブジェクトの +ID番号に抜けがある場合(例えば,ID=1とID=3のオブジェクトが登録され, +ID=2のオブジェクトが登録されない場合)には,コンフィギュレータがエラー +を報告する.負のID番号を用いたシステムオブジェクトとユーザオブジェクト +の区別はサポートしていない. + +生成できるオブジェクトの最大数は,カーネルのコード上は,ID番号がID型 +(signed int型に定義している)で表現できる範囲内であるが,実際にはメモ +リ容量によって制限される.なお,JSPカーネルでは,オブジェクトを生成す +るためのサービスコールはサポートしていない. + +タスクとメッセージの優先度には,1〜16の正の値を用いる. + +2.4 エラーチェックとエラーコード + +JSPカーネルでは,以下に示すメインエラーコードを返すエラーの検出を省略 +している. + + E_SYS システムエラー + E_MACV メモリアクセス違反 + +また,ポインタの値が不正な場合のパラメータエラー(E_PAR)の検出も省略 +している.メモリアクセス違反(E_MACV)の検出も省略しているため,引数に +ポインタを渡すサービスコールに対して,存在しないメモリ番地を差すポイン +タなど,不正なアクセスを引き起こすポインタを渡した場合,プロセッサがバ +スエラーなどのCPU例外を起こす場合がある(具体的な動作はターゲットプロ +セッサに依存). + +μITRON4.0仕様書に定義されているメインエラーコードの中で,スタンダード +プロファイルの機能では発生しないものや,JSPカーネルの実装上発生しない +ものがある.JSPカーネルでサービスコールが返すメインエラーコードについ +ては,「9.3 メインエラーコード一覧」を参照のこと. + +JSPカーネルでは,サブエラーコードは用いていない.サブエラーコードには +常に-1が返る. + +2.5 割込みハンドラ + +JSPカーネルでは,割込みハンドラの機能とそれを定義する静的API(DEF_INH) +をサポートしており,割込みサービスルーチンの機能とそれを追加する静的 +API(ATT_ISR)はサポートしていない. + +割込みハンドラのC言語による記述形式は次の通りとする. + + void interrupt_handler(void) + { + 割込みハンドラ本体 + } + +JSPカーネルでは,C言語で記述された割込みハンドラが呼ばれる時点で,CPU +ロック解除状態になっている.また,割込みハンドラからリターンするには, +C言語の関数から単にリターンすればよい. + +割込みハンドラをアセンブリ言語で記述する方法は,サポートしていない. + +NMI(マスクできない割込み)以外にカーネルの管理外の割込みがあるかどう +かは,ターゲット依存である.具体的な仕様については,ターゲット毎のマニュ +アルを参照すること. + +2.6 タイムイベントハンドラ + +JSPカーネルでは,タイムイベントハンドラとして,周期ハンドラのみをサポー +トしている.周期ハンドラは,isig_timサービスコールの中から,サブルーチ +ンコールで呼び出される.そのため,周期ハンドラの優先順位は,isig_timを +呼び出した割込みハンドラよりも一つだけ高い(厳密に言うと,isig_timを呼 +び出した割込みハンドラよりも高く,その割込みハンドラよりも高い優先順位 +を持つ他のいずれの処理よりも低い). + +2.7 CPU例外ハンドラ + +JSPカーネルでは,スタンダードプロファイル規定に従って,CPU例外ハンドラ +の機能とそれを定義する静的API(DEF_EXC)をサポートしている. + +JSPカーネルでは,CPU例外ハンドラは非タスクコンテキストで実行される.非 +タスクコンテキストから呼び出せるサービスコールは,CPU例外ハンドラ内か +ら呼び出すことができる.ただし,CPU例外がCPUロック状態で発生した場合に +は,CPU例外ハンドラ中でCPUロックを解除することはできず,非タスクコンテ +キストから呼び出せるサービスコールを呼び出すこともできない. + +μITRON4.0仕様において,CPU例外ハンドラ内で行えるべきものとして規定さ +れている各操作は,次のような方法で行うことができる. + + (a) CPU例外が発生したコンテキストや状態の参照は,そのために用意された + JSPカーネル独自のサービスコール(vxsns_ctx,vxsns_loc,vxsns_dsp, + vxsns_dpn,vxsns_tex)を用いて行うことができる.詳しくは,「3.10 + CPU例外発生時のシステム状態参照」を参照すること. + + (b) CPU例外が発生したタスクのID番号の参照は,iget_tidサービスコールを + 呼び出すことによって行うことができる. + + (c) タスク例外処理の要求は,iras_texサービスコールを呼び出すことによっ + て行うことができる. + +CPU例外ハンドラの優先順位は,タスクコンテキストを実行中にCPU例外が発生 +した場合には,ディスパッチャよりも高く,すべての割込みハンドラおよびタ +イマハンドラよりも低い.非タスクコンテキストを実行中にCPU例外が発生し +た場合には,CPU例外が発生した処理の優先順位よりも一つだけ高い(厳密に +言うと,CPU例外が発生した処理よりも高く,CPU例外が発生した処理よりも高 +い優先順位を持つ他のいずれの処理よりも低い). + +CPU例外ハンドラのC言語による記述形式は次の通りとする. + + void cpu_exception_handler(VP p_excinf) + { + CPU例外ハンドラ本体 + } + +p_excinf には,CPU例外に関する情報を記憶している領域の先頭番地が渡され +る.これは,CPU例外ハンドラ内で,CPU例外が発生したコンテキストや状態を +参照する際に必要となる.詳しくは,「3.10 CPU例外発生時のシステム状態参 +照」参照すること.CPU例外ハンドラからリターンするには,C言語の関数から +単にリターンすればよい. + +CPU例外ハンドラをアセンブリ言語で記述する方法は,サポートしていない. + +2.8 非タスクコンテキストからのサービスコール呼出しと割込み禁止区間 + +JSPカーネルでは,タスクコンテキスト専用のサービスコールと,非タスクコ +ンテキスト専用のサービスコールを厳密に区別している.タスクコンテキスト +専用のサービスコールを非タスクコンテキストから呼び出した場合や,非タス +クコンテキスト専用のサービスコールをタスクコンテキストから呼び出した場 +合には,E_CTXエラーを返す. + +また,非タスクコンテキストから呼び出されたサービスコールの遅延実行は行っ +ていない.そのため,非タスクコンテキストから呼び出したサービスコールも, +操作対象のオブジェクトの状態に依存して発生するエラーを検出することがで +きる. + +2.9 システム初期化手順と初期化ルーチン + +カーネルを起動するには,ターゲットに依存して行わなければならない最低限 +の初期化を行った後,CPUロック状態と同等の状態で,kernel_start関数を呼 +び出す.JSPカーネルでは,ターゲット毎にスタートアップモジュールを用意 +して,この処理を行っている.詳しくは,ターゲット毎のマニュアルを参照す +ること. + +ATT_INIによって追加された初期化ルーチンは,カーネル内部のデータ構造の +初期化や他の静的APIの処理を終えた後に,システムコンフィギュレーション +ファイル中でのATT_INIの記述順と同じ順序で呼び出される.初期化ルーチン +内では,サービスコールを呼び出してはならない.初期化ルーチン内でサービ +スコールを呼び出した場合,システムの動作は保証されない(実際には,ター +ゲットによって,呼び出しても差し支えないサービスコールがある).また, +初期化ルーチンを実行中にカーネルの管理外の割込みが禁止されているかどう +かは,ターゲットおよびkernel_start関数が呼び出された時の状態に依存する. +具体的には,ターゲット毎のマニュアルを参照すること. + +2.10 静的APIとコンフィギュレータ + +JSPカーネルは,μITRON4.0仕様に規定されたシステムコンフィギュレーショ +ン手順に準拠した手順で,コンフィギュレーションを行う. + +システムの構成を記述したシステムコンフィギュレーションファイルは,まず +C言語のプリプロセッサで処理され,その結果をカーネルのコンフィギュレー +タ(cfgプログラム)に入力する.カーネルのコンフィギュレータは,カーネ +ル構成・初期化ファイルをkernel_cfg.cに,ID自動割付け結果ヘッダファイル +をkernel_id.hに生成する.また,静的APIのパラメータチェックに用いるファ +イルをkernel_chk.cに,静的APIの解析内容を含むオブジェクト定義ファイル +をkernel_obj.datに生成する.静的APIの文法エラー(および処理中のエラー +の一部)が検出されれば,カーネルのコンフィギュレータがエラーを報告する. + +kernel_cfg.cは,コンパイルされて,アプリケーションプログラムおよびカー +ネルと共にリンクされる.リンクにより生成されたロードモジュールは,カー +ネルのパラメータチェックプログラム(chkプログラム)によって,静的APIの +パラメータチェックが行われる.パラメータの値のエラーが検出されると,パ +ラメータチェックプログラムがエラーを報告するが,「1.5 既知の問題点」で +述べた通り,現バージョンではパラメータエラーのチェックは不完全である. + +以上の手順は,Makefile内に記述されている.ソフトウェア部品のコンフィギュ +レータを組み込みたい場合には,Makefileを修正する必要がある. + +2.11 インクルードファイル + +アプリケーションが用いることができるインクルードファイルは,includeディ +レクトリの下に置かれている. + +t_services.hは,カーネル上で動作するプログラムのソースファイルでインク +ルードするべき標準インクルードファイルである.この中で,kernel.h(さら +にここから,t_stddef.h,itron.h,tool_defs.h,sys_defs.h,cpu_defs.h, +t_syslog.h)とserial.hをインクルードしている.また,アプリケーションに +有益と思われる定義をいくつか含んでいる. + +s_services.hは,直接ハードウェアにアクセスするデバイスドライバのソース +ファイルでインクルードするべき標準インクルードファイルである.この中で, +sil.h(さらにここから,t_stddef.h,itron.h,tool_defs.h,sys_defs.h, +cpu_defs.h,t_syslog.h)とt_config.h(さらにここから,sys_config.h, +cpu_config.h,tool_config.h)をインクルードしている.また,アプリケー +ションから呼ばれるデバイスドライバのインクルードファイルで,インライン +関数などでシステムインタフェースレイヤを用いている場合にも,このファイ +ルをインクルードする. + +この2つのファイルからインクルードされるファイル(上に列挙したもの)は, +直接インクルードしないのが原則であるが,次の3つのケースは例外である. + +(1) カーネルから呼ばれるデバイスドライバのインクルードファイルで,イン + ライン関数などでシステムインタフェースレイヤを用いている場合には, + sil.hをインクルードする. + +(2) カーネル上で動作するプログラムで,ターゲット依存情報を参照したい場 + 合には,t_config.hをインクルードする. + +(3) 他のITRON仕様OSからソフトウェアをポーティングする場合などには, + kernel.hを直接インクルードしてもよい. + +(4) ITRON仕様共通規定に準拠するソフトウェア部品のインクルードファイル + は,itron.hを直接インクルードしてもよい. + +JSPカーネルのRelease 1.3以前のバージョンでは,t_services.hは +jsp_services.hというファイル名になっていた.バージョンを問わずに動作す +るプログラムを作る際には,t_services.hをインクルードし,古いバージョン +でjsp_services.hをt_services.hにシンボリックリンクを貼る方法を推奨する. + +なお,jsp_kernel.hは,カーネルを構成するプログラムのソースファイルでイ +ンクルードするべき標準インクルードファイルであり,カーネル上で動作する +プログラムのソースファイルからは通常はインクルードしない. + +2.12 システム終了手順と終了処理ルーチン + +アプリケーションから kernel_exit関数を呼び出すことで,カーネルを終了す +ることができる.kernel_exit関数が呼び出されると,カーネルは,終了処理 +ルーチンの実行,開発環境依存の終了処理(atexit によって登録された関数 +や C++ におけるデストラクタの実行)を行った後,カーネルの終了処理を行 +う. + +終了処理ルーチンは,アプリケーションで用意し,VATT_TER を使ってカーネ +ルに登録する.VATT_TER によって追加された終了処理ルーチンは,カーネル +の管理外の割込みを除くすべての割込みを禁止した状態で,システムコンフィ +ギュレーションファイル中での VATT_TER の記述順と逆の順序で呼び出される. +終了処理ルーチン内では,サービスコールを呼び出してはならない.終了処理 +ルーチン内でサービスコールを呼び出した場合,システムの動作は保証されな +い(実際には,ターゲットによって,呼び出しても差し支えないサービスコー +ルがある). + +2.13 その他 + +JSPカーネルでは,t_stddef.h の中で,次のマクロを定義している. + +(1) assert(exp) + +JSPカーネルでは,assertマクロを独自に定義している.開発環境の標準の +assertマクロは使われない. + +(2) throw() + +C言語とEC++言語では,throw() が空になるように定義している.C++言語から +呼び出す可能性のあるC言語で記述された関数のプロトタイプ宣言に,throw() +をつけることを想定している. + +また,t_services.h の中で,次のマクロを定義している. + +(3) syscall(s) + +サービスコール s を呼び出し,返値がエラーであれば,エラーメッセージを +出力する. + +(4) _syscall(s) + +サービスコール s を呼び出し,返値がエラーであれば,エラーメッセージを +出力し,カーネルを異常終了させる. + + +3.JSPカーネルのサービスコールと静的API + +この節では,JSPカーネルのサービスコールと静的APIについて,μITRON4.0仕 +様で実装定義となっている事項とJSPカーネル独自のサービスコールを中心に +解説する. + +3.1 タスク管理機能 + +タスクの起動要求キューイング数の最大値(TMAX_ACTCNT)は1に固定している. + +(1) CRE_TSK タスクの生成(静的API) + +tskatr に TA_ASM が指定された場合の機能(タスクをアセンブリ言語で記述 +する)はサポートしていない.また,stk に NULL 以外が指定された場合の機 +能(スタック領域の先頭番地を指定する)もサポートしていない. + +(2) act_tsk, iact_tsk タスクの起動 + +(3) can_act タスク起動要求のキャンセル + +(4) ext_tsk 自タスクの終了 + +ext_tsk が非タスクコンテキストから呼ばれた場合,システムログ機能を用い +てエラー情報を出力し(LOG_EMERGレベル),そのまま実行を続けるが,動作 +は保証されない. + +ext_tsk がCPUロック状態(またはディスパッチ禁止状態)で呼ばれた場合, +システムログにエラーを記録し(LOG_WARNINGレベル),CPUロック解除状態 +(またはディスパッチ許可状態)にしてからタスクを終了する. + +(5) ter_tsk タスクの強制終了 + +(6) chg_pri タスク優先度の変更 + +(7) get_pri タスク優先度の参照 + +3.2 タスク付属同期機能 + +タスクの起床要求キューイング数の最大値(TMAX_WUPCNT)は 1 に固定してい +る.また,タスクの強制待ち要求ネスト数の最大値(TMAX_SUSCNT)も 1 に固 +定している. + +(1) slp_tsk 起床待ち +(2) tslp_tsk 起床待ち(タイムアウトあり) + +(3) wup_tsk, iwup_tsk タスクの起床 + +(4) can_wup タスク起床要求のキャンセル + +(5) rel_wai, irel_wai 待ち状態の強制解除 + +(6) sus_tsk 強制待ち状態への移行 + +(7) rsm_tsk 強制待ち状態からの再開 +(8) frsm_tsk 強制待ち状態からの強制再開 + +タスクの強制待ち要求ネスト数の最大値(TMAX_SUSCNT)が 1 であるため, +rsm_tsk と frsm_tsk の処理内容は同一である. + +(9) dly_tsk 自タスクの遅延 + +3.3 タスク例外処理機能 + +TEXPTN型は,unsigned int型に定義している.よって TBIT_TEXPTN は, +unsigned int型が 32ビットの場合は 32,16ビットの場合は 16 になる. + +(1) DEF_TEX タスク例外処理ルーチンの定義(静的API) + +texatr に TA_ASM が指定された場合の機能(タスク例外処理ルーチンをアセ +ンブリ言語で記述する)はサポートしていない. + +(2) ras_tex, iras_tex タスク例外処理の要求 + +(3) dis_tex タスク例外処理の禁止 + +(4) ena_tex タスク例外処理の許可 + +(5) sns_tex タスク例外処理禁止状態の参照 + +3.4 同期・通信機能 + +3.4.1 セマフォ + +セマフォの最大資源数は,UINT型(unsigned int型に定義している)で表現で +きる数値の範囲内である.すなわち,unsigned int型が 32ビットの場合は +(2^32 - 1),16ビットの場合は (2^16 - 1) = 65535 である.TMAX_MAXSEM は +定義していない. + +(1) CRE_SEM セマフォの生成(静的API) + +(2) sig_sem, isig_sem セマフォ資源の返却 + +(3) wai_sem セマフォ資源の獲得 +(4) pol_sem セマフォ資源の獲得(ポーリング) +(5) twai_sem セマフォ資源の獲得(タイムアウトあり) + +3.4.2 イベントフラグ + +一つのイベントフラグで複数のタスクが待ち状態になれる機能はサポートして +いない. + +FLGPTN型は,unsigned int型に定義している.よって TBIT_FLGPTN は, +unsigned int型が 32ビットの場合は 32,16ビットの場合は 16 になる. + +(1) CRE_FLG イベントフラグの生成(静的API) + +flgatr に TA_WMUL が指定された場合の機能(イベントフラグで複数のタスク +が待ち状態になれる)はサポートしていない. + +(2) set_flg, iset_flg イベントフラグのセット + +(3) clr_flg イベントフラグのクリア + +(4) wai_flg イベントフラグ待ち +(5) pol_flg イベントフラグ待ち(ポーリング) +(6) twai_flg イベントフラグ待ち(タイムアウトあり) + +3.4.3 データキュー + +dtqcnt個のデータを格納するのに必要なデータキュー領域のサイズは, +sizeof(VP_INT) * dtqcnt バイトである.TSZ_DTQ は定義していない. + +(1) CRE_DTQ データキューの生成(静的API) + +dtq に NULL 以外が指定された場合の機能(データキュー領域の先頭番地を指 +定する)はサポートしていない. + +(2) snd_dtq データキューへの送信 +(3) psnd_dtq, ipsnd_dtq データキューへの送信(ポーリング) +(4) tsnd_dtq データキューへの送信(タイムアウトあり) + +(5) fsnd_dtq, ifsnd_dtq データキューへの強制送信 + +(6) rcv_dtq データキューからの受信 +(7) prcv_dtq データキューからの受信(ポーリング) +(8) trcv_dtq データキューからの受信(タイムアウトあり) + +3.4.4 メールボックス + +T_MSG型は下記のように定義されている.T_MSG型のサイズは,ターゲットプロ +セッサ/コンパイラのポインタのサイズに一致する. + + typedef struct t_msg { + struct t_msg *next; + } T_MSG; + +JSPカーネルでは,優先度別メッセージキューヘッダ領域は用いていない. +TSZ_MPRIHD は定義していないが,定義するとしたら 0 となる. + +(1) CRE_MBX メールボックスの生成(静的API) + +mprihd に NULL 以外が指定された場合の機能(優先度別メッセージキューヘッ +ダ領域の先頭番地を指定する)はサポートしていない. + +(2) snd_mbx メールボックスへの送信 + +(3) rcv_mbx メールボックスからの受信 +(4) prcv_mbx メールボックスからの受信(ポーリング) +(5) trcv_mbx メールボックスからの受信(タイムアウトあり) + +3.5 メモリプール管理機能 + +3.5.1 固定長メモリプール + +サイズが blkszバイトのメモリブロックを blkcnt個獲得できるのに必要な固 +定長メモリプール領域のサイズは,TROUND_VP(blksz) * blkcnt バイトである. +ここで,TROUND_VP(blksz) は,blksz をターゲットプロセッサ/コンパイラ +のポインタのサイズの倍数になるよう切り上げた数を表す.TSZ_MPF は定義し +ていない. + +(1) CRE_MPF 固定長メモリプールの生成(静的API) + +mpf に NULL 以外が指定された場合の機能(固定長メモリプール領域の先頭番 +地を指定する)はサポートしていない. + +(2) get_mpf 固定長メモリブロックの獲得 +(3) pget_mpf 固定長メモリブロックの獲得(ポーリング) +(4) tget_mpf 固定長メモリブロックの獲得(タイムアウトあり) + +(5) rel_mpf 固定長メモリブロックの返却 + +blkパラメータ(返却するメモリブロックの先頭番地)の値が,返却先のメモ +リプール領域の外や,メモリブロックの途中を指す場合には,E_PARエラーを +返す.未獲得のメモリブロックを返却した場合や,返却済のメモリブロックを +再度返却した場合の動作は保証されない. + +3.6 時間管理機能 + +タイムイベントハンドラに関しては,「2.6 タイムイベントハンドラ」を参照 +すること. + +3.6.1 システム時刻管理 + +JSPカーネルでは,タイムティックの供給(isig_tim を周期的に呼び出す処理) +はシステムサービスのシステムクロックドライバによって実現している.シス +テムクロックドライバの主要部分は,ターゲット毎にハードウェアタイマを使っ +て実現されており,isig_tim を呼び出す周期はターゲット毎に定める.その +ため TIC_NUME と TIC_DENO は,ターゲット依存部のアプリケーション用のイ +ンクルードファイル(cpu_defs.h および sys_defs.h)の中で定義している. +ターゲットによっては,この数値を変更するだけで isig_tim を呼び出す周期 +を変更できるように実装されている場合もある.詳しくは,ターゲット毎のマ +ニュアルを参照すること. + +(1) set_tim システム時刻の設定 + +(2) get_tim システム時刻の参照 + +(3) isig_tim タイムティックの供給 + +isig_tim は,ターゲット依存に定義された TIC_NUME と TIC_DENO で指定さ +れる時間だけシステム時刻を進め,必要なタイムイベント(タイムアウト,周 +期ハンドラの起動など)の処理を行う.JSPカーネルでは,システムクロック +ドライバがこのサービスコールを周期的に呼び出すため,アプリケーションか +ら呼び出す必要はない. + +3.6.2 周期ハンドラ + +周期ハンドラの起動位相を保存する機能はサポートしていない. + +(1) CRE_CYC 周期ハンドラの生成(静的API) + +cycatr に TA_PHS が指定された場合の機能(周期ハンドラの起動位相を保存 +する)はサポートしていない.また,TA_ASM が指定された場合の機能(周期 +ハンドラをアセンブリ言語で記述する)もサポートしていない. + +cycatr に TA_STA を指定し,cycphs に 0 を指定した場合,周期ハンドラの +初回の起動は,システム起動後の最初のタイムティックで行われる.すなわち, +cycphs に 1 を指定した場合と同じ振る舞いとなる.混乱の原因となるため, +cycphs に 0 を指定することは推奨しない. + +(2) sta_cyc 周期ハンドラの動作開始 + +(3) stp_cyc 周期ハンドラの動作停止 + +3.7 システム状態管理機能 + +(1) rot_rdq, irot_rdq タスクの優先順位の回転 + +(2) get_tid, iget_tid 実行状態のタスクIDの参照 + +(3) loc_cpu, iloc_cpu CPUロック状態への移行 + +(4) unl_cpu, iunl_cpu CPUロック状態の解除 + +(5) dis_dsp ディスパッチの禁止 + +(6) ena_dsp ディスパッチの許可 + +(7) sns_ctx コンテキストの参照 + +(8) sns_loc CPUロック状態の参照 + +(9) sns_dsp ディスパッチ禁止状態の参照 + +(10) sns_dpn ディスパッチ保留状態の参照 + +(11) vsns_ini カーネル動作状態の参照 + +【C言語API】 + BOOL state = vsns_ini(); + +【パラメータ】 + なし + +【リターンパラメータ】 + BOOL state カーネル動作状態 + +【機能】 + +カーネルの初期化完了前または終了処理開始後に呼び出された場合に TRUE, +カーネルの動作中に呼び出された場合に FALSE を返す. + +このサービスコールが TRUE を返す時には,他のサービスコールを呼び出して +はならない.このサービスコールが TRUE を返す時に他のサービスコールを呼 +び出した場合,システムの動作は保証されない. + +3.8 割込み管理機能 + +割込みハンドラに関しては,「2.5 割込みハンドラ」を参照すること. + +(1) DEF_INH 割込みハンドラの定義(静的API) + +INHNO型の定義と inhno の意味はターゲット毎に定める.inhatr には, +TA_HLNG のみを指定することができる. + +(2) dis_int 割込みの禁止 +(3) ena_int 割込みの許可 +(4) chg_ixx 割込みマスクの変更 +(5) get_ixx 割込みマスクの参照 + +これらのサービスコールがサポートされているかどうか,サポートされている +場合の仕様(xx の部分の名称,型とパラメータの名称と意味,CPUロック状態 +やディスパッチ状態との関連)については,ターゲット依存である.具体的に +は,ターゲット毎のマニュアルを参照すること. + +3.9 システム構成管理機能 + +CPU例外ハンドラに関しては「2.7 CPU例外ハンドラ」を,初期化ルーチンに関 +しては「2.9 システム初期化手順と初期化ルーチン」参照すること. + +(1) DEF_EXC CPU例外ハンドラの定義(静的API) + +EXCNO型の定義と excno の意味はターゲット毎に定める.excatr には, +TA_HLNG のみを指定することができる. + +(2) ATT_INI 初期化ルーチンの追加(静的API) + +iniatr に TA_ASM が指定された場合の機能(初期化ルーチンをアセンブリ言 +語で記述する)はサポートしていない. + +(3) VATT_TER 終了処理ルーチンの追加(静的API) + +【静的API】 + VATT_TER({ ATR teratr, VP_INT exinf, FP terrtn }); + +【パラメータ】 + ATR teratr 終了処理ルーチン属性 + VP_INT exinf 終了処理ルーチンの拡張情報 + FP terrtn 終了処理ルーチンの起動番地 + +【機能】 + +終了処理ルーチンを,指定される各パラメータに基づいて追加する.teratr +は終了処理ルーチンの属性,exinf は終了処理ルーチンを起動する時にパラメ +ータとして渡す拡張情報,terrtn は終了処理ルーチンの起動番地である. + +VATT_TER においては,teratr はプリプロセッサ定数式パラメータである. +teratr には,TA_HLNG の指定ができる.TA_HLNG(=0x00)が指定された場合 +には高級言語用のインタフェースで終了処理ルーチンを起動する. + +VATT_ATR によって追加された終了処理ルーチンは,システム終了処理時に実 +行される.詳しくは,「2.12 システム終了手順と終了処理ルーチン」を参照 +すること. + +3.10 CPU例外発生時のシステム状態参照 + +CPU例外ハンドラ内で,CPU例外が発生したコンテキストや状態を参照するため +のサービスコールとして,JSPカーネルでは,五つのサービスコールを独自に +サポートしている.サービスコール vxsns_yyy は,CPU例外が発生した処理で +sns_yyy を呼び出した場合の結果を取り出すもので,CPU例外ハンドラに渡さ +れるパラメータ p_excinf をパラメータとする. + +(1) vxsns_ctx CPU例外発生時のコンテキストの参照 + +【C言語API】 + BOOL state = vxsns_ctx(VP p_excinf); + +【パラメータ】 + VP p_excinf CPU例外に関する情報を記憶している領域の + 先頭番地 + +【リターンパラメータ】 + BOOL state コンテキスト + +【機能】 + +CPU例外が発生したコンテキストが,非タスクコンテキストの場合に TRUE,タ +スクコンテキストの場合に FALSE を返す.p_excinf には,CPU例外ハンドラ +に渡される p_excinfパラメータをそのまま渡す.CPU例外ハンドラ以外から呼 +び出した場合や,p_excinf を正しく渡さなかった場合の振舞いは保証されな +い. + +(2) vxsns_loc CPU例外発生時のCPUロック状態の参照 + +【C言語API】 + BOOL state = vxsns_loc(VP p_excinf); + +【パラメータ】 + VP p_excinf CPU例外に関する情報を記憶している領域の + 先頭番地 + +【リターンパラメータ】 + BOOL state CPUロック状態 + +【機能】 + +CPU例外が発生した状態が,CPUロック状態の場合に TRUE,CPUロック解除状態 +の場合に FALSE を返す.p_excinf には,CPU例外ハンドラに渡される +p_excinfパラメータをそのまま渡す.CPU例外ハンドラ以外から呼び出した場 +合や,p_excinf を正しく渡さなかった場合の振舞いは保証されない. + +(3) vxsns_dsp CPU例外発生時のディスパッチ禁止状態の参照 + +【C言語API】 + BOOL state = vxsns_dsp(VP p_excinf); + +【パラメータ】 + VP p_excinf CPU例外に関する情報を記憶している領域の + 先頭番地 + +【リターンパラメータ】 + BOOL state ディスパッチ禁止状態 + +【機能】 + +CPU例外が発生した状態が,ディスパッチ禁止状態の場合に TRUE,ディスパッ +チ許可状態の場合に FALSE を返す.p_excinf には,CPU例外ハンドラに渡さ +れる p_excinfパラメータをそのまま渡す.CPU例外ハンドラ以外から呼び出し +た場合や,p_excinf を正しく渡さなかった場合の振舞いは保証されない. + +【補足説明】 + +CPU例外ハンドラの起動によってディスパッチ禁止/許可状態は変化せず,CPU +例外ハンドラ中ではディスパッチの禁止や許可は行えないため,vxsns_dsp の +返り値は sns_dsp の返り値に常に一致する.そのため,vxsns_dsp と +sns_dsp の処理内容は同一となっている. + +(4) vxsns_dpn CPU例外発生時のディスパッチ保留状態の参照 + +【C言語API】 + BOOL state = vxsns_dpn(VP p_excinf); + +【パラメータ】 + VP p_excinf CPU例外に関する情報を記憶している領域の + 先頭番地 + +【リターンパラメータ】 + BOOL state ディスパッチ保留状態 + +【機能】 + +CPU例外が発生した状態が,ディスパッチ保留状態の場合に TRUE,そうでない +場合に FALSE を返す.すなわち,ディスパッチャよりも優先順位が高い処理 +が実行されていた時,CPUロック状態であった時およびディスパッチ禁止状態 +であった時は,TRUE を返す.p_excinf には,CPU例外ハンドラに渡される +p_excinfパラメータをそのまま渡す.CPU例外ハンドラ以外から呼び出した場 +合や, p_excinf を正しく渡さなかった場合の振舞いは保証されない. + +(5) vxsns_tex CPU例外発生時のタスク例外処理禁止状態の参照 + +【C言語API】 + BOOL state = vxsns_tex(VP p_excinf); + +【パラメータ】 + VP p_excinf CPU例外に関する情報を記憶している領域の + 先頭番地 + +【リターンパラメータ】 + BOOL state タスク例外処理禁止状態 + +【機能】 + +CPU例外が発生した時に実行状態であったタスクが,タスク例外処理禁止状態 +の場合に TRUE,タスク例外処理許可状態の場合に FALSE を返す.CPU例外が +非タスクコンテキストで発生し,その時に実行状態のタスクがなかった場合に +も,FALSE を返す.p_excinf には,CPU例外ハンドラに渡される p_excinfパ +ラメータをそのまま渡す.CPU例外ハンドラ以外から呼び出した場合や, +p_excinf を正しく渡さなかった場合の振舞いは保証されない. + +【補足説明】 + +CPU例外ハンドラの起動によってタスク例外処理禁止/許可状態は変化せず, +CPU例外ハンドラ中ではタスク例外処理の禁止や許可は行えないため, +vxsns_tex の返り値は sns_tex の返り値に常に一致する.そのため, +vxsns_tex と sns_tex の処理内容は同一となっている. + +3.11 性能評価用システム時刻参照機能 + +JSPカーネルでは,JSPカーネル上で動作するタスクやJSPカーネル自身の性能 +を計測するために,システム時刻より精度の高い性能評価用システム時刻を読 +み出す機能を,ターゲット依存にサポートしている.性能評価用システム時刻 +は,μ秒単位で表現されるが,実際の精度はターゲット依存である.具体的に +は,ターゲット毎のマニュアルを参照すること. + +性能評価用システム時刻参照機能では,次のデータ型を用いる. + + SYSUTIM 性能評価用システム時刻(符号無し整数) + +SYSUTIM型のサイズ数はターゲット依存である.具体的には,ターゲット毎の +マニュアルを参照すること. + +(1) vxget_tim 性能評価用システム時刻の参照 + +【C言語API】 + ER ercd = vxget_tim(SYSUTIM *p_sysutim); + +【パラメータ】 + なし + +【リターンパラメータ】 + ER ercd エラーコード + SYSUTIM sysutim 現在の性能評価用システム時刻 + +【エラーコード】 + E_CTX コンテキストエラー + +【機能】 + +現在の性能評価用システム時刻を読み出し,sysutim に返す. + +このサービスコールは,タスクコンテキストからのみ呼び出すことができる. +非タスクコンテキストから呼び出した場合には,E_CTXエラーとなる. + +タスクコンテキストであれば,CPUロック状態であっても呼び出せるが,CPUロッ +ク状態が長時間継続すると,タイマ割込みが入らないためにシステム時刻が更 +新されず,このサービスコールも正しい性能評価用システム時刻を返せなくな +る.時間測定区間が短い場合を除いては,時間測定区間全体をCPUロック状態 +とするのは適切ではない. + + +4.システムログ機能 + +システムログ機能は,カーネル内で発生した異常事象(アサーションの失敗, +エラーコードを返せないエラー)を,システムの外部に通知するための機能で +ある.カーネルのトレースログ,システムサービスやアプリケーション内で発 +生した異常事象やトレースログにも,同じ機能を利用することができる. + +4.1 システムログ機能の位置付け + +カーネル内で発生した異常事象をシステムの外部に通知するための方法として, +シリアルインタフェースに出力する,ディスクに書き出すなどの方法が考えら +れる. + +システムログ機能は,カーネル内部から呼び出されるという観点からは,カー +ネルの一部と考えるのが自然である.一方,シリアルインタフェースやディス +クにアクセスするためのサービス(デバイスドライバなど)はカーネル上で動 +作するため,それらを用いるシステムログ機能は,カーネル上に実装されたシ +ステムサービスと考える方が自然で,位置づけが微妙である. + +そこでJSPカーネルでは,カーネルの拡張機能として,異常事象に関する情報 +やトレースログ情報(これを,ログ情報と総称する)を,カーネル内のバッファ +(これをログバッファと呼ぶ)に記録する機能と,ログバッファからログ情報 +を読み出す機能を用意する.これを,システムログ機能と呼ぶ.ログ情報をロ +グバッファから読み出し,デバイスにアクセスするサービスを用いて外部に出 +力する機能は,システムログタスクとしてカーネル上に実現する. + +4.2 ログバッファへの記録と低レベル出力 + +上述したように,ログ情報をシステムの外部に出力するために,デバイスにア +クセスするサービスが必要になるが,これらのサービスはカーネル上で動作し +ているため,カーネルの動作を継続できないような重大な異常事象が起こった +場合には,これらのサービスを使うことができない.また,これらのサービス +自身をデバッグする場合にも,デバイスにアクセスするサービスを使うことが +できない. + +そこで,カーネル上で動作するサービスが使えない場合にでもログ情報を出力 +するために,低レベル出力機能を用意する.低レベル出力機能は,ターゲット +依存に用意する低レベルの文字出力関数(sys_putc)を用いてログ情報を出力 +する機能である.低レベルの文字出力関数は,ターゲット依存部で用意するこ +ととしているが,最終製品に組み込まれる場合などでは,文字を出力する方法 +がない状況も考えられる.そのような場合,低レベルの文字出力関数に送られ +た文字は,メモリ上に残しておくか,捨ててしまうしかない. + +ログ情報を,ログバッファへ記録するか低レベル出力機能を用いて出力するか +の設定は,カーネルの拡張サービスコール(vmsk_log)によって行うことがで +きる.vmsk_log の使い方については後述する. + +低レベル出力機能を用いると,ログメッセージの作成処理(printf 相当の処 +理)と低レベルの文字出力処理をカーネル内で行うために,カーネルの応答性 +が悪くなることに注意しなければならない.特に,低レベルの文字出力処理は +デバイスをポーリングする形で実装するのが通常で,その場合には,カーネル +の応答性は実用的と言えない程に悪くなる. + +一方,カーネルの動作を継続できるような(あまり重大でない)事象について +は,ログ情報をカーネル内のログバッファに記録し,記録したログ情報の出力 +は,デバイスにアクセスするサービスを用いて動作するシステムログタスクに +任せる.システムログタスクはカーネル上で動作するタスクであり,カーネル +の拡張サービスコール(vrea_log)を用いて,ログバッファからログ情報を読 +み出す.JSPカーネルの標準配布キットには,システムログタスクの一例とし +て,シリアルインタフェースにログ情報を文字列の形で出力するシステムログ +タスクを含めている. + +4.3 ログ情報の種別 + +JSPカーネルのシステムログ機能は,ログ情報に以下の種別を設けている. + + LOG_TYPE_INH 割込みハンドラ + LOG_TYPE_ISR 割込みサービスルーチン + LOG_TYPE_CYC 周期ハンドラ + LOG_TYPE_EXC CPU例外ハンドラ + LOG_TYPE_TEX タスク例外処理ルーチン + LOG_TYPE_TSKSTAT タスク状態変化 + LOG_TYPE_DSP ディスパッチャ + LOG_TYPE_SVC サービスコール + LOG_TYPE_COMMENT コメント + LOG_TYPE_ASSERT アサーションの失敗 + +これらの種別は,ITRONデバッギングインタフェース仕様を参考に定めている. +ただし,ITRONデバッギングインタフェース仕様におけるトレースログ形式は, +RIM(RTOS Interface Module)がデバッグツールに渡す場合の形式を定めたも +のであり,カーネルが出力する形式と一致している必要はない(RIM が変換す +ればよいため).実際,上の種別の中で,LOG_TYPE_CYC と LOG_TYPE_ASSERT +は,デバッギングインタフェース仕様と一致していない. + +ログ情報の種別の中で,LOG_TYPE_COMMENT と LOG_TYPE_ASSERT 以外はカーネ +ルのトレースログのためのもので,どのように用いるかはターゲット依存部に +任されている(4.5節参照). + +4.4 ログ情報の重要度 + +JSPカーネルのシステムログ機能は,ログ情報を出力する際に指定する重要度 +に基づいて,実際に出力するログ情報を動的に設定することができる.これは, +UNIX のシステムログ機能をまねたもので,ログの重要度の種類や指定方法も +UNIX の API を参考にしている.また,低レベル出力機能を用いて出力するロ +グ情報も,重要度に基づいて動的に設定することができる. + +具体的には,ログの重要度として次の8段階を用意している. + + LOG_EMERG システムをシャットダウンすべきエラー + LOG_ALERT + LOG_CRIT + LOG_ERROR 重要性の低いシステムエラー + LOG_WARNING 警告メッセージ.システムは安全に継続動作できる + LOG_NOTICE + LOG_INFO + LOG_DEBUG デバッグのためのメッセージ + +なお,アサーションの失敗は,LOG_EMERG で出力する.カーネルのトレースロ +グは,LOG_DEBUG で出力するのを標準とする(ターゲット依存). + +どの重要度のログ情報をログバッファに記録するかと,どの重要度のログ情報 +を低レベル出力機能を用いて出力するかは,カーネルの拡張サービスコール +(vmsk_log)によって設定することができる.vmsk_log の各パラメータは, +指定するログ情報の集合を表すビットマップである.また,ビットマップを作 +るためのマクロとして,LOG_MASK と LOG_UPTO を用意している. + +4.5 トレースログ機能 + +JSPカーネルは,カーネルのトレースログを取得するための基本的な仕組みを +持っているが,トレースログの実際の取得方法はターゲット依存となる.カー +ネルのトレースログの取得に,システムログ機能を使うのも選択肢の1つであ +る.ただし,カーネルのトレースログをシステムログタスクを用いて取り出す +方法は考えていない(システムログタスクが動作することによりトレースログ +が生成され,取り出すより多くのログ情報が生成される可能性があるため). + +4.6 システムログ機能の拡張サービスコール + +システムログ機能の提供する拡張サービスコールは次の通りである. + +(1) ER vwri_log(UINT prio, SYSLOG *p_log) + +システムログ機能に,重要度 prio でログ情報を出力する(ログバッファへ記 +録するか低レベル出力機能を用いて出力する).SYSLOG は,ログ情報を格納 +するためのデータ型(構造体)で,この拡張サービスコールには,それへのポ +インタを渡す. + +(2) ER_UINT vrea_log(SYSLOG *p_log) + +ログバッファからログ情報を1つ取り出す.ログバッファが空の時は E_OBJ, +そうでない場合は,失われたログ情報の数(ログ情報が失われていない場合は +0)を返す.システムログタスクが用いることを想定している. + +(3) ER vmsk_log(UINT logmask, UINT lowmask) + +ログバッファに記録すべきログ情報の重要度のビットマスク(logmask)と, +低レベル出力機能を用いて出力すべきログ情報の重要度のビットマスク +(lowmask)を設定する. + +4.7 システムログ機能のためのライブラリ関数とマクロ + +システムログ機能は,上記のサービスコールに加えて,次のライブラリ関数と +マクロを提供する. + +(1) void _syslog_n(UINT prio, UINT type, VP_INT arg1, ..., VP_INT argn) + ※ n は 0〜6 のいずれか. + +ログ種別が type,パラメータが arg1〜argn のログ情報を,重要度 prio で +出力するためのライブラリ関数. + +(2) void syslog_n(UINT prio, const char *format, arg1, ..., argn) + ※ n は 0〜5 のいずれか. + +format 文字列およびそれに続く引数から作成されるコメント(ログ種別が +LOG_TYPE_COMMENT のログ情報)を,重要度 prio で出力するためのマクロ. + +format はメッセージのフォーマット記述,arg1〜argn はフォーマット記述中 +で参照される値で,printf のフォーマット記述のサブセットとなっている. +arg1〜argn は VP_INT型にキャストされるため,VP_INT型に型変換できる任意 +の型を渡すことができ,型チェックはされない.format および arg1〜argn +には,次の制限がある. + +・format のフォーマット記述は,このマクロから戻った後も変化してはなら +ない.定数文字列を渡すことを想定している. + +・format 中に使えるフォーマット指定は次の通り. + + %d 引数をsigned int型とみなし,10進数で表示 + %u 引数をunsigned int型とみなし,10進数で表示 + %x 引数をunsigned int型とみなし,16進数(英文字は小文字)で表示 + %X 引数をunsigned int型とみなし,16進数(英文字は大文字)で表示 + %p 引数をポインタとみなし,16進数(英文字は小文字)で表示 + %c 引数を文字コードとみなし,文字を表示 + %s 引数を文字列を示すポインタとみなし,文字列を表示 + %% '%' を表示(引数は取らない) + +%d, %u, %x, %X においては,'%' の直後に表示桁数を指定する10進数値を記述 +することができる.その場合,表示すべき文字列が指定した桁数に満たない場 +合には,指定した桁数内に右詰めで表示する.10進数値が '0' で始まる場合 +には,その間に '0' を埋める. + +また,VP_INT型のサイズが long型のサイズ以上である環境においては,次の +フォーマット指定も使用することができる.この他のフォーマット指定に 'l' +を付加した場合には無視する(%lcと%lsには対応していない). + + %ld 引数をsigned long型とみなし,10進数で表示 + %lu 引数をunsigned long型とみなし,10進数で表示 + %lx 引数をunsigned long型とみなし,16進数(英文字は小文字)で表示 + %lX 引数をunsigned long型とみなし,16進数(英文字は大文字)で表示 + +・arg1〜argn にポインタを渡す場合(%s に対応する引数の場合)に,ポイン +タの指すデータは,このマクロから戻った後も変化してはならない.定数文字 +列を渡すことを想定している. + +(3) void syslog(UINT prio, const char *format, ...) + +format 文字列およびそれに続く引数から作成されるメッセージを,重要度 +prio でログ情報として出力するためのライブラリ関数で,引数の数を可変に +したもの.format に続く引数は最大5個まで.format およびそれに続く引数 +には,syslog_n と同様の制限がある. + +このライブラリ関数は,可変数引数を処理するために内部で文字列をスキャン +する.そのため,実行時間が長くなる可能性があり,割込み禁止状態で呼び出 +すべきではない.主にアプリケーションプログラムが用いることを想定してい +る.そのため,このライブラリ関数のソースファイルは,サポートライブラリ +のディレクトリに置いている. + +(4) UINT LOG_MASK(UINT prio) + +重要度 prio のみセットされたビットマップを作るマクロ.vmsk_log に渡す +引数を作るために用いる. + +(5) UINT LOG_UPTO(UINT prio) + +重要度 prio 以上の重要度がすべてセットされたビットマップを作るマクロ. +vmsk_log に渡す引数を作るために用いる. + +(6) void syslog_printf(const char *format, VP_INT *args, void (*putc)(char)) +(7) void syslog_print(SYSLOG *p_sys, void (*putc)(char)) +(8) void syslog_output(void (*putc)(char)) + +ログ情報をフォーマット出力するためのライブラリ関数.syslog_printf は渡 +されたフォーマット文字列と引数を,syslog_print は渡されたログ情報を, +syslog_output はログバッファに格納されたログ情報をフォーマット出力する. + +システムログタスクが用いることを想定しているため,このライブラリ関数の +ソースファイルはサポートライブラリのディレクトリに置いている.ただし, +低レベル出力を行うために,システムログ機能内部でも用いている. + +4.8 システムログ機能の設定方法 + +JSPカーネルのシステムログ機能の想定されている設定方法は,以下の通りで +ある. + +(a) 重大な異常事象を示すログ情報は低レベル出力機能を用いて出力し,そう +でないログ情報の出力はシステムログタスクに任せる. + +ログバッファに記録するログ情報の重要度と,低レベル出力を用いて出力する +ログ情報の重要度を適切に設定する.また,ログバッファからログ情報を読み +出して外部へ通知するシステムログタスクと,低レベルの文字出力関数を用意 +する. + +(b) すべてのログ情報を,低レベル出力機能を用いて出力する. + +必要なログ情報はすべて低レベル出力機能を用いて出力するよう設定 +(vmsk_log の第1パラメータを 0 に設定)する.また,低レベルの文字出力 +関数を用意する.システムログタスクは不要. + +(c) ログ情報はメモリ上に記録するだけで,システム外部には出力しない. + +必要なログ情報はすべてログバッファへ記録するように設定(vmsk_log の第2 +パラメータを 0 に設定)する.システムログタスクは不要. + +(d) ログ情報は記録も出力もしない. + +いずれのログ情報も記録/出力しないように設定(vmsk_log の両パラメータ +ともに 0 に設定)する. + +別の方法として,OMIT_SYSLOG を定義してコンパイルすることで,システムロ +グ機能をカーネルから取り外し,カーネルのコードサイズを小さくすることが +できる.ただし,アプリケーションから syslog,syslog_printf,syslog_print, +syslog_output の各関数を呼び出している場合,それらの関数のコードは外れ +ない.また,カーネルからのログ情報は記録/出力しないが,アプリケーショ +ンからのログ情報は記録/出力したい場合には,カーネルのみ OMIT_SYSLOG +を定義してコンパイルすればよい.この場合,システムログ機能の初期化関数 +(_kernel_syslog_initialize)と終了処理関数(_kernel_syslog_teminate) +は,アプリケーションから呼び出す必要がある. + +なお,(b)〜(c) の設定に固定して使用する場合にも,カーネル内の一部のコー +ドが不要になり,コードサイズを小さくできる余地があるが,簡易な方法は用 +意していない. + + +5.システムサービス + +この節では,JSPカーネルがサポートしているシステムインタフェースレイヤ +(SIL)と,JSPカーネルが標準的に動作させるドライバおよびシステムタスク +について説明する. + +5.1 システムインタフェースレイヤ(SIL) + +JSPカーネルは,ITRONデバイスドライバ設計ガイドラインの一部分として検討 +されているシステムインタフェースレイヤ(SIL)の中で,以下に挙げる機能 +をサポートしている.SILを用いるプログラムからは,t_services.hに代えて, +s_services.hをインクルードする. + +ITRONデバイスドライバ設計ガイドラインでは,デバイスドライバの中で,SIL +を通して直接デバイスにアクセスするモジュール(PDIC)と,カーネルの機能 +を用いるモジュール(GDIC)を分離することにしている.すなわち,PDICは +SILを用いるがカーネルの機能は用いず,GDICはカーネルの機能は用いるがSIL +を用いてはならない.そのため,s_services.hには,カーネルを用いるための +宣言や定義は含まれていない. + +5.1.1 割込みロック状態の制御 + +デバイスを扱うプログラムの中では,すべての割込み(NMIを除く,以下同じ) +を禁止したい場合がある.μITRON4.0仕様のCPUロック状態は,カーネルの管 +理外の割込み(NMI以外にカーネルの管理外の割込みがあるかは,JSPカーネル +ではターゲット依存)を禁止するとは限らず,このような場合に用いるのは適 +切でない. + +そこで,すべての割込みを禁止した状態を割込みロック状態と呼び,SILでは +割込みロック状態を制御するための以下の機能を用意している. + +(1) SIL_PRE_LOC + +割込みロック状態の制御に必要な変数を宣言し,それを初期化するマクロ.こ +のマクロを記述した時点で,割込みの禁止状態を記録する.SIL_LOC_INT, +SIL_UNL_INTを用いる関数(ブロック)の先頭の変数宣言部に記述しなければ +ならない. + +(2) SIL_LOC_INT() + +すべての割込みを禁止し,割込みロック状態に移行する. + +(3) SIL_UNL_INT() + +SIL_PRE_LOCを記述した時点の状態に戻す. + +割込みロック状態の制御機能の使用例は次の通り. + + { + SIL_PRE_LOC; + + SIL_LOC_INT(); + この間はすべての割込みが禁止される + この間にサービスコールを呼び出してはならない + SIL_UNL_INT(); + } + +なお,JSPカーネル自身は割込みロック状態は管理していないため,割込ロッ +ク状態ではサービスコールを呼び出してはならない(呼び出した場合の動作は +保証されない). + +5.1.2 微少時間待ち + +デバイスをアクセスする際に,微少な時間待ちを入れなければならない場合が +ある.そのような場合に,nopをいくつか入れるなどの方法で対応すると,ポ +ータビリティが悪くなる.そこでSILでは,微少な時間待ちを行うための機能 +を用意している. + +(1) void sil_dly_nse(UINT dlytim) + +dlytimで指定された以上の時間(単位はナノ秒),ループなどによって待つ. +指定した値によっては,指定した時間よりもかなり長く待つ場合があるので注 +意すること. + +5.1.3 エンディアン + +プロセッサのエンディアンを知るためのマクロとして,以下のマクロを定義し +ている. + +(1) SIL_ENDIAN + +リトルエンディアンプロセッサではSIL_ENDIAN_LITTLE(=0),ビッグエンディ +アンプロセッサではSIL_ENDIAN_BIG(=1)にマクロ定義される. + +5.1.4 メモリ空間アクセス関数 + +メモリ空間にマッピングされたデバイスレジスタや,デバイスとの共有メモリ +をアクセスするために,以下の関数を用意している. + +(1) VB sil_reb_mem(VP mem) + +memで指定されるアドレスから,8ビット単位で読んだ値を返す. + +(2) void sil_wrb_mem(VP mem, VB data) + +memで指定されるアドレスに,dataで指定される値を8ビット単位で書き込む. + +(3) VH sil_reh_mem(VP mem) + +memで指定されるアドレスから,16ビット単位で読んだ値を返す. + +(4) void sil_wrh_mem(VP mem, VH data) + +memで指定されるアドレスに,dataで指定される値を16ビット単位で書き込む. + +(5) VH sil_reh_lem(VP mem) + +memで指定されるアドレスから,16ビット単位でリトルエンディアンで読んだ +値を返す.リトルエンディアンプロセッサでは,sil_reh_memと一致する. + +(6) void sil_wrh_lem(VP mem, VH data) + +memで指定されるアドレスに,dataで指定される値を16ビット単位でリトルエ +ンディアンで書き込む.リトルエンディアンプロセッサでは,sil_wrh_memと +一致する. + +(7) VH sil_reh_bem(VP mem) + +memで指定されるアドレスから,16ビット単位でビッグエンディアンで読んだ +値を返す.ビッグエンディアンプロセッサでは,sil_reh_memと一致する. + +(8) void sil_wrh_bem(VP mem, VH data) + +memで指定されるアドレスに,dataで指定される値を16ビット単位でビッグエ +ンディアンで書き込む.ビッグエンディアンプロセッサでは,sil_wrh_memと +一致する. + +(9) VW sil_rew_mem(VP mem) + +memで指定されるアドレスから,32ビット単位で読んだ値を返す. + +(10) void sil_wrw_mem(VP mem, VW data) + +memで指定されるアドレスに,dataで指定される値を32ビット単位で書き込む. + +(11) VW sil_rew_lem(VP mem) + +memで指定されるアドレスから,32ビット単位でリトルエンディアンで読んだ +値を返す.リトルエンディアンプロセッサでは,sil_rew_memと一致する. + +(12) void sil_wrw_lem(VP mem, VW data) + +memで指定されるアドレスに,dataで指定される値を32ビット単位でリトルエ +ンディアンで書き込む.リトルエンディアンプロセッサでは,sil_wrw_memと +一致する. + +(13) VW sil_rew_bem(VP mem) + +memで指定されるアドレスから,32ビット単位でビッグエンディアンで読んだ +値を返す.ビッグエンディアンプロセッサでは,sil_rew_memと一致する. + +(14) void sil_wrw_bem(VP mem, VW data) + +memで指定されるアドレスに,dataで指定される値を32ビット単位でビッグエ +ンディアンで書き込む.ビッグエンディアンプロセッサでは,sil_wrw_memと +一致する. + +なお,JSPカーネルのターゲット非依存部では,I/O空間にアクセスするための +関数を用意していないが,ターゲット依存部でサポートすることは可能である. +詳しくは,ターゲット毎のマニュアルを参照すること. + +5.2 システムクロックドライバ + +システムクロックドライバは,ハードウェアタイマを用いて周期的に割込みを +発生させ,isig_timを呼び出してカーネルにタイムティックを供給する.シス +テムクロックドライバは,システムコンフィギュレーションファイルに +timer.cfgをインクルードすることで,システムに組み込むことができる. + +5.2.1 システムクロックドライバの内部構成 + +システムクロックドライバは,タイマの起動処理,タイマ割込みハンドラ,タ +イマの停止処理で構成される. + +(1) void timer_initialize(VP_INT exinf) + +タイマの起動処理.タイマを初期化し,周期的なタイマ割込み要求を発生させ +る.カーネルに初期化ルーチンとして登録する.exinfは無視する. + +(2) void timer_handler() + +タイマ割込みハンドラ.タイマ割込み要求をクリアした後,isig_timを呼び出 +してタイムティックを供給する.カーネルに割込みハンドラとして登録する. + +(3) void timer_terminate(VP_INT exinf) + +タイマの停止処理.周期的なタイマ割込み要求を停止させる.カーネルに終了 +処理ルーチンとして登録する.exinf は無視する. + +5.3 シリアルインタフェースドライバ + +シリアルインタフェースドライバは,シリアルポートを扱うためのドライバで +ある.シリアルインタフェースドライバは,システムコンフィギュレーション +ファイルにserial.cfgをインクルードすることで,システムに組み込むことが +できる. + +シリアルインタフェースドライバは,ポート毎にセマフォを2個ずつ使用する. +セマフォを生成する静的APIは,serial.cfgに含まれている. + +NEWLIBやGLIBCなどの標準Cライブラリを使用する場合には,標準Cライブラリ +の低レベル入出力ルーチンをシリアルインタフェースドライバを呼び出すもの +にすることで,タスクの標準入出力をシリアルインタフェースドライバ経由に +切り替えることができる.具体的な方法は,用いる標準Cライブラリに依存す +る. + +5.3.1 シリアルインタフェースドライバのサービスコール + +シリアルインタフェースドライバを呼び出すサービスコールの仕様は下記の通 +りである.この中で,シリアルポートのID番号(portid)の解釈はターゲット +依存となる. + +これらのサービスコールは,非タスクコンテキストから呼び出すことはできな +い.また,serial_rea_datとserial_wri_datは,ディスパッチ保留状態で呼び +出すことはできない.いずれも,呼び出した場合にはE_CTXエラーとなる. + +(1) ER serial_opn_por(ID portid) + +portidで示されるシリアルポートをオープンし,受信/送信が可能な状態にす +る. + +(2) ER serial_cls_por(ID portid) + +portidで示されるシリアルポートをクローズする. + +(3) ER_UINT serial_rea_dat(ID portid, char *buf, UINT len) + +portidで示されるシリアルポートから,lenバイトの文字列を受信し,bufから +の領域に入れる.lenバイト受信するまで,待ち状態となる.受信した文字数 +またはエラーコードを返す. + +(4) ER_UINT serial_wri_dat(ID portid, char *buf, UINT len) + +portidで示されるシリアルポートに,bufからのlenバイトの文字列を送信する. +lenバイト送信バッファに入れるまで,待ち状態となる.送信した文字数また +はエラーコードを返す. + +(5) ER serial_ctl_por(ID portid, UINT ioctl) + +portidで示されるシリアルポートの制御情報を,ioctlで示される値に設定す +る. + +ioctlには,以下の制御情報を表す定数を,ビット毎に論理和をとったものを +指定する. + + IOCTL_ECHO(エコーバックモード) + このビットを設定すると,シリアルインタフェースドライバがエコー + バックを行う.具体的には,バッファから文字を取り出す度に,その + 文字を書き出す. + + IOCTL_CRLF(改行モード) + LF(line feed)を書き出すと,CR(carriage return)+ LFに変換し + て書き出す. + + IOCTL_FCSND(出力フロー制御) + 文字を送信する処理に対して,XON/XOFFによるフロー制御を行う. + すなわち,STOP(コントロール-S)を受信すると送信を停止し, + START(コントロール-Q)を受信すると送信を再開する. + + IOCTL_FCANY(送信フロー制御で任意の文字で送信再開) + IOCTL_FCOUTを指定している時に,送信停止中に受信した任意の文字 + で送信を再開する. + + IOCTL_FCRCV(受信フロー制御) + 文字を受信する処理に対して,XON/XOFFによるフロー制御を行う. + すなわち,受信バッファの残り領域が少なくなるとSTOP(コントロー + ル-S)を送出し,残り領域が増えればSTART(コントロール-Q)を送 + 出する. + +なお,オープン直後のデフォルトの設定値は(IOCTL_ECHO | IOCTL_CRLF | +IOCTL_FCOUT | IOCTL_FCIN)である. + +(6) ER serial_ref_por(ID portid, T_SERIAL_RPOR *pk_rpor) + +portidで示されるシリアルポートの状態を参照し,pk_rporで指定されるパケッ +トに返す.パケット中のreacntには受信バッファ中の文字数を,wricntには送 +信バッファ中の文字数を返す. + +5.3.2 シリアルインタフェースドライバの内部構成 + +シリアルインタフェースドライバは,前記のサービスコールに加えて,初期化 +処理と割込みハンドラで構成される.初期化処理は,カーネルに初期化ルーチ +ンとして登録する.割込みハンドラは,カーネルに割込みハンドラとして登録 +する.これらの登録処理はserial.cfgに含まれる. + +(1) void serial_initialize(VP_INT exinf) + +シリアルインタフェースドライバを初期化する.カーネルに初期化ルーチンと +して登録する.exinfは無視する. + +(2) 割込みハンドラ + +シリアルI/Oデバイスの種類によって,割込みハンドラの種類や数は異なる. +具体的には,送信割込みと受信割込みが別れているものと別れていないものや, +ポートを複数持つシリアルI/Oデバイスでポート毎に割込みハンドラが別れて +いるものと別れていないものがある.シリアルインタフェースドライバの割込 +みハンドラは,カーネルに割込みハンドラとして登録する. + +5.4 システムログタスク + +システムログタスクは,カーネル内のログバッファからログ情報を取り出し, +デバイスにアクセスするサービスを用いて外部に出力するタスクである. + +JSPカーネルの標準配布キットに含まれるシステムログタスクは,シリアルイ +ンタフェースにログ情報を文字列の形で出力するもので,システムログタスク +の一例という位置付けで提供している.このシステムログタスクは,システム +コンフィギュレーションファイルにlogtask.cfgをインクルードすることで, +システムに組み込むことができる. + + +6.サポートライブラリ + +サポートライブラリは,アプリケーションやシステムサービスを作成するため +に利用できるライブラリ関数群である.現バージョンでは,システムサービス +やサンプルプログラムで使う最低限の関数しか用意していない. + +(1) const char *itron_strerror(ER ercd) + +ercd で示されるメインエラーコードに対応するエラーコードの文字列を返す. +返された文字列を書き換えてはならない. + +(2) void t_perror(const char *file, int line, const char *expr, ER ercd) + +エラーメッセージをシステムログサービスに出力する.assertマクロなどで利 +用することを想定している. + + +7.開発環境・インストール・ポーティング + +7.1 ディレクトリ・ファイル構成 + +ソースファイルのディレクトリ構成は次の通り. + + include/ 共通ヘッダファイル + kernel/ カーネルソースファイル + systask/ システムサービスソースファイル + library/ サポートライブラリソースファイル + config/ ターゲット依存部 + m68k/ M68040 プロセッサ依存ファイル + dve68k/ DVE-68K/40 システム依存ファイル + sh1/ SH1 プロセッサ依存ファイル + kz_sh1/ KZ-SH1-01 システム依存ファイル + zunda_sh1/ ZUNDA/SH1 システム依存ファイル + sh2/ SH2 プロセッサ依存ファイル + apsh2f6a/ APSH2F6A システム依存ファイル + hsb7616it/ HSB7616IT システム依存ファイル + sh3/ SH3 プロセッサ依存ファイル + ms7727cp01/ MS7727CP01 システム依存ファイル + solution_engine/ Solution Engine システム依存ファイル + sh3-ghs/ SH3 プロセッサ依存ファイル(GHS開発環境) + ms7727cp01/ MS7727CP01 システム依存ファイル + solution_engine/ Solution Engine システム依存ファイル + h8/ H8 プロセッサ依存ファイル + akih8_3048f/ AKI-H8/3048F システム依存ファイル + akih8_3052f/ AKI-H8/3052F システム依存ファイル + akih8_3069f/ AKI-H8/3069F システム依存ファイル + nkev_010h8/ NKEV-010H8 システム依存ファイル + h8-renesas/ H8 プロセッサ依存ファイル(Renesas開発環境) + hsb8f3048bf25/ H8_3048F システム依存ファイル + h8s/ H8S プロセッサ依存ファイル + h8s2350/ H8S_2350 システム依存ファイル + h8s2351/ H8S_2351 システム依存ファイル + armv4/ ARMV4 プロセッサ依存ファイル + integrator/ Integrator システム依存ファイル + az9360mb/ AZ9360MB システム依存ファイル + armv4-ghs/ ARMV4 プロセッサ依存ファイル(GHS開発環境) + integrator/ Integrator システム依存ファイル + microblaze/ MicroBlaze プロセッサ依存ファイル + miref/ MIREF システム依存ファイル + mire_multi/ MIRE_MULTI3000 システム依存ファイル + mutlimedia/ MultiMedia Board システム依存ファイル + suzaku/ Suzaku システム依存ファイル + tms320c54x/ TMS320C54x プロセッサ依存ファイル + c5402dsk/ TMS320VC5402 DSK システム依存ファイル + xstormy16/ Xstormy16 プロセッサ依存ファイル + simulator/ 三洋マイコン開発ツール環境 依存ファイル + mips3/ MIPS3 プロセッサ依存ファイル + vr4131/ VR4131 システム依存ファイル + vr5500/ VR5500 システム依存ファイル + m16c-renesas/ M16C プロセッサ依存ファイル(Renesas開発環境) + oaks16/ OAKS16 システム依存ファイル + oaks16_mini/ OAKS16_MINI システム依存ファイル + m32c-renesas/ M32C プロセッサ依存ファイル(Renesas開発環境) + oaks32/ OAKS32 システム依存ファイル + m32r/ M32R プロセッサ依存ファイル + m3a2131g50/ M3A-2131G50 システム依存ファイル + m3a_za36/ M3A-ZA36 システム依存ファイル + s1c33/ S1C33 プロセッサ依存ファイル + dmt33209/ DMT33209 システム依存ファイル + dmt33401/ DMT33401 システム依存ファイル + luxun2/ LUXUN2 システム依存ファイル + luxun4/ LUXUN4 システム依存ファイル + s1c33-gnu33/ S1C33 プロセッサ依存ファイル(GNU33開発環境) + dmt33209/ DMT33209 システム依存ファイル + dmt33401/ DMT33401 システム依存ファイル + luxun2/ LUXUN2 システム依存ファイル + luxun4/ LUXUN4 システム依存ファイル + powerpc32/ POWERPC32 プロセッサ依存ファイル + ibm_ppc_emb_sample/ The IBM PowerPC Embedded Environment システム依存ファイル + mpc860t/ MPC860T システム依存ファイル + nios2/ NIOS2 プロセッサ依存ファイル + altera_dev_board/ ALTERA_DEV システム依存ファイル + v850/ V850 プロセッサ依存ファイル + tk850_kj1/ TK-850ES システム依存ファイル + tk850_sg2/ TK-850SG2 システム依存ファイル + tlcs900-toshiba/ TLCS900 プロセッサ依存部ファイル + zup_f16_ex/ Zup-F16拡張ボード システム依存ファイル + linux/ Linux上のシミュレーション環境依存ファイル + windows/ Windows上のシミュレーション環境依存ファイル + tools/ 開発環境依存ディレクトリ + WINDOWS/ Windows上のサンプルプログラムとプロジェクトファイル + GHS/ GHS(Green Hills Software)開発環境用のファイル + C5402DSK/ TMS320VC5402 DSK用のプロジェクトファイル + H8-RENESAS/ H8-RENESAS用のプロジェクトディレクトリ + M16C-RENESAS/ M16C-RENESAS用のプロジェクトディレクトリ + M32C-RENESAS/ M32C-RENESAS用のプロジェクトディレクトリ + pdic/ PDIC(デバイスドライバのOS非依存部分) + simple_sio/ 簡易SIOドライバ(シリアルドライバが使用するもの) + cfg/ カーネルコンフィギュレータ + utils/ ユーティリティ + h8/ H8用ベクターテーブル生成ユーティリティ + h8-renesas/ H8-RENESAS用ベクターテーブル生成ユーティリティ + m16c-renesas/ M16C-RENESAS用ベクターテーブル生成ユーティリティ + sample/ サンプルプログラムと Makefile + doc/ ドキュメント + windev/ Windowsデバイスマネージャ + +ターゲット非依存部(カーネルコンフィギュレータは除く)の各ファイルの概 +要は次の通り. + + README TOPPERS/JSPカーネルの簡単な紹介 + configure コンフィギュレーションスクリプト + + include/ + itron.h ITRON仕様共通規定に関連する定義 + kernel.h μITRON4.0仕様に関連する定義 + kernel_debug.h μITRON4.0仕様 デバッグ用インクルードファイル + sil.h システムインタフェースレイヤ(SIL) + t_stddef.h カーネル・アプリケーション 共通インクルードファイル + t_config.h ターゲット依存情報の定義 + t_syslog.h システムログサービス関連の定義 + t_services.h アプリケーション用 標準インクルードファイル + s_services.h デバイスドライバ用 標準インクルードファイル + kernel_cfg.h kernel_cfg.c用のインクルードファイル + timer.h システムクロックドライバ関連の定義 + serial.h シリアルインタフェースドライバ関連の定義 + logtask.h システムログタスク関連の定義 + linux_sigio.h Linux用 ノンブロッキングI/Oサポート + + kernel/ + Makefile.kernel カーネルのファイル構成の定義 + jsp_kernel.h JSPカーネル用 標準インクルードファイル + jsp_rename.def カーネルの内部識別名のリネーム定義 + jsp_rename.h カーネルの内部識別名のリネーム + jsp_unrename.h カーネルの内部識別名のリネーム解除 + check.h エラーチェック用マクロ + queue.h ダブルリンクキューの構造と操作 + startup.c カーネルの初期化処理 + banner.c カーネルの起動メッセージの出力 + task.h タスク操作ルーチン関連の定義 + task.c タスク操作ルーチン + wait.h 待ち状態操作ルーチン関連の定義 + wait.c 待ち状態操作ルーチン + time_event.h タイムイベント管理関連の定義 + time_event.c タイムイベント管理 + syslog.h システムログ機能関連の定義 + syslog.c システムログ機能 + task_manage.c タスク管理機能 + task_sync.c タスク付属同期機能 + task_except.c タスク例外処理機能 + semaphore.h セマフォ機能関連の定義 + semaphore.c セマフォ機能 + eventflag.h イベントフラグ機能関連の定義 + eventflag.c イベントフラグ機能 + dataqueue.h データキュー機能関連の定義 + dataqueue.c データキュー機能 + mailbox.h メールボックス機能関連の定義 + mailbox.c メールボックス機能 + mempfix.h 固定長メモリプール関連の定義 + mempfix.c 固定長メモリプール + time_manage.c システム時刻管理機能 + cyclic.h 周期ハンドラ機能関連の定義 + cyclic.c 周期ハンドラ機能 + sys_manage.c システム管理機能 + interrupt.h 割込み管理機能関連の定義 + interrupt.c 割込み管理機能 + exception.h CPU例外管理機能関連の定義 + exception.c CPU例外管理機能 + + systask/ + timer.c システムクロックドライバ + timer.cfg システムクロックドライバの設定記述 + serial.c シリアルインタフェースドライバ + serial.cfg シリアルインタフェースドライバの設定記述 + logtask.c システムログタスク + logtask.cfg システムログタスクの設定記述 + linux_sigio.c Linux用 ノンブロッキングI/Oサポート + linux_sigio.cfg Linux用 ノンブロッキングI/Oサポートの設定記述 + linux_serial.c Linux用 疑似シリアルドライバ + linux_serial.cfg Linux用 疑似シリアルドライバの設定記述 + cxxrt.c C++対応ランタイム本体 + cxxrt.cfg C++対応ランタイム用オブジェクト設定 + newlibrt.c NEWLIB対応ランタイム + + library/ + log_output.c システムログ機能用ライブラリ関数(syslog_outputなど) + strerror.c itron_strerror関数 + t_perror.c t_perror関数 + vasyslog.c syslog関数 + + utils/ + makedep 依存関係定義の生成 + genoffset offset.h 生成プログラム + gencheck パラメータチェック用ファイルの生成 + genrename 内部シンボルリネーム定義の生成 + rename 内部シンボルのリネーム処理 + + sample/ + Makefile サンプルの Makefile + Makefile.linux サンプルの Makefile(Linux用) + Makefile.mware サンプルの Makefile(ミドルウェアとの組み合わせ用) + sample1.cfg サンプルプログラム(1)の設定記述 + sample1.h サンプルプログラム(1)に関する定義 + sample1.c サンプルプログラム(1)の本体 + cxx_sample1.cfg C++用サンプルプログラム(1)の設定記述 + cxx_sample1.h C++用サンプルプログラム(1)に関する定義 + cxx_sample1.c C++用サンプルプログラム(1)の本体 + cxx_sample2.cfg C++用サンプルプログラム(1)の設定記述 + cxx_sample2.h C++用サンプルプログラム(1)に関する定義 + cxx_sample2.c C++用サンプルプログラム(1)の本体 + + doc/ + user.txt TOPPERS/JSPカーネル ユーザズマニュアル + gnu_install.txt GNU開発環境構築マニュアル + m68k.txt M68040 ターゲット依存部マニュアル + sh1.txt SH1 ターゲット依存部マニュアル + sh2.txt SH2 ターゲット依存部マニュアル + sh3.txt SH3 ターゲット依存部マニュアル + h8.txt H8 ターゲット依存部マニュアル + h8-renesas.txt H8-RENESAS ターゲット依存部マニュアル + h8s.txt H8S ターゲット依存部マニュアル + armv4.txt ARMV4 ターゲット依存部マニュアル + microblaze.txt MicroBlaze ターゲット依存部マニュアル + tsm320c54x.txt TMS320C54x ターゲット依存部マニュアル + xstormy16.txt Xstormy16 ターゲット依存部マニュアル + mips3.txt MIPS3 ターゲット依存部マニュアル + m16c.txt M16C ターゲット依存部マニュアル + m32c.txt M32C ターゲット依存部マニュアル + m32r.txt M32R ターゲット依存部マニュアル + nios2.txt Nios2 ターゲット依存部マニュアル + powerpc32.txt POWERPC32 ターゲット依存部マニュアル + s1c33.txt S1C33 ターゲット依存部マニュアル + v850.txt V850 ターゲット依存部マニュアル + linux.txt Linux シミュレーション環境依存部マニュアル + windows.txt Windows シミュレーション環境依存部マニュアル + config.txt JSPカーネル ターゲット依存部 ポーティングガイド + configurator.txt JSPカーネル コンフィギュレータ仕様 + design.txt JSPカーネル 設計メモ + +7.2 開発環境 + +JSPカーネルを用いたシステム構築には,以下のツールが必要である. + + ホスト環境用のツール + 標準規格に準拠したCコンパイラ,Cライブラリ + C++コンパイラ,C++ライブラリ,STL + 動作確認: GNU C++ 2.95.3,3.2,3.3(Linux環境) + GNU C++ 3.2(Cygwin環境) + Visual C++ 6.0,.NET + perl(動作確認は 5.6.1) + GNU Make(動作確認は 3.79.1) + + クロス環境用のツール + GNU開発環境 + BINUTILS(アセンブラ,リンカなど) + GCC または GCC-CORE(Cコンパイラ) + GDB(デバッガ) + NEWLIB(標準Cライブラリ) + +GNU開発環境をインストール方法については,「GNU開発環境構築マニュアル」 +を用意しているので,それを参照するとよい.また,動作確認バージョンにつ +いては,ターゲット毎のマニュアルを参照すること. + +ホスト環境用のCコンパイラとCライブラリは,クロス環境用のツールのインス +トールに必要になる.また,C++コンパイラ,C++ライブラリと STL(Standard +Template Library)は,カーネルのコンフィギュレーションツールのコンパイ +ルに必要である.クロス環境用のツールとコンフィギュレーションツールをバ +イナリで入手した場合には,これらのツールは必要ない. + +クロス環境用の標準Cライブラリは,アプリケーションが標準Cライブラリを使 +用しない場合には,必要ない.ただし,コンパイラが標準Cライブラリ関数 +(memcpy,memsetなど)を呼び出すコードを生成する場合があり,その場合に +は標準Cライブラリが必要である.ないしは,生成したコードが呼び出す関数 +のみを自分で用意してもよい. + +以下では,これらのツールが用意できていることを前提に,UNIXマシン(動作 +確認は Linux)上で構築手順を説明する.また以下の説明では,makeコマンド +が GNU Make であるものとする(JSPカーネルの Makefile は,GNU Make の拡 +張機能を用いている). + +7.3 コンフィギュレーションツールの構築 + +カーネルを構築する前に,まず,コンフィギュレーションツールをコンパイル +する必要がある(コンフィギュレーションツールをバイナリで入手した場合に +は,このステップは必要ない). + +JSPカーネルのコンフィギュレーションツールは,コンフィギュレータ(cfgプ +ログラム)とパラメータチェックプログラム(chkプログラム)から構成され +る.コンフィギュレーションツールの使い方については,「7.9 コンフィギュ +レーションツールの使い方」を参照すること. + +コンフィギュレーションツール(cfgプログラムとchkプログラム)は,cfgディ +レクトリに移動し,make dependで依存関係ファイル(Makefile.depend)を生 +成した後,makeコマンドにより生成される. + + % cd cfg + % make depend + % make + +7.4 サンプルプログラムの構築 + +次に,サンプルプログラムを構築する方法を説明する. + +まず,サンプルプログラムのオブジェクトファイルを置くディレクトリを作成 +し,コンフィギュレーションスクリプトを実行する.例えば,オブジェクトファ +イルを置くディレクトリを,JSPカーネルのソースファイルを展開したディレ +クトリの下のOBJという名称のディレクトリにする場合には,次のコマンドを +実行する(ディレクトリの場所は名称は任意に決めてよい). + + % mkdir OBJ + % cd OBJ + % perl ../configure -C m68k -S dve68k + +ここで,m68kはターゲットプロセッサ名,dve68kはターゲットシステム名であ +る.これらのコンフィギュレーションスクリプトのオプションについては,次 +の節で説明する. + +コンフィギュレーションスクリプトの実行により,カレントディレクトリには, +サンプルプログラムを構築するためのMakefile,サンプルプログラム用のコン +フィギュレーションファイル(sample1.cfg),サンプルプログラム本体 +(sample1.hおよびsample1.c)が生成される. + +コンフィギュレーションスクリプトの実行後,必要であればMakefileを修正す +る.Makefileの修正方法については,「7.7 Makefileの修正」を参照すること. + +その後,make dependで依存関係ファイル(Makefile.depend)を生成した後, +makeコマンドによりサンプルプログラムのロードモジュール(jspまたは +jsp.exe)が生成できる.依存関係ファイルの生成には若干時間がかかる. + + % make depend + % make + +ここで構築したサンプルプログラム(sample1.h,sample1.c,sample1.cfg) +は,JSPカーネルの基本的な動作を確認するためのものである.このプログラ +ムの概要説明は,sample1.cの先頭のコメントにある. + +7.5 アプリケーションとカーネルを別々に構築する方法 + +前節で説明した方法では,アプリケーションとカーネルを同時に生成するため, +オブジェクトファイルを置くディレクトリに非常に多くのファイルが作成され +て,扱いにくくなる.そこで,カーネルを修正する頻度が低い場合には,カー +ネルは事前に構築しておき,後でアプリケーションだけを構築する方法を用意 +している.以下では,サンプルプログラムを構築を例に,その手順について説 +明する. + +まず,カーネルを構築するディレクトリを作成し,コンフィギュレーションス +クリプトを実行する.例えば,カーネルを構築するディレクトリを,JSPカー +ネルのソースファイルを展開したディレクトリの下のkernel_libという名称の +ディレクトリにする場合には,次のコマンドを実行する(ディレクトリの場所 +は名称は任意に決めてよい). + + % mkdir kernel_lib + % cd kernel_lib + % perl ../configure -C m68k -S dve68k + +これにより,カーネルを構築するディレクトリに,Makefile,sample1.cfg, +sample1.h,sample1.cが生成されるが,Makefile以外は使用しない. + +make dependで依存関係ファイル(Makefile.depend)を生成した後,make +libkernel.aによりカーネルライブラリ(libkernel.a)が生成できる. + + % make depend + % make libkernel.a + +次に,アプリケーションを構築するディレクトリを作成し,コンフィギュレー +ションスクリプトを実行する.例えば,アプリケーションを構築するディレク +トリを,JSPカーネルのソースファイルを展開したディレクトリの下のAPLとい +う名称のディレクトリにする場合には,次のコマンドを実行する(ディレクト +リの場所は名称は任意に決めてよい). + + % cd .. + % mkdir APL + % cd APL + % perl ../configure -C m68k -S dve68k -L ../kernel_lib + +ここで-Lオプションには,カーネルを構築したディレクトリのパスを指定する. + +最後に,make dependで依存関係ファイル(Makefile.depend)を生成した後, +makeコマンドによりサンプルプログラムのロードモジュール(jspまたは +jsp.exe)が生成できる. + + % make depend + % make + +この手順では,アプリケーション構築時にはカーネルの再構築が必要かチェッ +クしないため,カーネルのソースコードを修正した場合には,カーネルを構築 +したディレクトリでmake libkernel.aを再実行する必要がある.また,アプリ +ケーション構築時にカーネルライブラリが更新されたかチェックしないため, +アプリケーションを構築したディレクトリで,ロードモジュールを削除した後 +にmakeを再実行する必要がある. + +以上では,カーネルとアプリケーションを別々のディレクトリで構築したが, +-Lオプションにカレントディレクトリ(".")を指定することで,同じディレ +クトリで(別々に)構築することもできる.具体的には,次の手順となる. + + % mkdir OBJ + % cd OBJ + % perl ../configure -C m68k -S dve68k -L . + % make depend + % make libkernel.a + % make cleankernel + % make + +ここで,make cleankernelは,カーネルライブラリを生成するための中間ファ +イルを削除するものである.この手順では,make dependによりカーネルライ +ブラリに関する依存関係を生成しないため,カーネルのソースコードを修正し +た場合には,必ずmake cleankernel(または,make clean)してから,make +libkernel.aする必要があるので注意すること.さらに,ロードモジュールを +削除した後にmakeを再実行する必要があるのは,前の場合と同様である. + +7.6 コンフィギュレーションスクリプトの使い方 + +コンフィギュレーションスクリプトは,JSPカーネルおよびアプリケーション +プログラムを構築するために必要な基本的なコンフィギュレーションを行うた +めのプログラムである.JSPカーネルを用いてアプリケーションを作成する場 +合には,まずオブジェクトファイルを置くディレクトリを作成し,そのディレ +クトリでコンフィギュレーションスクリプトを実行する.オブジェクトファイ +ルを置くディレクトリの場所や名称は,任意に決めてよい. + +コンフィギュレーションスクリプトに対するオプションは次の通り. + + -C <プロセッサ名> + ターゲットプロセッサ名またはシミュレーション環境名を,configディ + レクトリの下のディレクトリ名称で指定する(必須). + + -S <システム名> + ターゲットシステム名を,configの下のプロセッサのディレクトリの + 下のディレクトリ名称で指定する.シミュレーション環境の場合には, + 指定する必要がない. + + -T <開発環境名> + 開発環境名を,configの下のディレクトリ名称の後半の名称で指定す + る.GNU開発環境を用いる場合には,指定する必要がない. + + -A <アプリケーションプログラム名> + アプリケーションプログラムの名称を指定する.省略した場合には, + 標準のサンプルプログラム(sample1)となる. + + -U <オブジェクトファイル名> + アプリケーションプログラムのメインのオブジェクトファイル(-A + で指定したアプリケーションプログラム名に".o"を付加したもの)以 + 外に,リンクすべきオブジェクトファイルの名称を,".o"を付加した + 形で指定する.""で囲むことによって,複数のファイルを指定するこ + とも可能である(-U オプションを複数使ってはならない). + + -L <カーネルライブラリのディレクトリ名> + 事前に構築したカーネルを用いて,アプリケーションのみを構築する + 場合には,このオプションにカーネルライブラリ(libkernel.a)の + 置かれたディレクトリ名を指定する.このオプションの使用方法につ + いては,「7.5 アプリケーションとカーネルを別々に構築する方法」 + を参照すること. + + -D + JSPカーネルのソースコードを置いたディレクトリ名を指定する.省 + 略した場合には,configureの置かれているディレクトリとなる. + +コンフィギュレーションスクリプトが行う処理は次の通りである. + +(1) Makefileの生成 + +sampleディレクトリから適切なMakefileを選択し,必要な箇所を書き換えて, +Makefileを生成する. + +(2) サンプルプログラムの生成 + +指定したアプリケーションプログラムがsampleディレクトリにある場合,適切 +なサンプルプログラムのソースファイルを選択し,必要な箇所を書き換えて, +サンプルプログラムのソースファイル(例えば,sample1.h,sample1.c, +sample1.cfg)を生成する. + +7.7 Makefileの修正 + +JSPカーネルの実行環境によっては,コンフィギュレーションスクリプトが生 +成したMakefileを修正することが必要になる.ここでは,Makefileの中で,修 +正が必要となる可能性の高い箇所について説明する. + +なお,Makefileを修正した後にコンフィギュレーションスクリプトを再実行す +ると,修正したMakefileが上書きされてしまうので注意すること(古いものが +Makefile.bakに保存される). + +(A) ターゲット名の定義 + +CPUはターゲットプロセッサ名,SYSはターゲットシステム名,TOOLは開発環境 +名に定義する.これらの定義は,コンフィギュレーションスクリプトが行う. + +(B) オブジェクトファイルの拡張子の設定 + +Cygwin環境でコンパイルする時には,OBJEXTを"exe"に定義する必要がある. +これは,Cygwin環境では,オブジェクトプログラムに拡張子"exe"が付加され +るのに対応するためのものである.Cygwin環境であることを判定できれば,コ +ンフィギュレーションスクリプトがこの定義を行う. + +(C) 実行環境の定義(ターゲット依存) + +ターゲットによっては,実行環境に対応してターゲット依存部のコードを差し +換える場合がある.これを可能にするために,実行環境の名称をDBGENVに定義 +している.標準では,GDBスタブを用いることを想定して,これをGNU_STUBに +定義しているが,ターゲット依存の定義を入れたMakefile.configで上書きさ +れる場合もある.どのターゲットがどの実行環境に対応しているかは,ターゲッ +ト毎のマニュアルを参照すること. + +(D) カーネルライブラリのディレクトリ名の定義 + +KERNEL_LIBには,カーネルライブラリの置かれたディレクトリ名を定義する. +この定義は,通常はコンフィギュレーションスクリプトが行うが,事後に +KERNEL_LIBの定義を変更してもかまわない. + +(E) 共通コンパイルオプションの定義 + +全体に共通するコンパイルオプションの追加が必要な場合には,下の変数の定 +義を変更する.そのコンパイルオプションが,特定のターゲットで常に必要な +場合には,ターゲット依存の定義を入れたMakefile.configを修正すべきであ +る.追加の可能性のあるコンパイルオプションについては,「7.8 コンパイル +オプション」を参照のこと. + + CDEFS -D オプションを記述する. + INCLUDES -I オプションを記述する. + COPTS コンパイラに対するその他のオプションを記述する. + LDFLAGS リンカに対するオプションを記述する. + LIBS ライブラリリンクのためのオプションを記述する. + +(F) アプリケーションプログラムに関する定義 + +アプリケーションプログラムが一つのCソースファイル(*.c)のみで構成され +ている場合には,UNAMEにそのファイル名を定義すればよい.アプリケーショ +ンプログラムが複数のソースファイルで構成される場合には,UNAMEにそのア +プリケーション名を定義し,オブジェクトファイル名をUTASK_ASMOBJSおよび +UTASK_COBJSに列挙する.いずれの場合にも,コンフィギュレーションファイ +ルは,UNAMEに定義した名前に拡張子"cfg"を付加した名前とする. + +ソースファイルをコンパイルするのとは別のディレクトリに置く場合には, +UTASK_DIRSにそのディレクトリを追加する.また,アプリケーションのコンパ +イルに必要なコンパイルオプションや,アプリケーションがライブラリを必要 +とする場合には,UTASK_CFLAGSおよびUTASK_LIBS に定義する. + +(G) オブジェクトファイル名の定義 + +オブジェクトファイル名をOBJNAMEに定義する.デフォルトはjspである. + +(H) ターゲットファイルの定義 + +ロードモジュールの形式を指定する.具体的には,ELF形式の時は$(OBJFILE) +または$(OBJNAME).out(PARTNER-J環境の時),バイナリ形式の時は +$(OBJNAME).bin,モトローラ S形式の時は$(OBJNAME).srecを指定する. +$(OBJFILE) は,Cygwin環境でOBJEXTを"exe"に定義した時には$(OBJNAME).exe, +そうでない場合には$(OBJNAME)となる. + +(I) カーネルのコンフィギュレーションファイルの生成 + +ソフトウェア部品のコンフィギュレータを追加する場合には,この規則を修正 +することが必要である. + +7.8 コンパイルオプション + +JSPカーネルのコード中には,assertマクロが使われている.assertマクロは, +NDEBUGを定義することで,オブジェクトコード中から消すことができる.カー +ネルのデバッグが終了すれば,CDEFSに-DNDEBUGを指定してコンパイルした方 +が効率がよくなる. + +また,システムログ機能を取り外すためのOMIT_SYSLOGを用意している.詳し +くは,「4.8 システムログ機能の設定方法」を参照すること. + +7.9 コンフィギュレーションツールの使い方 + +以下では,cfgプログラムとchkプログラムのオプションについて説明する.こ +れらのプログラムによるコンフィギュレーション手順については,「2.10 静 +的APIとコンフィギュレータ」を参照すること. + +cfgプログラムとchkプログラムに共通のオプションは次の通り. + + -cpu <プロセッサ名> + ターゲットプロセッサ名を指定する. + + -system <システム名> + ターゲットシステム名を指定する. + + -h, --help + ヘルプメッセージを表示する. + + -v + 処理の途中結果を表示する. + + -le, --english + メッセージを英語で表示する(デフォルト). + + -lj, --japanese + メッセージを日本語で表示する. + +cfgプログラムに対するオプションは次の通り. + + -s, --source <ファイル名> + <ファイル名>で指定されたシステムコンフィギュレーションファイル + (C言語のプリプロセッサで処理したもの)を読み込む.<ファイル名> + を省略した場合は,システムコンフィギュレーションファイルを標準 + 入力から読み込む(オプション自身を省略してはならない). + + -c, --check + 静的APIのパラメータチェックに用いるファイルをkernel_chk.cに生 + 成する(デフォルトでは生成しない). + + -obj, --dump-object <ファイル名> + 静的APIの解析内容を含むオブジェクト定義ファイルを,<ファイル名> + で指定されたファイルに生成する.<ファイル名>を省略した場合は, + kernel_obj.datに生成する. + + -z, --nonzero + __EMTPY_LABELマクロの使用を抑止する. + + -ao=xxx + IDの割付順序を指定する.xxxに指定できる内容は次の通り. + + alphabetic 名称の昇順(Aに近いものほど小さな値) + fcfs 定義順の昇順 (先に宣言したものほど小さな値) + alphabetic,reverse 名称の降順 + fcfs,reverse 定義順の降順 + + -id=<ファイル名> + 自動ID割付け結果ヘッダファイル(kernel_id.h)の名称を変更する. + + -cfg=<ファイル名> + カーネル構成ファイル(kernel_cfg.c)の名称を変更する. + + -oproto + ハンドラやタスク本体などの関数のプロトタイプ宣言をカーネル構成 + ファイル(kernel_cfg.c)に出力する. + + -il + カーネル関連のヘッダをインクルードする際に,"ファイル名" ではなく + <ファイル名> を使用する. + + -1.3 + TOPPERS/JSPカーネル Release 1.3互換の形式で生成する. + (注意: -1.3で生成したファイルは1.4以降では使用できない) + + -iapi + カーネルコンフィギュレータが処理できない静的APIを無視する. + + -t + カーネルコンフィギュレータが処理できない静的APIを標準出力に出力 + する. + + -ext + 標準外の拡張機能の使用を許可する. + +chkプログラムに対するオプションは次の通り. + + -m, --module <モジュール記述> + チェックするロードモジュールを指定する.標準のchkプログラムは, + ロードモジュールのシンボルファイル(GNU BINUTILSのnmが出力する + 形式)とモトローラSレコードファイルを読み込んでパラメータチェッ + クを行なう.この場合,<モジュール記述>には,シンボルファイルと + Sレコードファイルの2つを","で区切って指定する. + + -cs, --script <ファイル名> + <ファイル名>で指定されたチェックファイルを用いてチェックする. + チェックファイルとは,cfgプログラムが生成したkernel_chk.cを, + コンパイラおよび utils/gencheck により加工したファイルのことで + ある.このオプションを省略した場合,いくつかのチェックが行われ + なくなる.オプションを指定した場合には,<ファイル名>は省略でき + ない. + + -obj, --load-object <ファイル名> + 静的APIの解析内容を含むオブジェクト定義ファイルを,<ファイル名> + で指定されたファイルから読み込む.<ファイル名>を省略した場合は, + kernel_obj.datから読み込む. + + -cl <エラーレベル> + エラー検出レベルを変更する.レベルはLAZY(重大なエラーのみ検 + 出),STANDARD(ITRON仕様の範囲のみで検出),TOPPERS(JSPカー + ネルの制限違反まで検出),RESTRICTED(すべてのエラーを検出)の + 4種類のうちから選択する(デフォルトはRESTRICTED). + +7.10 リンカスクリプトとメモリ領域 + +JSPカーネルのリンク方法は,ターゲット依存のリンカスクリプト(*.ld)に +記述されている.サンプルプログラムの Makefile では,ターゲット依存の定 +義を入れた Makefile.config の中で LDSCRIPT を定義すると,定義した名前 +のファイルをリンカスクリプトに用いる. + +JSPカーネル動作時には,以下のメモリ領域が必要になる. + +(a) コード領域 + +カーネルおよびアプリケーションのプログラムおよび定数データが置かれる領 +域.ROM上に置くことも可能である.先頭アドレスを,カーネルをリンクする +際の -Ttext オプションで指定する.サンプルプログラムの Makefile では, +ターゲット依存の定義を入れた Makefile.config の中で TEXT_START_ADDRESS +を定義すると,リンク時に -Ttext オプションが付加される. + +(b) データ領域 + +カーネルおよびアプリケーションの使用するデータ領域.固定的なデータ領域 +と,sbrk関数によって取られるヒープ領域からなる.カーネルはヒープ領域を +使用しない.先頭アドレスを,カーネルをリンクする際の -Tdata オプション +で指定する.サンプルプログラムの Makefile では,ターゲット依存の定義を +入れた Makefile.config の中で DATA_START_ADDRESS を定義すると,リンク +時に -Tdata オプションが付加される. + +(c) 非タスクコンテキスト用のスタック領域 + +割込みハンドラなどの非タスクコンテキストが使用するスタック領域.領域の +設定方法はターゲット依存であるが,通常は,ターゲットシステム依存のイン +クルードファイル(sys_config.h)でスタックの初期値を定義し,ターゲット +プロセッサ依存のスタートアップモジュール(start.S)中で初期化される. + +7.11 他のターゲットへのポーティング + +JSPカーネルを他のターゲットへポーティングするために必要な作業は,カー +ネル自身のポーティング,システムサービスのポーティング,開発環境の構築 +と標準の開発環境との差異の吸収などからなる.詳しくは,「JSPカーネル タ +ーゲット依存部 ポーティングガイド」(config.txt)を参照すること. + +7.12 カーネルの内部識別子のリネーム + +μITRON4.0仕様は,カーネルの内部識別子を_kernel_または_KERNEL_で始める +ことを要求している.ところが,カーネルのソースコード中で直接このような +識別子を用いると,識別子の長さが長くなり,可読性を損なう.そこでJSPカー +ネルでは,xxxxxというカーネルの内部識別子を_kernel_xxxxxにリネームする +仕組みを入れている. + +ところが,この仕組みにより,デバッグ作業が非効率になるケースが考えられ +る.具体的には,ソースコード中の識別子がオブジェクトコード中の識別子と +一致しないために,ソースコード中の変数を指定してその値を読んだり,関数 +を指定してそこにブレークポイントを置くといったことができない. + +この問題を解決するために,JSPカーネルでは,ソースコード中の必要な識別 +子をリネームするためのユーティリティ(utils/rename)を用意している. +renameユーティリティに,リネーム定義ファイル(xxx_rename.def)のプリ +フィックス(xxxの部分)と,リネームしたいファイルリストを与えると,リ +ネーム処理を行なう.例えば,kernelディレクトリのすべてのファイルに対し +て,カーネルの内部識別名をリネームするには,次のコマンドを用いればよい. + + % cd kernel + % ../utils/rename jsp * + + +8.その他 + +8.1 ウェブサイト + +TOPPERSプロジェクトおよびJSPカーネルのためのウェブサイトを,以下のURL +に用意している. + + http://www.toppers.jp/ + +配付キットの最新版は,このウェブサイトからダウンロードすることができる. +また,後述のメーリングリストのアーカイブなども,このウェブサイトで閲覧 +することができる. + +8.2 利用条件・著作権 + +JSPカーネルの利用条件は,各ファイルの先頭に明示されている(このドキュ +メントの先頭にもついている).著作権は,各ファイルの先頭に表示されてい +る著作権者が保有している. + +利用条件の (3) の (b) において,利用の形態をTOPPERSプロジェクトに報告 +する方法としては,JSPカーネルを利用した製品の名称と応用分野,製品化し +た会社名と業種等の情報を,以下のURLのページから報告するものとする. + + http://www.toppers.jp/report.html + +またその際に,JSPカーネルを使用してのコメントやご意見もいただけると幸 +いである. + +8.3 保証・サポート・適用性 + +JSPカーネルは無保証で提供されているものである.開発者は,その適用可能 +性も含めて,いかなる保証も行わない.また,サポートの約束もしていない. +質問がある場合は,後述のメーリングリストを利用していただけると幸いであ +る. + +8.4 メーリングリスト + +JSPカーネルのユーザに対する情報提供およびユーザ相互間の情報交換を容易 +にするために,TOPPERSユーザズメーリングリストを用意している.このメー +リングリストには,誰でも自由にメールを送付することができる.また,送付 +されたメールは,誰でも自由にウェブサイトで読むことができる.JSPカーネ +ルにバグや問題点を発見した場合には,このメーリングリストに報告して欲し +い. + +メーリングリストへのメールの送付先は次の通り. + + users@toppers.jp + +メーリングリストにバグや問題点などを報告する場合には,必要に応じて,次 +の情報を知らせて欲しい. + + ターゲットに関する情報 + ・ターゲットプロセッサの種類 + ・ターゲットボードの種類 + + ホストに関する情報 + ・OSのバージョン(サービスパックの適用状況も) + ・コンパイラなどの開発環境のバージョン(Cygwinのバージョンも) + +このメーリングリストへの登録を希望する場合は,まず, +users-ctl@toppers.jp 宛てに,本文に + + subscribe あなたの名前 + 例: subscribe Hiroaki Takada + +と書いたメールを送付する(上記のコマンド中には半角英文字のみを使うこと). +折り返し,登録確認のためのメールが送られてくるので,その指示に従って登 +録する. + +8.5 TOPPERSプロジェクトへの参加 + +TOPPERSプロジェクトでは,何からの形でプロジェクトに貢献されたい方,プ +ロジェクトで開発したソフトウェアをお使いの方,プロジェクトに興味をお持 +ちの方の参加を求めている.TOPPERSプロジェクトへの参加方法については, +TOPPERSプロジェクトのウェブサイトを参照すること. + +8.6 ミドルウェア用の Makefile + +サンプルディレクトリにある Makefilew.mware はJSPカーネルにミドルウェア +を組み合わせてコンパイルするための Makefile である.この Makefile から +インクルードするミドルウェア用の Makefile では,以下の変数を定義するこ +と. + +(1) MTASK_CFG +ミドルウェアのコンフィギュレーションファイル(ソース)を追加する. + +(2) MTASK_KERNEL_CFG +ミドルウェアのコンフィギュレータから出力され,JSPカーネル のシステムコ +ンフィギュレーションファイルにインクルードされるファイルを追加する. + +(3) MTASK_DIR +ミドルウェアのディレクトリを追加する. + +(4) MTASK_LCSRCS +ミドルウェアをライブラリ化するソースファイルを追加する. + +(5) MTASK_ASMOBJS +ミドルウェアのアセンブリ言語のオブジェクトファイルを追加する. + +(6) MTASK_CXXOBJS +ミドルウェアの C++ 言語のオブジェクトファイルを追加する. + +(7) MTASK_COBJS +ミドルウェアの C 言語のオブジェクトファイルを追加する. + +(8) MTASK_CFLAGS +ミドルウェアをコンパイルするときのオプションを指定する. + +(9) MTASK_LIBS +ミドルウェアのライブラリを追加する. + +(10) MAKE_MTASK +ライブラリ化したミドルウェアを指定する. + +9.リファレンス + +9.1 サービスコール一覧 + +(1) タスク管理機能 + + ER ercd = act_tsk(ID tskid); + ER ercd = iact_tsk(ID tskid); + ER_UINT actcnt = can_act(ID tskid); + void ext_tsk(); + ER ercd = ter_tsk(ID tskid); + ER ercd = chg_pri(ID tskid, PRI tskpri); + ER ercd = get_pri(ID tskid, PRI *p_tskpri); + +(2) タスク付属同期機能 + + ER ercd = slp_tsk(); + ER ercd = tslp_tsk(TMO tmout); + ER ercd = wup_tsk(ID tskid); + ER ercd = iwup_tsk(ID tskid); + ER_UINT wupcnt = can_wup(ID tskid); + ER ercd = rel_wai(ID tskid); + ER ercd = irel_wai(ID tskid); + ER ercd = sus_tsk(ID tskid); + ER ercd = rsm_tsk(ID tskid); + ER ercd = frsm_tsk(ID tskid); + ER ercd = dly_tsk(RELTIM dlytim); + +(3) タスク例外処理機能 + + ER ercd = ras_tex(ID tskid, TEXPTN rasptn); + ER ercd = iras_tex(ID tskid, TEXPTN rasptn); + ER ercd = dis_tex(); + ER ercd = ena_tex(); + BOOL state = sns_tex(); + +(4) 同期・通信機能 + + ER ercd = sig_sem(ID semid); + ER ercd = isig_sem(ID semid); + ER ercd = wai_sem(ID semid); + ER ercd = pol_sem(ID semid); + ER ercd = twai_sem(ID semid, TMO tmout); + + ER ercd = set_flg(ID flgid, FLGPTN setptn); + ER ercd = iset_flg(ID flgid, FLGPTN setptn); + ER ercd = clr_flg(ID flgid, FLGPTN clrptn); + ER ercd = wai_flg(ID flgid, FLGPTN waiptn, + MODE wfmode, FLGPTN *p_flgptn); + ER ercd = pol_flg(ID flgid, FLGPTN waiptn, + MODE wfmode, FLGPTN *p_flgptn); + ER ercd = twai_flg(ID flgid, FLGPTN waiptn, + MODE wfmode, FLGPTN *p_flgptn, TMO tmout); + + ER ercd = snd_dtq(ID dtqid, VP_INT data); + ER ercd = psnd_dtq(ID dtqid, VP_INT data); + ER ercd = ipsnd_dtq(ID dtqid, VP_INT data); + ER ercd = tsnd_dtq(ID dtqid, VP_INT data, TMO tmout); + ER ercd = fsnd_dtq(ID dtqid, VP_INT data); + ER ercd = ifsnd_dtq(ID dtqid, VP_INT data); + ER ercd = rcv_dtq(ID dtqid, VP_INT *p_data); + ER ercd = prcv_dtq(ID dtqid, VP_INT *p_data); + ER ercd = trcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout); + + ER ercd = snd_mbx(ID mbxid, T_MSG *pk_msg); + ER ercd = rcv_mbx(ID mbxid, T_MSG **ppk_msg); + ER ercd = prcv_mbx(ID mbxid, T_MSG **ppk_msg); + ER ercd = trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout); + +(5) メモリプール管理機能 + + ER ercd = get_mpf(ID mpfid, VP *p_blk); + ER ercd = pget_mpf(ID mpfid, VP *p_blk); + ER ercd = tget_mpf(ID mpfid, VP *p_blk, TMO tmout); + ER ercd = rel_mpf(ID mpfid, VP blk); + +(6) 時間管理機能 + + ER ercd = set_tim(const SYSTIM *p_systim); + ER ercd = get_tim(SYSTIM *p_systim); + ER ercd = isig_tim(); + + ER ercd = sta_cyc(ID cycid); + ER ercd = stp_cyc(ID cycid); + +(7) システム状態管理機能 + + ER ercd = rot_rdq(PRI tskpri); + ER ercd = irot_rdq(PRI tskpri); + ER ercd = get_tid(ID *p_tskid); + ER ercd = iget_tid(ID *p_tskid); + ER ercd = loc_cpu(); + ER ercd = iloc_cpu(); + ER ercd = unl_cpu(); + ER ercd = iunl_cpu(); + ER ercd = dis_dsp(); + ER ercd = ena_dsp(); + BOOL state = sns_ctx(); + BOOL state = sns_loc(); + BOOL state = sns_dsp(); + BOOL state = sns_dpn(); + BOOL state = vsns_ini(); + +(8) 割込み管理機能 + + ER ercd = dis_int(INTNO intno); + ER ercd = ena_int(INTNO intno); + ER ercd = chg_ixx(IXXXX ixxxx); + ER ercd = get_ixx(IXXXX *p_ixxxx); + ※ xx,xxxx,XXXX はターゲット毎に定められる. + +(9) CPU例外発生時のシステム状態参照 + + BOOL state = vxsns_ctx(VP p_excinf); + BOOL state = vxsns_loc(VP p_excinf); + BOOL state = vxsns_dsp(VP p_excinf); + BOOL state = vxsns_dpn(VP p_excinf); + BOOL state = vxsns_tex(VP p_excinf); + +(10) 性能評価用システム時刻参照機能 + + ER ercd = vxget_tim(SYSUTIM *p_sysutim); + +9.2 静的API一覧 + + CRE_TSK(tskid, { ATR tskatr, VP_INT exinf, FP task, + PRI itskpri, SIZE stksz, VP stk }); + DEF_TEX(ID tskid, { ATR texatr, FP texrtn }); + CRE_SEM(ID semid, { ATR sematr, UINT isemcnt, UINT maxsem }); + CRE_FLG(ID flgid, { ATR flgatr, FLGPTN iflgptn }); + CRE_DTQ(ID dtqid, { ATR dtqatr, UINT dtqcnt, VP dtq }); + CRE_MBX(ID mbxid, { ATR mbxatr, PRI maxmpri, VP mprihd }); + CRE_MPF (ID mpfid, { ATR mpfatr, UINT blkcnt, UINT blksz, VP mpf } ) ; + CRE_CYC (ID cycid, { ATR cycatr, VP_INT exinf, FP cychdr, + RELTIM cyctim, RELTIM cycphs } ) ; + DEF_INH(INHNO inhno, { ATR inhatr, FP inthdr }); + DEF_EXC(EXCNO excno, { ATR excatr, FP exchdr }); + ATT_INI({ ATR iniatr, VP_INT exinf, FP inirtn }); + VATT_TER({ ATR teratr, VP_INT exinf, FP terrtn }); + +9.3 メインエラーコード一覧(JSPカーネルが返すもののみ) + + E_PAR -17 パラメターエラー + E_ID -18 不正ID番号 + E_CTX -25 コンテキストエラー + E_ILUSE -28 サービスコール不正使用 + E_OBJ -41 オブジェクト状態エラー + E_QOVR -43 キューイングオーバーフロー + E_RLWAI -49 待ち状態の強制解除 + E_TMOUT -50 ポーリング失敗またはタイムアウト + +9.4 バージョン履歴 + + 2000å¹´11月15日 Release 1.0 最初のリリース + 2000å¹´11月24日 Release 1.0 (PL=1) 問題点の修正 + 2001å¹´2月24日 Release 1.1 V850の追加など + 2001å¹´5月9日 Release 1.1 (PL=1) SH1の追加など + 2001å¹´11月15日 Release 1.2 SH4,H8,ARM7TDMIの追加など + 2002å¹´4月15日 Release 1.3 M32R,MicroBlaze,TMS320C54x, + i386,H8Sの追加など + 2003å¹´12月25日 Release 1.4 多数の改良 + 2004å¹´10月14日 Release 1.4 (PL=1) SH2,M16C,SC33,PowerPC32, + Nios2の追加など + 2005å¹´11月28日 Release 1.4 (PL=2) M32C-Renesas, H8-Renesas, + H8S-Renesas, V850 + 2007å¹´6月1日 Release 1.4 (PL=3) 問題点の修正,東芝TLCS900の追加など + +以上 diff --git a/uzume_prototype/kernel/include/itron.h b/uzume_prototype/kernel/include/itron.h new file mode 100644 index 0000000..7c47824 --- /dev/null +++ b/uzume_prototype/kernel/include/itron.h @@ -0,0 +1,237 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2004 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: itron.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * ITRON仕様共通規定のデータ型・定数・マクロ + * + * このファイルには,スタンダードプロファイルには必要ない定義も含んで + * いる.データ型の定義は,スタンダードプロファイルを満たすちょうどの + * 長さにはしていない. + * + * アセンブリ言語のソースファイルやシステムコンフィギュレーションファ + * イルからこのファイルをインクルードする時は,_MACRO_ONLY を定義して + * おくことで,マクロ定義以外の記述を除くことができる. + * + * このインクルードファイルは,kernel.h と sil.h でインクルードされる. + * また,ITRON仕様共通規定に準拠するソフトウェア部品のインクルードファ + * イルは,このファイルを直接インクルードしてもよい.この例外を除いて, + * 他のファイルから直接インクルードされることはない. + * + * このファイルをインクルードする前に,t_stddef.h をインクルードして + * おくことが必要である. + */ + +#ifndef _ITRON_H_ +#define _ITRON_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * 開発環境に依存する定義 + */ +#include + +/* + * 開発環境の標準インクルードファイル(NULL と size_t の定義が必要) + * + * C++/EC++ では,標準仕様上は stddef.h がサポートされているとは限らな + * いが,ほとんどの処理系でサポートされている. + */ +#ifndef _MACRO_ONLY +#include +#endif /* _MACRO_ONLY */ + +/* + * コンパイラ依存のデータ型のデフォルト定義 + */ +#ifndef _bool_ +#define _bool_ int /* ブール型 */ +#endif /* _bool_ */ + +/* + * ITRON仕様共通データ型 + */ +#ifndef _MACRO_ONLY + +#ifdef _int8_ +typedef signed _int8_ B; /* 符号付き8ビット整数 */ +typedef unsigned _int8_ UB; /* 符号無し8ビット整数 */ +typedef _int8_ VB; /* 型が定まらない8ビットの値 */ +#endif /* _int8_ */ + +#ifdef _int16_ +typedef signed _int16_ H; /* 符号付き16ビット整数 */ +typedef unsigned _int16_ UH; /* 符号無し16ビット整数 */ +typedef _int16_ VH; /* 型が定まらない16ビットの値 */ +#endif /* _int16_ */ + +typedef signed _int32_ W; /* 符号付き32ビット整数 */ +typedef unsigned _int32_ UW; /* 符号無し32ビット整数 */ +typedef _int32_ VW; /* 型が定まらない32ビットの値 */ + +#ifdef _int64_ +typedef signed _int64_ D; /* 符号付き64ビット整数 */ +typedef unsigned _int64_ UD; /* 符号無し64ビット整数 */ +typedef _int64_ VD; /* 型が定まらない64ビットの値 */ +#endif /* _int64_ */ + +typedef void *VP; /* 型が定まらないものへのポインタ */ +typedef void (*FP)(); /* プログラムの起動番地(ポインタ) */ + +typedef signed int INT; /* 自然なサイズの符号付き整数 */ +typedef unsigned int UINT; /* 自然なサイズの符号無し整数 */ + +typedef _bool_ BOOL; /* 真偽値 */ + +typedef INT FN; /* 機能コード */ +typedef INT ER; /* エラーコード */ +typedef INT ID; /* オブジェクトのID番号 */ +typedef UINT ATR; /* オブジェクトの属性 */ +typedef UINT STAT; /* オブジェクトの状態 */ +typedef UINT MODE; /* サービスコールの動作モード */ +typedef INT PRI; /* 優先度 */ +typedef size_t SIZE; /* メモリ領域のサイズ */ + +typedef INT TMO; /* タイムアウト指定 */ +typedef UINT RELTIM; /* 相対時間 */ +typedef UW SYSTIM; /* システム時刻 */ + +#ifdef _vp_int_ +typedef _vp_int_ VP_INT; /* VP または INT */ +#else /* _vp_int_ */ +typedef VP VP_INT; /* VP または INT */ +#endif /* _vp_int_ */ + +typedef INT ER_BOOL; /* ER または BOOL */ +typedef INT ER_ID; /* ER または ID */ +typedef INT ER_UINT; /* ER または UINT */ + +#endif /* _MACRO_ONLY */ + +/* + * ITRON仕様共通定数 + */ + +/* + * 一般 + * + * _MACRO_ONLY の時には,NULL を定義しない.これは,_MACRO_ONLY の時 + * はstddef.h をインクルードしないため,そうでない時と NULL の定義が + * 食い違う可能性があるためである.また,システムコンフィギュレーショ + * ンファイルを処理する場合には NULL を定義してはならないため,その点 + * からも定義しない方が都合がよい. + */ +#ifndef _MACRO_ONLY +#ifndef NULL /* stddef.h に含まれているはず */ +#define NULL 0 /* 無効ポインタ */ +#endif /* NULL */ +#endif /* _MACRO_ONLY */ + +#define TRUE 1 /* 真 */ +#define FALSE 0 /* 偽 */ +#define E_OK 0 /* 正常終了 */ + +/* + * エラーコード + */ +#define E_SYS (-5) /* システムエラー */ +#define E_NOSPT (-9) /* 未サポート機能 */ +#define E_RSFN (-10) /* 予約機能コード */ +#define E_RSATR (-11) /* 予約属性 */ +#define E_PAR (-17) /* パラメータエラー */ +#define E_ID (-18) /* 不正ID番号 */ +#define E_CTX (-25) /* コンテキストエラー */ +#define E_MACV (-26) /* メモリアクセス違反 */ +#define E_OACV (-27) /* オブジェクトアクセス違反 */ +#define E_ILUSE (-28) /* サービスコール不正使用 */ +#define E_NOMEM (-33) /* メモリ不足 */ +#define E_NOID (-34) /* ID番号不足 */ +#define E_OBJ (-41) /* オブジェクト状態エラー */ +#define E_NOEXS (-42) /* オブジェクト未生成 */ +#define E_QOVR (-43) /* キューイングオーバーフロー */ +#define E_RLWAI (-49) /* 待ち状態の強制解除 */ +#define E_TMOUT (-50) /* ポーリング失敗またはタイムアウト */ +#define E_DLT (-51) /* 待ちオブジェクトの削除 */ +#define E_CLS (-52) /* 待ちオブジェクトの状態変化 */ +#define E_WBLK (-57) /* ノンブロッキング受付け */ +#define E_BOVR (-58) /* バッファオーバーフロー */ + +/* + * オブジェクト属性 + */ +#define TA_NULL 0u /* オブジェクト属性を指定しない */ + +/* + * タイムアウト指定 + */ +#define TMO_POL 0 /* ポーリング */ +#define TMO_FEVR (-1) /* 永久待ち */ +#define TMO_NBLK (-2) /* ノンブロッキング */ + +/* + * ITRON仕様共通マクロ + */ + +/* + * エラーコード生成・分解マクロ + * + * ANSI C言語の規格では,右シフト演算子(>>)が符号拡張されることを保 + * 証していないため,SERCDマクロの定義を単に ((ercd) >> 8) とすると, + * 右シフト演算子を符号拡張しないコンパイラでは,SERCD の返値が正の値 + * になってしまう. + */ +#define ERCD(mercd,sercd) (((sercd) << 8) | ((mercd) & 0xff)) + +#ifdef _int8_ +#define MERCD(ercd) ((ER)((B)(ercd))) +#define SERCD(ercd) ((ER)((B)((ercd) >> 8))) +#else /* _int8_ */ +#define MERCD(ercd) (((ercd) & 0x80) == 0 ? ((ercd) & 0xff) \ + : ((ercd) | ~0xff)) +#define SERCD(ercd) ((~((~0) >> 8)) | ((ercd) >> 8)) +#endif /* _int8_ */ + +#ifdef __cplusplus +} +#endif + +#endif /* _ITRON_H_ */ diff --git a/uzume_prototype/kernel/include/kernel.h b/uzume_prototype/kernel/include/kernel.h new file mode 100644 index 0000000..f30f621 --- /dev/null +++ b/uzume_prototype/kernel/include/kernel.h @@ -0,0 +1,309 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2004 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: kernel.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * μITRON4.0仕様標準インクルードファイル + * + * このファイルでは,スタンダードプロファイルで必要なものと,JSPカー + * ネル独自の拡張機能で必要なものだけを定義している.データ型の定義は, + * スタンダードプロファイルを満たすちょうどの長さにはしていない. + * + * アセンブリ言語のソースファイルやシステムコンフィギュレーションファ + * イルからこのファイルをインクルードする時は,_MACRO_ONLY を定義して + * おくことで,マクロ定義以外の記述を除くことができる. + * + * このインクルードファイルは,標準インクルードファイル(t_services.h + * と jsp_kernel.h)でインクルードされる.また,他の ITRON仕様OS から + * ソフトウェアをポーティングする場合などには,このファイルを直接イン + * クルードしてもよい.この例外を除いて,他のファイルから直接インクルー + * ドされることはない. + * + * この中でインクルードしているファイルを除いて,他のインクルードファ + * イルに依存していない. + */ + +#ifndef _KERNEL_H_ +#define _KERNEL_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * カーネル・アプリケーション 共通インクルードファイル + */ +#include + +/* + * ITRON仕様共通規定のデータ型・定数・マクロ + */ +#include + +/* + * システムやプロセッサに依存する定義 + */ +#include +#include + +/* + * システムログサービスのための定義 + */ +#include + +/* + * 補助マクロ + */ +#define TROUND_VP(sz) (((sz) + sizeof(VP) - 1) & ~(sizeof(VP) - 1)) +#define TCOUNT_VP(sz) (((sz) + sizeof(VP) - 1) / sizeof(VP)) + +/* + * データ型の定義 + */ +#ifndef _MACRO_ONLY + +typedef UINT TEXPTN; /* タスク例外要因のビットパターン */ +typedef UINT FLGPTN; /* イベントフラグのビットパターン */ + +typedef struct t_msg { /* メールボックスのメッセージヘッダ */ + struct t_msg *next; +} T_MSG; + +typedef struct t_msg_pri { /* 優先度付きメッセージヘッダ */ + T_MSG msgque; /* メッセージヘッダ */ + PRI msgpri; /* メッセージ優先度 */ +} T_MSG_PRI; + +#endif /* _MACRO_ONLY */ + +/* + * サービスコールの宣言 + */ +#ifndef _MACRO_ONLY + +/* + * タスク管理機能 + */ +extern ER act_tsk(ID tskid) throw(); +extern ER iact_tsk(ID tskid) throw(); +extern ER_UINT can_act(ID tskid) throw(); +extern void ext_tsk(void) throw(); +extern ER ter_tsk(ID tskid) throw(); +extern ER chg_pri(ID tskid, PRI tskpri) throw(); +extern ER get_pri(ID tskid, PRI *p_tskpri) throw(); + +/* + * タスク付属同期機能 + */ +extern ER slp_tsk(void) throw(); +extern ER tslp_tsk(TMO tmout) throw(); +extern ER wup_tsk(ID tskid) throw(); +extern ER iwup_tsk(ID tskid) throw(); +extern ER_UINT can_wup(ID tskid) throw(); +extern ER rel_wai(ID tskid) throw(); +extern ER irel_wai(ID tskid) throw(); +extern ER sus_tsk(ID tskid) throw(); +extern ER rsm_tsk(ID tskid) throw(); +extern ER frsm_tsk(ID tskid) throw(); +extern ER dly_tsk(RELTIM dlytim) throw(); + +/* + * タスク例外処理機能 + */ +extern ER ras_tex(ID tskid, TEXPTN rasptn) throw(); +extern ER iras_tex(ID tskid, TEXPTN rasptn) throw(); +extern ER dis_tex(void) throw(); +extern ER ena_tex(void) throw(); +extern BOOL sns_tex(void) throw(); + +/* + * 同期・通信機能 + */ +extern ER sig_sem(ID semid) throw(); +extern ER isig_sem(ID semid) throw(); +extern ER wai_sem(ID semid) throw(); +extern ER pol_sem(ID semid) throw(); +extern ER twai_sem(ID semid, TMO tmout) throw(); + +extern ER set_flg(ID flgid, FLGPTN setptn) throw(); +extern ER iset_flg(ID flgid, FLGPTN setptn) throw(); +extern ER clr_flg(ID flgid, FLGPTN clrptn) throw(); +extern ER wai_flg(ID flgid, FLGPTN waiptn, + MODE wfmode, FLGPTN *p_flgptn) throw(); +extern ER pol_flg(ID flgid, FLGPTN waiptn, + MODE wfmode, FLGPTN *p_flgptn) throw(); +extern ER twai_flg(ID flgid, FLGPTN waiptn, + MODE wfmode, FLGPTN *p_flgptn, TMO tmout) throw(); + +extern ER snd_dtq(ID dtqid, VP_INT data) throw(); +extern ER psnd_dtq(ID dtqid, VP_INT data) throw(); +extern ER ipsnd_dtq(ID dtqid, VP_INT data) throw(); +extern ER tsnd_dtq(ID dtqid, VP_INT data, TMO tmout) throw(); +extern ER fsnd_dtq(ID dtqid, VP_INT data) throw(); +extern ER ifsnd_dtq(ID dtqid, VP_INT data) throw(); +extern ER rcv_dtq(ID dtqid, VP_INT *p_data) throw(); +extern ER prcv_dtq(ID dtqid, VP_INT *p_data) throw(); +extern ER trcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout) throw(); + +extern ER snd_mbx(ID mbxid, T_MSG *pk_msg) throw(); +extern ER rcv_mbx(ID mbxid, T_MSG **ppk_msg) throw(); +extern ER prcv_mbx(ID mbxid, T_MSG **ppk_msg) throw(); +extern ER trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout) throw(); + +/* + * メモリプール管理機能 + */ +extern ER get_mpf(ID mpfid, VP *p_blk) throw(); +extern ER pget_mpf(ID mpfid, VP *p_blk) throw(); +extern ER tget_mpf(ID mpfid, VP *p_blk, TMO tmout) throw(); +extern ER rel_mpf(ID mpfid, VP blk) throw(); + +/* + * 時間管理機能 + */ +extern ER set_tim(const SYSTIM *p_systim) throw(); +extern ER get_tim(SYSTIM *p_systim) throw(); +extern ER isig_tim(void) throw(); + +extern ER sta_cyc(ID cycid) throw(); +extern ER stp_cyc(ID cycid) throw(); + +/* + * システム状態管理機能 + */ +extern ER rot_rdq(PRI tskpri) throw(); +extern ER irot_rdq(PRI tskpri) throw(); +extern ER get_tid(ID *p_tskid) throw(); +extern ER iget_tid(ID *p_tskid) throw(); +extern ER loc_cpu(void) throw(); +extern ER iloc_cpu(void) throw(); +extern ER unl_cpu(void) throw(); +extern ER iunl_cpu(void) throw(); +extern ER dis_dsp(void) throw(); +extern ER ena_dsp(void) throw(); +extern BOOL sns_ctx(void) throw(); +extern BOOL sns_loc(void) throw(); +extern BOOL sns_dsp(void) throw(); +extern BOOL sns_dpn(void) throw(); + +/* + * 実装独自サービスコール + */ +extern BOOL vxsns_ctx(VP p_excinf) throw(); +extern BOOL vxsns_loc(VP p_excinf) throw(); +extern BOOL vxsns_dsp(VP p_excinf) throw(); +extern BOOL vxsns_dpn(VP p_excinf) throw(); +extern BOOL vxsns_tex(VP p_excinf) throw(); +extern BOOL vsns_ini(void) throw(); + +#endif /* _MACRO_ONLY */ + +/* + * オブジェクト属性の定義 + */ +#define TA_HLNG 0x00u /* 高級言語用インタフェース */ +#define TA_ASM 0x01u /* アセンブリ言語用インタフェース */ + +#define TA_TFIFO 0x00u /* タスクの待ち行列をFIFO順に */ +#define TA_TPRI 0x01u /* タスクの待ち行列を優先度順に */ + +#define TA_MFIFO 0x00u /* メッセージキューをFIFO順に */ +#define TA_MPRI 0x02u /* メッセージキューを優先度順に */ + +#define TA_ACT 0x02u /* タスクを起動された状態で生成 */ + +#define TA_WSGL 0x00u /* イベントフラグの待ちタスクを1つに */ +#define TA_CLR 0x04u /* イベントフラグのクリア指定 */ + +#define TA_STA 0x02u /* 周期ハンドラを動作状態で生成 */ + +/* + * サービスコールの動作モードの定義 + */ +#define TWF_ANDW 0x00u /* イベントフラグのAND待ち */ +#define TWF_ORW 0x01u /* イベントフラグのOR待ち */ + +/* + * その他の定数の定義 + */ +#define TSK_SELF 0 /* 自タスク指定 */ +#define TSK_NONE 0 /* 該当するタスクがない */ +#define TPRI_SELF 0 /* 自タスクのベース優先度の指定 */ +#define TPRI_INI 0 /* タスクの起動時優先度の指定 */ + +/* + * 構成定数とマクロ + */ + +/* + * 優先度の範囲 + */ +#define TMIN_TPRI 1 /* タスク優先度の最小値 */ +#define TMAX_TPRI 16 /* タスク優先度の最大値 */ +#define TMIN_MPRI 1 /* メッセージ優先度の最小値 */ +#define TMAX_MPRI 16 /* メッセージ優先度の最大値 */ + +/* + * バージョン情報 + */ +#define TKERNEL_MAKER 0x0118u /* カーネルのメーカーコード */ +#define TKERNEL_PRID 0x0001u /* カーネルの識別番号 */ +#define TKERNEL_SPVER 0x5402u /* ITRON仕様のバージョン番号 */ +#define TKERNEL_PRVER 0x1043u /* カーネルのバージョン番号 */ + +/* + * キューイング/ネスト回数の最大値 + */ +#define TMAX_ACTCNT 1 /* 起動要求キューイング数の最大値 */ +#define TMAX_WUPCNT 1 /* 起床要求キューイング数の最大値 */ +#define TMAX_SUSCNT 1 /* 強制待ち要求ネスト数の最大値 */ + +/* + * ビットパターンのビット数 + */ +#define TBIT_TEXPTN (sizeof(TEXPTN) * CHAR_BIT) + /* タスク例外要因のビット数 */ +#define TBIT_FLGPTN (sizeof(FLGPTN) * CHAR_BIT) + /* イベントフラグのビット数 */ + +#ifdef __cplusplus +} +#endif + +#endif /* _KERNEL_H_ */ diff --git a/uzume_prototype/kernel/include/kernel_cfg.h b/uzume_prototype/kernel/include/kernel_cfg.h new file mode 100644 index 0000000..f54313d --- /dev/null +++ b/uzume_prototype/kernel/include/kernel_cfg.h @@ -0,0 +1,101 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: kernel_cfg.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * kernel_cfg.c 用インクルードファイル + */ + +#ifndef _KERNEL_CFG_H_ +#define _KERNEL_CFG_H_ + +/* + * カーネル標準インクルードファイル + */ +#include <../kernel/jsp_kernel.h> + +/* + * カーネルの各インクルードファイル + */ +#include <../kernel/task.h> +#include <../kernel/semaphore.h> +#include <../kernel/eventflag.h> +#include <../kernel/dataqueue.h> +#include <../kernel/mailbox.h> +#include <../kernel/mempfix.h> +#include <../kernel/cyclic.h> +#include <../kernel/interrupt.h> +#include <../kernel/exception.h> +#include <../kernel/time_event.h> + +/* + * カーネルのワークエリアを定義するためのデータ型 + * + * スタック領域と固定長メモリプール領域を,VP型のサイズよりも大きい単 + * 位でアラインさせる必要がある場合には,__STK_UNIT と__MPF_UNIT を, + * それぞれアラインさせる単位のデータ型に定義する. + * + * 以下の定義は,__STK_UNIT および __MPF_UNIT のサイズが 2の巾乗であ + * ることを仮定している. + */ + +#ifndef __STK_UNIT +typedef VP __STK_UNIT; +#endif /* __STK_UNIT */ + +#ifndef __MPF_UNIT +typedef VP __MPF_UNIT; +#endif /* __MPF_UNIT */ + +#define __TROUND_STK_UNIT(sz) \ + (((sz) + sizeof(__STK_UNIT) - 1) & ~(sizeof(__STK_UNIT) - 1)) +#define __TCOUNT_STK_UNIT(sz) \ + (((sz) + sizeof(__STK_UNIT) - 1) / sizeof(__STK_UNIT)) + +#define __TROUND_MPF_UNIT(sz) \ + (((sz) + sizeof(__MPF_UNIT) - 1) & ~(sizeof(__MPF_UNIT) - 1)) +#define __TCOUNT_MPF_UNIT(sz) \ + (((sz) + sizeof(__MPF_UNIT) - 1) / sizeof(__MPF_UNIT)) + +/* + * リネームしたシンボルを元に戻すためのインクルードファイル + */ +#include <../kernel/jsp_unrename.h> +#include +#include + +#endif /* _KERNEL_CFG_H_ */ diff --git a/uzume_prototype/kernel/include/kernel_debug.h b/uzume_prototype/kernel/include/kernel_debug.h new file mode 100644 index 0000000..78b9fd5 --- /dev/null +++ b/uzume_prototype/kernel/include/kernel_debug.h @@ -0,0 +1,257 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: kernel_debug.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * μITRON4.0仕様 デバッグ用インクルードファイル + * + * このファイルは,μITRON4.0仕様のスタンダードプロファイル外の定義と, + * ITRONデバッギングインタフェース仕様に含まれる定義の中で,JSPカーネ + * ルのデバッグサポート機能に必要な定義を含む. + */ + +#ifndef _KERNEL_DEBUG_H_ +#define _KERNEL_DEBUG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * タスク状態の定義 + */ +#define TTS_RUN 0x01u /* 実行状態 */ +#define TTS_RDY 0x02u /* 実行可能状態 */ +#define TTS_WAI 0x04u /* 待ち状態 */ +#define TTS_SUS 0x08u /* 強制待ち状態 */ +#define TTS_WAS (TTS_WAI|TTS_SUS) /* 二重待ち状態 */ +#define TTS_DMT 0x10u /* 休止状態 */ + +#define TTW_SLP 0x0001u /* 起床待ち状態 */ +#define TTW_DLY 0x0002u /* 時間経過待ち状態 */ +#define TTW_SEM 0x0004u /* セマフォ資源の獲得待ち状態 */ +#define TTW_FLG 0x0008u /* イベントフラグ待ち状態 */ +#define TTW_SDTQ 0x0010u /* データキューへの送信待ち状態 */ +#define TTW_RDTQ 0x0020u /* データキューからの受信待ち状態 */ +#define TTW_MBX 0x0040u /* メールボックスからの受信待ち状態 */ +#define TTW_MTX 0x0080u /* ミューテックスのロック待ち状態 */ +#define TTW_SMBF 0x0100u /* メッセージバッファへの送信待ち */ +#define TTW_RMBF 0x0200u /* メッセージバッファからの受信待ち */ +#define TTW_CAL 0x0400u /* ランデブの呼出し待ち状態 */ +#define TTW_ACP 0x0800u /* ランデブの受付待ち状態 */ +#define TTW_RDV 0x1000u /* ランデブの終了待ち状態 */ +#define TTW_MPF 0x2000u /* 固定長メモリブロックの獲得待ち */ +#define TTW_MPL 0x4000u /* 可変長メモリブロックの獲得待ち */ + +/* + * 機能コードの定義 + */ +#define TFN_CRE_TSK (-5) +#define TFN_DEL_TSK (-6) +#define TFN_ACT_TSK (-7) +#define TFN_CAN_ACT (-8) +#define TFN_STA_TSK (-9) +#define TFN_EXT_TSK (-10) +#define TFN_EXD_TSK (-11) +#define TFN_TER_TSK (-12) +#define TFN_CHG_PRI (-13) +#define TFN_GET_PRI (-14) +#define TFN_REF_TSK (-15) +#define TFN_REF_TST (-16) + +#define TFN_SLP_TSK (-17) +#define TFN_TSLP_TSK (-18) +#define TFN_WUP_TSK (-19) +#define TFN_CAN_WUP (-20) +#define TFN_REL_WAI (-21) +#define TFN_SUS_TSK (-22) +#define TFN_RSM_TSK (-23) +#define TFN_FRSM_TSK (-24) +#define TFN_DLY_TSK (-25) + +#define TFN_DEF_TEX (-27) +#define TFN_RAS_TEX (-28) +#define TFN_DIS_TEX (-29) +#define TFN_ENA_TEX (-30) +#define TFN_SNS_TEX (-31) +#define TFN_REF_TEX (-32) + +#define TFN_CRE_SEM (-33) +#define TFN_DEL_SEM (-34) +#define TFN_SIG_SEM (-35) +#define TFN_WAI_SEM (-37) +#define TFN_POL_SEM (-38) +#define TFN_TWAI_SEM (-39) +#define TFN_REF_SEM (-40) + +#define TFN_CRE_FLG (-41) +#define TFN_DEL_FLG (-42) +#define TFN_SET_FLG (-43) +#define TFN_CLR_FLG (-44) +#define TFN_WAI_FLG (-45) +#define TFN_POL_FLG (-46) +#define TFN_TWAI_FLG (-47) +#define TFN_REF_FLG (-48) + +#define TFN_CRE_DTQ (-49) +#define TFN_DEL_DTQ (-50) +#define TFN_SND_DTQ (-53) +#define TFN_PSND_DTQ (-54) +#define TFN_TSND_DTQ (-55) +#define TFN_FSND_DTQ (-56) +#define TFN_RCV_DTQ (-57) +#define TFN_PRCV_DTQ (-58) +#define TFN_TRCV_DTQ (-59) +#define TFN_REF_DTQ (-60) + +#define TFN_CRE_MBX (-61) +#define TFN_DEL_MBX (-62) +#define TFN_SND_MBX (-63) +#define TFN_RCV_MBX (-65) +#define TFN_PRCV_MBX (-66) +#define TFN_TRCV_MBX (-67) +#define TFN_REF_MBX (-68) + +#define TFN_CRE_MPF (-69) +#define TFN_DEL_MPF (-70) +#define TFN_REL_MPF (-71) +#define TFN_GET_MPF (-73) +#define TFN_PGET_MPF (-74) +#define TFN_TGET_MPF (-75) +#define TFN_REF_MPF (-76) + +#define TFN_SET_TIM (-77) +#define TFN_GET_TIM (-78) + +#define TFN_CRE_CYC (-79) +#define TFN_DEL_CYC (-80) +#define TFN_STA_CYC (-81) +#define TFN_STP_CYC (-82) +#define TFN_REF_CYC (-83) + +#define TFN_ROT_RDQ (-85) +#define TFN_GET_TID (-86) +#define TFN_LOC_CPU (-89) +#define TFN_UNL_CPU (-90) +#define TFN_DIS_DSP (-91) +#define TFN_ENA_DSP (-92) +#define TFN_SNS_CTX (-93) +#define TFN_SNS_LOC (-94) +#define TFN_SNS_DSP (-95) +#define TFN_SNS_DPN (-96) +#define TFN_REF_SYS (-97) + +#define TFN_DEF_INH (-101) +#define TFN_CRE_ISR (-102) +#define TFN_DEL_ISR (-103) +#define TFN_REF_ISR (-104) +#define TFN_DIS_INT (-105) +#define TFN_ENA_INT (-106) +#define TFN_CHG_IXX (-107) +#define TFN_GET_IXX (-108) + +#define TFN_DEF_SVC (-109) +#define TFN_DEF_EXC (-110) +#define TFN_REF_CFG (-111) +#define TFN_REF_VER (-112) + +#define TFN_IACT_TSK (-113) +#define TFN_IWUP_TSK (-114) +#define TFN_IREL_WAI (-115) +#define TFN_IRAS_TEX (-116) +#define TFN_ISIG_SEM (-117) +#define TFN_ISET_FLG (-118) +#define TFN_IPSND_DTQ (-119) +#define TFN_IFSND_DTQ (-120) +#define TFN_IROT_RDQ (-121) +#define TFN_IGET_TID (-122) +#define TFN_ILOC_CPU (-123) +#define TFN_IUNL_CPU (-124) +#define TFN_ISIG_TIM (-125) + +#define TFN_CRE_MTX (-129) +#define TFN_DEL_MTX (-130) +#define TFN_UNL_MTX (-131) +#define TFN_LOC_MTX (-133) +#define TFN_PLOC_MTX (-134) +#define TFN_TLOC_MTX (-135) +#define TFN_REF_MTX (-136) + +#define TFN_CRE_MBF (-137) +#define TFN_DEL_MBF (-138) +#define TFN_SND_MBF (-141) +#define TFN_PSND_MBF (-142) +#define TFN_TSND_MBF (-143) + +#define TFN_VXSNS_CTX (-225) +#define TFN_VXSNS_LOC (-226) +#define TFN_VXSNS_DSP (-227) +#define TFN_VXSNS_DPN (-228) +#define TFN_VXSNS_TEX (-229) +#define TFN_VSNS_INI (-232) + +#define TFN_VXGET_TIM (-233) + +/* + * オブジェクト定数の定義(ITRONデバッギングインタフェース仕様) + */ +#define OBJ_SEMAPHORE (128) +#define OBJ_EVENTFLAG (129) +#define OBJ_DATAQUEUE (130) +#define OBJ_MAILBOX (131) +#define OBJ_MUTEX (132) +#define OBJ_MESSAGEBUFFER (133) +#define OBJ_RENDEZVOUSPORT (135) +#define OBJ_RENDEZVOUS (136) +#define OBJ_FMEMPOOL (137) +#define OBJ_VMEMPOOL (138) +#define OBJ_TASK (139) +#define OBJ_READYQUEUE (141) +#define OBJ_TIMERQUEUE (142) +#define OBJ_CYCLICHANDLER (144) +#define OBJ_ALARMHANDLER (145) +#define OBJ_OVERRUNHANDLER (146) +#define OBJ_ISR (147) +#define OBJ_KERNELSTATUS (148) +#define OBJ_TASKEXCEPTION (149) +#define OBJ_CPUEXCEPTION (150) + +#ifdef __cplusplus +} +#endif + +#endif /* _KERNEL_DEBUG_H_ */ diff --git a/uzume_prototype/kernel/include/linux_sigio.h b/uzume_prototype/kernel/include/linux_sigio.h new file mode 100644 index 0000000..869fe48 --- /dev/null +++ b/uzume_prototype/kernel/include/linux_sigio.h @@ -0,0 +1,114 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: linux_sigio.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * LINUX用 ノンブロッキングI/O サポートモジュール + * + * ノンブロッキングI/O サポートモジュールは,SIGIO シグナルにより,ユー + * ザが登録したコールバック関数を呼び出す機能を持つ. + * + * SIGIO シグナルによりコールバック関数を実行させたい場合には,SIGIO + * 通知イベントブロックを用意し,その callback フィールドにコールバッ + * ク関数,arg フィールドにコールバック関数へ渡す引数を設定し, + * eneuque_sigioeb を用いて SIGIO 通知イベントキューに登録する. + * + * 呼び出されたコールバック関数が 0 を返すと,関連する SIGIO 通知イベ + * ントブロック はキューに登録されたままとなり,続く SIGIO シグナルで + * 再び同じコー ルバック関数が呼び出される.コールバック関数が 0 以外 + * を返すと,SIGIO 通知イベントブロックはキューから削除され,コールバッ + * ク関数はそれ以降呼び出されなくなる. + */ + +#ifndef _LINUX_SIGIO_H_ +#define _LINUX_SIGIO_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * SIGIO 通知イベントブロックの定義 + */ +typedef BOOL (*SIGIO_CBACK)(VP); /* SIGIO コールバック関数の型 */ + +typedef struct bsd_sigio_event_block { + VP queue[2]; /* SIGIO 通知イベントキューエリア */ + SIGIO_CBACK callback; /* SIGIO コールバック関数 */ + VP arg; /* コールバック関数へ渡す引数 */ +} SIGIOEB; + +/* + * SIGIO 通知イベントブロックの登録 + */ +extern ER enqueue_sigioeb(SIGIOEB *sigioeb) throw(); + +/* + * システム起動時用 SIGIO 通知イベントブロックの登録 + */ +extern ER enqueue_sigioeb_initialize(SIGIOEB *sigioeb) throw(); + +/* + * ノンブロッキングI/O モジュール起動ルーチン + */ + +extern void linux_sigio_initialize(VP_INT exinf) throw(); + +/* + * 割込みハンドラのベクタ番号 + */ +#define INHNO_SIGIO SIGIO + +/* + * SIGIO割り込みハンドラ + */ + +extern void linux_sigio_handler() throw(); + +/* + * SIGIOタスクの設定 + */ +#define LINUX_SIGIO_PRIORITY 2 +#define LINUX_SIGIO_STACK_SIZE 8192 + +extern void linux_sigio_task(void) throw(); + +#ifdef __cplusplus +} +#endif + +#endif /* _LINUX_SIGIO_H_ */ diff --git a/uzume_prototype/kernel/include/logtask.h b/uzume_prototype/kernel/include/logtask.h new file mode 100644 index 0000000..824468e --- /dev/null +++ b/uzume_prototype/kernel/include/logtask.h @@ -0,0 +1,68 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: logtask.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * システムログタスク + */ + +#ifndef _LOGTASK_H_ +#define _LOGTASK_H_ + +#include + +/* + * システムログタスク関連の定義 + */ +#ifndef LOGTASK_PRIORITY +#define LOGTASK_PRIORITY 3 /* デフォルトの初期優先度 */ +#endif /* LOGTASK_PRIORITY */ + +#ifndef LOGTASK_STACK_SIZE +#define LOGTASK_STACK_SIZE 1024 /* スタック領域のデフォルトサイズ */ +#endif /* LOGTASK_STACK_SIZE */ + +#ifndef LOGTASK_INTERVAL +#define LOGTASK_INTERVAL 10 /* デフォルトの動作間隔(ミリ秒)*/ +#endif /* LOGTASK_INTERVAL */ + +/* + * システムログタスクの本体 + */ +extern void logtask(VP_INT exinf); + +#endif /* _LOGTASK_H_ */ diff --git a/uzume_prototype/kernel/include/s_services.h b/uzume_prototype/kernel/include/s_services.h new file mode 100644 index 0000000..2576778 --- /dev/null +++ b/uzume_prototype/kernel/include/s_services.h @@ -0,0 +1,79 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: s_services.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * デバイスドライバ用 標準インクルードファイル + * + * このインクルードファイルは,直接ハードウェアにアクセスするデバイス + * ドライバのソースファイルでインクルードするべき標準インクルードファ + * イルである.この中で,sil.h(さらにここから,t_stddef.h,itron.h, + * tool_defs.h,sys_defs.h,cpu_defs.h,t_syslog.h)と t_config.h(さ + * らにここから,sys_config.h,cpu_config.h,tool_config.h)をインク + * ルードしている. + * + * また,アプリケーションから呼ばれるデバイスドライバのインクルードファ + * イルで,インライン関数などでシステムインタフェースレイヤを用いてい + * る場合にも,このファイルをインクルードする. + * + * アセンブリ言語のソースファイルやシステムコンフィギュレーションファ + * イルからこのファイルをインクルードする時は,_MACRO_ONLY を定義して + * おくことで,マクロ定義以外の記述を除くことができる. + */ + +#ifndef _S_SERVICES_H_ +#define _S_SERVICES_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * SILを呼び出すために必要なインクルードファイル + */ +#include + +/* + * ターゲット依存情報の定義 + */ +#include + +#ifdef __cplusplus +} +#endif + +#endif /* _S_SERVICES_H_ */ diff --git a/uzume_prototype/kernel/include/serial.h b/uzume_prototype/kernel/include/serial.h new file mode 100644 index 0000000..c77a376 --- /dev/null +++ b/uzume_prototype/kernel/include/serial.h @@ -0,0 +1,81 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: serial.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * シリアルインタフェースドライバ + */ + +#ifndef _SERIAL_H_ +#define _SERIAL_H_ + +/* + * シリアルインタフェースドライバの用いるパケット + */ +typedef struct { + UINT reacnt; /* 受信バッファ中の文字数 */ + UINT wricnt; /* 送信バッファ中の文字数 */ + } T_SERIAL_RPOR; + +/* + * シリアルインタフェースドライバの初期化ルーチン + */ +extern void serial_initialize(VP_INT exinf) throw(); + +/* + * シリアルインタフェースドライバのサービスコール + */ +extern ER serial_opn_por(ID portid) throw(); +extern ER serial_cls_por(ID portid) throw(); +extern ER_UINT serial_rea_dat(ID portid, char *buf, UINT len) throw(); +extern ER_UINT serial_wri_dat(ID portid, char *buf, UINT len) throw(); +extern ER serial_ctl_por(ID portid, UINT ioctl) throw(); +extern ER serial_ref_por(ID portid, T_SERIAL_RPOR *pk_rpor) throw(); + +/* + * シリアルインタフェースドライバの動作制御用のための定数 + * + * 以下の定数は,ビット毎に論理和をとって用いる. + */ +#define IOCTL_NULL 0u /* 指定なし */ +#define IOCTL_ECHO 0x0001u /* 受信した文字をエコーバック */ +#define IOCTL_CRLF 0x0010u /* LF を送信する前に CR を付加 */ +#define IOCTL_FCSND 0x0100u /* 送信に対してフロー制御を行う */ +#define IOCTL_FCANY 0x0200u /* どのような文字でも送信再開 */ +#define IOCTL_FCRCV 0x0400u /* 受信に対してフロー制御を行う */ + +#endif /* _SERIAL_H_ */ diff --git a/uzume_prototype/kernel/include/sil.h b/uzume_prototype/kernel/include/sil.h new file mode 100644 index 0000000..d4ba0c0 --- /dev/null +++ b/uzume_prototype/kernel/include/sil.h @@ -0,0 +1,307 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2005,2006 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: sil.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * システムインタフェースレイヤ(ターゲット共通部) + * + * アセンブリ言語のソースファイルやシステムコンフィギュレーションファ + * イルからこのファイルをインクルードする時は,_MACRO_ONLY を定義して + * おくことで,マクロ定義以外の記述を除くことができる. + * + * このインクルードファイルは,標準インクルードファイル(s_services.h) + * でインクルードされる.また,カーネルから呼ばれるデバイスドライバの + * インクルードファイルで,インライン関数などでシステムインタフェース + * レイヤを用いている場合にも,このファイルがインクルードされる.この + * 例外を除いて,他のファイルから直接インクルードされることはない. + * + * この中でインクルードしているファイルを除いて,他のインクルードファ + * イルに依存していない. + */ + +#ifndef _SIL_H_ +#define _SIL_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * カーネル・アプリケーション 共通インクルードファイル + */ +#include + +/* + * ITRON仕様共通規定のデータ型・定数・マクロ + */ +#include + +/* + * システムやプロセッサに依存する定義 + */ +#include +#include + +/* + * システムログサービスのための定義 + */ +#include + +/* + * エンディアン定数の定義 + */ +#define SIL_ENDIAN_LITTLE 0 /* リトルエンディアン */ +#define SIL_ENDIAN_BIG 1 /* ビッグエンディアン */ + +#ifndef _MACRO_ONLY + +/* + * 割込みロック状態の制御 + */ +#ifndef SIL_PRE_LOC +#include +#define SIL_PRE_LOC BOOL _sil_loc_ = sns_loc() +#define SIL_LOC_INT() ((void)(!(_sil_loc_) \ + && (sns_ctx() ? iloc_cpu() : loc_cpu()))) +#define SIL_UNL_INT() ((void)(!(_sil_loc_) \ + && (sns_ctx() ? iunl_cpu() : unl_cpu()))) +#endif /* SIL_PRE_LOC */ + +/* + * 微少時間待ち + */ +extern void sil_dly_nse(UINT dlytim) throw(); + +/* + * エンディアンの反転 + */ +#ifndef SIL_REV_ENDIAN_H +#define SIL_REV_ENDIAN_H(data) \ + ((VH)((((UH)(data) & 0xff) << 8) | (((UH)(data) >> 8) & 0xff))) +#endif /* SIL_REV_ENDIAN_H */ + +#ifndef SIL_REV_ENDIAN_W +#define SIL_REV_ENDIAN_W(data) \ + ((VW)((((UW)(data) & 0xff) << 24) | (((UW)(data) & 0xff00) << 8) \ + | (((UW)(data)>> 8) & 0xff00) | (((UW)(data) >> 24) & 0xff))) +#endif /* SIL_REV_ENDIAN_H */ + +/* + * メモリ空間アクセス関数 + */ +#ifndef OMIT_SIL_ACCESS + +/* + * 8ビット単位の読出し/書込み + */ +#ifdef _int8_ + +Inline VB +sil_reb_mem(VP mem) +{ + VB data; + + data = *((volatile VB *) mem); + return(data); +} + +Inline void +sil_wrb_mem(VP mem, VB data) +{ + *((volatile VB *) mem) = data; +} + +#endif /* _int8_ */ + +/* + * 16ビット単位の読出し/書込み + */ +#ifdef _int16_ + +Inline VH +sil_reh_mem(VP mem) +{ + VH data; + + data = *((volatile VH *) mem); + return(data); +} + +Inline void +sil_wrh_mem(VP mem, VH data) +{ + *((volatile VH *) mem) = data; +} + +#if SIL_ENDIAN == SIL_ENDIAN_BIG /* ビッグエンディアンプロセッサ */ + +#define sil_reh_bem(mem) sil_reh_mem(mem) +#define sil_wrh_bem(mem, data) sil_wrh_mem(mem, data) + +#ifndef OMIT_SIL_REH_LEM + +Inline VH +sil_reh_lem(VP mem) +{ + VH data; + + data = *((volatile VH *) mem); + return(SIL_REV_ENDIAN_H(data)); +} + +#endif /* OMIT_SIL_REH_LEM */ +#ifndef OMIT_SIL_WRH_LEM + +Inline void +sil_wrh_lem(VP mem, VH data) +{ + *((volatile VH *) mem) = SIL_REV_ENDIAN_H(data); +} + +#endif /* OMIT_SIL_WRH_LEM */ +#else /* SIL_ENDIAN == SIL_ENDIAN_BIG *//* リトルエンディアンプロセッサ */ + +#define sil_reh_lem(mem) sil_reh_mem(mem) +#define sil_wrh_lem(mem, data) sil_wrh_mem(mem, data) + +#ifndef OMIT_SIL_REH_BEM + +Inline VH +sil_reh_bem(VP mem) +{ + VH data; + + data = *((volatile VH *) mem); + return(SIL_REV_ENDIAN_H(data)); +} + +#endif /* OMIT_SIL_REH_BEM */ +#ifndef OMIT_SIL_WRH_BEM + +Inline void +sil_wrh_bem(VP mem, VH data) +{ + *((volatile VH *) mem) = SIL_REV_ENDIAN_H(data); +} + +#endif /* OMIT_SIL_WRH_BEM */ +#endif /* SIL_ENDIAN == SIL_ENDIAN_BIG */ +#endif /* _int16_ */ + +/* + * 32ビット単位の読出し/書込み + */ + +Inline VW +sil_rew_mem(VP mem) +{ + VW data; + + data = *((volatile VW *) mem); + return(data); +} + +Inline void +sil_wrw_mem(VP mem, VW data) +{ + *((volatile VW *) mem) = data; +} + +#if SIL_ENDIAN == SIL_ENDIAN_BIG /* ビッグエンディアンプロセッサ */ + +#define sil_rew_bem(mem) sil_rew_mem(mem) +#define sil_wrw_bem(mem, data) sil_wrw_mem(mem, data) + +#ifndef OMIT_SIL_REW_LEM + +Inline VW +sil_rew_lem(VP mem) +{ + VW data; + + data = *((volatile VW *) mem); + return(SIL_REV_ENDIAN_W(data)); +} + +#endif /* OMIT_SIL_REW_LEM */ +#ifndef OMIT_SIL_WRW_LEM + +Inline void +sil_wrw_lem(VP mem, VW data) +{ + *((volatile VW *) mem) = SIL_REV_ENDIAN_W(data); +} + +#endif /* OMIT_SIL_WRW_LEM */ +#else /* SIL_ENDIAN == SIL_ENDIAN_BIG *//* リトルエンディアンプロセッサ */ + +#define sil_rew_lem(mem) sil_rew_mem(mem) +#define sil_wrw_lem(mem, data) sil_wrw_mem(mem, data) + +#ifndef OMIT_SIL_REW_BEM + +Inline VW +sil_rew_bem(VP mem) +{ + VW data; + + data = *((volatile VW *) mem); + return(SIL_REV_ENDIAN_W(data)); +} + +#endif /* OMIT_SIL_REW_BEM */ +#ifndef OMIT_SIL_WRW_BEM + +Inline void +sil_wrw_bem(VP mem, VW data) +{ + *((volatile VW *) mem) = SIL_REV_ENDIAN_W(data); +} + +#endif /* OMIT_SIL_WRW_BEM */ +#endif /* SIL_ENDIAN == SIL_ENDIAN_BIG */ +#endif /* OMIT_SIL_ACCESS */ + +#endif /* _MACRO_ONLY */ + +#ifdef __cplusplus +} +#endif + +#endif /* _SIL_H_ */ diff --git a/uzume_prototype/kernel/include/t_config.h b/uzume_prototype/kernel/include/t_config.h new file mode 100644 index 0000000..26e7e66 --- /dev/null +++ b/uzume_prototype/kernel/include/t_config.h @@ -0,0 +1,82 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: t_config.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * ターゲット依存情報の定義 + * + * アセンブリ言語のソースファイルやシステムコンフィギュレーションファ + * イルからこのファイルをインクルードする時は,_MACRO_ONLY を定義して + * おくことで,マクロ定義以外の記述を除くことができる. + * + * このインクルードファイルは,標準インクルードファイル(s_services.h + * と jsp_kernel.h)でインクルードされる.また,カーネル上で動作する + * プログラムで,ターゲット依存情報を参照したい場にも,このファイルが + * インクルードされる.この例外を除いて,他のファイルから直接インクルー + * ドされることはない. + * + * このファイルをインクルードする前に,kernel.h か sil.h をインクルー + * ドしておくことが必要である. + */ + +#ifndef _T_CONFIG_H_ +#define _T_CONFIG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * システム依存情報の定義 + */ +#include + +/* + * プロセッサ依存情報の定義 + */ +#include + +/* + * ツール依存情報の定義 + */ +#include + +#ifdef __cplusplus +} +#endif + +#endif /* _T_CONFIG_H_ */ diff --git a/uzume_prototype/kernel/include/t_services.h b/uzume_prototype/kernel/include/t_services.h new file mode 100644 index 0000000..2bd5d91 --- /dev/null +++ b/uzume_prototype/kernel/include/t_services.h @@ -0,0 +1,114 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2005,2006 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: t_services.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * アプリケーション用 標準インクルードファイル + * + * このインクルードファイルは,カーネル上で動作するプログラムのソース + * ファイルでインクルードする標準インクルードファイルである.この中で, + * kernel.h(さらにここから,t_stddef.h,itron.h,tool_defs.h, + * sys_defs.h,cpu_defs.h,t_syslog.h)とserial.hをインクルードしてい + * る.また,アプリケーションに有益と思われる定義をいくつか含んでいる. + * + * アセンブリ言語のソースファイルやシステムコンフィギュレーションファ + * イルからこのファイルをインクルードする時は,_MACRO_ONLY を定義して + * おくことで,マクロ定義以外の記述を除くことができる. + */ + +#ifndef _T_SERVICES_H_ +#define _T_SERVICES_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * カーネルを呼び出すために必要なインクルードファイル + */ +#include + +#ifndef _MACRO_ONLY + +/* + * シリアルインタフェースモジュール + */ +#include + +/* + * カーネルの終了処理 + */ +extern void kernel_exit(void) throw(); + +/* + * syscallマクロ,_syscall マクロの定義 + */ + +extern void t_perror(UINT prio, const char *file, int line, + const char *expr, ER ercd) throw(); + +Inline ER +_t_perror(const char *file, int line, const char *expr, ER ercd) +{ + if (ercd < 0) { + t_perror(LOG_ERROR, file, line, expr, ercd); + } + return(ercd); +} + +Inline ER +_t_panic(const char *file, int line, const char *expr, ER ercd) +{ + if (ercd < 0) { + t_perror(LOG_EMERG, file, line, expr, ercd); + kernel_abort(); + } + return(ercd); +} + +#define syscall(s) _t_perror(__FILE__, __LINE__, #s, (s)) +#define _syscall(s) _t_panic(__FILE__, __LINE__, #s, (s)) + +#endif /* _MACRO_ONLY */ + +#ifdef __cplusplus +} +#endif + +#endif /* _T_SERVICES_H_ */ diff --git a/uzume_prototype/kernel/include/t_stddef.h b/uzume_prototype/kernel/include/t_stddef.h new file mode 100644 index 0000000..39668d1 --- /dev/null +++ b/uzume_prototype/kernel/include/t_stddef.h @@ -0,0 +1,97 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2004 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: t_stddef.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * カーネル・アプリケーション 共通インクルードファイル + * + * このインクルードファイルは,kernel.h と sil.h の先頭でインクルード + * される.他のファイルから直接インクルードされることはない. + * + * この中でインクルードしているファイルを除いて,他のインクルードファ + * イルに依存していない. + */ + +#ifndef _T_STDDEF_H_ +#define _T_STDDEF_H_ + +/* + * 開発環境に依存する定義 + */ +#include + +/* + * 開発環境の標準インクルードファイル(CHAR_BIT の定義が必要) + * + * C++/EC++ では,標準仕様上は limits.h がサポートされているとは限らな + * いが,ほとんどの処理系でサポートされている. + */ +#ifndef _MACRO_ONLY +#include +#endif /* _MACRO_ONLY */ + +/* + * コンパイラの拡張機能のためのマクロのデフォルト定義 + */ +#ifndef Inline +#define Inline static inline +#endif /* Inline */ + +/* + * C言語/EC++で throw() に対処 + */ +#if !defined(__cplusplus) || defined(__embedded_cplusplus) +#define throw() +#endif + +/* + * assertマクロの定義 + */ +#undef assert +#ifndef NDEBUG +#define assert(exp) \ + ((void)(!(exp) ? (_syslog_3(LOG_EMERG, LOG_TYPE_ASSERT, \ + (VP_INT)(__FILE__), (VP_INT)(__LINE__), \ + (VP_INT)(#exp)), \ + kernel_abort(), 0) : 0)) +#else /* NDEBUG */ +#define assert(exp) ((void) 0) +#endif /* NDEBUG */ + +#endif /* _T_STDDEF_H_ */ diff --git a/uzume_prototype/kernel/include/t_syslog.h b/uzume_prototype/kernel/include/t_syslog.h new file mode 100644 index 0000000..cdad141 --- /dev/null +++ b/uzume_prototype/kernel/include/t_syslog.h @@ -0,0 +1,292 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2004 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: t_syslog.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * システムログ機能 + * + * システムログサービスは,システムのログ情報を出力するためのサービス + * である.カーネルからのログ情報の出力にも用いるため,内部で待ち状態 + * にはいることはない. + * + * ログ情報は,カーネル内のログバッファに書き込むか,低レベルの文字出 + * 力関数を用いて出力する.どちらを使うかは,拡張サービスコールで切り + * 換えることができる. + * + * ログバッファ領域がオーバフローした場合には,古いログ情報を消して上 + * 書きする. + * + * アセンブリ言語のソースファイルやシステムコンフィギュレーションファ + * イルからこのファイルをインクルードする時は,_MACRO_ONLY を定義して + * おくことで,マクロ定義以外の記述を除くことができる. + * + * このインクルードファイルは,kernel.h と sil.h でインクルードされる. + * 他のファイルから直接インクルードされることはない. + * + * このファイルをインクルードする前に,t_stddef.h と itron.h をインク + * ルードしておくことが必要である. + */ + +#ifndef _T_SYSLOG_H_ +#define _T_SYSLOG_H_ + +/* + * ログ情報の種別の定義 + * + * LOG_TYPE_CYC,LOG_TYPE_ASSERT 以外は,デバッギングインタフェース仕 + * 様と合致している. + */ +#define LOG_TYPE_INH 0x01u /* 割込みハンドラ */ +#define LOG_TYPE_ISR 0x02u /* 割込みサービスルーチン */ +#define LOG_TYPE_CYC 0x03u /* 周期ハンドラ */ +#define LOG_TYPE_EXC 0x04u /* CPU例外ハンドラ */ +#define LOG_TYPE_TEX 0x05u /* タスク例外処理ルーチン */ +#define LOG_TYPE_TSKSTAT 0x06u /* タスク状態変化 */ +#define LOG_TYPE_DSP 0x07u /* ディスパッチャ */ +#define LOG_TYPE_SVC 0x08u /* サービスコール */ +#define LOG_TYPE_COMMENT 0x09u /* コメント */ +#define LOG_TYPE_ASSERT 0x0au /* アサーションの失敗 */ + +#define LOG_ENTER 0x00u /* 入口/開始 */ +#define LOG_LEAVE 0x80u /* 出口/終了 */ + +/* + * ログ情報の重要度の定義 + */ +#define LOG_EMERG 0u /* シャットダウンに値するエラー */ +#define LOG_ALERT 1u +#define LOG_CRIT 2u +#define LOG_ERROR 3u /* システムエラー */ +#define LOG_WARNING 4u /* 警告メッセージ */ +#define LOG_NOTICE 5u +#define LOG_INFO 6u +#define LOG_DEBUG 7u /* デバッグ用メッセージ */ + +#ifndef _MACRO_ONLY + +/* + * ログ情報のデータ構造 + */ + +#define TMAX_LOGINFO 6 + +typedef struct { + UINT logtype; /* ログ情報の種別 */ + SYSTIM logtim; /* ログ時刻 */ + VP_INT loginfo[TMAX_LOGINFO]; /* その他のログ情報 */ + } SYSLOG; + +/* + * ログ情報の重要度のビットマップを作るためのマクロ + */ +#define LOG_MASK(prio) (1u << (prio)) +#define LOG_UPTO(prio) ((1u << ((prio) + 1)) - 1) + +#ifndef OMIT_SYSLOG + +/* + * ログ情報の出力 + */ +extern ER vwri_log(UINT prio, SYSLOG *p_log) throw(); + +/* + * ログバッファからのログ情報の読出し + */ +extern ER_UINT vrea_log(SYSLOG *p_log) throw(); + +/* + * 出力すべきログ情報の重要度の設定 + */ +extern ER vmsk_log(UINT logmask, UINT lowmask) throw(); + +/* + * ログ情報を出力するためのライブラリ関数 + */ + +Inline ER +_syslog_0(UINT prio, UINT type) +{ + SYSLOG log; + + log.logtype = type; + return(vwri_log(prio, &log)); +} + +Inline ER +_syslog_1(UINT prio, UINT type, VP_INT arg1) +{ + SYSLOG log; + + log.logtype = type; + log.loginfo[0] = arg1; + return(vwri_log(prio, &log)); +} + +Inline ER +_syslog_2(UINT prio, UINT type, VP_INT arg1, VP_INT arg2) +{ + SYSLOG log; + + log.logtype = type; + log.loginfo[0] = arg1; + log.loginfo[1] = arg2; + return(vwri_log(prio, &log)); +} + +Inline ER +_syslog_3(UINT prio, UINT type, VP_INT arg1, VP_INT arg2, VP_INT arg3) +{ + SYSLOG log; + + log.logtype = type; + log.loginfo[0] = arg1; + log.loginfo[1] = arg2; + log.loginfo[2] = arg3; + return(vwri_log(prio, &log)); +} + +Inline ER +_syslog_4(UINT prio, UINT type, VP_INT arg1, VP_INT arg2, + VP_INT arg3, VP_INT arg4) +{ + SYSLOG log; + + log.logtype = type; + log.loginfo[0] = arg1; + log.loginfo[1] = arg2; + log.loginfo[2] = arg3; + log.loginfo[3] = arg4; + return(vwri_log(prio, &log)); +} + +Inline ER +_syslog_5(UINT prio, UINT type, VP_INT arg1, VP_INT arg2, + VP_INT arg3, VP_INT arg4, VP_INT arg5) +{ + SYSLOG log; + + log.logtype = type; + log.loginfo[0] = arg1; + log.loginfo[1] = arg2; + log.loginfo[2] = arg3; + log.loginfo[3] = arg4; + log.loginfo[4] = arg5; + return(vwri_log(prio, &log)); +} + +Inline ER +_syslog_6(UINT prio, UINT type, VP_INT arg1, VP_INT arg2, VP_INT arg3, + VP_INT arg4, VP_INT arg5, VP_INT arg6) +{ + SYSLOG log; + + log.logtype = type; + log.loginfo[0] = arg1; + log.loginfo[1] = arg2; + log.loginfo[2] = arg3; + log.loginfo[3] = arg4; + log.loginfo[4] = arg5; + log.loginfo[5] = arg6; + return(vwri_log(prio, &log)); +} + +#else /* OMIT_SYSLOG */ + +#define vwri_log(prio, p_log) E_OK +#define vrea_log(p_log) E_OK +#define vmsk_log(logmask, lowmask) E_OK + +#define _syslog_0(prio, type) E_OK +#define _syslog_1(prio, type, arg1) E_OK +#define _syslog_2(prio, type, arg1, arg2) E_OK +#define _syslog_3(prio, type, arg1, arg2, arg3) E_OK +#define _syslog_4(prio, type, arg1, arg2, arg3, arg4) E_OK +#define _syslog_5(prio, type, arg1, arg2, arg3, arg4, arg5) E_OK +#define _syslog_6(prio, type, arg1, arg2, arg3, arg4, arg5, arg6) E_OK + +#endif /* OMIT_SYSLOG */ + +/* + * ログ情報(コメント)を出力するためのマクロ + * + * format および後続の引数から作成したメッセージを,重大度 prio で + * ログ情報として出力するためのマクロ.arg1〜argn は VP_INT型にキャ + * ストするため,VP_INT型に型変換できる任意の型でよい. + */ + +#define syslog_0(prio, format) \ + _syslog_1(prio, LOG_TYPE_COMMENT, (VP_INT) format) + +#define syslog_1(prio, format, arg1) \ + _syslog_2(prio, LOG_TYPE_COMMENT, (VP_INT) format, \ + (VP_INT)(arg1)) + +#define syslog_2(prio, format, arg1, arg2) \ + _syslog_3(prio, LOG_TYPE_COMMENT, (VP_INT) format, \ + (VP_INT)(arg1), (VP_INT)(arg2)) + +#define syslog_3(prio, format, arg1, arg2, arg3) \ + _syslog_4(prio, LOG_TYPE_COMMENT, (VP_INT) format, \ + (VP_INT)(arg1), (VP_INT)(arg2), (VP_INT)(arg3)) + +#define syslog_4(prio, format, arg1, arg2, arg3, arg4) \ + _syslog_5(prio, LOG_TYPE_COMMENT, (VP_INT) format, \ + (VP_INT)(arg1), (VP_INT)(arg2), (VP_INT)(arg3), \ + (VP_INT)(arg4)) + +#define syslog_5(prio, format, arg1, arg2, arg3, arg4, arg5) \ + _syslog_6(prio, LOG_TYPE_COMMENT, (VP_INT) format, \ + (VP_INT)(arg1), (VP_INT)(arg2), (VP_INT)(arg3), \ + (VP_INT)(arg4), (VP_INT)(arg5)) + +/* + * ログ情報(コメント)を出力するためのライブラリ関数(vasyslog.c) + */ +extern ER syslog(UINT prio, const char *format, ...) throw(); + +/* + * ログ情報のフォーマット出力(log_output.c) + */ +extern void syslog_printf(const char *format, VP_INT *args, + void (*putc)(char)) throw(); +extern void syslog_print(SYSLOG *p_log, void (*putc)(char)) throw(); +extern void syslog_output(void (*putc)(char)) throw(); + +#endif /* _MACRO_ONLY */ +#endif /* _T_SYSLOG_H_ */ diff --git a/uzume_prototype/kernel/include/timer.h b/uzume_prototype/kernel/include/timer.h new file mode 100644 index 0000000..2450377 --- /dev/null +++ b/uzume_prototype/kernel/include/timer.h @@ -0,0 +1,68 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: timer.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * システムクロックドライバ + * + * ハードウェアタイマを用いて周期的に割込みを発生させ,isig_tim を呼 + * び出してカーネルにタイムティックを供給する. + */ + +#ifndef _TIMER_H_ +#define _TIMER_H_ + +/* + * タイマの起動処理 + * + * タイマを初期化し,周期的なタイマ割込み要求を発生させる. + */ +extern void timer_initialize(VP_INT exinf); + +/* + * タイマ割込みハンドラ + */ +extern void timer_handler(void); + +/* + * タイマの停止処理 + * + * タイマの動作を停止させる. + */ +extern void timer_terminate(VP_INT exinf); + +#endif /* _TIMER_H_ */ diff --git a/uzume_prototype/kernel/kernel/Makefile.kernel b/uzume_prototype/kernel/kernel/Makefile.kernel new file mode 100644 index 0000000..0aa81cd --- /dev/null +++ b/uzume_prototype/kernel/kernel/Makefile.kernel @@ -0,0 +1,125 @@ +# +# TOPPERS/JSP Kernel +# Toyohashi Open Platform for Embedded Real-Time Systems/ +# Just Standard Profile Kernel +# +# Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory +# Toyohashi Univ. of Technology, JAPAN +# +# 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation +# によって公表されている GNU General Public License の Version 2 に記 +# 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア +# を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, +# 利用と呼ぶ)することを無償で許諾する. +# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 +# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー +# スコード中に含まれていること. +# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 +# 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 +# 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 +# の無保証規定を掲載すること. +# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 +# 用できない形で再配布する場合には,次のいずれかの条件を満たすこ +# と. +# (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 +# 作権表示,この利用条件および下記の無保証規定を掲載すること. +# (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに +# 報告すること. +# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 +# 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. +# +# 本ソフトウェアは,無保証で提供されているものである.上記著作権者お +# よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も +# 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 +# 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. +# +# @(#) $Id: Makefile.kernel,v 1.1 2009/01/31 05:27:37 suikan Exp $ +# + +# +# カーネルのファイル構成の定義 +# + +# +# カーネルのライブラリに含めるC言語のソースファイルで,1つのソースファ +# イルから複数のオブジェクトファイルを生成するものの定義 +# +KERNEL_LCSRCS = task.c wait.c time_event.c syslog.c \ + task_manage.c task_sync.c task_except.c \ + semaphore.c eventflag.c dataqueue.c mailbox.c \ + mempfix.c time_manage.c cyclic.c sys_manage.c \ + interrupt.c exception.c + +# +# 上のソースファイルから生成されるオブジェクトファイルの定義 +# +KERNEL_LCOBJS = $(foreach file,$(KERNEL_LCSRCS),$($(file:.c=))) + +# +# 各ソースファイルから生成されるオブジェクトファイルの定義 +# +task = tskini.o tsksched.o tskrun.o tsknrun.o \ + tskdmt.o tskact.o tskext.o tskpri.o tskrot.o tsktex.o + +wait = waimake.o waicmp.o waitmo.o waitmook.o \ + waican.o wairel.o wobjwai.o wobjwaitmo.o wobjpri.o + +time_event = tmeini.o tmeup.o tmedown.o tmeins.o tmedel.o isig_tim.o + +syslog = logini.o vwri_log.o vrea_log.o vmsk_log.o logter.o + +task_manage = act_tsk.o iact_tsk.o can_act.o ext_tsk.o ter_tsk.o \ + chg_pri.o get_pri.o + +task_sync = slp_tsk.o tslp_tsk.o wup_tsk.o iwup_tsk.o can_wup.o \ + rel_wai.o irel_wai.o sus_tsk.o rsm_tsk.o frsm_tsk.o dly_tsk.o + +task_except = ras_tex.o iras_tex.o dis_tex.o ena_tex.o sns_tex.o + +semaphore = semini.o sig_sem.o isig_sem.o wai_sem.o pol_sem.o twai_sem.o + +eventflag = flgini.o flgcnd.o set_flg.o iset_flg.o clr_flg.o \ + wai_flg.o pol_flg.o twai_flg.o + +dataqueue = dtqini.o dtqenq.o dtqfenq.o dtqdeq.o dtqsnd.o dtqrcv.o \ + snd_dtq.o psnd_dtq.o ipsnd_dtq.o tsnd_dtq.o \ + fsnd_dtq.o ifsnd_dtq.o rcv_dtq.o prcv_dtq.o trcv_dtq.o + +mailbox = mbxini.o snd_mbx.o rcv_mbx.o prcv_mbx.o trcv_mbx.o + +mempfix = mpfini.o mpfget.o get_mpf.o pget_mpf.o tget_mpf.o rel_mpf.o + +time_manage = set_tim.o get_tim.o vxget_tim.o + +cyclic = cycini.o cycenq.o sta_cyc.o stp_cyc.o cyccal.o + +sys_manage = rot_rdq.o irot_rdq.o get_tid.o iget_tid.o \ + loc_cpu.o iloc_cpu.o unl_cpu.o iunl_cpu.o \ + dis_dsp.o ena_dsp.o sns_ctx.o sns_loc.o sns_dsp.o \ + sns_dpn.o vsns_ini.o + +interrupt = inhini.o + +exception = excini.o vxsns_ctx.o vxsns_loc.o \ + vxsns_dsp.o vxsns_dpn.o vxsns_tex.o + +# +# 生成されるオブジェクトファイルの依存関係の定義 +# +$(task) $(task:.o=.s) $(task:.o=.d): task.c +$(wait) $(wait:.o=.s) $(wait:.o=.d): wait.c +$(time_event) $(time_event:.o=.s) $(time_event:.o=.d): time_event.c +$(syslog) $(syslog:.o=.s) $(syslog:.o=.d): syslog.c +$(task_manage) $(task_manage:.o=.s) $(task_manage:.o=.d): task_manage.c +$(task_sync) $(task_sync:.o=.s) $(task_sync:.o=.d): task_sync.c +$(task_except) $(task_except:.o=.s) $(task_except:.o=.d): task_except.c +$(semaphore) $(semaphore:.o=.s) $(semaphore:.o=.d): semaphore.c +$(eventflag) $(eventflag:.o=.s) $(eventflag:.o=.d): eventflag.c +$(dataqueue) $(dataqueue:.o=.s) $(dataqueue:.o=.d): dataqueue.c +$(mailbox) $(mailbox:.o=.s) $(mailbox:.o=.d): mailbox.c +$(mempfix) $(mempfix:.o=.s) $(mempfix:.o=.d): mempfix.c +$(time_manage) $(time_manage:.o=.s) $(time_manage:.o=.d): time_manage.c +$(cyclic) $(cyclic:.o=.s) $(cyclic:.o=.d): cyclic.c +$(sys_manage) $(sys_manage:.o=.s) $(sys_manage:.o=.d): sys_manage.c +$(interrupt) $(interrupt:.o=.s) $(interrupt:.o=.d): interrupt.c +$(exception) $(exception:.o=.s) $(exception:.o=.d): exception.c diff --git a/uzume_prototype/kernel/kernel/banner.c b/uzume_prototype/kernel/kernel/banner.c new file mode 100644 index 0000000..536e802 --- /dev/null +++ b/uzume_prototype/kernel/kernel/banner.c @@ -0,0 +1,75 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2004-2006 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: banner.c,v 1.2 2012/01/21 04:18:24 suikan Exp $ + */ + +/* + * カーネル起動メッセージの出力 + */ + +#include "jsp_kernel.h" + +#ifndef COPYRIGHT_CPU +#define COPYRIGHT_CPU +#endif /* COPYRIGHT_CPU */ + +#ifndef COPYRIGHT_CHIP +#define COPYRIGHT_CHIP +#endif /* COPYRIGHT_CHIP */ + +#ifndef COPYRIGHT_SYS +#define COPYRIGHT_SYS +#endif /* COPYRIGHT_SYS */ + +static const char banner[] = "\n" +"TOPPERS/JSP Kernel Release %d.%d (patchlevel = %d) for " TARGET_NAME +" (" __DATE__ ", " __TIME__ ")\n" +"Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory\n" +" Toyohashi Univ. of Technology, JAPAN\n" +"Copyright (C) 2004-2006 by Embedded and Real-Time Systems Laboratory\n" +" Graduate School of Information Science, Nagoya Univ., JAPAN\n" +COPYRIGHT_CPU COPYRIGHT_CHIP COPYRIGHT_SYS; + +void +print_banner() +{ + syslog_3(LOG_NOTICE, banner, + (TKERNEL_PRVER >> 12) & 0x0f, + (TKERNEL_PRVER >> 4) & 0xff, + TKERNEL_PRVER & 0x0f); +} diff --git a/uzume_prototype/kernel/kernel/check.h b/uzume_prototype/kernel/kernel/check.h new file mode 100644 index 0000000..4b1c98a --- /dev/null +++ b/uzume_prototype/kernel/kernel/check.h @@ -0,0 +1,253 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: check.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * エラーチェック用マクロ + */ + +#ifndef _CHECK_H_ +#define _CHECK_H_ + +/* + * 優先度の範囲の判定 + */ +#define VALID_TPRI(tpri) \ + (TMIN_TPRI <= (tpri) && (tpri) <= TMAX_TPRI) + +/* + * タスク優先度のチェック(E_PAR) + */ +#define CHECK_TPRI(tpri) { \ + if (!VALID_TPRI(tpri)) { \ + ercd = E_PAR; \ + goto exit; \ + } \ +} + +#define CHECK_TPRI_INI(tpri) { \ + if (!(VALID_TPRI(tpri) || (tpri) == TPRI_INI)) { \ + ercd = E_PAR; \ + goto exit; \ + } \ +} + +#define CHECK_TPRI_SELF(tpri) { \ + if (!(VALID_TPRI(tpri) || (tpri) == TPRI_SELF)) { \ + ercd = E_PAR; \ + goto exit; \ + } \ +} + +/* + * タイムアウト指定値のチェック(E_PAR) + */ +#define CHECK_TMOUT(tmout) { \ + if (!(TMO_FEVR <= (tmout))) { \ + ercd = E_PAR; \ + goto exit; \ + } \ +} + +/* + * その他のパラメータエラーのチェック(E_PAR) + */ +#define CHECK_PAR(exp) { \ + if (!(exp)) { \ + ercd = E_PAR; \ + goto exit; \ + } \ +} + +/* + * オブジェクトIDの範囲の判定 + */ +#define VALID_TSKID(tskid) \ + (TMIN_TSKID <= (tskid) && (tskid) <= tmax_tskid) + +#define VALID_SEMID(semid) \ + (TMIN_SEMID <= (semid) && (semid) <= tmax_semid) + +#define VALID_FLGID(flgid) \ + (TMIN_FLGID <= (flgid) && (flgid) <= tmax_flgid) + +#define VALID_DTQID(dtqid) \ + (TMIN_DTQID <= (dtqid) && (dtqid) <= tmax_dtqid) + +#define VALID_MBXID(mbxid) \ + (TMIN_MBXID <= (mbxid) && (mbxid) <= tmax_mbxid) + +#define VALID_MPFID(mpfid) \ + (TMIN_MPFID <= (mpfid) && (mpfid) <= tmax_mpfid) + +#define VALID_CYCID(cycid) \ + (TMIN_CYCID <= (cycid) && (cycid) <= tmax_cycid) + +/* + * オブジェクトIDのチェック(E_ID) + */ +#define CHECK_TSKID(tskid) { \ + if (!VALID_TSKID(tskid)) { \ + ercd = E_ID; \ + goto exit; \ + } \ +} + +#define CHECK_TSKID_SELF(tskid) { \ + if (!(VALID_TSKID(tskid) || (tskid) == TSK_SELF)) { \ + ercd = E_ID; \ + goto exit; \ + } \ +} + +#define CHECK_SEMID(semid) { \ + if (!VALID_SEMID(semid)) { \ + ercd = E_ID; \ + goto exit; \ + } \ +} + +#define CHECK_FLGID(flgid) { \ + if (!VALID_FLGID(flgid)) { \ + ercd = E_ID; \ + goto exit; \ + } \ +} + +#define CHECK_DTQID(dtqid) { \ + if (!VALID_DTQID(dtqid)) { \ + ercd = E_ID; \ + goto exit; \ + } \ +} + +#define CHECK_MBXID(mbxid) { \ + if (!VALID_MBXID(mbxid)) { \ + ercd = E_ID; \ + goto exit; \ + } \ +} + +#define CHECK_MPFID(mpfid) { \ + if (!VALID_MPFID(mpfid)) { \ + ercd = E_ID; \ + goto exit; \ + } \ +} + +#define CHECK_CYCID(cycid) { \ + if (!VALID_CYCID(cycid)) { \ + ercd = E_ID; \ + goto exit; \ + } \ +} + +/* + * 呼出しコンテキストのチェック(E_CTX) + */ +#define CHECK_TSKCTX() { \ + if (sense_context()) { \ + ercd = E_CTX; \ + goto exit; \ + } \ +} + +#define CHECK_INTCTX() { \ + if (!sense_context()) { \ + ercd = E_CTX; \ + goto exit; \ + } \ +} + +/* + * 呼出しコンテキストとCPUロック状態のチェック(E_CTX) + */ +#define CHECK_TSKCTX_UNL() { \ + if (sense_context() || t_sense_lock()) { \ + ercd = E_CTX; \ + goto exit; \ + } \ +} + +#define CHECK_INTCTX_UNL() { \ + if (!sense_context() || i_sense_lock()) { \ + ercd = E_CTX; \ + goto exit; \ + } \ +} + +/* + * ディスパッチ保留状態でないかのチェック(E_CTX) + */ +#define CHECK_DISPATCH() { \ + if (sense_context() || t_sense_lock() || !(enadsp)) { \ + ercd = E_CTX; \ + goto exit; \ + } \ +} + +/* + * その他のコンテキストエラーのチェック(E_CTX) + */ +#define CHECK_CTX(exp) { \ + if (!(exp)) { \ + ercd = E_CTX; \ + goto exit; \ + } \ +} + +/* + * 自タスクを指定していないかのチェック(E_ILUSE) + */ +#define CHECK_NONSELF(tcb) { \ + if ((tcb) == runtsk) { \ + ercd = E_ILUSE; \ + goto exit; \ + } \ +} + +/* + * その他の不正使用エラーのチェック(E_ILUSE) + */ +#define CHECK_ILUSE(exp) { \ + if (!(exp)) { \ + ercd = E_ILUSE; \ + goto exit; \ + } \ +} + +#endif /* _CHECK_H_ */ diff --git a/uzume_prototype/kernel/kernel/cyclic.c b/uzume_prototype/kernel/kernel/cyclic.c new file mode 100644 index 0000000..c107686 --- /dev/null +++ b/uzume_prototype/kernel/kernel/cyclic.c @@ -0,0 +1,213 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2006 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: cyclic.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * 周期ハンドラ機能 + */ + +#include "jsp_kernel.h" +#include "check.h" +#include "cyclic.h" + +/* + * 周期ハンドラIDの最大値(kernel_cfg.c) + */ +extern const ID tmax_cycid; + +/* + * 周期ハンドラ初期化ブロックのエリア(kernel_cfg.c) + */ +extern const CYCINIB cycinib_table[]; + +/* + * 周期ハンドラ管理ブロックのエリア(kernel_cfg.c) + */ +extern CYCCB cyccb_table[]; + +/* + * 周期ハンドラの数 + */ +#define TNUM_CYC ((UINT)(tmax_cycid - TMIN_CYCID + 1)) + +/* + * 周期ハンドラIDから周期ハンドラ管理ブロックを取り出すためのマクロ + */ +#define INDEX_CYC(cycid) ((UINT)((cycid) - TMIN_CYCID)) +#define get_cyccb(cycid) (&(cyccb_table[INDEX_CYC(cycid)])) + +/* + * 引数まで定義した周期ハンドラの型 + */ +typedef void (*CYCHDR)(VP_INT exinf); + +/* + * 周期ハンドラ機能の初期化 + */ +#ifdef __cycini + +void +cyclic_initialize() +{ + UINT i; + CYCCB *cyccb; + + for (cyccb = cyccb_table, i = 0; i < TNUM_CYC; cyccb++, i++) { + cyccb->cycinib = &(cycinib_table[i]); + if ((cyccb->cycinib->cycatr & TA_STA) != 0) { + cyccb->cycsta = TRUE; + tmevtb_enqueue_cyc(cyccb, + (EVTTIM)(cyccb->cycinib->cycphs)); + } + else { + cyccb->cycsta = FALSE; + } + } +} + +#endif /* __cycini */ + +/* + * 周期ハンドラ起動のためのタイムイベントブロックの登録 + */ +#ifdef __cycenq + +void +tmevtb_enqueue_cyc(CYCCB *cyccb, EVTTIM evttim) +{ + tmevtb_enqueue_evttim(&(cyccb->tmevtb), evttim, + (CBACK) call_cychdr, (VP) cyccb); + cyccb->evttim = evttim; +} + +#endif /* __cycenq */ + +/* + * 周期ハンドラの動作開始 + */ +#ifdef __sta_cyc + +SYSCALL ER +sta_cyc(ID cycid) +{ + CYCCB *cyccb; + ER ercd; + + LOG_STA_CYC_ENTER(cycid); + CHECK_TSKCTX_UNL(); + CHECK_CYCID(cycid); + cyccb = get_cyccb(cycid); + + t_lock_cpu(); + if (cyccb->cycsta) { + tmevtb_dequeue(&(cyccb->tmevtb)); + } + else { + cyccb->cycsta = TRUE; + } + tmevtb_enqueue_cyc(cyccb, base_time + cyccb->cycinib->cyctim); + ercd = E_OK; + t_unlock_cpu(); + + exit: + LOG_STA_CYC_LEAVE(ercd); + return(ercd); +} + +#endif /* __sta_cyc */ + +/* + * 周期ハンドラの動作停止 + */ +#ifdef __stp_cyc + +SYSCALL ER +stp_cyc(ID cycid) +{ + CYCCB *cyccb; + ER ercd; + + LOG_STP_CYC_ENTER(cycid); + CHECK_TSKCTX_UNL(); + CHECK_CYCID(cycid); + cyccb = get_cyccb(cycid); + + t_lock_cpu(); + if (cyccb->cycsta) { + cyccb->cycsta = FALSE; + tmevtb_dequeue(&(cyccb->tmevtb)); + } + ercd = E_OK; + t_unlock_cpu(); + + exit: + LOG_STP_CYC_LEAVE(ercd); + return(ercd); +} + +#endif /* __stp_cyc */ + +/* + * 周期ハンドラ起動ルーチン + */ +#ifdef __cyccal + +void +call_cychdr(CYCCB *cyccb) +{ + /* + * 次回の起動のためのタイムイベントブロックを登録する. + * + * 同じタイムティックで周期ハンドラを再度起動すべき場合には, + * この関数から isig_tim に戻った後に,再度この関数が呼ばれる + * ことになる. + */ + tmevtb_enqueue_cyc(cyccb, cyccb->evttim + cyccb->cycinib->cyctim); + + /* + * 周期ハンドラを,CPUロック解除状態で呼び出す. + */ + i_unlock_cpu(); + LOG_CYC_ENTER(cyccb); + (*((CYCHDR)(cyccb->cycinib->cychdr)))(cyccb->cycinib->exinf); + LOG_CYC_LEAVE(cyccb); + i_lock_cpu(); +} + +#endif /* __cyccal */ diff --git a/uzume_prototype/kernel/kernel/cyclic.h b/uzume_prototype/kernel/kernel/cyclic.h new file mode 100644 index 0000000..e686c83 --- /dev/null +++ b/uzume_prototype/kernel/kernel/cyclic.h @@ -0,0 +1,85 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: cyclic.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * 周期ハンドラ機能 + */ + +#ifndef _CYCLIC_H_ +#define _CYCLIC_H_ + +#include "queue.h" +#include "time_event.h" + +/* + * 周期ハンドラ初期化ブロック + */ +typedef struct cyclic_handler_initialization_block { + ATR cycatr; /* 周期ハンドラ属性 */ + VP_INT exinf; /* 周期ハンドラの拡張情報 */ + FP cychdr; /* 周期ハンドラの起動番地 */ + RELTIM cyctim; /* 周期ハンドラの起動周期 */ + RELTIM cycphs; /* 周期ハンドラの起動位相 */ +} CYCINIB; + +/* + * 周期ハンドラ管理ブロック + */ +typedef struct cyclic_handler_control_block { + const CYCINIB *cycinib; /* 周期ハンドラ初期化ブロックへのポインタ */ + BOOL cycsta; /* 周期ハンドラの動作状態 */ + EVTTIM evttim; /* 次に周期ハンドラを起動する時刻 */ + TMEVTB tmevtb; /* タイムイベントブロック */ +} CYCCB; + +/* + * 周期ハンドラ機能の初期化 + */ +extern void cyclic_initialize(void); + +/* + * 周期ハンドラ起動のためのタイムイベントブロックの登録 + */ +extern void tmevtb_enqueue_cyc(CYCCB *cyccb, EVTTIM evttim); + +/* + * 周期ハンドラ起動ルーチン + */ +extern void call_cychdr(CYCCB *cyccb); + +#endif /* _CYCLIC_H_ */ diff --git a/uzume_prototype/kernel/kernel/dataqueue.c b/uzume_prototype/kernel/kernel/dataqueue.c new file mode 100644 index 0000000..a48cd0e --- /dev/null +++ b/uzume_prototype/kernel/kernel/dataqueue.c @@ -0,0 +1,624 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: dataqueue.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * データキュー機能 + */ + +#include "jsp_kernel.h" +#include "check.h" +#include "task.h" +#include "wait.h" +#include "dataqueue.h" + +/* + * データキューIDの最大値(kernel_cfg.c) + */ +extern const ID tmax_dtqid; + +/* + * データキュー初期化ブロックのエリア(kernel_cfg.c) + */ +extern const DTQINIB dtqinib_table[]; + +/* + * データキューの数 + */ +#define TNUM_DTQ ((UINT)(tmax_dtqid - TMIN_DTQID + 1)) + +/* + * データキュー管理ブロックのエリア(kernel_cfg.c) + */ +extern DTQCB dtqcb_table[]; + +/* + * データキューIDからデータキュー管理ブロックを取り出すためのマクロ + */ +#define INDEX_DTQ(dtqid) ((UINT)((dtqid) - TMIN_DTQID)) +#define get_dtqcb(dtqid) (&(dtqcb_table[INDEX_DTQ(dtqid)])) + +/* + * データキュー待ち情報ブロックの定義 + * + * データキューへの送信待ちとデータキューからの受信待ちで,同じ待ち情 + * 報ブロックを使う. + */ +typedef struct dataqueue_waiting_information { + WINFO winfo; /* 標準の待ち情報ブロック */ + WOBJCB *wobjcb; /* 待ちオブジェクトの管理ブロック */ + VP_INT data; /* 送受信データ */ +} WINFO_DTQ; + +/* + * データキュー機能の初期化 + */ +#ifdef __dtqini + +void +dataqueue_initialize(void) +{ + UINT i; + DTQCB *dtqcb; + + for (dtqcb = dtqcb_table, i = 0; i < TNUM_DTQ; dtqcb++, i++) { + queue_initialize(&(dtqcb->swait_queue)); + dtqcb->dtqinib = &(dtqinib_table[i]); + queue_initialize(&(dtqcb->rwait_queue)); + dtqcb->count = 0; + dtqcb->head = 0; + dtqcb->tail = 0; + } +} + +#endif /* __dtqini */ + +/* + * データキュー領域にデータを格納 + */ +#ifdef __dtqenq + +BOOL +enqueue_data(DTQCB *dtqcb, VP_INT data) +{ + if (dtqcb->count < dtqcb->dtqinib->dtqcnt) { + *((VP_INT *)(dtqcb->dtqinib->dtq) + dtqcb->tail) = data; + dtqcb->count++; + dtqcb->tail++; + if (dtqcb->tail >= dtqcb->dtqinib->dtqcnt) { + dtqcb->tail = 0; + } + return(TRUE); + } + return(FALSE); +} + +#endif /* __dtqenq */ + +/* + * データキュー領域にデータを強制格納 + */ +#ifdef __dtqfenq + +void +force_enqueue_data(DTQCB *dtqcb, VP_INT data) +{ + *((VP_INT *)(dtqcb->dtqinib->dtq) + dtqcb->tail) = data; + dtqcb->tail++; + if (dtqcb->tail >= dtqcb->dtqinib->dtqcnt) { + dtqcb->tail = 0; + } + if (dtqcb->count < dtqcb->dtqinib->dtqcnt) { + dtqcb->count++; + } + else { + dtqcb->head = dtqcb->tail; + } +} + +#endif /* __dtqfenq */ + +/* + * データキュー領域からデータを取出し + */ +#ifdef __dtqdeq + +BOOL +dequeue_data(DTQCB *dtqcb, VP_INT *p_data) +{ + if (dtqcb->count > 0) { + *p_data = *((VP_INT *)(dtqcb->dtqinib->dtq) + dtqcb->head); + dtqcb->count--; + dtqcb->head++; + if (dtqcb->head >= dtqcb->dtqinib->dtqcnt) { + dtqcb->head = 0; + } + return(TRUE); + } + return(FALSE); +} + +#endif /* __dtqdeq */ + +/* + * 受信待ちキューの先頭タスクへのデータ送信 + */ +#ifdef __dtqsnd + +TCB * +send_data_rwait(DTQCB *dtqcb, VP_INT data) +{ + TCB *tcb; + + if (!(queue_empty(&(dtqcb->rwait_queue)))) { + tcb = (TCB *) queue_delete_next(&(dtqcb->rwait_queue)); + ((WINFO_DTQ *)(tcb->winfo))->data = data; + return(tcb); + } + return(NULL); +} + +#endif /* __dtqsnd */ + +/* + * 送信待ちキューの先頭タスクからのデータ受信 + */ +#ifdef __dtqrcv + +TCB * +receive_data_swait(DTQCB *dtqcb, VP_INT *p_data) +{ + TCB *tcb; + + if (!(queue_empty(&(dtqcb->swait_queue)))) { + tcb = (TCB *) queue_delete_next(&(dtqcb->swait_queue)); + *p_data = ((WINFO_DTQ *)(tcb->winfo))->data; + return(tcb); + } + return(NULL); +} + +#endif /* __dtqrcv */ + +/* + * データキューへの送信 + */ +#ifdef __snd_dtq + +SYSCALL ER +snd_dtq(ID dtqid, VP_INT data) +{ + DTQCB *dtqcb; + WINFO_DTQ winfo; + TCB *tcb; + ER ercd; + + LOG_SND_DTQ_ENTER(dtqid, data); + CHECK_DISPATCH(); + CHECK_DTQID(dtqid); + dtqcb = get_dtqcb(dtqid); + + t_lock_cpu(); + if ((tcb = send_data_rwait(dtqcb, data)) != NULL) { + if (wait_complete(tcb)) { + dispatch(); + } + ercd = E_OK; + } + else if (enqueue_data(dtqcb, data)) { + ercd = E_OK; + } + else { + winfo.data = data; + wobj_make_wait((WOBJCB *) dtqcb, (WINFO_WOBJ *) &winfo); + dispatch(); + ercd = winfo.winfo.wercd; + } + t_unlock_cpu(); + + exit: + LOG_SND_DTQ_LEAVE(ercd); + return(ercd); +} + +#endif /* __snd_dtq */ + +/* + * データキューへの送信(ポーリング) + */ +#ifdef __psnd_dtq + +SYSCALL ER +psnd_dtq(ID dtqid, VP_INT data) +{ + DTQCB *dtqcb; + TCB *tcb; + ER ercd; + + LOG_PSND_DTQ_ENTER(dtqid, data); + CHECK_TSKCTX_UNL(); + CHECK_DTQID(dtqid); + dtqcb = get_dtqcb(dtqid); + + t_lock_cpu(); + if ((tcb = send_data_rwait(dtqcb, data)) != NULL) { + if (wait_complete(tcb)) { + dispatch(); + } + ercd = E_OK; + } + else if (enqueue_data(dtqcb, data)) { + ercd = E_OK; + } + else { + ercd = E_TMOUT; + } + t_unlock_cpu(); + + exit: + LOG_PSND_DTQ_LEAVE(ercd); + return(ercd); +} + +#endif /* __psnd_dtq */ + +/* + * データキューへの送信(ポーリング,非タスクコンテキスト用) + */ +#ifdef __ipsnd_dtq + +SYSCALL ER +ipsnd_dtq(ID dtqid, VP_INT data) +{ + DTQCB *dtqcb; + TCB *tcb; + ER ercd; + + LOG_IPSND_DTQ_ENTER(dtqid, data); + CHECK_INTCTX_UNL(); + CHECK_DTQID(dtqid); + dtqcb = get_dtqcb(dtqid); + + i_lock_cpu(); + if ((tcb = send_data_rwait(dtqcb, data)) != NULL) { + if (wait_complete(tcb)) { + reqflg = TRUE; + } + ercd = E_OK; + } + else if (enqueue_data(dtqcb, data)) { + ercd = E_OK; + } + else { + ercd = E_TMOUT; + } + i_unlock_cpu(); + + exit: + LOG_IPSND_DTQ_LEAVE(ercd); + return(ercd); +} + +#endif /* __ipsnd_dtq */ + +/* + * データキューへの送信(タイムアウトあり) + */ +#ifdef __tsnd_dtq + +SYSCALL ER +tsnd_dtq(ID dtqid, VP_INT data, TMO tmout) +{ + DTQCB *dtqcb; + WINFO_DTQ winfo; + TMEVTB tmevtb; + TCB *tcb; + ER ercd; + + LOG_TSND_DTQ_ENTER(dtqid, data, tmout); + CHECK_DISPATCH(); + CHECK_DTQID(dtqid); + CHECK_TMOUT(tmout); + dtqcb = get_dtqcb(dtqid); + + t_lock_cpu(); + if ((tcb = send_data_rwait(dtqcb, data)) != NULL) { + if (wait_complete(tcb)) { + dispatch(); + } + ercd = E_OK; + } + else if (enqueue_data(dtqcb, data)) { + ercd = E_OK; + } + else if (tmout == TMO_POL) { + ercd = E_TMOUT; + } + else { + winfo.data = data; + wobj_make_wait_tmout((WOBJCB *) dtqcb, (WINFO_WOBJ *) &winfo, + &tmevtb, tmout); + dispatch(); + ercd = winfo.winfo.wercd; + } + t_unlock_cpu(); + + exit: + LOG_TSND_DTQ_LEAVE(ercd); + return(ercd); +} + +#endif /* __tsnd_dtq */ + +/* + * データキューへの強制送信 + */ +#ifdef __fsnd_dtq + +SYSCALL ER +fsnd_dtq(ID dtqid, VP_INT data) +{ + DTQCB *dtqcb; + TCB *tcb; + ER ercd; + + LOG_FSND_DTQ_ENTER(dtqid, data); + CHECK_TSKCTX_UNL(); + CHECK_DTQID(dtqid); + dtqcb = get_dtqcb(dtqid); + CHECK_ILUSE(dtqcb->dtqinib->dtqcnt > 0); + + t_lock_cpu(); + if ((tcb = send_data_rwait(dtqcb, data)) != NULL) { + if (wait_complete(tcb)) { + dispatch(); + } + } + else { + force_enqueue_data(dtqcb, data); + } + ercd = E_OK; + t_unlock_cpu(); + + exit: + LOG_FSND_DTQ_LEAVE(ercd); + return(ercd); +} + +#endif /* __fsnd_dtq */ + +/* + * データキューへの強制送信(非タスクコンテキスト用) + */ +#ifdef __ifsnd_dtq + +SYSCALL ER +ifsnd_dtq(ID dtqid, VP_INT data) +{ + DTQCB *dtqcb; + TCB *tcb; + ER ercd; + + LOG_IFSND_DTQ_ENTER(dtqid, data); + CHECK_INTCTX_UNL(); + CHECK_DTQID(dtqid); + dtqcb = get_dtqcb(dtqid); + CHECK_ILUSE(dtqcb->dtqinib->dtqcnt > 0); + + i_lock_cpu(); + if ((tcb = send_data_rwait(dtqcb, data)) != NULL) { + if (wait_complete(tcb)) { + reqflg = TRUE; + } + } + else { + force_enqueue_data(dtqcb, data); + } + ercd = E_OK; + i_unlock_cpu(); + + exit: + LOG_IFSND_DTQ_LEAVE(ercd); + return(ercd); +} + +#endif /* __ifsnd_dtq */ + +/* + * データキューからの受信 + */ +#ifdef __rcv_dtq + +SYSCALL ER +rcv_dtq(ID dtqid, VP_INT *p_data) +{ + DTQCB *dtqcb; + WINFO_DTQ winfo; + TCB *tcb; + VP_INT data; + ER ercd; + + LOG_RCV_DTQ_ENTER(dtqid, p_data); + CHECK_DISPATCH(); + CHECK_DTQID(dtqid); + dtqcb = get_dtqcb(dtqid); + + t_lock_cpu(); + if (dequeue_data(dtqcb, p_data)) { + if ((tcb = receive_data_swait(dtqcb, &data)) != NULL) { + enqueue_data(dtqcb, data); + if (wait_complete(tcb)) { + dispatch(); + } + } + ercd = E_OK; + } + else if ((tcb = receive_data_swait(dtqcb, p_data)) != NULL) { + if (wait_complete(tcb)) { + dispatch(); + } + ercd = E_OK; + } + else { + runtsk->tstat = (TS_WAITING | TS_WAIT_WOBJ); + make_wait(&(winfo.winfo)); + queue_insert_prev(&(dtqcb->rwait_queue), + &(runtsk->task_queue)); + winfo.wobjcb = (WOBJCB *) dtqcb; + LOG_TSKSTAT(runtsk); + dispatch(); + ercd = winfo.winfo.wercd; + if (ercd == E_OK) { + *p_data = winfo.data; + } + } + t_unlock_cpu(); + + exit: + LOG_RCV_DTQ_LEAVE(ercd, *p_data); + return(ercd); +} + +#endif /* __rcv_dtq */ + +/* + * データキューからの受信(ポーリング) + */ +#ifdef __prcv_dtq + +SYSCALL ER +prcv_dtq(ID dtqid, VP_INT *p_data) +{ + DTQCB *dtqcb; + TCB *tcb; + VP_INT data; + ER ercd; + + LOG_PRCV_DTQ_ENTER(dtqid, p_data); + CHECK_TSKCTX_UNL(); + CHECK_DTQID(dtqid); + dtqcb = get_dtqcb(dtqid); + + t_lock_cpu(); + if (dequeue_data(dtqcb, p_data)) { + if ((tcb = receive_data_swait(dtqcb, &data)) != NULL) { + enqueue_data(dtqcb, data); + if (wait_complete(tcb)) { + dispatch(); + } + } + ercd = E_OK; + } + else if ((tcb = receive_data_swait(dtqcb, p_data)) != NULL) { + if (wait_complete(tcb)) { + dispatch(); + } + ercd = E_OK; + } + else { + ercd = E_TMOUT; + } + t_unlock_cpu(); + + exit: + LOG_PRCV_DTQ_LEAVE(ercd, *p_data); + return(ercd); +} + +#endif /* __prcv_dtq */ + +/* + * データキューからの受信(タイムアウトあり) + */ +#ifdef __trcv_dtq + +SYSCALL ER +trcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout) +{ + DTQCB *dtqcb; + WINFO_DTQ winfo; + TMEVTB tmevtb; + TCB *tcb; + VP_INT data; + ER ercd; + + LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout); + CHECK_DISPATCH(); + CHECK_DTQID(dtqid); + CHECK_TMOUT(tmout); + dtqcb = get_dtqcb(dtqid); + + t_lock_cpu(); + if (dequeue_data(dtqcb, p_data)) { + if ((tcb = receive_data_swait(dtqcb, &data)) != NULL) { + enqueue_data(dtqcb, data); + if (wait_complete(tcb)) { + dispatch(); + } + } + ercd = E_OK; + } + else if ((tcb = receive_data_swait(dtqcb, p_data)) != NULL) { + if (wait_complete(tcb)) { + dispatch(); + } + ercd = E_OK; + } + else if (tmout == TMO_POL) { + ercd = E_TMOUT; + } + else { + runtsk->tstat = (TS_WAITING | TS_WAIT_WOBJ); + make_wait_tmout(&(winfo.winfo), &tmevtb, tmout); + queue_insert_prev(&(dtqcb->rwait_queue), + &(runtsk->task_queue)); + winfo.wobjcb = (WOBJCB *) dtqcb; + LOG_TSKSTAT(runtsk); + dispatch(); + ercd = winfo.winfo.wercd; + if (ercd == E_OK) { + *p_data = winfo.data; + } + } + t_unlock_cpu(); + + exit: + LOG_TRCV_DTQ_LEAVE(ercd, *p_data); + return(ercd); +} + +#endif /* __trcv_dtq */ diff --git a/uzume_prototype/kernel/kernel/dataqueue.h b/uzume_prototype/kernel/kernel/dataqueue.h new file mode 100644 index 0000000..855d451 --- /dev/null +++ b/uzume_prototype/kernel/kernel/dataqueue.h @@ -0,0 +1,99 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: dataqueue.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * データキュー機能 + */ + +#ifndef _DATAQUEUE_H_ +#define _DATAQUEUE_H_ + +#include "queue.h" + +/* + * データキュー初期化ブロック + */ +typedef struct dataqueue_initialization_block { + ATR dtqatr; /* データキュー属性 */ + UINT dtqcnt; /* データキュー領域の容量 */ + VP dtq; /* データキュー領域の先頭番地 */ +} DTQINIB; + +/* + * データキュー管理ブロック + */ +typedef struct dataqueue_control_block { + QUEUE swait_queue; /* データキュー送信待ちキュー */ + const DTQINIB *dtqinib; /* データキュー初期化ブロックへのポインタ */ + QUEUE rwait_queue; /* データキュー受信待ちキュー */ + UINT count; /* データキュー中のデータの数 */ + UINT head; /* 最初のデータの格納場所 */ + UINT tail; /* 最後のデータの格納場所の次 */ +} DTQCB; + +/* + * データキュー機能の初期化 + */ +extern void dataqueue_initialize(void); + +/* + * データキュー領域にデータを格納 + */ +extern BOOL enqueue_data(DTQCB *dtqcb, VP_INT data); + +/* + * データキュー領域にデータを強制格納 + */ +extern void force_enqueue_data(DTQCB *dtqcb, VP_INT data); + +/* + * データキュー領域からデータを取出し + */ +extern BOOL dequeue_data(DTQCB *dtqcb, VP_INT *p_data); + +/* + * 受信待ちキューの先頭タスクへのデータ送信 + */ +extern TCB *send_data_rwait(DTQCB *dtqcb, VP_INT data); + +/* + * 送信待ちキューの先頭タスクからのデータ受信 + */ +extern TCB *receive_data_swait(DTQCB *dtqcb, VP_INT *p_data); + +#endif /* _DATAQUEUE_H_ */ diff --git a/uzume_prototype/kernel/kernel/eventflag.c b/uzume_prototype/kernel/kernel/eventflag.c new file mode 100644 index 0000000..ae314c3 --- /dev/null +++ b/uzume_prototype/kernel/kernel/eventflag.c @@ -0,0 +1,371 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: eventflag.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * イベントフラグ機能 + */ + +#include "jsp_kernel.h" +#include "check.h" +#include "task.h" +#include "wait.h" +#include "eventflag.h" + +/* + * イベントフラグIDの最大値(kernel_cfg.c) + */ +extern const ID tmax_flgid; + +/* + * イベントフラグ初期化ブロックのエリア(kernel_cfg.c) + */ +extern const FLGINIB flginib_table[]; + +/* + * イベントフラグ管理ブロックのエリア(kernel_cfg.c) + */ +extern FLGCB flgcb_table[]; + +/* + * イベントフラグの数 + */ +#define TNUM_FLG ((UINT)(tmax_flgid - TMIN_FLGID + 1)) + +/* + * イベントフラグIDからイベントフラグ管理ブロックを取り出すためのマクロ + */ +#define INDEX_FLG(flgid) ((UINT)((flgid) - TMIN_FLGID)) +#define get_flgcb(flgid) (&(flgcb_table[INDEX_FLG(flgid)])) + +/* + * イベントフラグ待ち情報ブロックの定義 + * + * flgptn は,waiptn および wfmode と同時に使うことはないため,union + * を使えばメモリを節約することが可能である. + */ +typedef struct eventflag_waiting_information { + WINFO winfo; /* 標準の待ち情報ブロック */ + WOBJCB *wobjcb; /* 待ちオブジェクトの管理ブロック */ + FLGPTN waiptn; /* 待ちパターン */ + MODE wfmode; /* 待ちモード */ + FLGPTN flgptn; /* 待ち解除時のパターン */ +} WINFO_FLG; + +/* + * イベントフラグ機能の初期化 + */ +#ifdef __flgini + +void +eventflag_initialize(void) +{ + UINT i; + FLGCB *flgcb; + + for (flgcb = flgcb_table, i = 0; i < TNUM_FLG; flgcb++, i++) { + queue_initialize(&(flgcb->wait_queue)); + flgcb->flginib = &(flginib_table[i]); + flgcb->flgptn = flgcb->flginib->iflgptn; + } +} + +#endif /* __flgini */ + +/* + * イベントフラグ待ち解除条件のチェック + */ +#ifdef __flgcnd + +BOOL +eventflag_cond(FLGCB *flgcb, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn) +{ + if ((wfmode & TWF_ORW) != 0 ? (flgcb->flgptn & waiptn) != 0 + : (flgcb->flgptn & waiptn) == waiptn) { + *p_flgptn = flgcb->flgptn; + if ((flgcb->flginib->flgatr & TA_CLR) != 0) { + flgcb->flgptn = 0; + } + return(TRUE); + } + return(FALSE); +} + +#endif /* __flgcnd */ + +/* + * イベントフラグのセット + */ +#ifdef __set_flg + +SYSCALL ER +set_flg(ID flgid, FLGPTN setptn) +{ + FLGCB *flgcb; + TCB *tcb; + WINFO_FLG *winfo; + ER ercd; + + LOG_SET_FLG_ENTER(flgid, setptn); + CHECK_TSKCTX_UNL(); + CHECK_FLGID(flgid); + flgcb = get_flgcb(flgid); + + t_lock_cpu(); + flgcb->flgptn |= setptn; + if (!(queue_empty(&(flgcb->wait_queue)))) { + tcb = (TCB *)(flgcb->wait_queue.next); + winfo = (WINFO_FLG *)(tcb->winfo); + if (eventflag_cond(flgcb, winfo->waiptn, + winfo->wfmode, &(winfo->flgptn))) { + queue_delete(&(tcb->task_queue)); + if (wait_complete(tcb)) { + dispatch(); + } + } + } + ercd = E_OK; + t_unlock_cpu(); + + exit: + LOG_SET_FLG_LEAVE(ercd); + return(ercd); +} + +#endif /* __set_flg */ + +/* + * イベントフラグのセット(非タスクコンテキスト用) + */ +#ifdef __iset_flg + +SYSCALL ER +iset_flg(ID flgid, FLGPTN setptn) +{ + FLGCB *flgcb; + TCB *tcb; + WINFO_FLG *winfo; + ER ercd; + + LOG_ISET_FLG_ENTER(flgid, setptn); + CHECK_INTCTX_UNL(); + CHECK_FLGID(flgid); + flgcb = get_flgcb(flgid); + + i_lock_cpu(); + flgcb->flgptn |= setptn; + if (!(queue_empty(&(flgcb->wait_queue)))) { + tcb = (TCB *)(flgcb->wait_queue.next); + winfo = (WINFO_FLG *)(tcb->winfo); + if (eventflag_cond(flgcb, winfo->waiptn, + winfo->wfmode, &(winfo->flgptn))) { + queue_delete(&(tcb->task_queue)); + if (wait_complete(tcb)) { + reqflg = TRUE; + } + } + } + ercd = E_OK; + i_unlock_cpu(); + + exit: + LOG_ISET_FLG_LEAVE(ercd); + return(ercd); +} + +#endif /* __iset_flg */ + +/* + * イベントフラグのクリア + */ +#ifdef __clr_flg + +SYSCALL ER +clr_flg(ID flgid, FLGPTN clrptn) +{ + FLGCB *flgcb; + ER ercd; + + LOG_CLR_FLG_ENTER(flgid, clrptn); + CHECK_TSKCTX_UNL(); + CHECK_FLGID(flgid); + flgcb = get_flgcb(flgid); + + t_lock_cpu(); + flgcb->flgptn &= clrptn; + ercd = E_OK; + t_unlock_cpu(); + + exit: + LOG_CLR_FLG_LEAVE(ercd); + return(ercd); +} + +#endif /* __clr_flg */ + +/* + * イベントフラグ待ち + */ +#ifdef __wai_flg + +SYSCALL ER +wai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn) +{ + FLGCB *flgcb; + WINFO_FLG winfo; + ER ercd; + + LOG_WAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn); + CHECK_DISPATCH(); + CHECK_FLGID(flgid); + CHECK_PAR(waiptn != 0); + CHECK_PAR((wfmode & ~TWF_ORW) == 0); + flgcb = get_flgcb(flgid); + + t_lock_cpu(); + if (!(queue_empty(&(flgcb->wait_queue)))) { + ercd = E_ILUSE; + } + else if (eventflag_cond(flgcb, waiptn, wfmode, p_flgptn)) { + ercd = E_OK; + } + else { + winfo.waiptn = waiptn; + winfo.wfmode = wfmode; + wobj_make_wait((WOBJCB *) flgcb, (WINFO_WOBJ *) &winfo); + dispatch(); + ercd = winfo.winfo.wercd; + if (ercd == E_OK) { + *p_flgptn = winfo.flgptn; + } + } + t_unlock_cpu(); + + exit: + LOG_WAI_FLG_LEAVE(ercd, *p_flgptn); + return(ercd); +} + +#endif /* __wai_flg */ + +/* + * イベントフラグ待ち(ポーリング) + */ +#ifdef __pol_flg + +SYSCALL ER +pol_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn) +{ + FLGCB *flgcb; + ER ercd; + + LOG_POL_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn); + CHECK_TSKCTX_UNL(); + CHECK_FLGID(flgid); + CHECK_PAR(waiptn != 0); + CHECK_PAR((wfmode & ~TWF_ORW) == 0); + flgcb = get_flgcb(flgid); + + t_lock_cpu(); + if (!(queue_empty(&(flgcb->wait_queue)))) { + ercd = E_ILUSE; + } + else if (eventflag_cond(flgcb, waiptn, wfmode, p_flgptn)) { + ercd = E_OK; + } + else { + ercd = E_TMOUT; + } + t_unlock_cpu(); + + exit: + LOG_POL_FLG_LEAVE(ercd, *p_flgptn); + return(ercd); +} + +#endif /* __pol_flg */ + +/* + * イベントフラグ待ち(タイムアウトあり) + */ +#ifdef __twai_flg + +SYSCALL ER +twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout) +{ + FLGCB *flgcb; + WINFO_FLG winfo; + TMEVTB tmevtb; + ER ercd; + + LOG_TWAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn, tmout); + CHECK_DISPATCH(); + CHECK_FLGID(flgid); + CHECK_PAR(waiptn != 0); + CHECK_PAR((wfmode & ~TWF_ORW) == 0); + CHECK_TMOUT(tmout); + flgcb = get_flgcb(flgid); + + t_lock_cpu(); + if (!(queue_empty(&(flgcb->wait_queue)))) { + ercd = E_ILUSE; + } + else if (eventflag_cond(flgcb, waiptn, wfmode, p_flgptn)) { + ercd = E_OK; + } + else if (tmout == TMO_POL) { + ercd = E_TMOUT; + } + else { + winfo.waiptn = waiptn; + winfo.wfmode = wfmode; + wobj_make_wait_tmout((WOBJCB *) flgcb, (WINFO_WOBJ *) &winfo, + &tmevtb, tmout); + dispatch(); + ercd = winfo.winfo.wercd; + if (ercd == E_OK) { + *p_flgptn = winfo.flgptn; + } + } + t_unlock_cpu(); + + exit: + LOG_TWAI_FLG_LEAVE(ercd, *p_flgptn); + return(ercd); +} + +#endif /* __twai_flg */ diff --git a/uzume_prototype/kernel/kernel/eventflag.h b/uzume_prototype/kernel/kernel/eventflag.h new file mode 100644 index 0000000..68b3b91 --- /dev/null +++ b/uzume_prototype/kernel/kernel/eventflag.h @@ -0,0 +1,76 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: eventflag.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * イベントフラグ機能 + */ + +#ifndef _EVENTFLAG_H_ +#define _EVENTFLAG_H_ + +#include "queue.h" + +/* + * イベントフラグ初期化ブロック + */ +typedef struct eventflag_initialization_block { + ATR flgatr; /* イベントフラグ属性 */ + FLGPTN iflgptn; /* イベントフラグのビットパターンの初期値 */ +} FLGINIB; + +/* + * イベントフラグ管理ブロック + */ +typedef struct eventflag_control_block { + QUEUE wait_queue; /* イベントフラグ待ちキュー */ + const FLGINIB *flginib; /* イベントフラグ初期化ブロックへのポインタ */ + FLGPTN flgptn; /* イベントフラグ現在パターン */ +} FLGCB; + +/* + * イベントフラグ機能の初期化 + */ +extern void eventflag_initialize(void); + +/* + * イベントフラグ待ち解除条件のチェック + */ +extern BOOL eventflag_cond(FLGCB *flgcb, FLGPTN waiptn, + MODE wfmode, FLGPTN *p_flgptn); + +#endif /* _EVENTFLAG_H_ */ diff --git a/uzume_prototype/kernel/kernel/exception.c b/uzume_prototype/kernel/kernel/exception.c new file mode 100644 index 0000000..08e64f5 --- /dev/null +++ b/uzume_prototype/kernel/kernel/exception.c @@ -0,0 +1,168 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: exception.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * CPU例外管理機能 + */ + +#include "jsp_kernel.h" +#include "task.h" +#include "exception.h" + +/* + * CPU例外ハンドラ番号の数(kernel_cfg.c) + */ +extern const UINT tnum_excno; + +/* + * CPU例外ハンドラ初期化ブロックのエリア(kernel_cfg.c) + */ +extern const EXCINIB excinib_table[]; + +/* + * CPU例外ハンドラ管理機能の初期化 + */ +#ifdef __excini + +void +exception_initialize() +{ + UINT i; + const EXCINIB *excinib; + + for (excinib = excinib_table, i = 0; i < tnum_excno; excinib++, i++) { + define_exc(excinib->excno, excinib->exchdr); + } +} + +#endif /* __excini */ + +/* + * CPU例外の発生したコンテキストの参照 + */ +#ifdef __vxsns_ctx + +SYSCALL BOOL +vxsns_ctx(VP p_excinf) +{ + BOOL state; + + LOG_VXSNS_CTX_ENTER(p_excinf); + state = exc_sense_context(p_excinf) ? TRUE : FALSE; + LOG_VXSNS_CTX_LEAVE(state); + return(state); +} + +#endif /* __vxsns_ctx */ + +/* + * CPU例外の発生した時のCPUロック状態の参照 + */ +#ifdef __vxsns_loc + +SYSCALL BOOL +vxsns_loc(VP p_excinf) +{ + BOOL state; + + LOG_VXSNS_LOC_ENTER(p_excinf); + state = exc_sense_lock(p_excinf) ? TRUE : FALSE; + LOG_VXSNS_LOC_LEAVE(state); + return(state); +} + +#endif /* __vxsns_loc */ + +/* + * CPU例外の発生した時のディスパッチ禁止状態の参照 + * + * sns_dsp と同一の処理内容となる. + */ +#ifdef __vxsns_dsp + +SYSCALL BOOL +vxsns_dsp(VP p_excinf) +{ + BOOL state; + + LOG_VXSNS_DSP_ENTER(p_excinf); + state = !(enadsp) ? TRUE : FALSE; + LOG_VXSNS_DSP_LEAVE(state); + return(state); +} + +#endif /* __vxsns_dsp */ + +/* + * CPU例外の発生した時のディスパッチ保留状態の参照 + */ +#ifdef __vxsns_dpn + +SYSCALL BOOL +vxsns_dpn(VP p_excinf) +{ + BOOL state; + + LOG_VXSNS_DPN_ENTER(p_excinf); + state = (exc_sense_context(p_excinf) || exc_sense_lock(p_excinf) + || !(enadsp)) ? TRUE : FALSE; + LOG_VXSNS_DPN_LEAVE(state); + return(state); +} + +#endif /* __vxsns_dpn */ + +/* + * CPU例外の発生した時のタスク例外処理禁止状態の参照 + * + * sns_tex と同一の処理内容となる. + */ +#ifdef __vxsns_tex + +SYSCALL BOOL +vxsns_tex(VP p_excinf) +{ + BOOL state; + + LOG_VXSNS_TEX_ENTER(p_excinf); + state = (runtsk != NULL && runtsk->enatex) ? FALSE : TRUE; + LOG_VXSNS_TEX_LEAVE(state); + return(state); +} + +#endif /* __vxsns_tex */ diff --git a/uzume_prototype/kernel/kernel/exception.h b/uzume_prototype/kernel/kernel/exception.h new file mode 100644 index 0000000..247acb6 --- /dev/null +++ b/uzume_prototype/kernel/kernel/exception.h @@ -0,0 +1,60 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: exception.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * CPU例外管理機能 + */ + +#ifndef _EXCEPTION_H_ +#define _EXCEPTION_H_ + +/* + * CPU例外ハンドラ初期化ブロック + */ +typedef struct cpu_exception_handler_initialization_block { + EXCNO excno; /* CPU例外ハンドラ番号 */ + ATR excatr; /* CPU例外ハンドラ属性 */ + FP exchdr; /* CPU例外ハンドラの起動番地 */ +} EXCINIB; + +/* + * CPU例外ハンドラ管理機能の初期化 + */ +extern void exception_initialize(void); + +#endif /* _EXCEPTION_H_ */ diff --git a/uzume_prototype/kernel/kernel/interrupt.c b/uzume_prototype/kernel/kernel/interrupt.c new file mode 100644 index 0000000..a4bf5ec --- /dev/null +++ b/uzume_prototype/kernel/kernel/interrupt.c @@ -0,0 +1,72 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: interrupt.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * 割込み管理機能 + */ + +#include "jsp_kernel.h" +#include "interrupt.h" + +/* + * 割込みハンドラ番号の数(kernel_cfg.c) + */ +extern const UINT tnum_inhno; + +/* + * 割込みハンドラ初期化ブロックのエリア(kernel_cfg.c) + */ +extern const INHINIB inhinib_table[]; + +/* + * 割込み管理機能の初期化 + */ +#ifdef __inhini + +void +interrupt_initialize() +{ + UINT i; + const INHINIB *inhinib; + + for (inhinib = inhinib_table, i = 0; i < tnum_inhno; inhinib++, i++) { + define_inh(inhinib->inhno, inhinib->inthdr); + } +} + +#endif /* __inhini */ diff --git a/uzume_prototype/kernel/kernel/interrupt.h b/uzume_prototype/kernel/kernel/interrupt.h new file mode 100644 index 0000000..b4f42fd --- /dev/null +++ b/uzume_prototype/kernel/kernel/interrupt.h @@ -0,0 +1,60 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: interrupt.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * 割込み管理機能 + */ + +#ifndef _INTERRUPT_H_ +#define _INTERRUPT_H_ + +/* + * 割込みハンドラ初期化ブロック + */ +typedef struct interrupt_handler_initialization_block { + INHNO inhno; /* 割込みハンドラ番号 */ + ATR inhatr; /* 割込みハンドラ属性 */ + FP inthdr; /* 割込みハンドラの起動番地 */ +} INHINIB; + +/* + * 割込み管理機能の初期化 + */ +extern void interrupt_initialize(void); + +#endif /* _INTERRUPT_H_ */ diff --git a/uzume_prototype/kernel/kernel/jsp_kernel.h b/uzume_prototype/kernel/kernel/jsp_kernel.h new file mode 100644 index 0000000..e245621 --- /dev/null +++ b/uzume_prototype/kernel/kernel/jsp_kernel.h @@ -0,0 +1,126 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: jsp_kernel.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * JSPカーネル 標準インクルードファイル + * + * このインクルードファイルは,カーネルを構成するプログラムのソースファ + * イルで必ずインクルードするべき標準インクルードファイルである. + * + * アセンブリ言語のソースファイルやシステムコンフィギュレーションファ + * イルからこのファイルをインクルードする時は,_MACRO_ONLY を定義して + * おくことで,マクロ定義以外の記述を除くことができる. + */ + +#ifndef _JSP_KERNEL_H_ +#define _JSP_KERNEL_H_ + +/* + * カーネルの内部識別名のリネーム + */ +#include "jsp_rename.h" + +/* + * アプリケーションと共通のインクルードファイル + */ +#include + +/* + * ターゲット依存情報の定義 + */ +#include + +/* + * オブジェクトIDの最小値の定義 + */ +#define TMIN_TSKID 1 /* タスクIDの最小値 */ +#define TMIN_SEMID 1 /* セマフォIDの最小値 */ +#define TMIN_FLGID 1 /* フラグIDの最小値 */ +#define TMIN_DTQID 1 /* データキューIDの最小値 */ +#define TMIN_MBXID 1 /* メールボックスIDの最小値 */ +#define TMIN_MPFID 1 /* 固定長メモリプールIDの最小値 */ +#define TMIN_CYCID 1 /* 周期ハンドラIDの最小値 */ + +/* + * 優先度の段階数の定義 + */ +#define TNUM_TPRI (TMAX_TPRI - TMIN_TPRI + 1) +#define TNUM_MPRI (TMAX_MPRI - TMIN_MPRI + 1) + +/* + * カーネル内で用いるマクロの定義 + */ +#define SYSCALL + +/* + * ヘッダファイルを持たないモジュールの関数・変数の宣言 + */ +#ifndef _MACRO_ONLY + +/* + * 各モジュールの初期化(kernel_cfg.c) + */ +extern void object_initialize(void); + +/* + * 初期化ルーチンの実行(kernel_cfg.c) + */ +extern void call_inirtn(void); + +/* + * 終了処理ルーチンの実行(kernel_cfg.c) + */ +extern void call_terrtn(void); + +/* + * 起動メッセージの表示(banner.c) + */ +extern void print_banner(void); + +/* + * カーネルの終了処理(startup.c) + */ +extern void kernel_exit(void); + +/* + * カーネル動作状態フラグ(startup.c) + */ +extern BOOL iniflg; + +#endif /* _MACRO_ONLY */ +#endif /* _JSP_KERNEL_H_ */ diff --git a/uzume_prototype/kernel/kernel/jsp_rename.def b/uzume_prototype/kernel/kernel/jsp_rename.def new file mode 100644 index 0000000..4038711 --- /dev/null +++ b/uzume_prototype/kernel/kernel/jsp_rename.def @@ -0,0 +1,132 @@ +# startup.c +iniflg + +# banner.c +print_banner + +# cpu_config.c, cpu_support.S, sys_config.c, sys_support.S +dispatch +exit_and_dispatch +cpu_initialize +cpu_terminate +sys_initialize +sys_exit +sys_putc + +# task.c +runtsk +schedtsk +reqflg +enadsp +ready_queue +ready_primap +task_initialize +search_schedtsk +make_runnable +make_non_runnable +make_dormant +make_active +exit_task +change_priority +rotate_ready_queue +call_texrtn +calltex + +# wait.c +make_wait_tmout +wait_complete +wait_tmout +wait_tmout_ok +wait_cancel +wait_release +wobj_make_wait +wobj_make_wait_tmout +wobj_change_priority + +# time_event.c +systim_offset +current_time +next_time +next_subtime +last_index +tmevt_initialize +tmevt_up +tmevt_down +tmevtb_insert +tmevtb_delete + +# syslog.c +syslog_buffer +syslog_count +syslog_head +syslog_tail +syslog_lost +syslog_logmask +syslog_lowmask +syslog_initialize +syslog_terminate + +# semaphore.c +semaphore_initialize + +# eventflag.c +eventflag_initialize +eventflag_cond + +# dataqueue.c +dataqueue_initialize +enqueue_data +force_enqueue_data +dequeue_data +send_data_rwait +receive_data_swait + +# mailbox.c +mailbox_initialize + +# mempfix.c +mempfix_initialize +mempfix_get_block + +# cyclic.c +cyclic_initialize +tmevtb_enqueue_cyc +call_cychdr + +# interrupt.c +interrupt_initialize + +# exception.c +exception_initialize + +# kernel_cfg.c +object_initialize +call_inirtn +call_terrtn +tmax_tskid +tinib_table +torder_table +tcb_table +tmax_semid +seminib_table +semcb_table +tmax_flgid +flginib_table +flgcb_table +tmax_dtqid +dtqcb_table +dtqinib_table +tmax_mbxid +mbxcb_table +mbxinib_table +tmax_mpfid +mpfinib_table +mpfcb_table +tmax_cycid +cycinib_table +cyccb_table +tnum_inhno +inhinib_table +tnum_excno +excinib_table +tmevt_heap diff --git a/uzume_prototype/kernel/kernel/jsp_rename.h b/uzume_prototype/kernel/kernel/jsp_rename.h new file mode 100644 index 0000000..c787a4a --- /dev/null +++ b/uzume_prototype/kernel/kernel/jsp_rename.h @@ -0,0 +1,339 @@ +/* This file is generated from jsp_rename.def by genrename. */ + +#ifndef _JSP_RENAME_H_ +#define _JSP_RENAME_H_ + +/* + * startup.c + */ +#define iniflg _kernel_iniflg + +/* + * banner.c + */ +#define print_banner _kernel_print_banner + +/* + * cpu_config.c, cpu_support.S, sys_config.c, sys_support.S + */ +#define dispatch _kernel_dispatch +#define exit_and_dispatch _kernel_exit_and_dispatch +#define cpu_initialize _kernel_cpu_initialize +#define cpu_terminate _kernel_cpu_terminate +#define sys_initialize _kernel_sys_initialize +#define sys_exit _kernel_sys_exit +#define sys_putc _kernel_sys_putc + +/* + * task.c + */ +#define runtsk _kernel_runtsk +#define schedtsk _kernel_schedtsk +#define reqflg _kernel_reqflg +#define enadsp _kernel_enadsp +#define ready_queue _kernel_ready_queue +#define ready_primap _kernel_ready_primap +#define task_initialize _kernel_task_initialize +#define search_schedtsk _kernel_search_schedtsk +#define make_runnable _kernel_make_runnable +#define make_non_runnable _kernel_make_non_runnable +#define make_dormant _kernel_make_dormant +#define make_active _kernel_make_active +#define exit_task _kernel_exit_task +#define change_priority _kernel_change_priority +#define rotate_ready_queue _kernel_rotate_ready_queue +#define call_texrtn _kernel_call_texrtn +#define calltex _kernel_calltex + +/* + * wait.c + */ +#define make_wait_tmout _kernel_make_wait_tmout +#define wait_complete _kernel_wait_complete +#define wait_tmout _kernel_wait_tmout +#define wait_tmout_ok _kernel_wait_tmout_ok +#define wait_cancel _kernel_wait_cancel +#define wait_release _kernel_wait_release +#define wobj_make_wait _kernel_wobj_make_wait +#define wobj_make_wait_tmout _kernel_wobj_make_wait_tmout +#define wobj_change_priority _kernel_wobj_change_priority + +/* + * time_event.c + */ +#define systim_offset _kernel_systim_offset +#define current_time _kernel_current_time +#define next_time _kernel_next_time +#define next_subtime _kernel_next_subtime +#define last_index _kernel_last_index +#define tmevt_initialize _kernel_tmevt_initialize +#define tmevt_up _kernel_tmevt_up +#define tmevt_down _kernel_tmevt_down +#define tmevtb_insert _kernel_tmevtb_insert +#define tmevtb_delete _kernel_tmevtb_delete + +/* + * syslog.c + */ +#define syslog_buffer _kernel_syslog_buffer +#define syslog_count _kernel_syslog_count +#define syslog_head _kernel_syslog_head +#define syslog_tail _kernel_syslog_tail +#define syslog_lost _kernel_syslog_lost +#define syslog_logmask _kernel_syslog_logmask +#define syslog_lowmask _kernel_syslog_lowmask +#define syslog_initialize _kernel_syslog_initialize +#define syslog_terminate _kernel_syslog_terminate + +/* + * semaphore.c + */ +#define semaphore_initialize _kernel_semaphore_initialize + +/* + * eventflag.c + */ +#define eventflag_initialize _kernel_eventflag_initialize +#define eventflag_cond _kernel_eventflag_cond + +/* + * dataqueue.c + */ +#define dataqueue_initialize _kernel_dataqueue_initialize +#define enqueue_data _kernel_enqueue_data +#define force_enqueue_data _kernel_force_enqueue_data +#define dequeue_data _kernel_dequeue_data +#define send_data_rwait _kernel_send_data_rwait +#define receive_data_swait _kernel_receive_data_swait + +/* + * mailbox.c + */ +#define mailbox_initialize _kernel_mailbox_initialize + +/* + * mempfix.c + */ +#define mempfix_initialize _kernel_mempfix_initialize +#define mempfix_get_block _kernel_mempfix_get_block + +/* + * cyclic.c + */ +#define cyclic_initialize _kernel_cyclic_initialize +#define tmevtb_enqueue_cyc _kernel_tmevtb_enqueue_cyc +#define call_cychdr _kernel_call_cychdr + +/* + * interrupt.c + */ +#define interrupt_initialize _kernel_interrupt_initialize + +/* + * exception.c + */ +#define exception_initialize _kernel_exception_initialize + +/* + * kernel_cfg.c + */ +#define object_initialize _kernel_object_initialize +#define call_inirtn _kernel_call_inirtn +#define call_terrtn _kernel_call_terrtn +#define tmax_tskid _kernel_tmax_tskid +#define tinib_table _kernel_tinib_table +#define torder_table _kernel_torder_table +#define tcb_table _kernel_tcb_table +#define tmax_semid _kernel_tmax_semid +#define seminib_table _kernel_seminib_table +#define semcb_table _kernel_semcb_table +#define tmax_flgid _kernel_tmax_flgid +#define flginib_table _kernel_flginib_table +#define flgcb_table _kernel_flgcb_table +#define tmax_dtqid _kernel_tmax_dtqid +#define dtqcb_table _kernel_dtqcb_table +#define dtqinib_table _kernel_dtqinib_table +#define tmax_mbxid _kernel_tmax_mbxid +#define mbxcb_table _kernel_mbxcb_table +#define mbxinib_table _kernel_mbxinib_table +#define tmax_mpfid _kernel_tmax_mpfid +#define mpfinib_table _kernel_mpfinib_table +#define mpfcb_table _kernel_mpfcb_table +#define tmax_cycid _kernel_tmax_cycid +#define cycinib_table _kernel_cycinib_table +#define cyccb_table _kernel_cyccb_table +#define tnum_inhno _kernel_tnum_inhno +#define inhinib_table _kernel_inhinib_table +#define tnum_excno _kernel_tnum_excno +#define excinib_table _kernel_excinib_table +#define tmevt_heap _kernel_tmevt_heap + +#ifdef LABEL_ASM + +/* + * startup.c + */ +#define _iniflg __kernel_iniflg + +/* + * banner.c + */ +#define _print_banner __kernel_print_banner + +/* + * cpu_config.c, cpu_support.S, sys_config.c, sys_support.S + */ +#define _dispatch __kernel_dispatch +#define _exit_and_dispatch __kernel_exit_and_dispatch +#define _cpu_initialize __kernel_cpu_initialize +#define _cpu_terminate __kernel_cpu_terminate +#define _sys_initialize __kernel_sys_initialize +#define _sys_exit __kernel_sys_exit +#define _sys_putc __kernel_sys_putc + +/* + * task.c + */ +#define _runtsk __kernel_runtsk +#define _schedtsk __kernel_schedtsk +#define _reqflg __kernel_reqflg +#define _enadsp __kernel_enadsp +#define _ready_queue __kernel_ready_queue +#define _ready_primap __kernel_ready_primap +#define _task_initialize __kernel_task_initialize +#define _search_schedtsk __kernel_search_schedtsk +#define _make_runnable __kernel_make_runnable +#define _make_non_runnable __kernel_make_non_runnable +#define _make_dormant __kernel_make_dormant +#define _make_active __kernel_make_active +#define _exit_task __kernel_exit_task +#define _change_priority __kernel_change_priority +#define _rotate_ready_queue __kernel_rotate_ready_queue +#define _call_texrtn __kernel_call_texrtn +#define _calltex __kernel_calltex + +/* + * wait.c + */ +#define _make_wait_tmout __kernel_make_wait_tmout +#define _wait_complete __kernel_wait_complete +#define _wait_tmout __kernel_wait_tmout +#define _wait_tmout_ok __kernel_wait_tmout_ok +#define _wait_cancel __kernel_wait_cancel +#define _wait_release __kernel_wait_release +#define _wobj_make_wait __kernel_wobj_make_wait +#define _wobj_make_wait_tmout __kernel_wobj_make_wait_tmout +#define _wobj_change_priority __kernel_wobj_change_priority + +/* + * time_event.c + */ +#define _systim_offset __kernel_systim_offset +#define _current_time __kernel_current_time +#define _next_time __kernel_next_time +#define _next_subtime __kernel_next_subtime +#define _last_index __kernel_last_index +#define _tmevt_initialize __kernel_tmevt_initialize +#define _tmevt_up __kernel_tmevt_up +#define _tmevt_down __kernel_tmevt_down +#define _tmevtb_insert __kernel_tmevtb_insert +#define _tmevtb_delete __kernel_tmevtb_delete + +/* + * syslog.c + */ +#define _syslog_buffer __kernel_syslog_buffer +#define _syslog_count __kernel_syslog_count +#define _syslog_head __kernel_syslog_head +#define _syslog_tail __kernel_syslog_tail +#define _syslog_lost __kernel_syslog_lost +#define _syslog_logmask __kernel_syslog_logmask +#define _syslog_lowmask __kernel_syslog_lowmask +#define _syslog_initialize __kernel_syslog_initialize +#define _syslog_terminate __kernel_syslog_terminate + +/* + * semaphore.c + */ +#define _semaphore_initialize __kernel_semaphore_initialize + +/* + * eventflag.c + */ +#define _eventflag_initialize __kernel_eventflag_initialize +#define _eventflag_cond __kernel_eventflag_cond + +/* + * dataqueue.c + */ +#define _dataqueue_initialize __kernel_dataqueue_initialize +#define _enqueue_data __kernel_enqueue_data +#define _force_enqueue_data __kernel_force_enqueue_data +#define _dequeue_data __kernel_dequeue_data +#define _send_data_rwait __kernel_send_data_rwait +#define _receive_data_swait __kernel_receive_data_swait + +/* + * mailbox.c + */ +#define _mailbox_initialize __kernel_mailbox_initialize + +/* + * mempfix.c + */ +#define _mempfix_initialize __kernel_mempfix_initialize +#define _mempfix_get_block __kernel_mempfix_get_block + +/* + * cyclic.c + */ +#define _cyclic_initialize __kernel_cyclic_initialize +#define _tmevtb_enqueue_cyc __kernel_tmevtb_enqueue_cyc +#define _call_cychdr __kernel_call_cychdr + +/* + * interrupt.c + */ +#define _interrupt_initialize __kernel_interrupt_initialize + +/* + * exception.c + */ +#define _exception_initialize __kernel_exception_initialize + +/* + * kernel_cfg.c + */ +#define _object_initialize __kernel_object_initialize +#define _call_inirtn __kernel_call_inirtn +#define _call_terrtn __kernel_call_terrtn +#define _tmax_tskid __kernel_tmax_tskid +#define _tinib_table __kernel_tinib_table +#define _torder_table __kernel_torder_table +#define _tcb_table __kernel_tcb_table +#define _tmax_semid __kernel_tmax_semid +#define _seminib_table __kernel_seminib_table +#define _semcb_table __kernel_semcb_table +#define _tmax_flgid __kernel_tmax_flgid +#define _flginib_table __kernel_flginib_table +#define _flgcb_table __kernel_flgcb_table +#define _tmax_dtqid __kernel_tmax_dtqid +#define _dtqcb_table __kernel_dtqcb_table +#define _dtqinib_table __kernel_dtqinib_table +#define _tmax_mbxid __kernel_tmax_mbxid +#define _mbxcb_table __kernel_mbxcb_table +#define _mbxinib_table __kernel_mbxinib_table +#define _tmax_mpfid __kernel_tmax_mpfid +#define _mpfinib_table __kernel_mpfinib_table +#define _mpfcb_table __kernel_mpfcb_table +#define _tmax_cycid __kernel_tmax_cycid +#define _cycinib_table __kernel_cycinib_table +#define _cyccb_table __kernel_cyccb_table +#define _tnum_inhno __kernel_tnum_inhno +#define _inhinib_table __kernel_inhinib_table +#define _tnum_excno __kernel_tnum_excno +#define _excinib_table __kernel_excinib_table +#define _tmevt_heap __kernel_tmevt_heap + +#endif /* LABEL_ASM */ +#endif /* _JSP_RENAME_H_ */ diff --git a/uzume_prototype/kernel/kernel/jsp_unrename.h b/uzume_prototype/kernel/kernel/jsp_unrename.h new file mode 100644 index 0000000..b9d3283 --- /dev/null +++ b/uzume_prototype/kernel/kernel/jsp_unrename.h @@ -0,0 +1,339 @@ +/* This file is generated from jsp_rename.def by genrename. */ + +#ifdef _JSP_UNRENAME_H_ +#undef _JSP_UNRENAME_H_ + +/* + * startup.c + */ +#undef iniflg + +/* + * banner.c + */ +#undef print_banner + +/* + * cpu_config.c, cpu_support.S, sys_config.c, sys_support.S + */ +#undef dispatch +#undef exit_and_dispatch +#undef cpu_initialize +#undef cpu_terminate +#undef sys_initialize +#undef sys_exit +#undef sys_putc + +/* + * task.c + */ +#undef runtsk +#undef schedtsk +#undef reqflg +#undef enadsp +#undef ready_queue +#undef ready_primap +#undef task_initialize +#undef search_schedtsk +#undef make_runnable +#undef make_non_runnable +#undef make_dormant +#undef make_active +#undef exit_task +#undef change_priority +#undef rotate_ready_queue +#undef call_texrtn +#undef calltex + +/* + * wait.c + */ +#undef make_wait_tmout +#undef wait_complete +#undef wait_tmout +#undef wait_tmout_ok +#undef wait_cancel +#undef wait_release +#undef wobj_make_wait +#undef wobj_make_wait_tmout +#undef wobj_change_priority + +/* + * time_event.c + */ +#undef systim_offset +#undef current_time +#undef next_time +#undef next_subtime +#undef last_index +#undef tmevt_initialize +#undef tmevt_up +#undef tmevt_down +#undef tmevtb_insert +#undef tmevtb_delete + +/* + * syslog.c + */ +#undef syslog_buffer +#undef syslog_count +#undef syslog_head +#undef syslog_tail +#undef syslog_lost +#undef syslog_logmask +#undef syslog_lowmask +#undef syslog_initialize +#undef syslog_terminate + +/* + * semaphore.c + */ +#undef semaphore_initialize + +/* + * eventflag.c + */ +#undef eventflag_initialize +#undef eventflag_cond + +/* + * dataqueue.c + */ +#undef dataqueue_initialize +#undef enqueue_data +#undef force_enqueue_data +#undef dequeue_data +#undef send_data_rwait +#undef receive_data_swait + +/* + * mailbox.c + */ +#undef mailbox_initialize + +/* + * mempfix.c + */ +#undef mempfix_initialize +#undef mempfix_get_block + +/* + * cyclic.c + */ +#undef cyclic_initialize +#undef tmevtb_enqueue_cyc +#undef call_cychdr + +/* + * interrupt.c + */ +#undef interrupt_initialize + +/* + * exception.c + */ +#undef exception_initialize + +/* + * kernel_cfg.c + */ +#undef object_initialize +#undef call_inirtn +#undef call_terrtn +#undef tmax_tskid +#undef tinib_table +#undef torder_table +#undef tcb_table +#undef tmax_semid +#undef seminib_table +#undef semcb_table +#undef tmax_flgid +#undef flginib_table +#undef flgcb_table +#undef tmax_dtqid +#undef dtqcb_table +#undef dtqinib_table +#undef tmax_mbxid +#undef mbxcb_table +#undef mbxinib_table +#undef tmax_mpfid +#undef mpfinib_table +#undef mpfcb_table +#undef tmax_cycid +#undef cycinib_table +#undef cyccb_table +#undef tnum_inhno +#undef inhinib_table +#undef tnum_excno +#undef excinib_table +#undef tmevt_heap + +#ifdef LABEL_ASM + +/* + * startup.c + */ +#undef _iniflg + +/* + * banner.c + */ +#undef _print_banner + +/* + * cpu_config.c, cpu_support.S, sys_config.c, sys_support.S + */ +#undef _dispatch +#undef _exit_and_dispatch +#undef _cpu_initialize +#undef _cpu_terminate +#undef _sys_initialize +#undef _sys_exit +#undef _sys_putc + +/* + * task.c + */ +#undef _runtsk +#undef _schedtsk +#undef _reqflg +#undef _enadsp +#undef _ready_queue +#undef _ready_primap +#undef _task_initialize +#undef _search_schedtsk +#undef _make_runnable +#undef _make_non_runnable +#undef _make_dormant +#undef _make_active +#undef _exit_task +#undef _change_priority +#undef _rotate_ready_queue +#undef _call_texrtn +#undef _calltex + +/* + * wait.c + */ +#undef _make_wait_tmout +#undef _wait_complete +#undef _wait_tmout +#undef _wait_tmout_ok +#undef _wait_cancel +#undef _wait_release +#undef _wobj_make_wait +#undef _wobj_make_wait_tmout +#undef _wobj_change_priority + +/* + * time_event.c + */ +#undef _systim_offset +#undef _current_time +#undef _next_time +#undef _next_subtime +#undef _last_index +#undef _tmevt_initialize +#undef _tmevt_up +#undef _tmevt_down +#undef _tmevtb_insert +#undef _tmevtb_delete + +/* + * syslog.c + */ +#undef _syslog_buffer +#undef _syslog_count +#undef _syslog_head +#undef _syslog_tail +#undef _syslog_lost +#undef _syslog_logmask +#undef _syslog_lowmask +#undef _syslog_initialize +#undef _syslog_terminate + +/* + * semaphore.c + */ +#undef _semaphore_initialize + +/* + * eventflag.c + */ +#undef _eventflag_initialize +#undef _eventflag_cond + +/* + * dataqueue.c + */ +#undef _dataqueue_initialize +#undef _enqueue_data +#undef _force_enqueue_data +#undef _dequeue_data +#undef _send_data_rwait +#undef _receive_data_swait + +/* + * mailbox.c + */ +#undef _mailbox_initialize + +/* + * mempfix.c + */ +#undef _mempfix_initialize +#undef _mempfix_get_block + +/* + * cyclic.c + */ +#undef _cyclic_initialize +#undef _tmevtb_enqueue_cyc +#undef _call_cychdr + +/* + * interrupt.c + */ +#undef _interrupt_initialize + +/* + * exception.c + */ +#undef _exception_initialize + +/* + * kernel_cfg.c + */ +#undef _object_initialize +#undef _call_inirtn +#undef _call_terrtn +#undef _tmax_tskid +#undef _tinib_table +#undef _torder_table +#undef _tcb_table +#undef _tmax_semid +#undef _seminib_table +#undef _semcb_table +#undef _tmax_flgid +#undef _flginib_table +#undef _flgcb_table +#undef _tmax_dtqid +#undef _dtqcb_table +#undef _dtqinib_table +#undef _tmax_mbxid +#undef _mbxcb_table +#undef _mbxinib_table +#undef _tmax_mpfid +#undef _mpfinib_table +#undef _mpfcb_table +#undef _tmax_cycid +#undef _cycinib_table +#undef _cyccb_table +#undef _tnum_inhno +#undef _inhinib_table +#undef _tnum_excno +#undef _excinib_table +#undef _tmevt_heap + +#endif /* LABEL_ASM */ +#endif /* _JSP_UNRENAME_H_ */ diff --git a/uzume_prototype/kernel/kernel/mailbox.c b/uzume_prototype/kernel/kernel/mailbox.c new file mode 100644 index 0000000..0af9c52 --- /dev/null +++ b/uzume_prototype/kernel/kernel/mailbox.c @@ -0,0 +1,298 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: mailbox.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * メールボックス機能 + */ + +#include "jsp_kernel.h" +#include "check.h" +#include "task.h" +#include "wait.h" +#include "mailbox.h" + +/* + * メールボックスIDの最大値(kernel_cfg.c) + */ +extern const ID tmax_mbxid; + +/* + * メールボックス初期化ブロックのエリア(kernel_cfg.c) + */ +extern const MBXINIB mbxinib_table[]; + +/* + * メールボックス管理ブロックのエリア(kernel_cfg.c) + */ +extern MBXCB mbxcb_table[]; + +/* + * メールボックスの数 + */ +#define TNUM_MBX ((UINT)(tmax_mbxid - TMIN_MBXID + 1)) + +/* + * メールボックスIDからメールボックス管理ブロックを取り出すためのマクロ + */ +#define INDEX_MBX(mbxid) ((UINT)((mbxid) - TMIN_MBXID)) +#define get_mbxcb(mbxid) (&(mbxcb_table[INDEX_MBX(mbxid)])) + +/* + * メールボックス待ち情報ブロックの定義 + */ +typedef struct mailbox_waiting_information { + WINFO winfo; /* 標準の待ち情報ブロック */ + WOBJCB *wobjcb; /* 待ちオブジェクトの管理ブロック */ + T_MSG *pk_msg; /* 受信したメッセージ */ +} WINFO_MBX; + +/* + * メールボックス機能の初期化 + */ +#ifdef __mbxini + +void +mailbox_initialize() +{ + UINT i; + MBXCB *mbxcb; + + for (mbxcb = mbxcb_table, i = 0; i < TNUM_MBX; mbxcb++, i++) { + queue_initialize(&(mbxcb->wait_queue)); + mbxcb->mbxinib = &(mbxinib_table[i]); + mbxcb->head = NULL; + } +} + +#endif /* __mbxini */ + +/* + * メッセージ優先度の取出し + */ +#define MSGPRI(pk_msg) (((T_MSG_PRI *) pk_msg)->msgpri) + +/* + * 優先度順メッセージキューへの挿入 + */ +Inline void +enqueue_msg_pri(T_MSG **p_prevmsg_next, T_MSG *pk_msg) +{ + T_MSG *pk_nextmsg; + + while ((pk_nextmsg = *p_prevmsg_next) != NULL) { + if (MSGPRI(pk_nextmsg) > MSGPRI(pk_msg)) { + break; + } + p_prevmsg_next = &(pk_nextmsg->next); + } + pk_msg->next = pk_nextmsg; + *p_prevmsg_next = pk_msg; +} + +/* + * メールボックスへの送信 + */ +#ifdef __snd_mbx + +SYSCALL ER +snd_mbx(ID mbxid, T_MSG *pk_msg) +{ + MBXCB *mbxcb; + TCB *tcb; + ER ercd; + + LOG_SND_MBX_ENTER(mbxid, pk_msg); + CHECK_TSKCTX_UNL(); + CHECK_MBXID(mbxid); + mbxcb = get_mbxcb(mbxid); + CHECK_PAR((mbxcb->mbxinib->mbxatr & TA_MPRI) == 0 + || (TMIN_MPRI <= MSGPRI(pk_msg) + && MSGPRI(pk_msg) <= mbxcb->mbxinib->maxmpri)); + + t_lock_cpu(); + if (!(queue_empty(&(mbxcb->wait_queue)))) { + tcb = (TCB *) queue_delete_next(&(mbxcb->wait_queue)); + ((WINFO_MBX *)(tcb->winfo))->pk_msg = pk_msg; + if (wait_complete(tcb)) { + dispatch(); + } + ercd = E_OK; + } + else if ((mbxcb->mbxinib->mbxatr & TA_MPRI) != 0) { + enqueue_msg_pri(&(mbxcb->head), pk_msg); + ercd = E_OK; + } + else { + pk_msg->next = NULL; + if (mbxcb->head != NULL) { + mbxcb->last->next = pk_msg; + } + else { + mbxcb->head = pk_msg; + } + mbxcb->last = pk_msg; + ercd = E_OK; + } + t_unlock_cpu(); + + exit: + LOG_SND_MBX_LEAVE(ercd); + return(ercd); +} + +#endif /* __snd_mbx */ + +/* + * メールボックスからの受信 + */ +#ifdef __rcv_mbx + +SYSCALL ER +rcv_mbx(ID mbxid, T_MSG **ppk_msg) +{ + MBXCB *mbxcb; + WINFO_MBX winfo; + ER ercd; + + LOG_RCV_MBX_ENTER(mbxid, ppk_msg); + CHECK_DISPATCH(); + CHECK_MBXID(mbxid); + mbxcb = get_mbxcb(mbxid); + + t_lock_cpu(); + if (mbxcb->head != NULL) { + *ppk_msg = mbxcb->head; + mbxcb->head = (*ppk_msg)->next; + ercd = E_OK; + } + else { + wobj_make_wait((WOBJCB *) mbxcb, (WINFO_WOBJ *) &winfo); + dispatch(); + ercd = winfo.winfo.wercd; + if (ercd == E_OK) { + *ppk_msg = winfo.pk_msg; + } + } + t_unlock_cpu(); + + exit: + LOG_RCV_MBX_LEAVE(ercd, *ppk_msg); + return(ercd); +} + +#endif /* __rcv_mbx */ + +/* + * メールボックスからの受信(ポーリング) + */ +#ifdef __prcv_mbx + +SYSCALL ER +prcv_mbx(ID mbxid, T_MSG **ppk_msg) +{ + MBXCB *mbxcb; + ER ercd; + + LOG_PRCV_MBX_ENTER(mbxid, ppk_msg); + CHECK_TSKCTX_UNL(); + CHECK_MBXID(mbxid); + mbxcb = get_mbxcb(mbxid); + + t_lock_cpu(); + if (mbxcb->head != NULL) { + *ppk_msg = mbxcb->head; + mbxcb->head = (*ppk_msg)->next; + ercd = E_OK; + } + else { + ercd = E_TMOUT; + } + t_unlock_cpu(); + + exit: + LOG_PRCV_MBX_LEAVE(ercd, *ppk_msg); + return(ercd); +} + +#endif /* __prcv_mbx */ + +/* + * メールボックスからの受信(タイムアウトあり) + */ +#ifdef __trcv_mbx + +SYSCALL ER +trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout) +{ + MBXCB *mbxcb; + WINFO_MBX winfo; + TMEVTB tmevtb; + ER ercd; + + LOG_TRCV_MBX_ENTER(mbxid, ppk_msg, tmout); + CHECK_DISPATCH(); + CHECK_MBXID(mbxid); + CHECK_TMOUT(tmout); + mbxcb = get_mbxcb(mbxid); + + t_lock_cpu(); + if (mbxcb->head != NULL) { + *ppk_msg = mbxcb->head; + mbxcb->head = (*ppk_msg)->next; + ercd = E_OK; + } + else if (tmout == TMO_POL) { + ercd = E_TMOUT; + } + else { + wobj_make_wait_tmout((WOBJCB *) mbxcb, (WINFO_WOBJ *) &winfo, + &tmevtb, tmout); + dispatch(); + ercd = winfo.winfo.wercd; + if (ercd == E_OK) { + *ppk_msg = winfo.pk_msg; + } + } + t_unlock_cpu(); + + exit: + LOG_TRCV_MBX_LEAVE(ercd, *ppk_msg); + return(ercd); +} + +#endif /* __trcv_mbx */ diff --git a/uzume_prototype/kernel/kernel/mailbox.h b/uzume_prototype/kernel/kernel/mailbox.h new file mode 100644 index 0000000..fe568ec --- /dev/null +++ b/uzume_prototype/kernel/kernel/mailbox.h @@ -0,0 +1,73 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: mailbox.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * メールボックス機能 + */ + +#ifndef _MAILBOX_H_ +#define _MAILBOX_H_ + +#include "queue.h" + +/* + * メールボックス初期化ブロック + */ +typedef struct mailbox_initialization_block { + ATR mbxatr; /* メールボックス属性 */ + PRI maxmpri; /* メッセージ優先度の最大値 */ +} MBXINIB; + +/* + * メールボックス管理ブロック + * + * メッセージキューがメッセージの優先度順の場合には,last は使わない. + */ +typedef struct mailbox_control_block { + QUEUE wait_queue; /* メールボックス待ちキュー */ + const MBXINIB *mbxinib; /* メールボックス初期化ブロックへのポインタ */ + T_MSG *head; /* 先頭のメッセージ */ + T_MSG *last; /* 末尾のメッセージ */ +} MBXCB; + +/* + * メールボックス機能の初期化 + */ +extern void mailbox_initialize(void); + +#endif /* _MAILBOX_H_ */ diff --git a/uzume_prototype/kernel/kernel/mempfix.c b/uzume_prototype/kernel/kernel/mempfix.c new file mode 100644 index 0000000..38ae975 --- /dev/null +++ b/uzume_prototype/kernel/kernel/mempfix.c @@ -0,0 +1,293 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2005 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: mempfix.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * 固定長メモリプール機能 + */ + +#include "jsp_kernel.h" +#include "check.h" +#include "task.h" +#include "wait.h" +#include "mempfix.h" + +/* + * 固定長メモリプールIDの最大値(kernel_cfg.c) + */ +extern const ID tmax_mpfid; + +/* + * 固定長メモリプール初期化ブロックのエリア(kernel_cfg.c) + */ +extern const MPFINIB mpfinib_table[]; + +/* + * 固定長メモリプール管理ブロックのエリア(kernel_cfg.c) + */ +extern MPFCB mpfcb_table[]; + +/* + * 固定長メモリプールの数 + */ +#define TNUM_MPF ((UINT)(tmax_mpfid - TMIN_MPFID + 1)) + +/* + * 固定長メモリプールIDから固定長メモリプール管理ブロックを取り出すた + * めのマクロ + */ +#define INDEX_MPF(mpfid) ((UINT)((mpfid) - TMIN_MPFID)) +#define get_mpfcb(mpfid) (&(mpfcb_table[INDEX_MPF(mpfid)])) + +/* + * 固定長メモリプール待ち情報ブロックの定義 + */ +typedef struct fixed_memorypool_waiting_information { + WINFO winfo; /* 標準の待ち情報ブロック */ + WOBJCB *wobjcb; /* 待ちオブジェクトの管理ブロック */ + VP blk; /* 獲得したメモリブロック */ +} WINFO_MPF; + +/* + * 固定長メモリプール機能の初期化 + */ +#ifdef __mpfini + +void +mempfix_initialize() +{ + UINT i; + MPFCB *mpfcb; + + for (mpfcb = mpfcb_table, i = 0; i < TNUM_MPF; mpfcb++, i++) { + queue_initialize(&(mpfcb->wait_queue)); + mpfcb->mpfinib = &(mpfinib_table[i]); + mpfcb->unused = mpfcb->mpfinib->mpf; + mpfcb->freelist = NULL; + } +} + +#endif /* __mpfini */ + +/* + * 固定長メモリプールからブロックを獲得 + */ +#ifdef __mpfget + +BOOL +mempfix_get_block(MPFCB *mpfcb, VP *p_blk) +{ + FREEL *free; + + if (mpfcb->freelist != NULL) { + free = mpfcb->freelist; + mpfcb->freelist = free->next; + *p_blk = (VP) free; + return(TRUE); + } + else if (mpfcb->unused < mpfcb->mpfinib->limit) { + *p_blk = mpfcb->unused; + mpfcb->unused = (VP)((char *)(mpfcb->unused) + + mpfcb->mpfinib->blksz); + return(TRUE); + } + return(FALSE); +} + +#endif /* __mpfget */ + +/* + * 固定長メモリブロックの獲得 + */ +#ifdef __get_mpf + +SYSCALL ER +get_mpf(ID mpfid, VP *p_blk) +{ + MPFCB *mpfcb; + WINFO_MPF winfo; + ER ercd; + + LOG_GET_MPF_ENTER(mpfid, p_blk); + CHECK_DISPATCH(); + CHECK_MPFID(mpfid); + mpfcb = get_mpfcb(mpfid); + + t_lock_cpu(); + if (mempfix_get_block(mpfcb, p_blk)) { + ercd = E_OK; + } + else { + wobj_make_wait((WOBJCB *) mpfcb, (WINFO_WOBJ *) &winfo); + dispatch(); + ercd = winfo.winfo.wercd; + if (ercd == E_OK) { + *p_blk = winfo.blk; + } + } + t_unlock_cpu(); + + exit: + LOG_GET_MPF_LEAVE(ercd, *p_blk); + return(ercd); +} + +#endif /* __get_mpf */ + +/* + * 固定長メモリブロックの獲得(ポーリング) + */ +#ifdef __pget_mpf + +SYSCALL ER +pget_mpf(ID mpfid, VP *p_blk) +{ + MPFCB *mpfcb; + ER ercd; + + LOG_PGET_MPF_ENTER(mpfid, p_blk); + CHECK_TSKCTX_UNL(); + CHECK_MPFID(mpfid); + mpfcb = get_mpfcb(mpfid); + + t_lock_cpu(); + if (mempfix_get_block(mpfcb, p_blk)) { + ercd = E_OK; + } + else { + ercd = E_TMOUT; + } + t_unlock_cpu(); + + exit: + LOG_PGET_MPF_LEAVE(ercd, *p_blk); + return(ercd); +} + +#endif /* __pget_mpf */ + +/* + * 固定長メモリブロックの獲得(タイムアウトあり) + */ +#ifdef __tget_mpf + +SYSCALL ER +tget_mpf(ID mpfid, VP *p_blk, TMO tmout) +{ + MPFCB *mpfcb; + WINFO_MPF winfo; + TMEVTB tmevtb; + ER ercd; + + LOG_TGET_MPF_ENTER(mpfid, p_blk, tmout); + CHECK_DISPATCH(); + CHECK_MPFID(mpfid); + CHECK_TMOUT(tmout); + mpfcb = get_mpfcb(mpfid); + + t_lock_cpu(); + if (mempfix_get_block(mpfcb, p_blk)) { + ercd = E_OK; + } + else if (tmout == TMO_POL) { + ercd = E_TMOUT; + } + else { + wobj_make_wait_tmout((WOBJCB *) mpfcb, (WINFO_WOBJ *) &winfo, + &tmevtb, tmout); + dispatch(); + ercd = winfo.winfo.wercd; + if (ercd == E_OK) { + *p_blk = winfo.blk; + } + } + t_unlock_cpu(); + + exit: + LOG_TGET_MPF_LEAVE(ercd, *p_blk); + return(ercd); +} + +#endif /* __tget_mpf */ + +/* + * 固定長メモリブロックの返却 + */ +#ifdef __rel_mpf + +SYSCALL ER +rel_mpf(ID mpfid, VP blk) +{ + MPFCB *mpfcb; + TCB *tcb; + FREEL *free; + ER ercd; + + LOG_REL_MPF_ENTER(mpfid, blk); + CHECK_TSKCTX_UNL(); + CHECK_MPFID(mpfid); + mpfcb = get_mpfcb(mpfid); + CHECK_PAR(mpfcb->mpfinib->mpf <= blk + && blk < mpfcb->mpfinib->limit + && ((char *)(blk) - (char *)(mpfcb->mpfinib->mpf)) + % mpfcb->mpfinib->blksz == 0); + + t_lock_cpu(); + if (!(queue_empty(&(mpfcb->wait_queue)))) { + tcb = (TCB *) queue_delete_next(&(mpfcb->wait_queue)); + ((WINFO_MPF *)(tcb->winfo))->blk = blk; + if (wait_complete(tcb)) { + dispatch(); + } + ercd = E_OK; + } + else { + free = (FREEL *) blk; + free->next = mpfcb->freelist; + mpfcb->freelist = free; + ercd = E_OK; + } + t_unlock_cpu(); + + exit: + LOG_REL_MPF_LEAVE(ercd); + return(ercd); +} + +#endif /* __rel_mpf */ diff --git a/uzume_prototype/kernel/kernel/mempfix.h b/uzume_prototype/kernel/kernel/mempfix.h new file mode 100644 index 0000000..70d9828 --- /dev/null +++ b/uzume_prototype/kernel/kernel/mempfix.h @@ -0,0 +1,85 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: mempfix.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * 固定長メモリプール機能 + */ + +#ifndef _MEMPFIX_H_ +#define _MEMPFIX_H_ + +#include "queue.h" + +/* + * 固定長メモリプール初期化ブロック + */ +typedef struct fixed_memorypool_initialization_block { + ATR mpfatr; /* 固定長メモリプール属性 */ + UINT blksz; /* メモリブロックのサイズ(丸めた値) */ + VP mpf; /* 固定長メモリプール領域の先頭番地 */ + VP limit; /* 固定長メモリプール領域の上限番地 */ +} MPFINIB; + +/* + * 空ブロックリストの定義 + */ +typedef struct free_list { + struct free_list *next; +} FREEL; + +/* + * 固定長メモリプール管理ブロック + */ +typedef struct fixed_memorypool_control_block { + QUEUE wait_queue; /* 固定長メモリプール待ちキュー */ + const MPFINIB *mpfinib; /* 固定長メモリプール初期化ブロック */ + VP unused; /* 未使用領域の先頭番地 */ + FREEL *freelist; /* 空きブロックのリスト */ +} MPFCB; + +/* + * 固定長メモリプール機能の初期化 + */ +extern void mempfix_initialize(void); + +/* + * 固定長メモリプールからブロックを獲得 + */ +extern BOOL mempfix_get_block(MPFCB *mpfcb, VP *p_blk); + +#endif /* _MEMPFIX_H_ */ diff --git a/uzume_prototype/kernel/kernel/queue.h b/uzume_prototype/kernel/kernel/queue.h new file mode 100644 index 0000000..c1273d1 --- /dev/null +++ b/uzume_prototype/kernel/kernel/queue.h @@ -0,0 +1,133 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: queue.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * キュー操作ライブラリ + * + * このキュー操作ライブラリでは,キューヘッダを含むリング構造のダブル + * リンクキューを扱う.具体的には,キューヘッダの次エントリはキューの + * 先頭のエントリ,前エントリはキューの末尾のエントリとする.また,キ + * ューの先頭のエントリの前エントリと,キューの末尾のエントリの次エン + * トリは,キューヘッダとする.空のキューは,次エントリ,前エントリと + * も自分自身を指すキューヘッダであらわす. + */ + +#ifndef _QUEUE_H_ +#define _QUEUE_H_ + +/* + * キューのデータ構造の定義 + */ +typedef struct queue { + struct queue *next; /* 次エントリへのポインタ */ + struct queue *prev; /* 前エントリへのポインタ */ +} QUEUE; + +/* + * キューの初期化 + * + * queue にはキューヘッダを指定する. + */ +Inline void +queue_initialize(QUEUE *queue) +{ + queue->prev = queue->next = queue; +} + +/* + * キューの前エントリへの挿入 + * + * queue の前に entry を挿入する.queue にキューヘッダを指定した場合 + * には,キューの末尾に entry を挿入することになる. + */ +Inline void +queue_insert_prev(QUEUE *queue, QUEUE *entry) +{ + entry->prev = queue->prev; + entry->next = queue; + queue->prev->next = entry; + queue->prev = entry; +} + +/* + * エントリの削除 + * + * entry をキューから削除する. + */ +Inline void +queue_delete(QUEUE *entry) +{ + entry->prev->next = entry->next; + entry->next->prev = entry->prev; +} + +/* + * キューの次エントリの取出し + * + * queue の次エントリをキューから削除し,削除したエントリを返す.queue + * にキューヘッダを指定した場合には,キューの先頭のエントリを取り出す + * ことになる.queue に空のキューを指定して呼び出してはならない. + */ +Inline QUEUE * +queue_delete_next(QUEUE *queue) +{ + QUEUE *entry; + + assert(queue->next != queue); + entry = queue->next; + queue->next = entry->next; + entry->next->prev = queue; + return(entry); +} + +/* + * キューが空かどうかのチェック + * + * queue にはキューヘッダを指定する. + */ +Inline BOOL +queue_empty(QUEUE *queue) +{ + if (queue->next == queue) { + assert(queue->prev == queue); + return(TRUE); + } + return(FALSE); +} + +#endif /* _QUEUE_H_ */ diff --git a/uzume_prototype/kernel/kernel/semaphore.c b/uzume_prototype/kernel/kernel/semaphore.c new file mode 100644 index 0000000..5dd29d4 --- /dev/null +++ b/uzume_prototype/kernel/kernel/semaphore.c @@ -0,0 +1,285 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: semaphore.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * セマフォ機能 + */ + +#include "jsp_kernel.h" +#include "check.h" +#include "task.h" +#include "wait.h" +#include "semaphore.h" + +/* + * セマフォIDの最大値(kernel_cfg.c) + */ +extern const ID tmax_semid; + +/* + * セマフォ初期化ブロックのエリア(kernel_cfg.c) + */ +extern const SEMINIB seminib_table[]; + +/* + * セマフォ管理ブロックのエリア(kernel_cfg.c) + */ +extern SEMCB semcb_table[]; + +/* + * セマフォの数 + */ +#define TNUM_SEM ((UINT)(tmax_semid - TMIN_SEMID + 1)) + +/* + * セマフォIDからセマフォ管理ブロックを取り出すためのマクロ + */ +#define INDEX_SEM(semid) ((UINT)((semid) - TMIN_SEMID)) +#define get_semcb(semid) (&(semcb_table[INDEX_SEM(semid)])) + +/* + * セマフォ機能の初期化 + */ +#ifdef __semini + +void +semaphore_initialize() +{ + UINT i; + SEMCB *semcb; + + for (semcb = semcb_table, i = 0; i < TNUM_SEM; semcb++, i++) { + queue_initialize(&(semcb->wait_queue)); + semcb->seminib = &(seminib_table[i]); + semcb->semcnt = semcb->seminib->isemcnt; + } +} + +#endif /* __semini */ + +/* + * セマフォ資源の返却 + */ +#ifdef __sig_sem + +SYSCALL ER +sig_sem(ID semid) +{ + SEMCB *semcb; + TCB *tcb; + ER ercd; + + LOG_SIG_SEM_ENTER(semid); + CHECK_TSKCTX_UNL(); + CHECK_SEMID(semid); + semcb = get_semcb(semid); + + t_lock_cpu(); + if (!(queue_empty(&(semcb->wait_queue)))) { + tcb = (TCB *) queue_delete_next(&(semcb->wait_queue)); + if (wait_complete(tcb)) { + dispatch(); + } + ercd = E_OK; + } + else if (semcb->semcnt < semcb->seminib->maxsem) { + semcb->semcnt += 1; + ercd = E_OK; + } + else { + ercd = E_QOVR; + } + t_unlock_cpu(); + + exit: + LOG_SIG_SEM_LEAVE(ercd); + return(ercd); +} + +#endif /* __sig_sem */ + +/* + * セマフォ資源の返却(非タスクコンテキスト用) + */ +#ifdef __isig_sem + +SYSCALL ER +isig_sem(ID semid) +{ + SEMCB *semcb; + TCB *tcb; + ER ercd; + + LOG_ISIG_SEM_ENTER(semid); + CHECK_INTCTX_UNL(); + CHECK_SEMID(semid); + semcb = get_semcb(semid); + + i_lock_cpu(); + if (!queue_empty(&(semcb->wait_queue))) { + tcb = (TCB *) queue_delete_next(&(semcb->wait_queue)); + if (wait_complete(tcb)) { + reqflg = TRUE; + } + ercd = E_OK; + } + else if (semcb->semcnt < semcb->seminib->maxsem) { + semcb->semcnt += 1; + ercd = E_OK; + } + else { + ercd = E_QOVR; + } + i_unlock_cpu(); + + exit: + LOG_ISIG_SEM_LEAVE(ercd); + return(ercd); +} + +#endif /* __isig_sem */ + +/* + * セマフォ資源の獲得 + */ +#ifdef __wai_sem + +SYSCALL ER +wai_sem(ID semid) +{ + SEMCB *semcb; + WINFO_WOBJ winfo; + ER ercd; + + LOG_WAI_SEM_ENTER(semid); + CHECK_DISPATCH(); + CHECK_SEMID(semid); + semcb = get_semcb(semid); + + t_lock_cpu(); + if (semcb->semcnt >= 1) { + semcb->semcnt -= 1; + ercd = E_OK; + } + else { + wobj_make_wait((WOBJCB *) semcb, &winfo); + dispatch(); + ercd = winfo.winfo.wercd; + } + t_unlock_cpu(); + + exit: + LOG_WAI_SEM_LEAVE(ercd); + return(ercd); +} + +#endif /* __wai_sem */ + +/* + * セマフォ資源の獲得(ポーリング) + */ +#ifdef __pol_sem + +SYSCALL ER +pol_sem(ID semid) +{ + SEMCB *semcb; + ER ercd; + + LOG_POL_SEM_ENTER(semid); + CHECK_TSKCTX_UNL(); + CHECK_SEMID(semid); + semcb = get_semcb(semid); + + t_lock_cpu(); + if (semcb->semcnt >= 1) { + semcb->semcnt -= 1; + ercd = E_OK; + } + else { + ercd = E_TMOUT; + } + t_unlock_cpu(); + + exit: + LOG_POL_SEM_LEAVE(ercd); + return(ercd); +} + +#endif /* __pol_sem */ + +/* + * セマフォ資源の獲得(タイムアウトあり) + */ +#ifdef __twai_sem + +SYSCALL ER +twai_sem(ID semid, TMO tmout) +{ + SEMCB *semcb; + WINFO_WOBJ winfo; + TMEVTB tmevtb; + ER ercd; + + LOG_TWAI_SEM_ENTER(semid, tmout); + CHECK_DISPATCH(); + CHECK_SEMID(semid); + CHECK_TMOUT(tmout); + semcb = get_semcb(semid); + + t_lock_cpu(); + if (semcb->semcnt >= 1) { + semcb->semcnt -= 1; + ercd = E_OK; + } + else if (tmout == TMO_POL) { + ercd = E_TMOUT; + } + else { + wobj_make_wait_tmout((WOBJCB *) semcb, &winfo, &tmevtb, tmout); + dispatch(); + ercd = winfo.winfo.wercd; + } + t_unlock_cpu(); + + exit: + LOG_TWAI_SEM_LEAVE(ercd); + return(ercd); +} + +#endif /* __twai_sem */ diff --git a/uzume_prototype/kernel/kernel/semaphore.h b/uzume_prototype/kernel/kernel/semaphore.h new file mode 100644 index 0000000..7fb5d35 --- /dev/null +++ b/uzume_prototype/kernel/kernel/semaphore.h @@ -0,0 +1,71 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: semaphore.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * セマフォ機能 + */ + +#ifndef _SEMAPHORE_H_ +#define _SEMAPHORE_H_ + +#include "queue.h" + +/* + * セマフォ初期化ブロック + */ +typedef struct semaphore_initialization_block { + ATR sematr; /* セマフォ属性 */ + UINT isemcnt; /* セマフォの資源数の初期値 */ + UINT maxsem; /* セマフォの最大資源数 */ +} SEMINIB; + +/* + * セマフォ管理ブロック + */ +typedef struct semaphore_control_block { + QUEUE wait_queue; /* セマフォ待ちキュー */ + const SEMINIB *seminib; /* セマフォ初期化ブロックへのポインタ */ + UINT semcnt; /* セマフォ現在カウント値 */ +} SEMCB; + +/* + * セマフォ機能の初期化 + */ +extern void semaphore_initialize(void); + +#endif /* _SEMAPHORE_H_ */ diff --git a/uzume_prototype/kernel/kernel/startup.c b/uzume_prototype/kernel/kernel/startup.c new file mode 100644 index 0000000..ae3e42c --- /dev/null +++ b/uzume_prototype/kernel/kernel/startup.c @@ -0,0 +1,135 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: startup.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * カーネルの初期化と終了処理 + */ + +#include "jsp_kernel.h" +#include "time_event.h" +#include "syslog.h" + +/* + * カーネル動作状態フラグ + */ +BOOL iniflg; + +/* + * カーネルの初期化 + */ +void +kernel_start() +{ + /* + * ターゲット依存の初期化 + */ + cpu_initialize(); + sys_initialize(); + tool_initialize(); + + /* + * システムログ機能の初期化 + */ + syslog_initialize(); + + /* + * 起動メッセージの表示 + */ + print_banner(); + + /* + * 各モジュールの初期化 + * + * タイムイベント管理モジュールは他のモジュールより先に初期化 + * する必要がある. + */ + tmevt_initialize(); + object_initialize(); + + /* + * 初期化ルーチンの実行 + */ + call_inirtn(); + + /* + * カーネル動作の開始 + */ + iniflg = TRUE; + exit_and_dispatch(); +} + +/* + * カーネルの終了処理 + */ +void +kernel_exit() +{ + /* + * 割込みを禁止 + */ + if (!sense_lock()) { + if (sense_context()) { + i_lock_cpu(); + } + else { + t_lock_cpu(); + } + } + iniflg = FALSE; + + /* + * 終了処理ルーチンの実行 + */ + call_terrtn(); + + /* + * atexit の処理とデストラクタの実行 + */ + call_atexit(); + + /* + * システムログ機能の終了処理 + */ + syslog_terminate(); + + /* + * ターゲット依存の終了処理 + */ + cpu_terminate(); + sys_exit(); +} diff --git a/uzume_prototype/kernel/kernel/sys_manage.c b/uzume_prototype/kernel/kernel/sys_manage.c new file mode 100644 index 0000000..ddf8714 --- /dev/null +++ b/uzume_prototype/kernel/kernel/sys_manage.c @@ -0,0 +1,404 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: sys_manage.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * システム状態管理機能 + */ + +#include "jsp_kernel.h" +#include "check.h" +#include "task.h" + +/* + * タスクの優先順位の回転 + */ +#ifdef __rot_rdq + +SYSCALL ER +rot_rdq(PRI tskpri) +{ + UINT pri; + ER ercd; + + LOG_ROT_RDQ_ENTER(tskpri); + CHECK_TSKCTX_UNL(); + CHECK_TPRI_SELF(tskpri); + + t_lock_cpu(); + pri = (tskpri == TPRI_SELF) ? runtsk->priority : INT_PRIORITY(tskpri); + if (rotate_ready_queue(pri)) { + dispatch(); + } + ercd = E_OK; + t_unlock_cpu(); + + exit: + LOG_ROT_RDQ_LEAVE(ercd); + return(ercd); +} + +#endif /* __rot_rdq */ + +/* + * タスクの優先順位の回転(非タスクコンテキスト用) + */ +#ifdef __irot_rdq + +SYSCALL ER +irot_rdq(PRI tskpri) +{ + ER ercd; + + LOG_IROT_RDQ_ENTER(tskpri); + CHECK_INTCTX_UNL(); + CHECK_TPRI(tskpri); + + i_lock_cpu(); + if (rotate_ready_queue(INT_PRIORITY(tskpri))) { + reqflg = TRUE; + } + ercd = E_OK; + i_unlock_cpu(); + + exit: + LOG_IROT_RDQ_LEAVE(ercd); + return(ercd); +} + +#endif /* __irot_rdq */ + +/* + * 実行状態のタスクIDの参照 + */ +#ifdef __get_tid + +SYSCALL ER +get_tid(ID *p_tskid) +{ + ER ercd; + + LOG_GET_TID_ENTER(p_tskid); + CHECK_TSKCTX_UNL(); + + t_lock_cpu(); + *p_tskid = TSKID(runtsk); + ercd = E_OK; + t_unlock_cpu(); + + exit: + LOG_GET_TID_LEAVE(ercd, *p_tskid); + return(ercd); +} + +#endif /* __get_tid */ + +/* + * 実行状態のタスクIDの参照(非タスクコンテキスト用) + */ +#ifdef __iget_tid + +SYSCALL ER +iget_tid(ID *p_tskid) +{ + ER ercd; + + LOG_IGET_TID_ENTER(p_tskid); + CHECK_INTCTX_UNL(); + + i_lock_cpu(); + *p_tskid = (runtsk == NULL) ? TSK_NONE : TSKID(runtsk); + ercd = E_OK; + i_unlock_cpu(); + + exit: + LOG_IGET_TID_LEAVE(ercd, *p_tskid); + return(ercd); +} + +#endif /* __iget_tid */ + +/* + * CPUロック状態への移行 + */ +#ifdef __loc_cpu + +SYSCALL ER +loc_cpu(void) +{ + ER ercd; + + LOG_LOC_CPU_ENTER(); + CHECK_TSKCTX(); + + if (!(t_sense_lock())) { + t_lock_cpu(); + } + ercd = E_OK; + + exit: + LOG_LOC_CPU_LEAVE(ercd); + return(ercd); +} + +#endif /* __loc_cpu */ + +/* + * CPUロック状態への移行(非タスクコンテキスト用) + */ +#ifdef __iloc_cpu + +SYSCALL ER +iloc_cpu(void) +{ + ER ercd; + + LOG_ILOC_CPU_ENTER(); + CHECK_INTCTX(); + + if (!(i_sense_lock())) { + i_lock_cpu(); + } + ercd = E_OK; + + exit: + LOG_ILOC_CPU_LEAVE(ercd); + return(ercd); +} + +#endif /* __iloc_cpu */ + +/* + * CPUロック状態の解除 + * + * CPUロック中は,ディスパッチが必要となるサービスコールを呼び出すこ + * とはできないため,CPUロック状態の解除時にディスパッチャを起動する + * 必要はない. + */ +#ifdef __unl_cpu + +SYSCALL ER +unl_cpu(void) +{ + ER ercd; + + LOG_UNL_CPU_ENTER(); + CHECK_TSKCTX(); + + if (t_sense_lock()) { + t_unlock_cpu(); + } + ercd = E_OK; + + exit: + LOG_UNL_CPU_LEAVE(ercd); + return(ercd); +} + +#endif /* __unl_cpu */ + +/* + * CPUロック状態の解除(非タスクコンテキスト用) + * + * CPUロック中は,ディスパッチが必要となるサービスコールを呼び出すこ + * とはできないため,CPUロック状態の解除時にディスパッチャの起動を要 + * 求する必要はない. + */ +#ifdef __iunl_cpu + +SYSCALL ER +iunl_cpu(void) +{ + ER ercd; + + LOG_IUNL_CPU_ENTER(); + CHECK_INTCTX(); + + if (i_sense_lock()) { + i_unlock_cpu(); + } + ercd = E_OK; + + exit: + LOG_IUNL_CPU_LEAVE(ercd); + return(ercd); +} + +#endif /* __iunl_cpu */ + +/* + * ディスパッチの禁止 + */ +#ifdef __dis_dsp + +SYSCALL ER +dis_dsp(void) +{ + ER ercd; + + LOG_DIS_DSP_ENTER(); + CHECK_TSKCTX_UNL(); + + t_lock_cpu(); + enadsp = FALSE; + ercd = E_OK; + t_unlock_cpu(); + + exit: + LOG_DIS_DSP_LEAVE(ercd); + return(ercd); +} + +#endif /* __dis_dsp */ + +/* + * ディスパッチの許可 + */ +#ifdef __ena_dsp + +SYSCALL ER +ena_dsp(void) +{ + ER ercd; + + LOG_ENA_DSP_ENTER(); + CHECK_TSKCTX_UNL(); + + t_lock_cpu(); + enadsp = TRUE; + if (runtsk != schedtsk) { + dispatch(); + } + ercd = E_OK; + t_unlock_cpu(); + + exit: + LOG_ENA_DSP_LEAVE(ercd); + return(ercd); +} + +#endif /* __ena_dsp */ + +/* + * コンテキストの参照 + */ +#ifdef __sns_ctx + +SYSCALL BOOL +sns_ctx(void) +{ + BOOL state; + + LOG_SNS_CTX_ENTER(); + state = sense_context() ? TRUE : FALSE; + LOG_SNS_CTX_LEAVE(state); + return(state); +} + +#endif /* __sns_ctx */ + +/* + * CPUロック状態の参照 + */ +#ifdef __sns_loc + +SYSCALL BOOL +sns_loc(void) +{ + BOOL state; + + LOG_SNS_LOC_ENTER(); + state = sense_lock() ? TRUE : FALSE; + LOG_SNS_LOC_LEAVE(state); + return(state); +} + +#endif /* __sns_loc */ + +/* + * ディスパッチ禁止状態の参照 + */ +#ifdef __sns_dsp + +SYSCALL BOOL +sns_dsp(void) +{ + BOOL state; + + LOG_SNS_DSP_ENTER(); + state = !(enadsp) ? TRUE : FALSE; + LOG_SNS_DSP_LEAVE(state); + return(state); +} + +#endif /* __sns_dsp */ + +/* + * ディスパッチ保留状態の参照 + */ +#ifdef __sns_dpn + +SYSCALL BOOL +sns_dpn(void) +{ + BOOL state; + + LOG_SNS_DPN_ENTER(); + state = (sense_context() || sense_lock() || !(enadsp)) ? TRUE : FALSE; + LOG_SNS_DPN_LEAVE(state); + return(state); +} + +#endif /* __sns_dpn */ + +/* + * カーネル動作状態の参照 + */ +#ifdef __vsns_ini + +SYSCALL BOOL +vsns_ini(void) +{ + BOOL state; + + LOG_VSNS_INI_ENTER(); + state = !(iniflg) ? TRUE : FALSE; + LOG_VSNS_INI_LEAVE(state); + return(state); +} + +#endif /* __vsns_ini */ diff --git a/uzume_prototype/kernel/kernel/syslog.c b/uzume_prototype/kernel/kernel/syslog.c new file mode 100644 index 0000000..e889479 --- /dev/null +++ b/uzume_prototype/kernel/kernel/syslog.c @@ -0,0 +1,210 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: syslog.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * システムログ機能 + */ + +#undef OMIT_SYSLOG +#include "jsp_kernel.h" +#include "time_event.h" +#include "syslog.h" + +/* + * コンテキストに依らないCPUロック/ロック解除 + */ +#define lock_cpu() (sense_context() ? i_lock_cpu() : t_lock_cpu()) +#define unlock_cpu() (sense_context() ? i_unlock_cpu() : t_unlock_cpu()) + +#ifdef __logini + +/* + * ログバッファとそれにアクセスするためのポインタ + */ +SYSLOG syslog_buffer[TCNT_SYSLOG_BUFFER]; /* ログバッファ */ +UINT syslog_count; /* ログバッファ中のログの数 */ +UINT syslog_head; /* 先頭のログの格納位置 */ +UINT syslog_tail; /* 次のログの格納位置 */ +UINT syslog_lost; /* 失われたログの数 */ + +/* + * 出力すべきログ情報の重要度(ビットマップ) + */ +UINT syslog_logmask; /* ログバッファに記録すべき重要度 */ +UINT syslog_lowmask; /* 低レベル出力すべき重要度 */ + +/* + * システムログ機能の初期化 + */ +void +syslog_initialize() +{ + syslog_count = 0; + syslog_head = syslog_tail = 0; + syslog_lost = 0; + + syslog_logmask = 0; + syslog_lowmask = LOG_UPTO(LOG_NOTICE); +} + +#endif /* __logini */ + +/* + * ログ情報の出力 + * + * CPUロック状態や実行コンテキストによらず動作できるように実装してある. + */ +#ifdef __vwri_log + +SYSCALL ER +vwri_log(UINT prio, SYSLOG *p_log) +{ + BOOL locked; + + locked = sense_lock(); + if (!locked) { + lock_cpu(); + } + + /* + * ログ時刻の設定 + */ + p_log->logtim = systim_offset + current_time; + + /* + * ログバッファに記録 + */ + if ((syslog_logmask & LOG_MASK(prio)) != 0) { + syslog_buffer[syslog_tail] = *p_log; + syslog_tail++; + if (syslog_tail >= TCNT_SYSLOG_BUFFER) { + syslog_tail = 0; + } + if (syslog_count < TCNT_SYSLOG_BUFFER) { + syslog_count++; + } + else { + syslog_head = syslog_tail; + syslog_lost++; + } + } + + /* + * 低レベル出力 + */ + if ((syslog_lowmask & LOG_MASK(prio)) != 0) { + syslog_print(p_log, sys_putc); + } + + if (!locked) { + unlock_cpu(); + } + return(E_OK); +} + +#endif /* __vwri_log */ + +/* + * ログバッファからの読出し + * + * CPUロック状態や実行コンテキストによらず動作できるように実装してある. + */ +#ifdef __vrea_log + +SYSCALL ER_UINT +vrea_log(SYSLOG *p_log) +{ + BOOL locked; + ER_UINT ercd; + + locked = sense_lock(); + if (!locked) { + lock_cpu(); + } + if (syslog_count > 0) { + *p_log = syslog_buffer[syslog_head]; + syslog_count--; + syslog_head++; + if (syslog_head >= TCNT_SYSLOG_BUFFER) { + syslog_head = 0; + } + ercd = (ER_UINT) syslog_lost; + syslog_lost = 0; + } + else { + ercd = E_OBJ; + } + if (!locked) { + unlock_cpu(); + } + return(ercd); +} + +#endif /* __vrea_log */ + +/* + * 出力すべきログ情報の重要度の設定 + */ +#ifdef __vmsk_log + +SYSCALL ER +vmsk_log(UINT logmask, UINT lowmask) +{ + syslog_logmask = logmask; + syslog_lowmask = lowmask; + return(E_OK); +} + +#endif /* __vmsk_log */ + +/* + * システムログ機能の終了処理 + * + * ログバッファに記録されたログ情報を,低レベル出力機能を用いて出力す + * る. + */ +#ifdef __logter + +void +syslog_terminate() +{ + syslog_printf("-- buffered messages --", NULL, sys_putc); + syslog_output(sys_putc); +} + +#endif /* __logter */ diff --git a/uzume_prototype/kernel/kernel/syslog.h b/uzume_prototype/kernel/kernel/syslog.h new file mode 100644 index 0000000..55a14a3 --- /dev/null +++ b/uzume_prototype/kernel/kernel/syslog.h @@ -0,0 +1,85 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: syslog.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * システムログ機能 + */ + +#ifndef _SYSLOG_H_ +#define _SYSLOG_H_ + +#include + +/* + * ログバッファとそれにアクセスするためのポインタ + */ +#ifndef TCNT_SYSLOG_BUFFER +#define TCNT_SYSLOG_BUFFER 32 /* ログバッファのサイズ */ +#endif /* TCNT_SYSLOG_BUFFER */ + +extern SYSLOG syslog_buffer[]; /* ログバッファ */ +extern UINT syslog_count; /* ログバッファ中のログの数 */ +extern UINT syslog_head; /* 先頭のログの格納位置 */ +extern UINT syslog_tail; /* 次のログの格納位置 */ +extern UINT syslog_lost; /* 失われたログの数 */ + +/* + * 出力すべきログ情報の重要度(ビットマップ) + */ +extern UINT syslog_logmask; /* ログバッファに記録すべき重要度 */ +extern UINT syslog_lowmask; /* 低レベル出力すべき重要度 */ + +#ifndef OMIT_SYSLOG + +/* + * システムログ機能の初期化 + */ +extern void syslog_initialize(void); + +/* + * システムログ機能の終了処理 + */ +extern void syslog_terminate(void); + +#else /* OMIT_SYSLOG */ + +#define syslog_initialize() ((void) 0) +#define syslog_terminate() ((void) 0) + +#endif /* OMIT_SYSLOG */ +#endif /* _SYSLOG_H_ */ diff --git a/uzume_prototype/kernel/kernel/task.c b/uzume_prototype/kernel/kernel/task.c new file mode 100644 index 0000000..d099291 --- /dev/null +++ b/uzume_prototype/kernel/kernel/task.c @@ -0,0 +1,403 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2005,2006 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: task.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * タスク管理モジュール + */ + +#include "jsp_kernel.h" +#include "task.h" +#include + +#ifdef __tskini + +/* + * 実行状態のタスク + */ +TCB *runtsk; + +/* + * 最高優先順位のタスク + */ +TCB *schedtsk; + +/* + * タスクディスパッチ/タスク例外処理ルーチン起動要求フラグ + */ +BOOL reqflg; + +/* + * タスクディスパッチ許可状態 + */ +BOOL enadsp; + +/* + * レディキュー + */ +QUEUE ready_queue[TNUM_TPRI]; + +/* + * レディキューサーチのためのビットマップ + * + * ビットマップを UINT で定義しているが,ビットマップサーチ関数で優先 + * 度が16段階以下であることを仮定している. + */ +UINT ready_primap; + +/* + * タスク管理モジュールの初期化 + */ +void +task_initialize() +{ + UINT i, j; + TCB *tcb; + + runtsk = schedtsk = NULL; + reqflg = FALSE; + enadsp = TRUE; + + for (i = 0; i < TNUM_TPRI; i++) { + queue_initialize(&(ready_queue[i])); + } + ready_primap = 0; + + for (i = 0; i < TNUM_TSK; i++) { + j = INDEX_TSK(torder_table[i]); + tcb = &(tcb_table[j]); + tcb->tinib = &(tinib_table[j]); + tcb->actcnt = FALSE; + make_dormant(tcb); + if ((tcb->tinib->tskatr & TA_ACT) != 0) { + make_active(tcb); + } + } +} + +#endif /* __tskini */ + +/* + * ビットマップサーチ関数 + * + * bitmap 内の 1 のビットの内,最も下位(右)のものをサーチし,そのビ + * ット番号を返す.ビット番号は,最下位ビットを 0 とする.bitmap に 0 + * を指定してはならない.この関数では,優先度が16段階以下であることを + * 仮定し,bitmap の下位16ビットのみをサーチする. + * ビットサーチ命令を持つプロセッサでは,ビットサーチ命令を使うように + * 書き直した方が効率が良いだろう.このような場合には,cpu_insn.h で + * ビットサーチ命令を使った bitmap_search を定義し,CPU_BITMAP_SEARCH + * をマクロ定義すればよい.また,ビットサーチ命令のサーチ方向が逆など + * の理由で優先度とビットとの対応を変更したい場合には,PRIMAP_BIT を + * マクロ定義すればよい. + * また,標準ライブラリに ffs があるなら,次のように定義して標準ライ + * ブラリを使った方が効率が良い可能性もある. + * #define bitmap_search(bitmap) (ffs(bitmap) - 1) + */ +#ifndef PRIMAP_BIT +#define PRIMAP_BIT(pri) (1u << (pri)) +#endif /* PRIMAP_BIT */ + +#ifndef CPU_BITMAP_SEARCH + +Inline UINT +bitmap_search(UINT bitmap) +{ + static const unsigned char search_table[] = { 0, 1, 0, 2, 0, 1, 0, + 3, 0, 1, 0, 2, 0, 1, 0 }; + UINT n = 0; + + assert((bitmap & 0xffff) != 0); + if ((bitmap & 0x00ff) == 0) { + bitmap >>= 8; + n += 8; + } + if ((bitmap & 0x0f) == 0) { + bitmap >>= 4; + n += 4; + } + return(n + search_table[(bitmap & 0x0f) - 1]); +} + +#endif /* CPU_BITMAP_SEARCH */ + +/* + * 最高優先順位タスクのサーチ + */ +#ifdef __tsksched + +TCB * +search_schedtsk() +{ + UINT schedpri; + + schedpri = bitmap_search(ready_primap); + return((TCB *)(ready_queue[schedpri].next)); +} + +#endif /* __tsksched */ + +/* + * 実行できる状態への移行 + * + * 最高優先順位のタスクを更新するのは,実行できるタスクがなかった場合 + * と,tcb の優先度が最高優先順位のタスクの優先度よりも高い場合である. + */ +#ifdef __tskrun + +BOOL +make_runnable(TCB *tcb) +{ + UINT pri = tcb->priority; + + tcb->tstat = TS_RUNNABLE; + LOG_TSKSTAT(tcb); + queue_insert_prev(&(ready_queue[pri]), &(tcb->task_queue)); + ready_primap |= PRIMAP_BIT(pri); + + if (schedtsk == (TCB *) NULL || pri < schedtsk->priority) { + schedtsk = tcb; + return(enadsp); + } + return(FALSE); +} + +#endif /* __tskrun */ + +/* + * 実行できる状態から他の状態への移行 + * + * 最高優先順位のタスクを更新するのは,tcb が最高優先順位のタスクであっ + * た場合である.tcb と同じ優先度のタスクが他にある場合は,tcb の次の + * タスクが最高優先順位になる.そうでない場合は,レディキューをサーチ + * する必要がある. + */ +#ifdef __tsknrun + +BOOL +make_non_runnable(TCB *tcb) +{ + UINT pri = tcb->priority; + QUEUE *queue = &(ready_queue[pri]); + + queue_delete(&(tcb->task_queue)); + if (queue_empty(queue)) { + ready_primap &= ~PRIMAP_BIT(pri); + if (schedtsk == tcb) { + schedtsk = (ready_primap == 0) ? (TCB * ) NULL + : search_schedtsk(); + return(enadsp); + } + } + else { + if (schedtsk == tcb) { + schedtsk = (TCB *)(queue->next); + return(enadsp); + } + } + return(FALSE); +} + +#endif /* __tsknrun */ + +/* + * 休止状態への移行 + */ +#ifdef __tskdmt + +void +make_dormant(TCB *tcb) +{ + tcb->priority = tcb->tinib->ipriority; + tcb->tstat = TS_DORMANT; + tcb->wupcnt = FALSE; + tcb->enatex = FALSE; + tcb->texptn = 0; + create_context(tcb); + LOG_TSKSTAT(tcb); +} + +#endif /* __tskdmt */ + +/* + * 休止状態から実行できる状態への移行 + */ +#ifdef __tskact + +BOOL +make_active(TCB *tcb) +{ + activate_context(tcb); + return(make_runnable(tcb)); +} + +#endif /* __tskact */ + +/* + * 実行状態のタスクの終了 + */ +#ifdef __tskext + +void +exit_task() +{ + make_non_runnable(runtsk); + make_dormant(runtsk); + if (runtsk->actcnt) { + runtsk->actcnt = FALSE; + make_active(runtsk); + } + exit_and_dispatch(); +} + +#endif /* __tskext */ + +/* + * レディキュー中のタスクの優先度の変更 + * + * 最高優先順位のタスクを更新するのは,(1) tcb が最高優先順位のタスク + * であって,その優先度を下げた場合,(2) tcb が最高優先順位のタスクで + * はなく,変更後の優先度が最高優先順位のタスクの優先度よりも高い場合 + * である.(1) の場合には,レディキューをサーチする必要がある. + */ +#ifdef __tskpri + +BOOL +change_priority(TCB *tcb, UINT newpri) +{ + UINT oldpri = tcb->priority; + + tcb->priority = newpri; + queue_delete(&(tcb->task_queue)); + if (queue_empty(&(ready_queue[oldpri]))) { + ready_primap &= ~PRIMAP_BIT(oldpri); + } + queue_insert_prev(&(ready_queue[newpri]), &(tcb->task_queue)); + ready_primap |= PRIMAP_BIT(newpri); + + if (schedtsk == tcb) { + if (newpri >= oldpri) { + schedtsk = search_schedtsk(); + return(schedtsk != tcb && enadsp); + } + } + else { + if (newpri < schedtsk->priority) { + schedtsk = tcb; + return(enadsp); + } + } + return(FALSE); +} + +#endif /* __tskpri */ + +/* + * レディキューの回転 + * + * 最高優先順位のタスクを更新するのは,最高優先順位のタスクがタスクキ + * ューの末尾に移動した場合である. + */ +#ifdef __tskrot + +BOOL +rotate_ready_queue(UINT pri) +{ + QUEUE *queue = &(ready_queue[pri]); + QUEUE *entry; + + if (!(queue_empty(queue)) && queue->next->next != queue) { + entry = queue_delete_next(queue); + queue_insert_prev(queue, entry); + if (schedtsk == (TCB *) entry) { + schedtsk = (TCB *)(queue->next); + return(enadsp); + } + } + return(FALSE); +} + +#endif /* __tskrot */ + +/* + * 引数まで定義したタスク例外処理ルーチンの型 + */ +typedef void (*TEXRTN)(TEXPTN texptn, VP_INT exinf); + +/* + * タスク例外処理ルーチンの呼出し + */ +#ifdef __tsktex + +void +call_texrtn() +{ + TEXPTN texptn; + + do { + texptn = runtsk->texptn; + runtsk->enatex = FALSE; + runtsk->texptn = 0; + t_unlock_cpu(); + LOG_TEX_ENTER(texptn); + (*((TEXRTN)(runtsk->tinib->texrtn)))(texptn, + runtsk->tinib->exinf); + LOG_TEX_LEAVE(texptn); + if (!t_sense_lock()) { + t_lock_cpu(); + } + } while (runtsk->texptn != 0); + runtsk->enatex = TRUE; +} + +/* + * タスク例外処理ルーチンの起動 + */ +#ifndef OMIT_CALLTEX + +void +calltex() +{ + if (runtsk->enatex && runtsk->texptn != 0) { + call_texrtn(); + } +} + +#endif /* OMIT_CALLTEX */ +#endif /* __tsktex */ diff --git a/uzume_prototype/kernel/kernel/task.h b/uzume_prototype/kernel/kernel/task.h new file mode 100644 index 0000000..ebd6346 --- /dev/null +++ b/uzume_prototype/kernel/kernel/task.h @@ -0,0 +1,410 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2005,2006 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: task.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * タスク管理モジュール + */ + +#ifndef _TASK_H_ +#define _TASK_H_ + +#include "queue.h" +#include "time_event.h" + +/* + * タスク優先度の内部表現・外部表現変換マクロ + */ +#define INT_PRIORITY(x) ((UINT)((x) - TMIN_TPRI)) +#define EXT_TSKPRI(x) ((PRI)(x) + TMIN_TPRI) + +/* + * タスク状態の内部表現 + * + * TCB 中のタスク状態では,実行状態(RUNNING)と実行可能状態(READY) + * は区別しない.両状態を総称して,実行できる状態(RUNNABLE)と呼ぶ. + * 二重待ち状態は,(TS_WAITING | TS_SUSPENDED) で表す.TS_WAIT_???? + * は,待ち状態に伴う付属状態を表し,待ち状態(二重待ち状態を含む)の + * 場合にのみ設定される. + */ +#define TS_DORMANT 0x00u /* 休止状態 */ +#define TS_RUNNABLE 0x01u /* 実行できる状態 */ +#define TS_WAITING 0x02u /* 待ち状態 */ +#define TS_SUSPENDED 0x04u /* 強制待ち状態 */ + +#define TS_WAIT_SLEEP 0x08u /* 起床待ち状態 */ +#define TS_WAIT_WOBJ 0x10u /* 同期・通信オブジェクトに対する待ち状態 */ +#define TS_WAIT_WOBJCB 0x20u /* 共通部分の待ちキューにつながっている */ + +/* + * タスク状態判別マクロ + * + * TSTAT_DORMANT はタスクが休止状態であるかどうかを,TSTAT_RUNNABLE + * はタスクが実行できる状態であるかどうかを判別する.TSTAT_WAITING は + * 待ち状態と二重待ち状態のいずれかであるかどうかを,TSTAT_SUSPENDED + * は強制待ち状態と二重待ち状態のいずれかであるかどうかを判別する. + */ +#define TSTAT_DORMANT(tstat) ((tstat) == TS_DORMANT) +#define TSTAT_RUNNABLE(tstat) (((tstat) & TS_RUNNABLE) != 0) +#define TSTAT_WAITING(tstat) (((tstat) & TS_WAITING) != 0) +#define TSTAT_SUSPENDED(tstat) (((tstat) & TS_SUSPENDED) != 0) + +/* + * 待ち情報ブロック(WINFO)の定義 + * + * タスクが待ち状態の間は,TCB およびそこから指される WINFO を次のよ + * うに設定しなければならない. + * + * (a) TCB のタスク状態を待ち状態にする.その際に,待ち状態に伴う付属 + * 状態(TS_WAIT_????)も設定する. + * + * (b) タイムアウトを監視するために,タイムイベントブロックを登録する. + * 登録するタイムイベントブロックは,待ちに入るサービスコール処理関数 + * のローカル変数として確保し,それへのポインタを WINFO の tmevtb に + * 記憶する.タイムアウトの監視が必要ない場合(永久待ちの場合)には, + * tmevtb を NULL にする. + * + * 同期・通信オブジェクトに対する待ち状態の場合には,標準の WINFO に + * wobjcbフィールドを追加した構造体(WINFO_WOBJ,wait.h で定義)を使 + * い,タスク状態に TS_WAIT_WOBJ を設定する.また,以下の (c)〜(e) の + * 設定を行う必要がある.同期・通信オブジェクトに関係しない待ち(起床 + * 待ち,時間経過待ち)の場合には,(c)〜(e) は必要ない. + * + * (c) TCB を待ち対象の同期・通信オブジェクトの待ちキューにつなぐ.待 + * ちキューにつなぐために,task_queue を使う.TCB を同期・通信オブジェ + * クトの管理ブロックの共通部分(WOBJCB)の待ちキューにつないだ場合に + * は,タスク状態に TS_WAIT_WOBJCB を設定する. + * + * (d) 待ち対象の同期・通信オブジェクトの管理ブロックへのポインタを, + * WINFO_WOBJ の wobjcb に記憶する. + * JSPカーネルで wobjcb を使うのは,優先度順の待ちキューにつながれて + * いるタスクの優先度が変更された場合のみであるが,デバッグ情報を取り + * 出しやすいように,待ちキューが優先度順でない場合にも wobjcb を設定 + * する. + * + * (e) 待ち対象の同期・通信オブジェクトに依存して記憶することが必要な + * 情報がある場合には,WINFO_WOBJ に必要な情報のためのフィールドを追加 + * した構造体を定義し,WINFO_WOBJ の代わりに用いる. + * + * 待ち状態を解除する際には,待ち解除したタスクからの返値を WINFO の + * wercd に設定する.wercd を使うのは待ち解除以降であるのに対して, + * tmevtb は待ち解除後は使わないため,メモリ節約のために共用体(union) + * を使っている. + */ +typedef union waiting_information { + ER wercd; /* 待ち解除時のエラーコード */ + TMEVTB *tmevtb; /* 待ち状態用のタイムイベントブロック */ +} WINFO; + +/* + * タスク初期化ブロック + * + * タスクに関する情報を,値が変わらないためにROMに置ける部分(タスク + * 初期化ブロック)と,値が変化するためにRAMに置かなければならない部 + * 分(タスク管理ブロック,TCB)に分離し,TCB内に対応するタスク初期化 + * ブロックを指すポインタを入れる.タスク初期化ブロック内に対応する + * TCBを指すポインタを入れる方法の方が,RAMの節約の観点からは望ましい + * が,実行効率が悪くなるために採用していない.他のオブジェクトについ + * ても同様に扱う. + * タスク初期化ブロックには,DEF_TEX で定義されるタスク例外処理ルーチ + * ンに関する情報も含む. + */ +typedef struct task_initialization_block { + ATR tskatr; /* タスク属性 */ + VP_INT exinf; /* タスクの拡張情報 */ + FP task; /* タスクの起動番地 */ + UINT ipriority; /* タスクの起動時優先度(内部表現) */ + SIZE stksz; /* スタック領域のサイズ(丸めた値) */ + VP stk; /* スタック領域の先頭番地 */ + + ATR texatr; /* タスク例外処理ルーチン属性 */ + FP texrtn; /* タスク例外処理ルーチンの起動番地 */ +} TINIB; + +/* + * TCB 中のフィールドのビット幅の定義 + * + * TCB 中のフィールドの配置は,性能に大きく影響すると思われるため,ター + * ゲット依存にフィールドのビット幅を変更することを許している. + */ +#ifndef TBIT_TCB_TSTAT +#define TBIT_TCB_TSTAT 6 /* tstat フィールドのビット幅 */ +#endif /* TBIT_TCB_TSTAT */ + +#ifndef TBIT_TCB_PRIORITY +#define TBIT_TCB_PRIORITY 4 /* priority フィールドのビット幅 */ +#endif /* TBIT_TCB_PRIORITY */ + +/* + * タスク管理ブロック(TCB) + * + * JSPでは,タスクの起動要求キューイング数の最大値(TMAX_ACTCNT)と起 + * 床要求キューイング数の最大値(TMAX_WUPCNT)は 1 に固定されているた + * め,キューイングされているかどうかの真偽値で表現することができる. + * また,強制待ち要求ネスト数の最大値(TMAX_SUSCNT)が 1 に固定されて + * いるので,強制待ち要求ネスト数(suscnt)は必要ない. + */ +typedef struct task_control_block { + QUEUE task_queue; /* タスクキュー */ + const TINIB *tinib; /* タスク初期化ブロックへのポインタ */ + + unsigned int tstat : TBIT_TCB_TSTAT; /* タスク状態(内部表現)*/ + unsigned int priority : TBIT_TCB_PRIORITY; + /* 現在の優先度(内部表現)*/ + unsigned int actcnt : 1; /* 起動要求キューイング */ + unsigned int wupcnt : 1; /* 起床要求キューイング */ + unsigned int enatex : 1; /* タスク例外処理許可状態 */ + + TEXPTN texptn; /* 保留例外要因 */ + WINFO *winfo; /* 待ち情報ブロックへのポインタ */ + CTXB tskctxb; /* タスクコンテキストブロック */ +} TCB; + +/* + * 実行状態のタスク + * + * 実行状態のタスク(=プロセッサがコンテキストを持っているタスク)の + * TCB を指すポインタ.実行状態のタスクがない場合は NULL にする. + * サービスコールの処理中で,自タスク(サービスコールを呼び出したタス + * ク)に関する情報を参照する場合は runtsk を使う.runtsk を書き換え + * るのは,ディスパッチャ(と初期化処理)のみである. + */ +extern TCB *runtsk; + +/* + * 最高優先順位のタスク + * + * 実行できるタスクの中で最高優先順位のタスクの TCB を指すポインタ.実 + * 行できるタスクがない場合は NULL にする. + * ディスパッチ禁止状態など,ディスパッチが保留されている間は,runtsk + * と一致しているとは限らない. + */ +extern TCB *schedtsk; + +/* + * ディスパッチ/タスク例外処理ルーチン起動要求フラグ + * + * 割込みハンドラ/CPU例外ハンドラの出口処理に,ディスパッチまたは + * タスク例外処理ルーチンの起動を要求することを示すフラグ. + */ +extern BOOL reqflg; + +/* + * ディスパッチ許可状態 + * + * ディスパッチ許可状態である(すなわち,ディスパッチ禁止状態でない) + * ことを示すフラグ. + */ +extern BOOL enadsp; + +/* + * レディキュー + * + * レディキューは,実行できる状態のタスクを管理するためのキューである. + * 実行状態のタスクも管理しているため,レディ(実行可能)キューという + * 名称は正確ではないが,レディキューという名称が定着しているため,こ + * の名称で呼ぶことにする. + * + * レディキューは,優先度ごとのタスクキューで構成されている.タスクの + * TCBは,該当する優先度のキューに登録される. + */ +extern QUEUE ready_queue[TNUM_TPRI]; + +/* + * レディキューサーチのためのビットマップ + * + * レディキューのサーチを効率よく行うために,優先度ごとのタスクキュー + * にタスクが入っているかどうかを示すビットマップを用意している.ビッ + * トマップを使うことで,メモリアクセスの回数を減らすことができるが, + * ビット操作命令が充実していないプロセッサで,優先度の段階数が少ない + * 場合には,ビットマップ操作のオーバーヘッドのために,逆に効率が落ち + * る可能性もある. + */ +extern UINT ready_primap; + +/* + * タスクIDの最大値(kernel_cfg.c) + */ +extern const ID tmax_tskid; + +/* + * タスク初期化ブロックのエリア(kernel_cfg.c) + */ +extern const TINIB tinib_table[]; + +/* + * タスク生成順序テーブル(kernel_cfg.c) + */ +extern const ID torder_table[]; + +/* + * TCBのエリア(kernel_cfg.c) + */ +extern TCB tcb_table[]; + +/* + * タスクの数 + */ +#define TNUM_TSK ((UINT)(tmax_tskid - TMIN_TSKID + 1)) + +/* + * タスクIDからTCBを取り出すためのマクロ + */ +#define INDEX_TSK(tskid) ((UINT)((tskid) - TMIN_TSKID)) +#define get_tcb(tskid) (&(tcb_table[INDEX_TSK(tskid)])) +#define get_tcb_self(tskid) ((tskid) == TSK_SELF ? runtsk : get_tcb(tskid)) + +/* + * TCBからタスクIDを取り出すためのマクロ + */ +#define TSKID(tcb) ((ID)(((tcb) - tcb_table) + TMIN_TSKID)) + +/* + * タスク管理モジュールの初期化 + */ +extern void task_initialize(void); + +/* + * 最高優先順位タスクのサーチ + * + * レディキュー中の最高優先順位のタスクをサーチし,そのTCBへのポインタ + * を返す.レディキューが空の場合には,この関数を呼び出してはならない. + */ +extern TCB *search_schedtsk(void); + +/* + * 実行できる状態への移行 + * + * tcb で指定されるタスクの状態を実行できる状態とし,レディキューに挿 + * 入する.実行できる状態になったタスクの優先度が,最高優先順位のタス + * クの優先度よりも高い場合は,最高優先順位のタスクを更新し,ディスパッ + * チ許可状態であれば TRUE を返す.そうでない場合は FALSE を返す. + */ +extern BOOL make_runnable(TCB *tcb); + +/* + * 実行できる状態から他の状態への移行 + * + * tcb で指定されるタスクをレディキューから削除する.tcb で指定したタ + * スクが最高優先順位のタスクであった場合には,最高優先順位のタスクを + * 設定しなおし,ディスパッチ許可状態であれば TRUE を返す.そうでない + * 場合は FALSE を返す.タスクの状態は更新しない. + */ +extern BOOL make_non_runnable(TCB *tcb); + +/* + * 休止状態への移行 + * + * tcb で指定されるタスクの状態を休止状態とする.また,タスクの起動時 + * に初期化すべき変数の初期化と,タスク起動のためのコンテキストを設定 + * する. + */ +extern void make_dormant(TCB *tcb); + +/* + * 休止状態から実行できる状態への移行 + * + * tcb で指定されるタスクの状態を休止状態から実行できる状態とする.実 + * 行できる状態に移行したタスクへのディスパッチが必要な場合は TRUE, + * そうでない場合は FALSE を返す. + */ +extern BOOL make_active(TCB *tcb); + +/* + * 実行状態のタスクの終了 + * + * exit_task を ext_tsk に埋め込まずに別の関数にしているのは, + * create_context と activate_context が自タスクの終了処理で使用する + * スタックを破壊しないようにするための対策の一環である.ext_tsk とは + * 別関数にしておくことで,ローカル変数も含めて,使用するスタック領域 + * が重ならないようにできる.また,コンパイラが自動的にインライン展開 + * するのを避けるために,ext_tsk とは別のファイルに入れている. + */ +extern void exit_task(void); + +/* + * レディキュー中のタスクの優先度の変更 + * + * tcb で指定されるレディキュー中のタスクの優先度を newpri(内部表現) + * に変更する.また,必要な場合には最高優先順位のタスクを更新し,ディ + * スパッチ許可状態であれば TRUE を返す.そうでない場合は FALSE を返 + * す. + */ +extern BOOL change_priority(TCB *tcb, UINT newpri); + +/* + * レディキューの回転 + * + * レディキュー中の,pri で指定される優先度のタスクキューを回転させる. + * また,必要な場合には最高優先順位のタスクを変更し,ディスパッチが保 + * 留されていなければ TRUE を返す.そうでない場合は FALSE を返す. + */ +extern BOOL rotate_ready_queue(UINT pri); + +/* + * タスク例外処理ルーチンの呼出し + * + * タスク例外処理ルーチンを呼び出す.呼び出す前に,実行状態のタスクの + * 保留例外要因をクリアし,タスク例外処理禁止状態にし,CPUロックを解 + * 除する. + * タスク例外処理ルーチンから戻ると,まずCPUロック状態に戻し,その間 + * に保留例外要因が 0 でなくなっていれば,再びタスク例外処理ルーチン + * を呼び出す.保留例外要因が 0 の場合には,例外処理許可状態にして関 + * 数からリターンする. + * この関数は,実行状態のタスクが,タスク例外処理許可状態(enatex が + * TRUE)で,保留例外要因が 0 でない(texptn が 0 でない)場合に呼び + * 出すことを想定している.この関数は,CPUロック状態で呼び出さなけれ + * ばならない. + */ +extern void call_texrtn(void); + +/* + * タスク例外処理ルーチンの起動 + * + * 実行状態のタスクがタスク例外処理ルーチンの起動条件を満たしていれば, + * タスク例外処理ルーチンを呼び出す.CPU例外処理ルーチンを呼び出す時 + * は,一時的にCPUロックを解除する. + * この関数は,ディスパッチャや割込みハンドラ/CPU例外ハンドラの出口 + * 処理から呼び出されることを想定しているが,同等の処理をターゲット依 + * 存部で記述してもよい.その場合には,OMIT_CALLTEX をマクロ定義すれ + * ばよい. + */ +extern void calltex(void); + +#endif /* _TASK_H_ */ diff --git a/uzume_prototype/kernel/kernel/task_except.c b/uzume_prototype/kernel/kernel/task_except.c new file mode 100644 index 0000000..ca6af10 --- /dev/null +++ b/uzume_prototype/kernel/kernel/task_except.c @@ -0,0 +1,200 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: task_except.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * タスク例外処理機能 + */ + +#include "jsp_kernel.h" +#include "check.h" +#include "task.h" + +/* + * タスク例外処理の要求 + */ +#ifdef __ras_tex + +SYSCALL ER +ras_tex(ID tskid, TEXPTN rasptn) +{ + TCB *tcb; + ER ercd; + + LOG_RAS_TEX_ENTER(tskid, rasptn); + CHECK_TSKCTX_UNL(); + CHECK_TSKID_SELF(tskid); + CHECK_PAR(rasptn != 0); + tcb = get_tcb_self(tskid); + + t_lock_cpu(); + if (TSTAT_DORMANT(tcb->tstat) || tcb->tinib->texrtn == NULL) { + ercd = E_OBJ; + } + else { + tcb->texptn |= rasptn; + if (tcb == runtsk && runtsk->enatex) { + call_texrtn(); + } + ercd = E_OK; + } + t_unlock_cpu(); + + exit: + LOG_RAS_TEX_LEAVE(ercd); + return(ercd); +} + +#endif /* __ras_tex */ + +/* + * タスク例外処理の要求(非タスクコンテキスト用) + */ +#ifdef __iras_tex + +SYSCALL ER +iras_tex(ID tskid, TEXPTN rasptn) +{ + TCB *tcb; + ER ercd; + + LOG_IRAS_TEX_ENTER(tskid, rasptn); + CHECK_INTCTX_UNL(); + CHECK_TSKID(tskid); + CHECK_PAR(rasptn != 0); + tcb = get_tcb(tskid); + + i_lock_cpu(); + if (TSTAT_DORMANT(tcb->tstat) || tcb->tinib->texrtn == NULL) { + ercd = E_OBJ; + } + else { + tcb->texptn |= rasptn; + if (tcb == runtsk && runtsk->enatex) { + reqflg = TRUE; + } + ercd = E_OK; + } + i_unlock_cpu(); + + exit: + LOG_IRAS_TEX_LEAVE(ercd); + return(ercd); +} + +#endif /* __iras_tex */ + +/* + * タスク例外処理の禁止 + */ +#ifdef __dis_tex + +SYSCALL ER +dis_tex() +{ + ER ercd; + + LOG_DIS_TEX_ENTER(); + CHECK_TSKCTX_UNL(); + + t_lock_cpu(); + if (runtsk->tinib->texrtn == NULL) { + ercd = E_OBJ; + } + else { + runtsk->enatex = FALSE; + ercd = E_OK; + } + t_unlock_cpu(); + + exit: + LOG_DIS_TEX_LEAVE(ercd); + return(ercd); +} + +#endif /* __dis_tex */ + +/* + * タスク例外処理の許可 + */ +#ifdef __ena_tex + +SYSCALL ER +ena_tex() +{ + ER ercd; + + LOG_ENA_TEX_ENTER(); + CHECK_TSKCTX_UNL(); + + t_lock_cpu(); + if (runtsk->tinib->texrtn == NULL) { + ercd = E_OBJ; + } + else { + runtsk->enatex = TRUE; + if (runtsk->texptn != 0) { + call_texrtn(); + } + ercd = E_OK; + } + t_unlock_cpu(); + + exit: + LOG_ENA_TEX_LEAVE(ercd); + return(ercd); +} + +#endif /* __ena_tex */ + +/* + * タスク例外処理禁止状態の参照 + */ +#ifdef __sns_tex + +SYSCALL BOOL +sns_tex() +{ + BOOL state; + + LOG_SNS_TEX_ENTER(); + state = (runtsk != NULL && runtsk->enatex) ? FALSE : TRUE; + LOG_SNS_TEX_LEAVE(state); + return(state); +} + +#endif /* __sns_tex */ diff --git a/uzume_prototype/kernel/kernel/task_manage.c b/uzume_prototype/kernel/kernel/task_manage.c new file mode 100644 index 0000000..58c6dba --- /dev/null +++ b/uzume_prototype/kernel/kernel/task_manage.c @@ -0,0 +1,338 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: task_manage.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * タスク管理機能 + */ + +#include "jsp_kernel.h" +#include "check.h" +#include "task.h" +#include "wait.h" + +/* + * タスクの起動 + */ +#ifdef __act_tsk + +SYSCALL ER +act_tsk(ID tskid) +{ + TCB *tcb; + ER ercd; + + LOG_ACT_TSK_ENTER(tskid); + CHECK_TSKCTX_UNL(); + CHECK_TSKID_SELF(tskid); + tcb = get_tcb_self(tskid); + + t_lock_cpu(); + if (TSTAT_DORMANT(tcb->tstat)) { + if (make_active(tcb)) { + dispatch(); + } + ercd = E_OK; + } + else if (!(tcb->actcnt)) { + tcb->actcnt = TRUE; + ercd = E_OK; + } + else { + ercd = E_QOVR; + } + t_unlock_cpu(); + + exit: + LOG_ACT_TSK_LEAVE(ercd); + return(ercd); +} + +#endif /* __act_tsk */ + +/* + * タスクの起動(非タスクコンテキスト用) + */ +#ifdef __iact_tsk + +SYSCALL ER +iact_tsk(ID tskid) +{ + TCB *tcb; + ER ercd; + + LOG_IACT_TSK_ENTER(tskid); + CHECK_INTCTX_UNL(); + CHECK_TSKID(tskid); + tcb = get_tcb(tskid); + + i_lock_cpu(); + if (TSTAT_DORMANT(tcb->tstat)) { + if (make_active(tcb)) { + reqflg = TRUE; + } + ercd = E_OK; + } + else if (!(tcb->actcnt)) { + tcb->actcnt = TRUE; + ercd = E_OK; + } + else { + ercd = E_QOVR; + } + i_unlock_cpu(); + + exit: + LOG_IACT_TSK_LEAVE(ercd); + return(ercd); +} + +#endif /* __iact_tsk */ + +/* + * タスク起動要求のキャンセル + */ +#ifdef __can_act + +SYSCALL ER_UINT +can_act(ID tskid) +{ + TCB *tcb; + ER_UINT ercd; + + LOG_CAN_ACT_ENTER(tskid); + CHECK_TSKCTX_UNL(); + CHECK_TSKID_SELF(tskid); + tcb = get_tcb_self(tskid); + + t_lock_cpu(); + ercd = tcb->actcnt ? 1 : 0; + tcb->actcnt = FALSE; + t_unlock_cpu(); + + exit: + LOG_CAN_ACT_LEAVE(ercd); + return(ercd); +} + +#endif /* __can_act */ + +/* + * 自タスクの終了 + */ +#ifdef __ext_tsk + +SYSCALL void +ext_tsk(void) +{ + LOG_EXT_TSK_ENTER(); + +#ifdef ACTIVATED_STACK_SIZE + /* + * create_context と activate_context で,使用中のスタック領 + * 域を破壊しないように,スタック上にダミー領域を確保する. + */ + (void) alloca(ACTIVATED_STACK_SIZE); +#endif /* ACTIVATED_STACK_SIZE */ + + if (sense_context()) { + /* + * 非タスクコンテキストから ext_tsk が呼ばれた場合, + * システムログにエラーを記録し,そのまま実行を続ける + * が, 動作は保証されない. + */ + syslog_0(LOG_EMERG, + "ext_tsk is called from non-task contexts."); + } + if (sense_lock()) { + /* + * CPUロック状態で ext_tsk が呼ばれた場合は,CPUロック + * を解除してからタスクを終了する.実装上は,サービス + * コール内でのCPUロックを省略すればよいだけ. + */ + syslog_0(LOG_WARNING, + "ext_tsk is called from CPU locked state."); + } + else { + if (sense_context()) { + i_lock_cpu(); + } + else { + t_lock_cpu(); + } + } + if (!(enadsp)) { + /* + * ディスパッチ禁止状態で ext_tsk が呼ばれた場合は, + * ディスパッチ許可状態にしてからタスクを終了する. + */ + syslog_0(LOG_WARNING, + "ext_tsk is called from dispatch disabled state."); + enadsp = TRUE; + } + exit_task(); +} + +#endif /* __ext_tsk */ + +/* + * タスクの強制終了 + */ +#ifdef __ter_tsk + +SYSCALL ER +ter_tsk(ID tskid) +{ + TCB *tcb; + UINT tstat; + ER ercd; + + LOG_TER_TSK_ENTER(tskid); + CHECK_TSKCTX_UNL(); + CHECK_TSKID(tskid); + tcb = get_tcb(tskid); + CHECK_NONSELF(tcb); + + t_lock_cpu(); + if (TSTAT_DORMANT(tstat = tcb->tstat)) { + ercd = E_OBJ; + } + else { + if (TSTAT_RUNNABLE(tstat)) { + make_non_runnable(tcb); + } + else if (TSTAT_WAITING(tstat)) { + wait_cancel(tcb); + } + make_dormant(tcb); + if (tcb->actcnt) { + tcb->actcnt = FALSE; + if (make_active(tcb)) { + dispatch(); + } + } + ercd = E_OK; + } + t_unlock_cpu(); + + exit: + LOG_TER_TSK_LEAVE(ercd); + return(ercd); +} + +#endif /* __ter_tsk */ + +/* + * タスク優先度の変更 + */ +#ifdef __chg_pri + +SYSCALL ER +chg_pri(ID tskid, PRI tskpri) +{ + TCB *tcb; + UINT newpri; + UINT tstat; + ER ercd; + + LOG_CHG_PRI_ENTER(tskid, tskpri); + CHECK_TSKCTX_UNL(); + CHECK_TSKID_SELF(tskid); + CHECK_TPRI_INI(tskpri); + tcb = get_tcb_self(tskid); + newpri = (tskpri == TPRI_INI) ? tcb->tinib->ipriority + : INT_PRIORITY(tskpri); + + t_lock_cpu(); + if (TSTAT_DORMANT(tstat = tcb->tstat)) { + ercd = E_OBJ; + } + else if (TSTAT_RUNNABLE(tstat)) { + if (change_priority(tcb, newpri)) { + dispatch(); + } + ercd = E_OK; + } + else { + tcb->priority = newpri; + if ((tstat & TS_WAIT_WOBJCB) != 0) { + wobj_change_priority(((WINFO_WOBJ *)(tcb->winfo)) + ->wobjcb, tcb); + } + ercd = E_OK; + } + t_unlock_cpu(); + + exit: + LOG_CHG_PRI_LEAVE(ercd); + return(ercd); +} + +#endif /* __chg_pri */ + +/* + * タスク優先度の参照 + */ +#ifdef __get_pri + +SYSCALL ER +get_pri(ID tskid, PRI *p_tskpri) +{ + TCB *tcb; + ER ercd; + + LOG_GET_PRI_ENTER(tskid, p_tskpri); + CHECK_TSKCTX_UNL(); + CHECK_TSKID_SELF(tskid); + tcb = get_tcb_self(tskid); + + t_lock_cpu(); + if (TSTAT_DORMANT(tcb->tstat)) { + ercd = E_OBJ; + } + else { + *p_tskpri = EXT_TSKPRI(tcb->priority); + ercd = E_OK; + } + t_unlock_cpu(); + + exit: + LOG_GET_PRI_LEAVE(ercd, *p_tskpri); + return(ercd); +} + +#endif /* __get_pri */ diff --git a/uzume_prototype/kernel/kernel/task_sync.c b/uzume_prototype/kernel/kernel/task_sync.c new file mode 100644 index 0000000..9289fb5 --- /dev/null +++ b/uzume_prototype/kernel/kernel/task_sync.c @@ -0,0 +1,471 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: task_sync.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * タスク付属同期機能 + */ + +#include "jsp_kernel.h" +#include "check.h" +#include "task.h" +#include "wait.h" + +/* + * 起床待ち + */ +#ifdef __slp_tsk + +SYSCALL ER +slp_tsk() +{ + WINFO winfo; + ER ercd; + + LOG_SLP_TSK_ENTER(); + CHECK_DISPATCH(); + + t_lock_cpu(); + if (runtsk->wupcnt) { + runtsk->wupcnt = FALSE; + ercd = E_OK; + } + else { + runtsk->tstat = (TS_WAITING | TS_WAIT_SLEEP); + make_wait(&winfo); + LOG_TSKSTAT(runtsk); + dispatch(); + ercd = winfo.wercd; + } + t_unlock_cpu(); + + exit: + LOG_SLP_TSK_LEAVE(ercd); + return(ercd); +} + +#endif /* __slp_tsk */ + +/* + * 起床待ち(タイムアウトあり) + */ +#ifdef __tslp_tsk + +SYSCALL ER +tslp_tsk(TMO tmout) +{ + WINFO winfo; + TMEVTB tmevtb; + ER ercd; + + LOG_TSLP_TSK_ENTER(tmout); + CHECK_DISPATCH(); + CHECK_TMOUT(tmout); + + t_lock_cpu(); + if (runtsk->wupcnt) { + runtsk->wupcnt = FALSE; + ercd = E_OK; + } + else if (tmout == TMO_POL) { + ercd = E_TMOUT; + } + else { + runtsk->tstat = (TS_WAITING | TS_WAIT_SLEEP); + make_wait_tmout(&winfo, &tmevtb, tmout); + LOG_TSKSTAT(runtsk); + dispatch(); + ercd = winfo.wercd; + } + t_unlock_cpu(); + + exit: + LOG_TSLP_TSK_LEAVE(ercd); + return(ercd); +} + +#endif /* __tslp_tsk */ + +/* + * タスクの起床 + */ +#ifdef __wup_tsk + +SYSCALL ER +wup_tsk(ID tskid) +{ + TCB *tcb; + UINT tstat; + ER ercd; + + LOG_WUP_TSK_ENTER(tskid); + CHECK_TSKCTX_UNL(); + CHECK_TSKID_SELF(tskid); + tcb = get_tcb_self(tskid); + + t_lock_cpu(); + if (TSTAT_DORMANT(tstat = tcb->tstat)) { + ercd = E_OBJ; + } + else if ((tstat & TS_WAIT_SLEEP) != 0) { + if (wait_complete(tcb)) { + dispatch(); + } + ercd = E_OK; + } + else if (!(tcb->wupcnt)) { + tcb->wupcnt = TRUE; + ercd = E_OK; + } + else { + ercd = E_QOVR; + } + t_unlock_cpu(); + + exit: + LOG_WUP_TSK_LEAVE(ercd); + return(ercd); +} + +#endif /* __wup_tsk */ + +/* + * タスクの起床(非タスクコンテキスト用) + */ +#ifdef __iwup_tsk + +SYSCALL ER +iwup_tsk(ID tskid) +{ + TCB *tcb; + UINT tstat; + ER ercd; + + LOG_IWUP_TSK_ENTER(tskid); + CHECK_INTCTX_UNL(); + CHECK_TSKID(tskid); + tcb = get_tcb(tskid); + + i_lock_cpu(); + if (TSTAT_DORMANT(tstat = tcb->tstat)) { + ercd = E_OBJ; + } + else if ((tstat & TS_WAIT_SLEEP) != 0) { + if (wait_complete(tcb)) { + reqflg = TRUE; + } + ercd = E_OK; + } + else if (!(tcb->wupcnt)) { + tcb->wupcnt = TRUE; + ercd = E_OK; + } + else { + ercd = E_QOVR; + } + i_unlock_cpu(); + + exit: + LOG_IWUP_TSK_LEAVE(ercd); + return(ercd); +} + +#endif /* __iwup_tsk */ + +/* + * タスク起床要求のキャンセル + */ +#ifdef __can_wup + +SYSCALL ER_UINT +can_wup(ID tskid) +{ + TCB *tcb; + ER_UINT ercd; + + LOG_CAN_WUP_ENTER(tskid); + CHECK_TSKCTX_UNL(); + CHECK_TSKID_SELF(tskid); + tcb = get_tcb_self(tskid); + + t_lock_cpu(); + if (TSTAT_DORMANT(tcb->tstat)) { + ercd = E_OBJ; + } + else { + ercd = tcb->wupcnt ? 1 : 0; + tcb->wupcnt = FALSE; + } + t_unlock_cpu(); + + exit: + LOG_CAN_WUP_LEAVE(ercd); + return(ercd); +} + +#endif /* __can_wup */ + +/* + * 待ち状態の強制解除 + */ +#ifdef __rel_wai + +SYSCALL ER +rel_wai(ID tskid) +{ + TCB *tcb; + ER ercd; + + LOG_REL_WAI_ENTER(tskid); + CHECK_TSKCTX_UNL(); + CHECK_TSKID(tskid); + tcb = get_tcb(tskid); + + t_lock_cpu(); + if (!(TSTAT_WAITING(tcb->tstat))) { + ercd = E_OBJ; + } + else { + if (wait_release(tcb)) { + dispatch(); + } + ercd = E_OK; + } + t_unlock_cpu(); + + exit: + LOG_REL_WAI_LEAVE(ercd); + return(ercd); +} + +#endif /* __rel_wai */ + +/* + * 待ち状態の強制解除(非タスクコンテキスト用) + */ +#ifdef __irel_wai + +SYSCALL ER +irel_wai(ID tskid) +{ + TCB *tcb; + ER ercd; + + LOG_IREL_WAI_ENTER(tskid); + CHECK_INTCTX_UNL(); + CHECK_TSKID(tskid); + tcb = get_tcb(tskid); + + i_lock_cpu(); + if (!(TSTAT_WAITING(tcb->tstat))) { + ercd = E_OBJ; + } + else { + if (wait_release(tcb)) { + reqflg = TRUE; + } + ercd = E_OK; + } + i_unlock_cpu(); + + exit: + LOG_IREL_WAI_LEAVE(ercd); + return(ercd); +} + +#endif /* __irel_wai */ + +/* + * 強制待ち状態への移行 + */ +#ifdef __sus_tsk + +SYSCALL ER +sus_tsk(ID tskid) +{ + TCB *tcb; + UINT tstat; + ER ercd; + + LOG_SUS_TSK_ENTER(tskid); + CHECK_TSKCTX_UNL(); + CHECK_TSKID_SELF(tskid); + tcb = get_tcb_self(tskid); + + t_lock_cpu(); + if (tcb == runtsk && !(enadsp)) { + ercd = E_CTX; + } + else if (TSTAT_DORMANT(tstat = tcb->tstat)) { + ercd = E_OBJ; + } + else if (TSTAT_RUNNABLE(tstat)) { + /* + * 実行できる状態から強制待ち状態への遷移 + */ + tcb->tstat = TS_SUSPENDED; + LOG_TSKSTAT(tcb); + if (make_non_runnable(tcb)) { + dispatch(); + } + ercd = E_OK; + } + else if (TSTAT_SUSPENDED(tstat)) { + ercd = E_QOVR; + } + else { + /* + * 待ち状態から二重待ち状態への遷移 + */ + tcb->tstat |= TS_SUSPENDED; + LOG_TSKSTAT(tcb); + ercd = E_OK; + } + t_unlock_cpu(); + + exit: + LOG_SUS_TSK_LEAVE(ercd); + return(ercd); +} + +#endif /* __sus_tsk */ + +/* + * 強制待ち状態からの再開 + */ +#ifdef __rsm_tsk + +SYSCALL ER +rsm_tsk(ID tskid) +{ + TCB *tcb; + UINT tstat; + ER ercd; + + LOG_RSM_TSK_ENTER(tskid); + CHECK_TSKCTX_UNL(); + CHECK_TSKID(tskid); + tcb = get_tcb(tskid); + + t_lock_cpu(); + if (!(TSTAT_SUSPENDED(tstat = tcb->tstat))) { + ercd = E_OBJ; + } + else if (!(TSTAT_WAITING(tstat))) { + /* + * 強制待ち状態から実行できる状態への遷移 + */ + if (make_runnable(tcb)) { + dispatch(); + } + ercd = E_OK; + } + else { + /* + * 二重待ち状態から待ち状態への遷移 + */ + tcb->tstat &= ~TS_SUSPENDED; + LOG_TSKSTAT(tcb); + ercd = E_OK; + } + t_unlock_cpu(); + + exit: + LOG_RSM_TSK_LEAVE(ercd); + return(ercd); +} + +#endif /* __rsm_tsk */ + +/* + * 強制待ち状態からの強制再開 + * + * JSPカーネルでは,frsm_tsk と rsm_tsk は同一の処理となる.frsm_tsk + * が呼ばれると,frsm_tsk と rsm_tsk の両方のサービスコールのトレース + * ログが出力される.ログ取得後に rsm_tsk のトレースログを削除するこ + * とが必要である.rsm_tsk のトレースログを正しく削除するためには,タ + * スクディスパッチのログと,タスク例外処理のログも取得することが必要 + * となるので,注意が必要である. + */ +#ifdef __frsm_tsk + +SYSCALL ER +frsm_tsk(ID tskid) +{ + ER ercd; + + LOG_FRSM_TSK_ENTER(tskid); + ercd = rsm_tsk(tskid); + LOG_FRSM_TSK_LEAVE(ercd); + return(ercd); +} + +#endif /* __frsm_tsk */ + +/* + * 自タスクの遅延 + */ +#ifdef __dly_tsk + +SYSCALL ER +dly_tsk(RELTIM dlytim) +{ + WINFO winfo; + TMEVTB tmevtb; + ER ercd; + + LOG_DLY_TSK_ENTER(dlytim); + CHECK_DISPATCH(); + CHECK_PAR(dlytim <= TMAX_RELTIM); + + t_lock_cpu(); + runtsk->tstat = TS_WAITING; + make_non_runnable(runtsk); + runtsk->winfo = &winfo; + winfo.tmevtb = &tmevtb; + tmevtb_enqueue(&tmevtb, dlytim, (CBACK) wait_tmout_ok, (VP) runtsk); + LOG_TSKSTAT(runtsk); + dispatch(); + ercd = winfo.wercd; + t_unlock_cpu(); + + exit: + LOG_DLY_TSK_LEAVE(ercd); + return(ercd); +} + +#endif /* __dly_tsk */ diff --git a/uzume_prototype/kernel/kernel/time_event.c b/uzume_prototype/kernel/kernel/time_event.c new file mode 100644 index 0000000..edbafd8 --- /dev/null +++ b/uzume_prototype/kernel/kernel/time_event.c @@ -0,0 +1,388 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2006 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: time_event.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * タイムイベント管理モジュール + */ + +#include "jsp_kernel.h" +#include "check.h" +#include "time_event.h" + +/* + * タイムイベントヒープ操作マクロ + */ +#define PARENT(index) ((index) >> 1) /* 親ノードを求める */ +#define LCHILD(index) ((index) << 1) /* 右の子ノードを求める */ +#define TMEVT_NODE(index) (tmevt_heap[(index) - 1]) + +/* + * イベント発生時刻比較マクロ + * + * イベント発生時刻は,current_time からの相対値で比較する.すなわち, + * current_time を最小値(最も近い時刻),current_time - 1 が最大値 + * (最も遠い時刻)とみなして比較する. + */ +#define EVTTIM_LT(t1, t2) (((t1) - current_time) < ((t2) - current_time)) +#define EVTTIM_LE(t1, t2) (((t1) - current_time) <= ((t2) - current_time)) + +#ifdef __tmeini + +/* + * システム時刻のオフセット + */ +SYSTIM systim_offset; + +/* + * 現在のシステム時刻(単位: ミリ秒) + * + * 厳密には,前のタイムティックのシステム時刻. + */ +SYSTIM current_time; + +/* + * 次のタイムティックのシステム時刻(単位: 1ミリ秒) + */ +SYSTIM next_time; + +/* + * システム時刻積算用変数(単位: 1/TIM_DENOミリ秒) + */ +#if TIC_DENO != 1 +UINT next_subtime; +#endif /* TIC_DENO != 1 */ + +/* + * タイムイベントヒープの最後の使用領域のインデックス + */ +UINT last_index; + +/* + * タイマモジュールの初期化 + */ +void +tmevt_initialize(void) +{ + systim_offset = 0; + current_time = 0; +#if TIC_DENO == 1 + next_time = current_time + TIC_NUME; +#else /* TIC_DENO == 1 */ + next_subtime += TIC_NUME; + next_time = current_time + next_subtime / TIC_DENO; + next_subtime %= TIC_DENO; +#endif /* TIC_DENO == 1 */ + last_index = 0; +} + +#endif /* __tmeini */ + +/* + * タイムイベントの挿入位置を上向きに探索 + * + * 時刻 time に発生するタイムイベントを挿入するノードを空けるために, + * ヒープの上に向かって空ノードを移動させる.移動前の空ノードの位置を + * index に渡すと,移動後の空ノードの位置(すなわち挿入位置)を返す. + */ +#ifdef __tmeup + +UINT +tmevt_up(UINT index, EVTTIM time) +{ + UINT parent; + + while (index > 1) { + /* + * 親ノードのイベント発生時刻の方が早い(または同じ) + * ならば,index が挿入位置なのでループを抜ける. + */ + parent = PARENT(index); + if (EVTTIM_LE(TMEVT_NODE(parent).time, time)) { + break; + } + + /* + * 親ノードを index の位置に移動させる. + */ + TMEVT_NODE(index) = TMEVT_NODE(parent); + TMEVT_NODE(index).tmevtb->index = index; + + /* + * index を親ノードの位置に更新. + */ + index = parent; + } + return(index); +} + +#endif /* __tmeup */ + +/* + * タイムイベントの挿入位置を下向きに探索 + * + * 時刻 time に発生するタイムイベントを挿入するノードを空けるために, + * ヒープの下に向かって空ノードを移動させる.移動前の空ノードの位置を + * index に渡すと,移動後の空ノードの位置(すなわち挿入位置)を返す. + */ +#ifdef __tmedown + +UINT +tmevt_down(UINT index, EVTTIM time) +{ + UINT child; + + while ((child = LCHILD(index)) <= last_index) { + /* + * 左右の子ノードのイベント発生時刻を比較し,早い方の + * 子ノードの位置を child に設定する.以下の子ノード + * は,ここで選ばれた方の子ノードのこと. + */ + if (child + 1 <= last_index + && EVTTIM_LT(TMEVT_NODE(child + 1).time, + TMEVT_NODE(child).time)) { + child = child + 1; + } + + /* + * 子ノードのイベント発生時刻の方が遅い(または同じ) + * ならば,index が挿入位置なのでループを抜ける. + */ + if (EVTTIM_LE(time, TMEVT_NODE(child).time)) { + break; + } + + /* + * 子ノードを index の位置に移動させる. + */ + TMEVT_NODE(index) = TMEVT_NODE(child); + TMEVT_NODE(index).tmevtb->index = index; + + /* + * index を子ノードの位置に更新. + */ + index = child; + } + return(index); +} + +#endif /* __tmedown */ + +/* + * タイムイベントヒープへの登録 + * + * タイムイベントブロック tmevtb を,time で指定した時間が経過後にイ + * ベントが発生するように,タイムイベントヒープに登録する. + */ +#ifdef __tmeins + +void +tmevtb_insert(TMEVTB *tmevtb, EVTTIM time) +{ + UINT index; + + /* + * last_index をインクリメントし,そこから上に挿入位置を探す. + */ + index = tmevt_up(++last_index, time); + + /* + * タイムイベントを index の位置に挿入する. + */ + TMEVT_NODE(index).time = time; + TMEVT_NODE(index).tmevtb = tmevtb; + tmevtb->index = index; +} + +#endif /* __tmeins */ + +/* + * タイムイベントヒープからの削除 + */ +#ifdef __tmedel + +void +tmevtb_delete(TMEVTB *tmevtb) +{ + UINT index = tmevtb->index; + UINT parent; + EVTTIM event_time = TMEVT_NODE(last_index).time; + + /* + * 削除によりタイムイベントヒープが空になる場合は何もしない. + */ + if (--last_index == 0) { + return; + } + + /* + * 削除したノードの位置に最後のノード(last_index + 1 の位置 + * のノード)を挿入し,それを適切な位置へ移動させる.実際には, + * 最後のノードを実際に挿入するのではなく,削除したノードの位 + * 置が空ノードになるので,最後のノードを挿入すべき位置へ向け + * て空ノードを移動させる. + * 最後のノードのイベント発生時刻が,削除したノードの親ノード + * のイベント発生時刻より前の場合には,上に向かって挿入位置を + * 探す.そうでない場合には,下に向かって探す. + */ + if (index > 1 && EVTTIM_LT(event_time, + TMEVT_NODE(parent = PARENT(index)).time)) { + /* + * 親ノードを index の位置に移動させる. + */ + TMEVT_NODE(index) = TMEVT_NODE(parent); + TMEVT_NODE(index).tmevtb->index = index; + + /* + * 削除したノードの親ノードから上に向かって挿入位置を + * 探す. + */ + index = tmevt_up(parent, event_time); + } + else { + /* + * 削除したノードから下に向かって挿入位置を探す. + */ + index = tmevt_down(index, event_time); + } + + /* + * 最後のノードを index の位置に挿入する. + */ + TMEVT_NODE(index) = TMEVT_NODE(last_index + 1); + TMEVT_NODE(index).tmevtb->index = index; +} + +#endif /* __tmedel */ + +/* + * タイムイベントヒープの先頭のノードの削除 + */ +Inline void +tmevtb_delete_top(void) +{ + UINT index; + EVTTIM event_time = TMEVT_NODE(last_index).time; + + /* + * 削除によりタイムイベントヒープが空になる場合は何もしない. + */ + if (--last_index == 0) { + return; + } + + /* + * ルートノードに最後のノード(last_index + 1 の位置のノード) + * を挿入し,それを適切な位置へ移動させる.実際には,最後のノー + * ドを実際に挿入するのではなく,ルートノードが空ノードになる + * ので,最後のノードを挿入すべき位置へ向けて空ノードを移動さ + * せる. + */ + index = tmevt_down(1, event_time); + + /* + * 最後のノードを index の位置に挿入する. + */ + TMEVT_NODE(index) = TMEVT_NODE(last_index + 1); + TMEVT_NODE(index).tmevtb->index = index; +} + +/* + * タイムティックの供給 + * + * TIC_NUME < TIC_DENO の時は,除算を使わずに時刻の更新ができるが,ソー + * スコードを読みやすくにするために #if の多用を避けている. + */ +#ifdef __isig_tim + +SYSCALL ER +isig_tim(void) +{ + TMEVTB *tmevtb; + ER ercd; + + LOG_ISIG_TIM_ENTER(); + CHECK_INTCTX_UNL(); + i_lock_cpu(); + + /* + * next_time よりイベント発生時刻の早い(または同じ)タイムイ + * ベントを,タイムイベントヒープから削除し,コールバック関数 + * を呼び出す. + */ + while (last_index > 0 && EVTTIM_LE(TMEVT_NODE(1).time, next_time)) { + tmevtb = TMEVT_NODE(1).tmevtb; + tmevtb_delete_top(); + (*(tmevtb->callback))(tmevtb->arg); + + /* + * ここで優先度の高い割込みを受け付ける. + */ + i_unlock_cpu(); + i_lock_cpu(); + } + + /* + * current_time を更新する. + */ + current_time = next_time; + + /* + * next_time,next_subtime を更新する. + */ +#if TIC_DENO == 1 + next_time = current_time + TIC_NUME; +#else /* TIC_DENO == 1 */ + next_subtime += TIC_NUME % TIC_DENO; + next_time = current_time + TIC_NUME / TIC_DENO; + if (next_subtime >= TIC_DENO) { + next_subtime -= TIC_DENO; + next_time += 1u; + } +#endif /* TIC_DENO == 1 */ + + ercd = E_OK; + i_unlock_cpu(); + + exit: + LOG_ISIG_TIM_LEAVE(ercd); + return(ercd); +} + +#endif /* __isig_tim */ diff --git a/uzume_prototype/kernel/kernel/time_event.h b/uzume_prototype/kernel/kernel/time_event.h new file mode 100644 index 0000000..5f9eb4e --- /dev/null +++ b/uzume_prototype/kernel/kernel/time_event.h @@ -0,0 +1,188 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: time_event.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * タイムイベント管理モジュール + */ + +#ifndef _TIME_EVENT_H_ +#define _TIME_EVENT_H_ + +/* + * イベント発生時刻のデータ型の定義 + * + * EVTTIM は,RELTIM として指定できる範囲よりも広い範囲を表現できる必 + * 要がある.スタンダードプロファイルでは,RELTIM が 16bit 以上でなけ + * ればならないため,EVTTIM は 17bit 以上であることが必要である.その + * ため,16bit の場合がある UINT ではなく,UW に定義している. + */ +typedef UW EVTTIM; + +/* + * 相対時間(RELTIM)に指定できる最大値 + */ +#define TMAX_RELTIM ((((EVTTIM) 1) << (sizeof(EVTTIM) * CHAR_BIT - 1)) - 1) + +/* + * タイムイベントブロックのデータ型の定義 + */ +typedef void (*CBACK)(VP); /* コールバック関数の型 */ + +typedef struct time_event_block { + UINT index; /* タイムイベントヒープ中での位置 */ + CBACK callback; /* コールバック関数 */ + VP arg; /* コールバック関数へ渡す引数 */ +} TMEVTB; + +/* + * タイムイベントヒープ中のノードのデータ型の定義 + */ +typedef struct time_event_node { + EVTTIM time; /* イベント発生時刻 */ + TMEVTB *tmevtb; /* 対応するタイムイベントブロック */ +} TMEVTN; + +/* + * タイムイベントヒープ(kernel_cfg.c) + */ +extern TMEVTN tmevt_heap[]; + +/* + * システム時刻のオフセット + */ +extern SYSTIM systim_offset; + +/* + * 現在のシステム時刻(単位: ミリ秒) + * + * システム起動時に 0 に初期化され,以降,isig_tim が呼ばれる度に単調 + * に増加する.set_tim によって変更されない. + */ +extern SYSTIM current_time; + +/* + * 次のタイムティックのシステム時刻(単位: 1ミリ秒) + */ +extern SYSTIM next_time; + +/* + * システム時刻積算用変数(単位: 1/TIM_DENOミリ秒) + * + * 次のタイムティックのシステム時刻の下位桁を示す(上位桁は next_time). + * TIC_DENO が 1 の時は,下位桁は常に 0 であるため,この変数は必要ない. + */ +#if TIC_DENO != 1 +extern UINT next_subtime; +#endif /* TIC_DENO != 1 */ + +/* + * 相対時間のベース時刻(単位: 1ミリ秒) + * + * 次のタイムティックのシステム時刻を切り上げた時刻.TIC_DENO が 1 の + * 時は,next_time を EVTTIM に変換したものに一致する. + */ +#if TIC_DENO == 1 +#define base_time ((EVTTIM) next_time) +#else /* TIC_DENO == 1 */ +#define base_time ((EVTTIM)(next_time + (next_subtime > 0 ? 1 : 0))) +#endif /* TIC_DENO == 1 */ + +/* + * タイムイベントヒープの最後の使用領域のインデックス + * + * タイムイベントヒープに登録されているタイムイベントの数に一致する. + */ +extern UINT last_index; + +/* + * タイムイベント管理モジュールの初期化 + */ +extern void tmevt_initialize(void); + +/* + * タイムイベントの挿入位置の探索 + */ +extern UINT tmevt_up(UINT index, EVTTIM time); +extern UINT tmevt_down(UINT index, EVTTIM time); + +/* + * タイムイベントヒープへの登録と削除 + */ +extern void tmevtb_insert(TMEVTB *tmevtb, EVTTIM time); +extern void tmevtb_delete(TMEVTB *tmevtb); + +/* + * タイムイベントブロックの登録(相対時間指定) + * + * time で指定した相対時間が経過後に,arg を引数として callback が呼 + * び出されるように,タイムイベントブロック tmevtb を登録する. + */ +Inline void +tmevtb_enqueue(TMEVTB *tmevtb, RELTIM time, CBACK callback, VP arg) +{ + assert(time <= TMAX_RELTIM); + + tmevtb->callback = callback; + tmevtb->arg = arg; + tmevtb_insert(tmevtb, base_time + time); +} + +/* + * タイムイベントブロックの登録(イベント発生時刻指定) + * + * time で指定したイベント発生時刻に,arg を引数として callback が呼 + * び出されるように,タイムイベントブロック tmevtb を登録する. + */ +Inline void +tmevtb_enqueue_evttim(TMEVTB *tmevtb, EVTTIM time, CBACK callback, VP arg) +{ + tmevtb->callback = callback; + tmevtb->arg = arg; + tmevtb_insert(tmevtb, time); +} + +/* + * タイムイベントブロックの登録解除 + */ +Inline void +tmevtb_dequeue(TMEVTB *tmevtb) +{ + tmevtb_delete(tmevtb); +} + +#endif /* _TIME_EVENT_H_ */ diff --git a/uzume_prototype/kernel/kernel/time_manage.c b/uzume_prototype/kernel/kernel/time_manage.c new file mode 100644 index 0000000..bce8912 --- /dev/null +++ b/uzume_prototype/kernel/kernel/time_manage.c @@ -0,0 +1,151 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: time_manage.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * システム時刻管理機能 + */ + +#include "jsp_kernel.h" +#include "check.h" +#include "time_event.h" + +/* + * システム時刻の設定 + */ +#ifdef __set_tim + +SYSCALL ER +set_tim(const SYSTIM *p_systim) +{ + ER ercd; + + LOG_SET_TIM_ENTER(p_systim); + CHECK_TSKCTX_UNL(); + + t_lock_cpu(); + systim_offset = *p_systim - current_time; + ercd = E_OK; + t_unlock_cpu(); + + exit: + LOG_SET_TIM_LEAVE(ercd); + return(ercd); +} + +#endif /* __set_tim */ + +/* + * システム時刻の参照 + */ +#ifdef __get_tim + +SYSCALL ER +get_tim(SYSTIM *p_systim) +{ + ER ercd; + + LOG_GET_TIM_ENTER(p_systim); + CHECK_TSKCTX_UNL(); + + t_lock_cpu(); + *p_systim = systim_offset + current_time; + ercd = E_OK; + t_unlock_cpu(); + + exit: + LOG_GET_TIM_LEAVE(ercd, *p_systim); + return(ercd); +} + +#endif /* __get_tim */ + +/* + * 性能評価用システム時刻の参照 + */ +#ifdef __vxget_tim +#ifdef SUPPORT_VXGET_TIM +#include + +SYSCALL ER +vxget_tim(SYSUTIM *p_sysutim) +{ + SYSUTIM utime; + SYSTIM time; +#if TIC_DENO != 1 + INT subtime; +#endif /* TIC_DENO != 1 */ + CLOCK clock; + BOOL ireq; + BOOL locked; + ER ercd; + + LOG_VXGET_TIM_ENTER(p_sysutim); + CHECK_TSKCTX(); + + locked = sense_lock(); + if (!(locked)) { + t_lock_cpu(); + } + time = systim_offset + next_time; +#if TIC_DENO != 1 + subtime = (INT) next_subtime; +#endif /* TIC_DENO != 1 */ + clock = hw_timer_get_current(); + ireq = hw_timer_fetch_interrupt(); + if (!(locked)) { + t_unlock_cpu(); + } + + utime = ((SYSUTIM) time) * 1000; +#if TIC_DENO != 1 + utime += subtime * 1000 / TIC_DENO; +#endif /* TIC_DENO != 1 */ + if (!(ireq && !(BEFORE_IREQ(clock)))) { + utime -= TIC_NUME * 1000 / TIC_DENO; + } + utime += TO_USEC(clock); + *p_sysutim = utime; + ercd = E_OK; + + exit: + LOG_VXGET_TIM_LEAVE(ercd, *p_sysutim); + return(ercd); +} + +#endif /* SUPPORT_VXGET_TIM */ +#endif /* __vxget_tim */ diff --git a/uzume_prototype/kernel/kernel/wait.c b/uzume_prototype/kernel/kernel/wait.c new file mode 100644 index 0000000..6eefd39 --- /dev/null +++ b/uzume_prototype/kernel/kernel/wait.c @@ -0,0 +1,251 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: wait.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * 待ち状態管理モジュール + */ + +#include "jsp_kernel.h" +#include "wait.h" + +/* + * 待ち状態への移行(タイムアウト指定) + * + */ +#ifdef __waimake + +void +make_wait_tmout(WINFO *winfo, TMEVTB *tmevtb, TMO tmout) +{ + make_non_runnable(runtsk); + runtsk->winfo = winfo; + if (tmout > 0) { + winfo->tmevtb = tmevtb; + tmevtb_enqueue(tmevtb, (RELTIM) tmout, + (CBACK) wait_tmout, (VP) runtsk); + } + else { + assert(tmout == TMO_FEVR); + winfo->tmevtb = NULL; + } +} + +#endif /* __waimake */ + +/* + * 待ち解除のためのタスク状態の更新 + * + * tcb で指定されるタスクを,待ち解除するようタスク状態を更新する.待 + * ち解除するタスクが実行できる状態になる場合は,レディキューにつなぐ. + * また,ディスパッチが必要な場合には TRUE を返す. + */ +Inline BOOL +make_non_wait(TCB *tcb) +{ + assert(TSTAT_WAITING(tcb->tstat)); + + if (!(TSTAT_SUSPENDED(tcb->tstat))) { + /* + * 待ち状態から実行できる状態への遷移 + */ + return(make_runnable(tcb)); + } + else { + /* + * 二重待ち状態から強制待ち状態への遷移 + */ + tcb->tstat = TS_SUSPENDED; + LOG_TSKSTAT(tcb); + return(FALSE); + } +} + +/* + * 待ち解除 + */ +#ifdef __waicmp + +BOOL +wait_complete(TCB *tcb) +{ + if (tcb->winfo->tmevtb != NULL) { + tmevtb_dequeue(tcb->winfo->tmevtb); + } + tcb->winfo->wercd = E_OK; + return(make_non_wait(tcb)); +} + +#endif /* __waicmp */ + +/* + * タイムアウトに伴う待ち解除 + */ +#ifdef __waitmo + +void +wait_tmout(TCB *tcb) +{ + if ((tcb->tstat & TS_WAIT_WOBJ) != 0) { + queue_delete(&(tcb->task_queue)); + } + tcb->winfo->wercd = E_TMOUT; + if (make_non_wait(tcb)) { + reqflg = TRUE; + } +} + +#endif /* __waitmo */ +#ifdef __waitmook + +void +wait_tmout_ok(TCB *tcb) +{ + tcb->winfo->wercd = E_OK; + if (make_non_wait(tcb)) { + reqflg = TRUE; + } +} + +#endif /* __waitmook */ + +/* + * 待ち状態の強制解除 + */ +#ifdef __waican + +void +wait_cancel(TCB *tcb) +{ + if (tcb->winfo->tmevtb != NULL) { + tmevtb_dequeue(tcb->winfo->tmevtb); + } + if ((tcb->tstat & TS_WAIT_WOBJ) != 0) { + queue_delete(&(tcb->task_queue)); + } +} + +#endif /* __waican */ +#ifdef __wairel + +BOOL +wait_release(TCB *tcb) +{ + wait_cancel(tcb); + tcb->winfo->wercd = E_RLWAI; + return(make_non_wait(tcb)); +} + +#endif /* __wairel */ + +/* + * タスクの優先度順の待ちキューへの挿入 + */ +Inline void +queue_insert_tpri(TCB *tcb, QUEUE *queue) +{ + QUEUE *entry; + UINT priority = tcb->priority; + + for (entry = queue->next; entry != queue; entry = entry->next) { + if (priority < ((TCB *) entry)->priority) { + break; + } + } + queue_insert_prev(entry, &(tcb->task_queue)); +} + +/* + * 実行中のタスクの同期・通信オブジェクトの待ちキューへの挿入 + */ +Inline void +wobj_queue_insert(WOBJCB *wobjcb) +{ + if ((wobjcb->wobjinib->wobjatr & TA_TPRI) != 0) { + queue_insert_tpri(runtsk, &(wobjcb->wait_queue)); + } + else { + queue_insert_prev(&(wobjcb->wait_queue), + &(runtsk->task_queue)); + } +} + +/* + * 同期・通信オブジェクトに対する待ち状態への移行 + */ +#ifdef __wobjwai + +void +wobj_make_wait(WOBJCB *wobjcb, WINFO_WOBJ *winfo) +{ + runtsk->tstat = (TS_WAITING | TS_WAIT_WOBJ | TS_WAIT_WOBJCB); + make_wait(&(winfo->winfo)); + wobj_queue_insert(wobjcb); + winfo->wobjcb = wobjcb; + LOG_TSKSTAT(runtsk); +} + +#endif /* __wobjwai */ +#ifdef __wobjwaitmo + +void +wobj_make_wait_tmout(WOBJCB *wobjcb, WINFO_WOBJ *winfo, + TMEVTB *tmevtb, TMO tmout) +{ + runtsk->tstat = (TS_WAITING | TS_WAIT_WOBJ | TS_WAIT_WOBJCB); + make_wait_tmout(&(winfo->winfo), tmevtb, tmout); + wobj_queue_insert(wobjcb); + winfo->wobjcb = wobjcb; + LOG_TSKSTAT(runtsk); +} + +#endif /* __wobjwaitmo */ +/* + * タスクの優先度変更時の処理 + */ +#ifdef __wobjpri + +void +wobj_change_priority(WOBJCB *wobjcb, TCB *tcb) +{ + if ((wobjcb->wobjinib->wobjatr & TA_TPRI) != 0) { + queue_delete(&(tcb->task_queue)); + queue_insert_tpri(tcb, &(wobjcb->wait_queue)); + } +} + +#endif /* __wobjpri */ diff --git a/uzume_prototype/kernel/kernel/wait.h b/uzume_prototype/kernel/kernel/wait.h new file mode 100644 index 0000000..de665f5 --- /dev/null +++ b/uzume_prototype/kernel/kernel/wait.h @@ -0,0 +1,168 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: wait.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * 待ち状態管理モジュール + */ + +#ifndef _WAIT_H_ +#define _WAIT_H_ + +#include "task.h" +#include "time_event.h" + +/* + * 待ち状態への移行 + * + * 実行中のタスクを待ち状態に移行させる.具体的には,実行中のタスクを + * レディキューから削除し,TCB の winfoフィールド,WINFO の tmevtbフ + * ィールドを設定する. + */ +Inline void +make_wait(WINFO *winfo) +{ + make_non_runnable(runtsk); + runtsk->winfo = winfo; + winfo->tmevtb = NULL; +} + +/* + * 待ち状態への移行(タイムアウト指定) + * + * 実行中のタスクを,タイムアウト指定付きで待ち状態に移行させる.具体 + * 的には,実行中のタスクをレディキューから削除し,TCB の winfoフィー + * ルド,WINFO の tmevtbフィールドを設定する.また,タイムイベントブ + * ロックを登録する. + */ +extern void make_wait_tmout(WINFO *winfo, TMEVTB *tmevtb, TMO tmout); + +/* + * 待ち解除 + * + * tcb で指定されるタスクの待ち状態を解除する.具体的には,タイムイベ + * ントブロックが登録されていれば,それを登録解除する.また,タスク状 + * 態を更新し,待ち解除したタスクからの返値を E_OK とする.待ちキュー + * からの削除は行わない.待ち解除したタスクへのディスパッチが必要な場 + * 合には TRUE を返す. + */ +extern BOOL wait_complete(TCB *tcb); + +/* + * タイムアウトに伴う待ち解除 + * + * tcb で指定されるタスクが,待ちキューにつながれていれば待ちキューか + * ら削除し,タスク状態を更新する.また,待ち解除したタスクからの返値 + * を,wait_tmoutでは E_TMOUT,wait_tmout_ok では E_OK とする.待ち解 + * 除したタスクへのディスパッチが必要な時は,reqflg を TRUE にする. + * wait_tmout_ok は,dly_tsk で使うためのもので,待ちキューから削除す + * る処理を行わない. + * いずれの関数も,タイムイベントのコールバック関数として用いるための + * もので,割込みハンドラから呼び出されることを想定している. + */ +extern void wait_tmout(TCB *tcb); +extern void wait_tmout_ok(TCB *tcb); + +/* + * 待ち状態の強制解除 + * + * tcb で指定されるタスクの待ち状態を強制的に解除する.具体的には,タ + * スクが待ちキューにつながれていれば待ちキューから削除し,タイムイベ + * ントブロックが登録されていればそれを登録解除する. + * wait_cancel は,タスクの状態は更新しない. + * wait_release は,タスクの状態を更新し,待ち解除したタスクからの返 + * 値を E_RLWAI とする.また,待ち解除したタスクへのディスパッチが必 + * 要な場合には TRUE を返す. + */ +extern void wait_cancel(TCB *tcb); +extern BOOL wait_release(TCB *tcb); + +/* + * 同期・通信オブジェクトの管理ブロックの共通部分操作ルーチン + * + * 同期・通信オブジェクトの初期化ブロックと管理ブロックの先頭部分は共 + * 通になっている.以下は,その共通部分を扱うための型およびルーチン群 + * である. + * 複数の待ちキューを持つ同期・通信オブジェクトの場合,先頭以外の待ち + * キューを操作する場合には,これらのルーチンは使えない.また,オブジェ + * クト属性の TA_TPRI ビットを参照するので,このビットを他の目的に使っ + * ている場合も,これらのルーチンは使えない. + */ + +/* + * 同期・通信オブジェクトの初期化ブロックの共通部分 + */ +typedef struct wait_object_initialization_block { + ATR wobjatr; /* オブジェクト属性 */ +} WOBJINIB; + +/* + * 同期・通信オブジェクトの管理ブロックの共通部分 + */ +typedef struct wait_object_control_block { + QUEUE wait_queue; /* 待ちキュー */ + const WOBJINIB *wobjinib; /* 初期化ブロックへのポインタ */ +} WOBJCB; + +/* + * 同期・通信オブジェクト待ち情報ブロックの定義 + */ +typedef struct wait_object_waiting_information { + WINFO winfo; /* 標準の待ち情報ブロック */ + WOBJCB *wobjcb; /* 待ちオブジェクトの管理ブロック */ +} WINFO_WOBJ; + +/* + * 同期・通信オブジェクトに対する待ち状態への移行 + * + * 実行中のタスクを待ち状態に移行させ,同期・通信オブジェクトの待ちキュー + * につなぐ.また,待ち情報ブロック(WINFO)の wobjcb を設定する. + * wobj_make_wait_tmout は,タイムイベントブロックの登録も行う. + */ +extern void wobj_make_wait(WOBJCB *wobjcb, WINFO_WOBJ *winfo); +extern void wobj_make_wait_tmout(WOBJCB *wobjcb, WINFO_WOBJ *winfo, + TMEVTB *tmevtb, TMO tmout); + +/* + * タスク優先度変更時の処理 + * + * 同期・通信オブジェクトに対する待ち状態にあるタスクの優先度が変更さ + * れた場合に,待ちキューの中でのタスクの位置を修正する. + */ +extern void wobj_change_priority(WOBJCB *wobjcb, TCB *tcb); + +#endif /* _WAIT_H_ */ diff --git a/uzume_prototype/kernel/library/log_output.c b/uzume_prototype/kernel/library/log_output.c new file mode 100644 index 0000000..2eca410 --- /dev/null +++ b/uzume_prototype/kernel/library/log_output.c @@ -0,0 +1,216 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2004-2005 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: log_output.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * システムログのフォーマット出力 + */ + +#include + +/* + * ポインタを格納できる整数型のデフォルトの定義 + */ +#ifndef _intptr_ +#define _intptr_ long +#endif /* _intptr_ */ + +/* + * 数値を文字列に変換 + */ +#define CONVERT_BUFLEN ((sizeof(_intptr_) * CHAR_BIT + 2) / 3) + /* _intptr_型の数値の最大文字数 */ +static void +convert(unsigned _intptr_ val, unsigned int radix, const char *radchar, + int width, int minus, int padzero, void (*putc)(char)) +{ + char buf[CONVERT_BUFLEN]; + int i, j; + + i = 0; + do { + buf[i++] = radchar[val % radix]; + val /= radix; + } while (val != 0); + + width -= minus; + if (minus > 0 && padzero > 0) { + (*putc)('-'); + } + for (j = i; j < width; j++) { + (*putc)((char)(padzero > 0 ? '0' : ' ')); + } + if (minus > 0 && padzero <= 0) { + (*putc)('-'); + } + while (i > 0) { + (*putc)(buf[--i]); + } +} + +/* + * ログ情報のフォーマット出力 + */ +static const char raddec[] = "0123456789"; +static const char radhex[] = "0123456789abcdef"; +static const char radHEX[] = "0123456789ABCDEF"; + +void +syslog_printf(const char *format, VP_INT *args, void (*putc)(char)) +{ + int c; + int width; + int padzero; + _intptr_ val; + const char *str; + + while ((c = *format++) != '\0') { + if (c != '%') { + (*putc)((char) c); + continue; + } + + width = padzero = 0; + if ((c = *format++) == '0') { + padzero = 1; + c = *format++; + } + while ('0' <= c && c <= '9') { + width = width * 10 + c - '0'; + c = *format++; + } + if (c == 'l') { + c = *format++; + } + switch (c) { + case 'd': + val = (_intptr_)(*args++); + if (val >= 0) { + convert((unsigned _intptr_) val, 10, raddec, + width, 0, padzero, putc); + } + else { + convert((unsigned _intptr_)(-val), 10, raddec, + width, 1, padzero, putc); + } + break; + case 'u': + val = (_intptr_)(*args++); + convert((unsigned _intptr_) val, 10, raddec, + width, 0, padzero, putc); + break; + case 'x': + case 'p': + val = (_intptr_)(*args++); + convert((unsigned _intptr_) val, 16, radhex, + width, 0, padzero, putc); + break; + case 'X': + val = (_intptr_)(*args++); + convert((unsigned _intptr_) val, 16, radHEX, + width, 0, padzero, putc); + break; + case 'c': + (*putc)((char)(_intptr_)(*args++)); + break; + case 's': + str = (const char *)(*args++); + while ((c = *str++) != '\0') { + (*putc)((char) c); + } + break; + case '%': + (*putc)('%'); + break; + case '\0': + format--; + break; + default: + break; + } + } + (*putc)('\n'); +} + +void +syslog_print(SYSLOG *p_log, void (*putc)(char)) +{ + switch (p_log->logtype) { + case LOG_TYPE_COMMENT: + syslog_printf((const char *)(p_log->loginfo[0]), + &(p_log->loginfo[1]), putc); + break; + case LOG_TYPE_ASSERT: + syslog_printf("%s:%u: Assertion `%s' failed.", + &(p_log->loginfo[0]), putc); + break; + } +} + +static void +syslog_lostmsg(INT lost, void (*putc)(char)) +{ + VP_INT lostinfo[1]; + + lostinfo[0] = (VP_INT) lost; + syslog_printf("%d messages are lost.", lostinfo, putc); +} + +void +syslog_output(void (*putc)(char)) +{ + SYSLOG log; + INT lostnum, n; + + lostnum = 0; + while ((n = vrea_log(&log)) >= 0) { + lostnum += n; + if (log.logtype < LOG_TYPE_COMMENT) { + continue; + } + if (lostnum > 0) { + syslog_lostmsg(lostnum, putc); + lostnum = 0; + } + syslog_print(&log, putc); + } + if (lostnum > 0) { + syslog_lostmsg(lostnum, putc); + } +} diff --git a/uzume_prototype/kernel/library/strerror.c b/uzume_prototype/kernel/library/strerror.c new file mode 100644 index 0000000..b7b05ca --- /dev/null +++ b/uzume_prototype/kernel/library/strerror.c @@ -0,0 +1,104 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: strerror.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * エラーメッセージ文字列を返す関数 + */ + +#include + +const char * +itron_strerror(ER ercd) +{ + switch (MERCD(ercd)) { + case E_OK: + return("E_OK"); + + case E_SYS: + return("E_SYS"); + case E_NOSPT: + return("E_NOSPT"); + case E_RSFN: + return("E_RSFN"); + case E_RSATR: + return("E_RSATR"); + + case E_PAR: + return("E_PAR"); + case E_ID: + return("E_ID"); + + case E_CTX: + return("E_CTX"); + case E_MACV: + return("E_MACV"); + case E_OACV: + return("E_OACV"); + case E_ILUSE: + return("E_ILUSE"); + + case E_NOMEM: + return("E_NOMEM"); + case E_NOID: + return("E_NOID"); + + case E_OBJ: + return("E_OBJ"); + case E_NOEXS: + return("E_NOEXS"); + case E_QOVR: + return("E_QOVR"); + + case E_RLWAI: + return("E_RLWAI"); + case E_TMOUT: + return("E_TMOUT"); + case E_DLT: + return("E_DLT"); + case E_CLS: + return("E_CLS"); + + case E_WBLK: + return("E_WBLK"); + case E_BOVR: + return("E_BOVR"); + + default: + return("unknown error"); + } +} diff --git a/uzume_prototype/kernel/library/t_perror.c b/uzume_prototype/kernel/library/t_perror.c new file mode 100644 index 0000000..d6fc600 --- /dev/null +++ b/uzume_prototype/kernel/library/t_perror.c @@ -0,0 +1,52 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: t_perror.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * エラーメッセージの出力 + */ + +#include + +extern const char *itron_strerror(ER ercd); + +void +t_perror(UINT prio, const char *file, int line, const char *expr, ER ercd) +{ + syslog_4(prio, "%s reported by `%s' in line %d of `%s'.", + itron_strerror(ercd), expr, line, file); +} diff --git a/uzume_prototype/kernel/library/vasyslog.c b/uzume_prototype/kernel/library/vasyslog.c new file mode 100644 index 0000000..5d85bb5 --- /dev/null +++ b/uzume_prototype/kernel/library/vasyslog.c @@ -0,0 +1,107 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2004-2005 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: vasyslog.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * 可変数引数のシステムログライブラリ + */ + +#include +#include + +ER +syslog(UINT prio, const char *format, ...) +{ + SYSLOG log; + va_list ap; + int i; + int c; + BOOL lflag; + + log.logtype = LOG_TYPE_COMMENT; + log.loginfo[0] = (VP_INT) format; + i = 1; + va_start(ap, format); + + while ((c = *format++) != '\0' && i < TMAX_LOGINFO) { + if (c != '%') { + continue; + } + + lflag = FALSE; + c = *format++; + while ('0' <= c && c <= '9') { + c = *format++; + } + if (c == 'l') { + lflag = TRUE; + c = *format++; + } + switch (c) { + case 'd': + log.loginfo[i++] = lflag ? + (VP_INT) va_arg(ap, long) : + (VP_INT) va_arg(ap, int); + break; + case 'u': + case 'x': + case 'X': + log.loginfo[i++] = lflag ? + (VP_INT) va_arg(ap, unsigned long) : + (VP_INT) va_arg(ap, unsigned int); + break; + case 'p': + log.loginfo[i++] = (VP_INT) va_arg(ap, void *); + break; + case 'c': + log.loginfo[i++] = (VP_INT) va_arg(ap, int); + break; + case 's': + log.loginfo[i++] = (VP_INT) va_arg(ap, const char *); + break; + case '\0': + format--; + break; + default: + break; + } + } + va_end(ap); + return(vwri_log(prio, &log)); +} diff --git a/uzume_prototype/kernel/pdic/simple_sio/fdc37c935a.c b/uzume_prototype/kernel/pdic/simple_sio/fdc37c935a.c new file mode 100644 index 0000000..82bb8e1 --- /dev/null +++ b/uzume_prototype/kernel/pdic/simple_sio/fdc37c935a.c @@ -0,0 +1,405 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: fdc37c935a.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * スーパI/O FDC37C935A 用ドライバ + */ + +#include +#include + +/* + * 初期化 + */ +void +smsc_init(void) +{ + /* + * Enter Config mode + */ + sil_wrh_mem((VP)SMSC_CONFIG_PORT, (0x55 << 8)); + sil_wrh_mem((VP)SMSC_CONFIG_PORT, (0x55 << 8)); + + /* + * Init SCI0 + */ + /* Power on */ + smsc_config_write(0x22, (smsc_config_read(0x22) | 0x10)); + /* Select SCI0 */ + smsc_config_write(0x07, 0x04); + /* Enable SCI0 */ + smsc_config_write(0x30, 0x01); + /* Set SCI0 Base Address */ + smsc_config_write(0x60, (SMSC_SCI0_BASE_ADDR & 0xff00) >> 8); + smsc_config_write(0x61, (SMSC_SCI0_BASE_ADDR & 0xff)); + /* IRQ4 */ + smsc_config_write(0x70, 0x04); + + + /* + * Exit Config mode + */ + sil_wrh_mem((VP)SMSC_CONFIG_PORT, (0xAA << 8)); +} + + +/* + * スーパーI/O(FDC37C935A)用 簡易SIOドライバ + */ + +/* + * シリアルI/Oポート初期化ブロック + */ +typedef struct sio_port_initialization_block { + +} SIOPINIB; + +/* + * シリアルI/Oポート管理ブロック + */ +struct sio_port_control_block { + const SIOPINIB *siopinib; /* シリアルI/Oポート初期化ブロック */ + VP_INT exinf; /* 拡張情報 */ + BOOL openflag; /* オープン済みフラグ */ + BOOL sendflag; /* 送信割込みイネーブルフラグ */ + BOOL getready; /* 文字を受信した状態 */ + BOOL putready; /* 文字を送信できる状態 */ +}; + +/* + * シリアルI/Oポート初期化ブロック + */ +const SIOPINIB siopinib_table[TNUM_SIOP] = {{}}; + +/* + * シリアルI/Oポート管理ブロックのエリア + */ +SIOPCB siopcb_table[TNUM_SIOP]; + + +/* + * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ + */ +#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1)) +#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)])) + + +/* + * 文字を受信したか? + */ +Inline BOOL +smsc_sci0_getready(SIOPCB *siopcb) +{ + return(((sil_reh_mem((VP)SMSC_SCI0_LSR) >> 8) & 0x01) != 0); +} + +/* + * 文字を送信できるか? + */ +Inline BOOL +smsc_sci0_putready(SIOPCB *siopcb) +{ + return(((sil_reh_mem((VP)SMSC_SCI0_LSR) >> 8) & 0x60) != 0); +} + +/* + * 受信した文字の取り出し + */ +Inline char +smsc_sci0_getchar(SIOPCB *siopcb) +{ + return (sil_reh_mem((VP)SMSC_SCI0_RBR) >> 8); +} + +/* + * 送信する文字の書き込み + */ +Inline void +smsc_sci0_putchar(SIOPCB *siopcb, char c) +{ + sil_wrh_mem((VP)SMSC_SCI0_THR, c << 8); +} + +/* + * 送信割込み許可 + */ +Inline void +smsc_sci0_enable_send(SIOPCB *siopcb) +{ + + sil_wrh_mem((VP)SMSC_SCI0_IER, + (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) | 0x02) << 8)); +} + +/* + * 送信割込み禁止 + */ +Inline void +smsc_sci0_disable_send(SIOPCB *siopcb) +{ + sil_wrh_mem((VP)SMSC_SCI0_IER, + (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) & ~0x02) << 8)); +} + +/* + * 受信割込み許可 + */ +Inline void +smsc_sci0_enable_rcv(SIOPCB *siopcb) +{ + + sil_wrh_mem((VP)SMSC_SCI0_IER, + (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) | 0x01) << 8)); +} + +/* + * 受信割込み禁止 + */ +Inline void +smsc_sci0_disable_rcv(SIOPCB *siopcb) +{ + sil_wrh_mem((VP)SMSC_SCI0_IER, + (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) & ~0x01) << 8)); +} + + + + + +/* + * SIOドライバの初期化ルーチン + * 1ポートしかないため,あまり意味はない + */ +void +smsc_sci0_initialize() +{ + SIOPCB *siopcb; + UINT i; + + /* + * シリアルI/Oポート管理ブロックの初期化 + */ + for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) { + siopcb->siopinib = &(siopinib_table[i]); + siopcb->openflag = FALSE; + siopcb->sendflag = FALSE; + } +} + +/* + * 割込み以外の初期化 + */ +void +fdc37c935a_init(void) +{ + volatile UH dummy; + + /* BIT7 = 1 */ + sil_wrh_mem((VP)SMSC_SCI0_LCR, 0x83 << 8); + + /* Set BPS */ + sil_wrh_mem((VP)SMSC_SCI0_DLL, ((SMSC_SCI0_BPS & 0x00ff) << 8)); + sil_wrh_mem((VP)SMSC_SCI0_DLM, ((SMSC_SCI0_BPS >> 8) << 8)); + + /* BIT7 = 0 Divisor Latch BIT6 = 0 No Break : BIT3 = 0 NoParity + : BIT2 = 0 1Stopbit : BIT1,0 = {1.1} 8bitData */ + sil_wrh_mem((VP)SMSC_SCI0_LCR, 0x03 << 8); + + /* Do not use FIFO */ + sil_wrh_mem((VP)SMSC_SCI0_FCR, 0x0000); + + /* Clear Status */ + dummy = sil_reh_mem((VP)SMSC_SCI0_RBR); + dummy = sil_reh_mem((VP)SMSC_SCI0_LSR); +} + +/* + * オープンしているポートがあるか + */ +BOOL +smsc_sci0_openflag(void) +{ + return(siopcb_table[0].openflag); +} + +/* + * シリアルI/Oポートのオープン + */ +SIOPCB * +smsc_sci0_opn_por(ID siopid, VP_INT exinf) +{ + SIOPCB *siopcb; + const SIOPINIB *siopinib; + + + siopcb = get_siopcb(siopid); + siopinib = siopcb->siopinib; + + fdc37c935a_init(); + + /* Enable Receive Data Interrupt */ + sil_wrh_mem((VP)SMSC_SCI0_IER, (0x01 << 8)); + sil_wrh_mem((VP)SMSC_SCI0_MCR, 0x08 << 8); + + /* + * MS7729RSE01では,一度送信割込みを発生させておかないと割込み + * レベル16の割込みが発生してしまい正しく動作しない. + */ + /* 送信割り込み要求を許可 */ + sil_wrh_mem((VP)SMSC_SCI0_IER, + (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) | 0x02) << 8)); + /* 送信割り込み要求を禁止 */ + sil_wrh_mem((VP)SMSC_SCI0_IER, + (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) & ~0x02) << 8)); + + siopcb->exinf = exinf; + siopcb->getready = siopcb->putready = FALSE; + siopcb->openflag = TRUE; + + return(siopcb); +} + +/* + * シリアルI/Oポートのクローズ + */ +void +smsc_sci0_cls_por(SIOPCB *siopcb) +{ + sil_wrh_mem((VP)SMSC_SCI0_IER, 0x00); /* 割込みの禁止 */ + siopcb->openflag = FALSE; +} + +/* + * シリアルI/Oポートへのポーリングでの出力 + */ +void +fdc37c935a_pol_putc(char c) +{ + while(((sil_reh_mem((VP)SMSC_SCI0_LSR) >> 8) & 0x60) == 0) + ; + + sil_wrh_mem((VP)SMSC_SCI0_THR, c << 8); +} + +/* + * シリアルI/Oポートへの文字送信 + */ +BOOL +smsc_sci0_snd_chr(SIOPCB *siopcb, char c) +{ + if (smsc_sci0_putready(siopcb)){ + smsc_sci0_putchar(siopcb, c); + return(TRUE); + } + return(FALSE); +} + +/* + * シリアルI/Oポートからの文字受信 + */ +INT +smsc_sci0_rcv_chr(SIOPCB *siopcb) +{ + if (smsc_sci0_getready(siopcb)) { + return((INT)(UB) smsc_sci0_getchar(siopcb)); + } + return(-1); +} + + +/* + * シリアルI/Oポートからのコールバックの許可 + */ +void +smsc_sci0_ena_cbr(SIOPCB *siopcb, UINT cbrtn) +{ + + switch (cbrtn) { + case SIO_ERDY_SND: + smsc_sci0_enable_send(siopcb); + break; + case SIO_ERDY_RCV: + smsc_sci0_enable_rcv(siopcb); + break; + } +} + +/* + * シリアルI/Oポートからのコールバックの禁止 + */ +void +smsc_sci0_dis_cbr(SIOPCB *siopcb, UINT cbrtn) +{ + switch (cbrtn) { + case SIO_ERDY_SND: + smsc_sci0_disable_send(siopcb); + break; + case SIO_ERDY_RCV: + smsc_sci0_disable_rcv(siopcb); + break; + } +} + +/* + * シリアルI/Oポートに対する割込み処理 + */ +static void +smsc_sci0_isr_siop(SIOPCB *siopcb) +{ + if (smsc_sci0_getready(siopcb)) { + /* + * 受信通知コールバックルーチンを呼び出す. + */ + smsc_sci0_ierdy_rcv(siopcb->exinf); + } + if (smsc_sci0_putready(siopcb)) { + /* + * 送信可能コールバックルーチンを呼び出す. + */ + smsc_sci0_ierdy_snd(siopcb->exinf); + } +} + +/* + * SIOの割込みサービスルーチン + */ +void +smsc_sci0_isr() +{ + smsc_sci0_isr_siop(&(siopcb_table[0])); +} diff --git a/uzume_prototype/kernel/pdic/simple_sio/fdc37c935a.h b/uzume_prototype/kernel/pdic/simple_sio/fdc37c935a.h new file mode 100644 index 0000000..46a8b27 --- /dev/null +++ b/uzume_prototype/kernel/pdic/simple_sio/fdc37c935a.h @@ -0,0 +1,197 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: fdc37c935a.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * スーパI/O FDC37C935A 用ドライバ + */ +#ifndef _FDC37C935A_H_ +#define _FDC37C935A_H_ + +#include + +/* + * ベースアドレス + */ +//#define SMSC_BASE_ADDR 0xB0400000 + +#define SMSC_CONFIG_PORT (SMSC_BASE_ADDR + 0x7E0) /* H */ +#define SMSC_INDEX_PORT (SMSC_BASE_ADDR + 0x7E0) /* H */ +#define SMSC_DATA_PORT (SMSC_BASE_ADDR + 0x7E2) /* H */ + + +#ifndef _MACRO_ONLY + +Inline void +smsc_config_write(UH index, UH data) +{ + sil_wrh_mem((VP)SMSC_INDEX_PORT, (index << 8)); + sil_wrh_mem((VP)SMSC_DATA_PORT, (data << 8)); +} + +Inline UH +smsc_config_read(UH index) +{ + sil_wrh_mem((VP)SMSC_INDEX_PORT, (index << 8)); + return(sil_reh_mem((VP)SMSC_DATA_PORT) >> 8); +} + +/* + * 初期化 + */ +extern void smsc_init(void); + + + +#endif /* _MACRO_ONLY */ + + +/* + * SCI0 + */ +#define SMSC_SCI0_BASE_ADDR 0x03f8 + +#define SMSC_SCI0_RBR (SMSC_BASE_ADDR + SMSC_SCI0_BASE_ADDR * 2 + 0x0) /* H */ +#define SMSC_SCI0_THR (SMSC_BASE_ADDR + SMSC_SCI0_BASE_ADDR * 2 + 0x0) /* H */ +#define SMSC_SCI0_DLL (SMSC_BASE_ADDR + SMSC_SCI0_BASE_ADDR * 2 + 0x0) /* H */ +#define SMSC_SCI0_IER (SMSC_BASE_ADDR + SMSC_SCI0_BASE_ADDR * 2 + 0x2) /* H */ +#define SMSC_SCI0_DLM (SMSC_BASE_ADDR + SMSC_SCI0_BASE_ADDR * 2 + 0x2) /* H */ +#define SMSC_SCI0_IIR (SMSC_BASE_ADDR + SMSC_SCI0_BASE_ADDR * 2 + 0x4) /* H */ +#define SMSC_SCI0_FCR (SMSC_BASE_ADDR + SMSC_SCI0_BASE_ADDR * 2 + 0x4) /* H */ +#define SMSC_SCI0_LCR (SMSC_BASE_ADDR + SMSC_SCI0_BASE_ADDR * 2 + 0x6) /* H */ +#define SMSC_SCI0_MCR (SMSC_BASE_ADDR + SMSC_SCI0_BASE_ADDR * 2 + 0x8) /* H */ +#define SMSC_SCI0_LSR (SMSC_BASE_ADDR + SMSC_SCI0_BASE_ADDR * 2 + 0xA) /* H */ +#define SMSC_SCI0_MSR (SMSC_BASE_ADDR + SMSC_SCI0_BASE_ADDR * 2 + 0xC) /* H */ +#define SMSC_SCI0_SCR (SMSC_BASE_ADDR + SMSC_SCI0_BASE_ADDR * 2 + 0xE) /* H */ + +/* + * スーパーI/O(FDC37C935A)用 簡易SIOドライバ + */ + +#ifndef _MACRO_ONLY + +/* + * 割込み以外の初期化 + * カーネル起動時用の初期化(sys_putcを使用するため) + */ +extern void fdc37c935a_init(void); + + +/* + * シリアルI/Oポート管理ブロックの定義 + */ +typedef struct sio_port_control_block SIOPCB; + +/* + * コールバックルーチンの識別番号 + */ +#define SIO_ERDY_SND 1u /* 送信可能コールバック */ +#define SIO_ERDY_RCV 2u /* 受信通知コールバック */ + + +/* + * SIOドライバの初期化ルーチン + */ +extern void smsc_sci0_initialize(void); + + +/* + * オープンしているポートがあるか? + */ +extern BOOL smsc_sci0_openflag(void); + + +/* + * シリアルI/Oポートのオープン + */ +extern SIOPCB *smsc_sci0_opn_por(ID siopid, VP_INT exinf); + + +/* + * シリアルI/Oポートのクローズ + */ +extern void smsc_sci0_cls_por(SIOPCB *siopcb); + + +/* + * シリアルI/Oポートへの文字送信 + */ +extern BOOL smsc_sci0_snd_chr(SIOPCB *siopcb, char c); + + +/* + * シリアルI/Oポートからの文字受信 + */ +extern INT smsc_sci0_rcv_chr(SIOPCB *siopcb); + + +/* + * シリアルI/Oポートからのコールバックの許可 + */ +extern void smsc_sci0_ena_cbr(SIOPCB *siopcb, UINT cbrtn); + + +/* + * シリアルI/Oポートからのコールバックの禁止 + */ +extern void smsc_sci0_dis_cbr(SIOPCB *siopcb, UINT cbrtn); + + +/* + * SIOの割込みサービスルーチン + */ +extern void smsc_sci0_isr(void); + + +/* + * シリアルI/Oポートからの送信可能コールバック + */ +extern void smsc_sci0_ierdy_snd(VP_INT exinf); + + +/* + * シリアルI/Oポートからの受信通知コールバック + */ +extern void smsc_sci0_ierdy_rcv(VP_INT exinf); + + + + +#endif /* _MACRO_ONLY */ + + +#endif /* _FDC37C935A_H_ */ diff --git a/uzume_prototype/kernel/pdic/simple_sio/st16c2550.c b/uzume_prototype/kernel/pdic/simple_sio/st16c2550.c new file mode 100644 index 0000000..c20770e --- /dev/null +++ b/uzume_prototype/kernel/pdic/simple_sio/st16c2550.c @@ -0,0 +1,438 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: st16c2550.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * ST16C2550 用 簡易SIOドライバ + */ +#include +#include + +/* + * 各レジスタのオフセット + */ +#define ST16C_RHR 0x00 /* H LCR bit7=0 Read */ +#define ST16C_THR 0x00 /* H LCR bit7=0 Write */ +#define ST16C_DLL 0x00 /* H LCR bit7=1 */ +#define ST16C_IER 0x02 /* H LCR bit7=0 */ +#define ST16C_DLM 0x02 /* H LCR bit7=1 */ +#define ST16C_ISR 0x04 /* H Read */ +#define ST16C_FCR 0x04 /* H Write */ +#define ST16C_LCR 0x06 /* H */ +#define ST16C_MCR 0x08 /* H */ +#define ST16C_LSR 0x0a /* H Read */ +#define ST16C_MSR 0x0c /* H Read */ +#define ST16C_SPR 0x0e /* H */ + +#define ISR_TX 0x02 /* 送信割り込み発生 */ +#define IER_TX 0x02 /* 送信割り込み許可 */ +#define ISR_RX 0x01 /* 受信割り込み発生 */ +#define IER_RX 0x01 /* 受信割り込み許可 */ + +#define LCR_DL_MODE 0x80 /* Divisor Enable */ +#define LCR_VAL 0x03 /* 8bit,1stop,Noparity,No break */ +#define FCR_FIFO_DISABLE 0x00 + +#define LSR_RX_DATA_READY 0x01 +#define LSR_TX_EMPTY 0x20 + +#define MCR_INT_ENABLE 0x08 + +/* + * 115200bpsに設定 + * 4 = (7372800Hz)/(115200*16) + */ +#define DLM_VAL 0x00 +#define DLL_VAL 0x04 + + + + +/* + * シリアルI/Oポート初期化ブロック + */ +const SIOPINIB siopinib_table[TNUM_SIOP] = { + {ST16C_CHB, LCR_VAL, DLM_VAL, DLL_VAL, PINTER_PINT7E}, +#if TNUM_SIOP > 2 + {ST16C_CHA, LCR_VAL, DLM_VAL, DLL_VAL, PINTER_PINT6E}, +#endif /* TNUM_SIOP > 2 */ +}; + +/* + * シリアルI/Oポート初期化ブロックの取出し + */ +#define INDEX_SIOPINIB(siopid) ((UINT)((siopid) - 1)) +#define get_siopinib(siopid) (&(siopinib_table[INDEX_SIOPINIB(siopid)])) + + +/* + * シリアルI/Oポート管理ブロックのエリア + */ +SIOPCB siopcb_table[TNUM_SIOP]; + +/* + * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ + */ +#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1)) +#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)])) + +Inline void +st16c_write(UW addr, UW offset, UB val) +{ + sil_wrh_mem((VP)(addr + offset),val); +} + +Inline UB +st16c_read(UW addr, UW offset) +{ + return(sil_reh_mem((VP)(addr + offset))); +} + + +/* + * 文字を受信したか? + */ +Inline BOOL +st16c_getready(SIOPCB *siopcb) +{ + UH status; + + status = st16c_read(siopcb->siopinib->reg_base, ST16C_LSR); + + return((status & LSR_RX_DATA_READY)); +} + +/* + * 文字を送信できるか? + */ +Inline BOOL +st16c_putready(SIOPCB *siopcb) +{ + UH status; + + status = st16c_read(siopcb->siopinib->reg_base, ST16C_LSR); + + return (status & LSR_TX_EMPTY); +} + +/* + * 受信した文字の取り出し + */ +Inline UB +st16c_getchar(SIOPCB *siopcb) +{ + return(st16c_read(siopcb->siopinib->reg_base,ST16C_RHR)); +} + +/* + * 送信する文字の書き込み + */ +Inline void +st16c_putchar(SIOPCB *siopcb, UB c) +{ + st16c_write(siopcb->siopinib->reg_base, ST16C_THR, c); +} + +/* + * 送信割込み許可 + */ +Inline void +st16c_enable_send(SIOPCB *siopcb) +{ + st16c_write(siopcb->siopinib->reg_base, ST16C_IER, + (st16c_read(siopcb->siopinib->reg_base,ST16C_IER) | IER_TX)); +} + +/* + * 送信割込み禁止 + */ +Inline void +st16c_disable_send(SIOPCB *siopcb) +{ + st16c_write(siopcb->siopinib->reg_base, ST16C_IER, + (st16c_read(siopcb->siopinib->reg_base, ST16C_IER) & ~IER_TX)); + +} + +/* + * 受信割込み許可 + */ +Inline void +st16c_enable_rcv(SIOPCB *siopcb) +{ + st16c_write(siopcb->siopinib->reg_base, ST16C_IER, + (st16c_read(siopcb->siopinib->reg_base,ST16C_IER) | IER_RX)); +} + +/* + * 受信割込み禁止 + */ +Inline void +st16c_disable_rcv(SIOPCB *siopcb) +{ + st16c_write(siopcb->siopinib->reg_base, ST16C_IER, + (st16c_read(siopcb->siopinib->reg_base, ST16C_IER) & ~IER_RX)); + +} + + +/* + * SIOドライバの初期化ルーチン + */ +void +st16c2550_initialize() +{ + SIOPCB *siopcb; + UINT i; + + /* + * シリアルI/Oポート管理ブロックの初期化 + */ + for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) { + siopcb->siopinib = &(siopinib_table[i]); + siopcb->openflag = FALSE; + siopcb->sendflag = FALSE; + } +} + + +/* + * + */ +void +st16c2550_init_siopinib(const SIOPINIB *siopinib) +{ + /* + * 分周比の設定 + */ + /* Divisor Enable */ + st16c_write(siopinib->reg_base, ST16C_LCR, + (st16c_read(siopinib->reg_base, ST16C_LCR) | LCR_DL_MODE)); + st16c_write(siopinib->reg_base, ST16C_DLL, siopinib->dll_val); + st16c_write(siopinib->reg_base, ST16C_DLM, siopinib->dlm_val); + /* Divisor Disable */ + st16c_write(siopinib->reg_base, ST16C_LCR, + (st16c_read(siopinib->reg_base, ST16C_LCR) & ~LCR_DL_MODE)); + + /* モード設定 */ + st16c_write(siopinib->reg_base, ST16C_LCR, siopinib->lcr_val); + + /* FIFO Disable */ + st16c_write(siopinib->reg_base, ST16C_FCR, FCR_FIFO_DISABLE); + + /* 割込み禁止 */ + st16c_write(siopinib->reg_base, ST16C_IER, 0x00); +} + + +/* + * カーネル起動時のバーナー出力用の初期化 + */ +void +st16c2550_init(void) +{ + + st16c2550_init_siopinib(get_siopinib(1)); +#if TNUM_SIOP > 2 + st16c2550_init_siopinib(get_siopinib(2)); +#endif /* TNUM_SIOP > 2 */ + +} + +/* + * オープンしているポートがあるか + */ +BOOL +st16c2550_openflag(void) +{ +#if TNUM_SIOP < 2 + return(siopcb_table[0].openflag); +#else /* TNUM_SIOP < 2 */ + return(siopcb_table[0].openflag || siopcb_table[1].openflag); +#endif /* TNUM_SIOP < 2 */ +} + + +/* + * シリアルI/Oポートのオープン + */ +SIOPCB * +st16c2550_opn_por(ID siopid, VP_INT exinf) +{ + SIOPCB *siopcb; + const SIOPINIB *siopinib; + + siopcb = get_siopcb(siopid); + siopinib = siopcb->siopinib; + + /* + * 初期化 + */ + st16c2550_init_siopinib(siopcb->siopinib); + + /* 受信割込み許可 */ + st16c_write(siopcb->siopinib->reg_base, ST16C_IER, IER_RX); + + /* 割込み線をイネーブル */ + st16c_write(siopcb->siopinib->reg_base, ST16C_MCR, MCR_INT_ENABLE); + + siopcb->exinf = exinf; + siopcb->getready = siopcb->putready = FALSE; + siopcb->openflag = TRUE; + + return(siopcb); +} + +/* + * シリアルI/Oポートのクローズ + */ +void +st16c2550_cls_por(SIOPCB *siopcb) +{ + /* 割込み禁止 */ + st16c_write(siopcb->siopinib->reg_base, ST16C_IER, 0x00); + siopcb->openflag = FALSE; +} + + +/* + * シリアルI/Oポートへのポーリングでの出力 + */ +void +st16c2550_pol_putc(char c, ID siopid) +{ + const SIOPINIB *siopinib; + + siopinib = get_siopinib(siopid); + + while((st16c_read(siopinib->reg_base, ST16C_LSR) & LSR_TX_EMPTY) + != LSR_TX_EMPTY) + ; + st16c_write(siopinib->reg_base, ST16C_THR, c); +} + + +/* + * シリアルI/Oポートへの文字送信 + */ +BOOL +st16c2550_snd_chr(SIOPCB *siopcb, char c) +{ + if (st16c_putready(siopcb)){ + st16c_putchar(siopcb, c); + return(TRUE); + } + return(FALSE); +} + +/* + * シリアルI/Oポートからの文字受信 + */ +INT +st16c2550_rcv_chr(SIOPCB *siopcb) +{ + if (st16c_getready(siopcb)) { + return((INT)(UB) st16c_getchar(siopcb)); + } + return(-1); +} + + + + + +/* + * シリアルI/Oポートからのコールバックの許可 + */ +void +st16c2550_ena_cbr(SIOPCB *siopcb, UINT cbrtn) +{ + + switch (cbrtn) { + case SIO_ERDY_SND: + st16c_enable_send(siopcb); + break; + case SIO_ERDY_RCV: + st16c_enable_rcv(siopcb); + break; + } +} + +/* + * シリアルI/Oポートからのコールバックの禁止 + */ +void +st16c2550_dis_cbr(SIOPCB *siopcb, UINT cbrtn) +{ + switch (cbrtn) { + case SIO_ERDY_SND: + st16c_disable_send(siopcb); + break; + case SIO_ERDY_RCV: + st16c_disable_rcv(siopcb); + break; + } +} + +/* + * シリアルI/Oポートに対する割込み処理 + */ +static void +st16c2550_isr_siop(SIOPCB *siopcb) +{ + if (st16c_getready(siopcb)) { + /* + * 受信通知コールバックルーチンを呼び出す. + */ + st16c2550_ierdy_rcv(siopcb->exinf); + } + if (st16c_putready(siopcb)) { + /* + * 送信可能コールバックルーチンを呼び出す. + */ + st16c2550_ierdy_snd(siopcb->exinf); + } +} + +/* + * SIOの割込みサービスルーチン + */ +void +st16c2550_isr() +{ + st16c2550_isr_siop(&(siopcb_table[0])); +} diff --git a/uzume_prototype/kernel/pdic/simple_sio/st16c2550.h b/uzume_prototype/kernel/pdic/simple_sio/st16c2550.h new file mode 100644 index 0000000..451ebdd --- /dev/null +++ b/uzume_prototype/kernel/pdic/simple_sio/st16c2550.h @@ -0,0 +1,155 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: st16c2550.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * ST16C2550 用 簡易SIOドライバ + */ +#ifndef _ST16C2550_H_ +#define _ST16C2550_H_ + +#include + +/* + * シリアルI/Oポート初期化ブロック + */ +typedef struct sio_port_initialization_block { + UW reg_base; /* レジスタのベースアドレス */ + UB lcr_val; /* モードレジスタの設定値 */ + UB dlm_val; /* ボーレート上位の設定値 */ + UB dll_val; /* ボーレート下位の設定値 */ + UW pinter_val; /* 割込み許可ビット */ +} SIOPINIB; + +/* + * シリアルI/Oポート管理ブロック + */ +typedef struct sio_port_control_block { + const SIOPINIB *siopinib; /* シリアルI/Oポート初期化ブロック */ + VP_INT exinf; /* 拡張情報 */ + BOOL openflag; /* オープン済みフラグ */ + BOOL sendflag; /* 送信割込みイネーブルフラグ */ + BOOL getready; /* 文字を受信した状態 */ + BOOL putready; /* 文字を送信できる状態 */ +}SIOPCB; + + +/* + * コールバックルーチンの識別番号 + */ +#define SIO_ERDY_SND 1u /* 送信可能コールバック */ +#define SIO_ERDY_RCV 2u /* 受信通知コールバック */ + + +/* + * カーネル起動時用の初期化(sys_putcを使用するため) + */ +extern void st16c2550_init(void); + +/* + * シリアルI/Oポートへのポーリングでの出力 + */ +extern void st16c2550_pol_putc(char c, ID siopid); + + +/* + * SIOドライバの初期化ルーチン + */ +extern void st16c2550_initialize(void); + + +/* + * オープンしているポートがあるか? + */ +extern BOOL st16c2550_openflag(void); + + +/* + * シリアルI/Oポートのオープン + */ +extern SIOPCB *st16c2550_opn_por(ID siopid, VP_INT exinf); + + +/* + * シリアルI/Oポートのクローズ + */ +extern void st16c2550_cls_por(SIOPCB *siopcb); + + +/* + * シリアルI/Oポートへの文字送信 + */ +extern BOOL st16c2550_snd_chr(SIOPCB *siopcb, char c); + + +/* + * シリアルI/Oポートからの文字受信 + */ +extern INT st16c2550_rcv_chr(SIOPCB *siopcb); + + +/* + * シリアルI/Oポートからのコールバックの許可 + */ +extern void st16c2550_ena_cbr(SIOPCB *siopcb, UINT cbrtn); + + +/* + * シリアルI/Oポートからのコールバックの禁止 + */ +extern void st16c2550_dis_cbr(SIOPCB *siopcb, UINT cbrtn); + + +/* + * SIOの割込みサービスルーチン + */ +extern void st16c2550_isr(void); + + +/* + * シリアルI/Oポートからの送信可能コールバック + */ +extern void st16c2550_ierdy_snd(VP_INT exinf); + + +/* + * シリアルI/Oポートからの受信通知コールバック + */ +extern void st16c2550_ierdy_rcv(VP_INT exinf); + + +#endif /* _FDC37C935A_H_ */ diff --git a/uzume_prototype/kernel/pdic/simple_sio/tl16pir552.c b/uzume_prototype/kernel/pdic/simple_sio/tl16pir552.c new file mode 100644 index 0000000..972f8fe --- /dev/null +++ b/uzume_prototype/kernel/pdic/simple_sio/tl16pir552.c @@ -0,0 +1,418 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2000-2003 by Industrial Technology Institute, + * Miyagi Prefectural Government, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + */ + +#include + +/* + * TL16PIR552(TI)用 簡易SIOドライバ + */ + +/* + * シリアルI/Oポート初期化ブロックの定義 + */ +typedef struct sio_port_initialization_block { + VP channel_addr; /* シリアルポートの開始番地 */ + + UB lcr_def; /* LCR設定値 b0-b6; + (送受信ビット数、ストップビット,パリティ) */ + UB scr_def; /* SCR設定値(プリスケーラ;)*/ + UB boud_hi_def; /* DLM設定値(ボーレート上位の設定値) */ + UB boud_lo_def; /* DLL設定値(ボーレート下位の設定値) */ +} SIOPINIB; + +/* + * シリアルI/Oポート管理ブロックの定義 + */ +struct sio_port_control_block { + const SIOPINIB *siopinib; /* シリアルI/Oポート初期化ブロック */ + VP_INT exinf; /* 拡張情報 */ + BOOL openflag; /* オープン済みフラグ */ + BOOL getready; /* 文字を受信した状態 */ + BOOL putready; /* 文字を送信できる状態 */ +}; + +/* + * シリアルI/Oポート初期化ブロック + * ID = 1 をポート1,ID = 2 をポート2に対応させている. + */ +const SIOPINIB siopinib_table[TNUM_SIOP] = { + { (VP) UART_CH01, + (UB) WORD_LENGTH_8 | STOP_BITS_1 | PARITY_NON, + (UB) PRE_DIVISOR, + (UB) HI8(DIVISOR), + (UB) LO8(DIVISOR) }, +#if TNUM_SIOP >= 2 + { (VP) UART_CH02, + (UB) WORD_LENGTH_8 | STOP_BITS_1 | PARITY_NON, + (UB) PRE_DIVISOR, + (UB) HI8(DIVISOR), + (UB) LO8(DIVISOR) }, +#endif /* TNUM_SIOP >= 2 */ +}; + +/* + * シリアルI/Oポート初期化ブロックの取出し + */ +#define INDEX_SIOPINIB(siopid) ((UINT)((siopid) - 1)) +#define get_siopinib(siopid) (&(siopinib_table[INDEX_SIOPINIB(siopid)])) + + +/* + * シリアルI/Oポート管理ブロックのエリア + */ +SIOPCB siopcb_table[TNUM_SIOP]; + +/* + * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ + */ +#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1)) +#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)])) + +/* + * SIO用レジスタ操作関数 + */ +Inline void +tl16pir552_orb( VP addr, UW reg, UB val ) +{ + tl16pir552_wrb( addr, reg, tl16pir552_reb( addr, reg ) | val ); +} + +Inline void +tl16pir552_andb( VP addr, UW reg, UB val ) +{ + tl16pir552_wrb( addr, reg, tl16pir552_reb( addr, reg ) & val ); +} + + +/* + * 状態の読出し(IIRの読出し) + */ +static void +tl16pir552_get_stat(SIOPCB *siopcb) +{ + UB iir; + + iir = tl16pir552_reb( siopcb->siopinib->channel_addr, IIR) & INT_MASK; + + switch( iir ) { + case INT_TRANS_EMPTY : + siopcb->putready = TRUE; + break; + case INT_RECEIVE_DATA : + case INT_CHAR_TIME_OUT : + siopcb->getready = TRUE; + break; + default : + break; + } + +} + +/* + * 文字を受信できるか? + */ +Inline BOOL +tl16pir552_getready(SIOPCB *siopcb) +{ + return(siopcb->getready); +} + +/* + * 文字を送信できるか? + */ +Inline BOOL +tl16pir552_putready(SIOPCB *siopcb) +{ + return(siopcb->putready); +} + +/* + * 受信した文字の取出し + */ +Inline char +tl16pir552_getchar(SIOPCB *siopcb) +{ + siopcb->getready = FALSE; + return((char) tl16pir552_reb( siopcb->siopinib->channel_addr, RBR )); + /* 1byte 単位での文字の取り出しを行ったいるため、tl16pir552_opn_por内の + 受信バッファ設定を増やしたとしても性能の向上は見られない。 + 性能の向上には、バッファ全体のブロック転送を行うなどの修正が必要。*/ +} + +/* + * 送信する文字の書込み + */ +Inline void +tl16pir552_putchar(SIOPCB *siopcb, char c) +{ + siopcb->putready = FALSE; + tl16pir552_wrb( siopcb->siopinib->channel_addr, THR, c ); +} + +/* + * SIOドライバの初期化ルーチン + */ +void +tl16pir552_initialize() +{ + SIOPCB *siopcb; + UINT i; + + /* + * シリアルI/Oポート管理ブロックの初期化 + */ + for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) { + siopcb->siopinib = &(siopinib_table[i]); + siopcb->openflag = FALSE; + } +} + +/* + * SIOレジスタ初期化ルーチン + */ +void +tl16pir552_init_siopinib( const SIOPINIB *siopinib ) +{ + /* + * SIOレジスタの初期化 + */ + /* 初期処理 */ + tl16pir552_wrb( siopinib->channel_addr, IER, DIS_INT ); + + tl16pir552_wrb( siopinib->channel_addr, MCR, ENABLE_EXT_INT ); + + /* ボーレートの設定 */ + tl16pir552_wrb( siopinib->channel_addr, LCR, siopinib->lcr_def | DIVISOR_LATCH_ACC ); + + tl16pir552_wrb( siopinib->channel_addr, SCR, siopinib->scr_def ); + + tl16pir552_wrb( siopinib->channel_addr, DLL, siopinib->boud_lo_def ); + tl16pir552_wrb( siopinib->channel_addr, DLM, siopinib->boud_hi_def ); + + /* モードの設定 */ + tl16pir552_wrb( siopinib->channel_addr, LCR, siopinib->lcr_def ); + + /* FIFOの設定 */ + tl16pir552_wrb( siopinib->channel_addr, FCR, FIFO_ENABLE ); + tl16pir552_wrb( siopinib->channel_addr, FCR, FIFO_ENABLE | RECEIVE_FIFO_RESET | TRANS_FIFO_RESET | RECEIVE_TRIG_1_BYTE ); + tl16pir552_wrb( siopinib->channel_addr, FCR, FIFO_ENABLE | RECEIVE_TRIG_1_BYTE ); + + /* 終了処理 */ + tl16pir552_wrb( siopinib->channel_addr, MCR, DTR | RTS | ENABLE_EXT_INT ); + + tl16pir552_wrb( siopinib->channel_addr, IER, RECEIVE_DATA_AVAILABLE); +} + +/* + * カーネル起動時のバーナー出力用の初期化 + */ +void +tl16pir552_init(void) +{ + tl16pir552_init_siopinib( get_siopinib(1) ); +#if TNUM_SIOP >= 2 + tl16pir552_init_siopinib( get_siopinib(2) ); +#endif /* TNUM_SIOP >= 2 */ +} + +/* + * オープンしているポートがあるか? + */ +BOOL +tl16pir552_openflag(void) +{ +#if TNUM_SIOP < 2 + return(siopcb_table[0].openflag); +#else /* TNUM_SIOP < 2 */ + return(siopcb_table[0].openflag || siopcb_table[1].openflag); +#endif /* TNUM_SIOP < 2 */ +} + +/* + * シリアルI/Oポートのオープン + */ +SIOPCB * +tl16pir552_opn_por(ID siopid, VP_INT exinf) +{ + SIOPCB *siopcb = get_siopcb(siopid); + const SIOPINIB *siopinib = siopcb->siopinib; + + /* シリアルコントローラの初期化 */ + tl16pir552_init_siopinib( siopinib ); + + /* 割込みレベル設定、割込み要求クリアは、sio_opn_por(hw_serial.h)で行う。 */ + + siopcb->exinf = exinf; + siopcb->getready = siopcb->putready = FALSE; + siopcb->openflag = TRUE; + + return(siopcb); +} + +/* + * シリアルI/Oポートのクローズ + */ +void +tl16pir552_cls_por(SIOPCB *siopcb) +{ + tl16pir552_wrb( siopcb->siopinib->channel_addr, IER, DIS_INT ); + + siopcb->openflag = FALSE; +} + +/* + * シリアルI/Oポートへの文字送信 + */ +BOOL +tl16pir552_snd_chr(SIOPCB *siopcb, char c) +{ + if (tl16pir552_putready(siopcb)) { + tl16pir552_putchar(siopcb, c); + return(TRUE); + } + return(FALSE); +} + +/* + * シリアルI/Oポートからの文字受信 + */ +INT +tl16pir552_rcv_chr(SIOPCB *siopcb) +{ + if (tl16pir552_getready(siopcb)) { + return((INT)(UB) tl16pir552_getchar(siopcb)); + } + return(-1); +} + +/* + * シリアルI/Oポートからのコールバックの許可 + */ +void +tl16pir552_ena_cbr(SIOPCB *siopcb, UINT cbrtn) +{ + UB ier_bit = 0; + + switch (cbrtn) { + case SIO_ERDY_SND: + ier_bit = TRANS_REG_EMPTY; + break; + case SIO_ERDY_RCV: + ier_bit = (RECEIVE_DATA_AVAILABLE | RECEIVE_LINE_STATUS); + break; + } + + tl16pir552_orb( siopcb->siopinib->channel_addr, IER, ier_bit ); +} + +/* + * シリアルI/Oポートからのコールバックの禁止 + */ +void +tl16pir552_dis_cbr(SIOPCB *siopcb, UINT cbrtn) +{ + UB ier_bit = 0; + + switch (cbrtn) { + case SIO_ERDY_SND: + ier_bit = TRANS_REG_EMPTY; + break; + case SIO_ERDY_RCV: + ier_bit = (RECEIVE_DATA_AVAILABLE | RECEIVE_LINE_STATUS); + break; + } + + tl16pir552_andb( siopcb->siopinib->channel_addr, IER, ~ier_bit ); +} + +/* + * シリアルI/Oポートに対する割込み処理 + */ +static void +tl16pir552_isr_siop(SIOPCB *siopcb) +{ + tl16pir552_get_stat(siopcb); + + if ( tl16pir552_getready(siopcb) ) { + /* + * 受信通知コールバックルーチンを呼び出す. + */ + tl16pir552_ierdy_rcv(siopcb->exinf); + } else if ( tl16pir552_putready(siopcb) ) { + /* + * 送信可能コールバックルーチンを呼び出す. + */ + tl16pir552_ierdy_snd(siopcb->exinf); + } +} + +/* + * SIOの割込みサービスルーチン + */ +void +tl16pir552_uart0_isr() +{ + if (siopcb_table[0].openflag) { + tl16pir552_isr_siop(&(siopcb_table[0])); + } +} + +#if TNUM_SIOP >= 2 +void +tl16pir552_uart1_isr() +{ + if (siopcb_table[1].openflag) { + tl16pir552_isr_siop(&(siopcb_table[1])); + } +} +#endif /* TNUM_SIOP >= 2 */ + +/* + * シリアルI/Oポートへのポーリングでの出力 + */ +void +tl16pir552_putchar_pol( char val ) { + + const SIOPINIB *siopinib = get_siopinib( LOGTASK_PORTID ); + + /* 送信部エンプティになるまで待つ。 */ + while( (tl16pir552_reb( siopinib->channel_addr, LSR ) & (TEMT) ) == 0 ); + + tl16pir552_wrb( siopinib->channel_addr, THR, val ); +} diff --git a/uzume_prototype/kernel/pdic/simple_sio/tl16pir552.h b/uzume_prototype/kernel/pdic/simple_sio/tl16pir552.h new file mode 100644 index 0000000..5f66db2 --- /dev/null +++ b/uzume_prototype/kernel/pdic/simple_sio/tl16pir552.h @@ -0,0 +1,196 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2000-2003 by Industrial Technology Institute, + * Miyagi Prefectural Government, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + */ + +#ifndef _TL16PIR552_H_ +#define _TL16PIR552_H_ + +#include /* デバイスドライバ用標準インクルードファイル */ + +/* + * シリアル/パラレル I/O TL16PIR552(TI) 関連の定義 + */ +/* TL16PIR552のレジスタのアドレス */ +#define RBR 0x00 /* Receiver Buffer (読み出し) */ +#define THR 0x00 /* Transmitter Holding Register (書き出し) */ +#define DLL 0x00 /* Divisor Latch (LSB) */ +#define IER 0x10 /* Interrupt-Enable Register */ +#define DLM 0x10 /* Divisor Latch (MSB) */ +#define IIR 0x20 /* Interrupt-Ident Register (読み出し) */ +#define FCR 0x20 /* FIFO Control Register (書き出し) */ +#define LCR 0x30 /* Line-Control Register */ +#define MCR 0x40 /* Modem-Control Register */ +#define LSR 0x50 /* Line-Status Register */ +#define MSR 0x60 /* Modem-Status Register */ +#define SCR 0x70 /* Scratch Register */ + +/* for LCR */ +#define WORD_LENGTH_8 (BIT1 | BIT0) +#define STOP_BITS_1 0u /* BIT2 */ +#define PARITY_NON 0u /* BIT3, 4 */ +/* BIT5,6 省略 */ +#define DIVISOR_LATCH_ACC BIT7 + +/* for IER */ +#define DIS_INT 0u +#define RECEIVE_DATA_AVAILABLE BIT0 +#define TRANS_REG_EMPTY BIT1 +#define RECEIVE_LINE_STATUS BIT2 +#define MODEM_STATUS BIT3 + +/* for MCR */ +#define DTR BIT0 +#define RTS BIT1 +#define ENABLE_EXT_INT BIT3 +#define AUTOFLOW_CONTROL BIT5 + +/* for FCR */ +#define FIFO_ENABLE BIT0 +#define RECEIVE_FIFO_RESET BIT1 +#define TRANS_FIFO_RESET BIT2 +#define RECEIVE_TRIG_1_BYTE 0u /* BIT6, 7 */ +#define RECEIVE_TRIG_4_BYTE BIT6 +#define RECEIVE_TRIG_8_BYTE BIT7 +#define RECEIVE_TRIG_14_BYTE (BIT6 | BIT7) + +/* for IIR */ +#define INT_MASK 0x0f +#define INT_RECEIVE_DATA BIT2 +#define INT_CHAR_TIME_OUT (BIT3 | BIT2) +#define INT_TRANS_EMPTY BIT1 + +/* for LSR */ +#define THRE BIT5 +#define TEMT BIT6 + +/* ボーレート定義関係 */ +#define PRE_DIVISOR 4 +#define DIVISOR XIN_CLOCK / (8 * DEVIDE_RATIO * PRE_DIVISOR) + +#ifndef _MACRO_ONLY + +/* + * シリアルI/Oポート管理ブロックの定義 + */ +typedef struct sio_port_control_block SIOPCB; + +#endif /* _MACRO_ONLY */ + +/* + * SIO用システムインタフェースレイヤー + */ +/* x : ポートのベースアドレス、y : レジスタオフセット、z : レジスタ値 */ +#define tl16pir552_wrb( x, y, z ) sil_wrb_mem( (VP)(x + y), z ) +#define tl16pir552_reb( x, y ) sil_reb_mem( (VP)(x + y) ) + +/* + * コールバックルーチンの識別番号 + */ +#define SIO_ERDY_SND 1u /* 送信可能コールバック */ +#define SIO_ERDY_RCV 2u /* 受信通知コールバック */ + +#ifndef _MACRO_ONLY + +/* + * SIOドライバの初期化ルーチン + */ +extern void tl16pir552_initialize(void); + +/* + * オープンしているポートがあるか? + */ +extern BOOL tl16pir552_openflag(void); + +/* + * シリアルI/Oポートのオープン + */ +extern SIOPCB *tl16pir552_opn_por(ID siopid, VP_INT exinf); + +/* + * シリアルI/Oポートのクローズ + */ +extern void tl16pir552_cls_por(SIOPCB *siopcb); + +/* + * シリアルI/Oポートへの文字送信 + */ +extern BOOL tl16pir552_snd_chr(SIOPCB *siopcb, char c); + +/* + * シリアルI/Oポートからの文字受信 + */ +extern INT tl16pir552_rcv_chr(SIOPCB *siopcb); + +/* + * シリアルI/Oポートからのコールバックの許可 + */ +extern void tl16pir552_ena_cbr(SIOPCB *siopcb, UINT cbrtn); + +/* + * シリアルI/Oポートからのコールバックの禁止 + */ +extern void tl16pir552_dis_cbr(SIOPCB *siopcb, UINT cbrtn); + +/* + * SIOの割込みサービスルーチン + */ +extern void tl16pir552_uart0_isr(void); +extern void tl16pir552_uart1_isr(void); + +/* + * シリアルI/Oポートからの送信可能コールバック + */ +extern void tl16pir552_ierdy_snd(VP_INT exinf); + +/* + * シリアルI/Oポートからの受信通知コールバック + */ +extern void tl16pir552_ierdy_rcv(VP_INT exinf); + +/* + * カーネル起動時用の初期化 (sys_putcで利用) + */ +extern void tl16pir552_init(void); + +/* + * シリアルI/Oポートへの文字送信(ポーリング) + */ +extern void tl16pir552_putchar_pol(char c); + +#endif /* _MACRO_ONLY */ +#endif /* _TL16PIR552_H_ */ diff --git a/uzume_prototype/kernel/pdic/simple_sio/uart.c b/uzume_prototype/kernel/pdic/simple_sio/uart.c new file mode 100644 index 0000000..c0b98ee --- /dev/null +++ b/uzume_prototype/kernel/pdic/simple_sio/uart.c @@ -0,0 +1,683 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + */ + +/* + * ADSP-BF533/BF50x/BF54x UART用 簡易SIOドライバ + * + * このファイルは、TOPPERS/JSP 1.4.2の pdic/simple_sio/st16c2550.cを + * リネームし、内部の識別子を変更したものである。 + */ +#include +#include "uart.h" + +/* + * 8250, 16450, 16550各レジスタのアドレス・オフセット。UART_RHRを基点とする。 + * システムごとに異なるのでUART_BOUNDARYによってレジスタの配置境界を指定する。 + * たとえばすべてのレジスタが8ビット境界で配置されているなら、UART_BOUNDARYは1, + * 16bit境界なら2, 32ビット境界なら4を指定する。 + * UART_BOUNDARYはsys_config.hで定義する。 + */ + +#if defined(_COMMON_BF506) || defined(_COMMON_BF548) +/* + * BF50x/BF54xのUARTは、他のBlackfinプロセッサと以下の違いがあるため、定義を区別する。 + * 1) レジスタ配置が違う + * 2) IER が SET と CLEARに分かれている + */ + +#define UART_DLL (0x00 * UART_BOUNDARY) /* 分周レジスタ下位バイト */ +#define UART_DLM (0x01 * UART_BOUNDARY) /* 分周レジスタ上位バイト */ +#define UART_GCTL (0x02 * UART_BOUNDARY) /* Blackfinのみ。グローバル制御レジスタ */ +#define UART_LCR (0x03 * UART_BOUNDARY) /* ライン制御レジスタ */ +#define UART_MCR (0x04 * UART_BOUNDARY) /* モデム制御レジスタ */ +#define UART_LSR (0x05 * UART_BOUNDARY) /* ライン・ステータス・レジスタ */ +#define UART_MSR (0x06 * UART_BOUNDARY) /* モデム・ステータス・レジスタ */ +#define UART_SCR (0x07 * UART_BOUNDARY) /* スクラッチ・パッド・レジスタ */ +#define UART_IER_S (0x08 * UART_BOUNDARY) /* 割込みイネーブルレジスタ */ +#define UART_IER_C (0x09 * UART_BOUNDARY) /* 割込みイネーブルレジスタ */ +#define UART_THR (0x0A * UART_BOUNDARY) /* 送信データ・ホールド・レジスタ */ +#define UART_RBR (0x0B * UART_BOUNDARY) /* 受信バッファレジスタ */ + +#else /* _COMMON_BF506 || _COMMON_BF548 */ +/* BF50x/BF54x 以外のプロセッサは以下の定義を使用する。*/ + +#define UART_RBR (0x00 * UART_BOUNDARY) /* 受信バッファレジスタ */ +#define UART_THR (0x00 * UART_BOUNDARY) /* 送信データ・ホールド・レジスタ */ +#define UART_DLL (0x00 * UART_BOUNDARY) /* 分周レジスタ下位バイト */ +#define UART_IER (0x01 * UART_BOUNDARY) /* 割込みイネーブルレジスタ */ +#define UART_DLM (0x01 * UART_BOUNDARY) /* 分周レジスタ上位バイト */ +#define UART_IIR (0x02 * UART_BOUNDARY) /* 割込み識別レジスタ */ +#define UART_FCR (0x02 * UART_BOUNDARY) /* FIFO制御レジスタ */ +#define UART_LCR (0x03 * UART_BOUNDARY) /* ライン制御レジスタ */ +#define UART_MCR (0x04 * UART_BOUNDARY) /* モデム制御レジスタ */ +#define UART_LSR (0x05 * UART_BOUNDARY) /* ライン・ステータス・レジスタ */ +#define UART_MSR (0x06 * UART_BOUNDARY) /* モデム・ステータス・レジスタ */ +#define UART_SCR (0x07 * UART_BOUNDARY) /* スクラッチ・パッド・レジスタ */ +#define UART_GCTL (0x09 * UART_BOUNDARY) /* Blackfinのみ。グローバル制御レジスタ */ + +#endif + +/* + * レジスタのビットマスク。特殊機能を追加しない限り、書き換えなくてよい。 + */ + +#define ISR_TX 0x02 /* 送信割り込み発生 */ +#define IER_TX 0x02 /* 送信割り込み許可 */ +#define ISR_RX 0x01 /* 受信割り込み発生 */ +#define IER_RX 0x01 /* 受信割り込み許可 */ + +#define LCR_DL_MODE 0x80 /* Divisor Enable */ +#define LCR_NP_8_1 0x03 /* 8bit,1stop,Noparity,No break */ +#define FCR_FIFO_DISABLE 0x00 + +#define LSR_RX_DATA_READY 0x01 +#define LSR_TX_EMPTY 0x20 + +#define MCR_INT_ENABLE 0x08 + +#define GCTL_UCEN 0x01 /* Blackfinのみ */ + + +/* + * TNUM_SIOP_UART, UART0_ADDRESS, UART0_DIVISOR はsys_config.hで定義する。 + * TNUM_SIOP_UART : PDICが管理するUARTの個数 + * 以下、PDICが管理する最初のUARTの情報 + * UART0_ADDRESS : THRのアドレス + * UART0_DIVISOR : DLM, DLLの初期値(16bit表記) + * UART0_14550_FIFO : 14550互換のFIFOを持つときにマクロを宣言する + * UART0_BLACKFIN_UCEN : Blackfin専用。マクロを宣言すると初期化コードがUART_GCTLのUCENを1にする。 + * 二つ目以降のUARTがあるなら以下のように続ける。 + * UART1_ADDRESS : THRのアドレス + * UART1_DIVISOR : DLM, DLLの初期値(16bit表記) + * UART1_14550_FIFO : 14550互換のFIFOを持つときにマクロを宣言する + * UART1_BLACKFIN_UCEN : Blackfin専用。マクロを宣言すると初期化コードがUART_GCTLのUCENを1にする。 + * ... + */ + + +/****************************************************************************************** + * シリアルI/Oポート初期化ブロック + */ +#if TNUM_SIOP_UART == 0 +#error "If you don't use UART, please remove this file from your make file" +#endif + +#if TNUM_SIOP_UART > 3 +#error "Only TNUM_SIOP_UART < 4 is supported" +#endif /* TNUM_SIOP_UART >= 2 */ + +/* ディバイザ計算マクロ */ +#define DLM(divisor) (divisor/256) +#define DLL(divisor) (divisor%256) + +SIOPINIB siopinib_table[TNUM_SIOP_UART] = { +/*----------------------------------------------------------------- + * PDICが管理する最初のUARTの初期化パラメータ + */ + {UART0_ADDRESS, DLM(UART0_DIVISOR), DLL(UART0_DIVISOR), +#ifdef UART0_BLACKFIN_UCEN + 1 /* マクロUART0_BLACKFIN_UCENが定義されていたら、GCTLのUCENを1にしてクロックを動かす */ +#else + 0 +#endif + } + +/*----------------------------------------------------------------- + * PDICが管理する2番目のUARTの初期化パラメータ + */ + +#if TNUM_SIOP_UART > 1 + ,{UART1_ADDRESS, DLM(UART1_DIVISOR), DLL(UART1_DIVISOR), +#ifdef UART1_BLACKFIN_UCEN + 1 /* マクロUART1_BLACKFIN_UCENが定義されていたら、GCTLのUCENを1にしてクロックを動かす */ +#else + 0 +#endif + + + } +#endif /* if TNUM_SIOP_UART > 1*/ + +/*----------------------------------------------------------------- + * PDICが管理する3番目のUARTの初期化パラメータ + */ +#if TNUM_SIOP_UART > 2 + ,{UART2_ADDRESS, DLM(UART2_DIVISOR), DLL(UART2_DIVISOR), +#ifdef UART2_BLACKFIN_UCEN + 1 /* マクロUART2_BLACKFIN_UCENが定義されていたら、GCTLのUCENを1にしてクロックを動かす */ +#else + 0 +#endif + + + } +#endif /* if TNUM_SIOP_UART > 2*/ + +}; + +/* + * シリアルI/Oポート初期化ブロックここまで。 + ******************************************************************************************/ + + + +/* + * シリアルI/Oポート初期化ブロックの取出し + */ +#define INDEX_SIOPINIB(siopid) ((UINT)((siopid) - 1)) +#define get_siopinib(siopid) (&(siopinib_table[INDEX_SIOPINIB(siopid)])) + + +/* + * シリアルI/Oポート管理ブロックのエリア + */ +SIOPCB siopcb_table[TNUM_SIOP_UART]; + +/* + * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ + */ +#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1)) +#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)])) + +Inline void +uart_write(UW addr, UW offset, UB val) +{ +#ifdef UART_IOP_ACCESS + sil_wrb_iop((VP)(addr + offset),val); +#else + sil_wrb_mem((VP)(addr + offset),val); +#endif +} + +Inline UB +uart_read(UW addr, UW offset) +{ +#ifdef UART_IOP_ACCESS + return(sil_reb_iop((VP)(addr + offset))); +#else + return(sil_reb_mem((VP)(addr + offset))); +#endif +} + + +/* + * 文字を受信したか? + */ +Inline BOOL +uart_getready(SIOPCB *siopcb) +{ + UH status; + + status = uart_read(siopcb->siopinib->reg_base, UART_LSR); + + return((status & LSR_RX_DATA_READY)); +} + +/* + * 文字を送信できるか? + */ +Inline BOOL +uart_putready(SIOPCB *siopcb) +{ + UH status; + + status = uart_read(siopcb->siopinib->reg_base, UART_LSR); + + return (status & LSR_TX_EMPTY); +} + +/* + * 受信した文字の取り出し + */ +Inline UB +uart_getchar(SIOPCB *siopcb) +{ + return(uart_read(siopcb->siopinib->reg_base,UART_RBR)); +} + +/* + * 送信する文字の書き込み + */ +Inline void +uart_putchar(SIOPCB *siopcb, UB c) +{ + uart_write(siopcb->siopinib->reg_base, UART_THR, c); +} + +/* + * 送信割込み許可 + */ +Inline void +uart_enable_send(SIOPCB *siopcb) +{ +#if defined(_COMMON_BF506) || defined(_COMMON_BF548) + /* BF50x/BF54xの場合 */ + uart_write(siopcb->siopinib->reg_base, UART_IER_S, IER_TX); +#else + uart_write(siopcb->siopinib->reg_base, UART_IER, + (uart_read(siopcb->siopinib->reg_base,UART_IER) | IER_TX)); +#endif +} + +/* + * 送信割込み禁止 + */ +Inline void +uart_disable_send(SIOPCB *siopcb) +{ +#if defined(_COMMON_BF506) || defined(_COMMON_BF548) + /* BF50x/BF54xの場合 */ + uart_write(siopcb->siopinib->reg_base, UART_IER_C, IER_TX); +#else + uart_write(siopcb->siopinib->reg_base, UART_IER, + (uart_read(siopcb->siopinib->reg_base, UART_IER) & ~IER_TX)); +#endif +} + +/* + * 受信割込み許可 + */ +Inline void +uart_enable_rcv(SIOPCB *siopcb) +{ +#if defined(_COMMON_BF506) || defined(_COMMON_BF548) + /* BF50x/BF54xの場合 */ + uart_write(siopcb->siopinib->reg_base, UART_IER_S, IER_RX); +#else + uart_write(siopcb->siopinib->reg_base, UART_IER, + (uart_read(siopcb->siopinib->reg_base,UART_IER) | IER_RX)); +#endif +} + +/* + * 受信割込み禁止 + */ +Inline void +uart_disable_rcv(SIOPCB *siopcb) +{ +#if defined(_COMMON_BF506) || defined(_COMMON_BF548) + /* BF50x/BF54xの場合 */ + uart_write(siopcb->siopinib->reg_base, UART_IER_C, IER_RX); +#else + uart_write(siopcb->siopinib->reg_base, UART_IER, + (uart_read(siopcb->siopinib->reg_base, UART_IER) & ~IER_RX)); +#endif +} + + +/* + * SIOドライバの初期化ルーチン + */ +void +uart_initialize() +{ + SIOPCB *siopcb; + UINT i; + + /* + * シリアルI/Oポート管理ブロックの初期化 + */ + for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP_UART; siopcb++, i++) { + siopcb->siopinib = &(siopinib_table[i]); + siopcb->openflag = FALSE; + siopcb->sendflag = FALSE; + } +} + + +/* + * + */ +void +uart_init_siopinib(const SIOPINIB *siopinib) +{ + + /* + * Blackfin ADSP-BF531/2/3, BF534/6/7, BF561の内蔵UARTに固有の作業。 + * Power Downモードの解除。 + */ + if ( siopinib->set_ucen ) + uart_write(siopinib->reg_base, UART_GCTL, + (uart_read(siopinib->reg_base, UART_GCTL) | GCTL_UCEN )); + /* + * 分周比の設定 + */ + /* Divisor Enable */ + uart_write(siopinib->reg_base, UART_LCR, + (uart_read(siopinib->reg_base, UART_LCR) | LCR_DL_MODE)); + uart_write(siopinib->reg_base, UART_DLL, siopinib->dll_val); + uart_write(siopinib->reg_base, UART_DLM, siopinib->dlm_val); + /* Divisor Disable */ + uart_write(siopinib->reg_base, UART_LCR, + (uart_read(siopinib->reg_base, UART_LCR) & ~LCR_DL_MODE)); + + /* モード設定, パリティ無し 8bit data, 1 stop bit */ + uart_write(siopinib->reg_base, UART_LCR, LCR_NP_8_1); + + /* 割込み禁止 */ +#if defined(_COMMON_BF506) || defined(_COMMON_BF548) + /* BF50x/BF54xの場合 */ + uart_write(siopinib->reg_base, UART_IER_C, 0xFFU); +#else + uart_write(siopinib->reg_base, UART_IER, 0x00); +#endif +} + + +/* + * カーネル起動時のバナー出力用の初期化 + */ +void +uart_init(void) +{ + int i; + /* + * すべてのuartを初期化する。id は1からTNUM_SIOP_UARTまで。 + */ + for ( i=1; i<=TNUM_SIOP_UART; i++ ) + uart_init_siopinib(get_siopinib(i)); +} + +/* + * オープンしているポートがあるか + */ +BOOL +uart_openflag(void) +{ + int i; + + /* + * 開いているポートがあれば0を返す。なければ0を返す。 + */ + for ( i=0; isiopinib; + + /* + * 初期化 + */ + uart_init_siopinib(siopcb->siopinib); + + /* 受信割込み許可 */ +#if defined(_COMMON_BF506) || defined(_COMMON_BF548) + /* BF50x/BF54xの場合 */ + uart_write(siopcb->siopinib->reg_base, UART_IER_S, IER_RX); +#else + uart_write(siopcb->siopinib->reg_base, UART_IER, IER_RX); +#endif + + /* 割込み線をイネーブル */ + uart_write(siopcb->siopinib->reg_base, UART_MCR, MCR_INT_ENABLE); + + siopcb->exinf = exinf; + siopcb->getready = siopcb->putready = FALSE; + siopcb->openflag = TRUE; + + return(siopcb); +} + +/* + * シリアルI/Oポートのクローズ + */ +void +uart_cls_por(SIOPCB *siopcb) +{ + /* 割込み禁止 */ +#if defined(_COMMON_BF506) || defined(_COMMON_BF548) + /* BF50x/BF54xの場合 */ + uart_write(siopcb->siopinib->reg_base, UART_IER_C, 0xFFU); +#else + uart_write(siopcb->siopinib->reg_base, UART_IER, 0x00); +#endif + siopcb->openflag = FALSE; +} + + +/* + * シリアルI/Oポートへのポーリングでの出力 + */ +void +uart_pol_putc(char c, ID siopid) +{ + const SIOPINIB *siopinib; + + siopinib = get_siopinib(siopid); + + while((uart_read(siopinib->reg_base, UART_LSR) & LSR_TX_EMPTY) + != LSR_TX_EMPTY) + ; + uart_write(siopinib->reg_base, UART_THR, c); +} + + +/* + * シリアルI/Oポートへの文字送信 + */ +BOOL +uart_snd_chr(SIOPCB *siopcb, char c) +{ + if (uart_putready(siopcb)){ + uart_putchar(siopcb, c); + return(TRUE); + } + return(FALSE); +} + +/* + * シリアルI/Oポートからの文字受信 + */ +INT +uart_rcv_chr(SIOPCB *siopcb) +{ + if (uart_getready(siopcb)) { + return((INT)(UB) uart_getchar(siopcb)); + } + return(-1); +} + + + + + +/* + * シリアルI/Oポートからのコールバックの許可 + */ +void +uart_ena_cbr(SIOPCB *siopcb, UINT cbrtn) +{ + + switch (cbrtn) { + case SIO_ERDY_SND: + uart_enable_send(siopcb); + break; + case SIO_ERDY_RCV: + uart_enable_rcv(siopcb); + break; + } +} + +/* + * シリアルI/Oポートからのコールバックの禁止 + */ +void +uart_dis_cbr(SIOPCB *siopcb, UINT cbrtn) +{ + switch (cbrtn) { + case SIO_ERDY_SND: + uart_disable_send(siopcb); + break; + case SIO_ERDY_RCV: + uart_disable_rcv(siopcb); + break; + } +} + +/* + * シリアルI/Oポートに対する割込み処理 + */ +static void +uart_rx_isr_siop(SIOPCB *siopcb) +{ + if (uart_getready(siopcb)) { + /* + * 受信通知コールバックルーチンを呼び出す. + */ + uart_ierdy_rcv(siopcb->exinf); + } +} + +static void +uart_tx_isr_siop(SIOPCB *siopcb) +{ + if (uart_putready(siopcb)) { + /* + * 送信可能コールバックルーチンを呼び出す. + */ + uart_ierdy_snd(siopcb->exinf); + } +} + +/* + * SIOの割込みサービスルーチン + * ADSP-BF533の内蔵UARTは送受に別々の割込み要求を出すため、 + * ISRも分けている。また、ADSP-BF537のように二つ以上の + * UARTを持つ場合を考慮して、uart0のようにポート番号を + * 名前にハードコードしている。 + * ただし、このポート番号とは、SIOのポート番号であって、 + * ハードウェアのUART番号と同じだとは限らない。 + */ + +/* + ***** UART0 + */ +void +uart0_rx_isr() +{ + /* 下位の受信処理を呼ぶ */ + uart_rx_isr_siop(&(siopcb_table[0])); +} + +void +uart0_tx_isr() +{ + /* 下位の送信処理を呼ぶ */ + uart_tx_isr_siop(&(siopcb_table[0])); +} + +/* + ***** UART1 + */ +void +uart1_rx_isr() +{ + /* 下位の受信処理を呼ぶ */ + uart_rx_isr_siop(&(siopcb_table[1])); +} + +void +uart1_tx_isr() +{ + /* 下位の送信処理を呼ぶ */ + uart_tx_isr_siop(&(siopcb_table[1])); +} + +/* + ***** UART2 + */ +void +uart2_rx_isr() +{ + /* 下位の受信処理を呼ぶ */ + uart_rx_isr_siop(&(siopcb_table[2])); +} + +void +uart2_tx_isr() +{ + /* 下位の送信処理を呼ぶ */ + uart_tx_isr_siop(&(siopcb_table[2])); +} + + + + + +/* + * UARTの送受で割込みを共有する場合(こちらのほうが一般的)は、 + * 上のルーチンではなくこちらを割込みサービスルーチンとして使う。 + */ +void +uart0_isr() +{ + /* 下位の受信処理を呼ぶ */ + uart_rx_isr_siop(&(siopcb_table[0])); + /* 下位の送信処理を呼ぶ */ + uart_tx_isr_siop(&(siopcb_table[0])); +} + +void +uart1_isr() +{ + /* 下位の受信処理を呼ぶ */ + uart_rx_isr_siop(&(siopcb_table[1])); + /* 下位の送信処理を呼ぶ */ + uart_tx_isr_siop(&(siopcb_table[1])); +} + +void +uart2_isr() +{ + /* 下位の受信処理を呼ぶ */ + uart_rx_isr_siop(&(siopcb_table[2])); + /* 下位の送信処理を呼ぶ */ + uart_tx_isr_siop(&(siopcb_table[2])); +} diff --git a/uzume_prototype/kernel/pdic/simple_sio/uart.h b/uzume_prototype/kernel/pdic/simple_sio/uart.h new file mode 100644 index 0000000..4def095 --- /dev/null +++ b/uzume_prototype/kernel/pdic/simple_sio/uart.h @@ -0,0 +1,157 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + */ + +/* + * ADSP-BF533 UART用 簡易SIOドライバ + * + * このファイルは、TOPPERS/JSP 1.4.2の pdic/simple_sio/st16c2550.hを + * リネームし、内部の識別子を変更したものである。 + */ +#ifndef _UART_H_ +#define _UART_H_ + +#include + +/* + * シリアルI/Oポート初期化ブロック + */ +typedef struct sio_port_initialization_block { + UW reg_base; /* レジスタのベースアドレス */ + UB dlm_val; /* ボーレート上位の設定値 */ + UB dll_val; /* ボーレート下位の設定値 */ + UB set_ucen:1; /* 1のとき、GCTLのUCENを1にする(ADSP-BF53xのみ) */ +} SIOPINIB; + +/* + * シリアルI/Oポート管理ブロック + */ +typedef struct sio_port_control_block { + const SIOPINIB *siopinib; /* シリアルI/Oポート初期化ブロック */ + VP_INT exinf; /* 拡張情報 */ + BOOL openflag; /* オープン済みフラグ */ + BOOL sendflag; /* 送信割込みイネーブルフラグ */ + BOOL getready; /* 文字を受信した状態 */ + BOOL putready; /* 文字を送信できる状態 */ +}SIOPCB; + + +/* + * コールバックルーチンの識別番号 + */ +#define SIO_ERDY_SND 1u /* 送信可能コールバック */ +#define SIO_ERDY_RCV 2u /* 受信通知コールバック */ + + +/* + * カーネル起動時用の初期化(sys_putcを使用するため) + */ +extern void uart_init(void); + +/* + * シリアルI/Oポートへのポーリングでの出力 + */ +extern void uart_pol_putc(char c, ID siopid); + + +/* + * SIOドライバの初期化ルーチン + */ +extern void uart_initialize(void); + + +/* + * オープンしているポートがあるか? + */ +extern BOOL uart_openflag(void); + + +/* + * シリアルI/Oポートのオープン + */ +extern SIOPCB *uart_opn_por(ID siopid, VP_INT exinf); + + +/* + * シリアルI/Oポートのクローズ + */ +extern void uart_cls_por(SIOPCB *siopcb); + + +/* + * シリアルI/Oポートへの文字送信 + */ +extern BOOL uart_snd_chr(SIOPCB *siopcb, char c); + + +/* + * シリアルI/Oポートからの文字受信 + */ +extern INT uart_rcv_chr(SIOPCB *siopcb); + + +/* + * シリアルI/Oポートからのコールバックの許可 + */ +extern void uart_ena_cbr(SIOPCB *siopcb, UINT cbrtn); + + +/* + * シリアルI/Oポートからのコールバックの禁止 + */ +extern void uart_dis_cbr(SIOPCB *siopcb, UINT cbrtn); + + +/* + * SIOの割込みサービスルーチン + */ +extern void uart0_tx_isr(void); +extern void uart0_rx_isr(void); + + +/* + * シリアルI/Oポートからの送信可能コールバック + */ +extern void uart_ierdy_snd(VP_INT exinf); + + +/* + * シリアルI/Oポートからの受信通知コールバック + */ +extern void uart_ierdy_rcv(VP_INT exinf); + + +#endif diff --git a/uzume_prototype/kernel/pdic/simple_sio/upd72001.c b/uzume_prototype/kernel/pdic/simple_sio/upd72001.c new file mode 100644 index 0000000..715e850 --- /dev/null +++ b/uzume_prototype/kernel/pdic/simple_sio/upd72001.c @@ -0,0 +1,437 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: upd72001.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * μPD72001用 簡易SIOドライバ + */ + +#include +#include + +/* + * デバイスレジスタのアクセス間隔時間(nsec単位) + * + * 200という値にあまり根拠はない. + */ +#define UPD72001_DELAY 200 + +/* + * μPD72001のレジスタの番号 + */ +#define UPD72001_CR0 0x00u /* コントロールレジスタ */ +#define UPD72001_CR1 0x01u +#define UPD72001_CR2 0x02u +#define UPD72001_CR3 0x03u +#define UPD72001_CR4 0x04u +#define UPD72001_CR5 0x05u +#define UPD72001_CR10 0x0au +#define UPD72001_CR12 0x0cu +#define UPD72001_CR14 0x0eu +#define UPD72001_CR15 0x0fu + +#define UPD72001_SR0 0x00u /* ステータスレジスタ */ + +/* + * コントロールレジスタの設定値 + */ +#define CR_RESET 0x18u /* ポートリセットコマンド */ + +#define CR0_EOI 0x38u /* EOI(End of Interrupt)*/ + +#define CR1_DOWN 0x00u /* 全割込みを禁止 */ +#define CR1_RECV 0x10u /* 受信割込み許可ビット */ +#define CR1_SEND 0x02u /* 送信割込み許可ビット */ + +#define CR3_DEF 0xc1u /* データ 8bit,受信イネーブル */ +#define CR4_DEF 0x44u /* ストップビット 1bit,パリティなし */ +#define CR5_DEF 0xeau /* データ 8bit,送信イネーブル */ + +#define CR10_DEF 0x00u /* NRZ */ +#define CR14_DEF 0x07u /* ボーレートジェネレータイネーブル */ +#define CR15_DEF 0x56u /* ボーレートジェネレータ使用 */ + +#define SR0_RECV 0x01u /* 受信通知ビット */ +#define SR0_SEND 0x04u /* 送信可能ビット */ + +/* + * シリアルI/Oポート初期化ブロックの定義 + */ +typedef struct sio_port_initialization_block { + VP data; /* データレジスタの番地 */ + VP ctrl; /* コントロールレジスタの番地 */ + + UB cr3_def; /* CR3の設定値(受信ビット数)*/ + UB cr4_def; /* CR4の設定値(ストップビット,パリティ)*/ + UB cr5_def; /* CR5の設定値(送信ビット数)*/ + UB brg1_def; /* ボーレート上位の設定値 */ + UB brg2_def; /* ボーレート下位の設定値 */ +} SIOPINIB; + +/* + * シリアルI/Oポート管理ブロックの定義 + */ +struct sio_port_control_block { + const SIOPINIB *siopinib; /* シリアルI/Oポート初期化ブロック */ + VP_INT exinf; /* 拡張情報 */ + BOOL openflag; /* オープン済みフラグ */ + UB cr1; /* CR1の設定値(割込み許可)*/ + BOOL getready; /* 文字を受信した状態 */ + BOOL putready; /* 文字を送信できる状態 */ +}; + +/* + * シリアルI/Oポート初期化ブロック + * + * ID = 1 をポートB,ID = 2 をポートAに対応させている. + */ +const SIOPINIB siopinib_table[TNUM_SIOP] = { + { (VP) TADR_UPD72001_DATAB, (VP) TADR_UPD72001_CTRLB, + CR3_DEF, CR4_DEF, CR5_DEF, BRG1_DEF, BRG2_DEF }, +#if TNUM_SIOP >= 2 + { (VP) TADR_UPD72001_DATAA, (VP) TADR_UPD72001_CTRLA, + CR3_DEF, CR4_DEF, CR5_DEF, BRG1_DEF, BRG2_DEF }, +#endif /* TNUM_SIOP >= 2 */ +}; + +/* + * シリアルI/Oポート管理ブロックのエリア + */ +SIOPCB siopcb_table[TNUM_SIOP]; + +/* + * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ + */ +#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1)) +#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)])) + +/* + * デバイスレジスタへのアクセス関数 + */ +Inline UB +upd72001_read_reg(VP addr) +{ + UB val; + + val = (UB) upd72001_reb_reg(addr); + sil_dly_nse(UPD72001_DELAY); + return(val); +} + +Inline void +upd72001_write_reg(VP addr, UB val) +{ + upd72001_wrb_reg(addr, (VB) val); + sil_dly_nse(UPD72001_DELAY); +} + +Inline UB +upd72001_read_ctrl(VP addr, UB reg) +{ + upd72001_write_reg(addr, reg); + return(upd72001_read_reg(addr)); +} + +Inline void +upd72001_write_ctrl(VP addr, UB reg, UB val) +{ + upd72001_write_reg(addr, reg); + upd72001_write_reg(addr, val); +} + +Inline void +upd72001_write_brg(VP addr, UB reg, UB val, UB brg2, UB brg1) +{ + upd72001_write_reg(addr, reg); + upd72001_write_reg(addr, val); + upd72001_write_reg(addr, brg2); + upd72001_write_reg(addr, brg1); + (void) upd72001_read_reg(addr); /* ダミーリード */ +} + +/* + * 状態の読出し(SR0の読出し) + * + * μPD72001は,状態(SR0)を一度読むと受信通知ビットが落ちてしまうた + * め,状態を読み出す関数を設け,シリアルI/Oポート管理ブロック中の + * getready に受信通知状態,putready に送信可能状態を保存している(送 + * 信可能状態の保存は不要かもしれない). + * 状態レジスタを読んでも受信通知ビットが落ちないデバイス(こちらが普 + * 通と思われる)では,この関数は必要ない. + */ +static void +upd72001_get_stat(SIOPCB *siopcb) +{ + UB sr0; + + sr0 = upd72001_read_ctrl(siopcb->siopinib->ctrl, UPD72001_SR0); + if ((sr0 & SR0_RECV) != 0) { + siopcb->getready = TRUE; + } + if ((sr0 & SR0_SEND) != 0) { + siopcb->putready = TRUE; + } +} + +/* + * 文字を受信できるか? + */ +Inline BOOL +upd72001_getready(SIOPCB *siopcb) +{ + upd72001_get_stat(siopcb); + return(siopcb->getready); +} + +/* + * 文字を送信できるか? + */ +Inline BOOL +upd72001_putready(SIOPCB *siopcb) +{ + upd72001_get_stat(siopcb); + return(siopcb->putready); +} + +/* + * 受信した文字の取出し + */ +Inline char +upd72001_getchar(SIOPCB *siopcb) +{ + siopcb->getready = FALSE; + return((char) upd72001_read_reg(siopcb->siopinib->data)); +} + +/* + * 送信する文字の書込み + */ +Inline void +upd72001_putchar(SIOPCB *siopcb, char c) +{ + siopcb->putready = FALSE; + upd72001_write_reg(siopcb->siopinib->data, (UB) c); +} + +/* + * EOI(End Of Interrupt)発行 + */ +Inline void +upd72001_eoi() +{ + upd72001_write_ctrl((VP) TADR_UPD72001_CTRLA, UPD72001_CR0, CR0_EOI); +} + +/* + * SIOドライバの初期化ルーチン + */ +void +upd72001_initialize() +{ + SIOPCB *siopcb; + UINT i; + + /* + * シリアルI/Oポート管理ブロックの初期化 + */ + for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) { + siopcb->siopinib = &(siopinib_table[i]); + siopcb->openflag = FALSE; + } +} + +/* + * オープンしているポートがあるか? + */ +BOOL +upd72001_openflag(void) +{ +#if TNUM_SIOP < 2 + return(siopcb_table[0].openflag); +#else /* TNUM_SIOP < 2 */ + return(siopcb_table[0].openflag || siopcb_table[1].openflag); +#endif /* TNUM_SIOP < 2 */ +} + +/* + * シリアルI/Oポートのオープン + */ +SIOPCB * +upd72001_opn_por(ID siopid, VP_INT exinf) +{ + SIOPCB *siopcb; + const SIOPINIB *siopinib; + + siopcb = get_siopcb(siopid); + siopinib = siopcb->siopinib; + + upd72001_write_reg(siopinib->ctrl, CR_RESET); + if (!upd72001_openflag()) { + upd72001_write_ctrl((VP) TADR_UPD72001_CTRLA, + UPD72001_CR2, 0x18); + upd72001_write_ctrl((VP) TADR_UPD72001_CTRLB, + UPD72001_CR2, 0x00); + } + siopcb->cr1 = CR1_DOWN; + upd72001_write_ctrl(siopinib->ctrl, UPD72001_CR1, siopcb->cr1); + upd72001_write_ctrl(siopinib->ctrl, UPD72001_CR4, siopinib->cr4_def); + upd72001_write_brg(siopinib->ctrl, UPD72001_CR12, + 0x01, siopinib->brg2_def, siopinib->brg1_def); + upd72001_write_brg(siopinib->ctrl, UPD72001_CR12, + 0x02, siopinib->brg2_def, siopinib->brg1_def); + upd72001_write_ctrl(siopinib->ctrl, UPD72001_CR15, CR15_DEF); + upd72001_write_ctrl(siopinib->ctrl, UPD72001_CR14, CR14_DEF); + upd72001_write_ctrl(siopinib->ctrl, UPD72001_CR10, CR10_DEF); + upd72001_write_ctrl(siopinib->ctrl, UPD72001_CR3, siopinib->cr3_def); + upd72001_write_ctrl(siopinib->ctrl, UPD72001_CR5, siopinib->cr5_def); + siopcb->exinf = exinf; + siopcb->getready = siopcb->putready = FALSE; + siopcb->openflag = TRUE; + return(siopcb); +} + +/* + * シリアルI/Oポートのクローズ + */ +void +upd72001_cls_por(SIOPCB *siopcb) +{ + upd72001_write_ctrl(siopcb->siopinib->ctrl, UPD72001_CR1, CR1_DOWN); + siopcb->openflag = FALSE; +} + +/* + * シリアルI/Oポートへの文字送信 + */ +BOOL +upd72001_snd_chr(SIOPCB *siopcb, char c) +{ + if (upd72001_putready(siopcb)) { + upd72001_putchar(siopcb, c); + return(TRUE); + } + return(FALSE); +} + +/* + * シリアルI/Oポートからの文字受信 + */ +INT +upd72001_rcv_chr(SIOPCB *siopcb) +{ + if (upd72001_getready(siopcb)) { + return((INT)(UB) upd72001_getchar(siopcb)); + } + return(-1); +} + +/* + * シリアルI/Oポートからのコールバックの許可 + */ +void +upd72001_ena_cbr(SIOPCB *siopcb, UINT cbrtn) +{ + UB cr1_bit = 0; + + switch (cbrtn) { + case SIO_ERDY_SND: + cr1_bit = CR1_SEND; + break; + case SIO_ERDY_RCV: + cr1_bit = CR1_RECV; + break; + } + siopcb->cr1 |= cr1_bit; + upd72001_write_ctrl(siopcb->siopinib->ctrl, UPD72001_CR1, siopcb->cr1); +} + +/* + * シリアルI/Oポートからのコールバックの禁止 + */ +void +upd72001_dis_cbr(SIOPCB *siopcb, UINT cbrtn) +{ + UB cr1_bit = 0; + + switch (cbrtn) { + case SIO_ERDY_SND: + cr1_bit = CR1_SEND; + break; + case SIO_ERDY_RCV: + cr1_bit = CR1_RECV; + break; + } + siopcb->cr1 &= ~cr1_bit; + upd72001_write_ctrl(siopcb->siopinib->ctrl, UPD72001_CR1, siopcb->cr1); +} + +/* + * シリアルI/Oポートに対する割込み処理 + */ +static void +upd72001_isr_siop(SIOPCB *siopcb) +{ + if ((siopcb->cr1 & CR1_RECV) != 0 && upd72001_getready(siopcb)) { + /* + * 受信通知コールバックルーチンを呼び出す. + */ + upd72001_ierdy_rcv(siopcb->exinf); + } + if ((siopcb->cr1 & CR1_SEND) != 0 && upd72001_putready(siopcb)) { + /* + * 送信可能コールバックルーチンを呼び出す. + */ + upd72001_ierdy_snd(siopcb->exinf); + } +} + +/* + * SIOの割込みサービスルーチン + */ +void +upd72001_isr() +{ + if (siopcb_table[0].openflag) { + upd72001_isr_siop(&(siopcb_table[0])); + } +#if TNUM_SIOP >= 2 + if (siopcb_table[1].openflag) { + upd72001_isr_siop(&(siopcb_table[1])); + } +#endif /* TNUM_SIOP >= 2 */ + upd72001_eoi(); +} diff --git a/uzume_prototype/kernel/pdic/simple_sio/upd72001.h b/uzume_prototype/kernel/pdic/simple_sio/upd72001.h new file mode 100644 index 0000000..6789438 --- /dev/null +++ b/uzume_prototype/kernel/pdic/simple_sio/upd72001.h @@ -0,0 +1,114 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: upd72001.h,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * μPD72001用 簡易SIOドライバ + */ + +#ifndef _UPD72001_H_ +#define _UPD72001_H_ + +#include + +/* + * シリアルI/Oポート管理ブロックの定義 + */ +typedef struct sio_port_control_block SIOPCB; + +/* + * コールバックルーチンの識別番号 + */ +#define SIO_ERDY_SND 1u /* 送信可能コールバック */ +#define SIO_ERDY_RCV 2u /* 受信通知コールバック */ + +/* + * SIOドライバの初期化ルーチン + */ +extern void upd72001_initialize(void); + +/* + * オープンしているポートがあるか? + */ +extern BOOL upd72001_openflag(void); + +/* + * シリアルI/Oポートのオープン + */ +extern SIOPCB *upd72001_opn_por(ID siopid, VP_INT exinf); + +/* + * シリアルI/Oポートのクローズ + */ +extern void upd72001_cls_por(SIOPCB *siopcb); + +/* + * シリアルI/Oポートへの文字送信 + */ +extern BOOL upd72001_snd_chr(SIOPCB *siopcb, char c); + +/* + * シリアルI/Oポートからの文字受信 + */ +extern INT upd72001_rcv_chr(SIOPCB *siopcb); + +/* + * シリアルI/Oポートからのコールバックの許可 + */ +extern void upd72001_ena_cbr(SIOPCB *siopcb, UINT cbrtn); + +/* + * シリアルI/Oポートからのコールバックの禁止 + */ +extern void upd72001_dis_cbr(SIOPCB *siopcb, UINT cbrtn); + +/* + * SIOの割込みサービスルーチン + */ +extern void upd72001_isr(void); + +/* + * シリアルI/Oポートからの送信可能コールバック + */ +extern void upd72001_ierdy_snd(VP_INT exinf); + +/* + * シリアルI/Oポートからの受信通知コールバック + */ +extern void upd72001_ierdy_rcv(VP_INT exinf); + +#endif /* _UPD72001_H_ */ diff --git a/uzume_prototype/kernel/sample/Makefile b/uzume_prototype/kernel/sample/Makefile new file mode 100644 index 0000000..874ec12 --- /dev/null +++ b/uzume_prototype/kernel/sample/Makefile @@ -0,0 +1,507 @@ +# +# TOPPERS/JSP Kernel +# Toyohashi Open Platform for Embedded Real-Time Systems/ +# Just Standard Profile Kernel +# +# Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory +# Toyohashi Univ. of Technology, JAPAN +# Copyright (C) 2005 by Embedded and Real-Time Systems Laboratory +# Graduate School of Information Science, Nagoya Univ., JAPAN +# +# 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation +# によって公表されている GNU General Public License の Version 2 に記 +# 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア +# を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, +# 利用と呼ぶ)することを無償で許諾する. +# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 +# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー +# スコード中に含まれていること. +# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 +# 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 +# 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 +# の無保証規定を掲載すること. +# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 +# 用できない形で再配布する場合には,次のいずれかの条件を満たすこ +# と. +# (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 +# 作権表示,この利用条件および下記の無保証規定を掲載すること. +# (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに +# 報告すること. +# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 +# 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. +# +# 本ソフトウェアは,無保証で提供されているものである.上記著作権者お +# よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も +# 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 +# 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. +# +# @(#) $Id: Makefile,v 1.8 2012/01/21 02:32:02 suikan Exp $ +# + +# +# ターゲットの指定(Makefile.config で上書きされるのを防ぐため) +# +all: + +# +# ターゲット名の定義 +# +CPU = @(CPU) +SYS = @(SYS) +TOOL = @(TOOL) + +# +# プログラミング言語の定義 +# +PROGRAM_LANG = @(LANG) +ifeq ($(PROGRAM_LANG),c++) + USE_CXX = true + CXXLIBS = + CXXRTS = cxxrt.o newlibrt.o cpu_malloc.o +endif + +# +# ソースファイルのディレクトリの定義 +# +SRCDIR = @(SRCDIR) + +# +# オブジェクトファイル名の拡張子の設定 +# +OBJEXT = @(OBJEXT) + +# +# 実行環境の定義(どれにも該当しない場合は,すべてコメントアウトする) +# (ターゲット依存に上書きされる場合がある) +# +DBGENV := GDB_STUB + +# +# カーネルライブラリ(libkernel.a)のディレクトリ名 +# (カーネルライブラリも make 対象にする時は,空に定義する) +# +KERNEL_LIB = @(KERNEL_LIB) + +# +# ターゲット依存の定義のインクルード +# +ifdef TOOL + ifdef SYS + include $(SRCDIR)/config/$(CPU)-$(TOOL)/$(SYS)/Makefile.config + endif + include $(SRCDIR)/config/$(CPU)-$(TOOL)/Makefile.config +else + ifdef SYS + include $(SRCDIR)/config/$(CPU)/$(SYS)/Makefile.config + endif + include $(SRCDIR)/config/$(CPU)/Makefile.config +endif + +# +# 共通コンパイルオプションの定義 +# +COPTS := $(COPTS) +CDEFS := $(CDEFS) +INCLUDES := -I. -I$(SRCDIR)/include $(INCLUDES) +LDFLAGS := -nostdlib $(LDFLAGS) +LIBS := $(LIBS) $(CXXLIBS) -lgcc +CFLAGS = $(COPTS) $(CDEFS) $(INCLUDES) + +# +# アプリケーションプログラムに関する定義 +# +UNAME = @(UNAME) +UTASK_CFG = $(UNAME).cfg + +UTASK_DIR = $(SRCDIR)/library +UTASK_ASMOBJS = +ifdef USE_CXX + UTASK_CXXOBJS = $(UNAME).o @(UTASK) + UTASK_COBJS = +else + UTASK_COBJS = $(UNAME).o @(UTASK) +endif +UTASK_CFLAGS = +UTASK_LIBS = + +# +# システムサービスに関する定義 +# +STASK_DIR := $(STASK_DIR):$(SRCDIR)/systask:$(SRCDIR)/library +STASK_ASMOBJS := $(STASK_ASMOBJS) +STASK_COBJS := $(STASK_COBJS) timer.o serial.o logtask.o \ + log_output.o vasyslog.o t_perror.o strerror.o \ + $(CXXRTS) +STASK_CFLAGS := $(STASK_CFLAGS) -I$(SRCDIR)/systask +STASK_LIBS := $(STASK_LIBS) + +# +# カーネルに関する定義 +# +# KERNEL_ASMOBJS: カーネルライブラリに含める,ソースがアセンブリ言語の +# オブジェクトファイル. +# KERNEL_COBJS: カーネルのライブラリに含める,ソースがC言語で,ソース +# ファイルと1対1に対応するオブジェクトファイル. +# KERNEL_LCSRCS: カーネルのライブラリに含めるC言語のソースファイルで, +# 1つのソースファイルから複数のオブジェクトファイルを生 +# 成するもの(Makefile.kernel で定義). +# KERNEL_LCOBJS: 上のソースファイルから生成されるオブジェクトファイル +# (Makefile.kernel で定義). +# KERNEL_AUX_COBJS: ロードモジュールに含めないが,カーネルのソースファ +# イルと同じオプションを適用してコンパイルすべきファ +# イル. +# +KERNEL = $(SRCDIR)/kernel +KERNEL_DIR := $(KERNEL_DIR):$(KERNEL) +KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) +KERNEL_COBJS := startup.o banner.o $(KERNEL_COBJS) +KERNEL_CFLAGS := $(KERNEL_CFLAGS) -I$(KERNEL) +ifdef OMIT_MAKEOFFSET + OFFSET_H = + KERNEL_AUX_COBJS = kernel_chk.o +else + OFFSET_H = offset.h + KERNEL_AUX_COBJS = makeoffset.o kernel_chk.o +endif + +# +# オブジェクトファイル名の定義 +# +OBJNAME = jsp +ifdef OBJEXT + OBJFILE = $(OBJNAME).$(OBJEXT) +else + OBJFILE = $(OBJNAME) +endif + +# +# ターゲットファイル(複数を同時に選択してはならない) +# +all: $(OBJFILE) +#all: $(OBJNAME).out +#all: $(OBJNAME).bin +#all: $(OBJNAME).srec + +# +# カーネルのコンフィギュレーションファイルの生成 +# +kernel_cfg.c kernel_id.h kernel_chk.c: $(UTASK_CFG) + $(CC) -E $(INCLUDES) $(CDEFS) -x c-header $(UTASK_CFG) > tmpfile1 + $(SRCDIR)/cfg/cfg -s tmpfile1 -c -obj -cpu $(CPU) -system $(SYS) + rm -f tmpfile1 + +##### 以下は編集しないこと ##### + +# +# 環境に依存するコンパイルオプションの定義 +# +ifdef DBGENV + CDEFS := $(CDEFS) -D$(DBGENV) +endif + +# +# カーネルライブラリに関連する定義 +# +ifdef KERNEL_LIB + MAKE_KERNEL = + LIBKERNEL = $(KERNEL_LIB)/libkernel.a +else + MAKE_KERNEL = libkernel.a + LIBKERNEL = $(MAKE_KERNEL) +endif + +# +# カーネルのファイル構成の定義 +# +include $(KERNEL)/Makefile.kernel + +# +# $(OBJNAME).chk の生成規則(静的APIのパラメータチェック) +# +$(OBJNAME).chk: kernel_chk.s $(SRCDIR)/utils/gencheck + $(PERL) $(SRCDIR)/utils/gencheck kernel_chk.s > tmpfile2 + mv tmpfile2 $(OBJNAME).chk + +# +# offset.h の生成規則(構造体内のオフセット値の算出) +# +offset.h: makeoffset.s $(SRCDIR)/utils/genoffset + $(PERL) $(SRCDIR)/utils/genoffset makeoffset.s > tmpfile3 + mv tmpfile3 offset.h + +# +# ソースファイルのあるディレクトリに関する定義 +# +vpath %.c $(KERNEL_DIR):$(STASK_DIR):$(UTASK_DIR) +vpath %.S $(KERNEL_DIR):$(STASK_DIR):$(UTASK_DIR) + +# +# コンパイルのための変数の定義 +# +KERNEL_LIB_OBJS = $(KERNEL_ASMOBJS) $(KERNEL_COBJS) $(KERNEL_LCOBJS) +STASK_OBJS = $(STASK_ASMOBJS) $(STASK_COBJS) +UTASK_OBJS = $(UTASK_ASMOBJS) $(UTASK_COBJS) $(UTASK_CXXOBJS) +TASK_OBJS = $(UTASK_OBJS) $(STASK_OBJS) kernel_cfg.o +ALL_OBJS = $(START_OBJS) $(CXX_BEGIN_OBJS) $(TASK_OBJS) $(CXX_END_OBJS) $(END_OBJS) +ALL_LIBS = $(UTASK_LIBS) $(STASK_LIBS) $(LIBKERNEL) $(LIBS) + +ifdef TEXT_START_ADDRESS + LDFLAGS := $(LDFLAGS) -Wl,-Ttext,$(TEXT_START_ADDRESS) +endif +ifdef DATA_START_ADDRESS + LDFLAGS := $(LDFLAGS) -Wl,-Tdata,$(DATA_START_ADDRESS) +endif +ifdef LDSCRIPT + LDFLAGS := $(LDFLAGS) -T $(SRCDIR)/config/$(LDSCRIPT) +endif + +# +# カーネルライブラリファイルの生成 +# +libkernel.a: $(OFFSET_H) $(KERNEL_LIB_OBJS) + rm -f libkernel.a + $(AR) -rcs libkernel.a $(KERNEL_LIB_OBJS) + $(RANLIB) libkernel.a + +# +# 全体のリンク +# $(OBJCOPY) -R ... はGDB用に定義したデバッグ用MMRのメモリ実体を剥ぎ取り、シンボルだけ残すためのもの。 +# +$(OBJFILE): Makefile.depend $(ALL_OBJS) $(MAKE_KERNEL) $(OBJNAME).chk + $(LINK) $(CFLAGS) $(LDFLAGS) -o $(OBJFILE) \ + $(START_OBJS) $(CXX_BEGIN_OBJS) $(TASK_OBJS) $(ALL_LIBS) $(CXX_END_OBJS) $(END_OBJS) + $(NM) $(OBJFILE) > $(OBJNAME).syms + $(OBJCOPY) -O srec -S $(OBJFILE) $(OBJNAME).srec + $(SRCDIR)/cfg/chk -m $(OBJNAME).syms,$(OBJNAME).srec \ + -obj -cs $(OBJNAME).chk -cpu $(CPU) -system $(SYS) + +# +# バイナリファイルの生成 +# +$(OBJNAME).bin: $(OBJFILE) + $(OBJCOPY) -O binary -S $(OBJFILE) $(OBJNAME).bin + +# +# Sレコードファイルの生成 +# +$(OBJNAME).srec: $(OBJFILE) + $(OBJCOPY) -O srec -S $(OBJFILE) $(OBJNAME).srec + +# +# コンパイル結果の消去 +# +clean: + rm -f \#* *~ *.o tmpfile? + rm -f $(MAKE_KERNEL) $(OBJNAME) + rm -f $(OBJNAME).syms $(OBJNAME).srec $(OBJNAME).chk + rm -f $(OBJNAME).exe $(OBJNAME).bin $(OBJNAME).out + rm -f kernel_cfg.c kernel_chk.c kernel_chk.s kernel_id.h kernel_obj.dat + rm -f makeoffset.s offset.h + +cleankernel: + rm -rf $(KERNEL_LIB_OBJS) + rm -f makeoffset.s offset.h + +cleandep: + rm -f Makefile.depend + +realclean: cleandep clean + +# +# kernel_cfg.c のコンパイルルールと依存関係作成ルールの定義 +# +# kernel_cfg.c は,アプリケーションプログラム用,システムサービス用, +# カーネル用のすべてのオプションを付けてコンパイルする. +# +KERNEL_CFG_CFLAGS = $(UTASK_CFLAGS) $(STASK_CFLAGS) $(KERNEL_CFLAGS) + +kernel_cfg.o: kernel_cfg.c + $(CC) -c $(CFLAGS) $(KERNEL_CFG_CFLAGS) $< + +kernel_cfg.s: kernel_cfg.c + $(CC) -S $(CFLAGS) $(KERNEL_CFG_CFLAGS) $< + +kernel_cfg.d: kernel_cfg.c + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \ + -O "$(CFLAGS) $(KERNEL_CFG_CFLAGS)" $< >> Makefile.depend + +# +# 特別な依存関係の定義 +# +banner.o: $(filter-out banner.o,$(KERNEL_LIB_OBJS)) + +# +# 特殊な依存関係作成ルールの定義 +# +kernel_id.d: $(UTASK_CFG) + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) -X \ + -T "kernel_cfg.c kernel_id.h kernel_chk.c" \ + -O "$(INCLUDES)" $< >> Makefile.depend + +makeoffset.d: makeoffset.c + @$(PERL) $(SRCDIR)/utils/makedep -s -C $(CC) \ + -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend + +kernel_chk.d: kernel_chk.c + @$(PERL) $(SRCDIR)/utils/makedep -s -C $(CC) \ + -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend + +# +# 依存関係ファイルの生成 +# +gendepend: + @echo "Generating Makefile.depend." + +ifdef KERNEL_LIB +depend: cleandep kernel_cfg.c gendepend kernel_id.d \ + kernel_chk.d $(ALL_OBJS:.o=.d) +else +depend: cleandep $(OFFSET_H) kernel_cfg.c gendepend kernel_id.d \ + $(KERNEL_AUX_COBJS:.o=.d) $(KERNEL_ASMOBJS:.o=.d) \ + $(KERNEL_COBJS:.o=.d) $(KERNEL_LCSRCS:.c=.d) $(ALL_OBJS:.o=.d) +endif + +# +# 依存関係ファイルをインクルード +# +-include Makefile.depend + +# +# 開発ツールのコマンド名の定義 +# +ifndef TOOL + # + # GNU開発環境用 + # + ifdef TARGET + TARGET_PREFIX = $(TARGET)- + else + TARGET_PREFIX = + endif + CC = $(TARGET_PREFIX)gcc + CXX = $(TARGET_PREFIX)g++ + AS = $(TARGET_PREFIX)as + LD = $(TARGET_PREFIX)ld + AR = $(TARGET_PREFIX)ar + NM = $(TARGET_PREFIX)nm + RANLIB = $(TARGET_PREFIX)ranlib + OBJCOPY = $(TARGET_PREFIX)objcopy + OBJDUMP = $(TARGET_PREFIX)objdump +else + TARGET_PREFIX = +endif + +ifdef USE_CXX + LINK = $(CXX) +else + LINK = $(CC) +endif + +PERL = @(PERL) + +# +# コンパイルルールの定義 +# +KERNEL_ALL_COBJS = $(KERNEL_COBJS) $(KERNEL_AUX_COBJS) + +$(KERNEL_ALL_COBJS): %.o: %.c + $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $< + +$(KERNEL_ALL_COBJS:.o=.s): %.s: %.c + $(CC) -S $(CFLAGS) $(KERNEL_CFLAGS) $< + +$(KERNEL_LCOBJS): %.o: + $(CC) -D__$(*F) -o $@ -c $(CFLAGS) $(KERNEL_CFLAGS) $< + +$(KERNEL_LCOBJS:.o=.s): %.s: + $(CC) -D__$(*F) -o $@ -S $(CFLAGS) $(KERNEL_CFLAGS) $< + +$(KERNEL_ASMOBJS): %.o: %.S + $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $< + +$(STASK_COBJS): %.o: %.c + $(CC) -c $(CFLAGS) $(STASK_CFLAGS) $< + +$(STASK_COBJS:.o=.s): %.s: %.c + $(CC) -S $(CFLAGS) $(STASK_CFLAGS) $< + +$(STASK_ASMOBJS): %.o: %.S + $(CC) -c $(CFLAGS) $(STASK_CFLAGS) $< + +$(UTASK_COBJS): %.o: %.c + $(CC) -c $(CFLAGS) $(UTASK_CFLAGS) $< + +$(UTASK_COBJS:.o=.s): %.s: %.c + $(CC) -S $(CFLAGS) $(UTASK_CFLAGS) $< + +$(UTASK_CXXOBJS): %.o: %.cpp + $(CXX) -c $(CFLAGS) $(UTASK_CFLAGS) $< + +$(UTASK_CXXOBJS:.o=.s): %.s: %.cpp + $(CXX) -S $(CFLAGS) $(UTASK_CFLAGS) $< + +$(UTASK_ASMOBJS): %.o: %.S + $(CC) -c $(CFLAGS) $(UTASK_CFLAGS) $< + +# +# 依存関係作成ルールの定義 +# +$(KERNEL_COBJS:.o=.d): %.d: %.c + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \ + -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend + +$(KERNEL_LCSRCS:.c=.d): %.d: %.c + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) -T "$($*)" \ + -O "$(foreach sym,$($*),-D__$(sym:.o=)) \ + $(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend + +$(KERNEL_LCOBJS:.o=.d): %.d: + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) -T $*.o \ + -O "-D__$(*F) $(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend + +$(KERNEL_ASMOBJS:.o=.d): %.d: %.S + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \ + -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend + +$(STASK_COBJS:.o=.d): %.d: %.c + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \ + -O "$(CFLAGS) $(STASK_CFLAGS)" $< >> Makefile.depend + +$(STASK_ASMOBJS:.o=.d): %.d: %.S + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \ + -O "$(CFLAGS) $(STASK_CFLAGS)" $< >> Makefile.depend + +$(UTASK_COBJS:.o=.d): %.d: %.c + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \ + -O "$(CFLAGS) $(UTASK_CFLAGS)" $< >> Makefile.depend + +$(UTASK_CXXOBJS:.o=.d): %.d: %.cpp + @$(PERL) $(SRCDIR)/utils/makedep -C $(CXX) \ + -O "$(CFLAGS) $(UTASK_CFLAGS)" $< >> Makefile.depend + +$(UTASK_ASMOBJS:.o=.d): %.d: %.S + @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \ + -O "$(CFLAGS) $(UTASK_CFLAGS)" $< >> Makefile.depend + +# +# デフォルトコンパイルルールを上書き +# +%.o: %.c + @echo "*** Default compile rules should not be used." + $(CC) -c $(CFLAGS) $< + +%.s: %.c + @echo "*** Default compile rules should not be used." + $(CC) -S $(CFLAGS) $< + +%.o: %.cpp + @echo "*** Default compile rules should not be used." + $(CXX) -c $(CFLAGS) $< + +%.s: %.cpp + @echo "*** Default compile rules should not be used." + $(CXX) -S $(CFLAGS) $< + +%.o: %.S + @echo "*** Default compile rules should not be used." + $(CC) -c $(CFLAGS) $< diff --git a/uzume_prototype/kernel/sample/cxx_sample1.cfg b/uzume_prototype/kernel/sample/cxx_sample1.cfg new file mode 100644 index 0000000..7028fdc --- /dev/null +++ b/uzume_prototype/kernel/sample/cxx_sample1.cfg @@ -0,0 +1,29 @@ +/* + * @(#) $Id: cxx_sample1.cfg,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * C++サンプルプログラム(1)のシステムコンフィギュレーションファイル + */ + +#define _MACRO_ONLY +#include "cxx_sample1.h" + +INCLUDE("\"cxx_sample1.h\""); +CRE_TSK(TASK1, { TA_HLNG, (VP_INT) 1, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(TASK2, { TA_HLNG, (VP_INT) 2, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(TASK3, { TA_HLNG, (VP_INT) 3, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(MAIN_TASK, { TA_HLNG|TA_ACT, 0, main_task, MAIN_PRIORITY, + STACK_SIZE, NULL }); +DEF_TEX(TASK1, { TA_HLNG, tex_routine }); +DEF_TEX(TASK2, { TA_HLNG, tex_routine }); +DEF_TEX(TASK3, { TA_HLNG, tex_routine }); +CRE_CYC(CYCHDR1, { TA_HLNG, 0, cyclic_handler, 2000, 0 }); +#ifdef CPUEXC1 +DEF_EXC(CPUEXC1, { TA_HLNG, cpuexc_handler} ); +#endif /* CPUEXC1 */ + +#include "@(SRCDIR)/systask/cxxrt.cfg" +#include "@(SRCDIR)/systask/timer.cfg" +#include "@(SRCDIR)/systask/serial.cfg" +#include "@(SRCDIR)/systask/logtask.cfg" diff --git a/uzume_prototype/kernel/sample/cxx_sample1.cpp b/uzume_prototype/kernel/sample/cxx_sample1.cpp new file mode 100644 index 0000000..0bfca49 --- /dev/null +++ b/uzume_prototype/kernel/sample/cxx_sample1.cpp @@ -0,0 +1,418 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2003-2004 Takagi Nobuhisa + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: cxx_sample1.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * C++サンプルプログラム(1)の本体 + * + * JSPカーネルの基本的な動作を確認するためのサンプルプログラム. + * + * プログラムの概要: + * + * ユーザインタフェースを受け持つメインタスク(タスクID: MAIN_TASK, + * 優先度: MAIN_PRIORITY)と,三つの並列実行されるタスク(タスクID: + * TASK1〜TASK3,初期優先度: MID_PRIORITY)で構成される.また,起動周 + * 期が2秒の周期ハンドラ(周期ハンドラID: CYCHDR1)を用いる. + * + * 並列実行されるタスクは,task_loop 回空ループを実行する度に,タスク + * が実行中であることをあらわすメッセージを表示する. + * + * 周期ハンドラは,三つの優先度(HIGH_PRIORITY,MID_PRIORITY, + * LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は, + * 周期ハンドラは停止状態になっている. + * + * メインタスクは,シリアルI/Oポートからの文字入力を行い(文字入力を + * 待っている間は,並列実行されるタスクが実行されている),入力された + * 文字に対応した処理を実行する.入力された文字と処理の関係は次の通り. + * Control-C または 'Q' が入力されると,プログラムを終了する. + * + * '1' : 以降のコマンドは TASK1 に対して行う. + * '2' : 以降のコマンドは TASK2 に対して行う. + * '3' : 以降のコマンドは TASK3 に対して行う. + * 'a' : タスクを act_tsk により起動する. + * 'A' : タスクに対する起動要求を can_act によりキャンセルする. + * 'e' : タスクに ext_tsk を呼び出させ,終了させる. + * 't' : タスクを ter_tsk により強制終了する. + * '>' : タスクの優先度を HIGH_PRIORITY にする. + * '=' : タスクの優先度を MID_PRIORITY にする. + * '<' : タスクの優先度を LOW_PRIORITY にする. + * 'G' : タスクの優先度を get_pri で読み出す. + * 's' : タスクに slp_tsk を呼び出させ,起床待ちにさせる. + * 'S' : タスクに tslp_tsk(10秒) を呼び出させ,起床待ちにさせる. + * 'w' : タスクを wup_tsk により起床する. + * 'W' : タスクに対する起床要求を can_wup によりキャンセルする. + * 'l' : タスクを rel_wai により強制的に待ち解除にする. + * 'u' : タスクを sus_tsk により強制待ち状態にする. + * 'm' : タスクの強制待ち状態を rsm_tsk により解除する. + * 'M' : タスクの強制待ち状態を frsm_tsk により強制解除する. + * 'd' : タスクに dly_tsk(10秒) を呼び出させ,時間経過待ちにさせる. + * 'x' : タスクにパターン 0x0001 の例外処理を要求する. + * 'X' : タスクにパターン 0x0002 の例外処理を要求する. + * 'y' : タスクに dis_tex を呼び出させ,タスク例外を禁止する. + * 'Y' : タスクに ena_tex を呼び出させ,タスク例外を許可する. + * 'r' : 三つの優先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)の + * レディキューを回転させる. + * 'c' : 周期ハンドラを動作させる. + * 'C' : 周期ハンドラを停止させる. + * 'z' : CPU例外を発生させる. + * 'Z' : CPUロック状態でCPU例外を発生させる(プログラムを終了する). + * 'V' : vxget_tim で性能評価用システム時刻を2回読む. + * 'v' : 発行したシステムコールを表示する(デフォルト). + * 'q' : 発行したシステムコールを表示しない. + */ + +#include +#include "kernel_id.h" +#include "cxx_sample1.h" + +/* + * 並行実行されるタスクへのメッセージ領域 + */ +char message[3]; + +/* + * ループ回数 + */ +UW task_loop; /* タスク内でのループ回数 */ +UW tex_loop; /* 例外処理ルーチン内でのループ回数 */ + +/* + * 並行実行されるタスク + */ +void task(VP_INT exinf) +{ + _toppers_cxxrt_reset_specific(); + + volatile UW i; + INT n = 0; + INT tskno = (INT) exinf; + char *graph[] = { "|", " +", " *" }; + char c; + + ena_tex(); + while (1) { + syslog(LOG_NOTICE, "task%d is running (%03d). %s", + tskno, ++n, graph[tskno-1]); + for (i = 0; i < task_loop; i++); + c = message[tskno-1]; + message[tskno-1] = 0; + switch (c) { + case 'e': + syslog(LOG_INFO, "#%d#ext_tsk()", tskno); + ext_tsk(); + case 's': + syslog(LOG_INFO, "#%d#slp_tsk()", tskno); + syscall(slp_tsk()); + break; + case 'S': + syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno); + syscall(tslp_tsk(10000)); + break; + case 'd': + syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno); + syscall(dly_tsk(10000)); + break; + case 'y': + syslog(LOG_INFO, "#%d#dis_tex()", tskno); + syscall(dis_tex()); + break; + case 'Y': + syslog(LOG_INFO, "#%d#ena_tex()", tskno); + syscall(ena_tex()); + break; +#ifdef CPUEXC1 + case 'z': + syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); + RAISE_CPU_EXCEPTION; + break; + case 'Z': + loc_cpu(); + syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); + RAISE_CPU_EXCEPTION; + unl_cpu(); + break; +#endif /* CPUEXC1 */ + default: + break; + } + } +} + +/* + * 並行して実行されるタスク用のタスク例外処理ルーチン + */ +void tex_routine(TEXPTN texptn, VP_INT exinf) +{ + volatile UW i; + INT tskno = (INT) exinf; + + syslog(LOG_NOTICE, "task%d receives exception 0x%04x. ", + tskno, texptn); + for (i = 0; i < tex_loop; i++); + + if (texptn & 0x8000) { + syslog(LOG_INFO, "#%d#ext_tsk()", tskno); + ext_tsk(); + } +} + +/* + * CPU例外ハンドラ + */ +#ifdef CPUEXC1 + +void +cpuexc_handler(VP p_excinf) +{ + ID tskid; + + syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", + p_excinf); + if (sns_ctx() != TRUE) { + syslog(LOG_WARNING, + "sns_ctx() is not TRUE in CPU exception handler."); + } + if (sns_dpn() != TRUE) { + syslog(LOG_WARNING, + "sns_dpn() is not TRUE in CPU exception handler."); + } + syslog(LOG_DEBUG, + "sns_loc = %d sns_dsp = %d", sns_loc(), sns_dsp()); + syslog(LOG_DEBUG, + "vxsns_loc = %d vxsns_ctx = %d vxsns_dsp = %d vxsns_dpn = %d", + vxsns_loc(p_excinf), vxsns_ctx(p_excinf), + vxsns_dsp(p_excinf), vxsns_dpn(p_excinf)); + + if (!vxsns_loc(p_excinf) && !vxsns_ctx(p_excinf)) { + syscall(iget_tid(&tskid)); + syscall(iras_tex(tskid, 0x8000)); + } + else { + syslog(LOG_NOTICE, "Sample program ends with exception."); + kernel_exit(); + } +} + +#endif /* CPUEXC1 */ + +/* + * 周期ハンドラ + * + * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー + * を回転させる. + */ +void cyclic_handler(VP_INT exinf) +{ + irot_rdq(HIGH_PRIORITY); + irot_rdq(MID_PRIORITY); + irot_rdq(LOW_PRIORITY); +} + +/* + * メインタスク + */ +void main_task(VP_INT exinf) +{ + char c; + ID tskid = TASK1; + volatile UW i; + INT tskno = 1; + ER_UINT ercd; + PRI tskpri; + SYSTIM stime1, stime2; +#ifndef OMIT_VGET_TIM + SYSUTIM utime1, utime2; +#endif /* OMIT_VGET_TIM */ + + vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); + syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", exinf); + + syscall(serial_ctl_por(TASK_PORTID, + (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); + + /* + * ループ回数の設定 + */ + task_loop = LOOP_REF; + get_tim(&stime1); + for (i = 0; i < task_loop; i++); + get_tim(&stime2); + task_loop = LOOP_REF * 400 / (stime2 - stime1); + tex_loop = task_loop / 5; + + /* + * タスクの起動 + */ + act_tsk(TASK1); + act_tsk(TASK2); + act_tsk(TASK3); + + /* + * メインループ + */ + do { + syscall(serial_rea_dat(TASK_PORTID, &c, 1)); + switch (c) { + case 'e': + case 's': + case 'S': + case 'd': + case 'y': + case 'Y': + case 'z': + case 'Z': + message[tskno-1] = c; + break; + case '1': + tskno = 1; + tskid = TASK1; + break; + case '2': + tskno = 2; + tskid = TASK2; + break; + case '3': + tskno = 3; + tskid = TASK3; + break; + case 'a': + syslog(LOG_INFO, "#act_tsk(%d)", tskno); + syscall(act_tsk(tskid)); + break; + case 'A': + syslog(LOG_INFO, "#can_act(%d)", tskno); + syscall(ercd = can_act(tskid)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "can_act(%d) returns %d", + tskno, ercd); + } + break; + case 't': + syslog(LOG_INFO, "#ter_tsk(%d)", tskno); + syscall(ter_tsk(tskid)); + break; + case '>': + syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno); + chg_pri(tskid, HIGH_PRIORITY); + break; + case '=': + syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno); + chg_pri(tskid, MID_PRIORITY); + break; + case '<': + syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno); + chg_pri(tskid, LOW_PRIORITY); + break; + case 'G': + syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno); + syscall(ercd = get_pri(tskid, &tskpri)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "priority of task %d is %d", + tskno, tskpri); + } + break; + case 'w': + syslog(LOG_INFO, "#wup_tsk(%d)", tskno); + syscall(wup_tsk(tskid)); + break; + case 'W': + syslog(LOG_INFO, "#can_wup(%d)", tskno); + syscall(ercd = can_wup(tskid)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "can_wup(%d) returns %d", + tskno, ercd); + } + break; + case 'l': + syslog(LOG_INFO, "#rel_wai(%d)", tskno); + syscall(rel_wai(tskid)); + break; + case 'u': + syslog(LOG_INFO, "#sus_tsk(%d)", tskno); + syscall(sus_tsk(tskid)); + break; + case 'm': + syslog(LOG_INFO, "#rsm_tsk(%d)", tskno); + syscall(rsm_tsk(tskid)); + break; + case 'M': + syslog(LOG_INFO, "#frsm_tsk(%d)", tskno); + syscall(frsm_tsk(tskid)); + break; + case 'x': + syslog(LOG_INFO, "#ras_tex(%d, 0x0001)", tskno); + syscall(ras_tex(tskid, 0x0001)); + break; + case 'X': + syslog(LOG_INFO, "#ras_tex(%d, 0x0002)", tskno); + syscall(ras_tex(tskid, 0x0002)); + break; + case 'r': + syslog(LOG_INFO, "#rot_rdq(three priorities)"); + rot_rdq(HIGH_PRIORITY); + rot_rdq(MID_PRIORITY); + rot_rdq(LOW_PRIORITY); + break; + case 'c': + sta_cyc(CYCHDR1); + break; + case 'C': + stp_cyc(CYCHDR1); + break; +#ifndef OMIT_VGET_TIM + case 'V': + syscall(vxget_tim(&utime1)); + syscall(vxget_tim(&utime2)); + syslog(LOG_NOTICE, "utime1 = %d, utime2 = %d", + (UINT) utime1, (UINT) utime2); + break; +#endif /* OMIT_VGET_TIM */ + case 'v': + vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); + break; + case 'q': + vmsk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG)); + break; + default: + break; + } + } while (c != '\003' && c != 'Q'); + + syslog(LOG_NOTICE, "Sample program ends."); + kernel_exit(); +} diff --git a/uzume_prototype/kernel/sample/cxx_sample1.h b/uzume_prototype/kernel/sample/cxx_sample1.h new file mode 100644 index 0000000..cd88388 --- /dev/null +++ b/uzume_prototype/kernel/sample/cxx_sample1.h @@ -0,0 +1,176 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2003-2004 Takagi Nobuhisa + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: cxx_sample1.h,v 1.2 2010/05/02 04:43:16 suikan Exp $ + */ + +/* + * C++サンプルプログラム(1)のヘッダファイル + */ + +#include + +/* + * 各タスクの優先度の定義 + */ + +#define MAIN_PRIORITY 5 /* メインタスクの優先度 */ + /* HIGH_PRIORITY より高くすること */ + +#define HIGH_PRIORITY 9 /* 並列に実行されるタスクの優先度 */ +#define MID_PRIORITY 10 +#define LOW_PRIORITY 11 + +/* + * ターゲット依存の定義(CPU例外ハンドラの起動方法など) + */ + +#ifdef M68K + +#define CPUEXC1 5 /* ゼロ除算例外 */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) + +#elif defined(SH3) + +#define CPUEXC1 224 /* ロードエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) + +#elif defined(SH1) + +#define CPUEXC1 9 /* CPUアドレスエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) +#ifdef TOKIWA_SH1 +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#endif /* TOKIWA_SH1 */ + +#elif defined(ARMV4) + +#define CPUEXC1 4 /* ロードエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) + +#elif defined(V850) + +#elif defined(H8) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ + +#elif defined(H8S) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define LOOP_REF 4000L /* 速度計測用のループ回数 */ + +#elif defined(MICROBLAZE) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define STACK_SIZE 2048 /* タスクのスタックサイズ */ + +#elif defined(IA32) + +#define CPUEXC1 0 /* ゼロ除算例外 */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) +#define OMIT_VGET_TIM + +#elif defined(TMS320C54X) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define STACK_SIZE 320 /* タスクのスタックサイズ */ +#define LOOP_REF 500000L /* 速度計測用のループ回数 */ + +#elif defined(XSTORMY16) + +#define CPUEXC1 0 /* 無効命令例外 */ +#define RAISE_CPU_EXCEPTION __asm__( ".hword 0x0006" ) +#define OMIT_VGET_TIM /* vxget_tim()は非サポート */ +#define LOOP_REF 4000L /* 速度計測用のループ回数 */ +#define STACK_SIZE 256 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* SIOはポート2を用いる */ + +#elif defined(MIPS3) || defined(MIPS64) + +#define CPUEXC1 Bp /* ブレークポイント例外(ゼロ除算時に発生) */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) + +#elif defined(LINUX) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define OMIT_VGET_TIM +#define LOOP_REF 4000000 /* 速度計測用のループ回数 */ + +#elif defined(NIOS2) + +#define CPUEXC1 0 /* 未実装命令例外 */ +#define RAISE_CPU_EXCEPTION Asm("div zero, zero, zero"); + +#endif + +/* + * ターゲットに依存する可能性のある定数の定義 + */ + +#ifndef TASK_PORTID +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ +#endif /* TASK_PORTID */ + +#ifndef STACK_SIZE +#define STACK_SIZE 1024 /* タスクのスタックサイズ */ +#endif /* STACK_SIZE */ + +#ifndef LOOP_REF +#define LOOP_REF 1000000 /* 速度計測用のループ回数 */ +#endif /* LOOP_REF */ + +/* + * 関数のプロトタイプ宣言 + */ +#ifndef _MACRO_ONLY + +#ifdef __cplusplus +extern "C" { +#endif + +extern void task(VP_INT tskno); +extern void main_task(VP_INT exinf); +extern void tex_routine(TEXPTN texptn, VP_INT tskno); +extern void cyclic_handler(VP_INT exinf); +extern void cpuexc_handler(VP p_excinf); +extern void _toppers_cxxrt_reset_specific(void) throw(); + +#ifdef __cplusplus +} +#endif + +#endif /* _MACRO_ONLY */ diff --git a/uzume_prototype/kernel/sample/cxx_sample2.cfg b/uzume_prototype/kernel/sample/cxx_sample2.cfg new file mode 100644 index 0000000..e9293bc --- /dev/null +++ b/uzume_prototype/kernel/sample/cxx_sample2.cfg @@ -0,0 +1,28 @@ +/* + * @(#) $Id: cxx_sample2.cfg,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +#define _MACRO_ONLY +#include "cxx_sample2.h" + +INCLUDE("\"cxx_sample2.h\""); +CRE_TSK(MAIN_TASK, { TA_HLNG | TA_ACT, 0, main_task, MAIN_PRIORITY, + STACK_SIZE, NULL }); +CRE_TSK(1, { TA_HLNG, (VP_INT) 1, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(2, { TA_HLNG, (VP_INT) 2, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(3, { TA_HLNG, (VP_INT) 3, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(4, { TA_HLNG, (VP_INT) 4, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(5, { TA_HLNG, (VP_INT) 5, task, MID_PRIORITY, STACK_SIZE, NULL }); + +CRE_SEM(1, { TA_TFIFO, 1, 1 }); +CRE_SEM(2, { TA_TFIFO, 1, 1 }); +CRE_SEM(3, { TA_TFIFO, 1, 1 }); +CRE_SEM(4, { TA_TFIFO, 1, 1 }); +CRE_SEM(5, { TA_TFIFO, 1, 1 }); + +CRE_FLG(EVENT_FLAG1, { TA_TFIFO | TA_WSGL, 0 }); + +#include "@(SRCDIR)/systask/cxxrt.cfg" +#include "@(SRCDIR)/systask/timer.cfg" +#include "@(SRCDIR)/systask/serial.cfg" +#include "@(SRCDIR)/systask/logtask.cfg" diff --git a/uzume_prototype/kernel/sample/cxx_sample2.cpp b/uzume_prototype/kernel/sample/cxx_sample2.cpp new file mode 100644 index 0000000..c71014b --- /dev/null +++ b/uzume_prototype/kernel/sample/cxx_sample2.cpp @@ -0,0 +1,265 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2003-2004 Takagi Nobuhisa + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: cxx_sample2.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * C++サンプルプログラム(2)の本体 + * + * このサンプルプログラムは「哲学者の食事」をベースとして、C++の各機能 + * のデモを行っている。 + * 5人の哲学者が左右のフォークを取る際、故意にデッドロックを発生させ、 + * タイムアウトを検出した時点でC++の例外を送出している。 + * + * 動作中に'q'を入力すると動作を停止することができ、restart? [y|n]に対 + * して'y'を入力すれば再起動、'n'を入力すれば終了する。 + * また、動作中に'a'を入力すればアボートする。 + */ + +#include +#include +#include +#include "kernel_id.h" +#include "cxx_sample2.h" + +// 非マルチタスクテストクラス +// 静的オブジェクトのコンストラクタとデストラクタの動作サンプル +class non_multitask_test +{ + int* x_; +public: + non_multitask_test() + : x_(new int(12345)) // カーネル非動作状態でのnew演算子 + { + } + ~non_multitask_test() + { + if (*x_== 12345) + syslog(LOG_NOTICE,"non-multitask test succeeded"); + else + syslog(LOG_NOTICE,"non-multitask test failed"); + delete x_; // カーネル非動作状態でのdelete演算子 + x_ = 0; + } +} test; + +class timeout_error +{ +}; + +// 擬似乱数 +int rnd() +{ + static unsigned int seed = 1; + loc_cpu(); + seed = seed * 1566083941UL + 1; + unl_cpu(); + return (seed >> 16) % 0x7fff; +} + +// フォーククラス +class fork +{ + ID semid_; + bool used_; +public: + explicit fork(int semid) + : semid_(semid), used_(false) + { + } + ~fork() + { + if (used_) + give(); + } + ID id() const { return semid_; } + bool is_used() const { return used_; } + void take() + { + if (twai_sem(semid_, 500*5) == E_TMOUT) + throw timeout_error(); + used_ = true; + } + void give() + { + used_ = false; + sig_sem(semid_); + } +}; + +fork* p_fork[5]; + +// 哲学者クラス +class philosopher +{ + ID tskid_; + fork* left_; + fork* right_; +public: + explicit philosopher(int tskid, fork* left, fork* right) + : tskid_(tskid), + left_(left), right_(right) + { + syslog(LOG_NOTICE,"philosofer #%d", tskid); + } + void think() + { + syslog(LOG_NOTICE, "#%d thinking...", tskid_); + dly_tsk(100 * (rnd() % 5 + 1)); + } + void eat() + { + syslog(LOG_NOTICE, "#%d eat up", tskid_); + dly_tsk(100 * (rnd() % 5 + 1)); + } + void run() + { + for (;;) + { + try + { + // 意図的にデッドロックを発生させる。 + left_->take(); + syslog(LOG_NOTICE, "#%d take left fork(%d)", tskid_, left_->id()); + + dly_tsk(100 * (rnd() % 5 + 1)); + + right_->take(); + syslog(LOG_NOTICE, "#%d take right fork(%d)", tskid_, right_->id()); + + eat(); + + left_->give(); + syslog(LOG_NOTICE, "#%d give left fork(%d)", tskid_, left_->id()); + right_->give(); + syslog(LOG_NOTICE, "#%d give right fork(%d)", tskid_, right_->id()); + think(); + } + catch (timeout_error&) + { + // タイムアウトによりデッドロックを検出すると、フォークを放す。 + syslog(LOG_NOTICE, "#%d !!!! timeout error !!!!", tskid_); + if (left_->is_used()) + { + left_->give(); + syslog(LOG_NOTICE, "#%d give left fork(%d)", tskid_, left_->id()); + } + if (right_->is_used()) + { + right_->give(); + syslog(LOG_NOTICE, "#%d give right fork(%d)", tskid_, right_->id()); + } + rot_rdq(TPRI_SELF); + } + } + } +}; + +void task(VP_INT exinf) +{ + _toppers_cxxrt_reset_specific(); // タスクの再起動を可能にするための初期化処理 + ID tskid = ID(exinf); + fork* left = p_fork[(tskid - 1) % 5]; + fork* right = p_fork[(tskid - 1 + 4) % 5]; + philosopher phil(tskid, left, right); + phil.run(); +} + +// std::atexitで登録する終了時関数 +void finish() +{ + syslog(LOG_NOTICE, "finish"); +} + + +// メインタスク +void main_task(VP_INT exinf) +{ + serial_ctl_por(TASK_PORTID, (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV)); + syslog(LOG_NOTICE,"Sample program starts (exinf = %d)", exinf); + + std::atexit(finish); + + try + { + for (;;) + { + for (ID semid = 1; semid <= 5; semid++) + p_fork[semid - 1] = new fork(semid); + + for (ID tskid = 1; tskid <= 5; tskid++) + act_tsk(tskid); + + char c; + do + { + serial_rea_dat(TASK_PORTID, &c, 1); + if (c == 'a') + std::abort(); + } while (c != 'q' && c != 'Q'); + + for (ID tskid = 1; tskid <= 5; tskid++) + { + ter_tsk(tskid); + } + + for (ID semid = 1; semid <= 5; semid++) + { + delete p_fork[semid - 1]; + p_fork[semid - 1] = 0; + } + + do + { + syslog(LOG_NOTICE, "restart? [y|n] "); + serial_rea_dat(TASK_PORTID, &c, 1); + } while (c != 'y' && c != 'n'); + + if (c == 'n') + break; + } + + syslog(LOG_NOTICE, "multitask test succeeded"); + } + catch (std::bad_alloc&) + { + syslog(LOG_NOTICE, "multitask test failed"); + } + + std::exit(0); +} + diff --git a/uzume_prototype/kernel/sample/cxx_sample2.h b/uzume_prototype/kernel/sample/cxx_sample2.h new file mode 100644 index 0000000..90b1a76 --- /dev/null +++ b/uzume_prototype/kernel/sample/cxx_sample2.h @@ -0,0 +1,165 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2003-2004 Takagi Nobuhisa + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: cxx_sample2.h,v 1.2 2010/05/09 04:22:42 suikan Exp $ + */ + +#include + +/* + * 各タスクの優先度の定義 + */ + +#define MAIN_PRIORITY 5 /* メインタスクの優先度 */ + /* HIGH_PRIORITY より高くすること */ + +#define HIGH_PRIORITY 9 /* 並列に実行されるタスクの優先度 */ +#define MID_PRIORITY 10 +#define LOW_PRIORITY 11 + +/* + * ターゲット依存の定義(CPU例外ハンドラの起動方法など) + */ + +#ifdef M68K + +#define CPUEXC1 5 /* ゼロ除算例外 */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) + +#elif defined(SH3) + +#define CPUEXC1 224 /* ロードエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) + +#elif defined(SH1) + +#define CPUEXC1 9 /* CPUアドレスエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) +#ifdef TOKIWA_SH1 +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#endif /* TOKIWA_SH1 */ + +#elif defined(ARMV4) + +#define CPUEXC1 4 /* ロードエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) + +#elif defined(V850) + +#elif defined(H8) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ + +#elif defined(H8S) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define LOOP_REF 4000L /* 速度計測用のループ回数 */ + +#elif defined(MICROBLAZE) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define STACK_SIZE 2048 /* タスクのスタックサイズ */ + +#elif defined(IA32) + +#define CPUEXC1 0 /* ゼロ除算例外 */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) +#define OMIT_VGET_TIM + +#elif defined(TMS320C54X) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define STACK_SIZE 320 /* タスクのスタックサイズ */ +#define LOOP_REF 500000L /* 速度計測用のループ回数 */ + +#elif defined(XSTORMY16) + +#define CPUEXC1 0 /* 無効命令例外 */ +#define RAISE_CPU_EXCEPTION __asm__( ".hword 0x0006" ) +#define OMIT_VGET_TIM /* vxget_tim()は非サポート */ +#define LOOP_REF 4000L /* 速度計測用のループ回数 */ +#define STACK_SIZE 256 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* SIOはポート2を用いる */ + +#elif defined(MIPS3) || defined(MIPS64) + +#define CPUEXC1 Bp /* ブレークポイント例外(ゼロ除算時に発生) */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) + +#elif defined(LINUX) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define OMIT_VGET_TIM +#define LOOP_REF 4000000 /* 速度計測用のループ回数 */ + +#elif defined(NIOS2) + +#define CPUEXC1 0 /* 未実装命令例外 */ +#define RAISE_CPU_EXCEPTION Asm("div zero, zero, zero"); + +#endif + +/* + * ターゲットに依存する可能性のある定数の定義 + */ + +#ifndef TASK_PORTID +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ +#endif /* TASK_PORTID */ + +#ifndef STACK_SIZE +#define STACK_SIZE 1024 /* タスクのスタックサイズ */ +#endif /* STACK_SIZE */ + +/* + * 関数のプロトタイプ宣言 + */ +#ifndef _MACRO_ONLY + +#ifdef __cplusplus +extern "C" { +#endif + +extern void main_task(VP_INT exinf); +extern void task(VP_INT exinf); +extern void _toppers_cxxrt_reset_specific(void) throw(); + +#ifdef __cplusplus +} +#endif + +#endif /* _MACRO_ONLY */ diff --git a/uzume_prototype/kernel/sample/sample1.c b/uzume_prototype/kernel/sample/sample1.c new file mode 100644 index 0000000..007ac04 --- /dev/null +++ b/uzume_prototype/kernel/sample/sample1.c @@ -0,0 +1,417 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2004-2006 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: sample1.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * サンプルプログラム(1)の本体 + * + * JSPカーネルの基本的な動作を確認するためのサンプルプログラム. + * + * プログラムの概要: + * + * ユーザインタフェースを受け持つメインタスク(タスクID: MAIN_TASK, + * 優先度: MAIN_PRIORITY)と,三つの並列実行されるタスク(タスクID: + * TASK1〜TASK3,初期優先度: MID_PRIORITY)で構成される.また,起動周 + * 期が2秒の周期ハンドラ(周期ハンドラID: CYCHDR1)を用いる. + * + * 並列実行されるタスクは,task_loop 回空ループを実行する度に,タスク + * が実行中であることをあらわすメッセージを表示する. + * + * 周期ハンドラは,三つの優先度(HIGH_PRIORITY,MID_PRIORITY, + * LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は, + * 周期ハンドラは停止状態になっている. + * + * メインタスクは,シリアルI/Oポートからの文字入力を行い(文字入力を + * 待っている間は,並列実行されるタスクが実行されている),入力された + * 文字に対応した処理を実行する.入力された文字と処理の関係は次の通り. + * Control-C または 'Q' が入力されると,プログラムを終了する. + * + * '1' : 以降のコマンドは TASK1 に対して行う. + * '2' : 以降のコマンドは TASK2 に対して行う. + * '3' : 以降のコマンドは TASK3 に対して行う. + * 'a' : タスクを act_tsk により起動する. + * 'A' : タスクに対する起動要求を can_act によりキャンセルする. + * 'e' : タスクに ext_tsk を呼び出させ,終了させる. + * 't' : タスクを ter_tsk により強制終了する. + * '>' : タスクの優先度を HIGH_PRIORITY にする. + * '=' : タスクの優先度を MID_PRIORITY にする. + * '<' : タスクの優先度を LOW_PRIORITY にする. + * 'G' : タスクの優先度を get_pri で読み出す. + * 's' : タスクに slp_tsk を呼び出させ,起床待ちにさせる. + * 'S' : タスクに tslp_tsk(10秒) を呼び出させ,起床待ちにさせる. + * 'w' : タスクを wup_tsk により起床する. + * 'W' : タスクに対する起床要求を can_wup によりキャンセルする. + * 'l' : タスクを rel_wai により強制的に待ち解除にする. + * 'u' : タスクを sus_tsk により強制待ち状態にする. + * 'm' : タスクの強制待ち状態を rsm_tsk により解除する. + * 'M' : タスクの強制待ち状態を frsm_tsk により強制解除する. + * 'd' : タスクに dly_tsk(10秒) を呼び出させ,時間経過待ちにさせる. + * 'x' : タスクにパターン 0x0001 の例外処理を要求する. + * 'X' : タスクにパターン 0x0002 の例外処理を要求する. + * 'y' : タスクに dis_tex を呼び出させ,タスク例外を禁止する. + * 'Y' : タスクに ena_tex を呼び出させ,タスク例外を許可する. + * 'r' : 三つの優先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)の + * レディキューを回転させる. + * 'c' : 周期ハンドラを動作させる. + * 'C' : 周期ハンドラを停止させる. + * 'z' : CPU例外を発生させる. + * 'Z' : CPUロック状態でCPU例外を発生させる(プログラムを終了する). + * 'V' : vxget_tim で性能評価用システム時刻を2回読む. + * 'v' : 発行したシステムコールを表示する(デフォルト). + * 'q' : 発行したシステムコールを表示しない. + */ + +#include +#include "kernel_id.h" +#include "sample1.h" + +/* + * 並行実行されるタスクへのメッセージ領域 + */ +char message[3]; + +/* + * ループ回数 + */ +UW task_loop; /* タスク内でのループ回数 */ +UW tex_loop; /* 例外処理ルーチン内でのループ回数 */ + +/* + * 並行実行されるタスク + */ +void task(VP_INT exinf) +{ + volatile UW i; + INT n = 0; + INT tskno = (INT) exinf; + const char *graph[] = { "|", " +", " *" }; + char c; + + ena_tex(); + while (1) { + syslog(LOG_NOTICE, "task%d is running (%03d). %s", + tskno, ++n, graph[tskno-1]); + for (i = 0; i < task_loop; i++); + c = message[tskno-1]; + message[tskno-1] = 0; + switch (c) { + case 'e': + syslog(LOG_INFO, "#%d#ext_tsk()", tskno); + ext_tsk(); + case 's': + syslog(LOG_INFO, "#%d#slp_tsk()", tskno); + syscall(slp_tsk()); + break; + case 'S': + syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno); + syscall(tslp_tsk(10000)); + break; + case 'd': + syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno); + syscall(dly_tsk(10000)); + break; + case 'y': + syslog(LOG_INFO, "#%d#dis_tex()", tskno); + syscall(dis_tex()); + break; + case 'Y': + syslog(LOG_INFO, "#%d#ena_tex()", tskno); + syscall(ena_tex()); + break; +#ifdef CPUEXC1 + case 'z': + syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); + RAISE_CPU_EXCEPTION; + break; + case 'Z': + loc_cpu(); + syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); + RAISE_CPU_EXCEPTION; + unl_cpu(); + break; +#endif /* CPUEXC1 */ + default: + break; + } + } +} + +/* + * 並行して実行されるタスク用のタスク例外処理ルーチン + */ +void tex_routine(TEXPTN texptn, VP_INT exinf) +{ + volatile UW i; + INT tskno = (INT) exinf; + + syslog(LOG_NOTICE, "task%d receives exception 0x%04x. ", + tskno, texptn); + for (i = 0; i < tex_loop; i++); + + if (texptn & 0x8000) { + syslog(LOG_INFO, "#%d#ext_tsk()", tskno); + ext_tsk(); + } +} + +/* + * CPU例外ハンドラ + */ +#ifdef CPUEXC1 + +void +cpuexc_handler(VP p_excinf) +{ + ID tskid; + + syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", + p_excinf); + if (sns_ctx() != TRUE) { + syslog(LOG_WARNING, + "sns_ctx() is not TRUE in CPU exception handler."); + } + if (sns_dpn() != TRUE) { + syslog(LOG_WARNING, + "sns_dpn() is not TRUE in CPU exception handler."); + } + syslog(LOG_DEBUG, + "sns_loc = %d sns_dsp = %d", sns_loc(), sns_dsp()); + syslog(LOG_DEBUG, + "vxsns_loc = %d vxsns_ctx = %d vxsns_dsp = %d vxsns_dpn = %d", + vxsns_loc(p_excinf), vxsns_ctx(p_excinf), + vxsns_dsp(p_excinf), vxsns_dpn(p_excinf)); + + if (!vxsns_loc(p_excinf) && !vxsns_ctx(p_excinf)) { + syscall(iget_tid(&tskid)); + syscall(iras_tex(tskid, 0x8000)); + } + else { + syslog(LOG_NOTICE, "Sample program ends with exception."); + kernel_exit(); + } +} + +#endif /* CPUEXC1 */ + +/* + * 周期ハンドラ + * + * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー + * を回転させる. + */ +void cyclic_handler(VP_INT exinf) +{ + irot_rdq(HIGH_PRIORITY); + irot_rdq(MID_PRIORITY); + irot_rdq(LOW_PRIORITY); +} + +/* + * メインタスク + */ +void main_task(VP_INT exinf) +{ + char c; + ID tskid = TASK1; + volatile UW i; + INT tskno = 1; + ER_UINT ercd; + PRI tskpri; + SYSTIM stime1, stime2; +#ifndef OMIT_VGET_TIM + SYSUTIM utime1, utime2; +#endif /* OMIT_VGET_TIM */ + + vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); + syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (INT) exinf); + + syscall(serial_ctl_por(TASK_PORTID, + (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); + + /* + * ループ回数の設定 + */ + task_loop = LOOP_REF; + get_tim(&stime1); + for (i = 0; i < task_loop; i++); + get_tim(&stime2); + task_loop = LOOP_REF * 400 / (stime2 - stime1); + tex_loop = task_loop / 5; + + /* + * タスクの起動 + */ + act_tsk(TASK1); + act_tsk(TASK2); + act_tsk(TASK3); + + /* + * メインループ + */ + do { + syscall(serial_rea_dat(TASK_PORTID, &c, 1)); + switch (c) { + case 'e': + case 's': + case 'S': + case 'd': + case 'y': + case 'Y': + case 'z': + case 'Z': + message[tskno-1] = c; + break; + case '1': + tskno = 1; + tskid = TASK1; + break; + case '2': + tskno = 2; + tskid = TASK2; + break; + case '3': + tskno = 3; + tskid = TASK3; + break; + case 'a': + syslog(LOG_INFO, "#act_tsk(%d)", tskno); + syscall(act_tsk(tskid)); + break; + case 'A': + syslog(LOG_INFO, "#can_act(%d)", tskno); + syscall(ercd = can_act(tskid)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "can_act(%d) returns %d", + tskno, ercd); + } + break; + case 't': + syslog(LOG_INFO, "#ter_tsk(%d)", tskno); + syscall(ter_tsk(tskid)); + break; + case '>': + syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno); + chg_pri(tskid, HIGH_PRIORITY); + break; + case '=': + syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno); + chg_pri(tskid, MID_PRIORITY); + break; + case '<': + syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno); + chg_pri(tskid, LOW_PRIORITY); + break; + case 'G': + syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno); + syscall(ercd = get_pri(tskid, &tskpri)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "priority of task %d is %d", + tskno, tskpri); + } + break; + case 'w': + syslog(LOG_INFO, "#wup_tsk(%d)", tskno); + syscall(wup_tsk(tskid)); + break; + case 'W': + syslog(LOG_INFO, "#can_wup(%d)", tskno); + syscall(ercd = can_wup(tskid)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "can_wup(%d) returns %d", + tskno, ercd); + } + break; + case 'l': + syslog(LOG_INFO, "#rel_wai(%d)", tskno); + syscall(rel_wai(tskid)); + break; + case 'u': + syslog(LOG_INFO, "#sus_tsk(%d)", tskno); + syscall(sus_tsk(tskid)); + break; + case 'm': + syslog(LOG_INFO, "#rsm_tsk(%d)", tskno); + syscall(rsm_tsk(tskid)); + break; + case 'M': + syslog(LOG_INFO, "#frsm_tsk(%d)", tskno); + syscall(frsm_tsk(tskid)); + break; + case 'x': + syslog(LOG_INFO, "#ras_tex(%d, 0x0001)", tskno); + syscall(ras_tex(tskid, 0x0001)); + break; + case 'X': + syslog(LOG_INFO, "#ras_tex(%d, 0x0002)", tskno); + syscall(ras_tex(tskid, 0x0002)); + break; + case 'r': + syslog(LOG_INFO, "#rot_rdq(three priorities)"); + rot_rdq(HIGH_PRIORITY); + rot_rdq(MID_PRIORITY); + rot_rdq(LOW_PRIORITY); + break; + case 'c': + sta_cyc(CYCHDR1); + break; + case 'C': + stp_cyc(CYCHDR1); + break; +#ifndef OMIT_VGET_TIM + case 'V': + syscall(vxget_tim(&utime1)); + syscall(vxget_tim(&utime2)); + syslog(LOG_NOTICE, "utime1 = %d, utime2 = %d", + (UINT) utime1, (UINT) utime2); + break; +#endif /* OMIT_VGET_TIM */ + case 'v': + vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); + break; + case 'q': + vmsk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG)); + break; + default: + break; + } + } while (c != '\003' && c != 'Q'); + + syslog(LOG_NOTICE, "Sample program ends."); + kernel_exit(); +} diff --git a/uzume_prototype/kernel/sample/sample1.cfg b/uzume_prototype/kernel/sample/sample1.cfg new file mode 100644 index 0000000..715e3ac --- /dev/null +++ b/uzume_prototype/kernel/sample/sample1.cfg @@ -0,0 +1,28 @@ +/* + * @(#) $Id: sample1.cfg,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * サンプルプログラム(1)のシステムコンフィギュレーションファイル + */ + +#define _MACRO_ONLY +#include "sample1.h" + +INCLUDE("\"sample1.h\""); +CRE_TSK(TASK1, { TA_HLNG, (VP_INT) 1, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(TASK2, { TA_HLNG, (VP_INT) 2, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(TASK3, { TA_HLNG, (VP_INT) 3, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(MAIN_TASK, { TA_HLNG|TA_ACT, 0, main_task, MAIN_PRIORITY, + STACK_SIZE, NULL }); +DEF_TEX(TASK1, { TA_HLNG, tex_routine }); +DEF_TEX(TASK2, { TA_HLNG, tex_routine }); +DEF_TEX(TASK3, { TA_HLNG, tex_routine }); +CRE_CYC(CYCHDR1, { TA_HLNG, 0, cyclic_handler, 2000, 0 }); +#ifdef CPUEXC1 +DEF_EXC(CPUEXC1, { TA_HLNG, cpuexc_handler} ); +#endif /* CPUEXC1 */ + +#include "@(SRCDIR)/systask/timer.cfg" +#include "@(SRCDIR)/systask/serial.cfg" +#include "@(SRCDIR)/systask/logtask.cfg" diff --git a/uzume_prototype/kernel/sample/sample1.h b/uzume_prototype/kernel/sample/sample1.h new file mode 100644 index 0000000..670844f --- /dev/null +++ b/uzume_prototype/kernel/sample/sample1.h @@ -0,0 +1,215 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2005 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: sample1.h,v 1.3 2009/05/13 13:10:13 suikan Exp $ + */ + +/* + * サンプルプログラム(1)のヘッダファイル + */ + +#include + +/* + * 各タスクの優先度の定義 + */ + +#define MAIN_PRIORITY 5 /* メインタスクの優先度 */ + /* HIGH_PRIORITY より高くすること */ + +#define HIGH_PRIORITY 9 /* 並列に実行されるタスクの優先度 */ +#define MID_PRIORITY 10 +#define LOW_PRIORITY 11 + +/* + * ターゲット依存の定義(CPU例外ハンドラの起動方法など) + */ + +#ifdef M68K + +#define CPUEXC1 5 /* ゼロ除算例外 */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) + +#elif defined(SH3) + +#define CPUEXC1 224 /* ロードエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) + +#elif defined(SH1) + +#define CPUEXC1 9 /* CPUアドレスエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) +#ifdef TOKIWA_SH1 +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#endif /* TOKIWA_SH1 */ + +#elif defined(ARMV4) + +#define CPUEXC1 4 /* ロードエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) + +#elif defined(V850) + +#elif defined(H8) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ + +#elif defined(H8S) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define LOOP_REF 4000L /* 速度計測用のループ回数 */ + +#elif defined(MICROBLAZE) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define STACK_SIZE 2048 /* タスクのスタックサイズ */ + +#elif defined(IA32) + +#define CPUEXC1 0 /* ゼロ除算例外 */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) +#define OMIT_VGET_TIM + +#elif defined(TMS320C54X) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define STACK_SIZE 320 /* タスクのスタックサイズ */ +#define LOOP_REF 500000L /* 速度計測用のループ回数 */ + +#elif defined(XSTORMY16) + +#define CPUEXC1 0 /* 無効命令例外 */ +#define RAISE_CPU_EXCEPTION __asm__( ".hword 0x0006" ) +#define OMIT_VGET_TIM /* vxget_tim()は非サポート */ +#define LOOP_REF 4000L /* 速度計測用のループ回数 */ +#define STACK_SIZE 256 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* SIOはポート2を用いる */ + +#elif defined(MIPS3) || defined(MIPS64) + +#define CPUEXC1 Bp /* ブレークポイント例外(ゼロ除算時に発生) */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) + +#elif defined(M16C) && defined(OAKS16) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ + +#elif defined(M16C) && defined(OAKS16_MINI) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 384 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ + +#elif defined(M16C) && defined(M3029) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(BLACKFIN) + +#define CPUEXC1 0 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm("excpt 0;") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 1024 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(LINUX) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define OMIT_VGET_TIM +#define LOOP_REF 4000000 /* 速度計測用のループ回数 */ + +#elif defined(NIOS2) + +#define CPUEXC1 0 /* 未実装命令例外 */ +#define RAISE_CPU_EXCEPTION Asm("div zero, zero, zero"); + +#elif defined(M32C) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(M32R) + +#define CPUEXC1 EXC_TRAP00 +#define RAISE_CPU_EXCEPTION Asm("trap 0") + +#elif defined(TLCS_900) && defined(ZUP_F16_EX) + +#define CPUEXC1 3 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION Asm(" swi 2") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ +#define OMIT_VGET_TIM + +#endif + +/* + * ターゲットに依存する可能性のある定数の定義 + */ + +#ifndef TASK_PORTID +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ +#endif /* TASK_PORTID */ + +#ifndef STACK_SIZE +#define STACK_SIZE 8192 /* タスクのスタックサイズ */ +#endif /* STACK_SIZE */ + +#ifndef LOOP_REF +#define LOOP_REF 1000000 /* 速度計測用のループ回数 */ +#endif /* LOOP_REF */ + +/* + * 関数のプロトタイプ宣言 + */ +#ifndef _MACRO_ONLY + +extern void task(VP_INT tskno); +extern void main_task(VP_INT exinf); +extern void tex_routine(TEXPTN texptn, VP_INT tskno); +extern void cyclic_handler(VP_INT exinf); +extern void cpuexc_handler(VP p_excinf); + +#endif /* _MACRO_ONLY */ diff --git a/uzume_prototype/kernel/systask/cxxrt.c b/uzume_prototype/kernel/systask/cxxrt.c new file mode 100644 index 0000000..3e79747 --- /dev/null +++ b/uzume_prototype/kernel/systask/cxxrt.c @@ -0,0 +1,199 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2003-2004 by Takagi Nobuhisa + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: cxxrt.c,v 1.2 2010/05/02 04:43:52 suikan Exp $ + */ +#include "../kernel/jsp_kernel.h" +#include "../kernel/task.h" +#include "kernel_id.h" +extern void * malloc ( size_t size ); + +typedef int _toppers_cxxrt_sync_t; +typedef volatile char _toppers_cxxrt_once_t; + +static inline int _get_tid() +{ + return runtsk - tcb_table + TMIN_TSKID; +} + +/* + * For Syncronization + */ +int _toppers_cxxrt_lock(_toppers_cxxrt_sync_t *sync) +{ + if (iniflg) + dis_dsp(); + return 0; +} + +int _toppers_cxxrt_trylock(_toppers_cxxrt_sync_t *sync) +{ + return _toppers_cxxrt_lock(sync); +} + +int _toppers_cxxrt_unlock(_toppers_cxxrt_sync_t *sync) +{ + if (iniflg) + ena_dsp(); + return 0; +} + +int _toppers_cxxrt_get_tskid(void) +{ + return iniflg ? _get_tid() : 0; +} + +/* + * For recursive semaphore lock + */ +static ID cxxrt_holder; +static UINT cxxrt_counter; + +static inline void _toppers_cxxrt_recursive_semaphore_lock(ID semid) +{ + if (iniflg && !sns_dsp()) + { + ID tskid; + tskid = _get_tid(); + + if (cxxrt_holder != tskid) + { + wai_sem(semid); + cxxrt_holder = tskid; + } + ++cxxrt_counter; + } +} + +static inline void _toppers_cxxrt_recursive_semaphore_unlock(ID semid) +{ + if (iniflg && !sns_dsp()) + { + if (--cxxrt_counter == 0) + { + cxxrt_holder = 0; + sig_sem(semid); + } + } +} + + +/* + * For function call once + */ +int _toppers_cxxrt_once(_toppers_cxxrt_once_t *once, void (*func)(void)) +{ + if (!*once) + { + static _toppers_cxxrt_sync_t sync; + + _toppers_cxxrt_recursive_semaphore_lock(_CXXRT_SEM); + if (!*once) + { + (*func)(); + *once = 1; + } + _toppers_cxxrt_recursive_semaphore_unlock(_CXXRT_SEM); + } + return 0; +} + + +/* + * For task-local storage + */ +#ifndef CXXRT_KEY_MAX +#define CXXRT_KEY_MAX 2 +#endif + +struct _toppers_cxxrt_tls +{ + void **data; + void (*dtor)(void*); +}; + +extern const ID tmax_tskid; + +static void **tls_data[CXXRT_KEY_MAX]; +static struct _toppers_cxxrt_tls tls[CXXRT_KEY_MAX]; + +int _toppers_cxxrt_key_create(struct _toppers_cxxrt_tls **key, void (*dtor)(void*)) +{ + struct _toppers_cxxrt_tls *p; + + for (p = &tls[0]; p < &tls[CXXRT_KEY_MAX]; p++) + { + if (p->data == NULL) + { + p->data = tls_data[p - &tls[0]]; + p->dtor = dtor; + *key = p; + return 0; + } + } + return -1; +} + +int _toppers_cxxrt_key_delete(struct _toppers_cxxrt_tls *key) +{ + int i; + + for (i = 0; i <= tmax_tskid; i++) + { + if (key->dtor != 0) + (*key->dtor)(key->data[i]); + } + key->data = NULL; + key->dtor = 0; + return 0; +} + +/* JSP 1.4との互換性のために_toppers_cxxrt_reset_specificを残しておく */ +void _toppers_cxxrt_reset_specific(void) +{ +} + +void _toppers_cxxrt_init(void) +{ + int i, tmax = tmax_tskid + 1; + void **p = (void**)malloc(sizeof(void*) * CXXRT_KEY_MAX * tmax); + + for (i = 0; i < CXXRT_KEY_MAX * tmax; i++) + p[i] = NULL; + for (i = 0; i < CXXRT_KEY_MAX; i++) + tls_data[i] = p + i * tmax; +} + diff --git a/uzume_prototype/kernel/systask/cxxrt.cfg b/uzume_prototype/kernel/systask/cxxrt.cfg new file mode 100644 index 0000000..3ca05dd --- /dev/null +++ b/uzume_prototype/kernel/systask/cxxrt.cfg @@ -0,0 +1,41 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2003 by Takagi Nobuhisa + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: cxxrt.cfg,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +CRE_SEM(_CXXRT_SEM,{TA_TPRI,1,1}); + diff --git a/uzume_prototype/kernel/systask/linux_serial.c b/uzume_prototype/kernel/systask/linux_serial.c new file mode 100644 index 0000000..2567b35 --- /dev/null +++ b/uzume_prototype/kernel/systask/linux_serial.c @@ -0,0 +1,584 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: linux_serial.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +#define _LINX_SERIAL_ + +#include +#include +#include +#include +#include +#include +#undef __USE_MISC +#include +#include +#include "kernel_id.h" + + +/* + * シリアルポートの低レベル定義 + */ + +typedef struct hardware_serial_port_descripter { + char *path; /* UNIX 上でのファイル名 */ + int fd; /* ファイルディスクリプタ */ + struct termios current_term; /* 端末制御情報 */ + struct termios saved_term; +} HWPORT; + +#define NUM_PORT 1 + +#define RAWPORT1 { 0 } + +/* + * UNIX レベルのポート初期化/シャットダウン処理 + * + * 現在の実装では,端末を使うケースしか考えていない.本来は,open し + * たのが端末かどうかで処理を変えるべき. + */ + +Inline void +hw_port_initialize(HWPORT *p) +{ + if (p->path) { + p->fd = open(p->path, O_RDWR|O_NDELAY); + } + else { + p->fd = 0; /* 標準入出力を使う */ + } + fcntl(p->fd, F_SETOWN, getpid()); + fcntl(p->fd, F_SETFL, FASYNC|FNDELAY); + + + tcgetattr(p->fd, &(p->saved_term)); + + p->current_term = p->saved_term; + p->current_term.c_lflag &= ~(ECHO); + p->current_term.c_lflag &= ~(ICANON); + p->current_term.c_cc[VMIN] = 1; + p->current_term.c_cc[VTIME] = 0; + + tcsetattr(p->fd, TCSAFLUSH, &(p->current_term)); +} + +Inline void +hw_port_terminate(HWPORT *p) +{ + tcsetattr(p->fd, TCSAFLUSH, &(p->saved_term)); + fcntl(p->fd, F_SETFL, 0); + if (p->path) { + close(p->fd); + } +} + + +/* + * シリアルインタフェースドライバ用の SIGIO 通知イベントブロック + */ + +static SIGIOEB serial_sigioeb; + + +/* + * シリアルポート管理ブロックの定義 + */ + +typedef struct ioctl_descripter { + int echo; + int input; + int newline; + int flowc; +} IOCTL; + +#define SERIAL_BUFSZ 256 /* シリアルインタフェース用バッファのサイズ */ + +#define inc(x) (((x)+1 < SERIAL_BUFSZ) ? (x)+1 : 0) +#define INC(x) ((x) = inc(x)) + + +typedef struct serial_port_control_block { + BOOL init_flag; /* 初期化済か? */ + HWPORT hwport; /* ハードウェア依存情報 */ + ID in_semid; /* 受信バッファ管理用セマフォの ID */ + ID out_semid; /* 送信バッファ管理用セマフォの ID */ + + int in_read_ptr; /* 受信バッファ読み出しポインタ */ + int in_write_ptr; /* 受信バッファ書き込みポインタ */ + int out_read_ptr; /* 送信バッファ読み出しポインタ */ + int out_write_ptr; /* 送信バッファ書き込みポインタ */ + UINT ioctl; /* ioctl による設定内容 */ + BOOL send_enabled; /* 送信をイネーブルしてあるか? */ + BOOL ixon_stopped; /* STOP を受け取った状態か? */ + BOOL ixoff_stopped; /* 相手に STOP を送った状態か? */ + char ixoff_send; /* 相手に START/STOP を送るか? */ + + char in_buffer[SERIAL_BUFSZ]; /* 受信バッファエリア */ + char out_buffer[SERIAL_BUFSZ]; /* 受信バッファエリア */ +} SPCB; + + +#define IN_BUFFER_EMPTY(spcb) \ + ((spcb)->in_read_ptr == (spcb)->in_write_ptr) +#define IN_BUFFER_FULL(spcb) \ + ((spcb)->in_read_ptr == inc((spcb)->in_write_ptr)) +#define OUT_BUFFER_FULL(spcb) \ + ((spcb)->out_read_ptr == inc((spcb)->out_write_ptr)) + +/* + * モジュール内で使う関数 + */ +static void sigint_handler(); +static BOOL serial_getc(SPCB *spcb, char *c); +static BOOL serial_putc(SPCB *spcb, char c); + + +/* + * シリアルポート管理ブロックの定義と初期化 + */ + +static SPCB spcb_table[NUM_PORT] = { + {0, RAWPORT1, SEM_SERIAL1_IN, SEM_SERIAL1_OUT } +}; + +#define get_spcb(portid) (&(spcb_table[(portid)-1])) +#define get_spcb_def(portid) get_spcb((portid) ? (portid) : CONSOLE_PORTID) + + +/* + * ポートの初期化 + */ +int +serial_opn_por(ID portid) +{ + + SPCB *spcb; + ER ercd = E_OK;; + + if (!(1 <= portid && portid <= NUM_PORT)) { + return(E_PAR); + } + spcb = get_spcb(portid); + + /* + * 複数のタスクが同時に serial_open を呼ぶ状況には対応してい + * ない. + */ + if (spcb->init_flag) { /* 初期化済かのチェック */ + return(E_OK); + } + + /* + * 変数の初期化 + */ + spcb->in_read_ptr = spcb->in_write_ptr = 0; + spcb->out_read_ptr = spcb->out_write_ptr = 0; + spcb->ixon_stopped = spcb->ixoff_stopped = FALSE; + spcb->ixoff_send = 0; + + /* + * ハードウェア依存の初期化 + */ + hw_port_initialize(&(spcb->hwport)); + + /* + * プロセスを終了させるシグナルを捕まえる + * sigaction()で書き直した方がいいのか? + */ + signal(SIGHUP, sigint_handler); + signal(SIGINT, sigint_handler); + signal(SIGTERM, sigint_handler); + + spcb->init_flag = TRUE; + spcb->send_enabled = FALSE; + return(ercd); +} + +/* + * ポートのシャットダウン + */ + +ER +serial_cls_por(ID portid) +{ + SPCB *spcb; + + if (!(1 <= portid && portid <= NUM_PORT)) { + return(E_PAR); /* ポート番号のチェック */ + } + + spcb = get_spcb(portid); + if (!(spcb->init_flag)) { /* 初期化済かのチェック */ + return(E_OBJ); + } + + /* + * ハードウェア依存のシャットダウン処理 + */ + syscall(loc_cpu()); + hw_port_terminate(&(spcb->hwport)); + syscall(unl_cpu()); + + spcb->init_flag = FALSE; + return(E_OK); +} + +/* + * プロセスを終了させるシグナルに対するハンドラ + */ +void +sigint_handler() +{ + SPCB *spcb; + int i; + + for (i = 1; i <= NUM_PORT; i++) { + spcb = get_spcb(i); + if (spcb->init_flag) { + hw_port_terminate(&(spcb->hwport)); + } + } + exit(0); +} + +/* + * フローコントロール関係の定義 + */ +#define STOP '\023' /* Control-S */ +#define START '\021' /* Control-Q */ + +#define IXOFF_STOP 64 /* buffer area size to send STOP */ +#define IXOFF_START 128 /* buffer area size to send START */ + +#define in_buf_area(p) \ + ((spcb->in_read_ptr >= spcb->in_write_ptr) ? \ + (spcb->in_read_ptr - spcb->in_write_ptr) : \ + (spcb->in_read_ptr + SERIAL_BUFSZ - spcb->in_write_ptr)) +/* + * ユーティリティルーチン + */ + +Inline BOOL +read_char(SPCB *spcb, char *c) +{ + int n; + + if ((n = read(spcb->hwport.fd, c, 1)) == 1) { + return(1); + } + assert(n < 0 && errno == EWOULDBLOCK); + return(0); +} + +Inline BOOL +write_char(SPCB *spcb, char c) +{ + int n; + + if ((n = write(spcb->hwport.fd, &c, 1)) == 1) { + return(1); + } + assert(n < 0 && errno == EWOULDBLOCK); + return(0); +} + +/* + * シリアルポートからの受信 + */ + +static BOOL +serial_getc(SPCB *spcb, char *c) +{ + BOOL buffer_empty; + + syscall(loc_cpu()); + *c = spcb->in_buffer[spcb->in_read_ptr]; + if (inc(spcb->in_write_ptr) == spcb->in_read_ptr) { + /* + * バッファフル状態が解除されたら、割り込みが入ったのと + * 同じ振る舞いをさせる。 + */ + kill(getpid(), SIGIO); + } + + INC(spcb->in_read_ptr); + + if (spcb->ixoff_stopped && (in_buf_area(spcb) > IXOFF_START)) { + if (!write_char(spcb, START)) { + spcb->ixoff_send = START; + } + spcb->ixoff_stopped = FALSE; + } + buffer_empty = IN_BUFFER_EMPTY(spcb); + syscall(unl_cpu()); + return(buffer_empty); +} + +ER_UINT +serial_rea_dat(ID portid, char *buf, UINT len) +{ + SPCB *spcb; + BOOL buffer_empty; + char c; + int i; + + + if (sns_dpn()) { /* コンテキストのチェック */ + return(E_CTX); + } + if (!(0 <= portid && portid <= NUM_PORT)) { + return(E_PAR); /* ポート番号のチェック */ + } + + spcb = get_spcb_def(portid); + if (!(spcb->init_flag)) { /* 初期化済かのチェック */ + return(E_OBJ); + } + if (len == 0) { + return(len); + } + + + syscall(wai_sem(spcb->in_semid)); + buffer_empty = FALSE; + for (i = 0; i < len; i++) { + buffer_empty = serial_getc(spcb, &c); + if ((spcb->ioctl & IOCTL_ECHO) != 0) { + syscall(wai_sem(spcb->out_semid)); + if (!serial_putc(spcb, c)) { + syscall(sig_sem(spcb->out_semid)); + } + } + *buf++ = c; + if (buffer_empty && i < len - 1) { + syscall(wai_sem(spcb->in_semid)); + } + } + if (!buffer_empty) { + syscall(sig_sem(spcb->in_semid)); + } + return(len); +} + + +/* + * シリアルポートへの送信 + */ + +static BOOL +serial_putc(SPCB *spcb, char c) +{ + BOOL buffer_full; + + if (c == '\n' && (spcb->ioctl & IOCTL_CRLF) != 0) { + if (serial_putc(spcb, '\r')) { + syscall(wai_sem(spcb->out_semid)); + } + } + + syscall(loc_cpu()); + if (!(spcb->ixon_stopped) && write_char(spcb, c)) { + buffer_full = FALSE; + } + else { + spcb->out_buffer[spcb->out_write_ptr] = c; + INC(spcb->out_write_ptr); + buffer_full = OUT_BUFFER_FULL(spcb); + } + syscall(unl_cpu()); + return(buffer_full); +} + +ER_UINT +serial_wri_dat(ID portid, char *buf, UINT len) +{ + SPCB *spcb; + BOOL buffer_full; + int i; + + if (sns_dpn()) { /* コンテキストのチェック */ + return(E_CTX); + } + if (!(0 <= portid && portid <= NUM_PORT)) { + return(E_PAR); /* ポート番号のチェック */ + } + + spcb = get_spcb_def(portid); + if (!(spcb->init_flag)) { /* 初期化済かのチェック */ + return(E_OBJ); + } + + syscall(wai_sem(spcb->out_semid)); + buffer_full = FALSE; + for (i = 0; i < len; i++) { + buffer_full = serial_putc(spcb, *buf++); + if (buffer_full && i < len - 1) { + syscall(wai_sem(spcb->out_semid)); + } + } + if (!buffer_full) { + syscall(sig_sem(spcb->out_semid)); + } + return(len); +} + +/* + * シリアルポートの制御 + */ + +int +serial_ctl_por(ID portid, UINT ioctl) +{ + SPCB *spcb; + + if (sns_ctx()) { /* コンテキストのチェック */ + return(E_CTX); + } + if (!(0 <= portid && portid <= NUM_PORT)) { + return(E_PAR); /* ポート番号のチェック */ + } + + spcb = get_spcb_def(portid); + if (!(spcb->init_flag)) { /* 初期化済かのチェック */ + return(E_OBJ); + } + + spcb->ioctl = ioctl; + return(E_OK); +} + + +/* + * シリアルポート割込みハンドラ + */ + +static BOOL +serial_int_handler(ID portid) +{ + SPCB *spcb; + BOOL flag; + char c; + + spcb = get_spcb(portid); + flag = 0; + + /* + * 1文字受信処理 + * + * まず,バッファフルでない場合に,1文字読んでみる.読めれば, + * それに応じた処理を行う. + */ + if (inc(spcb->in_write_ptr) != spcb->in_read_ptr + && read_char(spcb, &c)) { + if ((spcb->ioctl & IOCTL_FCSND) != 0 && c == STOP) { + spcb->ixon_stopped = TRUE; + } + else if (((spcb->ioctl & IOCTL_FCSND) != 0 || spcb->ixon_stopped) + && (c == START || (spcb->ioctl & IOCTL_FCANY) != 0)) { + spcb->ixon_stopped = FALSE; + } + else { + spcb->in_buffer[spcb->in_write_ptr] = c; + if(spcb->in_read_ptr == spcb->in_write_ptr){ + syscall(sig_sem(spcb->in_semid)); + } + + INC(spcb->in_write_ptr); + + if ((spcb->ioctl & IOCTL_FCRCV) != 0 && !(spcb->ixoff_stopped) + && (in_buf_area(p) < IXOFF_STOP)) { + spcb->ixoff_stopped = TRUE; + spcb->ixoff_send = STOP; + } + } + flag = 1; + } + + /* + * 1文字送信処理 + */ + if (spcb->ixoff_send) { + if (write_char(spcb, spcb->ixoff_send)) { + spcb->ixoff_send = 0; + flag = 1; + } + } + else if (!(spcb->ixon_stopped) + && spcb->out_read_ptr != spcb->out_write_ptr) { + if (write_char(spcb, spcb->out_buffer[spcb->out_read_ptr])) { + if(OUT_BUFFER_FULL(spcb)){ + syscall(sig_sem(spcb->out_semid)); + } + INC(spcb->out_read_ptr); + flag = 1; + } + } + return(flag); +} + + + +/* + * SIGIO コールバックルーチン + */ + +static BOOL +serial_sigio_callback(VP arg) +{ + BOOL flag; + + do { +// syscall(loc_cpu()); + flag = serial_int_handler(1); +// syscall(unl_cpu()); + } while (flag); + return(0); +} + + + +/* + * シリアルインタフェースドライバの起動 + */ + +void +serial_initialize(VP_INT exinf) +{ + serial_sigioeb.callback = serial_sigio_callback; + serial_sigioeb.arg = (VP) 0; + syscall(enqueue_sigioeb_initialize(&serial_sigioeb)); +} diff --git a/uzume_prototype/kernel/systask/linux_serial.cfg b/uzume_prototype/kernel/systask/linux_serial.cfg new file mode 100644 index 0000000..c65ee9e --- /dev/null +++ b/uzume_prototype/kernel/systask/linux_serial.cfg @@ -0,0 +1,13 @@ +/* + * @(#) $Id: linux_serial.cfg,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * シリアルインタフェースモジュールのコンフィギュレーションファイル + */ + +INCLUDE("\"serial.h\""); +ATT_INI({ TA_HLNG, CONSOLE_PORTID, serial_initialize }); +CRE_SEM(SEM_SERIAL1_IN, { TA_TPRI, 0, 1 }); +CRE_SEM(SEM_SERIAL1_OUT, { TA_TPRI, 1, 1 }); + diff --git a/uzume_prototype/kernel/systask/linux_sigio.c b/uzume_prototype/kernel/systask/linux_sigio.c new file mode 100644 index 0000000..ae12bfc --- /dev/null +++ b/uzume_prototype/kernel/systask/linux_sigio.c @@ -0,0 +1,133 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: linux_sigio.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + + +#include +#include "../kernel/jsp_kernel.h" +#include "../kernel/queue.h" +#include "kernel_id.h" +#include +#include + + +/* + * SIGIO通知イベントキュー + */ + +static QUEUE sigio_queue; + +/* + * SIGIO通知ハンドラ + * + * SIGIO通知処理タスクを起床する. + */ +void +linux_sigio_handler() +{ + syscall(iwup_tsk(TSK_LINUX_SIGIO)); +} + +/* + * ノンブロッキングI/O モジュール起動ルーチン + * + * SIGIO通知イベントキューを初期化.SIGIO通知処理タスクとセマフォを生 + * 成.SIGIO通知ハンドラを設定. + */ +static int initflag = 0; /* 初期化済フラグ */ + +void +linux_sigio_initialize(VP_INT exinf) +{ + if (!initflag) { + queue_initialize(&sigio_queue); + initflag = 1; + } +} + +/* + * SIGIO通知処理タスク本体 + */ +void +linux_sigio_task(void) +{ + QUEUE *q; + SIGIOEB *event; + + while (slp_tsk() == E_OK) { + /* + * SIGIO通知イベントキュー中の各イベントブロックのコー + * ルバックルーチンを呼びだす.コールバックルーチンが + * 0 以外を返した場合,そのイベントブロックを削除する. + */ + syscall(wai_sem(SEM_LINUX_SIGIO)); + q = sigio_queue.next; + while (q != &sigio_queue) { + event = ((SIGIOEB *) q); + q = q->next; + if ((*(event->callback))(event->arg)) { + queue_delete((QUEUE *) &(event->queue)); + } + } + syscall(sig_sem(SEM_LINUX_SIGIO)); + } + ext_tsk(); +} + +/* + * SIGIO通知イベントをSIGIO通知イベントキューへ挿入 + */ +ER +enqueue_sigioeb(SIGIOEB *event) +{ + syscall(wai_sem(SEM_LINUX_SIGIO)); + queue_insert_prev(&sigio_queue , (QUEUE *) &(event->queue)); + syscall(sig_sem(SEM_LINUX_SIGIO)); + return(E_OK); +} + +/* + * システム起動時登録用 + * システム起動時、初期化ルーチンは非タスクコンテキストから + * 呼ばれるためenqueue_sigioeb()でセマフォが使用できない + */ +ER +enqueue_sigioeb_initialize(SIGIOEB *event) +{ + queue_insert_prev(&sigio_queue , (QUEUE *) &(event->queue)); + return(E_OK); +} diff --git a/uzume_prototype/kernel/systask/linux_sigio.cfg b/uzume_prototype/kernel/systask/linux_sigio.cfg new file mode 100644 index 0000000..918e950 --- /dev/null +++ b/uzume_prototype/kernel/systask/linux_sigio.cfg @@ -0,0 +1,15 @@ +/* + * @(#) $Id: linux_sigio.cfg,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * Linux用 ノンブロッキングI/O サポートモジュールの + * コンフィギュレーションファイル + */ + +INCLUDE("\"linux_sigio.h\""); +ATT_INI({ TA_HLNG, 0, linux_sigio_initialize }); +CRE_SEM(SEM_LINUX_SIGIO, { TA_TPRI, 1, 1 }); +CRE_TSK(TSK_LINUX_SIGIO, { TA_HLNG|TA_ACT, 0, linux_sigio_task, + LINUX_SIGIO_PRIORITY, LINUX_SIGIO_STACK_SIZE, NULL }); +DEF_INH(INHNO_SIGIO, { TA_HLNG, linux_sigio_handler }); diff --git a/uzume_prototype/kernel/systask/logtask.c b/uzume_prototype/kernel/systask/logtask.c new file mode 100644 index 0000000..cd13146 --- /dev/null +++ b/uzume_prototype/kernel/systask/logtask.c @@ -0,0 +1,75 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: logtask.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * システムログタスク + */ + +#include +#include + +/* + * システムログタスクの出力先のポートID + */ +static ID logtask_portid; + +/* + * シリアルインタフェースへの1文字出力 + */ +static void +logtask_putc(char c) +{ + serial_wri_dat(logtask_portid, &c, 1); +} + +/* + * システムログタスクの本体 + */ +void +logtask(VP_INT exinf) +{ + logtask_portid = (ID) exinf; + serial_opn_por(logtask_portid); + vmsk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG)); + syslog_1(LOG_NOTICE, "System logging task is started on port %d.", + logtask_portid); + for (;;) { + syslog_output(logtask_putc); + _syscall(dly_tsk(LOGTASK_INTERVAL)); + } +} diff --git a/uzume_prototype/kernel/systask/logtask.cfg b/uzume_prototype/kernel/systask/logtask.cfg new file mode 100644 index 0000000..47665d0 --- /dev/null +++ b/uzume_prototype/kernel/systask/logtask.cfg @@ -0,0 +1,11 @@ +/* + * @(#) $Id: logtask.cfg,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * システムログタスクのコンフィギュレーションファイル + */ + +INCLUDE("\"logtask.h\""); +CRE_TSK(LOGTASK, { TA_HLNG|TA_ACT, (VP_INT) LOGTASK_PORTID, logtask, + LOGTASK_PRIORITY, LOGTASK_STACK_SIZE, NULL }); diff --git a/uzume_prototype/kernel/systask/newlibrt.c b/uzume_prototype/kernel/systask/newlibrt.c new file mode 100644 index 0000000..4b77e1a --- /dev/null +++ b/uzume_prototype/kernel/systask/newlibrt.c @@ -0,0 +1,72 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2003-2004 by Takagi Nobuhisa + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: newlibrt.c,v 1.2 2010/05/02 04:43:52 suikan Exp $ + */ +#include +#include +#include +#include "../kernel/jsp_kernel.h" + +#ifndef HEAP_TOP +#define HEAP_TOP ~0UL +#endif + +/* + * For malloc (Newlib) + */ +static int cxxrt_dis_dsp; + +void __malloc_lock(struct _reent *ptr) +{ + if (!iniflg || sns_dsp()) + return; + dis_dsp(); + cxxrt_dis_dsp = 1; +} + +void __malloc_unlock(struct _reent *ptr) +{ + if (!cxxrt_dis_dsp) + return; + cxxrt_dis_dsp = 0; + ena_dsp(); +} + + + + + diff --git a/uzume_prototype/kernel/systask/serial.c b/uzume_prototype/kernel/systask/serial.c new file mode 100644 index 0000000..cd01694 --- /dev/null +++ b/uzume_prototype/kernel/systask/serial.c @@ -0,0 +1,537 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2006 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: serial.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * シリアルインタフェースドライバ + */ + +#include +#include +#include +#include "kernel_id.h" + +/* + * バッファサイズとフロー制御に関連する定数 + */ + +#define SERIAL_BUFSZ 256 /* ドライバのバッファサイズ */ + +#define FC_STOP '\023' /* コントロール-S */ +#define FC_START '\021' /* コントロール-Q */ + +#define BUFCNT_STOP (SERIAL_BUFSZ - 64) /* STOPを送る基準文字数 */ +#define BUFCNT_START (SERIAL_BUFSZ - 128) /* STARTを送る基準文字数 */ + +/* + * クローズの際に送信を待つ最大時間(msec単位) + */ +#define MAX_FLUSH_WAIT 1000 + +/* + * シリアルポート初期化ブロック + */ +typedef struct serial_port_initialization_block { + ID rcv_semid; /* 受信バッファ管理用セマフォのID */ + ID snd_semid; /* 送信バッファ管理用セマフォのID */ +} SPINIB; + +static const SPINIB spinib_table[TNUM_PORT] = { + { SERIAL_RCV_SEM1, SERIAL_SND_SEM1 } +#if TNUM_PORT >= 2 + ,{ SERIAL_RCV_SEM2, SERIAL_SND_SEM2 } +#endif +#if TNUM_PORT >= 3 + ,{ SERIAL_RCV_SEM3, SERIAL_SND_SEM3 } +#endif +}; + +/* + * シリアルポート管理ブロック + */ +typedef struct serial_port_control_block { + const SPINIB *spinib; /* シリアルポート初期化ブロック */ + SIOPCB *siopcb; /* シリアルI/Oポート管理ブロック */ + BOOL openflag; /* オープン済みフラグ */ + UINT ioctl; /* 動作制御の設定値 */ + + UINT rcv_read_ptr; /* 受信バッファ読出しポインタ */ + UINT rcv_write_ptr; /* 受信バッファ書込みポインタ */ + UINT rcv_count; /* 受信バッファ中の文字数 */ + char rcv_fc_chr; /* 送るべき START/STOP */ + BOOL rcv_stopped; /* STOP を送った状態か? */ + + UINT snd_read_ptr; /* 送信バッファ読出しポインタ */ + UINT snd_write_ptr; /* 送信バッファ書込みポインタ */ + UINT snd_count; /* 送信バッファ中の文字数 */ + BOOL snd_stopped; /* STOP を受け取った状態か? */ + + char rcv_buffer[SERIAL_BUFSZ]; /* 受信バッファ */ + char snd_buffer[SERIAL_BUFSZ]; /* 送信バッファ */ +} SPCB; + +static SPCB spcb_table[TNUM_PORT]; + +/* + * シリアルポートIDからシリアルポート管理ブロックを取り出すためのマクロ + */ +#define INDEX_PORT(portid) ((UINT)((portid) - 1)) +#define get_spcb(portid) (&(spcb_table[INDEX_PORT(portid)])) + +/* + * ポインタのインクリメント + */ +#define INC_PTR(ptr) { if (++ptr == SERIAL_BUFSZ) ptr = 0; } + +/* + * シリアルインタフェースドライバの初期化ルーチン + */ +void +serial_initialize(VP_INT exinf) +{ + SPCB *spcb; + UINT i; + + sio_initialize(); + for (spcb = spcb_table, i = 0; i < TNUM_PORT; spcb++, i++) { + spcb->spinib = &(spinib_table[i]); + spcb->openflag = FALSE; + } +} + +/* + * シリアルポートのオープン + */ +ER +serial_opn_por(ID portid) +{ + SPCB *spcb; + ER ercd; + + if (sns_ctx()) { /* コンテキストのチェック */ + return(E_CTX); + } + if (!(1 <= portid && portid <= TNUM_PORT)) { + return(E_ID); /* ポート番号のチェック */ + } + spcb = get_spcb(portid); + + _syscall(loc_cpu()); + if (spcb->openflag) { /* オープン済みかのチェック */ + ercd = E_OBJ; + } + else { + /* + * 変数の初期化 + */ + spcb->ioctl = (IOCTL_ECHO | IOCTL_CRLF + | IOCTL_FCSND | IOCTL_FCRCV); + + + spcb->rcv_read_ptr = spcb->rcv_write_ptr = 0; + spcb->rcv_count = 0; + spcb->rcv_fc_chr = '\0'; + spcb->rcv_stopped = FALSE; + + spcb->snd_read_ptr = spcb->snd_write_ptr = 0; + spcb->snd_count = 0; + spcb->snd_stopped = FALSE; + + /* + * ハードウェア依存のオープン処理 + */ + spcb->siopcb = sio_opn_por(portid, (VP_INT) spcb); + + /* + * 受信通知コールバックを許可する. + */ + sio_ena_cbr(spcb->siopcb, SIO_ERDY_RCV); + spcb->openflag = TRUE; + ercd = E_OK; + } + _syscall(unl_cpu()); + return(ercd); +} + +/* + * シリアルポートのクローズ + */ +ER +serial_cls_por(ID portid) +{ + SPCB *spcb; + ER ercd; + + if (sns_ctx()) { /* コンテキストのチェック */ + return(E_CTX); + } + if (!(1 <= portid && portid <= TNUM_PORT)) { + return(E_ID); /* ポート番号のチェック */ + } + spcb = get_spcb(portid); + + _syscall(loc_cpu()); + if (!(spcb->openflag)) { /* オープン済みかのチェック */ + ercd = E_OBJ; + } + else { + /* + * ハードウェア依存のクローズ処理 + */ + sio_cls_por(spcb->siopcb); + spcb->openflag = FALSE; + ercd = E_OK; + } + _syscall(unl_cpu()); + return(ercd); +} + +/* + * シリアルポートへの文字送信 + */ +Inline BOOL +serial_snd_chr(SPCB *spcb, char c) +{ + if (sio_snd_chr(spcb->siopcb, c)) { + return(TRUE); + } + else { + sio_ena_cbr(spcb->siopcb, SIO_ERDY_SND); + return(FALSE); + } +} + +/* + * シリアルポートへの送信 + */ +static BOOL +serial_wri_chr(SPCB *spcb, char c) +{ + BOOL buffer_full; + + /* + * LF の前に CR を送信する. + */ + if (c == '\n' && (spcb->ioctl & IOCTL_CRLF) != 0) { + if (serial_wri_chr(spcb, '\r')) { + _syscall(wai_sem(spcb->spinib->snd_semid)); + } + } + + _syscall(loc_cpu()); + if (spcb->snd_count == 0 && !(spcb->snd_stopped) + && serial_snd_chr(spcb, c)) { + /* + * シリアルI/Oデバイスの送信レジスタに文字を入れるこ + * とに成功した場合. + */ + buffer_full = FALSE; + } + else { + /* + * 送信バッファに文字を入れる. + */ + spcb->snd_buffer[spcb->snd_write_ptr] = c; + INC_PTR(spcb->snd_write_ptr); + spcb->snd_count++; + buffer_full = (spcb->snd_count == SERIAL_BUFSZ); + } + _syscall(unl_cpu()); + return(buffer_full); +} + +ER_UINT +serial_wri_dat(ID portid, char *buf, UINT len) +{ + SPCB *spcb; + BOOL buffer_full; + UINT i; + + if (sns_dpn()) { /* コンテキストのチェック */ + return(E_CTX); + } + if (!(1 <= portid && portid <= TNUM_PORT)) { + return(E_ID); /* ポート番号のチェック */ + } + + spcb = get_spcb(portid); + if (!(spcb->openflag)) { /* オープン済みかのチェック */ + return(E_OBJ); + } + + buffer_full = TRUE; /* ループの1回めは wai_sem する */ + for (i = 0; i < len; i++) { + if (buffer_full) { + _syscall(wai_sem(spcb->spinib->snd_semid)); + } + buffer_full = serial_wri_chr(spcb, *buf++); + } + if (!buffer_full) { + _syscall(sig_sem(spcb->spinib->snd_semid)); + } + return((ER_UINT) len); +} + +/* + * シリアルポートからの受信 + */ +static BOOL +serial_rea_chr(SPCB *spcb, char *c) +{ + BOOL buffer_empty; + + _syscall(loc_cpu()); + + /* + * 受信バッファから文字を取り出す. + */ + *c = spcb->rcv_buffer[spcb->rcv_read_ptr]; + INC_PTR(spcb->rcv_read_ptr); + spcb->rcv_count--; + buffer_empty = (spcb->rcv_count == 0); + + /* + * START を送信する. + */ + if (spcb->rcv_stopped && spcb->rcv_count <= BUFCNT_START) { + if (!serial_snd_chr(spcb, FC_START)) { + spcb->rcv_fc_chr = FC_START; + } + spcb->rcv_stopped = FALSE; + } + _syscall(unl_cpu()); + + /* + * エコーバック処理. + */ + if ((spcb->ioctl & IOCTL_ECHO) != 0) { + _syscall(wai_sem(spcb->spinib->snd_semid)); + if (!serial_wri_chr(spcb, *c)) { + _syscall(sig_sem(spcb->spinib->snd_semid)); + } + } + return(buffer_empty); +} + +ER_UINT +serial_rea_dat(ID portid, char *buf, UINT len) +{ + SPCB *spcb; + BOOL buffer_empty; + UINT i; + + if (sns_dpn()) { /* コンテキストのチェック */ + return(E_CTX); + } + if (!(1 <= portid && portid <= TNUM_PORT)) { + return(E_ID); /* ポート番号のチェック */ + } + + spcb = get_spcb(portid); + if (!(spcb->openflag)) { /* オープン済みかのチェック */ + return(E_OBJ); + } + + buffer_empty = TRUE; /* ループの1回めは wai_sem する */ + for (i = 0; i < len; i++) { + if (buffer_empty) { + _syscall(wai_sem(spcb->spinib->rcv_semid)); + } + buffer_empty = serial_rea_chr(spcb, buf++); + } + if (!buffer_empty) { + _syscall(sig_sem(spcb->spinib->rcv_semid)); + } + return((ER_UINT) len); +} + +/* + * シリアルポートの制御 + */ +ER +serial_ctl_por(ID portid, UINT ioctl) +{ + SPCB *spcb; + + if (sns_ctx()) { /* コンテキストのチェック */ + return(E_CTX); + } + if (!(1 <= portid && portid <= TNUM_PORT)) { + return(E_ID); /* ポート番号のチェック */ + } + + spcb = get_spcb(portid); + if (!(spcb->openflag)) { /* オープン済みかのチェック */ + return(E_OBJ); + } + + spcb->ioctl = ioctl; + return(E_OK); +} + +/* + * シリアルポート状態の参照 + */ +ER +serial_ref_por(ID portid, T_SERIAL_RPOR *pk_rpor) +{ + SPCB *spcb; + + if (sns_ctx()) { /* コンテキストのチェック */ + return(E_CTX); + } + if (!(1 <= portid && portid <= TNUM_PORT)) { + return(E_ID); /* ポート番号のチェック */ + } + + spcb = get_spcb(portid); + if (!(spcb->openflag)) { /* オープン済みかのチェック */ + return(E_OBJ); + } + + pk_rpor->reacnt = spcb->rcv_count; + pk_rpor->wricnt = spcb->snd_count; + return(E_OK); +} + +/* + * シリアルポートからの送信可能コールバック + */ +void +sio_ierdy_snd(VP_INT exinf) +{ + SPCB *spcb; + + spcb = (SPCB *) exinf; + if (spcb->rcv_fc_chr != '\0') { + /* + * START/STOP を送信する. + */ + (void) sio_snd_chr(spcb->siopcb, spcb->rcv_fc_chr); + spcb->rcv_fc_chr = '\0'; + } + else if (!(spcb->snd_stopped) && spcb->snd_count > 0) { + /* + * 送信バッファ中から文字を取り出して送信する. + */ + (void) sio_snd_chr(spcb->siopcb, + spcb->snd_buffer[spcb->snd_read_ptr]); + INC_PTR(spcb->snd_read_ptr); + if (spcb->snd_count == SERIAL_BUFSZ) { + _syscall(isig_sem(spcb->spinib->snd_semid)); + } + spcb->snd_count--; + } + else { + /* + * 送信すべき文字がない場合は,送信可能コールバックを + * 禁止する. + */ + sio_dis_cbr(spcb->siopcb, SIO_ERDY_SND); + } +} + +/* + * シリアルポートからの受信通知コールバック + */ +void +sio_ierdy_rcv(VP_INT exinf) +{ + SPCB *spcb; + char c; + + spcb = (SPCB *) exinf; + c = (char) sio_rcv_chr(spcb->siopcb); + if ((spcb->ioctl & IOCTL_FCSND) != 0 && c == FC_STOP) { + /* + * 送信を一時停止する.送信中の文字はそのまま送信する. + */ + spcb->snd_stopped = TRUE; + } + else if (spcb->snd_stopped && (c == FC_START + || (spcb->ioctl & IOCTL_FCANY) != 0)) { + /* + * 送信を再開する. + */ + spcb->snd_stopped = FALSE; + if (spcb->snd_count > 0) { + c = spcb->snd_buffer[spcb->snd_read_ptr]; + if (serial_snd_chr(spcb, c)) { + INC_PTR(spcb->snd_read_ptr); + if (spcb->snd_count == SERIAL_BUFSZ) { + _syscall(isig_sem(spcb->spinib + ->snd_semid)); + } + spcb->snd_count--; + } + } + } + else if ((spcb->ioctl & IOCTL_FCSND) != 0 && c == FC_START) { + /* + * 送信に対してフロー制御している場合,START は捨てる. + */ + } + else if (spcb->rcv_count == SERIAL_BUFSZ) { + /* + * バッファフルの場合,受信した文字を捨てる. + */ + } + else { + /* + * 受信した文字を受信バッファに入れる. + */ + spcb->rcv_buffer[spcb->rcv_write_ptr] = c; + INC_PTR(spcb->rcv_write_ptr); + if (spcb->rcv_count == 0) { + _syscall(isig_sem(spcb->spinib->rcv_semid)); + } + spcb->rcv_count++; + + /* + * STOP を送信する. + */ + if ((spcb->ioctl & IOCTL_FCRCV) != 0 && !(spcb->rcv_stopped) + && (spcb->rcv_count >= BUFCNT_STOP)) { + if (!serial_snd_chr(spcb, FC_STOP)) { + spcb->rcv_fc_chr = FC_STOP; + } + spcb->rcv_stopped = TRUE; + } + } +} diff --git a/uzume_prototype/kernel/systask/serial.cfg b/uzume_prototype/kernel/systask/serial.cfg new file mode 100644 index 0000000..f95e915 --- /dev/null +++ b/uzume_prototype/kernel/systask/serial.cfg @@ -0,0 +1,44 @@ +/* + * @(#) $Id: serial.cfg,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * シリアルインタフェースドライバのコンフィギュレーションファイル + */ + +#ifndef _MACRO_ONLY +#define _MACRO_ONLY +#endif + +#include + +#ifdef LINUX + +/* + * Linux上でのシミュレーション環境の場合 + */ +#include "linux_sigio.cfg" +#include "linux_serial.cfg" + +#else /* LINUX */ + +/* + * 通常のターゲット環境の場合 + */ +#include + +INCLUDE("\"serial.h\""); +ATT_INI({ TA_HLNG, 0, serial_initialize }); + +CRE_SEM(SERIAL_RCV_SEM1, { TA_TPRI, 0, 1 }); +CRE_SEM(SERIAL_SND_SEM1, { TA_TPRI, 1, 1 }); +#if TNUM_PORT >= 2 +CRE_SEM(SERIAL_RCV_SEM2, { TA_TPRI, 0, 1 }); +CRE_SEM(SERIAL_SND_SEM2, { TA_TPRI, 1, 1 }); +#endif +#if TNUM_PORT >= 3 +CRE_SEM(SERIAL_RCV_SEM3, { TA_TPRI, 0, 1 }); +CRE_SEM(SERIAL_SND_SEM3, { TA_TPRI, 1, 1 }); +#endif + +#endif /* LINUX */ diff --git a/uzume_prototype/kernel/systask/timer.c b/uzume_prototype/kernel/systask/timer.c new file mode 100644 index 0000000..357a91b --- /dev/null +++ b/uzume_prototype/kernel/systask/timer.c @@ -0,0 +1,73 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: timer.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * システムクロックドライバ + */ + +#include +#include +#include + +/* + * タイマの起動処理 + */ +void +timer_initialize(VP_INT exinf) +{ + hw_timer_initialize(); +} + +/* + * タイマ割込みハンドラ + */ +void +timer_handler() +{ + hw_timer_int_clear(); /* タイマ割込み要求のクリア */ + _syscall(isig_tim()); /* タイムティックの供給 */ +} + +/* + * タイマの停止処理 + */ +void +timer_terminate(VP_INT exinf) +{ + hw_timer_terminate(); +} diff --git a/uzume_prototype/kernel/systask/timer.cfg b/uzume_prototype/kernel/systask/timer.cfg new file mode 100644 index 0000000..1e7805c --- /dev/null +++ b/uzume_prototype/kernel/systask/timer.cfg @@ -0,0 +1,14 @@ +/* + * @(#) $Id: timer.cfg,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * システムクロックドライバのコンフィギュレーションファイル + */ + +#include +INCLUDE("\"hw_timer.h\""); +INCLUDE("\"timer.h\""); +ATT_INI({ TA_HLNG, 0, timer_initialize }); +VATT_TER({ TA_HLNG, 0, timer_terminate }); +DEF_INH(INHNO_TIMER, { TA_HLNG, timer_handler }); diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/chip_dump_empty.c b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/chip_dump_empty.c new file mode 100644 index 0000000..014717f --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/chip_dump_empty.c @@ -0,0 +1,37 @@ +/** + * \file chip_dump_dummy.c +* \brief ADSP-BF592用のポストモーテムダンプルーチン群(ダミー) + * + * chip_dump.cはコードサイズが大きく、例外時にしか必要としない機能のため、 + * sample1では機能を無効にしてフットプリントを少なくしている + * chip_dump.cを使用する場合、chip_dump.cのみFLASHに配置するなど対策が必要 + */ +#include "jsp_kernel.h" + +/** + * \brief ハードウェア・エラー・ハンドラ + * + * ハードウェア・エラー時に呼び出されて、ハードウェア・エラー・割り込みのポストモーテム処理を行う。 + * 最初にFPを手繰って、割り込みのスタックフレームを探す。次にすべての割り込みを禁止し、 + * UART0を占有したあと、ポーリングを使ってスタックに保存された各レジスタのダンプを行う。 + * DEF_INH(INHNO_HW_ERROR, { TA_HLNG, hwei_handler }); + * + */ +void spurious_int_handler() +{ +} + +/** + * \brief CPU例外ハンドラ + * + * CPU例外ハンドラとしてcfgファイルに登録する。 hwei_handler()は呼ばれたら戻ってこないが、 + * そのあとにもexpFlagに値を代入しているのは、最適化によってunlink命令の値がルーチン呼び出しの + * 前に移動することを防ぐためである。 + * + * DEF_EXC(CPUEXC1, { TA_HLNG, excp_handler} ); + * + */ +void spurious_exc_handler(VP p_excinf) +{ +} + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/config.bat b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/config.bat new file mode 100644 index 0000000..a0a8efc --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/config.bat @@ -0,0 +1,17 @@ +rem APPNAME アプリケーション名 +rem CFGPATH cfg.exeが置いてあるディレクトリ +rem VDSPPATH VisualDSP++のインストールディレクトリ +rem JSPPATH TOPPERS/JSPのディレクトリ +rem CPATH Blackfin CPU依存部のディレクトリ +rem SPATH システム依存部のディレクトリ + +set APPNAME=sample1 +set CFGPATH=X:\Work\jsp +set VDSPPATH=C:\Program Files\Analog Devices\VisualDSP 5.0 +set JSPPATH=X:\Work\jsp +set CPATH=%JSPPATH%\config\blackfin +set SPATH=%CPATH%\ezkit_bf592;%CPATH%\_common_bf592 + +"%VDSPPATH%\pp.exe" %APPNAME%.cfg -D__ECC__ -D__ADSPLPBLACKFIN__ -I"%CPATH%;%SPATH%;%JSPPATH%\systask;%JSPPATH%\include;" > %APPNAME%_pp.cfg +"%CFGPATH%\cfg.exe" %APPNAME%_pp.cfg +del %APPNAME%_pp.cfg diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/kernel_cfg.c b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/kernel_cfg.c new file mode 100644 index 0000000..b50a794 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/kernel_cfg.c @@ -0,0 +1,181 @@ +/* Configured with [sample1_pp.cfg ] */ + +#include "kernel_cfg.h" +#include "kernel_id.h" + +#if TKERNEL_PRVER >= 0x1040 +#define CFG_INTHDR_ENTRY(inthdr) INTHDR_ENTRY(inthdr) +#define CFG_EXCHDR_ENTRY(exchdr) EXCHDR_ENTRY(exchdr) +#define CFG_INT_ENTRY(inthdr) INT_ENTRY(inthdr) +#define CFG_EXC_ENTRY(exchdr) EXC_ENTRY(exchdr) +#else +#error "This configuration file has no compatibility with TOPPERS/JSP rel 1.3 or earlier." +#endif + +#ifndef __EMPTY_LABEL +#define __EMPTY_LABEL(x,y) x y[0] +#endif + +#if TKERNEL_PRID != 0x0001u /* TOPPERS/JSP */ +#error "You can not use this configuration file without TOPPERS/JSP" +#endif + + /* User specified include files*/ +#include "sample1.h" +#include "hw_timer.h" +#include "timer.h" +#include "hw_serial.h" +#include "serial.h" +#include "logtask.h" + + + /* Object initializer [task] */ + +#define TNUM_TSKID 5 + +const ID _kernel_tmax_tskid = (TMIN_TSKID + TNUM_TSKID - 1); + +static __STK_UNIT __stack_TASK1[__TCOUNT_STK_UNIT(1024)]; +static __STK_UNIT __stack_TASK2[__TCOUNT_STK_UNIT(1024)]; +static __STK_UNIT __stack_TASK3[__TCOUNT_STK_UNIT(1024)]; +static __STK_UNIT __stack_MAIN_TASK[__TCOUNT_STK_UNIT(1024)]; +static __STK_UNIT __stack_LOGTASK[__TCOUNT_STK_UNIT(LOGTASK_STACK_SIZE)]; + +const TINIB _kernel_tinib_table[TNUM_TSKID] = { + {0, (VP_INT)(( VP_INT ) 1), (FP)(task), INT_PRIORITY(10), __TROUND_STK_UNIT(1024), __stack_TASK1, 0, (FP)(tex_routine)}, + {0, (VP_INT)(( VP_INT ) 2), (FP)(task), INT_PRIORITY(10), __TROUND_STK_UNIT(1024), __stack_TASK2, 0, (FP)(tex_routine)}, + {0, (VP_INT)(( VP_INT ) 3), (FP)(task), INT_PRIORITY(10), __TROUND_STK_UNIT(1024), __stack_TASK3, 0, (FP)(tex_routine)}, + {0x00u | 0x02u, (VP_INT)(0), (FP)(main_task), INT_PRIORITY(5), __TROUND_STK_UNIT(1024), __stack_MAIN_TASK, TA_NULL, (FP)(NULL)}, + {0x00u | 0x02u, (VP_INT)(( VP_INT ) LOGTASK_PORTID), (FP)(logtask), INT_PRIORITY(LOGTASK_PRIORITY), __TROUND_STK_UNIT(LOGTASK_STACK_SIZE), __stack_LOGTASK, TA_NULL, (FP)(NULL)} +}; + +const ID _kernel_torder_table[TNUM_TSKID] = {1,2,3,4,5}; + +TCB _kernel_tcb_table[TNUM_TSKID]; + + + /* Object initializer [semaphore] */ + +#define TNUM_SEMID 2 + +const ID _kernel_tmax_semid = (TMIN_SEMID + TNUM_SEMID - 1); + +const SEMINIB _kernel_seminib_table[TNUM_SEMID] = { + {1, 0, 1}, + {1, 1, 1} +}; + +SEMCB _kernel_semcb_table[TNUM_SEMID]; + + + /* Object initializer [eventflag] */ + +#define TNUM_FLGID 0 + +const ID _kernel_tmax_flgid = (TMIN_FLGID + TNUM_FLGID - 1); + +__EMPTY_LABEL(const FLGINIB, _kernel_flginib_table); +__EMPTY_LABEL(FLGCB, _kernel_flgcb_table); + + + /* Object initializer [dataqueue] */ + +#define TNUM_DTQID 0 + +const ID _kernel_tmax_dtqid = (TMIN_DTQID + TNUM_DTQID - 1); + +__EMPTY_LABEL(const DTQINIB, _kernel_dtqinib_table); +__EMPTY_LABEL(DTQCB, _kernel_dtqcb_table); + + + /* Object initializer [mailbox] */ + +#define TNUM_MBXID 0 + +const ID _kernel_tmax_mbxid = (TMIN_MBXID + TNUM_MBXID - 1); + +__EMPTY_LABEL(const MBXINIB, _kernel_mbxinib_table); +__EMPTY_LABEL(MBXCB, _kernel_mbxcb_table); + + + /* Object initializer [mempfix] */ + +#define TNUM_MPFID 0 + +const ID _kernel_tmax_mpfid = (TMIN_MPFID + TNUM_MPFID - 1); + +__EMPTY_LABEL(const MPFINIB, _kernel_mpfinib_table); +__EMPTY_LABEL(MPFCB, _kernel_mpfcb_table); + + + /* Object initializer [cyclic] */ + +#define TNUM_CYCID 1 + +const ID _kernel_tmax_cycid = (TMIN_CYCID + TNUM_CYCID - 1); + +const CYCINIB _kernel_cycinib_table[TNUM_CYCID] = { + {0,0,(FP)(cyclic_handler),2000,0} +}; + +CYCCB _kernel_cyccb_table[TNUM_CYCID]; + + + /* Object initializer [interrupt] */ + +#define TNUM_INHNO 3 + +const UINT _kernel_tnum_inhno = TNUM_INHNO; + +CFG_INTHDR_ENTRY(sio0_rx_handler); +CFG_INTHDR_ENTRY(sio0_tx_handler); +CFG_INTHDR_ENTRY(timer_handler); + +const INHINIB _kernel_inhinib_table[TNUM_INHNO] = { + {INHNO_SIO0_RX,0,(FP)CFG_INT_ENTRY(sio0_rx_handler)}, + {INHNO_SIO0_TX,0,(FP)CFG_INT_ENTRY(sio0_tx_handler)}, + {INHNO_TIMER,0,(FP)CFG_INT_ENTRY(timer_handler)} +}; + + + /* Object initializer [exception] */ + +#define TNUM_EXCNO 1 + +const UINT _kernel_tnum_excno = TNUM_EXCNO; + +CFG_EXCHDR_ENTRY(cpuexc_handler); + +const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = { + {0,0,(FP)CFG_EXC_ENTRY(cpuexc_handler)} +}; + + /* Initialization handler */ + +void +_kernel_call_inirtn(void) +{ + timer_initialize( (VP_INT)(0) ); + serial_initialize( (VP_INT)(0) ); +} + +void +_kernel_call_terrtn(void) +{ + timer_terminate( (VP_INT)(0) ); +} + + /* Object initialization routine */ + +void +_kernel_object_initialize(void) +{ + _kernel_task_initialize(); + _kernel_semaphore_initialize(); + _kernel_cyclic_initialize(); + _kernel_interrupt_initialize(); + _kernel_exception_initialize(); +} + +TMEVTN _kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID]; + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/kernel_id.h b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/kernel_id.h new file mode 100644 index 0000000..bf1af50 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/kernel_id.h @@ -0,0 +1,16 @@ +#ifndef KERNEL_ID_H +#define KERNEL_ID_H + + /* object identifier deifnition */ + +#define CYCHDR1 1 +#define LOGTASK 5 +#define MAIN_TASK 4 +#define SERIAL_RCV_SEM1 1 +#define SERIAL_SND_SEM1 2 +#define TASK1 1 +#define TASK2 2 +#define TASK3 3 + +#endif /* KERNEL_ID_H */ + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/readme.txt b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/readme.txt new file mode 100644 index 0000000..3ccedb9 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/readme.txt @@ -0,0 +1,21 @@ +TOPPERS/JSPのsample1アプリケーションをEZ-KIT Lite BF592 +移植した。 + +ビルドに先立って、jsp/config/blackfin/ezkit_bf592/libkernel.dpjを +ビルドして、libekernel.dlbを作っておくこと。 + +また、jsp/utils/blackfin-vdsp/offset.hは、必要に応じて +作り直すこと。 + +VisualDSP++のICEを使ってロードする場合には、実行直前に次の +二つのレジスタの値に注意すること。 + +sample1.ldfは、VisualDSP++に作らせたあと、自動更新を +停止し、crtを削除したものである。 + +異なるシステム依存部用に改造する場合は、プロジェクトの +Cコンパイラ、およびアセンブラのインクルード・パスを必ず +変更すること。 + +2012/07/20追加 +Visual DSP++ 5.0 Update 10でビルド&動作確認 diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/sample1.c b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/sample1.c new file mode 100644 index 0000000..dcd8a03 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/sample1.c @@ -0,0 +1,417 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2004-2006 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)縲・4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: sample1.c,v 1.1 2012/07/20 07:36:00 maduki Exp $ + */ + +/* + * サンプルプログラム(1)の本体 + * + * JSPカーネルの基本的な動作を確認するためのサンプルプログラム. + * + * プログラムの概要: + * + * ユーザインタフェースを受け持つメインタスク(タスクID: MAIN_TASK, + * 優先度: MAIN_PRIORITY)と,三つの並列実行されるタスク(タスクID: + * TASK1縲弋ASK3,初期優先度: MID_PRIORITY)で構成される.また,起動周 + * 期が2秒の周期ハンドラ(周期ハンドラID: CYCHDR1)を用いる. + * + * 並列実行されるタスクは,task_loop 回空ループを実行する度に,タスク + * が実行中であることをあらわすメッセージを表示する. + * + * 周期ハンドラは,三つの優先度(HIGH_PRIORITY,MID_PRIORITY, + * LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は, + * 周期ハンドラは停止状態になっている. + * + * メインタスクは,シリアルI/Oポートからの文字入力を行い(文字入力を + * 待っている間は,並列実行されるタスクが実行されている),入力された + * 文字に対応した処理を実行する.入力された文字と処理の関係は次の通り. + * Control-C または 'Q' が入力されると,プログラムを終了する. + * + * '1' : 以降のコマンドは TASK1 に対して行う. + * '2' : 以降のコマンドは TASK2 に対して行う. + * '3' : 以降のコマンドは TASK3 に対して行う. + * 'a' : タスクを act_tsk により起動する. + * 'A' : タスクに対する起動要求を can_act によりキャンセルする. + * 'e' : タスクに ext_tsk を呼び出させ,終了させる. + * 't' : タスクを ter_tsk により強制終了する. + * '>' : タスクの優先度を HIGH_PRIORITY にする. + * '=' : タスクの優先度を MID_PRIORITY にする. + * '<' : タスクの優先度を LOW_PRIORITY にする. + * 'G' : タスクの優先度を get_pri で読み出す. + * 's' : タスクに slp_tsk を呼び出させ,起床待ちにさせる. + * 'S' : タスクに tslp_tsk(10秒) を呼び出させ,起床待ちにさせる. + * 'w' : タスクを wup_tsk により起床する. + * 'W' : タスクに対する起床要求を can_wup によりキャンセルする. + * 'l' : タスクを rel_wai により強制的に待ち解除にする. + * 'u' : タスクを sus_tsk により強制待ち状態にする. + * 'm' : タスクの強制待ち状態を rsm_tsk により解除する. + * 'M' : タスクの強制待ち状態を frsm_tsk により強制解除する. + * 'd' : タスクに dly_tsk(10秒) を呼び出させ,時間経過待ちにさせる. + * 'x' : タスクにパターン 0x0001 の例外処理を要求する. + * 'X' : タスクにパターン 0x0002 の例外処理を要求する. + * 'y' : タスクに dis_tex を呼び出させ,タスク例外を禁止する. + * 'Y' : タスクに ena_tex を呼び出させ,タスク例外を許可する. + * 'r' : 三つの優先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)の + * レディキューを回転させる. + * 'c' : 周期ハンドラを動作させる. + * 'C' : 周期ハンドラを停止させる. + * 'z' : CPU例外を発生させる. + * 'Z' : CPUロック状態でCPU例外を発生させる(プログラムを終了する). + * 'V' : vxget_tim で性能評価用システム時刻を2回読む. + * 'v' : 発行したシステムコールを表示する(デフォルト). + * 'q' : 発行したシステムコールを表示しない. + */ + +#include +#include "kernel_id.h" +#include "sample1.h" + +/* + * 並行実行されるタスクへのメッセージ領域 + */ +char message[3]; + +/* + * ループ回数 + */ +UW task_loop; /* タスク内でのループ回数 */ +UW tex_loop; /* 例外処理ルーチン内でのループ回数 */ + +/* + * 並行実行されるタスク + */ +void task(VP_INT exinf) +{ + volatile UW i; + INT n = 0; + INT tskno = (INT) exinf; + const char *graph[] = { "|", " +", " *" }; + char c; + + ena_tex(); + while (1) { + syslog(LOG_NOTICE, "task%d is running (%03d). %s", + tskno, ++n, graph[tskno-1]); + for (i = 0; i < task_loop; i++); + c = message[tskno-1]; + message[tskno-1] = 0; + switch (c) { + case 'e': + syslog(LOG_INFO, "#%d#ext_tsk()", tskno); + ext_tsk(); + case 's': + syslog(LOG_INFO, "#%d#slp_tsk()", tskno); + syscall(slp_tsk()); + break; + case 'S': + syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno); + syscall(tslp_tsk(10000)); + break; + case 'd': + syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno); + syscall(dly_tsk(10000)); + break; + case 'y': + syslog(LOG_INFO, "#%d#dis_tex()", tskno); + syscall(dis_tex()); + break; + case 'Y': + syslog(LOG_INFO, "#%d#ena_tex()", tskno); + syscall(ena_tex()); + break; +#ifdef CPUEXC1 + case 'z': + syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); + RAISE_CPU_EXCEPTION; + break; + case 'Z': + loc_cpu(); + syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); + RAISE_CPU_EXCEPTION; + unl_cpu(); + break; +#endif /* CPUEXC1 */ + default: + break; + } + } +} + +/* + * 並行して実行されるタスク用のタスク例外処理ルーチン + */ +void tex_routine(TEXPTN texptn, VP_INT exinf) +{ + volatile UW i; + INT tskno = (INT) exinf; + + syslog(LOG_NOTICE, "task%d receives exception 0x%04x. ", + tskno, texptn); + for (i = 0; i < tex_loop; i++); + + if (texptn & 0x8000) { + syslog(LOG_INFO, "#%d#ext_tsk()", tskno); + ext_tsk(); + } +} + +/* + * CPU例外ハンドラ + */ +#ifdef CPUEXC1 + +void +cpuexc_handler(VP p_excinf) +{ + ID tskid; + + syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", + p_excinf); + if (sns_ctx() != TRUE) { + syslog(LOG_WARNING, + "sns_ctx() is not TRUE in CPU exception handler."); + } + if (sns_dpn() != TRUE) { + syslog(LOG_WARNING, + "sns_dpn() is not TRUE in CPU exception handler."); + } + syslog(LOG_DEBUG, + "sns_loc = %d sns_dsp = %d", sns_loc(), sns_dsp()); + syslog(LOG_DEBUG, + "vxsns_loc = %d vxsns_ctx = %d vxsns_dsp = %d vxsns_dpn = %d", + vxsns_loc(p_excinf), vxsns_ctx(p_excinf), + vxsns_dsp(p_excinf), vxsns_dpn(p_excinf)); + + if (!vxsns_loc(p_excinf) && !vxsns_ctx(p_excinf)) { + syscall(iget_tid(&tskid)); + syscall(iras_tex(tskid, 0x8000)); + } + else { + syslog(LOG_NOTICE, "Sample program ends with exception."); + kernel_exit(); + } +} + +#endif /* CPUEXC1 */ + +/* + * 周期ハンドラ + * + * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー + * を回転させる. + */ +void cyclic_handler(VP_INT exinf) +{ + irot_rdq(HIGH_PRIORITY); + irot_rdq(MID_PRIORITY); + irot_rdq(LOW_PRIORITY); +} + +/* + * メインタスク + */ +void main_task(VP_INT exinf) +{ + char c; + ID tskid = TASK1; + volatile UW i; + INT tskno = 1; + ER_UINT ercd; + PRI tskpri; + SYSTIM stime1, stime2; +#ifndef OMIT_VGET_TIM + SYSUTIM utime1, utime2; +#endif /* OMIT_VGET_TIM */ + + vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); + syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (INT) exinf); + + syscall(serial_ctl_por(TASK_PORTID, + (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); + + /* + * ループ回数の設定 + */ + task_loop = LOOP_REF; + get_tim(&stime1); + for (i = 0; i < task_loop; i++); + get_tim(&stime2); + task_loop = LOOP_REF * 400 / (stime2 - stime1); + tex_loop = task_loop / 5; + + /* + * タスクの起動 + */ + act_tsk(TASK1); + act_tsk(TASK2); + act_tsk(TASK3); + + /* + * メインループ + */ + do { + syscall(serial_rea_dat(TASK_PORTID, &c, 1)); + switch (c) { + case 'e': + case 's': + case 'S': + case 'd': + case 'y': + case 'Y': + case 'z': + case 'Z': + message[tskno-1] = c; + break; + case '1': + tskno = 1; + tskid = TASK1; + break; + case '2': + tskno = 2; + tskid = TASK2; + break; + case '3': + tskno = 3; + tskid = TASK3; + break; + case 'a': + syslog(LOG_INFO, "#act_tsk(%d)", tskno); + syscall(act_tsk(tskid)); + break; + case 'A': + syslog(LOG_INFO, "#can_act(%d)", tskno); + syscall(ercd = can_act(tskid)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "can_act(%d) returns %d", + tskno, ercd); + } + break; + case 't': + syslog(LOG_INFO, "#ter_tsk(%d)", tskno); + syscall(ter_tsk(tskid)); + break; + case '>': + syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno); + chg_pri(tskid, HIGH_PRIORITY); + break; + case '=': + syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno); + chg_pri(tskid, MID_PRIORITY); + break; + case '<': + syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno); + chg_pri(tskid, LOW_PRIORITY); + break; + case 'G': + syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno); + syscall(ercd = get_pri(tskid, &tskpri)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "priority of task %d is %d", + tskno, tskpri); + } + break; + case 'w': + syslog(LOG_INFO, "#wup_tsk(%d)", tskno); + syscall(wup_tsk(tskid)); + break; + case 'W': + syslog(LOG_INFO, "#can_wup(%d)", tskno); + syscall(ercd = can_wup(tskid)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "can_wup(%d) returns %d", + tskno, ercd); + } + break; + case 'l': + syslog(LOG_INFO, "#rel_wai(%d)", tskno); + syscall(rel_wai(tskid)); + break; + case 'u': + syslog(LOG_INFO, "#sus_tsk(%d)", tskno); + syscall(sus_tsk(tskid)); + break; + case 'm': + syslog(LOG_INFO, "#rsm_tsk(%d)", tskno); + syscall(rsm_tsk(tskid)); + break; + case 'M': + syslog(LOG_INFO, "#frsm_tsk(%d)", tskno); + syscall(frsm_tsk(tskid)); + break; + case 'x': + syslog(LOG_INFO, "#ras_tex(%d, 0x0001)", tskno); + syscall(ras_tex(tskid, 0x0001)); + break; + case 'X': + syslog(LOG_INFO, "#ras_tex(%d, 0x0002)", tskno); + syscall(ras_tex(tskid, 0x0002)); + break; + case 'r': + syslog(LOG_INFO, "#rot_rdq(three priorities)"); + rot_rdq(HIGH_PRIORITY); + rot_rdq(MID_PRIORITY); + rot_rdq(LOW_PRIORITY); + break; + case 'c': + sta_cyc(CYCHDR1); + break; + case 'C': + stp_cyc(CYCHDR1); + break; +#ifndef OMIT_VGET_TIM + case 'V': + syscall(vxget_tim(&utime1)); + syscall(vxget_tim(&utime2)); + syslog(LOG_NOTICE, "utime1 = %d, utime2 = %d", + (UINT) utime1, (UINT) utime2); + break; +#endif /* OMIT_VGET_TIM */ + case 'v': + vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); + break; + case 'q': + vmsk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG)); + break; + default: + break; + } + } while (c != '\003' && c != 'Q'); + + syslog(LOG_NOTICE, "Sample program ends."); + kernel_exit(); +} diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/sample1.cfg b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/sample1.cfg new file mode 100644 index 0000000..3cf3361 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/sample1.cfg @@ -0,0 +1,28 @@ +/* + * @(#) $Id: sample1.cfg,v 1.1 2012/07/20 07:36:00 maduki Exp $ + */ + +/* + * サンプルプログラム(1)のシステムコンフィギュレーションファイル + */ + +#define _MACRO_ONLY +#include "sample1.h" + +INCLUDE("\"sample1.h\""); +CRE_TSK(TASK1, { TA_HLNG, (VP_INT) 1, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(TASK2, { TA_HLNG, (VP_INT) 2, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(TASK3, { TA_HLNG, (VP_INT) 3, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(MAIN_TASK, { TA_HLNG|TA_ACT, 0, main_task, MAIN_PRIORITY, + STACK_SIZE, NULL }); +DEF_TEX(TASK1, { TA_HLNG, tex_routine }); +DEF_TEX(TASK2, { TA_HLNG, tex_routine }); +DEF_TEX(TASK3, { TA_HLNG, tex_routine }); +CRE_CYC(CYCHDR1, { TA_HLNG, 0, cyclic_handler, 2000, 0 }); +#ifdef CPUEXC1 +DEF_EXC(CPUEXC1, { TA_HLNG, cpuexc_handler} ); +#endif /* CPUEXC1 */ + +#include "../systask/timer.cfg" +#include "../systask/serial.cfg" +#include "../systask/logtask.cfg" diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/sample1.dpj b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/sample1.dpj new file mode 100644 index 0000000..70bc4c5 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/sample1.dpj @@ -0,0 +1,243 @@ + + + + + ADSP-BF592-A + .dxe + Executable file + + + + + .\Debug + .\Debug + 0 + + + + + + + + + + + + + + + + + + + + + + + .\Release + .\Release + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/sample1.h b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/sample1.h new file mode 100644 index 0000000..d6a8b34 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/sample1.h @@ -0,0 +1,215 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2005 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)縲・4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: sample1.h,v 1.1 2012/07/20 07:36:00 maduki Exp $ + */ + +/* + * サンプルプログラム(1)のヘッダファイル + */ + +#include + +/* + * 各タスクの優先度の定義 + */ + +#define MAIN_PRIORITY 5 /* メインタスクの優先度 */ + /* HIGH_PRIORITY より高くすること */ + +#define HIGH_PRIORITY 9 /* 並列に実行されるタスクの優先度 */ +#define MID_PRIORITY 10 +#define LOW_PRIORITY 11 + +/* + * ターゲット依存の定義(CPU例外ハンドラの起動方法など) + */ + +#ifdef M68K + +#define CPUEXC1 5 /* ゼロ除算例外 */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) + +#elif defined(SH3) + +#define CPUEXC1 224 /* ロードエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) + +#elif defined(SH1) + +#define CPUEXC1 9 /* CPUアドレスエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) +#ifdef TOKIWA_SH1 +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#endif /* TOKIWA_SH1 */ + +#elif defined(ARMV4) + +#define CPUEXC1 4 /* ロードエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) + +#elif defined(V850) + +#elif defined(H8) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ + +#elif defined(H8S) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define LOOP_REF 4000L /* 速度計測用のループ回数 */ + +#elif defined(MICROBLAZE) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define STACK_SIZE 2048 /* タスクのスタックサイズ */ + +#elif defined(IA32) + +#define CPUEXC1 0 /* ゼロ除算例外 */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) +#define OMIT_VGET_TIM + +#elif defined(TMS320C54X) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define STACK_SIZE 320 /* タスクのスタックサイズ */ +#define LOOP_REF 500000L /* 速度計測用のループ回数 */ + +#elif defined(XSTORMY16) + +#define CPUEXC1 0 /* 無効命令例外 */ +#define RAISE_CPU_EXCEPTION __asm__( ".hword 0x0006" ) +#define OMIT_VGET_TIM /* vxget_tim()は非サポート */ +#define LOOP_REF 4000L /* 速度計測用のループ回数 */ +#define STACK_SIZE 256 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* SIOはポート2を用いる */ + +#elif defined(MIPS3) || defined(MIPS64) + +#define CPUEXC1 Bp /* ブレークポイント例外(ゼロ除算時に発生) */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) + +#elif defined(M16C) && defined(OAKS16) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ + +#elif defined(M16C) && defined(OAKS16_MINI) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 384 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ + +#elif defined(M16C) && defined(M3029) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(BLACKFIN) + +#define CPUEXC1 0 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm("excpt 0;") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 1024 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(LINUX) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define OMIT_VGET_TIM +#define LOOP_REF 4000000 /* 速度計測用のループ回数 */ + +#elif defined(NIOS2) + +#define CPUEXC1 0 /* 未実装命令例外 */ +#define RAISE_CPU_EXCEPTION Asm("div zero, zero, zero"); + +#elif defined(M32C) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(M32R) + +#define CPUEXC1 EXC_TRAP00 +#define RAISE_CPU_EXCEPTION Asm("trap 0") + +#elif defined(TLCS_900) && defined(ZUP_F16_EX) + +#define CPUEXC1 3 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION Asm(" swi 2") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ +#define OMIT_VGET_TIM + +#endif + +/* + * ターゲットに依存する可能性のある定数の定義 + */ + +#ifndef TASK_PORTID +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ +#endif /* TASK_PORTID */ + +#ifndef STACK_SIZE +#define STACK_SIZE 8192 /* タスクのスタックサイズ */ +#endif /* STACK_SIZE */ + +#ifndef LOOP_REF +#define LOOP_REF 1000000 /* 速度計測用のループ回数 */ +#endif /* LOOP_REF */ + +/* + * 関数のプロトタイプ宣言 + */ +#ifndef _MACRO_ONLY + +extern void task(VP_INT tskno); +extern void main_task(VP_INT exinf); +extern void tex_routine(TEXPTN texptn, VP_INT tskno); +extern void cyclic_handler(VP_INT exinf); +extern void cpuexc_handler(VP p_excinf); + +#endif /* _MACRO_ONLY */ diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/sample1.ldf b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/sample1.ldf new file mode 100644 index 0000000..a4b8297 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/sample1.ldf @@ -0,0 +1,406 @@ +/* MANAGED-BY-SYSTEM-BUILDER */ +/* VisualDSP++ 5.0 Update 10 */ +/* LDF Printer version: 5.9.0.1 */ +/* ldfgen.exe version: 5.9.0.1 */ +/* VDSG version: 5.9.0.1 */ + +/* +** ADSP-BF592-A linker description file generated on Jul 20, 2012 at 15:59:24. +** +** Copyright (C) 2000-2010 Analog Devices Inc., All Rights Reserved. +** +** This file is generated automatically based upon the options selected +** in the LDF Wizard. Changes to the LDF configuration should be made by +** changing the appropriate options rather than editing this file. +** +** Configuration:- +** crt_doj: sample1_acb_bf592_basiccrt.doj +** processor: ADSP-BF592-A +** product_name: VisualDSP++ 5.0 Update 10 +** si_revision: automatic +** default_silicon_revision_from_archdef: 0.2 +** using_cplusplus: true +** mem_init: false +** use_vdk: false +** use_mt: false +** use_eh: true +** use_argv: true +** running_from_internal_memory: true +** user_heap_src_file: X:\Work\jsp\tools\blackfin-vdsp\sample1_acb_bf592\sample1_acb_bf592_heaptab.c +** libraries_use_stdlib: true +** libraries_use_fileio_libs: false +** libraries_use_ieeefp_emulation_libs: false +** libraries_use_eh_enabled_libs: false +** libraries_use_fixed_point_io_libs: false +** libraries_use_utility_rom: true +** detect_stackoverflow: false +** system_heap: L1 +** system_heap_min_size: 2k +** system_stack: L1 +** system_stack_min_size: 2k +** use_sdram: false +** +*/ + +ARCHITECTURE(ADSP-BF592-A) + +SEARCH_DIR($ADI_DSP/Blackfin/lib) + + +#if !defined(NO_UTILITY_ROM) +# if defined(__SILICON_REVISION__) && (__SILICON_REVISION__==0) +# warning there is no Utility ROM in revision 0.0 +# define NO_UTILITY_ROM +# elif !defined(__SILICON_REVISION__) || (__SILICON_REVISION__==0xffff) +# warning \ + The Tools Utility ROM will not be used to link this application because \ +the silicon revision does not specify a specific revision number. This message \ +may be suppressed by defining the LDF macro NO_UTILITY_ROM. +# define NO_UTILITY_ROM +# endif +#endif + + +// Workarounds are enabled, exceptions are disabled. +#define RT_LIB_NAME(x) lib ## x ## y.dlb +#define RT_LIB_NAME_EH(x) lib ## x ## y.dlb +#define RT_LIB_NAME_MT(x) lib ## x ## y.dlb +#define RT_LIB_NAME_EH_MT(x) lib ## x ## y.dlb +#define RT_OBJ_NAME(x) x ## y.doj +#define RT_OBJ_NAME_MT(x) x ## mty.doj + + +$LIBRARIES = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + RT_LIB_NAME_MT(small532) + ,RT_LIB_NAME_MT(io532) + ,RT_LIB_NAME_MT(c532) + ,RT_LIB_NAME_MT(event532) + ,RT_LIB_NAME(ssl592-a) + ,RT_LIB_NAME(drv592-a) + ,RT_LIB_NAME_MT(x532) + ,RT_LIB_NAME_EH_MT(cpp532) + ,RT_LIB_NAME(f64ieee532) + ,RT_LIB_NAME(dsp532) + ,RT_LIB_NAME(sftflt532) + ,RT_LIB_NAME(etsi532) + ,RT_OBJ_NAME_MT(idle532) + ,RT_LIB_NAME_MT(rt_fileio532) + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJECTS = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $COMMAND_LINE_OBJECTS + , RT_LIB_NAME(profile532) +#if !defined(NO_UTILITY_ROM) + , romdata-BF592-A.doj +#endif + , $COMMAND_LINE_OBJECTS + , "cplbtab592-a.doj" + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + , RT_OBJ_NAME(crtn532) + ; + +$OBJS_LIBS_INTERNAL = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $OBJECTS{prefersMem("internal")}, $LIBRARIES{prefersMem("internal")} + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJS_LIBS_NOT_EXTERNAL = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $OBJECTS{!prefersMem("external")}, $LIBRARIES{!prefersMem("external")} + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + +MEMORY +{ +/* +** ADSP-BF592-A MEMORY MAP. +** +** The known memory spaces are as follows: +** +** 0xFFE00000 - 0xFFFFFFFF Core MMR registers (2MB) +** 0xFFC00000 - 0xFFDFFFFF System MMR registers (2MB) +** 0xFFB01000 - 0xFFBFFFFF Reserved +** 0xFFB00000 - 0xFFB00FFF Scratchpad SRAM (4K) +** 0xFFA20000 - 0xFFAFFFFF Reserved +** 0xFFA10000 - 0xFFA1FFFF L1 Instruction ROM (64K) +** 0xFFA08000 - 0xFFA0FFFF Reserved +** 0xFFA00000 - 0xFFA07FFF L1 Instruction SRAM (32K) +** 0xFF808000 - 0xFF9FFFFF Reserved +** 0xFF800000 - 0xFF807FFF L1 Data SRAM (32K) +** 0xEF001000 - 0xFF7FFFFF Reserved +** 0xEF000000 - 0xEF000FFF Boot ROM (4K) +** 0x00000000 - 0xEEFFFFFF Reserved +** +** Notes: +** 0xFF807FEF-0xFF807FFF Required by boot-loader. +*/ + + MEM_L1_SCRATCH { TYPE(RAM) START(0xFFB00000) END(0xFFB00FFF) WIDTH(8) } + MEM_L1_CODE { TYPE(RAM) START(0xFFA00000) END(0xFFA07FFF) WIDTH(8) } + MEM_L1_DATA { TYPE(RAM) START(0xFF800000) END(0xFF807EAF) WIDTH(8) } + MEM_ARGV { TYPE(RAM) START(0xFF807EB0) END(0xFF807FFF) WIDTH(8) } + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + +} /* MEMORY */ + +PROCESSOR p0 +{ + OUTPUT($COMMAND_LINE_OUTPUT_FILE) + RESOLVE(start, 0xFFA00000) + RESOLVE(___argv_string, 0xFF807F00) + KEEP(start, start) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + #if !defined(NO_UTILITY_ROM) + #include "ADSP-BF592-A-LDF.h" + #endif + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + SECTIONS + { + /* Workaround for hardware errata 05-00-0189 and 05-00-0310 - + ** "Speculative (and fetches made at boundary of reserved memory + ** space) for instruction or data fetches may cause false + ** protection exceptions" and "False hardware errors caused by + ** fetches at the boundary of reserved memory ". + ** + ** Done by avoiding use of 76 bytes from at the end of blocks + ** that are adjacent to reserved memory. Workaround is enabled + ** for appropriate silicon revisions (-si-revision switch). + */ + RESERVE(___wab0=MEMORY_END(MEM_L1_SCRATCH) - 75, ___l0 = 76) + RESERVE(___wab1=MEMORY_END(MEM_L1_CODE) - 75, ___l1 = 76) + RESERVE(___wab2=MEMORY_END(MEM_ARGV) - 75, ___l2 = 76) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + scratchpad NO_INIT + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(L1_scratchpad) $LIBRARIES(L1_scratchpad)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_SCRATCH + + L1_code + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(L1_code) $LIBRARIES(L1_code)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(noncache_code) $LIBRARIES(noncache_code)) + INPUT_SECTIONS($OBJECTS(cplb_code) $LIBRARIES(cplb_code)) + INPUT_SECTIONS($OBJECTS(cplb) $LIBRARIES(cplb)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(program)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(program)) + INPUT_SECTIONS($OBJECTS(program) $LIBRARIES(program)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_CODE + + L1_data_1 + { + INPUT_SECTION_ALIGN(4) + ___l1_data_cache_a = 0; + ___l1_data_cache_b = 0; + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(L1_data_a) $LIBRARIES(L1_data_a)) + INPUT_SECTIONS($OBJECTS(L1_data) $LIBRARIES(L1_data)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + RESERVE(heaps_and_stack_in_L1_data, heaps_and_stack_in_L1_data_length = 4096,4) + } > MEM_L1_DATA + + L1_data_bsz ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(L1_bsz) $LIBRARIES(L1_bsz)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(bsz)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(bsz)) + INPUT_SECTIONS($OBJECTS(bsz) $LIBRARIES(bsz)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA + + L1_data_tables + { + INPUT_SECTION_ALIGN(4) + FORCE_CONTIGUITY + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(ctor) $LIBRARIES(ctor)) + INPUT_SECTIONS($OBJECTS(ctorl) $LIBRARIES(ctorl)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(.gdt) $LIBRARIES(.gdt)) + INPUT_SECTIONS($OBJECTS(.gdtl) $LIBRARIES(.gdtl)) + INPUT_SECTIONS($OBJECTS(.frt) $LIBRARIES(.frt)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA + + L1_data_2 + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata)) + INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata)) + INPUT_SECTIONS($OBJECTS(cplb_data) $LIBRARIES(cplb_data)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(data1)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(data1)) + INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA + + L1_data_3 + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(vtbl) $LIBRARIES(vtbl)) + INPUT_SECTIONS($OBJECTS(.rtti) $LIBRARIES(.rtti)) + INPUT_SECTIONS($OBJECTS(.edt) $LIBRARIES(.edt)) + INPUT_SECTIONS($OBJECTS(.cht) $LIBRARIES(.cht)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA + + L1_data_stack_heap + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + RESERVE_EXPAND(heaps_and_stack_in_L1_data, heaps_and_stack_in_L1_data_length , 0, 4) + ldf_stack_space = heaps_and_stack_in_L1_data; + ldf_stack_end = (ldf_stack_space + (((heaps_and_stack_in_L1_data_length * 2048) / 4096) - 4)) & 0xfffffffc; + ldf_heap_space = ldf_stack_end + 4; + ldf_heap_end = (ldf_heap_space + (((heaps_and_stack_in_L1_data_length * 2048) / 4096) - 4)) & 0xfffffffc; + ldf_heap_length = ldf_heap_end - ldf_heap_space; + } > MEM_L1_DATA + + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } /* SECTIONS */ +} /* p0 */ + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/sample1_acb_bf592.dpg b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/sample1_acb_bf592.dpg new file mode 100644 index 0000000..7dfb2d9 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_acb_bf592/sample1_acb_bf592.dpg @@ -0,0 +1,12 @@ + + + + + + + + + libkernel + + + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/chip_dump_empty.c b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/chip_dump_empty.c new file mode 100644 index 0000000..7f88ea8 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/chip_dump_empty.c @@ -0,0 +1,37 @@ +/** + * \file chip_dump_dummy.c +* \brief ADSP-BF506用のポストモーテムダンプルーチン群(ダミー) + * + * chip_dump.cはコードサイズが大きく、例外時にしか必要としない機能のため、 + * sample1では機能を無効にしてフットプリントを少なくしている + * chip_dump.cを使用する場合、chip_dump.cのみFLASHに配置するなど対策が必要 + */ +#include "jsp_kernel.h" + +/** + * \brief ハードウェア・エラー・ハンドラ + * + * ハードウェア・エラー時に呼び出されて、ハードウェア・エラー・割り込みのポストモーテム処理を行う。 + * 最初にFPを手繰って、割り込みのスタックフレームを探す。次にすべての割り込みを禁止し、 + * UART0を占有したあと、ポーリングを使ってスタックに保存された各レジスタのダンプを行う。 + * DEF_INH(INHNO_HW_ERROR, { TA_HLNG, hwei_handler }); + * + */ +void spurious_int_handler() +{ +} + +/** + * \brief CPU例外ハンドラ + * + * CPU例外ハンドラとしてcfgファイルに登録する。 hwei_handler()は呼ばれたら戻ってこないが、 + * そのあとにもexpFlagに値を代入しているのは、最適化によってunlink命令の値がルーチン呼び出しの + * 前に移動することを防ぐためである。 + * + * DEF_EXC(CPUEXC1, { TA_HLNG, excp_handler} ); + * + */ +void spurious_exc_handler(VP p_excinf) +{ +} + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/config.bat b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/config.bat new file mode 100644 index 0000000..086d727 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/config.bat @@ -0,0 +1,17 @@ +rem APPNAME アプリケーション名 +rem CFGPATH cfg.exeが置いてあるディレクトリ +rem VDSPPATH VisualDSP++のインストールディレクトリ +rem JSPPATH TOPPERS/JSPのディレクトリ +rem CPATH Blackfin CPU依存部のディレクトリ +rem SPATH システム依存部のディレクトリ + +set APPNAME=sample1 +set CFGPATH=X:\Work\jsp +set VDSPPATH=C:\Program Files\Analog Devices\VisualDSP 5.0 +set JSPPATH=X:\Work\jsp +set CPATH=%JSPPATH%\config\blackfin +set SPATH=%CPATH%\ezkit_bf506;%CPATH%\_common_bf506 + +"%VDSPPATH%\pp.exe" %APPNAME%.cfg -D__ECC__ -D__ADSPLPBLACKFIN__ -I"%CPATH%;%SPATH%;%JSPPATH%\systask;%JSPPATH%\include;" > %APPNAME%_pp.cfg +"%CFGPATH%\cfg.exe" %APPNAME%_pp.cfg +del %APPNAME%_pp.cfg diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/kernel_cfg.c b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/kernel_cfg.c new file mode 100644 index 0000000..2e89dab --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/kernel_cfg.c @@ -0,0 +1,181 @@ +/* Configured with [sample1_pp.cfg ] */ + +#include "kernel_cfg.h" +#include "kernel_id.h" + +#if TKERNEL_PRVER >= 0x1040 +#define CFG_INTHDR_ENTRY(inthdr) INTHDR_ENTRY(inthdr) +#define CFG_EXCHDR_ENTRY(exchdr) EXCHDR_ENTRY(exchdr) +#define CFG_INT_ENTRY(inthdr) INT_ENTRY(inthdr) +#define CFG_EXC_ENTRY(exchdr) EXC_ENTRY(exchdr) +#else +#error "This configuration file has no compatibility with TOPPERS/JSP rel 1.3 or earlier." +#endif + +#ifndef __EMPTY_LABEL +#define __EMPTY_LABEL(x,y) x y[0] +#endif + +#if TKERNEL_PRID != 0x0001u /* TOPPERS/JSP */ +#error "You can not use this configuration file without TOPPERS/JSP" +#endif + + /* User specified include files*/ +#include "sample1.h" +#include "hw_timer.h" +#include "timer.h" +#include "hw_serial.h" +#include "serial.h" +#include "logtask.h" + + + /* Object initializer [task] */ + +#define TNUM_TSKID 5 + +const ID _kernel_tmax_tskid = (TMIN_TSKID + TNUM_TSKID - 1); + +static __STK_UNIT __stack_TASK1[__TCOUNT_STK_UNIT(1024)]; +static __STK_UNIT __stack_TASK2[__TCOUNT_STK_UNIT(1024)]; +static __STK_UNIT __stack_TASK3[__TCOUNT_STK_UNIT(1024)]; +static __STK_UNIT __stack_MAIN_TASK[__TCOUNT_STK_UNIT(1024)]; +static __STK_UNIT __stack_LOGTASK[__TCOUNT_STK_UNIT(LOGTASK_STACK_SIZE)]; + +const TINIB _kernel_tinib_table[TNUM_TSKID] = { + {0, (VP_INT)(( VP_INT ) 1), (FP)(task), INT_PRIORITY(10), __TROUND_STK_UNIT(1024), __stack_TASK1, 0, (FP)(tex_routine)}, + {0, (VP_INT)(( VP_INT ) 2), (FP)(task), INT_PRIORITY(10), __TROUND_STK_UNIT(1024), __stack_TASK2, 0, (FP)(tex_routine)}, + {0, (VP_INT)(( VP_INT ) 3), (FP)(task), INT_PRIORITY(10), __TROUND_STK_UNIT(1024), __stack_TASK3, 0, (FP)(tex_routine)}, + {0x00u | 0x02u, (VP_INT)(0), (FP)(main_task), INT_PRIORITY(5), __TROUND_STK_UNIT(1024), __stack_MAIN_TASK, TA_NULL, (FP)(NULL)}, + {0x00u | 0x02u, (VP_INT)(( VP_INT ) 1), (FP)(logtask), INT_PRIORITY(LOGTASK_PRIORITY), __TROUND_STK_UNIT(LOGTASK_STACK_SIZE), __stack_LOGTASK, TA_NULL, (FP)(NULL)} +}; + +const ID _kernel_torder_table[TNUM_TSKID] = {1,2,3,4,5}; + +TCB _kernel_tcb_table[TNUM_TSKID]; + + + /* Object initializer [semaphore] */ + +#define TNUM_SEMID 2 + +const ID _kernel_tmax_semid = (TMIN_SEMID + TNUM_SEMID - 1); + +const SEMINIB _kernel_seminib_table[TNUM_SEMID] = { + {1, 0, 1}, + {1, 1, 1} +}; + +SEMCB _kernel_semcb_table[TNUM_SEMID]; + + + /* Object initializer [eventflag] */ + +#define TNUM_FLGID 0 + +const ID _kernel_tmax_flgid = (TMIN_FLGID + TNUM_FLGID - 1); + +__EMPTY_LABEL(const FLGINIB, _kernel_flginib_table); +__EMPTY_LABEL(FLGCB, _kernel_flgcb_table); + + + /* Object initializer [dataqueue] */ + +#define TNUM_DTQID 0 + +const ID _kernel_tmax_dtqid = (TMIN_DTQID + TNUM_DTQID - 1); + +__EMPTY_LABEL(const DTQINIB, _kernel_dtqinib_table); +__EMPTY_LABEL(DTQCB, _kernel_dtqcb_table); + + + /* Object initializer [mailbox] */ + +#define TNUM_MBXID 0 + +const ID _kernel_tmax_mbxid = (TMIN_MBXID + TNUM_MBXID - 1); + +__EMPTY_LABEL(const MBXINIB, _kernel_mbxinib_table); +__EMPTY_LABEL(MBXCB, _kernel_mbxcb_table); + + + /* Object initializer [mempfix] */ + +#define TNUM_MPFID 0 + +const ID _kernel_tmax_mpfid = (TMIN_MPFID + TNUM_MPFID - 1); + +__EMPTY_LABEL(const MPFINIB, _kernel_mpfinib_table); +__EMPTY_LABEL(MPFCB, _kernel_mpfcb_table); + + + /* Object initializer [cyclic] */ + +#define TNUM_CYCID 1 + +const ID _kernel_tmax_cycid = (TMIN_CYCID + TNUM_CYCID - 1); + +const CYCINIB _kernel_cycinib_table[TNUM_CYCID] = { + {0,0,(FP)(cyclic_handler),2000,0} +}; + +CYCCB _kernel_cyccb_table[TNUM_CYCID]; + + + /* Object initializer [interrupt] */ + +#define TNUM_INHNO 3 + +const UINT _kernel_tnum_inhno = TNUM_INHNO; + +CFG_INTHDR_ENTRY(sio0_rx_handler); +CFG_INTHDR_ENTRY(sio0_tx_handler); +CFG_INTHDR_ENTRY(timer_handler); + +const INHINIB _kernel_inhinib_table[TNUM_INHNO] = { + {22,0,(FP)CFG_INT_ENTRY(sio0_rx_handler)}, + {23,0,(FP)CFG_INT_ENTRY(sio0_tx_handler)}, + {39,0,(FP)CFG_INT_ENTRY(timer_handler)} +}; + + + /* Object initializer [exception] */ + +#define TNUM_EXCNO 1 + +const UINT _kernel_tnum_excno = TNUM_EXCNO; + +CFG_EXCHDR_ENTRY(cpuexc_handler); + +const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = { + {0,0,(FP)CFG_EXC_ENTRY(cpuexc_handler)} +}; + + /* Initialization handler */ + +void +_kernel_call_inirtn(void) +{ + timer_initialize( (VP_INT)(0) ); + serial_initialize( (VP_INT)(0) ); +} + +void +_kernel_call_terrtn(void) +{ + timer_terminate( (VP_INT)(0) ); +} + + /* Object initialization routine */ + +void +_kernel_object_initialize(void) +{ + _kernel_task_initialize(); + _kernel_semaphore_initialize(); + _kernel_cyclic_initialize(); + _kernel_interrupt_initialize(); + _kernel_exception_initialize(); +} + +TMEVTN _kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID]; + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/kernel_id.h b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/kernel_id.h new file mode 100644 index 0000000..bf1af50 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/kernel_id.h @@ -0,0 +1,16 @@ +#ifndef KERNEL_ID_H +#define KERNEL_ID_H + + /* object identifier deifnition */ + +#define CYCHDR1 1 +#define LOGTASK 5 +#define MAIN_TASK 4 +#define SERIAL_RCV_SEM1 1 +#define SERIAL_SND_SEM1 2 +#define TASK1 1 +#define TASK2 2 +#define TASK3 3 + +#endif /* KERNEL_ID_H */ + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/readme.txt b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/readme.txt new file mode 100644 index 0000000..99f2cf5 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/readme.txt @@ -0,0 +1,34 @@ +TOPPERS/JSPのsample1アプリケーションをEZ-KIT Lite BF506 +移植した。 + +ビルドに先立って、jsp/config/blackfin/ezkit_bf506/libkernel.dpjを +ビルドして、libekernel.dlbを作っておくこと。 + +また、jsp/utils/blackfin-vdsp/offset.hは、必要に応じて +作り直すこと。 + +VisualDSP++のICEを使ってロードする場合には、実行直前に次の +二つのレジスタの値に注意すること。 + +PLL_CTL : 0x1400 +EBIU_SDBCTL.EBE : 0 + +TOPPERS/JSP for Blackfinはこの二つをチェックして、もし違う +値であると外部でPLLとSDRAMを変更したと認識してPLLの初期化を +中止する。これはクロックに依存するデバイスの動作を保護する +ためである。 + +sample1.ldfは、VisualDSP++に作らせたあと、自動更新を +停止し、crtを削除したものである。 + +異なるシステム依存部用に改造する場合は、プロジェクトの +Cコンパイラ、およびアセンブラのインクルード・パスを必ず +変更すること。 + +2012/07/20追加 +Visual DSP++ 5.0 Update 10でビルド&動作確認 + +sample1では、キャッシュをONにすると、L1-SRAMに収まらないので、 +OFFにしている。キャッシュをONにして使用する場合、sample1.ldfの +メモリエリアの指定を変更して、カーネルの一部をFLASHに配置する。 +例えば、OSとして緊急性の低いchip_dump.cの関数をFLASHに配置するなど。 diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/sample1.c b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/sample1.c new file mode 100644 index 0000000..e6353dd --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/sample1.c @@ -0,0 +1,417 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2004-2006 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)縲・4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: sample1.c,v 1.1 2011/11/24 04:59:47 maduki Exp $ + */ + +/* + * サンプルプログラム(1)の本体 + * + * JSPカーネルの基本的な動作を確認するためのサンプルプログラム. + * + * プログラムの概要: + * + * ユーザインタフェースを受け持つメインタスク(タスクID: MAIN_TASK, + * 優先度: MAIN_PRIORITY)と,三つの並列実行されるタスク(タスクID: + * TASK1縲弋ASK3,初期優先度: MID_PRIORITY)で構成される.また,起動周 + * 期が2秒の周期ハンドラ(周期ハンドラID: CYCHDR1)を用いる. + * + * 並列実行されるタスクは,task_loop 回空ループを実行する度に,タスク + * が実行中であることをあらわすメッセージを表示する. + * + * 周期ハンドラは,三つの優先度(HIGH_PRIORITY,MID_PRIORITY, + * LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は, + * 周期ハンドラは停止状態になっている. + * + * メインタスクは,シリアルI/Oポートからの文字入力を行い(文字入力を + * 待っている間は,並列実行されるタスクが実行されている),入力された + * 文字に対応した処理を実行する.入力された文字と処理の関係は次の通り. + * Control-C または 'Q' が入力されると,プログラムを終了する. + * + * '1' : 以降のコマンドは TASK1 に対して行う. + * '2' : 以降のコマンドは TASK2 に対して行う. + * '3' : 以降のコマンドは TASK3 に対して行う. + * 'a' : タスクを act_tsk により起動する. + * 'A' : タスクに対する起動要求を can_act によりキャンセルする. + * 'e' : タスクに ext_tsk を呼び出させ,終了させる. + * 't' : タスクを ter_tsk により強制終了する. + * '>' : タスクの優先度を HIGH_PRIORITY にする. + * '=' : タスクの優先度を MID_PRIORITY にする. + * '<' : タスクの優先度を LOW_PRIORITY にする. + * 'G' : タスクの優先度を get_pri で読み出す. + * 's' : タスクに slp_tsk を呼び出させ,起床待ちにさせる. + * 'S' : タスクに tslp_tsk(10秒) を呼び出させ,起床待ちにさせる. + * 'w' : タスクを wup_tsk により起床する. + * 'W' : タスクに対する起床要求を can_wup によりキャンセルする. + * 'l' : タスクを rel_wai により強制的に待ち解除にする. + * 'u' : タスクを sus_tsk により強制待ち状態にする. + * 'm' : タスクの強制待ち状態を rsm_tsk により解除する. + * 'M' : タスクの強制待ち状態を frsm_tsk により強制解除する. + * 'd' : タスクに dly_tsk(10秒) を呼び出させ,時間経過待ちにさせる. + * 'x' : タスクにパターン 0x0001 の例外処理を要求する. + * 'X' : タスクにパターン 0x0002 の例外処理を要求する. + * 'y' : タスクに dis_tex を呼び出させ,タスク例外を禁止する. + * 'Y' : タスクに ena_tex を呼び出させ,タスク例外を許可する. + * 'r' : 三つの優先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)の + * レディキューを回転させる. + * 'c' : 周期ハンドラを動作させる. + * 'C' : 周期ハンドラを停止させる. + * 'z' : CPU例外を発生させる. + * 'Z' : CPUロック状態でCPU例外を発生させる(プログラムを終了する). + * 'V' : vxget_tim で性能評価用システム時刻を2回読む. + * 'v' : 発行したシステムコールを表示する(デフォルト). + * 'q' : 発行したシステムコールを表示しない. + */ + +#include +#include "kernel_id.h" +#include "sample1.h" + +/* + * 並行実行されるタスクへのメッセージ領域 + */ +char message[3]; + +/* + * ループ回数 + */ +UW task_loop; /* タスク内でのループ回数 */ +UW tex_loop; /* 例外処理ルーチン内でのループ回数 */ + +/* + * 並行実行されるタスク + */ +void task(VP_INT exinf) +{ + volatile UW i; + INT n = 0; + INT tskno = (INT) exinf; + const char *graph[] = { "|", " +", " *" }; + char c; + + ena_tex(); + while (1) { + syslog(LOG_NOTICE, "task%d is running (%03d). %s", + tskno, ++n, graph[tskno-1]); + for (i = 0; i < task_loop; i++); + c = message[tskno-1]; + message[tskno-1] = 0; + switch (c) { + case 'e': + syslog(LOG_INFO, "#%d#ext_tsk()", tskno); + ext_tsk(); + case 's': + syslog(LOG_INFO, "#%d#slp_tsk()", tskno); + syscall(slp_tsk()); + break; + case 'S': + syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno); + syscall(tslp_tsk(10000)); + break; + case 'd': + syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno); + syscall(dly_tsk(10000)); + break; + case 'y': + syslog(LOG_INFO, "#%d#dis_tex()", tskno); + syscall(dis_tex()); + break; + case 'Y': + syslog(LOG_INFO, "#%d#ena_tex()", tskno); + syscall(ena_tex()); + break; +#ifdef CPUEXC1 + case 'z': + syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); + RAISE_CPU_EXCEPTION; + break; + case 'Z': + loc_cpu(); + syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); + RAISE_CPU_EXCEPTION; + unl_cpu(); + break; +#endif /* CPUEXC1 */ + default: + break; + } + } +} + +/* + * 並行して実行されるタスク用のタスク例外処理ルーチン + */ +void tex_routine(TEXPTN texptn, VP_INT exinf) +{ + volatile UW i; + INT tskno = (INT) exinf; + + syslog(LOG_NOTICE, "task%d receives exception 0x%04x. ", + tskno, texptn); + for (i = 0; i < tex_loop; i++); + + if (texptn & 0x8000) { + syslog(LOG_INFO, "#%d#ext_tsk()", tskno); + ext_tsk(); + } +} + +/* + * CPU例外ハンドラ + */ +#ifdef CPUEXC1 + +void +cpuexc_handler(VP p_excinf) +{ + ID tskid; + + syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", + p_excinf); + if (sns_ctx() != TRUE) { + syslog(LOG_WARNING, + "sns_ctx() is not TRUE in CPU exception handler."); + } + if (sns_dpn() != TRUE) { + syslog(LOG_WARNING, + "sns_dpn() is not TRUE in CPU exception handler."); + } + syslog(LOG_DEBUG, + "sns_loc = %d sns_dsp = %d", sns_loc(), sns_dsp()); + syslog(LOG_DEBUG, + "vxsns_loc = %d vxsns_ctx = %d vxsns_dsp = %d vxsns_dpn = %d", + vxsns_loc(p_excinf), vxsns_ctx(p_excinf), + vxsns_dsp(p_excinf), vxsns_dpn(p_excinf)); + + if (!vxsns_loc(p_excinf) && !vxsns_ctx(p_excinf)) { + syscall(iget_tid(&tskid)); + syscall(iras_tex(tskid, 0x8000)); + } + else { + syslog(LOG_NOTICE, "Sample program ends with exception."); + kernel_exit(); + } +} + +#endif /* CPUEXC1 */ + +/* + * 周期ハンドラ + * + * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー + * を回転させる. + */ +void cyclic_handler(VP_INT exinf) +{ + irot_rdq(HIGH_PRIORITY); + irot_rdq(MID_PRIORITY); + irot_rdq(LOW_PRIORITY); +} + +/* + * メインタスク + */ +void main_task(VP_INT exinf) +{ + char c; + ID tskid = TASK1; + volatile UW i; + INT tskno = 1; + ER_UINT ercd; + PRI tskpri; + SYSTIM stime1, stime2; +#ifndef OMIT_VGET_TIM + SYSUTIM utime1, utime2; +#endif /* OMIT_VGET_TIM */ + + vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); + syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (INT) exinf); + + syscall(serial_ctl_por(TASK_PORTID, + (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); + + /* + * ループ回数の設定 + */ + task_loop = LOOP_REF; + get_tim(&stime1); + for (i = 0; i < task_loop; i++); + get_tim(&stime2); + task_loop = LOOP_REF * 400 / (stime2 - stime1); + tex_loop = task_loop / 5; + + /* + * タスクの起動 + */ + act_tsk(TASK1); + act_tsk(TASK2); + act_tsk(TASK3); + + /* + * メインループ + */ + do { + syscall(serial_rea_dat(TASK_PORTID, &c, 1)); + switch (c) { + case 'e': + case 's': + case 'S': + case 'd': + case 'y': + case 'Y': + case 'z': + case 'Z': + message[tskno-1] = c; + break; + case '1': + tskno = 1; + tskid = TASK1; + break; + case '2': + tskno = 2; + tskid = TASK2; + break; + case '3': + tskno = 3; + tskid = TASK3; + break; + case 'a': + syslog(LOG_INFO, "#act_tsk(%d)", tskno); + syscall(act_tsk(tskid)); + break; + case 'A': + syslog(LOG_INFO, "#can_act(%d)", tskno); + syscall(ercd = can_act(tskid)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "can_act(%d) returns %d", + tskno, ercd); + } + break; + case 't': + syslog(LOG_INFO, "#ter_tsk(%d)", tskno); + syscall(ter_tsk(tskid)); + break; + case '>': + syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno); + chg_pri(tskid, HIGH_PRIORITY); + break; + case '=': + syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno); + chg_pri(tskid, MID_PRIORITY); + break; + case '<': + syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno); + chg_pri(tskid, LOW_PRIORITY); + break; + case 'G': + syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno); + syscall(ercd = get_pri(tskid, &tskpri)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "priority of task %d is %d", + tskno, tskpri); + } + break; + case 'w': + syslog(LOG_INFO, "#wup_tsk(%d)", tskno); + syscall(wup_tsk(tskid)); + break; + case 'W': + syslog(LOG_INFO, "#can_wup(%d)", tskno); + syscall(ercd = can_wup(tskid)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "can_wup(%d) returns %d", + tskno, ercd); + } + break; + case 'l': + syslog(LOG_INFO, "#rel_wai(%d)", tskno); + syscall(rel_wai(tskid)); + break; + case 'u': + syslog(LOG_INFO, "#sus_tsk(%d)", tskno); + syscall(sus_tsk(tskid)); + break; + case 'm': + syslog(LOG_INFO, "#rsm_tsk(%d)", tskno); + syscall(rsm_tsk(tskid)); + break; + case 'M': + syslog(LOG_INFO, "#frsm_tsk(%d)", tskno); + syscall(frsm_tsk(tskid)); + break; + case 'x': + syslog(LOG_INFO, "#ras_tex(%d, 0x0001)", tskno); + syscall(ras_tex(tskid, 0x0001)); + break; + case 'X': + syslog(LOG_INFO, "#ras_tex(%d, 0x0002)", tskno); + syscall(ras_tex(tskid, 0x0002)); + break; + case 'r': + syslog(LOG_INFO, "#rot_rdq(three priorities)"); + rot_rdq(HIGH_PRIORITY); + rot_rdq(MID_PRIORITY); + rot_rdq(LOW_PRIORITY); + break; + case 'c': + sta_cyc(CYCHDR1); + break; + case 'C': + stp_cyc(CYCHDR1); + break; +#ifndef OMIT_VGET_TIM + case 'V': + syscall(vxget_tim(&utime1)); + syscall(vxget_tim(&utime2)); + syslog(LOG_NOTICE, "utime1 = %d, utime2 = %d", + (UINT) utime1, (UINT) utime2); + break; +#endif /* OMIT_VGET_TIM */ + case 'v': + vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); + break; + case 'q': + vmsk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG)); + break; + default: + break; + } + } while (c != '\003' && c != 'Q'); + + syslog(LOG_NOTICE, "Sample program ends."); + kernel_exit(); +} diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/sample1.cfg b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/sample1.cfg new file mode 100644 index 0000000..2d104a9 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/sample1.cfg @@ -0,0 +1,28 @@ +/* + * @(#) $Id: sample1.cfg,v 1.2 2011/11/24 05:09:43 maduki Exp $ + */ + +/* + * サンプルプログラム(1)のシステムコンフィギュレーションファイル + */ + +#define _MACRO_ONLY +#include "sample1.h" + +INCLUDE("\"sample1.h\""); +CRE_TSK(TASK1, { TA_HLNG, (VP_INT) 1, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(TASK2, { TA_HLNG, (VP_INT) 2, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(TASK3, { TA_HLNG, (VP_INT) 3, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(MAIN_TASK, { TA_HLNG|TA_ACT, 0, main_task, MAIN_PRIORITY, + STACK_SIZE, NULL }); +DEF_TEX(TASK1, { TA_HLNG, tex_routine }); +DEF_TEX(TASK2, { TA_HLNG, tex_routine }); +DEF_TEX(TASK3, { TA_HLNG, tex_routine }); +CRE_CYC(CYCHDR1, { TA_HLNG, 0, cyclic_handler, 2000, 0 }); +#ifdef CPUEXC1 +DEF_EXC(CPUEXC1, { TA_HLNG, cpuexc_handler} ); +#endif /* CPUEXC1 */ + +#include "../systask/timer.cfg" +#include "../systask/serial.cfg" +#include "../systask/logtask.cfg" diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/sample1.dpj b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/sample1.dpj new file mode 100644 index 0000000..730b811 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/sample1.dpj @@ -0,0 +1,240 @@ + + + + + ADSP-BF506F + .dxe + Executable file + + + + + .\Debug + .\Debug + 0 + + + + + + + + + + + + + + + + + + + + + + + .\Release + .\Release + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/sample1.h b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/sample1.h new file mode 100644 index 0000000..51d1d5b --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/sample1.h @@ -0,0 +1,215 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2005 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)縲・4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: sample1.h,v 1.1 2011/11/24 04:59:47 maduki Exp $ + */ + +/* + * サンプルプログラム(1)のヘッダファイル + */ + +#include + +/* + * 各タスクの優先度の定義 + */ + +#define MAIN_PRIORITY 5 /* メインタスクの優先度 */ + /* HIGH_PRIORITY より高くすること */ + +#define HIGH_PRIORITY 9 /* 並列に実行されるタスクの優先度 */ +#define MID_PRIORITY 10 +#define LOW_PRIORITY 11 + +/* + * ターゲット依存の定義(CPU例外ハンドラの起動方法など) + */ + +#ifdef M68K + +#define CPUEXC1 5 /* ゼロ除算例外 */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) + +#elif defined(SH3) + +#define CPUEXC1 224 /* ロードエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) + +#elif defined(SH1) + +#define CPUEXC1 9 /* CPUアドレスエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) +#ifdef TOKIWA_SH1 +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#endif /* TOKIWA_SH1 */ + +#elif defined(ARMV4) + +#define CPUEXC1 4 /* ロードエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) + +#elif defined(V850) + +#elif defined(H8) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ + +#elif defined(H8S) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define LOOP_REF 4000L /* 速度計測用のループ回数 */ + +#elif defined(MICROBLAZE) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define STACK_SIZE 2048 /* タスクのスタックサイズ */ + +#elif defined(IA32) + +#define CPUEXC1 0 /* ゼロ除算例外 */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) +#define OMIT_VGET_TIM + +#elif defined(TMS320C54X) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define STACK_SIZE 320 /* タスクのスタックサイズ */ +#define LOOP_REF 500000L /* 速度計測用のループ回数 */ + +#elif defined(XSTORMY16) + +#define CPUEXC1 0 /* 無効命令例外 */ +#define RAISE_CPU_EXCEPTION __asm__( ".hword 0x0006" ) +#define OMIT_VGET_TIM /* vxget_tim()は非サポート */ +#define LOOP_REF 4000L /* 速度計測用のループ回数 */ +#define STACK_SIZE 256 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* SIOはポート2を用いる */ + +#elif defined(MIPS3) || defined(MIPS64) + +#define CPUEXC1 Bp /* ブレークポイント例外(ゼロ除算時に発生) */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) + +#elif defined(M16C) && defined(OAKS16) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ + +#elif defined(M16C) && defined(OAKS16_MINI) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 384 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ + +#elif defined(M16C) && defined(M3029) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(BLACKFIN) + +#define CPUEXC1 0 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm("excpt 0;") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 1024 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(LINUX) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define OMIT_VGET_TIM +#define LOOP_REF 4000000 /* 速度計測用のループ回数 */ + +#elif defined(NIOS2) + +#define CPUEXC1 0 /* 未実装命令例外 */ +#define RAISE_CPU_EXCEPTION Asm("div zero, zero, zero"); + +#elif defined(M32C) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(M32R) + +#define CPUEXC1 EXC_TRAP00 +#define RAISE_CPU_EXCEPTION Asm("trap 0") + +#elif defined(TLCS_900) && defined(ZUP_F16_EX) + +#define CPUEXC1 3 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION Asm(" swi 2") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ +#define OMIT_VGET_TIM + +#endif + +/* + * ターゲットに依存する可能性のある定数の定義 + */ + +#ifndef TASK_PORTID +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ +#endif /* TASK_PORTID */ + +#ifndef STACK_SIZE +#define STACK_SIZE 8192 /* タスクのスタックサイズ */ +#endif /* STACK_SIZE */ + +#ifndef LOOP_REF +#define LOOP_REF 1000000 /* 速度計測用のループ回数 */ +#endif /* LOOP_REF */ + +/* + * 関数のプロトタイプ宣言 + */ +#ifndef _MACRO_ONLY + +extern void task(VP_INT tskno); +extern void main_task(VP_INT exinf); +extern void tex_routine(TEXPTN texptn, VP_INT tskno); +extern void cyclic_handler(VP_INT exinf); +extern void cpuexc_handler(VP p_excinf); + +#endif /* _MACRO_ONLY */ diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/sample1.ldf b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/sample1.ldf new file mode 100644 index 0000000..f52fb94 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/sample1.ldf @@ -0,0 +1,499 @@ +/* MANAGED-BY-SYSTEM-BUILDER */ +/* VisualDSP++ 5.0 Update 8 */ +/* LDF Printer version: 5.8.0.3 */ +/* ldfgen.exe version: 5.8.0.3 */ +/* VDSG version: 5.8.0.3 */ + +/* +** ADSP-BF506F linker description file generated on Jun 09, 2010 at 22:41:24. +** +** Copyright (C) 2000-2010 Analog Devices Inc., All Rights Reserved. +** +** This file is generated automatically based upon the options selected +** in the LDF Wizard. Changes to the LDF configuration should be made by +** changing the appropriate options rather than editing this file. +** +** Configuration:- +** crt_doj: BF506F_EZKIT_POST_basiccrt.doj +** processor: ADSP-BF506F +** product_name: VisualDSP++ 5.0 Update 8 +** si_revision: automatic +** default_silicon_revision_from_archdef: 0.0 +** using_cplusplus: true +** mem_init: false +** use_vdk: false +** use_eh: true +** use_argv: true +** running_from_internal_memory: true +** user_heap_src_file: C:\Build_tools\ant_build\cvsStage\_5.0ExportBlackfinReGen\Examples\Blackfin\Examples\ADSP-BF506F EZ-KIT Lite\Power_On_Self_Test\BF506F_EZKIT_POST_heaptab.c +** libraries_use_stdlib: true +** libraries_use_fileio_libs: false +** libraries_use_ieeefp_emulation_libs: false +** libraries_use_eh_enabled_libs: false +** system_heap: L1 +** system_heap_min_size: 2k +** system_stack: L1 +** system_stack_min_size: 2k +** use_sdram: false +** +*/ + +ARCHITECTURE(ADSP-BF506F) + +SEARCH_DIR($ADI_DSP/Blackfin/lib) + + +// Workarounds are enabled, exceptions are disabled. +#define RT_LIB_NAME(x) lib ## x ## y.dlb +#define RT_LIB_NAME_EH(x) lib ## x ## y.dlb +#define RT_LIB_NAME_MT(x) lib ## x ## y.dlb +#define RT_LIB_NAME_EH_MT(x) lib ## x ## y.dlb +#define RT_OBJ_NAME(x) x ## y.doj +#define RT_OBJ_NAME_MT(x) x ## mty.doj + + +$LIBRARIES = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + RT_LIB_NAME_MT(small532) + ,RT_LIB_NAME_MT(io532) + ,RT_LIB_NAME_MT(c532) + ,RT_LIB_NAME_MT(event532) + ,RT_LIB_NAME(ssl506f) + ,RT_LIB_NAME(drv506f) + ,RT_LIB_NAME_MT(x532) + ,RT_LIB_NAME_EH_MT(cpp532) + ,RT_LIB_NAME_EH_MT(cpprt532) + ,RT_LIB_NAME(f64ieee532) + ,RT_LIB_NAME(dsp532) + ,RT_LIB_NAME(sftflt532) + ,RT_LIB_NAME(etsi532) + ,RT_OBJ_NAME_MT(idle532) + ,RT_LIB_NAME_MT(rt_fileio532) + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJECTS = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + RT_LIB_NAME(profile532) + , $COMMAND_LINE_OBJECTS + , "cplbtab506f.doj" + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + +/* , RT_OBJ_NAME(crtn506f) */ + ; + +$OBJS_LIBS_INTERNAL = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $OBJECTS{prefersMem("internal")}, $LIBRARIES{prefersMem("internal")} + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJS_LIBS_NOT_EXTERNAL = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $OBJECTS{!prefersMem("external")}, $LIBRARIES{!prefersMem("external")} + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJS_LIBS_WITH_AUTO_BREAKPOINTS = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $OBJECTS { FuncName("_main") || + FuncName("___lib_prog_term") || + FuncName("__primIO") || + FuncName("__ov_start") || + FuncName("__ov_end") || + FuncName("__dbg_assert") || + FuncName("__unknown_exception_occurred") || + FuncName("_cplb_init") || + FuncName("__KernelPanic") }, + $LIBRARIES { FuncName("_main") || + FuncName("___lib_prog_term") || + FuncName("__primIO") || + FuncName("__ov_start") || + FuncName("__ov_end") || + FuncName("__dbg_assert") || + FuncName("__unknown_exception_occurred") || + FuncName("_cplb_init") || + FuncName("__KernelPanic") } + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJS_LIBS_WITHOUT_AUTO_BREAKPOINTS = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $OBJECTS { !FuncName("_main") && + !FuncName("___lib_prog_term") && + !FuncName("__primIO") && + !FuncName("__ov_start") && + !FuncName("__ov_end") && + !FuncName("__dbg_assert") && + !FuncName("__unknown_exception_occurred") && + !FuncName("_cplb_init") && + !FuncName("__KernelPanic") }, + $LIBRARIES { !FuncName("_main") && + !FuncName("___lib_prog_term") && + !FuncName("__primIO") && + !FuncName("__ov_start") && + !FuncName("__ov_end") && + !FuncName("__dbg_assert") && + !FuncName("__unknown_exception_occurred") && + !FuncName("_cplb_init") && + !FuncName("__KernelPanic") } + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + +/*$VDSG */ +/* This code is preserved if the LDF is re-generated. */ + + +#define ASYNC0_MEMTYPE RAM +#define ASYNC1_MEMTYPE RAM +#define ASYNC2_MEMTYPE RAM +#define ASYNC3_MEMTYPE RAM + + +/*$VDSG */ + + +MEMORY +{ +/* +** ADSP-BF506F MEMORY MAP. +** +** The known memory spaces are as follows: +** +** Internal (core-accessible) memory map: +** ========================================= +** 0xFFE00000 - 0xFFFFFFFF Core MMR registers (2MB) +** 0xFFC00000 - 0xFFDFFFFF System MMR registers (2MB) +** 0xFFB01000 - 0xFFBFFFFF Reserved +** 0xFFB00000 - 0xFFB00FFF Scratch SRAM (4K) +** 0xFFA08000 - 0xFFAFFFFF Reserved +** 0xFFA04000 - 0xFFA07FFF L1 instruction SRAM/CACHE (16K) +** 0xFFA00000 - 0xFFA03FFF L1 instruction Bank A SRAM (16K) +** 0xFF808000 - 0xFF9FFFFF Reserved +** 0xFF804000 - 0xFF807FFF L1 Data Bank A SRAM/CACHE (16K) +** 0xFF800000 - 0XFF803FFF L1 Data Bank A SRAM (16K) +** 0xEF001000 - 0xFF7FFFFF Reserved +** +** External (interface-accessible) memory map: +** ============================================= +** 0xEF000000 - 0xEF000FFF Boot ROM (4K) +** 0x20400000 - 0xEEFFFFFF Reserved +** 0x20000000 - 0x203FFFFF Sync Flash (32M Bits) +** 0x00000000 - 0x1FFFFFFF Reserved +** +** Notes: +** 0xFF807FEF-0xFF807FFF Required by boot-loader. +*/ + + MEM_L1_SCRATCH { TYPE(RAM) START(0xFFB00000) END(0xFFB00FFF) WIDTH(8) } +/* MEM_L1_CODE_CACHE { TYPE(RAM) START(0xFFA08000) END(0xFFA07FFF) TYPE(RAM) WIDTH(8) } */ +/* MEM_L1_CODE { TYPE(RAM) START(0xFFA00000) END(0xFFA03FFF) TYPE(RAM) WIDTH(8) } */ + MEM_L1_CODE { TYPE(RAM) START(0xFFA00000) END(0xFFA07FFF) WIDTH(8) } + MEM_ARGV { TYPE(RAM) START(0xFF800000) END(0xFF8000FF) WIDTH(8) } +/* MEM_L1_DATA_A_CACHE { TYPE(RAM) START(0xFF804000) END(0xFF807FFF) TYPE(RAM) WIDTH(8) } */ +/* MEM_L1_DATA_A { TYPE(RAM) START(0xFF800000) END(0xFF803FFF) TYPE(RAM) WIDTH(8) } */ + MEM_L1_DATA_A { TYPE(RAM) START(0xFF800100) END(0xFF807FFF) WIDTH(8) } + MEM_FLASH_BOOT { TYPE(ASYNC0_MEMTYPE) START(0x20000000) END(0x2001FFFF) WIDTH(8) } + MEM_FLASH { TYPE(ASYNC0_MEMTYPE) START(0x20020000) END(0x203FFFFF) WIDTH(8) } + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + +} /* MEMORY */ + +PROCESSOR p0 +{ + OUTPUT($COMMAND_LINE_OUTPUT_FILE) + RESOLVE(start, 0xFFA00000) + RESOLVE(___argv_string, 0xFF800000) + KEEP(start, _main) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + SECTIONS + { + /* Workaround for hardware errata 05-00-0189 and 05-00-0310 - + ** "Speculative (and fetches made at boundary of reserved memory + ** space) for instruction or data fetches may cause false + ** protection exceptions" and "False hardware errors caused by + ** fetches at the boundary of reserved memory ". + ** + ** Done by avoiding use of 76 bytes from at the end of blocks + ** that are adjacent to reserved memory. Workaround is enabled + ** for appropriate silicon revisions (-si-revision switch). + */ + RESERVE(___wab0=MEMORY_END(MEM_L1_SCRATCH) - 75, ___l0 = 76) +/* RESERVE(___wab1=MEMORY_END(MEM_L1_CODE_CACHE) - 75, ___l1 = 76) */ + RESERVE(___wab2=MEMORY_END(MEM_L1_CODE) - 75, ___l2 = 76) +/* RESERVE(___wab5=MEMORY_END(MEM_L1_DATA_A_CACHE) - 75, ___l5 = 76) */ + RESERVE(___wab4=MEMORY_END(MEM_L1_DATA_A) - 75, ___l4 = 76) + RESERVE(___wab5=MEMORY_END(MEM_FLASH) - 75, ___l5 = 76) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + scratchpad NO_INIT + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(L1_scratchpad) $LIBRARIES(L1_scratchpad)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_SCRATCH + + L1_code + { + INPUT_SECTION_ALIGN(4) + ___l1_code_cache = 0; + INPUT_SECTIONS($OBJS_LIBS_WITH_AUTO_BREAKPOINTS(program)) + INPUT_SECTIONS($OBJECTS(L1_code) $LIBRARIES(L1_code)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(cplb_code) $LIBRARIES(cplb_code)) + INPUT_SECTIONS($OBJECTS(cplb) $LIBRARIES(cplb)) + INPUT_SECTIONS($OBJECTS(noncache_code) $LIBRARIES(noncache_code)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(program)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(program)) + INPUT_SECTIONS($OBJECTS(program) $LIBRARIES(program)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_CODE + + L1_data_a_tables + { + INPUT_SECTION_ALIGN(4) + FORCE_CONTIGUITY + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(ctor) $LIBRARIES(ctor)) + INPUT_SECTIONS($OBJECTS(ctorl) $LIBRARIES(ctorl)) + INPUT_SECTIONS($OBJECTS(.gdt) $LIBRARIES(.gdt)) + INPUT_SECTIONS($OBJECTS(.gdtl) $LIBRARIES(.gdtl)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_A + + L1_data_a_1 + { + INPUT_SECTION_ALIGN(4) + ___l1_data_cache_a = 0; + INPUT_SECTIONS($OBJECTS(L1_data_a) $LIBRARIES(L1_data_a)) + INPUT_SECTIONS($OBJECTS(L1_data) $LIBRARIES(L1_data)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + RESERVE(heaps_and_stack_in_L1_data_a, heaps_and_stack_in_L1_data_a_length = 4096,4) + } > MEM_L1_DATA_A + + L1_data_a_bsz ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS( $OBJECTS(L1_bsz) $LIBRARIES(L1_bsz)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_A + + bsz_L1_data_a ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(bsz)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(bsz)) + INPUT_SECTIONS($OBJECTS(bsz) $LIBRARIES(bsz)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_A + + L1_data_a + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(data1)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(data1)) + INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1)) + INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata)) + INPUT_SECTIONS($OBJECTS(cplb_data) $LIBRARIES(cplb_data)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_A + + L1_data_a_2 + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(vtbl) $LIBRARIES(vtbl)) + INPUT_SECTIONS($OBJECTS(.frt) $LIBRARIES(.frt)) + INPUT_SECTIONS($OBJECTS(.rtti) $LIBRARIES(.rtti)) + INPUT_SECTIONS($OBJECTS(.edt) $LIBRARIES(.edt)) + INPUT_SECTIONS($OBJECTS(.cht) $LIBRARIES(.cht)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_A + + L1_data_a_stack_heap + { + INPUT_SECTION_ALIGN(4) + RESERVE_EXPAND(heaps_and_stack_in_L1_data_a, heaps_and_stack_in_L1_data_a_length , 0, 4) + ldf_stack_space = heaps_and_stack_in_L1_data_a; + ldf_stack_end = (ldf_stack_space + (((heaps_and_stack_in_L1_data_a_length * 2048) / 4096) - 4)) & 0xfffffffc; + ldf_heap_space = ldf_stack_end + 4; + ldf_heap_end = (ldf_heap_space + (((heaps_and_stack_in_L1_data_a_length * 2048) / 4096) - 4)) & 0xfffffffc; + ldf_heap_length = ldf_heap_end - ldf_heap_space; + } > MEM_L1_DATA_A + + FLASH_code + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(FLASH_code) $LIBRARIES(FLASH_code)) + INPUT_SECTIONS($OBJS_LIBS_WITHOUT_AUTO_BREAKPOINTS(program)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_CODE /* MEM_FLASH */ + + FLASH_constdata + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(FLASH_data) $LIBRARIES(FLASH_data)) + INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata)) + INPUT_SECTIONS($OBJECTS(cplb_data) $LIBRARIES(cplb_data)) + INPUT_SECTIONS($OBJECTS(vtbl) $LIBRARIES(vtbl)) + INPUT_SECTIONS($OBJECTS(.frt) $LIBRARIES(.frt)) + INPUT_SECTIONS($OBJECTS(.rtti) $LIBRARIES(.rtti)) + INPUT_SECTIONS($OBJECTS(.edt) $LIBRARIES(.edt)) + INPUT_SECTIONS($OBJECTS(.cht) $LIBRARIES(.cht)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_CODE /* MEM_FLASH */ + + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } /* SECTIONS */ +} /* p0 */ + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/sample1_ezkit_bf506.dpg b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/sample1_ezkit_bf506.dpg new file mode 100644 index 0000000..ad93d46 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf506/sample1_ezkit_bf506.dpg @@ -0,0 +1,12 @@ + + + + + + + + + libkernel + + + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/chip_dump_empty.c b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/chip_dump_empty.c new file mode 100644 index 0000000..aec58c9 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/chip_dump_empty.c @@ -0,0 +1,38 @@ +/** + * \file chip_dump_dummy.c +* \brief ADSP-BF518用のポストモーテムダンプルーチン群(ダミー) + * + * chip_dump.cはコードサイズが大きく、例外時にしか必要としない機能のため、 + * sample1では機能を無効にしてフットプリントを少なくしている + * chip_dump.cを使用する場合、chip_dump.cのみSDRAMに配置するなど対策が必要 + */ +#include "jsp_kernel.h" +#include + +/** + * \brief ハードウェア・エラー・ハンドラ + * + * ハードウェア・エラー時に呼び出されて、ハードウェア・エラー・割り込みのポストモーテム処理を行う。 + * 最初にFPを手繰って、割り込みのスタックフレームを探す。次にすべての割り込みを禁止し、 + * UART0を占有したあと、ポーリングを使ってスタックに保存された各レジスタのダンプを行う。 + * DEF_INH(INHNO_HW_ERROR, { TA_HLNG, hwei_handler }); + * + */ +void spurious_int_handler() +{ +} + +/** + * \brief CPU例外ハンドラ + * + * CPU例外ハンドラとしてcfgファイルに登録する。 hwei_handler()は呼ばれたら戻ってこないが、 + * そのあとにもexpFlagに値を代入しているのは、最適化によってunlink命令の値がルーチン呼び出しの + * 前に移動することを防ぐためである。 + * + * DEF_EXC(CPUEXC1, { TA_HLNG, excp_handler} ); + * + */ +void spurious_exc_handler(VP p_excinf) +{ +} + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/config.bat b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/config.bat new file mode 100644 index 0000000..91998aa --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/config.bat @@ -0,0 +1,17 @@ +rem APPNAME ƒAƒvƒŠƒP[ƒVƒ‡ƒ“–¼ +rem CFGPATH cfg.exe‚ª’u‚¢‚Ä‚ ‚éƒfƒBƒŒƒNƒgƒŠ +rem VDSPPATH VisualDSP++‚̃Cƒ“ƒXƒg[ƒ‹ƒfƒBƒŒƒNƒgƒŠ +rem JSPPATH TOPPERS/JSP‚̃fƒBƒŒƒNƒgƒŠ +rem CPATH Blackfin CPUˆË‘¶•”‚̃fƒBƒŒƒNƒgƒŠ +rem SPATH ƒVƒXƒeƒ€ˆË‘¶•”‚̃fƒBƒŒƒNƒgƒŠ + +set APPNAME=sample1 +set CFGPATH=X:\Work\jsp\cfg +set VDSPPATH=C:\Program Files\Analog Devices\VisualDSP 5.0 +set JSPPATH=X:\Work\jsp +set CPATH=%JSPPATH%\config\blackfin +set SPATH=%CPATH%\ezkit_bf518;%CPATH%\_common_bf518 + +"%VDSPPATH%\pp.exe" %APPNAME%.cfg -D__ECC__ -D__ADSPLPBLACKFIN__ -I"%CPATH%;%SPATH%;%JSPPATH%\systask;%JSPPATH%\include;" > %APPNAME%_pp.cfg +"%CFGPATH%\cfg.exe" %APPNAME%_pp.cfg +del %APPNAME%_pp.cfg diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/kernel_cfg.c b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/kernel_cfg.c new file mode 100644 index 0000000..2e89dab --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/kernel_cfg.c @@ -0,0 +1,181 @@ +/* Configured with [sample1_pp.cfg ] */ + +#include "kernel_cfg.h" +#include "kernel_id.h" + +#if TKERNEL_PRVER >= 0x1040 +#define CFG_INTHDR_ENTRY(inthdr) INTHDR_ENTRY(inthdr) +#define CFG_EXCHDR_ENTRY(exchdr) EXCHDR_ENTRY(exchdr) +#define CFG_INT_ENTRY(inthdr) INT_ENTRY(inthdr) +#define CFG_EXC_ENTRY(exchdr) EXC_ENTRY(exchdr) +#else +#error "This configuration file has no compatibility with TOPPERS/JSP rel 1.3 or earlier." +#endif + +#ifndef __EMPTY_LABEL +#define __EMPTY_LABEL(x,y) x y[0] +#endif + +#if TKERNEL_PRID != 0x0001u /* TOPPERS/JSP */ +#error "You can not use this configuration file without TOPPERS/JSP" +#endif + + /* User specified include files*/ +#include "sample1.h" +#include "hw_timer.h" +#include "timer.h" +#include "hw_serial.h" +#include "serial.h" +#include "logtask.h" + + + /* Object initializer [task] */ + +#define TNUM_TSKID 5 + +const ID _kernel_tmax_tskid = (TMIN_TSKID + TNUM_TSKID - 1); + +static __STK_UNIT __stack_TASK1[__TCOUNT_STK_UNIT(1024)]; +static __STK_UNIT __stack_TASK2[__TCOUNT_STK_UNIT(1024)]; +static __STK_UNIT __stack_TASK3[__TCOUNT_STK_UNIT(1024)]; +static __STK_UNIT __stack_MAIN_TASK[__TCOUNT_STK_UNIT(1024)]; +static __STK_UNIT __stack_LOGTASK[__TCOUNT_STK_UNIT(LOGTASK_STACK_SIZE)]; + +const TINIB _kernel_tinib_table[TNUM_TSKID] = { + {0, (VP_INT)(( VP_INT ) 1), (FP)(task), INT_PRIORITY(10), __TROUND_STK_UNIT(1024), __stack_TASK1, 0, (FP)(tex_routine)}, + {0, (VP_INT)(( VP_INT ) 2), (FP)(task), INT_PRIORITY(10), __TROUND_STK_UNIT(1024), __stack_TASK2, 0, (FP)(tex_routine)}, + {0, (VP_INT)(( VP_INT ) 3), (FP)(task), INT_PRIORITY(10), __TROUND_STK_UNIT(1024), __stack_TASK3, 0, (FP)(tex_routine)}, + {0x00u | 0x02u, (VP_INT)(0), (FP)(main_task), INT_PRIORITY(5), __TROUND_STK_UNIT(1024), __stack_MAIN_TASK, TA_NULL, (FP)(NULL)}, + {0x00u | 0x02u, (VP_INT)(( VP_INT ) 1), (FP)(logtask), INT_PRIORITY(LOGTASK_PRIORITY), __TROUND_STK_UNIT(LOGTASK_STACK_SIZE), __stack_LOGTASK, TA_NULL, (FP)(NULL)} +}; + +const ID _kernel_torder_table[TNUM_TSKID] = {1,2,3,4,5}; + +TCB _kernel_tcb_table[TNUM_TSKID]; + + + /* Object initializer [semaphore] */ + +#define TNUM_SEMID 2 + +const ID _kernel_tmax_semid = (TMIN_SEMID + TNUM_SEMID - 1); + +const SEMINIB _kernel_seminib_table[TNUM_SEMID] = { + {1, 0, 1}, + {1, 1, 1} +}; + +SEMCB _kernel_semcb_table[TNUM_SEMID]; + + + /* Object initializer [eventflag] */ + +#define TNUM_FLGID 0 + +const ID _kernel_tmax_flgid = (TMIN_FLGID + TNUM_FLGID - 1); + +__EMPTY_LABEL(const FLGINIB, _kernel_flginib_table); +__EMPTY_LABEL(FLGCB, _kernel_flgcb_table); + + + /* Object initializer [dataqueue] */ + +#define TNUM_DTQID 0 + +const ID _kernel_tmax_dtqid = (TMIN_DTQID + TNUM_DTQID - 1); + +__EMPTY_LABEL(const DTQINIB, _kernel_dtqinib_table); +__EMPTY_LABEL(DTQCB, _kernel_dtqcb_table); + + + /* Object initializer [mailbox] */ + +#define TNUM_MBXID 0 + +const ID _kernel_tmax_mbxid = (TMIN_MBXID + TNUM_MBXID - 1); + +__EMPTY_LABEL(const MBXINIB, _kernel_mbxinib_table); +__EMPTY_LABEL(MBXCB, _kernel_mbxcb_table); + + + /* Object initializer [mempfix] */ + +#define TNUM_MPFID 0 + +const ID _kernel_tmax_mpfid = (TMIN_MPFID + TNUM_MPFID - 1); + +__EMPTY_LABEL(const MPFINIB, _kernel_mpfinib_table); +__EMPTY_LABEL(MPFCB, _kernel_mpfcb_table); + + + /* Object initializer [cyclic] */ + +#define TNUM_CYCID 1 + +const ID _kernel_tmax_cycid = (TMIN_CYCID + TNUM_CYCID - 1); + +const CYCINIB _kernel_cycinib_table[TNUM_CYCID] = { + {0,0,(FP)(cyclic_handler),2000,0} +}; + +CYCCB _kernel_cyccb_table[TNUM_CYCID]; + + + /* Object initializer [interrupt] */ + +#define TNUM_INHNO 3 + +const UINT _kernel_tnum_inhno = TNUM_INHNO; + +CFG_INTHDR_ENTRY(sio0_rx_handler); +CFG_INTHDR_ENTRY(sio0_tx_handler); +CFG_INTHDR_ENTRY(timer_handler); + +const INHINIB _kernel_inhinib_table[TNUM_INHNO] = { + {22,0,(FP)CFG_INT_ENTRY(sio0_rx_handler)}, + {23,0,(FP)CFG_INT_ENTRY(sio0_tx_handler)}, + {39,0,(FP)CFG_INT_ENTRY(timer_handler)} +}; + + + /* Object initializer [exception] */ + +#define TNUM_EXCNO 1 + +const UINT _kernel_tnum_excno = TNUM_EXCNO; + +CFG_EXCHDR_ENTRY(cpuexc_handler); + +const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = { + {0,0,(FP)CFG_EXC_ENTRY(cpuexc_handler)} +}; + + /* Initialization handler */ + +void +_kernel_call_inirtn(void) +{ + timer_initialize( (VP_INT)(0) ); + serial_initialize( (VP_INT)(0) ); +} + +void +_kernel_call_terrtn(void) +{ + timer_terminate( (VP_INT)(0) ); +} + + /* Object initialization routine */ + +void +_kernel_object_initialize(void) +{ + _kernel_task_initialize(); + _kernel_semaphore_initialize(); + _kernel_cyclic_initialize(); + _kernel_interrupt_initialize(); + _kernel_exception_initialize(); +} + +TMEVTN _kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID]; + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/kernel_id.h b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/kernel_id.h new file mode 100644 index 0000000..bf1af50 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/kernel_id.h @@ -0,0 +1,16 @@ +#ifndef KERNEL_ID_H +#define KERNEL_ID_H + + /* object identifier deifnition */ + +#define CYCHDR1 1 +#define LOGTASK 5 +#define MAIN_TASK 4 +#define SERIAL_RCV_SEM1 1 +#define SERIAL_SND_SEM1 2 +#define TASK1 1 +#define TASK2 2 +#define TASK3 3 + +#endif /* KERNEL_ID_H */ + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/readme.txt b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/readme.txt new file mode 100644 index 0000000..bf3d0d7 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/readme.txt @@ -0,0 +1,35 @@ +TOPPERS/JSPのsample1アプリケーションをEZ-KIT Lite BF518 +移植した。 + +ビルドに先立って、jsp/config/blackfin/ezkit_bf518/libkernel.dpjを +ビルドして、libekernel.dlbを作っておくこと。 + +また、jsp/utils/blackfin-vdsp/offset.hは、必要に応じて +作り直すこと。 + +VisualDSP++のICEを使ってロードする場合には、実行直前に次の +二つのレジスタの値に注意すること。 + +PLL_CTL : 0x0a00 (Rev.0.1の場合) / 0x0b00 (Rev.0.2の場合) +EBIU_SDBCTL.EBE : 0 + +TOPPERS/JSP for Blackfinはこの二つをチェックして、もし違う +値であると外部でPLLとSDRAMを変更したと認識してPLLの初期化を +中止する。これは外部SDRAMなどクロックに依存するデバイスの +動作を保護するためである。 + +sample1.ldfは、VisualDSP++に作らせたあと、自動更新を +停止し、crtを削除したものである。 + +異なるシステム依存部用に改造する場合は、プロジェクトの +Cコンパイラ、およびアセンブラのインクルード・パスを必ず +変更すること。 + +2012/07/20追加 +Visual DSP++ 5.0 Update 10でビルド&動作確認 + +sample1では、インストラクションキャッシュをONにすると、L1-SRAMに +収まらないので、OFFにしている。 +キャッシュをONにして使用する場合、sample1.ldfのメモリエリアの指定を +変更して、カーネルの一部をSDRAMに配置する。 +例えば、OSとして緊急性の低いchip_dump.cの関数をSDRAMに配置するなど。 diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/sample1.c b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/sample1.c new file mode 100644 index 0000000..9936cb5 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/sample1.c @@ -0,0 +1,417 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2004-2006 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: sample1.c,v 1.1 2012/07/20 04:03:13 maduki Exp $ + */ + +/* + * サンプルプログラム(1)の本体 + * + * JSPカーネルの基本的な動作を確認するためのサンプルプログラム. + * + * プログラムの概要: + * + * ユーザインタフェースを受け持つメインタスク(タスクID: MAIN_TASK, + * 優先度: MAIN_PRIORITY)と,三つの並列実行されるタスク(タスクID: + * TASK1縲弋ASK3,初期優先度: MID_PRIORITY)で構成される.また,起動周 + * 期が2秒の周期ハンドラ(周期ハンドラID: CYCHDR1)を用いる. + * + * 並列実行されるタスクは,task_loop 回空ループを実行する度に,タスク + * が実行中であることをあらわすメッセージを表示する. + * + * 周期ハンドラは,三つの優先度(HIGH_PRIORITY,MID_PRIORITY, + * LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は, + * 周期ハンドラは停止状態になっている. + * + * メインタスクは,シリアルI/Oポートからの文字入力を行い(文字入力を + * 待っている間は,並列実行されるタスクが実行されている),入力された + * 文字に対応した処理を実行する.入力された文字と処理の関係は次の通り. + * Control-C または 'Q' が入力されると,プログラムを終了する. + * + * '1' : 以降のコマンドは TASK1 に対して行う. + * '2' : 以降のコマンドは TASK2 に対して行う. + * '3' : 以降のコマンドは TASK3 に対して行う. + * 'a' : タスクを act_tsk により起動する. + * 'A' : タスクに対する起動要求を can_act によりキャンセルする. + * 'e' : タスクに ext_tsk を呼び出させ,終了させる. + * 't' : タスクを ter_tsk により強制終了する. + * '>' : タスクの優先度を HIGH_PRIORITY にする. + * '=' : タスクの優先度を MID_PRIORITY にする. + * '<' : タスクの優先度を LOW_PRIORITY にする. + * 'G' : タスクの優先度を get_pri で読み出す. + * 's' : タスクに slp_tsk を呼び出させ,起床待ちにさせる. + * 'S' : タスクに tslp_tsk(10秒) を呼び出させ,起床待ちにさせる. + * 'w' : タスクを wup_tsk により起床する. + * 'W' : タスクに対する起床要求を can_wup によりキャンセルする. + * 'l' : タスクを rel_wai により強制的に待ち解除にする. + * 'u' : タスクを sus_tsk により強制待ち状態にする. + * 'm' : タスクの強制待ち状態を rsm_tsk により解除する. + * 'M' : タスクの強制待ち状態を frsm_tsk により強制解除する. + * 'd' : タスクに dly_tsk(10秒) を呼び出させ,時間経過待ちにさせる. + * 'x' : タスクにパターン 0x0001 の例外処理を要求する. + * 'X' : タスクにパターン 0x0002 の例外処理を要求する. + * 'y' : タスクに dis_tex を呼び出させ,タスク例外を禁止する. + * 'Y' : タスクに ena_tex を呼び出させ,タスク例外を許可する. + * 'r' : 三つの優先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)の + * レディキューを回転させる. + * 'c' : 周期ハンドラを動作させる. + * 'C' : 周期ハンドラを停止させる. + * 'z' : CPU例外を発生させる. + * 'Z' : CPUロック状態でCPU例外を発生させる(プログラムを終了する). + * 'V' : vxget_tim で性能評価用システム時刻を2回読む. + * 'v' : 発行したシステムコールを表示する(デフォルト). + * 'q' : 発行したシステムコールを表示しない. + */ + +#include +#include "kernel_id.h" +#include "sample1.h" + +/* + * 並行実行されるタスクへのメッセージ領域 + */ +char message[3]; + +/* + * ループ回数 + */ +UW task_loop; /* タスク内でのループ回数 */ +UW tex_loop; /* 例外処理ルーチン内でのループ回数 */ + +/* + * 並行実行されるタスク + */ +void task(VP_INT exinf) +{ + volatile UW i; + INT n = 0; + INT tskno = (INT) exinf; + const char *graph[] = { "|", " +", " *" }; + char c; + + ena_tex(); + while (1) { + syslog(LOG_NOTICE, "task%d is running (%03d). %s", + tskno, ++n, graph[tskno-1]); + for (i = 0; i < task_loop; i++); + c = message[tskno-1]; + message[tskno-1] = 0; + switch (c) { + case 'e': + syslog(LOG_INFO, "#%d#ext_tsk()", tskno); + ext_tsk(); + case 's': + syslog(LOG_INFO, "#%d#slp_tsk()", tskno); + syscall(slp_tsk()); + break; + case 'S': + syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno); + syscall(tslp_tsk(10000)); + break; + case 'd': + syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno); + syscall(dly_tsk(10000)); + break; + case 'y': + syslog(LOG_INFO, "#%d#dis_tex()", tskno); + syscall(dis_tex()); + break; + case 'Y': + syslog(LOG_INFO, "#%d#ena_tex()", tskno); + syscall(ena_tex()); + break; +#ifdef CPUEXC1 + case 'z': + syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); + RAISE_CPU_EXCEPTION; + break; + case 'Z': + loc_cpu(); + syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); + RAISE_CPU_EXCEPTION; + unl_cpu(); + break; +#endif /* CPUEXC1 */ + default: + break; + } + } +} + +/* + * 並行して実行されるタスク用のタスク例外処理ルーチン + */ +void tex_routine(TEXPTN texptn, VP_INT exinf) +{ + volatile UW i; + INT tskno = (INT) exinf; + + syslog(LOG_NOTICE, "task%d receives exception 0x%04x. ", + tskno, texptn); + for (i = 0; i < tex_loop; i++); + + if (texptn & 0x8000) { + syslog(LOG_INFO, "#%d#ext_tsk()", tskno); + ext_tsk(); + } +} + +/* + * CPU例外ハンドラ + */ +#ifdef CPUEXC1 + +void +cpuexc_handler(VP p_excinf) +{ + ID tskid; + + syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", + p_excinf); + if (sns_ctx() != TRUE) { + syslog(LOG_WARNING, + "sns_ctx() is not TRUE in CPU exception handler."); + } + if (sns_dpn() != TRUE) { + syslog(LOG_WARNING, + "sns_dpn() is not TRUE in CPU exception handler."); + } + syslog(LOG_DEBUG, + "sns_loc = %d sns_dsp = %d", sns_loc(), sns_dsp()); + syslog(LOG_DEBUG, + "vxsns_loc = %d vxsns_ctx = %d vxsns_dsp = %d vxsns_dpn = %d", + vxsns_loc(p_excinf), vxsns_ctx(p_excinf), + vxsns_dsp(p_excinf), vxsns_dpn(p_excinf)); + + if (!vxsns_loc(p_excinf) && !vxsns_ctx(p_excinf)) { + syscall(iget_tid(&tskid)); + syscall(iras_tex(tskid, 0x8000)); + } + else { + syslog(LOG_NOTICE, "Sample program ends with exception."); + kernel_exit(); + } +} + +#endif /* CPUEXC1 */ + +/* + * 周期ハンドラ + * + * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー + * を回転させる. + */ +void cyclic_handler(VP_INT exinf) +{ + irot_rdq(HIGH_PRIORITY); + irot_rdq(MID_PRIORITY); + irot_rdq(LOW_PRIORITY); +} + +/* + * メインタスク + */ +void main_task(VP_INT exinf) +{ + char c; + ID tskid = TASK1; + volatile UW i; + INT tskno = 1; + ER_UINT ercd; + PRI tskpri; + SYSTIM stime1, stime2; +#ifndef OMIT_VGET_TIM + SYSUTIM utime1, utime2; +#endif /* OMIT_VGET_TIM */ + + vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); + syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (INT) exinf); + + syscall(serial_ctl_por(TASK_PORTID, + (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); + + /* + * ループ回数の設定 + */ + task_loop = LOOP_REF; + get_tim(&stime1); + for (i = 0; i < task_loop; i++); + get_tim(&stime2); + task_loop = LOOP_REF * 400 / (stime2 - stime1); + tex_loop = task_loop / 5; + + /* + * タスクの起動 + */ + act_tsk(TASK1); + act_tsk(TASK2); + act_tsk(TASK3); + + /* + * メインループ + */ + do { + syscall(serial_rea_dat(TASK_PORTID, &c, 1)); + switch (c) { + case 'e': + case 's': + case 'S': + case 'd': + case 'y': + case 'Y': + case 'z': + case 'Z': + message[tskno-1] = c; + break; + case '1': + tskno = 1; + tskid = TASK1; + break; + case '2': + tskno = 2; + tskid = TASK2; + break; + case '3': + tskno = 3; + tskid = TASK3; + break; + case 'a': + syslog(LOG_INFO, "#act_tsk(%d)", tskno); + syscall(act_tsk(tskid)); + break; + case 'A': + syslog(LOG_INFO, "#can_act(%d)", tskno); + syscall(ercd = can_act(tskid)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "can_act(%d) returns %d", + tskno, ercd); + } + break; + case 't': + syslog(LOG_INFO, "#ter_tsk(%d)", tskno); + syscall(ter_tsk(tskid)); + break; + case '>': + syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno); + chg_pri(tskid, HIGH_PRIORITY); + break; + case '=': + syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno); + chg_pri(tskid, MID_PRIORITY); + break; + case '<': + syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno); + chg_pri(tskid, LOW_PRIORITY); + break; + case 'G': + syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno); + syscall(ercd = get_pri(tskid, &tskpri)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "priority of task %d is %d", + tskno, tskpri); + } + break; + case 'w': + syslog(LOG_INFO, "#wup_tsk(%d)", tskno); + syscall(wup_tsk(tskid)); + break; + case 'W': + syslog(LOG_INFO, "#can_wup(%d)", tskno); + syscall(ercd = can_wup(tskid)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "can_wup(%d) returns %d", + tskno, ercd); + } + break; + case 'l': + syslog(LOG_INFO, "#rel_wai(%d)", tskno); + syscall(rel_wai(tskid)); + break; + case 'u': + syslog(LOG_INFO, "#sus_tsk(%d)", tskno); + syscall(sus_tsk(tskid)); + break; + case 'm': + syslog(LOG_INFO, "#rsm_tsk(%d)", tskno); + syscall(rsm_tsk(tskid)); + break; + case 'M': + syslog(LOG_INFO, "#frsm_tsk(%d)", tskno); + syscall(frsm_tsk(tskid)); + break; + case 'x': + syslog(LOG_INFO, "#ras_tex(%d, 0x0001)", tskno); + syscall(ras_tex(tskid, 0x0001)); + break; + case 'X': + syslog(LOG_INFO, "#ras_tex(%d, 0x0002)", tskno); + syscall(ras_tex(tskid, 0x0002)); + break; + case 'r': + syslog(LOG_INFO, "#rot_rdq(three priorities)"); + rot_rdq(HIGH_PRIORITY); + rot_rdq(MID_PRIORITY); + rot_rdq(LOW_PRIORITY); + break; + case 'c': + sta_cyc(CYCHDR1); + break; + case 'C': + stp_cyc(CYCHDR1); + break; +#ifndef OMIT_VGET_TIM + case 'V': + syscall(vxget_tim(&utime1)); + syscall(vxget_tim(&utime2)); + syslog(LOG_NOTICE, "utime1 = %d, utime2 = %d", + (UINT) utime1, (UINT) utime2); + break; +#endif /* OMIT_VGET_TIM */ + case 'v': + vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); + break; + case 'q': + vmsk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG)); + break; + default: + break; + } + } while (c != '\003' && c != 'Q'); + + syslog(LOG_NOTICE, "Sample program ends."); + kernel_exit(); +} diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/sample1.cfg b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/sample1.cfg new file mode 100644 index 0000000..e91e990 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/sample1.cfg @@ -0,0 +1,28 @@ +/* + * @(#) $Id: sample1.cfg,v 1.1 2012/07/20 04:03:13 maduki Exp $ + */ + +/* + * サンプルプログラム(1)のシステムコンフィギュレーションファイル + */ + +#define _MACRO_ONLY +#include "sample1.h" + +INCLUDE("\"sample1.h\""); +CRE_TSK(TASK1, { TA_HLNG, (VP_INT) 1, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(TASK2, { TA_HLNG, (VP_INT) 2, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(TASK3, { TA_HLNG, (VP_INT) 3, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(MAIN_TASK, { TA_HLNG|TA_ACT, 0, main_task, MAIN_PRIORITY, + STACK_SIZE, NULL }); +DEF_TEX(TASK1, { TA_HLNG, tex_routine }); +DEF_TEX(TASK2, { TA_HLNG, tex_routine }); +DEF_TEX(TASK3, { TA_HLNG, tex_routine }); +CRE_CYC(CYCHDR1, { TA_HLNG, 0, cyclic_handler, 2000, 0 }); +#ifdef CPUEXC1 +DEF_EXC(CPUEXC1, { TA_HLNG, cpuexc_handler} ); +#endif /* CPUEXC1 */ + +#include "../systask/timer.cfg" +#include "../systask/serial.cfg" +#include "../systask/logtask.cfg" diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/sample1.dpj b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/sample1.dpj new file mode 100644 index 0000000..98e121a --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/sample1.dpj @@ -0,0 +1,240 @@ + + + + + ADSP-BF518 + .dxe + Executable file + + + + + .\Debug + .\Debug + 0 + + + + + + + + + + + + + + + + + + + + + + + .\Release + .\Release + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/sample1.h b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/sample1.h new file mode 100644 index 0000000..b2f555a --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/sample1.h @@ -0,0 +1,215 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2005 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: sample1.h,v 1.1 2012/07/20 04:03:13 maduki Exp $ + */ + +/* + * サンプルプログラム(1)のヘッダファイル + */ + +#include + +/* + * 各タスクの優先度の定義 + */ + +#define MAIN_PRIORITY 5 /* メインタスクの優先度 */ + /* HIGH_PRIORITY より高くすること */ + +#define HIGH_PRIORITY 9 /* 並列に実行されるタスクの優先度 */ +#define MID_PRIORITY 10 +#define LOW_PRIORITY 11 + +/* + * ターゲット依存の定義(CPU例外ハンドラの起動方法など) + */ + +#ifdef M68K + +#define CPUEXC1 5 /* ゼロ除算例外 */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) + +#elif defined(SH3) + +#define CPUEXC1 224 /* ロードエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) + +#elif defined(SH1) + +#define CPUEXC1 9 /* CPUアドレスエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) +#ifdef TOKIWA_SH1 +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#endif /* TOKIWA_SH1 */ + +#elif defined(ARMV4) + +#define CPUEXC1 4 /* ロードエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) + +#elif defined(V850) + +#elif defined(H8) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ + +#elif defined(H8S) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define LOOP_REF 4000L /* 速度計測用のループ回数 */ + +#elif defined(MICROBLAZE) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define STACK_SIZE 2048 /* タスクのスタックサイズ */ + +#elif defined(IA32) + +#define CPUEXC1 0 /* ゼロ除算例外 */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) +define OMIT_VGET_TIM + +#elif defined(TMS320C54X) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define STACK_SIZE 320 /* タスクのスタックサイズ */ +#define LOOP_REF 500000L /* 速度計測用のループ回数 */ + +#elif defined(XSTORMY16) + +#define CPUEXC1 0 /* 無効命令例外 */ +#define RAISE_CPU_EXCEPTION __asm__( ".hword 0x0006" ) +#define OMIT_VGET_TIM /* vxget_tim()は非サポート */ +#define LOOP_REF 4000L /* 速度計測用のループ回数 */ +#define STACK_SIZE 256 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* SIOはポート2を用いる */ + +#elif defined(MIPS3) || defined(MIPS64) + +#define CPUEXC1 Bp /* ブレークポイント例外(ゼロ除算時に発生) */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) + +#elif defined(M16C) && defined(OAKS16) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ + +#elif defined(M16C) && defined(OAKS16_MINI) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 384 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ + +#elif defined(M16C) && defined(M3029) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(BLACKFIN) + +#define CPUEXC1 0 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm("excpt 0;") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 1024 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(LINUX) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define OMIT_VGET_TIM +#define LOOP_REF 4000000 /* 速度計測用のループ回数 */ + +#elif defined(NIOS2) + +#define CPUEXC1 0 /* 未実装命令例外 */ +#define RAISE_CPU_EXCEPTION Asm("div zero, zero, zero"); + +#elif defined(M32C) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(M32R) + +#define CPUEXC1 EXC_TRAP00 +#define RAISE_CPU_EXCEPTION Asm("trap 0") + +#elif defined(TLCS_900) && defined(ZUP_F16_EX) + +#define CPUEXC1 3 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION Asm(" swi 2") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ +#define OMIT_VGET_TIM + +#endif + +/* + * ターゲットに依存する可能性のある定数の定義 + */ + +#ifndef TASK_PORTID +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ +#endif /* TASK_PORTID */ + +#ifndef STACK_SIZE +#define STACK_SIZE 8192 /* タスクのスタックサイズ */ +#endif /* STACK_SIZE */ + +#ifndef LOOP_REF +#define LOOP_REF 1000000 /* 速度計測用のループ回数 */ +#endif /* LOOP_REF */ + +/* + * 関数のプロトタイプ宣言 + */ +#ifndef _MACRO_ONLY + +extern void task(VP_INT tskno); +extern void main_task(VP_INT exinf); +extern void tex_routine(TEXPTN texptn, VP_INT tskno); +extern void cyclic_handler(VP_INT exinf); +extern void cpuexc_handler(VP p_excinf); + +#endif /* _MACRO_ONLY */ diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/sample1.ldf b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/sample1.ldf new file mode 100644 index 0000000..1284b0a --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/sample1.ldf @@ -0,0 +1,480 @@ +/* MANAGED-BY-SYSTEM-BUILDER */ +/* VisualDSP++ 5.0 Update 8 */ +/* LDF Printer version: 5.8.0.3 */ +/* ldfgen.exe version: 5.8.0.3 */ +/* VDSG version: 5.8.0.3 */ + +/* +** ADSP-BF518 linker description file generated on Jun 09, 2010 at 22:41:24. +** +** Copyright (C) 2000-2010 Analog Devices Inc., All Rights Reserved. +** +** This file is generated automatically based upon the options selected +** in the LDF Wizard. Changes to the LDF configuration should be made by +** changing the appropriate options rather than editing this file. +** +** Configuration:- +** crt_doj: BF518_EZKIT_POST_basiccrt.doj +** processor: ADSP-BF518 +** product_name: VisualDSP++ 5.0 Update 8 +** si_revision: automatic +** default_silicon_revision_from_archdef: 0.1 +** using_cplusplus: true +** mem_init: false +** use_vdk: false +** use_eh: true +** use_argv: true +** running_from_internal_memory: true +** user_heap_src_file: C:\Build_tools\ant_build\cvsStage\_5.0ExportBlackfinReGen\Examples\Blackfin\Examples\ADSP-BF518 EZ-KIT Lite\Power_On_Self_Test\BF518_EZKIT_POST_heaptab.c +** libraries_use_stdlib: true +** libraries_use_fileio_libs: false +** libraries_use_ieeefp_emulation_libs: false +** libraries_use_eh_enabled_libs: false +** system_heap: L1 +** system_heap_min_size: 2k +** system_stack: L1 +** system_stack_min_size: 2k +** use_sdram: false +** +*/ + +ARCHITECTURE(ADSP-BF518) + +SEARCH_DIR($ADI_DSP/Blackfin/lib) + + +// Workarounds are enabled, exceptions are disabled. +#define RT_LIB_NAME(x) lib ## x ## y.dlb +#define RT_LIB_NAME_EH(x) lib ## x ## y.dlb +#define RT_LIB_NAME_MT(x) lib ## x ## y.dlb +#define RT_LIB_NAME_EH_MT(x) lib ## x ## y.dlb +#define RT_OBJ_NAME(x) x ## y.doj +#define RT_OBJ_NAME_MT(x) x ## mty.doj + + +$LIBRARIES = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + RT_LIB_NAME_MT(small532) + ,RT_LIB_NAME_MT(io532) + ,RT_LIB_NAME_MT(c532) + ,RT_LIB_NAME_MT(event532) + ,RT_LIB_NAME(ssl512) + ,RT_LIB_NAME(drv512) + ,RT_LIB_NAME_MT(x532) + ,RT_LIB_NAME_EH_MT(cpp532) + ,RT_LIB_NAME_EH_MT(cpprt532) + ,RT_LIB_NAME(f64ieee532) + ,RT_LIB_NAME(dsp532) + ,RT_LIB_NAME(sftflt532) + ,RT_LIB_NAME(etsi532) + ,RT_OBJ_NAME_MT(idle532) + ,RT_LIB_NAME_MT(rt_fileio532) + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJECTS = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + RT_LIB_NAME(profile532) + , $COMMAND_LINE_OBJECTS + , "cplbtab518.doj" + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + +/* , RT_OBJ_NAME(crtn518) */ + ; + +$OBJS_LIBS_INTERNAL = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $OBJECTS{prefersMem("internal")}, $LIBRARIES{prefersMem("internal")} + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJS_LIBS_NOT_EXTERNAL = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $OBJECTS{!prefersMem("external")}, $LIBRARIES{!prefersMem("external")} + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJS_LIBS_WITH_AUTO_BREAKPOINTS = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $OBJECTS { FuncName("_main") || + FuncName("___lib_prog_term") || + FuncName("__primIO") || + FuncName("__ov_start") || + FuncName("__ov_end") || + FuncName("__dbg_assert") || + FuncName("__unknown_exception_occurred") || + FuncName("_cplb_init") || + FuncName("__KernelPanic") }, + $LIBRARIES { FuncName("_main") || + FuncName("___lib_prog_term") || + FuncName("__primIO") || + FuncName("__ov_start") || + FuncName("__ov_end") || + FuncName("__dbg_assert") || + FuncName("__unknown_exception_occurred") || + FuncName("_cplb_init") || + FuncName("__KernelPanic") } + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJS_LIBS_WITHOUT_AUTO_BREAKPOINTS = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $OBJECTS { !FuncName("_main") && + !FuncName("___lib_prog_term") && + !FuncName("__primIO") && + !FuncName("__ov_start") && + !FuncName("__ov_end") && + !FuncName("__dbg_assert") && + !FuncName("__unknown_exception_occurred") && + !FuncName("_cplb_init") && + !FuncName("__KernelPanic") }, + $LIBRARIES { !FuncName("_main") && + !FuncName("___lib_prog_term") && + !FuncName("__primIO") && + !FuncName("__ov_start") && + !FuncName("__ov_end") && + !FuncName("__dbg_assert") && + !FuncName("__unknown_exception_occurred") && + !FuncName("_cplb_init") && + !FuncName("__KernelPanic") } + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + +/*$VDSG */ +/* This code is preserved if the LDF is re-generated. */ + + +#define ASYNC0_MEMTYPE RAM +#define ASYNC1_MEMTYPE RAM +#define ASYNC2_MEMTYPE RAM +#define ASYNC3_MEMTYPE RAM + + +/*$VDSG */ + + +/* +** Memory map. +** +** 0xFFE00000 - 0xFFFFFFFF Core MMR registers (2MB) +** 0xFFC00000 - 0xFFDFFFFF System MMR registers (2MB) +** 0xFFB01000 - 0xFFBFFFFF Reserved +** 0xFFB00000 - 0xFFB00FFF Scratch SRAM (4K) +** 0xFFA14000 - 0xFFAFFFFF Reserved +** 0xFFA10000 - 0xFFA13FFF Code SRAM/CACHE (16K) +** 0xFFA0C000 - 0xFFA0FFFF Reserved +** 0xFFA08000 - 0xFFA0BFFF Instruction Bank B SRAM (16K) in 0.0, Reserved on 0.1 and up +** 0xFFA04000 - 0xFFA07FFF Reserved in 0.0, Instruction Bank B SRAM (16K) in 0.1 and up +** 0xFFA00000 - 0xFFA03FFF Instruction Bank A SRAM (16K) +** 0xFF908000 - 0xFF9FFFFF Reserved +** 0xFF904000 - 0xFF907FFF Data Bank B SRAM/CACHE (16k) +** 0xFF900000 - 0XFF903FFF Data Bank B SRAM (16k) +** 0xFF808000 - 0xFF8FFFFF Reserved +** 0xFF804000 - 0xFF807FFF Data Bank A SRAM/CACHE (16k) +** 0xFF800000 - 0XFF803FFF Data Bank A SRAM (16k) +** 0xEF008000 - 0xFF7FFFFF Reserved +** 0xEF000000 - 0xEF807FFF Boot ROM (32K) +** 0x20400000 - 0xEEFFFFFF Reserved +** 0x20300000 - 0x203FFFFF ASYNC MEMORY BANK 3 (1MB) +** 0x20200000 - 0x202FFFFF ASYNC MEMORY BANK 2 (1MB) +** 0x20100000 - 0x201FFFFF ASYNC MEMORY BANK 1 (1MB) +** 0x20000000 - 0x200FFFFF ASYNC MEMORY BANK 0 (1MB) +** 0x00000000 - 0x07FFFFFF SDRAM MEMORY (16MB - 128MB) +** +** Notes: +** 0xFF807FEF-0xFF807FFF Required by boot-loader. +*/ + +MEMORY +{ + /* See readme.txt */ + MEM_L1_SCRATCH { START(0xFFB00000) END(0xFFB00FFF) TYPE(RAM) WIDTH(8) } + MEM_L1_CODE_CACHE { START(0xFFA10000) END(0xFFA13FFF) TYPE(RAM) WIDTH(8) } + MEM_L1_CODE { START(0xFFA00000) END(0xFFA07FFF) TYPE(RAM) WIDTH(8) } + +/* MEM_L1_DATA_B_CACHE { START(0xFF904000) END(0xFF907FFF) TYPE(RAM) WIDTH(8) } */ +/* MEM_L1_DATA_B { START(0xFF900000) END(0xFF903FFF) TYPE(RAM) WIDTH(8) } */ + MEM_L1_DATA_B { START(0xFF900000) END(0xFF907FFF) TYPE(RAM) WIDTH(8) } + +/* MEM_L1_DATA_A_CACHE { START(0xFF804000) END(0xFF807FFF) TYPE(RAM) WIDTH(8) } */ +/* MEM_L1_DATA_A { START(0xFF800000) END(0xFF803FFF) TYPE(RAM) WIDTH(8) } */ + MEM_L1_DATA_A { START(0xFF800000) END(0xFF807FFF) TYPE(RAM) WIDTH(8) } + + MEM_ASYNC3 { START(0x20300000) END(0x203FFFFF) TYPE(RAM) WIDTH(8) } + MEM_ASYNC2 { START(0x20200000) END(0x202FFFFF) TYPE(RAM) WIDTH(8) } + MEM_ASYNC1 { START(0x20100000) END(0x201FFFFF) TYPE(RAM) WIDTH(8) } + MEM_ASYNC0 { START(0x20000000) END(0x200FFFFF) TYPE(RAM) WIDTH(8) } + + /* 64MB of SDRAM partitioned into 4 banks */ + MEM_SDRAM0_BANK0 { START(0x00000004) END(0x00FFFFFF) TYPE(RAM) WIDTH(8) } + MEM_SDRAM0_BANK1 { START(0x01000000) END(0x01FFFFFF) TYPE(RAM) WIDTH(8) } + MEM_SDRAM0_BANK2 { START(0x02000000) END(0x02FFFFFF) TYPE(RAM) WIDTH(8) } + MEM_SDRAM0_BANK3 { START(0x03000000) END(0x03FFFFFF) TYPE(RAM) WIDTH(8) } +} /* MEMORY */ + +PROCESSOR p0 +{ + OUTPUT($COMMAND_LINE_OUTPUT_FILE) + RESOLVE(start, 0xFFA00000) + RESOLVE(___argv_string, 0xFF800000) + KEEP(start, _main) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + SECTIONS + { + /* Workaround for hardware errata 05-00-0189 and 05-00-0310 - + ** "Speculative (and fetches made at boundary of reserved memory + ** space) for instruction or data fetches may cause false + ** protection exceptions" and "False hardware errors caused by + ** fetches at the boundary of reserved memory ". + ** + ** Done by avoiding use of 76 bytes from at the end of blocks + ** that are adjacent to reserved memory. Workaround is enabled + ** for appropriate silicon revisions (-si-revision switch). + */ + RESERVE(___wab0=MEMORY_END(MEM_L1_SCRATCH) - 75, ___l0 = 76) + RESERVE(___wab1=MEMORY_END(MEM_L1_CODE_CACHE) - 75, ___l1 = 76) + RESERVE(___wab2=MEMORY_END(MEM_L1_CODE) - 75, ___l2 = 76) +/* RESERVE(___wab3=MEMORY_END(MEM_L1_DATA_B_CACHE) - 75, ___l3 = 76) */ + RESERVE(___wab4=MEMORY_END(MEM_L1_DATA_B) - 75, ___l4 = 76) +/* RESERVE(___wab5=MEMORY_END(MEM_L1_DATA_A_CACHE) - 75, ___l5 = 76) */ + RESERVE(___wab6=MEMORY_END(MEM_L1_DATA_A) - 75, ___l6 = 76) + RESERVE(___wab8=MEMORY_END(MEM_ASYNC3) - 75, ___l8 = 76) + RESERVE(___wab9=MEMORY_END(MEM_SDRAM0_BANK3) - 75, ___l9 = 76) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + scratchpad NO_INIT + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(L1_scratchpad) $LIBRARIES(L1_scratchpad)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_SCRATCH + + L1_code + { + INPUT_SECTION_ALIGN(4) + ___l1_code_cache = 0; + INPUT_SECTIONS($OBJS_LIBS_WITH_AUTO_BREAKPOINTS(program)) + INPUT_SECTIONS($OBJECTS(L1_code) $LIBRARIES(L1_code)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(cplb_code) $LIBRARIES(cplb_code)) + INPUT_SECTIONS($OBJECTS(cplb) $LIBRARIES(cplb)) + INPUT_SECTIONS($OBJECTS(noncache_code) $LIBRARIES(noncache_code)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(program)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(program)) + INPUT_SECTIONS($OBJECTS(program) $LIBRARIES(program)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_CODE + + L1_data_a_tables + { + INPUT_SECTION_ALIGN(4) + FORCE_CONTIGUITY + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(ctor) $LIBRARIES(ctor)) + INPUT_SECTIONS($OBJECTS(ctorl) $LIBRARIES(ctorl)) + INPUT_SECTIONS($OBJECTS(.gdt) $LIBRARIES(.gdt)) + INPUT_SECTIONS($OBJECTS(.gdtl) $LIBRARIES(.gdtl)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_A + + L1_data_a_1 + { + INPUT_SECTION_ALIGN(4) + ___l1_data_cache_a = 0; + INPUT_SECTIONS($OBJECTS(L1_data_a) $LIBRARIES(L1_data_a)) + INPUT_SECTIONS($OBJECTS(L1_data) $LIBRARIES(L1_data)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + RESERVE(heaps_and_stack_in_L1_data_a, heaps_and_stack_in_L1_data_a_length = 4096,4) + } > MEM_L1_DATA_A + + L1_data_a_bsz ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS( $OBJECTS(L1_bsz) $LIBRARIES(L1_bsz)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_A + + bsz_L1_data_a ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(bsz)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(bsz)) + INPUT_SECTIONS($OBJECTS(bsz) $LIBRARIES(bsz)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_A + + L1_data_a + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(data1)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(data1)) + INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1)) + INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata)) + INPUT_SECTIONS($OBJECTS(cplb_data) $LIBRARIES(cplb_data)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_A + + L1_data_a_2 + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(vtbl) $LIBRARIES(vtbl)) + INPUT_SECTIONS($OBJECTS(.frt) $LIBRARIES(.frt)) + INPUT_SECTIONS($OBJECTS(.rtti) $LIBRARIES(.rtti)) + INPUT_SECTIONS($OBJECTS(.edt) $LIBRARIES(.edt)) + INPUT_SECTIONS($OBJECTS(.cht) $LIBRARIES(.cht)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_A + + L1_data_a_stack_heap + { + INPUT_SECTION_ALIGN(4) + RESERVE_EXPAND(heaps_and_stack_in_L1_data_a, heaps_and_stack_in_L1_data_a_length , 0, 4) + ldf_stack_space = heaps_and_stack_in_L1_data_a; + ldf_stack_end = (ldf_stack_space + (((heaps_and_stack_in_L1_data_a_length * 2048) / 4096) - 4)) & 0xfffffffc; + ldf_heap_space = ldf_stack_end + 4; + ldf_heap_end = (ldf_heap_space + (((heaps_and_stack_in_L1_data_a_length * 2048) / 4096) - 4)) & 0xfffffffc; + ldf_heap_length = ldf_heap_end - ldf_heap_space; + } > MEM_L1_DATA_A + + sdram0_bank0 + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS( $OBJECTS(sdram0) $LIBRARIES(sdram0)) + INPUT_SECTIONS( $OBJECTS(sdram0_bank0) $LIBRARIES(sdram0_bank0)) + INPUT_SECTIONS( $OBJECTS(noncache_code) $LIBRARIES(noncache_code)) +/* INPUT_SECTIONS( $OBJECTS(program) $LIBRARIES(program)) */ + } >MEM_SDRAM0_BANK0 + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } /* SECTIONS */ +} /* p0 */ + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/sample1_ezkit_bf518.dpg b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/sample1_ezkit_bf518.dpg new file mode 100644 index 0000000..58f728c --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf518/sample1_ezkit_bf518.dpg @@ -0,0 +1,12 @@ + + + + + + + + + libkernel + + + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/config.bat b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/config.bat new file mode 100644 index 0000000..f60fbc6 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/config.bat @@ -0,0 +1,17 @@ +rem APPNAME アプリケーション名 +rem CFGPATH cfg.exeが置いてあるディレクトリ +rem VDSPPATH VisualDSP++のインストールディレクトリ +rem JSPPATH TOPPERS/JSPのディレクトリ +rem CPATH Blackfin CPU依存部のディレクトリ +rem SPATH システム依存部のディレクトリ + +set APPNAME=sample1 +set CFGPATH=d:\bin +set VDSPPATH=c:\Program Files\Analog Devices\VisualDSP 5.0 +set JSPPATH=d:\jsp +set CPATH=%JSPPATH%\config\blackfin +set SPATH=%CPATH%\ezkit_bf533;%CPATH%\_common_bf533 + +"%VDSPPATH%\pp.exe" %APPNAME%.cfg -D__ECC__ -D__ADSPLPBLACKFIN__ -I"%CPATH%;%SPATH%;%JSPPATH%\systask;%JSPPATH%\include;" > %APPNAME%_pp.cfg +"%CFGPATH%\cfg.exe" %APPNAME%_pp.cfg +del %APPNAME%_pp.cfg diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/kernel_cfg.c b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/kernel_cfg.c new file mode 100644 index 0000000..674556a --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/kernel_cfg.c @@ -0,0 +1,181 @@ +/* Configured with [sample1_pp.cfg ] */ + +#include "kernel_cfg.h" +#include "kernel_id.h" + +#if TKERNEL_PRVER >= 0x1040 +#define CFG_INTHDR_ENTRY(inthdr) INTHDR_ENTRY(inthdr) +#define CFG_EXCHDR_ENTRY(exchdr) EXCHDR_ENTRY(exchdr) +#define CFG_INT_ENTRY(inthdr) INT_ENTRY(inthdr) +#define CFG_EXC_ENTRY(exchdr) EXC_ENTRY(exchdr) +#else +#error "This configuration file has no compatibility with TOPPERS/JSP rel 1.3 or earlier." +#endif + +#ifndef __EMPTY_LABEL +#define __EMPTY_LABEL(x,y) x y[0] +#endif + +#if TKERNEL_PRID != 0x0001u /* TOPPERS/JSP */ +#error "You can not use this configuration file without TOPPERS/JSP" +#endif + + /* User specified include files*/ +#include "sample1.h" +#include "hw_timer.h" +#include "timer.h" +#include "hw_serial.h" +#include "serial.h" +#include "logtask.h" + + + /* Object initializer [task] */ + +#define TNUM_TSKID 5 + +const ID _kernel_tmax_tskid = (TMIN_TSKID + TNUM_TSKID - 1); + +static __STK_UNIT __stack_TASK1[__TCOUNT_STK_UNIT(512)]; +static __STK_UNIT __stack_TASK2[__TCOUNT_STK_UNIT(512)]; +static __STK_UNIT __stack_TASK3[__TCOUNT_STK_UNIT(512)]; +static __STK_UNIT __stack_MAIN_TASK[__TCOUNT_STK_UNIT(512)]; +static __STK_UNIT __stack_LOGTASK[__TCOUNT_STK_UNIT(LOGTASK_STACK_SIZE)]; + +const TINIB _kernel_tinib_table[TNUM_TSKID] = { + {0, (VP_INT)(( VP_INT ) 1), (FP)(task), INT_PRIORITY(10), __TROUND_STK_UNIT(512), __stack_TASK1, 0, (FP)(tex_routine)}, + {0, (VP_INT)(( VP_INT ) 2), (FP)(task), INT_PRIORITY(10), __TROUND_STK_UNIT(512), __stack_TASK2, 0, (FP)(tex_routine)}, + {0, (VP_INT)(( VP_INT ) 3), (FP)(task), INT_PRIORITY(10), __TROUND_STK_UNIT(512), __stack_TASK3, 0, (FP)(tex_routine)}, + {0x00u | 0x02u, (VP_INT)(0), (FP)(main_task), INT_PRIORITY(5), __TROUND_STK_UNIT(512), __stack_MAIN_TASK, TA_NULL, (FP)(NULL)}, + {0x00u | 0x02u, (VP_INT)(( VP_INT ) 1), (FP)(logtask), INT_PRIORITY(LOGTASK_PRIORITY), __TROUND_STK_UNIT(LOGTASK_STACK_SIZE), __stack_LOGTASK, TA_NULL, (FP)(NULL)} +}; + +const ID _kernel_torder_table[TNUM_TSKID] = {1,2,3,4,5}; + +TCB _kernel_tcb_table[TNUM_TSKID]; + + + /* Object initializer [semaphore] */ + +#define TNUM_SEMID 2 + +const ID _kernel_tmax_semid = (TMIN_SEMID + TNUM_SEMID - 1); + +const SEMINIB _kernel_seminib_table[TNUM_SEMID] = { + {1, 0, 1}, + {1, 1, 1} +}; + +SEMCB _kernel_semcb_table[TNUM_SEMID]; + + + /* Object initializer [eventflag] */ + +#define TNUM_FLGID 0 + +const ID _kernel_tmax_flgid = (TMIN_FLGID + TNUM_FLGID - 1); + +__EMPTY_LABEL(const FLGINIB, _kernel_flginib_table); +__EMPTY_LABEL(FLGCB, _kernel_flgcb_table); + + + /* Object initializer [dataqueue] */ + +#define TNUM_DTQID 0 + +const ID _kernel_tmax_dtqid = (TMIN_DTQID + TNUM_DTQID - 1); + +__EMPTY_LABEL(const DTQINIB, _kernel_dtqinib_table); +__EMPTY_LABEL(DTQCB, _kernel_dtqcb_table); + + + /* Object initializer [mailbox] */ + +#define TNUM_MBXID 0 + +const ID _kernel_tmax_mbxid = (TMIN_MBXID + TNUM_MBXID - 1); + +__EMPTY_LABEL(const MBXINIB, _kernel_mbxinib_table); +__EMPTY_LABEL(MBXCB, _kernel_mbxcb_table); + + + /* Object initializer [mempfix] */ + +#define TNUM_MPFID 0 + +const ID _kernel_tmax_mpfid = (TMIN_MPFID + TNUM_MPFID - 1); + +__EMPTY_LABEL(const MPFINIB, _kernel_mpfinib_table); +__EMPTY_LABEL(MPFCB, _kernel_mpfcb_table); + + + /* Object initializer [cyclic] */ + +#define TNUM_CYCID 1 + +const ID _kernel_tmax_cycid = (TMIN_CYCID + TNUM_CYCID - 1); + +const CYCINIB _kernel_cycinib_table[TNUM_CYCID] = { + {0,0,(FP)(cyclic_handler),2000,0} +}; + +CYCCB _kernel_cyccb_table[TNUM_CYCID]; + + + /* Object initializer [interrupt] */ + +#define TNUM_INHNO 3 + +const UINT _kernel_tnum_inhno = TNUM_INHNO; + +CFG_INTHDR_ENTRY(sio0_rx_handler); +CFG_INTHDR_ENTRY(sio0_tx_handler); +CFG_INTHDR_ENTRY(timer_handler); + +const INHINIB _kernel_inhinib_table[TNUM_INHNO] = { + {14,0,(FP)CFG_INT_ENTRY(sio0_rx_handler)}, + {15,0,(FP)CFG_INT_ENTRY(sio0_tx_handler)}, + {18,0,(FP)CFG_INT_ENTRY(timer_handler)} +}; + + + /* Object initializer [exception] */ + +#define TNUM_EXCNO 1 + +const UINT _kernel_tnum_excno = TNUM_EXCNO; + +CFG_EXCHDR_ENTRY(cpuexc_handler); + +const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = { + {0,0,(FP)CFG_EXC_ENTRY(cpuexc_handler)} +}; + + /* Initialization handler */ + +void +_kernel_call_inirtn(void) +{ + timer_initialize( (VP_INT)(0) ); + serial_initialize( (VP_INT)(0) ); +} + +void +_kernel_call_terrtn(void) +{ + timer_terminate( (VP_INT)(0) ); +} + + /* Object initialization routine */ + +void +_kernel_object_initialize(void) +{ + _kernel_task_initialize(); + _kernel_semaphore_initialize(); + _kernel_cyclic_initialize(); + _kernel_interrupt_initialize(); + _kernel_exception_initialize(); +} + +TMEVTN _kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID]; + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/kernel_id.h b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/kernel_id.h new file mode 100644 index 0000000..bf1af50 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/kernel_id.h @@ -0,0 +1,16 @@ +#ifndef KERNEL_ID_H +#define KERNEL_ID_H + + /* object identifier deifnition */ + +#define CYCHDR1 1 +#define LOGTASK 5 +#define MAIN_TASK 4 +#define SERIAL_RCV_SEM1 1 +#define SERIAL_SND_SEM1 2 +#define TASK1 1 +#define TASK2 2 +#define TASK3 3 + +#endif /* KERNEL_ID_H */ + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/readme.txt b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/readme.txt new file mode 100644 index 0000000..ef17709 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/readme.txt @@ -0,0 +1,29 @@ +TOPPERS/JSPのsample1アプリケーションをEZ-KIT Lite BF533に +移植した。 + +ビルドに先立って、jsp/config/blackfin/ezkit_bf533/libkernel.dpjを +ビルドして、libekernel.dlbを作っておくこと。 + +また、jsp/utils/blackfin-vdsp/offset.hは、必要に応じて +作り直すこと。 + +VisualDSP++のICEを使ってロードする場合には、実行直前に次の +二つのレジスタの値に注意すること。 + +PLL_CTL : 0x1400 +EBIU_SDBCTL.EBE : 0 + +TOPPERS/JSP for Blackfinはこの二つをチェックして、もし違う +値であると外部でPLLとSDRAMを変更したと認識してPLLの初期化を +中止する。これは外部SDRAMなどクロックに依存するデバイスの +動作を保護するためである。 + +sample1.ldfは、VisualDSP++に作らせたあと、自動更新を +停止し、crtを削除したものである。 + +異なるシステム依存部用に改造する場合は、プロジェクトの +Cコンパイラ、およびアセンブラのインクルード・パスを必ず +変更すること。 + +2012/07/20追加 +Visual DSP++ 5.0 Update 10でビルド&動作確認 diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/sample1.c b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/sample1.c new file mode 100644 index 0000000..a91d2a9 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/sample1.c @@ -0,0 +1,417 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2004-2006 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: sample1.c,v 1.1 2009/02/01 12:21:34 suikan Exp $ + */ + +/* + * サンプルプログラム(1)の本体 + * + * JSPカーネルの基本的な動作を確認するためのサンプルプログラム. + * + * プログラムの概要: + * + * ユーザインタフェースを受け持つメインタスク(タスクID: MAIN_TASK, + * 優先度: MAIN_PRIORITY)と,三つの並列実行されるタスク(タスクID: + * TASK1〜TASK3,初期優先度: MID_PRIORITY)で構成される.また,起動周 + * 期が2秒の周期ハンドラ(周期ハンドラID: CYCHDR1)を用いる. + * + * 並列実行されるタスクは,task_loop 回空ループを実行する度に,タスク + * が実行中であることをあらわすメッセージを表示する. + * + * 周期ハンドラは,三つの優先度(HIGH_PRIORITY,MID_PRIORITY, + * LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は, + * 周期ハンドラは停止状態になっている. + * + * メインタスクは,シリアルI/Oポートからの文字入力を行い(文字入力を + * 待っている間は,並列実行されるタスクが実行されている),入力された + * 文字に対応した処理を実行する.入力された文字と処理の関係は次の通り. + * Control-C または 'Q' が入力されると,プログラムを終了する. + * + * '1' : 以降のコマンドは TASK1 に対して行う. + * '2' : 以降のコマンドは TASK2 に対して行う. + * '3' : 以降のコマンドは TASK3 に対して行う. + * 'a' : タスクを act_tsk により起動する. + * 'A' : タスクに対する起動要求を can_act によりキャンセルする. + * 'e' : タスクに ext_tsk を呼び出させ,終了させる. + * 't' : タスクを ter_tsk により強制終了する. + * '>' : タスクの優先度を HIGH_PRIORITY にする. + * '=' : タスクの優先度を MID_PRIORITY にする. + * '<' : タスクの優先度を LOW_PRIORITY にする. + * 'G' : タスクの優先度を get_pri で読み出す. + * 's' : タスクに slp_tsk を呼び出させ,起床待ちにさせる. + * 'S' : タスクに tslp_tsk(10秒) を呼び出させ,起床待ちにさせる. + * 'w' : タスクを wup_tsk により起床する. + * 'W' : タスクに対する起床要求を can_wup によりキャンセルする. + * 'l' : タスクを rel_wai により強制的に待ち解除にする. + * 'u' : タスクを sus_tsk により強制待ち状態にする. + * 'm' : タスクの強制待ち状態を rsm_tsk により解除する. + * 'M' : タスクの強制待ち状態を frsm_tsk により強制解除する. + * 'd' : タスクに dly_tsk(10秒) を呼び出させ,時間経過待ちにさせる. + * 'x' : タスクにパターン 0x0001 の例外処理を要求する. + * 'X' : タスクにパターン 0x0002 の例外処理を要求する. + * 'y' : タスクに dis_tex を呼び出させ,タスク例外を禁止する. + * 'Y' : タスクに ena_tex を呼び出させ,タスク例外を許可する. + * 'r' : 三つの優先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)の + * レディキューを回転させる. + * 'c' : 周期ハンドラを動作させる. + * 'C' : 周期ハンドラを停止させる. + * 'z' : CPU例外を発生させる. + * 'Z' : CPUロック状態でCPU例外を発生させる(プログラムを終了する). + * 'V' : vxget_tim で性能評価用システム時刻を2回読む. + * 'v' : 発行したシステムコールを表示する(デフォルト). + * 'q' : 発行したシステムコールを表示しない. + */ + +#include +#include "kernel_id.h" +#include "sample1.h" + +/* + * 並行実行されるタスクへのメッセージ領域 + */ +char message[3]; + +/* + * ループ回数 + */ +UW task_loop; /* タスク内でのループ回数 */ +UW tex_loop; /* 例外処理ルーチン内でのループ回数 */ + +/* + * 並行実行されるタスク + */ +void task(VP_INT exinf) +{ + volatile UW i; + INT n = 0; + INT tskno = (INT) exinf; + const char *graph[] = { "|", " +", " *" }; + char c; + + ena_tex(); + while (1) { + syslog(LOG_NOTICE, "task%d is running (%03d). %s", + tskno, ++n, graph[tskno-1]); + for (i = 0; i < task_loop; i++); + c = message[tskno-1]; + message[tskno-1] = 0; + switch (c) { + case 'e': + syslog(LOG_INFO, "#%d#ext_tsk()", tskno); + ext_tsk(); + case 's': + syslog(LOG_INFO, "#%d#slp_tsk()", tskno); + syscall(slp_tsk()); + break; + case 'S': + syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno); + syscall(tslp_tsk(10000)); + break; + case 'd': + syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno); + syscall(dly_tsk(10000)); + break; + case 'y': + syslog(LOG_INFO, "#%d#dis_tex()", tskno); + syscall(dis_tex()); + break; + case 'Y': + syslog(LOG_INFO, "#%d#ena_tex()", tskno); + syscall(ena_tex()); + break; +#ifdef CPUEXC1 + case 'z': + syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); + RAISE_CPU_EXCEPTION; + break; + case 'Z': + loc_cpu(); + syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); + RAISE_CPU_EXCEPTION; + unl_cpu(); + break; +#endif /* CPUEXC1 */ + default: + break; + } + } +} + +/* + * 並行して実行されるタスク用のタスク例外処理ルーチン + */ +void tex_routine(TEXPTN texptn, VP_INT exinf) +{ + volatile UW i; + INT tskno = (INT) exinf; + + syslog(LOG_NOTICE, "task%d receives exception 0x%04x. ", + tskno, texptn); + for (i = 0; i < tex_loop; i++); + + if (texptn & 0x8000) { + syslog(LOG_INFO, "#%d#ext_tsk()", tskno); + ext_tsk(); + } +} + +/* + * CPU例外ハンドラ + */ +#ifdef CPUEXC1 + +void +cpuexc_handler(VP p_excinf) +{ + ID tskid; + + syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", + p_excinf); + if (sns_ctx() != TRUE) { + syslog(LOG_WARNING, + "sns_ctx() is not TRUE in CPU exception handler."); + } + if (sns_dpn() != TRUE) { + syslog(LOG_WARNING, + "sns_dpn() is not TRUE in CPU exception handler."); + } + syslog(LOG_DEBUG, + "sns_loc = %d sns_dsp = %d", sns_loc(), sns_dsp()); + syslog(LOG_DEBUG, + "vxsns_loc = %d vxsns_ctx = %d vxsns_dsp = %d vxsns_dpn = %d", + vxsns_loc(p_excinf), vxsns_ctx(p_excinf), + vxsns_dsp(p_excinf), vxsns_dpn(p_excinf)); + + if (!vxsns_loc(p_excinf) && !vxsns_ctx(p_excinf)) { + syscall(iget_tid(&tskid)); + syscall(iras_tex(tskid, 0x8000)); + } + else { + syslog(LOG_NOTICE, "Sample program ends with exception."); + kernel_exit(); + } +} + +#endif /* CPUEXC1 */ + +/* + * 周期ハンドラ + * + * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー + * を回転させる. + */ +void cyclic_handler(VP_INT exinf) +{ + irot_rdq(HIGH_PRIORITY); + irot_rdq(MID_PRIORITY); + irot_rdq(LOW_PRIORITY); +} + +/* + * メインタスク + */ +void main_task(VP_INT exinf) +{ + char c; + ID tskid = TASK1; + volatile UW i; + INT tskno = 1; + ER_UINT ercd; + PRI tskpri; + SYSTIM stime1, stime2; +#ifndef OMIT_VGET_TIM + SYSUTIM utime1, utime2; +#endif /* OMIT_VGET_TIM */ + + vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); + syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (INT) exinf); + + syscall(serial_ctl_por(TASK_PORTID, + (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); + + /* + * ループ回数の設定 + */ + task_loop = LOOP_REF; + get_tim(&stime1); + for (i = 0; i < task_loop; i++); + get_tim(&stime2); + task_loop = LOOP_REF * 400 / (stime2 - stime1); + tex_loop = task_loop / 5; + + /* + * タスクの起動 + */ + act_tsk(TASK1); + act_tsk(TASK2); + act_tsk(TASK3); + + /* + * メインループ + */ + do { + syscall(serial_rea_dat(TASK_PORTID, &c, 1)); + switch (c) { + case 'e': + case 's': + case 'S': + case 'd': + case 'y': + case 'Y': + case 'z': + case 'Z': + message[tskno-1] = c; + break; + case '1': + tskno = 1; + tskid = TASK1; + break; + case '2': + tskno = 2; + tskid = TASK2; + break; + case '3': + tskno = 3; + tskid = TASK3; + break; + case 'a': + syslog(LOG_INFO, "#act_tsk(%d)", tskno); + syscall(act_tsk(tskid)); + break; + case 'A': + syslog(LOG_INFO, "#can_act(%d)", tskno); + syscall(ercd = can_act(tskid)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "can_act(%d) returns %d", + tskno, ercd); + } + break; + case 't': + syslog(LOG_INFO, "#ter_tsk(%d)", tskno); + syscall(ter_tsk(tskid)); + break; + case '>': + syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno); + chg_pri(tskid, HIGH_PRIORITY); + break; + case '=': + syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno); + chg_pri(tskid, MID_PRIORITY); + break; + case '<': + syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno); + chg_pri(tskid, LOW_PRIORITY); + break; + case 'G': + syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno); + syscall(ercd = get_pri(tskid, &tskpri)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "priority of task %d is %d", + tskno, tskpri); + } + break; + case 'w': + syslog(LOG_INFO, "#wup_tsk(%d)", tskno); + syscall(wup_tsk(tskid)); + break; + case 'W': + syslog(LOG_INFO, "#can_wup(%d)", tskno); + syscall(ercd = can_wup(tskid)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "can_wup(%d) returns %d", + tskno, ercd); + } + break; + case 'l': + syslog(LOG_INFO, "#rel_wai(%d)", tskno); + syscall(rel_wai(tskid)); + break; + case 'u': + syslog(LOG_INFO, "#sus_tsk(%d)", tskno); + syscall(sus_tsk(tskid)); + break; + case 'm': + syslog(LOG_INFO, "#rsm_tsk(%d)", tskno); + syscall(rsm_tsk(tskid)); + break; + case 'M': + syslog(LOG_INFO, "#frsm_tsk(%d)", tskno); + syscall(frsm_tsk(tskid)); + break; + case 'x': + syslog(LOG_INFO, "#ras_tex(%d, 0x0001)", tskno); + syscall(ras_tex(tskid, 0x0001)); + break; + case 'X': + syslog(LOG_INFO, "#ras_tex(%d, 0x0002)", tskno); + syscall(ras_tex(tskid, 0x0002)); + break; + case 'r': + syslog(LOG_INFO, "#rot_rdq(three priorities)"); + rot_rdq(HIGH_PRIORITY); + rot_rdq(MID_PRIORITY); + rot_rdq(LOW_PRIORITY); + break; + case 'c': + sta_cyc(CYCHDR1); + break; + case 'C': + stp_cyc(CYCHDR1); + break; +#ifndef OMIT_VGET_TIM + case 'V': + syscall(vxget_tim(&utime1)); + syscall(vxget_tim(&utime2)); + syslog(LOG_NOTICE, "utime1 = %d, utime2 = %d", + (UINT) utime1, (UINT) utime2); + break; +#endif /* OMIT_VGET_TIM */ + case 'v': + vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); + break; + case 'q': + vmsk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG)); + break; + default: + break; + } + } while (c != '\003' && c != 'Q'); + + syslog(LOG_NOTICE, "Sample program ends."); + kernel_exit(); +} diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/sample1.cfg b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/sample1.cfg new file mode 100644 index 0000000..5f02d0b --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/sample1.cfg @@ -0,0 +1,28 @@ +/* + * @(#) $Id: sample1.cfg,v 1.1 2009/02/01 12:21:34 suikan Exp $ + */ + +/* + * サンプルプログラム(1)のシステムコンフィギュレーションファイル + */ + +#define _MACRO_ONLY +#include "sample1.h" + +INCLUDE("\"sample1.h\""); +CRE_TSK(TASK1, { TA_HLNG, (VP_INT) 1, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(TASK2, { TA_HLNG, (VP_INT) 2, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(TASK3, { TA_HLNG, (VP_INT) 3, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(MAIN_TASK, { TA_HLNG|TA_ACT, 0, main_task, MAIN_PRIORITY, + STACK_SIZE, NULL }); +DEF_TEX(TASK1, { TA_HLNG, tex_routine }); +DEF_TEX(TASK2, { TA_HLNG, tex_routine }); +DEF_TEX(TASK3, { TA_HLNG, tex_routine }); +CRE_CYC(CYCHDR1, { TA_HLNG, 0, cyclic_handler, 2000, 0 }); +#ifdef CPUEXC1 +DEF_EXC(CPUEXC1, { TA_HLNG, cpuexc_handler} ); +#endif /* CPUEXC1 */ + +#include "../systask/timer.cfg" +#include "../systask/serial.cfg" +#include "../systask/logtask.cfg" diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/sample1.dpj b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/sample1.dpj new file mode 100644 index 0000000..f4707da --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/sample1.dpj @@ -0,0 +1,202 @@ + + + + + ADSP-BF533 + .dxe + Executable file + + + + + .\Debug + .\Debug + 0 + + + + + + + + + + + + + + + + + + + + + + + .\Release + .\Release + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/sample1.h b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/sample1.h new file mode 100644 index 0000000..30528bf --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/sample1.h @@ -0,0 +1,215 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2005 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: sample1.h,v 1.1 2009/02/01 12:21:34 suikan Exp $ + */ + +/* + * サンプルプログラム(1)のヘッダファイル + */ + +#include + +/* + * 各タスクの優先度の定義 + */ + +#define MAIN_PRIORITY 5 /* メインタスクの優先度 */ + /* HIGH_PRIORITY より高くすること */ + +#define HIGH_PRIORITY 9 /* 並列に実行されるタスクの優先度 */ +#define MID_PRIORITY 10 +#define LOW_PRIORITY 11 + +/* + * ターゲット依存の定義(CPU例外ハンドラの起動方法など) + */ + +#ifdef M68K + +#define CPUEXC1 5 /* ゼロ除算例外 */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) + +#elif defined(SH3) + +#define CPUEXC1 224 /* ロードエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) + +#elif defined(SH1) + +#define CPUEXC1 9 /* CPUアドレスエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) +#ifdef TOKIWA_SH1 +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#endif /* TOKIWA_SH1 */ + +#elif defined(ARMV4) + +#define CPUEXC1 4 /* ロードエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) + +#elif defined(V850) + +#elif defined(H8) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ + +#elif defined(H8S) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define LOOP_REF 4000L /* 速度計測用のループ回数 */ + +#elif defined(MICROBLAZE) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define STACK_SIZE 2048 /* タスクのスタックサイズ */ + +#elif defined(IA32) + +#define CPUEXC1 0 /* ゼロ除算例外 */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) +#define OMIT_VGET_TIM + +#elif defined(TMS320C54X) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define STACK_SIZE 320 /* タスクのスタックサイズ */ +#define LOOP_REF 500000L /* 速度計測用のループ回数 */ + +#elif defined(XSTORMY16) + +#define CPUEXC1 0 /* 無効命令例外 */ +#define RAISE_CPU_EXCEPTION __asm__( ".hword 0x0006" ) +#define OMIT_VGET_TIM /* vxget_tim()は非サポート */ +#define LOOP_REF 4000L /* 速度計測用のループ回数 */ +#define STACK_SIZE 256 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* SIOはポート2を用いる */ + +#elif defined(MIPS3) || defined(MIPS64) + +#define CPUEXC1 Bp /* ブレークポイント例外(ゼロ除算時に発生) */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) + +#elif defined(M16C) && defined(OAKS16) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ + +#elif defined(M16C) && defined(OAKS16_MINI) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 384 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ + +#elif defined(M16C) && defined(M3029) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(BLACKFIN) + +#define CPUEXC1 0 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm("excpt 0;") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(LINUX) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define OMIT_VGET_TIM +#define LOOP_REF 4000000 /* 速度計測用のループ回数 */ + +#elif defined(NIOS2) + +#define CPUEXC1 0 /* 未実装命令例外 */ +#define RAISE_CPU_EXCEPTION Asm("div zero, zero, zero"); + +#elif defined(M32C) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(M32R) + +#define CPUEXC1 EXC_TRAP00 +#define RAISE_CPU_EXCEPTION Asm("trap 0") + +#elif defined(TLCS_900) && defined(ZUP_F16_EX) + +#define CPUEXC1 3 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION Asm(" swi 2") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ +#define OMIT_VGET_TIM + +#endif + +/* + * ターゲットに依存する可能性のある定数の定義 + */ + +#ifndef TASK_PORTID +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ +#endif /* TASK_PORTID */ + +#ifndef STACK_SIZE +#define STACK_SIZE 8192 /* タスクのスタックサイズ */ +#endif /* STACK_SIZE */ + +#ifndef LOOP_REF +#define LOOP_REF 1000000 /* 速度計測用のループ回数 */ +#endif /* LOOP_REF */ + +/* + * 関数のプロトタイプ宣言 + */ +#ifndef _MACRO_ONLY + +extern void task(VP_INT tskno); +extern void main_task(VP_INT exinf); +extern void tex_routine(TEXPTN texptn, VP_INT tskno); +extern void cyclic_handler(VP_INT exinf); +extern void cpuexc_handler(VP p_excinf); + +#endif /* _MACRO_ONLY */ diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/sample1.ldf b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/sample1.ldf new file mode 100644 index 0000000..56c61fd --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/sample1.ldf @@ -0,0 +1,358 @@ +/* MANAGED-BY-SYSTEM-BUILDER */ + +/* +** ADSP-BF533 linker description file generated on Jul 27, 2006 at 20:44:31. +** +** Copyright (C) 2000-2006 Analog Devices Inc., All Rights Reserved. +** +** This file is generated automatically based upon the options selected +** in the LDF Wizard. Changes to the LDF configuration should be made by +** changing the appropriate options rather than editing this file. +** +** Configuration:- +** crt_doj: .\Release\20_sample1_c_basiccrt.doj +** processor: ADSP-BF533 +** si_revision: 0.2 +** using_cplusplus: true +** mem_init: false +** use_vdk: false +** use_eh: true +** use_argv: false +** running_from_internal_memory: true +** user_heap_src_file: D:\jsp14-current\usr\ezkit_bf533\20_sample1_c\20_sample1_c_heaptab.c +** libraries_use_stdlib: true +** libraries_use_fileio_libs: false +** libraries_use_ieeefp_emulation_libs: false +** libraries_use_eh_enabled_libs: false +** system_heap: L1 +** system_heap_min_size: 2K +** system_stack: L1 +** system_stack_min_size: 2K +** use_sdram: false +** +*/ + +ARCHITECTURE(ADSP-BF533) + +SEARCH_DIR($ADI_DSP/Blackfin/lib) + + +// Workarounds are enabled, exceptions are disabled. +#define RT_LIB_NAME(x) lib ## x ## y.dlb +#define RT_LIB_NAME_EH(x) lib ## x ## y.dlb +#define RT_LIB_NAME_MT(x) lib ## x ## y.dlb +#define RT_LIB_NAME_EH_MT(x) lib ## x ## y.dlb +#define RT_OBJ_NAME(x) x ## y.doj +#define RT_OBJ_NAME_MT(x) x ## mty.doj + + +$LIBRARIES = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + RT_LIB_NAME_MT(small532) + ,RT_LIB_NAME_MT(io532) + ,RT_LIB_NAME_MT(c532) + ,RT_LIB_NAME_MT(event532) + ,RT_LIB_NAME_MT(x532) + ,RT_LIB_NAME_EH_MT(cpp532) + ,RT_LIB_NAME_EH_MT(cpprt532) + ,RT_LIB_NAME(f64ieee532) + ,RT_LIB_NAME(dsp532) + ,RT_LIB_NAME(sftflt532) + ,RT_LIB_NAME(etsi532) + ,RT_LIB_NAME(ssl532) + ,RT_LIB_NAME(drv532) + ,RT_OBJ_NAME_MT(idle532) + ,RT_LIB_NAME_MT(rt_fileio532) + + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJS_LIBS_INTERNAL = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $OBJECTS{prefersMem("internal")}, $LIBRARIES{prefersMem("internal")} + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJS_LIBS_NOT_EXTERNAL = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $OBJECTS{!prefersMem("external")}, $LIBRARIES{!prefersMem("external")} + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJECTS = + + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + RT_LIB_NAME(profile532) + , $COMMAND_LINE_OBJECTS + , "cplbtab533.doj" + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + , RT_OBJ_NAME(crtn532) + ; + + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + +/*$VDSG */ +/* This code is preserved if the LDF is re-generated. */ + + +#define ASYNC0_MEMTYPE RAM +#define ASYNC1_MEMTYPE RAM +#define ASYNC2_MEMTYPE RAM +#define ASYNC3_MEMTYPE RAM + + +/*$VDSG */ + + +MEMORY +{ +/* +** ADSP-BF533 MEMORY MAP. +** +** The known memory spaces are as follows: +** +** 0xFFE00000 - 0xFFFFFFFF Core MMR registers (2MB) +** 0xFFC00000 - 0xFFDFFFFF System MMR registers (2MB) +** 0xFFB01000 - 0xFFBFFFFF Reserved +** 0xFFB00000 - 0xFFB00FFF Scratch SRAM (4K) +** 0xFFA14000 - 0xFFAFFFFF Reserved +** 0xFFA10000 - 0xFFA13FFF Code SRAM / cache (16K) +** 0xFFA00000 - 0xFFA0FFFF Code SRAM (64K) +** 0xFF908000 - 0xFF9FFFFF Reserved +** 0xFF904000 - 0xFF907FFF Data Bank B SRAM / cache (16K) +** 0xFF900000 - 0xFF903FFF Data Bank B SRAM (16K) +** 0xFF808000 - 0xFF8FFFFF Reserved +** 0xFF804000 - 0xFF807FFF Data Bank A SRAM / cache (16K) +** 0xFF800000 - 0xFF803FFF Data Bank A SRAM (16K) +** 0xEF000000 - 0xFF7FFFFF Reserved +** 0x20400000 - 0xEEFFFFFF Reserved +** 0x20300000 - 0x203FFFFF ASYNC MEMORY BANK 3 (1MB) +** 0x20200000 - 0x202FFFFF ASYNC MEMORY BANK 2 (1MB) +** 0x20100000 - 0x201FFFFF ASYNC MEMORY BANK 1 (1MB) +** 0x20000000 - 0x200FFFFF ASYNC MEMORY BANK 0 (1MB) +** 0x00000000 - 0x07FFFFFF SDRAM MEMORY (16MB - 128MB) +*/ + + MEM_SYS_MMRS { TYPE(RAM) START(0xFFC00000) END(0xFFDFFFFF) WIDTH(8) } + MEM_L1_SCRATCH { TYPE(RAM) START(0xFFB00000) END(0xFFB00FFF) WIDTH(8) } + MEM_L1_CODE { TYPE(RAM) START(0xFFA00000) END(0xFFA13FFF) WIDTH(8) } + MEM_L1_DATA_B { TYPE(RAM) START(0xFF900000) END(0xFF907FFF) WIDTH(8) } + MEM_L1_DATA_A { TYPE(RAM) START(0xFF800000) END(0xFF807FFF) WIDTH(8) } + MEM_ASYNC3 { TYPE(ASYNC3_MEMTYPE) START(0x20300000) END(0x203FFFFF) WIDTH(8) } + MEM_ASYNC2 { TYPE(ASYNC2_MEMTYPE) START(0x20200000) END(0x202FFFFF) WIDTH(8) } + MEM_ASYNC1 { TYPE(ASYNC1_MEMTYPE) START(0x20100000) END(0x201FFFFF) WIDTH(8) } + MEM_ASYNC0 { TYPE(ASYNC0_MEMTYPE) START(0x20000000) END(0x200FFFFF) WIDTH(8) } + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + +} /* MEMORY */ + +PROCESSOR p0 +{ + OUTPUT($COMMAND_LINE_OUTPUT_FILE) + RESOLVE(start, 0xFFA00000) + KEEP(start, _main) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + SECTIONS + { + /* Workaround for hardware errata 05-00-0189 - + ** "Speculative (and fetches made at boundary of reserved memory + ** space) for instruction or data fetches may cause false + ** protection exceptions". + ** + ** Done by avoiding use of 76 bytes from at the end of blocks + ** that are adjacent to reserved memory. Workaround is enabled + ** for appropriate silicon revisions (-si-revision switch). + */ + RESERVE(___wab0=MEMORY_END(MEM_L1_SCRATCH) - 75, ___l0 = 76) + RESERVE(___wab2=MEMORY_END(MEM_L1_CODE) - 75, ___l2 = 76) + RESERVE(___wab4=MEMORY_END(MEM_L1_DATA_B) - 75, ___l4 = 76) + RESERVE(___wab6=MEMORY_END(MEM_L1_DATA_A) - 75, ___l6 = 76) + RESERVE(___wab7=MEMORY_END(MEM_ASYNC3) - 75, ___l7 = 76) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + scratchpad + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_SCRATCH + + L1_code + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS($OBJECTS(L1_code) $LIBRARIES(L1_code)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(cplb_code) $LIBRARIES(cplb_code)) + INPUT_SECTIONS($OBJECTS(cplb) $LIBRARIES(cplb)) + INPUT_SECTIONS($OBJECTS(noncache_code) $LIBRARIES(noncache_code)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(program)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(program)) + INPUT_SECTIONS($OBJECTS(program) $LIBRARIES(program)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_CODE + + L1_data_a + { + INPUT_SECTION_ALIGN(4) + ___l1_data_cache_a = 0; + INPUT_SECTIONS($OBJECTS(L1_data_a) $LIBRARIES(L1_data_a)) + INPUT_SECTIONS($OBJECTS(L1_data) $LIBRARIES(L1_data)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + RESERVE(heaps_and_stack_in_L1_data_a, heaps_and_stack_in_L1_data_a_length = 2K, 4) + INPUT_SECTIONS($OBJECTS(vtbl) $LIBRARIES(vtbl)) + INPUT_SECTIONS($OBJECTS(ctor) $LIBRARIES(ctor)) + INPUT_SECTIONS($OBJECTS(ctorl) $LIBRARIES(ctorl)) + INPUT_SECTIONS($OBJECTS(.frt) $LIBRARIES(.frt)) + INPUT_SECTIONS($OBJECTS(.rtti) $LIBRARIES(.rtti)) + INPUT_SECTIONS($OBJECTS(.gdt) $LIBRARIES(.gdt)) + INPUT_SECTIONS($OBJECTS(.gdtl) $LIBRARIES(.gdtl)) + INPUT_SECTIONS($OBJECTS(.edt) $LIBRARIES(.edt)) + INPUT_SECTIONS($OBJECTS(.cht) $LIBRARIES(.cht)) + INPUT_SECTIONS($OBJECTS(cplb_data) $LIBRARIES(cplb_data)) + INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(data1)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(data1)) + INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1)) + INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_A + + bsz_L1_data_a ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(bsz)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(bsz)) + INPUT_SECTIONS($OBJECTS(bsz) $LIBRARIES(bsz)) + } > MEM_L1_DATA_A + + L1_data_a_stack_heap + { + INPUT_SECTION_ALIGN(4) + RESERVE_EXPAND(heaps_and_stack_in_L1_data_a, heaps_and_stack_in_L1_data_a_length, 0, 4) + ldf_stack_space = heaps_and_stack_in_L1_data_a; + ldf_stack_end = (ldf_stack_space + (((heaps_and_stack_in_L1_data_a_length * 2K) / 2K) - 4)) & 0xfffffffc; + } > MEM_L1_DATA_A + + L1_data_b + { + INPUT_SECTION_ALIGN(4) + ___l1_data_cache_b = 0; + INPUT_SECTIONS($OBJECTS(L1_data_b) $LIBRARIES(L1_data_b)) + INPUT_SECTIONS($OBJECTS(L1_data) $LIBRARIES(L1_data)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + RESERVE(heaps_and_stack_in_L1_data_b, heaps_and_stack_in_L1_data_b_length = 2K, 4) + INPUT_SECTIONS($OBJECTS(cplb_data) $LIBRARIES(cplb_data)) + INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(data1)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(data1)) + INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1)) + INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata)) + INPUT_SECTIONS($OBJECTS(.edt) $LIBRARIES(.edt) ) + INPUT_SECTIONS($OBJECTS(.cht) $LIBRARIES(.cht) ) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_B + + bsz_L1_data_b ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS($OBJECTS(L1_bsz) $LIBRARIES(L1_bsz)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(bsz)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(bsz)) + INPUT_SECTIONS($OBJECTS(bsz) $LIBRARIES(bsz)) + } > MEM_L1_DATA_B + + L1_data_b_stack_heap + { + INPUT_SECTION_ALIGN(4) + RESERVE_EXPAND(heaps_and_stack_in_L1_data_b, heaps_and_stack_in_L1_data_b_length, 0, 4) + ldf_heap_space = heaps_and_stack_in_L1_data_b; + ldf_heap_end = (ldf_heap_space + (((heaps_and_stack_in_L1_data_b_length * 2K) / 2K) - 4)) & 0xfffffffc; + ldf_heap_length = ldf_heap_end - ldf_heap_space; + } > MEM_L1_DATA_B + + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } /* SECTIONS */ +} /* p0 */ + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/sample1_ezkit_bf533.dpg b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/sample1_ezkit_bf533.dpg new file mode 100644 index 0000000..0d8fc4c --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf533/sample1_ezkit_bf533.dpg @@ -0,0 +1,12 @@ + + + + + + + + + libkernel + + + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/config.bat b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/config.bat new file mode 100644 index 0000000..7d25283 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/config.bat @@ -0,0 +1,17 @@ +rem APPNAME アプリケーション名 +rem CFGPATH cfg.exeが置いてあるディレクトリ +rem VDSPPATH VisualDSP++のインストールディレクトリ +rem JSPPATH TOPPERS/JSPのディレクトリ +rem CPATH Blackfin CPU依存部のディレクトリ +rem SPATH システム依存部のディレクトリ + +set APPNAME=sample1 +set CFGPATH=d:\bin +set VDSPPATH=c:\Program Files\Analog Devices\VisualDSP 5.0 +set JSPPATH=d:\jsp +set CPATH=%JSPPATH%\config\blackfin +set SPATH=%CPATH%\ezkit_bf537;%CPATH%\_common_bf537 + +"%VDSPPATH%\pp.exe" %APPNAME%.cfg -D__ECC__ -D__ADSPLPBLACKFIN__ -I"%CPATH%;%SPATH%;%JSPPATH%\systask;%JSPPATH%\include;" > %APPNAME%_pp.cfg +"%CFGPATH%\cfg.exe" %APPNAME%_pp.cfg +del %APPNAME%_pp.cfg diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/kernel_cfg.c b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/kernel_cfg.c new file mode 100644 index 0000000..783a324 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/kernel_cfg.c @@ -0,0 +1,181 @@ +/* Configured with [sample1_pp.cfg ] */ + +#include "kernel_cfg.h" +#include "kernel_id.h" + +#if TKERNEL_PRVER >= 0x1040 +#define CFG_INTHDR_ENTRY(inthdr) INTHDR_ENTRY(inthdr) +#define CFG_EXCHDR_ENTRY(exchdr) EXCHDR_ENTRY(exchdr) +#define CFG_INT_ENTRY(inthdr) INT_ENTRY(inthdr) +#define CFG_EXC_ENTRY(exchdr) EXC_ENTRY(exchdr) +#else +#error "This configuration file has no compatibility with TOPPERS/JSP rel 1.3 or earlier." +#endif + +#ifndef __EMPTY_LABEL +#define __EMPTY_LABEL(x,y) x y[0] +#endif + +#if TKERNEL_PRID != 0x0001u /* TOPPERS/JSP */ +#error "You can not use this configuration file without TOPPERS/JSP" +#endif + + /* User specified include files*/ +#include "sample1.h" +#include "hw_timer.h" +#include "timer.h" +#include "hw_serial.h" +#include "serial.h" +#include "logtask.h" + + + /* Object initializer [task] */ + +#define TNUM_TSKID 5 + +const ID _kernel_tmax_tskid = (TMIN_TSKID + TNUM_TSKID - 1); + +static __STK_UNIT __stack_TASK1[__TCOUNT_STK_UNIT(512)]; +static __STK_UNIT __stack_TASK2[__TCOUNT_STK_UNIT(512)]; +static __STK_UNIT __stack_TASK3[__TCOUNT_STK_UNIT(512)]; +static __STK_UNIT __stack_MAIN_TASK[__TCOUNT_STK_UNIT(512)]; +static __STK_UNIT __stack_LOGTASK[__TCOUNT_STK_UNIT(LOGTASK_STACK_SIZE)]; + +const TINIB _kernel_tinib_table[TNUM_TSKID] = { + {0, (VP_INT)(( VP_INT ) 1), (FP)(task), INT_PRIORITY(10), __TROUND_STK_UNIT(512), __stack_TASK1, 0, (FP)(tex_routine)}, + {0, (VP_INT)(( VP_INT ) 2), (FP)(task), INT_PRIORITY(10), __TROUND_STK_UNIT(512), __stack_TASK2, 0, (FP)(tex_routine)}, + {0, (VP_INT)(( VP_INT ) 3), (FP)(task), INT_PRIORITY(10), __TROUND_STK_UNIT(512), __stack_TASK3, 0, (FP)(tex_routine)}, + {0x00u | 0x02u, (VP_INT)(0), (FP)(main_task), INT_PRIORITY(5), __TROUND_STK_UNIT(512), __stack_MAIN_TASK, TA_NULL, (FP)(NULL)}, + {0x00u | 0x02u, (VP_INT)(( VP_INT ) 1), (FP)(logtask), INT_PRIORITY(LOGTASK_PRIORITY), __TROUND_STK_UNIT(LOGTASK_STACK_SIZE), __stack_LOGTASK, TA_NULL, (FP)(NULL)} +}; + +const ID _kernel_torder_table[TNUM_TSKID] = {1,2,3,4,5}; + +TCB _kernel_tcb_table[TNUM_TSKID]; + + + /* Object initializer [semaphore] */ + +#define TNUM_SEMID 2 + +const ID _kernel_tmax_semid = (TMIN_SEMID + TNUM_SEMID - 1); + +const SEMINIB _kernel_seminib_table[TNUM_SEMID] = { + {1, 0, 1}, + {1, 1, 1} +}; + +SEMCB _kernel_semcb_table[TNUM_SEMID]; + + + /* Object initializer [eventflag] */ + +#define TNUM_FLGID 0 + +const ID _kernel_tmax_flgid = (TMIN_FLGID + TNUM_FLGID - 1); + +__EMPTY_LABEL(const FLGINIB, _kernel_flginib_table); +__EMPTY_LABEL(FLGCB, _kernel_flgcb_table); + + + /* Object initializer [dataqueue] */ + +#define TNUM_DTQID 0 + +const ID _kernel_tmax_dtqid = (TMIN_DTQID + TNUM_DTQID - 1); + +__EMPTY_LABEL(const DTQINIB, _kernel_dtqinib_table); +__EMPTY_LABEL(DTQCB, _kernel_dtqcb_table); + + + /* Object initializer [mailbox] */ + +#define TNUM_MBXID 0 + +const ID _kernel_tmax_mbxid = (TMIN_MBXID + TNUM_MBXID - 1); + +__EMPTY_LABEL(const MBXINIB, _kernel_mbxinib_table); +__EMPTY_LABEL(MBXCB, _kernel_mbxcb_table); + + + /* Object initializer [mempfix] */ + +#define TNUM_MPFID 0 + +const ID _kernel_tmax_mpfid = (TMIN_MPFID + TNUM_MPFID - 1); + +__EMPTY_LABEL(const MPFINIB, _kernel_mpfinib_table); +__EMPTY_LABEL(MPFCB, _kernel_mpfcb_table); + + + /* Object initializer [cyclic] */ + +#define TNUM_CYCID 1 + +const ID _kernel_tmax_cycid = (TMIN_CYCID + TNUM_CYCID - 1); + +const CYCINIB _kernel_cycinib_table[TNUM_CYCID] = { + {0,0,(FP)(cyclic_handler),2000,0} +}; + +CYCCB _kernel_cyccb_table[TNUM_CYCID]; + + + /* Object initializer [interrupt] */ + +#define TNUM_INHNO 3 + +const UINT _kernel_tnum_inhno = TNUM_INHNO; + +CFG_INTHDR_ENTRY(sio0_rx_handler); +CFG_INTHDR_ENTRY(sio0_tx_handler); +CFG_INTHDR_ENTRY(timer_handler); + +const INHINIB _kernel_inhinib_table[TNUM_INHNO] = { + {11,0,(FP)CFG_INT_ENTRY(sio0_rx_handler)}, + {12,0,(FP)CFG_INT_ENTRY(sio0_tx_handler)}, + {26,0,(FP)CFG_INT_ENTRY(timer_handler)} +}; + + + /* Object initializer [exception] */ + +#define TNUM_EXCNO 1 + +const UINT _kernel_tnum_excno = TNUM_EXCNO; + +CFG_EXCHDR_ENTRY(cpuexc_handler); + +const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = { + {0,0,(FP)CFG_EXC_ENTRY(cpuexc_handler)} +}; + + /* Initialization handler */ + +void +_kernel_call_inirtn(void) +{ + timer_initialize( (VP_INT)(0) ); + serial_initialize( (VP_INT)(0) ); +} + +void +_kernel_call_terrtn(void) +{ + timer_terminate( (VP_INT)(0) ); +} + + /* Object initialization routine */ + +void +_kernel_object_initialize(void) +{ + _kernel_task_initialize(); + _kernel_semaphore_initialize(); + _kernel_cyclic_initialize(); + _kernel_interrupt_initialize(); + _kernel_exception_initialize(); +} + +TMEVTN _kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID]; + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/kernel_id.h b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/kernel_id.h new file mode 100644 index 0000000..bf1af50 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/kernel_id.h @@ -0,0 +1,16 @@ +#ifndef KERNEL_ID_H +#define KERNEL_ID_H + + /* object identifier deifnition */ + +#define CYCHDR1 1 +#define LOGTASK 5 +#define MAIN_TASK 4 +#define SERIAL_RCV_SEM1 1 +#define SERIAL_SND_SEM1 2 +#define TASK1 1 +#define TASK2 2 +#define TASK3 3 + +#endif /* KERNEL_ID_H */ + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/readme.txt b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/readme.txt new file mode 100644 index 0000000..b92c99b --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/readme.txt @@ -0,0 +1,26 @@ +TOPPERS/JSPのsample1アプリケーションをEZ-KIT Lite BF537に +移植した。 + +ビルドに先立って、jsp/config/blackfin/ezkit_bf537/libkernel.dpjを +ビルドして、libekernel.dlbを作っておくこと。 + +また、jsp/utils/blackfin-vdsp/offset.hは、必要に応じて +作り直すこと。 + +VisualDSP++のICEを使ってロードする場合には、実行直前に次の +二つのレジスタの値に注意すること。 + +PLL_CTL : 0x1400 +EBIU_SDBCTL.EBE : 0 + +TOPPERS/JSP for Blackfinはこの二つをチェックして、もし違う +値であると外部でPLLとSDRAMを変更したと認識してPLLの初期化を +中止する。これは外部SDRAMなどクロックに依存するデバイスの +動作を保護するためである。 + +sample1.ldfは、VisualDSP++に作らせたあと、自動更新を +停止し、crtを削除したものである。 + +異なるシステム依存部用に改造する場合は、プロジェクトの +Cコンパイラ、およびアセンブラのインクルード・パスを必ず +変更すること。 \ No newline at end of file diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/sample1.c b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/sample1.c new file mode 100644 index 0000000..c6d7a6a --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/sample1.c @@ -0,0 +1,417 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2004-2006 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: sample1.c,v 1.1 2009/02/01 12:21:34 suikan Exp $ + */ + +/* + * サンプルプログラム(1)の本体 + * + * JSPカーネルの基本的な動作を確認するためのサンプルプログラム. + * + * プログラムの概要: + * + * ユーザインタフェースを受け持つメインタスク(タスクID: MAIN_TASK, + * 優先度: MAIN_PRIORITY)と,三つの並列実行されるタスク(タスクID: + * TASK1〜TASK3,初期優先度: MID_PRIORITY)で構成される.また,起動周 + * 期が2秒の周期ハンドラ(周期ハンドラID: CYCHDR1)を用いる. + * + * 並列実行されるタスクは,task_loop 回空ループを実行する度に,タスク + * が実行中であることをあらわすメッセージを表示する. + * + * 周期ハンドラは,三つの優先度(HIGH_PRIORITY,MID_PRIORITY, + * LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は, + * 周期ハンドラは停止状態になっている. + * + * メインタスクは,シリアルI/Oポートからの文字入力を行い(文字入力を + * 待っている間は,並列実行されるタスクが実行されている),入力された + * 文字に対応した処理を実行する.入力された文字と処理の関係は次の通り. + * Control-C または 'Q' が入力されると,プログラムを終了する. + * + * '1' : 以降のコマンドは TASK1 に対して行う. + * '2' : 以降のコマンドは TASK2 に対して行う. + * '3' : 以降のコマンドは TASK3 に対して行う. + * 'a' : タスクを act_tsk により起動する. + * 'A' : タスクに対する起動要求を can_act によりキャンセルする. + * 'e' : タスクに ext_tsk を呼び出させ,終了させる. + * 't' : タスクを ter_tsk により強制終了する. + * '>' : タスクの優先度を HIGH_PRIORITY にする. + * '=' : タスクの優先度を MID_PRIORITY にする. + * '<' : タスクの優先度を LOW_PRIORITY にする. + * 'G' : タスクの優先度を get_pri で読み出す. + * 's' : タスクに slp_tsk を呼び出させ,起床待ちにさせる. + * 'S' : タスクに tslp_tsk(10秒) を呼び出させ,起床待ちにさせる. + * 'w' : タスクを wup_tsk により起床する. + * 'W' : タスクに対する起床要求を can_wup によりキャンセルする. + * 'l' : タスクを rel_wai により強制的に待ち解除にする. + * 'u' : タスクを sus_tsk により強制待ち状態にする. + * 'm' : タスクの強制待ち状態を rsm_tsk により解除する. + * 'M' : タスクの強制待ち状態を frsm_tsk により強制解除する. + * 'd' : タスクに dly_tsk(10秒) を呼び出させ,時間経過待ちにさせる. + * 'x' : タスクにパターン 0x0001 の例外処理を要求する. + * 'X' : タスクにパターン 0x0002 の例外処理を要求する. + * 'y' : タスクに dis_tex を呼び出させ,タスク例外を禁止する. + * 'Y' : タスクに ena_tex を呼び出させ,タスク例外を許可する. + * 'r' : 三つの優先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)の + * レディキューを回転させる. + * 'c' : 周期ハンドラを動作させる. + * 'C' : 周期ハンドラを停止させる. + * 'z' : CPU例外を発生させる. + * 'Z' : CPUロック状態でCPU例外を発生させる(プログラムを終了する). + * 'V' : vxget_tim で性能評価用システム時刻を2回読む. + * 'v' : 発行したシステムコールを表示する(デフォルト). + * 'q' : 発行したシステムコールを表示しない. + */ + +#include +#include "kernel_id.h" +#include "sample1.h" + +/* + * 並行実行されるタスクへのメッセージ領域 + */ +char message[3]; + +/* + * ループ回数 + */ +volatile UW task_loop; /* タスク内でのループ回数 */ +UW tex_loop; /* 例外処理ルーチン内でのループ回数 */ + +/* + * 並行実行されるタスク + */ +void task(VP_INT exinf) +{ + volatile UW i; + INT n = 0; + INT tskno = (INT) exinf; + const char *graph[] = { "|", " +", " *" }; + char c; + + ena_tex(); + while (1) { + syslog(LOG_NOTICE, "task%d is running (%03d). %s", + tskno, ++n, graph[tskno-1]); + for (i = 0; i < task_loop; i++); + c = message[tskno-1]; + message[tskno-1] = 0; + switch (c) { + case 'e': + syslog(LOG_INFO, "#%d#ext_tsk()", tskno); + ext_tsk(); + case 's': + syslog(LOG_INFO, "#%d#slp_tsk()", tskno); + syscall(slp_tsk()); + break; + case 'S': + syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno); + syscall(tslp_tsk(10000)); + break; + case 'd': + syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno); + syscall(dly_tsk(10000)); + break; + case 'y': + syslog(LOG_INFO, "#%d#dis_tex()", tskno); + syscall(dis_tex()); + break; + case 'Y': + syslog(LOG_INFO, "#%d#ena_tex()", tskno); + syscall(ena_tex()); + break; +#ifdef CPUEXC1 + case 'z': + syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); + RAISE_CPU_EXCEPTION; + break; + case 'Z': + loc_cpu(); + syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); + RAISE_CPU_EXCEPTION; + unl_cpu(); + break; +#endif /* CPUEXC1 */ + default: + break; + } + } +} + +/* + * 並行して実行されるタスク用のタスク例外処理ルーチン + */ +void tex_routine(TEXPTN texptn, VP_INT exinf) +{ + volatile UW i; + INT tskno = (INT) exinf; + + syslog(LOG_NOTICE, "task%d receives exception 0x%04x. ", + tskno, texptn); + for (i = 0; i < tex_loop; i++); + + if (texptn & 0x8000) { + syslog(LOG_INFO, "#%d#ext_tsk()", tskno); + ext_tsk(); + } +} + +/* + * CPU例外ハンドラ + */ +#ifdef CPUEXC1 + +void +cpuexc_handler(VP p_excinf) +{ + ID tskid; + + syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", + p_excinf); + if (sns_ctx() != TRUE) { + syslog(LOG_WARNING, + "sns_ctx() is not TRUE in CPU exception handler."); + } + if (sns_dpn() != TRUE) { + syslog(LOG_WARNING, + "sns_dpn() is not TRUE in CPU exception handler."); + } + syslog(LOG_DEBUG, + "sns_loc = %d sns_dsp = %d", sns_loc(), sns_dsp()); + syslog(LOG_DEBUG, + "vxsns_loc = %d vxsns_ctx = %d vxsns_dsp = %d vxsns_dpn = %d", + vxsns_loc(p_excinf), vxsns_ctx(p_excinf), + vxsns_dsp(p_excinf), vxsns_dpn(p_excinf)); + + if (!vxsns_loc(p_excinf) && !vxsns_ctx(p_excinf)) { + syscall(iget_tid(&tskid)); + syscall(iras_tex(tskid, 0x8000)); + } + else { + syslog(LOG_NOTICE, "Sample program ends with exception."); + kernel_exit(); + } +} + +#endif /* CPUEXC1 */ + +/* + * 周期ハンドラ + * + * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー + * を回転させる. + */ +void cyclic_handler(VP_INT exinf) +{ + irot_rdq(HIGH_PRIORITY); + irot_rdq(MID_PRIORITY); + irot_rdq(LOW_PRIORITY); +} + +/* + * メインタスク + */ +void main_task(VP_INT exinf) +{ + char c; + ID tskid = TASK1; + volatile UW i; + INT tskno = 1; + ER_UINT ercd; + PRI tskpri; + SYSTIM stime1, stime2; +#ifndef OMIT_VGET_TIM + SYSUTIM utime1, utime2; +#endif /* OMIT_VGET_TIM */ + + vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); + syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (INT) exinf); + + syscall(serial_ctl_por(TASK_PORTID, + (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); + + /* + * ループ回数の設定 + */ + task_loop = LOOP_REF; + get_tim(&stime1); + for (i = 0; i < task_loop; i++); + get_tim(&stime2); + task_loop = LOOP_REF * 400 / (stime2 - stime1); + tex_loop = task_loop / 5; + + /* + * タスクの起動 + */ + act_tsk(TASK1); + act_tsk(TASK2); + act_tsk(TASK3); + + /* + * メインループ + */ + do { + syscall(serial_rea_dat(TASK_PORTID, &c, 1)); + switch (c) { + case 'e': + case 's': + case 'S': + case 'd': + case 'y': + case 'Y': + case 'z': + case 'Z': + message[tskno-1] = c; + break; + case '1': + tskno = 1; + tskid = TASK1; + break; + case '2': + tskno = 2; + tskid = TASK2; + break; + case '3': + tskno = 3; + tskid = TASK3; + break; + case 'a': + syslog(LOG_INFO, "#act_tsk(%d)", tskno); + syscall(act_tsk(tskid)); + break; + case 'A': + syslog(LOG_INFO, "#can_act(%d)", tskno); + syscall(ercd = can_act(tskid)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "can_act(%d) returns %d", + tskno, ercd); + } + break; + case 't': + syslog(LOG_INFO, "#ter_tsk(%d)", tskno); + syscall(ter_tsk(tskid)); + break; + case '>': + syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno); + chg_pri(tskid, HIGH_PRIORITY); + break; + case '=': + syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno); + chg_pri(tskid, MID_PRIORITY); + break; + case '<': + syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno); + chg_pri(tskid, LOW_PRIORITY); + break; + case 'G': + syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno); + syscall(ercd = get_pri(tskid, &tskpri)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "priority of task %d is %d", + tskno, tskpri); + } + break; + case 'w': + syslog(LOG_INFO, "#wup_tsk(%d)", tskno); + syscall(wup_tsk(tskid)); + break; + case 'W': + syslog(LOG_INFO, "#can_wup(%d)", tskno); + syscall(ercd = can_wup(tskid)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "can_wup(%d) returns %d", + tskno, ercd); + } + break; + case 'l': + syslog(LOG_INFO, "#rel_wai(%d)", tskno); + syscall(rel_wai(tskid)); + break; + case 'u': + syslog(LOG_INFO, "#sus_tsk(%d)", tskno); + syscall(sus_tsk(tskid)); + break; + case 'm': + syslog(LOG_INFO, "#rsm_tsk(%d)", tskno); + syscall(rsm_tsk(tskid)); + break; + case 'M': + syslog(LOG_INFO, "#frsm_tsk(%d)", tskno); + syscall(frsm_tsk(tskid)); + break; + case 'x': + syslog(LOG_INFO, "#ras_tex(%d, 0x0001)", tskno); + syscall(ras_tex(tskid, 0x0001)); + break; + case 'X': + syslog(LOG_INFO, "#ras_tex(%d, 0x0002)", tskno); + syscall(ras_tex(tskid, 0x0002)); + break; + case 'r': + syslog(LOG_INFO, "#rot_rdq(three priorities)"); + rot_rdq(HIGH_PRIORITY); + rot_rdq(MID_PRIORITY); + rot_rdq(LOW_PRIORITY); + break; + case 'c': + sta_cyc(CYCHDR1); + break; + case 'C': + stp_cyc(CYCHDR1); + break; +#ifndef OMIT_VGET_TIM + case 'V': + syscall(vxget_tim(&utime1)); + syscall(vxget_tim(&utime2)); + syslog(LOG_NOTICE, "utime1 = %d, utime2 = %d", + (UINT) utime1, (UINT) utime2); + break; +#endif /* OMIT_VGET_TIM */ + case 'v': + vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); + break; + case 'q': + vmsk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG)); + break; + default: + break; + } + } while (c != '\003' && c != 'Q'); + + syslog(LOG_NOTICE, "Sample program ends."); + kernel_exit(); +} diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/sample1.cfg b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/sample1.cfg new file mode 100644 index 0000000..5f02d0b --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/sample1.cfg @@ -0,0 +1,28 @@ +/* + * @(#) $Id: sample1.cfg,v 1.1 2009/02/01 12:21:34 suikan Exp $ + */ + +/* + * サンプルプログラム(1)のシステムコンフィギュレーションファイル + */ + +#define _MACRO_ONLY +#include "sample1.h" + +INCLUDE("\"sample1.h\""); +CRE_TSK(TASK1, { TA_HLNG, (VP_INT) 1, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(TASK2, { TA_HLNG, (VP_INT) 2, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(TASK3, { TA_HLNG, (VP_INT) 3, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(MAIN_TASK, { TA_HLNG|TA_ACT, 0, main_task, MAIN_PRIORITY, + STACK_SIZE, NULL }); +DEF_TEX(TASK1, { TA_HLNG, tex_routine }); +DEF_TEX(TASK2, { TA_HLNG, tex_routine }); +DEF_TEX(TASK3, { TA_HLNG, tex_routine }); +CRE_CYC(CYCHDR1, { TA_HLNG, 0, cyclic_handler, 2000, 0 }); +#ifdef CPUEXC1 +DEF_EXC(CPUEXC1, { TA_HLNG, cpuexc_handler} ); +#endif /* CPUEXC1 */ + +#include "../systask/timer.cfg" +#include "../systask/serial.cfg" +#include "../systask/logtask.cfg" diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/sample1.dpj b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/sample1.dpj new file mode 100644 index 0000000..e47b42c --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/sample1.dpj @@ -0,0 +1,240 @@ + + + + + ADSP-BF537 + .dxe + Executable file + + + + + .\Debug + .\Debug + 0 + + + + + + + + + + + + + + + + + + + + + + + .\Release + .\Release + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/sample1.h b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/sample1.h new file mode 100644 index 0000000..30528bf --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/sample1.h @@ -0,0 +1,215 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2005 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: sample1.h,v 1.1 2009/02/01 12:21:34 suikan Exp $ + */ + +/* + * サンプルプログラム(1)のヘッダファイル + */ + +#include + +/* + * 各タスクの優先度の定義 + */ + +#define MAIN_PRIORITY 5 /* メインタスクの優先度 */ + /* HIGH_PRIORITY より高くすること */ + +#define HIGH_PRIORITY 9 /* 並列に実行されるタスクの優先度 */ +#define MID_PRIORITY 10 +#define LOW_PRIORITY 11 + +/* + * ターゲット依存の定義(CPU例外ハンドラの起動方法など) + */ + +#ifdef M68K + +#define CPUEXC1 5 /* ゼロ除算例外 */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) + +#elif defined(SH3) + +#define CPUEXC1 224 /* ロードエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) + +#elif defined(SH1) + +#define CPUEXC1 9 /* CPUアドレスエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) +#ifdef TOKIWA_SH1 +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#endif /* TOKIWA_SH1 */ + +#elif defined(ARMV4) + +#define CPUEXC1 4 /* ロードエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) + +#elif defined(V850) + +#elif defined(H8) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ + +#elif defined(H8S) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define LOOP_REF 4000L /* 速度計測用のループ回数 */ + +#elif defined(MICROBLAZE) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define STACK_SIZE 2048 /* タスクのスタックサイズ */ + +#elif defined(IA32) + +#define CPUEXC1 0 /* ゼロ除算例外 */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) +#define OMIT_VGET_TIM + +#elif defined(TMS320C54X) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define STACK_SIZE 320 /* タスクのスタックサイズ */ +#define LOOP_REF 500000L /* 速度計測用のループ回数 */ + +#elif defined(XSTORMY16) + +#define CPUEXC1 0 /* 無効命令例外 */ +#define RAISE_CPU_EXCEPTION __asm__( ".hword 0x0006" ) +#define OMIT_VGET_TIM /* vxget_tim()は非サポート */ +#define LOOP_REF 4000L /* 速度計測用のループ回数 */ +#define STACK_SIZE 256 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* SIOはポート2を用いる */ + +#elif defined(MIPS3) || defined(MIPS64) + +#define CPUEXC1 Bp /* ブレークポイント例外(ゼロ除算時に発生) */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) + +#elif defined(M16C) && defined(OAKS16) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ + +#elif defined(M16C) && defined(OAKS16_MINI) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 384 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ + +#elif defined(M16C) && defined(M3029) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(BLACKFIN) + +#define CPUEXC1 0 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm("excpt 0;") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(LINUX) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define OMIT_VGET_TIM +#define LOOP_REF 4000000 /* 速度計測用のループ回数 */ + +#elif defined(NIOS2) + +#define CPUEXC1 0 /* 未実装命令例外 */ +#define RAISE_CPU_EXCEPTION Asm("div zero, zero, zero"); + +#elif defined(M32C) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(M32R) + +#define CPUEXC1 EXC_TRAP00 +#define RAISE_CPU_EXCEPTION Asm("trap 0") + +#elif defined(TLCS_900) && defined(ZUP_F16_EX) + +#define CPUEXC1 3 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION Asm(" swi 2") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ +#define OMIT_VGET_TIM + +#endif + +/* + * ターゲットに依存する可能性のある定数の定義 + */ + +#ifndef TASK_PORTID +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ +#endif /* TASK_PORTID */ + +#ifndef STACK_SIZE +#define STACK_SIZE 8192 /* タスクのスタックサイズ */ +#endif /* STACK_SIZE */ + +#ifndef LOOP_REF +#define LOOP_REF 1000000 /* 速度計測用のループ回数 */ +#endif /* LOOP_REF */ + +/* + * 関数のプロトタイプ宣言 + */ +#ifndef _MACRO_ONLY + +extern void task(VP_INT tskno); +extern void main_task(VP_INT exinf); +extern void tex_routine(TEXPTN texptn, VP_INT tskno); +extern void cyclic_handler(VP_INT exinf); +extern void cpuexc_handler(VP p_excinf); + +#endif /* _MACRO_ONLY */ diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/sample1.ldf b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/sample1.ldf new file mode 100644 index 0000000..7078f86 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/sample1.ldf @@ -0,0 +1,411 @@ +/* MANAGED-BY-SYSTEM-BUILDER */ + +/* +** ADSP-BF537 linker description file generated on Feb 01, 2009 at 17:32:12. +** +** Copyright (C) 2000-2007 Analog Devices Inc., All Rights Reserved. +** +** This file is generated automatically based upon the options selected +** in the LDF Wizard. Changes to the LDF configuration should be made by +** changing the appropriate options rather than editing this file. +** +** Configuration:- +** crt_doj: .\Debug\sample1_ezkit_bf537_basiccrt.doj +** processor: ADSP-BF537 +** si_revision: automatic +** mem_init: false +** use_vdk: false +** use_eh: true +** use_argv: false +** running_from_internal_memory: true +** user_heap_src_file: D:\jsp\tools\blackfin-vdsp\sample1_ezkit_bf537\sample1_ezkit_bf537_heaptab.c +** libraries_use_stdlib: true +** libraries_use_fileio_libs: false +** libraries_use_ieeefp_emulation_libs: false +** libraries_use_eh_enabled_libs: false +** system_heap: L1 +** system_heap_min_size: 2K +** system_stack: L1 +** system_stack_min_size: 2K +** use_sdram: false +** +*/ + +ARCHITECTURE(ADSP-BF537) + +SEARCH_DIR($ADI_DSP/Blackfin/lib) + + +// Workarounds are enabled, exceptions are disabled. +#define RT_LIB_NAME(x) lib ## x ## y.dlb +#define RT_LIB_NAME_EH(x) lib ## x ## y.dlb +#define RT_LIB_NAME_MT(x) lib ## x ## y.dlb +#define RT_LIB_NAME_EH_MT(x) lib ## x ## y.dlb +#define RT_OBJ_NAME(x) x ## y.doj +#define RT_OBJ_NAME_MT(x) x ## mty.doj + + +$LIBRARIES = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + RT_LIB_NAME_MT(small532) + ,RT_LIB_NAME_MT(io532) + ,RT_LIB_NAME_MT(c532) + ,RT_LIB_NAME_MT(event532) + ,RT_LIB_NAME_MT(x532) + ,RT_LIB_NAME_EH_MT(cpp532) + ,RT_LIB_NAME_EH_MT(cpprt532) + ,RT_LIB_NAME(f64ieee532) + ,RT_LIB_NAME(dsp532) + ,RT_LIB_NAME(sftflt532) + ,RT_LIB_NAME(etsi532) + ,RT_LIB_NAME(ssl537) + ,RT_LIB_NAME(drv537) + ,RT_LIB_NAME(usb537) + ,RT_OBJ_NAME_MT(idle532) + ,RT_LIB_NAME_MT(rt_fileio532) + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJECTS = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + RT_LIB_NAME(profile532) + , $COMMAND_LINE_OBJECTS + , "cplbtab537.doj" + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + , RT_OBJ_NAME(crtn532) + ; + +$OBJS_LIBS_INTERNAL = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $OBJECTS{prefersMem("internal")}, $LIBRARIES{prefersMem("internal")} + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJS_LIBS_NOT_EXTERNAL = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $OBJECTS{!prefersMem("external")}, $LIBRARIES{!prefersMem("external")} + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + +/*$VDSG */ +/* This code is preserved if the LDF is re-generated. */ + + +#define ASYNC0_MEMTYPE RAM +#define ASYNC1_MEMTYPE RAM +#define ASYNC2_MEMTYPE RAM +#define ASYNC3_MEMTYPE RAM + + +/*$VDSG */ + + +MEMORY +{ +/* +** ADSP-BF537 MEMORY MAP. +** +** The known memory spaces are as follows: +** +** 0xFFE00000 - 0xFFFFFFFF Core MMR registers (2MB) +** 0xFFC00000 - 0xFFDFFFFF System MMR registers (2MB) +** 0xFFB01000 - 0xFFBFFFFF Reserved +** 0xFFB00000 - 0xFFB00FFF Scratch SRAM (4K) +** 0xFFA14000 - 0xFFAFFFFF Reserved +** 0xFFA10000 - 0XFFA13FFF Code SRAM/CACHE (16K) +** 0xFFA0C000 - 0xFFA0FFFF Reserved +** 0xFFA08000 - 0xFFA0BFFF Instruction Bank B SRAM (16K) +** 0xFFA00000 - 0xFFA07FFF Instruction Bank A SRAM (32K) +** 0xFF908000 - 0xFF9FFFFF Reserved +** 0xFF904000 - 0xFF907FFF Data Bank B SRAM/CACHE (16K) +** 0xFF900000 - 0XFF903FFF Data Bank B SRAM (16K) +** 0xFF808000 - 0xFF8FFFFF Reserved +** 0xFF804000 - 0xFF807FFF Data Bank A SRAM/CACHE (16K) +** 0xFF800000 - 0XFF803FFF Data Bank A SRAM (16K) +** 0xEF000800 - 0xFF800000 Reserved +** 0xEF000000 - 0xFF8007FF Boot ROM (2K) +** 0x20400000 - 0xEEFFFFFF Reserved +** 0x20300000 - 0x203FFFFF ASYNC MEMORY BANK 3 (1MB) +** 0x20200000 - 0x202FFFFF ASYNC MEMORY BANK 2 (1MB) +** 0x20100000 - 0x201FFFFF ASYNC MEMORY BANK 1 (1MB) +** 0x20000000 - 0x200FFFFF ASYNC MEMORY BANK 0 (1MB) +** 0x00000000 - 0x1FFFFFFF SDRAM MEMORY (16MB - 512MB) +** +** Notes: +** 0xFF807FEF-0xFF807FFF +** Required by boot-loader. Used as heap or cache below which is ok. Cannot +** contain initialized data or code. +*/ + + MEM_SYS_MMRS { TYPE(RAM) START(0xFFC00000) END(0xFFDFFFFF) WIDTH(8) } + MEM_L1_SCRATCH { TYPE(RAM) START(0xFFB00000) END(0xFFB00FFF) WIDTH(8) } + MEM_L1_CODE_CACHE { TYPE(RAM) START(0xFFA10000) END(0xFFA13FFF) WIDTH(8) } + MEM_L1_CODE { TYPE(RAM) START(0xFFA00000) END(0xFFA0BFFF) WIDTH(8) } + MEM_L1_DATA_B { TYPE(RAM) START(0xFF900000) END(0xFF907FFF) WIDTH(8) } + MEM_L1_DATA_A { TYPE(RAM) START(0xFF800000) END(0xFF807FFF) WIDTH(8) } + MEM_ASYNC3 { TYPE(ASYNC3_MEMTYPE) START(0x20300000) END(0x203FFFFF) WIDTH(8) } + MEM_ASYNC2 { TYPE(ASYNC2_MEMTYPE) START(0x20200000) END(0x202FFFFF) WIDTH(8) } + MEM_ASYNC1 { TYPE(ASYNC1_MEMTYPE) START(0x20100000) END(0x201FFFFF) WIDTH(8) } + MEM_ASYNC0 { TYPE(ASYNC0_MEMTYPE) START(0x20000000) END(0x200FFFFF) WIDTH(8) } + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + +} /* MEMORY */ + +PROCESSOR p0 +{ + OUTPUT($COMMAND_LINE_OUTPUT_FILE) + RESOLVE(start, 0xFFA00000) + KEEP(start, _main) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + SECTIONS + { + /* Workaround for hardware errata 05-00-0189 and 05-00-0310 - + ** "Speculative (and fetches made at boundary of reserved memory + ** space) for instruction or data fetches may cause false + ** protection exceptions" and "False hardware errors caused by + ** fetches at the boundary of reserved memory ". + ** + ** Done by avoiding use of 76 bytes from at the end of blocks + ** that are adjacent to reserved memory. Workaround is enabled + ** for appropriate silicon revisions (-si-revision switch). + */ + RESERVE(___wab0=MEMORY_END(MEM_L1_SCRATCH) - 75, ___l0 = 76) + RESERVE(___wab1=MEMORY_END(MEM_L1_CODE) - 75, ___l1 = 76) + RESERVE(___wab2=MEMORY_END(MEM_L1_CODE_CACHE) - 75, ___l2 = 76) + RESERVE(___wab4=MEMORY_END(MEM_L1_DATA_B) - 75, ___l4 = 76) + RESERVE(___wab6=MEMORY_END(MEM_L1_DATA_A) - 75, ___l6 = 76) + RESERVE(___wab7=MEMORY_END(MEM_ASYNC3) - 75, ___l7 = 76) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + scratchpad NO_INIT + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_SCRATCH + + L1_code + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS($OBJECTS(L1_code) $LIBRARIES(L1_code)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(cplb_code) $LIBRARIES(cplb_code)) + INPUT_SECTIONS($OBJECTS(cplb) $LIBRARIES(cplb)) + INPUT_SECTIONS($OBJECTS(noncache_code) $LIBRARIES(noncache_code)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(program)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(program)) + INPUT_SECTIONS($OBJECTS(program) $LIBRARIES(program)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_CODE + + L1_code_cache + { + INPUT_SECTION_ALIGN(4) + ___l1_code_cache = 0; + INPUT_SECTIONS($OBJECTS(L1_code) $LIBRARIES(L1_code)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(cplb_code) $LIBRARIES(cplb_code)) + INPUT_SECTIONS($OBJECTS(cplb) $LIBRARIES(cplb)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(program)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(program)) + INPUT_SECTIONS($OBJECTS(program) $LIBRARIES(program)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_CODE_CACHE + + L1_data_a_1 + { + INPUT_SECTION_ALIGN(4) + ___l1_data_cache_a = 0; + INPUT_SECTIONS($OBJECTS(L1_data_a) $LIBRARIES(L1_data_a)) + INPUT_SECTIONS($OBJECTS(L1_data) $LIBRARIES(L1_data)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + RESERVE(heaps_and_stack_in_L1_data_a, heaps_and_stack_in_L1_data_a_length = 2K,4) + } > MEM_L1_DATA_A + + L1_data_a_bsz ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS( $OBJECTS(L1_bsz) $LIBRARIES(L1_bsz)) + } > MEM_L1_DATA_A + + L1_data_a_tables + { + INPUT_SECTION_ALIGN(4) + FORCE_CONTIGUITY + INPUT_SECTIONS($OBJECTS(vtbl) $LIBRARIES(vtbl)) + INPUT_SECTIONS($OBJECTS(ctor) $LIBRARIES(ctor)) + INPUT_SECTIONS($OBJECTS(ctorl) $LIBRARIES(ctorl)) + INPUT_SECTIONS($OBJECTS(.frt) $LIBRARIES(.frt)) + INPUT_SECTIONS($OBJECTS(.rtti) $LIBRARIES(.rtti)) + INPUT_SECTIONS($OBJECTS(.gdt) $LIBRARIES(.gdt)) + INPUT_SECTIONS($OBJECTS(.gdtl) $LIBRARIES(.gdtl)) + INPUT_SECTIONS($OBJECTS(.edt) $LIBRARIES(.edt)) + INPUT_SECTIONS($OBJECTS(.cht) $LIBRARIES(.cht)) + } > MEM_L1_DATA_A + + L1_data_a + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS($OBJECTS(cplb_data) $LIBRARIES(cplb_data)) + INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(data1)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(data1)) + INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1)) + INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_A + + bsz_L1_data_a ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(bsz)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(bsz)) + INPUT_SECTIONS($OBJECTS(bsz) $LIBRARIES(bsz)) + } > MEM_L1_DATA_A + + L1_data_a_stack_heap + { + INPUT_SECTION_ALIGN(4) + RESERVE_EXPAND(heaps_and_stack_in_L1_data_a, heaps_and_stack_in_L1_data_a_length , 0, 4) + ldf_stack_space = heaps_and_stack_in_L1_data_a; + ldf_stack_end = (ldf_stack_space + (heaps_and_stack_in_L1_data_a_length - 4)) &0xfffffffc; + } > MEM_L1_DATA_A + + L1_data_b_bsz ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS( $OBJECTS(L1_bsz) $LIBRARIES(L1_bsz)) + } > MEM_L1_DATA_B + + L1_data_b + { + INPUT_SECTION_ALIGN(4) + ___l1_data_cache_b = 0; + INPUT_SECTIONS($OBJECTS(L1_data_b) $LIBRARIES(L1_data_b)) + INPUT_SECTIONS($OBJECTS(L1_data) $LIBRARIES(L1_data)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + RESERVE(heaps_and_stack_in_L1_data_b, heaps_and_stack_in_L1_data_b_length = 2K,4) + INPUT_SECTIONS($OBJECTS(cplb_data) $LIBRARIES(cplb_data)) + INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(data1)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(data1)) + INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1)) + INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata)) + INPUT_SECTIONS($OBJECTS(.edt) $LIBRARIES(.edt) ) + INPUT_SECTIONS($OBJECTS(.cht) $LIBRARIES(.cht) ) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_B + + bsz_L1_data_b ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(bsz)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(bsz)) + INPUT_SECTIONS($OBJECTS(bsz) $LIBRARIES(bsz)) + } > MEM_L1_DATA_B + + L1_data_b_stack_heap + { + INPUT_SECTION_ALIGN(4) + RESERVE_EXPAND(heaps_and_stack_in_L1_data_b, heaps_and_stack_in_L1_data_b_length , 0, 4) + ldf_heap_space = heaps_and_stack_in_L1_data_b; + ldf_heap_end = (ldf_heap_space + (heaps_and_stack_in_L1_data_b_length - 4)) &0xfffffffc; + ldf_heap_length = ldf_heap_end - ldf_heap_space; + } > MEM_L1_DATA_B + + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } /* SECTIONS */ +} /* p0 */ + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/sample1_ezkit_bf537.dpg b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/sample1_ezkit_bf537.dpg new file mode 100644 index 0000000..a397f0f --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/sample1_ezkit_bf537.dpg @@ -0,0 +1,12 @@ + + + + + + + + + libkernel + + + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/sample1_ezkit_bf537_heaptab.c b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/sample1_ezkit_bf537_heaptab.c new file mode 100644 index 0000000..b6d7ec8 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf537/sample1_ezkit_bf537_heaptab.c @@ -0,0 +1,71 @@ +/* MANAGED-BY-SYSTEM-BUILDER */ + +/* +** User heap source file generated on Feb 01, 2009 at 17:32:12. +** +** Copyright (C) 2000-2007 Analog Devices Inc., All Rights Reserved. +** +** This file is generated automatically based upon the options selected +** in the LDF Wizard. Changes to the LDF configuration should be made by +** changing the appropriate options rather than editing this file. +** +** Configuration:- +** crt_doj: .\Debug\sample1_ezkit_bf537_basiccrt.doj +** processor: ADSP-BF537 +** si_revision: 0.0 +** mem_init: false +** use_vdk: false +** use_eh: true +** use_argv: false +** running_from_internal_memory: true +** user_heap_src_file: D:\jsp\tools\blackfin-vdsp\sample1_ezkit_bf537\sample1_ezkit_bf537_heaptab.c +** libraries_use_stdlib: true +** libraries_use_fileio_libs: false +** libraries_use_ieeefp_emulation_libs: false +** libraries_use_eh_enabled_libs: false +** system_heap: L1 +** system_heap_min_size: 2K +** system_stack: L1 +** system_stack_min_size: 2K +** use_sdram: false +** +*/ + +#ifdef _MISRA_RULES +#pragma diag(push) +#pragma diag(suppress:misra_rule_2_2) +#pragma diag(suppress:misra_rule_8_10) +#pragma diag(suppress:misra_rule_10_1_a) +#pragma diag(suppress:misra_rule_11_3) +#pragma diag(suppress:misra_rule_12_7) +#endif /* _MISRA_RULES */ + + +extern "asm" int ldf_heap_space; +extern "asm" int ldf_heap_length; + + +struct heap_table_t +{ + void *base; + unsigned long length; + long int userid; +}; + +#pragma file_attr("libData=HeapTable") +#pragma section("constdata") +struct heap_table_t heap_table[2] = +{ + + + { &ldf_heap_space, (int) &ldf_heap_length, 0 }, + + + { 0, 0, 0 } +}; + + +#ifdef _MISRA_RULES +#pragma diag(pop) +#endif /* _MISRA_RULES */ + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/config.bat b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/config.bat new file mode 100644 index 0000000..252bdbb --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/config.bat @@ -0,0 +1,17 @@ +rem APPNAME ƒAƒvƒŠƒP[ƒVƒ‡ƒ“–¼ +rem CFGPATH cfg.exe‚ª’u‚¢‚Ä‚ ‚éƒfƒBƒŒƒNƒgƒŠ +rem VDSPPATH VisualDSP++‚̃Cƒ“ƒXƒg[ƒ‹ƒfƒBƒŒƒNƒgƒŠ +rem JSPPATH TOPPERS/JSP‚̃fƒBƒŒƒNƒgƒŠ +rem CPATH Blackfin CPUˆË‘¶•”‚̃fƒBƒŒƒNƒgƒŠ +rem SPATH ƒVƒXƒeƒ€ˆË‘¶•”‚̃fƒBƒŒƒNƒgƒŠ + +set APPNAME=sample1 +set CFGPATH=X:\Work\jsp\cfg +set VDSPPATH=C:\Program Files\Analog Devices\VisualDSP 5.0 +set JSPPATH=X:\Work\jsp +set CPATH=%JSPPATH%\config\blackfin +set SPATH=%CPATH%\ezkit_bf548;%CPATH%\_common_bf548 + +"%VDSPPATH%\pp.exe" %APPNAME%.cfg -D__ECC__ -D__ADSPLPBLACKFIN__ -I"%CPATH%;%SPATH%;%JSPPATH%\systask;%JSPPATH%\include;" > %APPNAME%_pp.cfg +"%CFGPATH%\cfg.exe" %APPNAME%_pp.cfg +del %APPNAME%_pp.cfg diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/kernel_cfg.c b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/kernel_cfg.c new file mode 100644 index 0000000..6c845c9 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/kernel_cfg.c @@ -0,0 +1,183 @@ +/* Configured with [sample1_pp.cfg ] */ + +#include "kernel_cfg.h" +#include "kernel_id.h" + +#if TKERNEL_PRVER >= 0x1040 +#define CFG_INTHDR_ENTRY(inthdr) INTHDR_ENTRY(inthdr) +#define CFG_EXCHDR_ENTRY(exchdr) EXCHDR_ENTRY(exchdr) +#define CFG_INT_ENTRY(inthdr) INT_ENTRY(inthdr) +#define CFG_EXC_ENTRY(exchdr) EXC_ENTRY(exchdr) +#else +#error "This configuration file has no compatibility with TOPPERS/JSP rel 1.3 or earlier." +#endif + +#ifndef __EMPTY_LABEL +#define __EMPTY_LABEL(x,y) x y[0] +#endif + +#if TKERNEL_PRID != 0x0001u /* TOPPERS/JSP */ +#error "You can not use this configuration file without TOPPERS/JSP" +#endif + + /* User specified include files*/ +#include "sample1.h" +#include "hw_timer.h" +#include "timer.h" +#include "hw_serial.h" +#include "serial.h" +#include "logtask.h" + + + /* Object initializer [task] */ + +#define TNUM_TSKID 5 + +const ID _kernel_tmax_tskid = (TMIN_TSKID + TNUM_TSKID - 1); + +static __STK_UNIT __stack_TASK1[__TCOUNT_STK_UNIT(1024)]; +static __STK_UNIT __stack_TASK2[__TCOUNT_STK_UNIT(1024)]; +static __STK_UNIT __stack_TASK3[__TCOUNT_STK_UNIT(1024)]; +static __STK_UNIT __stack_MAIN_TASK[__TCOUNT_STK_UNIT(1024)]; +static __STK_UNIT __stack_LOGTASK[__TCOUNT_STK_UNIT(LOGTASK_STACK_SIZE)]; + +const TINIB _kernel_tinib_table[TNUM_TSKID] = { + {0, (VP_INT)(( VP_INT ) 1), (FP)(task), INT_PRIORITY(10), __TROUND_STK_UNIT(1024), __stack_TASK1, 0, (FP)(tex_routine)}, + {0, (VP_INT)(( VP_INT ) 2), (FP)(task), INT_PRIORITY(10), __TROUND_STK_UNIT(1024), __stack_TASK2, 0, (FP)(tex_routine)}, + {0, (VP_INT)(( VP_INT ) 3), (FP)(task), INT_PRIORITY(10), __TROUND_STK_UNIT(1024), __stack_TASK3, 0, (FP)(tex_routine)}, + {0x00u | 0x02u, (VP_INT)(0), (FP)(main_task), INT_PRIORITY(5), __TROUND_STK_UNIT(1024), __stack_MAIN_TASK, TA_NULL, (FP)(NULL)}, + {0x00u | 0x02u, (VP_INT)(( VP_INT ) 2), (FP)(logtask), INT_PRIORITY(LOGTASK_PRIORITY), __TROUND_STK_UNIT(LOGTASK_STACK_SIZE), __stack_LOGTASK, TA_NULL, (FP)(NULL)} +}; + +const ID _kernel_torder_table[TNUM_TSKID] = {1,2,3,4,5}; + +TCB _kernel_tcb_table[TNUM_TSKID]; + + + /* Object initializer [semaphore] */ + +#define TNUM_SEMID 4 + +const ID _kernel_tmax_semid = (TMIN_SEMID + TNUM_SEMID - 1); + +const SEMINIB _kernel_seminib_table[TNUM_SEMID] = { + {1, 0, 1}, + {1, 1, 1}, + {1, 0, 1}, + {1, 1, 1} +}; + +SEMCB _kernel_semcb_table[TNUM_SEMID]; + + + /* Object initializer [eventflag] */ + +#define TNUM_FLGID 0 + +const ID _kernel_tmax_flgid = (TMIN_FLGID + TNUM_FLGID - 1); + +__EMPTY_LABEL(const FLGINIB, _kernel_flginib_table); +__EMPTY_LABEL(FLGCB, _kernel_flgcb_table); + + + /* Object initializer [dataqueue] */ + +#define TNUM_DTQID 0 + +const ID _kernel_tmax_dtqid = (TMIN_DTQID + TNUM_DTQID - 1); + +__EMPTY_LABEL(const DTQINIB, _kernel_dtqinib_table); +__EMPTY_LABEL(DTQCB, _kernel_dtqcb_table); + + + /* Object initializer [mailbox] */ + +#define TNUM_MBXID 0 + +const ID _kernel_tmax_mbxid = (TMIN_MBXID + TNUM_MBXID - 1); + +__EMPTY_LABEL(const MBXINIB, _kernel_mbxinib_table); +__EMPTY_LABEL(MBXCB, _kernel_mbxcb_table); + + + /* Object initializer [mempfix] */ + +#define TNUM_MPFID 0 + +const ID _kernel_tmax_mpfid = (TMIN_MPFID + TNUM_MPFID - 1); + +__EMPTY_LABEL(const MPFINIB, _kernel_mpfinib_table); +__EMPTY_LABEL(MPFCB, _kernel_mpfcb_table); + + + /* Object initializer [cyclic] */ + +#define TNUM_CYCID 1 + +const ID _kernel_tmax_cycid = (TMIN_CYCID + TNUM_CYCID - 1); + +const CYCINIB _kernel_cycinib_table[TNUM_CYCID] = { + {0,0,(FP)(cyclic_handler),2000,0} +}; + +CYCCB _kernel_cyccb_table[TNUM_CYCID]; + + + /* Object initializer [interrupt] */ + +#define TNUM_INHNO 3 + +const UINT _kernel_tnum_inhno = TNUM_INHNO; + +CFG_INTHDR_ENTRY(sio1_rx_handler); +CFG_INTHDR_ENTRY(sio1_tx_handler); +CFG_INTHDR_ENTRY(timer_handler); + +const INHINIB _kernel_inhinib_table[TNUM_INHNO] = { + {41,0,(FP)CFG_INT_ENTRY(sio1_rx_handler)}, + {42,0,(FP)CFG_INT_ENTRY(sio1_tx_handler)}, + {93,0,(FP)CFG_INT_ENTRY(timer_handler)} +}; + + + /* Object initializer [exception] */ + +#define TNUM_EXCNO 1 + +const UINT _kernel_tnum_excno = TNUM_EXCNO; + +CFG_EXCHDR_ENTRY(cpuexc_handler); + +const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = { + {0,0,(FP)CFG_EXC_ENTRY(cpuexc_handler)} +}; + + /* Initialization handler */ + +void +_kernel_call_inirtn(void) +{ + timer_initialize( (VP_INT)(0) ); + serial_initialize( (VP_INT)(0) ); +} + +void +_kernel_call_terrtn(void) +{ + timer_terminate( (VP_INT)(0) ); +} + + /* Object initialization routine */ + +void +_kernel_object_initialize(void) +{ + _kernel_task_initialize(); + _kernel_semaphore_initialize(); + _kernel_cyclic_initialize(); + _kernel_interrupt_initialize(); + _kernel_exception_initialize(); +} + +TMEVTN _kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID]; + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/kernel_id.h b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/kernel_id.h new file mode 100644 index 0000000..e9a3720 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/kernel_id.h @@ -0,0 +1,18 @@ +#ifndef KERNEL_ID_H +#define KERNEL_ID_H + + /* object identifier deifnition */ + +#define CYCHDR1 1 +#define LOGTASK 5 +#define MAIN_TASK 4 +#define SERIAL_RCV_SEM1 1 +#define SERIAL_RCV_SEM2 3 +#define SERIAL_SND_SEM1 2 +#define SERIAL_SND_SEM2 4 +#define TASK1 1 +#define TASK2 2 +#define TASK3 3 + +#endif /* KERNEL_ID_H */ + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/readme.txt b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/readme.txt new file mode 100644 index 0000000..a5f25dd --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/readme.txt @@ -0,0 +1,29 @@ +TOPPERS/JSPのsample1アプリケーションをEZ-KIT Lite BF548 +移植した。 + +ビルドに先立って、jsp/config/blackfin/ezkit_bf548/libkernel.dpjを +ビルドして、libekernel.dlbを作っておくこと。 + +また、jsp/utils/blackfin-vdsp/offset.hは、必要に応じて +作り直すこと。 + +VisualDSP++のICEを使ってロードする場合には、実行直前に次の +二つのレジスタの値に注意すること。 + +PLL_CTL : 0x1000 +EBIU_RSTCTL.DDRSRESET : 0 + +TOPPERS/JSP for Blackfinはこの二つをチェックして、もし違う +値であると外部でPLLとSDRAMを変更したと認識してPLLの初期化を +中止する。これは外部SDRAMなどクロックに依存するデバイスの +動作を保護するためである。 + +sample1.ldfは、VisualDSP++に作らせたあと、自動更新を +停止し、crtを削除したものである。 + +異なるシステム依存部用に改造する場合は、プロジェクトの +Cコンパイラ、およびアセンブラのインクルード・パスを必ず +変更すること。 + +2012/07/20追加 +Visual DSP++ 5.0 Update 10でビルド&動作確認 diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/sample1.c b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/sample1.c new file mode 100644 index 0000000..27462b9 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/sample1.c @@ -0,0 +1,417 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2004-2006 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: sample1.c,v 1.1 2011/11/24 05:23:26 maduki Exp $ + */ + +/* + * サンプルプログラム(1)の本体 + * + * JSPカーネルの基本的な動作を確認するためのサンプルプログラム. + * + * プログラムの概要: + * + * ユーザインタフェースを受け持つメインタスク(タスクID: MAIN_TASK, + * 優先度: MAIN_PRIORITY)と,三つの並列実行されるタスク(タスクID: + * TASK1縲弋ASK3,初期優先度: MID_PRIORITY)で構成される.また,起動周 + * 期が2秒の周期ハンドラ(周期ハンドラID: CYCHDR1)を用いる. + * + * 並列実行されるタスクは,task_loop 回空ループを実行する度に,タスク + * が実行中であることをあらわすメッセージを表示する. + * + * 周期ハンドラは,三つの優先度(HIGH_PRIORITY,MID_PRIORITY, + * LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は, + * 周期ハンドラは停止状態になっている. + * + * メインタスクは,シリアルI/Oポートからの文字入力を行い(文字入力を + * 待っている間は,並列実行されるタスクが実行されている),入力された + * 文字に対応した処理を実行する.入力された文字と処理の関係は次の通り. + * Control-C または 'Q' が入力されると,プログラムを終了する. + * + * '1' : 以降のコマンドは TASK1 に対して行う. + * '2' : 以降のコマンドは TASK2 に対して行う. + * '3' : 以降のコマンドは TASK3 に対して行う. + * 'a' : タスクを act_tsk により起動する. + * 'A' : タスクに対する起動要求を can_act によりキャンセルする. + * 'e' : タスクに ext_tsk を呼び出させ,終了させる. + * 't' : タスクを ter_tsk により強制終了する. + * '>' : タスクの優先度を HIGH_PRIORITY にする. + * '=' : タスクの優先度を MID_PRIORITY にする. + * '<' : タスクの優先度を LOW_PRIORITY にする. + * 'G' : タスクの優先度を get_pri で読み出す. + * 's' : タスクに slp_tsk を呼び出させ,起床待ちにさせる. + * 'S' : タスクに tslp_tsk(10秒) を呼び出させ,起床待ちにさせる. + * 'w' : タスクを wup_tsk により起床する. + * 'W' : タスクに対する起床要求を can_wup によりキャンセルする. + * 'l' : タスクを rel_wai により強制的に待ち解除にする. + * 'u' : タスクを sus_tsk により強制待ち状態にする. + * 'm' : タスクの強制待ち状態を rsm_tsk により解除する. + * 'M' : タスクの強制待ち状態を frsm_tsk により強制解除する. + * 'd' : タスクに dly_tsk(10秒) を呼び出させ,時間経過待ちにさせる. + * 'x' : タスクにパターン 0x0001 の例外処理を要求する. + * 'X' : タスクにパターン 0x0002 の例外処理を要求する. + * 'y' : タスクに dis_tex を呼び出させ,タスク例外を禁止する. + * 'Y' : タスクに ena_tex を呼び出させ,タスク例外を許可する. + * 'r' : 三つの優先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)の + * レディキューを回転させる. + * 'c' : 周期ハンドラを動作させる. + * 'C' : 周期ハンドラを停止させる. + * 'z' : CPU例外を発生させる. + * 'Z' : CPUロック状態でCPU例外を発生させる(プログラムを終了する). + * 'V' : vxget_tim で性能評価用システム時刻を2回読む. + * 'v' : 発行したシステムコールを表示する(デフォルト). + * 'q' : 発行したシステムコールを表示しない. + */ + +#include +#include "kernel_id.h" +#include "sample1.h" + +/* + * 並行実行されるタスクへのメッセージ領域 + */ +char message[3]; + +/* + * ループ回数 + */ +UW task_loop; /* タスク内でのループ回数 */ +UW tex_loop; /* 例外処理ルーチン内でのループ回数 */ + +/* + * 並行実行されるタスク + */ +void task(VP_INT exinf) +{ + volatile UW i; + INT n = 0; + INT tskno = (INT) exinf; + const char *graph[] = { "|", " +", " *" }; + char c; + + ena_tex(); + while (1) { + syslog(LOG_NOTICE, "task%d is running (%03d). %s", + tskno, ++n, graph[tskno-1]); + for (i = 0; i < task_loop; i++); + c = message[tskno-1]; + message[tskno-1] = 0; + switch (c) { + case 'e': + syslog(LOG_INFO, "#%d#ext_tsk()", tskno); + ext_tsk(); + case 's': + syslog(LOG_INFO, "#%d#slp_tsk()", tskno); + syscall(slp_tsk()); + break; + case 'S': + syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno); + syscall(tslp_tsk(10000)); + break; + case 'd': + syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno); + syscall(dly_tsk(10000)); + break; + case 'y': + syslog(LOG_INFO, "#%d#dis_tex()", tskno); + syscall(dis_tex()); + break; + case 'Y': + syslog(LOG_INFO, "#%d#ena_tex()", tskno); + syscall(ena_tex()); + break; +#ifdef CPUEXC1 + case 'z': + syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); + RAISE_CPU_EXCEPTION; + break; + case 'Z': + loc_cpu(); + syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); + RAISE_CPU_EXCEPTION; + unl_cpu(); + break; +#endif /* CPUEXC1 */ + default: + break; + } + } +} + +/* + * 並行して実行されるタスク用のタスク例外処理ルーチン + */ +void tex_routine(TEXPTN texptn, VP_INT exinf) +{ + volatile UW i; + INT tskno = (INT) exinf; + + syslog(LOG_NOTICE, "task%d receives exception 0x%04x. ", + tskno, texptn); + for (i = 0; i < tex_loop; i++); + + if (texptn & 0x8000) { + syslog(LOG_INFO, "#%d#ext_tsk()", tskno); + ext_tsk(); + } +} + +/* + * CPU例外ハンドラ + */ +#ifdef CPUEXC1 + +void +cpuexc_handler(VP p_excinf) +{ + ID tskid; + + syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", + p_excinf); + if (sns_ctx() != TRUE) { + syslog(LOG_WARNING, + "sns_ctx() is not TRUE in CPU exception handler."); + } + if (sns_dpn() != TRUE) { + syslog(LOG_WARNING, + "sns_dpn() is not TRUE in CPU exception handler."); + } + syslog(LOG_DEBUG, + "sns_loc = %d sns_dsp = %d", sns_loc(), sns_dsp()); + syslog(LOG_DEBUG, + "vxsns_loc = %d vxsns_ctx = %d vxsns_dsp = %d vxsns_dpn = %d", + vxsns_loc(p_excinf), vxsns_ctx(p_excinf), + vxsns_dsp(p_excinf), vxsns_dpn(p_excinf)); + + if (!vxsns_loc(p_excinf) && !vxsns_ctx(p_excinf)) { + syscall(iget_tid(&tskid)); + syscall(iras_tex(tskid, 0x8000)); + } + else { + syslog(LOG_NOTICE, "Sample program ends with exception."); + kernel_exit(); + } +} + +#endif /* CPUEXC1 */ + +/* + * 周期ハンドラ + * + * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー + * を回転させる. + */ +void cyclic_handler(VP_INT exinf) +{ + irot_rdq(HIGH_PRIORITY); + irot_rdq(MID_PRIORITY); + irot_rdq(LOW_PRIORITY); +} + +/* + * メインタスク + */ +void main_task(VP_INT exinf) +{ + char c; + ID tskid = TASK1; + volatile UW i; + INT tskno = 1; + ER_UINT ercd; + PRI tskpri; + SYSTIM stime1, stime2; +#ifndef OMIT_VGET_TIM + SYSUTIM utime1, utime2; +#endif /* OMIT_VGET_TIM */ + + vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); + syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (INT) exinf); + + syscall(serial_ctl_por(TASK_PORTID, + (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); + + /* + * ループ回数の設定 + */ + task_loop = LOOP_REF; + get_tim(&stime1); + for (i = 0; i < task_loop; i++); + get_tim(&stime2); + task_loop = LOOP_REF * 400 / (stime2 - stime1); + tex_loop = task_loop / 5; + + /* + * タスクの起動 + */ + act_tsk(TASK1); + act_tsk(TASK2); + act_tsk(TASK3); + + /* + * メインループ + */ + do { + syscall(serial_rea_dat(TASK_PORTID, &c, 1)); + switch (c) { + case 'e': + case 's': + case 'S': + case 'd': + case 'y': + case 'Y': + case 'z': + case 'Z': + message[tskno-1] = c; + break; + case '1': + tskno = 1; + tskid = TASK1; + break; + case '2': + tskno = 2; + tskid = TASK2; + break; + case '3': + tskno = 3; + tskid = TASK3; + break; + case 'a': + syslog(LOG_INFO, "#act_tsk(%d)", tskno); + syscall(act_tsk(tskid)); + break; + case 'A': + syslog(LOG_INFO, "#can_act(%d)", tskno); + syscall(ercd = can_act(tskid)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "can_act(%d) returns %d", + tskno, ercd); + } + break; + case 't': + syslog(LOG_INFO, "#ter_tsk(%d)", tskno); + syscall(ter_tsk(tskid)); + break; + case '>': + syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno); + chg_pri(tskid, HIGH_PRIORITY); + break; + case '=': + syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno); + chg_pri(tskid, MID_PRIORITY); + break; + case '<': + syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno); + chg_pri(tskid, LOW_PRIORITY); + break; + case 'G': + syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno); + syscall(ercd = get_pri(tskid, &tskpri)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "priority of task %d is %d", + tskno, tskpri); + } + break; + case 'w': + syslog(LOG_INFO, "#wup_tsk(%d)", tskno); + syscall(wup_tsk(tskid)); + break; + case 'W': + syslog(LOG_INFO, "#can_wup(%d)", tskno); + syscall(ercd = can_wup(tskid)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "can_wup(%d) returns %d", + tskno, ercd); + } + break; + case 'l': + syslog(LOG_INFO, "#rel_wai(%d)", tskno); + syscall(rel_wai(tskid)); + break; + case 'u': + syslog(LOG_INFO, "#sus_tsk(%d)", tskno); + syscall(sus_tsk(tskid)); + break; + case 'm': + syslog(LOG_INFO, "#rsm_tsk(%d)", tskno); + syscall(rsm_tsk(tskid)); + break; + case 'M': + syslog(LOG_INFO, "#frsm_tsk(%d)", tskno); + syscall(frsm_tsk(tskid)); + break; + case 'x': + syslog(LOG_INFO, "#ras_tex(%d, 0x0001)", tskno); + syscall(ras_tex(tskid, 0x0001)); + break; + case 'X': + syslog(LOG_INFO, "#ras_tex(%d, 0x0002)", tskno); + syscall(ras_tex(tskid, 0x0002)); + break; + case 'r': + syslog(LOG_INFO, "#rot_rdq(three priorities)"); + rot_rdq(HIGH_PRIORITY); + rot_rdq(MID_PRIORITY); + rot_rdq(LOW_PRIORITY); + break; + case 'c': + sta_cyc(CYCHDR1); + break; + case 'C': + stp_cyc(CYCHDR1); + break; +#ifndef OMIT_VGET_TIM + case 'V': + syscall(vxget_tim(&utime1)); + syscall(vxget_tim(&utime2)); + syslog(LOG_NOTICE, "utime1 = %d, utime2 = %d", + (UINT) utime1, (UINT) utime2); + break; +#endif /* OMIT_VGET_TIM */ + case 'v': + vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); + break; + case 'q': + vmsk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG)); + break; + default: + break; + } + } while (c != '\003' && c != 'Q'); + + syslog(LOG_NOTICE, "Sample program ends."); + kernel_exit(); +} diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/sample1.cfg b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/sample1.cfg new file mode 100644 index 0000000..739f784 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/sample1.cfg @@ -0,0 +1,28 @@ +/* + * @(#) $Id: sample1.cfg,v 1.1 2011/11/24 05:23:26 maduki Exp $ + */ + +/* + * サンプルプログラム(1)のシステムコンフィギュレーションファイル + */ + +#define _MACRO_ONLY +#include "sample1.h" + +INCLUDE("\"sample1.h\""); +CRE_TSK(TASK1, { TA_HLNG, (VP_INT) 1, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(TASK2, { TA_HLNG, (VP_INT) 2, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(TASK3, { TA_HLNG, (VP_INT) 3, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(MAIN_TASK, { TA_HLNG|TA_ACT, 0, main_task, MAIN_PRIORITY, + STACK_SIZE, NULL }); +DEF_TEX(TASK1, { TA_HLNG, tex_routine }); +DEF_TEX(TASK2, { TA_HLNG, tex_routine }); +DEF_TEX(TASK3, { TA_HLNG, tex_routine }); +CRE_CYC(CYCHDR1, { TA_HLNG, 0, cyclic_handler, 2000, 0 }); +#ifdef CPUEXC1 +DEF_EXC(CPUEXC1, { TA_HLNG, cpuexc_handler} ); +#endif /* CPUEXC1 */ + +#include "../systask/timer.cfg" +#include "../systask/serial.cfg" +#include "../systask/logtask.cfg" diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/sample1.dpj b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/sample1.dpj new file mode 100644 index 0000000..b09b608 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/sample1.dpj @@ -0,0 +1,224 @@ + + + + + ADSP-BF548 + .dxe + Executable file + + + + + .\Debug + .\Debug + 0 + + + + + + + + + + + + + + + + + + + + + + + .\Release + .\Release + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/sample1.h b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/sample1.h new file mode 100644 index 0000000..082a8bd --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/sample1.h @@ -0,0 +1,215 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2005 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: sample1.h,v 1.1 2011/11/24 05:23:26 maduki Exp $ + */ + +/* + * サンプルプログラム(1)のヘッダファイル + */ + +#include + +/* + * 各タスクの優先度の定義 + */ + +#define MAIN_PRIORITY 5 /* メインタスクの優先度 */ + /* HIGH_PRIORITY より高くすること */ + +#define HIGH_PRIORITY 9 /* 並列に実行されるタスクの優先度 */ +#define MID_PRIORITY 10 +#define LOW_PRIORITY 11 + +/* + * ターゲット依存の定義(CPU例外ハンドラの起動方法など) + */ + +#ifdef M68K + +#define CPUEXC1 5 /* ゼロ除算例外 */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) + +#elif defined(SH3) + +#define CPUEXC1 224 /* ロードエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) + +#elif defined(SH1) + +#define CPUEXC1 9 /* CPUアドレスエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) +#ifdef TOKIWA_SH1 +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#endif /* TOKIWA_SH1 */ + +#elif defined(ARMV4) + +#define CPUEXC1 4 /* ロードエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) + +#elif defined(V850) + +#elif defined(H8) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ + +#elif defined(H8S) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define LOOP_REF 4000L /* 速度計測用のループ回数 */ + +#elif defined(MICROBLAZE) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define STACK_SIZE 2048 /* タスクのスタックサイズ */ + +#elif defined(IA32) + +#define CPUEXC1 0 /* ゼロ除算例外 */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) +#define OMIT_VGET_TIM + +#elif defined(TMS320C54X) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define STACK_SIZE 320 /* タスクのスタックサイズ */ +#define LOOP_REF 500000L /* 速度計測用のループ回数 */ + +#elif defined(XSTORMY16) + +#define CPUEXC1 0 /* 無効命令例外 */ +#define RAISE_CPU_EXCEPTION __asm__( ".hword 0x0006" ) +#define OMIT_VGET_TIM /* vxget_tim()は非サポート */ +#define LOOP_REF 4000L /* 速度計測用のループ回数 */ +#define STACK_SIZE 256 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* SIOはポート2を用いる */ + +#elif defined(MIPS3) || defined(MIPS64) + +#define CPUEXC1 Bp /* ブレークポイント例外(ゼロ除算時に発生) */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) + +#elif defined(M16C) && defined(OAKS16) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ + +#elif defined(M16C) && defined(OAKS16_MINI) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 384 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ + +#elif defined(M16C) && defined(M3029) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(BLACKFIN) + +#define CPUEXC1 0 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm("excpt 0;") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 1024 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ + +#elif defined(LINUX) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define OMIT_VGET_TIM +#define LOOP_REF 4000000 /* 速度計測用のループ回数 */ + +#elif defined(NIOS2) + +#define CPUEXC1 0 /* 未実装命令例外 */ +#define RAISE_CPU_EXCEPTION Asm("div zero, zero, zero"); + +#elif defined(M32C) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(M32R) + +#define CPUEXC1 EXC_TRAP00 +#define RAISE_CPU_EXCEPTION Asm("trap 0") + +#elif defined(TLCS_900) && defined(ZUP_F16_EX) + +#define CPUEXC1 3 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION Asm(" swi 2") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ +#define OMIT_VGET_TIM + +#endif + +/* + * ターゲットに依存する可能性のある定数の定義 + */ + +#ifndef TASK_PORTID +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ +#endif /* TASK_PORTID */ + +#ifndef STACK_SIZE +#define STACK_SIZE 8192 /* タスクのスタックサイズ */ +#endif /* STACK_SIZE */ + +#ifndef LOOP_REF +#define LOOP_REF 1000000 /* 速度計測用のループ回数 */ +#endif /* LOOP_REF */ + +/* + * 関数のプロトタイプ宣言 + */ +#ifndef _MACRO_ONLY + +extern void task(VP_INT tskno); +extern void main_task(VP_INT exinf); +extern void tex_routine(TEXPTN texptn, VP_INT tskno); +extern void cyclic_handler(VP_INT exinf); +extern void cpuexc_handler(VP p_excinf); + +#endif /* _MACRO_ONLY */ diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/sample1.ldf b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/sample1.ldf new file mode 100644 index 0000000..ecc8d99 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/sample1.ldf @@ -0,0 +1,482 @@ +/* MANAGED-BY-SYSTEM-BUILDER */ +/* VisualDSP++ 5.0 Update 8 */ +/* LDF Printer version: 5.8.0.3 */ +/* ldfgen.exe version: 5.8.0.3 */ +/* VDSG version: 5.8.0.3 */ + +/* +** ADSP-BF548 linker description file generated on Jun 09, 2010 at 22:41:24. +** +** Copyright (C) 2000-2010 Analog Devices Inc., All Rights Reserved. +** +** This file is generated automatically based upon the options selected +** in the LDF Wizard. Changes to the LDF configuration should be made by +** changing the appropriate options rather than editing this file. +** +** Configuration:- +** crt_doj: BF548_EZKIT_POST_basiccrt.doj +** processor: ADSP-BF548 +** product_name: VisualDSP++ 5.0 Update 8 +** si_revision: automatic +** default_silicon_revision_from_archdef: 0.0 +** using_cplusplus: true +** mem_init: false +** use_vdk: false +** use_eh: true +** use_argv: true +** running_from_internal_memory: true +** user_heap_src_file: C:\Build_tools\ant_build\cvsStage\_5.0ExportBlackfinReGen\Examples\Blackfin\Examples\ADSP-BF548 EZ-KIT Lite\Power_On_Self_Test\BF548_EZKIT_POST_heaptab.c +** libraries_use_stdlib: true +** libraries_use_fileio_libs: false +** libraries_use_ieeefp_emulation_libs: false +** libraries_use_eh_enabled_libs: false +** system_heap: L1 +** system_heap_min_size: 2k +** system_stack: L1 +** system_stack_min_size: 2k +** use_sdram: false +** +*/ + +ARCHITECTURE(ADSP-BF548) + +SEARCH_DIR($ADI_DSP/Blackfin/lib) + + +// Workarounds are enabled, exceptions are disabled. +#define RT_LIB_NAME(x) lib ## x ## y.dlb +#define RT_LIB_NAME_EH(x) lib ## x ## y.dlb +#define RT_LIB_NAME_MT(x) lib ## x ## y.dlb +#define RT_LIB_NAME_EH_MT(x) lib ## x ## y.dlb +#define RT_OBJ_NAME(x) x ## y.doj +#define RT_OBJ_NAME_MT(x) x ## mty.doj + + +$LIBRARIES = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + RT_LIB_NAME_MT(small532) + ,RT_LIB_NAME_MT(io532) + ,RT_LIB_NAME_MT(c532) + ,RT_LIB_NAME_MT(event532) + ,RT_LIB_NAME(ssl548) + ,RT_LIB_NAME(drv548) + ,RT_LIB_NAME_MT(x532) + ,RT_LIB_NAME_EH_MT(cpp532) + ,RT_LIB_NAME_EH_MT(cpprt532) + ,RT_LIB_NAME(f64ieee532) + ,RT_LIB_NAME(dsp532) + ,RT_LIB_NAME(sftflt532) + ,RT_LIB_NAME(etsi532) + ,RT_OBJ_NAME_MT(idle532) + ,RT_LIB_NAME_MT(rt_fileio532) + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJECTS = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + RT_LIB_NAME(profile532) + , $COMMAND_LINE_OBJECTS + , "cplbtab548.doj" + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + +/* , RT_OBJ_NAME(crtn548) */ + ; + +$OBJS_LIBS_INTERNAL = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $OBJECTS{prefersMem("internal")}, $LIBRARIES{prefersMem("internal")} + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJS_LIBS_NOT_EXTERNAL = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $OBJECTS{!prefersMem("external")}, $LIBRARIES{!prefersMem("external")} + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJS_LIBS_WITH_AUTO_BREAKPOINTS = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $OBJECTS { FuncName("_main") || + FuncName("___lib_prog_term") || + FuncName("__primIO") || + FuncName("__ov_start") || + FuncName("__ov_end") || + FuncName("__dbg_assert") || + FuncName("__unknown_exception_occurred") || + FuncName("_cplb_init") || + FuncName("__KernelPanic") }, + $LIBRARIES { FuncName("_main") || + FuncName("___lib_prog_term") || + FuncName("__primIO") || + FuncName("__ov_start") || + FuncName("__ov_end") || + FuncName("__dbg_assert") || + FuncName("__unknown_exception_occurred") || + FuncName("_cplb_init") || + FuncName("__KernelPanic") } + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + +$OBJS_LIBS_WITHOUT_AUTO_BREAKPOINTS = + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + $OBJECTS { !FuncName("_main") && + !FuncName("___lib_prog_term") && + !FuncName("__primIO") && + !FuncName("__ov_start") && + !FuncName("__ov_end") && + !FuncName("__dbg_assert") && + !FuncName("__unknown_exception_occurred") && + !FuncName("_cplb_init") && + !FuncName("__KernelPanic") }, + $LIBRARIES { !FuncName("_main") && + !FuncName("___lib_prog_term") && + !FuncName("__primIO") && + !FuncName("__ov_start") && + !FuncName("__ov_end") && + !FuncName("__dbg_assert") && + !FuncName("__unknown_exception_occurred") && + !FuncName("_cplb_init") && + !FuncName("__KernelPanic") } + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + ; + + +/*$VDSG */ +/* Text inserted between these $VDSG comments will be preserved */ +/*$VDSG */ + + +/*$VDSG */ +/* This code is preserved if the LDF is re-generated. */ + + +#define ASYNC0_MEMTYPE RAM +#define ASYNC1_MEMTYPE RAM +#define ASYNC2_MEMTYPE RAM +#define ASYNC3_MEMTYPE RAM + + +/*$VDSG */ + + +/* +** Memory map. +** +** 0xFFE00000 - 0xFFFFFFFF Core MMR registers (2MB) +** 0xFFC00000 - 0xFFDFFFFF System MMR registers (2MB) +** 0xFFB01000 - 0xFFBFFFFF Reserved +** 0xFFB00000 - 0xFFB00FFF Scratch SRAM (4K) +** 0xFFA24000 - 0xFFAFFFFF Reserved +** 0xFFA14000 - 0xFFA23FFF L1 ROM (64k) +** 0xFFA10000 - 0XFFA13FFF Code SRAM/CACHE (16K) +** 0xFFA0C000 - 0xFFA0FFFF Reserved +** 0xFFA08000 - 0xFFA0BFFF Instruction Bank B SRAM (16K) +** 0xFFA00000 - 0xFFA07FFF Instruction Bank A SRAM (32K) +** 0xFF908000 - 0xFF9FFFFF Reserved +** 0xFF904000 - 0xFF907FFF Data Bank B SRAM/CACHE (16k) +** 0xFF900000 - 0XFF903FFF Data Bank B SRAM (16k) +** 0xFF808000 - 0xFF8FFFFF Reserved +** 0xFF804000 - 0xFF807FFF Data Bank A SRAM/CACHE (16k) +** 0xFF800000 - 0XFF803FFF Data Bank A SRAM (16k) +** 0xFEB20000 - 0xFF7FFFFF Reserved +** 0xFEB00000 - 0xFEB1FFFF L2 SRAM (128K) +** 0xEF001000 - 0xFFAFFFFF Reserved +** 0xEF000000 - 0xFF8007FF Boot ROM (2K) +** 0x30000000 - 0xEEFFFFFF Reserved +** 0x2C000000 - 0x2FFFFFFF ASYNC MEMORY BANK 3 (64MB) +** 0x28000000 - 0x2BFFFFFF ASYNC MEMORY BANK 2 (64MB) +** 0x24000000 - 0x27FFFFFF ASYNC MEMORY BANK 1 (64MB) +** 0x20000000 - 0x23FFFFFF ASYNC MEMORY BANK 0 (64MB) +** - 0x1FFFFFFF DDR1 MEM Bank 1 MEMORY (8MB - 256MB) +** 0x00000000 DDR1 MEM Bank 0 MEMORY (8MB - 256MB) +** +** Notes: +** 0xFF807FEF-0xFF807FFF Required by boot-loader. +*/ + +MEMORY +{ + + MEM_L1_SCRATCH { START(0xFFB00000) END(0xFFB00FFF) TYPE(RAM) WIDTH(8) } + MEM_L1_CODE_CACHE { START(0xFFA10000) END(0xFFA13FFF) TYPE(RAM) WIDTH(8) } + MEM_L1_CODE { START(0xFFA00000) END(0xFFA0BFFF) TYPE(RAM) WIDTH(8) } + +/* MEM_L1_DATA_B_CACHE { START(0xFF904000) END(0xFF907FFF) TYPE(RAM) WIDTH(8) } */ + MEM_L1_DATA_B { START(0xFF900000) END(0xFF903FFF) TYPE(RAM) WIDTH(8) } + +/* MEM_L1_DATA_A_CACHE { START(0xFF804000) END(0xFF807FFF) TYPE(RAM) WIDTH(8) } */ + MEM_L1_DATA_A { START(0xFF800000) END(0xFF807FFF) TYPE(RAM) WIDTH(8) } + + MEM_L2_SRAM { START(0xFEB00000) END(0xFEB1FFFF) TYPE(RAM) WIDTH(8) } + + MEM_ASYNC3 { START(0x2C000000) END(0x2FFFFFFF) TYPE(RAM) WIDTH(8) } + MEM_ASYNC2 { START(0x28000000) END(0x2BFFFFFF) TYPE(RAM) WIDTH(8) } + MEM_ASYNC1 { START(0x24000000) END(0x27FFFFFF) TYPE(RAM) WIDTH(8) } + MEM_ASYNC0 { START(0x20000000) END(0x23FFFFFF) TYPE(RAM) WIDTH(8) } + /* + ** The EBIU allows for 4 sub-banks to be accessed simultaneously + ** The LDF partitions the available SDRAM into 4 16MB banks which makes + ** the best use of the EBIU and minimizes memory access stall cycles. + ** bank0-heap, bank1-data, bank2-data/bsz, bank3-program + ** See theparts Hardware Reference Manual, SDRAM controller section + ** for further information. + */ + MEM_SDRAM0_BANK0 { START(0x00000004) END(0x00FFFFFF) TYPE(RAM) WIDTH(8) } + MEM_SDRAM0_BANK1 { START(0x01000000) END(0x01FFFFFF) TYPE(RAM) WIDTH(8) } + MEM_SDRAM0_BANK2 { START(0x02000000) END(0x02FFFFFF) TYPE(RAM) WIDTH(8) } + MEM_SDRAM0_BANK3 { START(0x03000000) END(0x03FFFFFF) TYPE(RAM) WIDTH(8) } + +} /* MEMORY */ + +PROCESSOR p0 +{ + OUTPUT($COMMAND_LINE_OUTPUT_FILE) + RESOLVE(start, 0xFFA00000) + RESOLVE(___argv_string, 0xFF800000) + KEEP(start, _main) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + SECTIONS + { + /* Workaround for hardware errata 05-00-0189 and 05-00-0310 - + ** "Speculative (and fetches made at boundary of reserved memory + ** space) for instruction or data fetches may cause false + ** protection exceptions" and "False hardware errors caused by + ** fetches at the boundary of reserved memory ". + ** + ** Done by avoiding use of 76 bytes from at the end of blocks + ** that are adjacent to reserved memory. Workaround is enabled + ** for appropriate silicon revisions (-si-revision switch). + */ + RESERVE(___wab0=MEMORY_END(MEM_L1_SCRATCH) - 75, ___l0 = 76) + RESERVE(___wab1=MEMORY_END(MEM_L1_CODE_CACHE) - 75, ___l1 = 76) + RESERVE(___wab2=MEMORY_END(MEM_L1_CODE) - 75, ___l2 = 76) +/* RESERVE(___wab3=MEMORY_END(MEM_L1_DATA_B_CACHE) - 75, ___l3 = 76) */ + RESERVE(___wab4=MEMORY_END(MEM_L1_DATA_B) - 75, ___l4 = 76) +/* RESERVE(___wab5=MEMORY_END(MEM_L1_DATA_A_CACHE) - 75, ___l5 = 76) */ + RESERVE(___wab6=MEMORY_END(MEM_L1_DATA_A) - 75, ___l6 = 76) + RESERVE(___wab7=MEMORY_END(MEM_L2_SRAM) - 75, ___l7 = 76) + RESERVE(___wab8=MEMORY_END(MEM_ASYNC3) - 75, ___l8 = 76) + RESERVE(___wab9=MEMORY_END(MEM_SDRAM0_BANK3) - 75, ___l9 = 76) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + scratchpad NO_INIT + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(L1_scratchpad) $LIBRARIES(L1_scratchpad)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_SCRATCH + + L1_code + { + INPUT_SECTION_ALIGN(4) + ___l1_code_cache = 0; + INPUT_SECTIONS($OBJS_LIBS_WITH_AUTO_BREAKPOINTS(program)) + INPUT_SECTIONS($OBJECTS(L1_code) $LIBRARIES(L1_code)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(cplb_code) $LIBRARIES(cplb_code)) + INPUT_SECTIONS($OBJECTS(cplb) $LIBRARIES(cplb)) + INPUT_SECTIONS($OBJECTS(noncache_code) $LIBRARIES(noncache_code)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(program)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(program)) + INPUT_SECTIONS($OBJECTS(program) $LIBRARIES(program)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_CODE + + L1_data_a_tables + { + INPUT_SECTION_ALIGN(4) + FORCE_CONTIGUITY + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(ctor) $LIBRARIES(ctor)) + INPUT_SECTIONS($OBJECTS(ctorl) $LIBRARIES(ctorl)) + INPUT_SECTIONS($OBJECTS(.gdt) $LIBRARIES(.gdt)) + INPUT_SECTIONS($OBJECTS(.gdtl) $LIBRARIES(.gdtl)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_A + + L1_data_a_1 + { + INPUT_SECTION_ALIGN(4) + ___l1_data_cache_a = 0; + INPUT_SECTIONS($OBJECTS(L1_data_a) $LIBRARIES(L1_data_a)) + INPUT_SECTIONS($OBJECTS(L1_data) $LIBRARIES(L1_data)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + RESERVE(heaps_and_stack_in_L1_data_a, heaps_and_stack_in_L1_data_a_length = 4096,4) + } > MEM_L1_DATA_A + + L1_data_a_bsz ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS( $OBJECTS(L1_bsz) $LIBRARIES(L1_bsz)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_A + + bsz_L1_data_a ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(bsz)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(bsz)) + INPUT_SECTIONS($OBJECTS(bsz) $LIBRARIES(bsz)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_A + + L1_data_a + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata)) + INPUT_SECTIONS($OBJS_LIBS_INTERNAL(data1)) + INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL(data1)) + INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1)) + INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata)) + INPUT_SECTIONS($OBJECTS(cplb_data) $LIBRARIES(cplb_data)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_A + + L1_data_a_2 + { + INPUT_SECTION_ALIGN(4) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + INPUT_SECTIONS($OBJECTS(vtbl) $LIBRARIES(vtbl)) + INPUT_SECTIONS($OBJECTS(.frt) $LIBRARIES(.frt)) + INPUT_SECTIONS($OBJECTS(.rtti) $LIBRARIES(.rtti)) + INPUT_SECTIONS($OBJECTS(.edt) $LIBRARIES(.edt)) + INPUT_SECTIONS($OBJECTS(.cht) $LIBRARIES(.cht)) + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } > MEM_L1_DATA_A + + L1_data_a_stack_heap + { + INPUT_SECTION_ALIGN(4) + RESERVE_EXPAND(heaps_and_stack_in_L1_data_a, heaps_and_stack_in_L1_data_a_length , 0, 4) + ldf_stack_space = heaps_and_stack_in_L1_data_a; + ldf_stack_end = (ldf_stack_space + (((heaps_and_stack_in_L1_data_a_length * 2048) / 4096) - 4)) & 0xfffffffc; + ldf_heap_space = ldf_stack_end + 4; + ldf_heap_end = (ldf_heap_space + (((heaps_and_stack_in_L1_data_a_length * 2048) / 4096) - 4)) & 0xfffffffc; + ldf_heap_length = ldf_heap_end - ldf_heap_space; + } > MEM_L1_DATA_A + + /*$VDSG */ + /* Text inserted between these $VDSG comments will be preserved */ + /*$VDSG */ + + } /* SECTIONS */ +} /* p0 */ + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/sample1_ezkit_bf548.dpg b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/sample1_ezkit_bf548.dpg new file mode 100644 index 0000000..ad22a8b --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/sample1_ezkit_bf548/sample1_ezkit_bf548.dpg @@ -0,0 +1,12 @@ + + + + + + + + + libkernel + + + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/ad1836a.cfg b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/ad1836a.cfg new file mode 100644 index 0000000..1de74d2 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/ad1836a.cfg @@ -0,0 +1,31 @@ +/* +* AD1836A ƒR[ƒfƒbƒNŠÇ—ƒ^ƒXƒN—pƒRƒ“ƒtƒBƒOƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹ +* ‚±‚±‚©‚ç +*/ +INCLUDE("\"ad1836a.h\""); +/* +* ƒpƒuƒŠƒbƒN‚ÈŽ‘Œ¹ +*/ + +CRE_DTQ( CODEC_TX_DTQ, { TA_TFIFO, 1, NULL }); /* ‘—Mƒf[ƒ^ƒLƒ…[ FIFO‡AƒLƒ…[’·1A—̈掩“®Š„•t */ +CRE_DTQ( CODEC_RX_DTQ, { TA_TFIFO, 1, NULL }); /* ŽóMƒf[ƒ^ƒLƒ…[ FIFO‡AƒLƒ…[’·1A—̈掩“®Š„•t */ + +/* +* ƒvƒ‰ƒCƒx[ƒg‚¾‚ªƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚ŏ‰Šú‰»‚ª•K—v‚ÈŽ‘Œ¹ +*/ +CRE_SEM( SPI_SEM, { TA_TPRI, 0, 1}); +CRE_SEM( SPORT0_SEM, { TA_TPRI, 0, 1}); + + +/* +* ƒvƒ‰ƒCƒx[ƒg‚ÈŽ‘Œ¹ +*/ + +CRE_TSK( CODEC_TASK, { TA_HLNG, 0, run_ad1836_task, 3, 512, NULL }); +DEF_INH( INHNO_SPI, {TA_HLNG, spi_handler} ); +DEF_INH( INHNO_SPORT0_RX, {TA_HLNG, sport0_handler} ); + +/* +* AD1836A ƒR[ƒfƒbƒNŠÇ—ƒ^ƒXƒN—pƒRƒ“ƒtƒBƒOƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹ +* I‚í‚è +*/ diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/ad1836a.h b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/ad1836a.h new file mode 100644 index 0000000..488e12c --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/ad1836a.h @@ -0,0 +1,51 @@ +#ifndef __AD1836A_H__ +#define __AD1836A_H__ + +// 1Š„‚荞‚Ý‚ ‚½‚è‚̃Tƒ“ƒvƒ‹” +// ƒ^ƒXƒN‚É‚Í‚±‚̃Tƒ“ƒvƒ‹”‚̃f[ƒ^‚ª“n‚³‚ê‚é +#define SAMPLE_PER_INTR 16 + +// CODECƒŒƒWƒXƒ^ƒAƒhƒŒƒXBVDSP++‚̃Tƒ“ƒvƒ‹‚©‚çƒRƒs[ +#define DAC_CONTROL_1 0x0000 +#define DAC_CONTROL_2 0x1000 +#define DAC_VOLUME_0 0x2000 +#define DAC_VOLUME_1 0x3000 +#define DAC_VOLUME_2 0x4000 +#define DAC_VOLUME_3 0x5000 +#define DAC_VOLUME_4 0x6000 +#define DAC_VOLUME_5 0x7000 +#define ADC_0_PEAK_LEVEL 0x8000 +#define ADC_1_PEAK_LEVEL 0x9000 +#define ADC_2_PEAK_LEVEL 0xA000 +#define ADC_3_PEAK_LEVEL 0xB000 +#define ADC_CONTROL_1 0xC000 +#define ADC_CONTROL_2 0xD000 +#define ADC_CONTROL_3 0xE000 + +// ƒ^ƒXƒNŠÔ‚Å‚â‚èŽæ‚肳‚ê‚éƒf[ƒ^Œ^ +struct CODEC_BUFFER{ + int data[SAMPLE_PER_INTR][8]; +} ; + + +// + +#ifdef __cplusplus + extern "C" { +#endif + +extern void run_ad1836_task( VP_INT exinf ); +void spi_handler(void); +void sport0_handler(void); + +#ifdef __cplusplus + }; +#endif + +extern const int codec_rx_dtq; +extern const int codec_tx_dtq; +extern const int spi_sem; +extern const int sport0_sem; + + +#endif diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/app_init.c b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/app_init.c new file mode 100644 index 0000000..ec8110c --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/app_init.c @@ -0,0 +1,32 @@ +#include "t_services.h" +#include "talkthrough.h" +#include "kernel_id.h" +#include + +#define pFLASHA_PORTA_OUT ((volatile unsigned char * )0x20270004) +#define pFLASHA_PORTA_DIR ((volatile unsigned char * )0x20270006) +#define pFLASHA_PORTB_OUT ((volatile unsigned char * )0x20270005) +#define pFLASHA_PORTB_DIR ((volatile unsigned char * )0x20270007) +#define pLED pFLASHA_PORTB_OUT + +//------------------------------------------------ +// AD1836a —p‚ÌIDÝ’è +// +//------------------------------------------------ +//const int codec_rx_dtq = CODEC_RX_DTQ; +//const int codec_tx_dtq = CODEC_TX_DTQ; +const int spi_sem = SPI_SEM; +const int sport0_sem =SPORT0_SEM; +//------------------------------------------------ + + + +void app_init(VP_INT vp_int) +{ + *pEBIU_AMBCTL0 = 0x7bb07bb0; // ”ñ“¯Šúƒ|[ƒg0,1‚̏‰Šú‰» + *pEBIU_AMBCTL1 = 0x7bb07bb0; // ”ñ“¯Šúƒ|[ƒg2,3‚̏‰Šú‰» + *pEBIU_AMGCTL = 0x000f; // ‘S”ñ“¯Šúƒ|[ƒg‚ðƒCƒl[ƒuƒ‹ + + *pFLASHA_PORTB_DIR = 0x3f; // bit0-5‚ðo—Í‚É + *pFLASHA_PORTB_OUT = 0x00; // LED ƒIƒt +} diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/cfg.bat b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/cfg.bat new file mode 100644 index 0000000..e76f447 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/cfg.bat @@ -0,0 +1 @@ +d:\bin\cfg.exe talkthrough.cfg diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/ezkit_BF533.ldf b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/ezkit_BF533.ldf new file mode 100644 index 0000000..0725b68 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/ezkit_BF533.ldf @@ -0,0 +1,591 @@ +/* +** LDF for ADSP-BF533. +** +** There are a number of configuration options that can be specified +** either by compiler flags, or by linker flags directly. The options are: +** +** USE_PROFILER0 +** Enabled by -p. Link in profiling library, and write results to +** both stdout and mon.out. +** USE_PROFILER1 +** Enabled by -p1. Only write profiling data to mon.out. +** USE_PROFILER2 +** Enabled by -p2. Only write profiling data to stdout. +** USE_PROFILER +** Equivalent to USE_PROFILER0. +** __WORKAROUNDS_ENABLED +** Defined by compiler when -workaround is used to direct LDF to +** link with libraries that have been built with work-arounds +** enabled. +** USE_FILEIO +** Always defined; enables the File I/O Support, which is necessary +** for printf() to produce any output. +** USE_CACHE +** Makes use of Some L1 memory as cache. Implies the presence +** of at least some external memory. +** USE_SDRAM +** Makes SDRAM available as standard program/data memory, with no +** cache configuration of L1. Heap space is moved into SDRAM. +** PARTITION_EZKIT_SDRAM +** The ADSP-BF533 is supplied with one external bank populated with +** with 32MB of SDRAM. The ADSP-BF533 EBIU allows for 4 internal banks +** in an external SDRAM bank to be accessed simultaneously, reducing the +** stall on access compared to keeping program and data in one bank. +** Defining this macro partitions the SDRAM into 4 8MB banks with the +** intention of use being: bank0 - heap, bank1 - data, bank2 - data/bsz, +** bank3 - program. See 533 Hardware Reference Manual, 17-22, SDRAM +** controler. +** NOTE: Either USE_CACHE or USE_SDRAM must also be defined to use this. +** USER_CRT +** Specifies a custom or System Builder generated CRT object to use. +** _ADI_LIBIO +** Use the ADI io library (default and fast) +** _DINKUM_IO +** Use dinkum io library (slower but more compatible). Enabled +** by the flag -full-io +*/ + +#define USER_CRT + +ARCHITECTURE(ADSP-BF533) + +#ifndef __NO_STD_LIB +SEARCH_DIR( $ADI_DSP/Blackfin/lib ) +#endif + +/* Moving to primIO means that we must always include the FileIO support, +** so that printf() will work. +*/ + +#ifndef USE_FILEIO /* { */ +#define USE_FILEIO 1 +#endif /* } */ + +#ifdef USE_PROFILER /* { */ +#define USE_PROFILER0 +#endif /* } */ + +#ifdef USE_PROFILER0 /* { */ +#ifdef __WORKAROUNDS_ENABLED /* { */ +#define PROFFLAG , prfflg0_532y.doj +#else +#define PROFFLAG , prfflg0_532.doj +#endif /* } */ +// The profiler needs File I/O to write its results. +#define USE_FILEIO 1 +#ifndef USE_PROFILER /* { */ +#define USE_PROFILER +#endif /* } */ +#endif /* } */ + +#ifdef USE_PROFILER1 /* { */ +#ifdef __WORKAROUNDS_ENABLED /* { */ +#define PROFFLAG , prfflg1_532y.doj +#else +#define PROFFLAG , prfflg1_532.doj +#endif /* } */ +#define USE_FILEIO 1 +#ifndef USE_PROFILER /* { */ +#define USE_PROFILER +#endif /* } */ +#endif /* } */ + +#ifdef USE_PROFILER2 /* { */ +#ifdef __WORKAROUNDS_ENABLED /* { */ +#define PROFFLAG , prfflg2_532y.doj +#else +#define PROFFLAG , prfflg2_532.doj +#endif /* } */ +#define USE_FILEIO 1 +#ifndef USE_PROFILER /* { */ +#define USE_PROFILER +#endif /* } */ +#endif /* } */ + +#ifndef PROFFLAG /* { */ +#define PROFFLAG +#endif /* } */ + +#ifdef __WORKAROUNDS_ENABLED /* { */ +#define OMEGA idle532y.doj +#else +#define OMEGA idle532.doj +#endif /* } */ + +#define MEMINIT __initsbsz532.doj, + +#ifdef __WORKAROUNDS_ENABLED /* { */ +#define LIBSMALL libsmall532y.dlb, +#define FLT64 libf64ieee532y.dlb +#else +#define LIBSMALL libsmall532.dlb, +#define FLT64 libf64ieee532.dlb +#endif /* } */ + +#ifdef M3_RESERVED /* { */ +#ifdef __WORKAROUNDS_ENABLED /* { */ +#define LIBM3 libm3res532y.dlb +#define LIBDSP libdspm3res532y.dlb +#define SFTFLT libsftflt532y.dlb +#else +#define LIBM3 libm3res532.dlb +#define LIBDSP libdspm3res532.dlb +#define SFTFLT libsftflt532.dlb +#endif /* } */ +#else +#ifdef __WORKAROUNDS_ENABLED /* { */ +#define LIBM3 libm3free532y.dlb +#define LIBDSP libdsp532y.dlb +#define SFTFLT libsftflt532y.dlb +#else +#define LIBM3 libm3free532.dlb +#define LIBDSP libdsp532.dlb +#define SFTFLT libsftflt532.dlb +#endif /* } */ +#endif /* } */ + +#ifdef IEEEFP /* { */ +#define FPLIBS SFTFLT, FLT64, LIBDSP +#else +#define FPLIBS FLT64, LIBDSP, SFTFLT +#endif /* } */ + +#ifdef __WORKAROUNDS_ENABLED +#ifdef _DINKUM_IO +#define LIBC libc532y.dlb, librt_fileio532y.dlb, libio532y.dlb, +#else //_DINKUM_IO +#define LIBC libio532y.dlb, libc532y.dlb, +#endif +#else //__WORKAROUNDS_ENABLED +#ifdef _DINKUM_IO +#define LIBC libc532.dlb, librt_fileio532.dlb, libio532.dlb, +#else //_DINKUM_IO +#define LIBC libio532.dlb, libc532.dlb, +#endif +#endif + +#ifdef __WORKAROUNDS_ENABLED /* { */ +#ifdef __ADI_LIBEH__ +#define LIBS LIBSMALL MEMINIT LIBC LIBM3, libevent532y.dlb, libx532y.dlb, libcpp532yx.dlb, libcpprt532yx.dlb, FPLIBS, libetsi532.dlb, libssl532y.dlb, libdrv532y.dlb, OMEGA +#else +#define LIBS LIBSMALL MEMINIT LIBC LIBM3, libevent532y.dlb, libx532y.dlb, libcpp532y.dlb, libcpprt532y.dlb, FPLIBS, libetsi532.dlb, libssl532y.dlb, libdrv532y.dlb, OMEGA +#endif +#else +#ifdef __ADI_LIBEH__ +#define LIBS LIBSMALL MEMINIT LIBC LIBM3, libevent532.dlb, libx532.dlb, libcpp532x.dlb, libcpprt532x.dlb, FPLIBS, libetsi532.dlb, libssl532.dlb, libdrv532.dlb, OMEGA +#else +#define LIBS LIBSMALL MEMINIT LIBC LIBM3, libevent532.dlb, libx532.dlb, libcpp532.dlb, libcpprt532.dlb, FPLIBS, libetsi532.dlb, libssl532.dlb, libdrv532.dlb, OMEGA +#endif +#endif /* } */ +#if defined(USE_FILEIO) || defined(USE_PROFGUIDE) +#ifdef __WORKAROUNDS_ENABLED /* { */ +$LIBRARIES = LIBS, librt_fileio532y.dlb; +#else +$LIBRARIES = LIBS, librt_fileio532.dlb; +#endif /* } */ +#else +#ifdef __WORKAROUNDS_ENABLED /* { */ +$LIBRARIES = LIBS, librt532y.dlb; +#else +$LIBRARIES = LIBS, librt532.dlb; +#endif /* } */ +#endif /* } */ + +// Libraries from the command line are included in COMMAND_LINE_OBJECTS. + +// If USER_CRT is defined to be a custom/SystemBuilder generated +// CRT file then link with that, otherwise determine which of the +// precompiled objects to use. +#ifdef USER_CRT /* { */ +#ifdef __WORKAROUNDS_ENABLED /* { */ +#define CRT USER_CRT libprofile532y.dlb PROFFLAG +#else +#define CRT USER_CRT libprofile532.dlb PROFFLAG +#endif /* } */ +#else +#ifdef USE_PROFILER /* { */ +#ifdef USE_FILEIO /* { */ +#ifdef __WORKAROUNDS_ENABLED /* { */ +#define CRT crtsfpc532y.doj, libprofile532y.dlb PROFFLAG +#else +#define CRT crtsfpc532.doj, libprofile532.dlb PROFFLAG +#endif /* } */ +#else +#ifdef __WORKAROUNDS_ENABLED /* { */ +#define CRT crtscp532y.doj, libprofile532y.dlb PROFFLAG +#else +#define CRT crtscp532.doj, libprofile532.dlb PROFFLAG +#endif /* } */ +#endif /* USE_FILEIO */ /* } */ +#else +#ifdef USE_FILEIO /* { */ +#ifdef __WORKAROUNDS_ENABLED /* { */ +#define CRT crtsfc532y.doj +#else +#define CRT crtsfc532.doj +#endif /* } */ +#else +#ifdef __WORKAROUNDS_ENABLED /* { */ +#define CRT crtsc532y.doj +#else +#define CRT crtsc532.doj +#endif /* } */ +#endif /* USE_FILEIO */ /* } */ +#endif /* USE_PROFILER */ /* } */ +#endif /* USER_CRT } */ + +#ifdef __WORKAROUNDS_ENABLED /* { */ +#define ENDCRT , crtn532y.doj +#else +#define ENDCRT , crtn532.doj +#endif /* } */ + +$OBJECTS = CRT, $COMMAND_LINE_OBJECTS ,cplbtab533.doj ENDCRT; + +MEMORY +{ +MEM_SYS_MMRS { /* System memory-mapped registers - 2MB */ + TYPE(RAM) WIDTH(8) + START(0xFFC00000) END(0xFFDFFFFF) +} +MEM_L1_SCRATCH { + TYPE(RAM) WIDTH(8) + START(0xFFB00000) END(0xFFB00FFF) +} +/* Instruction SRAM, 80K, some useable as cache */ +MEM_L1_CODE_CACHE { /* L1 Instruction SRAM/Cache - 16K */ + TYPE(RAM) WIDTH(8) + START(0xFFA10000) END(0xFFA13FFF) +} +MEM_L1_CODE { /* L1 Instruction - 64K */ + TYPE(RAM) WIDTH(8) + START(0xFFA00000) END(0xFFA0FFFF) +} +/* Data Bank B - 32K, half usable as cache. */ +/* Split into sections for program layout. */ +/* Data - normal data, 16K */ +#ifdef USE_CACHE /* { */ +MEM_L1_DATA_B_CACHE { /* L1 Data B SRAM/Cache - 16K */ + TYPE(RAM) WIDTH(8) + START(0xFF904000) END(0xFF907FFF) +} +MEM_L1_DATA_B { /* L1 Data B SRAM - half of 16K */ + TYPE(RAM) WIDTH(8) + START(0xFF902000) END(0xFF903FFF) +} +#else /* } { USE_CACHE */ +MEM_L1_DATA_B { /* L1 Data B SRAM - half of 16K + 16K */ + TYPE(RAM) WIDTH(8) + START(0xFF902000) END(0xFF907FFF) +} +#endif /* } USE_CACHE */ +/* Stack - 8K */ +MEM_L1_DATA_B_STACK { /* L1 Data B SRAM cont. - other half of 16K */ + TYPE(RAM) WIDTH(8) + START(0xFF900000) END(0xFF901FFF) +} +/* Data Bank A - 32K, half usable as cache. */ +/* Split into sections for program layout. */ +/* Data - normal data, 16K. */ +/* If cache disabled use MEM_L1_DATA_A_CACHE for heap else use SRAM */ +MEM_L1_DATA_A_CACHE { /* L1 Data A SRAM/Cache - 16K */ + TYPE(RAM) WIDTH(8) + START(0xFF804000) END(0xFF807FFF) +} +#ifdef IDDE_ARGS +MEM_ARGV { +#define ARGV_START 0xFF803F00 + TYPE(RAM) WIDTH(8) + START(0xFF803F00) END(0xFF803FFF) +} +MEM_L1_DATA_A { /* L1 Data A SRAM - most of 16K */ + TYPE(RAM) WIDTH(8) + START(0xFF800000) END(0xFF803EFF) +} +#else +MEM_L1_DATA_A { /* L1 Data A SRAM - 16K */ + TYPE(RAM) WIDTH(8) + START(0xFF800000) END(0xFF803FFF) +} +#endif +MEM_ASYNC3 { /* Async Bank 3 - 1MB */ + TYPE(RAM) WIDTH(8) + START(0x20300000) END(0x203FFFFF) +} +MEM_ASYNC2 { /* Async Bank 2 - 1MB */ + TYPE(RAM) WIDTH(8) + START(0x20200000) END(0x202FFFFF) +} +MEM_ASYNC1 { /* Async Bank 1 - 1MB */ + TYPE(RAM) WIDTH(8) + START(0x20100000) END(0x201FFFFF) +} +MEM_ASYNC0 { /* Async Bank 0 - 1MB */ + TYPE(RAM) WIDTH(8) + START(0x20000000) END(0x200FFFFF) +} + +#ifdef PARTITION_EZKIT_SDRAM +MEM_SDRAM0_BANK0 { /* SDRAM: Ext Bank0, Int Bank0: 8MB */ + /* Used for heap */ + TYPE(RAM) WIDTH(8) + START(0x00000004) END(0x007FFFFF) +} +MEM_SDRAM0_BANK1 { /* SDRAM: Ext Bank0, Int Bank1: 8MB */ + /* Used for data */ + TYPE(RAM) WIDTH(8) + START(0x00800000) END(0x00FFFFFF) +} +MEM_SDRAM0_BANK2 { /* SDRAM: Ext Bank0, Int Bank2: 8MB */ + /* Used for data/bsz */ + TYPE(RAM) WIDTH(8) + START(0x01000000) END(0x017FFFFF) +} +MEM_SDRAM0_BANK3 { /* SDRAM: Ext Bank0, Int Bank3: 8MB */ + /* Used for program */ + TYPE(RAM) WIDTH(8) + START(0x01800000) END(0x01FFFFFF) +} +#else +/* Claim some of SDRAM Bank 0 for heap */ +/* since it needs a separate section */ + +MEM_SDRAM0 { /* SDRAM Bank 0 - 16MB-128M */ + TYPE(RAM) WIDTH(8) + START(0x00004000) END(0x07FFFFFF) +} +MEM_SDRAM0_HEAP { /* Claim some for ext heap - 16K */ + TYPE(RAM) WIDTH(8) + START(0x00000004) END(0x00003FFF) +} +#endif +} + +PROCESSOR P0 +{ + OUTPUT( $COMMAND_LINE_OUTPUT_FILE ) + + /* Following address must match start of MEM_PROGRAM */ + RESOLVE(start,0xffa00000) +#ifdef IDDE_ARGS + RESOLVE(___argv_string, ARGV_START) +#endif + KEEP(start,_main) + + SECTIONS + { + program_ram + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS( $OBJECTS(L1_code) $LIBRARIES(L1_code)) + INPUT_SECTIONS( $OBJECTS(cplb_code) $LIBRARIES(cplb_code)) + INPUT_SECTIONS( $OBJECTS(cplb) $LIBRARIES(cplb)) + INPUT_SECTIONS( $OBJECTS(noncache_code) $LIBRARIES(noncache_code)) + INPUT_SECTIONS( $OBJECTS(program) $LIBRARIES(program)) + } >MEM_L1_CODE + +#ifndef USE_CACHE + l1_code + { + INPUT_SECTION_ALIGN(4) + ___l1_code_cache = 0; + INPUT_SECTIONS( $OBJECTS(L1_code) $LIBRARIES(L1_code)) + INPUT_SECTIONS( $OBJECTS(cplb_code) $LIBRARIES(cplb_code)) + INPUT_SECTIONS( $OBJECTS(cplb) $LIBRARIES(cplb)) + INPUT_SECTIONS( $OBJECTS(program) $LIBRARIES(program)) + } >MEM_L1_CODE_CACHE +#endif /* USE_CACHE */ + + data_L1_data_a + { + INPUT_SECTION_ALIGN(4) +#ifndef USE_CACHE + ___l1_data_cache_a = 0; +#endif + INPUT_SECTIONS( $OBJECTS(L1_data_a) $LIBRARIES(L1_data_a)) + INPUT_SECTIONS( $OBJECTS(vtbl) $LIBRARIES(vtbl) ) + INPUT_SECTIONS( $OBJECTS(.frt) $LIBRARIES(.frt) ) + INPUT_SECTIONS( $OBJECTS(.frtl) $LIBRARIES(.frtl) ) + INPUT_SECTIONS( $OBJECTS(ctor) $LIBRARIES(ctor) ) + INPUT_SECTIONS( $OBJECTS(ctorl) $LIBRARIES(ctorl) ) + INPUT_SECTIONS( $OBJECTS(.gdt) $LIBRARIES(.gdt) ) + INPUT_SECTIONS( $OBJECTS(.gdtl) $LIBRARIES(.gdtl) ) + INPUT_SECTIONS( $OBJECTS(.edt) $LIBRARIES(.edt) ) + INPUT_SECTIONS( $OBJECTS(.cht) $LIBRARIES(.cht) ) + INPUT_SECTIONS( $OBJECTS(cplb_data) $LIBRARIES(cplb_data)) + INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1)) + INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata)) + } >MEM_L1_DATA_A + + constdata_L1_data_a + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata)) + } >MEM_L1_DATA_A + + data_L1_data_b + { + INPUT_SECTION_ALIGN(4) +#ifndef USE_CACHE + ___l1_data_cache_b = 0; +#endif + INPUT_SECTIONS( $OBJECTS(L1_data_b) $LIBRARIES(L1_data_b)) + INPUT_SECTIONS( $OBJECTS(bsz_init) $LIBRARIES(bsz_init)) + INPUT_SECTIONS( $OBJECTS(.edt) $LIBRARIES(.edt) ) + INPUT_SECTIONS( $OBJECTS(.cht) $LIBRARIES(.cht) ) + INPUT_SECTIONS( $OBJECTS(cplb_data) $LIBRARIES(cplb_data)) + INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1)) + INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata)) + } >MEM_L1_DATA_B + + .meminit { ALIGN(4) } >MEM_L1_DATA_B + + constdata_L1_data_b + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata)) + } >MEM_L1_DATA_B + + bsz_L1_data_b ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS( $OBJECTS(bsz) $LIBRARIES(bsz)) + } >MEM_L1_DATA_B + + bsz_L1_data_a ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS( $OBJECTS(bsz) $LIBRARIES(bsz)) + } >MEM_L1_DATA_A + +#ifdef USE_CACHE /* { */ + l1_code + { + INPUT_SECTION_ALIGN(4) + ___l1_code_cache = 1; + } >MEM_L1_CODE_CACHE + + l1_data_a_cache + { + INPUT_SECTION_ALIGN(4) + ___l1_data_cache_a = 1; + } >MEM_L1_DATA_A_CACHE + + l1_data_b_cache + { + INPUT_SECTION_ALIGN(4) + ___l1_data_cache_b = 1; + } >MEM_L1_DATA_B_CACHE +#endif /* } USE_CACHE */ + + stack + { + ldf_stack_space = .; + ldf_stack_end = ldf_stack_space + MEMORY_SIZEOF(MEM_L1_DATA_B_STACK); + } >MEM_L1_DATA_B_STACK + +#if defined(USE_CACHE) /* { */ +#if defined(PARTITION_EZKIT_SDRAM) /* { */ + heap + { + // Allocate a heap for the application + ldf_heap_space = .; + ldf_heap_end = ldf_heap_space + MEMORY_SIZEOF(MEM_SDRAM0_BANK0) - 1; + ldf_heap_length = ldf_heap_end - ldf_heap_space; + } >MEM_SDRAM0_BANK0 +#else + heap + { + // Allocate a heap for the application + ldf_heap_space = .; + ldf_heap_end = ldf_heap_space + MEMORY_SIZEOF(MEM_SDRAM0_HEAP) - 1; + ldf_heap_length = ldf_heap_end - ldf_heap_space; + } >MEM_SDRAM0_HEAP +#endif /* PARTITION_EZKIT_SDRAM } */ +#else + heap + { + // Allocate a heap for the application + ldf_heap_space = .; + ldf_heap_end = ldf_heap_space + MEMORY_SIZEOF(MEM_L1_DATA_A_CACHE) - 1; + ldf_heap_length = ldf_heap_end - ldf_heap_space; + } >MEM_L1_DATA_A_CACHE +#endif /* USE_CACHE } */ + +#ifdef PARTITION_EZKIT_SDRAM /* { */ + sdram0_bank1 + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS( $OBJECTS(sdram0_bank1) $LIBRARIES(sdram0_bank1)) + INPUT_SECTIONS( $OBJECTS(sdram0_data) $LIBRARIES(sdram0_data)) + INPUT_SECTIONS( $OBJECTS(cplb) $LIBRARIES(cplb)) + INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1)) + INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata)) + INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata)) + INPUT_SECTIONS( $OBJECTS(cplb_data) $LIBRARIES(cplb_data)) + INPUT_SECTIONS( $OBJECTS(.edt) $LIBRARIES(.edt) ) + INPUT_SECTIONS( $OBJECTS(.cht) $LIBRARIES(.cht) ) + } >MEM_SDRAM0_BANK1 + + sdram0_bank1_bsz ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS( $OBJECTS(bsz) $LIBRARIES(bsz)) + } >MEM_SDRAM0_BANK1 + + sdram0_bank2 + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS( $OBJECTS(sdram0_bank1) $LIBRARIES(sdram0_bank1)) + INPUT_SECTIONS( $OBJECTS(sdram0_data) $LIBRARIES(sdram0_data)) + INPUT_SECTIONS( $OBJECTS(cplb) $LIBRARIES(cplb)) + INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1)) + INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata)) + INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata)) + INPUT_SECTIONS( $OBJECTS(cplb_data) $LIBRARIES(cplb_data)) + INPUT_SECTIONS( $OBJECTS(.edt) $LIBRARIES(.edt) ) + INPUT_SECTIONS( $OBJECTS(.cht) $LIBRARIES(.cht) ) + } >MEM_SDRAM0_BANK2 + + sdram0_bank2_bsz ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS( $OBJECTS(bsz) $LIBRARIES(bsz)) + } >MEM_SDRAM0_BANK2 + + sdram0_bank3 + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS( $OBJECTS(sdram0_bank3) $LIBRARIES(sdram0_bank3)) + INPUT_SECTIONS( $OBJECTS(noncache_code) $LIBRARIES(noncache_code)) + INPUT_SECTIONS( $OBJECTS(program) $LIBRARIES(program)) + INPUT_SECTIONS( $OBJECTS(cplb_code) $LIBRARIES(cplb_code)) + } >MEM_SDRAM0_BANK3 +#else /* PARTITION_EZKIT_SDRAM } { */ +#if defined(USE_CACHE) || defined(USE_SDRAM) /* { */ + sdram + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS( $OBJECTS(sdram0) $LIBRARIES(sdram0)) + INPUT_SECTIONS( $OBJECTS(noncache_code) $LIBRARIES(noncache_code)) + INPUT_SECTIONS( $OBJECTS(program) $LIBRARIES(program)) + INPUT_SECTIONS( $OBJECTS(cplb) $LIBRARIES(cplb)) + INPUT_SECTIONS( $OBJECTS(cplb_code) $LIBRARIES(cplb_code)) + INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1)) + INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata)) + INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata)) + INPUT_SECTIONS( $OBJECTS(cplb_data) $LIBRARIES(cplb_data)) + INPUT_SECTIONS( $OBJECTS(.edt) $LIBRARIES(.edt) ) + INPUT_SECTIONS( $OBJECTS(.cht) $LIBRARIES(.cht) ) + } >MEM_SDRAM0 + + bsz_sdram0 ZERO_INIT + { + INPUT_SECTION_ALIGN(4) + INPUT_SECTIONS( $OBJECTS(bsz) $LIBRARIES(bsz)) + } >MEM_SDRAM0 +#endif /* USE_CACHE || USE_SDRAM } */ +#endif /* } */ + + } +} diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/kernel_cfg.c b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/kernel_cfg.c new file mode 100644 index 0000000..f96770c --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/kernel_cfg.c @@ -0,0 +1,161 @@ +/* Configured with [talkthrough.cfg ] */ + +#include "kernel_cfg.h" +#include "kernel_id.h" + +#if TKERNEL_PRVER >= 0x1040 +#define CFG_INTHDR_ENTRY(inthdr) INTHDR_ENTRY(inthdr) +#define CFG_EXCHDR_ENTRY(exchdr) EXCHDR_ENTRY(exchdr) +#define CFG_INT_ENTRY(inthdr) INT_ENTRY(inthdr) +#define CFG_EXC_ENTRY(exchdr) EXC_ENTRY(exchdr) +#else +#error "This configuration file has no compatibility with TOPPERS/JSP rel 1.3 or earlier." +#endif + +#ifndef __EMPTY_LABEL +#define __EMPTY_LABEL(x,y) x y[0] +#endif + +#if TKERNEL_PRID != 0x0001u /* TOPPERS/JSP */ +#error "You can not use this configuration file without TOPPERS/JSP" +#endif + + /* User specified include files*/ +#include "talkthrough.h" +#include "ad1836a.h" +#include +#include + + + /* Object initializer [task] */ + +#define TNUM_TSKID 1 + +const ID _kernel_tmax_tskid = (TMIN_TSKID + TNUM_TSKID - 1); + +static __STK_UNIT __stack_CODEC_TASK[__TCOUNT_STK_UNIT(512)]; + +const TINIB _kernel_tinib_table[TNUM_TSKID] = { + {TA_HLNG | TA_ACT, (VP_INT)(0), (FP)(run_ad1836_task), INT_PRIORITY(3), __TROUND_STK_UNIT(512), __stack_CODEC_TASK, TA_NULL, (FP)(NULL)} +}; + +const ID _kernel_torder_table[TNUM_TSKID] = {1}; + +TCB _kernel_tcb_table[TNUM_TSKID]; + + + /* Object initializer [semaphore] */ + +#define TNUM_SEMID 2 + +const ID _kernel_tmax_semid = (TMIN_SEMID + TNUM_SEMID - 1); + +const SEMINIB _kernel_seminib_table[TNUM_SEMID] = { + {TA_TPRI, 0, 1}, + {TA_TPRI, 0, 1} +}; + +SEMCB _kernel_semcb_table[TNUM_SEMID]; + + + /* Object initializer [eventflag] */ + +#define TNUM_FLGID 0 + +const ID _kernel_tmax_flgid = (TMIN_FLGID + TNUM_FLGID - 1); + +__EMPTY_LABEL(const FLGINIB, _kernel_flginib_table); +__EMPTY_LABEL(FLGCB, _kernel_flgcb_table); + + + /* Object initializer [dataqueue] */ + +#define TNUM_DTQID 0 + +const ID _kernel_tmax_dtqid = (TMIN_DTQID + TNUM_DTQID - 1); + +__EMPTY_LABEL(const DTQINIB, _kernel_dtqinib_table); +__EMPTY_LABEL(DTQCB, _kernel_dtqcb_table); + + + /* Object initializer [mailbox] */ + +#define TNUM_MBXID 0 + +const ID _kernel_tmax_mbxid = (TMIN_MBXID + TNUM_MBXID - 1); + +__EMPTY_LABEL(const MBXINIB, _kernel_mbxinib_table); +__EMPTY_LABEL(MBXCB, _kernel_mbxcb_table); + + + /* Object initializer [mempfix] */ + +#define TNUM_MPFID 0 + +const ID _kernel_tmax_mpfid = (TMIN_MPFID + TNUM_MPFID - 1); + +__EMPTY_LABEL(const MPFINIB, _kernel_mpfinib_table); +__EMPTY_LABEL(MPFCB, _kernel_mpfcb_table); + + + /* Object initializer [cyclic] */ + +#define TNUM_CYCID 0 + +const ID _kernel_tmax_cycid = (TMIN_CYCID + TNUM_CYCID - 1); + +__EMPTY_LABEL(const CYCINIB, _kernel_cycinib_table); +__EMPTY_LABEL(CYCCB, _kernel_cyccb_table); + + + /* Object initializer [interrupt] */ + +#define TNUM_INHNO 3 + +const UINT _kernel_tnum_inhno = TNUM_INHNO; + +CFG_INTHDR_ENTRY(spi_handler); +CFG_INTHDR_ENTRY(sport0_handler); +CFG_INTHDR_ENTRY(timer_handler); + +const INHINIB _kernel_inhinib_table[TNUM_INHNO] = { + {INHNO_SPI,TA_HLNG,(FP)CFG_INT_ENTRY(spi_handler)}, + {INHNO_SPORT0_RX,TA_HLNG,(FP)CFG_INT_ENTRY(sport0_handler)}, + {INHNO_TIMER,TA_HLNG,(FP)CFG_INT_ENTRY(timer_handler)} +}; + + + /* Object initializer [exception] */ + +#define TNUM_EXCNO 0 + +const UINT _kernel_tnum_excno = TNUM_EXCNO; + +__EMPTY_LABEL(const EXCINIB, _kernel_excinib_table); + /* Initialization handler */ + +void +_kernel_call_inirtn(void) +{ + app_init( (VP_INT)(0) ); + timer_initialize( (VP_INT)(0) ); +} + +void +_kernel_call_terrtn(void) +{ + timer_terminate( (VP_INT)(0) ); +} + + /* Object initialization routine */ + +void +_kernel_object_initialize(void) +{ + _kernel_task_initialize(); + _kernel_semaphore_initialize(); + _kernel_interrupt_initialize(); +} + +TMEVTN _kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID]; + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/kernel_id.h b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/kernel_id.h new file mode 100644 index 0000000..19a9714 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/kernel_id.h @@ -0,0 +1,11 @@ +#ifndef KERNEL_ID_H +#define KERNEL_ID_H + + /* object identifier deifnition */ + +#define CODEC_TASK 1 +#define SPI_SEM 1 +#define SPORT0_SEM 2 + +#endif /* KERNEL_ID_H */ + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/processing.c b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/processing.c new file mode 100644 index 0000000..6f90ed5 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/processing.c @@ -0,0 +1,16 @@ +#include "t_services.h" +#include "kernel_id.h" +#include "talkthrough.h" +#include "ad1836a.h" + + +void processData(struct CODEC_BUFFER *rx_buf, struct CODEC_BUFFER *tx_buf) +{ + int sample, slot; + + + for ( sample = 0; sample < SAMPLE_PER_INTR; sample++ ) + for ( slot =0; slot < 8; slot ++ ) + tx_buf->data[sample][slot] = rx_buf->data[sample][slot]; + +} diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/readme.txt b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/readme.txt new file mode 100644 index 0000000..c51a8bf --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/readme.txt @@ -0,0 +1,16 @@ +Talkthrough ƒAƒvƒŠƒP[ƒVƒ‡ƒ“ READ ME +2005.Jun.10 ŒŠ¿ + +TOPPERS/JSP 1.4.1 for Blackfin ƒx[ƒX‚Ì Talkthrough ƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚Å‚·B‘S‘Ì‚Í3‚‚̕”•ª‚©‚ç\¬‚³‚ê‚Ä‚¢‚Ü‚·B + +- config\blackfin-vdsp\bf533\libkernel.dpj +- _libs\ad1836a.dpj +- _applications\talkthrough.dpj + +‚±‚ê‚ç‚̃vƒƒWƒFƒNƒg‚Í_applications\talkthrough\talkthrough.dpg ‚ÉŠÜ‚Ü‚ê‚Ä‹‚Ü‚·B + +ƒrƒ‹ƒhŠÂ‹« +- VisualDSP++ 4.0 2005 March Update +- EZ-KIT Lite BF533 Rev 1.5, Chip Rev 0.2 + +Ú×‚Í http://adsp2191.hp.infoseek.co.jp/ ‚܂ŁB \ No newline at end of file diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/run_ad1836_task.c b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/run_ad1836_task.c new file mode 100644 index 0000000..ef1eefb --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/run_ad1836_task.c @@ -0,0 +1,185 @@ +#include "t_services.h" +#include "s_services.h" +#include +#include "ad1836a.h" + + + +#define pFLASHA_PORTA_OUT ((volatile unsigned char * )0x20270004) +#define pFLASHA_PORTA_DIR ((volatile unsigned char * )0x20270006) + + +struct DMA_DESCRIPTOR{ + struct DMA_DESCRIPTOR * next; + void * start; + unsigned short config; + unsigned short x_count; + short x_modify; +}; + + +// CODEC ‰Šú‰»ƒf[ƒ^—ñ +static short sCodec1836TxRegs[] = +{ + DAC_CONTROL_1 | 0x000, + DAC_CONTROL_2 | 0x000, + DAC_VOLUME_0 | 0x3ff, + DAC_VOLUME_1 | 0x3ff, + DAC_VOLUME_2 | 0x3ff, + DAC_VOLUME_3 | 0x3ff, + DAC_VOLUME_4 | 0x3ff, + DAC_VOLUME_5 | 0x3ff, + ADC_CONTROL_1 | 0x000, + ADC_CONTROL_2 | 0x180, + ADC_CONTROL_3 | 0x000 + +}; + +// ƒI[ƒfƒBƒIƒoƒbƒtƒ@ +// 1ƒTƒ“ƒvƒ‹‚ ‚½‚è8ƒf[ƒ^‚ð“]‘—‚·‚éBƒ_ƒuƒ‹ƒoƒbƒtƒ@\¬‚È‚Ì‚Å‚³‚ç‚É‚»‚Ì2”{•K—v +static struct CODEC_BUFFER TxBuffer[2], RxBuffer[2]; + +static struct DMA_DESCRIPTOR tDescA, tDescB, rDescA, rDescB; + +void run_ad1836_task(VP_INT extinf) +{ + ena_int( INTNO_SPI ); // SPI DMAŠ„‚荞‚݃}ƒXƒN‚ð‚Í‚¸‚· + ena_int( INTNO_SPORT0_RX ); // SPORT0 DMAŠ„‚荞‚݃}ƒXƒN‚ð‚Í‚¸‚· + +//-------------------------------------------------------- +// AD1836‚̃ŠƒZƒbƒg +// + *pFLASHA_PORTA_DIR |= 0x01; // CODEC ƒŠƒZƒbƒgM†‚ðo—Í‚É + *pFLASHA_PORTA_OUT &= 0xFE; // CODEC ƒŠƒZƒbƒg‚ðƒAƒT[ƒg + tslp_tsk( 1 ); // ƒŠƒZƒbƒg=Lƒpƒ‹ƒX‚ðì‚é + *pFLASHA_PORTA_OUT |= 0x01; // CODEC ƒŠƒZƒbƒg‚ðƒfƒAƒT[ƒg + tslp_tsk( 1 ); // ƒŠƒZƒbƒg‚©‚ç‚̉ñ•œŽžŠÔ‚ð—^‚¦‚é + +//-------------------------------------------------------- +// SPIÝ’è +// + // PF4‚ÍAD1836‚ÌSPI SSƒsƒ“ + *pSPI_FLG = FLS4; + // SPIƒrƒbƒgƒŒ[ƒg = SCLK/(2*SPIBAUD) :‚¨‚æ‚» 2MHz + *pSPI_BAUD = 32; + // SPI DMA ‘‚«ž‚Ý‚É‚æ‚éƒgƒŠƒK, 16bit ƒf[ƒ^, MSB first, ƒ}ƒXƒ^ + *pSPI_CTL = TIMOD | SIZE | MSTR; + + + +//-------------------------------------------------------- +// SPI DMA Ý’è +// + // 16bit ƒf[ƒ^Aƒƒ‚ƒŠ‚©‚ç“ǂݏo‚µAI—¹ŒãŠ„‚荞‚Ý + *pDMA5_CONFIG = WDSIZE_16 | DI_EN; + // CODEC ‰Šú‰»•¶Žš—ñ‚̃AƒhƒŒƒX + *pDMA5_START_ADDR = sCodec1836TxRegs; + // DMA “]‘—ƒJƒEƒ“ƒg + *pDMA5_X_COUNT = sizeof( sCodec1836TxRegs ) / sizeof( short ); + // DMA ‘•ª + *pDMA5_X_MODIFY = sizeof( short ); + + +//-------------------------------------------------------- +// SPI ŠJŽn + // DMA ŠJŽn + *pDMA5_CONFIG |= DMAEN; + // SPI ŠJŽn + *pSPI_CTL |= SPE; + + + // DMA‘—oI—¹‚ð‘Ò‚Â + wai_sem( spi_sem ); + // DMAI—¹‚ÍSPI‘—MI—¹‚Å‚Í‚È‚¢‚̂ŁA‚¿‚å‚Á‚Æ‘Ò‚Â + tslp_tsk( 1 ); + +//-------------------------------------------------------- +// SPORT0 Ý’è +// ƒ}ƒ‹ƒ`ƒ`ƒƒƒ“ƒlƒ‹‚̏ꍇAí‚É SPORTx_yCR1.LATFS = 0 + // Sport0 ŽóMÝ’è + // ŠO•”ƒNƒƒbƒN, ŠO•”“¯ŠúM†, MSBƒtƒ@[ƒXƒg + // 32-bit ƒf[ƒ^ + *pSPORT0_RCR1 = RFSR; + *pSPORT0_RCR2 = 31; // ƒf[ƒ^’· 32 + + // Sport0 ‘—MÝ’è + // ŠO•”ƒNƒƒbƒN, ŠO•”“¯ŠúM†, MSBƒtƒ@[ƒXƒg + // 32ƒrƒbƒgƒf[ƒ^ + *pSPORT0_TCR1 = TFSR; + *pSPORT0_TCR2 = 31; // ƒf[ƒ^’· 32 + + // ƒtƒŒ[ƒ€‚ ‚½‚è8ƒXƒƒbƒg‚̃f[ƒ^‚ð‘—Žó‚ÅŽg‚¤ + *pSPORT0_MTCS0 = 0x000000FF; + *pSPORT0_MRCS0 = 0x000000FF; + + // ƒ}ƒ‹ƒ`ƒ`ƒƒƒ“ƒlƒ‹Ý’è + *pSPORT0_MCMC1 = 0x0000; // ƒIƒtƒZƒbƒg = 0, ƒEƒCƒ“ƒhƒEƒTƒCƒY = 8 + *pSPORT0_MCMC2 = 0x1000 | MCMEN | MCDRXPE | MCDTXPE; // MFD = 1; + +//-------------------------------------------------------- +// SPORT DMA Ý’è +// + // DMA1Ý’è (SPORT0 RX) + rDescA.next = &rDescB; + rDescA.start = RxBuffer[0].data; + rDescA.config = 0x7700 | WNR | WDSIZE_32 | DI_EN | DMAEN; // Large List, 7 short word. + rDescA.x_count = 8 * SAMPLE_PER_INTR; + rDescA.x_modify = 4; + + rDescB.next = &rDescA; + rDescB.start = RxBuffer[1].data; + rDescB.config = 0x7700 | WNR | WDSIZE_32 | DI_EN | DMAEN; // Large List, 7 short word. + rDescB.x_count = 8 * SAMPLE_PER_INTR; + rDescB.x_modify = 4; + + + // DMA2Ý’è (SPORT0 TX) + tDescA.next = &tDescB; + tDescA.start = TxBuffer[0].data; + tDescA.config = 0x7700 | WDSIZE_32 | DMAEN; // Large List, 7 short word. + tDescA.x_count = 8 * SAMPLE_PER_INTR; + tDescA.x_modify = 4; + + tDescB.next = &tDescA; + tDescB.start = TxBuffer[1].data; + tDescB.config = 0x7700 | WDSIZE_32 | DMAEN; // Large List, 7 short word. + tDescB.x_count = 8 * SAMPLE_PER_INTR; + tDescB.x_modify = 4; + + + *pDMA2_NEXT_DESC_PTR = &tDescA; + *pDMA1_NEXT_DESC_PTR = &rDescA; + *pDMA2_CONFIG = 0x7700 | WDSIZE_32; + *pDMA1_CONFIG = 0x7700 | WNR | WDSIZE_32; + + +//-------------------------------------------------------- +// SPORT0 ŠJŽn + // DMA ŠJŽn + *pDMA2_CONFIG |= DMAEN; + *pDMA1_CONFIG |= DMAEN; + asm("ssync;"); + // SPORT2 ŠJŽn + *pSPORT0_TCR1 |= TSPEN; + *pSPORT0_RCR1 |= RSPEN; + +// + + while( 1 ){ + int sample, slot, bufTx, bufRx; + struct CODEC_BUFFER * BufToBeTransmit; + + // ŽóMDMAI—¹Š„‚荞‚Ý‚Æ“¯Šú + wai_sem( sport0_sem); + + // ƒvƒƒZƒbƒT‚ªŽg‚Á‚Ä‚æ‚¢ƒoƒbƒtƒ@‚ðŠ„‚èo‚· + bufTx = ( &tDescA == *pDMA2_NEXT_DESC_PTR) ? 0 : 1; + bufRx = ( &rDescA == *pDMA1_NEXT_DESC_PTR) ? 0 : 1; + + + processData(&RxBuffer[bufRx], &TxBuffer[bufTx]); + + } + +} + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/spi_hdl.c b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/spi_hdl.c new file mode 100644 index 0000000..61597c1 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/spi_hdl.c @@ -0,0 +1,12 @@ +#include "t_services.h" +#include "ad1836a.h" +#include +#include + +void spi_handler(void) +{ + *pDMA5_IRQ_STATUS = DMA_DONE; // SPI DMAŠ„‚荞‚Ý‚ðƒNƒŠƒA + ssync(); + isig_sem( spi_sem ); +} + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/sport0_hdl.c b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/sport0_hdl.c new file mode 100644 index 0000000..1f18442 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/sport0_hdl.c @@ -0,0 +1,12 @@ +#include "t_services.h" +#include "ad1836a.h" +#include +#include + +void sport0_handler(void) +{ + *pDMA1_IRQ_STATUS = DMA_DONE; // SPORT0 RX DMAŠ„‚荞‚Ý‚ðƒNƒŠƒA + ssync(); + isig_sem( sport0_sem ); +} + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/talkthrough.cfg b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/talkthrough.cfg new file mode 100644 index 0000000..93339f0 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/talkthrough.cfg @@ -0,0 +1,62 @@ +/* +* ƒ†[ƒU[ƒCƒ“ƒNƒ‹[ƒhƒtƒ@ƒCƒ‹ +*/ + +INCLUDE("\"talkthrough.h\""); + + + +/* +* ƒ†[ƒU[Ž‘Œ¹‚̃Rƒ“ƒtƒBƒOƒŒ[ƒVƒ‡ƒ“ +*/ +/* +CRE_TSK( TT_TASK, { TA_HLNG|TA_ACT, 0, talkthrough_task, 3, 512, NULL }); +*/ + +/* +* AD1836A ƒR[ƒfƒbƒNŠÇ—ƒ^ƒXƒN—pƒRƒ“ƒtƒBƒOƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹ +* ‚±‚±‚©‚ç +*/ +INCLUDE("\"ad1836a.h\""); +/* +* ƒpƒuƒŠƒbƒN‚ÈŽ‘Œ¹ +*/ + +/*CRE_DTQ( CODEC_TX_DTQ, { TA_TFIFO, 1, NULL }); ‘—Mƒf[ƒ^ƒLƒ…[ FIFO‡AƒLƒ…[’·1A—̈掩“®Š„•t */ +/*CRE_DTQ( CODEC_RX_DTQ, { TA_TFIFO, 1, NULL }); ŽóMƒf[ƒ^ƒLƒ…[ FIFO‡AƒLƒ…[’·1A—̈掩“®Š„•t */ +/* +* ƒvƒ‰ƒCƒx[ƒg‚¾‚ªƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚ŏ‰Šú‰»‚ª•K—v‚ÈŽ‘Œ¹ +*/ +CRE_SEM( SPI_SEM, { TA_TPRI, 0, 1}); +CRE_SEM( SPORT0_SEM, { TA_TPRI, 0, 1}); +/* +* ƒvƒ‰ƒCƒx[ƒg‚ÈŽ‘Œ¹ +*/ + +CRE_TSK( CODEC_TASK, { TA_HLNG|TA_ACT, 0, run_ad1836_task, 3, 512, NULL }); +DEF_INH( INHNO_SPI, {TA_HLNG, spi_handler} ); +DEF_INH( INHNO_SPORT0_RX, {TA_HLNG, sport0_handler} ); +/* +* AD1836A ƒR[ƒfƒbƒNŠÇ—ƒ^ƒXƒN—pƒRƒ“ƒtƒBƒOƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹ +* I‚í‚è +*/ + +/* +* ƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚É‚æ‚éƒ|[ƒg‰Šú‰»B +*/ + +ATT_INI({ TA_HLNG, 0, app_init }); + +/* +*@ƒVƒXƒeƒ€ƒ^ƒCƒ}[‚Ì“o˜^B•K‚¸INHNO_TIMER‚É“o˜^‚·‚éB +*/ + +ATT_INI({ TA_HLNG, 0, timer_initialize }); +VATT_TER({ TA_HLNG, 0, timer_terminate }); +DEF_INH(INHNO_TIMER, { TA_HLNG, timer_handler }); + +/* +* ƒVƒXƒeƒ€ƒCƒ“ƒNƒ‹[ƒhƒtƒ@ƒCƒ‹ +*/ +INCLUDE(""); +INCLUDE(""); diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/talkthrough.dpg b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/talkthrough.dpg new file mode 100644 index 0000000..4572e71 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/talkthrough.dpg @@ -0,0 +1,13 @@ + + + + + libkernel + makeoffset + + + + + + + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/talkthrough.dpj b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/talkthrough.dpj new file mode 100644 index 0000000..ebabc58 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/talkthrough.dpj @@ -0,0 +1,212 @@ + + + + + ADSP-BF533 + .dxe + Executable file + + + + + .\Debug + .\Debug + 0 + + + + + + + + + + + + + + + + + + + + + + + .\Release + .\Release + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + + + diff --git a/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/talkthrough.h b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/talkthrough.h new file mode 100644 index 0000000..183a582 --- /dev/null +++ b/uzume_prototype/kernel/tools/blackfin-vdsp/talkthrough_ezkit_bf533/talkthrough.h @@ -0,0 +1,20 @@ +/* + * talkthrough.h + */ +#ifndef _TSKDEF_H_ +#define _TSKDEF_H_ +#include "ad1836a.h" + +#ifdef __cplusplus + extern "C" { +#endif + +extern void processData( struct CODEC_BUFFER *rxBuf, struct CODEC_BUFFER *txBuf ); +extern void app_init(VP_INT vp_int); + +#ifdef __cplusplus + }; +#endif + +#endif + diff --git a/uzume_prototype/kernel/utils/blackfin-vdsp/main.c b/uzume_prototype/kernel/utils/blackfin-vdsp/main.c new file mode 100644 index 0000000..479c725 --- /dev/null +++ b/uzume_prototype/kernel/utils/blackfin-vdsp/main.c @@ -0,0 +1,38 @@ +#include +#include +#include +struct task_control_block tcb; +int offset; +int main(void) +{ + FILE * f; + unsigned int * a; + f = fopen ( "..\\offset.h", "w"); + + fprintf( f, "// Generated by makeoffset.dxe\n" ); + + offset = (unsigned int)&tcb.tskctxb.sp - (unsigned int)&tcb; + fprintf( f, "#define TCB_sp %d\n", offset ); + + offset = (unsigned int)&tcb.tskctxb.pc - (unsigned int)&tcb; + fprintf( f, "#define TCB_pc %d\n", offset ); + + offset = (unsigned int)&tcb.texptn - (unsigned int)&tcb; + fprintf( f, "#define TCB_texptn %d\n", offset ); + + offset = (unsigned int)&tcb.tinib - (unsigned int)&tcb + sizeof( tcb.tinib ); + a = (void *) &tcb.tinib + sizeof( tcb.tinib ); + + *a = 0; + tcb.enatex = 1; + + while ( *a > 0xFF ){ + *a >>= 8; + offset ++; + } + + fprintf( f, "#define TCB_enatex %d\n", offset ); + fprintf ( f, "#define TCB_enatex_mask 0x%x\n", *a ); + + fclose( f ); +} diff --git a/uzume_prototype/kernel/utils/blackfin-vdsp/makeoffset.dpj b/uzume_prototype/kernel/utils/blackfin-vdsp/makeoffset.dpj new file mode 100644 index 0000000..9d99894 --- /dev/null +++ b/uzume_prototype/kernel/utils/blackfin-vdsp/makeoffset.dpj @@ -0,0 +1,94 @@ + + + + + ADSP-BF548 + .dxe + Executable file + + + + + .\Debug + .\Debug + 0 + + + + + + + + + + + + + + + + + + + + + + + .\Release + .\Release + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .\Debug + .\Debug + + + + + .\Release + .\Release + + + + + + + + + + + + diff --git a/uzume_prototype/kernel/utils/blackfin-vdsp/readme.txt b/uzume_prototype/kernel/utils/blackfin-vdsp/readme.txt new file mode 100644 index 0000000..35bb7c5 --- /dev/null +++ b/uzume_prototype/kernel/utils/blackfin-vdsp/readme.txt @@ -0,0 +1,3 @@ +VisualDSP++環境では、offset.hをスクリプトで生成することができない。 +そこで、offset.hを生成するVisualDSP++プログラムを用意した。 +VisualDSP++のシミュレーターで実行しすると、offset.hを出力する。 \ No newline at end of file diff --git a/uzume_prototype/kernel/utils/gencheck b/uzume_prototype/kernel/utils/gencheck new file mode 100755 index 0000000..d75b91b --- /dev/null +++ b/uzume_prototype/kernel/utils/gencheck @@ -0,0 +1,50 @@ +#! /usr/bin/perl +# +# TOPPERS/JSP Kernel +# Toyohashi Open Platform for Embedded Real-Time Systems/ +# Just Standard Profile Kernel +# +# Copyright (C) 2001-2003 by Embedded and Real-Time Systems Laboratory +# Toyohashi Univ. of Technology, JAPAN +# +# 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation +# によって公表されている GNU General Public License の Version 2 に記 +# 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア +# を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, +# 利用と呼ぶ)することを無償で許諾する. +# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 +# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー +# スコード中に含まれていること. +# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 +# 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 +# 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 +# の無保証規定を掲載すること. +# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 +# 用できない形で再配布する場合には,次のいずれかの条件を満たすこ +# と. +# (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 +# 作権表示,この利用条件および下記の無保証規定を掲載すること. +# (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに +# 報告すること. +# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 +# 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. +# +# 本ソフトウェアは,無保証で提供されているものである.上記著作権者お +# よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も +# 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 +# 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. +# +# @(#) $Id: gencheck,v 1.1 2009/01/31 05:27:37 suikan Exp $ +# + +while ($line = <>) { + chomp $line; + $line =~ s/[\r\n]//g; + + next unless ($line =~ /\@$/); + + $line =~ s/[@ \t]//g; + $line =~ s/\([^0-9]*([0-9]*)\)/$1/g; + + print $line,"\n"; +} diff --git a/uzume_prototype/kernel/utils/genoffset b/uzume_prototype/kernel/utils/genoffset new file mode 100755 index 0000000..7dc0351 --- /dev/null +++ b/uzume_prototype/kernel/utils/genoffset @@ -0,0 +1,262 @@ +#! /usr/bin/perl +# +# TOPPERS/JSP Kernel +# Toyohashi Open Platform for Embedded Real-Time Systems/ +# Just Standard Profile Kernel +# +# Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory +# Toyohashi Univ. of Technology, JAPAN +# Copyright (C) 2004-2005 by Embedded and Real-Time Systems Laboratory +# Graduate School of Information Science, Nagoya Univ., JAPAN +# +# 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation +# によって公表されている GNU General Public License の Version 2 に記 +# 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア +# を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, +# 利用と呼ぶ)することを無償で許諾する. +# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 +# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー +# スコード中に含まれていること. +# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 +# 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 +# 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 +# の無保証規定を掲載すること. +# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 +# 用できない形で再配布する場合には,次のいずれかの条件を満たすこ +# と. +# (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 +# 作権表示,この利用条件および下記の無保証規定を掲載すること. +# (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに +# 報告すること. +# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 +# 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. +# +# 本ソフトウェアは,無保証で提供されているものである.上記著作権者お +# よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も +# 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 +# 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. +# +# @(#) $Id: genoffset,v 1.2 2012/06/17 00:24:19 suikan Exp $ +# + +# +# 初期化 +# +$infile = $ARGV[0]; + +# +# ビットサーチ +# +sub search_bit { + my($val) = @_; + my($val_bit); + + return(-1) if ($val == 0); + + $val_bit = 0; + while (($val & 1) == 0) { + $val >>= 1; + $val_bit++; + } + return($val_bit); +} + +# +# オフセット値の出力 +# +sub parse_offset { + if ($line =~ /OFFSET_DEF ([^ \t]+) = [#\$]?([^ \t]+)/) { + printf "#define %s\t%d\n",$1,$2; + } +} + +# +# 解釈できるディレクティブのテーブル +# +%directives = ( + "long", "", + "dword", "", + "word", "", + "hword", "", + "int", "", + "short", "", + "half", "", + "byte", "", + "value", "", + "uaword", "", + "uashort", "", + "data32", 4, + "data16", 2, + "data8", 1, + "zero", -1, + "space", -1, + "globl", 0, + "global", 0, + "align", 0, + "p2align", 0, + "even", 0, + "data", 0, + "stabs", 0, + "type", 0, + "size", 0, + "section", 0, + "sdata", 0, + "code", 0, +); + +# +# ビット位置の出力 +# +sub parse_bit { + my($endian, $size) = @_; + my($offset, $dir, $val, $val_bit); + + return unless ($line =~ /BIT_([BL])([BHW])_([^ \t]+):/); + $label = $3; + + $offset = 0; + while ($line = ) { + chomp $line; + next if ($line =~ /^[ \t]*[#;].*$/); + + if ($line =~ /[ \t]*\.([a-zA-Z0-9]+)[ \t]*([^ \t]*)[ \t]*/ + && defined($dir = $directives{$1})) { + $val = $2; + + # 16進数と8進数の数値への変換処理 + if ($val =~ /^0x(.+)$/) { + $val = hex($1); + } + elsif ($val =~ /^0(.+)$/) { + $val = oct($1); + } + + if ($dir eq "") { + # サイズを知らないディレクティブ + print STDERR "genoffset: unknown directive: ", + "$line\n"; + $error = 1; + } + elsif ($dir == 0) { + # 読み飛ばすべきディレクティブ + next; + } + elsif ($dir == -1) { + # .zero ディレクティブの処理 + $offset += $val; + next; + } + elsif ($val == 0) { + # 値が 0 のフィールドの処理 + $offset += $dir; + next; + } + + # ビット位置を探す + $val_bit = search_bit($val); + + # バイト単位に換算する + if ($endian eq "B") { + $offset += $dir - 1; + $offset -= $val_bit >> 3; + } + else { + $offset += $val_bit >> 3; + } + $val_bit &= 0x07; + + # 出力単位に換算する + if ($size eq "W") { + if ($endian eq "B") { + $val_bit += 24; + $val_bit -= ($offset & 0x03) << 3; + } + else { + $val_bit += ($offset & 0x03) << 3; + } + $offset &= ~0x03; + } + elsif ($size eq "H") { + if ($endian eq "B") { + $val_bit += 8; + $val_bit -= ($offset & 0x01) << 3; + } + else { + $val_bit += ($offset & 0x01) << 3; + } + $offset &= ~0x01; + } + last; + } + else { + # 解析できない行 + print STDERR "genoffset: cannot parse: $line\n"; + $error = 1; + } + } + + # 定義の出力 + $label =~ s/^_//; + printf "#define %s\t%d\n",$label,$offset; + printf "#define %s_bit\t%d\n",$label,$val_bit; + printf "#define %s_mask\t0x%x\n",$label,(1 << $val_bit); +} + +# +# ディレクティブの読み取り +# +sub ref_bit { + my($size, $dir, $directive); + + return unless ($line =~ /BIT_REF_([0-9]+):/); + $size = $1; + + while ($line = ) { + chomp $line; + next if ($line =~ /^[ \t]*[#;].*$/); + + if ($line =~ /[ \t]*\.([a-zA-Z0-9]+)[ \t]*([^ \t]*)[ \t]*/ + && defined($dir = $directives{$1})) { + $directive = $1; + if ($dir eq "") { + # 登録すべきディレクティブ + $directives{$directive} = $size; + } + last; + } + else { + # 解析できない行 + print STDERR "genoffset: cannot parse: $line\n"; + $error = 1; + } + } +} + +# +# メインルーチン +# +print "/* This file is generated by genoffset. */\n"; +print "\n"; + +$error = 0; +open(INFILE, $infile) || die "Cannot open $infile"; +while ($line = ) { + chomp $line; + + if ($line =~ /^[ \t]*OFFSET_DEF/) { + parse_offset(); + } + elsif ($line =~ /^[ \t]*_?BIT_REF/) { + ref_bit(); + } +} +seek(INFILE, 0, SEEK_SET); +while ($line = ) { + chomp $line; + + if ($line =~ /^[ \t]*_?BIT_([BL])([BHW])/) { + parse_bit($1, $2); + } +} +close(INFILE); +exit($error); diff --git a/uzume_prototype/kernel/utils/genrename b/uzume_prototype/kernel/utils/genrename new file mode 100755 index 0000000..1d03b65 --- /dev/null +++ b/uzume_prototype/kernel/utils/genrename @@ -0,0 +1,201 @@ +#! /usr/bin/perl +# +# TOPPERS/JSP Kernel +# Toyohashi Open Platform for Embedded Real-Time Systems/ +# Just Standard Profile Kernel +# +# Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory +# Toyohashi Univ. of Technology, JAPAN +# Copyright (C) 2005 by Embedded and Real-Time Systems Laboratory +# Graduate School of Information Science, Nagoya Univ., JAPAN +# +# 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation +# によって公表されている GNU General Public License の Version 2 に記 +# 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア +# を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, +# 利用と呼ぶ)することを無償で許諾する. +# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 +# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー +# スコード中に含まれていること. +# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 +# 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 +# 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 +# の無保証規定を掲載すること. +# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 +# 用できない形で再配布する場合には,次のいずれかの条件を満たすこ +# と. +# (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 +# 作権表示,この利用条件および下記の無保証規定を掲載すること. +# (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに +# 報告すること. +# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 +# 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. +# +# 本ソフトウェアは,無保証で提供されているものである.上記著作権者お +# よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も +# 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 +# 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. +# +# @(#) $Id: genrename,v 1.2 2012/06/17 00:24:19 suikan Exp $ +# + +# +# リネーム定義を生成する +# +sub generate_define +{ + local($sym, $prefix) = @_; + + print FILE "#define ",$prefix,$sym; + print FILE "\t" if (length($prefix.$sym) < 8); + print FILE "\t" if (length($prefix.$sym) < 16); + print FILE "\t",$prefix,"_kernel_",$sym,"\n"; +} + +# +# リネーム解除を生成する +# +sub generate_undef +{ + local($sym, $prefix) = @_; + + print FILE "#undef ",$prefix,$sym,"\n"; +} + +# +# エラーチェック +# +if ($#ARGV != 0) { + die "Usage: genrename \n"; +} + +# +# 初期化 +# +@syms = (); +$name = $ARGV[0]; +$NAME = $name; $NAME =~ y/a-z/A-Z/; + +$infile = $name."_rename.def"; +$defsym_rename = "_".$NAME."_RENAME_H_"; +$defsym_unrename = "_".$NAME."_UNRENAME_H_"; + +# +# シンボルリストを読み込む +# +open(INFILE, $infile) || die "Cannot open $infile"; +while ($line = ) { + chomp $line; + @syms = (@syms, $line); +} +close(INFILE); + +# +# ???_rename.h を生成する +# +$file = $name."_rename.h"; +open(FILE, "> ".$file); + +print FILE < ".$file); + +print FILE < Cコンパイラのコマンド名 +# -O Cコンパイラ/CPPに渡すオプション +# +# -X ソースファイルを強制的にCヘッダファイルと見なす +# +# -T ターゲットのファイル名 +# -D ターゲットのディレクトリ名を指定する +# -d ターゲットのディレクトリ部を保持する +# -s ターゲットのサフィックスを ".s" にする(デフォルトは ".o") + +# +# オプションの処理 +# +Getopt("COTD"); + +$cc_path = $opt_C; +$cc_opts = $opt_O; + +$suffix = $opt_s ? "s" : "o"; +if ($opt_T) { + $target_file = $opt_T; +} +elsif ($opt_D) { + $target_dir = $opt_D; +} +elsif (!$opt_d) { + $target_dir = ""; +} + +# +# %dependlist に作られた依存関係を出力する +# +sub output_dependlist { + local($file) = @_; + local($target, $column, $len); + + if ($target_file) { + $target = $target_file; + } + else { + $target = $file; + $target =~ s/(.*)\.(.)/$1.$suffix/; + } + if (defined($target_dir)) { + $target =~ s/^.*\/([^\/]+)$/$1/; + if ($target_dir) { + $target = $target_dir."/".$target; + } + } + print $target, ": "; + $column = length($target) + 2; + + foreach $file (keys(%dependlist)) { + $len = length($file) + 1; + if ($column > 8 && $column + $len >= 70) { + print "\\\n\t"; + $column = 8; + } + $column += $len; + print "$file "; + } + print "\n"; +} + +# +# $file の依存関係を %dependlist に作る +# +sub makedepend_one { + local($file) = @_; + local($command, $input, $dir, $filename); + + $command = "$cc_path -E $cc_opts"; + if ($opt_X) { + $command .= " -x c-header"; + } + unless (open(INPUT, "$command $file |")) { + print STDERR "makedep: can't open $file\n"; + exit(1); + } + while ($line = ) { + if ($line =~ /^\#\s*([0-9]+)\s*\"([^\"]+)\"/) { + $filename = $2; +# $filename =~ s/ /\\ /; + $filename =~ s/ /\\ /g; + if ($filename !~ /^\<.*\>$/ && $filename !~ /\/$/) { + $dependlist{$filename} = 1; + } + } + } + unless (close(INPUT)) { + print STDERR "makedep: can't execute $command\n"; + exit(1); + } +} + +# +# メインルーチン +# +foreach $file (@ARGV) { + %dependlist = (); + makedepend_one($file); + output_dependlist($file) if (%dependlist); +} diff --git a/uzume_prototype/kernel/utils/rename b/uzume_prototype/kernel/utils/rename new file mode 100755 index 0000000..bae6e36 --- /dev/null +++ b/uzume_prototype/kernel/utils/rename @@ -0,0 +1,111 @@ +#! /usr/bin/perl +# +# TOPPERS/JSP Kernel +# Toyohashi Open Platform for Embedded Real-Time Systems/ +# Just Standard Profile Kernel +# +# Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory +# Toyohashi Univ. of Technology, JAPAN +# Copyright (C) 2004 by Embedded and Real-Time Systems Laboratory +# Graduate School of Information Science, Nagoya Univ., JAPAN +# +# 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation +# によって公表されている GNU General Public License の Version 2 に記 +# 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア +# を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, +# 利用と呼ぶ)することを無償で許諾する. +# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 +# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー +# スコード中に含まれていること. +# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 +# 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 +# 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 +# の無保証規定を掲載すること. +# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 +# 用できない形で再配布する場合には,次のいずれかの条件を満たすこ +# と. +# (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 +# 作権表示,この利用条件および下記の無保証規定を掲載すること. +# (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに +# 報告すること. +# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 +# 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. +# +# 本ソフトウェアは,無保証で提供されているものである.上記著作権者お +# よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も +# 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 +# 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. +# +# @(#) $Id: rename,v 1.2 2012/06/17 00:24:19 suikan Exp $ +# + +# +# ファイルにリネームを適用する +# +sub rename +{ + local($infile) = @_; + local($outfile) = $infile.".new"; + local($line); + + open(INFILE, "< ".$infile) || die; + open(OUTFILE, "> ".$outfile) || die; + + while ($line = ) { + $line =~ s/\b(_?)($syms)\b/$1_kernel_$2/gc; + print OUTFILE $line; + } + + close(INFILE); + close(OUTFILE); + + if (`diff $infile $outfile`) { + rename($infile, $infile.".bak"); + rename($outfile, $infile); + print STDERR "Modified: ",$infile,"\n"; + } + else { + unlink($outfile); + } +} + +# +# エラーチェック +# +if ($#ARGV < 1) { + die "Usage: rename \n"; +} + +# +# 初期化 +# +@syms = (); +$name = $ARGV[0]; + +# +# シンボルリストを読み込む +# +$deffile = $name."_rename.def"; +open(INFILE, $deffile) || die "Cannot open $deffile"; +while ($line = ) { + chomp $line; + if ($line ne "" && $line !~ /^#/) { + @syms = (@syms, $line) + } + +} +close(INFILE); + +$syms = join("|", @syms); +print STDERR $all_syms; + +# +# ファイルにリネームを適用する +# +shift @ARGV; +foreach $infile (@ARGV) { + # ファイルでなければスキップ + next unless (-f $infile); + + rename($infile) if ($infile ne $deffile); +} diff --git a/uzume_prototype/kernel_cfg.c b/uzume_prototype/kernel_cfg.c new file mode 100644 index 0000000..3382f0a --- /dev/null +++ b/uzume_prototype/kernel_cfg.c @@ -0,0 +1,184 @@ +/* Configured with [-s tmpfile1 -c -obj -cpu blackfin -system acb_bf592 ] */ + +#include "kernel_cfg.h" +#include "kernel_id.h" + +#if TKERNEL_PRVER >= 0x1040 +#define CFG_INTHDR_ENTRY(inthdr) INTHDR_ENTRY(inthdr) +#define CFG_EXCHDR_ENTRY(exchdr) EXCHDR_ENTRY(exchdr) +#define CFG_INT_ENTRY(inthdr) INT_ENTRY(inthdr) +#define CFG_EXC_ENTRY(exchdr) EXC_ENTRY(exchdr) +#else +#error "This configuration file has no compatibility with TOPPERS/JSP rel 1.3 or earlier." +#endif + +#ifndef __EMPTY_LABEL +#define __EMPTY_LABEL(x,y) x y[0] +#endif + +#if TKERNEL_PRID != 0x0001u /* TOPPERS/JSP */ +#error "You can not use this configuration file without TOPPERS/JSP" +#endif + + /* User specified include files*/ +#include "sample1.h" +#include "hw_timer.h" +#include "timer.h" +#include "hw_serial.h" +#include "serial.h" +#include "logtask.h" + + + /* Object initializer [task] */ + +#define TNUM_TSKID 5 + +const ID _kernel_tmax_tskid = (TMIN_TSKID + TNUM_TSKID - 1); + +static __STK_UNIT __stack_TASK1[__TCOUNT_STK_UNIT(1024)]; +static __STK_UNIT __stack_TASK2[__TCOUNT_STK_UNIT(1024)]; +static __STK_UNIT __stack_TASK3[__TCOUNT_STK_UNIT(1024)]; +static __STK_UNIT __stack_MAIN_TASK[__TCOUNT_STK_UNIT(1024)]; +static __STK_UNIT __stack_LOGTASK[__TCOUNT_STK_UNIT(LOGTASK_STACK_SIZE)]; + +const TINIB _kernel_tinib_table[TNUM_TSKID] = { + {0, (VP_INT)(( VP_INT ) 1), (FP)(task), INT_PRIORITY(10), __TROUND_STK_UNIT(1024), __stack_TASK1, 0, (FP)(tex_routine)}, + {0, (VP_INT)(( VP_INT ) 2), (FP)(task), INT_PRIORITY(10), __TROUND_STK_UNIT(1024), __stack_TASK2, 0, (FP)(tex_routine)}, + {0, (VP_INT)(( VP_INT ) 3), (FP)(task), INT_PRIORITY(10), __TROUND_STK_UNIT(1024), __stack_TASK3, 0, (FP)(tex_routine)}, + {0x00u | 0x02u, (VP_INT)(0), (FP)(main_task), INT_PRIORITY(5), __TROUND_STK_UNIT(1024), __stack_MAIN_TASK, TA_NULL, (FP)(NULL)}, + {0x00u | 0x02u, (VP_INT)(( VP_INT ) 1), (FP)(logtask), INT_PRIORITY(LOGTASK_PRIORITY), __TROUND_STK_UNIT(LOGTASK_STACK_SIZE), __stack_LOGTASK, TA_NULL, (FP)(NULL)} +}; + +const ID _kernel_torder_table[TNUM_TSKID] = {1,2,3,4,5}; + +TCB _kernel_tcb_table[TNUM_TSKID]; + + + /* Object initializer [semaphore] */ + +#define TNUM_SEMID 2 + +const ID _kernel_tmax_semid = (TMIN_SEMID + TNUM_SEMID - 1); + +const SEMINIB _kernel_seminib_table[TNUM_SEMID] = { + {1, 0, 1}, + {1, 1, 1} +}; + +SEMCB _kernel_semcb_table[TNUM_SEMID]; + + + /* Object initializer [eventflag] */ + +#define TNUM_FLGID 0 + +const ID _kernel_tmax_flgid = (TMIN_FLGID + TNUM_FLGID - 1); + +__EMPTY_LABEL(const FLGINIB, _kernel_flginib_table); +__EMPTY_LABEL(FLGCB, _kernel_flgcb_table); + + + /* Object initializer [dataqueue] */ + +#define TNUM_DTQID 0 + +const ID _kernel_tmax_dtqid = (TMIN_DTQID + TNUM_DTQID - 1); + +__EMPTY_LABEL(const DTQINIB, _kernel_dtqinib_table); +__EMPTY_LABEL(DTQCB, _kernel_dtqcb_table); + + + /* Object initializer [mailbox] */ + +#define TNUM_MBXID 0 + +const ID _kernel_tmax_mbxid = (TMIN_MBXID + TNUM_MBXID - 1); + +__EMPTY_LABEL(const MBXINIB, _kernel_mbxinib_table); +__EMPTY_LABEL(MBXCB, _kernel_mbxcb_table); + + + /* Object initializer [mempfix] */ + +#define TNUM_MPFID 0 + +const ID _kernel_tmax_mpfid = (TMIN_MPFID + TNUM_MPFID - 1); + +__EMPTY_LABEL(const MPFINIB, _kernel_mpfinib_table); +__EMPTY_LABEL(MPFCB, _kernel_mpfcb_table); + + + /* Object initializer [cyclic] */ + +#define TNUM_CYCID 1 + +const ID _kernel_tmax_cycid = (TMIN_CYCID + TNUM_CYCID - 1); + +const CYCINIB _kernel_cycinib_table[TNUM_CYCID] = { + {0,0,(FP)(cyclic_handler),2000,0} +}; + +CYCCB _kernel_cyccb_table[TNUM_CYCID]; + + + /* Object initializer [interrupt] */ + +#define TNUM_INHNO 3 + +const UINT _kernel_tnum_inhno = TNUM_INHNO; + +CFG_INTHDR_ENTRY(sio0_rx_handler); +CFG_INTHDR_ENTRY(sio0_tx_handler); +CFG_INTHDR_ENTRY(timer_handler); + +const INHINIB _kernel_inhinib_table[TNUM_INHNO] = { + {15,0,(FP)CFG_INT_ENTRY(sio0_rx_handler)}, + {16,0,(FP)CFG_INT_ENTRY(sio0_tx_handler)}, + {21,0,(FP)CFG_INT_ENTRY(timer_handler)} +}; + + + /* Object initializer [exception] */ + +#define TNUM_EXCNO 1 + +const UINT _kernel_tnum_excno = TNUM_EXCNO; + +CFG_EXCHDR_ENTRY(cpuexc_handler); + +const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = { + {0,0,(FP)CFG_EXC_ENTRY(cpuexc_handler)} +}; + + /* Initialization handler */ + +void +_kernel_call_inirtn(void) +{ + timer_initialize( (VP_INT)(0) ); + serial_initialize( (VP_INT)(0) ); +} + +void +_kernel_call_terrtn(void) +{ + timer_terminate( (VP_INT)(0) ); +} + + /* Object initialization routine */ + +void +_kernel_object_initialize(void) +{ + _kernel_task_initialize(); + _kernel_semaphore_initialize(); + _kernel_cyclic_initialize(); + _kernel_interrupt_initialize(); + _kernel_exception_initialize(); +} + +TMEVTN _kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID]; + + /* Variables for kernel checker */ +const UW _checker_magic_number = 0x01234567; + diff --git a/uzume_prototype/kernel_chk.c b/uzume_prototype/kernel_chk.c new file mode 100644 index 0000000..c7be3d1 --- /dev/null +++ b/uzume_prototype/kernel_chk.c @@ -0,0 +1,138 @@ +#include "jsp_kernel.h" +#include "logtask.h" +#include "timer.h" + +#define OBJECT(x,y) __asm("d" #x "," #y "@"); +#define MEMBER(x,y) __asm("s" #x "::" #y ",(%0),(%1)@" ::\ + "i"(sizeof(((struct x *)0)->y)), "i"(&((struct x *)0)->y)); +#define VAR(x) __asm("s" #x ",(%0),(0)@" :: "i"(sizeof(x))); +#define EVAR(x,y) __asm("s" #y ",(%0),(0)@" :: "i"(sizeof(x))); +#define SVAR(x) __asm("s" #x ",(%0),(0)@" :: "i"(sizeof(x[0]))); +#define DEFS(x) __asm("s" #x ",(%0),(0)@" :: "i"((unsigned long)x)); + +#include "queue.h" + +#include "task.h" +#include "semaphore.h" +#include "eventflag.h" +#include "dataqueue.h" +#include "mailbox.h" +#include "mempfix.h" +#include "cyclic.h" +#include "../kernel/exception.h" +#include "interrupt.h" +#include "wait.h" + +void checker_function(void) +{ + DEFS(TMAX_TPRI); + DEFS(TMIN_TPRI); + + DEFS(TMAX_MPRI); + DEFS(TMIN_MPRI); + + DEFS(TMAX_RELTIM); + + MEMBER(queue,next); + MEMBER(queue,prev); + + + /* task */ + + OBJECT(task_5,LOGTASK); + OBJECT(task_4,MAIN_TASK); + OBJECT(task_1,TASK1); + OBJECT(task_2,TASK2); + OBJECT(task_3,TASK3); + EVAR(ID,_kernel_tmax_tskid); + EVAR(TINIB,_kernel_tinib_table); + MEMBER(task_initialization_block,tskatr); + MEMBER(task_initialization_block,exinf); + MEMBER(task_initialization_block,task); + MEMBER(task_initialization_block,ipriority); + MEMBER(task_initialization_block,stksz); + MEMBER(task_initialization_block,stk); + MEMBER(task_initialization_block,texatr); + MEMBER(task_initialization_block,texrtn); + + + /* semaphore */ + + OBJECT(semaphore_1,SERIAL_RCV_SEM1); + OBJECT(semaphore_2,SERIAL_SND_SEM1); + EVAR(ID,_kernel_tmax_semid); + EVAR(SEMINIB,_kernel_seminib_table); + MEMBER(semaphore_initialization_block,sematr); + MEMBER(semaphore_initialization_block,isemcnt); + MEMBER(semaphore_initialization_block,maxsem); + + + /* eventflag */ + + EVAR(ID,_kernel_tmax_flgid); + EVAR(FLGINIB,_kernel_flginib_table); + MEMBER(eventflag_initialization_block,flgatr); + MEMBER(eventflag_initialization_block,iflgptn); + + + /* dataqueue */ + + EVAR(ID,_kernel_tmax_dtqid); + EVAR(DTQINIB,_kernel_dtqinib_table); + MEMBER(dataqueue_initialization_block,dtqatr); + MEMBER(dataqueue_initialization_block,dtqcnt); + MEMBER(dataqueue_initialization_block,dtq); + + + /* mailbox */ + + EVAR(ID,_kernel_tmax_mbxid); + EVAR(MBXINIB,_kernel_mbxinib_table); + MEMBER(mailbox_initialization_block,mbxatr); + MEMBER(mailbox_initialization_block,maxmpri); + + + /* mempfix */ + + EVAR(ID,_kernel_tmax_mpfid); + EVAR(MPFINIB,_kernel_mpfinib_table); + MEMBER(fixed_memorypool_initialization_block,mpfatr); + MEMBER(fixed_memorypool_initialization_block,blksz); + MEMBER(fixed_memorypool_initialization_block,mpf); + MEMBER(fixed_memorypool_initialization_block,limit); + + + /* cyclic */ + + OBJECT(cyclic_1,CYCHDR1); + EVAR(ID,_kernel_tmax_cycid); + EVAR(CYCINIB,_kernel_cycinib_table); + MEMBER(cyclic_handler_initialization_block,cycatr); + MEMBER(cyclic_handler_initialization_block,exinf); + MEMBER(cyclic_handler_initialization_block,cychdr); + MEMBER(cyclic_handler_initialization_block,cyctim); + MEMBER(cyclic_handler_initialization_block,cycphs); + + + /* interrupt */ + + OBJECT(interrupt_0,15); + OBJECT(interrupt_1,16); + OBJECT(interrupt_2,21); + EVAR(ID,_kernel_tnum_inhno); + EVAR(INHINIB,_kernel_inhinib_table); + MEMBER(interrupt_handler_initialization_block,inhno); + MEMBER(interrupt_handler_initialization_block,inhatr); + MEMBER(interrupt_handler_initialization_block,inthdr); + + + /* exception */ + + OBJECT(exception_0,0); + EVAR(ID,_kernel_tnum_excno); + EVAR(EXCINIB,_kernel_excinib_table); + MEMBER(cpu_exception_handler_initialization_block,excno); + MEMBER(cpu_exception_handler_initialization_block,excatr); + MEMBER(cpu_exception_handler_initialization_block,exchdr); + +} diff --git a/uzume_prototype/kernel_id.h b/uzume_prototype/kernel_id.h new file mode 100644 index 0000000..87dcd20 --- /dev/null +++ b/uzume_prototype/kernel_id.h @@ -0,0 +1,16 @@ +#ifndef KERNEL_ID_H +#define KERNEL_ID_H + + /* object identifier deifnition */ + +#define CYCHDR1 1 +#define LOGTASK 5 +#define MAIN_TASK 4 +#define SERIAL_RCV_SEM1 1 +#define SERIAL_SND_SEM1 2 +#define TASK1 1 +#define TASK2 2 +#define TASK3 3 + +#endif /* KERNEL_ID_H */ + diff --git a/uzume_prototype/kernel_obj.dat b/uzume_prototype/kernel_obj.dat new file mode 100644 index 0000000..97c8110 Binary files /dev/null and b/uzume_prototype/kernel_obj.dat differ diff --git a/uzume_prototype/makeoffset.s b/uzume_prototype/makeoffset.s new file mode 100644 index 0000000..9f6683f --- /dev/null +++ b/uzume_prototype/makeoffset.s @@ -0,0 +1,1134 @@ +.file "kernel/config/blackfin/makeoffset.c"; + .section .debug_abbrev,"",@progbits +.Ldebug_abbrev0: + .section .debug_info,"",@progbits +.Ldebug_info0: + .section .debug_line,"",@progbits +.Ldebug_line0: +.text; +.Ltext0: + .align 4 +.global _makeoffset; +.type _makeoffset, STT_FUNC; +_makeoffset: +.LFB30: + .file 1 "kernel/config/blackfin/makeoffset.c" + .loc 1 60 0 + nop; + nop; + LINK 0; +.LCFI0: + .loc 1 61 0 +// 61 "kernel/config/blackfin/makeoffset.c" 1 + OFFSET_DEF TCB_texptn = 16 +// 0 "" 2 + .loc 1 62 0 +// 62 "kernel/config/blackfin/makeoffset.c" 1 + OFFSET_DEF TCB_sp = 24 +// 0 "" 2 + .loc 1 63 0 +// 63 "kernel/config/blackfin/makeoffset.c" 1 + OFFSET_DEF TCB_pc = 28 +// 0 "" 2 + .loc 1 64 0 + UNLINK; + rts; +.LFE30: + .size _makeoffset, .-_makeoffset +.global _BIT_REF_4; +.data; + .align 4 + .type _BIT_REF_4, @object + .size _BIT_REF_4, 4 +_BIT_REF_4: + .long 305419896 +.global _BIT_REF_2; + .align 2 + .type _BIT_REF_2, @object + .size _BIT_REF_2, 2 +_BIT_REF_2: + .short 4660 +.global _BIT_REF_1; + .type _BIT_REF_1, @object + .size _BIT_REF_1, 1 +_BIT_REF_1: + .byte 18 +.global _BIT_LB_TCB_enatex; + .align 4 + .type _BIT_LB_TCB_enatex, @object + .size _BIT_LB_TCB_enatex, 32 +_BIT_LB_TCB_enatex: + .long 0 + .long 0 + .long 0 + .byte 0 + .byte 0 + .byte 4 + .zero 1 + .long 0 + .long 0 + .long 0 + .long 0 + .section .debug_frame,"",@progbits +.Lframe0: + .4byte .LECIE0-.LSCIE0 +.LSCIE0: + .4byte 0xffffffff + .byte 0x1 + .string "" + .uleb128 0x1 + .sleb128 -4 + .byte 0x23 + .byte 0xc + .uleb128 0xe + .uleb128 0x0 + .align 4 +.LECIE0: +.LSFDE0: + .4byte .LEFDE0-.LASFDE0 +.LASFDE0: + .4byte .Lframe0 + .4byte .LFB30 + .4byte .LFE30-.LFB30 + .byte 0x4 + .4byte .LCFI0-.LFB30 + .byte 0xc + .uleb128 0xf + .uleb128 0x8 + .byte 0x8f + .uleb128 0x2 + .byte 0xa3 + .uleb128 0x1 + .align 4 +.LEFDE0: +.text; +.Letext0: + .section .debug_loc,"",@progbits +.Ldebug_loc0: +.LLST0: + .4byte .LFB30-.Ltext0 + .4byte .LCFI0-.Ltext0 + .2byte 0x1 + .byte 0x5e + .4byte .LCFI0-.Ltext0 + .4byte .LFE30-.Ltext0 + .2byte 0x2 + .byte 0x7f + .sleb128 8 + .4byte 0x0 + .4byte 0x0 + .file 2 "kernel/include/itron.h" + .file 3 "/opt/uClinux2011R1RC4/bfin-elf/bin/../lib/gcc/bfin-elf/4.3.5/include/stddef.h" + .file 4 "kernel/include/kernel.h" + .file 5 "kernel/config/blackfin/cpu_config.h" + .file 6 "kernel/kernel/queue.h" + .file 7 "kernel/kernel/time_event.h" + .file 8 "kernel/kernel/task.h" + .section .debug_info + .4byte 0x3f8 + .2byte 0x2 + .4byte .Ldebug_abbrev0 + .byte 0x4 + .uleb128 0x1 + .4byte .LASF57 + .byte 0x1 + .4byte .LASF58 + .4byte .LASF59 + .4byte .Ltext0 + .4byte .Letext0 + .4byte .Ldebug_line0 + .uleb128 0x2 + .byte 0x4 + .byte 0x5 + .4byte .LASF0 + .uleb128 0x3 + .4byte .LASF3 + .byte 0x3 + .byte 0xd6 + .4byte 0x37 + .uleb128 0x2 + .byte 0x4 + .byte 0x7 + .4byte .LASF1 + .uleb128 0x4 + .byte 0x4 + .byte 0x5 + .string "int" + .uleb128 0x2 + .byte 0x1 + .byte 0x6 + .4byte .LASF2 + .uleb128 0x5 + .string "UB" + .byte 0x2 + .byte 0x61 + .4byte 0x56 + .uleb128 0x2 + .byte 0x1 + .byte 0x8 + .4byte .LASF4 + .uleb128 0x2 + .byte 0x1 + .byte 0x6 + .4byte .LASF5 + .uleb128 0x2 + .byte 0x2 + .byte 0x5 + .4byte .LASF6 + .uleb128 0x5 + .string "UH" + .byte 0x2 + .byte 0x67 + .4byte 0x75 + .uleb128 0x2 + .byte 0x2 + .byte 0x7 + .4byte .LASF7 + .uleb128 0x5 + .string "UW" + .byte 0x2 + .byte 0x6c + .4byte 0x86 + .uleb128 0x2 + .byte 0x4 + .byte 0x7 + .4byte .LASF8 + .uleb128 0x2 + .byte 0x8 + .byte 0x5 + .4byte .LASF9 + .uleb128 0x2 + .byte 0x8 + .byte 0x7 + .4byte .LASF10 + .uleb128 0x5 + .string "VP" + .byte 0x2 + .byte 0x75 + .4byte 0xa5 + .uleb128 0x6 + .byte 0x4 + .uleb128 0x5 + .string "FP" + .byte 0x2 + .byte 0x76 + .4byte 0xb1 + .uleb128 0x7 + .byte 0x4 + .4byte 0xb7 + .uleb128 0x8 + .4byte 0xbe + .uleb128 0x9 + .byte 0x0 + .uleb128 0x5 + .string "INT" + .byte 0x2 + .byte 0x78 + .4byte 0x3e + .uleb128 0x3 + .4byte .LASF11 + .byte 0x2 + .byte 0x79 + .4byte 0x86 + .uleb128 0x5 + .string "ER" + .byte 0x2 + .byte 0x7e + .4byte 0xbe + .uleb128 0x5 + .string "ATR" + .byte 0x2 + .byte 0x80 + .4byte 0xc9 + .uleb128 0x3 + .4byte .LASF12 + .byte 0x2 + .byte 0x84 + .4byte 0x2c + .uleb128 0x3 + .4byte .LASF13 + .byte 0x2 + .byte 0x88 + .4byte 0x7c + .uleb128 0x3 + .4byte .LASF14 + .byte 0x2 + .byte 0x8d + .4byte 0x9b + .uleb128 0xa + .byte 0x4 + .byte 0x7 + .uleb128 0x3 + .4byte .LASF15 + .byte 0x4 + .byte 0x65 + .4byte 0xc9 + .uleb128 0xb + .4byte .LASF17 + .byte 0x8 + .byte 0x5 + .byte 0x99 + .4byte 0x13f + .uleb128 0xc + .string "sp" + .byte 0x5 + .byte 0x9a + .4byte 0x9b + .byte 0x2 + .byte 0x23 + .uleb128 0x0 + .uleb128 0xc + .string "pc" + .byte 0x5 + .byte 0x9b + .4byte 0xa7 + .byte 0x2 + .byte 0x23 + .uleb128 0x4 + .byte 0x0 + .uleb128 0x3 + .4byte .LASF16 + .byte 0x5 + .byte 0x9c + .4byte 0x118 + .uleb128 0xb + .4byte .LASF18 + .byte 0x8 + .byte 0x6 + .byte 0x38 + .4byte 0x173 + .uleb128 0xd + .4byte .LASF19 + .byte 0x6 + .byte 0x39 + .4byte 0x173 + .byte 0x2 + .byte 0x23 + .uleb128 0x0 + .uleb128 0xd + .4byte .LASF20 + .byte 0x6 + .byte 0x3a + .4byte 0x173 + .byte 0x2 + .byte 0x23 + .uleb128 0x4 + .byte 0x0 + .uleb128 0x7 + .byte 0x4 + .4byte 0x14a + .uleb128 0x3 + .4byte .LASF21 + .byte 0x6 + .byte 0x3b + .4byte 0x14a + .uleb128 0x3 + .4byte .LASF22 + .byte 0x7 + .byte 0x40 + .4byte 0x18f + .uleb128 0x7 + .byte 0x4 + .4byte 0x195 + .uleb128 0xe + .byte 0x1 + .4byte 0x1a1 + .uleb128 0xf + .4byte 0x9b + .byte 0x0 + .uleb128 0xb + .4byte .LASF23 + .byte 0xc + .byte 0x7 + .byte 0x42 + .4byte 0x1d8 + .uleb128 0xd + .4byte .LASF24 + .byte 0x7 + .byte 0x43 + .4byte 0xc9 + .byte 0x2 + .byte 0x23 + .uleb128 0x0 + .uleb128 0xd + .4byte .LASF25 + .byte 0x7 + .byte 0x44 + .4byte 0x184 + .byte 0x2 + .byte 0x23 + .uleb128 0x4 + .uleb128 0xc + .string "arg" + .byte 0x7 + .byte 0x45 + .4byte 0x9b + .byte 0x2 + .byte 0x23 + .uleb128 0x8 + .byte 0x0 + .uleb128 0x3 + .4byte .LASF26 + .byte 0x7 + .byte 0x46 + .4byte 0x1a1 + .uleb128 0x7 + .byte 0x4 + .4byte 0x1d8 + .uleb128 0x10 + .4byte .LASF60 + .byte 0x4 + .byte 0x8 + .byte 0x82 + .4byte 0x20c + .uleb128 0x11 + .4byte .LASF27 + .byte 0x8 + .byte 0x83 + .4byte 0xd4 + .uleb128 0x11 + .4byte .LASF28 + .byte 0x8 + .byte 0x84 + .4byte 0x1e3 + .byte 0x0 + .uleb128 0x3 + .4byte .LASF29 + .byte 0x8 + .byte 0x85 + .4byte 0x1e9 + .uleb128 0xb + .4byte .LASF30 + .byte 0x20 + .byte 0x8 + .byte 0x94 + .4byte 0x294 + .uleb128 0xd + .4byte .LASF31 + .byte 0x8 + .byte 0x95 + .4byte 0xde + .byte 0x2 + .byte 0x23 + .uleb128 0x0 + .uleb128 0xd + .4byte .LASF32 + .byte 0x8 + .byte 0x96 + .4byte 0xff + .byte 0x2 + .byte 0x23 + .uleb128 0x4 + .uleb128 0xd + .4byte .LASF33 + .byte 0x8 + .byte 0x97 + .4byte 0xa7 + .byte 0x2 + .byte 0x23 + .uleb128 0x8 + .uleb128 0xd + .4byte .LASF34 + .byte 0x8 + .byte 0x98 + .4byte 0xc9 + .byte 0x2 + .byte 0x23 + .uleb128 0xc + .uleb128 0xd + .4byte .LASF35 + .byte 0x8 + .byte 0x99 + .4byte 0xe9 + .byte 0x2 + .byte 0x23 + .uleb128 0x10 + .uleb128 0xc + .string "stk" + .byte 0x8 + .byte 0x9a + .4byte 0x9b + .byte 0x2 + .byte 0x23 + .uleb128 0x14 + .uleb128 0xd + .4byte .LASF36 + .byte 0x8 + .byte 0x9c + .4byte 0xde + .byte 0x2 + .byte 0x23 + .uleb128 0x18 + .uleb128 0xd + .4byte .LASF37 + .byte 0x8 + .byte 0x9d + .4byte 0xa7 + .byte 0x2 + .byte 0x23 + .uleb128 0x1c + .byte 0x0 + .uleb128 0x3 + .4byte .LASF38 + .byte 0x8 + .byte 0x9e + .4byte 0x217 + .uleb128 0xb + .4byte .LASF39 + .byte 0x20 + .byte 0x8 + .byte 0xb7 + .4byte 0x347 + .uleb128 0xd + .4byte .LASF40 + .byte 0x8 + .byte 0xb8 + .4byte 0x179 + .byte 0x2 + .byte 0x23 + .uleb128 0x0 + .uleb128 0xd + .4byte .LASF41 + .byte 0x8 + .byte 0xb9 + .4byte 0x347 + .byte 0x2 + .byte 0x23 + .uleb128 0x8 + .uleb128 0x12 + .4byte .LASF42 + .byte 0x8 + .byte 0xbb + .4byte 0x86 + .byte 0x4 + .byte 0x8 + .byte 0x18 + .byte 0x2 + .byte 0x23 + .uleb128 0xc + .uleb128 0x12 + .4byte .LASF43 + .byte 0x8 + .byte 0xbc + .4byte 0x86 + .byte 0x4 + .byte 0x8 + .byte 0x10 + .byte 0x2 + .byte 0x23 + .uleb128 0xc + .uleb128 0x12 + .4byte .LASF44 + .byte 0x8 + .byte 0xbe + .4byte 0x86 + .byte 0x4 + .byte 0x1 + .byte 0xf + .byte 0x2 + .byte 0x23 + .uleb128 0xc + .uleb128 0x12 + .4byte .LASF45 + .byte 0x8 + .byte 0xbf + .4byte 0x86 + .byte 0x4 + .byte 0x1 + .byte 0xe + .byte 0x2 + .byte 0x23 + .uleb128 0xc + .uleb128 0x12 + .4byte .LASF46 + .byte 0x8 + .byte 0xc0 + .4byte 0x86 + .byte 0x4 + .byte 0x1 + .byte 0xd + .byte 0x2 + .byte 0x23 + .uleb128 0xc + .uleb128 0xd + .4byte .LASF47 + .byte 0x8 + .byte 0xc2 + .4byte 0x10d + .byte 0x2 + .byte 0x23 + .uleb128 0x10 + .uleb128 0xd + .4byte .LASF48 + .byte 0x8 + .byte 0xc3 + .4byte 0x352 + .byte 0x2 + .byte 0x23 + .uleb128 0x14 + .uleb128 0xd + .4byte .LASF49 + .byte 0x8 + .byte 0xc4 + .4byte 0x13f + .byte 0x2 + .byte 0x23 + .uleb128 0x18 + .byte 0x0 + .uleb128 0x7 + .byte 0x4 + .4byte 0x34d + .uleb128 0x13 + .4byte 0x294 + .uleb128 0x7 + .byte 0x4 + .4byte 0x20c + .uleb128 0x5 + .string "TCB" + .byte 0x8 + .byte 0xc5 + .4byte 0x29f + .uleb128 0x14 + .byte 0x1 + .4byte .LASF61 + .byte 0x1 + .byte 0x3c + .4byte .LFB30 + .4byte .LFE30 + .4byte .LLST0 + .uleb128 0x15 + .4byte 0x384 + .4byte 0x382 + .uleb128 0x16 + .byte 0x0 + .uleb128 0x17 + .byte 0x1 + .uleb128 0x7 + .byte 0x4 + .4byte 0x382 + .uleb128 0x18 + .4byte .LASF50 + .byte 0x5 + .2byte 0x12e + .4byte 0x377 + .byte 0x1 + .byte 0x1 + .uleb128 0x18 + .4byte .LASF51 + .byte 0x5 + .2byte 0x130 + .4byte 0x18f + .byte 0x1 + .byte 0x1 + .uleb128 0x19 + .4byte .LASF52 + .byte 0x7 + .byte 0x65 + .4byte 0xf4 + .byte 0x1 + .byte 0x1 + .uleb128 0x1a + .4byte .LASF53 + .byte 0x1 + .byte 0x42 + .4byte 0x7c + .byte 0x1 + .byte 0x5 + .byte 0x3 + .4byte _BIT_REF_4 + .uleb128 0x1a + .4byte .LASF54 + .byte 0x1 + .byte 0x43 + .4byte 0x6b + .byte 0x1 + .byte 0x5 + .byte 0x3 + .4byte _BIT_REF_2 + .uleb128 0x1a + .4byte .LASF55 + .byte 0x1 + .byte 0x44 + .4byte 0x4c + .byte 0x1 + .byte 0x5 + .byte 0x3 + .4byte _BIT_REF_1 + .uleb128 0x1a + .4byte .LASF56 + .byte 0x1 + .byte 0x46 + .4byte 0x358 + .byte 0x1 + .byte 0x5 + .byte 0x3 + .4byte _BIT_LB_TCB_enatex + .byte 0x0 + .section .debug_abbrev + .uleb128 0x1 + .uleb128 0x11 + .byte 0x1 + .uleb128 0x25 + .uleb128 0xe + .uleb128 0x13 + .uleb128 0xb + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x1b + .uleb128 0xe + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x1 + .uleb128 0x10 + .uleb128 0x6 + .byte 0x0 + .byte 0x0 + .uleb128 0x2 + .uleb128 0x24 + .byte 0x0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3e + .uleb128 0xb + .uleb128 0x3 + .uleb128 0xe + .byte 0x0 + .byte 0x0 + .uleb128 0x3 + .uleb128 0x16 + .byte 0x0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0x0 + .byte 0x0 + .uleb128 0x4 + .uleb128 0x24 + .byte 0x0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3e + .uleb128 0xb + .uleb128 0x3 + .uleb128 0x8 + .byte 0x0 + .byte 0x0 + .uleb128 0x5 + .uleb128 0x16 + .byte 0x0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0x0 + .byte 0x0 + .uleb128 0x6 + .uleb128 0xf + .byte 0x0 + .uleb128 0xb + .uleb128 0xb + .byte 0x0 + .byte 0x0 + .uleb128 0x7 + .uleb128 0xf + .byte 0x0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0x0 + .byte 0x0 + .uleb128 0x8 + .uleb128 0x15 + .byte 0x1 + .uleb128 0x1 + .uleb128 0x13 + .byte 0x0 + .byte 0x0 + .uleb128 0x9 + .uleb128 0x18 + .byte 0x0 + .byte 0x0 + .byte 0x0 + .uleb128 0xa + .uleb128 0x24 + .byte 0x0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3e + .uleb128 0xb + .byte 0x0 + .byte 0x0 + .uleb128 0xb + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0x0 + .byte 0x0 + .uleb128 0xc + .uleb128 0xd + .byte 0x0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xa + .byte 0x0 + .byte 0x0 + .uleb128 0xd + .uleb128 0xd + .byte 0x0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xa + .byte 0x0 + .byte 0x0 + .uleb128 0xe + .uleb128 0x15 + .byte 0x1 + .uleb128 0x27 + .uleb128 0xc + .uleb128 0x1 + .uleb128 0x13 + .byte 0x0 + .byte 0x0 + .uleb128 0xf + .uleb128 0x5 + .byte 0x0 + .uleb128 0x49 + .uleb128 0x13 + .byte 0x0 + .byte 0x0 + .uleb128 0x10 + .uleb128 0x17 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0x0 + .byte 0x0 + .uleb128 0x11 + .uleb128 0xd + .byte 0x0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0x0 + .byte 0x0 + .uleb128 0x12 + .uleb128 0xd + .byte 0x0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0xb + .uleb128 0xb + .uleb128 0xd + .uleb128 0xb + .uleb128 0xc + .uleb128 0xb + .uleb128 0x38 + .uleb128 0xa + .byte 0x0 + .byte 0x0 + .uleb128 0x13 + .uleb128 0x26 + .byte 0x0 + .uleb128 0x49 + .uleb128 0x13 + .byte 0x0 + .byte 0x0 + .uleb128 0x14 + .uleb128 0x2e + .byte 0x0 + .uleb128 0x3f + .uleb128 0xc + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x1 + .uleb128 0x40 + .uleb128 0x6 + .byte 0x0 + .byte 0x0 + .uleb128 0x15 + .uleb128 0x1 + .byte 0x1 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x1 + .uleb128 0x13 + .byte 0x0 + .byte 0x0 + .uleb128 0x16 + .uleb128 0x21 + .byte 0x0 + .byte 0x0 + .byte 0x0 + .uleb128 0x17 + .uleb128 0x15 + .byte 0x0 + .uleb128 0x27 + .uleb128 0xc + .byte 0x0 + .byte 0x0 + .uleb128 0x18 + .uleb128 0x34 + .byte 0x0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0xc + .uleb128 0x3c + .uleb128 0xc + .byte 0x0 + .byte 0x0 + .uleb128 0x19 + .uleb128 0x34 + .byte 0x0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0xc + .uleb128 0x3c + .uleb128 0xc + .byte 0x0 + .byte 0x0 + .uleb128 0x1a + .uleb128 0x34 + .byte 0x0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0xc + .uleb128 0x2 + .uleb128 0xa + .byte 0x0 + .byte 0x0 + .byte 0x0 + .section .debug_pubnames,"",@progbits + .4byte 0x5d + .2byte 0x2 + .4byte .Ldebug_info0 + .4byte 0x3fc + .4byte 0x363 + .string "makeoffset" + .4byte 0x3b3 + .string "BIT_REF_4" + .4byte 0x3c5 + .string "BIT_REF_2" + .4byte 0x3d7 + .string "BIT_REF_1" + .4byte 0x3e9 + .string "BIT_LB_TCB_enatex" + .4byte 0x0 + .section .debug_aranges,"",@progbits + .4byte 0x1c + .2byte 0x2 + .4byte .Ldebug_info0 + .byte 0x4 + .byte 0x0 + .2byte 0x0 + .2byte 0x0 + .4byte .Ltext0 + .4byte .Letext0-.Ltext0 + .4byte 0x0 + .4byte 0x0 + .section .debug_str,"MS",@progbits,1 +.LASF12: + .string "SIZE" +.LASF57: + .string "GNU C 4.3.5" +.LASF16: + .string "CTXB" +.LASF27: + .string "wercd" +.LASF6: + .string "short int" +.LASF3: + .string "size_t" +.LASF53: + .string "BIT_REF_4" +.LASF14: + .string "VP_INT" +.LASF40: + .string "task_queue" +.LASF28: + .string "tmevtb" +.LASF47: + .string "texptn" +.LASF41: + .string "tinib" +.LASF33: + .string "task" +.LASF38: + .string "TINIB" +.LASF32: + .string "exinf" +.LASF50: + .string "_kernel_dev_vector" +.LASF60: + .string "waiting_information" +.LASF24: + .string "index" +.LASF17: + .string "task_context_block" +.LASF31: + .string "tskatr" +.LASF39: + .string "task_control_block" +.LASF22: + .string "CBACK" +.LASF9: + .string "long long int" +.LASF49: + .string "tskctxb" +.LASF46: + .string "enatex" +.LASF0: + .string "long int" +.LASF11: + .string "UINT" +.LASF61: + .string "makeoffset" +.LASF45: + .string "wupcnt" +.LASF48: + .string "winfo" +.LASF18: + .string "queue" +.LASF29: + .string "WINFO" +.LASF21: + .string "QUEUE" +.LASF4: + .string "unsigned char" +.LASF2: + .string "signed char" +.LASF10: + .string "long long unsigned int" +.LASF13: + .string "SYSTIM" +.LASF8: + .string "unsigned int" +.LASF7: + .string "short unsigned int" +.LASF5: + .string "char" +.LASF43: + .string "priority" +.LASF15: + .string "TEXPTN" +.LASF36: + .string "texatr" +.LASF51: + .string "_kernel_exc_vector" +.LASF35: + .string "stksz" +.LASF37: + .string "texrtn" +.LASF1: + .string "long unsigned int" +.LASF34: + .string "ipriority" +.LASF59: + .string "/home/takemasa/gits/uzume_prototype.git/uzume_prototype" +.LASF44: + .string "actcnt" +.LASF52: + .string "_kernel_next_time" +.LASF30: + .string "task_initialization_block" +.LASF26: + .string "TMEVTB" +.LASF23: + .string "time_event_block" +.LASF55: + .string "BIT_REF_1" +.LASF54: + .string "BIT_REF_2" +.LASF20: + .string "prev" +.LASF42: + .string "tstat" +.LASF58: + .string "kernel/config/blackfin/makeoffset.c" +.LASF56: + .string "BIT_LB_TCB_enatex" +.LASF19: + .string "next" +.LASF25: + .string "callback" + .ident "GCC: (ADI-2011R1-RC4) 4.3.5" diff --git a/uzume_prototype/offset.h b/uzume_prototype/offset.h new file mode 100644 index 0000000..e2bd940 --- /dev/null +++ b/uzume_prototype/offset.h @@ -0,0 +1,8 @@ +/* This file is generated by genoffset. */ + +#define TCB_texptn 16 +#define TCB_sp 24 +#define TCB_pc 28 +#define TCB_enatex 14 +#define TCB_enatex_bit 2 +#define TCB_enatex_mask 0x4 diff --git a/uzume_prototype/offset.h.u1conflict b/uzume_prototype/offset.h.u1conflict new file mode 100644 index 0000000..e2bd940 --- /dev/null +++ b/uzume_prototype/offset.h.u1conflict @@ -0,0 +1,8 @@ +/* This file is generated by genoffset. */ + +#define TCB_texptn 16 +#define TCB_sp 24 +#define TCB_pc 28 +#define TCB_enatex 14 +#define TCB_enatex_bit 2 +#define TCB_enatex_mask 0x4 diff --git a/uzume_prototype/sample1.c b/uzume_prototype/sample1.c new file mode 100644 index 0000000..007ac04 --- /dev/null +++ b/uzume_prototype/sample1.c @@ -0,0 +1,417 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2004-2006 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: sample1.c,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * サンプルプログラム(1)の本体 + * + * JSPカーネルの基本的な動作を確認するためのサンプルプログラム. + * + * プログラムの概要: + * + * ユーザインタフェースを受け持つメインタスク(タスクID: MAIN_TASK, + * 優先度: MAIN_PRIORITY)と,三つの並列実行されるタスク(タスクID: + * TASK1〜TASK3,初期優先度: MID_PRIORITY)で構成される.また,起動周 + * 期が2秒の周期ハンドラ(周期ハンドラID: CYCHDR1)を用いる. + * + * 並列実行されるタスクは,task_loop 回空ループを実行する度に,タスク + * が実行中であることをあらわすメッセージを表示する. + * + * 周期ハンドラは,三つの優先度(HIGH_PRIORITY,MID_PRIORITY, + * LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は, + * 周期ハンドラは停止状態になっている. + * + * メインタスクは,シリアルI/Oポートからの文字入力を行い(文字入力を + * 待っている間は,並列実行されるタスクが実行されている),入力された + * 文字に対応した処理を実行する.入力された文字と処理の関係は次の通り. + * Control-C または 'Q' が入力されると,プログラムを終了する. + * + * '1' : 以降のコマンドは TASK1 に対して行う. + * '2' : 以降のコマンドは TASK2 に対して行う. + * '3' : 以降のコマンドは TASK3 に対して行う. + * 'a' : タスクを act_tsk により起動する. + * 'A' : タスクに対する起動要求を can_act によりキャンセルする. + * 'e' : タスクに ext_tsk を呼び出させ,終了させる. + * 't' : タスクを ter_tsk により強制終了する. + * '>' : タスクの優先度を HIGH_PRIORITY にする. + * '=' : タスクの優先度を MID_PRIORITY にする. + * '<' : タスクの優先度を LOW_PRIORITY にする. + * 'G' : タスクの優先度を get_pri で読み出す. + * 's' : タスクに slp_tsk を呼び出させ,起床待ちにさせる. + * 'S' : タスクに tslp_tsk(10秒) を呼び出させ,起床待ちにさせる. + * 'w' : タスクを wup_tsk により起床する. + * 'W' : タスクに対する起床要求を can_wup によりキャンセルする. + * 'l' : タスクを rel_wai により強制的に待ち解除にする. + * 'u' : タスクを sus_tsk により強制待ち状態にする. + * 'm' : タスクの強制待ち状態を rsm_tsk により解除する. + * 'M' : タスクの強制待ち状態を frsm_tsk により強制解除する. + * 'd' : タスクに dly_tsk(10秒) を呼び出させ,時間経過待ちにさせる. + * 'x' : タスクにパターン 0x0001 の例外処理を要求する. + * 'X' : タスクにパターン 0x0002 の例外処理を要求する. + * 'y' : タスクに dis_tex を呼び出させ,タスク例外を禁止する. + * 'Y' : タスクに ena_tex を呼び出させ,タスク例外を許可する. + * 'r' : 三つの優先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)の + * レディキューを回転させる. + * 'c' : 周期ハンドラを動作させる. + * 'C' : 周期ハンドラを停止させる. + * 'z' : CPU例外を発生させる. + * 'Z' : CPUロック状態でCPU例外を発生させる(プログラムを終了する). + * 'V' : vxget_tim で性能評価用システム時刻を2回読む. + * 'v' : 発行したシステムコールを表示する(デフォルト). + * 'q' : 発行したシステムコールを表示しない. + */ + +#include +#include "kernel_id.h" +#include "sample1.h" + +/* + * 並行実行されるタスクへのメッセージ領域 + */ +char message[3]; + +/* + * ループ回数 + */ +UW task_loop; /* タスク内でのループ回数 */ +UW tex_loop; /* 例外処理ルーチン内でのループ回数 */ + +/* + * 並行実行されるタスク + */ +void task(VP_INT exinf) +{ + volatile UW i; + INT n = 0; + INT tskno = (INT) exinf; + const char *graph[] = { "|", " +", " *" }; + char c; + + ena_tex(); + while (1) { + syslog(LOG_NOTICE, "task%d is running (%03d). %s", + tskno, ++n, graph[tskno-1]); + for (i = 0; i < task_loop; i++); + c = message[tskno-1]; + message[tskno-1] = 0; + switch (c) { + case 'e': + syslog(LOG_INFO, "#%d#ext_tsk()", tskno); + ext_tsk(); + case 's': + syslog(LOG_INFO, "#%d#slp_tsk()", tskno); + syscall(slp_tsk()); + break; + case 'S': + syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno); + syscall(tslp_tsk(10000)); + break; + case 'd': + syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno); + syscall(dly_tsk(10000)); + break; + case 'y': + syslog(LOG_INFO, "#%d#dis_tex()", tskno); + syscall(dis_tex()); + break; + case 'Y': + syslog(LOG_INFO, "#%d#ena_tex()", tskno); + syscall(ena_tex()); + break; +#ifdef CPUEXC1 + case 'z': + syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); + RAISE_CPU_EXCEPTION; + break; + case 'Z': + loc_cpu(); + syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); + RAISE_CPU_EXCEPTION; + unl_cpu(); + break; +#endif /* CPUEXC1 */ + default: + break; + } + } +} + +/* + * 並行して実行されるタスク用のタスク例外処理ルーチン + */ +void tex_routine(TEXPTN texptn, VP_INT exinf) +{ + volatile UW i; + INT tskno = (INT) exinf; + + syslog(LOG_NOTICE, "task%d receives exception 0x%04x. ", + tskno, texptn); + for (i = 0; i < tex_loop; i++); + + if (texptn & 0x8000) { + syslog(LOG_INFO, "#%d#ext_tsk()", tskno); + ext_tsk(); + } +} + +/* + * CPU例外ハンドラ + */ +#ifdef CPUEXC1 + +void +cpuexc_handler(VP p_excinf) +{ + ID tskid; + + syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", + p_excinf); + if (sns_ctx() != TRUE) { + syslog(LOG_WARNING, + "sns_ctx() is not TRUE in CPU exception handler."); + } + if (sns_dpn() != TRUE) { + syslog(LOG_WARNING, + "sns_dpn() is not TRUE in CPU exception handler."); + } + syslog(LOG_DEBUG, + "sns_loc = %d sns_dsp = %d", sns_loc(), sns_dsp()); + syslog(LOG_DEBUG, + "vxsns_loc = %d vxsns_ctx = %d vxsns_dsp = %d vxsns_dpn = %d", + vxsns_loc(p_excinf), vxsns_ctx(p_excinf), + vxsns_dsp(p_excinf), vxsns_dpn(p_excinf)); + + if (!vxsns_loc(p_excinf) && !vxsns_ctx(p_excinf)) { + syscall(iget_tid(&tskid)); + syscall(iras_tex(tskid, 0x8000)); + } + else { + syslog(LOG_NOTICE, "Sample program ends with exception."); + kernel_exit(); + } +} + +#endif /* CPUEXC1 */ + +/* + * 周期ハンドラ + * + * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー + * を回転させる. + */ +void cyclic_handler(VP_INT exinf) +{ + irot_rdq(HIGH_PRIORITY); + irot_rdq(MID_PRIORITY); + irot_rdq(LOW_PRIORITY); +} + +/* + * メインタスク + */ +void main_task(VP_INT exinf) +{ + char c; + ID tskid = TASK1; + volatile UW i; + INT tskno = 1; + ER_UINT ercd; + PRI tskpri; + SYSTIM stime1, stime2; +#ifndef OMIT_VGET_TIM + SYSUTIM utime1, utime2; +#endif /* OMIT_VGET_TIM */ + + vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); + syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (INT) exinf); + + syscall(serial_ctl_por(TASK_PORTID, + (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); + + /* + * ループ回数の設定 + */ + task_loop = LOOP_REF; + get_tim(&stime1); + for (i = 0; i < task_loop; i++); + get_tim(&stime2); + task_loop = LOOP_REF * 400 / (stime2 - stime1); + tex_loop = task_loop / 5; + + /* + * タスクの起動 + */ + act_tsk(TASK1); + act_tsk(TASK2); + act_tsk(TASK3); + + /* + * メインループ + */ + do { + syscall(serial_rea_dat(TASK_PORTID, &c, 1)); + switch (c) { + case 'e': + case 's': + case 'S': + case 'd': + case 'y': + case 'Y': + case 'z': + case 'Z': + message[tskno-1] = c; + break; + case '1': + tskno = 1; + tskid = TASK1; + break; + case '2': + tskno = 2; + tskid = TASK2; + break; + case '3': + tskno = 3; + tskid = TASK3; + break; + case 'a': + syslog(LOG_INFO, "#act_tsk(%d)", tskno); + syscall(act_tsk(tskid)); + break; + case 'A': + syslog(LOG_INFO, "#can_act(%d)", tskno); + syscall(ercd = can_act(tskid)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "can_act(%d) returns %d", + tskno, ercd); + } + break; + case 't': + syslog(LOG_INFO, "#ter_tsk(%d)", tskno); + syscall(ter_tsk(tskid)); + break; + case '>': + syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno); + chg_pri(tskid, HIGH_PRIORITY); + break; + case '=': + syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno); + chg_pri(tskid, MID_PRIORITY); + break; + case '<': + syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno); + chg_pri(tskid, LOW_PRIORITY); + break; + case 'G': + syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno); + syscall(ercd = get_pri(tskid, &tskpri)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "priority of task %d is %d", + tskno, tskpri); + } + break; + case 'w': + syslog(LOG_INFO, "#wup_tsk(%d)", tskno); + syscall(wup_tsk(tskid)); + break; + case 'W': + syslog(LOG_INFO, "#can_wup(%d)", tskno); + syscall(ercd = can_wup(tskid)); + if (ercd >= 0) { + syslog(LOG_NOTICE, "can_wup(%d) returns %d", + tskno, ercd); + } + break; + case 'l': + syslog(LOG_INFO, "#rel_wai(%d)", tskno); + syscall(rel_wai(tskid)); + break; + case 'u': + syslog(LOG_INFO, "#sus_tsk(%d)", tskno); + syscall(sus_tsk(tskid)); + break; + case 'm': + syslog(LOG_INFO, "#rsm_tsk(%d)", tskno); + syscall(rsm_tsk(tskid)); + break; + case 'M': + syslog(LOG_INFO, "#frsm_tsk(%d)", tskno); + syscall(frsm_tsk(tskid)); + break; + case 'x': + syslog(LOG_INFO, "#ras_tex(%d, 0x0001)", tskno); + syscall(ras_tex(tskid, 0x0001)); + break; + case 'X': + syslog(LOG_INFO, "#ras_tex(%d, 0x0002)", tskno); + syscall(ras_tex(tskid, 0x0002)); + break; + case 'r': + syslog(LOG_INFO, "#rot_rdq(three priorities)"); + rot_rdq(HIGH_PRIORITY); + rot_rdq(MID_PRIORITY); + rot_rdq(LOW_PRIORITY); + break; + case 'c': + sta_cyc(CYCHDR1); + break; + case 'C': + stp_cyc(CYCHDR1); + break; +#ifndef OMIT_VGET_TIM + case 'V': + syscall(vxget_tim(&utime1)); + syscall(vxget_tim(&utime2)); + syslog(LOG_NOTICE, "utime1 = %d, utime2 = %d", + (UINT) utime1, (UINT) utime2); + break; +#endif /* OMIT_VGET_TIM */ + case 'v': + vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); + break; + case 'q': + vmsk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG)); + break; + default: + break; + } + } while (c != '\003' && c != 'Q'); + + syslog(LOG_NOTICE, "Sample program ends."); + kernel_exit(); +} diff --git a/uzume_prototype/sample1.cfg b/uzume_prototype/sample1.cfg new file mode 100644 index 0000000..ac44bf0 --- /dev/null +++ b/uzume_prototype/sample1.cfg @@ -0,0 +1,28 @@ +/* + * @(#) $Id: sample1.cfg,v 1.1 2009/01/31 05:27:37 suikan Exp $ + */ + +/* + * サンプルプログラム(1)のシステムコンフィギュレーションファイル + */ + +#define _MACRO_ONLY +#include "sample1.h" + +INCLUDE("\"sample1.h\""); +CRE_TSK(TASK1, { TA_HLNG, (VP_INT) 1, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(TASK2, { TA_HLNG, (VP_INT) 2, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(TASK3, { TA_HLNG, (VP_INT) 3, task, MID_PRIORITY, STACK_SIZE, NULL }); +CRE_TSK(MAIN_TASK, { TA_HLNG|TA_ACT, 0, main_task, MAIN_PRIORITY, + STACK_SIZE, NULL }); +DEF_TEX(TASK1, { TA_HLNG, tex_routine }); +DEF_TEX(TASK2, { TA_HLNG, tex_routine }); +DEF_TEX(TASK3, { TA_HLNG, tex_routine }); +CRE_CYC(CYCHDR1, { TA_HLNG, 0, cyclic_handler, 2000, 0 }); +#ifdef CPUEXC1 +DEF_EXC(CPUEXC1, { TA_HLNG, cpuexc_handler} ); +#endif /* CPUEXC1 */ + +#include "kernel/systask/timer.cfg" +#include "kernel/systask/serial.cfg" +#include "kernel/systask/logtask.cfg" diff --git a/uzume_prototype/sample1.h b/uzume_prototype/sample1.h new file mode 100644 index 0000000..670844f --- /dev/null +++ b/uzume_prototype/sample1.h @@ -0,0 +1,215 @@ +/* + * TOPPERS/JSP Kernel + * Toyohashi Open Platform for Embedded Real-Time Systems/ + * Just Standard Profile Kernel + * + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory + * Toyohashi Univ. of Technology, JAPAN + * Copyright (C) 2005 by Embedded and Real-Time Systems Laboratory + * Graduate School of Information Science, Nagoya Univ., JAPAN + * + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation + * によって公表されている GNU General Public License の Version 2 に記 + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, + * 利用と呼ぶ)することを無償で許諾する. + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー + * スコード中に含まれていること. + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 + * の無保証規定を掲載すること. + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ + * と. + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 + * 作権表示,この利用条件および下記の無保証規定を掲載すること. + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに + * 報告すること. + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. + * + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. + * + * @(#) $Id: sample1.h,v 1.3 2009/05/13 13:10:13 suikan Exp $ + */ + +/* + * サンプルプログラム(1)のヘッダファイル + */ + +#include + +/* + * 各タスクの優先度の定義 + */ + +#define MAIN_PRIORITY 5 /* メインタスクの優先度 */ + /* HIGH_PRIORITY より高くすること */ + +#define HIGH_PRIORITY 9 /* 並列に実行されるタスクの優先度 */ +#define MID_PRIORITY 10 +#define LOW_PRIORITY 11 + +/* + * ターゲット依存の定義(CPU例外ハンドラの起動方法など) + */ + +#ifdef M68K + +#define CPUEXC1 5 /* ゼロ除算例外 */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) + +#elif defined(SH3) + +#define CPUEXC1 224 /* ロードエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) + +#elif defined(SH1) + +#define CPUEXC1 9 /* CPUアドレスエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) +#ifdef TOKIWA_SH1 +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#endif /* TOKIWA_SH1 */ + +#elif defined(ARMV4) + +#define CPUEXC1 4 /* ロードエラー例外 */ +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) + +#elif defined(V850) + +#elif defined(H8) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ + +#elif defined(H8S) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define LOOP_REF 4000L /* 速度計測用のループ回数 */ + +#elif defined(MICROBLAZE) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define STACK_SIZE 2048 /* タスクのスタックサイズ */ + +#elif defined(IA32) + +#define CPUEXC1 0 /* ゼロ除算例外 */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) +#define OMIT_VGET_TIM + +#elif defined(TMS320C54X) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define STACK_SIZE 320 /* タスクのスタックサイズ */ +#define LOOP_REF 500000L /* 速度計測用のループ回数 */ + +#elif defined(XSTORMY16) + +#define CPUEXC1 0 /* 無効命令例外 */ +#define RAISE_CPU_EXCEPTION __asm__( ".hword 0x0006" ) +#define OMIT_VGET_TIM /* vxget_tim()は非サポート */ +#define LOOP_REF 4000L /* 速度計測用のループ回数 */ +#define STACK_SIZE 256 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* SIOはポート2を用いる */ + +#elif defined(MIPS3) || defined(MIPS64) + +#define CPUEXC1 Bp /* ブレークポイント例外(ゼロ除算時に発生) */ +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) + +#elif defined(M16C) && defined(OAKS16) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ + +#elif defined(M16C) && defined(OAKS16_MINI) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 384 /* タスクのスタックサイズ */ +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ + +#elif defined(M16C) && defined(M3029) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(BLACKFIN) + +#define CPUEXC1 0 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm("excpt 0;") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 1024 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(LINUX) + +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ +#define OMIT_VGET_TIM +#define LOOP_REF 4000000 /* 速度計測用のループ回数 */ + +#elif defined(NIOS2) + +#define CPUEXC1 0 /* 未実装命令例外 */ +#define RAISE_CPU_EXCEPTION Asm("div zero, zero, zero"); + +#elif defined(M32C) + +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ + +#elif defined(M32R) + +#define CPUEXC1 EXC_TRAP00 +#define RAISE_CPU_EXCEPTION Asm("trap 0") + +#elif defined(TLCS_900) && defined(ZUP_F16_EX) + +#define CPUEXC1 3 /* CPU例外ハンドラ番号 */ +#define RAISE_CPU_EXCEPTION Asm(" swi 2") /* ソフトウェア割込み発生 */ +#define STACK_SIZE 512 /* タスクのスタックサイズ */ +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ +#define OMIT_VGET_TIM + +#endif + +/* + * ターゲットに依存する可能性のある定数の定義 + */ + +#ifndef TASK_PORTID +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ +#endif /* TASK_PORTID */ + +#ifndef STACK_SIZE +#define STACK_SIZE 8192 /* タスクのスタックサイズ */ +#endif /* STACK_SIZE */ + +#ifndef LOOP_REF +#define LOOP_REF 1000000 /* 速度計測用のループ回数 */ +#endif /* LOOP_REF */ + +/* + * 関数のプロトタイプ宣言 + */ +#ifndef _MACRO_ONLY + +extern void task(VP_INT tskno); +extern void main_task(VP_INT exinf); +extern void tex_routine(TEXPTN texptn, VP_INT tskno); +extern void cyclic_handler(VP_INT exinf); +extern void cpuexc_handler(VP p_excinf); + +#endif /* _MACRO_ONLY */ diff --git a/uzume_prototype/schem.pdf b/uzume_prototype/schem.pdf new file mode 100755 index 0000000..5c65ea8 Binary files /dev/null and b/uzume_prototype/schem.pdf differ