Class: HRP2TaskPlugin

Inherits:
HRP2KernelObjectPlugin show all
Defined in:
lib/tecsgen/plugin/HRP2TaskPlugin.rb

Overview

celltype プラグインの共通の親クラス

Constant Summary collapse

@@generate_memory_module =

@@ep = [:eActivateTask, :eControlTask, :eManageTask, :eReferTask ] ATT_MODを生成済みかどうか

false

Constants inherited from Plugin

Plugin::PluginArgProc

Instance Method Summary collapse

Methods inherited from HRP2KernelObjectPlugin

check_referenced_cells, get_celltype_list, #get_entry_ports_name_list, include_celltype?, include_region, #initialize, isChecked, set_celltype, set_region_list, #string_cfg_cre

Methods inherited from CelltypePlugin

gen_post_code, #initialize, #new_cell

Methods inherited from Plugin

#cdl_error, #check_plugin_arg, #gen_cdl_file, #gen_ep_func?, #gen_postamble, #gen_preamble, #initialize, #new_cell, #parse_plugin_arg, #print_msg, #set_locale, #set_silent

Methods inherited from Node

#cdl_error, #cdl_error2, #cdl_error3, #cdl_info, #cdl_info2, #cdl_warning, #cdl_warning2, #get_locale, #initialize, #locale_str, #set_locale

Constructor Details

This class inherits a constructor from HRP2KernelObjectPlugin

Instance Method Details

#gen_factory(file) ⇒ Object

ATT_MODの生成

gen_factory実行時には,すべてのセルタイププラグインを生成済みのはずなので,
カーネルAPIコードのメモリ保護を省略できる.


119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/tecsgen/plugin/HRP2TaskPlugin.rb', line 119

def gen_factory(file)
  super
    if @@generate_memory_module == false
      check_celltype_list = []

        Cell.get_cell_list2.each {|cell|
            # すべてのセルを走査してセルタイプをチェック
          ct = cell.get_celltype
            if ct.class == Celltype && check_celltype_list.include?(ct) == false
                # チェック済みセルタイプに登録
              check_celltype_list << ct

                # 未チェックのセルタイプだった場合
                # puts "check for ATT_MOD : #{ct.classget_global_name}"
                puts "check for ATT_MOD : #{ct.get_global_name}"

                # カーネルAPIのコード,データはメモリ保護しない
                next if HRP2KernelObjectPlugin.include_celltype?(ct)

                # 必要のないセルタイプのコード,データはメモリ保護しない
                next if !ct.need_generate?

                # HRP2のドメインリージョンを取得
                regions = ct.get_domain_roots
                regions_hrp2 = regions[:HRP2]
                dbgPrint "HRP2 domain in #{ct.get_name}: "
                regions_hrp2.each {|reg|
                  dbgPrint reg.get_name
                }
                puts ""

                # セル管理ブロックとスケルトンのメモリ保護
                # gen_celltype_names_domain 相当の処理
                if regions_hrp2.include?(Region.get_root) == false && regions_hrp2.length > 1
                    # ドメインが複数で,OutOfDomainにセルが存在しないセルタイプの場合
                    # 共有のセル管理ブロックとスケルトンコードを登録する
                  file = AppFile.open("#{$gen}/tecsgen.cfg")
                    file.print "ATT_MOD(\"#{ct.get_global_name}_tecsgen.o\");\n"
                    file.close
                end

                regions_hrp2.each {|reg|
                  if reg.is_root?
                    nsp = ""
                  else
                    nsp = "_#{reg.get_namespace_path.get_global_name}"
                  end
                    file = AppFile.open("#{$gen}/tecsgen#{nsp}.cfg")
                    file.print "ATT_MOD(\"#{ct.get_global_name}#{nsp}_tecsgen.o\");\n"
                    file.close
                }

                # セルタイプコードがない場合はスキップ
                next if ct.is_all_entry_inline? && !ct.is_active?

                # セルタイプコードのメモリ保護
                # gen_celltype_names_domain2 相当の処理
                if regions_hrp2.include?(Region.get_root) == true || regions_hrp2.length > 1
                    # OutOfDomainにセルが存在するセルタイプの場合
                    # または,複数のドメインにセルが存在するセルタイプの場合
                    # セルタイプコードを共有するように登録する
                  file = AppFile.open("#{$gen}/tecsgen.cfg")
                else
                    # OutOfDomainでない単一のドメインにセルが存在するセルタイプの場合
                    # セルタイプコードを専有するように登録する
                  file = AppFile.open("#{$gen}/tecsgen_#{regions_hrp2[0].get_namespace_path.get_global_name}.cfg")
                end

                file.print "ATT_MOD(\"#{ct.get_global_name}.o\");\n"
                file.close
            else
                # 何もしない
            end
        }

        @@generate_memory_module = true
    else
        # 何もしない
    end
