Ignore:
Timestamp:
Jul 3, 2020, 7:19:17 PM (4 years ago)
Author:
coas-nagasima
Message:

ASP3, TINET, mbed を更新

Location:
EcnlProtoTool/trunk/asp3_dcre/sample
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/asp3_dcre/sample/Makefile

    r331 r429  
    66#  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77#                              Toyohashi Univ. of Technology, JAPAN
    8 #  Copyright (C) 2006-2016 by Embedded and Real-Time Systems Laboratory
     8#  Copyright (C) 2006-2019 by Embedded and Real-Time Systems Laboratory
    99#              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010#
     
    9191
    9292#
     93#  TECS関係ファイルのディレクトリの定義
     94#
     95TECSDIR = @(TECSDIR)
     96
     97#
    9398#  トレースログを取得するかどうかの定義
    9499#
     
    119124
    120125#
    121 #  依存関係ファイルを置くディレクトリの定義
    122 #
    123 DEPDIR = @(DEPDIR)
     126#  中間オブジェクトファイルと依存関係ファイルを置くディレクトリの定義
     127#
     128OBJDIR = @(OBJDIR)
     129DEPDIR = @(OBJDIR)
    124130
    125131#
     
    149155        -include $(TECSGENDIR)/Makefile.tecsgen
    150156endif
     157
     158TINETDIR =
    151159
    152160#
     
    191199        APPL_COBJS := @(APPLOBJS)
    192200endif
    193 APPL_COBJS := $(APPL_COBJS) log_output.o vasyslog.o t_perror.o strerror.o
     201APPL_COBJS := $(APPL_COBJS) log_output.o vasyslog.o t_perror.o strerror.o mbed_stub.o
    194202APPL_CFLAGS := $(APPL_CFLAGS)
    195203ifdef APPLDIRS
     
    197205endif
    198206
    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
     207ifdef 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
     237endif
    231238
    232239#
     
    236243                                $(SYSSVC_DIRS) $(SRCDIR)/syssvc
    237244SYSSVC_ASMOBJS := $(SYSSVC_ASMOBJS)
    238 SYSSVC_COBJS := $(INIT_TECS_COBJ) $(TECS_COBJS) $(SYSSVC_COBJS) \
    239                                 @(SYSSVCOBJS) $(CXXRTS)
     245SYSSVC_COBJS := $(SYSSVC_COBJS) $(TECS_COBJS) \
     246                                $(INIT_TECS_COBJ) $(CXXRTS)
    240247SYSSVC_CFLAGS := $(SYSSVC_CFLAGS)
    241248INCLUDES := $(INCLUDES) -I$(TECSGENDIR) -I$(SRCDIR)/tecs_kernel
    242249
    243250#
     251#  トレースログ記録のサンプルコードに関する定義
     252#
     253ifdef ENABLE_TRACE
     254        COPTS := $(COPTS) -DTOPPERS_ENABLE_TRACE
     255        SYSSVC_DIRS := $(SYSSVC_DIRS) $(SRCDIR)/arch/tracelog
     256endif
     257
     258#
    244259#  ターゲットファイル
    245260#
    246261.PHONY: all
    247262ifndef OMIT_TECS
    248 all: tecs
     263all: tecs | $(DEPDIR)
    249264#       @$(MAKE) check
    250265        @$(MAKE) check $(OBJNAME).bin
     
    261276#  コンフィギュレータに関する定義
    262277#
    263 CFG_TABS := --api-table $(SRCDIR)/tinet/tcpip_api.def:tcpip \
     278CFG_KERNEL := --kernel asp
     279ifndef 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)
     283else
     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 \
    264286                        --api-table $(SRCDIR)/kernel/kernel_api.def:kernel \
    265                         --symval-table $(SRCDIR)/tinet/tcpip_sym.def \
     287                        --symval-table $(TINET_ROOT)/tcpip_sym.def \
    266288                        --symval-table $(SRCDIR)/kernel/kernel_sym.def $(CFG_TABS)
     289endif
    267290CFG_ASMOBJS := $(CFG_ASMOBJS)
    268291CFG_COBJS := kernel_cfg.o $(CFG_COBJS)
    269 CFG_OBJS := $(CFG_ASMOBJS) $(CFG_COBJS)
     292CFG_CFLAGS := -DTOPPERS_CB_TYPE_ONLY $(CFG_CFLAGS)
     293
    270294CFG2_OUT_SRCS := kernel_cfg.h kernel_cfg.c $(CFG2_OUT_SRCS)
    271 CFG_CFLAGS := -DTOPPERS_CB_TYPE_ONLY $(CFG_CFLAGS)
    272295
    273296#
     
    300323                                        $(foreach file,$(KERNEL_FCSRCS),$(file:.c=.o))
    301324endif
    302 ifdef OMIT_OFFSET_H
    303         OFFSET_H =
    304 else
     325ifdef TARGET_OFFSET_TRB
    305326        OFFSET_H = offset.h
    306327endif
     
    318339endif
    319340ifndef TARGET_TCPIP_TRB
    320         TARGET_TCPIP_TRB := $(SRCDIR)/tinet/tinet.trb
     341        TARGET_TCPIP_TRB := $(SRCDIR)/$(TINETDIR)/tinet.trb
    321342endif
    322343
     
    330351
    331352#
     353#  中間オブジェクトファイルを置くディレクトリの処理
     354#
     355APPL_ASMOBJS   := $(addprefix $(OBJDIR)/, $(APPL_ASMOBJS))
     356APPL_CXXOBJS   := $(addprefix $(OBJDIR)/, $(APPL_CXXOBJS))
     357APPL_COBJS     := $(addprefix $(OBJDIR)/, $(APPL_COBJS))
     358SYSSVC_ASMOBJS := $(addprefix $(OBJDIR)/, $(SYSSVC_ASMOBJS))
     359SYSSVC_COBJS   := $(addprefix $(OBJDIR)/, $(SYSSVC_COBJS))
     360KERNEL_ASMOBJS := $(addprefix $(OBJDIR)/, $(KERNEL_ASMOBJS))
     361KERNEL_COBJS   := $(addprefix $(OBJDIR)/, $(KERNEL_COBJS))
     362KERNEL_LCOBJS  := $(addprefix $(OBJDIR)/, $(KERNEL_LCOBJS))
     363CFG_ASMOBJS    := $(addprefix $(OBJDIR)/, $(CFG_ASMOBJS))
     364CFG_COBJS      := $(addprefix $(OBJDIR)/, $(CFG_COBJS))
     365
     366#
    332367#  コンパイルのための変数の定義
    333368#
     369APPL_OBJS = $(APPL_ASMOBJS) $(APPL_COBJS) $(APPL_CXXOBJS)
     370SYSSVC_OBJS = $(SYSSVC_ASMOBJS) $(SYSSVC_COBJS)
    334371KERNEL_LIB_OBJS = $(KERNEL_ASMOBJS) $(KERNEL_COBJS) $(KERNEL_LCOBJS)
    335 SYSSVC_OBJS = $(SYSSVC_ASMOBJS) $(SYSSVC_COBJS)
    336 APPL_OBJS = $(APPL_ASMOBJS) $(APPL_COBJS) $(APPL_CXXOBJS)
     372CFG_OBJS = $(CFG_ASMOBJS) $(CFG_COBJS)
    337373ALL_OBJS = $(START_OBJS) $(APPL_OBJS) $(SYSSVC_OBJS) $(CFG_OBJS) \
    338374                                                                                        $(END_OBJS) $(HIDDEN_OBJS)
     
    368404tecs $(TECSGEN_SRCS) $(TECS_HEADERS): $(TECSGEN_TIMESTAMP) ;
    369405$(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)
    371407
    372408#
     
    375411cfg1_out.c cfg1_out.db: cfg1_out.timestamp ;
    376412cfg1_out.timestamp: $(APPL_CFG) $(TECSGEN_TIMESTAMP)
    377         $(CFG) --pass 1 --kernel asp $(INCLUDES) $(CFG_TABS) \
     413        $(CFG) --pass 1 $(CFG_KERNEL) $(INCLUDES) $(CFG_TABS) \
    378414                                                -M $(DEPDIR)/cfg1_out_c.d $(TARGET_KERNEL_CFG) $<
    379415
    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)
    381417        $(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)
    383419
    384420cfg1_out.syms: $(CFG1_OUT)
     
    390426$(CFG2_OUT_SRCS) cfg2_out.db: kernel_cfg.timestamp ;
    391427kernel_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):kernel
     428        $(CFG) --pass 2 $(CFG_KERNEL) $(INCLUDES) $(CFG_TRB)
    393429
    394430#
     
    397433$(OFFSET_H): offset.timestamp ;
    398434offset.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) \
    400436                                --rom-symbol cfg1_out.syms --rom-image cfg1_out.srec
    401437
     
    409445
    410446#
     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#
    411454#  特別な依存関係の定義
    412455#
    413 tBannerMain.o: $(filter-out tBannerMain.o,$(ALL_OBJS)) $(LIBS_DEP)
     456$(OBJDIR)/@(BANNEROBJ): $(filter-out $(OBJDIR)/@(BANNEROBJ),$(ALL_OBJS)) \
     457                                                                                                                                $(LIBS_DEP)
    414458
    415459#
     
    417461#
    418462$(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 \
    420464                        $(START_OBJS) $(APPL_OBJS) $(SYSSVC_OBJS) $(CFG_OBJS) \
    421465                        $(ALL_LIBS) $(END_OBJS)
     466
     467#
     468#  依存関係フォルダの作成
     469#
     470$(DEPDIR):
     471        mkdir $@
    422472
    423473#
     
    445495check: check.timestamp ;
    446496check.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) \
    448498                                --rom-symbol $(OBJNAME).syms --rom-image $(OBJNAME).srec
    449499        @echo "configuration check passed"
     
    454504.PHONY: clean
    455505clean:
    456         rm -f \#* *~ *.o $(DEPDIR)/*.d $(CLEAN_FILES) check.timestamp
     506        rm -f \#* *~ $(OBJDIR)/*.o $(DEPDIR)/*.d $(CLEAN_FILES) check.timestamp
    457507        rm -f $(OBJFILE) $(OBJNAME).syms $(OBJNAME).srec $(OBJNAME).bin
    458508        rm -f kernel_cfg.timestamp $(CFG2_OUT_SRCS) cfg2_out.db
     
    468518cleankernel:
    469519        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)
    471521
    472522.PHONY: realclean
     
    480530#  のみを付けてコンパイルする.
    481531#
    482 ALL_CFG_COBJS = $(CFG_COBJS) cfg1_out.o
     532ALL_CFG_COBJS = $(CFG_COBJS) $(OBJDIR)/cfg1_out.o
    483533ALL_CFG_ASMOBJS = $(CFG_ASMOBJS)
    484534
    485 $(ALL_CFG_COBJS): %.o: %.c
    486         $(CC) -c -MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(CFG_CFLAGS) $<
    487 
    488 $(ALL_CFG_COBJS:.o=.s): %.s: %.c
    489         $(CC) -S $(CFLAGS) $(CFG_CFLAGS) $<
    490 
    491 $(ALL_CFG_ASMOBJS): %.o: %.S
    492         $(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) $<
    493543
    494544#
     
    541591#  コンパイルルールの定義
    542592#
    543 $(KERNEL_COBJS): %.o: %.c
    544         $(CC) -c -MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(KERNEL_CFLAGS) $<
    545 
    546 $(KERNEL_COBJS:.o=.s): %.s: %.c
    547         $(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 \
    551601                                                                        $(CFLAGS) $(KERNEL_CFLAGS) $<
    552602
    553 $(KERNEL_LCOBJS:.o=.s): %.s:
    554         $(CC) -DTOPPERS_$(*F) -o $@ -S $(CFLAGS) $(KERNEL_CFLAGS) $<
    555 
    556 $(KERNEL_ASMOBJS): %.o: %.S
    557         $(CC) -c -MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(KERNEL_CFLAGS) $<
    558 
    559 $(SYSSVC_COBJS): %.o: %.c
    560         $(CC) -c -MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(SYSSVC_CFLAGS) $<
    561 
    562 $(SYSSVC_COBJS:.o=.s): %.s: %.c
    563         $(CC) -S $(CFLAGS) $(SYSSVC_CFLAGS) $<
    564 
    565 $(SYSSVC_ASMOBJS): %.o: %.S
    566         $(CC) -c -MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(SYSSVC_CFLAGS) $<
    567 
    568 $(APPL_COBJS): %.o: %.c
    569         $(CC) -c -MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(APPL_CFLAGS) $<
    570 
    571 $(APPL_COBJS:.o=.s): %.s: %.c
    572         $(CC) -S $(CFLAGS) $(APPL_CFLAGS) $<
    573 
    574 $(APPL_CXXOBJS): %.o: %.cpp
    575         $(CXX) -c -MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(APPL_CFLAGS) $<
    576 
    577 $(APPL_CXXOBJS:.o=.s): %.s: %.cpp
    578         $(CXX) -S $(CFLAGS) $(APPL_CFLAGS) $<
    579 
    580 $(APPL_ASMOBJS): %.o: %.S
    581         $(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) $<
    582632
    583633#
    584634#  デフォルトコンパイルルールを上書き
    585635#
    586 %.o: %.c
     636$(OBJDIR)/%.o: %.c
    587637        @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) $<
    589639
    590640%.s: %.c
    591641        @echo "*** Default compile rules should not be used."
    592         $(CC) -S $(CFLAGS) $<
    593 
    594 %.o: %.cpp
     642        $(CC) -S -o $@ $(CFLAGS) $<
     643
     644$(OBJDIR)/%.o: %.cpp
    595645        @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) $<
    597647
    598648%.s: %.cpp
    599649        @echo "*** Default compile rules should not be used."
    600         $(CXX) -S $(CFLAGS) $<
    601 
    602 %.o: %.S
     650        $(CXX) -S -o $@ $(CFLAGS) $<
     651
     652$(OBJDIR)/%.o: %.S
    603653        @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  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2004-2016 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2004-2019 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    4848 *  プログラムの概要:
    4949 *
    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 *  のは,プログラムの動作を確認しやすくするためである.また,低速なシ
    5959 *  リアルポートを用いてメッセージを出力する場合に,すべてのメッセージ
    6060 *  が出力できるように,メッセージの量を制限するという理由もある.
    6161 *
    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 *  に対応した処理を実行する.入力された文字と処理の関係は次の通り.
    6974 *  Control-Cまたは'Q'が入力されると,プログラムを終了する.
    7075 *
     
    97102 *  'b' : アラームハンドラを5秒後に起動するよう動作開始させる.
    98103 *  'B' : アラームハンドラを動作停止させる.
    99  *  'z' : 対象タスクにCPU例外を発生させる(タスクを終了させる).
    100  *  'Z' : 対象タスクにCPUロック状態でCPU例外を発生させる(プログラムを
    101  *        終了する).
     104 *  'z' : 対象タスクにCPU例外を発生させる(ターゲットによっては復帰可能).
     105 *  'Z' : 対象タスクにCPUロック状態でCPU例外を発生させる(復帰不可能).
    102106 *  '@' : タスク3をacre_tskにより生成する.
    103107 *  '!' : 対象タスクをdel_tskにより削除する.
    104108 *  '$' : アラームハンドラをacre_almにより生成する.
    105109 *  '#' : アラームハンドラをdel_almにより削除する.
    106  *  'V' : fch_hrtで高分解能タイマを2回読む.
     110 *  'V' : 短いループを挟んで,fch_hrtで高分解能タイマを2回読む.
    107111 *  'v' : 発行したシステムコールを表示する(デフォルト).
    108112 *  'q' : 発行したシステムコールを表示しない.
     
    116120#include "kernel_cfg.h"
    117121#include "sample1.h"
    118 /*#include "sample1n.h"*/
    119122
    120123/*
     
    132135
    133136/*
     137 *  プロセッサ時間の消費
     138 *
     139 *  ループによりプロセッサ時間を消費する.最適化ができないように,ルー
     140 *  プ内でvolatile変数を読み込む.
     141 */
     142static volatile long_t  volatile_var;
     143
     144static void
     145consume_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/*
    134155 *  並行実行されるタスクへのメッセージ領域
    135156 */
     
    144165 *  並行実行されるタスク
    145166 */
    146 void task(intptr_t exinf)
    147 {
    148         volatile ulong_t        i;
     167void
     168task(intptr_t exinf)
     169{
    149170        int_t           n = 0;
    150171        int_t           tskno = (int_t) exinf;
     
    155176                syslog(LOG_NOTICE, "task%d is running (%03d).   %s",
    156177                                                                                tskno, ++n, graph[tskno-1]);
    157                 for (i = 0; i < task_loop; i++);
     178                consume_time(task_loop);
    158179                c = message[tskno-1];
    159180                message[tskno-1] = 0;
     
    202223
    203224/*
    204  *  割込みハンドラ
     225 *  割込みサービスルーチン
     226 *
     227 *  HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー
     228 *  を回転させる.
    205229 */
    206230#ifdef INTNO1
    207231
    208 void intno1_isr(intptr_t exinf)
     232void
     233intno1_isr(intptr_t exinf)
    209234{
    210235        intno1_clear();
     
    235260                                        "sns_dpn() is not true in CPU exception handler.");
    236261        }
    237         syslog(LOG_INFO, "sns_loc = %d sns_dsp = %d xsns_dpn = %d",
     262        syslog(LOG_INFO, "sns_loc = %d, sns_dsp = %d, xsns_dpn = %d",
    238263                                                                sns_loc(), sns_dsp(), xsns_dpn(p_excinf));
    239264
     
    244269        }
    245270
    246 #ifdef PREPARE_RETURN_CPUEXC
    247         PREPARE_RETURN_CPUEXC;
    248271        SVC_PERROR(get_tid(&cpuexc_tskid));
    249272        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 */
    255273}
    256274
     
    263281 *  を回転させる.
    264282 */
    265 void cyclic_handler(intptr_t exinf)
     283void
     284cyclic_handler(intptr_t exinf)
    266285{
    267286        SVC_PERROR(rot_rdq(HIGH_PRIORITY));
     
    276295 *  を回転させる.
    277296 */
    278 void alarm_handler(intptr_t exinf)
     297void
     298alarm_handler(intptr_t exinf)
    279299{
    280300        SVC_PERROR(rot_rdq(HIGH_PRIORITY));
     
    286306 *  例外処理タスク
    287307 */
    288 void exc_task(intptr_t exinf)
     308void
     309exc_task(intptr_t exinf)
    289310{
    290311        SVC_PERROR(ras_ter(cpuexc_tskid));
     
    294315 *  メインタスク
    295316 */
    296 void main_task(intptr_t exinf)
     317void
     318main_task(intptr_t exinf)
    297319{
    298320        char    c;
     
    302324        PRI             tskpri;
    303325#ifndef TASK_LOOP
    304         volatile ulong_t        i;
    305326        SYSTIM  stime1, stime2;
    306327#endif /* TASK_LOOP */
     
    332353         *  ループ回数の設定
    333354         *
    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に設定する.
    339360         *
    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         *  とする.
    348368         *
    349369         *  また,task_loopの値を固定したい場合には,その値をTASK_LOOPにマ
    350          *  クロ定義する.TASK_LOOPがマクロ定義されている場合,上記の測定
    351          *  行わずに,TASK_LOOPに定義された値を空ループの回数とする.
     370         *  クロ定義する.TASK_LOOPがマクロ定義されている場合,上記の測定
     371         *  を行わずに,TASK_LOOPに定義された値をループの回数とする.
    352372         *
    353          * ターゲットによっては,空ループの実行時間の1回目の測定で,本来よ
    354          * も長めになるものがある.このようなターゲットでは,MEASURE_TWICE
    355          * をマクロ定義することで,1回目の測定結果を捨てて,2回目の測定結果
    356          * を使う.
     373         *  ターゲットによっては,ループの実行時間の1回目の測定で,本来より
     374         *  も長めになるものがある.このようなターゲットでは,MEASURE_TWICE
     375         *  をマクロ定義することで,1回目の測定結果を捨てて,2回目の測定結
     376         *  果を使う.
    357377         */
    358378#ifdef TASK_LOOP
     
    361381
    362382#ifdef MEASURE_TWICE
    363         task_loop = LOOP_REF;
    364383        SVC_PERROR(get_tim(&stime1));
    365         for (i = 0; i < task_loop; i++);
     384        consume_time(LOOP_REF);
    366385        SVC_PERROR(get_tim(&stime2));
    367386#endif /* MEASURE_TWICE */
    368387
    369         task_loop = LOOP_REF;
    370388        SVC_PERROR(get_tim(&stime1));
    371         for (i = 0; i < task_loop; i++);
     389        consume_time(LOOP_REF);
    372390        SVC_PERROR(get_tim(&stime2));
    373391        task_loop = LOOP_REF * 400LU / (ulong_t)(stime2 - stime1) * 1000LU;
     
    477495                        break;
    478496                case 'c':
    479                         syslog(LOG_INFO, "#sta_cyc(1)");
     497                        syslog(LOG_INFO, "#sta_cyc(CYCHDR1)");
    480498                        SVC_PERROR(sta_cyc(CYCHDR1));
    481499                        break;
    482500                case 'C':
    483                         syslog(LOG_INFO, "#stp_cyc(1)");
     501                        syslog(LOG_INFO, "#stp_cyc(CYCHDR1)");
    484502                        SVC_PERROR(stp_cyc(CYCHDR1));
    485503                        break;
    486504                case 'b':
    487                         syslog(LOG_INFO, "#sta_alm(1, 5000000)");
     505                        syslog(LOG_INFO, "#sta_alm(ALMHDR1, 5000000)");
    488506                        SVC_PERROR(sta_alm(ALMHDR1, 5000000));
    489507                        break;
    490508                case 'B':
    491                         syslog(LOG_INFO, "#stp_alm(1)");
     509                        syslog(LOG_INFO, "#stp_alm(ALMHDR1)");
    492510                        SVC_PERROR(stp_alm(ALMHDR1));
    493511                        break;
     
    499517                        ctsk.stksz = STACK_SIZE;
    500518                        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.",
    503523                                                                                                                (int_t) TASK3);
     524                        }
    504525                        break;
    505526                case '!':
     
    512533                        calm.nfyinfo.nfy.handler.exinf = (intptr_t) 0;
    513534                        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.",
    516539                                                                                                                (int_t) ALMHDR1);
     540                        }
    517541                        break;
    518542                case '#':
    519                         syslog(LOG_INFO, "#del_alm(1)");
     543                        syslog(LOG_INFO, "#del_alm(ALMHDR1)");
    520544                        SVC_PERROR(del_alm(ALMHDR1));
    521545                        break;
     
    523547                case 'V':
    524548                        hrtcnt1 = fch_hrt();
     549                        consume_time(1000LU);
    525550                        hrtcnt2 = fch_hrt();
    526551                        syslog(LOG_NOTICE, "hrtcnt1 = %tu, hrtcnt2 = %tu",
    527                                                                                 hrtcnt1, hrtcnt2);
     552                                                                (uint32_t) hrtcnt1, (uint32_t) hrtcnt2);
    528553                        break;
    529554
     
    552577#endif /* BIT_KERNEL */
    553578
     579                case '\003':
     580                case 'Q':
     581                        break;
     582
    554583                default:
     584                        syslog(LOG_INFO, "Unknown command: '%c'.", c);
    555585                        break;
    556586                }
  • EcnlProtoTool/trunk/asp3_dcre/sample/sample1.cdl

    r321 r429  
    3030
    3131/*
    32  *  システムログ機能の組上げ記述
     32 *              システムログ機能のアダプタの組上げ記述
     33 *
     34 *  システムログ機能のアダプタは,C言語で記述されたコードから,TECSベー
     35 *  スのシステムログ機能を呼び出すためのセルである.システムログ機能の
     36 *  サービスコール(syslog,syslog_0~syslog_5,t_perrorを含む)を呼び
     37 *  出さない場合には,以下のセルの組上げ記述を削除してよい.
     38 */
     39cell tSysLogAdapter SysLogAdapter {
     40        cSysLog = SysLog.eSysLog;
     41};
     42
     43/*
     44 *              シリアルインタフェースドライバのアダプタの組上げ記述
     45 *
     46 *  シリアルインタフェースドライバのアダプタは,C言語で記述されたコー
     47 *  ドから,TECSベースのシリアルインタフェースドライバを呼び出すための
     48 *  セルである.シリアルインタフェースドライバのサービスコールを呼び出
     49 *  さない場合には,以下のセルの組上げ記述を削除してよい.
     50 */
     51cell tSerialAdapter SerialAdapter {
     52        cSerialPort[0] = SerialPort1.eSerialPort;
     53};
     54
     55/*
     56 *              システムログ機能の組上げ記述
    3357 *
    3458 *  システムログ機能を外す場合には,以下のセルの組上げ記述を削除し,コ
     
    4973
    5074/*
    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 *              シリアルインタフェースドライバの組上げ記述
    6476 *
    6577 *  シリアルインタフェースドライバを外す場合には,以下のセルの組上げ記
     
    7890
    7991/*
    80  *  C言語で記述されたアプリケーションから,TECSベースのシリアルインタ
    81  *  フェースドライバを呼び出すためのアダプタの組上げ記述
    82  *
    83  *  シリアルインタフェースドライバのサービスコールをC言語で記述されたア
    84  *  プリケーションから呼び出さない場合には,以下のセルの組上げ記述を削
    85  *  除すればよい.
    86  */
    87 cell tSerialAdapter SerialAdapter {
    88         cSerialPort[0] = SerialPort1.eSerialPort;
    89 };
    90 
    91 /*
    92  *  システムログタスクの組上げ記述
     92 *              システムログタスクの組上げ記述
    9393 *
    9494 *  システムログタスクを外す場合には,以下のセルの組上げ記述を削除すれ
     
    111111
    112112/*
    113  *  カーネル起動メッセージ出力の組上げ記述
     113 *              カーネル起動メッセージ出力の組上げ記述
    114114 *
    115115 *  カーネル起動メッセージの出力を外す場合には,以下のセルの組上げ記述
  • EcnlProtoTool/trunk/asp3_dcre/sample/sample1.cfg

    r321 r429  
    2121DEF_EXC(CPUEXC1, { TA_NULL, cpuexc_handler });
    2222#endif /* CPUEXC1 */
    23 DEF_KMM({ KMM_SIZE, NULL });
     23DEF_MPK({ MPK_SIZE, NULL });
  • EcnlProtoTool/trunk/asp3_dcre/sample/sample1.h

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2004-2016 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2004-2018 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    5757
    5858#define EXC_PRIORITY    1               /* 例外処理タスクの優先度 */
    59 #define MAIN_PRIORITY   6               /* メインタスクの優先度 */
     59#define MAIN_PRIORITY   5               /* メインタスクの優先度 */
    6060                                                                /* HIGH_PRIORITYより高くすること */
    6161
     
    7676#endif /* STACK_SIZE */
    7777
    78 #ifndef KMM_SIZE
    79 #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 */
    8181
    8282#ifndef LOOP_REF
  • EcnlProtoTool/trunk/asp3_dcre/sample/sample1n.h

    r331 r429  
    6262
    6363extern void     net_syslog(uint_t prio, const char *format, ...) throw();
    64 extern ER_UINT  net_serial_rea_dat(ID portid, char *buf, uint_t len) throw();
     64static ER_UINT  net_serial_rea_dat(ID portid, char *buf, uint_t len) throw();
    6565extern ER       net_serial_ctl_por(ID portid, uint_t ioctl) throw();
    6666
  • EcnlProtoTool/trunk/asp3_dcre/sample/tSample2.c

    r321 r429  
    33 *      Toyohashi Open Platform for Embedded Real-Time Systems/
    44 *      Advanced Standard Profile Kernel
    5  *
     5 * 
    66 *  Copyright (C) 2015-2016 by Ushio Laboratory
    77 *              Graduate School of Engineering Science, Osaka Univ., JAPAN
    8  *  Copyright (C) 2015-2016 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2015-2019 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    4242
    4343/*
    44  *  サンプルプログラム(1)の本体
    45  *
    46  *  ASPカーネルの基本的な動作を確認するためのサンプルプログラム
     44 *  サンプルプログラム(2)の本体
     45 *
     46 *  ASPカーネルの基本的な動作を確認するためのサンプルプログラム(TECS版)
    4747 *
    4848 *  プログラムの概要:
    4949 *
    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 *  のは,プログラムの動作を確認しやすくするためである.また,低速なシ
    5959 *  リアルポートを用いてメッセージを出力する場合に,すべてのメッセージ
    6060 *  が出力できるように,メッセージの量を制限するという理由もある.
    6161 *
    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 *  に対応した処理を実行する.入力された文字と処理の関係は次の通り.
    6974 *  Control-Cまたは'Q'が入力されると,プログラムを終了する.
    7075 *
     
    97102 *  'b' : アラームハンドラを5秒後に起動するよう動作開始させる.
    98103 *  '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回読む.
    103108 *  'v' : 発行したシステムコールを表示する(デフォルト).
    104109 *  '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 */
    200111
    201112#include "tSample2_tecsgen.h"
     
    220131
    221132/*
     133 *  プロセッサ時間の消費
     134 *
     135 *  ループによりプロセッサ時間を消費する.最適化ができないように,ルー
     136 *  プ内でvolatile変数を読み込む.
     137 */
     138static volatile long_t  volatile_var;
     139
     140static void
     141consume_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/*
    222151 *  並行実行されるタスクへのメッセージ領域
    223152 */
     
    232161 *  並行実行されるタスク
    233162 */
    234 void eSampleTask_main(int_t subscript)
    235 {
    236         volatile ulong_t        i;
     163void
     164eSampleTask_main(int_t subscript)
     165{
    237166        int_t           n = 0;
    238167        int_t           tskno = subscript + 1;
     
    243172                syslog(LOG_NOTICE, "task%d is running (%03d).   %s",
    244173                                                                                tskno, ++n, graph[tskno-1]);
    245                 for (i = 0; i < task_loop; i++);
     174                consume_time(task_loop);
    246175                c = message[tskno-1];
    247176                message[tskno-1] = 0;
     
    290219
    291220/*
     221 *  割込みサービスルーチン
     222 *
     223 *  HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー
     224 *  を回転させる.
     225 */
     226#ifdef INTNO1
     227
     228void
     229eiISR_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/*
    292240 *  CPU例外ハンドラ
    293241 */
    294 
    295242ID      cpuexc_tskid;           /* CPU例外を起こしたタスクのID */
    296243
     
    298245
    299246void
    300 cpuexc_handler(void *p_excinf)
     247eiCpuExceptionHandler_main(const void *p_excinf)
    301248{
    302249       
    303250        syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", p_excinf);
    304251        if (ciKernel_senseContext() != true) {
    305                 syslog(LOG_WARNING,
    306                                         "ciKernel_senseContext() is not true in CPU exception handler.");
     252                syslog(LOG_WARNING, "ciKernel_senseContext() is not true"
     253                                                                                        " in CPU exception handler.");
    307254        }
    308255        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));
    314263
    315264        if (ciKernel_exceptionSenseDispatchPendingState(p_excinf)) {
    316265                syslog(LOG_NOTICE, "Sample program ends with exception.");
    317                 SVC_PERROR(ciKernel_senseKernel());
     266                SVC_PERROR(ciKernel_exitKernel());
    318267                assert(0);
    319268        }
    320269
    321 #ifdef PREPARE_RETURN_CPUEXC
    322         PREPARE_RETURN_CPUEXC;
    323270        SVC_PERROR(ciKernel_getTaskId(&cpuexc_tskid));
    324271        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 */
    330272}
    331273
     
    338280 *  を回転させる.
    339281 */
    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()
     282void
     283eiCyclicHandler_main(void)
    347284{
    348285        SVC_PERROR(ciKernel_rotateReadyQueue(HIGH_PRIORITY));
     
    357294 *  を回転させる.
    358295 */
    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()
     296void
     297eiAlarmHandler_main(void)
    366298{
    367299        SVC_PERROR(ciKernel_rotateReadyQueue(HIGH_PRIORITY));
     
    369301        SVC_PERROR(ciKernel_rotateReadyQueue(LOW_PRIORITY));
    370302}
     303
    371304/*
    372305 *  例外処理タスク
    373306 */
    374 /* #[<ENTRY_FUNC>]# eExceptionTask_main
    375  * name:         eExceptionTask_main
    376  * global_name:  tSample2_eExceptionTask_main
    377  * oneway:       
    378  * #[/ENTRY_FUNC>]# */
    379 void eExceptionTask_main()
     307void
     308eExceptionTask_main(void)
    380309{
    381310        SVC_PERROR(ras_ter(cpuexc_tskid));
    382311}
     312
    383313/*
    384314 *  メインタスク
    385315 */
    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()
     316void
     317eMainTask_main(void)
    393318{
    394319        char    c;
    395         volatile ulong_t        i;
    396         ulong_t j;
    397320        int_t   tskno = 1;
    398321        ER_UINT ercd;
    399322        PRI             tskpri;
     323#ifndef TASK_LOOP
    400324        SYSTIM  stime1, stime2;
     325#endif /* TASK_LOOP */
    401326        HRTCNT  hrtcnt1, hrtcnt2;
    402327
    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)));
    412329        syslog(LOG_NOTICE, "Sample program starts.");
    413330
     
    419336         *  ない.
    420337         */
    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));
    430344
    431345        /*
    432346         *  ループ回数の設定
    433347         *
    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に設定する.
    439353         *
    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         *  とする.
    448361         *
    449362         *  また,task_loopの値を固定したい場合には,その値をTASK_LOOPにマ
    450          *  クロ定義する.TASK_LOOPがマクロ定義されている場合,上記の測定
    451          *  行わずに,TASK_LOOPに定義された値を空ループの回数とする.
     363         *  クロ定義する.TASK_LOOPがマクロ定義されている場合,上記の測定
     364         *  を行わずに,TASK_LOOPに定義された値をループの回数とする.
    452365         *
    453          * ターゲットによっては,空ループの実行時間の1回目の測定で,本来よ
    454          * も長めになるものがある.このようなターゲットでは,MEASURE_TWICE
    455          * をマクロ定義することで,1回目の測定結果を捨てて,2回目の測定結果
    456          * を使う.
     366         *  ターゲットによっては,ループの実行時間の1回目の測定で,本来より
     367         *  も長めになるものがある.このようなターゲットでは,MEASURE_TWICE
     368         *  をマクロ定義することで,1回目の測定結果を捨てて,2回目の測定結
     369         *  果を使う.
    457370         */
    458371#ifdef TASK_LOOP
     
    461374
    462375#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));
    467379#endif /* MEASURE_TWICE */
    468380
    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));
    473384        task_loop = LOOP_REF * 400LU / (ulong_t)(stime2 - stime1) * 1000LU;
    474385
     
    478389         *  タスクの起動
    479390         */
    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));
    484394
    485395        /*
    486396         *  メインループ
    487397         */
    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);
    630430                        }
    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;
    637534                }
    638         }
     535        } while (c != '\003' && c != 'Q');
    639536
    640537        syslog(LOG_NOTICE, "Sample program ends.");
    641         SVC_PERROR(ciKernel_exitKernel());
     538        SVC_PERROR(exitKernel());
    642539        assert(0);
    643540}
  • EcnlProtoTool/trunk/asp3_dcre/sample/tSample2.cdl

    r321 r429  
    44 *  $Id$
    55 */
     6
    67/*
    78 *  カーネルオブジェクトの定義
    89 */
    9 import("kernel.cdl");
     10import(<kernel.cdl>);
    1011
    1112/*
     
    1415import("syssvc/tSerialPort.cdl");
    1516import("syssvc/tSysLog.cdl");
     17import("syssvc/tSysLogAdapter.cdl");
    1618import("syssvc/tLogTask.cdl");
    1719import("syssvc/tBanner.cdl");
     
    2325
    2426/*
     27 *  サンプルプログラムのC言語ヘッダファイルの取り込み
     28 */
     29import_C("tSample2.h");
     30
     31/*
    2532 *  「セルの組上げ記述」とは,"cell"で始まる行から,それに対応する"};"
    2633 *  の行までのことを言う.
     
    2835
    2936/*
    30  *  システムログ機能の組上げ記述
     37 *              システムログ機能のアダプタの組上げ記述
     38 *
     39 *  システムログ機能のアダプタは,C言語で記述されたコードから,TECSベー
     40 *  スのシステムログ機能を呼び出すためのセルである.システムログ機能の
     41 *  サービスコール(syslog,syslog_0~syslog_5,t_perrorを含む)を呼び
     42 *  出さない場合には,以下のセルの組上げ記述を削除してよい.
     43 */
     44cell tSysLogAdapter SysLogAdapter {
     45        cSysLog = SysLog.eSysLog;
     46};
     47
     48/*
     49 *              システムログ機能の組上げ記述
    3150 *
    3251 *  システムログ機能を外す場合には,以下のセルの組上げ記述を削除し,コ
     
    4261        initLowMask = C_EXP("LOG_UPTO(LOG_EMERG)");
    4362                                                                                /* 低レベル出力すべき重要度 */
    44 
    4563        /* 低レベル出力との結合 */
    4664        cPutLog = PutLogTarget.ePutLog;
     
    4866
    4967/*
    50  *  シリアルインタフェースドライバの組上げ記述
     68 *              シリアルインタフェースドライバの組上げ記述
    5169 *
    5270 *  シリアルインタフェースドライバを外す場合には,以下のセルの組上げ記
     
    6583
    6684/*
    67  *  システムログタスクの組上げ記述
     85 *              システムログタスクの組上げ記述
    6886 *
    6987 *  システムログタスクを外す場合には,以下のセルの組上げ記述を削除すれ
     
    86104
    87105/*
    88  *  カーネル起動メッセージ出力の組上げ記述
     106 *              カーネル起動メッセージ出力の組上げ記述
    89107 *
    90108 *  カーネル起動メッセージの出力を外す場合には,以下のセルの組上げ記述
     
    98116
    99117/*
    100  *  サンプルプログラムの定義
     118 *              サンプルプログラムのセルタイプの定義
    101119 */
    102120[singleton]
     
    111129        call sAlarm         cAlarm;
    112130
    113         [optional] call sSerialPort     cSerialPort;/* シリアルドライバとの接続 */
     131        call sSerialPort        cSerialPort;    /* シリアルドライバとの接続 */
    114132        call sSysLog            cSysLog;                /* システムログ機能との接続 */
    115133       
     
    118136        entry sTaskBody         eExceptionTask; /* 例外処理タスク */
    119137       
    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
     151cell tKernel ASPKernel {
    132152};
    133153
     
    181201
    182202cell tAlarmHandler AlarmHandler {
     203        /* 呼び口の結合 */
    183204        ciHandlerBody = Sample2.eiAlarmHandler;
    184205};
    185206
     207cell tInterruptRequest InterruptRequest {
     208        /* 属性の設定 */
     209        interruptNumber = C_EXP("INTNO1");
     210        attribute = C_EXP("INTNO1_INTATR");
     211        interruptPriority = C_EXP("INTNO1_INTPRI");
     212};
     213
     214cell tISR InterruptServiceRoutine {
     215        /* 呼び口の結合 */
     216        ciISRBody = Sample2.eiISR;
     217        /* 属性の設定 */
     218        attribute = C_EXP("TA_NULL");
     219        interruptNumber = C_EXP("INTNO1");
     220};
     221
     222cell tCpuExceptionHandler CpuExceptionHandler {
     223        /* 呼び口の結合 */
     224        ciCpuExceptionHandlerBody = Sample2.eiCpuExceptionHandler;
     225        /* 属性の設定 */
     226        cpuExceptionHandlerNumber = C_EXP("CPUEXC1");
     227};
     228
    186229cell tSample2 Sample2 {
    187230        /* 呼び口の結合 */
    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;
    192235
    193236        cExceptionTask = ExceptionTask.eTask;
  • EcnlProtoTool/trunk/asp3_dcre/sample/tSample2.cfg

    r321 r429  
    44 *  $Id$
    55 */
    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 */
     6INCLUDE("tecsgen.cfg");
  • EcnlProtoTool/trunk/asp3_dcre/sample/tSample2.h

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2004-2007 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2004-2018 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    5555
    5656#define EXC_PRIORITY    1               /* 例外処理タスクの優先度 */
    57 #define MAIN_PRIORITY   6               /* メインタスクの優先度 */
     57#define MAIN_PRIORITY   5               /* メインタスクの優先度 */
    5858                                                                /* HIGH_PRIORITYより高くすること */
    5959
     
    7575
    7676/*
    77  *  関数のプロトタイプ宣言
     77 *  必要な定義のチェック
    7878 */
    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.