Changeset 429 for EcnlProtoTool/trunk/asp3_dcre/sample
- Timestamp:
- Jul 3, 2020, 7:19:17 PM (4 years ago)
- Location:
- EcnlProtoTool/trunk/asp3_dcre/sample
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/asp3_dcre/sample/Makefile
r331 r429 6 6 # Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory 7 7 # Toyohashi Univ. of Technology, JAPAN 8 # Copyright (C) 2006-201 6by Embedded and Real-Time Systems Laboratory8 # Copyright (C) 2006-2019 by Embedded and Real-Time Systems Laboratory 9 9 # Graduate School of Information Science, Nagoya Univ., JAPAN 10 10 # … … 91 91 92 92 # 93 # TECS関係ファイルのディレクトリの定義 94 # 95 TECSDIR = @(TECSDIR) 96 97 # 93 98 # トレースログを取得するかどうかの定義 94 99 # … … 119 124 120 125 # 121 # 依存関係ファイルを置くディレクトリの定義 122 # 123 DEPDIR = @(DEPDIR) 126 # 中間オブジェクトファイルと依存関係ファイルを置くディレクトリの定義 127 # 128 OBJDIR = @(OBJDIR) 129 DEPDIR = @(OBJDIR) 124 130 125 131 # … … 149 155 -include $(TECSGENDIR)/Makefile.tecsgen 150 156 endif 157 158 TINETDIR = 151 159 152 160 # … … 191 199 APPL_COBJS := @(APPLOBJS) 192 200 endif 193 APPL_COBJS := $(APPL_COBJS) log_output.o vasyslog.o t_perror.o strerror.o 201 APPL_COBJS := $(APPL_COBJS) log_output.o vasyslog.o t_perror.o strerror.o mbed_stub.o 194 202 APPL_CFLAGS := $(APPL_CFLAGS) 195 203 ifdef APPLDIRS … … 197 205 endif 198 206 199 # 200 # ネットワークサービスの定義 201 # 202 203 NO_USE_TINET_LIBRARY = true 204 205 # ネットワークインタフェースの選択、何れか一つ選択する。 206 207 NET_IF = ether 208 209 # イーサネット・ディバイスドライバの選択 210 211 NET_DEV = if_mbed 212 213 # ネットワーク層の選択 214 215 #SUPPORT_INET6 = true 216 SUPPORT_INET4 = true 217 218 # API に組込む機能の選択 219 220 #API_CFG_IP4MAPPED_ADDR = true 221 222 # トランスポート層の選択 223 224 SUPPORT_TCP = true 225 #SUPPORT_UDP = true 226 227 # 228 # システムサービスの Makefile のインクルード 229 # 230 include $(SRCDIR)/tinet/Makefile.tinet 207 ifdef TINETDIR 208 # 209 # ネットワークサービスの定義 210 # 211 NO_USE_TINET_LIBRARY = true 212 213 # ネットワークインタフェースの選択、何れか一つ選択する。 214 NET_IF = ether 215 216 # イーサネット・ディバイスドライバの選択 217 NET_DEV = if_mbed 218 219 # ネットワーク層の選択 220 #SUPPORT_INET6 = true 221 SUPPORT_INET4 = true 222 223 # API に組込む機能の選択 224 #API_CFG_IP4MAPPED_ADDR = true 225 226 # トランスポート層の選択 227 SUPPORT_TCP = true 228 #SUPPORT_UDP = true 229 230 # IGMPを有効に設定 231 #SUPPORT_IGMP = true 232 233 # 234 # ネットワークサービスの Makefile のインクルード 235 # 236 include $(SRCDIR)/$(TINETDIR)/Makefile.tinet 237 endif 231 238 232 239 # … … 236 243 $(SYSSVC_DIRS) $(SRCDIR)/syssvc 237 244 SYSSVC_ASMOBJS := $(SYSSVC_ASMOBJS) 238 SYSSVC_COBJS := $( INIT_TECS_COBJ) $(TECS_COBJS) $(SYSSVC_COBJS) \239 @(SYSSVCOBJS) $(CXXRTS)245 SYSSVC_COBJS := $(SYSSVC_COBJS) $(TECS_COBJS) \ 246 $(INIT_TECS_COBJ) $(CXXRTS) 240 247 SYSSVC_CFLAGS := $(SYSSVC_CFLAGS) 241 248 INCLUDES := $(INCLUDES) -I$(TECSGENDIR) -I$(SRCDIR)/tecs_kernel 242 249 243 250 # 251 # トレースログ記録のサンプルコードに関する定義 252 # 253 ifdef ENABLE_TRACE 254 COPTS := $(COPTS) -DTOPPERS_ENABLE_TRACE 255 SYSSVC_DIRS := $(SYSSVC_DIRS) $(SRCDIR)/arch/tracelog 256 endif 257 258 # 244 259 # ターゲットファイル 245 260 # 246 261 .PHONY: all 247 262 ifndef OMIT_TECS 248 all: tecs 263 all: tecs | $(DEPDIR) 249 264 # @$(MAKE) check 250 265 @$(MAKE) check $(OBJNAME).bin … … 261 276 # コンフィギュレータに関する定義 262 277 # 263 CFG_TABS := --api-table $(SRCDIR)/tinet/tcpip_api.def:tcpip \ 278 CFG_KERNEL := --kernel asp 279 ifndef TINETDIR 280 CFG_TRB := -T $(TARGETDIR)/target_kernel.trb 281 CFG_TABS := --api-table $(SRCDIR)/kernel/kernel_api.def \ 282 --symval-table $(SRCDIR)/kernel/kernel_sym.def $(CFG_TABS) 283 else 284 CFG_TRB := -T $(TINET_ROOT)/tinet.trb:tcpip -T $(TARGETDIR)/target_kernel.trb:kernel 285 CFG_TABS := --api-table $(TINET_ROOT)/tcpip_api.def:tcpip \ 264 286 --api-table $(SRCDIR)/kernel/kernel_api.def:kernel \ 265 --symval-table $( SRCDIR)/tinet/tcpip_sym.def \287 --symval-table $(TINET_ROOT)/tcpip_sym.def \ 266 288 --symval-table $(SRCDIR)/kernel/kernel_sym.def $(CFG_TABS) 289 endif 267 290 CFG_ASMOBJS := $(CFG_ASMOBJS) 268 291 CFG_COBJS := kernel_cfg.o $(CFG_COBJS) 269 CFG_OBJS := $(CFG_ASMOBJS) $(CFG_COBJS) 292 CFG_CFLAGS := -DTOPPERS_CB_TYPE_ONLY $(CFG_CFLAGS) 293 270 294 CFG2_OUT_SRCS := kernel_cfg.h kernel_cfg.c $(CFG2_OUT_SRCS) 271 CFG_CFLAGS := -DTOPPERS_CB_TYPE_ONLY $(CFG_CFLAGS)272 295 273 296 # … … 300 323 $(foreach file,$(KERNEL_FCSRCS),$(file:.c=.o)) 301 324 endif 302 ifdef OMIT_OFFSET_H 303 OFFSET_H = 304 else 325 ifdef TARGET_OFFSET_TRB 305 326 OFFSET_H = offset.h 306 327 endif … … 318 339 endif 319 340 ifndef TARGET_TCPIP_TRB 320 TARGET_TCPIP_TRB := $(SRCDIR)/ tinet/tinet.trb341 TARGET_TCPIP_TRB := $(SRCDIR)/$(TINETDIR)/tinet.trb 321 342 endif 322 343 … … 330 351 331 352 # 353 # 中間オブジェクトファイルを置くディレクトリの処理 354 # 355 APPL_ASMOBJS := $(addprefix $(OBJDIR)/, $(APPL_ASMOBJS)) 356 APPL_CXXOBJS := $(addprefix $(OBJDIR)/, $(APPL_CXXOBJS)) 357 APPL_COBJS := $(addprefix $(OBJDIR)/, $(APPL_COBJS)) 358 SYSSVC_ASMOBJS := $(addprefix $(OBJDIR)/, $(SYSSVC_ASMOBJS)) 359 SYSSVC_COBJS := $(addprefix $(OBJDIR)/, $(SYSSVC_COBJS)) 360 KERNEL_ASMOBJS := $(addprefix $(OBJDIR)/, $(KERNEL_ASMOBJS)) 361 KERNEL_COBJS := $(addprefix $(OBJDIR)/, $(KERNEL_COBJS)) 362 KERNEL_LCOBJS := $(addprefix $(OBJDIR)/, $(KERNEL_LCOBJS)) 363 CFG_ASMOBJS := $(addprefix $(OBJDIR)/, $(CFG_ASMOBJS)) 364 CFG_COBJS := $(addprefix $(OBJDIR)/, $(CFG_COBJS)) 365 366 # 332 367 # コンパイルのための変数の定義 333 368 # 369 APPL_OBJS = $(APPL_ASMOBJS) $(APPL_COBJS) $(APPL_CXXOBJS) 370 SYSSVC_OBJS = $(SYSSVC_ASMOBJS) $(SYSSVC_COBJS) 334 371 KERNEL_LIB_OBJS = $(KERNEL_ASMOBJS) $(KERNEL_COBJS) $(KERNEL_LCOBJS) 335 SYSSVC_OBJS = $(SYSSVC_ASMOBJS) $(SYSSVC_COBJS) 336 APPL_OBJS = $(APPL_ASMOBJS) $(APPL_COBJS) $(APPL_CXXOBJS) 372 CFG_OBJS = $(CFG_ASMOBJS) $(CFG_COBJS) 337 373 ALL_OBJS = $(START_OBJS) $(APPL_OBJS) $(SYSSVC_OBJS) $(CFG_OBJS) \ 338 374 $(END_OBJS) $(HIDDEN_OBJS) … … 368 404 tecs $(TECSGEN_SRCS) $(TECS_HEADERS): $(TECSGEN_TIMESTAMP) ; 369 405 $(TECSGEN_TIMESTAMP): $(APPL_CDL) $(TECS_IMPORTS) 370 $(TECSGEN) $< -R $(INCLUDES) --cpp "$( TECS_CPP)" -g $(TECSGENDIR)406 $(TECSGEN) $< -R $(INCLUDES) --cpp "$(subst ", \", $(TECS_CPP))" -g $(TECSGENDIR) 371 407 372 408 # … … 375 411 cfg1_out.c cfg1_out.db: cfg1_out.timestamp ; 376 412 cfg1_out.timestamp: $(APPL_CFG) $(TECSGEN_TIMESTAMP) 377 $(CFG) --pass 1 --kernel asp$(INCLUDES) $(CFG_TABS) \413 $(CFG) --pass 1 $(CFG_KERNEL) $(INCLUDES) $(CFG_TABS) \ 378 414 -M $(DEPDIR)/cfg1_out_c.d $(TARGET_KERNEL_CFG) $< 379 415 380 $(CFG1_OUT): $(START_OBJS) cfg1_out.o $(CFG_DMY) $(END_OBJS) $(HIDDEN_OBJS)416 $(CFG1_OUT): $(START_OBJS) $(OBJDIR)/cfg1_out.o $(CFG_DMY) $(END_OBJS) $(HIDDEN_OBJS) 381 417 $(LINK) $(CFLAGS) $(LDFLAGS) $(CFG1_OUT_LDFLAGS) -o $(CFG1_OUT) \ 382 $(START_OBJS) cfg1_out.o $(CFG_DMY) $(END_OBJS)418 $(START_OBJS) $(OBJDIR)/cfg1_out.o $(CFG_DMY) $(LIBS) $(END_OBJS) 383 419 384 420 cfg1_out.syms: $(CFG1_OUT) … … 390 426 $(CFG2_OUT_SRCS) cfg2_out.db: kernel_cfg.timestamp ; 391 427 kernel_cfg.timestamp: cfg1_out.db cfg1_out.syms cfg1_out.srec 392 $(CFG) --pass 2 --kernel asp $(INCLUDES) -T $(TARGET_TCPIP_TRB):tcpip -T $(TARGET_KERNEL_TRB):kernel428 $(CFG) --pass 2 $(CFG_KERNEL) $(INCLUDES) $(CFG_TRB) 393 429 394 430 # … … 397 433 $(OFFSET_H): offset.timestamp ; 398 434 offset.timestamp: cfg1_out.db cfg1_out.syms cfg1_out.srec 399 $(CFG) --pass 2 -O --kernel asp$(INCLUDES) -T $(TARGET_OFFSET_TRB) \435 $(CFG) --pass 2 -O $(CFG_KERNEL) $(INCLUDES) -T $(TARGET_OFFSET_TRB) \ 400 436 --rom-symbol cfg1_out.syms --rom-image cfg1_out.srec 401 437 … … 409 445 410 446 # 447 # 並列makeのための依存関係の定義 448 # 449 $(APPL_OBJS) $(SYSSVC_OBJS): | kernel_cfg.timestamp 450 $(APPL_ASMOBJS) $(SYSSVC_ASMOBJS) $(KERNEL_ASMOBJS) $(CFG_ASMOBJS): \ 451 | offset.timestamp 452 453 # 411 454 # 特別な依存関係の定義 412 455 # 413 tBannerMain.o: $(filter-out tBannerMain.o,$(ALL_OBJS)) $(LIBS_DEP) 456 $(OBJDIR)/@(BANNEROBJ): $(filter-out $(OBJDIR)/@(BANNEROBJ),$(ALL_OBJS)) \ 457 $(LIBS_DEP) 414 458 415 459 # … … 417 461 # 418 462 $(OBJFILE): $(ALL_OBJS) $(LIBS_DEP) 419 $(LINK) $(CFLAGS) $(LDFLAGS) $(OBJ_LDFLAGS) -o $(OBJFILE) \463 $(LINK) $(CFLAGS) $(LDFLAGS) $(OBJ_LDFLAGS) -o $(OBJFILE) -Wl,-Map=$(OBJNAME).map,--cref \ 420 464 $(START_OBJS) $(APPL_OBJS) $(SYSSVC_OBJS) $(CFG_OBJS) \ 421 465 $(ALL_LIBS) $(END_OBJS) 466 467 # 468 # 依存関係フォルダの作成 469 # 470 $(DEPDIR): 471 mkdir $@ 422 472 423 473 # … … 445 495 check: check.timestamp ; 446 496 check.timestamp: cfg2_out.db $(OBJNAME).syms $(OBJNAME).srec 447 $(CFG) --pass 3 --kernel asp-O $(INCLUDES) -T $(TARGET_CHECK_TRB) \497 $(CFG) --pass 3 $(CFG_KERNEL) -O $(INCLUDES) -T $(TARGET_CHECK_TRB) \ 448 498 --rom-symbol $(OBJNAME).syms --rom-image $(OBJNAME).srec 449 499 @echo "configuration check passed" … … 454 504 .PHONY: clean 455 505 clean: 456 rm -f \#* *~ *.o $(DEPDIR)/*.d $(CLEAN_FILES) check.timestamp506 rm -f \#* *~ $(OBJDIR)/*.o $(DEPDIR)/*.d $(CLEAN_FILES) check.timestamp 457 507 rm -f $(OBJFILE) $(OBJNAME).syms $(OBJNAME).srec $(OBJNAME).bin 458 508 rm -f kernel_cfg.timestamp $(CFG2_OUT_SRCS) cfg2_out.db … … 468 518 cleankernel: 469 519 rm -f $(OFFSET_H) $(KERNEL_LIB_OBJS) 470 rm -f $(KERNEL_LIB_OBJS: %.o=$(DEPDIR)/%.d)520 rm -f $(KERNEL_LIB_OBJS:$(OBJDIR)/%.o=$(DEPDIR)/%.d) 471 521 472 522 .PHONY: realclean … … 480 530 # のみを付けてコンパイルする. 481 531 # 482 ALL_CFG_COBJS = $(CFG_COBJS) cfg1_out.o532 ALL_CFG_COBJS = $(CFG_COBJS) $(OBJDIR)/cfg1_out.o 483 533 ALL_CFG_ASMOBJS = $(CFG_ASMOBJS) 484 534 485 $(ALL_CFG_COBJS): %.o: %.c486 $(CC) -c - MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(CFG_CFLAGS) $<487 488 $(ALL_CFG_COBJS: .o=.s): %.s: %.c489 $(CC) -S $(CFLAGS) $(CFG_CFLAGS) $<490 491 $(ALL_CFG_ASMOBJS): %.o: %.S492 $(CC) -c - MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(CFG_CFLAGS) $<535 $(ALL_CFG_COBJS): $(OBJDIR)/%.o: %.c 536 $(CC) -c -o $@ -MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(CFG_CFLAGS) $< 537 538 $(ALL_CFG_COBJS:$(OBJDIR)/%.o=%.s): %.s: %.c 539 $(CC) -S -o $@ $(CFLAGS) $(CFG_CFLAGS) $< 540 541 $(ALL_CFG_ASMOBJS): $(OBJDIR)/%.o: %.S 542 $(CC) -c -o $@ -MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(CFG_CFLAGS) $< 493 543 494 544 # … … 541 591 # コンパイルルールの定義 542 592 # 543 $(KERNEL_COBJS): %.o: %.c544 $(CC) -c - MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(KERNEL_CFLAGS) $<545 546 $(KERNEL_COBJS: .o=.s): %.s: %.c547 $(CC) -S $(CFLAGS) $(KERNEL_CFLAGS) $<548 549 $(KERNEL_LCOBJS): %.o:550 $(CC) - DTOPPERS_$(*F) -o $@ -c-MD -MP -MF $(DEPDIR)/$*.d \593 $(KERNEL_COBJS): $(OBJDIR)/%.o: %.c 594 $(CC) -c -o $@ -MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(KERNEL_CFLAGS) $< 595 596 $(KERNEL_COBJS:$(OBJDIR)/%.o=%.s): %.s: %.c 597 $(CC) -S -o $@ $(CFLAGS) $(KERNEL_CFLAGS) $< 598 599 $(KERNEL_LCOBJS): $(OBJDIR)/%.o: 600 $(CC) -c -o $@ -DTOPPERS_$(*F) -MD -MP -MF $(DEPDIR)/$*.d \ 551 601 $(CFLAGS) $(KERNEL_CFLAGS) $< 552 602 553 $(KERNEL_LCOBJS: .o=.s): %.s:554 $(CC) - DTOPPERS_$(*F) -o $@ -S$(CFLAGS) $(KERNEL_CFLAGS) $<555 556 $(KERNEL_ASMOBJS): %.o: %.S557 $(CC) -c - MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(KERNEL_CFLAGS) $<558 559 $(SYSSVC_COBJS): %.o: %.c560 $(CC) -c - MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(SYSSVC_CFLAGS) $<561 562 $(SYSSVC_COBJS: .o=.s): %.s: %.c563 $(CC) -S $(CFLAGS) $(SYSSVC_CFLAGS) $<564 565 $(SYSSVC_ASMOBJS): %.o: %.S566 $(CC) -c - MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(SYSSVC_CFLAGS) $<567 568 $(APPL_COBJS): %.o: %.c569 $(CC) -c - MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(APPL_CFLAGS) $<570 571 $(APPL_COBJS: .o=.s): %.s: %.c572 $(CC) -S $(CFLAGS) $(APPL_CFLAGS) $<573 574 $(APPL_CXXOBJS): %.o: %.cpp575 $(CXX) -c - MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(APPL_CFLAGS) $<576 577 $(APPL_CXXOBJS: .o=.s): %.s: %.cpp578 $(CXX) -S $(CFLAGS) $(APPL_CFLAGS) $<579 580 $(APPL_ASMOBJS): %.o: %.S581 $(CC) -c - MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(APPL_CFLAGS) $<603 $(KERNEL_LCOBJS:$(OBJDIR)/%.o=%.s): %.s: 604 $(CC) -S -o $@ -DTOPPERS_$(*F) $(CFLAGS) $(KERNEL_CFLAGS) $< 605 606 $(KERNEL_ASMOBJS): $(OBJDIR)/%.o: %.S 607 $(CC) -c -o $@ -MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(KERNEL_CFLAGS) $< 608 609 $(SYSSVC_COBJS): $(OBJDIR)/%.o: %.c 610 $(CC) -c -o $@ -MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(SYSSVC_CFLAGS) $< 611 612 $(SYSSVC_COBJS:$(OBJDIR)/%.o=%.s): %.s: %.c 613 $(CC) -S -o $@ $(CFLAGS) $(SYSSVC_CFLAGS) $< 614 615 $(SYSSVC_ASMOBJS): $(OBJDIR)/%.o: %.S 616 $(CC) -c -o $@ -MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(SYSSVC_CFLAGS) $< 617 618 $(APPL_COBJS): $(OBJDIR)/%.o: %.c 619 $(CC) -c -o $@ -MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(APPL_CFLAGS) $< 620 621 $(APPL_COBJS:$(OBJDIR)/%.o=%.s): %.s: %.c 622 $(CC) -S -o $@ $(CFLAGS) $(APPL_CFLAGS) $< 623 624 $(APPL_CXXOBJS): $(OBJDIR)/%.o: %.cpp 625 $(CXX) -c -o $@ -MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(APPL_CFLAGS) $< 626 627 $(APPL_CXXOBJS:$(OBJDIR)/%.o=%.s): %.s: %.cpp 628 $(CXX) -S -o $@ $(CFLAGS) $(APPL_CFLAGS) $< 629 630 $(APPL_ASMOBJS): $(OBJDIR)/%.o: %.S 631 $(CC) -c -o $@ -MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(APPL_CFLAGS) $< 582 632 583 633 # 584 634 # デフォルトコンパイルルールを上書き 585 635 # 586 %.o: %.c636 $(OBJDIR)/%.o: %.c 587 637 @echo "*** Default compile rules should not be used." 588 $(CC) -c - MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $<638 $(CC) -c -o $@ -MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $< 589 639 590 640 %.s: %.c 591 641 @echo "*** Default compile rules should not be used." 592 $(CC) -S $(CFLAGS) $<593 594 %.o: %.cpp642 $(CC) -S -o $@ $(CFLAGS) $< 643 644 $(OBJDIR)/%.o: %.cpp 595 645 @echo "*** Default compile rules should not be used." 596 $(CXX) -c - MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $<646 $(CXX) -c -o $@ -MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $< 597 647 598 648 %.s: %.cpp 599 649 @echo "*** Default compile rules should not be used." 600 $(CXX) -S $(CFLAGS) $<601 602 %.o: %.S650 $(CXX) -S -o $@ $(CFLAGS) $< 651 652 $(OBJDIR)/%.o: %.S 603 653 @echo "*** Default compile rules should not be used." 604 $(CC) -c - MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $<654 $(CC) -c -o $@ -MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $< -
EcnlProtoTool/trunk/asp3_dcre/sample/sample1.c
r331 r429 6 6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory 7 7 * Toyohashi Univ. of Technology, JAPAN 8 * Copyright (C) 2004-201 6by Embedded and Real-Time Systems Laboratory8 * Copyright (C) 2004-2019 by Embedded and Real-Time Systems Laboratory 9 9 * Graduate School of Information Science, Nagoya Univ., JAPAN 10 10 * … … 48 48 * プログラムの概要: 49 49 * 50 * ユーザインタフェースを受け持つメインタスク( タスクID: MAIN_TASK,優51 * 先度: MAIN_PRIORITY)と,3つの並行実行されるタスク(タスクID:52 * TASK1~TASK3,初期優先度: MID_PRIORITY)で構成される.また,起動周53 * 期が2秒の周期ハンドラ(周期ハンドラID: CYCHDR1)を用いる.54 * 55 * 並行実行されるタスクは,task_loop回空ループを実行する度に,タスクが56 * 実行中であることをあらわすメッセージを表示する.空ループを実行する57 * のは,空ループなしでメッセージを出力すると,多量のメッセージが出力58 * され,プログラムの動作が確認しずらくなるためである.また,低速なシ50 * ユーザインタフェースを受け持つメインタスク(MAIN_TASK)と,3つの並 51 * 行実行されるタスク(TASK1~TASK3),例外処理タスク(EXC_TASK)の5 52 * つのタスクを用いる.これらの他に,システムログタスクが動作する.ま 53 * た,周期ハンドラ,アラームハンドラ,割込みサービスルーチン,CPU例 54 * 外ハンドラをそれぞれ1つ用いる. 55 * 56 * 並行実行されるタスクは,task_loop回のループを実行する度に,タスク 57 * が実行中であることをあらわすメッセージを表示する.ループを実行する 58 * のは,プログラムの動作を確認しやすくするためである.また,低速なシ 59 59 * リアルポートを用いてメッセージを出力する場合に,すべてのメッセージ 60 60 * が出力できるように,メッセージの量を制限するという理由もある. 61 61 * 62 * 周期ハンドラは,三つの優先度(HIGH_PRIORITY,MID_PRIORITY, 63 * LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は, 64 * 周期ハンドラは停止状態になっている. 65 * 66 * メインタスクは,シリアルI/Oポートからの文字入力を行い(文字入力を 67 * 待っている間は,並行実行されるタスクが実行されている),入力された 68 * 文字に対応した処理を実行する.入力された文字と処理の関係は次の通り. 62 * 周期ハンドラ,アラームハンドラ,割込みサービスルーチンは,3つの優 63 * 先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)のレディキューを 64 * 回転させる.周期ハンドラは,プログラムの起動直後は停止状態になって 65 * いる. 66 * 67 * CPU例外ハンドラは,CPU例外からの復帰が可能な場合には,例外処理タス 68 * クを起動する.例外処理タスクは,CPU例外を起こしたタスクに対して, 69 * 終了要求を行う. 70 * 71 * メインタスクは,シリアルポートからの文字入力を行い(文字入力を待っ 72 * ている間は,並行実行されるタスクが実行されている),入力された文字 73 * に対応した処理を実行する.入力された文字と処理の関係は次の通り. 69 74 * Control-Cまたは'Q'が入力されると,プログラムを終了する. 70 75 * … … 97 102 * 'b' : アラームハンドラを5秒後に起動するよう動作開始させる. 98 103 * 'B' : アラームハンドラを動作停止させる. 99 * 'z' : 対象タスクにCPU例外を発生させる(タスクを終了させる). 100 * 'Z' : 対象タスクにCPUロック状態でCPU例外を発生させる(プログラムを 101 * 終了する). 104 * 'z' : 対象タスクにCPU例外を発生させる(ターゲットによっては復帰可能). 105 * 'Z' : 対象タスクにCPUロック状態でCPU例外を発生させる(復帰不可能). 102 106 * '@' : タスク3をacre_tskにより生成する. 103 107 * '!' : 対象タスクをdel_tskにより削除する. 104 108 * '$' : アラームハンドラをacre_almにより生成する. 105 109 * '#' : アラームハンドラをdel_almにより削除する. 106 * 'V' : fch_hrtで高分解能タイマを2回読む.110 * 'V' : 短いループを挟んで,fch_hrtで高分解能タイマを2回読む. 107 111 * 'v' : 発行したシステムコールを表示する(デフォルト). 108 112 * 'q' : 発行したシステムコールを表示しない. … … 116 120 #include "kernel_cfg.h" 117 121 #include "sample1.h" 118 /*#include "sample1n.h"*/119 122 120 123 /* … … 132 135 133 136 /* 137 * プロセッサ時間の消費 138 * 139 * ループによりプロセッサ時間を消費する.最適化ができないように,ルー 140 * プ内でvolatile変数を読み込む. 141 */ 142 static volatile long_t volatile_var; 143 144 static void 145 consume_time(ulong_t ctime) 146 { 147 ulong_t i; 148 149 for (i = 0; i < ctime; i++) { 150 (void) volatile_var; 151 } 152 } 153 154 /* 134 155 * 並行実行されるタスクへのメッセージ領域 135 156 */ … … 144 165 * 並行実行されるタスク 145 166 */ 146 void task(intptr_t exinf)147 { 148 volatile ulong_t i; 167 void 168 task(intptr_t exinf) 169 { 149 170 int_t n = 0; 150 171 int_t tskno = (int_t) exinf; … … 155 176 syslog(LOG_NOTICE, "task%d is running (%03d). %s", 156 177 tskno, ++n, graph[tskno-1]); 157 for (i = 0; i < task_loop; i++);178 consume_time(task_loop); 158 179 c = message[tskno-1]; 159 180 message[tskno-1] = 0; … … 202 223 203 224 /* 204 * 割込みハンドラ 225 * 割込みサービスルーチン 226 * 227 * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー 228 * を回転させる. 205 229 */ 206 230 #ifdef INTNO1 207 231 208 void intno1_isr(intptr_t exinf) 232 void 233 intno1_isr(intptr_t exinf) 209 234 { 210 235 intno1_clear(); … … 235 260 "sns_dpn() is not true in CPU exception handler."); 236 261 } 237 syslog(LOG_INFO, "sns_loc = %d sns_dsp = %dxsns_dpn = %d",262 syslog(LOG_INFO, "sns_loc = %d, sns_dsp = %d, xsns_dpn = %d", 238 263 sns_loc(), sns_dsp(), xsns_dpn(p_excinf)); 239 264 … … 244 269 } 245 270 246 #ifdef PREPARE_RETURN_CPUEXC247 PREPARE_RETURN_CPUEXC;248 271 SVC_PERROR(get_tid(&cpuexc_tskid)); 249 272 SVC_PERROR(act_tsk(EXC_TASK)); 250 #else /* PREPARE_RETURN_CPUEXC */251 syslog(LOG_NOTICE, "Sample program ends with exception.");252 SVC_PERROR(ext_ker());253 assert(0);254 #endif /* PREPARE_RETURN_CPUEXC */255 273 } 256 274 … … 263 281 * を回転させる. 264 282 */ 265 void cyclic_handler(intptr_t exinf) 283 void 284 cyclic_handler(intptr_t exinf) 266 285 { 267 286 SVC_PERROR(rot_rdq(HIGH_PRIORITY)); … … 276 295 * を回転させる. 277 296 */ 278 void alarm_handler(intptr_t exinf) 297 void 298 alarm_handler(intptr_t exinf) 279 299 { 280 300 SVC_PERROR(rot_rdq(HIGH_PRIORITY)); … … 286 306 * 例外処理タスク 287 307 */ 288 void exc_task(intptr_t exinf) 308 void 309 exc_task(intptr_t exinf) 289 310 { 290 311 SVC_PERROR(ras_ter(cpuexc_tskid)); … … 294 315 * メインタスク 295 316 */ 296 void main_task(intptr_t exinf) 317 void 318 main_task(intptr_t exinf) 297 319 { 298 320 char c; … … 302 324 PRI tskpri; 303 325 #ifndef TASK_LOOP 304 volatile ulong_t i;305 326 SYSTIM stime1, stime2; 306 327 #endif /* TASK_LOOP */ … … 332 353 * ループ回数の設定 333 354 * 334 * 並行実行されるタスク内での 空ループの回数(task_loop)は,空ルー335 * プの実行時間が約0.4秒になるように設定する.この設定のために,336 * LOOP_REF回の 空ループの実行時間を,その前後でget_timを呼ぶことで337 * 測定し,その測定結果から空ループの実行時間が0.4秒になるループ 回338 * 数を求め,task_loopに設定する.355 * 並行実行されるタスク内でのループの回数(task_loop)は,ループ 356 * の実行時間が約0.4秒になるように設定する.この設定のために, 357 * LOOP_REF回のループの実行時間を,その前後でget_timを呼ぶことで 358 * 測定し,その測定結果から空ループの実行時間が0.4秒になるループ 359 * 回数を求め,task_loopに設定する. 339 360 * 340 * LOOP_REFは,デフォルトでは1,000,000に設定しているが,想定したよ 341 * り遅いプロセッサでは,サンプルプログラムの実行開始に時間がかか 342 * りすぎるという問題を生じる.逆に想定したより速いプロセッサでは, 343 * LOOP_REF回の空ループの実行時間が短くなり,task_loopに設定する値 344 * の誤差が大きくなるという問題がある. 345 * 346 * そこで,そのようなターゲットでは,target_test.hで,LOOP_REFを適 347 * 切な値に定義するのが望ましい. 361 * LOOP_REFは,デフォルトでは1,000,000に設定しているが,想定した 362 * より遅いプロセッサでは,サンプルプログラムの実行開始に時間がか 363 * かりすぎるという問題を生じる.逆に想定したより速いプロセッサで 364 * は,LOOP_REF回のループの実行時間が短くなり,task_loopに設定す 365 * る値の誤差が大きくなるという問題がある.そこで,そのようなター 366 * ゲットでは,target_test.hで,LOOP_REFを適切な値に定義すること 367 * とする. 348 368 * 349 369 * また,task_loopの値を固定したい場合には,その値をTASK_LOOPにマ 350 * クロ定義する.TASK_LOOPがマクロ定義されている場合,上記の測定 を351 * 行わずに,TASK_LOOPに定義された値を空ループの回数とする.370 * クロ定義する.TASK_LOOPがマクロ定義されている場合,上記の測定 371 * を行わずに,TASK_LOOPに定義された値をループの回数とする. 352 372 * 353 * ターゲットによっては,空ループの実行時間の1回目の測定で,本来よ354 * りも長めになるものがある.このようなターゲットでは,MEASURE_TWICE355 * をマクロ定義することで,1回目の測定結果を捨てて,2回目の測定結果356 * を使う.373 * ターゲットによっては,ループの実行時間の1回目の測定で,本来より 374 * も長めになるものがある.このようなターゲットでは,MEASURE_TWICE 375 * をマクロ定義することで,1回目の測定結果を捨てて,2回目の測定結 376 * 果を使う. 357 377 */ 358 378 #ifdef TASK_LOOP … … 361 381 362 382 #ifdef MEASURE_TWICE 363 task_loop = LOOP_REF;364 383 SVC_PERROR(get_tim(&stime1)); 365 for (i = 0; i < task_loop; i++);384 consume_time(LOOP_REF); 366 385 SVC_PERROR(get_tim(&stime2)); 367 386 #endif /* MEASURE_TWICE */ 368 387 369 task_loop = LOOP_REF;370 388 SVC_PERROR(get_tim(&stime1)); 371 for (i = 0; i < task_loop; i++);389 consume_time(LOOP_REF); 372 390 SVC_PERROR(get_tim(&stime2)); 373 391 task_loop = LOOP_REF * 400LU / (ulong_t)(stime2 - stime1) * 1000LU; … … 477 495 break; 478 496 case 'c': 479 syslog(LOG_INFO, "#sta_cyc( 1)");497 syslog(LOG_INFO, "#sta_cyc(CYCHDR1)"); 480 498 SVC_PERROR(sta_cyc(CYCHDR1)); 481 499 break; 482 500 case 'C': 483 syslog(LOG_INFO, "#stp_cyc( 1)");501 syslog(LOG_INFO, "#stp_cyc(CYCHDR1)"); 484 502 SVC_PERROR(stp_cyc(CYCHDR1)); 485 503 break; 486 504 case 'b': 487 syslog(LOG_INFO, "#sta_alm( 1, 5000000)");505 syslog(LOG_INFO, "#sta_alm(ALMHDR1, 5000000)"); 488 506 SVC_PERROR(sta_alm(ALMHDR1, 5000000)); 489 507 break; 490 508 case 'B': 491 syslog(LOG_INFO, "#stp_alm( 1)");509 syslog(LOG_INFO, "#stp_alm(ALMHDR1)"); 492 510 SVC_PERROR(stp_alm(ALMHDR1)); 493 511 break; … … 499 517 ctsk.stksz = STACK_SIZE; 500 518 ctsk.stk = NULL; 501 SVC_PERROR(TASK3 = acre_tsk(&ctsk)); 502 syslog(LOG_NOTICE, "task3 is created with tskid = %d.", 519 SVC_PERROR(ercd = acre_tsk(&ctsk)); 520 if (ercd >= 0) { 521 TASK3 = ercd; 522 syslog(LOG_NOTICE, "task3 is created with tskid = %d.", 503 523 (int_t) TASK3); 524 } 504 525 break; 505 526 case '!': … … 512 533 calm.nfyinfo.nfy.handler.exinf = (intptr_t) 0; 513 534 calm.nfyinfo.nfy.handler.tmehdr = (TMEHDR) alarm_handler; 514 SVC_PERROR(ALMHDR1 = acre_alm(&calm)); 515 syslog(LOG_NOTICE, "alarm handler is created with almid = %d.", 535 SVC_PERROR(ercd = acre_alm(&calm)); 536 if (ercd >= 0) { 537 ALMHDR1 = ercd; 538 syslog(LOG_NOTICE, "alarm handler is created with almid = %d.", 516 539 (int_t) ALMHDR1); 540 } 517 541 break; 518 542 case '#': 519 syslog(LOG_INFO, "#del_alm( 1)");543 syslog(LOG_INFO, "#del_alm(ALMHDR1)"); 520 544 SVC_PERROR(del_alm(ALMHDR1)); 521 545 break; … … 523 547 case 'V': 524 548 hrtcnt1 = fch_hrt(); 549 consume_time(1000LU); 525 550 hrtcnt2 = fch_hrt(); 526 551 syslog(LOG_NOTICE, "hrtcnt1 = %tu, hrtcnt2 = %tu", 527 hrtcnt1,hrtcnt2);552 (uint32_t) hrtcnt1, (uint32_t) hrtcnt2); 528 553 break; 529 554 … … 552 577 #endif /* BIT_KERNEL */ 553 578 579 case '\003': 580 case 'Q': 581 break; 582 554 583 default: 584 syslog(LOG_INFO, "Unknown command: '%c'.", c); 555 585 break; 556 586 } -
EcnlProtoTool/trunk/asp3_dcre/sample/sample1.cdl
r321 r429 30 30 31 31 /* 32 * システムログ機能の組上げ記述 32 * システムログ機能のアダプタの組上げ記述 33 * 34 * システムログ機能のアダプタは,C言語で記述されたコードから,TECSベー 35 * スのシステムログ機能を呼び出すためのセルである.システムログ機能の 36 * サービスコール(syslog,syslog_0~syslog_5,t_perrorを含む)を呼び 37 * 出さない場合には,以下のセルの組上げ記述を削除してよい. 38 */ 39 cell tSysLogAdapter SysLogAdapter { 40 cSysLog = SysLog.eSysLog; 41 }; 42 43 /* 44 * シリアルインタフェースドライバのアダプタの組上げ記述 45 * 46 * シリアルインタフェースドライバのアダプタは,C言語で記述されたコー 47 * ドから,TECSベースのシリアルインタフェースドライバを呼び出すための 48 * セルである.シリアルインタフェースドライバのサービスコールを呼び出 49 * さない場合には,以下のセルの組上げ記述を削除してよい. 50 */ 51 cell tSerialAdapter SerialAdapter { 52 cSerialPort[0] = SerialPort1.eSerialPort; 53 }; 54 55 /* 56 * システムログ機能の組上げ記述 33 57 * 34 58 * システムログ機能を外す場合には,以下のセルの組上げ記述を削除し,コ … … 49 73 50 74 /* 51 * C言語で記述されたアプリケーションから,TECSベースのシステムログ機能 52 * を呼び出すためのアダプタの組上げ記述 53 * 54 * システムログ機能のサービスコール(syslog関数とsyslog_0関数~syslog_5 55 * 関数以外のもの)ルをC言語で記述されたアプリケーションから呼び出さな 56 * い場合には,以下のセルの組上げ記述を削除すればよい. 57 */ 58 cell tSysLogAdapter SysLogAdapter { 59 cSysLog = SysLog.eSysLog; 60 }; 61 62 /* 63 * シリアルインタフェースドライバの組上げ記述 75 * シリアルインタフェースドライバの組上げ記述 64 76 * 65 77 * シリアルインタフェースドライバを外す場合には,以下のセルの組上げ記 … … 78 90 79 91 /* 80 * C言語で記述されたアプリケーションから,TECSベースのシリアルインタ 81 * フェースドライバを呼び出すためのアダプタの組上げ記述 82 * 83 * シリアルインタフェースドライバのサービスコールをC言語で記述されたア 84 * プリケーションから呼び出さない場合には,以下のセルの組上げ記述を削 85 * 除すればよい. 86 */ 87 cell tSerialAdapter SerialAdapter { 88 cSerialPort[0] = SerialPort1.eSerialPort; 89 }; 90 91 /* 92 * システムログタスクの組上げ記述 92 * システムログタスクの組上げ記述 93 93 * 94 94 * システムログタスクを外す場合には,以下のセルの組上げ記述を削除すれ … … 111 111 112 112 /* 113 * 113 * カーネル起動メッセージ出力の組上げ記述 114 114 * 115 115 * カーネル起動メッセージの出力を外す場合には,以下のセルの組上げ記述 -
EcnlProtoTool/trunk/asp3_dcre/sample/sample1.cfg
r321 r429 21 21 DEF_EXC(CPUEXC1, { TA_NULL, cpuexc_handler }); 22 22 #endif /* CPUEXC1 */ 23 DEF_ KMM({ KMM_SIZE, NULL });23 DEF_MPK({ MPK_SIZE, NULL }); -
EcnlProtoTool/trunk/asp3_dcre/sample/sample1.h
r321 r429 6 6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory 7 7 * Toyohashi Univ. of Technology, JAPAN 8 * Copyright (C) 2004-201 6by Embedded and Real-Time Systems Laboratory8 * Copyright (C) 2004-2018 by Embedded and Real-Time Systems Laboratory 9 9 * Graduate School of Information Science, Nagoya Univ., JAPAN 10 10 * … … 57 57 58 58 #define EXC_PRIORITY 1 /* 例外処理タスクの優先度 */ 59 #define MAIN_PRIORITY 6/* メインタスクの優先度 */59 #define MAIN_PRIORITY 5 /* メインタスクの優先度 */ 60 60 /* HIGH_PRIORITYより高くすること */ 61 61 … … 76 76 #endif /* STACK_SIZE */ 77 77 78 #ifndef KMM_SIZE79 #define KMM_SIZE (STACK_SIZE * 16) /* カーネルが割り付ける */80 #endif /* KMM_SIZE */ /* メモリ領域のサイズ*/78 #ifndef MPK_SIZE /* カーネルメモリプール領域のサイズ */ 79 #define MPK_SIZE (STACK_SIZE * 16) 80 #endif /* MPK_SIZE */ 81 81 82 82 #ifndef LOOP_REF -
EcnlProtoTool/trunk/asp3_dcre/sample/sample1n.h
r331 r429 62 62 63 63 extern void net_syslog(uint_t prio, const char *format, ...) throw(); 64 externER_UINT net_serial_rea_dat(ID portid, char *buf, uint_t len) throw();64 static ER_UINT net_serial_rea_dat(ID portid, char *buf, uint_t len) throw(); 65 65 extern ER net_serial_ctl_por(ID portid, uint_t ioctl) throw(); 66 66 -
EcnlProtoTool/trunk/asp3_dcre/sample/tSample2.c
r321 r429 3 3 * Toyohashi Open Platform for Embedded Real-Time Systems/ 4 4 * Advanced Standard Profile Kernel 5 * 5 * 6 6 * Copyright (C) 2015-2016 by Ushio Laboratory 7 7 * Graduate School of Engineering Science, Osaka Univ., JAPAN 8 * Copyright (C) 2015-201 6by Embedded and Real-Time Systems Laboratory8 * Copyright (C) 2015-2019 by Embedded and Real-Time Systems Laboratory 9 9 * Graduate School of Information Science, Nagoya Univ., JAPAN 10 10 * … … 42 42 43 43 /* 44 * サンプルプログラム( 1)の本体45 * 46 * ASPカーネルの基本的な動作を確認するためのサンプルプログラム .44 * サンプルプログラム(2)の本体 45 * 46 * ASPカーネルの基本的な動作を確認するためのサンプルプログラム(TECS版). 47 47 * 48 48 * プログラムの概要: 49 49 * 50 * ユーザインタフェースを受け持つメインタスク( タスクID: MAIN_TASK,優51 * 先度: MAIN_PRIORITY)と,3つの並行実行されるタスク(タスクID:52 * TASK1~TASK3,初期優先度: MID_PRIORITY)で構成される.また,起動周53 * 期が2秒の周期ハンドラ(周期ハンドラID: CYCHDR1)を用いる.54 * 55 * 並行実行されるタスクは,task_loop回空ループを実行する度に,タスクが56 * 実行中であることをあらわすメッセージを表示する.空ループを実行する57 * のは,空ループなしでメッセージを出力すると,多量のメッセージが出力58 * され,プログラムの動作が確認しずらくなるためである.また,低速なシ50 * ユーザインタフェースを受け持つメインタスク(MainTask)と,3つの並 51 * 行実行されるタスク(Task1~Task3),例外処理タスク(ExceptionTask) 52 * の5つのタスクを用いる.これらの他に,システムログタスクが動作する. 53 * また,周期ハンドラ,アラームハンドラ,割込みサービスルーチン,CPU 54 * 例外ハンドラをそれぞれ1つ用いる. 55 * 56 * 並行実行されるタスクは,task_loop回のループを実行する度に,タスク 57 * が実行中であることをあらわすメッセージを表示する.ループを実行する 58 * のは,プログラムの動作を確認しやすくするためである.また,低速なシ 59 59 * リアルポートを用いてメッセージを出力する場合に,すべてのメッセージ 60 60 * が出力できるように,メッセージの量を制限するという理由もある. 61 61 * 62 * 周期ハンドラは,三つの優先度(HIGH_PRIORITY,MID_PRIORITY, 63 * LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は, 64 * 周期ハンドラは停止状態になっている. 65 * 66 * メインタスクは,シリアルI/Oポートからの文字入力を行い(文字入力を 67 * 待っている間は,並列実行されるタスクが実行されている),入力された 68 * 文字に対応した処理を実行する.入力された文字と処理の関係は次の通り. 62 * 周期ハンドラ,アラームハンドラ,割込みサービスルーチンは,3つの優 63 * 先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)のレディキューを 64 * 回転させる.周期ハンドラは,プログラムの起動直後は停止状態になって 65 * いる. 66 * 67 * CPU例外ハンドラは,CPU例外からの復帰が可能な場合には,例外処理タス 68 * クを起動する.例外処理タスクは,CPU例外を起こしたタスクに対して, 69 * 終了要求を行う. 70 * 71 * メインタスクは,シリアルポートからの文字入力を行い(文字入力を待っ 72 * ている間は,並行実行されるタスクが実行されている),入力された文字 73 * に対応した処理を実行する.入力された文字と処理の関係は次の通り. 69 74 * Control-Cまたは'Q'が入力されると,プログラムを終了する. 70 75 * … … 97 102 * 'b' : アラームハンドラを5秒後に起動するよう動作開始させる. 98 103 * 'B' : アラームハンドラを動作停止させる. 99 * 'z' : 対象タスクにCPU例外を発生させる(タ スクを終了させる).100 * 'Z' : 対象タスクにCPUロック状態でCPU例外を発生させる( プログラムを101 * 終了する).102 * 'V' : fetchHighResolutionTimerで高分解能タイマを2回読む.104 * 'z' : 対象タスクにCPU例外を発生させる(ターゲットによっては復帰可能). 105 * 'Z' : 対象タスクにCPUロック状態でCPU例外を発生させる(復帰不可能). 106 * 'V' : 短いループを挟んで,fetchHighResolutionTimerで高分解能タイマを 107 * 2回読む. 103 108 * 'v' : 発行したシステムコールを表示する(デフォルト). 104 109 * 'q' : 発行したシステムコールを表示しない. 105 * 呼び口関数 #_TCPF_# 106 * require port: signature:sKernel context:task 107 * ER getExtendedInformation( intptr_t* p_exinf ); 108 * ER sleep( ); 109 * ER sleepTimeout( TMO timeout ); 110 * ER delay( RELTIM delayTime ); 111 * ER exit( ); 112 * ER disableTerminate( ); 113 * ER enableTerminate( ); 114 * bool_t senseTerminate( ); 115 * ER setTime( SYSTIM systemTime ); 116 * ER getTime( SYSTIM* p_systemTime ); 117 * ER adjustTime( int32_t adjustTime ); 118 * HRTCNT fetchHighResolutionTimer( ); 119 * ER rotateReadyQueue( PRI taskPriority ); 120 * ER getTaskId( ID* p_taskId ); 121 * ER getLoad( PRI taskPriority, uint_t* p_load ); 122 * ER getNthTask( PRI taskPriority, uint_t nth, ID* p_taskID ); 123 * ER lockCpu( ); 124 * ER unlockCpu( ); 125 * ER disableDispatch( ); 126 * ER enableDispatch( ); 127 * bool_t senseContext( ); 128 * bool_t senseLock( ); 129 * bool_t senseDispatch( ); 130 * bool_t senseDispatchPendingState( ); 131 * bool_t senseKernel( ); 132 * ER exitKernel( ); 133 * ER changeInterruptPriorityMask( PRI interruptPriority ); 134 * ER getInterruptPriorityMask( PRI* p_interruptPriority ); 135 * require port: signature:siKernel context:non-task 136 * HRTCNT ciKernel_fetchHighResolutionTimer( ); 137 * ER ciKernel_rotateReadyQueue( PRI taskPriority ); 138 * ER ciKernel_getTaskId( ID* p_taskId ); 139 * ER ciKernel_lockCpu( ); 140 * ER ciKernel_unlockCpu( ); 141 * bool_t ciKernel_senseContext( ); 142 * bool_t ciKernel_senseLock( ); 143 * bool_t ciKernel_senseDispatch( ); 144 * bool_t ciKernel_senseDispatchPendingState( ); 145 * bool_t ciKernel_senseKernel( ); 146 * ER ciKernel_exitKernel( ); 147 * bool_t ciKernel_exceptionSenseDispatchPendingState( const void* p_exceptionInformation ); 148 * call port: cTask signature: sTask context:task 149 * ER cTask_activate( subscript ); 150 * ER_UINT cTask_cancelActivate( subscript ); 151 * ER cTask_getTaskState( subscript, STAT* p_tskstat ); 152 * ER cTask_changePriority( subscript, PRI priority ); 153 * ER cTask_getPriority( subscript, PRI* p_priority ); 154 * ER cTask_refer( subscript, T_RTSK* pk_taskStatus ); 155 * ER cTask_wakeup( subscript ); 156 * ER_UINT cTask_cancelWakeup( subscript ); 157 * ER cTask_releaseWait( subscript ); 158 * ER cTask_suspend( subscript ); 159 * ER cTask_resume( subscript ); 160 * ER cTask_raiseTerminate( subscript ); 161 * ER cTask_terminate( subscript ); 162 * subscript: 0...(NCP_cTask-1) 163 * call port: cExceptionTask signature: sTask context:task 164 * ER cExceptionTask_activate( ); 165 * ER_UINT cExceptionTask_cancelActivate( ); 166 * ER cExceptionTask_getTaskState( STAT* p_tskstat ); 167 * ER cExceptionTask_changePriority( PRI priority ); 168 * ER cExceptionTask_getPriority( PRI* p_priority ); 169 * ER cExceptionTask_refer( T_RTSK* pk_taskStatus ); 170 * ER cExceptionTask_wakeup( ); 171 * ER_UINT cExceptionTask_cancelWakeup( ); 172 * ER cExceptionTask_releaseWait( ); 173 * ER cExceptionTask_suspend( ); 174 * ER cExceptionTask_resume( ); 175 * ER cExceptionTask_raiseTerminate( ); 176 * ER cExceptionTask_terminate( ); 177 * call port: cCyclic signature: sCyclic context:task 178 * ER cCyclic_start( ); 179 * ER cCyclic_stop( ); 180 * ER cCyclic_refer( T_RCYC* pk_cyclicHandlerStatus ); 181 * call port: cAlarm signature: sAlarm context:task 182 * ER cAlarm_start( RELTIM alarmTime ); 183 * ER cAlarm_stop( ); 184 * ER cAlarm_refer( T_RALM* pk_alarmStatus ); 185 * call port: cSerialPort signature: sSerialPort context:task optional:true 186 * bool_t is_cSerialPort_joined() check if joined 187 * ER cSerialPort_open( ); 188 * ER cSerialPort_close( ); 189 * ER_UINT cSerialPort_read( char* buffer, uint_t length ); 190 * ER_UINT cSerialPort_write( const char* buffer, uint_t length ); 191 * ER cSerialPort_control( uint_t ioControl ); 192 * ER cSerialPort_refer( T_SERIAL_RPOR* pk_rpor ); 193 * call port: cSysLog signature: sSysLog context:task 194 * ER cSysLog_write( uint_t priority, const SYSLOG* p_syslog ); 195 * ER_UINT cSysLog_read( SYSLOG* p_syslog ); 196 * ER cSysLog_mask( uint_t logMask, uint_t lowMask ); 197 * ER cSysLog_refer( T_SYSLOG_RLOG* pk_rlog ); 198 * ER cSysLog_flush( ); 199 * #[</PREAMBLE>]# */ 110 */ 200 111 201 112 #include "tSample2_tecsgen.h" … … 220 131 221 132 /* 133 * プロセッサ時間の消費 134 * 135 * ループによりプロセッサ時間を消費する.最適化ができないように,ルー 136 * プ内でvolatile変数を読み込む. 137 */ 138 static volatile long_t volatile_var; 139 140 static void 141 consume_time(ulong_t ctime) 142 { 143 ulong_t i; 144 145 for (i = 0; i < ctime; i++) { 146 (void) volatile_var; 147 } 148 } 149 150 /* 222 151 * 並行実行されるタスクへのメッセージ領域 223 152 */ … … 232 161 * 並行実行されるタスク 233 162 */ 234 void eSampleTask_main(int_t subscript)235 { 236 volatile ulong_t i; 163 void 164 eSampleTask_main(int_t subscript) 165 { 237 166 int_t n = 0; 238 167 int_t tskno = subscript + 1; … … 243 172 syslog(LOG_NOTICE, "task%d is running (%03d). %s", 244 173 tskno, ++n, graph[tskno-1]); 245 for (i = 0; i < task_loop; i++);174 consume_time(task_loop); 246 175 c = message[tskno-1]; 247 176 message[tskno-1] = 0; … … 290 219 291 220 /* 221 * 割込みサービスルーチン 222 * 223 * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー 224 * を回転させる. 225 */ 226 #ifdef INTNO1 227 228 void 229 eiISR_main(void) 230 { 231 intno1_clear(); 232 SVC_PERROR(ciKernel_rotateReadyQueue(HIGH_PRIORITY)); 233 SVC_PERROR(ciKernel_rotateReadyQueue(MID_PRIORITY)); 234 SVC_PERROR(ciKernel_rotateReadyQueue(LOW_PRIORITY)); 235 } 236 237 #endif /* INTNO1 */ 238 239 /* 292 240 * CPU例外ハンドラ 293 241 */ 294 295 242 ID cpuexc_tskid; /* CPU例外を起こしたタスクのID */ 296 243 … … 298 245 299 246 void 300 cpuexc_handler(void *p_excinf)247 eiCpuExceptionHandler_main(const void *p_excinf) 301 248 { 302 249 303 250 syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", p_excinf); 304 251 if (ciKernel_senseContext() != true) { 305 syslog(LOG_WARNING, 306 "ciKernel_senseContext() is not truein CPU exception handler.");252 syslog(LOG_WARNING, "ciKernel_senseContext() is not true" 253 " in CPU exception handler."); 307 254 } 308 255 if (ciKernel_senseDispatchPendingState() != true) { 309 syslog(LOG_WARNING, 310 "ciKernel_senseDispatchPendingState() is not true in CPU exception handler."); 311 } 312 syslog(LOG_INFO, "ciKernel_senseLock() = %d ciKernel_senseDispatch() = %d ciKernel_exceptionSenseDispatchPendingState() = %d", 313 ciKernel_senseLock(), ciKernel_senseDispatch(), ciKernel_exceptionSenseDispatchPendingState(p_excinf)); 256 syslog(LOG_WARNING, "ciKernel_senseDispatchPendingState() is not true" 257 " in CPU exception handler."); 258 } 259 syslog(LOG_INFO, "ciKernel_senseLock() = %d, ciKernel_senseDispatch() = %d", 260 ciKernel_senseLock(), ciKernel_senseDispatch()); 261 syslog(LOG_INFO, "ciKernel_exceptionSenseDispatchPendingState() = %d", 262 ciKernel_exceptionSenseDispatchPendingState(p_excinf)); 314 263 315 264 if (ciKernel_exceptionSenseDispatchPendingState(p_excinf)) { 316 265 syslog(LOG_NOTICE, "Sample program ends with exception."); 317 SVC_PERROR(ciKernel_ senseKernel());266 SVC_PERROR(ciKernel_exitKernel()); 318 267 assert(0); 319 268 } 320 269 321 #ifdef PREPARE_RETURN_CPUEXC322 PREPARE_RETURN_CPUEXC;323 270 SVC_PERROR(ciKernel_getTaskId(&cpuexc_tskid)); 324 271 cExceptionTask_activate(); 325 #else /* PREPARE_RETURN_CPUEXC */326 syslog(LOG_NOTICE, "Sample program ends with exception.");327 SVC_PERROR(ciKernel_exitKernel());328 assert(0);329 #endif /* PREPARE_RETURN_CPUEXC */330 272 } 331 273 … … 338 280 * を回転させる. 339 281 */ 340 /* #[<ENTRY_FUNC>]# eiCyclicHandler_main 341 * name: eiCyclicHandler_main 342 * global_name: tSample2_eiCyclicHandler_main 343 * oneway: 344 * #[/ENTRY_FUNC>]# */ 345 void 346 eiCyclicHandler_main() 282 void 283 eiCyclicHandler_main(void) 347 284 { 348 285 SVC_PERROR(ciKernel_rotateReadyQueue(HIGH_PRIORITY)); … … 357 294 * を回転させる. 358 295 */ 359 /* #[<ENTRY_FUNC>]# eiAlarmHandler_main 360 * name: eiAlarmHandler_main 361 * global_name: tSample2_eiAlarmHandler_main 362 * oneway: 363 * #[/ENTRY_FUNC>]# */ 364 void 365 eiAlarmHandler_main() 296 void 297 eiAlarmHandler_main(void) 366 298 { 367 299 SVC_PERROR(ciKernel_rotateReadyQueue(HIGH_PRIORITY)); … … 369 301 SVC_PERROR(ciKernel_rotateReadyQueue(LOW_PRIORITY)); 370 302 } 303 371 304 /* 372 305 * 例外処理タスク 373 306 */ 374 /* #[<ENTRY_FUNC>]# eExceptionTask_main 375 * name: eExceptionTask_main 376 * global_name: tSample2_eExceptionTask_main 377 * oneway: 378 * #[/ENTRY_FUNC>]# */ 379 void eExceptionTask_main() 307 void 308 eExceptionTask_main(void) 380 309 { 381 310 SVC_PERROR(ras_ter(cpuexc_tskid)); 382 311 } 312 383 313 /* 384 314 * メインタスク 385 315 */ 386 /* 属性の設定 *//* #[<ENTRY_FUNC>]# eMainTask_main 387 * name: eMainTask_main 388 * global_name: tSample2_eMainTask_main 389 * oneway: 390 * #[/ENTRY_FUNC>]# */ 391 void 392 eMainTask_main() 316 void 317 eMainTask_main(void) 393 318 { 394 319 char c; 395 volatile ulong_t i;396 ulong_t j;397 320 int_t tskno = 1; 398 321 ER_UINT ercd; 399 322 PRI tskpri; 323 #ifndef TASK_LOOP 400 324 SYSTIM stime1, stime2; 325 #endif /* TASK_LOOP */ 401 326 HRTCNT hrtcnt1, hrtcnt2; 402 327 403 if (is_cSerialPort_joined()) { 404 SVC_PERROR(cSysLog_mask(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_ERROR))); 405 } else { 406 /* 407 * シリアル出力ができない場合、ログメッセージを全て 408 * 低レベル出力により出力する。 409 */ 410 SVC_PERROR(cSysLog_mask(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_DEBUG))); 411 } 328 SVC_PERROR(cSysLog_mask(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG))); 412 329 syslog(LOG_NOTICE, "Sample program starts."); 413 330 … … 419 336 * ない. 420 337 */ 421 422 if (is_cSerialPort_joined()) { 423 ercd = cSerialPort_open(); 424 if (ercd < 0 && MERCD(ercd) != E_OBJ) { 425 syslog(LOG_ERROR, "%s (%d) reported by `cSerialPort_open'.", 426 itron_strerror(ercd), SERCD(ercd)); 427 } 428 SVC_PERROR(cSerialPort_control(IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV)); 429 } 338 ercd = cSerialPort_open(); 339 if (ercd < 0 && MERCD(ercd) != E_OBJ) { 340 syslog(LOG_ERROR, "%s (%d) reported by `cSerialPort_open'.", 341 itron_strerror(ercd), SERCD(ercd)); 342 } 343 SVC_PERROR(cSerialPort_control(IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV)); 430 344 431 345 /* 432 346 * ループ回数の設定 433 347 * 434 * 並行実行されるタスク内での 空ループの回数(task_loop)は,空ルー435 * プの実行時間が約0.4秒になるように設定する.この設定のために,436 * LOOP_REF回の 空ループの実行時間を,その前後でget_timを呼ぶことで437 * 測定し,その測定結果から空ループの実行時間が0.4秒になるループ 回438 * 数を求め,task_loopに設定する.348 * 並行実行されるタスク内でのループの回数(task_loop)は,ループ 349 * の実行時間が約0.4秒になるように設定する.この設定のために, 350 * LOOP_REF回のループの実行時間を,その前後でgetTimeを呼ぶことで 351 * 測定し,その測定結果から空ループの実行時間が0.4秒になるループ 352 * 回数を求め,task_loopに設定する. 439 353 * 440 * LOOP_REFは,デフォルトでは1,000,000に設定しているが,想定したよ 441 * り遅いプロセッサでは,サンプルプログラムの実行開始に時間がかか 442 * りすぎるという問題を生じる.逆に想定したより速いプロセッサでは, 443 * LOOP_REF回の空ループの実行時間が短くなり,task_loopに設定する値 444 * の誤差が大きくなるという問題がある. 445 * 446 * そこで,そのようなターゲットでは,target_test.hで,LOOP_REFを適 447 * 切な値に定義するのが望ましい. 354 * LOOP_REFは,デフォルトでは1,000,000に設定しているが,想定した 355 * より遅いプロセッサでは,サンプルプログラムの実行開始に時間がか 356 * かりすぎるという問題を生じる.逆に想定したより速いプロセッサで 357 * は,LOOP_REF回のループの実行時間が短くなり,task_loopに設定す 358 * る値の誤差が大きくなるという問題がある.そこで,そのようなター 359 * ゲットでは,target_test.hで,LOOP_REFを適切な値に定義すること 360 * とする. 448 361 * 449 362 * また,task_loopの値を固定したい場合には,その値をTASK_LOOPにマ 450 * クロ定義する.TASK_LOOPがマクロ定義されている場合,上記の測定 を451 * 行わずに,TASK_LOOPに定義された値を空ループの回数とする.363 * クロ定義する.TASK_LOOPがマクロ定義されている場合,上記の測定 364 * を行わずに,TASK_LOOPに定義された値をループの回数とする. 452 365 * 453 * ターゲットによっては,空ループの実行時間の1回目の測定で,本来よ454 * りも長めになるものがある.このようなターゲットでは,MEASURE_TWICE455 * をマクロ定義することで,1回目の測定結果を捨てて,2回目の測定結果456 * を使う.366 * ターゲットによっては,ループの実行時間の1回目の測定で,本来より 367 * も長めになるものがある.このようなターゲットでは,MEASURE_TWICE 368 * をマクロ定義することで,1回目の測定結果を捨てて,2回目の測定結 369 * 果を使う. 457 370 */ 458 371 #ifdef TASK_LOOP … … 461 374 462 375 #ifdef MEASURE_TWICE 463 task_loop = LOOP_REF; 464 SVC_PERROR(get_tim(&stime1)); 465 for (i = 0; i < task_loop; i++); 466 SVC_PERROR(get_tim(&stime2)); 376 SVC_PERROR(getTime(&stime1)); 377 consume_time(LOOP_REF); 378 SVC_PERROR(getTime(&stime2)); 467 379 #endif /* MEASURE_TWICE */ 468 380 469 task_loop = LOOP_REF; 470 SVC_PERROR(get_tim(&stime1)); 471 for (i = 0; i < task_loop; i++); 472 SVC_PERROR(get_tim(&stime2)); 381 SVC_PERROR(getTime(&stime1)); 382 consume_time(LOOP_REF); 383 SVC_PERROR(getTime(&stime2)); 473 384 task_loop = LOOP_REF * 400LU / (ulong_t)(stime2 - stime1) * 1000LU; 474 385 … … 478 389 * タスクの起動 479 390 */ 480 481 SVC_PERROR(cTask_activate( 1 )); 482 SVC_PERROR(cTask_activate( 2 )); 483 SVC_PERROR(cTask_activate( 3 )); 391 SVC_PERROR(cTask_activate(1)); 392 SVC_PERROR(cTask_activate(2)); 393 SVC_PERROR(cTask_activate(3)); 484 394 485 395 /* 486 396 * メインループ 487 397 */ 488 if (is_cSerialPort_joined()) { 489 do { 490 SVC_PERROR(cSerialPort_read(&c, 1)); 491 switch (c) { 492 case 'e': 493 case 's': 494 case 'S': 495 case 'd': 496 case 'y': 497 case 'Y': 498 case 'z': 499 case 'Z': 500 message[tskno-1] = c; 501 break; 502 case '1': 503 tskno = 1; 504 break; 505 case '2': 506 tskno = 2; 507 break; 508 case '3': 509 tskno = 3; 510 break; 511 case 'a': 512 syslog(LOG_INFO, "#cTask_activate(%d)", tskno); 513 SVC_PERROR(cTask_activate(tskno)); 514 break; 515 case 'A': 516 syslog(LOG_INFO, "#cTask_cancelActivate(%d)", tskno); 517 SVC_PERROR(cTask_cancelActivate(tskno)); 518 519 if (ercd >= 0) { 520 syslog(LOG_NOTICE, "cTask_cancelActivate(%d) returns %d", tskno, ercd); 521 } 522 break; 523 case 't': 524 syslog(LOG_INFO, "#cTask_terminate(%d)", tskno); 525 SVC_PERROR(cTask_terminate(tskno)); 526 break; 527 case '>': 528 syslog(LOG_INFO, "#cTask_changePriority(%d, HIGH_PRIORITY)", tskno); 529 SVC_PERROR(cTask_changePriority(tskno, HIGH_PRIORITY)); 530 break; 531 case '=': 532 syslog(LOG_INFO, "#cTask_changePriority(%d, MID_PRIORITY)", tskno); 533 SVC_PERROR(cTask_changePriority(tskno, MID_PRIORITY)); 534 break; 535 case '<': 536 syslog(LOG_INFO, "#(cTask_changePriority(%d, LOW_PRIORITY)", tskno); 537 SVC_PERROR(cTask_changePriority(tskno, LOW_PRIORITY)); 538 break; 539 case 'G': 540 syslog(LOG_INFO, "#cTask_getPriority(%d, &tskpri)", tskno); 541 SVC_PERROR(ercd = cTask_getPriority(tskno, &tskpri)); 542 if (ercd >= 0) { 543 syslog(LOG_NOTICE, "priority of task %d is %d", tskno, tskpri); 544 } 545 break; 546 case 'w': 547 syslog(LOG_INFO, "#cTask_wakeup(%d)", tskno); 548 SVC_PERROR(cTask_wakeup(tskno)); 549 break; 550 case 'W': 551 syslog(LOG_INFO, "#cTask_cancelWakeup(%d)", tskno); 552 SVC_PERROR(ercd = cTask_cancelWakeup(tskno)); 553 if (ercd >= 0) { 554 syslog(LOG_NOTICE, "cTask_cancelWakeup(%d) returns %d", tskno, ercd); 555 } 556 break; 557 case 'l': 558 syslog(LOG_INFO, "#cTask_releaseWait(%d)", tskno); 559 SVC_PERROR(cTask_releaseWait(tskno)); 560 break; 561 case 'u': 562 syslog(LOG_INFO, "#cTask_suspend(%d)", tskno); 563 SVC_PERROR(cTask_suspend(tskno)); 564 break; 565 case 'm': 566 syslog(LOG_INFO, "#cTask_resume(%d)", tskno); 567 SVC_PERROR(cTask_resume(tskno)); 568 break; 569 case 'x': 570 syslog(LOG_INFO, "#cTask_raiseTerminate(%d)", tskno); 571 SVC_PERROR(cTask_raiseTerminate(tskno)); 572 break; 573 case 'X': 574 syslog(LOG_INFO, "#cTask_raiseTerminate(%d)", tskno); 575 SVC_PERROR(cTask_raiseTerminate(tskno)); 576 break; 577 case 'r': 578 syslog(LOG_INFO, "#rotateReadyQueue(three priorities)"); 579 SVC_PERROR(rotateReadyQueue(HIGH_PRIORITY)); 580 SVC_PERROR(rotateReadyQueue(MID_PRIORITY)); 581 SVC_PERROR(rotateReadyQueue(LOW_PRIORITY)); 582 break; 583 case 'c': 584 syslog(LOG_INFO, "#cCyclic_start(1)"); 585 SVC_PERROR(cCyclic_start()); 586 break; 587 case 'C': 588 syslog(LOG_INFO, "#cCyclic_stop(1)"); 589 SVC_PERROR(cCyclic_stop()); 590 break; 591 case 'b': 592 syslog(LOG_INFO, "#cAlarm_start(1, 5000000)"); 593 SVC_PERROR(cAlarm_start(5000000)); 594 break; 595 case 'B': 596 syslog(LOG_INFO, "#cAlarm_stop()(1)"); 597 SVC_PERROR(cAlarm_stop()); 598 break; 599 case 'V': 600 hrtcnt1 = fetchHighResolutionTimer(); 601 hrtcnt2 = fetchHighResolutionTimer(); 602 syslog(LOG_NOTICE, "hrtcnt1 = %tu, hrtcnt2 = %tu", 603 hrtcnt1, hrtcnt2); 604 break; 605 case 'v': 606 SVC_PERROR(cSysLog_mask(LOG_UPTO(LOG_INFO), 607 LOG_UPTO(LOG_EMERG))); 608 break; 609 case 'q': 610 SVC_PERROR(cSysLog_mask(LOG_UPTO(LOG_NOTICE), 611 LOG_UPTO(LOG_EMERG))); 612 break; 613 #ifdef BIT_KERNEL 614 case ' ': 615 SVC_PERROR(lockCpu()); 616 { 617 extern ER bit_kernel(void); 618 619 SVC_PERROR(ercd = bit_kernel()); 620 if (ercd >= 0) { 621 syslog(LOG_NOTICE, "bit_kernel passed."); 622 } 623 } 624 SVC_PERROR(unlockCpu()); 625 break; 626 #endif /* BIT_KERNEL */ 627 628 default: 629 break; 398 do { 399 SVC_PERROR(cSerialPort_read(&c, 1)); 400 switch (c) { 401 case 'e': 402 case 's': 403 case 'S': 404 case 'd': 405 case 'y': 406 case 'Y': 407 case 'z': 408 case 'Z': 409 message[tskno-1] = c; 410 break; 411 case '1': 412 tskno = 1; 413 break; 414 case '2': 415 tskno = 2; 416 break; 417 case '3': 418 tskno = 3; 419 break; 420 case 'a': 421 syslog(LOG_INFO, "#cTask_activate(%d)", tskno); 422 SVC_PERROR(cTask_activate(tskno)); 423 break; 424 case 'A': 425 syslog(LOG_INFO, "#cTask_cancelActivate(%d)", tskno); 426 SVC_PERROR(ercd = cTask_cancelActivate(tskno)); 427 if (ercd >= 0) { 428 syslog(LOG_NOTICE, "cTask_cancelActivate(%d) returns %d", 429 tskno, ercd); 630 430 } 631 } while (c != '\003' && c != 'Q'); 632 } else { 633 syslog(LOG_NOTICE, "cSerialPort of tSample2 is not joined."); 634 syslog(LOG_NOTICE, "Sample program will halt after 40 seconds."); 635 for (j = 0; j < 100; j++) { 636 for (i = 0; i < task_loop; i++); 431 break; 432 case 't': 433 syslog(LOG_INFO, "#cTask_terminate(%d)", tskno); 434 SVC_PERROR(cTask_terminate(tskno)); 435 break; 436 case '>': 437 syslog(LOG_INFO, "#cTask_changePriority(%d, HIGH_PRIORITY)", tskno); 438 SVC_PERROR(cTask_changePriority(tskno, HIGH_PRIORITY)); 439 break; 440 case '=': 441 syslog(LOG_INFO, "#cTask_changePriority(%d, MID_PRIORITY)", tskno); 442 SVC_PERROR(cTask_changePriority(tskno, MID_PRIORITY)); 443 break; 444 case '<': 445 syslog(LOG_INFO, "#(cTask_changePriority(%d, LOW_PRIORITY)", tskno); 446 SVC_PERROR(cTask_changePriority(tskno, LOW_PRIORITY)); 447 break; 448 case 'G': 449 syslog(LOG_INFO, "#cTask_getPriority(%d, &tskpri)", tskno); 450 SVC_PERROR(ercd = cTask_getPriority(tskno, &tskpri)); 451 if (ercd >= 0) { 452 syslog(LOG_NOTICE, "priority of task %d is %d", tskno, tskpri); 453 } 454 break; 455 case 'w': 456 syslog(LOG_INFO, "#cTask_wakeup(%d)", tskno); 457 SVC_PERROR(cTask_wakeup(tskno)); 458 break; 459 case 'W': 460 syslog(LOG_INFO, "#cTask_cancelWakeup(%d)", tskno); 461 SVC_PERROR(ercd = cTask_cancelWakeup(tskno)); 462 if (ercd >= 0) { 463 syslog(LOG_NOTICE, "cTask_cancelWakeup(%d) returns %d", 464 tskno, ercd); 465 } 466 break; 467 case 'l': 468 syslog(LOG_INFO, "#cTask_releaseWait(%d)", tskno); 469 SVC_PERROR(cTask_releaseWait(tskno)); 470 break; 471 case 'u': 472 syslog(LOG_INFO, "#cTask_suspend(%d)", tskno); 473 SVC_PERROR(cTask_suspend(tskno)); 474 break; 475 case 'm': 476 syslog(LOG_INFO, "#cTask_resume(%d)", tskno); 477 SVC_PERROR(cTask_resume(tskno)); 478 break; 479 case 'x': 480 syslog(LOG_INFO, "#cTask_raiseTerminate(%d)", tskno); 481 SVC_PERROR(cTask_raiseTerminate(tskno)); 482 break; 483 case 'X': 484 syslog(LOG_INFO, "#cTask_raiseTerminate(%d)", tskno); 485 SVC_PERROR(cTask_raiseTerminate(tskno)); 486 break; 487 case 'r': 488 syslog(LOG_INFO, "#rotateReadyQueue(three priorities)"); 489 SVC_PERROR(rotateReadyQueue(HIGH_PRIORITY)); 490 SVC_PERROR(rotateReadyQueue(MID_PRIORITY)); 491 SVC_PERROR(rotateReadyQueue(LOW_PRIORITY)); 492 break; 493 case 'c': 494 syslog(LOG_INFO, "#cCyclic_start()"); 495 SVC_PERROR(cCyclic_start()); 496 break; 497 case 'C': 498 syslog(LOG_INFO, "#cCyclic_stop()"); 499 SVC_PERROR(cCyclic_stop()); 500 break; 501 case 'b': 502 syslog(LOG_INFO, "#cAlarm_start(5000000)"); 503 SVC_PERROR(cAlarm_start(5000000)); 504 break; 505 case 'B': 506 syslog(LOG_INFO, "#cAlarm_stop()"); 507 SVC_PERROR(cAlarm_stop()); 508 break; 509 510 case 'V': 511 hrtcnt1 = fetchHighResolutionTimer(); 512 consume_time(1000LU); 513 hrtcnt2 = fetchHighResolutionTimer(); 514 syslog(LOG_NOTICE, "hrtcnt1 = %tu, hrtcnt2 = %tu", 515 (uint32_t) hrtcnt1, (uint32_t) hrtcnt2); 516 break; 517 518 case 'v': 519 SVC_PERROR(cSysLog_mask(LOG_UPTO(LOG_INFO), 520 LOG_UPTO(LOG_EMERG))); 521 break; 522 case 'q': 523 SVC_PERROR(cSysLog_mask(LOG_UPTO(LOG_NOTICE), 524 LOG_UPTO(LOG_EMERG))); 525 break; 526 527 case '\003': 528 case 'Q': 529 break; 530 531 default: 532 syslog(LOG_INFO, "Unknown command: '%c'.", c); 533 break; 637 534 } 638 } 535 } while (c != '\003' && c != 'Q'); 639 536 640 537 syslog(LOG_NOTICE, "Sample program ends."); 641 SVC_PERROR( ciKernel_exitKernel());538 SVC_PERROR(exitKernel()); 642 539 assert(0); 643 540 } -
EcnlProtoTool/trunk/asp3_dcre/sample/tSample2.cdl
r321 r429 4 4 * $Id$ 5 5 */ 6 6 7 /* 7 8 * カーネルオブジェクトの定義 8 9 */ 9 import( "kernel.cdl");10 import(<kernel.cdl>); 10 11 11 12 /* … … 14 15 import("syssvc/tSerialPort.cdl"); 15 16 import("syssvc/tSysLog.cdl"); 17 import("syssvc/tSysLogAdapter.cdl"); 16 18 import("syssvc/tLogTask.cdl"); 17 19 import("syssvc/tBanner.cdl"); … … 23 25 24 26 /* 27 * サンプルプログラムのC言語ヘッダファイルの取り込み 28 */ 29 import_C("tSample2.h"); 30 31 /* 25 32 * 「セルの組上げ記述」とは,"cell"で始まる行から,それに対応する"};" 26 33 * の行までのことを言う. … … 28 35 29 36 /* 30 * システムログ機能の組上げ記述 37 * システムログ機能のアダプタの組上げ記述 38 * 39 * システムログ機能のアダプタは,C言語で記述されたコードから,TECSベー 40 * スのシステムログ機能を呼び出すためのセルである.システムログ機能の 41 * サービスコール(syslog,syslog_0~syslog_5,t_perrorを含む)を呼び 42 * 出さない場合には,以下のセルの組上げ記述を削除してよい. 43 */ 44 cell tSysLogAdapter SysLogAdapter { 45 cSysLog = SysLog.eSysLog; 46 }; 47 48 /* 49 * システムログ機能の組上げ記述 31 50 * 32 51 * システムログ機能を外す場合には,以下のセルの組上げ記述を削除し,コ … … 42 61 initLowMask = C_EXP("LOG_UPTO(LOG_EMERG)"); 43 62 /* 低レベル出力すべき重要度 */ 44 45 63 /* 低レベル出力との結合 */ 46 64 cPutLog = PutLogTarget.ePutLog; … … 48 66 49 67 /* 50 * 68 * シリアルインタフェースドライバの組上げ記述 51 69 * 52 70 * シリアルインタフェースドライバを外す場合には,以下のセルの組上げ記 … … 65 83 66 84 /* 67 * 85 * システムログタスクの組上げ記述 68 86 * 69 87 * システムログタスクを外す場合には,以下のセルの組上げ記述を削除すれ … … 86 104 87 105 /* 88 * 106 * カーネル起動メッセージ出力の組上げ記述 89 107 * 90 108 * カーネル起動メッセージの出力を外す場合には,以下のセルの組上げ記述 … … 98 116 99 117 /* 100 * サンプルプログラムの定義118 * サンプルプログラムのセルタイプの定義 101 119 */ 102 120 [singleton] … … 111 129 call sAlarm cAlarm; 112 130 113 [optional] call sSerialPort cSerialPort;/* シリアルドライバとの接続 */131 call sSerialPort cSerialPort; /* シリアルドライバとの接続 */ 114 132 call sSysLog cSysLog; /* システムログ機能との接続 */ 115 133 … … 118 136 entry sTaskBody eExceptionTask; /* 例外処理タスク */ 119 137 120 entry siHandlerBody eiCyclicHandler;/* 周期ハンドラ*/ 121 entry siHandlerBody eiAlarmHandler; /* アラームハンドラ */ 122 }; 123 124 /* 125 * 組み上げ記述 126 */ 127 128 /* Sample2のプロトタイプ宣言 */ 129 cell tSample2 Sample2; 130 131 cell tKernel ASPKernel{ 138 entry siHandlerBody eiCyclicHandler; /* 周期ハンドラ*/ 139 entry siHandlerBody eiAlarmHandler; /* アラームハンドラ */ 140 141 entry siHandlerBody eiISR; /* 割込みサービスルーチン */ 142 143 entry siCpuExceptionHandlerBody eiCpuExceptionHandler; 144 /* CPU例外ハンドラ */ 145 }; 146 147 /* 148 * 組み上げ記述 149 */ 150 151 cell tKernel ASPKernel { 132 152 }; 133 153 … … 181 201 182 202 cell tAlarmHandler AlarmHandler { 203 /* 呼び口の結合 */ 183 204 ciHandlerBody = Sample2.eiAlarmHandler; 184 205 }; 185 206 207 cell tInterruptRequest InterruptRequest { 208 /* 属性の設定 */ 209 interruptNumber = C_EXP("INTNO1"); 210 attribute = C_EXP("INTNO1_INTATR"); 211 interruptPriority = C_EXP("INTNO1_INTPRI"); 212 }; 213 214 cell tISR InterruptServiceRoutine { 215 /* 呼び口の結合 */ 216 ciISRBody = Sample2.eiISR; 217 /* 属性の設定 */ 218 attribute = C_EXP("TA_NULL"); 219 interruptNumber = C_EXP("INTNO1"); 220 }; 221 222 cell tCpuExceptionHandler CpuExceptionHandler { 223 /* 呼び口の結合 */ 224 ciCpuExceptionHandlerBody = Sample2.eiCpuExceptionHandler; 225 /* 属性の設定 */ 226 cpuExceptionHandlerNumber = C_EXP("CPUEXC1"); 227 }; 228 186 229 cell tSample2 Sample2 { 187 230 /* 呼び口の結合 */ 188 cTask[ 0] = MainTask.eTask;189 cTask[ 1] = Task1.eTask;190 cTask[ 2] = Task2.eTask;191 cTask[ 3] = Task3.eTask;231 cTask[0] = MainTask.eTask; 232 cTask[1] = Task1.eTask; 233 cTask[2] = Task2.eTask; 234 cTask[3] = Task3.eTask; 192 235 193 236 cExceptionTask = ExceptionTask.eTask; -
EcnlProtoTool/trunk/asp3_dcre/sample/tSample2.cfg
r321 r429 4 4 * $Id$ 5 5 */ 6 INCLUDE("gen/tecsgen.cfg"); 7 8 #include "tSample2.h" 9 10 #ifdef CPUEXC1 11 DEF_EXC(CPUEXC1, { TA_NULL, cpuexc_handler }); 12 #endif /* CPUEXC1 */ 6 INCLUDE("tecsgen.cfg"); -
EcnlProtoTool/trunk/asp3_dcre/sample/tSample2.h
r321 r429 6 6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory 7 7 * Toyohashi Univ. of Technology, JAPAN 8 * Copyright (C) 2004-20 07by Embedded and Real-Time Systems Laboratory8 * Copyright (C) 2004-2018 by Embedded and Real-Time Systems Laboratory 9 9 * Graduate School of Information Science, Nagoya Univ., JAPAN 10 10 * … … 55 55 56 56 #define EXC_PRIORITY 1 /* 例外処理タスクの優先度 */ 57 #define MAIN_PRIORITY 6/* メインタスクの優先度 */57 #define MAIN_PRIORITY 5 /* メインタスクの優先度 */ 58 58 /* HIGH_PRIORITYより高くすること */ 59 59 … … 75 75 76 76 /* 77 * 関数のプロトタイプ宣言77 * 必要な定義のチェック 78 78 */ 79 #ifndef TOPPERS_MACRO_ONLY 80 81 //extern void task(intptr_t exinf); 82 extern void main_task(intptr_t exinf); 83 extern void cyclic_handler(intptr_t exinf); 84 extern void alarm_handler(intptr_t exinf); 85 extern void cpuexc_handler(void *p_excinf); 86 87 #endif /* TOPPERS_MACRO_ONLY */ 79 #ifndef INTNO1 80 #error INTNO1 is necessary for this sample program. 81 #endif /* INTNO1 */ 82 #ifndef CPUEXC1 83 #error CPUEXC1 is necessary for this sample program. 84 #endif /* CPUEXC1 */
Note:
See TracChangeset
for help on using the changeset viewer.