end

file : output file (ex.tecsgen.cfg) cell : val : tab :



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/tecsgen/plugin/HRP2TaskPlugin.rb', line 53

def print_cfg_cre(file, cell, val, tab)
    # val[:id] = val[:id].gsub( /(^|[^\$])\$id\$/, "\\1#{@celltype.get_name.to_s}_#{cell.get_global_name.to_s}" )
    # val[:id] = @celltype.subst_name( val[:id], @celltype.get_name_array( cell ) )
    # $cbp$の代わり
  index = cell.get_id - @celltype.get_id_base
    # cell_CB_name = "#{@celltype.get_global_name}_pCB_tab[#{index}]"
    cell_CB_name = index.to_s
    # CRE_XXX/DEF_XXXの生成
    dbgPrint "assign task plugin\n"
    domainOption = cell.get_region.get_domain_root.get_domain_type.get_option
    # if cell.get_region.get_region_type == :DOMAIN
# cell.show_tree 1
    if domainOption != "OutOfDomain"
        # 保護ドメインに属する場合
      if domainOption == "trusted"
          # カーネルドメイン
        if val[:userStackSize] != "OMIT"
          raise "system task cannot have user stack."
        end
p "CRE_TSK 0 user=#{val[:userStackSize]} system=#{val[:systemStackSize]}"
          file.print <<EOT
#{tab}CRE_TSK(#{val[:id]}, { #{val[:taskAttribute]}, #{cell_CB_name}, tTask_start_task, #{val[:priority]}, #{val[:systemStackSize]}, NULL });
EOT
      else
          # ユーザドメイン
        if val[:userStackSize] == "OMIT"
          raise "user task must have user stack."
        end
p "CRE_TSK 1"
          if val[:systemStackSize] == "OMIT"
            file.print <<EOT
#{tab}CRE_TSK(#{val[:id]}, { #{val[:taskAttribute]}, #{cell_CB_name}, tTask_start_task, #{val[:priority]}, #{val[:userStackSize]}, NULL });
EOT
          else
            p "CRE_TSK 2"
              file.print <<EOT
#{tab}CRE_TSK(#{val[:id]}, { #{val[:taskAttribute]}, #{cell_CB_name}, tTask_start_task, #{val[:priority]}, #{val[:userStackSize]}, NULL, #{val[:systemStackSize]}, NULL });
EOT
          end
      end
    else
        # 無所属の場合
      raise "task #{val[:id]} must belong to a domain."
    end

    # 例外用のを生成
    file.print <<EOT
#{tab}DEF_TEX(#{val[:id]}, { #{val[:exceptionAttribute]}, tTask_start_exception });
EOT
end


104
105
106
# File 'lib/tecsgen/plugin/HRP2TaskPlugin.rb', line 104

def print_cfg_sac(file, val, acv)
  file.puts "SAC_TSK(#{val[:id]}, { #{acv[0]}, #{acv[1]}, #{acv[2]}, #{acv[3]} });"
end