OSDN Git Service

カーネルのターゲット非依存部1.7.0およびCFGをマージ
authorsuikan <suikan@users.sourceforge.jp>
Mon, 11 Jul 2011 14:56:39 +0000 (14:56 +0000)
committersuikan <suikan@users.sourceforge.jp>
Mon, 11 Jul 2011 14:56:39 +0000 (14:56 +0000)
391 files changed:
asp/MANIFEST
asp/README.txt
asp/arch/arm_m_gcc/prc.tf
asp/arch/arm_m_gcc/prc_config.h
asp/arch/arm_m_gcc/prc_rename.def
asp/arch/arm_m_gcc/prc_rename.h
asp/arch/arm_m_gcc/prc_support.S
asp/arch/arm_m_gcc/prc_unrename.h
asp/arch/gcc/MANIFEST [changed mode: 0755->0644]
asp/arch/gcc/tool_stddef.h [changed mode: 0755->0644]
asp/arch/logtrace/MANIFEST [changed mode: 0755->0644]
asp/arch/logtrace/trace_config.c [changed mode: 0755->0644]
asp/arch/logtrace/trace_config.h [changed mode: 0755->0644]
asp/arch/logtrace/trace_dump.c [changed mode: 0755->0644]
asp/arch/m68k_gcc/MANIFEST [changed mode: 0755->0644]
asp/arch/m68k_gcc/Makefile.prc [changed mode: 0755->0644]
asp/arch/m68k_gcc/m68kelf.ld [changed mode: 0755->0644]
asp/arch/m68k_gcc/makeoffset.c [changed mode: 0755->0644]
asp/arch/m68k_gcc/prc_cfg1_out.h [changed mode: 0755->0644]
asp/arch/m68k_gcc/prc_config.c [changed mode: 0755->0644]
asp/arch/m68k_gcc/prc_config.h [changed mode: 0755->0644]
asp/arch/m68k_gcc/prc_def.csv [new file with mode: 0644]
asp/arch/m68k_gcc/prc_insn.h [changed mode: 0755->0644]
asp/arch/m68k_gcc/prc_kernel.h [changed mode: 0755->0644]
asp/arch/m68k_gcc/prc_offset.tf [new file with mode: 0644]
asp/arch/m68k_gcc/prc_rename.def [changed mode: 0755->0644]
asp/arch/m68k_gcc/prc_rename.h [changed mode: 0755->0644]
asp/arch/m68k_gcc/prc_sil.h [changed mode: 0755->0644]
asp/arch/m68k_gcc/prc_stddef.h [changed mode: 0755->0644]
asp/arch/m68k_gcc/prc_support.S [changed mode: 0755->0644]
asp/arch/m68k_gcc/prc_test.h [changed mode: 0755->0644]
asp/arch/m68k_gcc/prc_unrename.h [changed mode: 0755->0644]
asp/arch/m68k_gcc/start.S [changed mode: 0755->0644]
asp/cfg/MANIFEST
asp/cfg/README.txt
asp/cfg/cfg/Makefile [changed mode: 0755->0644]
asp/cfg/cfg/cfg.cpp [changed mode: 0755->0644]
asp/cfg/cfg/cfg.hpp [changed mode: 0755->0644]
asp/cfg/cfg/cfg.vcproj [changed mode: 0755->0644]
asp/cfg/cfg/cfg0.cpp [changed mode: 0755->0644]
asp/cfg/cfg/cfg1.cpp [changed mode: 0755->0644]
asp/cfg/cfg/cfg2.cpp [changed mode: 0755->0644]
asp/cfg/cfg/cfg3.cpp [changed mode: 0755->0644]
asp/cfg/cfg/cfg_init.cpp [changed mode: 0755->0644]
asp/cfg/cfg/cfg_version.cpp
asp/cfg/cfg/ja.po [changed mode: 0755->0644]
asp/cfg/cfg/require_modules.hpp [changed mode: 0755->0644]
asp/cfg/configure
asp/cfg/toppers/Makefile [changed mode: 0755->0644]
asp/cfg/toppers/builtin_function.cpp [changed mode: 0755->0644]
asp/cfg/toppers/c_chlit_parser.cpp [changed mode: 0755->0644]
asp/cfg/toppers/c_expr.hpp [changed mode: 0755->0644]
asp/cfg/toppers/c_ident_parser.cpp [changed mode: 0755->0644]
asp/cfg/toppers/c_int_parser.cpp [changed mode: 0755->0644]
asp/cfg/toppers/c_keywords.cpp [changed mode: 0755->0644]
asp/cfg/toppers/c_parser.hpp [changed mode: 0755->0644]
asp/cfg/toppers/c_plus_plus_keywords.cpp [changed mode: 0755->0644]
asp/cfg/toppers/c_pp_line.hpp [changed mode: 0755->0644]
asp/cfg/toppers/c_strlit_parser.cpp [changed mode: 0755->0644]
asp/cfg/toppers/codeset.hpp [changed mode: 0755->0644]
asp/cfg/toppers/config.hpp [changed mode: 0755->0644]
asp/cfg/toppers/cpp.cpp [changed mode: 0755->0644]
asp/cfg/toppers/cpp.hpp [changed mode: 0755->0644]
asp/cfg/toppers/csv.hpp [changed mode: 0755->0644]
asp/cfg/toppers/debug.hpp [changed mode: 0755->0644]
asp/cfg/toppers/diagnostics.cpp [changed mode: 0755->0644]
asp/cfg/toppers/diagnostics.hpp [changed mode: 0755->0644]
asp/cfg/toppers/gettext.cpp [changed mode: 0755->0644]
asp/cfg/toppers/gettext.hpp [changed mode: 0755->0644]
asp/cfg/toppers/global.cpp [changed mode: 0755->0644]
asp/cfg/toppers/global.hpp [changed mode: 0755->0644]
asp/cfg/toppers/io.cpp [changed mode: 0755->0644]
asp/cfg/toppers/io.hpp [changed mode: 0755->0644]
asp/cfg/toppers/itronx/Makefile [changed mode: 0755->0644]
asp/cfg/toppers/itronx/cfg1_out.cpp [changed mode: 0755->0644]
asp/cfg/toppers/itronx/cfg1_out.hpp [changed mode: 0755->0644]
asp/cfg/toppers/itronx/checker.cpp [changed mode: 0755->0644]
asp/cfg/toppers/itronx/checker.hpp [changed mode: 0755->0644]
asp/cfg/toppers/itronx/factory.cpp [changed mode: 0755->0644]
asp/cfg/toppers/itronx/factory.hpp [changed mode: 0755->0644]
asp/cfg/toppers/itronx/init_helper.hpp [changed mode: 0755->0644]
asp/cfg/toppers/itronx/itronx.vcproj [changed mode: 0755->0644]
asp/cfg/toppers/itronx/kernel_chk.hpp [changed mode: 0755->0644]
asp/cfg/toppers/itronx/preprocess.cpp [changed mode: 0755->0644]
asp/cfg/toppers/itronx/preprocess.hpp [changed mode: 0755->0644]
asp/cfg/toppers/itronx/static_api.cpp [changed mode: 0755->0644]
asp/cfg/toppers/itronx/static_api.hpp [changed mode: 0755->0644]
asp/cfg/toppers/itronx/static_api_parser.hpp [changed mode: 0755->0644]
asp/cfg/toppers/macro_processor.cpp [changed mode: 0755->0644]
asp/cfg/toppers/macro_processor.hpp [changed mode: 0755->0644]
asp/cfg/toppers/mbchar_parser.cpp [changed mode: 0755->0644]
asp/cfg/toppers/misc.hpp [changed mode: 0755->0644]
asp/cfg/toppers/nm_symbol.cpp [changed mode: 0755->0644]
asp/cfg/toppers/nm_symbol.hpp [changed mode: 0755->0644]
asp/cfg/toppers/output_file.cpp [changed mode: 0755->0644]
asp/cfg/toppers/output_file.hpp [changed mode: 0755->0644]
asp/cfg/toppers/s_record.cpp [changed mode: 0755->0644]
asp/cfg/toppers/s_record.hpp [changed mode: 0755->0644]
asp/cfg/toppers/text.hpp [changed mode: 0755->0644]
asp/cfg/toppers/text_line.hpp [changed mode: 0755->0644]
asp/cfg/toppers/toppers.vcproj [changed mode: 0755->0644]
asp/cfg/toppers/ucn_parser.cpp [changed mode: 0755->0644]
asp/cfg/toppers/workaround.hpp [changed mode: 0755->0644]
asp/extension/MANIFEST
asp/extension/dcre/include/kernel.h [new file with mode: 0644]
asp/extension/dcre/kernel/Makefile.kernel [new file with mode: 0644]
asp/extension/dcre/kernel/alarm.c [new file with mode: 0644]
asp/extension/dcre/kernel/alarm.h [moved from asp/target/cq_starm_gcc/target_config.h with 61% similarity, mode: 0644]
asp/extension/dcre/kernel/allfunc.h [new file with mode: 0644]
asp/extension/dcre/kernel/check.h [new file with mode: 0644]
asp/extension/dcre/kernel/cyclic.c [new file with mode: 0644]
asp/extension/dcre/kernel/cyclic.h [moved from asp/target/cq_starm_gcc/target_serial.h with 57% similarity, mode: 0644]
asp/extension/dcre/kernel/dataqueue.c [new file with mode: 0644]
asp/extension/dcre/kernel/dataqueue.h [new file with mode: 0644]
asp/extension/dcre/kernel/eventflag.c [new file with mode: 0644]
asp/extension/dcre/kernel/eventflag.h [new file with mode: 0644]
asp/extension/dcre/kernel/interrupt.c [new file with mode: 0644]
asp/extension/dcre/kernel/interrupt.h [new file with mode: 0644]
asp/extension/dcre/kernel/kernel.tf [new file with mode: 0644]
asp/extension/dcre/kernel/kernel_api.csv [new file with mode: 0644]
asp/extension/dcre/kernel/kernel_check.tf [new file with mode: 0644]
asp/extension/dcre/kernel/kernel_def.csv [new file with mode: 0644]
asp/extension/dcre/kernel/kernel_impl.h [new file with mode: 0644]
asp/extension/dcre/kernel/kernel_rename.def [new file with mode: 0644]
asp/extension/dcre/kernel/kernel_rename.h [new file with mode: 0644]
asp/extension/dcre/kernel/kernel_unrename.h [new file with mode: 0644]
asp/extension/dcre/kernel/mailbox.c [new file with mode: 0644]
asp/extension/dcre/kernel/mailbox.h [new file with mode: 0644]
asp/extension/dcre/kernel/mempfix.c [new file with mode: 0644]
asp/extension/dcre/kernel/mempfix.h [new file with mode: 0644]
asp/extension/dcre/kernel/pridataq.c [new file with mode: 0644]
asp/extension/dcre/kernel/pridataq.h [new file with mode: 0644]
asp/extension/dcre/kernel/semaphore.c [new file with mode: 0644]
asp/extension/dcre/kernel/semaphore.h [moved from asp/target/cq_starm_gcc/target_syssvc.h with 50% similarity, mode: 0644]
asp/extension/dcre/kernel/startup.c [moved from asp/target/lm3s8962_gcc/target_config.c with 50% similarity, mode: 0644]
asp/extension/dcre/kernel/task.c [new file with mode: 0644]
asp/extension/dcre/kernel/task.h [new file with mode: 0644]
asp/extension/dcre/kernel/task_except.c [new file with mode: 0644]
asp/extension/dcre/kernel/task_manage.c [new file with mode: 0644]
asp/extension/dcre/kernel/task_refer.c [new file with mode: 0644]
asp/extension/dcre/kernel/task_sync.c [new file with mode: 0644]
asp/extension/dcre/sample/sample1.c [new file with mode: 0644]
asp/extension/dcre/sample/sample1.cfg [new file with mode: 0644]
asp/extension/dcre/sample/sample1.h [moved from asp/target/cq_starm_gcc/target_support.S with 64% similarity, mode: 0644]
asp/extension/mutex/include/kernel.h
asp/extension/mutex/kernel/check.h
asp/extension/mutex/kernel/kernel.tf
asp/extension/mutex/kernel/kernel_def.csv
asp/extension/mutex/kernel/kernel_rename.def
asp/extension/mutex/kernel/kernel_rename.h
asp/extension/mutex/kernel/kernel_unrename.h
asp/extension/mutex/kernel/mutex.h
asp/extension/mutex/kernel/sys_manage.c
asp/extension/mutex/kernel/task.c
asp/extension/mutex/kernel/task.h
asp/extension/mutex/kernel/task_manage.c
asp/extension/ovrhdr/include/kernel.h
asp/extension/ovrhdr/kernel/check.h
asp/extension/ovrhdr/kernel/kernel.tf
asp/extension/ovrhdr/kernel/kernel_rename.def
asp/extension/ovrhdr/kernel/kernel_rename.h
asp/extension/ovrhdr/kernel/kernel_unrename.h
asp/extension/ovrhdr/kernel/overrun.c
asp/extension/ovrhdr/kernel/task.c
asp/extension/ovrhdr/kernel/task.h
asp/extension/ovrhdr/kernel/task_manage.c
asp/extension/ovrhdr/sample/sample1.c
asp/extension/pri_level/include/kernel.h
asp/extension/pri_level/kernel/kernel_rename.def
asp/extension/pri_level/kernel/kernel_rename.h
asp/extension/pri_level/kernel/kernel_unrename.h
asp/extension/pri_level/kernel/task.c
asp/extension/pri_level/kernel/task.h
asp/extension/rstr_task/include/kernel.h [new file with mode: 0644]
asp/extension/rstr_task/kernel/Makefile.kernel [new file with mode: 0644]
asp/extension/rstr_task/kernel/allfunc.h [new file with mode: 0644]
asp/extension/rstr_task/kernel/check.h [new file with mode: 0644]
asp/extension/rstr_task/kernel/kernel.tf [new file with mode: 0644]
asp/extension/rstr_task/kernel/kernel_def.csv [new file with mode: 0644]
asp/extension/rstr_task/kernel/kernel_rename.def [new file with mode: 0644]
asp/extension/rstr_task/kernel/kernel_rename.h [new file with mode: 0644]
asp/extension/rstr_task/kernel/kernel_unrename.h [new file with mode: 0644]
asp/extension/rstr_task/kernel/sys_manage.c [new file with mode: 0644]
asp/extension/rstr_task/kernel/task.c [new file with mode: 0644]
asp/extension/rstr_task/kernel/task.h [new file with mode: 0644]
asp/extension/rstr_task/kernel/task_manage.c [new file with mode: 0644]
asp/extension/rstr_task/kernel/task_sync.c [new file with mode: 0644]
asp/extension/rstr_task/test/test_rstr1.c [new file with mode: 0644]
asp/extension/rstr_task/test/test_rstr1.cfg [new file with mode: 0644]
asp/extension/rstr_task/test/test_rstr1.h [moved from asp/target/lm3s8962_gcc/lm3s8962.h with 74% similarity, mode: 0644]
asp/extension/rstr_task/test/test_rstr2.c [new file with mode: 0644]
asp/extension/rstr_task/test/test_rstr2.cfg [new file with mode: 0644]
asp/extension/rstr_task/test/test_rstr2.h [moved from asp/target/lm3s8962_gcc/target_sil.h with 76% similarity, mode: 0644]
asp/include/histogram.h [changed mode: 0755->0644]
asp/include/itron.h [changed mode: 0755->0644]
asp/include/kernel.h [changed mode: 0755->0644]
asp/include/log_output.h [changed mode: 0755->0644]
asp/include/queue.h [changed mode: 0755->0644]
asp/include/sil.h [changed mode: 0755->0644]
asp/include/t_stddef.h [changed mode: 0755->0644]
asp/include/t_stdlib.h [changed mode: 0755->0644]
asp/include/t_syslog.h [changed mode: 0755->0644]
asp/kernel/Makefile.kernel [changed mode: 0755->0644]
asp/kernel/alarm.c [changed mode: 0755->0644]
asp/kernel/alarm.h [changed mode: 0755->0644]
asp/kernel/allfunc.h [changed mode: 0755->0644]
asp/kernel/check.h [changed mode: 0755->0644]
asp/kernel/cyclic.c [changed mode: 0755->0644]
asp/kernel/cyclic.h [changed mode: 0755->0644]
asp/kernel/dataqueue.c [changed mode: 0755->0644]
asp/kernel/dataqueue.h [changed mode: 0755->0644]
asp/kernel/eventflag.c [changed mode: 0755->0644]
asp/kernel/eventflag.h [changed mode: 0755->0644]
asp/kernel/exception.c [changed mode: 0755->0644]
asp/kernel/exception.h [changed mode: 0755->0644]
asp/kernel/genoffset.tf [new file with mode: 0644]
asp/kernel/interrupt.c [changed mode: 0755->0644]
asp/kernel/interrupt.h [changed mode: 0755->0644]
asp/kernel/kernel.tf [changed mode: 0755->0644]
asp/kernel/kernel_api.csv [changed mode: 0755->0644]
asp/kernel/kernel_check.tf [changed mode: 0755->0644]
asp/kernel/kernel_def.csv [changed mode: 0755->0644]
asp/kernel/kernel_impl.h [changed mode: 0755->0644]
asp/kernel/kernel_int.h [changed mode: 0755->0644]
asp/kernel/kernel_rename.def [changed mode: 0755->0644]
asp/kernel/kernel_rename.h [changed mode: 0755->0644]
asp/kernel/kernel_unrename.h [changed mode: 0755->0644]
asp/kernel/mailbox.c [changed mode: 0755->0644]
asp/kernel/mailbox.h [changed mode: 0755->0644]
asp/kernel/mempfix.c [changed mode: 0755->0644]
asp/kernel/mempfix.h [changed mode: 0755->0644]
asp/kernel/pridataq.c [changed mode: 0755->0644]
asp/kernel/pridataq.h [changed mode: 0755->0644]
asp/kernel/semaphore.c [changed mode: 0755->0644]
asp/kernel/semaphore.h [changed mode: 0755->0644]
asp/kernel/startup.c [changed mode: 0755->0644]
asp/kernel/sys_manage.c [changed mode: 0755->0644]
asp/kernel/task.c [changed mode: 0755->0644]
asp/kernel/task.h [changed mode: 0755->0644]
asp/kernel/task_except.c [changed mode: 0755->0644]
asp/kernel/task_manage.c [changed mode: 0755->0644]
asp/kernel/task_refer.c [changed mode: 0755->0644]
asp/kernel/task_sync.c [changed mode: 0755->0644]
asp/kernel/time_event.c [changed mode: 0755->0644]
asp/kernel/time_event.h [changed mode: 0755->0644]
asp/kernel/time_manage.c [changed mode: 0755->0644]
asp/kernel/wait.c [changed mode: 0755->0644]
asp/kernel/wait.h [changed mode: 0755->0644]
asp/library/histogram.c [changed mode: 0755->0644]
asp/library/log_output.c [changed mode: 0755->0644]
asp/library/strerror.c [changed mode: 0755->0644]
asp/library/t_perror.c [changed mode: 0755->0644]
asp/library/test_lib.c
asp/pdic/upd72001/MANIFEST [changed mode: 0755->0644]
asp/pdic/upd72001/upd72001.c [changed mode: 0755->0644]
asp/pdic/upd72001/upd72001.h [changed mode: 0755->0644]
asp/sample/Makefile [changed mode: 0755->0644]
asp/sample/sample1.c [changed mode: 0755->0644]
asp/sample/sample1.cfg [changed mode: 0755->0644]
asp/sample/sample1.h [changed mode: 0755->0644]
asp/syssvc/banner.c [changed mode: 0755->0644]
asp/syssvc/banner.cfg [changed mode: 0755->0644]
asp/syssvc/banner.h [changed mode: 0755->0644]
asp/syssvc/logtask.c [changed mode: 0755->0644]
asp/syssvc/logtask.cfg [changed mode: 0755->0644]
asp/syssvc/logtask.h [changed mode: 0755->0644]
asp/syssvc/serial.c [changed mode: 0755->0644]
asp/syssvc/serial.cfg [changed mode: 0755->0644]
asp/syssvc/serial.h [changed mode: 0755->0644]
asp/syssvc/syslog.c [changed mode: 0755->0644]
asp/syssvc/syslog.cfg [changed mode: 0755->0644]
asp/syssvc/syslog.h [changed mode: 0755->0644]
asp/syssvc/vasyslog.c [changed mode: 0755->0644]
asp/target/cq_starm_gcc/E_PACKAGE [deleted file]
asp/target/cq_starm_gcc/MANIFEST [deleted file]
asp/target/cq_starm_gcc/Makefile.target [deleted file]
asp/target/cq_starm_gcc/cq_starm.h [deleted file]
asp/target/cq_starm_gcc/cq_starm.ld [deleted file]
asp/target/cq_starm_gcc/target.tf [deleted file]
asp/target/cq_starm_gcc/target_cfg1_out.h [deleted file]
asp/target/cq_starm_gcc/target_check.tf [deleted file]
asp/target/cq_starm_gcc/target_config.c [deleted file]
asp/target/cq_starm_gcc/target_def.csv [deleted file]
asp/target/cq_starm_gcc/target_kernel.h [deleted file]
asp/target/cq_starm_gcc/target_rename.def [deleted file]
asp/target/cq_starm_gcc/target_rename.h [deleted file]
asp/target/cq_starm_gcc/target_serial.c [deleted file]
asp/target/cq_starm_gcc/target_serial.cfg [deleted file]
asp/target/cq_starm_gcc/target_sil.h [deleted file]
asp/target/cq_starm_gcc/target_stddef.h [deleted file]
asp/target/cq_starm_gcc/target_test.h [deleted file]
asp/target/cq_starm_gcc/target_timer.cfg [deleted file]
asp/target/cq_starm_gcc/target_timer.h [deleted file]
asp/target/cq_starm_gcc/target_unrename.h [deleted file]
asp/target/cq_starm_gcc/target_user.txt [deleted file]
asp/target/dve68k_gcc/MANIFEST [changed mode: 0755->0644]
asp/target/dve68k_gcc/Makefile.target [changed mode: 0755->0644]
asp/target/dve68k_gcc/dve68k.h [changed mode: 0755->0644]
asp/target/dve68k_gcc/target.tf [changed mode: 0755->0644]
asp/target/dve68k_gcc/target_cfg1_out.h [changed mode: 0755->0644]
asp/target/dve68k_gcc/target_check.tf [changed mode: 0755->0644]
asp/target/dve68k_gcc/target_config.c [changed mode: 0755->0644]
asp/target/dve68k_gcc/target_config.h [changed mode: 0755->0644]
asp/target/dve68k_gcc/target_def.csv [changed mode: 0755->0644]
asp/target/dve68k_gcc/target_kernel.h [changed mode: 0755->0644]
asp/target/dve68k_gcc/target_rename.def [changed mode: 0755->0644]
asp/target/dve68k_gcc/target_rename.h [changed mode: 0755->0644]
asp/target/dve68k_gcc/target_serial.c [changed mode: 0755->0644]
asp/target/dve68k_gcc/target_serial.cfg [changed mode: 0755->0644]
asp/target/dve68k_gcc/target_serial.h [changed mode: 0755->0644]
asp/target/dve68k_gcc/target_sil.h [changed mode: 0755->0644]
asp/target/dve68k_gcc/target_stddef.h [changed mode: 0755->0644]
asp/target/dve68k_gcc/target_support.S [changed mode: 0755->0644]
asp/target/dve68k_gcc/target_syssvc.h [changed mode: 0755->0644]
asp/target/dve68k_gcc/target_test.h [changed mode: 0755->0644]
asp/target/dve68k_gcc/target_timer.c [changed mode: 0755->0644]
asp/target/dve68k_gcc/target_timer.cfg [changed mode: 0755->0644]
asp/target/dve68k_gcc/target_timer.h [changed mode: 0755->0644]
asp/target/dve68k_gcc/target_unrename.h [changed mode: 0755->0644]
asp/target/lm3s8962_gcc/MANIFEST [deleted file]
asp/target/lm3s8962_gcc/Makefile.target [deleted file]
asp/target/lm3s8962_gcc/lm3s8962_ram.ld [deleted file]
asp/target/lm3s8962_gcc/lm3s8962_rom.ld [deleted file]
asp/target/lm3s8962_gcc/target.tf [deleted file]
asp/target/lm3s8962_gcc/target_cfg1_out.h [deleted file]
asp/target/lm3s8962_gcc/target_check.tf [deleted file]
asp/target/lm3s8962_gcc/target_config.h [deleted file]
asp/target/lm3s8962_gcc/target_def.csv [deleted file]
asp/target/lm3s8962_gcc/target_kernel.h [deleted file]
asp/target/lm3s8962_gcc/target_rename.def [deleted file]
asp/target/lm3s8962_gcc/target_rename.h [deleted file]
asp/target/lm3s8962_gcc/target_serial.c [deleted file]
asp/target/lm3s8962_gcc/target_serial.cfg [deleted file]
asp/target/lm3s8962_gcc/target_serial.h [deleted file]
asp/target/lm3s8962_gcc/target_stddef.h [deleted file]
asp/target/lm3s8962_gcc/target_syssvc.h [deleted file]
asp/target/lm3s8962_gcc/target_test.h [deleted file]
asp/target/lm3s8962_gcc/target_timer.cfg [deleted file]
asp/target/lm3s8962_gcc/target_timer.h [deleted file]
asp/target/lm3s8962_gcc/target_unrename.h [deleted file]
asp/target/lm3s8962_gcc/target_user.txt [deleted file]
asp/test/MANIFEST [changed mode: 0755->0644]
asp/test/bit_kernel.c [changed mode: 0755->0644]
asp/test/perf0.c [changed mode: 0755->0644]
asp/test/perf0.cfg [changed mode: 0755->0644]
asp/test/perf0.h [changed mode: 0755->0644]
asp/test/perf1.c [changed mode: 0755->0644]
asp/test/perf1.cfg [changed mode: 0755->0644]
asp/test/perf1.h [changed mode: 0755->0644]
asp/test/perf2.c [changed mode: 0755->0644]
asp/test/perf2.cfg [changed mode: 0755->0644]
asp/test/perf2.h [changed mode: 0755->0644]
asp/test/perf3.c [changed mode: 0755->0644]
asp/test/perf3.cfg [changed mode: 0755->0644]
asp/test/perf3.h [changed mode: 0755->0644]
asp/test/test_cpuexc.cfg [changed mode: 0755->0644]
asp/test/test_cpuexc.h [changed mode: 0755->0644]
asp/test/test_cpuexc.txt [changed mode: 0755->0644]
asp/test/test_cpuexc1.c [changed mode: 0755->0644]
asp/test/test_cpuexc10.c [changed mode: 0755->0644]
asp/test/test_cpuexc11.c [changed mode: 0755->0644]
asp/test/test_cpuexc12.c [changed mode: 0755->0644]
asp/test/test_cpuexc13.c [changed mode: 0755->0644]
asp/test/test_cpuexc2.c [changed mode: 0755->0644]
asp/test/test_cpuexc3.c [changed mode: 0755->0644]
asp/test/test_cpuexc4.c [changed mode: 0755->0644]
asp/test/test_cpuexc5.c [changed mode: 0755->0644]
asp/test/test_cpuexc6.c [changed mode: 0755->0644]
asp/test/test_cpuexc7.c [changed mode: 0755->0644]
asp/test/test_cpuexc8.c [changed mode: 0755->0644]
asp/test/test_cpuexc9.c [changed mode: 0755->0644]
asp/test/test_dlynse.c [changed mode: 0755->0644]
asp/test/test_dlynse.cfg [changed mode: 0755->0644]
asp/test/test_dlynse.h [changed mode: 0755->0644]
asp/test/test_sem1.c [changed mode: 0755->0644]
asp/test/test_sem1.cfg [changed mode: 0755->0644]
asp/test/test_sem1.h [changed mode: 0755->0644]
asp/test/test_sysstat1.c [changed mode: 0755->0644]
asp/test/test_sysstat1.cfg [changed mode: 0755->0644]
asp/test/test_sysstat1.h [changed mode: 0755->0644]
asp/test/test_task1.c [changed mode: 0755->0644]
asp/test/test_task1.cfg [changed mode: 0755->0644]
asp/test/test_task1.h [changed mode: 0755->0644]
asp/test/test_tex1.c [changed mode: 0755->0644]
asp/test/test_tex1.cfg [changed mode: 0755->0644]
asp/test/test_tex1.h [changed mode: 0755->0644]
asp/test/test_tex2.c [changed mode: 0755->0644]
asp/test/test_tex2.cfg [changed mode: 0755->0644]
asp/test/test_tex2.h [changed mode: 0755->0644]
asp/utils/genoffset
asp/utils/makedep

index ccf63db..9c07cbb 100644 (file)
@@ -1,5 +1,5 @@
 PACKAGE asp
-VERSION 1.6.0
+VERSION 1.7.0
 
 configure
 MANIFEST
@@ -38,6 +38,7 @@ kernel/eventflag.c
 kernel/eventflag.h
 kernel/exception.c
 kernel/exception.h
+kernel/genoffset.tf
 kernel/interrupt.c
 kernel/interrupt.h
 kernel/kernel.tf
index 41748e1..0efbb39 100644 (file)
@@ -1,5 +1,5 @@
 
-       TOPPERS/ASP Kernel(Release 1.6.0)
+       TOPPERS/ASP Kernel(Release 1.7.0)
                Toyohashi Open Platform for Embedded Real-Time Systems/
                Advanced Standard Profile Kernel
 
@@ -46,7 +46,7 @@ ASPカーネルを,TOPPERSプロジェクトからオープンソースにす
 
 【今後の改造計画】
 
-今後(Release 1.7以降),ASPカーネルに対して大きな変更の可能性がある項
+今後(Release 1.8以降),ASPカーネルに対して大きな変更の可能性がある項
 目は次の通りです.
 
 ・TOPPERS組込みコンポーネントシステム(TECS)の導入.現時点では,TECSの
index b6faf48..17a7b4d 100644 (file)
@@ -66,7 +66,7 @@ $FOREACH excno {2,3,...,14}$
        $IF excno == 11$
                $TAB$(FP)(_kernel_svc_handler),      // 11 SVCall handler
        $ELSE$
-               $TAB$(FP)(_kernel_exc_entry),
+               $TAB$(FP)(_kernel_exc_entry_point),
        $END$
        $SPC$$FORMAT("/* %d */", +excno)$$NL$
 $END$
@@ -75,7 +75,7 @@ $FOREACH inhno INTNO_VALID$
        $IF LENGTH(INH.INHNO[inhno]) && (INT.INTPRI[inhno] < TIPM_LOCK)$
                $TAB$(FP)($INH.INTHDR[inhno]$),
        $ELSE$
-               $TAB$(FP)(_kernel_int_entry),
+               $TAB$(FP)(_kernel_int_entry_point),
        $END$
        $SPC$$FORMAT("/* %d */", +inhno)$$NL$
 $END$
index 12cbf77..2f2e5b9 100644 (file)
@@ -615,12 +615,12 @@ exc_sense_unlock(void *p_excinf)
 /*
  *  CPU例外エントリ(prc_support.S)
  */
-extern void exc_entry(void);
+extern void exc_entry_point(void);
 
 /*
  *  割込みエントリ(prc_support.S)
  */
-extern void int_entry(void);
+extern void int_entry_point(void);
 
 /*
  *  プロセッサ依存の初期化
index 2f61c7c..206257d 100644 (file)
@@ -11,8 +11,8 @@ prc_terminate
 bitpat_cfgint
 
 # prc_support.S
-int_entry
-exc_entry
+int_entry_point
+exc_entry_point
 ret_int
 ret_exc
 svc_handler
index 763b1a0..35a3e23 100644 (file)
@@ -20,8 +20,8 @@
 /*
  *  prc_support.S
  */
-#define int_entry                                      _kernel_int_entry
-#define exc_entry                                      _kernel_exc_entry
+#define int_entry_point                                _kernel_int_entry_point
+#define exc_entry_point                                _kernel_exc_entry_point
 #define ret_int                                                _kernel_ret_int
 #define ret_exc                                                _kernel_ret_exc
 #define svc_handler                                    _kernel_svc_handler
@@ -46,8 +46,8 @@
 /*
  *  prc_support.S
  */
-#define _int_entry                                     __kernel_int_entry
-#define _exc_entry                                     __kernel_exc_entry
+#define _int_entry_point                       __kernel_int_entry_point
+#define _exc_entry_point                       __kernel_exc_entry_point
 #define _ret_int                                       __kernel_ret_int
 #define _ret_exc                                       __kernel_ret_exc
 #define _svc_handler                           __kernel_svc_handler
index ddb58c7..7c7cf24 100644 (file)
@@ -103,9 +103,9 @@ dispatch_r_1:                     /* タスクへのcall_textnから戻る */
        .align 2
        .syntax unified
        .code 16
-       .global exc_entry
-       .type exc_entry, function
-exc_entry:
+       .global exc_entry_point
+       .type exc_entry_point, function
+exc_entry_point:
        /*
         *  例外/割込みが発生すると,発生時にアクティブなスタックにスクラ
         *  ッチレジスタ等が保存される.
@@ -195,9 +195,9 @@ exc_entry_2:
        .align 2
        .syntax unified
        .code 16
-       .global int_entry
-       .type int_entry, function
-int_entry:
+       .global int_entry_point
+       .type int_entry_point, function
+int_entry_point:
        /*
         *  割込み発生時の割込み優先度マスクをスタックに保存するため取得
         */
index 126f00b..69d9cf0 100644 (file)
@@ -21,8 +21,8 @@
 /*
  *  prc_support.S
  */
-#undef int_entry
-#undef exc_entry
+#undef int_entry_point
+#undef exc_entry_point
 #undef ret_int
 #undef ret_exc
 #undef svc_handler
@@ -47,8 +47,8 @@
 /*
  *  prc_support.S
  */
-#undef _int_entry
-#undef _exc_entry
+#undef _int_entry_point
+#undef _exc_entry_point
 #undef _ret_int
 #undef _ret_exc
 #undef _svc_handler
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 90eb941..92cf210
@@ -7,8 +7,10 @@ makeoffset.c
 prc_cfg1_out.h
 prc_config.c
 prc_config.h
+prc_def.csv
 prc_insn.h
 prc_kernel.h
+prc_offset.tf
 prc_rename.def
 prc_rename.h
 prc_sil.h
old mode 100755 (executable)
new mode 100644 (file)
index 8f3db96..e5cec3f
@@ -1,9 +1,5 @@
 #
-#  @(#) $Id: Makefile.prc 304 2007-07-16 07:50:38Z hiro $
-# 
-
-#
-#              Makefile のプロセッサ依存部(M68040用)
+#              Makefileのプロセッサ依存部(M68040用)
 #
 
 #
@@ -12,6 +8,11 @@
 GCC_TARGET = m68k-unknown-elf
 
 #
+#  プロセッサ依存部ディレクトリ名の定義
+#
+PRCDIR = $(SRCDIR)/arch/$(PRC)_$(TOOL)
+
+#
 #  コンパイルオプション
 #
 COPTS := $(COPTS) -m68020-40 -msoft-float
@@ -20,6 +21,16 @@ LDFLAGS := $(LDFLAGS) -msoft-float
 #
 #  カーネルに関する定義
 #
-KERNEL_DIR := $(KERNEL_DIR) $(SRCDIR)/arch/$(PRC)_$(TOOL)
+KERNEL_DIR := $(KERNEL_DIR) $(PRCDIR)
 KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) prc_support.o
 KERNEL_COBJS := $(KERNEL_COBJS) prc_config.o
+
+#
+#  コンフィギュレータ関係の変数の定義
+#
+CFG_TABS := $(CFG_TABS) --cfg1-def-table $(PRCDIR)/prc_def.csv
+
+#
+#  オフセットファイル生成のための定義
+#
+OFFSET_TF = $(PRCDIR)/prc_offset.tf
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index b1702bb..7378cb1
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: makeoffset.c 1840 2010-07-10 17:29:42Z ertl-hiro $
+ *  @(#) $Id: makeoffset.c 2048 2011-04-03 02:36:03Z ertl-hiro $
  */
 
 #include "kernel_impl.h"
@@ -93,13 +93,13 @@ TCB BIT_BB_TCB_enatex = {
        false,                                  /* acqeue */
        false,                                  /* wupque */
        true,                                   /* enatex */
-       0U,                                             /* texprn */
+       0U,                                             /* texptn */
        NULL,                                   /* p_winifo */
 #ifdef TOPPERS_SUPPORT_MUTEX
        { NULL, NULL },                 /* mutex_queue */
 #endif /* TOPPERS_SUPPORT_MUTEX */
 #ifdef TOPPERS_SUPPORT_OVRTIM
        0U,                                             /* leftotm */
-#endif TOPPERS_SUPPORT_OVRTIM
+#endif /* TOPPERS_SUPPORT_OVRTIM */
        { NULL, NULL }                  /* tskctxb */
 };
old mode 100755 (executable)
new mode 100644 (file)
index e6b33b7..7e9d516
@@ -1,8 +1,4 @@
 /*
- *  @(#) $Id: prc_cfg1_out.h 930 2008-04-14 07:33:19Z ertl-hiro $
- */
-
-/*
  *             cfg1_out.cのリンクに必要なスタブの定義
  */
 
@@ -21,3 +17,32 @@ void software_init_hook(void)
 const SIZE             _kernel_istksz = 0;
 
 STK_T *const   _kernel_istk = NULL;
+
+/*
+ *  オフセットファイルを生成するための定義
+ */
+const uint8_t  MAGIC_1 = 0x12;
+const uint16_t MAGIC_2 = 0x1234;
+const uint32_t MAGIC_4 = 0x12345678;
+
+const TCB      TCB_enatex = {
+       { NULL, NULL },                 /* task_queue */
+       NULL,                                   /* p_tinib */
+       0U,                                             /* tstat */
+#ifdef TOPPERS_SUPPORT_MUTEX
+       0U,                                             /* bpriority */
+#endif /* TOPPERS_SUPPORT_MUTEX */
+       0U,                                             /* priority */
+       false,                                  /* acqeue */
+       false,                                  /* wupque */
+       true,                                   /* enatex */
+       0U,                                             /* texptn */
+       NULL,                                   /* p_winifo */
+#ifdef TOPPERS_SUPPORT_MUTEX
+       { NULL, NULL },                 /* mutex_queue */
+#endif /* TOPPERS_SUPPORT_MUTEX */
+#ifdef TOPPERS_SUPPORT_OVRTIM
+       0U,                                             /* leftotm */
+#endif /* TOPPERS_SUPPORT_OVRTIM */
+       { NULL, NULL }                  /* tskctxb */
+};
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 55887b6..e02f3fd
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  $Id: prc_config.h 1766 2010-02-21 07:02:24Z ertl-hiro $
+ *  $Id: prc_config.h 2013 2010-12-31 12:47:36Z ertl-hiro $
  */
 
 /*
@@ -570,17 +570,17 @@ exc_get_iipm(void *p_excinf)
  *  CPU例外の発生した時のコンテキストと割込みのマスク状態の参照
  *
  *  CPU例外の発生した時のシステム状態が,カーネル実行中でなく,タスクコ
- *  ã\83³ã\83\86ã\82­ã\82¹ã\83\88ã\81§ã\81\82ã\82\8aï¼\8cå\89²è¾¼ã\81¿ã\83­ã\83\83ã\82¯ç\8a¶æ\85\8bã\81§ã\81ªã\81\8fï¼\8cCPUã\83­ã\83\83ã\82¯ç\8a¶æ\85\8bã\81§ã\81ªã\81\8fï¼\8cï¼\88ã\83¢
- *  デル上の)割込み優先度マスク全解除状態である時にtrue,そうでない時
- *  にfalseを返す(CPU例外がカーネル管理外の割込み処理中で発生した場合
- *  ã\81«ã\82\82falseã\82\92è¿\94ã\81\99ï¼\89ï¼\8e
+ *  ã\83³ã\83\86ã\82­ã\82¹ã\83\88ã\81§ã\81\82ã\82\8aï¼\8cå\85¨å\89²è¾¼ã\81¿ã\83­ã\83\83ã\82¯ç\8a¶æ\85\8bã\81§ã\81ªã\81\8fï¼\8cCPUã\83­ã\83\83ã\82¯ç\8a¶æ\85\8bã\81§ã\81ªã\81\8fï¼\8cå\89²
+ *  込み優先度マスク全解除状態である時にtrue,そうでない時にfalseを返す
+ *  (CPU例外がカーネル管理外の割込み処理中で発生した場合にもfalseを返
+ *  す).
  *
  *  M68040では,CPU例外の発生した時のIPM(ハードウェアの割込み優先度マ
  *  スク)がすべての割込みを許可する状態であることをチェックすることで,
- *  ã\82«ã\83¼ã\83\8dã\83«å®\9fè¡\8c中ã\81§ã\81ªã\81\84ã\81\93ã\81¨ï¼\8cå\89²è¾¼ã\81¿ã\83­ã\83\83ã\82¯ç\8a¶æ\85\8bã\81§ã\81ªã\81\84ã\81\93ã\81¨ï¼\8cCPUã\83­ã\83\83ã\82¯ç\8a¶æ\85\8b
- *  でないこと,(モデル上の)割込み優先度マスク全解除状態であることの
- *  4つの条件をチェックすることができる(CPU例外が発生した時の
- *  lock_flagを参照する必要はない).
+ *  ã\82«ã\83¼ã\83\8dã\83«å®\9fè¡\8c中ã\81§ã\81ªã\81\84ã\81\93ã\81¨ï¼\8cå\85¨å\89²è¾¼ã\81¿ã\83­ã\83\83ã\82¯ç\8a¶æ\85\8bã\81§ã\81ªã\81\84ã\81\93ã\81¨ï¼\8cCPUã\83­ã\83\83ã\82¯ç\8a
+ *  態でないこと,割込み優先度マスク全解除状態であることの4つの条件を
+ *  チェックすることができる(CPU例外が発生した時のlock_flagを参照する
+ *  必要はない).
  */
 Inline bool_t
 exc_sense_intmask(void *p_excinf)
@@ -590,32 +590,6 @@ exc_sense_intmask(void *p_excinf)
 }
 
 /*
- *  CPU例外の発生した時のコンテキストと割込み/CPUロック状態の参照
- *
- *  CPU例外の発生した時のシステム状態が,カーネル実行中でなく,タスクコ
- *  ンテキストであり,割込みロック状態でなく,CPUロック状態でない時に
- *  true,そうでない時にfalseを返す(CPU例外がカーネル管理外の割込み処
- *  理中で発生した場合にもfalseを返す).
- *
- *  ただし,ターゲット定義で,(モデル上の)割込み優先度マスクが
- *  TMIN_INTPRIと同じかそれよりも高い状態で発生したCPU例外をカーネル管
- *  理外のCPU例外と扱うこととし,それに対してfalseを返すこととしてもよ
- *  い.
- *
- *  M68040では,このターゲット定義の規定を採用する.これにより,CPU例外
- *  の発生した時のIPM(ハードウェアの割込み優先度マスク)がTMIN_INTPRI
- *  より低いことをチェックすることで,カーネル実行中でないこと,割込み
- *  ロック状態でないこと,CPUロック状態でないことの3つの条件をチェック
- *  することができる(CPU例外が発生した時のlock_flagは参照していない).
- */
-Inline bool_t
-exc_sense_unlock(void *p_excinf)
-{
-       return(!exc_sense_context(p_excinf)
-                                       && exc_get_iipm(p_excinf) < INT_IPM(TMIN_INTPRI));
-}
-
-/*
  *  プロセッサ依存の初期化
  */
 extern void    prc_initialize(void);
diff --git a/asp/arch/m68k_gcc/prc_def.csv b/asp/arch/m68k_gcc/prc_def.csv
new file mode 100644 (file)
index 0000000..1308f0d
--- /dev/null
@@ -0,0 +1,5 @@
+sizeof_TCB,sizeof(TCB)
+offsetof_TCB_p_tinib,"offsetof(TCB,p_tinib)"
+offsetof_TCB_texptn,"offsetof(TCB,texptn)"
+offsetof_TCB_msp,"offsetof(TCB,tskctxb.msp)"
+offsetof_TCB_pc,"offsetof(TCB,tskctxb.pc)"
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
diff --git a/asp/arch/m68k_gcc/prc_offset.tf b/asp/arch/m68k_gcc/prc_offset.tf
new file mode 100644 (file)
index 0000000..227380f
--- /dev/null
@@ -0,0 +1,24 @@
+$ 
+$              オフセットファイル生成用テンプレートファイル(M68040用)
+$ 
+
+$ 
+$  標準テンプレートファイルのインクルード
+$ 
+$INCLUDE "kernel/genoffset.tf"$
+
+$ 
+$  オフセット値のマクロ定義の生成
+$ 
+$DEFINE("TCB_p_tinib", offsetof_TCB_p_tinib)$
+$DEFINE("TCB_texptn", offsetof_TCB_texptn)$
+$DEFINE("TCB_msp", offsetof_TCB_msp)$
+$DEFINE("TCB_pc", offsetof_TCB_pc)$
+
+$DEFINE("TINIB_exinf", offsetof_TINIB_exinf)$
+$DEFINE("TINIB_task", offsetof_TINIB_task)$
+
+$ 
+$  ビットオフセット値等のマクロ定義の生成
+$ 
+$DEFINE_BIT("TCB_enatex", sizeof_TCB, "B")$
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index ee717ab..732a6d4
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  $Id: prc_support.S 1766 2010-02-21 07:02:24Z ertl-hiro $
+ *  $Id: prc_support.S 2015 2010-12-31 13:05:04Z ertl-hiro $
  */
 
 /*
@@ -72,7 +72,9 @@ dispatch_r:
        movem.l (%sp)+, %d2-%d7/%a2-%a6         /* レジスタを復帰 */
        btst.b #TCB_enatex_bit, TCB_enatex(%a0)
        jbeq dispatch_r_1                                       /* enatexがfalseならリターン */
-       tst.l TCB_texptn(%a0)                           /* texptnが0でなければ             */
+       tst.l TCB_texptn(%a0)                           /* texptnが0ならリターン */
+       jbeq dispatch_r_1
+       tst.l ipmflg                                            /* ipmflgがtrueであれば            */
        jbne call_texrtn                                        /*  タスク例外処理ルーチンの呼出し */
 dispatch_r_1:
        rts
@@ -270,9 +272,10 @@ ret_int_3:
         */
        clr.l reqflg                                            /* reqflgをfalseに */
        /*
-        *  CPUロック状態に移行する.カーネル管理の割込みはすでに禁止して
-        *  いるので,lock_flagとsaved_iipmを更新する.saved_iipmは,戻り
-        *  先の割込み優先度マスク(の内部表現)に設定する.
+        *  CPUロック状態に移行し,割込み優先度マスクを割込み処理前の値に設
+        *      定する.カーネル管理の割込みはすでに禁止しているので,lock_flag
+        *  とsaved_iipmを更新する.saved_iipmは,戻り先の割込み優先度マス
+        *  ク(の内部表現)に設定する.
         *
         *  この時点でCPUロック状態とするのは,dispatcherへ分岐する時と,
         *  call_texrtnを呼び出す時に,CPUロック状態になっている必要がある
@@ -302,13 +305,15 @@ ret_int_r:
        movem.l (%sp)+, %d2-%d7/%a2-%a6         /* レジスタを復帰 */
 ret_int_4:
        /*
-        *  enatexã\81\8ctrueã\81§ï¼\8ctexptnã\81\8c\81§ã\81ªã\81\91ã\82\8cã\81°ï¼\8cã\82¿ã\82¹ã\82¯ä¾\8bå¤\96å\87¦ç\90\86ã\83«ã\83¼ã\83\81ã\83³ã\82\92
-        *  呼び出す.
+        *  enatexã\81\8ctrueã\81§ï¼\8ctexptnã\81\8c\81§ã\81ªã\81\8fï¼\8cipmflgã\81\8ctrueã\81§ã\81\82ã\82\8cã\81°ï¼\8cã\82¿ã\82¹ã\82¯
+        *  例外処理ルーチンを呼び出す.
         */
        btst.b #TCB_enatex_bit, TCB_enatex(%a0)
        jbeq ret_int_5                                          /* enatexがfalseならret_int_5へ */
        tst.l TCB_texptn(%a0)                           /* texptnが0ならret_int_5へ */
        jbeq ret_int_5
+       tst.l ipmflg                                            /* ipmflgがfalseならret_int_5へ */
+       jbeq ret_int_5
        jsr call_texrtn                                         /* タスク例外処理ルーチンの呼出し */
 ret_int_5:
        /*
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index a7b9672..9dcba46 100644 (file)
@@ -1,5 +1,5 @@
 PACKAGE cfg
-VERSION 1.6.0
+VERSION 1.7.0
 
 cfg.sln
 configure
index bcd3ce0..f9c86ef 100644 (file)
@@ -1,5 +1,5 @@
 
-       TOPPERS新世代カーネル用コンフィギュレータ(Release 1.6.0)
+       TOPPERS新世代カーネル用コンフィギュレータ(Release 1.7.0)
 
 
 TOPPERS新世代カーネル用コンフィギュレータは、カーネルやソフトウェア部品
@@ -22,6 +22,8 @@ PC等の開発用コンピュータ上で動作するコマンドラインプロ
 あります(コンフィギュレータをバイナリで入手した場合には、このステップ
 は必要はありません)。
 コンフィギュレータの構築にはBoost C++ Libraries 1.42.0以上が必要です。
+また、開発時点でのBoost C Librariesの最新版は1.46.0であり、それ以降の
+バージョンについては動作確認を行っていません(まだ無いので行えません)。
 Boost C++ Librariesは、下記URLから入手することができます。
 
 http://www.boost.org/
@@ -33,6 +35,22 @@ http://www.boostpro.com/
 Boost C++ Librariesをバイナリで入手できない場合には、ソースからビルドし
 てください。
 
+・動作確認済みの環境
+Windows 7 Home Premium(x64) SP1 + Cygwin 1.7.8-1 + GCC 4.3.4 + Boost 1.43.0
+Windows 7 Home Premium(x64) SP1 + MinGW GCC 4.5.2 + Boost 1.46.0
+Windows 7 Home Premium(x64) SP1 + MinGW64 GCC 4.5.1 + Boost 1.46.0
+Windows Vista Home Premium SP2 + Cygwin 1.7.7-1 + GCC 4.3.4 + Boost 1.43.0
+Windows Vista Home Premium SP2 + Visual Studio 2008 SP1 + Boost 1.44.0
+Windows Vista Home Premium SP2 + Visual Studio 2010 + Boost 1.44.0
+Windows XP Professional SP3 + Cygwin 1.7.7-1 + GCC 4.3.4 + Boost 1.43.0
+Windows XP Professional SP3 + Visual C++ 2010 + Boost 1.44.0
+Windows XP Professional SP3 + Visual C++ 2005 SP2 + Boost 1.44.0
+Windows XP Professional SP3 + Visual C++.net 2003 SP1 + Boost 1.44.0
+Windows XP Professional SP3 + Visual C++.net 2003 SP1 + Boost 1.43.0
+Linux Ubuntu 10.10 + GCC 4.4.5 + Boost 1.42.0a
+Mac OSX 10.6.6 + GCC 4.2.1 + Boost 1.45.0
+
+
 === GNU開発環境を用いる場合 ===
 
 コンフィギュレータ(cfgプログラム)を構築するには、cfgディレクトリに移動
@@ -64,8 +82,41 @@ cfg/cfg/Releaseディレクトリにcfg.exeが生成されますので、必要
 
 Boost C++ Librariesをインストールした後、インクルードおよびライブラリの
 ディレクトリをVisual Studioに登録してからビルドを実行してください。
+Visual Studio 2010からはプロジェクトごとにディレクトリを登録するように
+仕様変更されているので注意してください。
 Visual C++ 2005 Express Editionを使用する場合、別途Platform SDKをインス
 トールする必要があります。
+複数のバージョンのBoost C++ Librariesがインストールされている場合(中途
+半端に案インストールされた場合を含む)、configureに失敗する可能性があり
+ます。その場合は手作業でMakefile.configを修正してください。
+
+【Mekefile.configの説明】
+
+configureコマンドによって生成されるMakefile.configでは次のパラメータが
+定義されます。
+
+・LIBBOOST_SUFFIX
+Boost C+ Librariesのライブラリファイルのサフィックス
+たとえば、ライブラリファイルがlibboost_system-mt.aのような形式であれば、
+LIBBOOST_SUFFIXには-mtが設定されます。
+
+・BOOST_VERSION
+Boost C++ Librariesのバージョン
+バージョン1.43.0であれば、BOOST_VERSIONには1_43が設定されます。
+
+・BOOST_DIR=/usr/include
+Boost C++ Librariesのヘッダファイルがあるディレクトリ
+自分でBoost C++ Librariesをインストールした場合、通常/usr/local/include
+が設定されます。
+
+・LIBBOOST_DIR
+Boost C++ Librariesのライブラリファイルがあるディレクトリ
+自分でBoost C++ Librariesをインストールした場合、通常/usr/local/libが設定
+されます。
+
+・OPTIONS
+コンパイラの追加オプション
+普通は何も設定されません。
 
 
 【コンフィギュレータの使い方】
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index ef71341..9bd459a
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  *
- *  Copyright (C) 2007-2010 by TAKAGI Nobuhisa
+ *  Copyright (C) 2007-2011 by TAKAGI Nobuhisa
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
@@ -256,9 +256,11 @@ bool cfg2_main()
   // テンプレート処理
   boost::any template_file( global( "template-file" ) );
   namespace fs = boost::filesystem;
-  fs::path cfg_dir( get_global< std::string >( "cfg-directory" ), fs::native );
+//  fs::path cfg_dir( get_global< std::string >( "cfg-directory" ), fs::native );
+  fs::path cfg_dir( get_global< std::string >( "cfg-directory" ) );  // filesystem3対応
   std::vector< std::string > include_paths = get_global< std::vector< std::string > >( "include-path" );
-  include_paths.push_back( cfg_dir.empty() ? "." : cfg_dir.native_file_string() );
+//  include_paths.push_back( cfg_dir.empty() ? "." : cfg_dir.native_file_string() );
+  include_paths.push_back( cfg_dir.empty() ? "." : cfg_dir.string() );  // filesystem3対応
   if ( !template_file.empty() )
   {
     toppers::text in_text;
@@ -276,15 +278,18 @@ bool cfg2_main()
     fs::path kernel_cfg_template_file( cfg_dir/fs::path( "../../kernel/kernel.tf" ) );
     if ( !fs::exists( kernel_cfg_template_file ) )
     {
-      error( _( "cannot open file `%1%\'" ), kernel_cfg_template_file.native_file_string() );
+//      error( _( "cannot open file `%1%\'" ), kernel_cfg_template_file.native_file_string() );
+      error( _( "cannot open file `%1%\'" ), kernel_cfg_template_file.string() );  // filesystem3対応
     }
     else
     {
       toppers::text in_text;
       toppers::text pp_text;
 
-      in_text.set_line( kernel_cfg_template_file.native_file_string(), 1 );
-      std::ifstream ifs( kernel_cfg_template_file.native_file_string().c_str() );
+//      in_text.set_line( kernel_cfg_template_file.native_file_string(), 1 );
+      in_text.set_line( kernel_cfg_template_file.string(), 1 );  // filesystem3対応
+//      std::ifstream ifs( kernel_cfg_template_file.native_file_string().c_str() );
+      std::ifstream ifs( kernel_cfg_template_file.string().c_str() );  // filesystem3対応
       in_text.append( ifs );
       macro_processor::preprocess( in_text, pp_text );
       mproc->evaluate( pp_text );
old mode 100755 (executable)
new mode 100644 (file)
index 9c5b19e..852203f
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  *
- *  Copyright (C) 2007-2009 by TAKAGI Nobuhisa
+ *  Copyright (C) 2007-2011 by TAKAGI Nobuhisa
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
@@ -277,9 +277,11 @@ bool cfg3_main()
     mproc->add_builtin_function( func_info );
     // ↑ 追加組み込み関数の登録
 
-    fs::path cfg_dir( get_global< std::string >( "cfg-directory" ), fs::native );
+//    fs::path cfg_dir( get_global< std::string >( "cfg-directory" ), fs::native );
+    fs::path cfg_dir( get_global< std::string >( "cfg-directory" ) );  // filesystem3対応
     std::vector< std::string > include_paths = get_global< std::vector< std::string > >( "include-path" );
-    include_paths.push_back( cfg_dir.empty() ? "." : cfg_dir.native_file_string() );
+//    include_paths.push_back( cfg_dir.empty() ? "." : cfg_dir.native_file_string() );
+    include_paths.push_back( cfg_dir.empty() ? "." : cfg_dir.string() );  // filesystem3対応
 
     toppers::text in_text;
     toppers::text pp_text;
old mode 100755 (executable)
new mode 100644 (file)
index ed69129..2622819 100644 (file)
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  *
- *  Copyright (C) 2007-2010 by TAKAGI Nobuhisa
+ *  Copyright (C) 2007-2011 by TAKAGI Nobuhisa
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
@@ -41,7 +41,7 @@
 #include <sys/stat.h>
 
 //! cfgのバージョン情報
-extern char const cfg_version[] = "1.6.0";
+extern char const cfg_version[] = "1.7.0";
 
 /*!
  *  \brief  プログラムファイル(cfg or cfg.exe)のタイムスタンプを取得する。
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 49ce623..ad2fe5c 100755 (executable)
@@ -18,6 +18,7 @@ do
                                                        echo "  specify the directory of Boost headers"
                                                        echo "--with-libraries=<dir>"
                                                        echo "  specify the directory of Boost libraries"
+                                                       exit
                                                        ;;
        esac
 done
@@ -71,10 +72,6 @@ fi
 libboost_suffix=`echo $libboost_regex_filename | sed -e s/.*libboost_regex//g -e s/\.[a-z]*$//g`
 echo "LIBBOOST_SUFFIX=$libboost_suffix" >> $makefile_config
 
-options=`echo "#if defined(__x86_64) && defined(__APPLE__)
--m32
-#endif" | g++ -E -x c++ - | grep m32`
-
 # 各種変数を出力
 echo BOOST_VERSION=$boost_lib_version >> $makefile_config
 echo BOOST_DIR=$include_path >> $makefile_config
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 8d15516..1cbb08a
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  *
- *  Copyright (C) 2007-2009 by TAKAGI Nobuhisa
+ *  Copyright (C) 2007-2011 by TAKAGI Nobuhisa
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
  *  の責任を負わない.
  * 
  */
+#include <cstdio>
 #include <cstdlib>
 #include <cerrno>
 #include <string>
 #include <vector>
 #include <utility>
 #include <algorithm>
-#include <ostream>
+#include <iostream>
 #include "toppers/macro_processor.hpp"
 #include "toppers/diagnostics.hpp"
 #include "toppers/gettext.hpp"
@@ -48,7 +49,7 @@
 #include <boost/format.hpp>
 #include <boost/utility.hpp>
 #include <boost/lexical_cast.hpp>
-#include <cstdio>
+#include <boost/xpressive/xpressive.hpp>
 
 namespace toppers
 {
@@ -308,7 +309,7 @@ namespace toppers
   var_t bf_concat( text_line const& line, std::vector< var_t > const& arg_list, context* p_ctx )
   {
     element e;
-    if ( macro_processor::check_arity( line, arg_list.size(), 2, "CAT" ) )
+    if ( macro_processor::check_arity( line, arg_list.size(), 2, "CONCAT" ) )
     {
       e.s = get_s( arg_list[ 0 ], p_ctx ) + get_s( arg_list[ 1 ], p_ctx );
     }
@@ -321,16 +322,24 @@ namespace toppers
    *  \param[in]  arg_list  マクロ実引数リスト
    *  \param[in]  p_ctx     マクロコンテキスト
    *  \retval     マクロ返却値
-   *  第1マクロ実引数と第2マクロ実引数を連結して新しい順序付きリストを生成する。
+   *  第1マクロ実引数と第2マクロ実引数以降を連結して新しい順序付きリストを生成する。
    */
   var_t bf_append( text_line const& line, std::vector< var_t > const& arg_list, context* p_ctx )
   {
     var_t result;
-    if ( macro_processor::check_arity( line, arg_list.size(), 2, "APPEND" ) )
-    {
-      result = arg_list[ 0 ];
-      result.insert( result.end(), arg_list[ 1 ].begin(), arg_list[1].end() );
-    }
+    var_t::size_type const n = arg_list.size();
+    if ( n < 2 )
+    {
+      error( line, _( "too few arguments for `%1%\'" ), "APPEND" );
+               }
+               else
+               {
+                 result = arg_list[ 0 ];
+      for ( var_t::size_type i = 1; i < n; i++)
+                       {
+                         result.insert( result.end(), arg_list[ i ].begin(), arg_list[ i ].end() );
+                       }
+               }
     return result;
   }
 
@@ -345,7 +354,7 @@ namespace toppers
   var_t bf_at( text_line const& line, std::vector< var_t > const& arg_list, context* p_ctx )
   {
     element e;
-    if ( macro_processor::check_arity( line, arg_list.size(), 2, "CAT" ) )
+    if ( macro_processor::check_arity( line, arg_list.size(), 2, "AT" ) )
     {
       try
       {
@@ -429,16 +438,38 @@ namespace toppers
     if ( macro_processor::check_arity( line, arg_list.size(), 2, "FIND" ) )
     {
       var_t list( arg_list[ 0 ] );
-      std::tr1::int64_t value( get_i( arg_list[ 1 ], p_ctx ) );
 
-      for ( var_t::const_iterator iter( list.begin() ), last( list.end() ); iter != last; ++iter )
-      {
-        if ( iter->i.get() == value ) // 発見!
+         if ( !arg_list[ 1 ].empty() )
+         {
+        element key( arg_list[ 1 ].front() );
+
+        if ( !key.i )  // 整数値が設定されていなければ...
         {
-          e.i = iter - list.begin();  // iter は RandomAccessIterator
-          return var_t( 1, e );
+          std::string value( key.s );
+
+          for ( var_t::const_iterator iter( list.begin() ), last( list.end() ); iter != last; ++iter )
+          {
+            if ( iter->s == value ) // 発見!
+            {
+              e.i = iter - list.begin();  // iter は RandomAccessIterator
+              return var_t( 1, e );
+            }
+          }
         }
-      }
+               else
+               {
+          std::tr1::int64_t value( key.i.get() );
+
+          for ( var_t::const_iterator iter( list.begin() ), last( list.end() ); iter != last; ++iter )
+          {
+            if ( iter->i && iter->i.get() == value ) // 発見!
+            {
+              e.i = iter - list.begin();  // iter は RandomAccessIterator
+              return var_t( 1, e );
+            }
+          }
+        }
+         }
     }
     return var_t();
   }
@@ -645,7 +676,10 @@ namespace toppers
     if ( macro_processor::check_arity( line, arg_list.size(), 1, "UNESCSTR" ) )
     {
       std::string str( get_s( arg_list[ 0 ], p_ctx ) );
-      e.s = expand_quote( str );
+      if ( !str.empty() )
+      {
+        e.s = expand_quote( str );
+      }
     }
     return var_t( 1, e );
   }
@@ -681,14 +715,14 @@ namespace toppers
         arg_list.push_back( var_t( 1, e ) );
         arg_list.push_back( var_t( 1, lhs ) );
         arg_list.push_back( var_t( 1, rhs ) );
-               int arg1 = static_cast< int >( *lhs.i );
-               int arg2 = static_cast< int >( *rhs.i );
+        int arg1 = static_cast< int >( *lhs.i );
+        int arg2 = static_cast< int >( *rhs.i );
 
         var_t r = bf_call( line_, arg_list, p_ctx_ );
         bool result = 0;
         if ( !r.empty() )
         {
-                       int retval = static_cast< int >( *r.front().i );
+          int retval = static_cast< int >( *r.front().i );
           result = ( *r.front().i < 0 );
         }
         return result;
@@ -763,6 +797,71 @@ namespace toppers
     return result;
   }
 
+  /*! 
+   *  \brief  正規表現を用いた置換 
+   *  \param[in]  line      行番号 
+   *  \param[in]  arg_list  マクロ実引数リスト 
+   *  \param[in]  p_ctx     マクロコンテキスト 
+   *  \retval     マクロ返却値 
+   *  第1マクロ実引数で指定した文字列のうち、第2マクロ実引数で指定した正規表現にマッチする箇所を第3マクロ実引数の内容で置換する。
+   *  正規表現はECMAScript互換とする。
+   */ 
+   var_t bf_regex_replace( text_line const& line, std::vector< var_t > const& arg_list, context* p_ctx ) 
+   { 
+     element e; 
+     if ( macro_processor::check_arity( line, arg_list.size(), 3, "REGEX_REPLACE" ) ) 
+     {
+       e.s = boost::xpressive::regex_replace( get_s( arg_list[ 0 ], p_ctx ), 
+                                              boost::xpressive::sregex::compile( get_s( arg_list[ 1 ], p_ctx ) ), 
+                                              get_s( arg_list[ 2 ], p_ctx ) ); 
+     } 
+     return var_t( 1, e ); 
+   }
+
+  /*!
+   *  \brief  配列の全削除
+   *  \param[in]  line      行番号
+   *  \param[in]  arg_list  マクロ実引数リスト
+   *  \param[in]  p_ctx     マクロコンテキスト
+   *  \retval     マクロ返却値
+        *  第1マクロ実引数で指定した名前の配列を全削除する。
+   */
+  var_t bf_clean( text_line const& line, std::vector< var_t > const& arg_list, context* p_ctx )
+  {
+    element e;
+    if ( macro_processor::check_arity( line, arg_list.size(), 1, "CLEAN" ) ) 
+    {
+      std::string name = get_s( arg_list[ 0 ], p_ctx ) + "[";
+      for ( std::map< std::string, var_t >::iterator it = p_ctx->var_map.lower_bound( name );
+            it != p_ctx->var_map.end();
+            ++it )
+      {
+        if ( std::strncmp( it->first.c_str(), name.c_str(), name.size() ) != 0 )
+          break;
+        it->second = var_t();
+      }
+    }
+    return var_t( 1, e );
+  }
+
+  /*!
+   *  \brief  マクロプロセッサの終了
+   *  \param[in]  line      行番号
+   *  \param[in]  arg_list  マクロ実引数リスト
+   *  \param[in]  p_ctx     マクロコンテキスト
+   *  \retval     マクロ返却値
+   *  マクロプロセッサを終了する。
+   */
+  var_t bf_die( text_line const& line, std::vector< var_t > const& arg_list, context* p_ctx )
+  {
+    element e;
+    if ( macro_processor::check_arity( line, arg_list.size(), 0, "DIE" ) ) 
+    {
+      throw macro_processor::die_terminate();
+    }
+    return var_t( 1, e );
+  }
+
   /*!
    *  \brief  何もしない組み込み関数
    *  \param[in]  line      行番号
@@ -803,6 +902,9 @@ namespace toppers
     { "LSORT", bf_lsort },
     { "ISFUNCTION", bf_isfunction },
     { "REVERSE", bf_reverse },
+    { "REGEX_REPLACE", bf_regex_replace }, 
+    { "CLEAN", bf_clean },
+    { "DIE", bf_die },
     { "NOOP", bf_noop },
     { "", 0 },
   };
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 030411f..b5422c9
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  *
- *  Copyright (C) 2005-2010 by TAKAGI Nobuhisa
+ *  Copyright (C) 2005-2011 by TAKAGI Nobuhisa
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
@@ -187,7 +187,8 @@ namespace toppers
               | ( unary_operator >> cast_expression )
             );
         unary_operator =
-            chset<>( "&*~!+-" );
+            //chset<>( "&*~!+-" );
+                   ch_p( '&' ) | '*' | '~' | '!' | '+' | '-';
         cast_expression =
             *( '(' >> type_name >> ')' ) >> unary_expression
           | +( '(' >> ( type_name | identifier ) >> ')' );  // 構文解析に失敗する不具合対策
@@ -251,8 +252,10 @@ namespace toppers
               as_lower_d
               [
                 ( ( *digit_p >> '.' >> +digit_p ) | ( +digit_p >> '.' ) ) >>
-                'e' >> !chset<>( "+-" ) >> +digit_p >>
-                !chset<>( "fl" )
+//                'e' >> !chset<>( "+-" ) >> +digit_p >>
+                               'e' >> !( ch_p( '+' ) | '-' ) >> +digit_p >>
+//                !chset<>( "fl" )
+                           ( ch_p( 'f' ) | 'l' )
               ]
             ];
         hexadecimal_floating_constant =
@@ -262,8 +265,10 @@ namespace toppers
               [
                 "0x" >>
                 ( ( *xdigit_p >> '.' >> +xdigit_p ) | ( +xdigit_p >> '.' ) ) >>
-                'p' >> !chset<>( "+-" ) >> +digit_p >>
-                !chset<>( "fl" )
+//                'p' >> !chset<>( "+-" ) >> +digit_p >>
+                               'p' >> !( ch_p( '+' ) | '-' ) >> +digit_p >>
+//                !chset<>( "fl" )
+                           ( ch_p( 'f' ) | 'l' )
               ]
             ];
         integer_constant =
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 28f4a94..e43494d
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  *
- *  Copyright (C) 2007-2010 by TAKAGI Nobuhisa
+ *  Copyright (C) 2007-2011 by TAKAGI Nobuhisa
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
@@ -38,6 +38,7 @@
 #include <cstring>
 #include <cstdio>
 #include <stdexcept>
+#include <iostream>
 #include "toppers/cpp.hpp"
 
 namespace toppers
@@ -52,7 +53,7 @@ namespace toppers
     std::string::size_type n = str.find_first_not_of( " \t\r\n" );
     std::string quoted( str, n );
 
-    if ( quoted.empty() || quoted[0] != '"' || quoted[quoted.size() - 1] != '"' )
+    if ( quoted.size() < 2 || quoted[0] != '"' || quoted[quoted.size() - 1] != '"' )
     {
       throw std::invalid_argument( "argument is not quoted" );
     }
old mode 100755 (executable)
new mode 100644 (file)
index 685bcd5..6bc8880
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  *
- *  Copyright (C) 2007-2008 by TAKAGI Nobuhisa
+ *  Copyright (C) 2007-2011 by TAKAGI Nobuhisa
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
@@ -167,7 +167,8 @@ namespace toppers
     std::string search_include_file( InputIterator first, InputIterator last, std::string const& headername )
   {
     namespace fs = boost::filesystem;
-    fs::path filename( headername, fs::native );
+//    fs::path filename( headername, fs::native );
+    fs::path filename( headername );  // filesystem3対応
 
     if ( fs::exists( filename ) && !fs::is_directory( filename ) )
     {
@@ -175,10 +176,12 @@ namespace toppers
     }
     while ( first != last )
     {
-      fs::path pathname = fs::path( *first, fs::native )/filename;
+//      fs::path pathname = fs::path( *first, fs::native )/filename;
+      fs::path pathname = fs::path( *first )/filename;  // filesystem3対応
       if ( fs::exists( pathname ) && !fs::is_directory( pathname ) )
       {
-        return pathname.native_file_string();
+//        return pathname.native_file_string();
+        return pathname.string();  // filesysytem3対応
       }
       ++first;
     }
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 825a470..b2133df
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  *
- *  Copyright (C) 2007-2008 by TAKAGI Nobuhisa
+ *  Copyright (C) 2007-2011 by TAKAGI Nobuhisa
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
@@ -138,9 +138,13 @@ namespace toppers
     }
     std::string lang( env );
 
-    fs::path cfg_dir( dir, fs::native );
-    fs::path po_file( cfg_dir/fs::path( lang + ".po", fs::native ) );
-    std::ifstream ifs( po_file.native_file_string().c_str() );
+//    fs::path cfg_dir( dir, fs::native );
+    fs::path cfg_dir( dir );  // filesystem3対応
+//    fs::path po_file( cfg_dir/fs::path( lang + ".po", fs::native ) );
+    fs::path po_file( cfg_dir/fs::path( lang + ".po" ) );  // filesystem3対応
+
+//    std::ifstream ifs( po_file.native_file_string().c_str() );
+    std::ifstream ifs( po_file.string().c_str() );  // filesystem3対応
     std::string msgid;
     std::string msgstr;
 
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 2cdfe0f..4323eb9
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  *
- *  Copyright (C) 2007-2010 by TAKAGI Nobuhisa
+ *  Copyright (C) 2007-2011 by TAKAGI Nobuhisa
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
@@ -49,6 +49,7 @@
 #include "toppers/macro_processor.hpp"
 #include "toppers/s_record.hpp"
 #include "toppers/nm_symbol.hpp"
+#include "toppers/misc.hpp"
 #include "toppers/itronx/cfg1_out.hpp"
 #include "toppers/itronx/preprocess.hpp"
 #include <boost/spirit/include/classic.hpp>
@@ -102,6 +103,7 @@ namespace toppers
       {
         ofile_ << "const uint32_t TOPPERS_cfg_magic_number = 0x12345678;\n"
                   "const uint32_t TOPPERS_cfg_sizeof_signed_t = sizeof(signed_t);\n"
+                  "const uint32_t TOPPERS_cfg_sizeof_pointer = sizeof(const volatile void*);\n"
                   "const unsigned_t TOPPERS_cfg_CHAR_BIT = CHAR_BIT;\n"
                   "const unsigned_t TOPPERS_cfg_CHAR_MAX = CHAR_MAX;\n"
                   "const unsigned_t TOPPERS_cfg_CHAR_MIN = CHAR_MIN;\n"
@@ -111,7 +113,7 @@ namespace toppers
                   "const unsigned_t TOPPERS_cfg_LONG_MAX = LONG_MAX;\n"
                   "\n";
 
-        if ( def_table_ != 0 )
+        if ( def_table_ != 0 ) // 「値取得シンボルテーブル」
         {
           for ( cfg1_def_table::const_iterator iter( def_table_->begin() ), last( def_table_->end() );
                 iter != last;
@@ -140,6 +142,10 @@ namespace toppers
                           "(" + value2 + ");\n"
                           "#endif\n";
             }
+            else if ( iter->expression[ 0 ] == '@' )  // '@'で始まればアドレス
+            {
+              definition = "const volatile void* const TOPPERS_cfg_" + iter->name + " = (" + ( iter->expression.c_str() + 1 ) + ");\n";
+            }
             else
             {
               definition +=
@@ -409,7 +415,7 @@ namespace toppers
             {
               oss << "\n#ifndef TOPPERS_cfg_valueof_" << id << "_DEFINED\n"
                     "#define TOPPERS_cfg_valueof_" << id << "_DEFINED 1\n";
-              oss << boost::format( "\n#line %1% \"%2%\"\n" ) % ( iter.line().line ) % iter.line().file;
+              oss << boost::format( "\n#line %1% \"%2%\"\n" ) % ( iter.line().line ) % dir_delimiter_to_slash( iter.line().file );
 
               current_class = idexp;
               oss << "const unsigned_t TOPPERS_cfg_valueof_" << id << " = " << idexp << ";\n";
@@ -418,7 +424,7 @@ namespace toppers
             {
               oss << "\n#ifndef TOPPERS_cfg_valueof_" << id << "_DEFINED\n"
                     "#define TOPPERS_cfg_valueof_" << id << "_DEFINED 1\n";
-              oss << boost::format( "\n#line %1% \"%2%\"\n" ) % ( iter.line().line ) % iter.line().file;
+              oss << boost::format( "\n#line %1% \"%2%\"\n" ) % ( iter.line().line ) % dir_delimiter_to_slash( iter.line().file );
 
               current_domain = id;
               oss << "const unsigned_t TOPPERS_cfg_valueof_" << id << " = ";
@@ -447,7 +453,7 @@ namespace toppers
             block_stack.pop();
 
             oss << "\n#ifndef TOPPERS_cfg_inside_of_" << b.id << "\n";
-            oss << boost::format( "\n#line %1% \"%2%\"\n" ) % ( iter.line().line ) % iter.line().file;
+            oss << boost::format( "\n#line %1% \"%2%\"\n" ) % ( iter.line().line ) % dir_delimiter_to_slash( iter.line().file );
             oss << "#error syntax error\n"
                     "#endif\n";
             oss << "#undef TOPPERS_cfg_inside_of_" << b.id << "\n"
@@ -481,8 +487,7 @@ namespace toppers
 
               api_array.push_back( api );
 
-              std::string file( boost::filesystem::path( api.line().file, boost::filesystem::native ).string() ); // ディレクトリ区切子を / に変更
-              oss << boost::format( "\n#line %1% \"%2%\"\n" ) % api.line().line % file;
+              oss << boost::format( "\n#line %1% \"%2%\"\n" ) % api.line().line % dir_delimiter_to_slash( api.line().file );
               oss << "const unsigned_t TOPPERS_cfg_static_api_" << serial << " = " << serial << ";\n";
 
               if ( !api.params().empty() && api.begin()->symbol[0] == '#' )   // オブジェクト識別名
@@ -512,7 +517,7 @@ namespace toppers
                 else
                 {
                   oss << "#define " << object_id << "\t(<>)\n";   // でたらめな字句(基本ソース文字集合のみで構成)に定義することで、誤使用を検出する
-                  oss << boost::format( "\n#line %1% \"%2%\"\n" ) % ( api.line().line ) % file;
+                  oss << boost::format( "\n#line %1% \"%2%\"\n" ) % ( api.line().line ) % dir_delimiter_to_slash( api.line().file );
                 }
               }
               for ( static_api::iterator api_iter( api.begin() ), api_last( api.end() );
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 4c4e2c1..03371bd
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  *
- *  Copyright (C) 2007-2010 by TAKAGI Nobuhisa
+ *  Copyright (C) 2007-2011 by TAKAGI Nobuhisa
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
@@ -332,6 +332,7 @@ namespace toppers
 
         cfg1_out::cfg1_def_table const* def_table = cfg1out.get_def_table();
         std::size_t sizeof_signed_t;
+        std::size_t sizeof_pointer;
 
         static cfg1_out::cfg1_def_t const limit_defs[] =
         {
@@ -347,6 +348,9 @@ namespace toppers
         nm_symbol::entry nm_entry = cfg1out.get_syms()->find( "TOPPERS_cfg_sizeof_signed_t" );
         sizeof_signed_t = static_cast< std::size_t >( cfg1out.get_srec()->get_value( nm_entry.address, 4, cfg1out.is_little_endian() ) );
 
+        nm_entry = cfg1out.get_syms()->find( "TOPPERS_cfg_sizeof_pointer" );
+        sizeof_pointer = static_cast< std::size_t >( cfg1out.get_srec()->get_value( nm_entry.address, 4, cfg1out.is_little_endian() ) );
+
         for ( std::size_t i = 0; i < sizeof limit_defs / sizeof limit_defs[ 0 ]; ++i )
         {
           element e;
@@ -365,14 +369,35 @@ namespace toppers
               ++iter )
         {
           element e;
-          e.s = iter->expression;
+          std::tr1::int64_t value;
+
           nm_entry = cfg1out.get_syms()->find( "TOPPERS_cfg_" + iter->name );
           if ( nm_entry.type >= 0 )
           {
-            std::tr1::int64_t value = cfg1out.get_srec()->get_value( nm_entry.address, sizeof_signed_t, cfg1out.is_little_endian() );
-            if ( sizeof_signed_t < 8 && iter->is_signed )
+            if ( !iter->expression.empty() && iter->expression[ 0 ] == '@' )  // 式が'@'で始まる場合はアドレス定数式
             {
-              value = cfg1_out::make_signed( static_cast< std::tr1::uint32_t >( value ) );
+              value = cfg1out.get_srec()->get_value( nm_entry.address, sizeof_pointer, cfg1out.is_little_endian() );
+              if ( sizeof_signed_t < 8 && iter->is_signed )
+              {
+                value = cfg1_out::make_signed( static_cast< std::tr1::uint32_t >( value ) );
+              }
+
+              // 先ほど取り出したアドレスを使って間接参照
+              value = cfg1out.get_srec()->get_value( value, 8, cfg1out.is_little_endian() );  // 取り出す値は型に関係なく常に8バイト
+              if ( sizeof_signed_t < 8 && iter->is_signed )
+              {
+                value = cfg1_out::make_signed( static_cast< std::tr1::uint32_t >( value ) );
+              }
+              e.s = iter->expression.c_str() + 1; // 先頭の'@'を除去
+            }
+            else  // アドレスではない通常の整数定数式
+            {
+              value = cfg1out.get_srec()->get_value( nm_entry.address, sizeof_signed_t, cfg1out.is_little_endian() );
+              if ( sizeof_signed_t < 8 && iter->is_signed )
+              {
+                value = cfg1_out::make_signed( static_cast< std::tr1::uint32_t >( value ) );
+              }
+              e.s = iter->expression;
             }
             e.i = value;
             mproc.set_var( iter->name, var_t( 1, e ) );
@@ -590,6 +615,7 @@ namespace toppers
 
       // その他の組み込み変数の設定
       set_object_vars( api_map, *mproc );
+      set_object_vars( cfg1out.get_static_api_array(), *mproc );
       set_clsid_vars( cfg1out.get_clsid_table(), cfg1out, *mproc );
       set_domid_vars( cfg1out.get_domid_table(), *mproc );
       set_platform_vars( cfg1out, *mproc );
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 612c11c..9988faf
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  *
- *  Copyright (C) 2007-2010 by TAKAGI Nobuhisa
+ *  Copyright (C) 2007-2011 by TAKAGI Nobuhisa
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
@@ -42,6 +42,7 @@
 #include "toppers/cpp.hpp"
 #include "toppers/global.hpp"
 #include "toppers/diagnostics.hpp"
+#include "toppers/misc.hpp"
 #include "toppers/itronx/preprocess.hpp"
 #include <boost/spirit/include/classic.hpp>
 
@@ -128,7 +129,7 @@ namespace toppers
               {
                 if ( dependencies != 0 )
                 {
-                  dependencies->insert( hname );
+                  dependencies->insert( dir_delimiter_to_slash( hname ) );
                 }
                 out.push_back( ' ' ); // ダミーを挿入しておかないと行番号がずれる
                 preprocess( hname, out, codeset, dependencies, onces );  // ヘッダ名で指定されたファイルに対して前処理を再帰的に行う
@@ -157,10 +158,6 @@ namespace toppers
                   }
                   out.push_back( '\n' );
                   iter = info.stop.get_row();
-                  if ( iter != last )
-                  {
-//                    out.set_line( iter->line.file, iter->line.line );
-                  }
                   --iter;   // インクリメントされるのでいったん戻す。
                   break;
                 }
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 4ac3c40..4f2f51e
@@ -162,6 +162,7 @@ namespace toppers
           else if ( *symbol.rbegin() == '\?' ) // 省略可能パラメータのスキップ
           {
             skip = true;
+            --iter;
           }
           else
           {
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 9cabd3f..b1031e7
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  *
- *  Copyright (C) 2007-2010 by TAKAGI Nobuhisa
+ *  Copyright (C) 2007-2011 by TAKAGI Nobuhisa
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
@@ -90,7 +90,8 @@ namespace toppers
         id_string_literal, id_ordered_list, id_ordered_sequence, id_ordered_item,
 
         id_root, id_top,
-        id_function_, id_if_, id_foreach_, id_joineach_, id_error_, id_warning_,
+        id_function_, id_if_, id_foreach_, id_joineach_, id_while_, id_joinwhile_,
+        id_error_, id_warning_,
         id_file_, id_expr_, id_plain,
 
         id_illegal = -1
@@ -199,6 +200,8 @@ namespace toppers
                 if_,
                 foreach_,
                 joineach_,
+                while_,
+                joinwhile_,
                 error_,
                 warning_,
                 file_,
@@ -210,6 +213,8 @@ namespace toppers
                 guard_if_,
                 guard_foreach_,
                 guard_joineach_,
+                guard_while_,
+                guard_joinwhile_,
                 guard_expr,
                 guard_postfix_expr,
                 guard_lvalue_expr,
@@ -280,7 +285,7 @@ namespace toppers
               error_handler()
             ];
           identifier =
-              leaf_node_d[ lexeme_d[ ( alpha_p | '_' ) >> *( alnum_p | '_' | '.' ) ] ];
+              leaf_node_d[ lexeme_d[ ( alpha_p | '_' ) >> *( alnum_p | '_' | '.' ) ] ] - "ELIF";
           constant =
               leaf_node_d
               [
@@ -317,7 +322,7 @@ namespace toppers
           root =
               top >> lexeme_d[ !space_p ];
           top =
-              *( function_ | if_ | foreach_ | joineach_ | warning_ | error_ | file_ | expr_ | plain );
+              *( function_ | if_ | foreach_ | joineach_ | while_ | joinwhile_ | warning_ | error_ | file_ | expr_ | plain );
           function_ =
             guard_function_
             (
@@ -329,7 +334,12 @@ namespace toppers
           if_ =
             guard_if_
             (
-                ( "$IF" >> expression >> expect_doller( ch_p( '$' ) ) >> top >> "$ELSE$" >> top >> expect_end( str_p( "$END$" ) ) )
+                ( "$IF" >> expression >> expect_doller( ch_p( '$' ) ) >> top
+                  >> +( "$ELIF" >> expression >> expect_doller( ch_p( '$' ) ) >> top )
+                  >> ( "$ELSE$" >> top ) >> expect_end( str_p( "$END$" ) ) )
+              | ( "$IF" >> expression >> expect_doller( ch_p( '$' ) ) >> top
+                  >> +( "$ELIF" >> expression >> expect_doller( ch_p( '$' ) ) >> top ) >> expect_end( str_p( "$END$" ) ) )
+              | ( "$IF" >> expression >> expect_doller( ch_p( '$' ) ) >> top >> "$ELSE$" >> top >> expect_end( str_p( "$END$" ) ) )
               | ( "$IF" >> expression >> expect_doller( ch_p( '$' ) ) >> top >> expect_end( str_p( "$END$" ) ) )
             )
             [
@@ -351,6 +361,22 @@ namespace toppers
             [
               error_handler()
             ];
+          while_ =
+            guard_while_
+            (
+              "$WHILE" >> expression >> expect_doller( ch_p( '$' ) ) >> top >> expect_end( str_p( "$END$" ) )
+            )
+            [
+              error_handler()
+            ];
+          joinwhile_ =
+            guard_joinwhile_
+            (
+              "$JOINWHILE" >> expression >> expression >> expect_doller( ch_p( '$' ) ) >> top >> expect_end( str_p( "$END$" ) )
+            )
+            [
+              error_handler()
+            ];
           warning_ =
               "$WARNING$" >> top >> "$END$" >> !eol_p
             | "$WARNING" >> expression >> '$' >> top >> "$END$";
@@ -402,6 +428,8 @@ namespace toppers
           if_.set_id( id_if_ );
           foreach_.set_id( id_foreach_ );
           joineach_.set_id( id_joineach_ );
+          while_.set_id( id_while_ );
+          joinwhile_.set_id( id_joinwhile_ );
           error_.set_id( id_error_ );
           warning_.set_id( id_warning_ );
           file_.set_id( id_file_ );
@@ -1069,6 +1097,7 @@ namespace toppers
               }
 
               result = p_ctx->var_map[ "RESULT" ];
+              p_ctx->var_map[ "RESULT" ] = var_t(); // 変数$RESULT$をクリア
             }
             p_ctx->stack.push( result );
           }
@@ -1335,9 +1364,10 @@ namespace toppers
         fatal( node.value.begin().line(), "no body of %1%", "'IF' or 'ELSE'" );
       }
 
-      //   0          1 2   3      4   5     6
+      //   0          1 2   3      4   5     6 4+4*i    4+4*i+1 4+4*i+2 4+4*i+3        n-3 n-2   n-1
       // $IF expression $ top  $END$
       // $IF expression $ top $ELSE$ top $END$
+      // $IF expression $ top ...              $ELIF expression       $     top ... $ELSE$ top $END$
       if ( eval_node( node.children[ 1 ], p_ctx ) )   // expression
       {
         var_t expr( p_ctx->stack.top() ); p_ctx->stack.pop();
@@ -1351,14 +1381,51 @@ namespace toppers
           error( node.children[ 0 ].value.begin().line(), _( "`%1%\' does not have a value" ), get_s( expr, p_ctx ) );
           throw;
         }
+
+        std::size_t n = node.children.size();
+        
         if ( cond )           // $IF expr$
         {
           result &= eval_node( node.children[ 3 ], p_ctx );   // top
         }
-        else if ( node.children.size() == 7 ) // $ELSE$
+        else if ( n == 7 ) // $ELSE$
         {
           result &= eval_node( node.children[ 5 ], p_ctx );   // top
         }
+        else if ( n > 5 )  // $ELIF...
+        {
+          for ( std::size_t i = 0; 4 + 4 * i < n - 1; i++ )
+          {
+            std::string token( node.children[ 4 + 4 * i ].value.begin(), node.children[ 4 + 4 * i ].value.end() );
+            if ( token == "$ELIF" )  // $ELIF
+            {
+              if ( eval_node( node.children[ 4 + 4 * i + 1 ], p_ctx ) )   // expression
+              {
+                var_t expr( p_ctx->stack.top() ); p_ctx->stack.pop();
+                cond = false;
+                try
+                {
+                  cond = !!get_i( expr, p_ctx );
+                }
+                catch ( expr_error& )
+                {
+                  error( node.children[ 0 ].value.begin().line(), _( "`%1%\' does not have a value" ), get_s( expr, p_ctx ) );
+                  throw;
+                }
+                if ( cond )           // $ELIF expr$
+                {
+                  result &= eval_node( node.children[ 4 + 4 * i + 3 ], p_ctx );   // top
+                  break;
+                }
+              }
+            }
+            else  // ELSE
+            {
+              result &= eval_node( node.children[ 4 + 4 * i + 1 ], p_ctx );   // top
+              break;
+            }
+          }
+        }
       }
       return result;
     }
@@ -1433,6 +1500,85 @@ namespace toppers
       return result;
     }
 
+    //! WHILE命令
+    bool while_( tree_node_t const& node, context* p_ctx )
+    {
+      bool result = true;
+
+      if ( node.children.empty() )
+      {
+        fatal( node.value.begin().line(), "no body of %1%", "'WHILE'" );
+      }
+
+      //      0          1 2   3     4
+      // $WHILE expression $ top $END$
+      for (;;)
+      {
+        if ( eval_node( node.children[1], p_ctx ) )   // expression
+        {
+          var_t expr( p_ctx->stack.top() ); p_ctx->stack.pop();
+          bool cond = false;
+          try
+          {
+            cond = !!get_i( expr, p_ctx );
+          }
+          catch ( expr_error& )
+          {
+            error( node.children[ 0 ].value.begin().line(), _( "`%1%\' does not have a value" ), get_s( expr, p_ctx ) );
+            throw;
+          }
+          if ( !cond )
+          {
+            break;
+          }
+          result &= eval_node( node.children[ 3 ], p_ctx ); // top
+        }
+      }
+      return result;
+    }
+
+    //! $JOINWHILE命令
+    bool joinwhile_( tree_node_t const& node, context* p_ctx )
+    {
+      bool result = true;
+
+      if ( node.children.empty() )
+      {
+        fatal( node.value.begin().line(), "no body of %1%", "'JOINWHILE'" );
+      }
+
+      //          0          1         2 3   4     5
+      // $JOINWHILE expression delimitor $ top $END$
+      for ( bool first = true; ; first = false )
+      {
+        if ( eval_node( node.children[1], p_ctx ) )   // expression
+        {
+          var_t expr( p_ctx->stack.top() ); p_ctx->stack.pop();
+          bool cond = false;
+          try
+          {
+            cond = !!get_i( expr, p_ctx );
+          }
+          catch ( expr_error& )
+          {
+            error( node.children[ 0 ].value.begin().line(), _( "`%1%\' does not have a value" ), get_s( expr, p_ctx ) );
+            throw;
+          }
+          if ( !cond )
+          {
+            break;
+          }
+          if ( !first && eval_node( node.children[ 2 ], p_ctx ) ) // delimitor
+          {
+            var_t delimitor( p_ctx->stack.top() ); p_ctx->stack.pop();
+            p_ctx->target_file << get_s( delimitor, p_ctx );
+          }
+        }
+        result &= eval_node( node.children[ 4 ], p_ctx ); // top
+      }
+      return result;
+    }
+
     //! $ERROR命令
     bool error_( tree_node_t const& node, context* p_ctx )
     { 
@@ -1526,7 +1672,12 @@ namespace toppers
     {
       std::string buf;
       buf.reserve( node.children[ 0 ].value.end() - node.children[ 0 ].value.begin() );
-      for ( text::const_iterator iter( node.children[ 0 ].value.begin() ), last( node.children[0].value.end() ); iter != last; ++iter )
+         std::size_t offset = 0;
+
+         if ( std::isspace( static_cast< unsigned char >( *node.children[ 0 ].value.begin() ) ) )      // plainの先頭が空白類文字の場合、なぜか二重になる不具合の暫定対策
+               offset = 1;
+
+         for ( text::const_iterator iter( node.children[ 0 ].value.begin() + offset ), last( node.children[0].value.end() ); iter != last; ++iter )
       {
         if ( *iter == '$' )
         {
@@ -1561,6 +1712,12 @@ namespace toppers
                         % node.children[ 0 ].value.begin().line().line
                         % std::string( node.children[ 0 ].value.begin(), node.children[ 0 ].value.end() )
                         ).str().c_str() );
+#elif 0
+      std::cerr << boost::format( "%s:%d:%s" )
+                        % node.children[ 0 ].value.begin().line().file
+                        % node.children[ 0 ].value.begin().line().line
+                        % std::string( node.children[ 0 ].value.begin(), node.children[ 0 ].value.end() )
+                        << std::endl;
 #endif
 
       switch ( parser::rule_id_t id = static_cast< parser::rule_id_t >( node.value.id().to_long() ) )
@@ -1649,6 +1806,12 @@ namespace toppers
       case parser::id_joineach_:
         result = joineach_( node, p_ctx );
         break;
+      case parser::id_while_:
+        result = while_( node, p_ctx );
+        break;
+      case parser::id_joinwhile_:
+        result = joinwhile_( node, p_ctx );
+        break;
       case parser::id_error_:
         result = error_( node, p_ctx );
         break;
@@ -1756,6 +1919,10 @@ namespace toppers
         fatal( _( "macro processing error" ) );
       }
     }
+    catch ( die_terminate& )
+    {
+      // $DIE()$関数が呼ばれた
+    }
     catch ( expr_error& )
     {
       fatal( _( "macro processing error" ) );
@@ -1809,11 +1976,18 @@ namespace toppers
     for ( text::const_iterator iter; ( iter = std::find( first, last, '\n' ) ) != last ; first = iter + 1 )
     {
       std::string buf( first, iter );
-      if ( ( ( buf[0] == '$' ) && ( buf.size() >= 2 ) && std::isspace( static_cast< unsigned char >( buf[1] ) ) ) )
+      std::string::size_type found_pos;
+
+      if ( ( ( buf.size() >= 2 ) && ( buf[0] == '$' ) && std::isspace( static_cast< unsigned char >( buf[1] ) ) )
+        || ( buf.size() == 1 && buf[0] == '$' ) )      // 行頭に限り、'$'単独でもコメントとみなす
       {
         *result = '\n'; 
       }
-      else
+      else if ( ( found_pos = buf.find( std::string( "$#" ) ) ) != std::string::npos )  // 行の途中に"$#"があれば、それ以降をコメントとみなす
+      {
+        result = std::copy( buf.begin(), buf.begin() + found_pos, result );
+      }
+         else
       {
         // コメント行以外は行頭の空白類を除去する。
         first = std::find_if( first, iter, std::not1( std::ptr_fun< char, bool >( &toppers::isspace ) ) );
@@ -1948,7 +2122,9 @@ std::string debug_str;
       return var_t();
     }
 
-    return p_ctx->var_map[ "RESULT" ];
+    var_t result = p_ctx->var_map[ "RESULT" ];
+    p_ctx->var_map[ "RESULT" ] = var_t(); // 変数$RESULT$をクリア
+    return result;
   }
 
 }
old mode 100755 (executable)
new mode 100644 (file)
index a544a1c..1589c7c
@@ -103,6 +103,8 @@ namespace toppers
       context() : in_function( false ) {}
     };
 
+    struct die_terminate {};
+
     macro_processor();
     macro_processor( macro_processor const& other );
     explicit macro_processor( text const& in );
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index c7ef346..72d0214
 #include "toppers/codeset.hpp"
 #include <boost/scoped_array.hpp>
 
+#if defined(_MSC_VER) || defined(__MINGW32__)
+#include <mbstring.h>
+#endif
+
 // workaround
 #include <ctype.h>
 #include <wctype.h>
@@ -280,6 +284,25 @@ namespace toppers
     return str.substr( first );
   }
 
+  inline std::string dir_delimiter_to_slash( std::string const& str )
+  {
+#if defined(_MSC_VER) || defined(__MINGW32__)
+    std::string result;
+    result.reserve( str.size() );
+
+    unsigned char const* s1 = reinterpret_cast< unsigned char const* >( str.c_str() );
+    while ( unsigned char const* s2 = _mbschr( s1, '\\' ) )
+    {
+      result.append( s1, s2 );
+      result.push_back( '/' );
+      s1 = s2 + 1;
+    }
+    return result + reinterpret_cast< char const* >( s1 );
+#else
+    return str;
+#endif
+  }
+
 }
 
 #endif  // ! TOPPERS_MISC_HPP_
old mode 100755 (executable)
new mode 100644 (file)
index 8171d79..0c5e0c7
@@ -61,7 +61,7 @@ namespace toppers
       unsigned long address = 0;
       char type;
       std::string symbol;
-      if ( !std::isspace( static_cast< unsigned char >( buf[0] ) ) )
+      if ( !buf.empty() && !std::isspace( static_cast< unsigned char >( buf[0] ) ) )
       {
         isstr >> std::hex >> address;
       }
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index ffda6c8..1414f6d
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  *
- *  Copyright (C) 2007-2008 by TAKAGI Nobuhisa
+ *  Copyright (C) 2007-2011 by TAKAGI Nobuhisa
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
@@ -118,13 +118,16 @@ namespace toppers
       {
         if ( iter->first != "" )
         {
-          fs::path filename( iter->first, fs::native );
-          fs::path backup( iter->first + ".org", fs::native );
+//          fs::path filename( iter->first, fs::native );
+          fs::path filename( iter->first );  // filesystem3対応
+//          fs::path backup( iter->first + ".org", fs::native );
+          fs::path backup( iter->first + ".org" );  // filesystem3対応
           bool existed = fs::exists( filename );
 
           try
           {
-            std::string file( filename.native_file_string() );
+//            std::string file( filename.native_file_string() );
+            std::string file( filename.string() );  // filesystem3対応
             if ( existed )
             {
               fs::rename( filename, backup );
@@ -152,9 +155,11 @@ namespace toppers
             iter != last;
             ++iter )
       {
-        fs::path filename( *iter, fs::native );
+//        fs::path filename( *iter, fs::native );
+        fs::path filename( *iter );  // filesystem3対応
         fs::remove( filename );
-        fs::path backup( *iter + ".org", fs::native );
+//        fs::path backup( *iter + ".org", fs::native );
+        fs::path backup( *iter + ".org" );  // filesystem3対応
         if ( fs::exists( backup ) )
         {
           fs::rename( backup, filename );
@@ -187,8 +192,10 @@ namespace toppers
     {
       return filename;
     }
-    fs::path dir( get_global< std::string >( "output-directory" ), fs::native  );
-    return ( dir/filename ).native_file_string();
+//    fs::path dir( get_global< std::string >( "output-directory" ), fs::native  );
+    fs::path dir( get_global< std::string >( "output-directory" )  );  // filesystem3対応
+//    return ( dir/filename ).native_file_string();
+    return ( dir/filename ).string();  // filesystem3対応
   }
 
   /*!
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 261e37d..8d1f542
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  *
- *  Copyright (C) 2005-2008 by TAKAGI Nobuhisa
+ *  Copyright (C) 2005-2011 by TAKAGI Nobuhisa
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
@@ -41,6 +41,7 @@
 #include "toppers/s_record.hpp"
 #include <istream>
 #include <algorithm>
+#include <iterator>
 #include <cctype>
 #include <cstring>
 
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index dfd473e..9cdda66 100644 (file)
@@ -76,3 +76,69 @@ pri_level/kernel/kernel_unrename.h
 pri_level/kernel/task.c
 pri_level/kernel/task.h
 pri_level/test/test_task1.h
+
+rstr_task/include/kernel.h
+
+rstr_task/kernel/Makefile.kernel
+rstr_task/kernel/allfunc.h
+rstr_task/kernel/check.h
+rstr_task/kernel/kernel.tf
+rstr_task/kernel/kernel_def.csv
+rstr_task/kernel/kernel_rename.def
+rstr_task/kernel/kernel_rename.h
+rstr_task/kernel/kernel_unrename.h
+rstr_task/kernel/sys_manage.c
+rstr_task/kernel/task.c
+rstr_task/kernel/task.h
+rstr_task/kernel/task_manage.c
+rstr_task/kernel/task_sync.c
+
+rstr_task/test/test_rstr1.c
+rstr_task/test/test_rstr1.cfg
+rstr_task/test/test_rstr1.h
+rstr_task/test/test_rstr2.c
+rstr_task/test/test_rstr2.cfg
+rstr_task/test/test_rstr2.h
+
+dcre/include/kernel.h
+
+dcre/kernel/Makefile.kernel
+dcre/kernel/alarm.c
+dcre/kernel/alarm.h
+dcre/kernel/allfunc.h
+dcre/kernel/check.h
+dcre/kernel/cyclic.c
+dcre/kernel/cyclic.h
+dcre/kernel/dataqueue.c
+dcre/kernel/dataqueue.h
+dcre/kernel/eventflag.c
+dcre/kernel/eventflag.h
+dcre/kernel/interrupt.c
+dcre/kernel/interrupt.h
+dcre/kernel/kernel.tf
+dcre/kernel/kernel_api.csv
+dcre/kernel/kernel_check.tf
+dcre/kernel/kernel_def.csv
+dcre/kernel/kernel_impl.h
+dcre/kernel/kernel_rename.def
+dcre/kernel/kernel_rename.h
+dcre/kernel/kernel_unrename.h
+dcre/kernel/mailbox.c
+dcre/kernel/mailbox.h
+dcre/kernel/mempfix.c
+dcre/kernel/mempfix.h
+dcre/kernel/pridataq.c
+dcre/kernel/pridataq.h
+dcre/kernel/semaphore.c
+dcre/kernel/semaphore.h
+dcre/kernel/startup.c
+dcre/kernel/task.c
+dcre/kernel/task.h
+dcre/kernel/task_except.c
+dcre/kernel/task_manage.c
+dcre/kernel/task_refer.c
+dcre/kernel/task_sync.c
+
+dcre/sample/sample1.c
+dcre/sample/sample1.cfg
+dcre/sample/sample1.h
diff --git a/asp/extension/dcre/include/kernel.h b/asp/extension/dcre/include/kernel.h
new file mode 100644 (file)
index 0000000..ca32c97
--- /dev/null
@@ -0,0 +1,610 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2004-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: kernel.h 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ *             TOPPERS/ASPカーネル 標準ヘッダファイル
+ *
+ *  TOPPERS/ASPカーネルがサポートするサービスコールの宣言と,必要なデー
+ *  タ型,定数,マクロの定義を含むヘッダファイル.
+ *
+ *  アセンブリ言語のソースファイルからこのファイルをインクルードする時
+ *  は,TOPPERS_MACRO_ONLYを定義しておく.これにより,マクロ定義以外を
+ *  除くようになっている.
+ *
+ *  このファイルをインクルードする前にインクルードしておくべきファイル
+ *  はない.
+ */
+
+#ifndef TOPPERS_KERNEL_H
+#define TOPPERS_KERNEL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ *     TOPPERS共通のデータ型・定数・マクロ
+ */
+#include <t_stddef.h>
+
+/*
+ *  ターゲット依存部
+ */
+#include "target_kernel.h"
+
+#ifndef TOPPERS_MACRO_ONLY
+
+/*
+ *  データ型の定義
+ */
+
+/*
+ *  ビットパターンやオブジェクト番号の型定義
+ */
+typedef        uint_t          TEXPTN;         /* タスク例外要因のビットパターン */
+typedef        uint_t          FLGPTN;         /* イベントフラグのビットパターン */
+typedef        uint_t          INTNO;          /* 割込み番号 */
+typedef        uint_t          INHNO;          /* 割込みハンドラ番号 */
+typedef        uint_t          EXCNO;          /* CPU例外ハンドラ番号 */
+
+/*
+ *  処理単位の型定義
+ */
+typedef void   (*TASK)(intptr_t exinf);
+typedef void   (*TEXRTN)(TEXPTN texptn, intptr_t exinf);
+typedef void   (*CYCHDR)(intptr_t exinf);
+typedef void   (*ALMHDR)(intptr_t exinf);
+typedef void   (*ISR)(intptr_t exinf);
+typedef void   (*INTHDR)(void);
+typedef void   (*EXCHDR)(void *p_excinf);
+typedef void   (*INIRTN)(intptr_t exinf);
+typedef void   (*TERRTN)(intptr_t exinf);
+
+/*
+ *  メモリ領域確保のための型定義
+ */
+#ifndef TOPPERS_STK_T
+#define TOPPERS_STK_T  intptr_t
+#endif /* TOPPERS_STK_T */
+typedef        TOPPERS_STK_T   STK_T;  /* スタック領域を確保するための型 */
+
+#ifndef TOPPERS_MPF_T
+#define TOPPERS_MPF_T  intptr_t
+#endif /* TOPPERS_MPF_T */
+typedef        TOPPERS_MPF_T   MPF_T;  /* 固定長メモリプール領域を確保するための型 */
+
+/*
+ *  メッセージヘッダの型定義
+ */
+typedef        struct t_msg {                  /* メールボックスのメッセージヘッダ */
+       struct t_msg    *pk_next;
+} T_MSG;
+
+typedef        struct t_msg_pri {              /* 優先度付きメッセージヘッダ */
+       T_MSG   msgque;                         /* メッセージヘッダ */
+       PRI             msgpri;                         /* メッセージ優先度 */
+} T_MSG_PRI;
+
+/*
+ *  パケット形式の定義
+ */
+typedef struct t_ctsk {
+       ATR                     tskatr;         /* タスク属性 */
+       intptr_t        exinf;          /* タスクの拡張情報 */
+       TASK            task;           /* タスクのメインルーチンの先頭番地 */
+       PRI                     itskpri;        /* タスクの起動時優先度 */
+       SIZE            stksz;          /* タスクのスタック領域のサイズ */
+       STK_T           *stk;           /* タスクのスタック領域の先頭番地 */
+} T_CTSK;
+
+typedef struct t_rtsk {
+       STAT    tskstat;        /* タスク状態 */
+       PRI             tskpri;         /* タスクの現在優先度 */
+       PRI             tskbpri;        /* タスクのベース優先度 */
+       STAT    tskwait;        /* 待ち要因 */
+       ID              wobjid;         /* 待ち対象のオブジェクトのID */
+       TMO             lefttmo;        /* タイムアウトするまでの時間 */
+       uint_t  actcnt;         /* 起動要求キューイング数 */
+       uint_t  wupcnt;         /* 起床要求キューイング数 */
+} T_RTSK;
+
+typedef struct t_dtex {
+       ATR             texatr;         /* タスク例外処理ルーチン属性 */
+       TEXRTN  texrtn;         /* タスク例外処理ルーチンの先頭番地 */
+} T_DTEX;
+
+typedef struct t_rtex {
+       STAT    texstat;        /* タスク例外処理の状態 */
+       TEXPTN  pndptn;         /* 保留例外要因 */
+} T_RTEX;
+
+typedef struct t_csem {
+       ATR             sematr;         /* セマフォ属性 */
+       uint_t  isemcnt;        /* セマフォの初期資源数 */
+       uint_t  maxsem;         /* セマフォの最大資源数 */
+} T_CSEM;
+
+typedef struct t_rsem {
+       ID              wtskid;         /* セマフォの待ち行列の先頭のタスクのID番号 */
+       uint_t  semcnt;         /* セマフォの現在の資源数 */
+} T_RSEM;
+
+typedef struct t_cflg {
+       ATR             flgatr;         /* イベントフラグ属性 */
+       FLGPTN  iflgptn;        /* イベントフラグの初期ビットパターン */
+} T_CFLG;
+
+typedef struct t_rflg {
+       ID              wtskid;         /* イベントフラグの待ち行列の先頭のタスクのID番号 */
+       FLGPTN  flgptn;         /* イベントフラグの現在のビットパターン */
+} T_RFLG;
+
+typedef struct t_cdtq {
+       ATR             dtqatr;         /* データキュー属性 */
+       uint_t  dtqcnt;         /* データキュー管理領域に格納できるデータ数 */
+       void    *dtqmb;         /* データキュー管理領域の先頭番地 */
+} T_CDTQ;
+
+typedef struct t_rdtq {
+       ID              stskid;         /* データキューの送信待ち行列の先頭のタスクのID番号 */
+       ID              rtskid;         /* データキューの受信待ち行列の先頭のタスクのID番号 */
+       uint_t  sdtqcnt;        /* データキュー管理領域に格納されているデータの数 */
+} T_RDTQ;
+
+typedef struct t_cpdq {
+       ATR             pdqatr;         /* 優先度データキュー属性 */
+       uint_t  pdqcnt;         /* 優先度データキュー管理領域に格納できるデータ数 */
+       PRI             maxdpri;        /* 優先度データキューに送信できるデータ優先度の最
+                                                  大値 */
+       void    *pdqmb;         /* 優先度データキュー管理領域の先頭番地 */
+} T_CPDQ;
+
+typedef struct t_rpdq {
+       ID              stskid;         /* 優先度データキューの送信待ち行列の先頭のタスク
+                                                  のID番号 */
+       ID              rtskid;         /* 優先度データキューの受信待ち行列の先頭のタスク
+                                                  のID番号 */
+       uint_t  spdqcnt;        /* 優先度データキュー管理領域に格納されているデー
+                                                  タの数 */
+} T_RPDQ;
+
+typedef struct t_cmbx {
+       ATR             mbxatr;         /* メールボックス属性 */
+       PRI             maxmpri;        /* 優先度メールボックスに送信できるメッセージ優先
+                                                  度の最大値 */
+       void    *mprihd;        /* 優先度別のメッセージキューヘッダ領域の先頭番地 */
+} T_CMBX;
+
+typedef struct t_rmbx {
+       ID              wtskid;         /* メールボックスの待ち行列の先頭のタスクのID番号 */
+       T_MSG   *pk_msg;        /* メッセージキューの先頭につながれたメッセージ
+                                                  の先頭番地 */
+} T_RMBX;
+
+typedef struct t_cmpf {
+       ATR             mpfatr;         /* 固定長メモリプール属性 */
+       uint_t  blkcnt;         /* 獲得できる固定長メモリブロックの数 */
+       uint_t  blksz;          /* 固定長メモリブロックのサイズ */
+       MPF_T   *mpf;           /* 固定長メモリプール領域の先頭番地 */
+       void    *mpfmb;         /* 固定長メモリプール管理領域の先頭番地 */
+} T_CMPF;
+
+typedef struct t_rmpf {
+       ID              wtskid;         /* 固定長メモリプールの待ち行列の先頭のタスクの
+                                                  ID番号 */
+       uint_t  fblkcnt;        /* 固定長メモリプール領域の空きメモリ領域に割り
+                                                  付けることができる固定長メモリブロックの数 */
+} T_RMPF;
+
+typedef struct t_ccyc {
+       ATR                     cycatr;         /* 周期ハンドラ属性 */
+       intptr_t        exinf;          /* 周期ハンドラの拡張情報 */
+       CYCHDR          cychdr;         /* 周期ハンドラの先頭番地 */
+       RELTIM          cyctim;         /* 周期ハンドラの起動周期 */
+       RELTIM          cycphs;         /* 周期ハンドラの起動位相 */
+} T_CCYC;
+
+typedef struct t_rcyc {
+       STAT    cycstat;        /* 周期ハンドラの動作状態 */
+       RELTIM  lefttim;        /* 次に周期ハンドラを起動する時刻までの相対時間 */
+} T_RCYC;
+
+typedef struct t_calm {
+       ATR                     almatr;         /* アラームハンドラ属性 */
+       intptr_t        exinf;          /* アラームハンドラの拡張情報 */
+       ALMHDR          almhdr;         /* アラームハンドラの先頭番地 */
+} T_CALM;
+
+typedef struct t_ralm {
+       STAT    almstat;        /* アラームハンドラの動作状態 */
+       RELTIM  lefttim;        /* アラームハンドラを起動する時刻までの相対時間 */
+} T_RALM;
+
+typedef struct t_cisr {
+       ATR                     isratr;         /* 割込みサービスルーチン属性 */
+       intptr_t        exinf;          /* 割込みサービスルーチンの拡張情報 */
+       INTNO           intno;          /* 割込みサービスルーチンを登録する割込み番号 */
+       ISR                     isr;            /* 割込みサービスルーチンの先頭番地 */
+       PRI                     isrpri;         /* 割込みサービスルーチン優先度 */
+} T_CISR;
+
+/*
+ *  サービスコールの宣言
+ */
+
+/*
+ *  タスク管理機能
+ */
+extern ER_UINT acre_tsk(const T_CTSK *pk_ctsk) throw();
+extern ER              del_tsk(ID tskid) throw();
+extern ER              act_tsk(ID tskid) throw();
+extern ER              iact_tsk(ID tskid) throw();
+extern ER_UINT can_act(ID tskid) throw();
+extern ER              ext_tsk(void) throw();
+extern ER              ter_tsk(ID tskid) throw();
+extern ER              chg_pri(ID tskid, PRI tskpri) throw();
+extern ER              get_pri(ID tskid, PRI *p_tskpri) throw();
+extern ER              get_inf(intptr_t *p_exinf) throw();
+extern ER              ref_tsk(ID tskid, T_RTSK *pk_rtsk) throw();
+
+/*
+ *  タスク付属同期機能
+ */
+extern ER              slp_tsk(void) throw();
+extern ER              tslp_tsk(TMO tmout) throw();
+extern ER              wup_tsk(ID tskid) throw();
+extern ER              iwup_tsk(ID tskid) throw();
+extern ER_UINT can_wup(ID tskid) throw();
+extern ER              rel_wai(ID tskid) throw();
+extern ER              irel_wai(ID tskid) throw();
+extern ER              sus_tsk(ID tskid) throw();
+extern ER              rsm_tsk(ID tskid) throw();
+extern ER              dly_tsk(RELTIM dlytim) throw();
+
+/*
+ *  タスク例外処理機能
+ */
+extern ER              def_tex(ID tskid, const T_DTEX *pk_dtex) throw();
+extern ER              ras_tex(ID tskid, TEXPTN rasptn) throw();
+extern ER              iras_tex(ID tskid, TEXPTN rasptn) throw();
+extern ER              dis_tex(void) throw();
+extern ER              ena_tex(void) throw();
+extern bool_t  sns_tex(void) throw();
+extern ER              ref_tex(ID tskid, T_RTEX *pk_rtex) throw();
+
+/*
+ *  同期・通信機能
+ */
+extern ER_ID   acre_sem(const T_CSEM *pk_csem) throw();
+extern ER              del_sem(ID semid) throw();
+extern ER              sig_sem(ID semid) throw();
+extern ER              isig_sem(ID semid) throw();
+extern ER              wai_sem(ID semid) throw();
+extern ER              pol_sem(ID semid) throw();
+extern ER              twai_sem(ID semid, TMO tmout) throw();
+extern ER              ini_sem(ID semid) throw();
+extern ER              ref_sem(ID semid, T_RSEM *pk_rsem) throw();
+
+extern ER_ID   acre_flg(const T_CFLG *pk_cflg) throw();
+extern ER              del_flg(ID flgid) throw();
+extern ER              set_flg(ID flgid, FLGPTN setptn) throw();
+extern ER              iset_flg(ID flgid, FLGPTN setptn) throw();
+extern ER              clr_flg(ID flgid, FLGPTN clrptn) throw();
+extern ER              wai_flg(ID flgid, FLGPTN waiptn,
+                                               MODE wfmode, FLGPTN *p_flgptn) throw();
+extern ER              pol_flg(ID flgid, FLGPTN waiptn,
+                                               MODE wfmode, FLGPTN *p_flgptn) throw();
+extern ER              twai_flg(ID flgid, FLGPTN waiptn,
+                                               MODE wfmode, FLGPTN *p_flgptn, TMO tmout) throw();
+extern ER              ini_flg(ID flgid) throw();
+extern ER              ref_flg(ID flgid, T_RFLG *pk_rflg) throw();
+
+extern ER_ID   acre_dtq(const T_CDTQ *pk_cdtq) throw();
+extern ER              del_dtq(ID dtqid) throw();
+extern ER              snd_dtq(ID dtqid, intptr_t data) throw();
+extern ER              psnd_dtq(ID dtqid, intptr_t data) throw();
+extern ER              ipsnd_dtq(ID dtqid, intptr_t data) throw();
+extern ER              tsnd_dtq(ID dtqid, intptr_t data, TMO tmout) throw();
+extern ER              fsnd_dtq(ID dtqid, intptr_t data) throw();
+extern ER              ifsnd_dtq(ID dtqid, intptr_t data) throw();
+extern ER              rcv_dtq(ID dtqid, intptr_t *p_data) throw();
+extern ER              prcv_dtq(ID dtqid, intptr_t *p_data) throw();
+extern ER              trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout) throw();
+extern ER              ini_dtq(ID dtqid) throw();
+extern ER              ref_dtq(ID dtqid, T_RDTQ *pk_rdtq) throw();
+
+extern ER_ID   acre_pdq(const T_CPDQ *pk_cpdq) throw();
+extern ER              del_pdq(ID pdqid) throw();
+extern ER              snd_pdq(ID pdqid, intptr_t data, PRI datapri) throw();
+extern ER              psnd_pdq(ID pdqid, intptr_t data, PRI datapri) throw();
+extern ER              ipsnd_pdq(ID pdqid, intptr_t data, PRI datapri) throw();
+extern ER              tsnd_pdq(ID pdqid, intptr_t data,
+                                                                               PRI datapri, TMO tmout) throw();
+extern ER              rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri) throw();
+extern ER              prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri) throw();
+extern ER              trcv_pdq(ID pdqid, intptr_t *p_data,
+                                                                               PRI *p_datapri, TMO tmout) throw();
+extern ER              ini_pdq(ID pdqid) throw();
+extern ER              ref_pdq(ID pdqid, T_RPDQ *pk_rpdq) throw();
+
+extern ER_ID   acre_mbx(const T_CMBX *pk_cmbx) throw();
+extern ER              del_mbx(ID mbxid) throw();
+extern ER              snd_mbx(ID mbxid, T_MSG *pk_msg) throw();
+extern ER              rcv_mbx(ID mbxid, T_MSG **ppk_msg) throw();
+extern ER              prcv_mbx(ID mbxid, T_MSG **ppk_msg) throw();
+extern ER              trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout) throw();
+extern ER              ini_mbx(ID mbxid) throw();
+extern ER              ref_mbx(ID mbxid, T_RMBX *pk_rmbx) throw();
+
+/*
+ *  メモリプール管理機能
+ */
+extern ER_ID   acre_mpf(const T_CMPF *pk_cmpf) throw();
+extern ER              del_mpf(ID mpfid) throw();
+extern ER              get_mpf(ID mpfid, void **p_blk) throw();
+extern ER              pget_mpf(ID mpfid, void **p_blk) throw();
+extern ER              tget_mpf(ID mpfid, void **p_blk, TMO tmout) throw();
+extern ER              rel_mpf(ID mpfid, void *blk) throw();
+extern ER              ini_mpf(ID mpfid) throw();
+extern ER              ref_mpf(ID mpfid, T_RMPF *pk_rmpf) throw();
+
+/*
+ *  時間管理機能
+ */
+extern ER              get_tim(SYSTIM *p_systim) throw();
+extern ER              get_utm(SYSUTM *p_sysutm) throw();
+
+extern ER_ID   acre_cyc(const T_CCYC *pk_ccyc) throw();
+extern ER              del_cyc(ID cycid) throw();
+extern ER              sta_cyc(ID cycid) throw();
+extern ER              stp_cyc(ID cycid) throw();
+extern ER              ref_cyc(ID cycid, T_RCYC *pk_rcyc) throw();
+
+extern ER_ID   acre_alm(const T_CALM *pk_calm) throw();
+extern ER              del_alm(ID almid) throw();
+extern ER              sta_alm(ID almid, RELTIM almtim) throw();
+extern ER              ista_alm(ID almid, RELTIM almtim) throw();
+extern ER              stp_alm(ID almid) throw();
+extern ER              istp_alm(ID almid) throw();
+extern ER              ref_alm(ID almid, T_RALM *pk_ralm) throw();
+
+/*
+ *  システム状態管理機能
+ */
+extern ER              rot_rdq(PRI tskpri) throw();
+extern ER              irot_rdq(PRI tskpri) throw();
+extern ER              get_tid(ID *p_tskid) throw();
+extern ER              iget_tid(ID *p_tskid) throw();
+extern ER              loc_cpu(void) throw();
+extern ER              iloc_cpu(void) throw();
+extern ER              unl_cpu(void) throw();
+extern ER              iunl_cpu(void) throw();
+extern ER              dis_dsp(void) throw();
+extern ER              ena_dsp(void) throw();
+extern bool_t  sns_ctx(void) throw();
+extern bool_t  sns_loc(void) throw();
+extern bool_t  sns_dsp(void) throw();
+extern bool_t  sns_dpn(void) throw();
+extern bool_t  sns_ker(void) throw();
+extern ER              ext_ker(void) throw();
+
+/*
+ *  割込み管理機能
+ */
+extern ER_ID   acre_isr(const T_CISR *pk_cisr) throw();
+extern ER              del_isr(ID isrid) throw();
+extern ER              dis_int(INTNO intno) throw();
+extern ER              ena_int(INTNO intno) throw();
+extern ER              chg_ipm(PRI intpri) throw();
+extern ER              get_ipm(PRI *p_intpri) throw();
+
+/*
+ *  CPU例外管理機能
+ */
+extern bool_t  xsns_dpn(void *p_excinf) throw();
+extern bool_t  xsns_xpn(void *p_excinf) throw();
+
+#endif /* TOPPERS_MACRO_ONLY */
+
+/*
+ *  オブジェクト属性の定義
+ */
+#define TA_ACT                 UINT_C(0x02)    /* タスクを起動された状態で生成 */
+
+#define TA_TPRI                        UINT_C(0x01)    /* タスクの待ち行列を優先度順に */
+#define TA_MPRI                        UINT_C(0x02)    /* メッセージキューを優先度順に */
+
+#define TA_WMUL                        UINT_C(0x02)    /* 複数の待ちタスク */
+#define TA_CLR                 UINT_C(0x04)    /* イベントフラグのクリア指定 */
+
+#define TA_STA                 UINT_C(0x02)    /* 周期ハンドラを動作状態で生成 */
+
+#define TA_NONKERNEL   UINT_C(0x02)    /* カーネル管理外の割込み */
+
+#define TA_ENAINT              UINT_C(0x01)    /* 割込み要求禁止フラグをクリア */
+#define TA_EDGE                        UINT_C(0x02)    /* エッジトリガ */
+
+/*
+ *  サービスコールの動作モードの定義
+ */
+#define TWF_ORW                        UINT_C(0x01)    /* イベントフラグのOR待ち */
+#define TWF_ANDW               UINT_C(0x02)    /* イベントフラグのAND待ち */
+
+/*
+ *  オブジェクトの状態の定義
+ */
+#define TTS_RUN                        UINT_C(0x01)    /* 実行状態 */
+#define TTS_RDY                        UINT_C(0x02)    /* 実行可能状態 */
+#define TTS_WAI                        UINT_C(0x04)    /* 待ち状態 */
+#define TTS_SUS                        UINT_C(0x08)    /* 強制待ち状態 */
+#define TTS_WAS                        UINT_C(0x0c)    /* 二重待ち状態 */
+#define TTS_DMT                        UINT_C(0x10)    /* 休止状態 */
+
+#define TTW_SLP                        UINT_C(0x0001)  /* 起床待ち */
+#define TTW_DLY                        UINT_C(0x0002)  /* 時間経過待ち */
+#define TTW_SEM                        UINT_C(0x0004)  /* セマフォの資源獲得待ち */
+#define TTW_FLG                        UINT_C(0x0008)  /* イベントフラグ待ち */
+#define TTW_SDTQ               UINT_C(0x0010)  /* データキューへの送信待ち */
+#define TTW_RDTQ               UINT_C(0x0020)  /* データキューからの受信待ち */
+#define TTW_SPDQ               UINT_C(0x0100)  /* 優先度データキューへの送信待ち */
+#define TTW_RPDQ               UINT_C(0x0200)  /* 優先度データキューからの受信待ち */
+#define TTW_MBX                        UINT_C(0x0040)  /* メールボックスからの受信待ち */
+#define TTW_MPF                        UINT_C(0x2000)  /* 固定長メモリブロックの獲得待ち */
+
+#define TTEX_ENA               UINT_C(0x01)    /* タスク例外処理許可状態 */
+#define TTEX_DIS               UINT_C(0x02)    /* タスク例外処理禁止状態 */
+
+#define TCYC_STP               UINT_C(0x01)    /* 周期ハンドラが動作していない */
+#define TCYC_STA               UINT_C(0x02)    /* 周期ハンドラが動作している */
+
+#define TALM_STP               UINT_C(0x01)    /* アラームハンドラが動作していない */
+#define TALM_STA               UINT_C(0x02)    /* アラームハンドラが動作している */
+
+/*
+ *  その他の定数の定義
+ */
+#define TSK_SELF               0                       /* 自タスク指定 */
+#define TSK_NONE               0                       /* 該当するタスクがない */
+
+#define TPRI_SELF              0                       /* 自タスクのベース優先度 */
+#define TPRI_INI               0                       /* タスクの起動時優先度 */
+
+#define TIPM_ENAALL            0                       /* 割込み優先度マスク全解除 */
+
+/*
+ *  構成定数とマクロ
+ */
+
+/*
+ *  サポートする機能
+ */
+#ifdef TOPPERS_TARGET_SUPPORT_DIS_INT
+#define TOPPERS_SUPPORT_DIS_INT                        /* dis_intがサポートされている */
+#endif /* TOPPERS_TARGET_SUPPORT_DIS_INT */
+
+#ifdef TOPPERS_TARGET_SUPPORT_ENA_INT
+#define TOPPERS_SUPPORT_ENA_INT                        /* ena_intがサポートされている */
+#endif /* TOPPERS_TARGET_SUPPORT_ENA_INT */
+
+#ifdef TOPPERS_TARGET_SUPPORT_GET_UTM
+#define TOPPERS_SUPPORT_GET_UTM                        /* get_utmがサポートされている */
+#endif /* TOPPERS_TARGET_SUPPORT_GET_UTM */
+
+#define TOPPERS_SUPPORT_DYNAMIC_CRE            /* 動的生成機能拡張 */
+
+/*
+ *  優先度の範囲
+ */
+#define TMIN_TPRI              1                       /* タスク優先度の最小値(最高値)*/
+#define TMAX_TPRI              16                      /* タスク優先度の最大値(最低値)*/
+#define TMIN_DPRI              1                       /* データ優先度の最小値(最高値)*/
+#define TMAX_DPRI              16                      /* データ優先度の最大値(最低値)*/
+#define TMIN_MPRI              1                       /* メッセージ優先度の最小値(最高値)*/
+#define TMAX_MPRI              16                      /* メッセージ優先度の最大値(最低値)*/
+#define TMIN_ISRPRI            1                       /* 割込みサービスルーチン優先度の最小値 */
+#define TMAX_ISRPRI            16                      /* 割込みサービスルーチン優先度の最大値 */
+
+/*
+ *  バージョン情報
+ */
+#define TKERNEL_MAKER  UINT_C(0x0118)  /* カーネルのメーカーコード */
+#define TKERNEL_PRID   UINT_C(0x0007)  /* カーネルの識別番号 */
+#define TKERNEL_SPVER  UINT_C(0xf513)  /* カーネル仕様のバージョン番号 */
+#define TKERNEL_PRVER  UINT_C(0x1070)  /* カーネルのバージョン番号 */
+
+/*
+ *  キューイング回数の最大値
+ */
+#define TMAX_ACTCNT            UINT_C(1)               /* 起動要求キューイング数の最大値 */
+#define TMAX_WUPCNT            UINT_C(1)               /* 起床要求キューイング数の最大値 */
+
+/*
+ *  ビットパターンのビット数
+ */
+#ifndef TBIT_TEXPTN                                    /* タスク例外要因のビット数 */
+#define TBIT_TEXPTN            (sizeof(TEXPTN) * CHAR_BIT)
+#endif /* TBIT_TEXPTN */
+
+#ifndef TBIT_FLGPTN                                    /* イベントフラグのビット数 */
+#define TBIT_FLGPTN            (sizeof(FLGPTN) * CHAR_BIT)
+#endif /* TBIT_FLGPTN */
+
+/*
+ *  メモリ領域確保のためのマクロ
+ *
+ *  以下のTOPPERS_COUNT_SZとTOPPERS_ROUND_SZの定義は,unitが2の巾乗であ
+ *  ることを仮定している.
+ */
+#ifndef TOPPERS_COUNT_SZ
+#define TOPPERS_COUNT_SZ(sz, unit)     (((sz) + (unit) - 1) / (unit))
+#endif /* TOPPERS_COUNT_SZ */
+#ifndef TOPPERS_ROUND_SZ
+#define TOPPERS_ROUND_SZ(sz, unit)     (((sz) + (unit) - 1) & ~((unit) - 1))
+#endif /* TOPPERS_ROUND_SZ */
+
+#define COUNT_STK_T(sz)                TOPPERS_COUNT_SZ(sz, sizeof(STK_T))
+#define ROUND_STK_T(sz)                TOPPERS_ROUND_SZ(sz, sizeof(STK_T))
+
+#define COUNT_MPF_T(blksz)     TOPPERS_COUNT_SZ(blksz, sizeof(MPF_T))
+#define ROUND_MPF_T(blksz)     TOPPERS_ROUND_SZ(blksz, sizeof(MPF_T))
+
+#define TSZ_DTQMB(dtqcnt)      (sizeof(intptr_t) * (dtqcnt))
+#define TCNT_DTQMB(dtqcnt)     TOPPERS_COUNT_SZ(TSZ_DTQMB(dtqcnt), sizeof(MB_T))
+
+#ifndef TSZ_PDQMB
+#define TSZ_PDQMB(pdqcnt)      (sizeof(intptr_t) * 3 * (pdqcnt))
+#endif /* TSZ_PDQMB */
+#define TCNT_PDQMB(pdqcnt)     TOPPERS_COUNT_SZ(TSZ_PDQMB(pdqcnt), sizeof(MB_T))
+
+#define TSZ_MPFMB(blkcnt)      (sizeof(uint_t) * (blkcnt))
+#define TCNT_MPFMB(blkcnt)     TOPPERS_COUNT_SZ(TSZ_MPFMB(blkcnt), sizeof(MB_T))
+
+/*
+ *  その他の構成定数
+ */
+#define TMAX_MAXSEM            UINT_MAX        /* セマフォの最大資源数の最大値 */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* TOPPERS_KERNEL_H */
diff --git a/asp/extension/dcre/kernel/Makefile.kernel b/asp/extension/dcre/kernel/Makefile.kernel
new file mode 100644 (file)
index 0000000..170a2ca
--- /dev/null
@@ -0,0 +1,140 @@
+#
+#  TOPPERS/ASP Kernel
+#      Toyohashi Open Platform for Embedded Real-Time Systems/
+#      Advanced Standard Profile Kernel
+# 
+#  Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory
+#                              Toyohashi Univ. of Technology, JAPAN
+#  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+#              Graduate School of Information Science, Nagoya Univ., JAPAN
+# 
+#  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+#  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+#  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+#  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+#      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+#      スコード中に含まれていること.
+#  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+#      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+#      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+#      の無保証規定を掲載すること.
+#  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+#      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+#      と.
+#    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+#        作権表示,この利用条件および下記の無保証規定を掲載すること.
+#    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+#        報告すること.
+#  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+#      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+#      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+#      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+#      免責すること.
+# 
+#  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+#  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+#  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+#  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+#  の責任を負わない.
+# 
+#  @(#) $Id: Makefile.kernel 1966 2010-11-20 07:23:56Z ertl-hiro $
+# 
+
+#
+#              カーネルのファイル構成の定義
+#
+
+#
+#  1つのソースファイルから複数のオブジェクトファイルを生成するように作
+#  成されたソースファイルのリスト
+#
+KERNEL_FCSRCS = startup.c task.c wait.c time_event.c \
+                               task_manage.c task_refer.c task_sync.c task_except.c \
+                               semaphore.c eventflag.c dataqueue.c pridataq.c mailbox.c \
+                               mempfix.c time_manage.c cyclic.c alarm.c \
+                               sys_manage.c interrupt.c exception.c
+
+#
+#  各ソースファイルから生成されるオブジェクトファイルのリスト
+#
+startup = sta_ker.o ext_ker.o kermem.o
+
+task = tskini.o tsksched.o tskrun.o tsknrun.o \
+               tskdmt.o tskact.o tskpri.o tskrot.o tsktex.o
+
+wait = waimake.o waicmp.o waitmo.o waitmook.o \
+               wairel.o wobjwai.o wobjwaitmo.o iniwque.o
+
+time_event = tmeini.o tmeup.o tmedown.o tmeins.o tmedel.o tmeltim.o sigtim.o
+
+task_manage = acre_tsk.o del_tsk.o act_tsk.o iact_tsk.o can_act.o \
+               ext_tsk.o ter_tsk.o chg_pri.o get_pri.o get_inf.o
+
+task_refer = ref_tsk.o
+
+task_sync = slp_tsk.o tslp_tsk.o wup_tsk.o iwup_tsk.o can_wup.o \
+               rel_wai.o irel_wai.o sus_tsk.o rsm_tsk.o dly_tsk.o
+
+task_except = def_tex.o ras_tex.o iras_tex.o dis_tex.o ena_tex.o \
+               sns_tex.o ref_tex.o
+
+semaphore = semini.o acre_sem.o del_sem.o sig_sem.o isig_sem.o \
+               wai_sem.o pol_sem.o twai_sem.o ini_sem.o ref_sem.o
+
+eventflag = flgini.o flgcnd.o acre_flg.o del_flg.o set_flg.o iset_flg.o \
+               clr_flg.o wai_flg.o pol_flg.o twai_flg.o ini_flg.o ref_flg.o
+
+dataqueue = dtqini.o dtqenq.o dtqfenq.o dtqdeq.o dtqsnd.o dtqfsnd.o dtqrcv.o \
+               acre_dtq.o del_dtq.o snd_dtq.o psnd_dtq.o ipsnd_dtq.o tsnd_dtq.o \
+               fsnd_dtq.o ifsnd_dtq.o rcv_dtq.o prcv_dtq.o trcv_dtq.o ini_dtq.o \
+               ref_dtq.o
+
+pridataq = pdqini.o pdqenq.o pdqdeq.o pdqsnd.o pdqrcv.o \
+               acre_pdq.o del_pdq.o snd_pdq.o psnd_pdq.o ipsnd_pdq.o tsnd_pdq.o \
+               rcv_pdq.o prcv_pdq.o trcv_pdq.o ini_pdq.o ref_pdq.o
+
+mailbox = mbxini.o acre_mbx.o del_mbx.o snd_mbx.o rcv_mbx.o \
+               prcv_mbx.o trcv_mbx.o ini_mbx.o ref_mbx.o
+
+mempfix = mpfini.o mpfget.o acre_mpf.o del_mpf.o get_mpf.o\
+                pget_mpf.o tget_mpf.o rel_mpf.o ini_mpf.o ref_mpf.o
+
+time_manage = get_tim.o get_utm.o
+
+cyclic = cycini.o acre_cyc.o del_cyc.o sta_cyc.o stp_cyc.o ref_cyc.o cyccal.o
+
+alarm = almini.o acre_alm.o del_alm.o sta_alm.o ista_alm.o stp_alm.o \
+               istp_alm.o ref_alm.o almcal.o
+
+sys_manage = rot_rdq.o irot_rdq.o get_tid.o iget_tid.o \
+               loc_cpu.o iloc_cpu.o unl_cpu.o iunl_cpu.o dis_dsp.o ena_dsp.o \
+               sns_ctx.o sns_loc.o sns_dsp.o sns_dpn.o sns_ker.o
+
+interrupt = isrini.o isrcal.o acre_isr.o del_isr.o \
+               intini.o dis_int.o ena_int.o chg_ipm.o get_ipm.o
+
+exception = excini.o xsns_dpn.o xsns_xpn.o
+
+#
+#  生成されるオブジェクトファイルの依存関係の定義
+#
+$(startup) $(startup:.o=.s) $(startup:.o=.d): startup.c
+$(task) $(task:.o=.s) $(task:.o=.d): task.c
+$(wait) $(wait:.o=.s) $(wait:.o=.d): wait.c
+$(time_event) $(time_event:.o=.s) $(time_event:.o=.d): time_event.c
+$(task_manage) $(task_manage:.o=.s) $(task_manage:.o=.d): task_manage.c
+$(task_refer) $(task_refer:.o=.s) $(task_refer:.o=.d): task_refer.c
+$(task_sync) $(task_sync:.o=.s) $(task_sync:.o=.d): task_sync.c
+$(task_except) $(task_except:.o=.s) $(task_except:.o=.d): task_except.c
+$(semaphore) $(semaphore:.o=.s) $(semaphore:.o=.d): semaphore.c
+$(eventflag) $(eventflag:.o=.s) $(eventflag:.o=.d): eventflag.c
+$(dataqueue) $(dataqueue:.o=.s) $(dataqueue:.o=.d): dataqueue.c
+$(pridataq) $(pridataq:.o=.s) $(pridataq:.o=.d): pridataq.c
+$(mailbox) $(mailbox:.o=.s) $(mailbox:.o=.d): mailbox.c
+$(mempfix) $(mempfix:.o=.s) $(mempfix:.o=.d): mempfix.c
+$(time_manage) $(time_manage:.o=.s) $(time_manage:.o=.d): time_manage.c
+$(cyclic) $(cyclic:.o=.s) $(cyclic:.o=.d): cyclic.c
+$(alarm) $(alarm:.o=.s) $(alarm:.o=.d): alarm.c
+$(sys_manage) $(sys_manage:.o=.s) $(sys_manage:.o=.d): sys_manage.c
+$(interrupt) $(interrupt:.o=.s) $(interrupt:.o=.d): interrupt.c
+$(exception) $(exception:.o=.s) $(exception:.o=.d): exception.c
diff --git a/asp/extension/dcre/kernel/alarm.c b/asp/extension/dcre/kernel/alarm.c
new file mode 100644 (file)
index 0000000..bb12018
--- /dev/null
@@ -0,0 +1,467 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: alarm.c 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ *             アラームハンドラ機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "alarm.h"
+
+/*
+ *  トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_ALM_ENTER
+#define LOG_ALM_ENTER(p_almcb)
+#endif /* LOG_ALM_ENTER */
+
+#ifndef LOG_ALM_LEAVE
+#define LOG_ALM_LEAVE(p_almcb)
+#endif /* LOG_ALM_LEAVE */
+
+#ifndef LOG_ACRE_ALM_ENTER
+#define LOG_ACRE_ALM_ENTER(pk_calm)
+#endif /* LOG_ACRE_ALM_ENTER */
+
+#ifndef LOG_ACRE_ALM_LEAVE
+#define LOG_ACRE_ALM_LEAVE(ercd)
+#endif /* LOG_ACRE_ALM_LEAVE */
+
+#ifndef LOG_DEL_ALM_ENTER
+#define LOG_DEL_ALM_ENTER(almid)
+#endif /* LOG_DEL_ALM_ENTER */
+
+#ifndef LOG_DEL_ALM_LEAVE
+#define LOG_DEL_ALM_LEAVE(ercd)
+#endif /* LOG_DEL_ALM_LEAVE */
+
+#ifndef LOG_STA_ALM_ENTER
+#define LOG_STA_ALM_ENTER(almid, almtim)
+#endif /* LOG_STA_ALM_ENTER */
+
+#ifndef LOG_STA_ALM_LEAVE
+#define LOG_STA_ALM_LEAVE(ercd)
+#endif /* LOG_STA_ALM_LEAVE */
+
+#ifndef LOG_ISTA_ALM_ENTER
+#define LOG_ISTA_ALM_ENTER(almid, almtim)
+#endif /* LOG_ISTA_ALM_ENTER */
+
+#ifndef LOG_ISTA_ALM_LEAVE
+#define LOG_ISTA_ALM_LEAVE(ercd)
+#endif /* LOG_ISTA_ALM_LEAVE */
+
+#ifndef LOG_STP_ALM_ENTER
+#define LOG_STP_ALM_ENTER(almid)
+#endif /* LOG_STP_ALM_ENTER */
+
+#ifndef LOG_STP_ALM_LEAVE
+#define LOG_STP_ALM_LEAVE(ercd)
+#endif /* LOG_STP_ALM_LEAVE */
+
+#ifndef LOG_ISTP_ALM_ENTER
+#define LOG_ISTP_ALM_ENTER(almid)
+#endif /* LOG_ISTP_ALM_ENTER */
+
+#ifndef LOG_ISTP_ALM_LEAVE
+#define LOG_ISTP_ALM_LEAVE(ercd)
+#endif /* LOG_ISTP_ALM_LEAVE */
+
+#ifndef LOG_REF_ALM_ENTER
+#define LOG_REF_ALM_ENTER(almid, pk_ralm)
+#endif /* LOG_REF_ALM_ENTER */
+
+#ifndef LOG_REF_ALM_LEAVE
+#define LOG_REF_ALM_LEAVE(ercd, pk_ralm)
+#endif /* LOG_REF_ALM_LEAVE */
+
+/*
+ *  アラームハンドラの数
+ */
+#define tnum_alm       ((uint_t)(tmax_almid - TMIN_ALMID + 1))
+#define tnum_salm      ((uint_t)(tmax_salmid - TMIN_ALMID + 1))
+
+/*
+ *  アラームハンドラIDからアラームハンドラ管理ブロックを取り出すためのマクロ
+ */
+#define INDEX_ALM(almid)       ((uint_t)((almid) - TMIN_ALMID))
+#define get_almcb(almid)       (&(almcb_table[INDEX_ALM(almid)]))
+
+#ifdef TOPPERS_almini
+
+/*
+ *  使用していないアラームハンドラ管理ブロックのリスト
+ *
+ *  アラームハンドラ管理ブロックの先頭にはキューにつなぐための領域がな
+ *  いため,タイムイベントブロック(tmevtb)の領域を用いる.
+ */
+QUEUE  free_almcb;
+
+/*
+ *  アラームハンドラ機能の初期化
+ */
+void
+initialize_alarm(void)
+{
+       uint_t  i, j;
+       ALMCB   *p_almcb;
+       ALMINIB *p_alminib;
+
+       for (p_almcb = almcb_table, i = 0; i < tnum_salm; p_almcb++, i++) {
+               p_almcb->p_alminib = &(alminib_table[i]);
+               p_almcb->almsta = false;
+       }
+       queue_initialize(&free_almcb);
+       for (j = 0; i < tnum_alm; p_almcb++, i++, j++) {
+               p_alminib = &(aalminib_table[j]);
+               p_alminib->almatr = TA_NOEXS;
+               p_almcb->p_alminib = ((const ALMINIB *) p_alminib);
+               queue_insert_prev(&free_almcb, ((QUEUE *) &(p_almcb->tmevtb)));
+       }
+}
+
+#endif /* TOPPERS_almini */
+
+/*
+ *  アラームハンドラの生成
+ */
+#ifdef TOPPERS_acre_alm
+
+ER_UINT
+acre_alm(const T_CALM *pk_calm)
+{
+       ALMCB   *p_almcb;
+       ALMINIB *p_alminib;
+       ER              ercd;
+
+       LOG_ACRE_ALM_ENTER(pk_calm);
+       CHECK_TSKCTX_UNL();
+       CHECK_RSATR(pk_calm->almatr, TA_NULL);
+       CHECK_ALIGN_FUNC(pk_calm->almhdr);
+       CHECK_NONNULL_FUNC(pk_calm->almhdr);
+
+       t_lock_cpu();
+       if (queue_empty(&free_almcb)) {
+               ercd = E_NOID;
+       }
+       else {
+               p_almcb = ((ALMCB *)(((char *) queue_delete_next(&free_almcb))
+                                                                                               - offsetof(ALMCB, tmevtb)));
+               p_alminib = (ALMINIB *)(p_almcb->p_alminib);
+               p_alminib->almatr = pk_calm->almatr;
+               p_alminib->exinf = pk_calm->exinf;
+               p_alminib->almhdr = pk_calm->almhdr;
+
+               p_almcb->almsta = false;
+               ercd = ALMID(p_almcb);
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_ACRE_ALM_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_acre_alm */
+
+/*
+ *  アラームハンドラの削除
+ */
+#ifdef TOPPERS_del_alm
+
+ER
+del_alm(ID almid)
+{
+       ALMCB   *p_almcb;
+       ALMINIB *p_alminib;
+       ER              ercd;
+
+       LOG_DEL_ALM_ENTER(almid);
+       CHECK_TSKCTX_UNL();
+       CHECK_ALMID(almid);
+       p_almcb = get_almcb(almid);
+
+       t_lock_cpu();
+       if (p_almcb->p_alminib->almatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (ALMID(p_almcb) > tmax_salmid) {
+               if (p_almcb->almsta) {
+                       p_almcb->almsta = false;
+                       tmevtb_dequeue(&(p_almcb->tmevtb));
+               }
+
+               p_alminib = (ALMINIB *)(p_almcb->p_alminib);
+               p_alminib->almatr = TA_NOEXS;
+               queue_insert_prev(&free_almcb, ((QUEUE *) &(p_almcb->tmevtb)));
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_OBJ;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_DEL_ALM_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_del_alm */
+
+/*
+ *  アラームハンドラの動作開始
+ */
+#ifdef TOPPERS_sta_alm
+
+ER
+sta_alm(ID almid, RELTIM almtim)
+{
+       ALMCB   *p_almcb;
+       ER              ercd;
+
+       LOG_STA_ALM_ENTER(almid, almtim);
+       CHECK_TSKCTX_UNL();
+       CHECK_ALMID(almid);
+       CHECK_PAR(almtim <= TMAX_RELTIM);
+       p_almcb = get_almcb(almid);
+
+       t_lock_cpu();
+       if (p_almcb->p_alminib->almatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (p_almcb->almsta) {
+               tmevtb_dequeue(&(p_almcb->tmevtb));
+       }
+       else {
+               p_almcb->almsta = true;
+       }
+       tmevtb_enqueue(&(p_almcb->tmevtb), almtim,
+                                                               (CBACK) call_almhdr, (void *) p_almcb);
+       ercd = E_OK;
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_STA_ALM_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_sta_alm */
+
+/*
+ *  アラームハンドラの動作開始(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_ista_alm
+
+ER
+ista_alm(ID almid, RELTIM almtim)
+{
+       ALMCB   *p_almcb;
+       ER              ercd;
+
+       LOG_ISTA_ALM_ENTER(almid, almtim);
+       CHECK_INTCTX_UNL();
+       CHECK_ALMID(almid);
+       CHECK_PAR(almtim <= TMAX_RELTIM);
+       p_almcb = get_almcb(almid);
+
+       i_lock_cpu();
+       if (p_almcb->p_alminib->almatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (p_almcb->almsta) {
+               tmevtb_dequeue(&(p_almcb->tmevtb));
+       }
+       else {
+               p_almcb->almsta = true;
+       }
+       tmevtb_enqueue(&(p_almcb->tmevtb), almtim,
+                                                               (CBACK) call_almhdr, (void *) p_almcb);
+       ercd = E_OK;
+       i_unlock_cpu();
+
+  error_exit:
+       LOG_ISTA_ALM_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ista_alm */
+
+/*
+ *  アラームハンドラの動作停止
+ */
+#ifdef TOPPERS_stp_alm
+
+ER
+stp_alm(ID almid)
+{
+       ALMCB   *p_almcb;
+       ER              ercd;
+
+       LOG_STP_ALM_ENTER(almid);
+       CHECK_TSKCTX_UNL();
+       CHECK_ALMID(almid);
+       p_almcb = get_almcb(almid);
+
+       t_lock_cpu();
+       if (p_almcb->p_alminib->almatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (p_almcb->almsta) {
+               p_almcb->almsta = false;
+               tmevtb_dequeue(&(p_almcb->tmevtb));
+       }
+       ercd = E_OK;
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_STP_ALM_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_stp_alm */
+
+/*
+ *  アラームハンドラの動作停止(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_istp_alm
+
+ER
+istp_alm(ID almid)
+{
+       ALMCB   *p_almcb;
+       ER              ercd;
+
+       LOG_ISTP_ALM_ENTER(almid);
+       CHECK_INTCTX_UNL();
+       CHECK_ALMID(almid);
+       p_almcb = get_almcb(almid);
+
+       i_lock_cpu();
+       if (p_almcb->p_alminib->almatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (p_almcb->almsta) {
+               p_almcb->almsta = false;
+               tmevtb_dequeue(&(p_almcb->tmevtb));
+       }
+       ercd = E_OK;
+       i_unlock_cpu();
+
+  error_exit:
+       LOG_ISTP_ALM_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_istp_alm */
+
+/*
+ *  アラームハンドラの状態参照
+ */
+#ifdef TOPPERS_ref_alm
+
+ER
+ref_alm(ID almid, T_RALM *pk_ralm)
+{
+       ALMCB   *p_almcb;
+       ER              ercd;
+    
+       LOG_REF_ALM_ENTER(almid, pk_ralm);
+       CHECK_TSKCTX_UNL();
+       CHECK_ALMID(almid);
+       p_almcb = get_almcb(almid);
+
+       t_lock_cpu();
+       if (p_almcb->p_alminib->almatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else {
+               if (p_almcb->almsta) {
+                       pk_ralm->almstat = TALM_STA;
+                       pk_ralm->lefttim = tmevt_lefttim(&(p_almcb->tmevtb));
+               }
+               else {
+                       pk_ralm->almstat = TALM_STP;
+               }
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_REF_ALM_LEAVE(ercd, pk_ralm);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ref_alm */
+
+/*
+ *  アラームハンドラ起動ルーチン
+ */
+#ifdef TOPPERS_almcal
+
+void
+call_almhdr(ALMCB *p_almcb)
+{
+       PRI             saved_ipm;
+
+       /*
+        *  アラームハンドラを停止状態にする.
+        */
+       p_almcb->almsta = false;
+
+       /*
+        *  アラームハンドラを,CPUロック解除状態で呼び出す.
+        */
+       saved_ipm = i_get_ipm();
+       i_unlock_cpu();
+
+       LOG_ALM_ENTER(p_almcb);
+       (*((ALMHDR)(p_almcb->p_alminib->almhdr)))(p_almcb->p_alminib->exinf);
+       LOG_ALM_LEAVE(p_almcb);
+
+       if (!i_sense_lock()) {
+               i_lock_cpu();
+       }
+       i_set_ipm(saved_ipm);
+}
+
+#endif /* TOPPERS_almcal */
old mode 100755 (executable)
new mode 100644 (file)
similarity index 61%
rename from asp/target/cq_starm_gcc/target_config.h
rename to asp/extension/dcre/kernel/alarm.h
index 55765fe..b24261e
@@ -5,7 +5,7 @@
  * 
  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
  *                              Toyohashi Univ. of Technology, JAPAN
- *  Copyright (C) 2005-2007 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
+ *  @(#) $Id: alarm.h 1966 2010-11-20 07:23:56Z ertl-hiro $
  */
 
-#ifndef TOPPERS_TARGET_CONFIG_H
-#define TOPPERS_TARGET_CONFIG_H
-
 /*
- * ターゲット依存部モジュール(CQ-STARM用)
- *
- * カーネルのターゲット依存部のインクルードファイル.kernel_impl.hのター
- * ゲット依存部の位置付けとなす.
+ *             アラームハンドラ機能
  */
 
+#ifndef TOPPERS_ALARM_H
+#define TOPPERS_ALARM_H
+
+#include <queue.h>
+#include "time_event.h"
+
 /*
- * ターゲットシステムのハードウェア資源の定義
+ *  アラームハンドラ初期化ブロック
  */
-#include "cq_starm.h"
+typedef struct alarm_handler_initialization_block {
+       ATR                     almatr;                 /* アラームハンドラ属性 */
+       intptr_t        exinf;                  /* アラームハンドラの拡張情報 */
+       ALMHDR          almhdr;                 /* アラームハンドラの起動番地 */
+} ALMINIB;
 
 /*
- *  ã\83\88ã\83¬ã\83¼ã\82¹ã\83­ã\82°ã\81«é\96¢ã\81\99ã\82\8b設å®\9a
+ *  ã\82¢ã\83©ã\83¼ã\83 ã\83\8fã\83³ã\83\89ã\83©ç®¡ç\90\86ã\83\96ã\83­ã\83\83ã\82¯
  */
-#ifdef TOPPERS_ENABLE_TRACE
-#include "logtrace/trace_config.h"
-#endif /* TOPPERS_ENABLE_TRACE */
+typedef struct alarm_handler_control_block {
+       const ALMINIB *p_alminib;       /* 初期化ブロックへのポインタ */
+       bool_t          almsta;                 /* アラームハンドラの動作状態 */
+       TMEVTB          tmevtb;                 /* タイムイベントブロック */
+} ALMCB;
 
 /*
- *  デフォルトの非タスクコンテキスト用のスタック領域の定義
- *  8byte単位で取得される. 
+ *  使用していないアラームハンドラ管理ブロックのリスト
  */
-#define DEFAULT_ISTKSZ                 (0x1000/8U)             /* 4KByte */
+extern QUEUE   free_almcb;
 
 /*
- *  微少時間待ちのための定義(本来はSILのターゲット依存部
+ *  アラームハンドラIDの最大値(kernel_cfg.c
  */
-#define SIL_DLY_TIM1    162
-#define SIL_DLY_TIM2    100
+extern const ID        tmax_almid;
+extern const ID        tmax_salmid;
 
 /*
- *  使用するシリアルポートID
+ *  アラームハンドラ初期化ブロックのエリア(kernel_cfg.c)
  */
-#define SIO_PORTID             (1)
+extern const ALMINIB   alminib_table[];
+extern ALMINIB                 aalminib_table[];
 
 /*
- * CQ-STARM用のIDLE処理の定義
- *
- * サスペンド時にOpenOCDデバッグツールが使えなくなる問題の対応
- * WFI等でサスペンドしているプログラムに対して,フラッシュROM
- * 書き込みも出来なくなるため,IDEL処理変更.
+ *  アラームハンドラ管理ブロックのエリア(kernel_cfg.c)
  */
-#define TOPPERS_CUSTOM_IDEL
-#define toppers_asm_custom_idle                \
-       msr             basepri, r0;                    \
-       msr             basepri, r1;
-
-
-#ifndef TOPPERS_MACRO_ONLY
+extern ALMCB   almcb_table[];
 
 /*
- *  ターゲットシステム依存の初期化
+ *  アラームハンドラ管理ブロックからアラームハンドラIDを取り出すための
+ *  マクロ
  */
-extern void    target_initialize(void);
+#define        ALMID(p_almcb)  ((ID)(((p_almcb) - almcb_table) + TMIN_ALMID))
 
 /*
- *  ターゲットシステムの終了
- *
- *  システムを終了する時に使う.
+ *  アラームハンドラ機能の初期化
  */
-extern void    target_exit(void) NoReturn;
-
-#endif /* TOPPERS_MACRO_ONLY */
+extern void    initialize_alarm(void);
 
 /*
- *  ã\83\81ã\83\83ã\83\97ä¾\9då­\98ã\83¢ã\82¸ã\83¥ã\83¼ã\83«ï¼\88ARM-Mç\94¨ï¼\89
+ *  ã\82¢ã\83©ã\83¼ã\83 ã\83\8fã\83³ã\83\89ã\83©èµ·å\8b\95ã\83«ã\83¼ã\83\81ã\83³
  */
-#include "arm_m_gcc/prc_config.h"
+extern void    call_almhdr(ALMCB *p_almcb);
 
-#endif /* TOPPERS_TARGET_CONFIG_H */
+#endif /* TOPPERS_ALARM_H */
diff --git a/asp/extension/dcre/kernel/allfunc.h b/asp/extension/dcre/kernel/allfunc.h
new file mode 100644 (file)
index 0000000..54874c2
--- /dev/null
@@ -0,0 +1,265 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: allfunc.h 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ *             すべての関数をコンパイルするための定義
+ */
+
+#ifndef TOPPERS_ALLFUNC_H
+#define TOPPERS_ALLFUNC_H
+
+/* startup.c */
+#define TOPPERS_sta_ker
+#define TOPPERS_ext_ker
+#define TOPPERS_kermem
+
+/* task.c */
+#define TOPPERS_tskini
+#define TOPPERS_tsksched
+#define TOPPERS_tskrun
+#define TOPPERS_tsknrun
+#define TOPPERS_tskdmt
+#define TOPPERS_tskact
+#define TOPPERS_tskpri
+#define TOPPERS_tskrot
+#define TOPPERS_tsktex
+
+/* wait.c */
+#define TOPPERS_waimake
+#define TOPPERS_waicmp
+#define TOPPERS_waitmo
+#define TOPPERS_waitmook
+#define TOPPERS_wairel
+#define TOPPERS_wobjwai
+#define TOPPERS_wobjwaitmo
+#define TOPPERS_iniwque
+
+/* time_event.c */
+#define TOPPERS_tmeini
+#define TOPPERS_tmeup
+#define TOPPERS_tmedown
+#define TOPPERS_tmeins
+#define TOPPERS_tmedel
+#define TOPPERS_tmeltim
+#define TOPPERS_sigtim
+
+/* task_manage.c */
+#define TOPPERS_acre_tsk
+#define TOPPERS_del_tsk
+#define TOPPERS_act_tsk
+#define TOPPERS_iact_tsk
+#define TOPPERS_can_act
+#define TOPPERS_ext_tsk
+#define TOPPERS_ter_tsk
+#define TOPPERS_chg_pri
+#define TOPPERS_get_pri
+#define TOPPERS_get_inf
+
+/* task_refer.c */
+#define TOPPERS_ref_tsk
+
+/* task_sync.c */
+#define TOPPERS_slp_tsk
+#define TOPPERS_tslp_tsk
+#define TOPPERS_wup_tsk
+#define TOPPERS_iwup_tsk
+#define TOPPERS_can_wup
+#define TOPPERS_rel_wai
+#define TOPPERS_irel_wai
+#define TOPPERS_sus_tsk
+#define TOPPERS_rsm_tsk
+#define TOPPERS_dly_tsk
+
+/* task_except.c */
+#define TOPPERS_def_tex
+#define TOPPERS_ras_tex
+#define TOPPERS_iras_tex
+#define TOPPERS_dis_tex
+#define TOPPERS_ena_tex
+#define TOPPERS_sns_tex
+#define TOPPERS_ref_tex
+
+/* semaphore.c */
+#define TOPPERS_semini
+#define TOPPERS_acre_sem
+#define TOPPERS_del_sem
+#define TOPPERS_sig_sem
+#define TOPPERS_isig_sem
+#define TOPPERS_wai_sem
+#define TOPPERS_pol_sem
+#define TOPPERS_twai_sem
+#define TOPPERS_ini_sem
+#define TOPPERS_ref_sem
+
+/* eventflag.c */
+#define TOPPERS_flgini
+#define TOPPERS_flgcnd
+#define TOPPERS_acre_flg
+#define TOPPERS_del_flg
+#define TOPPERS_set_flg
+#define TOPPERS_iset_flg
+#define TOPPERS_clr_flg
+#define TOPPERS_wai_flg
+#define TOPPERS_pol_flg
+#define TOPPERS_twai_flg
+#define TOPPERS_ini_flg
+#define TOPPERS_ref_flg
+
+/* dataqueue.c */
+#define TOPPERS_dtqini
+#define TOPPERS_dtqenq
+#define TOPPERS_dtqfenq
+#define TOPPERS_dtqdeq
+#define TOPPERS_dtqsnd
+#define TOPPERS_dtqfsnd
+#define TOPPERS_dtqrcv
+#define TOPPERS_acre_dtq
+#define TOPPERS_del_dtq
+#define TOPPERS_snd_dtq
+#define TOPPERS_psnd_dtq
+#define TOPPERS_ipsnd_dtq
+#define TOPPERS_tsnd_dtq
+#define TOPPERS_fsnd_dtq
+#define TOPPERS_ifsnd_dtq
+#define TOPPERS_rcv_dtq
+#define TOPPERS_prcv_dtq
+#define TOPPERS_trcv_dtq
+#define TOPPERS_ini_dtq
+#define TOPPERS_ref_dtq
+
+/* pridataq.c */
+#define TOPPERS_pdqini
+#define TOPPERS_pdqenq
+#define TOPPERS_pdqdeq
+#define TOPPERS_pdqsnd
+#define TOPPERS_pdqrcv
+#define TOPPERS_acre_pdq
+#define TOPPERS_del_pdq
+#define TOPPERS_snd_pdq
+#define TOPPERS_psnd_pdq
+#define TOPPERS_ipsnd_pdq
+#define TOPPERS_tsnd_pdq
+#define TOPPERS_rcv_pdq
+#define TOPPERS_prcv_pdq
+#define TOPPERS_trcv_pdq
+#define TOPPERS_ini_pdq
+#define TOPPERS_ref_pdq
+
+/* mailbox.c */
+#define TOPPERS_mbxini
+#define TOPPERS_acre_mbx
+#define TOPPERS_del_mbx
+#define TOPPERS_snd_mbx
+#define TOPPERS_rcv_mbx
+#define TOPPERS_prcv_mbx
+#define TOPPERS_trcv_mbx
+#define TOPPERS_ini_mbx
+#define TOPPERS_ref_mbx
+
+/* mempfix.c */
+#define TOPPERS_mpfini
+#define TOPPERS_mpfget
+#define TOPPERS_acre_mpf
+#define TOPPERS_del_mpf
+#define TOPPERS_get_mpf
+#define TOPPERS_pget_mpf
+#define TOPPERS_tget_mpf
+#define TOPPERS_rel_mpf
+#define TOPPERS_ini_mpf
+#define TOPPERS_ref_mpf
+
+/* time_manage.c */
+#define TOPPERS_get_tim
+#define TOPPERS_get_utm
+
+/* cyclic.c */
+#define TOPPERS_cycini
+#define TOPPERS_acre_cyc
+#define TOPPERS_del_cyc
+#define TOPPERS_sta_cyc
+#define TOPPERS_stp_cyc
+#define TOPPERS_ref_cyc
+#define TOPPERS_cyccal
+
+/* alarm.c */
+#define TOPPERS_almini
+#define TOPPERS_acre_alm
+#define TOPPERS_del_alm
+#define TOPPERS_sta_alm
+#define TOPPERS_ista_alm
+#define TOPPERS_stp_alm
+#define TOPPERS_istp_alm
+#define TOPPERS_ref_alm
+#define TOPPERS_almcal
+
+/* sys_manage.c */
+#define TOPPERS_rot_rdq
+#define TOPPERS_irot_rdq
+#define TOPPERS_get_tid
+#define TOPPERS_iget_tid
+#define TOPPERS_loc_cpu
+#define TOPPERS_iloc_cpu
+#define TOPPERS_unl_cpu
+#define TOPPERS_iunl_cpu
+#define TOPPERS_dis_dsp
+#define TOPPERS_ena_dsp
+#define TOPPERS_sns_ctx
+#define TOPPERS_sns_loc
+#define TOPPERS_sns_dsp
+#define TOPPERS_sns_dpn
+#define TOPPERS_sns_ker
+
+/* interrupt.c */
+#define TOPPERS_isrini
+#define TOPPERS_isrcal
+#define TOPPERS_acre_isr
+#define TOPPERS_del_isr
+#define TOPPERS_intini
+#define TOPPERS_dis_int
+#define TOPPERS_ena_int
+#define TOPPERS_chg_ipm
+#define TOPPERS_get_ipm
+
+/* exception.c */
+#define TOPPERS_excini
+#define TOPPERS_xsns_dpn
+#define TOPPERS_xsns_xpn
+
+#endif /* TOPPERS_ALLFUNC_H */
diff --git a/asp/extension/dcre/kernel/check.h b/asp/extension/dcre/kernel/check.h
new file mode 100644 (file)
index 0000000..d442e8c
--- /dev/null
@@ -0,0 +1,494 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: check.h 1970 2010-11-20 11:27:06Z ertl-hiro $
+ */
+
+/*
+ *             エラーチェック用マクロ
+ */
+
+#ifndef TOPPERS_CHECK_H
+#define TOPPERS_CHECK_H
+
+/*
+ *  予約属性エラーのチェック(E_PAR)
+ */
+#define CHECK_RSATR(atr, valid_atr) {                                          \
+       if (((atr) & ~(valid_atr)) != 0U) {                                             \
+               ercd = E_RSATR;                                                                         \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  優先度の範囲の判定
+ */
+#define VALID_TPRI(tpri)       (TMIN_TPRI <= (tpri) && (tpri) <= TMAX_TPRI)
+
+#define VALID_DPRI(dpri)       (TMIN_DPRI <= (dpri) && (dpri) <= TMAX_DPRI)
+
+#define VALID_MPRI(mpri)       (TMIN_MPRI <= (mpri) && (mpri) <= TMAX_MPRI)
+
+#define VALID_ISRPRI(isrpri) \
+                               (TMIN_ISRPRI <= (isrpri) && (isrpri) <= TMAX_ISRPRI)
+
+#ifndef VALID_INTPRI_CHGIPM
+#define VALID_INTPRI_CHGIPM(intpri) \
+                               (TMIN_INTPRI <= (intpri) && (intpri) <= TIPM_ENAALL)
+#endif /* VALID_INTPRI_CHGIPM */
+
+/*
+ *  タスク優先度のチェック(E_PAR)
+ */
+#define CHECK_TPRI(tpri) {                                                                     \
+       if (!VALID_TPRI(tpri)) {                                                                \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_TPRI_INI(tpri) {                                                         \
+       if (!(VALID_TPRI(tpri) || (tpri) == TPRI_INI)) {                \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_TPRI_SELF(tpri) {                                                                \
+       if (!(VALID_TPRI(tpri) || (tpri) == TPRI_SELF)) {               \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  データ優先度のチェック(E_PAR)
+ */
+#define CHECK_DPRI(dpri) {                                                                     \
+       if (!VALID_DPRI(dpri)) {                                                                \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  メッセージ優先度のチェック(E_PAR)
+ */
+#define CHECK_MPRI(mpri) {                                                                     \
+       if (!VALID_MPRI(mpri)) {                                                                \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  割込みサービスルーチン優先度のチェック(E_PAR)
+ */
+#define CHECK_ISRPRI(isrpri) {                                                         \
+       if (!VALID_ISRPRI(isrpri)) {                                                    \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  タイムアウト指定値のチェック(E_PAR)
+ */
+#define CHECK_TMOUT(tmout) {                                                           \
+       if (!(TMO_FEVR <= (tmout))) {                                                   \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  割込み優先度のチェック(E_PAR)
+ */
+#define CHECK_INTPRI_CHGIPM(intpri) {                                          \
+       if (!VALID_INTPRI_CHGIPM(intpri)) {                                             \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  割込み番号のチェック(E_PAR)
+ */
+#define CHECK_INTNO_CREISR(intno) {                                                    \
+       if (!VALID_INTNO_CREISR(intno)) {                                               \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_INTNO_DISINT(intno) {                                                    \
+       if (!VALID_INTNO_DISINT(intno)) {                                               \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  アラインしているかの判定
+ */
+#define ALIGNED(val, align)            ((((uintptr_t)(val)) & ((align) - 1U)) == 0U)
+
+#ifdef CHECK_FUNC_ALIGN
+#define FUNC_ALIGNED(func)             ALIGNED(func, CHECK_FUNC_ALIGN)
+#else /* CHECK_FUNC_ALIGN */
+#define FUNC_ALIGNED(func)             true
+#endif /* CHECK_FUNC_ALIGN */
+
+#ifdef CHECK_STKSZ_ALIGN
+#define STKSZ_ALIGNED(stksz)   ALIGNED(stksz, CHECK_STKSZ_ALIGN)
+#else /* CHECK_STKSZ_ALIGN */
+#define STKSZ_ALIGNED(stksz)   true
+#endif /* CHECK_STKSZ_ALIGN */
+
+#ifdef CHECK_STACK_ALIGN
+#define STACK_ALIGNED(stack)   ALIGNED(stack, CHECK_STACK_ALIGN)
+#else /* CHECK_STACK_ALIGN */
+#define STACK_ALIGNED(stack)   true
+#endif /* CHECK_STACK_ALIGN */
+
+#ifdef CHECK_MPF_ALIGN
+#define MPF_ALIGNED(mpf)               ALIGNED(mpf, CHECK_MPF_ALIGN)
+#else /* CHECK_MPF_ALIGN */
+#define MPF_ALIGNED(mpf)               true
+#endif /* CHECK_MPF_ALIGN */
+
+#ifdef CHECK_MB_ALIGN
+#define MB_ALIGNED(mb)                 ALIGNED(mb, CHECK_MB_ALIGN)
+#else /* CHECK_MB_ALIGN */
+#define MB_ALIGNED(mb)                 true
+#endif /* CHECK_MB_ALIGN */
+
+/*
+ *  NULLでないことのチェック
+ */
+#ifdef CHECK_FUNC_NONNULL
+#define FUNC_NONNULL(func)             ((func) != NULL)
+#else /* CHECK_FUNC_NONNULL */
+#define FUNC_NONNULL(func)             true
+#endif /* CHECK_FUNC_NONNULL */
+
+#ifdef CHECK_STACK_NONNULL
+#define STACK_NONNULL(stack)   ((stack) != NULL)
+#else /* CHECK_STACK_NONNULL */
+#define STACK_NONNULL(stack)   true
+#endif /* CHECK_STACK_NONNULL */
+
+#ifdef CHECK_MPF_NONNULL
+#define MPF_NONNULL(mpf)               ((mpf) != NULL)
+#else /* CHECK_MPF_NONNULL */
+#define MPF_NONNULL(mpf)               true
+#endif /* CHECK_MPF_NONNULL */
+
+/*
+ *  関数の先頭番地のチェック(E_PAR)
+ */
+#define CHECK_ALIGN_FUNC(func) {                                                       \
+       if (!FUNC_ALIGNED(func)) {                                                              \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_NONNULL_FUNC(func) {                                                     \
+       if (!FUNC_NONNULL(func)) {                                                              \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  スタックサイズのチェック(E_PAR)
+ */
+#define CHECK_ALIGN_STKSZ(stksz) {                                                     \
+       if (!STKSZ_ALIGNED(stksz)) {                                                    \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#ifndef TARGET_MIN_STKSZ
+#define TARGET_MIN_STKSZ       1U              /* 未定義の場合は0でないことをチェック */
+#endif /* TARGET_MIN_STKSZ */
+
+#define CHECK_STKSZ_MIN(stksz) {                                                       \
+       if ((stksz) < TARGET_MIN_STKSZ) {                                               \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  スタックの先頭番地のチェック(E_PAR)
+ */
+#define CHECK_ALIGN_STACK(stack) {                                                     \
+       if (!STACK_ALIGNED(stack)) {                                                    \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_NONNULL_STACK(stack) {                                           \
+       if (!STACK_NONNULL(stack)) {                                                    \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  固定長メモリプール領域の先頭番地のチェック(E_PAR)
+ */
+#define CHECK_ALIGN_MPF(mpf) {                                                         \
+       if (!MPF_ALIGNED(mpf)) {                                                                \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_NONNULL_MPF(mpf) {                                                       \
+       if (!MPF_NONNULL(mpf)) {                                                                \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  管理領域の先頭番地のチェック(E_PAR)
+ */
+#define CHECK_ALIGN_MB(mb) {                                                           \
+       if (!MB_ALIGNED(mb)) {                                                                  \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  その他のパラメータエラーのチェック(E_PAR)
+ */
+#define CHECK_PAR(exp) {                                                                       \
+       if (!(exp)) {                                                                                   \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  オブジェクトIDの範囲の判定
+ */
+#define VALID_TSKID(tskid)     (TMIN_TSKID <= (tskid) && (tskid) <= tmax_tskid)
+#define VALID_SEMID(semid)     (TMIN_SEMID <= (semid) && (semid) <= tmax_semid)
+#define VALID_FLGID(flgid)     (TMIN_FLGID <= (flgid) && (flgid) <= tmax_flgid)
+#define VALID_DTQID(dtqid)     (TMIN_DTQID <= (dtqid) && (dtqid) <= tmax_dtqid)
+#define VALID_PDQID(pdqid)     (TMIN_PDQID <= (pdqid) && (pdqid) <= tmax_pdqid)
+#define VALID_MBXID(mbxid)     (TMIN_MBXID <= (mbxid) && (mbxid) <= tmax_mbxid)
+#define VALID_MPFID(mpfid)     (TMIN_MPFID <= (mpfid) && (mpfid) <= tmax_mpfid)
+#define VALID_CYCID(cycid)     (TMIN_CYCID <= (cycid) && (cycid) <= tmax_cycid)
+#define VALID_ALMID(almid)     (TMIN_ALMID <= (almid) && (almid) <= tmax_almid)
+#define VALID_ISRID(isrid)     (TMIN_ISRID <= (isrid) && (isrid) <= tmax_isrid)
+
+/*
+ *  オブジェクトIDのチェック(E_ID)
+ */
+#define CHECK_TSKID(tskid) {                                                           \
+       if (!VALID_TSKID(tskid)) {                                                              \
+               ercd = E_ID;                                                                            \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_TSKID_SELF(tskid) {                                                      \
+       if (!(VALID_TSKID(tskid) || (tskid) == TSK_SELF)) {             \
+               ercd = E_ID;                                                                            \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_SEMID(semid) {                                                           \
+       if (!VALID_SEMID(semid)) {                                                              \
+               ercd = E_ID;                                                                            \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_FLGID(flgid) {                                                           \
+       if (!VALID_FLGID(flgid)) {                                                              \
+               ercd = E_ID;                                                                            \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_DTQID(dtqid) {                                                           \
+       if (!VALID_DTQID(dtqid)) {                                                              \
+               ercd = E_ID;                                                                            \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_PDQID(pdqid) {                                                           \
+       if (!VALID_PDQID(pdqid)) {                                                              \
+               ercd = E_ID;                                                                            \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_MBXID(mbxid) {                                                           \
+       if (!VALID_MBXID(mbxid)) {                                                              \
+               ercd = E_ID;                                                                            \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_MPFID(mpfid) {                                                           \
+       if (!VALID_MPFID(mpfid)) {                                                              \
+               ercd = E_ID;                                                                            \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_CYCID(cycid) {                                                           \
+       if (!VALID_CYCID(cycid)) {                                                              \
+               ercd = E_ID;                                                                            \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_ALMID(almid) {                                                           \
+       if (!VALID_ALMID(almid)) {                                                              \
+               ercd = E_ID;                                                                            \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_ISRID(isrid) {                                                           \
+       if (!VALID_ISRID(isrid)) {                                                              \
+               ercd = E_ID;                                                                            \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  呼出しコンテキストのチェック(E_CTX)
+ */
+#define CHECK_TSKCTX() {                                                                       \
+       if (sense_context()) {                                                                  \
+               ercd = E_CTX;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_INTCTX() {                                                                       \
+       if (!sense_context()) {                                                                 \
+               ercd = E_CTX;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  呼出しコンテキストとCPUロック状態のチェック(E_CTX)
+ */
+#define CHECK_TSKCTX_UNL() {                                                           \
+       if (sense_context() || t_sense_lock()) {                                \
+               ercd = E_CTX;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_INTCTX_UNL() {                                                           \
+       if (!sense_context() || i_sense_lock()) {                               \
+               ercd = E_CTX;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  ディスパッチ保留状態でないかのチェック(E_CTX)
+ */
+#define CHECK_DISPATCH() {                                                                     \
+       if (sense_context() || t_sense_lock() || !dspflg) {             \
+               ercd = E_CTX;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  その他のコンテキストエラーのチェック(E_CTX)
+ */
+#define CHECK_CTX(exp) {                                                                       \
+       if (!(exp)) {                                                                                   \
+               ercd = E_CTX;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  自タスクを指定していないかのチェック(E_ILUSE)
+ */
+#define CHECK_NONSELF(p_tcb) {                                                         \
+       if ((p_tcb) == p_runtsk) {                                                              \
+               ercd = E_ILUSE;                                                                         \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  その他の不正使用エラーのチェック(E_ILUSE)
+ */
+#define CHECK_ILUSE(exp) {                                                                     \
+       if (!(exp)) {                                                                                   \
+               ercd = E_ILUSE;                                                                         \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  未サポート機能エラーのチェック(E_NOSPT)
+ */
+#define CHECK_NOSPT(exp) {                                                                     \
+       if (!(exp)) {                                                                                   \
+               ercd = E_NOSPT;                                                                         \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#endif /* TOPPERS_CHECK_H */
diff --git a/asp/extension/dcre/kernel/cyclic.c b/asp/extension/dcre/kernel/cyclic.c
new file mode 100644 (file)
index 0000000..8a5f2b3
--- /dev/null
@@ -0,0 +1,407 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: cyclic.c 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ *             周期ハンドラ機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "cyclic.h"
+
+/*
+ *  トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_CYC_ENTER
+#define LOG_CYC_ENTER(p_cyccb)
+#endif /* LOG_CYC_ENTER */
+
+#ifndef LOG_CYC_LEAVE
+#define LOG_CYC_LEAVE(p_cyccb)
+#endif /* LOG_CYC_LEAVE */
+
+#ifndef LOG_ACRE_CYC_ENTER
+#define LOG_ACRE_CYC_ENTER(pk_ccyc)
+#endif /* LOG_ACRE_CYC_ENTER */
+
+#ifndef LOG_ACRE_CYC_LEAVE
+#define LOG_ACRE_CYC_LEAVE(ercd)
+#endif /* LOG_ACRE_CYC_LEAVE */
+
+#ifndef LOG_DEL_CYC_ENTER
+#define LOG_DEL_CYC_ENTER(cycid)
+#endif /* LOG_DEL_CYC_ENTER */
+
+#ifndef LOG_DEL_CYC_LEAVE
+#define LOG_DEL_CYC_LEAVE(ercd)
+#endif /* LOG_DEL_CYC_LEAVE */
+
+#ifndef LOG_STA_CYC_ENTER
+#define LOG_STA_CYC_ENTER(cycid)
+#endif /* LOG_STA_CYC_ENTER */
+
+#ifndef LOG_STA_CYC_LEAVE
+#define LOG_STA_CYC_LEAVE(ercd)
+#endif /* LOG_STA_CYC_LEAVE */
+
+#ifndef LOG_STP_CYC_ENTER
+#define LOG_STP_CYC_ENTER(cycid)
+#endif /* LOG_STP_CYC_ENTER */
+
+#ifndef LOG_STP_CYC_LEAVE
+#define LOG_STP_CYC_LEAVE(ercd)
+#endif /* LOG_STP_CYC_LEAVE */
+
+#ifndef LOG_REF_CYC_ENTER
+#define LOG_REF_CYC_ENTER(cycid, pk_rcyc)
+#endif /* LOG_REF_CYC_ENTER */
+
+#ifndef LOG_REF_CYC_LEAVE
+#define LOG_REF_CYC_LEAVE(ercd, pk_rcyc)
+#endif /* LOG_REF_CYC_LEAVE */
+
+/*
+ *  周期ハンドラの数
+ */
+#define tnum_cyc       ((uint_t)(tmax_cycid - TMIN_CYCID + 1))
+#define tnum_scyc      ((uint_t)(tmax_scycid - TMIN_CYCID + 1))
+
+/*
+ *  周期ハンドラIDから周期ハンドラ管理ブロックを取り出すためのマクロ
+ */
+#define INDEX_CYC(cycid)       ((uint_t)((cycid) - TMIN_CYCID))
+#define get_cyccb(cycid)       (&(cyccb_table[INDEX_CYC(cycid)]))
+
+/*
+ *  周期ハンドラ起動のためのタイムイベントブロックの登録
+ */
+Inline void
+tmevtb_enqueue_cyc(CYCCB *p_cyccb, EVTTIM evttim)
+{
+       tmevtb_enqueue_evttim(&(p_cyccb->tmevtb), evttim,
+                                                               (CBACK) call_cychdr, (void *) p_cyccb);
+       p_cyccb->evttim = evttim;
+}
+
+#ifdef TOPPERS_cycini
+
+/*
+ *  使用していない周期ハンドラ管理ブロックのリスト
+ *
+ *  周期ハンドラ管理ブロックの先頭にはキューにつなぐための領域がないた
+ *  め,タイムイベントブロック(tmevtb)の領域を用いる.
+ */
+QUEUE  free_cyccb;
+
+/*
+ *  周期ハンドラ機能の初期化
+ */
+void
+initialize_cyclic(void)
+{
+       uint_t  i, j;
+       CYCCB   *p_cyccb;
+       CYCINIB *p_cycinib;
+
+       for (p_cyccb = cyccb_table, i = 0; i < tnum_scyc; p_cyccb++, i++) {
+               p_cyccb->p_cycinib = &(cycinib_table[i]);
+               if ((p_cyccb->p_cycinib->cycatr & TA_STA) != 0U) {
+                       p_cyccb->cycsta = true;
+                       tmevtb_enqueue_cyc(p_cyccb, (EVTTIM)(p_cyccb->p_cycinib->cycphs));
+               }
+               else {
+                       p_cyccb->cycsta = false;
+               }
+       }
+       queue_initialize(&free_cyccb);
+       for (j = 0; i < tnum_cyc; p_cyccb++, i++, j++) {
+               p_cycinib = &(acycinib_table[j]);
+               p_cycinib->cycatr = TA_NOEXS;
+               p_cyccb->p_cycinib = ((const CYCINIB *) p_cycinib);
+               queue_insert_prev(&free_cyccb, ((QUEUE *) &(p_cyccb->tmevtb)));
+       }
+}
+
+#endif /* TOPPERS_cycini */
+
+/*
+ *  周期ハンドラの生成
+ */
+#ifdef TOPPERS_acre_cyc
+
+ER_UINT
+acre_cyc(const T_CCYC *pk_ccyc)
+{
+       CYCCB   *p_cyccb;
+       CYCINIB *p_cycinib;
+       ER              ercd;
+
+       LOG_ACRE_CYC_ENTER(pk_ccyc);
+       CHECK_TSKCTX_UNL();
+       CHECK_RSATR(pk_ccyc->cycatr, TA_STA);
+       CHECK_ALIGN_FUNC(pk_ccyc->cychdr);
+       CHECK_NONNULL_FUNC(pk_ccyc->cychdr);
+       CHECK_PAR(0 < pk_ccyc->cyctim && pk_ccyc->cyctim <= TMAX_RELTIM);
+       CHECK_PAR(0 <= pk_ccyc->cycphs && pk_ccyc->cycphs <= TMAX_RELTIM);
+
+       t_lock_cpu();
+       if (queue_empty(&free_cyccb)) {
+               ercd = E_NOID;
+       }
+       else {
+               p_cyccb = ((CYCCB *)(((char *) queue_delete_next(&free_cyccb))
+                                                                                               - offsetof(CYCCB, tmevtb)));
+               p_cycinib = (CYCINIB *)(p_cyccb->p_cycinib);
+               p_cycinib->cycatr = pk_ccyc->cycatr;
+               p_cycinib->exinf = pk_ccyc->exinf;
+               p_cycinib->cychdr = pk_ccyc->cychdr;
+               p_cycinib->cyctim = pk_ccyc->cyctim;
+               p_cycinib->cycphs = pk_ccyc->cycphs;
+
+               if ((p_cyccb->p_cycinib->cycatr & TA_STA) != 0U) {
+                       p_cyccb->cycsta = true;
+                       tmevtb_enqueue_cyc(p_cyccb, (EVTTIM)(p_cyccb->p_cycinib->cycphs));
+               }
+               else {
+                       p_cyccb->cycsta = false;
+               }
+               ercd = CYCID(p_cyccb);
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_ACRE_CYC_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_acre_cyc */
+
+/*
+ *  周期ハンドラの削除
+ */
+#ifdef TOPPERS_del_cyc
+
+ER
+del_cyc(ID cycid)
+{
+       CYCCB   *p_cyccb;
+       CYCINIB *p_cycinib;
+       ER              ercd;
+
+       LOG_DEL_CYC_ENTER(cycid);
+       CHECK_TSKCTX_UNL();
+       CHECK_CYCID(cycid);
+       p_cyccb = get_cyccb(cycid);
+
+       t_lock_cpu();
+       if (p_cyccb->p_cycinib->cycatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (CYCID(p_cyccb) > tmax_scycid) {
+               if (p_cyccb->cycsta) {
+                       p_cyccb->cycsta = false;
+                       tmevtb_dequeue(&(p_cyccb->tmevtb));
+               }
+
+               p_cycinib = (CYCINIB *)(p_cyccb->p_cycinib);
+               p_cycinib->cycatr = TA_NOEXS;
+               queue_insert_prev(&free_cyccb, ((QUEUE *) &(p_cyccb->tmevtb)));
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_OBJ;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_DEL_CYC_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_del_cyc */
+
+/*
+ *  周期ハンドラの動作開始
+ */
+#ifdef TOPPERS_sta_cyc
+
+ER
+sta_cyc(ID cycid)
+{
+       CYCCB   *p_cyccb;
+       ER              ercd;
+
+       LOG_STA_CYC_ENTER(cycid);
+       CHECK_TSKCTX_UNL();
+       CHECK_CYCID(cycid);
+       p_cyccb = get_cyccb(cycid);
+
+       t_lock_cpu();
+       if (p_cyccb->p_cycinib->cycatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (p_cyccb->cycsta) {
+               tmevtb_dequeue(&(p_cyccb->tmevtb));
+       }
+       else {
+               p_cyccb->cycsta = true;
+       }
+       tmevtb_enqueue_cyc(p_cyccb, base_time + p_cyccb->p_cycinib->cycphs);
+       ercd = E_OK;
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_STA_CYC_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_sta_cyc */
+
+/*
+ *  周期ハンドラの動作停止
+ */
+#ifdef TOPPERS_stp_cyc
+
+ER
+stp_cyc(ID cycid)
+{
+       CYCCB   *p_cyccb;
+       ER              ercd;
+
+       LOG_STP_CYC_ENTER(cycid);
+       CHECK_TSKCTX_UNL();
+       CHECK_CYCID(cycid);
+       p_cyccb = get_cyccb(cycid);
+
+       t_lock_cpu();
+       if (p_cyccb->p_cycinib->cycatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (p_cyccb->cycsta) {
+               p_cyccb->cycsta = false;
+               tmevtb_dequeue(&(p_cyccb->tmevtb));
+       }
+       ercd = E_OK;
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_STP_CYC_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_stp_cyc */
+
+/*
+ *  周期ハンドラの状態参照
+ */
+#ifdef TOPPERS_ref_cyc
+
+ER
+ref_cyc(ID cycid, T_RCYC *pk_rcyc)
+{
+       CYCCB   *p_cyccb;
+       ER              ercd;
+    
+       LOG_REF_CYC_ENTER(cycid, pk_rcyc);
+       CHECK_TSKCTX_UNL();
+       CHECK_CYCID(cycid);
+       p_cyccb = get_cyccb(cycid);
+
+       t_lock_cpu();
+       if (p_cyccb->p_cycinib->cycatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else {
+               if (p_cyccb->cycsta) {
+                       pk_rcyc->cycstat = TCYC_STA;
+                       pk_rcyc->lefttim = tmevt_lefttim(&(p_cyccb->tmevtb));
+               }
+               else {
+                       pk_rcyc->cycstat = TCYC_STP;
+               }
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_REF_CYC_LEAVE(ercd, pk_rcyc);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ref_cyc */
+
+/*
+ *  周期ハンドラ起動ルーチン
+ */
+#ifdef TOPPERS_cyccal
+
+void
+call_cychdr(CYCCB *p_cyccb)
+{
+       PRI             saved_ipm;
+
+       /*
+        *  次回の起動のためのタイムイベントブロックを登録する.
+        *
+        *  同じタイムティックで周期ハンドラを再度起動すべき場合には,この
+        *  関数からsignal_timeに戻った後に,再度この関数が呼ばれることにな
+        *  る.
+        */
+       tmevtb_enqueue_cyc(p_cyccb, p_cyccb->evttim + p_cyccb->p_cycinib->cyctim);
+
+       /*
+        *  周期ハンドラを,CPUロック解除状態で呼び出す.
+        */
+       saved_ipm = i_get_ipm();
+       i_unlock_cpu();
+
+       LOG_CYC_ENTER(p_cyccb);
+       (*((CYCHDR)(p_cyccb->p_cycinib->cychdr)))(p_cyccb->p_cycinib->exinf);
+       LOG_CYC_LEAVE(p_cyccb);
+
+       if (!i_sense_lock()) {
+               i_lock_cpu();
+       }
+       i_set_ipm(saved_ipm);
+}
+
+#endif /* TOPPERS_cyccal */
old mode 100755 (executable)
new mode 100644 (file)
similarity index 57%
rename from asp/target/cq_starm_gcc/target_serial.h
rename to asp/extension/dcre/kernel/cyclic.h
index 1f83c46..c9f13e1
@@ -3,7 +3,9 @@
  *      Toyohashi Open Platform for Embedded Real-Time Systems/
  *      Advanced Standard Profile Kernel
  * 
- *  Copyright (C) 2007 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
+ *  @(#) $Id: cyclic.h 1966 2010-11-20 07:23:56Z ertl-hiro $
  */
 
 /*
- *  シリアルI/Oデバイス(SIO)ドライバ(CQ-STARM用)
+ *             周期ハンドラ機能
  */
 
-#ifndef TOPPERS_TARGET_SERIAL_H
-#define TOPPERS_TARGET_SERIAL_H
+#ifndef TOPPERS_CYCLIC_H
+#define TOPPERS_CYCLIC_H
 
-#include "cq_starm.h"
+#include <queue.h>
+#include "time_event.h"
 
 /*
- *  SIOの割込みベクタ番号
+ *  周期ハンドラ初期化ブロック
  */
-#if (SIO_PORTID == 1)
-#define INHNO_SIO              IRQ_VECTOR_USART1
-#define INTNO_SIO              IRQ_VECTOR_USART1
-#elif (SIO_PORID == 2)
-#define INHNO_SIO              IRQ_VECTOR_USART2
-#define INTNO_SIO              IRQ_VECTOR_USART2
-#endif
-#define INTPRI_SIO             -3                              /* 割込み優先度 */
-#define INTATR_SIO             0                               /* 割込み属性 */
+typedef struct cyclic_handler_initialization_block {
+       ATR                     cycatr;                 /* 周期ハンドラ属性 */
+       intptr_t        exinf;                  /* 周期ハンドラの拡張情報 */
+       CYCHDR          cychdr;                 /* 周期ハンドラの起動番地 */
+       RELTIM          cyctim;                 /* 周期ハンドラの起動周期 */
+       RELTIM          cycphs;                 /* 周期ハンドラの起動位相 */
+} CYCINIB;
 
 /*
- *  コールバックルーチンの識別番号
+ *  周期ハンドラ管理ブロック
  */
-#define SIO_RDY_SND    1U        /* 送信可能コールバック */
-#define SIO_RDY_RCV    2U        /* 受信通知コールバック */
-
-#ifndef TOPPERS_MACRO_ONLY
-
-/*
- *  シリアルポートの管理ブロック
- */
-typedef struct sio_port_control_block {
-       ID port;
-       uint32_t reg;
-       intptr_t exinf;
-} SIOPCB;
-
-/*
- *  SIO初期化
- */
-extern void sio_initialize(intptr_t exinf);
-
-/*
- *  シリアルオープン
- */
-extern SIOPCB *sio_opn_por(ID siopid, intptr_t exinf);
+typedef struct cyclic_handler_control_block {
+       const CYCINIB *p_cycinib;       /* 初期化ブロックへのポインタ */
+       bool_t          cycsta;                 /* 周期ハンドラの動作状態 */
+       EVTTIM          evttim;                 /* 次に周期ハンドラを起動する時刻 */
+       TMEVTB          tmevtb;                 /* タイムイベントブロック */
+} CYCCB;
 
 /*
- *  シリアルクローズ
+ *  使用していない周期ハンドラ管理ブロックのリスト
  */
-extern void sio_cls_por(SIOPCB *p_siopcb);
+extern QUEUE   free_cyccb;
 
 /*
- *  å\89²è¾¼ã\81¿ã\83\8fã\83³ã\83\89ã\83©
+ *  å\91¨æ\9c\9fã\83\8fã\83³ã\83\89ã\83©IDã\81®æ\9c\80大å\80¤ï¼\88kernel_cfg.cï¼\89
  */
-extern void sio_isr(intptr_t exinf);
+extern const ID        tmax_cycid;
+extern const ID        tmax_scycid;
 
 /*
- *  1文字送信
- */
-extern bool_t sio_snd_chr(SIOPCB *siopcb, char_t c);
-
-/*
- *  1文字受信
- */
-extern int_t sio_rcv_chr(SIOPCB *siopcb);
-
-/*
- *  コールバックの許可
- */
-extern void sio_ena_cbr(SIOPCB *siopcb, uint_t cbrtn);
-
-/* 
- *  コールバックの禁止
+ *  周期ハンドラ初期化ブロックのエリア(kernel_cfg.c)
  */
-extern void sio_dis_cbr(SIOPCB *siopcb, uint_t cbrtn);
+extern const CYCINIB   cycinib_table[];
+extern CYCINIB                 acycinib_table[];
 
 /*
- *  送信可能コールバック
+ *  周期ハンドラ管理ブロックのエリア(kernel_cfg.c)
  */
-extern void sio_irdy_snd(intptr_t exinf);
+extern CYCCB   cyccb_table[];
 
 /*
- *  å\8f\97ä¿¡é\80\9aç\9f¥ã\82³ã\83¼ã\83«ã\83\90ã\83\83ã\82¯
+ *  å\91¨æ\9c\9fã\83\8fã\83³ã\83\89ã\83©ç®¡ç\90\86ã\83\96ã\83­ã\83\83ã\82¯ã\81\8bã\82\89å\91¨æ\9c\9fã\83\8fã\83³ã\83\89ã\83©IDã\82\92å\8f\96ã\82\8aå\87ºã\81\99ã\81\9fã\82\81ã\81®ã\83\9eã\82¯ã\83­
  */
-extern void sio_irdy_rcv(intptr_t exinf);
+#define        CYCID(p_cyccb)  ((ID)(((p_cyccb) - cyccb_table) + TMIN_CYCID))
 
 /*
- *  1文字送信(ポーリングでの出力)
+ *  周期ハンドラ機能の初期化
  */
-extern void sio_pol_snd_chr(char_t c, ID siopid);
+extern void    initialize_cyclic(void);
 
 /*
- *  ターゲットのシリアル初期化
+ *  周期ハンドラ起動ルーチン
  */
-extern void target_usart_init(ID siopid);
+extern void    call_cychdr(CYCCB *p_cyccb);
 
-#endif /* TOPPERS_MACRO_ONLY */
-#endif /* TOPPERS_TARGET_SERIAL_H */
+#endif /* TOPPERS_CYCLIC_H */
diff --git a/asp/extension/dcre/kernel/dataqueue.c b/asp/extension/dcre/kernel/dataqueue.c
new file mode 100644 (file)
index 0000000..1bf42e9
--- /dev/null
@@ -0,0 +1,882 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: dataqueue.c 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ *             データキュー機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "wait.h"
+#include "dataqueue.h"
+
+/*
+ *  トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_ACRE_DTQ_ENTER
+#define LOG_ACRE_DTQ_ENTER(pk_cdtq)
+#endif /* LOG_ACRE_DTQ_ENTER */
+
+#ifndef LOG_ACRE_DTQ_LEAVE
+#define LOG_ACRE_DTQ_LEAVE(ercd)
+#endif /* LOG_ACRE_DTQ_LEAVE */
+
+#ifndef LOG_DEL_DTQ_ENTER
+#define LOG_DEL_DTQ_ENTER(dtqid)
+#endif /* LOG_DEL_DTQ_ENTER */
+
+#ifndef LOG_DEL_DTQ_LEAVE
+#define LOG_DEL_DTQ_LEAVE(ercd)
+#endif /* LOG_DEL_DTQ_LEAVE */
+
+#ifndef LOG_SND_DTQ_ENTER
+#define LOG_SND_DTQ_ENTER(dtqid, data)
+#endif /* LOG_SND_DTQ_ENTER */
+
+#ifndef LOG_SND_DTQ_LEAVE
+#define LOG_SND_DTQ_LEAVE(ercd)
+#endif /* LOG_SND_DTQ_LEAVE */
+
+#ifndef LOG_PSND_DTQ_ENTER
+#define LOG_PSND_DTQ_ENTER(dtqid, data)
+#endif /* LOG_PSND_DTQ_ENTER */
+
+#ifndef LOG_PSND_DTQ_LEAVE
+#define LOG_PSND_DTQ_LEAVE(ercd)
+#endif /* LOG_PSND_DTQ_LEAVE */
+
+#ifndef LOG_IPSND_DTQ_ENTER
+#define LOG_IPSND_DTQ_ENTER(dtqid, data)
+#endif /* LOG_IPSND_DTQ_ENTER */
+
+#ifndef LOG_IPSND_DTQ_LEAVE
+#define LOG_IPSND_DTQ_LEAVE(ercd)
+#endif /* LOG_IPSND_DTQ_LEAVE */
+
+#ifndef LOG_TSND_DTQ_ENTER
+#define LOG_TSND_DTQ_ENTER(dtqid, data, tmout)
+#endif /* LOG_TSND_DTQ_ENTER */
+
+#ifndef LOG_TSND_DTQ_LEAVE
+#define LOG_TSND_DTQ_LEAVE(ercd)
+#endif /* LOG_TSND_DTQ_LEAVE */
+
+#ifndef LOG_FSND_DTQ_ENTER
+#define LOG_FSND_DTQ_ENTER(dtqid, data)
+#endif /* LOG_FSND_DTQ_ENTER */
+
+#ifndef LOG_FSND_DTQ_LEAVE
+#define LOG_FSND_DTQ_LEAVE(ercd)
+#endif /* LOG_FSND_DTQ_LEAVE */
+
+#ifndef LOG_IFSND_DTQ_ENTER
+#define LOG_IFSND_DTQ_ENTER(dtqid, data)
+#endif /* LOG_IFSND_DTQ_ENTER */
+
+#ifndef LOG_IFSND_DTQ_LEAVE
+#define LOG_IFSND_DTQ_LEAVE(ercd)
+#endif /* LOG_IFSND_DTQ_LEAVE */
+
+#ifndef LOG_RCV_DTQ_ENTER
+#define LOG_RCV_DTQ_ENTER(dtqid, p_data)
+#endif /* LOG_RCV_DTQ_ENTER */
+
+#ifndef LOG_RCV_DTQ_LEAVE
+#define LOG_RCV_DTQ_LEAVE(ercd, data)
+#endif /* LOG_RCV_DTQ_LEAVE */
+
+#ifndef LOG_PRCV_DTQ_ENTER
+#define LOG_PRCV_DTQ_ENTER(dtqid, p_data)
+#endif /* LOG_PRCV_DTQ_ENTER */
+
+#ifndef LOG_PRCV_DTQ_LEAVE
+#define LOG_PRCV_DTQ_LEAVE(ercd, data)
+#endif /* LOG_PRCV_DTQ_LEAVE */
+
+#ifndef LOG_TRCV_DTQ_ENTER
+#define LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout)
+#endif /* LOG_TRCV_DTQ_ENTER */
+
+#ifndef LOG_TRCV_DTQ_LEAVE
+#define LOG_TRCV_DTQ_LEAVE(ercd, data)
+#endif /* LOG_TRCV_DTQ_LEAVE */
+
+#ifndef LOG_INI_DTQ_ENTER
+#define LOG_INI_DTQ_ENTER(dtqid)
+#endif /* LOG_INI_DTQ_ENTER */
+
+#ifndef LOG_INI_DTQ_LEAVE
+#define LOG_INI_DTQ_LEAVE(ercd)
+#endif /* LOG_INI_DTQ_LEAVE */
+
+#ifndef LOG_REF_DTQ_ENTER
+#define LOG_REF_DTQ_ENTER(dtqid, pk_rdtq)
+#endif /* LOG_REF_DTQ_ENTER */
+
+#ifndef LOG_REF_DTQ_LEAVE
+#define LOG_REF_DTQ_LEAVE(ercd, pk_rdtq)
+#endif /* LOG_REF_DTQ_LEAVE */
+
+/*
+ *  データキューの数
+ */
+#define tnum_dtq       ((uint_t)(tmax_dtqid - TMIN_DTQID + 1))
+#define tnum_sdtq      ((uint_t)(tmax_sdtqid - TMIN_DTQID + 1))
+
+/*
+ *  データキューIDからデータキュー管理ブロックを取り出すためのマクロ
+ */
+#define INDEX_DTQ(dtqid)       ((uint_t)((dtqid) - TMIN_DTQID))
+#define get_dtqcb(dtqid)       (&(dtqcb_table[INDEX_DTQ(dtqid)]))
+
+#ifdef TOPPERS_dtqini
+
+/*
+ *  使用していないデータキュー管理ブロックのリスト
+ */
+QUEUE  free_dtqcb;
+
+/*
+ *  データキュー機能の初期化
+ */
+void
+initialize_dataqueue(void)
+{
+       uint_t  i, j;
+       DTQCB   *p_dtqcb;
+       DTQINIB *p_dtqinib;
+
+       for (p_dtqcb = dtqcb_table, i = 0; i < tnum_sdtq; p_dtqcb++, i++) {
+               queue_initialize(&(p_dtqcb->swait_queue));
+               p_dtqcb->p_dtqinib = &(dtqinib_table[i]);
+               queue_initialize(&(p_dtqcb->rwait_queue));
+               p_dtqcb->count = 0U;
+               p_dtqcb->head = 0U;
+               p_dtqcb->tail = 0U;
+       }
+       queue_initialize(&free_dtqcb);
+       for (j = 0; i < tnum_dtq; p_dtqcb++, i++, j++) {
+               p_dtqinib = &(adtqinib_table[j]);
+               p_dtqinib->dtqatr = TA_NOEXS;
+               p_dtqcb->p_dtqinib = ((const DTQINIB *) p_dtqinib);
+               queue_insert_prev(&free_dtqcb, &(p_dtqcb->swait_queue));
+       }
+}
+
+#endif /* TOPPERS_dtqini */
+
+/*
+ *  データキューの生成
+ */
+#ifdef TOPPERS_acre_dtq
+
+ER_UINT
+acre_dtq(const T_CDTQ *pk_cdtq)
+{
+       DTQCB           *p_dtqcb;
+       DTQINIB         *p_dtqinib;
+       ATR                     dtqatr;
+       DTQMB           *p_dtqmb;
+       ER                      ercd;
+
+       LOG_ACRE_DTQ_ENTER(pk_cdtq);
+       CHECK_TSKCTX_UNL();
+       CHECK_RSATR(pk_cdtq->dtqatr, TA_TPRI);
+       dtqatr = pk_cdtq->dtqatr;
+       p_dtqmb = pk_cdtq->dtqmb;
+
+       t_lock_cpu();
+       if (queue_empty(&free_dtqcb)) {
+               ercd = E_NOID;
+       }
+       else {
+               if (pk_cdtq->dtqcnt != 0 && p_dtqmb == NULL) {
+                       p_dtqmb = kernel_malloc(sizeof(DTQMB) * pk_cdtq->dtqcnt);
+                       dtqatr |= TA_MBALLOC;
+               }
+               if (pk_cdtq->dtqcnt != 0 && p_dtqmb == NULL) {
+                       ercd = E_NOMEM;
+               }
+               else {
+                       p_dtqcb = ((DTQCB *) queue_delete_next(&free_dtqcb));
+                       p_dtqinib = (DTQINIB *)(p_dtqcb->p_dtqinib);
+                       p_dtqinib->dtqatr = dtqatr;
+                       p_dtqinib->dtqcnt = pk_cdtq->dtqcnt;
+                       p_dtqinib->p_dtqmb = p_dtqmb;
+
+                       queue_initialize(&(p_dtqcb->swait_queue));
+                       queue_initialize(&(p_dtqcb->rwait_queue));
+                       p_dtqcb->count = 0U;
+                       p_dtqcb->head = 0U;
+                       p_dtqcb->tail = 0U;
+                       ercd = DTQID(p_dtqcb);
+               }
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_ACRE_DTQ_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_acre_dtq */
+
+/*
+ *  データキューの削除
+ */
+#ifdef TOPPERS_del_dtq
+
+ER
+del_dtq(ID dtqid)
+{
+       DTQCB   *p_dtqcb;
+       DTQINIB *p_dtqinib;
+       bool_t  dspreq;
+       ER              ercd;
+
+       LOG_DEL_DTQ_ENTER(dtqid);
+       CHECK_TSKCTX_UNL();
+       CHECK_DTQID(dtqid);
+       p_dtqcb = get_dtqcb(dtqid);
+
+       t_lock_cpu();
+       if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (DTQID(p_dtqcb) > tmax_sdtqid) {
+               dspreq = init_wait_queue(&(p_dtqcb->swait_queue));
+               if (init_wait_queue(&(p_dtqcb->rwait_queue))) {
+                       dspreq = true;
+               }
+               p_dtqinib = (DTQINIB *)(p_dtqcb->p_dtqinib);
+               if ((p_dtqinib->dtqatr & TA_MBALLOC) != 0U) {
+                       kernel_free(p_dtqinib->p_dtqmb);
+               }
+               p_dtqinib->dtqatr = TA_NOEXS;
+               queue_insert_prev(&free_dtqcb, &(p_dtqcb->swait_queue));
+               if (dspreq) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_OBJ;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_DEL_DTQ_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_del_dtq */
+
+/*
+ *  データキュー管理領域へのデータの格納
+ */
+#ifdef TOPPERS_dtqenq
+
+void
+enqueue_data(DTQCB *p_dtqcb, intptr_t data)
+{
+       (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail)->data = data;
+       p_dtqcb->count++;
+       p_dtqcb->tail++;
+       if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
+               p_dtqcb->tail = 0U;
+       }
+}
+
+#endif /* TOPPERS_dtqenq */
+
+/*
+ *  データキュー管理領域へのデータの強制格納
+ */
+#ifdef TOPPERS_dtqfenq
+
+void
+force_enqueue_data(DTQCB *p_dtqcb, intptr_t data)
+{
+       (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail)->data = data;
+       p_dtqcb->tail++;
+       if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
+               p_dtqcb->tail = 0U;
+       }
+       if (p_dtqcb->count < p_dtqcb->p_dtqinib->dtqcnt) {
+               p_dtqcb->count++;
+       }
+       else {
+               p_dtqcb->head = p_dtqcb->tail;
+       }
+}
+
+#endif /* TOPPERS_dtqfenq */
+
+/*
+ *  データキュー管理領域からのデータの取出し
+ */
+#ifdef TOPPERS_dtqdeq
+
+void
+dequeue_data(DTQCB *p_dtqcb, intptr_t *p_data)
+{
+       *p_data = (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->head)->data;
+       p_dtqcb->count--;
+       p_dtqcb->head++;
+       if (p_dtqcb->head >= p_dtqcb->p_dtqinib->dtqcnt) {
+               p_dtqcb->head = 0U;
+       }
+}
+
+#endif /* TOPPERS_dtqdeq */
+
+/*
+ *  データキューへのデータ送信
+ */
+#ifdef TOPPERS_dtqsnd
+
+bool_t
+send_data(DTQCB *p_dtqcb, intptr_t data, bool_t *p_reqdsp)
+{
+       TCB             *p_tcb;
+
+       if (!queue_empty(&(p_dtqcb->rwait_queue))) {
+               p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue));
+               ((WINFO_DTQ *)(p_tcb->p_winfo))->data = data;
+               *p_reqdsp = wait_complete(p_tcb);
+               return(true);
+       }
+       else if (p_dtqcb->count < p_dtqcb->p_dtqinib->dtqcnt) {
+               enqueue_data(p_dtqcb, data);
+               *p_reqdsp = false;
+               return(true);
+       }
+       else {
+               return(false);
+       }
+}
+
+#endif /* TOPPERS_dtqsnd */
+
+/*
+ *  データキューへのデータ強制送信
+ */
+#ifdef TOPPERS_dtqfsnd
+
+bool_t
+force_send_data(DTQCB *p_dtqcb, intptr_t data)
+{
+       TCB             *p_tcb;
+
+       if (!queue_empty(&(p_dtqcb->rwait_queue))) {
+               p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue));
+               ((WINFO_DTQ *)(p_tcb->p_winfo))->data = data;
+               return(wait_complete(p_tcb));
+       }
+       else {
+               force_enqueue_data(p_dtqcb, data);
+               return(false);
+       }
+}
+
+#endif /* TOPPERS_dtqfsnd */
+
+/*
+ *  送信待ちキューの先頭タスクからのデータ受信
+ */
+#ifdef TOPPERS_dtqrcv
+
+bool_t
+receive_data(DTQCB *p_dtqcb, intptr_t *p_data, bool_t *p_reqdsp)
+{
+       TCB             *p_tcb;
+       intptr_t data;
+
+       if (p_dtqcb->count > 0U) {
+               dequeue_data(p_dtqcb, p_data);
+               if (!queue_empty(&(p_dtqcb->swait_queue))) {
+                       p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
+                       data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data;
+                       enqueue_data(p_dtqcb, data);
+                       *p_reqdsp = wait_complete(p_tcb);
+               }
+               else {
+                       *p_reqdsp = false;
+               }
+               return(true);
+       }
+       else if (!queue_empty(&(p_dtqcb->swait_queue))) {
+               p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
+               *p_data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data;
+               *p_reqdsp = wait_complete(p_tcb);
+               return(true);
+       }
+       else {
+               return(false);
+       }
+}
+
+#endif /* TOPPERS_dtqrcv */
+
+/*
+ *  データキューへの送信
+ */
+#ifdef TOPPERS_snd_dtq
+
+ER
+snd_dtq(ID dtqid, intptr_t data)
+{
+       DTQCB   *p_dtqcb;
+       WINFO_DTQ winfo_dtq;
+       bool_t  reqdsp;
+       ER              ercd;
+
+       LOG_SND_DTQ_ENTER(dtqid, data);
+       CHECK_DISPATCH();
+       CHECK_DTQID(dtqid);
+       p_dtqcb = get_dtqcb(dtqid);
+
+       t_lock_cpu();
+       if (send_data(p_dtqcb, data, &reqdsp)) {
+               if (reqdsp) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else {
+               winfo_dtq.data = data;
+               p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ);
+               wobj_make_wait((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq);
+               dispatch();
+               ercd = winfo_dtq.winfo.wercd;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_SND_DTQ_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_snd_dtq */
+
+/*
+ *  データキューへの送信(ポーリング)
+ */
+#ifdef TOPPERS_psnd_dtq
+
+ER
+psnd_dtq(ID dtqid, intptr_t data)
+{
+       DTQCB   *p_dtqcb;
+       bool_t  reqdsp;
+       ER              ercd;
+
+       LOG_PSND_DTQ_ENTER(dtqid, data);
+       CHECK_TSKCTX_UNL();
+       CHECK_DTQID(dtqid);
+       p_dtqcb = get_dtqcb(dtqid);
+
+       t_lock_cpu();
+       if (send_data(p_dtqcb, data, &reqdsp)) {
+               if (reqdsp) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_TMOUT;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_PSND_DTQ_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_psnd_dtq */
+
+/*
+ *  データキューへの送信(ポーリング,非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_ipsnd_dtq
+
+ER
+ipsnd_dtq(ID dtqid, intptr_t data)
+{
+       DTQCB   *p_dtqcb;
+       bool_t  reqdsp;
+       ER              ercd;
+
+       LOG_IPSND_DTQ_ENTER(dtqid, data);
+       CHECK_INTCTX_UNL();
+       CHECK_DTQID(dtqid);
+       p_dtqcb = get_dtqcb(dtqid);
+
+       i_lock_cpu();
+       if (send_data(p_dtqcb, data, &reqdsp)) {
+               if (reqdsp) {
+                       reqflg = true;
+               }
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_TMOUT;
+       }
+       i_unlock_cpu();
+
+  error_exit:
+       LOG_IPSND_DTQ_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ipsnd_dtq */
+
+/*
+ *  データキューへの送信(タイムアウトあり)
+ */
+#ifdef TOPPERS_tsnd_dtq
+
+ER
+tsnd_dtq(ID dtqid, intptr_t data, TMO tmout)
+{
+       DTQCB   *p_dtqcb;
+       WINFO_DTQ winfo_dtq;
+       TMEVTB  tmevtb;
+       bool_t  reqdsp;
+       ER              ercd;
+
+       LOG_TSND_DTQ_ENTER(dtqid, data, tmout);
+       CHECK_DISPATCH();
+       CHECK_DTQID(dtqid);
+       CHECK_TMOUT(tmout);
+       p_dtqcb = get_dtqcb(dtqid);
+
+       t_lock_cpu();
+       if (send_data(p_dtqcb, data, &reqdsp)) {
+               if (reqdsp) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else if (tmout == TMO_POL) {
+               ercd = E_TMOUT;
+       }
+       else {
+               winfo_dtq.data = data;
+               p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ);
+               wobj_make_wait_tmout((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq,
+                                                                                                               &tmevtb, tmout);
+               dispatch();
+               ercd = winfo_dtq.winfo.wercd;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_TSND_DTQ_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_tsnd_dtq */
+
+/*
+ *  データキューへの強制送信
+ */
+#ifdef TOPPERS_fsnd_dtq
+
+ER
+fsnd_dtq(ID dtqid, intptr_t data)
+{
+       DTQCB   *p_dtqcb;       
+       ER              ercd;
+
+       LOG_FSND_DTQ_ENTER(dtqid, data);
+       CHECK_TSKCTX_UNL();
+       CHECK_DTQID(dtqid);
+       p_dtqcb = get_dtqcb(dtqid);
+       CHECK_ILUSE(p_dtqcb->p_dtqinib->dtqcnt > 0U);
+
+       t_lock_cpu();
+       if (force_send_data(p_dtqcb, data)) {
+               dispatch();
+       }
+       ercd = E_OK;
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_FSND_DTQ_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_fsnd_dtq */
+
+/*
+ *  データキューへの強制送信(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_ifsnd_dtq
+
+ER
+ifsnd_dtq(ID dtqid, intptr_t data)
+{
+       DTQCB   *p_dtqcb;
+       ER              ercd;
+
+       LOG_IFSND_DTQ_ENTER(dtqid, data);
+       CHECK_INTCTX_UNL();
+       CHECK_DTQID(dtqid);
+       p_dtqcb = get_dtqcb(dtqid);
+       CHECK_ILUSE(p_dtqcb->p_dtqinib->dtqcnt > 0U);
+
+       i_lock_cpu();
+       if (force_send_data(p_dtqcb, data)) {
+               reqflg = true;
+       }
+       ercd = E_OK;
+       i_unlock_cpu();
+
+  error_exit:
+       LOG_IFSND_DTQ_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ifsnd_dtq */
+
+/*
+ *  データキューからの受信
+ */
+#ifdef TOPPERS_rcv_dtq
+
+ER
+rcv_dtq(ID dtqid, intptr_t *p_data)
+{
+       DTQCB   *p_dtqcb;
+       WINFO_DTQ winfo_dtq;
+       bool_t  reqdsp;
+       ER              ercd;
+
+       LOG_RCV_DTQ_ENTER(dtqid, p_data);
+       CHECK_DISPATCH();
+       CHECK_DTQID(dtqid);
+       p_dtqcb = get_dtqcb(dtqid);
+
+       t_lock_cpu();
+       if (receive_data(p_dtqcb, p_data, &reqdsp)) {
+               if (reqdsp) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else {
+               p_runtsk->tstat = (TS_WAITING | TS_WAIT_RDTQ);
+               make_wait(&(winfo_dtq.winfo));
+               queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
+               winfo_dtq.p_dtqcb = p_dtqcb;
+               LOG_TSKSTAT(p_runtsk);
+               dispatch();
+               ercd = winfo_dtq.winfo.wercd;
+               if (ercd == E_OK) {
+                       *p_data = winfo_dtq.data;
+               }
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_RCV_DTQ_LEAVE(ercd, *p_data);
+       return(ercd);
+}
+
+#endif /* TOPPERS_rcv_dtq */
+
+/*
+ *  データキューからの受信(ポーリング)
+ */
+#ifdef TOPPERS_prcv_dtq
+
+ER
+prcv_dtq(ID dtqid, intptr_t *p_data)
+{
+       DTQCB   *p_dtqcb;
+       bool_t  reqdsp;
+       ER              ercd;
+
+       LOG_PRCV_DTQ_ENTER(dtqid, p_data);
+       CHECK_TSKCTX_UNL();
+       CHECK_DTQID(dtqid);
+       p_dtqcb = get_dtqcb(dtqid);
+
+       t_lock_cpu();
+       if (receive_data(p_dtqcb, p_data, &reqdsp)) {
+               if (reqdsp) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_TMOUT;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_PRCV_DTQ_LEAVE(ercd, *p_data);
+       return(ercd);
+}
+
+#endif /* TOPPERS_prcv_dtq */
+
+/*
+ *  データキューからの受信(タイムアウトあり)
+ */
+#ifdef TOPPERS_trcv_dtq
+
+ER
+trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout)
+{
+       DTQCB   *p_dtqcb;
+       WINFO_DTQ winfo_dtq;
+       TMEVTB  tmevtb;
+       bool_t  reqdsp;
+       ER              ercd;
+
+       LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout);
+       CHECK_DISPATCH();
+       CHECK_DTQID(dtqid);
+       CHECK_TMOUT(tmout);
+       p_dtqcb = get_dtqcb(dtqid);
+
+       t_lock_cpu();
+       if (receive_data(p_dtqcb, p_data, &reqdsp)) {
+               if (reqdsp) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else if (tmout == TMO_POL) {
+               ercd = E_TMOUT;
+       }
+       else {
+               p_runtsk->tstat = (TS_WAITING | TS_WAIT_RDTQ);
+               make_wait_tmout(&(winfo_dtq.winfo), &tmevtb, tmout);
+               queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
+               winfo_dtq.p_dtqcb = p_dtqcb;
+               LOG_TSKSTAT(p_runtsk);
+               dispatch();
+               ercd = winfo_dtq.winfo.wercd;
+               if (ercd == E_OK) {
+                       *p_data = winfo_dtq.data;
+               }
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_TRCV_DTQ_LEAVE(ercd, *p_data);
+       return(ercd);
+}
+
+#endif /* TOPPERS_trcv_dtq */
+
+/*
+ *  データキューの再初期化
+ */
+#ifdef TOPPERS_ini_dtq
+
+ER
+ini_dtq(ID dtqid)
+{
+       DTQCB   *p_dtqcb;
+       bool_t  dspreq;
+       ER              ercd;
+    
+       LOG_INI_DTQ_ENTER(dtqid);
+       CHECK_TSKCTX_UNL();
+       CHECK_DTQID(dtqid);
+       p_dtqcb = get_dtqcb(dtqid);
+
+       t_lock_cpu();
+       dspreq = init_wait_queue(&(p_dtqcb->swait_queue));
+       if (init_wait_queue(&(p_dtqcb->rwait_queue))) {
+               dspreq = true;
+       };
+       p_dtqcb->count = 0U;
+       p_dtqcb->head = 0U;
+       p_dtqcb->tail = 0U;
+       if (dspreq) {
+               dispatch();
+       }
+       ercd = E_OK;
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_INI_DTQ_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ini_dtq */
+
+/*
+ *  データキューの状態参照
+ */
+#ifdef TOPPERS_ref_dtq
+
+ER
+ref_dtq(ID dtqid, T_RDTQ *pk_rdtq)
+{
+       DTQCB   *p_dtqcb;
+       ER              ercd;
+    
+       LOG_REF_DTQ_ENTER(dtqid, pk_rdtq);
+       CHECK_TSKCTX_UNL();
+       CHECK_DTQID(dtqid);
+       p_dtqcb = get_dtqcb(dtqid);
+
+       t_lock_cpu();
+       pk_rdtq->stskid = wait_tskid(&(p_dtqcb->swait_queue));
+       pk_rdtq->rtskid = wait_tskid(&(p_dtqcb->rwait_queue));
+       pk_rdtq->sdtqcnt = p_dtqcb->count;
+       ercd = E_OK;
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_REF_DTQ_LEAVE(ercd, pk_rdtq);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ref_dtq */
diff --git a/asp/extension/dcre/kernel/dataqueue.h b/asp/extension/dcre/kernel/dataqueue.h
new file mode 100644 (file)
index 0000000..f95e9b8
--- /dev/null
@@ -0,0 +1,166 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: dataqueue.h 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ *             データキュー機能
+ */
+
+#ifndef TOPPERS_DATAQUEUE_H
+#define TOPPERS_DATAQUEUE_H
+
+#include <queue.h>
+
+/*
+ *  データ管理ブロック
+ */
+typedef struct data_management_block {
+       intptr_t        data;                   /* データ本体 */
+} DTQMB;
+
+/*
+ *  データキュー初期化ブロック
+ *
+ *  この構造体は,同期・通信オブジェクトの初期化ブロックの共通部分
+ *  (WOBJINIB)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ *  最初のフィールドが共通になっている.
+ */
+typedef struct dataqueue_initialization_block {
+       ATR                     dtqatr;                 /* データキュー属性 */
+       uint_t          dtqcnt;                 /* データキューの容量 */
+       DTQMB           *p_dtqmb;               /* データキュー管理領域の先頭番地 */
+} DTQINIB;
+
+/*
+ *  データキュー管理ブロック
+ *
+ *  この構造体は,同期・通信オブジェクトの管理ブロックの共通部分(WOBJCB)
+ *  を拡張(オブジェクト指向言語の継承に相当)したもので,最初の2つの
+ *  フィールドが共通になっている.
+ */
+typedef struct dataqueue_control_block {
+       QUEUE           swait_queue;    /* データキュー送信待ちキュー */
+       const DTQINIB *p_dtqinib;       /* 初期化ブロックへのポインタ */
+       QUEUE           rwait_queue;    /* データキュー受信待ちキュー */
+       uint_t          count;                  /* データキュー中のデータの数 */
+       uint_t          head;                   /* 最初のデータの格納場所 */
+       uint_t          tail;                   /* 最後のデータの格納場所の次 */
+} DTQCB;
+
+/*
+ *  データキュー待ち情報ブロックの定義
+ *
+ *  この構造体は,同期・通信オブジェクトの待ち情報ブロックの共通部分
+ *  (WINFO_WOBJ)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ *  最初の2つのフィールドが共通になっている.
+ *  データキューへの送信待ちとデータキューからの受信待ちで,同じ待ち情
+ *  報ブロックを使う.
+ */
+typedef struct dataqueue_waiting_information {
+       WINFO           winfo;                  /* 標準の待ち情報ブロック */
+       DTQCB           *p_dtqcb;               /* 待っているデータキューの管理ブロック */
+       intptr_t        data;                   /* 送受信データ */
+} WINFO_DTQ;
+
+/*
+ *  使用していないデータキュー管理ブロックのリスト
+ */
+extern QUEUE   free_dtqcb;
+
+/*
+ *  データキューIDの最大値(kernel_cfg.c)
+ */
+extern const ID        tmax_dtqid;
+extern const ID        tmax_sdtqid;
+
+/*
+ *  データキュー初期化ブロックのエリア(kernel_cfg.c)
+ */
+extern const DTQINIB   dtqinib_table[];
+extern DTQINIB                 adtqinib_table[];
+
+/*
+ *  データキュー管理ブロックのエリア(kernel_cfg.c)
+ */
+extern DTQCB   dtqcb_table[];
+
+/*
+ *  データキュー管理ブロックからデータキューIDを取り出すためのマクロ
+ */
+#define        DTQID(p_dtqcb)  ((ID)(((p_dtqcb) - dtqcb_table) + TMIN_DTQID))
+
+/*
+ *  データキュー機能の初期化
+ */
+extern void    initialize_dataqueue(void);
+
+/*
+ *  データキュー管理領域へのデータの格納
+ */
+extern void    enqueue_data(DTQCB *p_dtqcb, intptr_t data);
+
+/*
+ *  データキュー管理領域へのデータの強制格納
+ */
+extern void    force_enqueue_data(DTQCB *p_dtqcb, intptr_t data);
+
+/*
+ *  データキュー管理領域からのデータの取出し
+ */
+extern void    dequeue_data(DTQCB *p_dtqcb, intptr_t *p_data);
+
+/*
+ *  データキューへのデータ送信
+ */
+extern bool_t  send_data(DTQCB *p_dtqcb, intptr_t data, bool_t *p_reqdsp);
+
+/*
+ *  データキューへのデータ強制送信
+ */
+extern bool_t  force_send_data(DTQCB *p_dtqcb, intptr_t data);
+
+/*
+ *  データキューからのデータ受信
+ */
+extern bool_t  receive_data(DTQCB *p_dtqcb, intptr_t *p_data,
+                                                                                                       bool_t *p_reqdsp);
+
+#endif /* TOPPERS_DATAQUEUE_H */
diff --git a/asp/extension/dcre/kernel/eventflag.c b/asp/extension/dcre/kernel/eventflag.c
new file mode 100644 (file)
index 0000000..2a40508
--- /dev/null
@@ -0,0 +1,643 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: eventflag.c 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ *             イベントフラグ機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "wait.h"
+#include "eventflag.h"
+
+/*
+ *  トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_ACRE_FLG_ENTER
+#define LOG_ACRE_FLG_ENTER(pk_cflg)
+#endif /* LOG_ACRE_FLG_ENTER */
+
+#ifndef LOG_ACRE_FLG_LEAVE
+#define LOG_ACRE_FLG_LEAVE(ercd)
+#endif /* LOG_ACRE_FLG_LEAVE */
+
+#ifndef LOG_DEL_FLG_ENTER
+#define LOG_DEL_FLG_ENTER(flgid)
+#endif /* LOG_DEL_FLG_ENTER */
+
+#ifndef LOG_DEL_FLG_LEAVE
+#define LOG_DEL_FLG_LEAVE(ercd)
+#endif /* LOG_DEL_FLG_LEAVE */
+
+#ifndef LOG_SET_FLG_ENTER
+#define LOG_SET_FLG_ENTER(flgid, setptn)
+#endif /* LOG_SET_FLG_ENTER */
+
+#ifndef LOG_SET_FLG_LEAVE
+#define LOG_SET_FLG_LEAVE(ercd)
+#endif /* LOG_SET_FLG_LEAVE */
+
+#ifndef LOG_ISET_FLG_ENTER
+#define LOG_ISET_FLG_ENTER(flgid, setptn)
+#endif /* LOG_ISET_FLG_ENTER */
+
+#ifndef LOG_ISET_FLG_LEAVE
+#define LOG_ISET_FLG_LEAVE(ercd)
+#endif /* LOG_ISET_FLG_LEAVE */
+
+#ifndef LOG_CLR_FLG_ENTER
+#define LOG_CLR_FLG_ENTER(flgid, clrptn)
+#endif /* LOG_CLR_FLG_ENTER */
+
+#ifndef LOG_CLR_FLG_LEAVE
+#define LOG_CLR_FLG_LEAVE(ercd)
+#endif /* LOG_CLR_FLG_LEAVE */
+
+#ifndef LOG_WAI_FLG_ENTER
+#define LOG_WAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn)
+#endif /* LOG_WAI_FLG_ENTER */
+
+#ifndef LOG_WAI_FLG_LEAVE
+#define LOG_WAI_FLG_LEAVE(ercd, flgptn)
+#endif /* LOG_WAI_FLG_LEAVE */
+
+#ifndef LOG_POL_FLG_ENTER
+#define LOG_POL_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn)
+#endif /* LOG_POL_FLG_ENTER */
+
+#ifndef LOG_POL_FLG_LEAVE
+#define LOG_POL_FLG_LEAVE(ercd, flgptn)
+#endif /* LOG_POL_FLG_LEAVE */
+
+#ifndef LOG_TWAI_FLG_ENTER
+#define LOG_TWAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn, tmout)
+#endif /* LOG_TWAI_FLG_ENTER */
+
+#ifndef LOG_TWAI_FLG_LEAVE
+#define LOG_TWAI_FLG_LEAVE(ercd, flgptn)
+#endif /* LOG_TWAI_FLG_LEAVE */
+
+#ifndef LOG_INI_FLG_ENTER
+#define LOG_INI_FLG_ENTER(flgid)
+#endif /* LOG_INI_FLG_ENTER */
+
+#ifndef LOG_INI_FLG_LEAVE
+#define LOG_INI_FLG_LEAVE(ercd)
+#endif /* LOG_INI_FLG_LEAVE */
+
+#ifndef LOG_REF_FLG_ENTER
+#define LOG_REF_FLG_ENTER(flgid, pk_rflg)
+#endif /* LOG_REF_FLG_ENTER */
+
+#ifndef LOG_REF_FLG_LEAVE
+#define LOG_REF_FLG_LEAVE(ercd, pk_rflg)
+#endif /* LOG_REF_FLG_LEAVE */
+
+/*
+ *  イベントフラグの数
+ */
+#define tnum_flg       ((uint_t)(tmax_flgid - TMIN_FLGID + 1))
+#define tnum_sflg      ((uint_t)(tmax_sflgid - TMIN_FLGID + 1))
+
+/*
+ *  イベントフラグIDからイベントフラグ管理ブロックを取り出すためのマクロ
+ */
+#define INDEX_FLG(flgid)       ((uint_t)((flgid) - TMIN_FLGID))
+#define get_flgcb(flgid)       (&(flgcb_table[INDEX_FLG(flgid)]))
+
+#ifdef TOPPERS_flgini
+
+/*
+ *  使用していないイベントフラグ管理ブロックのリスト
+ */
+QUEUE  free_flgcb;
+
+/*
+ *  イベントフラグ機能の初期化
+ */
+void
+initialize_eventflag(void)
+{
+       uint_t  i, j;
+       FLGCB   *p_flgcb;
+       FLGINIB *p_flginib;
+
+       for (p_flgcb = flgcb_table, i = 0; i < tnum_sflg; p_flgcb++, i++) {
+               queue_initialize(&(p_flgcb->wait_queue));
+               p_flgcb->p_flginib = &(flginib_table[i]);
+               p_flgcb->flgptn = p_flgcb->p_flginib->iflgptn;
+       }
+       queue_initialize(&free_flgcb);
+       for (j = 0; i < tnum_flg; p_flgcb++, i++, j++) {
+               p_flginib = &(aflginib_table[j]);
+               p_flginib->flgatr = TA_NOEXS;
+               p_flgcb->p_flginib = ((const FLGINIB *) p_flginib);
+               queue_insert_prev(&free_flgcb, &(p_flgcb->wait_queue));
+       }
+}
+
+#endif /* TOPPERS_flgini */
+
+/*
+ *  イベントフラグの生成
+ */
+#ifdef TOPPERS_acre_flg
+
+ER_UINT
+acre_flg(const T_CFLG *pk_cflg)
+{
+       FLGCB   *p_flgcb;
+       FLGINIB *p_flginib;
+       ER              ercd;
+
+       LOG_ACRE_FLG_ENTER(pk_cflg);
+       CHECK_TSKCTX_UNL();
+       CHECK_RSATR(pk_cflg->flgatr, TA_TPRI|TA_WMUL|TA_CLR);
+
+       t_lock_cpu();
+       if (queue_empty(&free_flgcb)) {
+               ercd = E_NOID;
+       }
+       else {
+               p_flgcb = ((FLGCB *) queue_delete_next(&free_flgcb));
+               p_flginib = (FLGINIB *)(p_flgcb->p_flginib);
+               p_flginib->flgatr = pk_cflg->flgatr;
+               p_flginib->iflgptn = pk_cflg->iflgptn;
+
+               queue_initialize(&(p_flgcb->wait_queue));
+               p_flgcb->flgptn = p_flgcb->p_flginib->iflgptn;
+               ercd = FLGID(p_flgcb);
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_ACRE_FLG_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_acre_flg */
+
+/*
+ *  イベントフラグの削除
+ */
+#ifdef TOPPERS_del_flg
+
+ER
+del_flg(ID flgid)
+{
+       FLGCB   *p_flgcb;
+       FLGINIB *p_flginib;
+       bool_t  dspreq;
+       ER              ercd;
+
+       LOG_DEL_FLG_ENTER(flgid);
+       CHECK_TSKCTX_UNL();
+       CHECK_FLGID(flgid);
+       p_flgcb = get_flgcb(flgid);
+
+       t_lock_cpu();
+       if (p_flgcb->p_flginib->flgatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (FLGID(p_flgcb) > tmax_sflgid) {
+               dspreq = init_wait_queue(&(p_flgcb->wait_queue));
+               p_flginib = (FLGINIB *)(p_flgcb->p_flginib);
+               p_flginib->flgatr = TA_NOEXS;
+               queue_insert_prev(&free_flgcb, &(p_flgcb->wait_queue));
+               if (dspreq) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_OBJ;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_DEL_FLG_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_del_flg */
+
+/*
+ *  イベントフラグ待ち解除条件のチェック
+ */
+#ifdef TOPPERS_flgcnd
+
+bool_t
+check_flg_cond(FLGCB *p_flgcb, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
+{
+       if ((wfmode & TWF_ORW) != 0U ? (p_flgcb->flgptn & waiptn) != 0U
+                                                                       : (p_flgcb->flgptn & waiptn) == waiptn) {
+               *p_flgptn = p_flgcb->flgptn;
+               if ((p_flgcb->p_flginib->flgatr & TA_CLR) != 0U) {
+                       p_flgcb->flgptn = 0U;
+               }
+               return(true);
+       }
+       return(false);
+}
+
+#endif /* TOPPERS_flgcnd */
+
+/*
+ *  イベントフラグのセット
+ */
+#ifdef TOPPERS_set_flg
+
+ER
+set_flg(ID flgid, FLGPTN setptn)
+{
+       FLGCB   *p_flgcb;
+       QUEUE   *p_queue;
+       TCB             *p_tcb;
+       WINFO_FLG *p_winfo_flg;
+       bool_t  dspreq = false;
+       ER              ercd;
+
+       LOG_SET_FLG_ENTER(flgid, setptn);
+       CHECK_TSKCTX_UNL();
+       CHECK_FLGID(flgid);
+       p_flgcb = get_flgcb(flgid);
+
+       t_lock_cpu();
+       if (p_flgcb->p_flginib->flgatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else {
+               p_flgcb->flgptn |= setptn;
+               p_queue = p_flgcb->wait_queue.p_next;
+               while (p_queue != &(p_flgcb->wait_queue)) {
+                       p_tcb = (TCB *) p_queue;
+                       p_queue = p_queue->p_next;
+                       p_winfo_flg = (WINFO_FLG *)(p_tcb->p_winfo);
+                       if (check_flg_cond(p_flgcb, p_winfo_flg->waiptn,
+                                                       p_winfo_flg->wfmode, &(p_winfo_flg->flgptn))) {
+                               queue_delete(&(p_tcb->task_queue));
+                               if (wait_complete(p_tcb)) {
+                                       dspreq = true;
+                               }
+                               if ((p_flgcb->p_flginib->flgatr & TA_CLR) != 0U) {
+                                       break;
+                               }
+                       }
+               }
+               if (dspreq) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_SET_FLG_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_set_flg */
+
+/*
+ *  イベントフラグのセット(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_iset_flg
+
+ER
+iset_flg(ID flgid, FLGPTN setptn)
+{
+       FLGCB   *p_flgcb;
+       QUEUE   *p_queue;
+       TCB             *p_tcb;
+       WINFO_FLG *p_winfo_flg;
+       ER              ercd;
+
+       LOG_ISET_FLG_ENTER(flgid, setptn);
+       CHECK_INTCTX_UNL();
+       CHECK_FLGID(flgid);
+       p_flgcb = get_flgcb(flgid);
+
+       i_lock_cpu();
+       if (p_flgcb->p_flginib->flgatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else {
+               p_flgcb->flgptn |= setptn;
+               p_queue = p_flgcb->wait_queue.p_next;
+               while (p_queue != &(p_flgcb->wait_queue)) {
+                       p_tcb = (TCB *) p_queue;
+                       p_queue = p_queue->p_next;
+                       p_winfo_flg = (WINFO_FLG *)(p_tcb->p_winfo);
+                       if (check_flg_cond(p_flgcb, p_winfo_flg->waiptn,
+                                                       p_winfo_flg->wfmode, &(p_winfo_flg->flgptn))) {
+                               queue_delete(&(p_tcb->task_queue));
+                               if (wait_complete(p_tcb)) {
+                                       reqflg = true;
+                               }
+                               if ((p_flgcb->p_flginib->flgatr & TA_CLR) != 0U) {
+                                       break;
+                               }
+                       }
+               }
+               ercd = E_OK;
+       }
+       i_unlock_cpu();
+
+  error_exit:
+       LOG_ISET_FLG_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_iset_flg */
+
+/*
+ *  イベントフラグのクリア
+ */
+#ifdef TOPPERS_clr_flg
+
+ER
+clr_flg(ID flgid, FLGPTN clrptn)
+{
+       FLGCB   *p_flgcb;
+       ER              ercd;
+
+       LOG_CLR_FLG_ENTER(flgid, clrptn);
+       CHECK_TSKCTX_UNL();
+       CHECK_FLGID(flgid);
+       p_flgcb = get_flgcb(flgid);
+
+       t_lock_cpu();
+       if (p_flgcb->p_flginib->flgatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else {
+               p_flgcb->flgptn &= clrptn; 
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_CLR_FLG_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_clr_flg */
+
+/*
+ *  イベントフラグ待ち
+ */
+#ifdef TOPPERS_wai_flg
+
+ER
+wai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
+{
+       FLGCB   *p_flgcb;
+       WINFO_FLG winfo_flg;
+       ER              ercd;
+
+       LOG_WAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn);
+       CHECK_DISPATCH();
+       CHECK_FLGID(flgid);
+       CHECK_PAR(waiptn != 0U);
+       CHECK_PAR(wfmode == TWF_ORW || wfmode == TWF_ANDW);
+       p_flgcb = get_flgcb(flgid);
+
+       t_lock_cpu();
+       if (p_flgcb->p_flginib->flgatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if ((p_flgcb->p_flginib->flgatr & TA_WMUL) == 0U
+                                       && !queue_empty(&(p_flgcb->wait_queue))) {
+               ercd = E_ILUSE;
+       }
+       else if (check_flg_cond(p_flgcb, waiptn, wfmode, p_flgptn)) {
+               ercd = E_OK;
+       }
+       else {
+               winfo_flg.waiptn = waiptn;
+               winfo_flg.wfmode = wfmode;
+               p_runtsk->tstat = (TS_WAITING | TS_WAIT_FLG);
+               wobj_make_wait((WOBJCB *) p_flgcb, (WINFO_WOBJ *) &winfo_flg);
+               dispatch();
+               ercd = winfo_flg.winfo.wercd;
+               if (ercd == E_OK) {
+                       *p_flgptn = winfo_flg.flgptn;
+               }
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_WAI_FLG_LEAVE(ercd, *p_flgptn);
+       return(ercd);
+}
+
+#endif /* TOPPERS_wai_flg */
+
+/*
+ *  イベントフラグ待ち(ポーリング)
+ */
+#ifdef TOPPERS_pol_flg
+
+ER
+pol_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
+{
+       FLGCB   *p_flgcb;
+       ER              ercd;
+
+       LOG_POL_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn);
+       CHECK_TSKCTX_UNL();
+       CHECK_FLGID(flgid);
+       CHECK_PAR(waiptn != 0U);
+       CHECK_PAR(wfmode == TWF_ORW || wfmode == TWF_ANDW);
+       p_flgcb = get_flgcb(flgid);
+
+       t_lock_cpu();
+       if (p_flgcb->p_flginib->flgatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if ((p_flgcb->p_flginib->flgatr & TA_WMUL) == 0U
+                                       && !queue_empty(&(p_flgcb->wait_queue))) {
+               ercd = E_ILUSE;
+       }
+       else if (check_flg_cond(p_flgcb, waiptn, wfmode, p_flgptn)) {
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_TMOUT;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_POL_FLG_LEAVE(ercd, *p_flgptn);
+       return(ercd);
+}
+
+#endif /* TOPPERS_pol_flg */
+
+/*
+ *  イベントフラグ待ち(タイムアウトあり)
+ */
+#ifdef TOPPERS_twai_flg
+
+ER
+twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout)
+{
+       FLGCB   *p_flgcb;
+       WINFO_FLG winfo_flg;
+       TMEVTB  tmevtb;
+       ER              ercd;
+
+       LOG_TWAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn, tmout);
+       CHECK_DISPATCH();
+       CHECK_FLGID(flgid);
+       CHECK_PAR(waiptn != 0U);
+       CHECK_PAR(wfmode == TWF_ORW || wfmode == TWF_ANDW);
+       CHECK_TMOUT(tmout);
+       p_flgcb = get_flgcb(flgid);
+
+       t_lock_cpu();
+       if (p_flgcb->p_flginib->flgatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if ((p_flgcb->p_flginib->flgatr & TA_WMUL) == 0U
+                                       && !queue_empty(&(p_flgcb->wait_queue))) {
+               ercd = E_ILUSE;
+       }
+       else if (check_flg_cond(p_flgcb, waiptn, wfmode, p_flgptn)) {
+               ercd = E_OK;
+       }
+       else if (tmout == TMO_POL) {
+               ercd = E_TMOUT;
+       }
+       else {
+               winfo_flg.waiptn = waiptn;
+               winfo_flg.wfmode = wfmode;
+               p_runtsk->tstat = (TS_WAITING | TS_WAIT_FLG);
+               wobj_make_wait_tmout((WOBJCB *) p_flgcb, (WINFO_WOBJ *) &winfo_flg,
+                                                                                                               &tmevtb, tmout);
+               dispatch();
+               ercd = winfo_flg.winfo.wercd;
+               if (ercd == E_OK) {
+                       *p_flgptn = winfo_flg.flgptn;
+               }
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_TWAI_FLG_LEAVE(ercd, *p_flgptn);
+       return(ercd);
+}
+
+#endif /* TOPPERS_twai_flg */
+
+/*
+ *  イベントフラグの再初期化
+ */
+#ifdef TOPPERS_ini_flg
+
+ER
+ini_flg(ID flgid)
+{
+       FLGCB   *p_flgcb;
+       bool_t  dspreq;
+       ER              ercd;
+    
+       LOG_INI_FLG_ENTER(flgid);
+       CHECK_TSKCTX_UNL();
+       CHECK_FLGID(flgid);
+       p_flgcb = get_flgcb(flgid);
+
+       t_lock_cpu();
+       if (p_flgcb->p_flginib->flgatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else {
+               dspreq = init_wait_queue(&(p_flgcb->wait_queue));
+               p_flgcb->flgptn = p_flgcb->p_flginib->iflgptn;
+               if (dspreq) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_INI_FLG_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ini_flg */
+
+/*
+ *  イベントフラグの状態参照
+ */
+#ifdef TOPPERS_ref_flg
+
+ER
+ref_flg(ID flgid, T_RFLG *pk_rflg)
+{
+       FLGCB   *p_flgcb;
+       ER              ercd;
+    
+       LOG_REF_FLG_ENTER(flgid, pk_rflg);
+       CHECK_TSKCTX_UNL();
+       CHECK_FLGID(flgid);
+       p_flgcb = get_flgcb(flgid);
+
+       t_lock_cpu();
+       if (p_flgcb->p_flginib->flgatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else {
+               pk_rflg->wtskid = wait_tskid(&(p_flgcb->wait_queue));
+               pk_rflg->flgptn = p_flgcb->flgptn;
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_REF_FLG_LEAVE(ercd, pk_rflg);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ref_flg */
diff --git a/asp/extension/dcre/kernel/eventflag.h b/asp/extension/dcre/kernel/eventflag.h
new file mode 100644 (file)
index 0000000..682122c
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: eventflag.h 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ *             イベントフラグ機能
+ */
+
+#ifndef TOPPERS_EVENTFLAG_H
+#define TOPPERS_EVENTFLAG_H
+
+#include <queue.h>
+
+/*
+ *  イベントフラグ初期化ブロック
+ *
+ *  この構造体は,同期・通信オブジェクトの初期化ブロックの共通部分
+ *  (WOBJINIB)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ *  最初のフィールドが共通になっている.
+ */
+typedef struct eventflag_initialization_block {
+       ATR                     flgatr;                 /* イベントフラグ属性 */
+       FLGPTN          iflgptn;                /* イベントフラグのビットパターンの初期値 */
+} FLGINIB;
+
+/*
+ *  イベントフラグ管理ブロック
+ *
+ *  この構造体は,同期・通信オブジェクトの管理ブロックの共通部分(WOBJCB)
+ *  を拡張(オブジェクト指向言語の継承に相当)したもので,最初の2つの
+ *  フィールドが共通になっている.
+ */
+typedef struct eventflag_control_block {
+       QUEUE           wait_queue;             /* イベントフラグ待ちキュー */
+       const FLGINIB *p_flginib;       /* 初期化ブロックへのポインタ */
+       FLGPTN          flgptn;                 /* イベントフラグ現在パターン */
+} FLGCB;
+
+/*
+ *  イベントフラグ待ち情報ブロックの定義
+ *
+ *  この構造体は,同期・通信オブジェクトの待ち情報ブロックの共通部分
+ *  (WINFO_WOBJ)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ *  最初の2つのフィールドが共通になっている.
+ *
+ *  flgptnは,waiptnおよびwfmodeと同時に使うことはないため,共用体を使
+ *  えばメモリを節約することが可能である.
+ */
+typedef struct eventflag_waiting_information {
+       WINFO           winfo;                  /* 標準の待ち情報ブロック */
+       FLGCB           *p_flgcb;               /* 待っているイベントフラグの管理ブロック */
+       FLGPTN          waiptn;                 /* 待ちパターン */
+       MODE            wfmode;                 /* 待ちモード */
+       FLGPTN          flgptn;                 /* 待ち解除時のパターン */
+} WINFO_FLG;
+
+/*
+ *  使用していないイベントフラグ管理ブロックのリスト
+ */
+extern QUEUE   free_flgcb;
+
+/*
+ *  イベントフラグIDの最大値(kernel_cfg.c)
+ */
+extern const ID        tmax_flgid;
+extern const ID        tmax_sflgid;
+
+/*
+ *  イベントフラグ初期化ブロックのエリア(kernel_cfg.c)
+ */
+extern const FLGINIB   flginib_table[];
+extern FLGINIB                 aflginib_table[];
+
+/*
+ *  イベントフラグ管理ブロックのエリア(kernel_cfg.c)
+ */
+extern FLGCB   flgcb_table[];
+
+/*
+ *  イベントフラグ管理ブロックからイベントフラグIDを取り出すためのマクロ
+ */
+#define        FLGID(p_flgcb)  ((ID)(((p_flgcb) - flgcb_table) + TMIN_FLGID))
+
+/*
+ *  イベントフラグ機能の初期化
+ */
+extern void    initialize_eventflag(void);
+
+/*
+ *  イベントフラグ待ち解除条件のチェック
+ */
+extern bool_t  check_flg_cond(FLGCB *p_flgcb, FLGPTN waiptn,
+                                                               MODE wfmode, FLGPTN *p_flgptn);
+
+#endif /* TOPPERS_EVENTFLAG_H */
diff --git a/asp/extension/dcre/kernel/interrupt.c b/asp/extension/dcre/kernel/interrupt.c
new file mode 100644 (file)
index 0000000..7c75d8a
--- /dev/null
@@ -0,0 +1,489 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: interrupt.c 2018 2010-12-31 13:43:05Z ertl-hiro $
+ */
+
+/*
+ *             割込み管理機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "interrupt.h"
+
+/*
+ *  トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_ISR_ENTER
+#define LOG_ISR_ENTER(intno)
+#endif /* LOG_ISR_ENTER */
+
+#ifndef LOG_ISR_LEAVE
+#define LOG_ISR_LEAVE(intno)
+#endif /* LOG_ISR_LEAVE */
+
+#ifndef LOG_ACRE_ISR_ENTER
+#define LOG_ACRE_ISR_ENTER(pk_cisr)
+#endif /* LOG_ACRE_ISR_ENTER */
+
+#ifndef LOG_ACRE_ISR_LEAVE
+#define LOG_ACRE_ISR_LEAVE(ercd)
+#endif /* LOG_ACRE_ISR_LEAVE */
+
+#ifndef LOG_DEL_ISR_ENTER
+#define LOG_DEL_ISR_ENTER(isrid)
+#endif /* LOG_DEL_ISR_ENTER */
+
+#ifndef LOG_DEL_ISR_LEAVE
+#define LOG_DEL_ISR_LEAVE(ercd)
+#endif /* LOG_DEL_ISR_LEAVE */
+
+#ifndef LOG_DIS_INT_ENTER
+#define LOG_DIS_INT_ENTER(intno)
+#endif /* LOG_DIS_INT_ENTER */
+
+#ifndef LOG_DIS_INT_LEAVE
+#define LOG_DIS_INT_LEAVE(ercd)
+#endif /* LOG_DIS_INT_LEAVE */
+
+#ifndef LOG_ENA_INT_ENTER
+#define LOG_ENA_INT_ENTER(intno)
+#endif /* LOG_ENA_INT_ENTER */
+
+#ifndef LOG_ENA_INT_LEAVE
+#define LOG_ENA_INT_LEAVE(ercd)
+#endif /* LOG_ENA_INT_LEAVE */
+
+#ifndef LOG_CHG_IPM_ENTER
+#define LOG_CHG_IPM_ENTER(intpri)
+#endif /* LOG_CHG_IPM_ENTER */
+
+#ifndef LOG_CHG_IPM_LEAVE
+#define LOG_CHG_IPM_LEAVE(ercd)
+#endif /* LOG_CHG_IPM_LEAVE */
+
+#ifndef LOG_GET_IPM_ENTER
+#define LOG_GET_IPM_ENTER(p_intpri)
+#endif /* LOG_GET_IPM_ENTER */
+
+#ifndef LOG_GET_IPM_LEAVE
+#define LOG_GET_IPM_LEAVE(ercd, intpri)
+#endif /* LOG_GET_IPM_LEAVE */
+
+/*
+ *  割込みサービスルーチンの数
+ */
+#define tnum_isr       ((uint_t)(tmax_isrid - TMIN_SEMID + 1) + tnum_sisr)
+
+/*
+ *  割込みサービスルーチンIDから割込みサービスルーチン管理ブロックを取
+ *  り出すためのマクロ
+ */
+#define INDEX_ISR(isrid)       ((uint_t)((isrid) - TMIN_ISRID) + tnum_sisr)
+#define get_isrcb(isrid)       (&(isrcb_table[INDEX_ISR(isrid)]))
+
+/*
+ *  割込みサービスルーチンキューへの登録
+ */
+Inline void
+enqueue_isr(QUEUE *p_isr_queue, ISRCB *p_isrcb)
+{
+       QUEUE   *p_entry;
+       PRI             isrpri = p_isrcb->p_isrinib->isrpri;
+
+       for (p_entry = p_isr_queue->p_next; p_entry != p_isr_queue;
+                                                                                       p_entry = p_entry->p_next) {
+               if (isrpri < ((ISRCB *) p_entry)->p_isrinib->isrpri) {
+                       break;
+               }
+       }
+       queue_insert_prev(p_entry, &(p_isrcb->isr_queue));
+}
+
+#ifdef TOPPERS_isrini
+
+/*
+ *  使用していない割込みサービスルーチン管理ブロックのリスト
+ */
+QUEUE  free_isrcb;
+
+/* 
+ *  割込みサービスルーチン機能の初期化
+ */
+void
+initialize_isr(void)
+{
+       uint_t  i, j;
+       ISRCB   *p_isrcb;
+       ISRINIB *p_isrinib;
+
+       for (i = 0; i < tnum_isr_queue; i++) {
+               queue_initialize(&(isr_queue_table[i]));
+       }
+       for (p_isrcb = isrcb_table, i = 0; i < tnum_sisr; p_isrcb++, i++) {
+               p_isrcb->p_isrinib = &(sisrinib_table[i]);
+               enqueue_isr(p_isrcb->p_isrinib->p_isr_queue, p_isrcb);
+       }
+       queue_initialize(&free_isrcb);
+       for (j = 0; i < tnum_isr; p_isrcb++, i++, j++) {
+               p_isrinib = &(aisrinib_table[j]);
+               p_isrinib->isratr = TA_NOEXS;
+               p_isrcb->p_isrinib = ((const ISRINIB *) p_isrinib);
+               queue_insert_prev(&free_isrcb, &(p_isrcb->isr_queue));
+       }
+}
+
+#endif /* TOPPERS_isrini */
+
+/*
+ *  割込みサービスルーチンの呼出し
+ */
+#ifdef TOPPERS_isrcal
+
+void
+call_isr(QUEUE *p_isr_queue)
+{
+       QUEUE   *p_queue;
+       ISRINIB *p_isrinib;
+       PRI             saved_ipm;
+
+       saved_ipm = i_get_ipm();
+       for (p_queue = p_isr_queue->p_next; p_queue != p_isr_queue;
+                                                                                       p_queue = p_queue->p_next) {
+               p_isrinib = (ISRINIB *)(((ISRCB *) p_queue)->p_isrinib);
+               LOG_ISR_ENTER(p_isrinib->intno);
+               (*(p_isrinib->isr))(p_isrinib->exinf);
+               LOG_ISR_LEAVE(p_isrinib->intno);
+
+               if (p_queue->p_next != p_isr_queue) {
+                       /* ISRの呼出し前の状態に戻す */
+                       if (i_sense_lock()) {
+                               i_unlock_cpu();
+                       }
+                       i_set_ipm(saved_ipm);
+               }
+       }
+}
+
+#endif /* TOPPERS_isrcal */
+
+/*
+ *  割込みサービスルーチン呼出しキューの検索
+ */
+Inline QUEUE *
+search_isr_queue(INTNO intno)
+{
+       int_t   left, right, i;
+
+       if (tnum_isr_queue == 0) {
+               return(NULL);
+       }
+
+       left = 0;
+       right = tnum_isr_queue - 1;
+       while (left < right) {
+               i = (left + right + 1) / 2;
+               if (intno < isr_queue_list[i].intno) {
+                       right = i - 1;
+               }
+               else {
+                       left = i;
+               }
+       }
+       if (isr_queue_list[left].intno == intno) {
+               return(isr_queue_list[left].p_isr_queue);
+       }
+       else {
+               return(NULL);
+       }
+}
+
+/*
+ *  割込みサービスルーチンの生成
+ */
+#ifdef TOPPERS_acre_isr
+
+ER_UINT
+acre_isr(const T_CISR *pk_cisr)
+{
+       ISRCB   *p_isrcb;
+       ISRINIB *p_isrinib;
+       QUEUE   *p_isr_queue;
+       ER              ercd;
+
+       LOG_ACRE_ISR_ENTER(pk_cisr);
+       CHECK_TSKCTX_UNL();
+       CHECK_RSATR(pk_cisr->isratr, TARGET_ISRATR);
+       CHECK_INTNO_CREISR(pk_cisr->intno);
+       CHECK_ALIGN_FUNC(pk_cisr->isr);
+       CHECK_NONNULL_FUNC(pk_cisr->isr);
+       CHECK_ISRPRI(pk_cisr->isrpri);
+
+       p_isr_queue = search_isr_queue(pk_cisr->intno);
+       CHECK_PAR(p_isr_queue != NULL);
+
+       t_lock_cpu();
+       if (queue_empty(&free_isrcb)) {
+               ercd = E_NOID;
+       }
+       else {
+               p_isrcb = ((ISRCB *) queue_delete_next(&free_isrcb));
+               p_isrinib = (ISRINIB *)(p_isrcb->p_isrinib);
+               p_isrinib->isratr = pk_cisr->isratr;
+               p_isrinib->exinf = pk_cisr->exinf;
+               p_isrinib->intno = pk_cisr->intno;
+               p_isrinib->p_isr_queue = p_isr_queue;
+               p_isrinib->isr = pk_cisr->isr;
+               p_isrinib->isrpri = pk_cisr->isrpri;
+               enqueue_isr(p_isr_queue, p_isrcb);
+               ercd = ISRID(p_isrcb);
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_ACRE_ISR_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_acre_isr */
+
+/*
+ *  割込みサービスルーチンの削除
+ */
+#ifdef TOPPERS_del_isr
+
+ER
+del_isr(ID isrid)
+{
+       ISRCB   *p_isrcb;
+       ISRINIB *p_isrinib;
+       ER              ercd;
+
+       LOG_DEL_ISR_ENTER(isrid);
+       CHECK_TSKCTX_UNL();
+       CHECK_ISRID(isrid);
+       p_isrcb = get_isrcb(isrid);
+
+       t_lock_cpu();
+       if (p_isrcb->p_isrinib->isratr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else {
+               queue_delete(&(p_isrcb->isr_queue));
+               p_isrinib = (ISRINIB *)(p_isrcb->p_isrinib);
+               p_isrinib->isratr = TA_NOEXS;
+               queue_insert_prev(&free_isrcb, &(p_isrcb->isr_queue));
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_DEL_ISR_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_del_isr */
+
+/* 
+ *  割込み管理機能の初期化
+ */
+#ifdef TOPPERS_intini
+#ifndef OMIT_INITIALIZE_INTERRUPT
+
+void
+initialize_interrupt(void)
+{
+       uint_t                  i;
+       const INHINIB   *p_inhinib;
+       const INTINIB   *p_intinib;
+
+       for (p_inhinib = inhinib_table, i = 0; i < tnum_inhno; p_inhinib++, i++) {
+               x_define_inh(p_inhinib->inhno, p_inhinib->int_entry);
+       }
+       for (p_intinib = intinib_table, i = 0; i < tnum_intno; p_intinib++, i++) {
+               x_config_int(p_intinib->intno, p_intinib->intatr, p_intinib->intpri);
+       }
+}
+
+#endif /* OMIT_INITIALIZE_INTERRUPT */
+#endif /* TOPPERS_intini */
+
+/*
+ *  割込みの禁止
+ */
+#ifdef TOPPERS_dis_int
+#ifdef TOPPERS_SUPPORT_DIS_INT
+
+ER
+dis_int(INTNO intno)
+{
+       bool_t  locked;
+       ER              ercd;
+
+       LOG_DIS_INT_ENTER(intno);
+       CHECK_TSKCTX();
+       CHECK_INTNO_DISINT(intno);
+
+       locked = t_sense_lock();
+       if (!locked) {
+               t_lock_cpu();
+       }
+       if (t_disable_int(intno)) {
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_OBJ;
+       }
+       if (!locked) {
+               t_unlock_cpu();
+       }
+
+  error_exit:
+       LOG_DIS_INT_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_SUPPORT_DIS_INT */
+#endif /* TOPPERS_dis_int */
+
+/*
+ *  割込みの許可
+ */
+#ifdef TOPPERS_ena_int
+#ifdef TOPPERS_SUPPORT_ENA_INT
+
+ER
+ena_int(INTNO intno)
+{
+       bool_t  locked;
+       ER              ercd;
+
+       LOG_ENA_INT_ENTER(intno);
+       CHECK_TSKCTX();
+       CHECK_INTNO_DISINT(intno);
+
+       locked = t_sense_lock();
+       if (!locked) {
+               t_lock_cpu();
+       }
+       if (t_enable_int(intno)) {
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_OBJ;
+       }
+       if (!locked) {
+               t_unlock_cpu();
+       }
+
+  error_exit:
+       LOG_ENA_INT_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_SUPPORT_ENA_INT */
+#endif /* TOPPERS_ena_int */
+
+/*
+ *  割込み優先度マスクの変更
+ */
+#ifdef TOPPERS_chg_ipm
+
+ER
+chg_ipm(PRI intpri)
+{
+       ER              ercd;
+
+       LOG_CHG_IPM_ENTER(intpri);
+       CHECK_TSKCTX_UNL();
+       CHECK_INTPRI_CHGIPM(intpri);
+
+       t_lock_cpu();
+       t_set_ipm(intpri);
+       if (intpri == TIPM_ENAALL) {
+               ipmflg = true;
+               if (!disdsp) {
+                       dspflg = true;
+                       if (p_runtsk != p_schedtsk) {
+                               dispatch();
+                       }
+               }
+               if (p_runtsk->enatex && p_runtsk->texptn != 0U) {
+                       call_texrtn();
+               }
+       }
+       else {
+               ipmflg = false;
+               dspflg = false;
+       }
+       ercd = E_OK;
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_CHG_IPM_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_chg_ipm */
+
+/*
+ *  割込み優先度マスクの参照
+ */
+#ifdef TOPPERS_get_ipm
+
+ER
+get_ipm(PRI *p_intpri)
+{
+       ER              ercd;
+
+       LOG_GET_IPM_ENTER(p_intpri);
+       CHECK_TSKCTX_UNL();
+
+       t_lock_cpu();
+       *p_intpri = t_get_ipm();
+       ercd = E_OK;
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_GET_IPM_LEAVE(ercd, *p_intpri);
+       return(ercd);
+}
+
+#endif /* TOPPERS_get_ipm */
diff --git a/asp/extension/dcre/kernel/interrupt.h b/asp/extension/dcre/kernel/interrupt.h
new file mode 100644 (file)
index 0000000..ca514ee
--- /dev/null
@@ -0,0 +1,184 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: interrupt.h 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ *             割込み管理機能
+ */
+
+#ifndef TOPPERS_INTERRUPT_H
+#define TOPPERS_INTERRUPT_H
+
+/*
+ *  割込みサービスルーチン初期化ブロック
+ */
+typedef struct isr_initialization_block {
+       ATR                     isratr;                 /* 割込みサービスルーチン属性 */
+       intptr_t        exinf;                  /* 割込みサービスルーチンの拡張情報 */
+       INTNO           intno;                  /* 割込みサービスルーチンを登録する割込み番号 */
+       QUEUE           *p_isr_queue;   /* 登録先割込みサービスルーチンキューの番地 */
+       ISR                     isr;                    /* 割込みサービスルーチンの先頭番地 */
+       PRI                     isrpri;                 /* 割込みサービスルーチン優先度 */
+} ISRINIB;
+
+/*
+ *  割込みサービスルーチン管理ブロック
+ */
+typedef struct isr_control_block {
+       QUEUE           isr_queue;              /* 割込みサービスルーチン呼出しキュー */
+       const ISRINIB *p_isrinib;       /* 初期化ブロックへのポインタ */
+} ISRCB;
+
+/*
+ *  割込みサービスルーチン呼出しキューを検索するためのデータ構造
+ */
+typedef struct {
+       INTNO           intno;                  /* 割込み番号 */
+       QUEUE           *p_isr_queue;   /* 割込みサービスルーチン呼出しキュー */
+} ISR_ENTRY;
+
+/*
+ *  割込みサービスルーチンキューのエントリ数(kernel_cfg.c)
+ */
+extern const uint_t tnum_isr_queue;
+
+/*
+ *  割込みサービスルーチンキューリスト(kernel_cfg.c)
+ */
+extern const ISR_ENTRY isr_queue_list[];
+
+/*
+ *  割込みサービスルーチンキューのエリア(kernel_cfg.c)
+ */
+extern QUEUE isr_queue_table[];
+
+/*
+ *  使用していない割込みサービスルーチン管理ブロックのリスト
+ */
+extern QUEUE   free_isrcb;
+
+/*
+ *  割込みサービスルーチンIDの最大値(kernel_cfg.c)
+ *
+ *  静的に生成される割込みサービスルーチンはID番号を持たないため,
+ *  tmax_isridは動的に生成される割込みサービスルーチンのID番号の最大値
+ *  である.静的に生成される割込みサービスルーチンの数は,tnum_sisrに保
+ *  持する.
+ */
+extern const ID                tmax_isrid;
+extern const uint_t    tnum_sisr;
+
+/*
+ *  割込みサービスルーチン初期化ブロックのエリア(kernel_cfg.c)
+ */
+extern const ISRINIB   sisrinib_table[];
+extern ISRINIB                 aisrinib_table[];
+
+/*
+ *  割込みサービスルーチン管理ブロックのエリア(kernel_cfg.c)
+ */
+extern ISRCB   isrcb_table[];
+
+/*
+ *  割込みサービスルーチン管理ブロックから割込みサービスルーチンIDを取
+ *  り出すためのマクロ
+ */
+#define        ISRID(p_isrcb)  ((ID)(((p_isrcb) - isrcb_table) \
+                                                                               - tnum_sisr + TMIN_ISRID))
+
+/*
+ *  割込みサービスルーチン機能の初期化
+ */
+extern void initialize_isr(void);
+
+/*
+ *  割込みサービスルーチンの呼出し
+ */
+extern void call_isr(QUEUE *p_isr_queue);
+
+#ifndef OMIT_INITIALIZE_INTERRUPT
+
+/*
+ *  割込みハンドラ初期化ブロック
+ */
+typedef struct interrupt_handler_initialization_block {
+       INHNO           inhno;                  /* 割込みハンドラ番号 */
+       ATR                     inhatr;                 /* 割込みハンドラ属性 */
+       FP                      int_entry;              /* 割込みハンドラの出入口処理の番地 */
+} INHINIB;
+
+/*
+ *  割込み要求ライン初期化ブロック
+ */
+typedef struct interrupt_request_initialization_block {
+       INTNO           intno;                  /* 割込み番号 */
+       ATR                     intatr;                 /* 割込み属性 */
+       PRI                     intpri;                 /* 割込み優先度 */
+} INTINIB;
+
+/*
+ *  割込みハンドラ番号の数(kernel_cfg.c)
+ */
+extern const uint_t    tnum_inhno;
+
+/*
+ *  割込みハンドラ初期化ブロックのエリア(kernel_cfg.c)
+ */
+extern const INHINIB   inhinib_table[];
+
+/*
+ *  割込み要求ラインの数(kernel_cfg.c)
+ */
+extern const uint_t    tnum_intno;
+
+/*
+ *  割込み要求ライン初期化ブロックのエリア(kernel_cfg.c)
+ */
+extern const INTINIB   intinib_table[];
+
+#endif /* OMIT_INITIALIZE_INTERRUPT */
+
+/*
+ *  割込み管理機能の初期化
+ */
+extern void    initialize_interrupt(void);
+
+#endif /* TOPPERS_INTERRUPT_H */
diff --git a/asp/extension/dcre/kernel/kernel.tf b/asp/extension/dcre/kernel/kernel.tf
new file mode 100644 (file)
index 0000000..7fc76d6
--- /dev/null
@@ -0,0 +1,1351 @@
+$ ======================================================================
+$ 
+$   TOPPERS/ASP Kernel
+$       Toyohashi Open Platform for Embedded Real-Time Systems/
+$       Advanced Standard Profile Kernel
+$ 
+$   Copyright (C) 2007 by TAKAGI Nobuhisa
+$   Copyright (C) 2007-2011 by Embedded and Real-Time Systems Laboratory
+$               Graduate School of Information Science, Nagoya Univ., JAPAN
+$  
+$   上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+$   ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+$   変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+$   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+$       権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+$       スコード中に含まれていること.
+$   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+$       用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+$       者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+$       の無保証規定を掲載すること.
+$   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+$       用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+$       と.
+$     (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+$         作権表示,この利用条件および下記の無保証規定を掲載すること.
+$     (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+$         報告すること.
+$   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+$       害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+$       また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+$       由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+$       免責すること.
+$  
+$   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+$   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+$   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+$   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+$   の責任を負わない.
+$ 
+$   $Id: kernel.tf 2024 2011-01-02 08:59:23Z ertl-hiro $
+$  
+$ =====================================================================
+
+$ =====================================================================
+$ AID_XXXの処理
+$ =====================================================================
+
+$num_atskid = 0$
+$FOREACH i ATSK.ORDER_LIST$
+       $num_atskid = num_atskid + ATSK.NOTSK[i]$
+$END$
+$num_tskid = LENGTH(TSK.ID_LIST) + num_atskid$
+
+$num_asemid = 0$
+$FOREACH i ASEM.ORDER_LIST$
+       $num_asemid = num_asemid + ASEM.NOSEM[i]$
+$END$
+$num_semid = LENGTH(SEM.ID_LIST) + num_asemid$
+
+$num_aflgid = 0$
+$FOREACH i AFLG.ORDER_LIST$
+       $num_aflgid = num_aflgid + AFLG.NOFLG[i]$
+$END$
+$num_flgid = LENGTH(FLG.ID_LIST) + num_aflgid$
+
+$num_adtqid = 0$
+$FOREACH i ADTQ.ORDER_LIST$
+       $num_adtqid = num_adtqid + ADTQ.NODTQ[i]$
+$END$
+$num_dtqid = LENGTH(DTQ.ID_LIST) + num_adtqid$
+
+$num_apdqid = 0$
+$FOREACH i APDQ.ORDER_LIST$
+       $num_apdqid = num_apdqid + APDQ.NOPDQ[i]$
+$END$
+$num_pdqid = LENGTH(PDQ.ID_LIST) + num_apdqid$
+
+$num_ambxid = 0$
+$FOREACH i AMBX.ORDER_LIST$
+       $num_ambxid = num_ambxid + AMBX.NOMBX[i]$
+$END$
+$num_mbxid = LENGTH(MBX.ID_LIST) + num_ambxid$
+
+$num_ampfid = 0$
+$FOREACH i AMPF.ORDER_LIST$
+       $num_ampfid = num_ampfid + AMPF.NOMPF[i]$
+$END$
+$num_mpfid = LENGTH(MPF.ID_LIST) + num_ampfid$
+
+$num_acycid = 0$
+$FOREACH i ACYC.ORDER_LIST$
+       $num_acycid = num_acycid + ACYC.NOCYC[i]$
+$END$
+$num_cycid = LENGTH(CYC.ID_LIST) + num_acycid$
+
+$num_aalmid = 0$
+$FOREACH i AALM.ORDER_LIST$
+       $num_aalmid = num_aalmid + AALM.NOALM[i]$
+$END$
+$num_almid = LENGTH(ALM.ID_LIST) + num_aalmid$
+
+$num_aisrid = 0$
+$FOREACH i AISR.ORDER_LIST$
+       $num_aisrid = num_aisrid + AISR.NOISR[i]$
+$END$
+$num_isrid = num_aisrid$
+$num_isr = LENGTH(ISR.ORDER_LIST) + num_aisrid$
+
+$ =====================================================================
+$ kernel_cfg.hの生成
+$ =====================================================================
+
+$FILE "kernel_cfg.h"$
+/* kernel_cfg.h */$NL$
+#ifndef TOPPERS_KERNEL_CFG_H$NL$
+#define TOPPERS_KERNEL_CFG_H$NL$
+$NL$
+#define TNUM_TSKID     $num_tskid$$NL$
+#define TNUM_SEMID     $num_semid$$NL$
+#define TNUM_FLGID     $num_flgid$$NL$
+#define TNUM_DTQID     $num_dtqid$$NL$
+#define TNUM_PDQID     $num_pdqid$$NL$
+#define TNUM_MBXID     $num_mbxid$$NL$
+#define TNUM_MPFID     $num_mpfid$$NL$
+#define TNUM_CYCID     $num_cycid$$NL$
+#define TNUM_ALMID     $num_almid$$NL$
+#define TNUM_ISRID     $num_isrid$$NL$
+$NL$
+$FOREACH id TSK.ID_LIST$
+       #define $id$    $+id$$NL$
+$END$
+$FOREACH id SEM.ID_LIST$
+       #define $id$    $+id$$NL$
+$END$
+$FOREACH id FLG.ID_LIST$
+       #define $id$    $+id$$NL$
+$END$
+$FOREACH id DTQ.ID_LIST$
+       #define $id$    $+id$$NL$
+$END$
+$FOREACH id PDQ.ID_LIST$
+       #define $id$    $+id$$NL$
+$END$
+$FOREACH id MBX.ID_LIST$
+       #define $id$    $+id$$NL$
+$END$
+$FOREACH id MPF.ID_LIST$
+       #define $id$    $+id$$NL$
+$END$
+$FOREACH id CYC.ID_LIST$
+       #define $id$    $+id$$NL$
+$END$
+$FOREACH id ALM.ID_LIST$
+       #define $id$    $+id$$NL$
+$END$
+$NL$
+#endif /* TOPPERS_KERNEL_CFG_H */$NL$
+
+$ =====================================================================
+$ kernel_cfg.cの生成
+$ =====================================================================
+
+$FILE "kernel_cfg.c"$
+/* kernel_cfg.c */$NL$
+#include "kernel/kernel_int.h"$NL$
+#include "kernel_cfg.h"$NL$
+$NL$
+#ifndef TOPPERS_EMPTY_LABEL$NL$
+#define TOPPERS_EMPTY_LABEL(x,y) x y[0]$NL$
+#endif$NL$
+$NL$
+#if TKERNEL_PRID != 0x07u$NL$
+#error The kernel does not match this configuration file.$NL$
+#endif$NL$
+$NL$
+
+$ 
+$  インクルードディレクティブ(#include)
+$ 
+/*$NL$
+$SPC$*  Include Directives (#include)$NL$
+$SPC$*/$NL$
+$NL$
+$INCLUDES$
+$NL$
+
+$ 
+$  オブジェクトのID番号を保持する変数
+$ 
+$IF USE_EXTERNAL_ID$
+       /*$NL$
+       $SPC$*  Variables for Object ID$NL$
+       $SPC$*/$NL$
+       $NL$
+       $FOREACH id TSK.ID_LIST$
+               const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+       $END$
+       $FOREACH id SEM.ID_LIST$
+               const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+       $END$
+       $FOREACH id FLG.ID_LIST$
+               const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+       $END$
+       $FOREACH id DTQ.ID_LIST$
+               const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+       $END$
+       $FOREACH id PDQ.ID_LIST$
+               const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+       $END$
+       $FOREACH id MBX.ID_LIST$
+               const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+       $END$
+       $FOREACH id MPF.ID_LIST$
+               const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+       $END$
+       $FOREACH id CYC.ID_LIST$
+               const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+       $END$
+       $FOREACH id ALM.ID_LIST$
+               const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+       $END$
+$END$
+
+$ 
+$  タスク
+$ 
+/*$NL$
+$SPC$*  Task Management Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 静的に生成されたタスクが1個以上存在することのチェック
+$IF !LENGTH(TSK.ID_LIST)$
+       $ERROR$$FORMAT(_("no task is registered"))$$END$
+$END$
+
+$ 静的に生成されたタスクの数
+#define TNUM_STSKID    $LENGTH(TSK.ID_LIST)$$NL$
+$NL$
+
+$ タスクID番号の最大値
+const ID _kernel_tmax_tskid = (TMIN_TSKID + TNUM_TSKID - 1);$NL$
+const ID _kernel_tmax_stskid = (TMIN_TSKID + TNUM_STSKID - 1);$NL$
+$NL$
+
+$ エラーチェック
+$FOREACH tskid TSK.ID_LIST$
+$      // tskatrが([TA_ACT])でない場合(E_RSATR)
+       $IF (TSK.TSKATR[tskid] & ~(TA_ACT|TARGET_TSKATR)) != 0$
+               $ERROR TSK.TEXT_LINE[tskid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "tskatr", TSK.TSKATR[tskid], tskid, "CRE_TSK")$$END$
+       $END$
+
+$      // (TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI)でない場合(E_PAR)
+       $IF !(TMIN_TPRI <= TSK.ITSKPRI[tskid] && TSK.ITSKPRI[tskid] <= TMAX_TPRI)$
+               $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "itskpri", TSK.ITSKPRI[tskid], tskid, "CRE_TSK")$$END$
+       $END$
+
+$      // texatrが(TA_NULL)でない場合(E_RSATR)
+       $IF LENGTH(TSK.TEXATR[tskid]) && TSK.TEXATR[tskid] != 0$
+               $ERROR DEF_TEX.TEXT_LINE[tskid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "texatr", TSK.TEXATR[tskid], tskid, "DEF_TEX")$$END$
+       $END$
+$END$
+
+$ スタック領域の生成とそれに関するエラーチェック
+$FOREACH tskid TSK.ID_LIST$
+$      // stkszが0か,ターゲット定義の最小値(TARGET_MIN_STKSZ)よりも小さい場合(E_PAR)
+       $IF TSK.STKSZ[tskid] == 0 || (TARGET_MIN_STKSZ
+                                                                       && TSK.STKSZ[tskid] < TARGET_MIN_STKSZ)$
+               $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is too small"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$$END$
+       $END$
+$      // stkszがスタック領域のサイズとして正しくない場合(E_PAR)
+       $IF !EQ(TSK.STK[tskid], "NULL") && CHECK_STKSZ_ALIGN
+                                                       && (TSK.STKSZ[tskid] & (CHECK_STKSZ_ALIGN - 1))$
+               $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$$END$
+       $END$
+
+       $IF EQ(TSK.STK[tskid],"NULL")$
+               static STK_T _kernel_stack_$tskid$[COUNT_STK_T($TSK.STKSZ[tskid]$)];$NL$
+               $TSK.TINIB_STKSZ[tskid] = FORMAT("ROUND_STK_T(%1%)", TSK.STKSZ[tskid])$
+               $TSK.TINIB_STK[tskid] = CONCAT("_kernel_stack_", tskid)$
+       $ELSE$
+               $TSK.TINIB_STKSZ[tskid] = TSK.STKSZ[tskid]$
+               $TSK.TINIB_STK[tskid] = TSK.STK[tskid]$
+       $END$
+$END$
+$NL$
+
+$ タスク初期化ブロックの生成(タスクは1個以上存在する)
+const TINIB _kernel_tinib_table[TNUM_STSKID] = {$NL$
+$JOINEACH tskid TSK.ID_LIST ",\n"$
+$      // タスク属性,拡張情報,起動番地,起動時優先度
+       $TAB${
+       $SPC$($TSK.TSKATR[tskid]$), (intptr_t)($TSK.EXINF[tskid]$),
+       $SPC$((TASK)($TSK.TASK[tskid]$)), INT_PRIORITY($TSK.ITSKPRI[tskid]$),
+
+$      // タスク初期化コンテキストブロック,スタック領域
+       $IF USE_TSKINICTXB$
+               $GENERATE_TSKINICTXB(tskid)$
+       $ELSE$
+               $SPC$$TSK.TINIB_STKSZ[tskid]$, $TSK.TINIB_STK[tskid]$,
+       $END$
+
+$      // タスク例外処理ルーチンの属性と起動番地
+       $SPC$($ALT(TSK.TEXATR[tskid],"TA_NULL")$), ($ALT(TSK.TEXRTN[tskid],"NULL")$) }
+$END$$NL$
+};$NL$
+$NL$
+
+$ 動的生成タスク用のタスク初期化ブロックの生成
+$IF num_atskid > 0$
+       TINIB _kernel_atinib_table[$num_atskid$];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(TINIB, _kernel_atinib_table);$NL$
+$END$$NL$
+
+$ タスク管理ブロックの生成
+TCB _kernel_tcb_table[TNUM_TSKID];$NL$
+$NL$
+
+$ タスク生成順序テーブルの生成
+const ID _kernel_torder_table[TNUM_STSKID] = {$NL$
+$TAB$$JOINEACH tskid TSK.ORDER_LIST ", "$$tskid$$END$$NL$
+};$NL$
+$NL$
+
+$ 
+$  セマフォ
+$ 
+/*$NL$
+$SPC$*  Semaphore Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 静的に生成されたセマフォの数
+#define TNUM_SSEMID    $LENGTH(SEM.ID_LIST)$$NL$
+$NL$
+
+$ セマフォID番号の最大値
+const ID _kernel_tmax_semid = (TMIN_SEMID + TNUM_SEMID - 1);$NL$
+const ID _kernel_tmax_ssemid = (TMIN_SEMID + TNUM_SSEMID - 1);$NL$
+$NL$
+
+$ セマフォ初期化ブロックの生成
+$IF LENGTH(SEM.ID_LIST)$
+       const SEMINIB _kernel_seminib_table[TNUM_SSEMID] = {$NL$
+       $JOINEACH semid SEM.ID_LIST ",\n"$
+$              // sematrが([TA_TPRI])でない場合(E_RSATR)
+               $IF (SEM.SEMATR[semid] & ~TA_TPRI) != 0$
+                       $ERROR SEM.TEXT_LINE[semid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "sematr", SEM.SEMATR[semid], semid, "CRE_SEM")$$END$
+               $END$
+
+$              // (0 <= isemcnt && isemcnt <= maxsem)でない場合(E_PAR)
+               $IF !(0 <= SEM.ISEMCNT[semid] && SEM.ISEMCNT[semid] <= SEM.MAXSEM[semid])$
+                       $ERROR SEM.TEXT_LINE[semid]$E_PAR: $FORMAT(_("too large %1% `%2%\' of `%3%\' in %4%"), "isemcnt", SEM.ISEMCNT[semid], semid, "CRE_SEM")$$END$
+               $END$
+
+$              // (1 <= maxsem && maxsem <= TMAX_MAXSEM)でない場合(E_PAR)
+               $IF !(1 <= SEM.MAXSEM[semid] && SEM.MAXSEM[semid] <= TMAX_MAXSEM)$
+                       $ERROR SEM.TEXT_LINE[semid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "maxsem", SEM.MAXSEM[semid], semid, "CRE_SEM")$$END$
+               $END$
+
+$              // セマフォ初期化ブロック
+               $TAB${ ($SEM.SEMATR[semid]$), ($SEM.ISEMCNT[semid]$), ($SEM.MAXSEM[semid]$) }
+       $END$$NL$
+       };$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const SEMINIB, _kernel_seminib_table);$NL$
+$END$$NL$
+
+$ 動的生成セマフォ用のセマフォ初期化ブロックの生成
+$IF num_asemid > 0$
+       SEMINIB _kernel_aseminib_table[$num_asemid$];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(SEMINIB, _kernel_aseminib_table);$NL$
+$END$$NL$
+
+$ セマフォ管理ブロックの生成
+$IF num_semid$
+       SEMCB _kernel_semcb_table[TNUM_SEMID];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(SEMCB, _kernel_semcb_table);$NL$
+$END$$NL$
+
+$ 
+$  イベントフラグ
+$ 
+/*$NL$
+$SPC$*  Eventflag Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 静的に生成されたイベントフラグの数
+#define TNUM_SFLGID    $LENGTH(FLG.ID_LIST)$$NL$
+$NL$
+
+$ イベントフラグID番号の最大値
+const ID _kernel_tmax_flgid = (TMIN_FLGID + TNUM_FLGID - 1);$NL$
+const ID _kernel_tmax_sflgid = (TMIN_FLGID + TNUM_SFLGID - 1);$NL$
+$NL$
+
+$ イベントフラグ初期化ブロックの生成
+$IF LENGTH(FLG.ID_LIST)$
+       const FLGINIB _kernel_flginib_table[TNUM_SFLGID] = {$NL$
+       $JOINEACH flgid FLG.ID_LIST ",\n"$
+$              // flgatrが([TA_TPRI]|[TA_WMUL]|[TA_CLR])でない場合(E_RSATR)
+               $IF (FLG.FLGATR[flgid] & ~(TA_TPRI|TA_WMUL|TA_CLR)) != 0$
+                       $ERROR FLG.TEXT_LINE[flgid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "flgatr", FLG.FLGATR[flgid], flgid, "CRE_FLG")$$END$
+               $END$
+
+$              // イベントフラグ初期化ブロック
+               $TAB${ ($FLG.FLGATR[flgid]$), ($FLG.IFLGPTN[flgid]$) }
+       $END$$NL$
+       };$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const FLGINIB, _kernel_flginib_table);$NL$
+$END$$NL$
+
+$ 動的生成イベントフラグ用のイベントフラグ初期化ブロックの生成
+$IF num_aflgid > 0$
+       FLGINIB _kernel_aflginib_table[$num_aflgid$];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(FLGINIB, _kernel_aflginib_table);$NL$
+$END$$NL$
+
+$ イベントフラグ管理ブロックの生成
+$IF num_flgid$
+       FLGCB _kernel_flgcb_table[TNUM_FLGID];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(FLGCB, _kernel_flgcb_table);$NL$
+$END$$NL$
+
+$ 
+$  データキュー
+$ 
+/*$NL$
+$SPC$*  Dataqueue Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 静的に生成されたデータキューの数
+#define TNUM_SDTQID    $LENGTH(DTQ.ID_LIST)$$NL$
+$NL$
+
+$ データキューID番号の最大値
+const ID _kernel_tmax_dtqid = (TMIN_DTQID + TNUM_DTQID - 1);$NL$
+const ID _kernel_tmax_sdtqid = (TMIN_DTQID + TNUM_SDTQID - 1);$NL$
+$NL$
+
+$IF LENGTH(DTQ.ID_LIST)$
+       $FOREACH dtqid DTQ.ID_LIST$
+$              // dtqatrが([TA_TPRI])でない場合(E_RSATR)
+               $IF (DTQ.DTQATR[dtqid] & ~TA_TPRI) != 0$
+                       $ERROR DTQ.TEXT_LINE[dtqid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "dtqatr", DTQ.DTQATR[dtqid], dtqid, "CRE_DTQ")$$END$
+               $END$
+
+$              // dtqmbがNULLでない場合(E_NOSPT)
+               $IF !EQ(DTQ.DTQMB[dtqid], "NULL")$
+                       $ERROR DTQ.TEXT_LINE[dtqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "dtqmb", DTQ.DTQMB[dtqid], dtqid, "CRE_DTQ")$$END$
+               $END$
+
+$              // データキュー領域
+               $IF DTQ.DTQCNT[dtqid]$
+                       static intptr_t _kernel_dtqmb_$dtqid$[$DTQ.DTQCNT[dtqid]$];$NL$
+               $END$
+       $END$
+
+$      // データキュー初期化ブロックの生成
+       const DTQINIB _kernel_dtqinib_table[TNUM_SDTQID] = {$NL$
+       $JOINEACH dtqid DTQ.ID_LIST ",\n"$
+               $TAB${ ($DTQ.DTQATR[dtqid]$), ($DTQ.DTQCNT[dtqid]$), $IF DTQ.DTQCNT[dtqid]$(_kernel_dtqmb_$dtqid$)$ELSE$NULL$END$ }
+       $END$$NL$
+       };$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const DTQINIB, _kernel_dtqinib_table);$NL$
+$END$$NL$
+
+$ 動的生成データキュー用のデータキュー初期化ブロックの生成
+$IF num_adtqid > 0$
+       DTQINIB _kernel_adtqinib_table[$num_adtqid$];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(DTQINIB, _kernel_adtqinib_table);$NL$
+$END$$NL$
+
+$ データキュー管理ブロックの生成
+$IF num_dtqid$
+       DTQCB _kernel_dtqcb_table[TNUM_DTQID];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(DTQCB, _kernel_dtqcb_table);$NL$
+$END$$NL$
+
+$ 
+$  優先度データキュー
+$ 
+/*$NL$
+$SPC$*  Priority Dataqueue Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 静的に生成された優先度データキューの数
+#define TNUM_SPDQID    $LENGTH(PDQ.ID_LIST)$$NL$
+$NL$
+
+$ 優先度データキューID番号の最大値
+const ID _kernel_tmax_pdqid = (TMIN_PDQID + TNUM_PDQID - 1);$NL$
+const ID _kernel_tmax_spdqid = (TMIN_PDQID + TNUM_SPDQID - 1);$NL$
+$NL$
+
+$IF LENGTH(PDQ.ID_LIST)$
+       $FOREACH pdqid PDQ.ID_LIST$
+$              // pdqatrが([TA_TPRI])でない場合(E_RSATR)
+               $IF (PDQ.PDQATR[pdqid] & ~TA_TPRI) != 0$
+                       $ERROR PDQ.TEXT_LINE[pdqid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "pdqatr", PDQ.PDQATR[pdqid], pdqid, "CRE_PDQ")$$END$
+               $END$
+
+$              // (TMIN_DPRI <= maxdpri && maxdpri <= TMAX_DPRI)でない場合(E_PAR)
+               $IF !(TMIN_DPRI <= PDQ.MAXDPRI[pdqid] && PDQ.MAXDPRI[pdqid] <= TMAX_DPRI)$
+                       $ERROR PDQ.TEXT_LINE[pdqid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "maxdpri", PDQ.MAXDPRI[pdqid], pdqid, "CRE_PDQ")$$END$
+               $END$
+
+$              // pdqmbがNULLでない場合(E_NOSPT)
+               $IF !EQ(PDQ.PDQMB[pdqid], "NULL")$
+                       $ERROR PDQ.TEXT_LINE[pdqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "pdqmb", PDQ.PDQMB[pdqid], pdqid, "CRE_PDQ")$$END$
+               $END$
+
+$              // 優先度データキュー領域
+               $IF PDQ.PDQCNT[pdqid]$
+                       static PDQMB _kernel_pdqmb_$pdqid$[$PDQ.PDQCNT[pdqid]$];$NL$
+               $END$
+       $END$
+
+$      // 優先度データキュー初期化ブロックの生成
+       const PDQINIB _kernel_pdqinib_table[TNUM_SPDQID] = {$NL$
+       $JOINEACH pdqid PDQ.ID_LIST ",\n"$
+               $TAB${ ($PDQ.PDQATR[pdqid]$), ($PDQ.PDQCNT[pdqid]$), ($PDQ.MAXDPRI[pdqid]$), $IF PDQ.PDQCNT[pdqid]$(_kernel_pdqmb_$pdqid$)$ELSE$NULL$END$ }
+       $END$$NL$
+       };$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const PDQINIB, _kernel_pdqinib_table);$NL$
+$END$$NL$
+
+$ 動的生成優先度データキュー用の優先度データキュー初期化ブロックの生成
+$IF num_apdqid > 0$
+       PDQINIB _kernel_apdqinib_table[$num_apdqid$];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(PDQINIB, _kernel_apdqinib_table);$NL$
+$END$$NL$
+
+$ 優先度データキュー管理ブロックの生成
+$IF num_pdqid$
+       PDQCB _kernel_pdqcb_table[TNUM_PDQID];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(PDQCB, _kernel_pdqcb_table);$NL$
+$END$$NL$
+
+$ 
+$  メールボックス
+$ 
+/*$NL$
+$SPC$*  Mailbox Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 静的に生成されたメールボックスの数
+#define TNUM_SMBXID    $LENGTH(MBX.ID_LIST)$$NL$
+$NL$
+
+$ メールボックスID番号の最大値
+const ID _kernel_tmax_mbxid = (TMIN_MBXID + TNUM_MBXID - 1);$NL$
+const ID _kernel_tmax_smbxid = (TMIN_MBXID + TNUM_SMBXID - 1);$NL$
+$NL$
+
+$ メールボックス初期化ブロックの生成
+$IF LENGTH(MBX.ID_LIST)$
+       const MBXINIB _kernel_mbxinib_table[TNUM_SMBXID] = {$NL$
+       $JOINEACH mbxid MBX.ID_LIST ",\n"$
+$              // mbxatrが([TA_TPRI]|[TA_MPRI])でない場合(E_RSATR)
+               $IF (MBX.MBXATR[mbxid] & ~(TA_TPRI|TA_MPRI)) != 0$
+                       $ERROR MBX.TEXT_LINE[mbxid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "mbxatr", MBX.MBXATR[mbxid], mbxid, "CRE_MBX")$$END$
+               $END$
+
+$              // (TMIN_MPRI <= maxmpri && maxmpri <= TMAX_MPRI)でない場合(E_PAR)
+               $IF !(TMIN_MPRI <= MBX.MAXMPRI[mbxid] && MBX.MAXMPRI[mbxid] <= TMAX_MPRI)$
+                       $ERROR MBX.TEXT_LINE[mbxid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "maxmpri", MBX.MAXMPRI[mbxid], mbxid, "CRE_MBX")$$END$
+               $END$
+
+$              // mprihdがNULLでない場合(E_NOSPT)
+               $IF !EQ(MBX.MPRIHD[mbxid], "NULL")$
+                       $ERROR MBX.TEXT_LINE[mbxid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "mprihd", MBX.MPRIHD[mbxid], mbxid, "CRE_MBX")$$END$
+               $END$
+
+$              // メールボックス初期化ブロック
+               $TAB${ ($MBX.MBXATR[mbxid]$), ($MBX.MAXMPRI[mbxid]$) }
+       $END$$NL$
+       };$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const MBXINIB, _kernel_mbxinib_table);$NL$
+$END$$NL$
+
+$ 動的生成メールボックス用のメールボックス初期化ブロックの生成
+$IF num_ambxid > 0$
+       MBXINIB _kernel_ambxinib_table[$num_ambxid$];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(MBXINIB, _kernel_ambxinib_table);$NL$
+$END$$NL$
+
+$ メールボックス管理ブロックの生成
+$IF num_mbxid$
+       MBXCB _kernel_mbxcb_table[TNUM_MBXID];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(MBXCB, _kernel_mbxcb_table);$NL$
+$END$$NL$
+
+$ 
+$  固定長メモリプール
+$ 
+/*$NL$
+$SPC$*  Fixed-sized Memorypool Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 静的に生成された固定長メモリプールの数
+#define TNUM_SMPFID    $LENGTH(MPF.ID_LIST)$$NL$
+$NL$
+
+$ 固定長メモリプールID番号の最大値
+const ID _kernel_tmax_mpfid = (TMIN_MPFID + TNUM_MPFID - 1);$NL$
+const ID _kernel_tmax_smpfid = (TMIN_MPFID + TNUM_SMPFID - 1);$NL$
+$NL$
+
+$IF LENGTH(MPF.ID_LIST)$
+       $FOREACH mpfid MPF.ID_LIST$
+$              // mpfatrが([TA_TPRI])でない場合(E_RSATR)
+               $IF (MPF.MPFATR[mpfid] & ~TA_TPRI) != 0$
+                       $ERROR MPF.TEXT_LINE[mpfid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "mpfatr", MPF.MPFATR[mpfid], mpfid, "CRE_MPF")$$END$
+               $END$
+
+$              // blkcntが0の場合(E_PAR)
+               $IF MPF.BLKCNT[mpfid] == 0$
+                       $ERROR MPF.TEXT_LINE[mpfid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "blkcnt", MPF.BLKCNT[mpfid], mpfid, "CRE_MPF")$$END$
+               $END$
+
+$              // blkszが0の場合(E_PAR)
+               $IF MPF.BLKSZ[mpfid] == 0$
+                       $ERROR MPF.TEXT_LINE[mpfid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "blksz", MPF.BLKSZ[mpfid], mpfid, "CRE_MPF")$$END$
+               $END$
+
+$              // 固定長メモリプール領域
+               $IF EQ(MPF.MPF[mpfid], "NULL")$
+                       static MPF_T _kernel_mpf_$mpfid$[($MPF.BLKCNT[mpfid]$) * COUNT_MPF_T($MPF.BLKSZ[mpfid]$)];$NL$
+               $END$
+
+$              // mpfmbがNULLでない場合(E_NOSPT)
+               $IF !EQ(MPF.MPFMB[mpfid], "NULL")$
+                       $ERROR MPF.TEXT_LINE[mpfid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "mpfmb", MPF.MPFMB[mpfid], mpfid, "CRE_MPF")$$END$
+               $END$
+
+$              // 固定長メモリプール管理領域
+               static MPFMB _kernel_mpfmb_$mpfid$[$MPF.BLKCNT[mpfid]$];$NL$
+       $END$
+
+$      // 固定長メモリプール初期化ブロックの生成
+       const MPFINIB _kernel_mpfinib_table[TNUM_SMPFID] = {$NL$
+       $JOINEACH mpfid MPF.ID_LIST ",\n"$
+               $TAB${ ($MPF.MPFATR[mpfid]$), ($MPF.BLKCNT[mpfid]$), ROUND_MPF_T($MPF.BLKSZ[mpfid]$), $IF EQ(MPF.MPF[mpfid],"NULL")$(_kernel_mpf_$mpfid$)$ELSE$($MPF.MPF[mpfid]$)$END$, (_kernel_mpfmb_$mpfid$) }
+       $END$$NL$
+       };$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const MPFINIB, _kernel_mpfinib_table);$NL$
+$END$$NL$
+
+$ 動的生成固定長メモリプール用の固定長メモリプール初期化ブロックの生成
+$IF num_ampfid > 0$
+       MPFINIB _kernel_ampfinib_table[$num_ampfid$];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(MPFINIB, _kernel_ampfinib_table);$NL$
+$END$$NL$
+
+$ 固定長メモリプール管理ブロックの生成
+$IF num_mpfid$
+       MPFCB _kernel_mpfcb_table[TNUM_MPFID];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(MPFCB, _kernel_mpfcb_table);$NL$
+$END$$NL$
+
+$ 
+$  周期ハンドラ
+$ 
+/*$NL$
+$SPC$*  Cyclic Handler Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 静的に生成された周期ハンドラの数
+#define TNUM_SCYCID    $LENGTH(CYC.ID_LIST)$$NL$
+$NL$
+
+$ 周期ハンドラID番号の最大値
+const ID _kernel_tmax_cycid = (TMIN_CYCID + TNUM_CYCID - 1);$NL$
+const ID _kernel_tmax_scycid = (TMIN_CYCID + TNUM_SCYCID - 1);$NL$
+$NL$
+
+$ 周期ハンドラ初期化テーブルの生成
+$IF LENGTH(CYC.ID_LIST)$
+       const CYCINIB _kernel_cycinib_table[TNUM_SCYCID] = {$NL$
+       $JOINEACH cycid CYC.ID_LIST ",\n"$
+$              // cycatrが([TA_STA])でない場合(E_RSATR)
+               $IF (CYC.CYCATR[cycid] & ~TA_STA) != 0$
+                       $ERROR CYC.TEXT_LINE[cycid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "cycatr", CYC.CYCATR[cycid], cycid, "CRE_CYC")$$END$
+               $END$
+
+$              // (0 < cyctim && cyctim <= TMAX_RELTIM)でない場合(E_PAR)
+               $IF !(0 < CYC.CYCTIM[cycid] && CYC.CYCTIM[cycid] <= TMAX_RELTIM)$
+                       $ERROR CYC.TEXT_LINE[cycid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "cyctim", CYC.CYCTIM[cycid], cycid, "CRE_CYC")$$END$
+               $END$
+
+$              // (0 <= cycphs && cycphs <= TMAX_RELTIM)でない場合(E_PAR)
+               $IF !(0 <= CYC.CYCPHS[cycid] && CYC.CYCPHS[cycid] <= TMAX_RELTIM)$
+                       $ERROR CYC.TEXT_LINE[cycid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "cycphs", CYC.CYCPHS[cycid], cycid, "CRE_CYC")$$END$
+               $END$
+
+$              // 警告:cycatrにTA_STAが設定されていて,(cycphs == 0)の場合
+               $IF (CYC.CYCATR[cycid] & TA_STA) != 0 && CYC.CYCPHS[cycid] == 0$
+                       $WARNING CYC.TEXT_LINE[cycid]$$FORMAT(_("%1% is not recommended when %2% is set to %3% in %4%"), "cycphs==0", "TA_STA", "cycatr", "CRE_CYC")$$END$
+               $END$
+
+$              // 周期ハンドラ初期化ブロック
+               $TAB${ ($CYC.CYCATR[cycid]$), (intptr_t)($CYC.EXINF[cycid]$), ($CYC.CYCHDR[cycid]$), ($CYC.CYCTIM[cycid]$), ($CYC.CYCPHS[cycid]$) }
+       $END$$NL$
+       };$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const CYCINIB, _kernel_cycinib_table);$NL$
+$END$$NL$
+
+$ 動的生成周期ハンドラ用の周期ハンドラ初期化ブロックの生成
+$IF num_acycid > 0$
+       CYCINIB _kernel_acycinib_table[$num_acycid$];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(CYCINIB, _kernel_acycinib_table);$NL$
+$END$$NL$
+
+$ 周期ハンドラ管理ブロック
+$IF num_cycid$
+       CYCCB _kernel_cyccb_table[TNUM_CYCID];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(CYCCB, _kernel_cyccb_table);$NL$
+$END$$NL$
+
+$ 
+$  アラームハンドラ
+$ 
+/*$NL$
+$SPC$*  Alarm Handler Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 静的に生成されたアラームハンドラの数
+#define TNUM_SALMID    $LENGTH(ALM.ID_LIST)$$NL$
+$NL$
+
+$ アラームハンドラID番号の最大値
+const ID _kernel_tmax_almid = (TMIN_ALMID + TNUM_ALMID - 1);$NL$
+const ID _kernel_tmax_salmid = (TMIN_ALMID + TNUM_SALMID - 1);$NL$
+$NL$
+
+$ アラームハンドラ初期化ブロックの生成
+$IF LENGTH(ALM.ID_LIST)$
+       const ALMINIB _kernel_alminib_table[TNUM_SALMID] = {$NL$
+       $JOINEACH almid ALM.ID_LIST ",\n"$
+$              // almatrが(TA_NULL)でない場合(E_RSATR)
+               $IF ALM.ALMATR[almid] != 0$
+                       $ERROR ALM.TEXT_LINE[almid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "almatr", ALM.ALMATR[almid], almid, "CRE_ALM")$$END$
+               $END$
+
+$              // アラームハンドラ初期化ブロック
+               $TAB${ ($ALM.ALMATR[almid]$), (intptr_t)($ALM.EXINF[almid]$), ($ALM.ALMHDR[almid]$) }
+       $END$$NL$
+       };$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const ALMINIB, _kernel_alminib_table);$NL$
+$END$$NL$
+
+$ 動的生成アラームハンドラ用のアラームハンドラ初期化ブロックの生成
+$IF num_aalmid > 0$
+       ALMINIB _kernel_aalminib_table[$num_aalmid$];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(ALMINIB, _kernel_aalminib_table);$NL$
+$END$$NL$
+
+$ アラームハンドラ管理ブロック
+$IF num_almid$
+       ALMCB _kernel_almcb_table[TNUM_ALMID];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const ALMINIB, _kernel_alminib_table);$NL$
+$END$$NL$
+
+$ 
+$  割込み管理機能
+$ 
+/*$NL$
+$SPC$*  Interrupt Management Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 割込み番号と割込みハンドラ番号の変換テーブルの作成
+$IF LENGTH(INTNO_ATTISR_VALID) != LENGTH(INHNO_ATTISR_VALID)$
+       $ERROR$length of `INTNO_ATTISR_VALID' is different from length of `INHNO_ATTISR_VALID'$END$
+$END$
+$i = 0$
+$FOREACH intno INTNO_ATTISR_VALID$
+       $inhno = AT(INHNO_ATTISR_VALID, i)$
+       $INHNO[intno] = inhno$
+       $INTNO[inhno] = intno$
+       $i = i + 1$
+$END$
+
+$ 割込み要求ラインに関するエラーチェック
+$i = 0$
+$FOREACH intno INT.ORDER_LIST$
+$      // intnoがCFG_INTに対する割込み番号として正しくない場合(E_PAR)
+       $IF !LENGTH(FIND(INTNO_CFGINT_VALID, INT.INTNO[intno]))$
+               $ERROR INT.TEXT_LINE[intno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "intno", INT.INTNO[intno], "CFG_INT")$$END$
+       $END$
+
+$      // intnoがCFG_INTによって設定済みの場合(E_OBJ)
+       $j = 0$
+       $FOREACH intno2 INT.ORDER_LIST$
+               $IF INT.INTNO[intno] == INT.INTNO[intno2] && j < i$
+                       $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' in %3% is duplicated"), "intno", INT.INTNO[intno], "CFG_INT")$$END$
+               $END$
+               $j = j + 1$
+       $END$
+
+$      // intatrが([TA_ENAINT]|[TA_EDGE])でない場合(E_RSATR)
+       $IF (INT.INTATR[intno] & ~(TA_ENAINT|TA_EDGE|TARGET_INTATR)) != 0$
+               $ERROR INT.TEXT_LINE[intno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "intatr", INT.INTATR[intno], "intno", INT.INTNO[intno], "CFG_INT")$$END$
+       $END$
+
+$      // intpriがCFG_INTに対する割込み優先度として正しくない場合(E_PAR)
+       $IF !LENGTH(FIND(INTPRI_CFGINT_VALID, INT.INTPRI[intno]))$
+               $ERROR INT.TEXT_LINE[intno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "intpri", INT.INTPRI[intno], "CFG_INT")$$END$
+       $END$
+
+$      // カーネル管理に固定されているintnoに対して,intpriにTMIN_INTPRI
+$      // よりも小さい値が指定された場合(E_OBJ)
+       $IF LENGTH(FIND(INTNO_FIX_KERNEL, intno))$
+               $IF INT.INTPRI[intno] < TMIN_INTPRI$
+                       $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' must not have higher priority than %3%"), "intno", INT.INTNO[intno], "TMIN_INTPRI")$$END$
+               $END$
+       $END$
+
+$      // カーネル管理外に固定されているintnoに対して,intpriにTMIN_INTPRI
+$      // よりも小さい値が指定されなかった場合(E_OBJ)
+       $IF LENGTH(FIND(INTNO_FIX_NONKERNEL, intno))$
+               $IF INT.INTPRI[intno] >= TMIN_INTPRI$
+                       $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' must have higher priority than %3%"), "intno", INT.INTNO[intno], "TMIN_INTPRI")$$END$
+               $END$
+       $END$
+       $i = i + 1$
+$END$
+
+$ 割込みハンドラに関するエラーチェック
+$i = 0$
+$FOREACH inhno INH.ORDER_LIST$
+$      // inhnoがDEF_INHに対する割込みハンドラ番号として正しくない場合(E_PAR)
+       $IF !LENGTH(FIND(INHNO_DEFINH_VALID, INH.INHNO[inhno]))$
+               $ERROR INH.TEXT_LINE[inhno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "inhno", INH.INHNO[inhno], "DEF_INH")$$END$
+       $END$
+
+$      // inhnoがDEF_INHによって設定済みの場合(E_OBJ)
+       $j = 0$
+       $FOREACH inhno2 INH.ORDER_LIST$
+               $IF INH.INHNO[inhno] == INH.INHNO[inhno2] && j < i$
+                       $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' in %3% is duplicated"), "inhno", INH.INHNO[inhno], "DEF_INH")$$END$
+               $END$
+               $j = j + 1$
+       $END$
+
+$      // inhatrが(TA_NULL)でない場合(E_RSATR)
+       $IF (INH.INHATR[inhno] & ~TARGET_INHATR) != 0$
+               $ERROR INH.TEXT_LINE[inhno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "inhatr", INH.INHATR[inhno], "inhno", INH.INHNO[inhno], "DEF_INH")$$END$
+       $END$
+
+$      // カーネル管理に固定されているinhnoに対して,inhatrにTA_NONKERNEL
+$      // が指定されている場合(E_RSATR)
+       $IF LENGTH(FIND(INHNO_FIX_KERNEL, inhno))$
+               $IF (INH.INHATR[inhno] & TA_NONKERNEL) != 0$
+                       $ERROR INH.TEXT_LINE[inhno]$E_RSATR: $FORMAT(_("%1% `%2%\' must not be non-kernel interrupt"), "inhno", INH.INHNO[inhno])$$END$
+               $END$
+       $END$
+
+$      // カーネル管理外に固定されているinhnoに対して,inhatrにTA_NONKERNEL
+$      // が指定されていない場合(E_RSATR)
+       $IF LENGTH(FIND(INHNO_FIX_NONKERNEL, inhno))$
+               $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
+                       $ERROR INH.TEXT_LINE[inhno]$E_RSATR: $FORMAT(_("%1% `%2%\' must be non-kernel interrupt"), "inhno", INH.INHNO[inhno])$$END$
+               $END$
+       $END$
+
+       $IF LENGTH(INTNO[INH.INHNO[inhno]])$
+               $intno = INTNO[INH.INHNO[inhno]]$
+$              // inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)
+               $IF !LENGTH(INT.INTNO[intno])$
+                       $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' corresponding to %3% `%4%\' is not configured with %5%"), "intno", INT.INTNO[intno], "inhno", INH.INHNO[inhno], "CFG_INT")$$END$
+               $ELSE$
+                       $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
+$                              // inhatrにTA_NONKERNELが指定されておらず,inhnoに対応
+$                              // するintnoに対してCFG_INTで設定された割込み優先度が
+$                              // TMIN_INTPRIよりも小さい場合(E_OBJ)
+                               $IF INT.INTPRI[intno] < TMIN_INTPRI$
+                                       $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
+                               $END$
+                       $ELSE$
+$                              // inhatrにTA_NONKERNELが指定されており,inhnoに対応
+$                              // するintnoに対してCFG_INTで設定された割込み優先度が
+$                              // TMIN_INTPRI以上である場合(E_OBJ)
+                               $IF INT.INTPRI[intno] >= TMIN_INTPRI$
+                                       $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is lower than or equal to %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
+                               $END$
+                       $END$
+               $END$
+       $END$
+       $i = i + 1$
+$END$
+
+$ 割込みサービスルーチン(ISR)に関するエラーチェック
+$FOREACH order ISR.ORDER_LIST$
+$      // isratrが(TA_NULL)でない場合(E_RSATR)
+       $IF (ISR.ISRATR[order] & ~TARGET_ISRATR) != 0$
+               $ERROR ISR.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "isratr", ISR.ISRATR[order], "ATT_ISR")$$END$
+       $END$
+
+$      // intnoがATT_ISRに対する割込み番号として正しくない場合(E_PAR)
+       $IF !LENGTH(FIND(INTNO_ATTISR_VALID, ISR.INTNO[order]))$
+               $ERROR ISR.TEXT_LINE[order]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "intno", ISR.INTNO[order], "ATT_ISR")$$END$
+       $END$
+
+$      // (TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI)でない場合(E_PAR)
+       $IF !(TMIN_ISRPRI <= ISR.ISRPRI[order] && ISR.ISRPRI[order] <= TMAX_ISRPRI)$
+               $ERROR ISR.TEXT_LINE[order]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "isrpri", ISR.ISRPRI[order], "ATT_ISR")$$END$
+       $END$
+$END$
+
+$FOREACH intno INTNO_ATTISR_VALID$
+       $inhno = INHNO[intno]$
+
+$      // 割込み番号intnoに対して登録されたISRのリストの作成
+       $isr_order_list = {}$
+       $FOREACH order ISR.ORDER_LIST$
+               $IF ISR.INTNO[order] == intno$
+                       $isr_order_list = APPEND(isr_order_list, order)$
+                       $order_for_error = order$
+               $END$
+       $END$
+
+$      // 割込み番号intnoに対して登録されたISRが存在する場合
+       $IF LENGTH(isr_order_list) > 0$
+$              // intnoに対応するinhnoに対してDEF_INHがある場合(E_OBJ)
+               $IF LENGTH(INH.INHNO[inhno])$
+                       $ERROR ISR.TEXT_LINE[order_for_error]$E_OBJ: $FORMAT(_("%1% `%2%\' in %3% is duplicated with %4% `%5%\'"), "intno", ISR.INTNO[order_for_error], "ATT_ISR", "inhno", INH.INHNO[inhno])$$END$
+               $END$
+
+$              // intnoに対するCFG_INTがない場合(E_OBJ)
+               $IF !LENGTH(INT.INTNO[intno])$
+                       $ERROR ISR.TEXT_LINE[order_for_error]$E_OBJ: $FORMAT(_("%1% `%2%\' is not configured with %3%"), "intno", ISR.INTNO[order_for_error], "CFG_INT")$$END$
+               $ELSE$
+$                      // intnoに対してCFG_INTで設定された割込み優先度がTMIN_INTPRI
+$                      // よりも小さい場合(E_OBJ)
+                       $IF INT.INTPRI[intno] < TMIN_INTPRI$
+                               $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "intno", ISR.INTNO[order_for_error], "TMIN_INTPRI")$$END$
+                       $END$
+               $END$
+       $END$
+$END$
+
+$ 割込みサービスルーチン(ISR)管理のデータ構造
+$intno_isr_list = {}$
+$FOREACH intno INTNO_ATTISR_VALID$
+       $inhno = INHNO[intno]$
+       $IF LENGTH(INT.INTNO[intno]) && !LENGTH(INH.INHNO[inhno])$
+               $intno_isr_list = APPEND(intno_isr_list, intno)$
+       $END$
+$END$
+
+$INTNO_ISR = {}$
+$i = 0$
+$FOREACH intno SORT(intno_isr_list, "INT.INTNO")$
+       $INTNO_ISR = APPEND(INTNO_ISR, intno)$
+       $ISR_QUEUE_HEADER[intno] = FORMAT("&(_kernel_isr_queue_table[%d])", i)$
+       $i = i + 1$
+$END$
+
+const uint_t _kernel_tnum_isr_queue = $LENGTH(INTNO_ISR)$;$NL$
+$NL$
+
+$IF LENGTH(INTNO_ISR)$
+       const ISR_ENTRY _kernel_isr_queue_list[$LENGTH(INTNO_ISR)$] = {$NL$
+       $JOINEACH intno INTNO_ISR ",\n"$
+               $TAB${ $intno$, $ISR_QUEUE_HEADER[intno]$ }
+       $END$$NL$
+       };$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(QUEUE, _kernel_isr_queue_table);$NL$
+$END$$NL$
+
+$IF LENGTH(INTNO_ISR)$
+       QUEUE _kernel_isr_queue_table[$LENGTH(INTNO_ISR)$];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(QUEUE, _kernel_isr_queue_table);$NL$
+$END$$NL$
+
+$ 割込みサービスルーチン(ISR)呼出しのための割込みハンドラの生成
+$FOREACH intno INTNO_ISR$
+       $inhno = INHNO[intno]$
+
+$      // DEF_INH(inhno, { TA_NULL, _kernel_inthdr_<intno> } );
+       $INH.INHNO[inhno] = inhno$
+       $INH.INHATR[inhno] = VALUE("TA_NULL", 0)$
+       $INH.INTHDR[inhno] = CONCAT("_kernel_inthdr_", intno)$
+       $INH.ORDER_LIST = APPEND(INH.ORDER_LIST, inhno)$
+
+$      // ISR用の割込みハンドラ
+       void$NL$
+       _kernel_inthdr_$intno$(void)$NL$
+       {$NL$
+       $TAB$i_begin_int($intno$);$NL$
+       $TAB$call_isr($ISR_QUEUE_HEADER[intno]$);$NL$
+       $TAB$i_end_int($intno$);$NL$
+       }$NL$
+       $NL$
+$END$
+
+$ 静的に生成された割込みサービスルーチンの数
+#define TNUM_SISR      $LENGTH(ISR.ORDER_LIST)$$NL$
+#define TNUM_ISR       $LENGTH(ISR.ORDER_LIST) + num_aisrid$$NL$
+$NL$
+
+$ 割込みサービスルーチンID番号の最大値
+const ID _kernel_tmax_isrid = (TMIN_ISRID + TNUM_ISRID - 1);$NL$
+const uint_t _kernel_tnum_sisr = TNUM_SISR;$NL$
+$NL$
+
+$ 割込みサービスルーチン初期化ブロックの生成
+$IF LENGTH(ISR.ORDER_LIST)$
+       const ISRINIB _kernel_sisrinib_table[TNUM_SISR] = {$NL$
+       $JOINEACH order ISR.ORDER_LIST ",\n"$
+               $TAB${ ($ISR.ISRATR[order]$), ($ISR.EXINF[order]$), ($ISR.INTNO[order]$), ($ISR_QUEUE_HEADER[ISR.INTNO[order]]$), ($ISR.ISR[order]$), ($ISR.ISRPRI[order]$) }
+       $END$$NL$
+       };$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const ISRINIB, _kernel_sisrinib_table);$NL$
+$END$
+$NL$
+
+$ 動的生成割込みサービスルーチン用の割込みサービスルーチン初期化ブロッ
+$ クの生成
+$IF num_aisrid > 0$
+       ISRINIB _kernel_aisrinib_table[$num_aisrid$];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(ISRINIB, _kernel_aisrinib_table);$NL$
+$END$
+$NL$
+
+$ 割込みサービスルーチン管理ブロックの生成
+$IF LENGTH(ISR.ORDER_LIST) || num_aisrid > 0$
+       ISRCB _kernel_isrcb_table[TNUM_ISR];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(ISRCB, _kernel_isrcb_table);$NL$
+$END$
+$NL$
+
+$ 
+$  割込み管理機能のための標準的な初期化情報の生成
+$ 
+$ 割込みハンドラの初期化に必要な情報
+$IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INHINIB_TABLE,0)$
+
+$ 割込みハンドラ数
+#define TNUM_INHNO     $LENGTH(INH.ORDER_LIST)$$NL$
+const uint_t _kernel_tnum_inhno = TNUM_INHNO;$NL$
+$NL$
+$FOREACH inhno INH.ORDER_LIST$
+       $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
+               INTHDR_ENTRY($INH.INHNO[inhno]$, $+INH.INHNO[inhno]$, $INH.INTHDR[inhno]$)$NL$
+       $END$
+$END$
+$NL$
+
+$ 割込みハンドラ初期化テーブル
+$IF LENGTH(INH.ORDER_LIST)$
+       const INHINIB _kernel_inhinib_table[TNUM_INHNO] = {$NL$
+       $JOINEACH inhno INH.ORDER_LIST ",\n"$
+               $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
+                       $TAB${ ($INH.INHNO[inhno]$), ($INH.INHATR[inhno]$), (FP)(INT_ENTRY($INH.INHNO[inhno]$, $INH.INTHDR[inhno]$)) }
+               $ELSE$
+                       $TAB${ ($INH.INHNO[inhno]$), ($INH.INHATR[inhno]$), (FP)($INH.INTHDR[inhno]$) }
+               $END$
+       $END$$NL$
+       };$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const INHINIB, _kernel_inhinib_table);$NL$
+$END$$NL$
+$END$
+
+$ 割込み要求ラインの初期化に必要な情報
+$IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INHINTB_TABLE,0)$
+
+$ 割込み要求ライン数
+#define TNUM_INTNO     $LENGTH(INT.ORDER_LIST)$$NL$
+const uint_t _kernel_tnum_intno = TNUM_INTNO;$NL$
+$NL$
+
+$ 割込み要求ライン初期化テーブル
+$IF LENGTH(INT.ORDER_LIST)$
+       const INTINIB _kernel_intinib_table[TNUM_INTNO] = {$NL$
+       $JOINEACH intno INT.ORDER_LIST ",\n"$
+               $TAB${ ($INT.INTNO[intno]$), ($INT.INTATR[intno]$), ($INT.INTPRI[intno]$) }
+       $END$$NL$
+       };$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const INTINIB, _kernel_intinib_table);$NL$
+$END$$NL$
+$END$
+
+$ 
+$  CPU例外管理機能
+$ 
+/*$NL$
+$SPC$*  CPU Exception Management Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ CPU例外ハンドラに関するエラーチェック
+$i = 0$
+$FOREACH excno EXC.ORDER_LIST$
+$      // excnoがDEF_EXCに対するCPU例外ハンドラ番号として正しくない場合(E_PAR)
+       $IF !LENGTH(FIND(EXCNO_DEFEXC_VALID, EXC.EXCNO[excno]))$
+               $ERROR EXC.TEXT_LINE[excno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$
+       $END$
+
+$      // excnoがDEF_EXCによって設定済みの場合(E_OBJ)
+       $j = 0$
+       $FOREACH excno2 EXC.ORDER_LIST$
+               $IF EXC.EXCNO[excno] == EXC.EXCNO[excno2] && j < i$
+                       $ERROR EXC.TEXT_LINE[excno]$E_OBJ: $FORMAT(_("%1% `%2%\' in %3% is duplicated"), "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$
+               $END$
+               $j = j + 1$
+       $END$
+
+$      // excatrが(TA_NULL)でない場合(E_RSATR)
+       $IF (EXC.EXCATR[excno] & ~TARGET_EXCATR) != 0$
+               $ERROR EXC.TEXT_LINE[excno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "excatr", EXC.EXCATR[excno], "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$
+       $END$
+       $i = i + 1$
+$END$
+
+$ CPU例外ハンドラのための標準的な初期化情報の生成
+$IF !OMIT_INITIALIZE_EXCEPTION$
+
+$ CPU例外ハンドラ数
+#define TNUM_EXCNO     $LENGTH(EXC.ORDER_LIST)$$NL$
+const uint_t _kernel_tnum_excno = TNUM_EXCNO;$NL$
+$NL$
+$FOREACH excno EXC.ORDER_LIST$
+       EXCHDR_ENTRY($EXC.EXCNO[excno]$, $+EXC.EXCNO[excno]$, $EXC.EXCHDR[excno]$)$NL$
+$END$
+$NL$
+
+$ CPU例外ハンドラ初期化テーブル
+$IF LENGTH(EXC.ORDER_LIST)$
+       const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = {$NL$
+       $JOINEACH excno EXC.ORDER_LIST ",\n"$
+               $TAB${ ($EXC.EXCNO[excno]$), ($EXC.EXCATR[excno]$), (FP)(EXC_ENTRY($EXC.EXCNO[excno]$, $EXC.EXCHDR[excno]$)) }
+       $END$$NL$
+       };$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const EXCINIB, _kernel_excinib_table);$NL$
+$END$$NL$
+$END$
+
+$ 
+$  非タスクコンテキスト用のスタック領域
+$ 
+/*$NL$
+$SPC$*  Stack Area for Non-task Context$NL$
+$SPC$*/$NL$
+$NL$
+
+$IF !LENGTH(ICS.ORDER_LIST)$
+$      // DEF_ICSがない場合のデフォルト値の設定
+       #ifdef DEFAULT_ISTK$NL$
+       $NL$
+       #define TOPPERS_ISTKSZ          DEFAULT_ISTKSZ$NL$
+       #define TOPPERS_ISTK            DEFAULT_ISTK$NL$
+       $NL$
+       #else /* DEAULT_ISTK */$NL$
+       $NL$
+       static STK_T                            _kernel_istack[COUNT_STK_T(DEFAULT_ISTKSZ)];$NL$
+       #define TOPPERS_ISTKSZ          ROUND_STK_T(DEFAULT_ISTKSZ)$NL$
+       #define TOPPERS_ISTK            _kernel_istack$NL$
+       $NL$
+       #endif /* DEAULT_ISTK */$NL$
+$ELSE$
+
+$      // 静的API「DEF_ICS」が複数ある(E_OBJ)
+       $IF LENGTH(ICS.ORDER_LIST) > 1$
+               $ERROR$E_OBJ: $FORMAT(_("too many %1%"), "DEF_ICS")$$END$
+       $END$
+
+$      // istkszがスタック領域のサイズとして正しくない場合(E_PAR)
+       $IF !EQ(ICS.ISTK[1], "NULL") && CHECK_STKSZ_ALIGN
+                                                       && (ICS.ISTKSZ[1] & (CHECK_STKSZ_ALIGN - 1))$
+               $ERROR ICS.TEXT_LINE[1]$E_PAR: $FORMAT(_("%1% `%2%\' in %3% is not aligned"), "istksz", ICS.ISTKSZ[1], "DEF_ICS")$$END$
+       $END$
+
+       $IF EQ(ICS.ISTK[1], "NULL")$
+$              // スタック領域の自動割付け
+               static STK_T                            _kernel_istack[COUNT_STK_T($ICS.ISTKSZ[1]$)];$NL$
+               #define TOPPERS_ISTKSZ          ROUND_STK_T($ICS.ISTKSZ[1]$)$NL$
+               #define TOPPERS_ISTK            _kernel_istack$NL$
+       $ELSE$
+               #define TOPPERS_ISTKSZ          ($ICS.ISTKSZ[1]$)$NL$
+               #define TOPPERS_ISTK            ($ICS.ISTK[1]$)$NL$
+       $END$
+$END$
+$NL$
+
+$ 非タスクコンテキスト用のスタック領域
+const SIZE             _kernel_istksz = TOPPERS_ISTKSZ;$NL$
+STK_T *const   _kernel_istk = TOPPERS_ISTK;$NL$
+$NL$
+#ifdef TOPPERS_ISTKPT$NL$
+STK_T *const   _kernel_istkpt = TOPPERS_ISTKPT(TOPPERS_ISTK, TOPPERS_ISTKSZ);$NL$
+#endif /* TOPPERS_ISTKPT */$NL$
+$NL$
+
+$ 
+$  カーネルが割り付けるメモリ領域
+$ 
+/*$NL$
+$SPC$*  Memory Area Allocated by Kernel$NL$
+$SPC$*/$NL$
+$NL$
+
+$IF !LENGTH(KMM.ORDER_LIST)$
+$      // DEF_KMMがない場合のデフォルト値の設定
+       #define TOPPERS_KMMSZ           0$NL$
+       #define TOPPERS_KMM                     NULL$NL$
+$ELSE$
+
+$      // 静的API「DEF_KMM」が複数ある(E_OBJ)
+       $IF LENGTH(KMM.ORDER_LIST) > 1$
+               $ERROR$E_OBJ: $FORMAT(_("too many %1%"), "DEF_KMM")$$END$
+       $END$
+
+$      // kmmszがカーネルが割り付けるメモリ領域のサイズとして正しくない場合(E_PAR)
+       $IF !EQ(KMM.KMM[1], "NULL") && CHECK_MB_ALIGN
+                                                       && (KMM.MBSZ[1] & (CHECK_MB_ALIGN - 1))$
+               $ERROR KMM.TEXT_LINE[1]$E_PAR: $FORMAT(_("%1% `%2%\' in %3% is not aligned"), "kmmsz", KMM.KMMSZ[1], "DEF_KMM")$$END$
+       $END$
+
+       $IF EQ(KMM.KMM[1], "NULL")$
+$              // カーネルが割り付けるメモリ領域の自動割付け
+               static MB_T                                     _kernel_memory[TOPPERS_COUNT_SZ($KMM.KMMSZ[1]$, sizeof(MB_T))];$NL$
+               #define TOPPERS_KMMSZ           TOPPERS_ROUND_SZ($KMM.KMMSZ[1]$, sizeof(MB_T))$NL$
+               #define TOPPERS_KMM                     _kernel_memory$NL$
+       $ELSE$
+               #define TOPPERS_KMMSZ           ($KMM.KMMSZ[1]$)$NL$
+               #define TOPPERS_KMM                     ($KMM.KMM[1]$)$NL$
+       $END$
+$END$
+$NL$
+
+$ カーネルが割り付けるメモリ領域
+const SIZE             _kernel_kmmsz = TOPPERS_KMMSZ;$NL$
+MB_T *const            _kernel_kmm = TOPPERS_KMM;$NL$
+$NL$
+
+$ 
+$  タイムイベント管理
+$ 
+/*$NL$
+$SPC$*  Time Event Management$NL$
+$SPC$*/$NL$
+$NL$
+TMEVTN   _kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID + TNUM_ALMID];$NL$
+$NL$
+
+$ 
+$  各モジュールの初期化関数
+$ 
+/*$NL$
+$SPC$*  Module Initialization Function$NL$
+$SPC$*/$NL$
+$NL$
+void$NL$
+_kernel_initialize_object(void)$NL$
+{$NL$
+$TAB$_kernel_initialize_task();$NL$
+$IF num_semid$ _kernel_initialize_semaphore();$NL$$END$
+$IF num_flgid$ _kernel_initialize_eventflag();$NL$$END$
+$IF num_dtqid$ _kernel_initialize_dataqueue();$NL$$END$
+$IF num_pdqid$ _kernel_initialize_pridataq();$NL$$END$
+$IF num_mbxid$ _kernel_initialize_mailbox();$NL$$END$
+$IF num_mpfid$ _kernel_initialize_mempfix();$NL$$END$
+$IF num_cycid$ _kernel_initialize_cyclic();$NL$$END$
+$IF num_almid$ _kernel_initialize_alarm();$NL$$END$
+$TAB$_kernel_initialize_interrupt();$NL$
+$IF num_isr$   _kernel_initialize_isr();$NL$$END$
+$TAB$_kernel_initialize_exception();$NL$
+}$NL$
+$NL$
+
+$ 
+$  初期化ルーチンの実行関数
+$ 
+/*$NL$
+$SPC$*  Initialization Routine$NL$
+$SPC$*/$NL$
+$NL$
+void$NL$
+_kernel_call_inirtn(void)$NL$
+{$NL$
+$FOREACH order INI.ORDER_LIST$
+$      // iniatrが(TA_NULL)でない場合(E_RSATR)
+       $IF INI.INIATR[order] != 0$
+               $ERROR INI.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "iniatr", INI.INIATR[order], "inirtn", INI.INIRTN[order], "ATT_INI")$$END$
+       $END$
+       $TAB$((INIRTN)($INI.INIRTN[order]$))((intptr_t)($INI.EXINF[order]$));$NL$
+$END$
+}$NL$
+$NL$
+
+$ 
+$  終了処理ルーチンの実行関数
+$ 
+/*$NL$
+$SPC$*  Termination Routine$NL$
+$SPC$*/$NL$
+$NL$
+void$NL$
+_kernel_call_terrtn(void)$NL$
+{$NL$
+$FOREACH rorder TER.RORDER_LIST$
+$      // teratrが(TA_NULL)でない場合(E_RSATR)
+       $IF TER.TERATR[rorder] != 0$
+               $ERROR TER.TEXT_LINE[rorder]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "teratr", TER.TERATR[rorder], "terrtn", TER.TERRTN[rorder], "ATT_TER")$$END$
+       $END$
+       $TAB$((TERRTN)($TER.TERRTN[rorder]$))((intptr_t)($TER.EXINF[rorder]$));$NL$
+$END$
+}$NL$
+$NL$
diff --git a/asp/extension/dcre/kernel/kernel_api.csv b/asp/extension/dcre/kernel/kernel_api.csv
new file mode 100644 (file)
index 0000000..6d3448a
--- /dev/null
@@ -0,0 +1,28 @@
+tsk,CRE_TSK,#tskid { .tskatr &exinf &task +itskpri .stksz &stk },,
+tsk,DEF_TEX,%tskid { .texatr &texrtn },0,1,
+atsk,AID_TSK,.notsk,,
+sem,CRE_SEM,#semid { .sematr .isemcnt .maxsem },,
+asem,AID_SEM,.nosem,,
+flg,CRE_FLG,#flgid { .flgatr .iflgptn },,
+aflg,AID_FLG,.nosem,,
+dtq,CRE_DTQ,#dtqid { .dtqatr .dtqcnt &dtqmb },,
+adtq,AID_DTQ,.nodtq,,
+pdq,CRE_PDQ,#pdqid { .pdqatr .pdqcnt +maxdpri &pdqmb },,
+apdq,AID_PDQ,.nopdq,,
+mbx,CRE_MBX,#mbxid { .mbxatr +maxmpri &mprihd },,
+ambx,AID_MBX,.nombx,,
+mpf,CRE_MPF,#mpfid { .mpfatr .blkcnt .blksz &mpf &mpfmb },,
+ampf,AID_MPF,.nompf,,
+cyc,CRE_CYC,#cycid { .cycatr &exinf &cychdr .cyctim .cycphs },,
+acyc,AID_CYC,.nocyc,,
+alm,CRE_ALM,#almid { .almatr &exinf &almhdr },,
+aalm,AID_ALM,.noalm,,
+int,CFG_INT,.intno { .intatr +intpri },,
+isr,ATT_ISR,{ .isratr &exinf .intno &isr +isrpri },-1,
+aisr,AID_ISR,.noisr,,
+inh,DEF_INH,.inhno { .inhatr &inthdr },,
+ics,DEF_ICS,{ .istksz &istk },-1,
+kmm,DEF_KMM,{ .kmmsz &kmm },-1,
+exc,DEF_EXC,.excno { .excatr &exchdr },,
+ini,ATT_INI,{ .iniatr &exinf &inirtn },-1,
+ter,ATT_TER,{ .teratr &exinf &terrtn },-1,
diff --git a/asp/extension/dcre/kernel/kernel_check.tf b/asp/extension/dcre/kernel/kernel_check.tf
new file mode 100644 (file)
index 0000000..63b21aa
--- /dev/null
@@ -0,0 +1,194 @@
+$ ======================================================================
+$ 
+$   TOPPERS/ASP Kernel
+$       Toyohashi Open Platform for Embedded Real-Time Systems/
+$       Advanced Standard Profile Kernel
+$ 
+$   Copyright (C) 2008-2010 by Embedded and Real-Time Systems Laboratory
+$               Graduate School of Information Science, Nagoya Univ., JAPAN
+$  
+$   上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+$   ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+$   変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+$   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+$       権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+$       スコード中に含まれていること.
+$   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+$       用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+$       者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+$       の無保証規定を掲載すること.
+$   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+$       用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+$       と.
+$     (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+$         作権表示,この利用条件および下記の無保証規定を掲載すること.
+$     (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+$         報告すること.
+$   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+$       害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+$       また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+$       由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+$       免責すること.
+$  
+$   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+$   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+$   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+$   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+$   の責任を負わない.
+$ 
+$   @(#) $Id: kernel_check.tf 2062 2011-04-10 16:27:41Z ertl-hiro $
+$  
+$ =====================================================================
+
+$ 
+$  関数の先頭番地のチェック
+$ 
+$IF CHECK_FUNC_ALIGN || CHECK_FUNC_NONNULL$
+$      // タスクとタスク例外処理ルーチンの先頭番地のチェック
+       $tinib = SYMBOL("_kernel_tinib_table")$
+       $FOREACH tskid TSK.ID_LIST$
+               $task = PEEK(tinib + offsetof_TINIB_task, sizeof_FP)$
+               $IF CHECK_FUNC_ALIGN && (task & (CHECK_FUNC_ALIGN - 1)) != 0$
+                       $ERROR TSK.TEXT_LINE[tskid]$E_PAR: 
+                               $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
+                               "task", TSK.TASK[tskid], tskid, "CRE_TSK")$$END$
+               $END$
+               $IF CHECK_FUNC_NONNULL && task == 0$
+                       $ERROR TSK.TEXT_LINE[tskid]$E_PAR: 
+                               $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
+                               "task", TSK.TASK[tskid], tskid, "CRE_TSK")$$END$
+               $END$
+               $texrtn = PEEK(tinib + offsetof_TINIB_texrtn, sizeof_FP)$
+               $IF CHECK_FUNC_ALIGN && (texrtn & (CHECK_FUNC_ALIGN - 1)) != 0$
+                       $ERROR DEF_TEX.TEXT_LINE[tskid]$E_PAR: 
+                               $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
+                               "texrtn", TSK.TEXRTN[tskid], tskid, "DEF_TEX")$$END$
+               $END$
+               $tinib = tinib + sizeof_TINIB$
+       $END$
+
+$      // 周期ハンドラの先頭番地のチェック
+       $cycinib = SYMBOL("_kernel_cycinib_table")$
+       $FOREACH cycid CYC.ID_LIST$
+               $cychdr = PEEK(cycinib + offsetof_CYCINIB_cychdr, 4)$
+               $IF CHECK_FUNC_ALIGN && (cychdr & (CHECK_FUNC_ALIGN - 1)) != 0$
+                       $ERROR CYC.TEXT_LINE[cycid]$E_PAR: 
+                               $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
+                               "cychdr", CYC.CYCHDR[cycid], cycid, "CRE_CYC")$$END$
+               $END$
+               $IF CHECK_FUNC_NONNULL && cychdr == 0$
+                       $ERROR CYC.TEXT_LINE[cycid]$E_PAR: 
+                               $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
+                               "cychdr", CYC.CYCHDR[cycid], cycid, "CRE_CYC")$$END$
+               $END$
+               $cycinib = cycinib + sizeof_CYCINIB$
+       $END$
+
+$      // アラームハンドラの先頭番地のチェック
+       $alminib = SYMBOL("_kernel_alminib_table")$
+       $FOREACH almid ALM.ID_LIST$
+               $almhdr = PEEK(alminib + offsetof_ALMINIB_almhdr, 4)$
+               $IF CHECK_FUNC_ALIGN && (almhdr & (CHECK_FUNC_ALIGN - 1)) != 0$
+                       $ERROR ALM.TEXT_LINE[almid]$E_PAR: 
+                               $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
+                               "almhdr", ALM.ALMHDR[almid], almid, "CRE_ALM")$$END$
+               $END$
+               $IF CHECK_FUNC_NONNULL && almhdr == 0$
+                       $ERROR ALM.TEXT_LINE[almid]$E_PAR: 
+                               $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
+                               "almhdr", ALM.ALMHDR[almid], almid, "CRE_ALM")$$END$
+               $END$
+               $alminib = alminib + sizeof_ALMINIB$
+       $END$
+
+$      // 割込みサービスルーチンの先頭番地のチェック
+       $isrinib = SYMBOL("_kernel_sisrinib_table")$
+       $FOREACH order ISR.ORDER_LIST$
+               $isr = PEEK(isrinib + offsetof_ISRINIB_isr, 4)$
+               $IF CHECK_FUNC_ALIGN && (isr & (CHECK_FUNC_ALIGN - 1)) != 0$
+                       $ERROR ISR.TEXT_LINE[order]$E_PAR: 
+                               $FORMAT(_("%1% `%2%\' in %4% is not aligned"),
+                               "isr", ISR.ISR[order], "ATT_ISR")$$END$
+               $END$
+               $IF CHECK_FUNC_NONNULL && isr == 0$
+                       $ERROR ISR.TEXT_LINE[order]$E_PAR: 
+                               $FORMAT(_("%1% `%2%\' in %4% is null"),
+                               "isr", ISR.ISR[order], "ATT_ISR")$$END$
+               $END$
+               $isrinib = isrinib + sizeof_ISRINIB$
+       $END$
+$END$
+
+$ 
+$  スタック領域の先頭番地のチェック
+$ 
+$IF CHECK_STACK_ALIGN || CHECK_STACK_NONNULL$
+$      // タスクのスタック領域の先頭番地のチェック
+       $tinib = SYMBOL("_kernel_tinib_table")$
+       $FOREACH tskid TSK.ID_LIST$
+               $IF USE_TSKINICTXB$
+                       $stk = GET_STK_TSKINICTXB(tinib)$
+               $ELSE$
+                       $stk = PEEK(tinib + offsetof_TINIB_stk, sizeof_void_ptr)$
+               $END$
+               $IF CHECK_STACK_ALIGN && (stk & (CHECK_STACK_ALIGN - 1)) != 0$
+                       $ERROR TSK.TEXT_LINE[tskid]$E_PAR: 
+                               $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
+                               "stk", TSK.STK[tskid], tskid, "CRE_TSK")$$END$
+               $END$
+               $IF CHECK_STACK_NONNULL && stk == 0$
+                       $ERROR TSK.TEXT_LINE[tskid]$E_PAR: 
+                               $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
+                               "stk", TSK.STK[tskid], tskid, "CRE_TSK")$$END$
+               $END$
+               $tinib = tinib + sizeof_TINIB$
+       $END$
+
+$      // 非タスクコンテキスト用のスタック領域の先頭番地のチェック
+       $istk = PEEK(SYMBOL("_kernel_istk"), sizeof_void_ptr)$
+       $IF CHECK_STACK_ALIGN && (istk & (CHECK_STACK_ALIGN - 1)) != 0$
+               $ERROR ICE.TEXT_LINE[1]$E_PAR: 
+                       $FORMAT(_("%1% `%2%\' in %3% is not aligned"),
+                       "istk", ICS.ISTK[1], "DEF_ICS")$$END$
+       $END$
+       $IF CHECK_STACK_NONNULL && istk == 0$
+               $ERROR ICE.TEXT_LINE[1]$E_PAR: 
+                       $FORMAT(_("%1% `%2%\' in %3% is null"),
+                       "istk", ICS.ISTK[1], "DEF_ICS")$$END$
+       $END$
+$END$
+
+$ 
+$  固定長メモリプール領域の先頭番地のチェック
+$ 
+$IF CHECK_MPF_ALIGN || CHECK_MPF_NONNULL$
+$      // 固定長メモリプール領域の先頭番地のチェック
+       $mpfinib = SYMBOL("_kernel_mpfinib_table")$
+       $FOREACH mpfid MPF.ID_LIST$
+               $mpf = PEEK(mpfinib + offsetof_MPFINIB_mpf, sizeof_void_ptr)$
+               $IF CHECK_MPF_ALIGN && (mpf & (CHECK_MPF_ALIGN - 1)) != 0$
+                       $ERROR MPF.TEXT_LINE[mpfid]$E_PAR: 
+                               $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
+                               "mpf", MPF.MPF[mpfid], mpfid, "CRE_MPF")$$END$
+               $END$
+               $IF CHECK_MPF_NONNULL && mpf == 0$
+                       $ERROR MPF.TEXT_LINE[mpfid]$E_PAR: 
+                               $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
+                               "mpf", MPF.MPF[mpfid], mpfid, "CRE_MPF")$$END$
+               $END$
+               $mpfinib = mpfinib + sizeof_MPFINIB$
+       $END$
+$END$
+
+$ 
+$  カーネルが割り付けるメモリ領域の先頭番地のチェック
+$ 
+$IF CHECK_MB_ALIGN$
+$      // カーネルが割り付けるメモリ領域の先頭番地のチェック
+       $kmm = PEEK(SYMBOL("_kernel_kmm"), sizeof_void_ptr)$
+       $IF CHECK_MB_ALIGN && (kmm & (CHECK_MB_ALIGN - 1)) != 0$
+               $ERROR KMM.TEXT_LINE[1]$E_PAR: 
+                       $FORMAT(_("%1% `%2%\' in %3% is not aligned"),
+                       "kmm", KMM.KMM[1], "DEF_KMM")$$END$
+       $END$
+$END$
diff --git a/asp/extension/dcre/kernel/kernel_def.csv b/asp/extension/dcre/kernel/kernel_def.csv
new file mode 100644 (file)
index 0000000..eb0b8a2
--- /dev/null
@@ -0,0 +1,116 @@
+SIL_ENDIAN_BIG,#defined(SIL_ENDIAN_BIG)
+SIL_ENDIAN_LITTLE,#defined(SIL_ENDIAN_LITTLE)
+TA_NULL,TA_NULL
+TA_ACT,TA_ACT
+TA_TPRI,TA_TPRI
+TA_MPRI,TA_MPRI
+TA_WMUL,TA_WMUL
+TA_CLR,TA_CLR
+TA_STA,TA_STA
+TA_NONKERNEL,TA_NONKERNEL
+TA_ENAINT,TA_ENAINT
+TA_EDGE,TA_EDGE
+TMIN_TPRI,TMIN_TPRI,signed
+TMAX_TPRI,TMAX_TPRI,signed
+TMIN_DPRI,TMIN_DPRI,signed
+TMAX_DPRI,TMAX_DPRI,signed
+TMIN_MPRI,TMIN_MPRI,signed
+TMAX_MPRI,TMAX_MPRI,signed
+TMIN_ISRPRI,TMIN_ISRPRI,signed
+TMAX_ISRPRI,TMAX_ISRPRI,signed
+TMAX_MAXSEM,TMAX_MAXSEM
+TMAX_RELTIM,TMAX_RELTIM
+TMIN_INTPRI,TMIN_INTPRI,signed
+OMIT_INITIALIZE_INTERRUPT,#defined(OMIT_INITIALIZE_INTERRUPT)
+OMIT_INITIALIZE_EXCEPTION,#defined(OMIT_INITIALIZE_EXCEPTION)
+USE_TSKINICTXB,#defined(USE_TSKINICTXB)
+TARGET_TSKATR,#defined(TARGET_TSKATR),,TARGET_TSKATR
+TARGET_INTATR,#defined(TARGET_INTATR),,TARGET_INTATR
+TARGET_INHATR,#defined(TARGET_INHATR),,TARGET_INHATR
+TARGET_ISRATR,#defined(TARGET_ISRATR),,TARGET_ISRATR
+TARGET_EXCATR,#defined(TARGET_EXCATR),,TARGET_EXCATR
+TARGET_MIN_STKSZ,#defined(TARGET_MIN_STKSZ),,TARGET_MIN_STKSZ
+CHECK_STKSZ_ALIGN,#defined(CHECK_STKSZ_ALIGN),,CHECK_STKSZ_ALIGN
+CHECK_FUNC_ALIGN,#defined(CHECK_FUNC_ALIGN),,CHECK_FUNC_ALIGN
+CHECK_FUNC_NONNULL,#defined(CHECK_FUNC_NONNULL)
+CHECK_STACK_ALIGN,#defined(CHECK_STACK_ALIGN),,CHECK_STACK_ALIGN
+CHECK_STACK_NONNULL,#defined(CHECK_STACK_NONNULL)
+CHECK_MPF_ALIGN,#defined(CHECK_MPF_ALIGN),,CHECK_MPF_ALIGN
+CHECK_MPF_NONNULL,#defined(CHECK_MPF_NONNULL)
+CHECK_MB_ALIGN,#defined(CHECK_MB_ALIGN),,CHECK_MB_ALIGN
+sizeof_ID,sizeof(ID)
+sizeof_uint_t,sizeof(uint_t)
+sizeof_SIZE,sizeof(SIZE)
+sizeof_ATR,sizeof(ATR)
+sizeof_PRI,sizeof(PRI)
+sizeof_void_ptr,sizeof(void*)
+sizeof_VP,sizeof(void*)
+sizeof_intptr_t,sizeof(intptr_t)
+sizeof_FP,sizeof(FP)
+sizeof_INHNO,sizeof(INHNO)
+sizeof_INTNO,sizeof(INTNO)
+sizeof_EXCNO,sizeof(EXCNO)
+sizeof_TINIB,sizeof(TINIB)
+offsetof_TINIB_tskatr,"offsetof(TINIB,tskatr)"
+offsetof_TINIB_exinf,"offsetof(TINIB,exinf)"
+offsetof_TINIB_task,"offsetof(TINIB,task)"
+offsetof_TINIB_ipriority,"offsetof(TINIB,ipriority)"
+offsetof_TINIB_stksz,#!defined(USE_TSKINICTXB),,"offsetof(TINIB,stksz)"
+offsetof_TINIB_stk,#!defined(USE_TSKINICTXB),,"offsetof(TINIB,stk)"
+offsetof_TINIB_texatr,"offsetof(TINIB,texatr)"
+offsetof_TINIB_texrtn,"offsetof(TINIB,texrtn)"
+sizeof_SEMINIB,sizeof(SEMINIB)
+offsetof_SEMINIB_sematr,"offsetof(SEMINIB,sematr)"
+offsetof_SEMINIB_isemcnt,"offsetof(SEMINIB,isemcnt)"
+offsetof_SEMINIB_maxsem,"offsetof(SEMINIB,maxsem)"
+sizeof_FLGPTN,sizeof(FLGPTN)
+sizeof_FLGINIB,sizeof(FLGINIB)
+offsetof_FLGINIB_flgatr,"offsetof(FLGINIB,flgatr)"
+offsetof_FLGINIB_iflgptn,"offsetof(FLGINIB,iflgptn)"
+sizeof_DTQINIB,sizeof(DTQINIB)
+offsetof_DTQINIB_dtqatr,"offsetof(DTQINIB,dtqatr)"
+offsetof_DTQINIB_dtqcnt,"offsetof(DTQINIB,dtqcnt)"
+offsetof_DTQINIB_p_dtqmb,"offsetof(DTQINIB,p_dtqmb)"
+sizeof_PDQINIB,sizeof(PDQINIB)
+offsetof_PDQINIB_pdqatr,"offsetof(PDQINIB,pdqatr)"
+offsetof_PDQINIB_pdqcnt,"offsetof(PDQINIB,pdqcnt)"
+offsetof_PDQINIB_maxdpri,"offsetof(PDQINIB,maxdpri)"
+offsetof_PDQINIB_p_pdqmb,"offsetof(PDQINIB,p_pdqmb)"
+sizeof_MBXINIB,sizeof(MBXINIB)
+offsetof_MBXINIB_mbxatr,"offsetof(MBXINIB,mbxatr)"
+offsetof_MBXINIB_maxmpri,"offsetof(MBXINIB,maxmpri)"
+sizeof_MPFINIB,sizeof(MPFINIB)
+offsetof_MPFINIB_mpfatr,"offsetof(MPFINIB,mpfatr)"
+offsetof_MPFINIB_blkcnt,"offsetof(MPFINIB,blkcnt)"
+offsetof_MPFINIB_blksz,"offsetof(MPFINIB,blksz)"
+offsetof_MPFINIB_mpf,"offsetof(MPFINIB,mpf)"
+offsetof_MPFINIB_p_mpfmb,"offsetof(MPFINIB,p_mpfmb)"
+sizeof_CYCINIB,sizeof(CYCINIB)
+offsetof_CYCINIB_cycatr,"offsetof(CYCINIB,cycatr)"
+offsetof_CYCINIB_exinf,"offsetof(CYCINIB,exinf)"
+offsetof_CYCINIB_cychdr,"offsetof(CYCINIB,cychdr)"
+offsetof_CYCINIB_cyctim,"offsetof(CYCINIB,cyctim)"
+offsetof_CYCINIB_cycphs,"offsetof(CYCINIB,cycphs)"
+sizeof_ALMINIB,sizeof(ALMINIB)
+offsetof_ALMINIB_almatr,"offsetof(ALMINIB,almatr)"
+offsetof_ALMINIB_exinf,"offsetof(ALMINIB,exinf)"
+offsetof_ALMINIB_almhdr,"offsetof(ALMINIB,almhdr)"
+sizeof_ISRINIB,sizeof(ISRINIB)
+offsetof_ISRINIB_isratr,"offsetof(ISRINIB,isratr)"
+offsetof_ISRINIB_exinf,"offsetof(ISRINIB,exinf)"
+offsetof_ISRINIB_intno,"offsetof(ISRINIB,intno)"
+offsetof_ISRINIB_p_isr_queue,"offsetof(ISRINIB,p_isr_queue)"
+offsetof_ISRINIB_isr,"offsetof(ISRINIB,isr)"
+offsetof_ISRINIB_isrpri,"offsetof(ISRINIB,isrpri)"
+sizeof_INHINIB,#!defined(OMIT_INITIALIZE_INTERRUPT),,sizeof(INHINIB)
+offset_INHINIB_inhno,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,inhno)"
+offset_INHINIB_inhatr,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,inhatr)"
+offset_INHINIB_int_entry,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,int_entry)"
+sizeof_INTINIB,#!defined(OMIT_INITIALIZE_INTERRUPT),,sizeof(INTINIB)
+offset_INTINIB_intno,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intno)"
+offset_INTINIB_intatr,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intatr)"
+offset_INTINIB_intpri,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intpri)"
+sizeof_EXCINIB,#!defined(OMIT_INITIALIZE_EXCEPTION),,sizeof(EXCINIB)
+offset_EXCINIB_excno,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,excno)"
+offset_EXCINIB_excatr,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,excatr)"
+offset_EXCINIB_exc_entry,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,exc_entry)"
diff --git a/asp/extension/dcre/kernel/kernel_impl.h b/asp/extension/dcre/kernel/kernel_impl.h
new file mode 100644 (file)
index 0000000..8ad5d02
--- /dev/null
@@ -0,0 +1,217 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2004-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: kernel_impl.h 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ *             TOPPERS/ASPカーネル内部向け標準ヘッダファイル
+ *
+ *  このヘッダファイルは,カーネルを構成するプログラムのソースファイル
+ *  で必ずインクルードするべき標準ヘッダファイルである.
+ *
+ *  アセンブリ言語のソースファイルからこのファイルをインクルードする時
+ *  は,TOPPERS_MACRO_ONLYを定義しておく.これにより,マクロ定義以外を
+ *  除くようになっている.
+ */
+
+#ifndef TOPPERS_KERNEL_IMPL_H
+#define TOPPERS_KERNEL_IMPL_H
+
+/*
+ *  カーネルの内部識別名のリネーム
+ */
+#include "kernel_rename.h"
+
+/*
+ *  アプリケーションと共通のヘッダファイル
+ */
+#include <kernel.h>
+
+/*
+ *  システムログ機能のための定義
+ */
+#include <t_syslog.h>
+
+/*
+ *  型キャストを行うマクロの定義
+ */
+#ifndef CAST
+#define CAST(type, val)                ((type)(val))
+#endif /* CAST */
+
+/*
+ *  ターゲット依存情報の定義
+ */
+#include "target_config.h"
+
+/*
+ *  すべての関数をコンパイルするための定義
+ */
+#ifdef ALLFUNC
+#include "allfunc.h"
+#endif /* ALLFUNC */
+
+/*
+ *  ビットフィールドでの符号無し整数型
+ *
+ *  8ビット以下の幅のビットフィールドで,符号無し整数値を保持したい場合
+ *  に用いるべきデータ型.ANSI Cでは,ビットフィールドのデータ型には
+ *  intとunsigned intしか許されないため,デフォルトの定義はunsigned
+ *  intとしているが,ターゲットおよびツール依存で,unsigned charまたは
+ *  unsigned shortに定義した方が効率が良い場合がある.
+ */
+#ifndef BIT_FIELD_UINT
+#define BIT_FIELD_UINT         unsigned int
+#endif /* BIT_FIELD_UINT */
+
+/*
+ *  ビットフィールドでのブール型
+ *
+ *  1ビット幅のビットフィールドで,ブール値を保持したい場合に用いるべき
+ *  データ型.デフォルトではBIT_FIELD_UINTと同一に定義しているが,ブー
+ *  ル値を保持することを明示するために別の名称としている.
+ */
+#ifndef BIT_FIELD_BOOL
+#define BIT_FIELD_BOOL         BIT_FIELD_UINT
+#endif /* BIT_FIELD_BOOL */
+
+/*
+ *  オブジェクトIDの最小値の定義
+ */
+#define TMIN_TSKID             1               /* タスクIDの最小値 */
+#define TMIN_SEMID             1               /* セマフォIDの最小値 */
+#define TMIN_FLGID             1               /* フラグIDの最小値 */
+#define TMIN_DTQID             1               /* データキューIDの最小値 */
+#define TMIN_PDQID             1               /* 優先度データキューIDの最小値 */
+#define TMIN_MBXID             1               /* メールボックスIDの最小値 */
+#define TMIN_MPFID             1               /* 固定長メモリプールIDの最小値 */
+#define TMIN_CYCID             1               /* 周期ハンドラIDの最小値 */
+#define TMIN_ALMID             1               /* アラームハンドラIDの最小値 */
+#define TMIN_ISRID             1               /* 割込みサービスルーチンIDの最小値 */
+
+/*
+ *  優先度の段階数の定義
+ */
+#define TNUM_TPRI              (TMAX_TPRI - TMIN_TPRI + 1)
+#define TNUM_MPRI              (TMAX_MPRI - TMIN_MPRI + 1)
+#define TNUM_INTPRI            (TMAX_INTPRI - TMIN_INTPRI + 1)
+
+/*
+ *  カーネル内部で使用する属性の定義
+ */
+#define TA_NOEXS               ((ATR)(-1))                     /* 未登録状態 */
+
+#ifndef TA_MEMALLOC
+#define TA_MEMALLOC            UINT_C(0x8000)          /* メモリ領域をカーネルで確保 */
+#endif /* TA_MEMALLOC */
+#ifndef TA_MBALLOC
+#define TA_MBALLOC             UINT_C(0x4000)          /* 管理領域をカーネルで確保 */
+#endif /* TA_MBALLOC */
+
+/*
+ *  ターゲット定義のエラーチェックマクロのデフォルト値の定義
+ */
+#ifndef TARGET_TSKATR
+#define TARGET_TSKATR          0U              /* ターゲット定義のタスク属性 */
+#endif /* TARGET_TSKATR */
+
+#ifndef TARGET_ISRATR
+#define TARGET_ISRATR          0U              /* ターゲット定義のISR属性 */
+#endif /* TARGET_ISRATR */
+
+/*
+ *  ヘッダファイルを持たないモジュールの関数・変数の宣言
+ */
+#ifndef TOPPERS_MACRO_ONLY
+
+/*
+ *  各モジュールの初期化(kernel_cfg.c)
+ */
+extern void    initialize_object(void);
+
+/*
+ *  初期化ルーチンの実行(kernel_cfg.c)
+ */
+extern void    call_inirtn(void);
+
+/*
+ *  終了処理ルーチンの実行(kernel_cfg.c)
+ */
+extern void    call_terrtn(void);
+
+/*
+ *  非タスクコンテキスト用のスタック領域(kernel_cfg.c)
+ */
+extern const SIZE      istksz;         /* スタック領域のサイズ(丸めた値) */
+extern STK_T *const    istk;           /* スタック領域の先頭番地 */
+#ifdef TOPPERS_ISTKPT
+extern STK_T *const    istkpt;         /* スタックポインタの初期値 */
+#endif /* TOPPERS_ISTKPT */
+
+/*
+ *  カーネルが割り付けるメモリ領域(kernel_cfg.c)
+ */
+extern const SIZE      kmmsz;          /* カーネルが割り付けるメモリ領域のサイズ */
+extern MB_T *const     kmm;            /* カーネルが割り付けるメモリ領域の先頭番地 */
+
+/*
+ *  カーネル動作状態フラグ(startup.c)
+ */
+extern bool_t  kerflg;
+
+/*
+ *  カーネルの起動(startup.c)
+ */
+extern void    sta_ker(void);
+
+/*
+ *  カーネルの終了処理(startup.c)
+ */
+extern void    exit_kernel(void);
+
+/*
+ *  カーネルの割り付けるメモリ領域の管理(startup.c)
+ */
+extern void initialize_kmm(void);
+extern void *kernel_malloc(SIZE size);
+extern void kernel_free(void *ptr);
+
+#endif /* TOPPERS_MACRO_ONLY */
+#endif /* TOPPERS_KERNEL_IMPL_H */
diff --git a/asp/extension/dcre/kernel/kernel_rename.def b/asp/extension/dcre/kernel/kernel_rename.def
new file mode 100644 (file)
index 0000000..5d940fe
--- /dev/null
@@ -0,0 +1,179 @@
+# startup.c
+kerflg
+exit_kernel
+initialize_kmm
+kernel_malloc
+kernel_free
+
+# task.c
+p_runtsk
+p_schedtsk
+reqflg
+ipmflg
+disdsp
+dspflg
+ready_queue
+ready_primap
+free_tcb
+initialize_task
+search_schedtsk
+make_runnable
+make_non_runnable
+make_dormant
+make_active
+change_priority
+rotate_ready_queue
+call_texrtn
+calltex
+
+# wait.c
+make_wait_tmout
+wait_complete
+wait_tmout
+wait_tmout_ok
+wait_release
+wobj_make_wait
+wobj_make_wait_tmout
+init_wait_queue
+
+# time_event.c
+current_time
+min_time
+next_time
+next_subtime
+last_index
+initialize_tmevt
+tmevt_up
+tmevt_down
+tmevtb_insert
+tmevtb_delete
+tmevt_lefttim
+signal_time
+
+# semaphore.c
+free_semcb
+initialize_semaphore
+
+# eventflag.c
+free_flgcb
+initialize_eventflag
+check_flg_cond
+
+# dataqueue.c
+free_dtqcb
+initialize_dataqueue
+enqueue_data
+force_enqueue_data
+dequeue_data
+send_data
+force_send_data
+receive_data
+
+# pridataq.c
+free_pdqcb
+initialize_pridataq
+enqueue_pridata
+dequeue_pridata
+send_pridata
+receive_pridata
+
+# mailbox.c
+free_mbxcb
+initialize_mailbox
+
+# mempfix.c
+free_mpfcb
+initialize_mempfix
+get_mpf_block
+
+# cyclic.c
+free_cyccb
+initialize_cyclic
+call_cychdr
+
+# alarm.c
+free_almcb
+initialize_alarm
+call_almhdr
+
+# interrupt.c
+free_isrcb
+initialize_isr
+inthdr_call_isr
+initialize_interrupt
+
+# exception.c
+initialize_exception
+
+# kernel_cfg.c
+initialize_object
+call_inirtn
+call_terrtn
+tmax_tskid
+tmax_stskid
+tinib_table
+atinib_table
+tcb_table
+torder_table
+tmax_semid
+tmax_ssemid
+seminib_table
+aseminib_table
+semcb_table
+tmax_flgid
+tmax_sflgid
+flginib_table
+aflginib_table
+flgcb_table
+tmax_dtqid
+tmax_adtqid
+dtqinib_table
+sdtqinib_table
+dtqcb_table
+tmax_pdqid
+tmax_apdqid
+pdqinib_table
+apdqinib_table
+pdqcb_table
+tmax_mbxid
+tmax_smbxid
+mbxinib_table
+ambxinib_table
+mbxcb_table
+tmax_mpfid
+tmax_smpfid
+mpfinib_table
+ampfinib_table
+mpfcb_table
+tmax_cycid
+tmax_scycid
+cycinib_table
+acycinib_table
+cyccb_table
+tmax_almid
+tmax_salmid
+alminib_table
+aalminib_table
+almcb_table
+tnum_isr_queue
+isr_queue_table
+isr_queue_list
+tmax_isrid
+tnum_sisr
+sisrinib_table
+aisrinib_table
+isrcb_table
+tnum_inhno
+inhinib_table
+tnum_intno
+intinib_table
+tnum_excno
+excinib_table
+tmevt_heap
+istksz
+istk
+istkpt
+kmmsz
+kmm
+
+INCLUDE "target"
diff --git a/asp/extension/dcre/kernel/kernel_rename.h b/asp/extension/dcre/kernel/kernel_rename.h
new file mode 100644 (file)
index 0000000..666ca64
--- /dev/null
@@ -0,0 +1,430 @@
+/* This file is generated from kernel_rename.def by genrename. */
+
+#ifndef TOPPERS_KERNEL_RENAME_H
+#define TOPPERS_KERNEL_RENAME_H
+
+/*
+ *  startup.c
+ */
+#define kerflg                                         _kernel_kerflg
+#define exit_kernel                                    _kernel_exit_kernel
+#define initialize_kmm                         _kernel_initialize_kmm
+#define kernel_malloc                          _kernel_kernel_malloc
+#define kernel_free                                    _kernel_kernel_free
+
+/*
+ *  task.c
+ */
+#define p_runtsk                                       _kernel_p_runtsk
+#define p_schedtsk                                     _kernel_p_schedtsk
+#define reqflg                                         _kernel_reqflg
+#define ipmflg                                         _kernel_ipmflg
+#define disdsp                                         _kernel_disdsp
+#define dspflg                                         _kernel_dspflg
+#define ready_queue                                    _kernel_ready_queue
+#define ready_primap                           _kernel_ready_primap
+#define free_tcb                                       _kernel_free_tcb
+#define initialize_task                                _kernel_initialize_task
+#define search_schedtsk                                _kernel_search_schedtsk
+#define make_runnable                          _kernel_make_runnable
+#define make_non_runnable                      _kernel_make_non_runnable
+#define make_dormant                           _kernel_make_dormant
+#define make_active                                    _kernel_make_active
+#define change_priority                                _kernel_change_priority
+#define rotate_ready_queue                     _kernel_rotate_ready_queue
+#define call_texrtn                                    _kernel_call_texrtn
+#define calltex                                                _kernel_calltex
+
+/*
+ *  wait.c
+ */
+#define make_wait_tmout                                _kernel_make_wait_tmout
+#define wait_complete                          _kernel_wait_complete
+#define wait_tmout                                     _kernel_wait_tmout
+#define wait_tmout_ok                          _kernel_wait_tmout_ok
+#define wait_release                           _kernel_wait_release
+#define wobj_make_wait                         _kernel_wobj_make_wait
+#define wobj_make_wait_tmout           _kernel_wobj_make_wait_tmout
+#define init_wait_queue                                _kernel_init_wait_queue
+
+/*
+ *  time_event.c
+ */
+#define current_time                           _kernel_current_time
+#define min_time                                       _kernel_min_time
+#define next_time                                      _kernel_next_time
+#define next_subtime                           _kernel_next_subtime
+#define last_index                                     _kernel_last_index
+#define initialize_tmevt                       _kernel_initialize_tmevt
+#define tmevt_up                                       _kernel_tmevt_up
+#define tmevt_down                                     _kernel_tmevt_down
+#define tmevtb_insert                          _kernel_tmevtb_insert
+#define tmevtb_delete                          _kernel_tmevtb_delete
+#define tmevt_lefttim                          _kernel_tmevt_lefttim
+#define signal_time                                    _kernel_signal_time
+
+/*
+ *  semaphore.c
+ */
+#define free_semcb                                     _kernel_free_semcb
+#define initialize_semaphore           _kernel_initialize_semaphore
+
+/*
+ *  eventflag.c
+ */
+#define free_flgcb                                     _kernel_free_flgcb
+#define initialize_eventflag           _kernel_initialize_eventflag
+#define check_flg_cond                         _kernel_check_flg_cond
+
+/*
+ *  dataqueue.c
+ */
+#define free_dtqcb                                     _kernel_free_dtqcb
+#define initialize_dataqueue           _kernel_initialize_dataqueue
+#define enqueue_data                           _kernel_enqueue_data
+#define force_enqueue_data                     _kernel_force_enqueue_data
+#define dequeue_data                           _kernel_dequeue_data
+#define send_data                                      _kernel_send_data
+#define force_send_data                                _kernel_force_send_data
+#define receive_data                           _kernel_receive_data
+
+/*
+ *  pridataq.c
+ */
+#define free_pdqcb                                     _kernel_free_pdqcb
+#define initialize_pridataq                    _kernel_initialize_pridataq
+#define enqueue_pridata                                _kernel_enqueue_pridata
+#define dequeue_pridata                                _kernel_dequeue_pridata
+#define send_pridata                           _kernel_send_pridata
+#define receive_pridata                                _kernel_receive_pridata
+
+/*
+ *  mailbox.c
+ */
+#define free_mbxcb                                     _kernel_free_mbxcb
+#define initialize_mailbox                     _kernel_initialize_mailbox
+
+/*
+ *  mempfix.c
+ */
+#define free_mpfcb                                     _kernel_free_mpfcb
+#define initialize_mempfix                     _kernel_initialize_mempfix
+#define get_mpf_block                          _kernel_get_mpf_block
+
+/*
+ *  cyclic.c
+ */
+#define free_cyccb                                     _kernel_free_cyccb
+#define initialize_cyclic                      _kernel_initialize_cyclic
+#define call_cychdr                                    _kernel_call_cychdr
+
+/*
+ *  alarm.c
+ */
+#define free_almcb                                     _kernel_free_almcb
+#define initialize_alarm                       _kernel_initialize_alarm
+#define call_almhdr                                    _kernel_call_almhdr
+
+/*
+ *  interrupt.c
+ */
+#define free_isrcb                                     _kernel_free_isrcb
+#define initialize_isr                         _kernel_initialize_isr
+#define inthdr_call_isr                                _kernel_inthdr_call_isr
+#define initialize_interrupt           _kernel_initialize_interrupt
+
+/*
+ *  exception.c
+ */
+#define initialize_exception           _kernel_initialize_exception
+
+/*
+ *  kernel_cfg.c
+ */
+#define initialize_object                      _kernel_initialize_object
+#define call_inirtn                                    _kernel_call_inirtn
+#define call_terrtn                                    _kernel_call_terrtn
+#define tmax_tskid                                     _kernel_tmax_tskid
+#define tmax_stskid                                    _kernel_tmax_stskid
+#define tinib_table                                    _kernel_tinib_table
+#define atinib_table                           _kernel_atinib_table
+#define tcb_table                                      _kernel_tcb_table
+#define torder_table                           _kernel_torder_table
+#define tmax_semid                                     _kernel_tmax_semid
+#define tmax_ssemid                                    _kernel_tmax_ssemid
+#define seminib_table                          _kernel_seminib_table
+#define aseminib_table                         _kernel_aseminib_table
+#define semcb_table                                    _kernel_semcb_table
+#define tmax_flgid                                     _kernel_tmax_flgid
+#define tmax_sflgid                                    _kernel_tmax_sflgid
+#define flginib_table                          _kernel_flginib_table
+#define aflginib_table                         _kernel_aflginib_table
+#define flgcb_table                                    _kernel_flgcb_table
+#define tmax_dtqid                                     _kernel_tmax_dtqid
+#define tmax_adtqid                                    _kernel_tmax_adtqid
+#define dtqinib_table                          _kernel_dtqinib_table
+#define sdtqinib_table                         _kernel_sdtqinib_table
+#define dtqcb_table                                    _kernel_dtqcb_table
+#define tmax_pdqid                                     _kernel_tmax_pdqid
+#define tmax_apdqid                                    _kernel_tmax_apdqid
+#define pdqinib_table                          _kernel_pdqinib_table
+#define apdqinib_table                         _kernel_apdqinib_table
+#define pdqcb_table                                    _kernel_pdqcb_table
+#define tmax_mbxid                                     _kernel_tmax_mbxid
+#define tmax_smbxid                                    _kernel_tmax_smbxid
+#define mbxinib_table                          _kernel_mbxinib_table
+#define ambxinib_table                         _kernel_ambxinib_table
+#define mbxcb_table                                    _kernel_mbxcb_table
+#define tmax_mpfid                                     _kernel_tmax_mpfid
+#define tmax_smpfid                                    _kernel_tmax_smpfid
+#define mpfinib_table                          _kernel_mpfinib_table
+#define ampfinib_table                         _kernel_ampfinib_table
+#define mpfcb_table                                    _kernel_mpfcb_table
+#define tmax_cycid                                     _kernel_tmax_cycid
+#define tmax_scycid                                    _kernel_tmax_scycid
+#define cycinib_table                          _kernel_cycinib_table
+#define acycinib_table                         _kernel_acycinib_table
+#define cyccb_table                                    _kernel_cyccb_table
+#define tmax_almid                                     _kernel_tmax_almid
+#define tmax_salmid                                    _kernel_tmax_salmid
+#define alminib_table                          _kernel_alminib_table
+#define aalminib_table                         _kernel_aalminib_table
+#define almcb_table                                    _kernel_almcb_table
+#define tnum_isr_queue                         _kernel_tnum_isr_queue
+#define isr_queue_table                                _kernel_isr_queue_table
+#define isr_queue_list                         _kernel_isr_queue_list
+#define tmax_isrid                                     _kernel_tmax_isrid
+#define tnum_sisr                                      _kernel_tnum_sisr
+#define sisrinib_table                         _kernel_sisrinib_table
+#define aisrinib_table                         _kernel_aisrinib_table
+#define isrcb_table                                    _kernel_isrcb_table
+#define tnum_inhno                                     _kernel_tnum_inhno
+#define inhinib_table                          _kernel_inhinib_table
+#define tnum_intno                                     _kernel_tnum_intno
+#define intinib_table                          _kernel_intinib_table
+#define tnum_excno                                     _kernel_tnum_excno
+#define excinib_table                          _kernel_excinib_table
+#define tmevt_heap                                     _kernel_tmevt_heap
+#define istksz                                         _kernel_istksz
+#define istk                                           _kernel_istk
+#define istkpt                                         _kernel_istkpt
+#define kmmsz                                          _kernel_kmmsz
+#define kmm                                                    _kernel_kmm
+
+
+#ifdef TOPPERS_LABEL_ASM
+
+/*
+ *  startup.c
+ */
+#define _kerflg                                                __kernel_kerflg
+#define _exit_kernel                           __kernel_exit_kernel
+#define _initialize_kmm                                __kernel_initialize_kmm
+#define _kernel_malloc                         __kernel_kernel_malloc
+#define _kernel_free                           __kernel_kernel_free
+
+/*
+ *  task.c
+ */
+#define _p_runtsk                                      __kernel_p_runtsk
+#define _p_schedtsk                                    __kernel_p_schedtsk
+#define _reqflg                                                __kernel_reqflg
+#define _ipmflg                                                __kernel_ipmflg
+#define _disdsp                                                __kernel_disdsp
+#define _dspflg                                                __kernel_dspflg
+#define _ready_queue                           __kernel_ready_queue
+#define _ready_primap                          __kernel_ready_primap
+#define _free_tcb                                      __kernel_free_tcb
+#define _initialize_task                       __kernel_initialize_task
+#define _search_schedtsk                       __kernel_search_schedtsk
+#define _make_runnable                         __kernel_make_runnable
+#define _make_non_runnable                     __kernel_make_non_runnable
+#define _make_dormant                          __kernel_make_dormant
+#define _make_active                           __kernel_make_active
+#define _change_priority                       __kernel_change_priority
+#define _rotate_ready_queue                    __kernel_rotate_ready_queue
+#define _call_texrtn                           __kernel_call_texrtn
+#define _calltex                                       __kernel_calltex
+
+/*
+ *  wait.c
+ */
+#define _make_wait_tmout                       __kernel_make_wait_tmout
+#define _wait_complete                         __kernel_wait_complete
+#define _wait_tmout                                    __kernel_wait_tmout
+#define _wait_tmout_ok                         __kernel_wait_tmout_ok
+#define _wait_release                          __kernel_wait_release
+#define _wobj_make_wait                                __kernel_wobj_make_wait
+#define _wobj_make_wait_tmout          __kernel_wobj_make_wait_tmout
+#define _init_wait_queue                       __kernel_init_wait_queue
+
+/*
+ *  time_event.c
+ */
+#define _current_time                          __kernel_current_time
+#define _min_time                                      __kernel_min_time
+#define _next_time                                     __kernel_next_time
+#define _next_subtime                          __kernel_next_subtime
+#define _last_index                                    __kernel_last_index
+#define _initialize_tmevt                      __kernel_initialize_tmevt
+#define _tmevt_up                                      __kernel_tmevt_up
+#define _tmevt_down                                    __kernel_tmevt_down
+#define _tmevtb_insert                         __kernel_tmevtb_insert
+#define _tmevtb_delete                         __kernel_tmevtb_delete
+#define _tmevt_lefttim                         __kernel_tmevt_lefttim
+#define _signal_time                           __kernel_signal_time
+
+/*
+ *  semaphore.c
+ */
+#define _free_semcb                                    __kernel_free_semcb
+#define _initialize_semaphore          __kernel_initialize_semaphore
+
+/*
+ *  eventflag.c
+ */
+#define _free_flgcb                                    __kernel_free_flgcb
+#define _initialize_eventflag          __kernel_initialize_eventflag
+#define _check_flg_cond                                __kernel_check_flg_cond
+
+/*
+ *  dataqueue.c
+ */
+#define _free_dtqcb                                    __kernel_free_dtqcb
+#define _initialize_dataqueue          __kernel_initialize_dataqueue
+#define _enqueue_data                          __kernel_enqueue_data
+#define _force_enqueue_data                    __kernel_force_enqueue_data
+#define _dequeue_data                          __kernel_dequeue_data
+#define _send_data                                     __kernel_send_data
+#define _force_send_data                       __kernel_force_send_data
+#define _receive_data                          __kernel_receive_data
+
+/*
+ *  pridataq.c
+ */
+#define _free_pdqcb                                    __kernel_free_pdqcb
+#define _initialize_pridataq           __kernel_initialize_pridataq
+#define _enqueue_pridata                       __kernel_enqueue_pridata
+#define _dequeue_pridata                       __kernel_dequeue_pridata
+#define _send_pridata                          __kernel_send_pridata
+#define _receive_pridata                       __kernel_receive_pridata
+
+/*
+ *  mailbox.c
+ */
+#define _free_mbxcb                                    __kernel_free_mbxcb
+#define _initialize_mailbox                    __kernel_initialize_mailbox
+
+/*
+ *  mempfix.c
+ */
+#define _free_mpfcb                                    __kernel_free_mpfcb
+#define _initialize_mempfix                    __kernel_initialize_mempfix
+#define _get_mpf_block                         __kernel_get_mpf_block
+
+/*
+ *  cyclic.c
+ */
+#define _free_cyccb                                    __kernel_free_cyccb
+#define _initialize_cyclic                     __kernel_initialize_cyclic
+#define _call_cychdr                           __kernel_call_cychdr
+
+/*
+ *  alarm.c
+ */
+#define _free_almcb                                    __kernel_free_almcb
+#define _initialize_alarm                      __kernel_initialize_alarm
+#define _call_almhdr                           __kernel_call_almhdr
+
+/*
+ *  interrupt.c
+ */
+#define _free_isrcb                                    __kernel_free_isrcb
+#define _initialize_isr                                __kernel_initialize_isr
+#define _inthdr_call_isr                       __kernel_inthdr_call_isr
+#define _initialize_interrupt          __kernel_initialize_interrupt
+
+/*
+ *  exception.c
+ */
+#define _initialize_exception          __kernel_initialize_exception
+
+/*
+ *  kernel_cfg.c
+ */
+#define _initialize_object                     __kernel_initialize_object
+#define _call_inirtn                           __kernel_call_inirtn
+#define _call_terrtn                           __kernel_call_terrtn
+#define _tmax_tskid                                    __kernel_tmax_tskid
+#define _tmax_stskid                           __kernel_tmax_stskid
+#define _tinib_table                           __kernel_tinib_table
+#define _atinib_table                          __kernel_atinib_table
+#define _tcb_table                                     __kernel_tcb_table
+#define _torder_table                          __kernel_torder_table
+#define _tmax_semid                                    __kernel_tmax_semid
+#define _tmax_ssemid                           __kernel_tmax_ssemid
+#define _seminib_table                         __kernel_seminib_table
+#define _aseminib_table                                __kernel_aseminib_table
+#define _semcb_table                           __kernel_semcb_table
+#define _tmax_flgid                                    __kernel_tmax_flgid
+#define _tmax_sflgid                           __kernel_tmax_sflgid
+#define _flginib_table                         __kernel_flginib_table
+#define _aflginib_table                                __kernel_aflginib_table
+#define _flgcb_table                           __kernel_flgcb_table
+#define _tmax_dtqid                                    __kernel_tmax_dtqid
+#define _tmax_adtqid                           __kernel_tmax_adtqid
+#define _dtqinib_table                         __kernel_dtqinib_table
+#define _sdtqinib_table                                __kernel_sdtqinib_table
+#define _dtqcb_table                           __kernel_dtqcb_table
+#define _tmax_pdqid                                    __kernel_tmax_pdqid
+#define _tmax_apdqid                           __kernel_tmax_apdqid
+#define _pdqinib_table                         __kernel_pdqinib_table
+#define _apdqinib_table                                __kernel_apdqinib_table
+#define _pdqcb_table                           __kernel_pdqcb_table
+#define _tmax_mbxid                                    __kernel_tmax_mbxid
+#define _tmax_smbxid                           __kernel_tmax_smbxid
+#define _mbxinib_table                         __kernel_mbxinib_table
+#define _ambxinib_table                                __kernel_ambxinib_table
+#define _mbxcb_table                           __kernel_mbxcb_table
+#define _tmax_mpfid                                    __kernel_tmax_mpfid
+#define _tmax_smpfid                           __kernel_tmax_smpfid
+#define _mpfinib_table                         __kernel_mpfinib_table
+#define _ampfinib_table                                __kernel_ampfinib_table
+#define _mpfcb_table                           __kernel_mpfcb_table
+#define _tmax_cycid                                    __kernel_tmax_cycid
+#define _tmax_scycid                           __kernel_tmax_scycid
+#define _cycinib_table                         __kernel_cycinib_table
+#define _acycinib_table                                __kernel_acycinib_table
+#define _cyccb_table                           __kernel_cyccb_table
+#define _tmax_almid                                    __kernel_tmax_almid
+#define _tmax_salmid                           __kernel_tmax_salmid
+#define _alminib_table                         __kernel_alminib_table
+#define _aalminib_table                                __kernel_aalminib_table
+#define _almcb_table                           __kernel_almcb_table
+#define _tnum_isr_queue                                __kernel_tnum_isr_queue
+#define _isr_queue_table                       __kernel_isr_queue_table
+#define _isr_queue_list                                __kernel_isr_queue_list
+#define _tmax_isrid                                    __kernel_tmax_isrid
+#define _tnum_sisr                                     __kernel_tnum_sisr
+#define _sisrinib_table                                __kernel_sisrinib_table
+#define _aisrinib_table                                __kernel_aisrinib_table
+#define _isrcb_table                           __kernel_isrcb_table
+#define _tnum_inhno                                    __kernel_tnum_inhno
+#define _inhinib_table                         __kernel_inhinib_table
+#define _tnum_intno                                    __kernel_tnum_intno
+#define _intinib_table                         __kernel_intinib_table
+#define _tnum_excno                                    __kernel_tnum_excno
+#define _excinib_table                         __kernel_excinib_table
+#define _tmevt_heap                                    __kernel_tmevt_heap
+#define _istksz                                                __kernel_istksz
+#define _istk                                          __kernel_istk
+#define _istkpt                                                __kernel_istkpt
+#define _kmmsz                                         __kernel_kmmsz
+#define _kmm                                           __kernel_kmm
+
+
+#endif /* TOPPERS_LABEL_ASM */
+
+#include "target_rename.h"
+
+#endif /* TOPPERS_KERNEL_RENAME_H */
diff --git a/asp/extension/dcre/kernel/kernel_unrename.h b/asp/extension/dcre/kernel/kernel_unrename.h
new file mode 100644 (file)
index 0000000..2a0f980
--- /dev/null
@@ -0,0 +1,431 @@
+/* This file is generated from kernel_rename.def by genrename. */
+
+/* This file is included only when kernel_rename.h has been included. */
+#ifdef TOPPERS_KERNEL_RENAME_H
+#undef TOPPERS_KERNEL_RENAME_H
+
+/*
+ *  startup.c
+ */
+#undef kerflg
+#undef exit_kernel
+#undef initialize_kmm
+#undef kernel_malloc
+#undef kernel_free
+
+/*
+ *  task.c
+ */
+#undef p_runtsk
+#undef p_schedtsk
+#undef reqflg
+#undef ipmflg
+#undef disdsp
+#undef dspflg
+#undef ready_queue
+#undef ready_primap
+#undef free_tcb
+#undef initialize_task
+#undef search_schedtsk
+#undef make_runnable
+#undef make_non_runnable
+#undef make_dormant
+#undef make_active
+#undef change_priority
+#undef rotate_ready_queue
+#undef call_texrtn
+#undef calltex
+
+/*
+ *  wait.c
+ */
+#undef make_wait_tmout
+#undef wait_complete
+#undef wait_tmout
+#undef wait_tmout_ok
+#undef wait_release
+#undef wobj_make_wait
+#undef wobj_make_wait_tmout
+#undef init_wait_queue
+
+/*
+ *  time_event.c
+ */
+#undef current_time
+#undef min_time
+#undef next_time
+#undef next_subtime
+#undef last_index
+#undef initialize_tmevt
+#undef tmevt_up
+#undef tmevt_down
+#undef tmevtb_insert
+#undef tmevtb_delete
+#undef tmevt_lefttim
+#undef signal_time
+
+/*
+ *  semaphore.c
+ */
+#undef free_semcb
+#undef initialize_semaphore
+
+/*
+ *  eventflag.c
+ */
+#undef free_flgcb
+#undef initialize_eventflag
+#undef check_flg_cond
+
+/*
+ *  dataqueue.c
+ */
+#undef free_dtqcb
+#undef initialize_dataqueue
+#undef enqueue_data
+#undef force_enqueue_data
+#undef dequeue_data
+#undef send_data
+#undef force_send_data
+#undef receive_data
+
+/*
+ *  pridataq.c
+ */
+#undef free_pdqcb
+#undef initialize_pridataq
+#undef enqueue_pridata
+#undef dequeue_pridata
+#undef send_pridata
+#undef receive_pridata
+
+/*
+ *  mailbox.c
+ */
+#undef free_mbxcb
+#undef initialize_mailbox
+
+/*
+ *  mempfix.c
+ */
+#undef free_mpfcb
+#undef initialize_mempfix
+#undef get_mpf_block
+
+/*
+ *  cyclic.c
+ */
+#undef free_cyccb
+#undef initialize_cyclic
+#undef call_cychdr
+
+/*
+ *  alarm.c
+ */
+#undef free_almcb
+#undef initialize_alarm
+#undef call_almhdr
+
+/*
+ *  interrupt.c
+ */
+#undef free_isrcb
+#undef initialize_isr
+#undef inthdr_call_isr
+#undef initialize_interrupt
+
+/*
+ *  exception.c
+ */
+#undef initialize_exception
+
+/*
+ *  kernel_cfg.c
+ */
+#undef initialize_object
+#undef call_inirtn
+#undef call_terrtn
+#undef tmax_tskid
+#undef tmax_stskid
+#undef tinib_table
+#undef atinib_table
+#undef tcb_table
+#undef torder_table
+#undef tmax_semid
+#undef tmax_ssemid
+#undef seminib_table
+#undef aseminib_table
+#undef semcb_table
+#undef tmax_flgid
+#undef tmax_sflgid
+#undef flginib_table
+#undef aflginib_table
+#undef flgcb_table
+#undef tmax_dtqid
+#undef tmax_adtqid
+#undef dtqinib_table
+#undef sdtqinib_table
+#undef dtqcb_table
+#undef tmax_pdqid
+#undef tmax_apdqid
+#undef pdqinib_table
+#undef apdqinib_table
+#undef pdqcb_table
+#undef tmax_mbxid
+#undef tmax_smbxid
+#undef mbxinib_table
+#undef ambxinib_table
+#undef mbxcb_table
+#undef tmax_mpfid
+#undef tmax_smpfid
+#undef mpfinib_table
+#undef ampfinib_table
+#undef mpfcb_table
+#undef tmax_cycid
+#undef tmax_scycid
+#undef cycinib_table
+#undef acycinib_table
+#undef cyccb_table
+#undef tmax_almid
+#undef tmax_salmid
+#undef alminib_table
+#undef aalminib_table
+#undef almcb_table
+#undef tnum_isr_queue
+#undef isr_queue_table
+#undef isr_queue_list
+#undef tmax_isrid
+#undef tnum_sisr
+#undef sisrinib_table
+#undef aisrinib_table
+#undef isrcb_table
+#undef tnum_inhno
+#undef inhinib_table
+#undef tnum_intno
+#undef intinib_table
+#undef tnum_excno
+#undef excinib_table
+#undef tmevt_heap
+#undef istksz
+#undef istk
+#undef istkpt
+#undef kmmsz
+#undef kmm
+
+
+#ifdef TOPPERS_LABEL_ASM
+
+/*
+ *  startup.c
+ */
+#undef _kerflg
+#undef _exit_kernel
+#undef _initialize_kmm
+#undef _kernel_malloc
+#undef _kernel_free
+
+/*
+ *  task.c
+ */
+#undef _p_runtsk
+#undef _p_schedtsk
+#undef _reqflg
+#undef _ipmflg
+#undef _disdsp
+#undef _dspflg
+#undef _ready_queue
+#undef _ready_primap
+#undef _free_tcb
+#undef _initialize_task
+#undef _search_schedtsk
+#undef _make_runnable
+#undef _make_non_runnable
+#undef _make_dormant
+#undef _make_active
+#undef _change_priority
+#undef _rotate_ready_queue
+#undef _call_texrtn
+#undef _calltex
+
+/*
+ *  wait.c
+ */
+#undef _make_wait_tmout
+#undef _wait_complete
+#undef _wait_tmout
+#undef _wait_tmout_ok
+#undef _wait_release
+#undef _wobj_make_wait
+#undef _wobj_make_wait_tmout
+#undef _init_wait_queue
+
+/*
+ *  time_event.c
+ */
+#undef _current_time
+#undef _min_time
+#undef _next_time
+#undef _next_subtime
+#undef _last_index
+#undef _initialize_tmevt
+#undef _tmevt_up
+#undef _tmevt_down
+#undef _tmevtb_insert
+#undef _tmevtb_delete
+#undef _tmevt_lefttim
+#undef _signal_time
+
+/*
+ *  semaphore.c
+ */
+#undef _free_semcb
+#undef _initialize_semaphore
+
+/*
+ *  eventflag.c
+ */
+#undef _free_flgcb
+#undef _initialize_eventflag
+#undef _check_flg_cond
+
+/*
+ *  dataqueue.c
+ */
+#undef _free_dtqcb
+#undef _initialize_dataqueue
+#undef _enqueue_data
+#undef _force_enqueue_data
+#undef _dequeue_data
+#undef _send_data
+#undef _force_send_data
+#undef _receive_data
+
+/*
+ *  pridataq.c
+ */
+#undef _free_pdqcb
+#undef _initialize_pridataq
+#undef _enqueue_pridata
+#undef _dequeue_pridata
+#undef _send_pridata
+#undef _receive_pridata
+
+/*
+ *  mailbox.c
+ */
+#undef _free_mbxcb
+#undef _initialize_mailbox
+
+/*
+ *  mempfix.c
+ */
+#undef _free_mpfcb
+#undef _initialize_mempfix
+#undef _get_mpf_block
+
+/*
+ *  cyclic.c
+ */
+#undef _free_cyccb
+#undef _initialize_cyclic
+#undef _call_cychdr
+
+/*
+ *  alarm.c
+ */
+#undef _free_almcb
+#undef _initialize_alarm
+#undef _call_almhdr
+
+/*
+ *  interrupt.c
+ */
+#undef _free_isrcb
+#undef _initialize_isr
+#undef _inthdr_call_isr
+#undef _initialize_interrupt
+
+/*
+ *  exception.c
+ */
+#undef _initialize_exception
+
+/*
+ *  kernel_cfg.c
+ */
+#undef _initialize_object
+#undef _call_inirtn
+#undef _call_terrtn
+#undef _tmax_tskid
+#undef _tmax_stskid
+#undef _tinib_table
+#undef _atinib_table
+#undef _tcb_table
+#undef _torder_table
+#undef _tmax_semid
+#undef _tmax_ssemid
+#undef _seminib_table
+#undef _aseminib_table
+#undef _semcb_table
+#undef _tmax_flgid
+#undef _tmax_sflgid
+#undef _flginib_table
+#undef _aflginib_table
+#undef _flgcb_table
+#undef _tmax_dtqid
+#undef _tmax_adtqid
+#undef _dtqinib_table
+#undef _sdtqinib_table
+#undef _dtqcb_table
+#undef _tmax_pdqid
+#undef _tmax_apdqid
+#undef _pdqinib_table
+#undef _apdqinib_table
+#undef _pdqcb_table
+#undef _tmax_mbxid
+#undef _tmax_smbxid
+#undef _mbxinib_table
+#undef _ambxinib_table
+#undef _mbxcb_table
+#undef _tmax_mpfid
+#undef _tmax_smpfid
+#undef _mpfinib_table
+#undef _ampfinib_table
+#undef _mpfcb_table
+#undef _tmax_cycid
+#undef _tmax_scycid
+#undef _cycinib_table
+#undef _acycinib_table
+#undef _cyccb_table
+#undef _tmax_almid
+#undef _tmax_salmid
+#undef _alminib_table
+#undef _aalminib_table
+#undef _almcb_table
+#undef _tnum_isr_queue
+#undef _isr_queue_table
+#undef _isr_queue_list
+#undef _tmax_isrid
+#undef _tnum_sisr
+#undef _sisrinib_table
+#undef _aisrinib_table
+#undef _isrcb_table
+#undef _tnum_inhno
+#undef _inhinib_table
+#undef _tnum_intno
+#undef _intinib_table
+#undef _tnum_excno
+#undef _excinib_table
+#undef _tmevt_heap
+#undef _istksz
+#undef _istk
+#undef _istkpt
+#undef _kmmsz
+#undef _kmm
+
+
+#endif /* TOPPERS_LABEL_ASM */
+
+#include "target_unrename.h"
+
+#endif /* TOPPERS_KERNEL_RENAME_H */
diff --git a/asp/extension/dcre/kernel/mailbox.c b/asp/extension/dcre/kernel/mailbox.c
new file mode 100644 (file)
index 0000000..2e2dbc7
--- /dev/null
@@ -0,0 +1,530 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: mailbox.c 1970 2010-11-20 11:27:06Z ertl-hiro $
+ */
+
+/*
+ *             メールボックス機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "wait.h"
+#include "mailbox.h"
+
+/*
+ *  トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_ACRE_MBX_ENTER
+#define LOG_ACRE_MBX_ENTER(pk_cmbx)
+#endif /* LOG_ACRE_MBX_ENTER */
+
+#ifndef LOG_ACRE_MBX_LEAVE
+#define LOG_ACRE_MBX_LEAVE(ercd)
+#endif /* LOG_ACRE_MBX_LEAVE */
+
+#ifndef LOG_DEL_MBX_ENTER
+#define LOG_DEL_MBX_ENTER(mbxid)
+#endif /* LOG_DEL_MBX_ENTER */
+
+#ifndef LOG_DEL_MBX_LEAVE
+#define LOG_DEL_MBX_LEAVE(ercd)
+#endif /* LOG_DEL_MBX_LEAVE */
+
+#ifndef LOG_SND_MBX_ENTER
+#define LOG_SND_MBX_ENTER(mbxid, pk_msg)
+#endif /* LOG_SND_MBX_ENTER */
+
+#ifndef LOG_SND_MBX_LEAVE
+#define LOG_SND_MBX_LEAVE(ercd)
+#endif /* LOG_SND_MBX_LEAVE */
+
+#ifndef LOG_RCV_MBX_ENTER
+#define LOG_RCV_MBX_ENTER(mbxid, ppk_msg)
+#endif /* LOG_RCV_MBX_ENTER */
+
+#ifndef LOG_RCV_MBX_LEAVE
+#define LOG_RCV_MBX_LEAVE(ercd, pk_msg)
+#endif /* LOG_RCV_MBX_LEAVE */
+
+#ifndef LOG_PRCV_MBX_ENTER
+#define LOG_PRCV_MBX_ENTER(mbxid, ppk_msg)
+#endif /* LOG_PRCV_MBX_ENTER */
+
+#ifndef LOG_PRCV_MBX_LEAVE
+#define LOG_PRCV_MBX_LEAVE(ercd, pk_msg)
+#endif /* LOG_PRCV_MBX_LEAVE */
+
+#ifndef LOG_TRCV_MBX_ENTER
+#define LOG_TRCV_MBX_ENTER(mbxid, ppk_msg, tmout)
+#endif /* LOG_TRCV_MBX_ENTER */
+
+#ifndef LOG_TRCV_MBX_LEAVE
+#define LOG_TRCV_MBX_LEAVE(ercd, pk_msg)
+#endif /* LOG_TRCV_MBX_LEAVE */
+
+#ifndef LOG_INI_MBX_ENTER
+#define LOG_INI_MBX_ENTER(mbxid)
+#endif /* LOG_INI_MBX_ENTER */
+
+#ifndef LOG_INI_MBX_LEAVE
+#define LOG_INI_MBX_LEAVE(ercd)
+#endif /* LOG_INI_MBX_LEAVE */
+
+#ifndef LOG_REF_MBX_ENTER
+#define LOG_REF_MBX_ENTER(mbxid, pk_rmbx)
+#endif /* LOG_REF_MBX_ENTER */
+
+#ifndef LOG_REF_MBX_LEAVE
+#define LOG_REF_MBX_LEAVE(ercd, pk_rmbx)
+#endif /* LOG_REF_MBX_LEAVE */
+
+/*
+ *  メールボックスの数
+ */
+#define tnum_mbx       ((uint_t)(tmax_mbxid - TMIN_MBXID + 1))
+#define tnum_smbx      ((uint_t)(tmax_smbxid - TMIN_MBXID + 1))
+
+/*
+ *  メールボックスIDからメールボックス管理ブロックを取り出すためのマクロ
+ */
+#define INDEX_MBX(mbxid)       ((uint_t)((mbxid) - TMIN_MBXID))
+#define get_mbxcb(mbxid)       (&(mbxcb_table[INDEX_MBX(mbxid)]))
+
+#ifdef TOPPERS_mbxini
+
+/*
+ *  使用していないメールボックス管理ブロックのリスト
+ */
+QUEUE  free_mbxcb;
+
+/* 
+ *  メールボックス機能の初期化
+ */
+void
+initialize_mailbox(void)
+{
+       uint_t  i, j;
+       MBXCB   *p_mbxcb;
+       MBXINIB *p_mbxinib;
+
+       for (p_mbxcb = mbxcb_table, i = 0; i < tnum_smbx; p_mbxcb++, i++) {
+               queue_initialize(&(p_mbxcb->wait_queue));
+               p_mbxcb->p_mbxinib = &(mbxinib_table[i]);
+               p_mbxcb->pk_head = NULL;
+       }
+       queue_initialize(&free_mbxcb);
+       for (j = 0; i < tnum_mbx; p_mbxcb++, i++, j++) {
+               p_mbxinib = &(ambxinib_table[j]);
+               p_mbxinib->mbxatr = TA_NOEXS;
+               p_mbxcb->p_mbxinib = ((const MBXINIB *) p_mbxinib);
+               queue_insert_prev(&free_mbxcb, &(p_mbxcb->wait_queue));
+       }
+}
+
+#endif /* TOPPERS_mbxini */
+
+/*
+ *  メッセージ優先度の取出し
+ */
+#define        MSGPRI(pk_msg)  (((T_MSG_PRI *) pk_msg)->msgpri)
+
+/*
+ *  優先度順メッセージキューへの挿入
+ */
+Inline void
+enqueue_msg_pri(T_MSG **ppk_prevmsg_next, T_MSG *pk_msg)
+{
+       T_MSG   *pk_nextmsg;
+
+       while ((pk_nextmsg = *ppk_prevmsg_next) != NULL) {
+               if (MSGPRI(pk_nextmsg) > MSGPRI(pk_msg)) {
+                       break;
+               }
+               ppk_prevmsg_next = &(pk_nextmsg->pk_next);
+       }
+       pk_msg->pk_next = pk_nextmsg;
+       *ppk_prevmsg_next = pk_msg;
+}
+
+/*
+ *  メールボックスの生成
+ */
+#ifdef TOPPERS_acre_mbx
+
+ER_UINT
+acre_mbx(const T_CMBX *pk_cmbx)
+{
+       MBXCB   *p_mbxcb;
+       MBXINIB *p_mbxinib;
+       ER              ercd;
+
+       LOG_ACRE_MBX_ENTER(pk_cmbx);
+       CHECK_TSKCTX_UNL();
+       CHECK_RSATR(pk_cmbx->mbxatr, TA_TPRI|TA_MPRI);
+       CHECK_MPRI(pk_cmbx->maxmpri);
+       CHECK_NOSPT(pk_cmbx->mprihd == NULL);
+
+       t_lock_cpu();
+       if (queue_empty(&free_mbxcb)) {
+               ercd = E_NOID;
+       }
+       else {
+               p_mbxcb = ((MBXCB *) queue_delete_next(&free_mbxcb));
+               p_mbxinib = (MBXINIB *)(p_mbxcb->p_mbxinib);
+               p_mbxinib->mbxatr = pk_cmbx->mbxatr;
+               p_mbxinib->maxmpri = pk_cmbx->maxmpri;
+
+               queue_initialize(&(p_mbxcb->wait_queue));
+               p_mbxcb->pk_head = NULL;
+               ercd = MBXID(p_mbxcb);
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_ACRE_MBX_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_acre_mbx */
+
+/*
+ *  メールボックスの削除
+ */
+#ifdef TOPPERS_del_mbx
+
+ER
+del_mbx(ID mbxid)
+{
+       MBXCB   *p_mbxcb;
+       MBXINIB *p_mbxinib;
+       bool_t  dspreq;
+       ER              ercd;
+
+       LOG_DEL_MBX_ENTER(mbxid);
+       CHECK_TSKCTX_UNL();
+       CHECK_MBXID(mbxid);
+       p_mbxcb = get_mbxcb(mbxid);
+
+       t_lock_cpu();
+       if (p_mbxcb->p_mbxinib->mbxatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (MBXID(p_mbxcb) > tmax_smbxid) {
+               dspreq = init_wait_queue(&(p_mbxcb->wait_queue));
+               p_mbxinib = (MBXINIB *)(p_mbxcb->p_mbxinib);
+               p_mbxinib->mbxatr = TA_NOEXS;
+               queue_insert_prev(&free_mbxcb, &(p_mbxcb->wait_queue));
+               if (dspreq) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_OBJ;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_DEL_MBX_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_del_mbx */
+
+/*
+ *  メールボックスへの送信
+ */
+#ifdef TOPPERS_snd_mbx
+
+ER
+snd_mbx(ID mbxid, T_MSG *pk_msg)
+{
+       MBXCB   *p_mbxcb;
+       TCB             *p_tcb;
+       ER              ercd;
+    
+       LOG_SND_MBX_ENTER(mbxid, pk_msg);
+       CHECK_TSKCTX_UNL();
+       CHECK_MBXID(mbxid);
+       p_mbxcb = get_mbxcb(mbxid);
+       CHECK_PAR((p_mbxcb->p_mbxinib->mbxatr & TA_MPRI) == 0U
+                               || (TMIN_MPRI <= MSGPRI(pk_msg)
+                                       && MSGPRI(pk_msg) <= p_mbxcb->p_mbxinib->maxmpri));
+
+       t_lock_cpu();
+       if (p_mbxcb->p_mbxinib->mbxatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (!queue_empty(&(p_mbxcb->wait_queue))) {
+               p_tcb = (TCB *) queue_delete_next(&(p_mbxcb->wait_queue));
+               ((WINFO_MBX *)(p_tcb->p_winfo))->pk_msg = pk_msg;
+               if (wait_complete(p_tcb)) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else if ((p_mbxcb->p_mbxinib->mbxatr & TA_MPRI) != 0U) {
+               enqueue_msg_pri(&(p_mbxcb->pk_head), pk_msg);
+               ercd = E_OK;
+       }
+       else {
+               pk_msg->pk_next = NULL;
+               if (p_mbxcb->pk_head != NULL) {
+                       p_mbxcb->pk_last->pk_next = pk_msg;
+               }
+               else {
+                       p_mbxcb->pk_head = pk_msg;
+               }
+               p_mbxcb->pk_last = pk_msg;
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_SND_MBX_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_snd_mbx */
+
+/*
+ *  メールボックスからの受信
+ */
+#ifdef TOPPERS_rcv_mbx
+
+ER
+rcv_mbx(ID mbxid, T_MSG **ppk_msg)
+{
+       MBXCB   *p_mbxcb;
+       WINFO_MBX winfo_mbx;
+       ER              ercd;
+    
+       LOG_RCV_MBX_ENTER(mbxid, ppk_msg);
+       CHECK_DISPATCH();
+       CHECK_MBXID(mbxid);
+       p_mbxcb = get_mbxcb(mbxid);
+    
+       t_lock_cpu();
+       if (p_mbxcb->p_mbxinib->mbxatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (p_mbxcb->pk_head != NULL) {
+               *ppk_msg = p_mbxcb->pk_head;
+               p_mbxcb->pk_head = (*ppk_msg)->pk_next;
+               ercd = E_OK;
+       }
+       else {
+               p_runtsk->tstat = (TS_WAITING | TS_WAIT_MBX);
+               wobj_make_wait((WOBJCB *) p_mbxcb, (WINFO_WOBJ *) &winfo_mbx);
+               dispatch();
+               ercd = winfo_mbx.winfo.wercd;
+               if (ercd == E_OK) {
+                       *ppk_msg = winfo_mbx.pk_msg;
+               }
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_RCV_MBX_LEAVE(ercd, *ppk_msg);
+       return(ercd);
+}
+
+#endif /* TOPPERS_rcv_mbx */
+
+/*
+ *  メールボックスからの受信(ポーリング)
+ */
+#ifdef TOPPERS_prcv_mbx
+
+ER
+prcv_mbx(ID mbxid, T_MSG **ppk_msg)
+{
+       MBXCB   *p_mbxcb;
+       ER              ercd;
+    
+       LOG_PRCV_MBX_ENTER(mbxid, ppk_msg);
+       CHECK_TSKCTX_UNL();
+       CHECK_MBXID(mbxid);
+       p_mbxcb = get_mbxcb(mbxid);
+    
+       t_lock_cpu();
+       if (p_mbxcb->p_mbxinib->mbxatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (p_mbxcb->pk_head != NULL) {
+               *ppk_msg = p_mbxcb->pk_head;
+               p_mbxcb->pk_head = (*ppk_msg)->pk_next;
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_TMOUT;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_PRCV_MBX_LEAVE(ercd, *ppk_msg);
+       return(ercd);
+}
+
+#endif /* TOPPERS_prcv_mbx */
+
+/*
+ *  メールボックスからの受信(タイムアウトあり)
+ */
+#ifdef TOPPERS_trcv_mbx
+
+ER
+trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout)
+{
+       MBXCB   *p_mbxcb;
+       WINFO_MBX winfo_mbx;
+       TMEVTB  tmevtb;
+       ER              ercd;
+    
+       LOG_TRCV_MBX_ENTER(mbxid, ppk_msg, tmout);
+       CHECK_DISPATCH();
+       CHECK_MBXID(mbxid);
+       CHECK_TMOUT(tmout);
+       p_mbxcb = get_mbxcb(mbxid);
+    
+       t_lock_cpu();
+       if (p_mbxcb->p_mbxinib->mbxatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (p_mbxcb->pk_head != NULL) {
+               *ppk_msg = p_mbxcb->pk_head;
+               p_mbxcb->pk_head = (*ppk_msg)->pk_next;
+               ercd = E_OK;
+       }
+       else if (tmout == TMO_POL) {
+               ercd = E_TMOUT;
+       }
+       else {
+               p_runtsk->tstat = (TS_WAITING | TS_WAIT_MBX);
+               wobj_make_wait_tmout((WOBJCB *) p_mbxcb, (WINFO_WOBJ *) &winfo_mbx,
+                                                                                                               &tmevtb, tmout);
+               dispatch();
+               ercd = winfo_mbx.winfo.wercd;
+               if (ercd == E_OK) {
+                       *ppk_msg = winfo_mbx.pk_msg;
+               }
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_TRCV_MBX_LEAVE(ercd, *ppk_msg);
+       return(ercd);
+}
+
+#endif /* TOPPERS_trcv_mbx */
+
+/*
+ *  メールボックスの再初期化
+ */
+#ifdef TOPPERS_ini_mbx
+
+ER
+ini_mbx(ID mbxid)
+{
+       MBXCB   *p_mbxcb;
+       bool_t  dspreq;
+       ER              ercd;
+    
+       LOG_INI_MBX_ENTER(mbxid);
+       CHECK_TSKCTX_UNL();
+       CHECK_MBXID(mbxid);
+       p_mbxcb = get_mbxcb(mbxid);
+
+       t_lock_cpu();
+       if (p_mbxcb->p_mbxinib->mbxatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else {
+               dspreq = init_wait_queue(&(p_mbxcb->wait_queue));
+               p_mbxcb->pk_head = NULL;
+               if (dspreq) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_INI_MBX_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ini_mbx */
+
+/*
+ *  メールボックスの状態参照
+ */
+#ifdef TOPPERS_ref_mbx
+
+ER
+ref_mbx(ID mbxid, T_RMBX *pk_rmbx)
+{
+       MBXCB   *p_mbxcb;
+       ER              ercd;
+    
+       LOG_REF_MBX_ENTER(mbxid, pk_rmbx);
+       CHECK_TSKCTX_UNL();
+       CHECK_MBXID(mbxid);
+       p_mbxcb = get_mbxcb(mbxid);
+
+       t_lock_cpu();
+       if (p_mbxcb->p_mbxinib->mbxatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else {
+               pk_rmbx->wtskid = wait_tskid(&(p_mbxcb->wait_queue));
+               pk_rmbx->pk_msg = p_mbxcb->pk_head;
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_REF_MBX_LEAVE(ercd, pk_rmbx);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ref_mbx */
diff --git a/asp/extension/dcre/kernel/mailbox.h b/asp/extension/dcre/kernel/mailbox.h
new file mode 100644 (file)
index 0000000..50b0dfd
--- /dev/null
@@ -0,0 +1,127 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: mailbox.h 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ *             メールボックス機能
+ */
+
+#ifndef TOPPERS_MAILBOX_H
+#define TOPPERS_MAILBOX_H
+
+#include <queue.h>
+
+/*
+ *  メールボックス初期化ブロック
+ *
+ *  この構造体は,同期・通信オブジェクトの初期化ブロックの共通部分
+ *  (WOBJINIB)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ *  最初のフィールドが共通になっている.
+ */
+typedef struct mailbox_initialization_block {
+       ATR                     mbxatr;                 /* メールボックス属性 */
+       PRI                     maxmpri;                /* メッセージ優先度の最大値 */
+} MBXINIB;
+
+/*
+ *  メールボックス管理ブロック
+ *
+ *  この構造体は,同期・通信オブジェクトの管理ブロックの共通部分(WOBJCB)
+ *  を拡張(オブジェクト指向言語の継承に相当)したもので,最初の2つの
+ *  フィールドが共通になっている.
+ *
+ *  メッセージキューがメッセージの優先度順の場合には,pk_lastは使わな
+ *  い.また,メッセージキューが空の場合(pk_headがNULLの場合)にも,
+ *  pk_lastは無効である.
+ */
+typedef struct mailbox_control_block {
+       QUEUE           wait_queue;             /* メールボックス待ちキュー */
+       const MBXINIB *p_mbxinib;       /* 初期化ブロックへのポインタ */
+       T_MSG           *pk_head;               /* 先頭のメッセージ */
+       T_MSG           *pk_last;               /* 末尾のメッセージ */
+} MBXCB;
+
+/*
+ *  メールボックス待ち情報ブロックの定義
+ *
+ *  この構造体は,同期・通信オブジェクトの待ち情報ブロックの共通部分
+ *  (WINFO_WOBJ)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ *  最初の2つのフィールドが共通になっている.
+ */
+typedef struct mailbox_waiting_information {
+       WINFO           winfo;                  /* 標準の待ち情報ブロック */
+       MBXCB           *p_mbxcb;               /* 待っているメールボックスの管理ブロック */
+       T_MSG           *pk_msg;                /* 受信したメッセージ */
+} WINFO_MBX;
+
+/*
+ *  使用していないメールボックス管理ブロックのリスト
+ */
+extern QUEUE   free_mbxcb;
+
+/*
+ *  メールボックスIDの最大値(kernel_cfg.c)
+ */
+extern const ID        tmax_mbxid;
+extern const ID        tmax_smbxid;
+
+/*
+ *  メールボックス初期化ブロックのエリア(kernel_cfg.c)
+ */
+extern const MBXINIB   mbxinib_table[];
+extern MBXINIB                 ambxinib_table[];
+
+/*
+ *  メールボックス管理ブロックのエリア(kernel_cfg.c)
+ */
+extern MBXCB   mbxcb_table[];
+
+/*
+ *  メールボックス管理ブロックからメールボックスIDを取り出すためのマクロ
+ */
+#define        MBXID(p_mbxcb)  ((ID)(((p_mbxcb) - mbxcb_table) + TMIN_MBXID))
+
+/*
+ *  メールボックス機能の初期化
+ */
+extern void    initialize_mailbox(void);
+
+#endif /* TOPPERS_MAILBOX_H */
diff --git a/asp/extension/dcre/kernel/mempfix.c b/asp/extension/dcre/kernel/mempfix.c
new file mode 100644 (file)
index 0000000..02bd998
--- /dev/null
@@ -0,0 +1,555 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: mempfix.c 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ *             固定長メモリプール機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "wait.h"
+#include "mempfix.h"
+
+/*
+ *  トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_ACRE_MPF_ENTER
+#define LOG_ACRE_MPF_ENTER(pk_cmpf)
+#endif /* LOG_ACRE_MPF_ENTER */
+
+#ifndef LOG_ACRE_MPF_LEAVE
+#define LOG_ACRE_MPF_LEAVE(ercd)
+#endif /* LOG_ACRE_MPF_LEAVE */
+
+#ifndef LOG_DEL_MPF_ENTER
+#define LOG_DEL_MPF_ENTER(mpfid)
+#endif /* LOG_DEL_MPF_ENTER */
+
+#ifndef LOG_DEL_MPF_LEAVE
+#define LOG_DEL_MPF_LEAVE(ercd)
+#endif /* LOG_DEL_MPF_LEAVE */
+
+#ifndef LOG_GET_MPF_ENTER
+#define LOG_GET_MPF_ENTER(mpfid, p_blk)
+#endif /* LOG_GET_MPF_ENTER */
+
+#ifndef LOG_GET_MPF_LEAVE
+#define LOG_GET_MPF_LEAVE(ercd, blk)
+#endif /* LOG_GET_MPF_LEAVE */
+
+#ifndef LOG_PGET_MPF_ENTER
+#define LOG_PGET_MPF_ENTER(mpfid, p_blk)
+#endif /* LOG_PGET_MPF_ENTER */
+
+#ifndef LOG_PGET_MPF_LEAVE
+#define LOG_PGET_MPF_LEAVE(ercd, blk)
+#endif /* LOG_PGET_MPF_LEAVE */
+
+#ifndef LOG_TGET_MPF_ENTER
+#define LOG_TGET_MPF_ENTER(mpfid, p_blk, tmout)
+#endif /* LOG_TGET_MPF_ENTER */
+
+#ifndef LOG_TGET_MPF_LEAVE
+#define LOG_TGET_MPF_LEAVE(ercd, blk)
+#endif /* LOG_TGET_MPF_LEAVE */
+
+#ifndef LOG_REL_MPF_ENTER
+#define LOG_REL_MPF_ENTER(mpfid, blk)
+#endif /* LOG_REL_MPF_ENTER */
+
+#ifndef LOG_REL_MPF_LEAVE
+#define LOG_REL_MPF_LEAVE(ercd)
+#endif /* LOG_REL_MPF_LEAVE */
+
+#ifndef LOG_INI_MPF_ENTER
+#define LOG_INI_MPF_ENTER(mpfid)
+#endif /* LOG_INI_MPF_ENTER */
+
+#ifndef LOG_INI_MPF_LEAVE
+#define LOG_INI_MPF_LEAVE(ercd)
+#endif /* LOG_INI_MPF_LEAVE */
+
+#ifndef LOG_REF_MPF_ENTER
+#define LOG_REF_MPF_ENTER(mpfid, pk_rmpf)
+#endif /* LOG_REF_MPF_ENTER */
+
+#ifndef LOG_REF_MPF_LEAVE
+#define LOG_REF_MPF_LEAVE(ercd, pk_rmpf)
+#endif /* LOG_REF_MPF_LEAVE */
+
+/*
+ *  固定長メモリプールの数
+ */
+#define tnum_mpf       ((uint_t)(tmax_mpfid - TMIN_MPFID + 1))
+#define tnum_smpf      ((uint_t)(tmax_smpfid - TMIN_MPFID + 1))
+
+/*
+ *  固定長メモリプールIDから固定長メモリプール管理ブロックを取り出すた
+ *  めのマクロ
+ */
+#define INDEX_MPF(mpfid)       ((uint_t)((mpfid) - TMIN_MPFID))
+#define get_mpfcb(mpfid)       (&(mpfcb_table[INDEX_MPF(mpfid)]))
+
+/*
+ *  特殊なインデックス値の定義
+ */
+#define INDEX_NULL             (~0U)           /* 空きブロックリストの最後 */
+#define INDEX_ALLOC            (~1U)           /* 割当て済みのブロック */
+
+#ifdef TOPPERS_mpfini
+
+/*
+ *  使用していない固定長メモリプール管理ブロックのリスト
+ */
+QUEUE  free_mpfcb;
+
+/* 
+ *  固定長メモリプール機能の初期化
+ */
+void
+initialize_mempfix(void)
+{
+       uint_t  i, j;
+       MPFCB   *p_mpfcb;
+       MPFINIB *p_mpfinib;
+
+       for (p_mpfcb = mpfcb_table, i = 0; i < tnum_smpf; p_mpfcb++, i++) {
+               queue_initialize(&(p_mpfcb->wait_queue));
+               p_mpfcb->p_mpfinib = &(mpfinib_table[i]);
+               p_mpfcb->fblkcnt = p_mpfcb->p_mpfinib->blkcnt;
+               p_mpfcb->unused = 0U;
+               p_mpfcb->freelist = INDEX_NULL;
+       }
+       queue_initialize(&free_mpfcb);
+       for (j = 0; i < tnum_mpf; p_mpfcb++, i++, j++) {
+               p_mpfinib = &(ampfinib_table[j]);
+               p_mpfinib->mpfatr = TA_NOEXS;
+               p_mpfcb->p_mpfinib = ((const MPFINIB *) p_mpfinib);
+               queue_insert_prev(&free_mpfcb, &(p_mpfcb->wait_queue));
+       }
+}
+
+#endif /* TOPPERS_mpfini */
+
+/*
+ *  固定長メモリプールからブロックを獲得
+ */
+#ifdef TOPPERS_mpfget
+
+void
+get_mpf_block(MPFCB *p_mpfcb, void **p_blk)
+{
+       uint_t  blkidx;
+
+       if (p_mpfcb->freelist != INDEX_NULL) {
+               blkidx = p_mpfcb->freelist;
+               p_mpfcb->freelist = (p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next;
+       }
+       else {
+               blkidx = p_mpfcb->unused;
+               p_mpfcb->unused++;
+       }
+       *p_blk = (void *)((char *)(p_mpfcb->p_mpfinib->mpf)
+                                                               + p_mpfcb->p_mpfinib->blksz * blkidx);
+       p_mpfcb->fblkcnt--;
+       (p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next = INDEX_ALLOC;
+}
+
+#endif /* TOPPERS_mpfget */
+
+/*
+ *  固定長メモリプールの生成
+ */
+#ifdef TOPPERS_acre_mpf
+
+ER_UINT
+acre_mpf(const T_CMPF *pk_cmpf)
+{
+       MPFCB   *p_mpfcb;
+       MPFINIB *p_mpfinib;
+       ATR             mpfatr;
+       void    *mpf;
+       MPFMB   *p_mpfmb;
+       ER              ercd;
+
+       LOG_ACRE_MPF_ENTER(pk_cmpf);
+       CHECK_TSKCTX_UNL();
+       CHECK_RSATR(pk_cmpf->mpfatr, TA_TPRI|TA_MPRI);
+       CHECK_PAR(pk_cmpf->blkcnt != 0);
+       CHECK_PAR(pk_cmpf->blksz != 0);
+       CHECK_ALIGN_MPF(pk_cmpf->mpf);
+       CHECK_ALIGN_MB(pk_cmpf->mpfmb);
+       mpfatr = pk_cmpf->mpfatr;
+       mpf = pk_cmpf->mpf;
+       p_mpfmb = pk_cmpf->mpfmb;
+
+       t_lock_cpu();
+       if (queue_empty(&free_mpfcb)) {
+               ercd = E_NOID;
+       }
+       else {
+               if (mpf == NULL) {
+                       mpf = kernel_malloc(pk_cmpf->blkcnt * ROUND_MPF_T(pk_cmpf->blksz));
+                       mpfatr |= TA_MEMALLOC;
+               }
+               if (mpf == NULL) {
+                       ercd = E_NOMEM;
+               }
+               else {
+                       if (p_mpfmb == NULL) {
+                               p_mpfmb = kernel_malloc(sizeof(MPFMB) * pk_cmpf->blkcnt);
+                               mpfatr |= TA_MBALLOC;
+                       }
+                       if (p_mpfmb == NULL) {
+                               if ((mpfatr & TA_MEMALLOC) != 0U) {
+                                       kernel_free(mpf);
+                               }
+                               ercd = E_NOMEM;
+                       }
+                       else {
+                               p_mpfcb = ((MPFCB *) queue_delete_next(&free_mpfcb));
+                               p_mpfinib = (MPFINIB *)(p_mpfcb->p_mpfinib);
+                               p_mpfinib->mpfatr = mpfatr;
+                               p_mpfinib->blkcnt = pk_cmpf->blkcnt;
+                               p_mpfinib->blksz = ROUND_MPF_T(pk_cmpf->blksz);
+                               p_mpfinib->mpf = mpf;
+                               p_mpfinib->p_mpfmb = p_mpfmb;
+
+                               queue_initialize(&(p_mpfcb->wait_queue));
+                               p_mpfcb->fblkcnt = p_mpfcb->p_mpfinib->blkcnt;
+                               p_mpfcb->unused = 0U;
+                               p_mpfcb->freelist = INDEX_NULL;
+                               ercd = MPFID(p_mpfcb);
+                       }
+               }
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_ACRE_MPF_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_acre_mpf */
+
+/*
+ *  固定長メモリプールの削除
+ */
+#ifdef TOPPERS_del_mpf
+
+ER
+del_mpf(ID mpfid)
+{
+       MPFCB   *p_mpfcb;
+       MPFINIB *p_mpfinib;
+       bool_t  dspreq;
+       ER              ercd;
+
+       LOG_DEL_MPF_ENTER(mpfid);
+       CHECK_TSKCTX_UNL();
+       CHECK_MPFID(mpfid);
+       p_mpfcb = get_mpfcb(mpfid);
+
+       t_lock_cpu();
+       if (p_mpfcb->p_mpfinib->mpfatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (MPFID(p_mpfcb) > tmax_smpfid) {
+               dspreq = init_wait_queue(&(p_mpfcb->wait_queue));
+               p_mpfinib = (MPFINIB *)(p_mpfcb->p_mpfinib);
+               if ((p_mpfinib->mpfatr & TA_MEMALLOC) != 0U) {
+                       kernel_free(p_mpfinib->mpf);
+               }
+               if ((p_mpfinib->mpfatr & TA_MBALLOC) != 0U) {
+                       kernel_free(p_mpfinib->p_mpfmb);
+               }
+               p_mpfinib->mpfatr = TA_NOEXS;
+               queue_insert_prev(&free_mpfcb, &(p_mpfcb->wait_queue));
+               if (dspreq) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_OBJ;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_DEL_MPF_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_del_mpf */
+
+/*
+ *  固定長メモリブロックの獲得
+ */
+#ifdef TOPPERS_get_mpf
+
+ER
+get_mpf(ID mpfid, void **p_blk)
+{
+       MPFCB   *p_mpfcb;
+       WINFO_MPF winfo_mpf;
+       ER              ercd;
+
+       LOG_GET_MPF_ENTER(mpfid, p_blk);
+       CHECK_DISPATCH();
+       CHECK_MPFID(mpfid);
+       p_mpfcb = get_mpfcb(mpfid);
+
+       t_lock_cpu();
+       if (p_mpfcb->fblkcnt > 0) {
+               get_mpf_block(p_mpfcb, p_blk);
+               ercd = E_OK;
+       }
+       else {
+               p_runtsk->tstat = (TS_WAITING | TS_WAIT_MPF);
+               wobj_make_wait((WOBJCB *) p_mpfcb, (WINFO_WOBJ *) &winfo_mpf);
+               dispatch();
+               ercd = winfo_mpf.winfo.wercd;
+               if (ercd == E_OK) {
+                       *p_blk = winfo_mpf.blk;
+               }
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_GET_MPF_LEAVE(ercd, *p_blk);
+       return(ercd);
+}
+
+#endif /* TOPPERS_get_mpf */
+
+/*
+ *  固定長メモリブロックの獲得(ポーリング)
+ */
+#ifdef TOPPERS_pget_mpf
+
+ER
+pget_mpf(ID mpfid, void **p_blk)
+{
+       MPFCB   *p_mpfcb;
+       ER              ercd;
+
+       LOG_PGET_MPF_ENTER(mpfid, p_blk);
+       CHECK_TSKCTX_UNL();
+       CHECK_MPFID(mpfid);
+       p_mpfcb = get_mpfcb(mpfid);
+
+       t_lock_cpu();
+       if (p_mpfcb->fblkcnt > 0) {
+               get_mpf_block(p_mpfcb, p_blk);
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_TMOUT;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_PGET_MPF_LEAVE(ercd, *p_blk);
+       return(ercd);
+}
+
+#endif /* TOPPERS_pget_mpf */
+
+/*
+ *  固定長メモリブロックの獲得(タイムアウトあり)
+ */
+#ifdef TOPPERS_tget_mpf
+
+ER
+tget_mpf(ID mpfid, void **p_blk, TMO tmout)
+{
+       MPFCB   *p_mpfcb;
+       WINFO_MPF winfo_mpf;
+       TMEVTB  tmevtb;
+       ER              ercd;
+
+       LOG_TGET_MPF_ENTER(mpfid, p_blk, tmout);
+       CHECK_DISPATCH();
+       CHECK_MPFID(mpfid);
+       CHECK_TMOUT(tmout);
+       p_mpfcb = get_mpfcb(mpfid);
+
+       t_lock_cpu();
+       if (p_mpfcb->fblkcnt > 0) {
+               get_mpf_block(p_mpfcb, p_blk);
+               ercd = E_OK;
+       }
+       else if (tmout == TMO_POL) {
+               ercd = E_TMOUT;
+       }
+       else {
+               p_runtsk->tstat = (TS_WAITING | TS_WAIT_MPF);
+               wobj_make_wait_tmout((WOBJCB *) p_mpfcb, (WINFO_WOBJ *) &winfo_mpf,
+                                                                                                               &tmevtb, tmout);
+               dispatch();
+               ercd = winfo_mpf.winfo.wercd;
+               if (ercd == E_OK) {
+                       *p_blk = winfo_mpf.blk;
+               }
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_TGET_MPF_LEAVE(ercd, *p_blk);
+       return(ercd);
+}
+
+#endif /* TOPPERS_tget_mpf */
+
+/*
+ *  固定長メモリブロックの返却
+ */
+#ifdef TOPPERS_rel_mpf
+
+ER
+rel_mpf(ID mpfid, void *blk)
+{
+       MPFCB   *p_mpfcb;
+       SIZE    blkoffset;
+       uint_t  blkidx;
+       TCB             *p_tcb;
+       ER              ercd;
+    
+       LOG_REL_MPF_ENTER(mpfid, blk);
+       CHECK_TSKCTX_UNL();
+       CHECK_MPFID(mpfid);
+       p_mpfcb = get_mpfcb(mpfid);
+       CHECK_PAR(p_mpfcb->p_mpfinib->mpf <= blk);
+       blkoffset = ((char *) blk) - (char *)(p_mpfcb->p_mpfinib->mpf);
+       CHECK_PAR(blkoffset % p_mpfcb->p_mpfinib->blksz == 0U);
+       CHECK_PAR(blkoffset / p_mpfcb->p_mpfinib->blksz < p_mpfcb->unused);
+       blkidx = (uint_t)(blkoffset / p_mpfcb->p_mpfinib->blksz);
+       CHECK_PAR((p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next == INDEX_ALLOC);
+
+       t_lock_cpu();
+       if (!queue_empty(&(p_mpfcb->wait_queue))) {
+               p_tcb = (TCB *) queue_delete_next(&(p_mpfcb->wait_queue));
+               ((WINFO_MPF *)(p_tcb->p_winfo))->blk = blk;
+               if (wait_complete(p_tcb)) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else {
+               p_mpfcb->fblkcnt++;
+               (p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next = p_mpfcb->freelist;
+               p_mpfcb->freelist = blkidx;
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_REL_MPF_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_rel_mpf */
+
+/*
+ *  固定長メモリプールの再初期化
+ */
+#ifdef TOPPERS_ini_mpf
+
+ER
+ini_mpf(ID mpfid)
+{
+       MPFCB   *p_mpfcb;
+       bool_t  dspreq;
+       ER              ercd;
+    
+       LOG_INI_MPF_ENTER(mpfid);
+       CHECK_TSKCTX_UNL();
+       CHECK_MPFID(mpfid);
+       p_mpfcb = get_mpfcb(mpfid);
+
+       t_lock_cpu();
+       dspreq = init_wait_queue(&(p_mpfcb->wait_queue));
+       p_mpfcb->fblkcnt = p_mpfcb->p_mpfinib->blkcnt;
+       p_mpfcb->unused = 0U;
+       p_mpfcb->freelist = INDEX_NULL;
+       if (dspreq) {
+               dispatch();
+       }
+       ercd = E_OK;
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_INI_MPF_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ini_mpf */
+
+/*
+ *  固定長メモリプールの状態参照
+ */
+#ifdef TOPPERS_ref_mpf
+
+ER
+ref_mpf(ID mpfid, T_RMPF *pk_rmpf)
+{
+       MPFCB   *p_mpfcb;
+       ER              ercd;
+    
+       LOG_REF_MPF_ENTER(mpfid, pk_rmpf);
+       CHECK_TSKCTX_UNL();
+       CHECK_MPFID(mpfid);
+       p_mpfcb = get_mpfcb(mpfid);
+
+       t_lock_cpu();
+       pk_rmpf->wtskid = wait_tskid(&(p_mpfcb->wait_queue));
+       pk_rmpf->fblkcnt = p_mpfcb->fblkcnt;
+       ercd = E_OK;
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_REF_MPF_LEAVE(ercd, pk_rmpf);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ref_mpf */
diff --git a/asp/extension/dcre/kernel/mempfix.h b/asp/extension/dcre/kernel/mempfix.h
new file mode 100644 (file)
index 0000000..2f92783
--- /dev/null
@@ -0,0 +1,144 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: mempfix.h 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ *             固定長メモリプール機能
+ */
+
+#ifndef TOPPERS_MEMPFIX_H
+#define TOPPERS_MEMPFIX_H
+
+#include <queue.h>
+
+/*
+ *  固定長メモリブロック管理ブロック
+ *
+ *  nextフィールドには,メモリブロックが割当て済みの場合はINDEX_ALLOCを,
+ *  未割当ての場合は次の未割当てブロックのインデックス番号を格納する.
+ *  最後の未割当てブロックの場合には,INDEX_NULLを格納する.
+ */
+typedef struct fixed_memoryblock_management_block {
+       uint_t          next;                   /* 次の未割当てブロック */
+} MPFMB;
+
+/*
+ *  固定長メモリプール初期化ブロック
+ *
+ *  この構造体は,同期・通信オブジェクトの初期化ブロックの共通部分
+ *  (WOBJINIB)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ *  最初のフィールドが共通になっている.
+ */
+typedef struct fixed_memorypool_initialization_block {
+       ATR                     mpfatr;                 /* 固定長メモリプール属性 */
+       uint_t          blkcnt;                 /* メモリブロック数 */
+       uint_t          blksz;                  /* メモリブロックのサイズ(丸めた値) */
+       void            *mpf;                   /* 固定長メモリプール領域の先頭番地 */
+       MPFMB           *p_mpfmb;               /* 固定長メモリプール管理領域の先頭番地 */
+} MPFINIB;
+
+/*
+ *  固定長メモリプール管理ブロック
+ *
+ *  この構造体は,同期・通信オブジェクトの管理ブロックの共通部分(WOBJCB)
+ *  を拡張(オブジェクト指向言語の継承に相当)したもので,最初の2つの
+ *  フィールドが共通になっている.
+ */
+typedef struct fixed_memorypool_control_block {
+       QUEUE           wait_queue;             /* 固定長メモリプール待ちキュー */
+       const MPFINIB *p_mpfinib;       /* 初期化ブロックへのポインタ */
+       uint_t          fblkcnt;                /* 未割当てブロック数 */
+       uint_t          unused;                 /* 未使用ブロックの先頭 */
+       uint_t          freelist;               /* 未割当てブロックのリスト */
+} MPFCB;
+
+/*
+ *  固定長メモリプール待ち情報ブロックの定義
+ *
+ *  この構造体は,同期・通信オブジェクトの待ち情報ブロックの共通部分
+ *  (WINFO_WOBJ)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ *  最初の2つのフィールドが共通になっている.
+ */
+typedef struct fixed_memorypool_waiting_information {
+       WINFO           winfo;                  /* 標準の待ち情報ブロック */
+       MPFCB           *p_mpfcb;               /* 待っている固定長メモリプールの管理ブロック*/
+       void            *blk;                   /* 獲得したメモリブロック */
+} WINFO_MPF;
+
+/*
+ *  使用していない固定長メモリプール管理ブロックのリスト
+ */
+extern QUEUE   free_mpfcb;
+
+/*
+ *  固定長メモリプールIDの最大値(kernel_cfg.c)
+ */
+extern const ID        tmax_mpfid;
+extern const ID        tmax_smpfid;
+
+/*
+ *  固定長メモリプール初期化ブロックのエリア(kernel_cfg.c)
+ */
+extern const MPFINIB   mpfinib_table[];
+extern MPFINIB                 ampfinib_table[];
+
+/*
+ *  固定長メモリプール管理ブロックのエリア(kernel_cfg.c)
+ */
+extern MPFCB   mpfcb_table[];
+
+/*
+ *  固定長メモリプール管理ブロックから固定長メモリプールIDを取り出すた
+ *  めのマクロ
+ */
+#define        MPFID(p_mpfcb)  ((ID)(((p_mpfcb) - mpfcb_table) + TMIN_MPFID))
+
+/*
+ *  固定長メモリプール機能の初期化
+ */
+extern void    initialize_mempfix(void);
+
+/*
+ *  固定長メモリプールからブロックを獲得
+ */
+extern void    get_mpf_block(MPFCB *p_mpfcb, void **p_blk);
+
+#endif /* TOPPERS_MEMPFIX_H */
diff --git a/asp/extension/dcre/kernel/pridataq.c b/asp/extension/dcre/kernel/pridataq.c
new file mode 100644 (file)
index 0000000..8243b39
--- /dev/null
@@ -0,0 +1,832 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: pridataq.c 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ *             優先度データキュー機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "wait.h"
+#include "pridataq.h"
+
+/*
+ *  トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_ACRE_PDQ_ENTER
+#define LOG_ACRE_PDQ_ENTER(pk_cpdq)
+#endif /* LOG_ACRE_PDQ_ENTER */
+
+#ifndef LOG_ACRE_PDQ_LEAVE
+#define LOG_ACRE_PDQ_LEAVE(ercd)
+#endif /* LOG_ACRE_PDQ_LEAVE */
+
+#ifndef LOG_DEL_PDQ_ENTER
+#define LOG_DEL_PDQ_ENTER(pdqid)
+#endif /* LOG_DEL_PDQ_ENTER */
+
+#ifndef LOG_DEL_PDQ_LEAVE
+#define LOG_DEL_PDQ_LEAVE(ercd)
+#endif /* LOG_DEL_PDQ_LEAVE */
+
+#ifndef LOG_SND_PDQ_ENTER
+#define LOG_SND_PDQ_ENTER(pdqid, data, datapri)
+#endif /* LOG_SND_PDQ_ENTER */
+
+#ifndef LOG_SND_PDQ_LEAVE
+#define LOG_SND_PDQ_LEAVE(ercd)
+#endif /* LOG_SND_PDQ_LEAVE */
+
+#ifndef LOG_PSND_PDQ_ENTER
+#define LOG_PSND_PDQ_ENTER(pdqid, data, datapri)
+#endif /* LOG_PSND_PDQ_ENTER */
+
+#ifndef LOG_PSND_PDQ_LEAVE
+#define LOG_PSND_PDQ_LEAVE(ercd)
+#endif /* LOG_PSND_PDQ_LEAVE */
+
+#ifndef LOG_IPSND_PDQ_ENTER
+#define LOG_IPSND_PDQ_ENTER(pdqid, data, datapri)
+#endif /* LOG_IPSND_PDQ_ENTER */
+
+#ifndef LOG_IPSND_PDQ_LEAVE
+#define LOG_IPSND_PDQ_LEAVE(ercd)
+#endif /* LOG_IPSND_PDQ_LEAVE */
+
+#ifndef LOG_TSND_PDQ_ENTER
+#define LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout)
+#endif /* LOG_TSND_PDQ_ENTER */
+
+#ifndef LOG_TSND_PDQ_LEAVE
+#define LOG_TSND_PDQ_LEAVE(ercd)
+#endif /* LOG_TSND_PDQ_LEAVE */
+
+#ifndef LOG_RCV_PDQ_ENTER
+#define LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri)
+#endif /* LOG_RCV_PDQ_ENTER */
+
+#ifndef LOG_RCV_PDQ_LEAVE
+#define LOG_RCV_PDQ_LEAVE(ercd, data, datapri)
+#endif /* LOG_RCV_PDQ_LEAVE */
+
+#ifndef LOG_PRCV_PDQ_ENTER
+#define LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri)
+#endif /* LOG_PRCV_PDQ_ENTER */
+
+#ifndef LOG_PRCV_PDQ_LEAVE
+#define LOG_PRCV_PDQ_LEAVE(ercd, data, datapri)
+#endif /* LOG_PRCV_PDQ_LEAVE */
+
+#ifndef LOG_TRCV_PDQ_ENTER
+#define LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout)
+#endif /* LOG_TRCV_PDQ_ENTER */
+
+#ifndef LOG_TRCV_PDQ_LEAVE
+#define LOG_TRCV_PDQ_LEAVE(ercd, data, datapri)
+#endif /* LOG_TRCV_PDQ_LEAVE */
+
+#ifndef LOG_INI_PDQ_ENTER
+#define LOG_INI_PDQ_ENTER(pdqid)
+#endif /* LOG_INI_PDQ_ENTER */
+
+#ifndef LOG_INI_PDQ_LEAVE
+#define LOG_INI_PDQ_LEAVE(ercd)
+#endif /* LOG_INI_PDQ_LEAVE */
+
+#ifndef LOG_REF_PDQ_ENTER
+#define LOG_REF_PDQ_ENTER(pdqid, pk_rpdq)
+#endif /* LOG_REF_PDQ_ENTER */
+
+#ifndef LOG_REF_PDQ_LEAVE
+#define LOG_REF_PDQ_LEAVE(ercd, pk_rpdq)
+#endif /* LOG_REF_PDQ_LEAVE */
+
+/*
+ *  優先度データキューの数
+ */
+#define tnum_pdq       ((uint_t)(tmax_pdqid - TMIN_PDQID + 1))
+#define tnum_spdq      ((uint_t)(tmax_spdqid - TMIN_PDQID + 1))
+
+/*
+ *  優先度データキューIDから優先度データキュー管理ブロックを取り出すた
+ *  めのマクロ
+ */
+#define INDEX_PDQ(pdqid)       ((uint_t)((pdqid) - TMIN_PDQID))
+#define get_pdqcb(pdqid)       (&(pdqcb_table[INDEX_PDQ(pdqid)]))
+
+#ifdef TOPPERS_pdqini
+
+/*
+ *  使用していない優先度データキュー管理ブロックのリスト
+ */
+QUEUE  free_pdqcb;
+
+/*
+ *  優先度データキュー機能の初期化
+ */
+void
+initialize_pridataq(void)
+{
+       uint_t  i, j;
+       PDQCB   *p_pdqcb;
+       PDQINIB *p_pdqinib;
+
+       for (p_pdqcb = pdqcb_table, i = 0; i < tnum_spdq; p_pdqcb++, i++) {
+               queue_initialize(&(p_pdqcb->swait_queue));
+               p_pdqcb->p_pdqinib = &(pdqinib_table[i]);
+               queue_initialize(&(p_pdqcb->rwait_queue));
+               p_pdqcb->count = 0U;
+               p_pdqcb->p_head = NULL;
+               p_pdqcb->unused = 0U;
+               p_pdqcb->p_freelist = NULL;
+       }
+       queue_initialize(&free_pdqcb);
+       for (j = 0; i < tnum_pdq; p_pdqcb++, i++, j++) {
+               p_pdqinib = &(apdqinib_table[j]);
+               p_pdqinib->pdqatr = TA_NOEXS;
+               p_pdqcb->p_pdqinib = ((const PDQINIB *) p_pdqinib);
+               queue_insert_prev(&free_pdqcb, &(p_pdqcb->swait_queue));
+       }
+}
+
+#endif /* TOPPERS_pdqini */
+
+/*
+ *  優先度データキューの生成
+ */
+#ifdef TOPPERS_acre_pdq
+
+ER_UINT
+acre_pdq(const T_CPDQ *pk_cpdq)
+{
+       PDQCB   *p_pdqcb;
+       PDQINIB *p_pdqinib;
+       ATR             pdqatr;
+       PDQMB   *p_pdqmb;
+       ER              ercd;
+
+       LOG_ACRE_PDQ_ENTER(pk_cpdq);
+       CHECK_TSKCTX_UNL();
+       CHECK_RSATR(pk_cpdq->pdqatr, TA_TPRI);
+       CHECK_DPRI(pk_cpdq->maxdpri);
+       pdqatr = pk_cpdq->pdqatr;
+       p_pdqmb = pk_cpdq->pdqmb;
+
+       t_lock_cpu();
+       if (queue_empty(&free_pdqcb)) {
+               ercd = E_NOID;
+       }
+       else {
+               if (pk_cpdq->pdqcnt != 0 && p_pdqmb == NULL) {
+                       p_pdqmb = kernel_malloc(sizeof(PDQMB) * pk_cpdq->pdqcnt);
+                       pdqatr |= TA_MBALLOC;
+               }
+               if (pk_cpdq->pdqcnt != 0 && p_pdqmb == NULL) {
+                       ercd = E_NOMEM;
+               }
+               else {
+                       p_pdqcb = ((PDQCB *) queue_delete_next(&free_pdqcb));
+                       p_pdqinib = (PDQINIB *)(p_pdqcb->p_pdqinib);
+                       p_pdqinib->pdqatr = pdqatr;
+                       p_pdqinib->pdqcnt = pk_cpdq->pdqcnt;
+                       p_pdqinib->maxdpri = pk_cpdq->maxdpri;
+                       p_pdqinib->p_pdqmb = p_pdqmb;
+
+                       queue_initialize(&(p_pdqcb->swait_queue));
+                       queue_initialize(&(p_pdqcb->rwait_queue));
+                       p_pdqcb->count = 0U;
+                       p_pdqcb->p_head = NULL;
+                       p_pdqcb->unused = 0U;
+                       p_pdqcb->p_freelist = NULL;
+                       ercd = PDQID(p_pdqcb);
+               }
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_ACRE_PDQ_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_acre_pdq */
+
+/*
+ *  優先度データキューの削除
+ */
+#ifdef TOPPERS_del_pdq
+
+ER
+del_pdq(ID pdqid)
+{
+       PDQCB   *p_pdqcb;
+       PDQINIB *p_pdqinib;
+       bool_t  dspreq;
+       ER              ercd;
+
+       LOG_DEL_PDQ_ENTER(pdqid);
+       CHECK_TSKCTX_UNL();
+       CHECK_PDQID(pdqid);
+       p_pdqcb = get_pdqcb(pdqid);
+
+       t_lock_cpu();
+       if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (PDQID(p_pdqcb) > tmax_spdqid) {
+               dspreq = init_wait_queue(&(p_pdqcb->swait_queue));
+               if (init_wait_queue(&(p_pdqcb->rwait_queue))) {
+                       dspreq = true;
+               };
+               p_pdqinib = (PDQINIB *)(p_pdqcb->p_pdqinib);
+               if ((p_pdqinib->pdqatr & TA_MBALLOC) != 0U) {
+                       kernel_free(p_pdqinib->p_pdqmb);
+               }
+               p_pdqinib->pdqatr = TA_NOEXS;
+               queue_insert_prev(&free_pdqcb, &(p_pdqcb->swait_queue));
+               if (dspreq) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_OBJ;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_DEL_PDQ_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_del_pdq */
+
+/*
+ *  優先度データキュー管理領域へのデータの格納
+ */
+#ifdef TOPPERS_pdqenq
+
+void
+enqueue_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri)
+{
+       PDQMB   *p_pdqmb;
+       PDQMB   **pp_prev_next, *p_next;
+
+       if (p_pdqcb->p_freelist != NULL) {
+               p_pdqmb = p_pdqcb->p_freelist;
+               p_pdqcb->p_freelist = p_pdqmb->p_next;
+       }
+       else {
+               p_pdqmb = p_pdqcb->p_pdqinib->p_pdqmb + p_pdqcb->unused;
+               p_pdqcb->unused++;
+       }
+
+       p_pdqmb->data = data;
+       p_pdqmb->datapri = datapri;
+
+       pp_prev_next = &(p_pdqcb->p_head);
+       while ((p_next = *pp_prev_next) != NULL) {
+               if (p_next->datapri > datapri) {
+                       break;
+               }
+               pp_prev_next = &(p_next->p_next);
+       }
+       p_pdqmb->p_next = p_next;
+       *pp_prev_next = p_pdqmb;
+       p_pdqcb->count++;
+}
+
+#endif /* TOPPERS_pdqenq */
+
+/*
+ *  優先度データキュー管理領域からのデータの取出し
+ */
+#ifdef TOPPERS_pdqdeq
+
+void
+dequeue_pridata(PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri)
+{
+       PDQMB   *p_pdqmb;
+
+       p_pdqmb = p_pdqcb->p_head;
+       p_pdqcb->p_head = p_pdqmb->p_next;
+       p_pdqcb->count--;
+
+       *p_data = p_pdqmb->data;
+       *p_datapri = p_pdqmb->datapri;
+
+       p_pdqmb->p_next = p_pdqcb->p_freelist;
+       p_pdqcb->p_freelist = p_pdqmb;
+}
+
+#endif /* TOPPERS_pdqdeq */
+
+/*
+ *  優先度データキューへのデータ送信
+ */
+#ifdef TOPPERS_pdqsnd
+
+bool_t
+send_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri, bool_t *p_reqdsp)
+{
+       TCB             *p_tcb;
+
+       if (!queue_empty(&(p_pdqcb->rwait_queue))) {
+               p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->rwait_queue));
+               ((WINFO_PDQ *)(p_tcb->p_winfo))->data = data;
+               ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri = datapri;
+               *p_reqdsp = wait_complete(p_tcb);
+               return(true);
+       }
+       else if (p_pdqcb->count < p_pdqcb->p_pdqinib->pdqcnt) {
+               enqueue_pridata(p_pdqcb, data, datapri);
+               *p_reqdsp = false;
+               return(true);
+       }
+       else {
+               return(false);
+       }
+}
+
+#endif /* TOPPERS_pdqsnd */
+
+/*
+ *  優先度データキューからのデータ受信
+ */
+#ifdef TOPPERS_pdqrcv
+
+bool_t
+receive_pridata(PDQCB *p_pdqcb, intptr_t *p_data,
+                                                                       PRI *p_datapri, bool_t *p_reqdsp)
+{
+       TCB             *p_tcb;
+       intptr_t data;
+       PRI             datapri;
+
+       if (p_pdqcb->count > 0U) {
+               dequeue_pridata(p_pdqcb, p_data, p_datapri);
+               if (!queue_empty(&(p_pdqcb->swait_queue))) {
+                       p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
+                       data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data;
+                       datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri;
+                       enqueue_pridata(p_pdqcb, data, datapri);
+                       *p_reqdsp = wait_complete(p_tcb);
+               }
+               else {
+                       *p_reqdsp = false;
+               }
+               return(true);
+       }
+       else if (!queue_empty(&(p_pdqcb->swait_queue))) {
+               p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
+               *p_data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data;
+               *p_datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri;
+               *p_reqdsp = wait_complete(p_tcb);
+               return(true);
+       }
+       else {
+               return(false);
+       }
+}
+
+#endif /* TOPPERS_pdqrcv */
+
+/*
+ *  優先度データキューへの送信
+ */
+#ifdef TOPPERS_snd_pdq
+
+ER
+snd_pdq(ID pdqid, intptr_t data, PRI datapri)
+{
+       PDQCB   *p_pdqcb;
+       WINFO_PDQ winfo_pdq;
+       bool_t  reqdsp;
+       ER              ercd;
+
+       LOG_SND_PDQ_ENTER(pdqid, data, datapri);
+       CHECK_DISPATCH();
+       CHECK_PDQID(pdqid);
+       p_pdqcb = get_pdqcb(pdqid);
+       CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
+
+       t_lock_cpu();
+       if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) {
+               if (reqdsp) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else {
+               winfo_pdq.data = data;
+               winfo_pdq.datapri = datapri;
+               p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ);
+               wobj_make_wait((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq);
+               dispatch();
+               ercd = winfo_pdq.winfo.wercd;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_SND_PDQ_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_snd_pdq */
+
+/*
+ *  優先度データキューへの送信(ポーリング)
+ */
+#ifdef TOPPERS_psnd_pdq
+
+ER
+psnd_pdq(ID pdqid, intptr_t data, PRI datapri)
+{
+       PDQCB   *p_pdqcb;
+       bool_t  reqdsp;
+       ER              ercd;
+
+       LOG_PSND_PDQ_ENTER(pdqid, data, datapri);
+       CHECK_TSKCTX_UNL();
+       CHECK_PDQID(pdqid);
+       p_pdqcb = get_pdqcb(pdqid);
+       CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
+
+       t_lock_cpu();
+       if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) {
+               if (reqdsp) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_TMOUT;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_PSND_PDQ_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_psnd_pdq */
+
+/*
+ *  優先度データキューへの送信(ポーリング,非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_ipsnd_pdq
+
+ER
+ipsnd_pdq(ID pdqid, intptr_t data, PRI datapri)
+{
+       PDQCB   *p_pdqcb;
+       bool_t  reqdsp;
+       ER              ercd;
+
+       LOG_IPSND_PDQ_ENTER(pdqid, data, datapri);
+       CHECK_INTCTX_UNL();
+       CHECK_PDQID(pdqid);
+       p_pdqcb = get_pdqcb(pdqid);
+       CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
+
+       i_lock_cpu();
+       if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) {
+               if (reqdsp) {
+                       reqflg = true;
+               }
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_TMOUT;
+       }
+       i_unlock_cpu();
+
+  error_exit:
+       LOG_IPSND_PDQ_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ipsnd_pdq */
+
+/*
+ *  優先度データキューへの送信(タイムアウトあり)
+ */
+#ifdef TOPPERS_tsnd_pdq
+
+ER
+tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout)
+{
+       PDQCB   *p_pdqcb;
+       WINFO_PDQ winfo_pdq;
+       TMEVTB  tmevtb;
+       bool_t  reqdsp;
+       ER              ercd;
+
+       LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout);
+       CHECK_DISPATCH();
+       CHECK_PDQID(pdqid);
+       CHECK_TMOUT(tmout);
+       p_pdqcb = get_pdqcb(pdqid);
+       CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
+
+       t_lock_cpu();
+       if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) {
+               if (reqdsp) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else if (tmout == TMO_POL) {
+               ercd = E_TMOUT;
+       }
+       else {
+               winfo_pdq.data = data;
+               winfo_pdq.datapri = datapri;
+               p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ);
+               wobj_make_wait_tmout((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq,
+                                                                                                               &tmevtb, tmout);
+               dispatch();
+               ercd = winfo_pdq.winfo.wercd;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_TSND_PDQ_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_tsnd_pdq */
+
+/*
+ *  優先度データキューからの受信
+ */
+#ifdef TOPPERS_rcv_pdq
+
+ER
+rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
+{
+       PDQCB   *p_pdqcb;
+       WINFO_PDQ winfo_pdq;
+       bool_t  reqdsp;
+       ER              ercd;
+
+       LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri);
+       CHECK_DISPATCH();
+       CHECK_PDQID(pdqid);
+       p_pdqcb = get_pdqcb(pdqid);
+
+       t_lock_cpu();
+       if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (receive_pridata(p_pdqcb, p_data, p_datapri, &reqdsp)) {
+               if (reqdsp) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else {
+               p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ);
+               make_wait(&(winfo_pdq.winfo));
+               queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
+               winfo_pdq.p_pdqcb = p_pdqcb;
+               LOG_TSKSTAT(p_runtsk);
+               dispatch();
+               ercd = winfo_pdq.winfo.wercd;
+               if (ercd == E_OK) {
+                       *p_data = winfo_pdq.data;
+                       *p_datapri = winfo_pdq.datapri;
+               }
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_RCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
+       return(ercd);
+}
+
+#endif /* TOPPERS_rcv_pdq */
+
+/*
+ *  優先度データキューからの受信(ポーリング)
+ */
+#ifdef TOPPERS_prcv_pdq
+
+ER
+prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
+{
+       PDQCB   *p_pdqcb;
+       bool_t  reqdsp;
+       ER              ercd;
+
+       LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri);
+       CHECK_TSKCTX_UNL();
+       CHECK_PDQID(pdqid);
+       p_pdqcb = get_pdqcb(pdqid);
+
+       t_lock_cpu();
+       if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (receive_pridata(p_pdqcb, p_data, p_datapri, &reqdsp)) {
+               if (reqdsp) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_TMOUT;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_PRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
+       return(ercd);
+}
+
+#endif /* TOPPERS_prcv_pdq */
+
+/*
+ *  優先度データキューからの受信(タイムアウトあり)
+ */
+#ifdef TOPPERS_trcv_pdq
+
+ER
+trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout)
+{
+       PDQCB   *p_pdqcb;
+       WINFO_PDQ winfo_pdq;
+       TMEVTB  tmevtb;
+       bool_t  reqdsp;
+       ER              ercd;
+
+       LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout);
+       CHECK_DISPATCH();
+       CHECK_PDQID(pdqid);
+       CHECK_TMOUT(tmout);
+       p_pdqcb = get_pdqcb(pdqid);
+
+       t_lock_cpu();
+       if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (receive_pridata(p_pdqcb, p_data, p_datapri, &reqdsp)) {
+               if (reqdsp) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else if (tmout == TMO_POL) {
+               ercd = E_TMOUT;
+       }
+       else {
+               p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ);
+               make_wait_tmout(&(winfo_pdq.winfo), &tmevtb, tmout);
+               queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
+               winfo_pdq.p_pdqcb = p_pdqcb;
+               LOG_TSKSTAT(p_runtsk);
+               dispatch();
+               ercd = winfo_pdq.winfo.wercd;
+               if (ercd == E_OK) {
+                       *p_data = winfo_pdq.data;
+                       *p_datapri = winfo_pdq.datapri;
+               }
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_TRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
+       return(ercd);
+}
+
+#endif /* TOPPERS_trcv_pdq */
+
+/*
+ *  優先度データキューの再初期化
+ */
+#ifdef TOPPERS_ini_pdq
+
+ER
+ini_pdq(ID pdqid)
+{
+       PDQCB   *p_pdqcb;
+       bool_t  dspreq;
+       ER              ercd;
+    
+       LOG_INI_PDQ_ENTER(pdqid);
+       CHECK_TSKCTX_UNL();
+       CHECK_PDQID(pdqid);
+       p_pdqcb = get_pdqcb(pdqid);
+
+       t_lock_cpu();
+       if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else {
+               dspreq = init_wait_queue(&(p_pdqcb->swait_queue));
+               if (init_wait_queue(&(p_pdqcb->rwait_queue))) {
+                       dspreq = true;
+               }
+               p_pdqcb->count = 0U;
+               p_pdqcb->p_head = NULL;
+               p_pdqcb->unused = 0U;
+               p_pdqcb->p_freelist = NULL;
+               if (dspreq) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_INI_PDQ_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ini_pdq */
+
+/*
+ *  優先度データキューの状態参照
+ */
+#ifdef TOPPERS_ref_pdq
+
+ER
+ref_pdq(ID pdqid, T_RPDQ *pk_rpdq)
+{
+       PDQCB   *p_pdqcb;
+       ER              ercd;
+    
+       LOG_REF_PDQ_ENTER(pdqid, pk_rpdq);
+       CHECK_TSKCTX_UNL();
+       CHECK_PDQID(pdqid);
+       p_pdqcb = get_pdqcb(pdqid);
+
+       t_lock_cpu();
+       if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else {
+               pk_rpdq->stskid = wait_tskid(&(p_pdqcb->swait_queue));
+               pk_rpdq->rtskid = wait_tskid(&(p_pdqcb->rwait_queue));
+               pk_rpdq->spdqcnt = p_pdqcb->count;
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_REF_PDQ_LEAVE(ercd, pk_rpdq);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ref_pdq */
diff --git a/asp/extension/dcre/kernel/pridataq.h b/asp/extension/dcre/kernel/pridataq.h
new file mode 100644 (file)
index 0000000..56410a9
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: pridataq.h 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ *             優先度データキュー機能
+ */
+
+#ifndef TOPPERS_PRIDATAQ_H
+#define TOPPERS_PRIDATAQ_H
+
+#include <queue.h>
+
+/*
+ *  優先度データ管理ブロック
+ */
+typedef struct pridata_management_block PDQMB;
+
+struct pridata_management_block {
+       PDQMB           *p_next;                /* 次のデータ */
+       intptr_t        data;                   /* データ本体 */
+       PRI                     datapri;                /* データ優先度 */
+};
+
+/*
+ *  優先度データキュー初期化ブロック
+ *
+ *  この構造体は,同期・通信オブジェクトの初期化ブロックの共通部分
+ *  (WOBJINIB)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ *  最初のフィールドが共通になっている.
+ */
+typedef struct pridataq_initialization_block {
+       ATR                     pdqatr;                 /* 優先度データキュー属性 */
+       uint_t          pdqcnt;                 /* 優先度データキューの容量 */
+       PRI                     maxdpri;                /* データ優先度の最大値 */
+       PDQMB           *p_pdqmb;               /* 優先度データキュー管理領域の先頭番地 */
+} PDQINIB;
+
+/*
+ *  優先度データキュー管理ブロック
+ *
+ *  この構造体は,同期・通信オブジェクトの管理ブロックの共通部分(WOBJCB)
+ *  を拡張(オブジェクト指向言語の継承に相当)したもので,最初の2つの
+ *  フィールドが共通になっている.
+ */
+typedef struct pridataq_control_block {
+       QUEUE           swait_queue;    /* 優先度データキュー送信待ちキュー */
+       const PDQINIB *p_pdqinib;       /* 初期化ブロックへのポインタ */
+       QUEUE           rwait_queue;    /* 優先度データキュー受信待ちキュー */
+       uint_t          count;                  /* 優先度データキュー中のデータの数 */
+       PDQMB           *p_head;                /* 最初のデータ */
+       uint_t          unused;                 /* 未使用データ管理ブロックの先頭 */
+       PDQMB           *p_freelist;    /* 未割当てデータ管理ブロックのリスト */
+} PDQCB;
+
+/*
+ *  優先度データキュー待ち情報ブロックの定義
+ *
+ *  この構造体は,同期・通信オブジェクトの待ち情報ブロックの共通部分
+ *  (WINFO_WOBJ)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ *  最初の2つのフィールドが共通になっている.
+ *  優先度データキューへの送信待ちと優先度データキューからの受信待ちで,
+ *  同じ待ち情報ブロックを使う.
+ */
+typedef struct pridataq_waiting_information {
+       WINFO           winfo;                  /* 標準の待ち情報ブロック */
+       PDQCB           *p_pdqcb;               /* 待っている優先度データキューの管理ブロック*/
+       intptr_t        data;                   /* 送受信データ */
+       PRI                     datapri;                /* データ優先度 */
+} WINFO_PDQ;
+
+/*
+ *  使用していない優先度データキュー管理ブロックのリスト
+ */
+extern QUEUE   free_pdqcb;
+
+/*
+ *  優先度データキューIDの最大値(kernel_cfg.c)
+ */
+extern const ID        tmax_pdqid;
+extern const ID        tmax_spdqid;
+
+/*
+ *  優先度データキュー初期化ブロックのエリア(kernel_cfg.c)
+ */
+extern const PDQINIB   pdqinib_table[];
+extern PDQINIB                 apdqinib_table[];
+
+/*
+ *  優先度データキュー管理ブロックのエリア(kernel_cfg.c)
+ */
+extern PDQCB   pdqcb_table[];
+
+/*
+ *  優先度データキュー管理ブロックから優先度データキューIDを取り出すた
+ *  めのマクロ
+ */
+#define        PDQID(p_pdqcb)  ((ID)(((p_pdqcb) - pdqcb_table) + TMIN_PDQID))
+
+/*
+ *  優先度データキュー機能の初期化
+ */
+extern void    initialize_pridataq(void);
+
+/*
+ *  優先度データキュー管理領域へのデータの格納
+ */
+extern void    enqueue_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri);
+
+/*
+ *  優先度データキュー管理領域からのデータの取出し
+ */
+extern void    dequeue_pridata(PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri);
+
+/*
+ *  優先度データキューへのデータ送信
+ */
+extern bool_t  send_pridata(PDQCB *p_pdqcb, intptr_t data,
+                                                                                       PRI datapri, bool_t *p_reqdsp);
+
+/*
+ *  優先度データキューからのデータ受信
+ */
+extern bool_t  receive_pridata(PDQCB *p_pdqcb, intptr_t *p_data,
+                                                                                       PRI *p_datapri, bool_t *p_reqdsp);
+
+#endif /* TOPPERS_PRIDATAQ_H */
diff --git a/asp/extension/dcre/kernel/semaphore.c b/asp/extension/dcre/kernel/semaphore.c
new file mode 100644 (file)
index 0000000..9a8a964
--- /dev/null
@@ -0,0 +1,539 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: semaphore.c 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ *             セマフォ機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "wait.h"
+#include "semaphore.h"
+
+/*
+ *  トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_ACRE_SEM_ENTER
+#define LOG_ACRE_SEM_ENTER(pk_csem)
+#endif /* LOG_ACRE_SEM_ENTER */
+
+#ifndef LOG_ACRE_SEM_LEAVE
+#define LOG_ACRE_SEM_LEAVE(ercd)
+#endif /* LOG_ACRE_SEM_LEAVE */
+
+#ifndef LOG_DEL_SEM_ENTER
+#define LOG_DEL_SEM_ENTER(semid)
+#endif /* LOG_DEL_SEM_ENTER */
+
+#ifndef LOG_DEL_SEM_LEAVE
+#define LOG_DEL_SEM_LEAVE(ercd)
+#endif /* LOG_DEL_SEM_LEAVE */
+
+#ifndef LOG_SIG_SEM_ENTER
+#define LOG_SIG_SEM_ENTER(semid)
+#endif /* LOG_SIG_SEM_ENTER */
+
+#ifndef LOG_SIG_SEM_LEAVE
+#define LOG_SIG_SEM_LEAVE(ercd)
+#endif /* LOG_SIG_SEM_LEAVE */
+
+#ifndef LOG_ISIG_SEM_ENTER
+#define LOG_ISIG_SEM_ENTER(semid)
+#endif /* LOG_ISIG_SEM_ENTER */
+
+#ifndef LOG_ISIG_SEM_LEAVE
+#define LOG_ISIG_SEM_LEAVE(ercd)
+#endif /* LOG_ISIG_SEM_LEAVE */
+
+#ifndef LOG_WAI_SEM_ENTER
+#define LOG_WAI_SEM_ENTER(semid)
+#endif /* LOG_WAI_SEM_ENTER */
+
+#ifndef LOG_WAI_SEM_LEAVE
+#define LOG_WAI_SEM_LEAVE(ercd)
+#endif /* LOG_WAI_SEM_LEAVE */
+
+#ifndef LOG_POL_SEM_ENTER
+#define LOG_POL_SEM_ENTER(semid)
+#endif /* LOG_POL_SEM_ENTER */
+
+#ifndef LOG_POL_SEM_LEAVE
+#define LOG_POL_SEM_LEAVE(ercd)
+#endif /* LOG_POL_SEM_LEAVE */
+
+#ifndef LOG_TWAI_SEM_ENTER
+#define LOG_TWAI_SEM_ENTER(semid, tmout)
+#endif /* LOG_TWAI_SEM_ENTER */
+
+#ifndef LOG_TWAI_SEM_LEAVE
+#define LOG_TWAI_SEM_LEAVE(ercd)
+#endif /* LOG_TWAI_SEM_LEAVE */
+
+#ifndef LOG_INI_SEM_ENTER
+#define LOG_INI_SEM_ENTER(semid)
+#endif /* LOG_INI_SEM_ENTER */
+
+#ifndef LOG_INI_SEM_LEAVE
+#define LOG_INI_SEM_LEAVE(ercd)
+#endif /* LOG_INI_SEM_LEAVE */
+
+#ifndef LOG_REF_SEM_ENTER
+#define LOG_REF_SEM_ENTER(semid, pk_rsem)
+#endif /* LOG_REF_SEM_ENTER */
+
+#ifndef LOG_REF_SEM_LEAVE
+#define LOG_REF_SEM_LEAVE(ercd, pk_rsem)
+#endif /* LOG_REF_SEM_LEAVE */
+
+/*
+ *  セマフォの数
+ */
+#define tnum_sem       ((uint_t)(tmax_semid - TMIN_SEMID + 1))
+#define tnum_ssem      ((uint_t)(tmax_ssemid - TMIN_SEMID + 1))
+
+/*
+ *  セマフォIDからセマフォ管理ブロックを取り出すためのマクロ
+ */
+#define INDEX_SEM(semid)       ((uint_t)((semid) - TMIN_SEMID))
+#define get_semcb(semid)       (&(semcb_table[INDEX_SEM(semid)]))
+
+#ifdef TOPPERS_semini
+
+/*
+ *  使用していないセマフォ管理ブロックのリスト
+ */
+QUEUE  free_semcb;
+
+/* 
+ *  セマフォ機能の初期化
+ */
+void
+initialize_semaphore(void)
+{
+       uint_t  i, j;
+       SEMCB   *p_semcb;
+       SEMINIB *p_seminib;
+
+       for (p_semcb = semcb_table, i = 0; i < tnum_ssem; p_semcb++, i++) {
+               queue_initialize(&(p_semcb->wait_queue));
+               p_semcb->p_seminib = &(seminib_table[i]);
+               p_semcb->semcnt = p_semcb->p_seminib->isemcnt;
+       }
+       queue_initialize(&free_semcb);
+       for (j = 0; i < tnum_sem; p_semcb++, i++, j++) {
+               p_seminib = &(aseminib_table[j]);
+               p_seminib->sematr = TA_NOEXS;
+               p_semcb->p_seminib = ((const SEMINIB *) p_seminib);
+               queue_insert_prev(&free_semcb, &(p_semcb->wait_queue));
+       }
+}
+
+#endif /* TOPPERS_semini */
+
+/*
+ *  セマフォの生成
+ */
+#ifdef TOPPERS_acre_sem
+
+ER_UINT
+acre_sem(const T_CSEM *pk_csem)
+{
+       SEMCB   *p_semcb;
+       SEMINIB *p_seminib;
+       ER              ercd;
+
+       LOG_ACRE_SEM_ENTER(pk_csem);
+       CHECK_TSKCTX_UNL();
+       CHECK_RSATR(pk_csem->sematr, TA_TPRI);
+       CHECK_PAR(0 <= pk_csem->isemcnt && pk_csem->isemcnt <= pk_csem->maxsem);
+       CHECK_PAR(1 <= pk_csem->maxsem && pk_csem->maxsem <= TMAX_MAXSEM);
+
+       t_lock_cpu();
+       if (queue_empty(&free_semcb)) {
+               ercd = E_NOID;
+       }
+       else {
+               p_semcb = ((SEMCB *) queue_delete_next(&free_semcb));
+               p_seminib = (SEMINIB *)(p_semcb->p_seminib);
+               p_seminib->sematr = pk_csem->sematr;
+               p_seminib->isemcnt = pk_csem->isemcnt;
+               p_seminib->maxsem = pk_csem->maxsem;
+
+               queue_initialize(&(p_semcb->wait_queue));
+               p_semcb->semcnt = p_semcb->p_seminib->isemcnt;
+               ercd = SEMID(p_semcb);
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_ACRE_SEM_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_acre_sem */
+
+/*
+ *  セマフォの削除
+ */
+#ifdef TOPPERS_del_sem
+
+ER
+del_sem(ID semid)
+{
+       SEMCB   *p_semcb;
+       SEMINIB *p_seminib;
+       bool_t  dspreq;
+       ER              ercd;
+
+       LOG_DEL_SEM_ENTER(semid);
+       CHECK_TSKCTX_UNL();
+       CHECK_SEMID(semid);
+       p_semcb = get_semcb(semid);
+
+       t_lock_cpu();
+       if (p_semcb->p_seminib->sematr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (SEMID(p_semcb) > tmax_ssemid) {
+               dspreq = init_wait_queue(&(p_semcb->wait_queue));
+               p_seminib = (SEMINIB *)(p_semcb->p_seminib);
+               p_seminib->sematr = TA_NOEXS;
+               queue_insert_prev(&free_semcb, &(p_semcb->wait_queue));
+               if (dspreq) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_OBJ;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_DEL_SEM_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_del_sem */
+
+/*
+ *  セマフォ資源の返却
+ */
+#ifdef TOPPERS_sig_sem
+
+ER
+sig_sem(ID semid)
+{
+       SEMCB   *p_semcb;
+       TCB             *p_tcb;
+       ER              ercd;
+    
+       LOG_SIG_SEM_ENTER(semid);
+       CHECK_TSKCTX_UNL();
+       CHECK_SEMID(semid);
+       p_semcb = get_semcb(semid);
+
+       t_lock_cpu();
+       if (p_semcb->p_seminib->sematr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (!queue_empty(&(p_semcb->wait_queue))) {
+               p_tcb = (TCB *) queue_delete_next(&(p_semcb->wait_queue));
+               if (wait_complete(p_tcb)) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else if (p_semcb->semcnt < p_semcb->p_seminib->maxsem) {
+               p_semcb->semcnt += 1;
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_QOVR;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_SIG_SEM_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_sig_sem */
+
+/*
+ *  セマフォ資源の返却(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_isig_sem
+
+ER
+isig_sem(ID semid)
+{
+       SEMCB   *p_semcb;
+       TCB             *p_tcb;
+       ER              ercd;
+    
+       LOG_ISIG_SEM_ENTER(semid);
+       CHECK_INTCTX_UNL();
+       CHECK_SEMID(semid);
+       p_semcb = get_semcb(semid);
+
+       i_lock_cpu();
+       if (p_semcb->p_seminib->sematr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (!queue_empty(&(p_semcb->wait_queue))) {
+               p_tcb = (TCB *) queue_delete_next(&(p_semcb->wait_queue));
+               if (wait_complete(p_tcb)) {
+                       reqflg = true;
+               }
+               ercd = E_OK;
+       }
+       else if (p_semcb->semcnt < p_semcb->p_seminib->maxsem) {
+               p_semcb->semcnt += 1;
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_QOVR;
+       }
+       i_unlock_cpu();
+
+  error_exit:
+       LOG_ISIG_SEM_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_isig_sem */
+
+/*
+ *  セマフォ資源の獲得
+ */
+#ifdef TOPPERS_wai_sem
+
+ER
+wai_sem(ID semid)
+{
+       SEMCB   *p_semcb;
+       WINFO_SEM winfo_sem;
+       ER              ercd;
+
+       LOG_WAI_SEM_ENTER(semid);
+       CHECK_DISPATCH();
+       CHECK_SEMID(semid);
+       p_semcb = get_semcb(semid);
+
+       t_lock_cpu();
+       if (p_semcb->p_seminib->sematr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (p_semcb->semcnt >= 1) {
+               p_semcb->semcnt -= 1;
+               ercd = E_OK;
+       }
+       else {
+               p_runtsk->tstat = (TS_WAITING | TS_WAIT_SEM);
+               wobj_make_wait((WOBJCB *) p_semcb, (WINFO_WOBJ *) &winfo_sem);
+               dispatch();
+               ercd = winfo_sem.winfo.wercd;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_WAI_SEM_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_wai_sem */
+
+/*
+ *  セマフォ資源の獲得(ポーリング)
+ */
+#ifdef TOPPERS_pol_sem
+
+ER
+pol_sem(ID semid)
+{
+       SEMCB   *p_semcb;
+       ER              ercd;
+
+       LOG_POL_SEM_ENTER(semid);
+       CHECK_TSKCTX_UNL();
+       CHECK_SEMID(semid);
+       p_semcb = get_semcb(semid);
+
+       t_lock_cpu();
+       if (p_semcb->p_seminib->sematr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (p_semcb->semcnt >= 1) {
+               p_semcb->semcnt -= 1;
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_TMOUT;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_POL_SEM_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_pol_sem */
+
+/*
+ *  セマフォ資源の獲得(タイムアウトあり)
+ */
+#ifdef TOPPERS_twai_sem
+
+ER
+twai_sem(ID semid, TMO tmout)
+{
+       SEMCB   *p_semcb;
+       WINFO_SEM winfo_sem;
+       TMEVTB  tmevtb;
+       ER              ercd;
+
+       LOG_TWAI_SEM_ENTER(semid, tmout);
+       CHECK_DISPATCH();
+       CHECK_SEMID(semid);
+       CHECK_TMOUT(tmout);
+       p_semcb = get_semcb(semid);
+
+       t_lock_cpu();
+       if (p_semcb->p_seminib->sematr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (p_semcb->semcnt >= 1) {
+               p_semcb->semcnt -= 1;
+               ercd = E_OK;
+       }
+       else if (tmout == TMO_POL) {
+               ercd = E_TMOUT;
+       }
+       else {
+               p_runtsk->tstat = (TS_WAITING | TS_WAIT_SEM);
+               wobj_make_wait_tmout((WOBJCB *) p_semcb, (WINFO_WOBJ *) &winfo_sem,
+                                                                                                               &tmevtb, tmout);
+               dispatch();
+               ercd = winfo_sem.winfo.wercd;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_TWAI_SEM_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_twai_sem */
+
+/*
+ *  セマフォの再初期化
+ */
+#ifdef TOPPERS_ini_sem
+
+ER
+ini_sem(ID semid)
+{
+       SEMCB   *p_semcb;
+       bool_t  dspreq;
+       ER              ercd;
+    
+       LOG_INI_SEM_ENTER(semid);
+       CHECK_TSKCTX_UNL();
+       CHECK_SEMID(semid);
+       p_semcb = get_semcb(semid);
+
+       t_lock_cpu();
+       if (p_semcb->p_seminib->sematr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else {
+               dspreq = init_wait_queue(&(p_semcb->wait_queue));
+               p_semcb->semcnt = p_semcb->p_seminib->isemcnt;
+               if (dspreq) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_INI_SEM_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ini_sem */
+
+/*
+ *  セマフォの状態参照
+ */
+#ifdef TOPPERS_ref_sem
+
+ER
+ref_sem(ID semid, T_RSEM *pk_rsem)
+{
+       SEMCB   *p_semcb;
+       ER              ercd;
+    
+       LOG_REF_SEM_ENTER(semid, pk_rsem);
+       CHECK_TSKCTX_UNL();
+       CHECK_SEMID(semid);
+       p_semcb = get_semcb(semid);
+
+       t_lock_cpu();
+       if (p_semcb->p_seminib->sematr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else {
+               pk_rsem->wtskid = wait_tskid(&(p_semcb->wait_queue));
+               pk_rsem->semcnt = p_semcb->semcnt;
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_REF_SEM_LEAVE(ercd, pk_rsem);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ref_sem */
old mode 100755 (executable)
new mode 100644 (file)
similarity index 50%
rename from asp/target/cq_starm_gcc/target_syssvc.h
rename to asp/extension/dcre/kernel/semaphore.h
index 0dbb793..08460ff
@@ -3,7 +3,9 @@
  *      Toyohashi Open Platform for Embedded Real-Time Systems/
  *      Advanced Standard Profile Kernel
  * 
- *  Copyright (C) 2007 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2000 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
+ *  @(#) $Id: semaphore.h 1966 2010-11-20 07:23:56Z ertl-hiro $
  */
 
 /*
- *  システムサービスのターゲット依存部(CQ-STARM用)
- *
- *  システムサービスのターゲット依存部のインクルードファイル.このファ
- *  イルの内容は,コンポーネント記述ファイルに記述され,このファイルは
- *  無くなる見込み.
+ *             セマフォ機能
  */
 
-#ifndef TOPPERS_TARGET_SYSSVC_H
-#define TOPPERS_TARGET_SYSSVC_H
+#ifndef TOPPERS_SEMAPHORE_H
+#define TOPPERS_SEMAPHORE_H
+
+#include <queue.h>
 
 /*
- *  ターゲットシステムのハードウェア資源の定義
+ *  セマフォ初期化ブロック
+ *
+ *  この構造体は,同期・通信オブジェクトの初期化ブロックの共通部分
+ *  (WOBJINIB)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ *  最初のフィールドが共通になっている.
  */
-#include "cq_starm.h"
+typedef struct semaphore_initialization_block {
+       ATR                     sematr;                 /* セマフォ属性 */
+       uint_t          isemcnt;                /* セマフォの資源数の初期値 */
+       uint_t          maxsem;                 /* セマフォの最大資源数 */
+} SEMINIB;
 
 /*
- *  トレースログに関する設定
+ *  セマフォ管理ブロック
+ *
+ *  この構造体は,同期・通信オブジェクトの管理ブロックの共通部分(WOBJCB)
+ *  を拡張(オブジェクト指向言語の継承に相当)したもので,最初の2つの
+ *  フィールドが共通になっている.
  */
-#ifdef TOPPERS_TRACE_ENABLE
-#include "logtrace/trace_config.h"
-#endif /* TOPPERS_TRACE_ENABLE */
+typedef struct semaphore_control_block {
+       QUEUE           wait_queue;             /* セマフォ待ちキュー */
+       const SEMINIB *p_seminib;       /* 初期化ブロックへのポインタ */
+       uint_t          semcnt;                 /* セマフォ現在カウント値 */
+} SEMCB;
 
 /*
- *  起動メッセージのターゲットシステム名
+ *  セマフォ待ち情報ブロックの定義
+ *
+ *  この構造体は,同期・通信オブジェクトの待ち情報ブロックの共通部分
+ *  (WINFO_WOBJ)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ *  すべてのフィールドが共通になっている.
  */
-#define TARGET_NAME    "CQ-STARM(STM32F103)"
+typedef struct semaphore_waiting_information {
+       WINFO   winfo;                  /* 標準の待ち情報ブロック */
+       SEMCB   *p_semcb;               /* 待っているセマフォの管理ブロック */
+} WINFO_SEM;
 
 /*
- *  起動メッセージにターゲット依存部の著作権表示を
- *  追加するためのマクロ.
+ *  使用していないセマフォ管理ブロックのリスト
  */
-#ifdef PRC_COPYRIGHT
-#define TARGET_COPYRIGHT       PRC_COPYRIGHT
-#endif /* PRC_COPYRIGHT */
+extern QUEUE   free_semcb;
 
 /*
- *  システムログの低レベル出力のための文字出力
- *
- *  ターゲット依存の方法で,文字cを表示/出力/保存する.
+ *  セマフォIDの最大値(kernel_cfg.c)
  */
-extern void    target_fput_log(char_t c);
+extern const ID        tmax_semid;
+extern const ID        tmax_ssemid;
 
 /*
- *  ã\82·ã\83ªã\82¢ã\83«ã\83\9dã\83¼ã\83\88æ\95°ã\81®å®\9a義
+ *  ã\82»ã\83\9eã\83\95ã\82©å\88\9dæ\9c\9få\8c\96ã\83\96ã\83­ã\83\83ã\82¯ã\81®ã\82¨ã\83ªã\82¢ï¼\88kernel_cfg.cï¼\89
  */
-#define TNUM_PORT        (1)           /* サポートするシリアルポートの数 */
-#define TNUM_SIOP        (1)
+extern const SEMINIB   seminib_table[];
+extern SEMINIB                 aseminib_table[];
 
-#define LOGTASK_PORTID   SIO_PORTID
+/*
+ *  セマフォ管理ブロックのエリア(kernel_cfg.c)
+ */
+extern SEMCB   semcb_table[];
 
 /*
- *  ã\83\9cã\83¼ã\83¬ã\83¼ã\83\88
+ *  ã\82»ã\83\9eã\83\95ã\82©ç®¡ç\90\86ã\83\96ã\83­ã\83\83ã\82¯ã\81\8bã\82\89ã\82»ã\83\9eã\83\95ã\82©IDã\82\92å\8f\96ã\82\8aå\87ºã\81\99ã\81\9fã\82\81ã\81®ã\83\9eã\82¯ã\83­
  */
-#define BPS_SETTING            (115200)
+#define        SEMID(p_semcb)  ((ID)(((p_semcb) - semcb_table) + TMIN_SEMID))
 
 /*
- *  システムログタスク関連の定数の定義
- *
- *  デフォルト値の通り.
+ *  セマフォ機能の初期化
  */
+extern void    initialize_semaphore(void);
 
-#endif /* TOPPERS_TARGET_SYSSVC_H */
+#endif /* TOPPERS_SEMAPHORE_H */
old mode 100755 (executable)
new mode 100644 (file)
similarity index 50%
rename from asp/target/lm3s8962_gcc/target_config.c
rename to asp/extension/dcre/kernel/startup.c
index f6ba08c..51bd6c4
@@ -3,7 +3,9 @@
  *      Toyohashi Open Platform for Embedded Real-Time Systems/
  *      Advanced Standard Profile Kernel
  * 
- *  Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: target_config.c 1309 2008-08-27 07:48:51Z ertl-honda $
+ *  @(#) $Id: startup.c 1966 2010-11-20 07:23:56Z ertl-hiro $
  */
 
 /*
- * ターゲット依存モジュール(LM3S8962用)
+ *             カーネルの初期化と終了処理
  */
+
 #include "kernel_impl.h"
+#include "time_event.h"
 #include <sil.h>
 
-#include "hw_types.h"
-#include "hw_sysctl.h"
-#include "sysctl.h"
-#include "hw_memmap.h"
-#include "gpio.h"
-#include "uart.h"
-#include "hw_ints.h"
+/*
+ *  トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_KER_ENTER
+#define LOG_KER_ENTER()
+#endif /* LOG_KER_ENTER */
+
+#ifndef LOG_KER_LEAVE
+#define LOG_KER_LEAVE()
+#endif /* LOG_KER_LEAVE */
+
+#ifndef LOG_EXT_KER_ENTER
+#define LOG_EXT_KER_ENTER()
+#endif /* LOG_EXT_KER_ENTER */
+
+#ifndef LOG_EXT_KER_LEAVE
+#define LOG_EXT_KER_LEAVE(ercd)
+#endif /* LOG_EXT_KER_LEAVE */
+
+#ifdef TOPPERS_sta_ker
+
+/*
+ *  カーネル動作状態フラグ
+ *
+ *  スタートアップルーチンで,false(=0)に初期化されることを期待して
+ *  いる.
+ */
+bool_t kerflg = false;
 
 /*
- *  ã\82¿ã\83¼ã\82²ã\83\83ã\83\88ä¾\9då­\98ã\81®å\88\9dæ\9c\9få\8c\96
+ *  ã\82«ã\83¼ã\83\8dã\83«ã\81®èµ·å\8b\95
  */
 void
-target_initialize(void){
+sta_ker(void)
+{
        /*
-        *  ã\82¯ã\83­ã\83\83ã\82¯の初期化
+        *  ã\82¿ã\83¼ã\82²ã\83\83ã\83\88ä¾\9då­\98の初期化
         */
-       if( DEVICE_IS_REVA2 ) {
-               SysCtlLDOSet( SYSCTL_LDO_2_75V );
-       }
-
-       SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ );
+       target_initialize();
 
        /*
-        *  LEDの初期化
+        *  各モジュールの初期化
+        *
+        *  タイムイベント管理モジュールは他のモジュールより先に初期化
+        *  する必要がある.
         */
-       SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
-       GPIODirModeSet( GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_DIR_MODE_OUT );
-       GPIOPadConfigSet( GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD );
+       initialize_kmm();
+       initialize_tmevt();
+       initialize_object();
+
+       /*
+        *  初期化ルーチンの実行
+        */ 
+       call_inirtn();
 
        /*
-        * チップ依存の初期化
+        *  カーネル動作の開始
         */
-       prc_initialize();
+       kerflg = true;
+       LOG_KER_ENTER();
+       start_dispatch();
+       assert(0);
+}
+
+#endif /* TOPPERS_sta_ker */
+
+/*
+ *  カーネルの終了
+ */
+#ifdef TOPPERS_ext_ker
+
+ER
+ext_ker(void)
+{
+       SIL_PRE_LOC;
+
+       LOG_EXT_KER_ENTER();
 
        /*
-        *  sys_putc が可能になるようにUARTを初期化
+        *  割込みロック状態に移行
         */
-       SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
-       SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
-       GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
-       UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200,
-                                               (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
-                                                UART_CONFIG_PAR_NONE));
+       SIL_LOC_INT();
 
-} 
+       /*
+        *  カーネル動作の終了
+        */
+       LOG_KER_LEAVE();
+       kerflg = false;
 
+       /*
+        *  カーネルの終了処理の呼出し
+        *
+        *  非タスクコンテキストに切り換えて,exit_kernelを呼び出す.
+        */
+       call_exit_kernel();
+       return(E_SYS);
+}
 
 /*
- *  ã\82¿ã\83¼ã\82²ã\83\83ã\83\88ä¾\9då­\98の終了処理
+ *  ã\82«ã\83¼ã\83\8dã\83«の終了処理
  */
 void
-target_exit(void)
+exit_kernel(void)
 {
        /*
-        *  チップ依存の終了処理
+        *  終了処理ルーチンの実行
         */
-       prc_terminate();
+       call_terrtn();
 
        /*
-        *  開発環境依存の終了処理
+        *  ターゲット依存の終了処理
         */
-       while(1);
+       target_exit();
+       assert(0);
 }
 
+#endif /* TOPPERS_ext_ker */
 
 /*
- *  システムログの低レベル出力のための文字出力
+ *  カーネルの割り付けるメモリ領域の管理
+ *
+ *  メモリ領域を先頭から順に割り当て,解放されたメモリ領域を再利用しな
+ *  いメモリ管理モジュール.
  */
+#ifdef TOPPERS_kermem
+#ifndef OMIT_KMM_ALLOCONLY
+
+static void    *kmm_brk;
+
 void
-target_fput_log(char_t c)
+initialize_kmm(void)
 {
-       if (c == '\n') {
-               UARTCharPut(UART0_BASE, '\r');
+       kmm_brk = ((char *) kmm) + kmmsz;
+}
+
+void *
+kernel_malloc(SIZE size)
+{
+       if (((char *) kmm_brk) - ((char *) kmm) >= size) {
+               kmm_brk = ((char *) kmm_brk) - size;
+               return(kmm_brk);
+       }
+       else {
+               return(NULL);
        }
-       UARTCharPut(UART0_BASE, c);
 }
+
+void
+kernel_free(void *ptr)
+{
+}
+
+#endif /* OMIT_KMM_ALLOCONLY */
+#endif /* TOPPERS_kermem */
diff --git a/asp/extension/dcre/kernel/task.c b/asp/extension/dcre/kernel/task.c
new file mode 100644 (file)
index 0000000..248c96a
--- /dev/null
@@ -0,0 +1,496 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  $Id: task.c 2018 2010-12-31 13:43:05Z ertl-hiro $
+ */
+
+/*
+ *             タスク管理モジュール
+ */
+
+#include "kernel_impl.h"
+#include "wait.h"
+#include "task.h"
+
+/*
+ *  トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_TEX_ENTER
+#define LOG_TEX_ENTER(p_tcb, texptn)
+#endif /* LOG_TEX_ENTER */
+
+#ifndef LOG_TEX_LEAVE
+#define LOG_TEX_LEAVE(p_tcb)
+#endif /* LOG_TEX_LEAVE */
+
+#ifdef TOPPERS_tskini
+
+/*
+ *  実行状態のタスク
+ */
+TCB            *p_runtsk;
+
+/*
+ *  最高優先順位のタスク
+ */
+TCB            *p_schedtsk;
+
+/*
+ *  タスクディスパッチ/タスク例外処理ルーチン起動要求フラグ
+ */
+bool_t reqflg;
+
+/*
+ *  割込み優先度マスク全解除状態
+ */
+bool_t ipmflg;
+
+/*
+ *  ディスパッチ禁止状態
+ */
+bool_t disdsp;
+
+/*
+ *  タスクディスパッチ可能状態
+ */
+bool_t dspflg;
+
+/*
+ *  レディキュー
+ */
+QUEUE  ready_queue[TNUM_TPRI];
+
+/*
+ *  レディキューサーチのためのビットマップ
+ */
+uint16_t       ready_primap;
+
+/*
+ *  使用していないTCBのリスト
+ */
+QUEUE  free_tcb;
+
+/*
+ *  タスク管理モジュールの初期化
+ */
+void
+initialize_task(void)
+{
+       uint_t  i, j;
+       TCB             *p_tcb;
+       TINIB   *p_tinib;
+
+       p_runtsk = p_schedtsk = NULL;
+       reqflg = false;
+       ipmflg = true;
+       disdsp = false;
+       dspflg = true;
+
+       for (i = 0; i < TNUM_TPRI; i++) {
+               queue_initialize(&(ready_queue[i]));
+       }
+       ready_primap = 0U;
+
+       for (i = 0; i < tnum_stsk; i++) {
+               j = INDEX_TSK(torder_table[i]);
+               p_tcb = &(tcb_table[j]);
+               p_tcb->p_tinib = &(tinib_table[j]);
+               p_tcb->actque = false;
+               make_dormant(p_tcb);
+               if ((p_tcb->p_tinib->tskatr & TA_ACT) != 0U) {
+                       make_active(p_tcb);
+               }
+       }
+       queue_initialize(&free_tcb);
+       for (j = 0; i < tnum_tsk; i++, j++) {
+               p_tcb = &(tcb_table[i]);
+               p_tinib = &(atinib_table[j]);
+               p_tinib->tskatr = TA_NOEXS;
+               p_tcb->p_tinib = ((const TINIB *) p_tinib);
+               queue_insert_prev(&free_tcb, &(p_tcb->task_queue));
+       }
+}
+
+#endif /* TOPPERS_tskini */
+
+/*
+ *  ビットマップサーチ関数
+ *
+ *  bitmap内の1のビットの内,最も下位(右)のものをサーチし,そのビッ
+ *  ト番号を返す.ビット番号は,最下位ビットを0とする.bitmapに0を指定
+ *  してはならない.この関数では,bitmapが16ビットであることを仮定し,
+ *  uint16_t型としている.
+ *
+ *  ビットサーチ命令を持つプロセッサでは,ビットサーチ命令を使うように
+ *  書き直した方が効率が良い場合がある.このような場合には,ターゲット
+ *  依存部でビットサーチ命令を使ったbitmap_searchを定義し,
+ *  OMIT_BITMAP_SEARCHをマクロ定義すればよい.また,ビットサーチ命令の
+ *  サーチ方向が逆などの理由で優先度とビットとの対応を変更したい場合に
+ *  は,PRIMAP_BITをマクロ定義すればよい.
+ *
+ *  また,ライブラリにffsがあるなら,次のように定義してライブラリ関数を
+ *  使った方が効率が良い可能性もある.
+ *             #define bitmap_search(bitmap) (ffs(bitmap) - 1)
+ */
+#ifndef PRIMAP_BIT
+#define        PRIMAP_BIT(pri)         (1U << (pri))
+#endif /* PRIMAP_BIT */
+
+#ifndef OMIT_BITMAP_SEARCH
+
+static const unsigned char bitmap_search_table[] = { 0, 1, 0, 2, 0, 1, 0,
+                                                                                               3, 0, 1, 0, 2, 0, 1, 0 };
+
+Inline uint_t
+bitmap_search(uint16_t bitmap)
+{
+       uint_t  n = 0U;
+
+       assert(bitmap != 0U);
+       if ((bitmap & 0x00ffU) == 0U) {
+               bitmap >>= 8;
+               n += 8;
+       }
+       if ((bitmap & 0x0fU) == 0U) {
+               bitmap >>= 4;
+               n += 4;
+       }
+       return(n + bitmap_search_table[(bitmap & 0x0fU) - 1]);
+}
+
+#endif /* OMIT_BITMAP_SEARCH */
+
+/*
+ *  優先度ビットマップが空かのチェック
+ */
+Inline bool_t
+primap_empty(void)
+{
+       return(ready_primap == 0U);
+}
+
+/*
+ *  優先度ビットマップのサーチ
+ */
+Inline uint_t
+primap_search(void)
+{
+       return(bitmap_search(ready_primap));
+}
+
+/*
+ *  優先度ビットマップのセット
+ */
+Inline void
+primap_set(uint_t pri)
+{
+       ready_primap |= PRIMAP_BIT(pri);
+}
+
+/*
+ *  優先度ビットマップのクリア
+ */
+Inline void
+primap_clear(uint_t pri)
+{
+       ready_primap &= ~PRIMAP_BIT(pri);
+}
+
+/*
+ *  最高優先順位タスクのサーチ
+ */
+#ifdef TOPPERS_tsksched
+
+TCB *
+search_schedtsk(void)
+{
+       uint_t  schedpri;
+
+       schedpri = primap_search();
+       return((TCB *)(ready_queue[schedpri].p_next));
+}
+
+#endif /* TOPPERS_tsksched */
+
+/*
+ *  実行できる状態への遷移
+ *
+ *  最高優先順位のタスクを更新するのは,実行できるタスクがなかった場合
+ *  と,p_tcbの優先度が最高優先順位のタスクの優先度よりも高い場合であ
+ *  る.
+ */
+#ifdef TOPPERS_tskrun
+
+bool_t
+make_runnable(TCB *p_tcb)
+{
+       uint_t  pri = p_tcb->priority;
+
+       queue_insert_prev(&(ready_queue[pri]), &(p_tcb->task_queue));
+       primap_set(pri);
+
+       if (p_schedtsk == (TCB *) NULL || pri < p_schedtsk->priority) {
+               p_schedtsk = p_tcb;
+               return(dspflg);
+       }
+       return(false);
+}
+
+#endif /* TOPPERS_tskrun */
+
+/*
+ *  実行できる状態から他の状態への遷移
+ *
+ *  最高優先順位のタスクを更新するのは,p_tcbが最高優先順位のタスクで
+ *  あった場合である.p_tcbと同じ優先度のタスクが他にある場合は,p_tcb
+ *  の次のタスクが最高優先順位になる.そうでない場合は,レディキューを
+ *  サーチする必要がある.
+ */
+#ifdef TOPPERS_tsknrun
+
+bool_t
+make_non_runnable(TCB *p_tcb)
+{
+       uint_t  pri = p_tcb->priority;
+       QUEUE   *p_queue = &(ready_queue[pri]);
+
+       queue_delete(&(p_tcb->task_queue));
+       if (queue_empty(p_queue)) {
+               primap_clear(pri);
+               if (p_schedtsk == p_tcb) {
+                       p_schedtsk = primap_empty() ? (TCB *) NULL : search_schedtsk();
+                       return(dspflg);
+               }
+       }
+       else {
+               if (p_schedtsk == p_tcb) {
+                       p_schedtsk = (TCB *)(p_queue->p_next);
+                       return(dspflg);
+               }
+       }
+       return(false);
+}
+
+#endif /* TOPPERS_tsknrun */
+
+/*
+ *  休止状態への遷移
+ */
+#ifdef TOPPERS_tskdmt
+
+void
+make_dormant(TCB *p_tcb)
+{
+       p_tcb->tstat = TS_DORMANT;
+       p_tcb->priority = p_tcb->p_tinib->ipriority;
+       p_tcb->wupque = false;
+       p_tcb->enatex = false;
+       p_tcb->texptn = 0U;
+       LOG_TSKSTAT(p_tcb);
+}
+
+#endif /* TOPPERS_tskdmt */
+
+/*
+ *  休止状態から実行できる状態への遷移
+ */
+#ifdef TOPPERS_tskact
+
+bool_t
+make_active(TCB *p_tcb)
+{
+       activate_context(p_tcb);
+       p_tcb->tstat = TS_RUNNABLE;
+       LOG_TSKSTAT(p_tcb);
+       return(make_runnable(p_tcb));
+}
+
+#endif /* TOPPERS_tskact */
+
+/*
+ *  タスクの優先度の変更
+ *
+ *  タスクが実行できる状態の場合には,レディキューの中での位置を変更す
+ *  る.オブジェクトの待ちキューの中で待ち状態になっている場合には,待
+ *  ちキューの中での位置を変更する.
+ *
+ *  最高優先順位のタスクを更新するのは,(1) p_tcbが最高優先順位のタス
+ *  クであって,その優先度を下げた場合,(2) p_tcbが最高優先順位のタス
+ *  クではなく,変更後の優先度が最高優先順位のタスクの優先度よりも高い
+ *  場合である.(1)の場合には,レディキューをサーチする必要がある.
+ */
+#ifdef TOPPERS_tskpri
+
+bool_t
+change_priority(TCB *p_tcb, uint_t newpri)
+{
+       uint_t  oldpri;
+
+       oldpri = p_tcb->priority;
+       p_tcb->priority = newpri;
+
+       if (TSTAT_RUNNABLE(p_tcb->tstat)) {
+               /*
+                *  タスクが実行できる状態の場合
+                */
+               queue_delete(&(p_tcb->task_queue));
+               if (queue_empty(&(ready_queue[oldpri]))) {
+                       primap_clear(oldpri);
+               }
+               queue_insert_prev(&(ready_queue[newpri]), &(p_tcb->task_queue));
+               primap_set(newpri);
+
+               if (p_schedtsk == p_tcb) {
+                       if (newpri >= oldpri) {
+                               p_schedtsk = search_schedtsk();
+                               return(p_schedtsk != p_tcb && dspflg);
+                       }
+               }
+               else {
+                       if (newpri < p_schedtsk->priority) {
+                               p_schedtsk = p_tcb;
+                               return(dspflg);
+                       }
+               }
+       }
+       else {
+               if (TSTAT_WAIT_WOBJCB(p_tcb->tstat)) {
+                       /*
+                        *  タスクが,同期・通信オブジェクトの管理ブロックの共通部
+                        *  分(WOBJCB)の待ちキューにつながれている場合
+                        */
+                       wobj_change_priority(((WINFO_WOBJ *)(p_tcb->p_winfo))->p_wobjcb,
+                                                                                                                                       p_tcb);
+               }
+       }
+       return(false);
+}
+
+#endif /* TOPPERS_tskpri */
+
+/*
+ *  レディキューの回転
+ *
+ *  最高優先順位のタスクを更新するのは,最高優先順位のタスクがタスクキ
+ *  ューの末尾に移動した場合である.
+ */
+#ifdef TOPPERS_tskrot
+
+bool_t
+rotate_ready_queue(uint_t pri)
+{
+       QUEUE   *p_queue = &(ready_queue[pri]);
+       QUEUE   *p_entry;
+
+       if (!queue_empty(p_queue) && p_queue->p_next->p_next != p_queue) {
+               p_entry = queue_delete_next(p_queue);
+               queue_insert_prev(p_queue, p_entry);
+               if (p_schedtsk == (TCB *) p_entry) {
+                       p_schedtsk = (TCB *)(p_queue->p_next);
+                       return(dspflg);
+               }
+       }
+       return(false);
+}
+
+#endif /* TOPPERS_tskrot */
+
+/*
+ *  タスク例外処理ルーチンの呼出し
+ *
+ *  ASPカーネルでは,タスク例外処理ルーチン内でCPUロック状態に遷移し,
+ *  元の状態に戻さずにリターンした場合,カーネルが元の状態に戻す.
+ */
+#ifdef TOPPERS_tsktex
+
+void
+call_texrtn(void)
+{
+       TEXPTN  texptn;
+       bool_t  saved_disdsp;
+
+       saved_disdsp = disdsp;
+       p_runtsk->enatex = false;
+       do {
+               texptn = p_runtsk->texptn;
+               p_runtsk->texptn = 0U;
+
+               t_unlock_cpu();
+               LOG_TEX_ENTER(p_runtsk, texptn);
+               (*((TEXRTN)(p_runtsk->p_tinib->texrtn)))(texptn,
+                                                                                               p_runtsk->p_tinib->exinf);
+               LOG_TEX_LEAVE(p_runtsk);
+               if (!t_sense_lock()) {
+                       t_lock_cpu();
+               }
+               if (!ipmflg) {
+                       t_set_ipm(TIPM_ENAALL);
+                       ipmflg = true;
+               }
+               disdsp = saved_disdsp;
+               dspflg = !disdsp;
+               p_runtsk->enatex = false;
+               if (p_runtsk != p_schedtsk && dspflg) {
+                       /*
+                        *  ここでdispatchを呼び出す処理は,相互再帰呼出しになって
+                        *  いるが,dispatchを呼ぶ前にp_runtsk->enatexをfalseにして
+                        *  おけば支障がない.その理由については,「TOPPERS/ASP カー
+                        *  ネル 設計メモ」を参照のこと.
+                        */
+                       dispatch();
+               }
+       } while (p_runtsk->texptn != 0U);
+       p_runtsk->enatex = true;
+}
+
+/*
+ *  タスク例外処理ルーチンの起動
+ */
+#ifndef OMIT_CALLTEX
+
+void
+calltex(void)
+{
+       if (p_runtsk->enatex && p_runtsk->texptn != 0U && ipmflg) {
+               call_texrtn();
+       }
+}
+
+#endif /* OMIT_CALLTEX */
+#endif /* TOPPERS_tsktex */
diff --git a/asp/extension/dcre/kernel/task.h b/asp/extension/dcre/kernel/task.h
new file mode 100644 (file)
index 0000000..a3c8383
--- /dev/null
@@ -0,0 +1,488 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  $Id: task.h 2018 2010-12-31 13:43:05Z ertl-hiro $
+ */
+
+/*
+ *             タスク管理モジュール
+ */
+
+#ifndef TOPPERS_TASK_H
+#define TOPPERS_TASK_H
+
+#include <queue.h>
+#include "time_event.h"
+
+/*
+ *  トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_TSKSTAT
+#define LOG_TSKSTAT(p_tcb)
+#endif /* LOG_TSKSTAT */
+
+/*
+ *  タスク優先度の内部表現・外部表現変換マクロ
+ */
+#define INT_PRIORITY(x)                ((uint_t)((x) - TMIN_TPRI))
+#define EXT_TSKPRI(x)          ((PRI)(x) + TMIN_TPRI)
+
+/*
+ *  タスク状態の内部表現
+ *
+ *  TCB中のタスク状態では,実行状態(RUNNING)と実行可能状態(READY)
+ *  は区別しない.両状態を総称して,実行できる状態(RUNNABLE)と呼ぶ.
+ *  二重待ち状態は,(TS_WAITING | TS_SUSPENDED)で表す.TS_WAIT_???は待
+ *  ち要因を表し,待ち状態(二重待ち状態を含む)の場合にのみ設定する.
+ */
+#define TS_DORMANT             0x00U                   /* 休止状態 */
+#define TS_RUNNABLE            0x01U                   /* 実行できる状態 */
+#define TS_WAITING             0x02U                   /* 待ち状態 */
+#define TS_SUSPENDED   0x04U                   /* 強制待ち状態 */
+
+#define TS_WAIT_DLY            (0x00U << 3)    /* 時間経過待ち */
+#define TS_WAIT_SLP            (0x01U << 3)    /* 起床待ち */
+#define TS_WAIT_RDTQ   (0x02U << 3)    /* データキューからの受信待ち */
+#define TS_WAIT_RPDQ   (0x03U << 3)    /* 優先度データキューからの受信待ち */
+#define TS_WAIT_SEM            (0x04U << 3)    /* セマフォ資源の獲得待ち */
+#define TS_WAIT_FLG            (0x05U << 3)    /* イベントフラグ待ち */
+#define TS_WAIT_SDTQ   (0x06U << 3)    /* データキューへの送信待ち */
+#define TS_WAIT_SPDQ   (0x07U << 3)    /* 優先度データキューへの送信待ち */
+#define TS_WAIT_MBX            (0x08U << 3)    /* メールボックスからの受信待ち */
+#define TS_WAIT_MPF            (0x09U << 3)    /* 固定長メモリブロックの獲得待ち */
+
+/*
+ *  タスク状態判別マクロ
+ *
+ *  TSTAT_DORMANTはタスクが休止状態であるかどうかを,TSTAT_RUNNABLEは
+ *  タスクが実行できる状態であるかどうかを判別する.TSTAT_WAITINGは待
+ *  ち状態と二重待ち状態のいずれかであるかどうかを,TSTAT_SUSPENDEDは
+ *  強制待ち状態と二重待ち状態のいずれかであるかどうかを判別する.
+ */
+#define TSTAT_DORMANT(tstat)   ((tstat) == TS_DORMANT)
+#define TSTAT_RUNNABLE(tstat)  (((tstat) & TS_RUNNABLE) != 0U)
+#define TSTAT_WAITING(tstat)   (((tstat) & TS_WAITING) != 0U)
+#define TSTAT_SUSPENDED(tstat) (((tstat) & TS_SUSPENDED) != 0U)
+
+/*
+ *  タスク待ち要因判別マクロ
+ *
+ *  TSTAT_WAIT_SLPはタスクが起床待ちであるかどうかを,TSTAT_WAIT_WOBJ
+ *  はタスクが同期・通信オブジェクトに対する待ちであるか(言い換えると,
+ *  同期通信オブジェクトの待ちキューにつながれているか)どうかを判別す
+ *  る.また,TSTAT_WAIT_WOBJCBはタスクが同期・通信オブジェクトの管理
+ *  ブロックの共通部分(WOBJCB)の待ちキューにつながれているかどうかを
+ *  判別する.
+ *
+ *  TSTAT_WAIT_SLPは,任意のタスク状態の中から,タスクが起床待ちである
+ *  ことを判別できる.すなわち,TSTAT_WAITINGにより待ち状態であることを
+ *  判別せずに,TSTAT_SLPだけを用いて起床待ち状態であることを判別できる.
+ *  これを効率的に実現するために,TS_WAIT_SLPの値を,(0x00U << 3)ではな
+ *  く(0x01U << 3)としている.そのため,タスクが時間経過待ち状態である
+ *  ことを判別するためのTSTAT_WAIT_DLYを,TSTAT_WAIT_SLPと同様の方法で
+ *  実現することはできない.
+ */
+#define TS_WAIT_MASK   (0x0fU << 3)    /* 待ち要因の取出しマスク */
+
+#define TSTAT_WAIT_SLP(tstat)          (((tstat) & TS_WAIT_MASK) == TS_WAIT_SLP)
+#define TSTAT_WAIT_WOBJ(tstat)         (((tstat) & TS_WAIT_MASK) >= TS_WAIT_RDTQ)
+#define TSTAT_WAIT_WOBJCB(tstat)       (((tstat) & TS_WAIT_MASK) >= TS_WAIT_SEM)
+
+/*
+ *  待ち情報ブロック(WINFO)の定義
+ *
+ *  タスクが待ち状態の間は,TCBおよびそのp_winfoで指されるWINFOを次の
+ *  ように設定しなければならない.
+ *
+ *  (a) TCBのタスク状態を待ち状態(TS_WAITING)にする.その際に,待ち
+ *  要因(TS_WAIT_???)も設定する.
+ *
+ *  (b) タイムアウトを監視するために,タイムイベントブロックを登録する.
+ *  登録するタイムイベントブロックは,待ちに入るサービスコール処理関数
+ *  のローカル変数として確保し,それへのポインタをWINFOのp_tmevtbに記
+ *  憶する.タイムアウトの監視が必要ない場合(永久待ちの場合)には,
+ *  p_tmevtbをNULLにする.
+ *
+ *  同期・通信オブジェクトに対する待ち状態の場合には,標準のWINFOに
+ *  p_wobjcbフィールドを追加した構造体(WINFO_WOBJ,wait.hで定義)を使
+ *  う.また,以下の(c)〜(e)の設定を行う必要がある.同期・通信オブジェ
+ *  クトに関係しない待ち(起床待ち,時間経過待ち)の場合には,(c)〜(e)
+ *  は必要ない.
+ *
+ *  (c) TCBを待ち対象の同期・通信オブジェクトの待ちキューにつなぐ.待
+ *  ちキューにつなぐために,task_queueを使う.
+ *
+ *  (d) 待ち対象の同期・通信オブジェクトの管理ブロックへのポインタを,
+ *  WINFO_WOBJのp_wobjcbに記憶する.
+ *
+ *  (e) 待ち対象の同期・通信オブジェクトに依存して記憶することが必要な
+ *  情報がある場合には,WINFO_WOBJに必要な情報のためのフィールドを追加
+ *  した構造体を定義し,WINFO_WOBJの代わりに用いる.
+ *
+ *  待ち状態を解除する際には,待ち解除したタスクに対する返値をWINFOの
+ *  wercdに設定する.wercdが必要なのは待ち解除以降であるのに対して,
+ *  p_tmevtbは待ち解除後は必要ないため,メモリ節約のために共用体を使っ
+ *  ている.そのため,wercdへエラーコードを設定するのは,タイムイベント
+ *  ブロックを登録解除した後にしなければならない.
+ */
+typedef union waiting_information {
+       ER              wercd;                  /* 待ち解除時のエラーコード */
+       TMEVTB  *p_tmevtb;              /* 待ち状態用のタイムイベントブロック */
+} WINFO;
+
+/*
+ *  タスク初期化ブロック
+ *
+ *  タスクに関する情報を,値が変わらないためにROMに置ける部分(タスク
+ *  初期化ブロック)と,値が変化するためにRAMに置かなければならない部
+ *  分(タスク管理ブロック,TCB)に分離し,TCB内に対応するタスク初期化
+ *  ブロックを指すポインタを入れる.タスク初期化ブロック内に対応する
+ *  TCBを指すポインタを入れる方法の方が,RAMの節約の観点からは望ましい
+ *  が,実行効率が悪くなるために採用していない.他のオブジェクトについ
+ *  ても同様に扱う.
+ *
+ *  タスク初期化ブロックには,DEF_TEXで定義されるタスク例外処理ルーチ
+ *  ンに関する情報も含む.
+ */
+typedef struct task_initialization_block {
+       ATR                     tskatr;                 /* タスク属性 */
+       intptr_t        exinf;                  /* タスクの拡張情報 */
+       TASK            task;                   /* タスクの起動番地 */
+       uint_t          ipriority;              /* タスクの起動時優先度(内部表現) */
+
+#ifdef USE_TSKINICTXB
+       TSKINICTXB      tskinictxb;             /* タスク初期化コンテキストブロック */
+#else /* USE_TSKINICTXB */
+       SIZE            stksz;                  /* スタック領域のサイズ(丸めた値) */
+       void            *stk;                   /* スタック領域の先頭番地 */
+#endif /* USE_TSKINICTXB */
+
+       ATR                     texatr;                 /* タスク例外処理ルーチン属性 */
+       TEXRTN          texrtn;                 /* タスク例外処理ルーチンの起動番地 */
+} TINIB;
+
+/*
+ *  TCB中のフィールドのビット幅の定義
+ *
+ *  プロセッサによっては,TCB中のフィールドのビット幅でメモリ使用量と
+ *  性能がトレードオフになるため,ターゲット依存にフィールドのビット幅
+ *  を変更することを許している.
+ */
+#ifndef TBIT_TCB_PRIORITY
+#define        TBIT_TCB_PRIORITY               8               /* priorityフィールドのビット幅 */
+#endif /* TBIT_TCB_PRIORITY */
+
+/*
+ *  タスク管理ブロック(TCB)
+ *
+ *  ASPカーネルでは,タスクの起動要求キューイング数の最大値(TMAX_ACTCNT)
+ *  と起床要求キューイング数の最大値(TMAX_WUPCNT)は1に固定されている
+ *  ため,キューイングされているかどうかの真偽値で表現することができる.
+ *  また,強制待ち要求ネスト数の最大値(TMAX_SUSCNT)が1に固定されてい
+ *  るので,強制待ち要求ネスト数(suscnt)は必要ない.
+ *
+ *  TCBのいくつかのフィールドは,特定のタスク状態でのみ有効な値を保持し,
+ *  それ以外の場合は値が保証されない(よって,参照してはならない).各
+ *  フィールドが有効な値を保持する条件は次の通り.
+ *
+ *  ・初期化後は常に有効:
+ *             p_tinib,tstat,actque
+ *  ・休止状態以外で有効(休止状態では初期値になっている):
+ *             priority,wupque,enatex,texptn
+ *  ・待ち状態(二重待ち状態を含む)で有効:
+ *             p_winfo
+ *  ・実行できる状態と同期・通信オブジェクトに対する待ち状態で有効:
+ *             task_queue
+ *  ・実行可能状態,待ち状態,強制待ち状態,二重待ち状態で有効:
+ *             tskctxb
+ */
+typedef struct task_control_block {
+       QUEUE                   task_queue;             /* タスクキュー */
+       const TINIB             *p_tinib;               /* 初期化ブロックへのポインタ */
+
+#ifdef UINT8_MAX
+       uint8_t                 tstat;                  /* タスク状態(内部表現)*/
+#else /* UINT8_MAX */
+       BIT_FIELD_UINT  tstat : 8;              /* タスク状態(内部表現)*/
+#endif /* UINT8_MAX */
+#if defined(UINT8_MAX) && (TBIT_TCB_PRIORITY == 8)
+       uint8_t                 priority;               /* 現在の優先度(内部表現)*/
+#else /* defined(UINT8_MAX) && (TBIT_TCB_PRIORITY == 8) */
+       BIT_FIELD_UINT  priority : TBIT_TCB_PRIORITY;
+                                                                       /* 現在の優先度(内部表現)*/
+#endif  /* defined(UINT8_MAX) && (TBIT_TCB_PRIORITY == 8) */
+       BIT_FIELD_BOOL  actque : 1;             /* 起動要求キューイング */
+       BIT_FIELD_BOOL  wupque : 1;             /* 起床要求キューイング */
+       BIT_FIELD_BOOL  enatex : 1;             /* タスク例外処理許可状態 */
+
+       TEXPTN                  texptn;                 /* 保留例外要因 */
+       WINFO                   *p_winfo;               /* 待ち情報ブロックへのポインタ */
+       TSKCTXB                 tskctxb;                /* タスクコンテキストブロック */
+} TCB;
+
+/*
+ *  実行状態のタスク
+ *
+ *  実行状態のタスク(=プロセッサがコンテキストを持っているタスク)の
+ *  TCBを指すポインタ.実行状態のタスクがない場合はNULLにする.
+ *
+ *  サービスコールの処理中で,自タスク(サービスコールを呼び出したタス
+ *  ク)に関する情報を参照する場合はp_runtskを使う.p_runtskを書き換え
+ *  るのは,ディスパッチャ(と初期化処理)のみである.
+ */
+extern TCB     *p_runtsk;
+
+/*
+ *  最高優先順位のタスク
+ *
+ *  実行できるタスクの中で最高優先順位のタスクのTCBを指すポインタ.実
+ *  行できるタスクがない場合はNULLにする.
+ *
+ *  ディスパッチ禁止状態など,ディスパッチが保留されている間はp_runtsk
+ *  と一致しているとは限らない.
+ */
+extern TCB     *p_schedtsk;
+
+/*
+ *  ディスパッチ/タスク例外処理ルーチン起動要求フラグ
+ *
+ *  割込みハンドラ/CPU例外ハンドラの出口処理に,ディスパッチまたは
+ *  タスク例外処理ルーチンの起動を要求することを示すフラグ.
+ */
+extern bool_t  reqflg;
+
+/*
+ *  割込み優先度マスク全解除状態
+ *
+ *  割込み優先度マスク全解除状態であることを示すフラグ.
+ */
+extern bool_t  ipmflg;
+
+/*
+ *  ディスパッチ禁止状態
+ *
+ *  ディスパッチ禁止状態であることを示すフラグ.
+ */
+extern bool_t  disdsp;
+
+/*
+ *  タスクディスパッチ可能状態
+ *
+ *  割込み優先度マスク全解除状態であり,ディスパッチ許可状態である(ディ
+ *  スパッチ禁止状態でない)ことを示すフラグ.
+ */
+extern bool_t  dspflg;
+
+/*
+ *  レディキュー
+ *
+ *  レディキューは,実行できる状態のタスクを管理するためのキューである.
+ *  実行状態のタスクも管理しているため,レディ(実行可能)キューという
+ *  名称は正確ではないが,レディキューという名称が定着しているため,こ
+ *  の名称で呼ぶことにする.
+ *
+ *  レディキューは,優先度ごとのタスクキューで構成されている.タスクの
+ *  TCBは,該当する優先度のキューに登録される.
+ */
+extern QUEUE   ready_queue[TNUM_TPRI];
+
+/*
+ *  レディキューサーチのためのビットマップ
+ *
+ *  レディキューのサーチを効率よく行うために,優先度ごとのタスクキュー
+ *  にタスクが入っているかどうかを示すビットマップを用意している.ビッ
+ *  トマップを使うことで,メモリアクセスの回数を減らすことができるが,
+ *  ビット操作命令が充実していないプロセッサで,優先度の段階数が少ない
+ *  場合には,ビットマップ操作のオーバーヘッドのために,逆に効率が落ち
+ *  る可能性もある.
+ *
+ *  優先度が16段階であることを仮定しているため,uint16_t型としている.
+ */
+extern uint16_t        ready_primap;
+
+/*
+ *  使用していないTCBのリスト
+ */
+extern QUEUE   free_tcb;
+
+/*
+ *  タスクIDの最大値(kernel_cfg.c)
+ */
+extern const ID        tmax_tskid;
+extern const ID        tmax_stskid;
+
+/*
+ *  タスク初期化ブロックのエリア(kernel_cfg.c)
+ */
+extern const TINIB     tinib_table[];
+extern TINIB           atinib_table[];
+
+/*
+ *  タスク生成順序テーブル(kernel_cfg.c)
+ */
+extern const ID        torder_table[];
+
+/*
+ *  TCBのエリア(kernel_cfg.c)
+ */
+extern TCB     tcb_table[];
+
+/*
+ *  タスクの数
+ */
+#define tnum_tsk       ((uint_t)(tmax_tskid - TMIN_TSKID + 1))
+#define tnum_stsk      ((uint_t)(tmax_stskid - TMIN_TSKID + 1))
+
+/*
+ *  タスクIDからTCBを取り出すためのマクロ
+ */
+#define INDEX_TSK(tskid)       ((uint_t)((tskid) - TMIN_TSKID))
+#define get_tcb(tskid)         (&(tcb_table[INDEX_TSK(tskid)]))
+#define get_tcb_self(tskid)    ((tskid) == TSK_SELF ? p_runtsk : get_tcb(tskid))
+
+/*
+ *  TCBからタスクIDを取り出すためのマクロ
+ */
+#define        TSKID(p_tcb)    ((ID)(((p_tcb) - tcb_table) + TMIN_TSKID))
+
+/*
+ *  タスク管理モジュールの初期化
+ */
+extern void    initialize_task(void);
+
+/*
+ *  最高優先順位タスクのサーチ
+ *
+ *  レディキュー中の最高優先順位のタスクをサーチし,そのTCBへのポインタ
+ *  を返す.レディキューが空の場合には,この関数を呼び出してはならない.
+ */
+extern TCB     *search_schedtsk(void);
+
+/*
+ *  実行できる状態への遷移
+ *
+ *  p_tcbで指定されるタスクをレディキューに挿入する.レディキューに挿入
+ *  したタスクの優先度が,最高優先順位のタスクの優先度よりも高い場合は,
+ *  最高優先順位のタスクを更新し,ディスパッチ許可状態であればtrueを返
+ *  す.そうでない場合はfalseを返す.
+ */
+extern bool_t  make_runnable(TCB *p_tcb);
+
+/*
+ *  実行できる状態から他の状態への遷移
+ *
+ *  p_tcbで指定されるタスクをレディキューから削除する.p_tcbで指定した
+ *  タスクが最高優先順位のタスクであった場合には,最高優先順位のタスク
+ *  を設定しなおし,ディスパッチ許可状態であればtrueを返す.そうでない
+ *  場合はfalseを返す.タスクの状態は更新しない.
+ */
+extern bool_t  make_non_runnable(TCB *p_tcb);
+
+/*
+ *  休止状態への遷移
+ *
+ *  p_tcbで指定されるタスクの状態を休止状態とする.また,タスクの起動
+ *  時に初期化すべき変数の初期化と,タスク起動のためのコンテキストを設
+ *  定する.
+ */
+extern void    make_dormant(TCB *p_tcb);
+
+/*
+ *  休止状態から実行できる状態への遷移
+ *
+ *  p_tcbで指定されるタスクの状態を休止状態から実行できる状態とする.
+ *  実行できる状態に遷移したタスクへのディスパッチが必要な場合はtrue,
+ *  そうでない場合はfalseを返す.
+ */
+extern bool_t  make_active(TCB *p_tcb);
+
+/*
+ *  タスクの優先度の変更
+ *
+ *  p_tcbで指定されるタスクの優先度をnewpri(内部表現)に変更する.また,
+ *  必要な場合には最高優先順位のタスクを更新し,ディスパッチ許可状態で
+ *  あればtrueを返す.そうでない場合はfalseを返す.
+ */
+extern bool_t  change_priority(TCB *p_tcb, uint_t newpri);
+
+/*
+ *  レディキューの回転
+ *
+ *  レディキュー中の,priで指定される優先度のタスクキューを回転させる.
+ *  また,必要な場合には最高優先順位のタスクを変更し,ディスパッチが保
+ *  留されていなければtrueを返す.そうでない場合はfalseを返す.
+ */
+extern bool_t  rotate_ready_queue(uint_t pri);
+
+/*
+ *  タスク例外処理ルーチンの呼出し
+ *
+ *  タスク例外処理ルーチンを呼び出す.呼び出す前に,実行状態のタスクの
+ *  保留例外要因をクリアし,タスク例外処理禁止状態にし,CPUロックを解
+ *  除する.
+ *
+ *  タスク例外処理ルーチンから戻ると,まずCPUロック状態に戻し,その間
+ *  に保留例外要因が0でなくなっていれば,再びタスク例外処理ルーチンを
+ *  呼び出す.保留例外要因が0の場合には,例外処理許可状態にして関数か
+ *  らリターンする.
+ *
+ *  この関数は,実行状態のタスクが,タスク例外処理許可状態(enatexが
+ *  true)で,保留例外要因が0でない(texptnが0でない)場合に呼び出すこ
+ *  とを想定している.この関数は,CPUロック状態で呼び出さなければなら
+ *  ない.
+ */
+extern void    call_texrtn(void);
+
+/*
+ *  タスク例外処理ルーチンの起動
+ *
+ *  実行状態のタスクがタスク例外処理ルーチンの起動条件を満たしていれば,
+ *  タスク例外処理ルーチンを呼び出す.CPU例外処理ルーチンを呼び出す時
+ *  は,一時的にCPUロックを解除する.
+ *
+ *  この関数は,ディスパッチャや割込みハンドラ/CPU例外ハンドラの出口
+ *  処理から呼び出されることを想定している.この関数は,CPUロック状態
+ *  で呼び出さなければならない.
+ *
+ *  実行効率を上げるために,この関数をターゲット依存部で記述してもよい.
+ *  その場合には,OMIT_CALLTEXをマクロ定義する.
+ */
+extern void    calltex(void);
+
+#endif /* TOPPERS_TASK_H */
diff --git a/asp/extension/dcre/kernel/task_except.c b/asp/extension/dcre/kernel/task_except.c
new file mode 100644 (file)
index 0000000..afe8873
--- /dev/null
@@ -0,0 +1,363 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2011 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  $Id: task_except.c 2023 2011-01-02 08:59:06Z ertl-hiro $
+ */
+
+/*
+ *             タスク例外処理機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+
+/*
+ *  トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_DEF_TEX_ENTER
+#define LOG_DEF_TEX_ENTER(tskid, pk_dtex)
+#endif /* LOG_DEF_TEX_ENTER */
+
+#ifndef LOG_DEF_TEX_LEAVE
+#define LOG_DEF_TEX_LEAVE(ercd)
+#endif /* LOG_DEF_TEX_LEAVE */
+
+#ifndef LOG_RAS_TEX_ENTER
+#define LOG_RAS_TEX_ENTER(tskid, rasptn)
+#endif /* LOG_RAS_TEX_ENTER */
+
+#ifndef LOG_RAS_TEX_LEAVE
+#define LOG_RAS_TEX_LEAVE(ercd)
+#endif /* LOG_RAS_TEX_LEAVE */
+
+#ifndef LOG_IRAS_TEX_ENTER
+#define LOG_IRAS_TEX_ENTER(tskid, rasptn)
+#endif /* LOG_IRAS_TEX_ENTER */
+
+#ifndef LOG_IRAS_TEX_LEAVE
+#define LOG_IRAS_TEX_LEAVE(ercd)
+#endif /* LOG_IRAS_TEX_LEAVE */
+
+#ifndef LOG_DIS_TEX_ENTER
+#define LOG_DIS_TEX_ENTER()
+#endif /* LOG_DIS_TEX_ENTER */
+
+#ifndef LOG_DIS_TEX_LEAVE
+#define LOG_DIS_TEX_LEAVE(ercd)
+#endif /* LOG_DIS_TEX_LEAVE */
+
+#ifndef LOG_ENA_TEX_ENTER
+#define LOG_ENA_TEX_ENTER()
+#endif /* LOG_ENA_TEX_ENTER */
+
+#ifndef LOG_ENA_TEX_LEAVE
+#define LOG_ENA_TEX_LEAVE(ercd)
+#endif /* LOG_ENA_TEX_LEAVE */
+
+#ifndef LOG_SNS_TEX_ENTER
+#define LOG_SNS_TEX_ENTER()
+#endif /* LOG_SNS_TEX_ENTER */
+
+#ifndef LOG_SNS_TEX_LEAVE
+#define LOG_SNS_TEX_LEAVE(state)
+#endif /* LOG_SNS_TEX_LEAVE */
+
+#ifndef LOG_REF_TEX_ENTER
+#define LOG_REF_TEX_ENTER(tskid, pk_rtex)
+#endif /* LOG_REF_TEX_ENTER */
+
+#ifndef LOG_REF_TEX_LEAVE
+#define LOG_REF_TEX_LEAVE(ercd, pk_rtex)
+#endif /* LOG_REF_TEX_LEAVE */
+
+/*
+ *  タスク例外処理ルーチンの定義
+ */
+#ifdef TOPPERS_def_tex
+
+ER_UINT
+def_tex(ID tskid, const T_DTEX *pk_dtex)
+{
+       TCB             *p_tcb;
+       TINIB   *p_tinib;
+       ER              ercd;
+
+       LOG_DEF_TEX_ENTER(tskid, pk_dtex);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID_SELF(tskid);
+       CHECK_RSATR(pk_dtex->texatr, TA_NULL);
+       if (pk_dtex->texrtn != NULL) {
+               CHECK_ALIGN_FUNC(pk_dtex->texrtn);
+               CHECK_NONNULL_FUNC(pk_dtex->texrtn);
+       }
+       p_tcb = get_tcb_self(tskid);
+       p_tinib = (TINIB *)(p_tcb->p_tinib);
+
+       t_lock_cpu();
+       if (TSKID(p_tcb) <= tmax_stskid) {
+               ercd = E_OBJ;
+       }
+       else if (pk_dtex->texrtn != NULL) {
+               if (p_tinib->texrtn != NULL) {
+                       ercd = E_OBJ;
+               }
+               else {
+                       p_tinib->texatr = pk_dtex->texatr;
+                       p_tinib->texrtn = pk_dtex->texrtn;
+                       ercd = E_OK;
+               }
+       }
+       else {
+               if (p_tinib->texrtn != NULL) {
+                       p_tinib->texrtn = NULL;
+                       p_tcb->enatex = false;
+                       p_tcb->texptn = 0U;
+                       ercd = E_OK;
+               }
+               else {
+                       ercd = E_OBJ;
+               }
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_DEF_TEX_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_def_tex */
+
+/*
+ *  タスク例外処理の要求
+ */
+#ifdef TOPPERS_ras_tex
+
+ER
+ras_tex(ID tskid, TEXPTN rasptn)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_RAS_TEX_ENTER(tskid, rasptn);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID_SELF(tskid);
+       CHECK_PAR(rasptn != 0U);
+       p_tcb = get_tcb_self(tskid);
+
+       t_lock_cpu();
+       if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (TSTAT_DORMANT(p_tcb->tstat) || p_tcb->p_tinib->texrtn == NULL) {
+               ercd = E_OBJ;
+       }
+       else {
+               p_tcb->texptn |= rasptn;
+               if (p_tcb == p_runtsk && p_runtsk->enatex && ipmflg) {
+                       call_texrtn();
+               }
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_RAS_TEX_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ras_tex */
+
+/*
+ *  タスク例外処理の要求(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_iras_tex
+
+ER
+iras_tex(ID tskid, TEXPTN rasptn)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_IRAS_TEX_ENTER(tskid, rasptn);
+       CHECK_INTCTX_UNL();
+       CHECK_TSKID(tskid);
+       CHECK_PAR(rasptn != 0U);
+       p_tcb = get_tcb(tskid);
+
+       i_lock_cpu();
+       if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (TSTAT_DORMANT(p_tcb->tstat) || p_tcb->p_tinib->texrtn == NULL) {
+               ercd = E_OBJ;
+       }
+       else {
+               p_tcb->texptn |= rasptn;
+               if (p_tcb == p_runtsk && p_runtsk->enatex && ipmflg) {
+                       reqflg = true;
+               }
+               ercd = E_OK;
+       }
+       i_unlock_cpu();
+
+  error_exit:
+       LOG_IRAS_TEX_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_iras_tex */
+
+/*
+ *  タスク例外処理の禁止
+ */
+#ifdef TOPPERS_dis_tex
+
+ER
+dis_tex(void)
+{
+       ER              ercd;
+
+       LOG_DIS_TEX_ENTER();
+       CHECK_TSKCTX_UNL();
+
+       t_lock_cpu();
+       if (p_runtsk->p_tinib->texrtn == NULL) {
+               ercd = E_OBJ;
+       }
+       else {
+               p_runtsk->enatex = false;
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_DIS_TEX_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_dis_tex */
+
+/*
+ *  タスク例外処理の許可
+ */
+#ifdef TOPPERS_ena_tex
+
+ER
+ena_tex(void)
+{
+       ER              ercd;
+
+       LOG_ENA_TEX_ENTER();
+       CHECK_TSKCTX_UNL();
+
+       t_lock_cpu();
+       if (p_runtsk->p_tinib->texrtn == NULL) {
+               ercd = E_OBJ;
+       }
+       else {
+               p_runtsk->enatex = true;
+               if (p_runtsk->texptn != 0U && ipmflg) {
+                       call_texrtn();
+               }
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_ENA_TEX_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ena_tex */
+
+/*
+ *  タスク例外処理禁止状態の参照
+ */
+#ifdef TOPPERS_sns_tex
+
+bool_t
+sns_tex(void)
+{
+       bool_t  state;
+
+       LOG_SNS_TEX_ENTER();
+       state = (p_runtsk != NULL && p_runtsk->enatex) ? false : true;
+       LOG_SNS_TEX_LEAVE(state);
+       return(state);
+}
+
+#endif /* TOPPERS_sns_tex */
+
+/*
+ *  タスク例外処理の状態参照
+ */
+#ifdef TOPPERS_ref_tex
+
+ER
+ref_tex(ID tskid, T_RTEX *pk_rtex)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_REF_TEX_ENTER(tskid, pk_rtex);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID_SELF(tskid);
+       p_tcb = get_tcb_self(tskid);
+
+       t_lock_cpu();
+       if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (TSTAT_DORMANT(p_tcb->tstat) || p_tcb->p_tinib->texrtn == NULL) {
+               ercd = E_OBJ;
+       }
+       else {
+               pk_rtex->texstat = (p_tcb->enatex) ? TTEX_ENA : TTEX_DIS;
+               pk_rtex->pndptn = p_tcb->texptn;
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_REF_TEX_LEAVE(ercd, pk_rtex);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ref_tex */
diff --git a/asp/extension/dcre/kernel/task_manage.c b/asp/extension/dcre/kernel/task_manage.c
new file mode 100644 (file)
index 0000000..853b26c
--- /dev/null
@@ -0,0 +1,582 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: task_manage.c 2018 2010-12-31 13:43:05Z ertl-hiro $
+ */
+
+/*
+ *             タスク管理機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "wait.h"
+
+/*
+ *  トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_ACRE_TSK_ENTER
+#define LOG_ACRE_TSK_ENTER(pk_ctsk)
+#endif /* LOG_ACRE_TSK_ENTER */
+
+#ifndef LOG_ACRE_TSK_LEAVE
+#define LOG_ACRE_TSK_LEAVE(ercd)
+#endif /* LOG_ACRE_TSK_LEAVE */
+
+#ifndef LOG_DEL_TSK_ENTER
+#define LOG_DEL_TSK_ENTER(tskid)
+#endif /* LOG_DEL_TSK_ENTER */
+
+#ifndef LOG_DEL_TSK_LEAVE
+#define LOG_DEL_TSK_LEAVE(ercd)
+#endif /* LOG_DEL_TSK_LEAVE */
+
+#ifndef LOG_ACT_TSK_ENTER
+#define LOG_ACT_TSK_ENTER(tskid)
+#endif /* LOG_ACT_TSK_ENTER */
+
+#ifndef LOG_ACT_TSK_LEAVE
+#define LOG_ACT_TSK_LEAVE(ercd)
+#endif /* LOG_ACT_TSK_LEAVE */
+
+#ifndef LOG_IACT_TSK_ENTER
+#define LOG_IACT_TSK_ENTER(tskid)
+#endif /* LOG_IACT_TSK_ENTER */
+
+#ifndef LOG_IACT_TSK_LEAVE
+#define LOG_IACT_TSK_LEAVE(ercd)
+#endif /* LOG_IACT_TSK_LEAVE */
+
+#ifndef LOG_CAN_ACT_ENTER
+#define LOG_CAN_ACT_ENTER(tskid)
+#endif /* LOG_CAN_ACT_ENTER */
+
+#ifndef LOG_CAN_ACT_LEAVE
+#define LOG_CAN_ACT_LEAVE(ercd)
+#endif /* LOG_CAN_ACT_LEAVE */
+
+#ifndef LOG_EXT_TSK_ENTER
+#define LOG_EXT_TSK_ENTER()
+#endif /* LOG_EXT_TSK_ENTER */
+
+#ifndef LOG_EXT_TSK_LEAVE
+#define LOG_EXT_TSK_LEAVE(ercd)
+#endif /* LOG_EXT_TSK_LEAVE */
+
+#ifndef LOG_TER_TSK_ENTER
+#define LOG_TER_TSK_ENTER(tskid)
+#endif /* LOG_TER_TSK_ENTER */
+
+#ifndef LOG_TER_TSK_LEAVE
+#define LOG_TER_TSK_LEAVE(ercd)
+#endif /* LOG_TER_TSK_LEAVE */
+
+#ifndef LOG_CHG_PRI_ENTER
+#define LOG_CHG_PRI_ENTER(tskid, tskpri)
+#endif /* LOG_CHG_PRI_ENTER */
+
+#ifndef LOG_CHG_PRI_LEAVE
+#define LOG_CHG_PRI_LEAVE(ercd)
+#endif /* LOG_CHG_PRI_LEAVE */
+
+#ifndef LOG_GET_PRI_ENTER
+#define LOG_GET_PRI_ENTER(tskid, p_tskpri)
+#endif /* LOG_GET_PRI_ENTER */
+
+#ifndef LOG_GET_PRI_LEAVE
+#define LOG_GET_PRI_LEAVE(ercd, tskpri)
+#endif /* LOG_GET_PRI_LEAVE */
+
+#ifndef LOG_GET_INF_ENTER
+#define LOG_GET_INF_ENTER(p_exinf)
+#endif /* LOG_GET_INF_ENTER */
+
+#ifndef LOG_GET_INF_LEAVE
+#define LOG_GET_INF_LEAVE(ercd, exinf)
+#endif /* LOG_GET_INF_LEAVE */
+
+/*
+ *  タスクの生成
+ */
+#ifdef TOPPERS_acre_tsk
+
+ER_UINT
+acre_tsk(const T_CTSK *pk_ctsk)
+{
+       TCB             *p_tcb;
+       TINIB   *p_tinib;
+       ATR             tskatr;
+       STK_T   *stk;
+       ER              ercd;
+
+       LOG_ACRE_TSK_ENTER(pk_ctsk);
+       CHECK_TSKCTX_UNL();
+       CHECK_RSATR(pk_ctsk->tskatr, TA_ACT|TARGET_TSKATR);
+       CHECK_ALIGN_FUNC(pk_ctsk->task);
+       CHECK_NONNULL_FUNC(pk_ctsk->task);
+       CHECK_TPRI(pk_ctsk->itskpri);
+       CHECK_STKSZ_MIN(pk_ctsk->stksz);
+       CHECK_ALIGN_STKSZ(pk_ctsk->stksz);
+       CHECK_ALIGN_STACK(pk_ctsk->stk);
+       tskatr = pk_ctsk->tskatr;
+       stk = pk_ctsk->stk;
+
+       t_lock_cpu();
+       if (queue_empty(&free_tcb)) {
+               ercd = E_NOID;
+       }
+       else {
+               if (stk == NULL) {
+                       stk = kernel_malloc(pk_ctsk->stksz);
+                       tskatr |= TA_MEMALLOC;
+               }
+               if (stk == NULL) {
+                       ercd = E_NOMEM;
+               }
+               else {
+                       p_tcb = ((TCB *) queue_delete_next(&free_tcb));
+                       p_tinib = (TINIB *)(p_tcb->p_tinib);
+                       p_tinib->tskatr = tskatr;
+                       p_tinib->exinf = pk_ctsk->exinf;
+                       p_tinib->task = pk_ctsk->task;
+                       p_tinib->ipriority = INT_PRIORITY(pk_ctsk->itskpri);
+#ifdef USE_TSKINICTXB
+                       init_tskinictxb(&(p_tinib->tskinictxb), stk, pk_ctsk);
+#else /* USE_TSKINICTXB */
+                       p_tinib->stksz = pk_ctsk->stksz;
+                       p_tinib->stk = stk;
+#endif /* USE_TSKINICTXB */
+                       p_tinib->texatr = TA_NULL;
+                       p_tinib->texrtn = NULL;
+
+                       p_tcb->actque = false;
+                       make_dormant(p_tcb);
+                       if ((p_tcb->p_tinib->tskatr & TA_ACT) != 0U) {
+                               make_active(p_tcb);
+                       }
+                       ercd = TSKID(p_tcb);
+               }
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_ACRE_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_acre_tsk */
+
+/*
+ *  タスクの削除
+ */
+#ifdef TOPPERS_del_tsk
+
+ER
+del_tsk(ID tskid)
+{
+       TCB             *p_tcb;
+       TINIB   *p_tinib;
+       ER              ercd;
+
+       LOG_DEL_TSK_ENTER(tskid);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID(tskid);
+       p_tcb = get_tcb(tskid);
+
+       t_lock_cpu();
+       if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (TSKID(p_tcb) > tmax_stskid && TSTAT_DORMANT(p_tcb->tstat)) {
+               p_tinib = (TINIB *)(p_tcb->p_tinib);
+#ifdef USE_TSKINICTXB
+               term_tskinictxb(&(p_tinib->tskinictxb));
+#else /* USE_TSKINICTXB */
+               if ((p_tinib->tskatr & TA_MEMALLOC) != 0U) {
+                       kernel_free(p_tinib->stk);
+               }
+#endif /* USE_TSKINICTXB */
+               p_tinib->tskatr = TA_NOEXS;
+               queue_insert_prev(&free_tcb, &(p_tcb->task_queue));
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_OBJ;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_DEL_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_del_tsk */
+
+/*
+ *  タスクの起動
+ */
+#ifdef TOPPERS_act_tsk
+
+ER
+act_tsk(ID tskid)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_ACT_TSK_ENTER(tskid);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID_SELF(tskid);
+       p_tcb = get_tcb_self(tskid);
+
+       t_lock_cpu();
+       if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (TSTAT_DORMANT(p_tcb->tstat)) {
+               if (make_active(p_tcb)) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else if (!(p_tcb->actque)) {
+               p_tcb->actque = true;
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_QOVR;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_ACT_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_act_tsk */
+
+/*
+ *  タスクの起動(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_iact_tsk
+
+ER
+iact_tsk(ID tskid)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_IACT_TSK_ENTER(tskid);
+       CHECK_INTCTX_UNL();
+       CHECK_TSKID(tskid);
+       p_tcb = get_tcb(tskid);
+
+       i_lock_cpu();
+       if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (TSTAT_DORMANT(p_tcb->tstat)) {
+               if (make_active(p_tcb)) {
+                       reqflg = true;
+               }
+               ercd = E_OK;
+       }
+       else if (!(p_tcb->actque)) {
+               p_tcb->actque = true;
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_QOVR;
+       }
+       i_unlock_cpu();
+
+  error_exit:
+       LOG_IACT_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_iact_tsk */
+
+/*
+ *  タスク起動要求のキャンセル
+ */
+#ifdef TOPPERS_can_act
+
+ER_UINT
+can_act(ID tskid)
+{
+       TCB             *p_tcb;
+       ER_UINT ercd;
+
+       LOG_CAN_ACT_ENTER(tskid);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID_SELF(tskid);
+       p_tcb = get_tcb_self(tskid);
+
+       t_lock_cpu();
+       if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else {
+               ercd = p_tcb->actque ? 1 : 0;
+       }
+       p_tcb->actque = false;
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_CAN_ACT_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_can_act */
+
+/*
+ *  自タスクの終了
+ */
+#ifdef TOPPERS_ext_tsk
+
+ER
+ext_tsk(void)
+{
+       ER              ercd;
+
+       LOG_EXT_TSK_ENTER();
+       CHECK_TSKCTX();
+
+       if (t_sense_lock()) {
+               /*
+                *  CPUロック状態でext_tskが呼ばれた場合は,CPUロックを解除し
+                *  てからタスクを終了する.実装上は,サービスコール内でのCPU
+                *  ロックを省略すればよいだけ.
+                */
+       }
+       else {
+               t_lock_cpu();
+       }
+       if (disdsp) {
+               /*
+                *  ディスパッチ禁止状態でext_tskが呼ばれた場合は,ディスパッ
+                *  チ許可状態にしてからタスクを終了する.
+                */
+               disdsp = false;
+       }
+       if (!ipmflg) {
+               /*
+                *  割込み優先度マスク(IPM)がTIPM_ENAALL以外の状態でext_tsk
+                *  が呼ばれた場合は,IPMをTIPM_ENAALLにしてからタスクを終了す
+                *  る.
+                */
+               t_set_ipm(TIPM_ENAALL);
+               ipmflg = true;
+       }
+       dspflg = true;
+
+       (void) make_non_runnable(p_runtsk);
+       make_dormant(p_runtsk);
+       if (p_runtsk->actque) {
+               p_runtsk->actque = false;
+               (void) make_active(p_runtsk);
+       }
+       exit_and_dispatch();
+       ercd = E_SYS;
+
+  error_exit:
+       LOG_EXT_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ext_tsk */
+
+/*
+ *  タスクの強制終了
+ */
+#ifdef TOPPERS_ter_tsk
+
+ER
+ter_tsk(ID tskid)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_TER_TSK_ENTER(tskid);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID(tskid);
+       p_tcb = get_tcb(tskid);
+       CHECK_NONSELF(p_tcb);
+
+       t_lock_cpu();
+       if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (TSTAT_DORMANT(p_tcb->tstat)) {
+               ercd = E_OBJ;
+       }
+       else {
+               if (TSTAT_RUNNABLE(p_tcb->tstat)) {
+                       /*
+                        *  p_tcbは自タスクでないため,(シングルプロセッサでは)実
+                        *  行状態でなく,make_non_runnable(p_tcb)でタスクディスパッ
+                        *  チが必要になることはない.
+                        */
+                       (void) make_non_runnable(p_tcb);
+               }
+               else if (TSTAT_WAITING(p_tcb->tstat)) {
+                       wait_dequeue_wobj(p_tcb);
+                       wait_dequeue_tmevtb(p_tcb);
+               }
+               make_dormant(p_tcb);
+               if (p_tcb->actque) {
+                       p_tcb->actque = false;
+                       if (make_active(p_tcb)) {
+                               dispatch();
+                       }
+               }
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_TER_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ter_tsk */
+
+/*
+ *  タスクのベース優先度の変更
+ */
+#ifdef TOPPERS_chg_pri
+
+ER
+chg_pri(ID tskid, PRI tskpri)
+{
+       TCB             *p_tcb;
+       uint_t  newpri;
+       ER              ercd;
+
+       LOG_CHG_PRI_ENTER(tskid, tskpri);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID_SELF(tskid);
+       CHECK_TPRI_INI(tskpri);
+       p_tcb = get_tcb_self(tskid);
+       newpri = (tskpri == TPRI_INI) ? p_tcb->p_tinib->ipriority
+                                                                               : INT_PRIORITY(tskpri);
+
+       t_lock_cpu();
+       if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (TSTAT_DORMANT(p_tcb->tstat)) {
+               ercd = E_OBJ;
+       }
+       else {
+               if (change_priority(p_tcb, newpri)) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_CHG_PRI_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_chg_pri */
+
+/*
+ *  タスク優先度の参照
+ */
+#ifdef TOPPERS_get_pri
+
+ER
+get_pri(ID tskid, PRI *p_tskpri)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_GET_PRI_ENTER(tskid, p_tskpri);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID_SELF(tskid);
+       p_tcb = get_tcb_self(tskid);
+
+       t_lock_cpu();
+       if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (TSTAT_DORMANT(p_tcb->tstat)) {
+               ercd = E_OBJ;
+       }
+       else {
+               *p_tskpri = EXT_TSKPRI(p_tcb->priority);
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_GET_PRI_LEAVE(ercd, *p_tskpri);
+       return(ercd);
+}
+
+#endif /* TOPPERS_get_pri */
+
+/*
+ *  自タスクの拡張情報の参照
+ */
+#ifdef TOPPERS_get_inf
+
+ER
+get_inf(intptr_t *p_exinf)
+{
+       ER              ercd;
+
+       LOG_GET_INF_ENTER(p_exinf);
+       CHECK_TSKCTX_UNL();
+
+       t_lock_cpu();
+       *p_exinf = p_runtsk->p_tinib->exinf;
+       ercd = E_OK;
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_GET_INF_LEAVE(ercd, *p_exinf);
+       return(ercd);
+}
+
+#endif /* TOPPERS_get_inf */
diff --git a/asp/extension/dcre/kernel/task_refer.c b/asp/extension/dcre/kernel/task_refer.c
new file mode 100644 (file)
index 0000000..31c0456
--- /dev/null
@@ -0,0 +1,209 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: task_refer.c 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ *             タスクの状態参照機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "wait.h"
+#include "semaphore.h"
+#include "eventflag.h"
+#include "dataqueue.h"
+#include "pridataq.h"
+#include "mailbox.h"
+#include "mempfix.h"
+#include "time_event.h"
+
+/*
+ *  トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_REF_TSK_ENTER
+#define LOG_REF_TSK_ENTER(tskid, pk_rtsk)
+#endif /* LOG_REF_TSK_ENTER */
+
+#ifndef LOG_REF_TSK_LEAVE
+#define LOG_REF_TSK_LEAVE(ercd, pk_rtsk)
+#endif /* LOG_REF_TSK_LEAVE */
+
+/*
+ *  タスクの状態参照
+ */
+#ifdef TOPPERS_ref_tsk
+
+ER
+ref_tsk(ID tskid, T_RTSK *pk_rtsk)
+{
+       TCB             *p_tcb;
+       uint_t  tstat;
+       ER              ercd;
+
+       LOG_REF_TSK_ENTER(tskid, pk_rtsk);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID_SELF(tskid);
+       p_tcb = get_tcb_self(tskid);
+
+       t_lock_cpu();
+       tstat = p_tcb->tstat;
+       if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else {
+               if (TSTAT_DORMANT(tstat)) {
+                       /*
+                        *  対象タスクが休止状態の場合
+                        */
+                       pk_rtsk->tskstat = TTS_DMT;
+               }
+               else {
+                       /*
+                        *  タスク状態の取出し
+                        */
+                       if (TSTAT_SUSPENDED(tstat)) {
+                               if (TSTAT_WAITING(tstat)) {
+                                       pk_rtsk->tskstat = TTS_WAS;
+                               }
+                               else {
+                                       pk_rtsk->tskstat = TTS_SUS;
+                               }
+                       }
+                       else if (TSTAT_WAITING(tstat)) {
+                               pk_rtsk->tskstat = TTS_WAI;
+                       }
+                       else if (p_tcb == p_runtsk) {
+                               pk_rtsk->tskstat = TTS_RUN;
+                       }
+                       else {
+                               pk_rtsk->tskstat = TTS_RDY;
+                       }
+
+                       /*
+                        *  現在優先度とベース優先度の取出し
+                        */
+                       pk_rtsk->tskpri = EXT_TSKPRI(p_tcb->priority);
+                       pk_rtsk->tskbpri = EXT_TSKPRI(p_tcb->priority);
+
+                       if (TSTAT_WAITING(tstat)) {
+                               /*
+                                *  待ち要因と待ち対象のオブジェクトのIDの取出し
+                                */
+                               switch (tstat & TS_WAIT_MASK) {
+                               case TS_WAIT_SLP:
+                                       pk_rtsk->tskwait = TTW_SLP;
+                                       break;
+                               case TS_WAIT_DLY:
+                                       pk_rtsk->tskwait = TTW_DLY;
+                                       break;
+                               case TS_WAIT_SEM:
+                                       pk_rtsk->tskwait = TTW_SEM;
+                                       pk_rtsk->wobjid = SEMID(((WINFO_SEM *)(p_tcb->p_winfo))
+                                                                                                                               ->p_semcb);
+                                       break;
+                               case TS_WAIT_FLG:
+                                       pk_rtsk->tskwait = TTW_FLG;
+                                       pk_rtsk->wobjid = FLGID(((WINFO_FLG *)(p_tcb->p_winfo))
+                                                                                                                               ->p_flgcb);
+                                       break;
+                               case TS_WAIT_SDTQ:
+                                       pk_rtsk->tskwait = TTW_SDTQ;
+                                       pk_rtsk->wobjid = DTQID(((WINFO_DTQ *)(p_tcb->p_winfo))
+                                                                                                                               ->p_dtqcb);
+                                       break;
+                               case TS_WAIT_RDTQ:
+                                       pk_rtsk->tskwait = TTW_RDTQ;
+                                       pk_rtsk->wobjid = DTQID(((WINFO_DTQ *)(p_tcb->p_winfo))
+                                                                                                                               ->p_dtqcb);
+                                       break;
+                               case TS_WAIT_SPDQ:
+                                       pk_rtsk->tskwait = TTW_SPDQ;
+                                       pk_rtsk->wobjid = PDQID(((WINFO_PDQ *)(p_tcb->p_winfo))
+                                                                                                                               ->p_pdqcb);
+                                       break;
+                               case TS_WAIT_RPDQ:
+                                       pk_rtsk->tskwait = TTW_RPDQ;
+                                       pk_rtsk->wobjid = PDQID(((WINFO_PDQ *)(p_tcb->p_winfo))
+                                                                                                                               ->p_pdqcb);
+                                       break;
+                               case TS_WAIT_MBX:
+                                       pk_rtsk->tskwait = TTW_MBX;
+                                       pk_rtsk->wobjid = MBXID(((WINFO_MBX *)(p_tcb->p_winfo))
+                                                                                                                               ->p_mbxcb);
+                                       break;
+                               case TS_WAIT_MPF:
+                                       pk_rtsk->tskwait = TTW_MPF;
+                                       pk_rtsk->wobjid = MPFID(((WINFO_MPF *)(p_tcb->p_winfo))
+                                                                                                                               ->p_mpfcb);
+                                       break;
+                               }
+
+                               /*
+                                *  タイムアウトするまでの時間の取出し
+                                */
+                               if (p_tcb->p_winfo->p_tmevtb != NULL) {
+                                       pk_rtsk->lefttmo
+                                                       = (TMO) tmevt_lefttim(p_tcb->p_winfo->p_tmevtb);
+                               }
+                               else {
+                                       pk_rtsk->lefttmo = TMO_FEVR;
+                               }
+                       }
+
+                       /*
+                        *  起床要求キューイング数の取出し
+                        */
+                       pk_rtsk->wupcnt = p_tcb->wupque ? 1U : 0U;
+               }
+
+               /*
+                *  起動要求キューイング数の取出し
+                */
+               pk_rtsk->actcnt = p_tcb->actque ? 1U : 0U;
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_REF_TSK_LEAVE(ercd, pk_rtsk);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ref_tsk */
diff --git a/asp/extension/dcre/kernel/task_sync.c b/asp/extension/dcre/kernel/task_sync.c
new file mode 100644 (file)
index 0000000..95af4d8
--- /dev/null
@@ -0,0 +1,552 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: task_sync.c 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ *             タスク付属同期機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "wait.h"
+
+/*
+ *  トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_SLP_TSK_ENTER
+#define LOG_SLP_TSK_ENTER()
+#endif /* LOG_SLP_TSK_ENTER */
+
+#ifndef LOG_SLP_TSK_LEAVE
+#define LOG_SLP_TSK_LEAVE(ercd)
+#endif /* LOG_SLP_TSK_LEAVE */
+
+#ifndef LOG_TSLP_TSK_ENTER
+#define LOG_TSLP_TSK_ENTER(tmout)
+#endif /* LOG_TSLP_TSK_ENTER */
+
+#ifndef LOG_TSLP_TSK_LEAVE
+#define LOG_TSLP_TSK_LEAVE(ercd)
+#endif /* LOG_TSLP_TSK_LEAVE */
+
+#ifndef LOG_WUP_TSK_ENTER
+#define LOG_WUP_TSK_ENTER(tskid)
+#endif /* LOG_WUP_TSK_ENTER */
+
+#ifndef LOG_WUP_TSK_LEAVE
+#define LOG_WUP_TSK_LEAVE(ercd)
+#endif /* LOG_WUP_TSK_LEAVE */
+
+#ifndef LOG_IWUP_TSK_ENTER
+#define LOG_IWUP_TSK_ENTER(tskid)
+#endif /* LOG_IWUP_TSK_ENTER */
+
+#ifndef LOG_IWUP_TSK_LEAVE
+#define LOG_IWUP_TSK_LEAVE(ercd)
+#endif /* LOG_IWUP_TSK_LEAVE */
+
+#ifndef LOG_CAN_WUP_ENTER
+#define LOG_CAN_WUP_ENTER(tskid)
+#endif /* LOG_CAN_WUP_ENTER */
+
+#ifndef LOG_CAN_WUP_LEAVE
+#define LOG_CAN_WUP_LEAVE(ercd)
+#endif /* LOG_CAN_WUP_LEAVE */
+
+#ifndef LOG_REL_WAI_ENTER
+#define LOG_REL_WAI_ENTER(tskid)
+#endif /* LOG_REL_WAI_ENTER */
+
+#ifndef LOG_REL_WAI_LEAVE
+#define LOG_REL_WAI_LEAVE(ercd)
+#endif /* LOG_REL_WAI_LEAVE */
+
+#ifndef LOG_IREL_WAI_ENTER
+#define LOG_IREL_WAI_ENTER(tskid)
+#endif /* LOG_IREL_WAI_ENTER */
+
+#ifndef LOG_IREL_WAI_LEAVE
+#define LOG_IREL_WAI_LEAVE(ercd)
+#endif /* LOG_IREL_WAI_LEAVE */
+
+#ifndef LOG_SUS_TSK_ENTER
+#define LOG_SUS_TSK_ENTER(tskid)
+#endif /* LOG_SUS_TSK_ENTER */
+
+#ifndef LOG_SUS_TSK_LEAVE
+#define LOG_SUS_TSK_LEAVE(ercd)
+#endif /* LOG_SUS_TSK_LEAVE */
+
+#ifndef LOG_RSM_TSK_ENTER
+#define LOG_RSM_TSK_ENTER(tskid)
+#endif /* LOG_RSM_TSK_ENTER */
+
+#ifndef LOG_RSM_TSK_LEAVE
+#define LOG_RSM_TSK_LEAVE(ercd)
+#endif /* LOG_RSM_TSK_LEAVE */
+
+#ifndef LOG_DLY_TSK_ENTER
+#define LOG_DLY_TSK_ENTER(dlytim)
+#endif /* LOG_DLY_TSK_ENTER */
+
+#ifndef LOG_DLY_TSK_LEAVE
+#define LOG_DLY_TSK_LEAVE(ercd)
+#endif /* LOG_DLY_TSK_LEAVE */
+
+/*
+ *  起床待ち
+ */
+#ifdef TOPPERS_slp_tsk
+
+ER
+slp_tsk(void)
+{
+       WINFO   winfo;
+       ER              ercd;
+
+       LOG_SLP_TSK_ENTER();
+       CHECK_DISPATCH();
+
+       t_lock_cpu();
+       if (p_runtsk->wupque) {
+               p_runtsk->wupque = false;
+               ercd = E_OK;
+       }
+       else {
+               p_runtsk->tstat = (TS_WAITING | TS_WAIT_SLP);
+               make_wait(&winfo);
+               LOG_TSKSTAT(p_runtsk);
+               dispatch();
+               ercd = winfo.wercd;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_SLP_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_slp_tsk */
+
+/*
+ *  起床待ち(タイムアウトあり)
+ */
+#ifdef TOPPERS_tslp_tsk
+
+ER
+tslp_tsk(TMO tmout)
+{
+       WINFO   winfo;
+       TMEVTB  tmevtb;
+       ER              ercd;
+
+       LOG_TSLP_TSK_ENTER(tmout);
+       CHECK_DISPATCH();
+       CHECK_TMOUT(tmout);
+
+       t_lock_cpu();
+       if (p_runtsk->wupque) {
+               p_runtsk->wupque = false;
+               ercd = E_OK;
+       }
+       else if (tmout == TMO_POL) {
+               ercd = E_TMOUT;
+       }
+       else {
+               p_runtsk->tstat = (TS_WAITING | TS_WAIT_SLP);
+               make_wait_tmout(&winfo, &tmevtb, tmout);
+               LOG_TSKSTAT(p_runtsk);
+               dispatch();
+               ercd = winfo.wercd;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_TSLP_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_tslp_tsk */
+
+/*
+ *  タスクの起床
+ */
+#ifdef TOPPERS_wup_tsk
+
+ER
+wup_tsk(ID tskid)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_WUP_TSK_ENTER(tskid);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID_SELF(tskid);
+       p_tcb = get_tcb_self(tskid);
+
+       t_lock_cpu();
+       if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (TSTAT_DORMANT(p_tcb->tstat)) {
+               ercd = E_OBJ;
+       }
+       else if (TSTAT_WAIT_SLP(p_tcb->tstat)) {
+               if (wait_complete(p_tcb)) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else if (!(p_tcb->wupque)) {
+               p_tcb->wupque = true;
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_QOVR;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_WUP_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_wup_tsk */
+
+/*
+ *  タスクの起床(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_iwup_tsk
+
+ER
+iwup_tsk(ID tskid)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_IWUP_TSK_ENTER(tskid);
+       CHECK_INTCTX_UNL();
+       CHECK_TSKID(tskid);
+       p_tcb = get_tcb(tskid);
+
+       i_lock_cpu();
+       if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (TSTAT_DORMANT(p_tcb->tstat)) {
+               ercd = E_OBJ;
+       }
+       else if (TSTAT_WAIT_SLP(p_tcb->tstat)) {
+               if (wait_complete(p_tcb)) {
+                       reqflg = true;
+               }
+               ercd = E_OK;
+       }
+       else if (!(p_tcb->wupque)) {
+               p_tcb->wupque = true;
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_QOVR;
+       }
+       i_unlock_cpu();
+
+  error_exit:
+       LOG_IWUP_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_iwup_tsk */
+
+/*
+ *  タスク起床要求のキャンセル
+ */
+#ifdef TOPPERS_can_wup
+
+ER_UINT
+can_wup(ID tskid)
+{
+       TCB             *p_tcb;
+       ER_UINT ercd;
+
+       LOG_CAN_WUP_ENTER(tskid);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID_SELF(tskid);
+       p_tcb = get_tcb_self(tskid);
+
+       t_lock_cpu();
+       if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (TSTAT_DORMANT(p_tcb->tstat)) {
+               ercd = E_OBJ;
+       }
+       else {
+               ercd = p_tcb->wupque ? 1 : 0;
+               p_tcb->wupque = false;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_CAN_WUP_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_can_wup */
+
+/*
+ *  待ち状態の強制解除
+ */
+#ifdef TOPPERS_rel_wai
+
+ER
+rel_wai(ID tskid)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_REL_WAI_ENTER(tskid);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID(tskid);
+       p_tcb = get_tcb(tskid);
+
+       t_lock_cpu();
+       if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (!TSTAT_WAITING(p_tcb->tstat)) {
+               ercd = E_OBJ;
+       }
+       else {
+               if (wait_release(p_tcb)) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_REL_WAI_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_rel_wai */
+
+/*
+ *  待ち状態の強制解除(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_irel_wai
+
+ER
+irel_wai(ID tskid)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_IREL_WAI_ENTER(tskid);
+       CHECK_INTCTX_UNL();
+       CHECK_TSKID(tskid);
+       p_tcb = get_tcb(tskid);
+
+       i_lock_cpu();
+       if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (!TSTAT_WAITING(p_tcb->tstat)) {
+               ercd = E_OBJ;
+       }
+       else {
+               if (wait_release(p_tcb)) {
+                       reqflg = true;
+               }
+               ercd = E_OK;
+       }
+       i_unlock_cpu();
+
+  error_exit:
+       LOG_IREL_WAI_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_irel_wai */
+
+/*
+ *  強制待ち状態への移行
+ */
+#ifdef TOPPERS_sus_tsk
+
+ER
+sus_tsk(ID tskid)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_SUS_TSK_ENTER(tskid);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID_SELF(tskid);
+       p_tcb = get_tcb_self(tskid);
+
+       t_lock_cpu();
+       if (p_tcb == p_runtsk && !dspflg) {
+               ercd = E_CTX;
+       }
+       else if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (TSTAT_DORMANT(p_tcb->tstat)) {
+               ercd = E_OBJ;
+       }
+       else if (TSTAT_RUNNABLE(p_tcb->tstat)) {
+               /*
+                *  実行できる状態から強制待ち状態への遷移
+                */
+               p_tcb->tstat = TS_SUSPENDED;
+               LOG_TSKSTAT(p_tcb);
+               if (make_non_runnable(p_tcb)) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else if (TSTAT_SUSPENDED(p_tcb->tstat)) {
+               ercd = E_QOVR;
+       }
+       else {
+               /*
+                *  待ち状態から二重待ち状態への遷移
+                */
+               p_tcb->tstat |= TS_SUSPENDED;
+               LOG_TSKSTAT(p_tcb);
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_SUS_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_sus_tsk */
+
+/*
+ *  強制待ち状態からの再開
+ */
+#ifdef TOPPERS_rsm_tsk
+
+ER
+rsm_tsk(ID tskid)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_RSM_TSK_ENTER(tskid);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID(tskid);
+       p_tcb = get_tcb(tskid);
+
+       t_lock_cpu();
+       if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+               ercd = E_NOEXS;
+       }
+       else if (!TSTAT_SUSPENDED(p_tcb->tstat)) {
+               ercd = E_OBJ;
+       }
+       else if (!TSTAT_WAITING(p_tcb->tstat)) {
+               /*
+                *  強制待ち状態から実行できる状態への遷移
+                */
+               p_tcb->tstat = TS_RUNNABLE;
+               LOG_TSKSTAT(p_tcb);
+               if (make_runnable(p_tcb)) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else {
+               /*
+                *  二重待ち状態から待ち状態への遷移
+                */
+               p_tcb->tstat &= ~TS_SUSPENDED;
+               LOG_TSKSTAT(p_tcb);
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_RSM_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_rsm_tsk */
+
+/*
+ *  自タスクの遅延
+ */
+#ifdef TOPPERS_dly_tsk
+
+ER
+dly_tsk(RELTIM dlytim)
+{
+       WINFO   winfo;
+       TMEVTB  tmevtb;
+       ER              ercd;
+
+       LOG_DLY_TSK_ENTER(dlytim);
+       CHECK_DISPATCH();
+       CHECK_PAR(dlytim <= TMAX_RELTIM);
+
+       t_lock_cpu();
+       p_runtsk->tstat = (TS_WAITING | TS_WAIT_DLY);
+       (void) make_non_runnable(p_runtsk);
+       p_runtsk->p_winfo = &winfo;
+       winfo.p_tmevtb = &tmevtb;
+       tmevtb_enqueue(&tmevtb, dlytim, (CBACK) wait_tmout_ok, (void *) p_runtsk);
+       LOG_TSKSTAT(p_runtsk);
+       dispatch();
+       ercd = winfo.wercd;
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_DLY_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_dly_tsk */
diff --git a/asp/extension/dcre/sample/sample1.c b/asp/extension/dcre/sample/sample1.c
new file mode 100644 (file)
index 0000000..26660b0
--- /dev/null
@@ -0,0 +1,533 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2004-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  @(#) $Id: sample1.c 1968 2010-11-20 11:00:07Z ertl-hiro $
+ */
+
+/* 
+ *  サンプルプログラム(1)の本体
+ *
+ *  ASPカーネルの基本的な動作を確認するためのサンプルプログラム.
+ *
+ *  プログラムの概要:
+ *
+ *  ユーザインタフェースを受け持つメインタスク(タスクID: MAIN_TASK,優
+ *  先度: MAIN_PRIORITY)と,3つの並列実行されるタスク(タスクID:
+ *  TASK1〜TASK3,初期優先度: MID_PRIORITY)で構成される.また,起動周
+ *  期が2秒の周期ハンドラ(周期ハンドラID: CYCHDR1)を用いる.
+ *
+ *  並列実行されるタスクは,task_loop回空ループを実行する度に,タスクが
+ *  実行中であることをあらわすメッセージを表示する.
+ *
+ *  周期ハンドラは,三つの優先度(HIGH_PRIORITY,MID_PRIORITY,
+ *  LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は,
+ *  周期ハンドラは停止状態になっている.
+ *
+ *  メインタスクは,シリアルI/Oポートからの文字入力を行い(文字入力を
+ *  待っている間は,並列実行されるタスクが実行されている),入力された
+ *  文字に対応した処理を実行する.入力された文字と処理の関係は次の通り.
+ *  Control-Cまたは'Q'が入力されると,プログラムを終了する.
+ *
+ *  '1' : 対象タスクをTASK1に切り換える(初期設定).
+ *  '2' : 対象タスクをTASK2に切り換える.
+ *  '3' : 対象タスクをTASK3に切り換える.
+ *  'a' : 対象タスクをact_tskにより起動する.
+ *  'A' : 対象タスクに対する起動要求をcan_actによりキャンセルする.
+ *  'e' : 対象タスクにext_tskを呼び出させ,終了させる.
+ *  't' : 対象タスクをter_tskにより強制終了する.
+ *  '>' : 対象タスクの優先度をHIGH_PRIORITYにする.
+ *  '=' : 対象タスクの優先度をMID_PRIORITYにする.
+ *  '<' : 対象タスクの優先度をLOW_PRIORITYにする.
+ *  'G' : 対象タスクの優先度をget_priで読み出す.
+ *  's' : 対象タスクにslp_tskを呼び出させ,起床待ちにさせる.
+ *  'S' : 対象タスクにtslp_tsk(10秒)を呼び出させ,起床待ちにさせる.
+ *  'w' : 対象タスクをwup_tskにより起床する.
+ *  'W' : 対象タスクに対する起床要求をcan_wupによりキャンセルする.
+ *  'l' : 対象タスクをrel_waiにより強制的に待ち解除にする.
+ *  'u' : 対象タスクをsus_tskにより強制待ち状態にする.
+ *  'm' : 対象タスクの強制待ち状態をrsm_tskにより解除する.
+ *  'd' : 対象タスクにdly_tsk(10秒)を呼び出させ,時間経過待ちにさせる.
+ *  'x' : 対象タスクに例外パターン0x0001の例外処理を要求する.
+ *  'X' : 対象タスクに例外パターン0x0002の例外処理を要求する.
+ *  'y' : 対象タスクにdis_texを呼び出させ,タスク例外を禁止する.
+ *  'Y' : 対象タスクにena_texを呼び出させ,タスク例外を許可する.
+ *  'r' : 3つの優先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)のレ
+ *        ディキューを回転させる.
+ *  'c' : 周期ハンドラを動作開始させる.
+ *  'C' : 周期ハンドラを動作停止させる.
+ *  'b' : アラームハンドラを5秒後に起動するよう動作開始させる.
+ *  'B' : アラームハンドラを動作停止させる.
+ *  'z' : 対象タスクにCPU例外を発生させる(タスクを終了させる).
+ *  'Z' : 対象タスクにCPUロック状態でCPU例外を発生させる(プログラムを
+ *        終了する).
+ *  '@' : タスク3をacre_tskにより生成し,def_texによりタスク例外処理
+ *        ルーチンを設定する.
+ *  '!' : 対象タスクをdel_tskにより削除する.
+ *  'V' : get_utmで性能評価用システム時刻を2回読む.
+ *  'v' : 発行したシステムコールを表示する(デフォルト).
+ *  'q' : 発行したシステムコールを表示しない.
+ */
+
+#include <kernel.h>
+#include <t_syslog.h>
+#include <t_stdlib.h>
+#include "syssvc/serial.h"
+#include "syssvc/syslog.h"
+#include "kernel_cfg.h"
+#include "sample1.h"
+
+/*
+ *  サービスコールのエラーのログ出力
+ */
+Inline void
+svc_perror(const char *file, int_t line, const char *expr, ER ercd)
+{
+       if (ercd < 0) {
+               t_perror(LOG_ERROR, file, line, expr, ercd);
+       }
+}
+
+#define        SVC_PERROR(expr)        svc_perror(__FILE__, __LINE__, #expr, (expr))
+
+/*
+ *  並行実行されるタスクへのメッセージ領域
+ */
+char_t message[3];
+
+/*
+ *  ループ回数
+ */
+ulong_t        task_loop;              /* タスク内でのループ回数 */
+ulong_t        tex_loop;               /* 例外処理ルーチン内でのループ回数 */
+
+/*
+ *  並行実行されるタスク
+ */
+void task(intptr_t exinf)
+{
+       volatile ulong_t        i;
+       int_t           n = 0;
+       int_t           tskno = (int_t) exinf;
+       const char      *graph[] = { "|", "  +", "    *" };
+       char_t          c;
+
+       SVC_PERROR(ena_tex());
+       while (1) {
+               syslog(LOG_NOTICE, "task%d is running (%03d).   %s",
+                                                                               tskno, ++n, graph[tskno-1]);
+               for (i = 0; i < task_loop; i++);
+               c = message[tskno-1];
+               message[tskno-1] = 0;
+               switch (c) {
+               case 'e':
+                       syslog(LOG_INFO, "#%d#ext_tsk()", tskno);
+                       SVC_PERROR(ext_tsk());
+                       assert(0);
+               case 's':
+                       syslog(LOG_INFO, "#%d#slp_tsk()", tskno);
+                       SVC_PERROR(slp_tsk());
+                       break;
+               case 'S':
+                       syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno);
+                       SVC_PERROR(tslp_tsk(10000));
+                       break;
+               case 'd':
+                       syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno);
+                       SVC_PERROR(dly_tsk(10000));
+                       break;
+               case 'y':
+                       syslog(LOG_INFO, "#%d#dis_tex()", tskno);
+                       SVC_PERROR(dis_tex());
+                       break;
+               case 'Y':
+                       syslog(LOG_INFO, "#%d#ena_tex()", tskno);
+                       SVC_PERROR(ena_tex());
+                       break;
+#ifdef CPUEXC1
+               case 'z':
+                       syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
+                       RAISE_CPU_EXCEPTION;
+                       break;
+               case 'Z':
+                       SVC_PERROR(loc_cpu());
+                       syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
+                       RAISE_CPU_EXCEPTION;
+                       SVC_PERROR(unl_cpu());
+                       break;
+#endif /* CPUEXC1 */
+               default:
+                       break;
+               }
+       }
+}
+
+/*
+ *  並行して実行されるタスク用のタスク例外処理ルーチン
+ */
+void tex_routine(TEXPTN texptn, intptr_t exinf)
+{
+       volatile ulong_t        i;
+       int_t   tskno = (int_t) exinf;
+
+       syslog(LOG_NOTICE, "task%d receives exception 0x%04x.", tskno, texptn);
+       for (i = 0; i < tex_loop; i++);
+
+       if ((texptn & 0x8000U) != 0U) {
+               syslog(LOG_INFO, "#%d#ext_tsk()", tskno);
+               SVC_PERROR(ext_tsk());
+               assert(0);
+       }
+}
+
+/*
+ *  CPU例外ハンドラ
+ */
+#ifdef CPUEXC1
+
+void
+cpuexc_handler(void *p_excinf)
+{
+       ID              tskid;
+
+       syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", p_excinf);
+       if (sns_ctx() != true) {
+               syslog(LOG_WARNING,
+                                       "sns_ctx() is not true in CPU exception handler.");
+       }
+       if (sns_dpn() != true) {
+               syslog(LOG_WARNING,
+                                       "sns_dpn() is not true in CPU exception handler.");
+       }
+       syslog(LOG_INFO, "sns_loc = %d sns_dsp = %d sns_tex = %d",
+                                                                       sns_loc(), sns_dsp(), sns_tex());
+       syslog(LOG_INFO, "xsns_dpn = %d xsns_xpn = %d",
+                                                                       xsns_dpn(p_excinf), xsns_xpn(p_excinf));
+
+       if (xsns_xpn(p_excinf)) {
+               syslog(LOG_NOTICE, "Sample program ends with exception.");
+               SVC_PERROR(ext_ker());
+               assert(0);
+       }
+
+       SVC_PERROR(iget_tid(&tskid));
+       SVC_PERROR(iras_tex(tskid, 0x8000U));
+}
+
+#endif /* CPUEXC1 */
+
+/*
+ *  周期ハンドラ
+ *
+ *  HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー
+ *  を回転させる.
+ */
+void cyclic_handler(intptr_t exinf)
+{
+       SVC_PERROR(irot_rdq(HIGH_PRIORITY));
+       SVC_PERROR(irot_rdq(MID_PRIORITY));
+       SVC_PERROR(irot_rdq(LOW_PRIORITY));
+}
+
+/*
+ *  アラームハンドラ
+ *
+ *  HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー
+ *  を回転させる.
+ */
+void alarm_handler(intptr_t exinf)
+{
+       SVC_PERROR(irot_rdq(HIGH_PRIORITY));
+       SVC_PERROR(irot_rdq(MID_PRIORITY));
+       SVC_PERROR(irot_rdq(LOW_PRIORITY));
+}
+
+/*
+ *  メインタスク
+ */
+void main_task(intptr_t exinf)
+{
+       char_t  c;
+       ID              tskid = TASK1;
+       int_t   tskno = 1;
+       ER_UINT ercd;
+       PRI             tskpri;
+#ifndef TASK_LOOP
+       volatile ulong_t        i;
+       SYSTIM  stime1, stime2;
+#endif /* TASK_LOOP */
+#ifdef TOPPERS_SUPPORT_GET_UTM
+       SYSUTM  utime1, utime2;
+#endif /* TOPPERS_SUPPORT_GET_UTM */
+       T_CTSK  ctsk;
+       T_DTEX  dtex;
+       ID              TASK3 = -1;
+
+       SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)));
+       syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf);
+
+       /*
+        *  シリアルポートの初期化
+        *
+        *  システムログタスクと同じシリアルポートを使う場合など,シリアル
+        *  ポートがオープン済みの場合にはここでE_OBJエラーになるが,支障は
+        *  ない.
+        */
+       ercd = serial_opn_por(TASK_PORTID);
+       if (ercd < 0 && MERCD(ercd) != E_OBJ) {
+               syslog(LOG_ERROR, "%s (%d) reported by `serial_opn_por'.",
+                                                                       itron_strerror(ercd), SERCD(ercd));
+       }
+       SVC_PERROR(serial_ctl_por(TASK_PORTID,
+                                                       (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV)));
+
+       /*
+        *  ループ回数の設定
+        *
+        *  TASK_LOOPがマクロ定義されている場合,測定せずに,TASK_LOOPに定
+        *  義された値を,タスク内でのループ回数とする.
+        *
+        *  MEASURE_TWICEがマクロ定義されている場合,1回目の測定結果を捨て
+        *  て,2回目の測定結果を使う.1回目の測定は長めの時間が出るため.
+        */
+#ifdef TASK_LOOP
+       task_loop = TASK_LOOP;
+#else /* TASK_LOOP */
+
+#ifdef MEASURE_TWICE
+       task_loop = LOOP_REF;
+       SVC_PERROR(get_tim(&stime1));
+       for (i = 0; i < task_loop; i++);
+       SVC_PERROR(get_tim(&stime2));
+#endif /* MEASURE_TWICE */
+
+       task_loop = LOOP_REF;
+       SVC_PERROR(get_tim(&stime1));
+       for (i = 0; i < task_loop; i++);
+       SVC_PERROR(get_tim(&stime2));
+       task_loop = LOOP_REF * 400UL / (stime2 - stime1);
+
+#endif /* TASK_LOOP */
+       tex_loop = task_loop / 5;
+
+       /*
+        *  タスクの起動
+        */
+       SVC_PERROR(act_tsk(TASK1));
+       SVC_PERROR(act_tsk(TASK2));
+
+       /*
+        *  メインループ
+        */
+       do {
+               SVC_PERROR(serial_rea_dat(TASK_PORTID, &c, 1));
+               switch (c) {
+               case 'e':
+               case 's':
+               case 'S':
+               case 'd':
+               case 'y':
+               case 'Y':
+               case 'z':
+               case 'Z':
+                       message[tskno-1] = c;
+                       break;
+               case '1':
+                       tskno = 1;
+                       tskid = TASK1;
+                       break;
+               case '2':
+                       tskno = 2;
+                       tskid = TASK2;
+                       break;
+               case '3':
+                       tskno = 3;
+                       tskid = TASK3;
+                       break;
+               case 'a':
+                       syslog(LOG_INFO, "#act_tsk(%d)", tskno);
+                       SVC_PERROR(act_tsk(tskid));
+                       break;
+               case 'A':
+                       syslog(LOG_INFO, "#can_act(%d)", tskno);
+                       SVC_PERROR(ercd = can_act(tskid));
+                       if (ercd >= 0) {
+                               syslog(LOG_NOTICE, "can_act(%d) returns %d", tskno, ercd);
+                       }
+                       break;
+               case 't':
+                       syslog(LOG_INFO, "#ter_tsk(%d)", tskno);
+                       SVC_PERROR(ter_tsk(tskid));
+                       break;
+               case '>':
+                       syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno);
+                       SVC_PERROR(chg_pri(tskid, HIGH_PRIORITY));
+                       break;
+               case '=':
+                       syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno);
+                       SVC_PERROR(chg_pri(tskid, MID_PRIORITY));
+                       break;
+               case '<':
+                       syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno);
+                       SVC_PERROR(chg_pri(tskid, LOW_PRIORITY));
+                       break;
+               case 'G':
+                       syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno);
+                       SVC_PERROR(ercd = get_pri(tskid, &tskpri));
+                       if (ercd >= 0) {
+                               syslog(LOG_NOTICE, "priority of task %d is %d", tskno, tskpri);
+                       }
+                       break;
+               case 'w':
+                       syslog(LOG_INFO, "#wup_tsk(%d)", tskno);
+                       SVC_PERROR(wup_tsk(tskid));
+                       break;
+               case 'W':
+                       syslog(LOG_INFO, "#can_wup(%d)", tskno);
+                       SVC_PERROR(ercd = can_wup(tskid));
+                       if (ercd >= 0) {
+                               syslog(LOG_NOTICE, "can_wup(%d) returns %d", tskno, ercd);
+                       }
+                       break;
+               case 'l':
+                       syslog(LOG_INFO, "#rel_wai(%d)", tskno);
+                       SVC_PERROR(rel_wai(tskid));
+                       break;
+               case 'u':
+                       syslog(LOG_INFO, "#sus_tsk(%d)", tskno);
+                       SVC_PERROR(sus_tsk(tskid));
+                       break;
+               case 'm':
+                       syslog(LOG_INFO, "#rsm_tsk(%d)", tskno);
+                       SVC_PERROR(rsm_tsk(tskid));
+                       break;
+               case 'x':
+                       syslog(LOG_INFO, "#ras_tex(%d, 0x0001U)", tskno);
+                       SVC_PERROR(ras_tex(tskid, 0x0001U));
+                       break;
+               case 'X':
+                       syslog(LOG_INFO, "#ras_tex(%d, 0x0002U)", tskno);
+                       SVC_PERROR(ras_tex(tskid, 0x0002U));
+                       break;
+               case 'r':
+                       syslog(LOG_INFO, "#rot_rdq(three priorities)");
+                       SVC_PERROR(rot_rdq(HIGH_PRIORITY));
+                       SVC_PERROR(rot_rdq(MID_PRIORITY));
+                       SVC_PERROR(rot_rdq(LOW_PRIORITY));
+                       break;
+               case 'c':
+                       syslog(LOG_INFO, "#sta_cyc(1)");
+                       SVC_PERROR(sta_cyc(CYCHDR1));
+                       break;
+               case 'C':
+                       syslog(LOG_INFO, "#stp_cyc(1)");
+                       SVC_PERROR(stp_cyc(CYCHDR1));
+                       break;
+               case 'b':
+                       syslog(LOG_INFO, "#sta_alm(1, 5000)");
+                       SVC_PERROR(sta_alm(ALMHDR1, 5000));
+                       break;
+               case 'B':
+                       syslog(LOG_INFO, "#stp_alm(1)");
+                       SVC_PERROR(stp_alm(ALMHDR1));
+                       break;
+               case '@':
+                       ctsk.tskatr = TA_NULL;
+                       ctsk.exinf = 3;
+                       ctsk.task = task;
+                       ctsk.itskpri = MID_PRIORITY;
+                       ctsk.stksz = STACK_SIZE;
+                       ctsk.stk = NULL;
+                       SVC_PERROR(TASK3 = acre_tsk(&ctsk));
+
+                       dtex.texatr = TA_NULL;
+                       dtex.texrtn = tex_routine;
+                       SVC_PERROR(def_tex(TASK3, &dtex));
+
+                       syslog(LOG_NOTICE, "task3 is created with tskid = %d.",
+                                                                                                               (int_t) TASK3);
+                       break;
+               case '!':
+                       syslog(LOG_INFO, "#del_tsk(%d)", tskno);
+                       SVC_PERROR(del_tsk(tskid));
+                       break;
+
+               case 'V':
+#ifdef TOPPERS_SUPPORT_GET_UTM
+                       SVC_PERROR(get_utm(&utime1));
+                       SVC_PERROR(get_utm(&utime2));
+                       syslog(LOG_NOTICE, "utime1 = %ld, utime2 = %ld",
+                                                                               (ulong_t) utime1, (ulong_t) utime2);
+#else /* TOPPERS_SUPPORT_GET_UTM */
+                       syslog(LOG_NOTICE, "get_utm is not supported.");
+#endif /* TOPPERS_SUPPORT_GET_UTM */
+                       break;
+
+               case 'v':
+                       SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO),
+                                                                               LOG_UPTO(LOG_EMERG)));
+                       break;
+               case 'q':
+                       SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_NOTICE),
+                                                                               LOG_UPTO(LOG_EMERG)));
+                       break;
+
+#ifdef BIT_KERNEL
+               case ' ':
+                       SVC_PERROR(loc_cpu());
+                       {
+                               extern ER       bit_kernel(void);
+
+                               SVC_PERROR(ercd = bit_kernel());
+                               if (ercd >= 0) {
+                                       syslog(LOG_NOTICE, "bit_kernel passed.");
+                               }
+                       }
+                       SVC_PERROR(unl_cpu());
+                       break;
+#endif /* BIT_KERNEL */
+
+               default:
+                       break;
+               }
+       } while (c != '\003' && c != 'Q');
+
+       syslog(LOG_NOTICE, "Sample program ends.");
+       SVC_PERROR(ext_ker());
+       assert(0);
+}
diff --git a/asp/extension/dcre/sample/sample1.cfg b/asp/extension/dcre/sample/sample1.cfg
new file mode 100644 (file)
index 0000000..5553efd
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ *  @(#) $Id: sample1.cfg 1968 2010-11-20 11:00:07Z ertl-hiro $
+ */
+
+/*
+ *  サンプルプログラム(1)のシステムコンフィギュレーションファイル
+ */
+INCLUDE("target_timer.cfg");
+INCLUDE("syssvc/syslog.cfg");
+INCLUDE("syssvc/banner.cfg");
+INCLUDE("syssvc/serial.cfg");
+INCLUDE("syssvc/logtask.cfg");
+
+#include "sample1.h"
+CRE_TSK(TASK1, { TA_NULL, 1, task, MID_PRIORITY, STACK_SIZE, NULL });
+CRE_TSK(TASK2, { TA_NULL, 2, task, MID_PRIORITY, STACK_SIZE, NULL });
+CRE_TSK(MAIN_TASK, { TA_ACT, 0, main_task, MAIN_PRIORITY, STACK_SIZE, NULL });
+AID_TSK(3);
+DEF_TEX(TASK1, { TA_NULL, tex_routine });
+DEF_TEX(TASK2, { TA_NULL, tex_routine });
+CRE_CYC(CYCHDR1, { TA_NULL, 0, cyclic_handler, 2000, 0 });
+CRE_ALM(ALMHDR1, { TA_NULL, 0, alarm_handler });
+#ifdef CPUEXC1
+DEF_EXC(CPUEXC1, { TA_NULL, cpuexc_handler });
+#endif /* CPUEXC1 */
+DEF_KMM( { KMM_SIZE, NULL } );
old mode 100755 (executable)
new mode 100644 (file)
similarity index 64%
rename from asp/target/cq_starm_gcc/target_support.S
rename to asp/extension/dcre/sample/sample1.h
index 8324000..8dfa8be
@@ -2,12 +2,12 @@
  *  TOPPERS/ASP Kernel
  *      Toyohashi Open Platform for Embedded Real-Time Systems/
  *      Advanced Standard Profile Kernel
- * 
+ *
  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
  *                              Toyohashi Univ. of Technology, JAPAN
- *  Copyright (C) 2007 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2004-2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
- * 
+ *
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
  *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
  *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
- * 
+ *
+ *  @(#) $Id: sample1.h 1968 2010-11-20 11:00:07Z ertl-hiro $
+ */
+
+/*
+ *             サンプルプログラム(1)のヘッダファイル
+ */
+
+/*
+ *  ターゲット依存の定義
  */
+#include "target_test.h"
 
 /*
- * ターゲット依存部 アセンブリ言語(CQ-STARM)
+ *  各タスクの優先度の定義
  */
 
-#define TOPPERS_MACRO_ONLY
-#define UINT_C(val)                    (val)
-#define ULONG_C(val)           (val)
-#include "kernel_impl.h"
-#include "cq_starm.h"
+#define MAIN_PRIORITY  5               /* メインタスクの優先度 */
+                                                               /* HIGH_PRIORITYより高くすること */
 
+#define HIGH_PRIORITY  9               /* 並列に実行されるタスクの優先度 */
+#define MID_PRIORITY   10
+#define LOW_PRIORITY   11
 
 /*
- * 低レベルのターゲット依存の初期化
- *
- * メモリ初期化の前に呼び出される
+ *  ターゲットに依存する可能性のある定数の定義
+ */
+
+#ifndef TASK_PORTID
+#define        TASK_PORTID             1                       /* 文字入力するシリアルポートID */
+#endif /* TASK_PORTID */
+
+#ifndef STACK_SIZE
+#define        STACK_SIZE              4096            /* タスクのスタックサイズ */
+#endif /* STACK_SIZE */
+
+#ifndef KMM_SIZE
+#define        KMM_SIZE                (STACK_SIZE * 16)       /* カーネルが割り付ける   */
+#endif /* KMM_SIZE */                                          /*     メモリ領域のサイズ */
+
+#ifndef LOOP_REF
+#define LOOP_REF               ULONG_C(1000000)        /* 速度計測用のループ回数 */
+#endif /* LOOP_REF */
+
+/*
+ *  関数のプロトタイプ宣言
  */
-       .cpu cortex-m3
-       .fpu softvfp
-       .syntax unified
-       .thumb
-       .text
+#ifndef TOPPERS_MACRO_ONLY
 
-_hardware_init_hook:
-       bx r14
+extern void    task(intptr_t exinf);
+extern void    main_task(intptr_t exinf);
+extern void    tex_routine(TEXPTN texptn, intptr_t exinf);
+#ifdef CPUEXC1
+extern void    cpuexc_handler(void *p_excinf);
+#endif /* CPUEXC1 */
+extern void    cyclic_handler(intptr_t exinf);
+extern void    alarm_handler(intptr_t exinf);
 
+#endif /* TOPPERS_MACRO_ONLY */
index f9a0756..0782ce8 100644 (file)
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: kernel.h 1862 2010-07-25 11:49:51Z ertl-hiro $
+ *  @(#) $Id: kernel.h 1959 2010-11-20 02:17:27Z ertl-hiro $
  */
 
 /*
@@ -465,8 +465,8 @@ extern bool_t       xsns_xpn(void *p_excinf) throw();
  */
 #define TKERNEL_MAKER  UINT_C(0x0118)  /* カーネルのメーカーコード */
 #define TKERNEL_PRID   UINT_C(0x0007)  /* カーネルの識別番号 */
-#define TKERNEL_SPVER  UINT_C(0xf512)  /* カーネル仕様のバージョン番号 */
-#define TKERNEL_PRVER  UINT_C(0x1060)  /* カーネルのバージョン番号 */
+#define TKERNEL_SPVER  UINT_C(0xf513)  /* カーネル仕様のバージョン番号 */
+#define TKERNEL_PRVER  UINT_C(0x1070)  /* カーネルのバージョン番号 */
 
 /*
  *  キューイング回数の最大値
index a8408a2..4180f7d 100644 (file)
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: check.h 1139 2008-06-19 07:03:34Z ertl-hiro $
+ *  @(#) $Id: check.h 1965 2010-11-20 07:22:43Z ertl-hiro $
  */
 
 /*
@@ -94,7 +94,7 @@
 /*
  *  割込み優先度のチェック(E_PAR)
  */
-#define CHECK_INTPRI_CHGIPM(inttpri) {                                         \
+#define CHECK_INTPRI_CHGIPM(intpri) {                                          \
        if (!VALID_INTPRI_CHGIPM(intpri)) {                                             \
                ercd = E_PAR;                                                                           \
                goto error_exit;                                                                        \
index 161b88c..c06f486 100644 (file)
@@ -5,7 +5,7 @@ $       Toyohashi Open Platform for Embedded Real-Time Systems/
 $       Advanced Standard Profile Kernel
 $ 
 $   Copyright (C) 2007 by TAKAGI Nobuhisa
-$   Copyright (C) 2007-2010 by Embedded and Real-Time Systems Laboratory
+$   Copyright (C) 2007-2011 by Embedded and Real-Time Systems Laboratory
 $               Graduate School of Information Science, Nagoya Univ., JAPAN
 $  
 $   上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -37,7 +37,7 @@ $   に対する適合性も含めて,いかなる保証も行わない.ま
 $   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
 $   の責任を負わない.
 $ 
-$   $Id: kernel.tf 1845 2010-07-11 13:02:57Z ertl-hiro $
+$   $Id: kernel.tf 2024 2011-01-02 08:59:23Z ertl-hiro $
 $  
 $ =====================================================================
 
@@ -188,7 +188,7 @@ $NL$
 
 $ タスクが1個以上存在することのチェック
 $IF !LENGTH(TSK.ID_LIST)$
-       $ERROR$$FORMAT("no task is registered")$$END$
+       $ERROR$$FORMAT(_("no task is registered"))$$END$
 $END$
 
 $ タスクID番号の最大値
@@ -198,7 +198,7 @@ $NL$
 $ エラーチェック
 $FOREACH tskid TSK.ID_LIST$
 $      // tskatrが([TA_ACT])でない場合(E_RSATR)
-       $IF (TSK.TSKATR[tskid] & ~(TA_ACT|ALT(TARGET_TSKATR,0))) != 0$
+       $IF (TSK.TSKATR[tskid] & ~(TA_ACT|TARGET_TSKATR)) != 0$
                $ERROR TSK.TEXT_LINE[tskid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "tskatr", TSK.TSKATR[tskid], tskid, "CRE_TSK")$$END$
        $END$
 
@@ -216,12 +216,12 @@ $END$
 $ スタック領域の生成とそれに関するエラーチェック
 $FOREACH tskid TSK.ID_LIST$
 $      // stkszが0か,ターゲット定義の最小値(TARGET_MIN_STKSZ)よりも小さい場合(E_PAR)
-       $IF TSK.STKSZ[tskid] == 0 || (LENGTH(TARGET_MIN_STKSZ) && 
-                                                                               TSK.STKSZ[tskid] < TARGET_MIN_STKSZ)$
+       $IF TSK.STKSZ[tskid] == 0 || (TARGET_MIN_STKSZ
+                                                                       && TSK.STKSZ[tskid] < TARGET_MIN_STKSZ)$
                $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is too small"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$$END$
        $END$
 $      // stkszがスタック領域のサイズとして正しくない場合(E_PAR)
-       $IF !EQ(TSK.STK[tskid], "NULL") && LENGTH(CHECK_STKSZ_ALIGN)
+       $IF !EQ(TSK.STK[tskid], "NULL") && CHECK_STKSZ_ALIGN
                                                        && (TSK.STKSZ[tskid] & (CHECK_STKSZ_ALIGN - 1))$
                $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$$END$
        $END$
@@ -243,10 +243,10 @@ $JOINEACH tskid TSK.ID_LIST ",\n"$
 $      // タスク属性,拡張情報,起動番地,起動時優先度
        $TAB${
        $SPC$($TSK.TSKATR[tskid]$), (intptr_t)($TSK.EXINF[tskid]$),
-       $SPC$($TSK.TASK[tskid]$), INT_PRIORITY($TSK.ITSKPRI[tskid]$),
+       $SPC$((TASK)($TSK.TASK[tskid]$)), INT_PRIORITY($TSK.ITSKPRI[tskid]$),
 
 $      // タスク初期化コンテキストブロック,スタック領域
-       $IF ALT(USE_TSKINICTXB,0)$
+       $IF USE_TSKINICTXB$
                $GENERATE_TSKINICTXB(tskid)$
        $ELSE$
                $SPC$$TSK.TINIB_STKSZ[tskid]$, $TSK.TINIB_STK[tskid]$,
@@ -258,7 +258,7 @@ $END$$NL$
 };$NL$
 $NL$
 
-$ タスクコントロールブロックの生成
+$ タスク管理ブロックの生成
 TCB _kernel_tcb_table[TNUM_TSKID];$NL$
 $NL$
 
@@ -305,13 +305,12 @@ $         // セマフォ初期化ブロック
        };$NL$
        $NL$
 
-$      // セマフォコントロールブロック
+$      // セマフォ管理ブロック
        SEMCB _kernel_semcb_table[TNUM_SEMID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const SEMINIB, _kernel_seminib_table);$NL$
        TOPPERS_EMPTY_LABEL(SEMCB, _kernel_semcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  イベントフラグ
@@ -340,13 +339,12 @@ $         // イベントフラグ初期化ブロック
        };$NL$
        $NL$
 
-$      // イベントフラグコントロールブロック
+$      // イベントフラグ管理ブロック
        FLGCB _kernel_flgcb_table[TNUM_FLGID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const FLGINIB, _kernel_flginib_table);$NL$
        TOPPERS_EMPTY_LABEL(FLGCB, _kernel_flgcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  データキュー
@@ -372,9 +370,9 @@ $           // dtqmbがNULLでない場合(E_NOSPT)
                        $ERROR DTQ.TEXT_LINE[dtqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "dtqmb", DTQ.DTQMB[dtqid], dtqid, "CRE_DTQ")$$END$
                $END$
 
-$              // データキュー領域
+$              // データキュー管理領域
                $IF DTQ.DTQCNT[dtqid]$
-                       static intptr_t _kernel_dtqmb_$dtqid$[$DTQ.DTQCNT[dtqid]$];$NL$
+                       static DTQMB _kernel_dtqmb_$dtqid$[$DTQ.DTQCNT[dtqid]$];$NL$
                $END$
        $END$
 
@@ -386,13 +384,12 @@ $ // データキュー初期化ブロックの生成
        };$NL$
        $NL$
 
-$      // データキューコントロールブロック
+$      // データキュー管理ブロック
        DTQCB _kernel_dtqcb_table[TNUM_DTQID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const DTQINIB, _kernel_dtqinib_table);$NL$
        TOPPERS_EMPTY_LABEL(DTQCB, _kernel_dtqcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  優先度データキュー
@@ -423,7 +420,7 @@ $           // pdqmbがNULLでない場合(E_NOSPT)
                        $ERROR PDQ.TEXT_LINE[pdqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "pdqmb", PDQ.PDQMB[pdqid], pdqid, "CRE_PDQ")$$END$
                $END$
 
-$              // 優先度データキュー領域
+$              // 優先度データキュー管理領域
                $IF PDQ.PDQCNT[pdqid]$
                        static PDQMB _kernel_pdqmb_$pdqid$[$PDQ.PDQCNT[pdqid]$];$NL$
                $END$
@@ -437,13 +434,12 @@ $ // 優先度データキュー初期化ブロックの生成
        };$NL$
        $NL$
 
-$      // 優先度データキューコントロールブロック
+$      // 優先度データキュー管理ブロック
        PDQCB _kernel_pdqcb_table[TNUM_PDQID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const PDQINIB, _kernel_pdqinib_table);$NL$
        TOPPERS_EMPTY_LABEL(PDQCB, _kernel_pdqcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  メールボックス
@@ -482,13 +478,12 @@ $         // メールボックス初期化ブロック
        };$NL$
        $NL$
 
-$      // メールボックスコントロールブロック
+$      // メールボックス管理ブロック
        MBXCB _kernel_mbxcb_table[TNUM_MBXID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const MBXINIB, _kernel_mbxinib_table);$NL$
        TOPPERS_EMPTY_LABEL(MBXCB, _kernel_mbxcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  ミューテックス
@@ -526,13 +521,12 @@ $         // ミューテックス初期化ブロック
        };$NL$
        $NL$
 
-$      // ミューテックスコントロールブロック
+$      // ミューテックス管理ブロック
        MTXCB _kernel_mtxcb_table[TNUM_MTXID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const MTXINIB, _kernel_mtxinib_table);$NL$
        TOPPERS_EMPTY_LABEL(MTXCB, _kernel_mtxcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  固定長メモリプール
@@ -585,13 +579,12 @@ $ // 固定長メモリプール初期化ブロックの生成
        };$NL$
        $NL$
 
-$      // 固定長メモリプールコントロールブロック
+$      // 固定長メモリプール管理ブロック
        MPFCB _kernel_mpfcb_table[TNUM_MPFID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const MPFINIB, _kernel_mpfinib_table);$NL$
        TOPPERS_EMPTY_LABEL(MPFCB, _kernel_mpfcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  周期ハンドラ
@@ -635,13 +628,12 @@ $         // 周期ハンドラ初期化ブロック
        };$NL$
        $NL$
 
-$      // 周期ハンドラコントロールブロック
+$      // 周期ハンドラ管理ブロック
        CYCCB _kernel_cyccb_table[TNUM_CYCID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const CYCINIB, _kernel_cycinib_table);$NL$
        TOPPERS_EMPTY_LABEL(CYCCB, _kernel_cyccb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  アラームハンドラ
@@ -670,13 +662,12 @@ $         // アラームハンドラ初期化ブロック
        };$NL$
        $NL$
 
-$      // アラームハンドラコントロールブロック
+$      // アラームハンドラ管理ブロック
        ALMCB _kernel_almcb_table[TNUM_ALMID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const ALMINIB, _kernel_alminib_table);$NL$
        TOPPERS_EMPTY_LABEL(ALMCB, _kernel_almcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  割込み管理機能
@@ -716,7 +707,7 @@ $   // intnoがCFG_INTによって設定済みの場合(E_OBJ)
        $END$
 
 $      // intatrが([TA_ENAINT]|[TA_EDGE])でない場合(E_RSATR)
-       $IF (INT.INTATR[intno] & ~(TA_ENAINT|TA_EDGE|ALT(TARGET_INTATR,0))) != 0$
+       $IF (INT.INTATR[intno] & ~(TA_ENAINT|TA_EDGE|TARGET_INTATR)) != 0$
                $ERROR INT.TEXT_LINE[intno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "intatr", INT.INTATR[intno], "intno", INT.INTNO[intno], "CFG_INT")$$END$
        $END$
 
@@ -761,7 +752,7 @@ $   // inhnoがDEF_INHによって設定済みの場合(E_OBJ)
        $END$
 
 $      // inhatrが(TA_NULL)でない場合(E_RSATR)
-       $IF (INH.INHATR[inhno] & ~ALT(TARGET_INHATR,0)) != 0$
+       $IF (INH.INHATR[inhno] & ~TARGET_INHATR) != 0$
                $ERROR INH.TEXT_LINE[inhno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "inhatr", INH.INHATR[inhno], "inhno", INH.INHNO[inhno], "DEF_INH")$$END$
        $END$
 
@@ -783,25 +774,23 @@ $ // が指定されていない場合(E_RSATR)
 
        $IF LENGTH(INTNO[INH.INHNO[inhno]])$
                $intno = INTNO[INH.INHNO[inhno]]$
-               $IF LENGTH(FIND(INTNO_CFGINT_VALID, intno))$
-$                      // inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)
-                       $IF !LENGTH(INT.INTNO[intno])$
-                               $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' corresponding to %3% `%4%\' is not configured with %5%"), "intno", INT.INTNO[intno], "inhno", INH.INHNO[inhno], "CFG_INT")$$END$
+$              // inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)
+               $IF !LENGTH(INT.INTNO[intno])$
+                       $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' corresponding to %3% `%4%\' is not configured with %5%"), "intno", INT.INTNO[intno], "inhno", INH.INHNO[inhno], "CFG_INT")$$END$
+               $ELSE$
+                       $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
+$                              // inhatrにTA_NONKERNELが指定されておらず,inhnoに対応
+$                              // するintnoに対してCFG_INTで設定された割込み優先度が
+$                              // TMIN_INTPRIよりも小さい場合(E_OBJ)
+                               $IF INT.INTPRI[intno] < TMIN_INTPRI$
+                                       $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
+                               $END$
                        $ELSE$
-                               $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
-$                                      // inhatrにTA_NONKERNELが指定されておらず,inhnoに対応
-$                                      // するintnoに対してCFG_INTで設定された割込み優先度が
-$                                      // TMIN_INTPRIよりも小さい場合(E_OBJ)
-                                       $IF INT.INTPRI[intno] < TMIN_INTPRI$
-                                               $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
-                                       $END$
-                               $ELSE$
-$                                      // inhatrにTA_NONKERNELが指定されており,inhnoに対応
-$                                      // するintnoに対してCFG_INTで設定された割込み優先度が
-$                                      // TMIN_INTPRI以上である場合(E_OBJ)
-                                       $IF INT.INTPRI[intno] >= TMIN_INTPRI$
-                                               $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is lower than or equal to %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
-                                       $END$
+$                              // inhatrにTA_NONKERNELが指定されており,inhnoに対応
+$                              // するintnoに対してCFG_INTで設定された割込み優先度が
+$                              // TMIN_INTPRI以上である場合(E_OBJ)
+                               $IF INT.INTPRI[intno] >= TMIN_INTPRI$
+                                       $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is lower than or equal to %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
                                $END$
                        $END$
                $END$
@@ -812,8 +801,8 @@ $END$
 $ 割込みサービスルーチン(ISR)に関するエラーチェックと割込みハンドラの生成
 $FOREACH order ISR.ORDER_LIST$
 $      // isratrが(TA_NULL)でない場合(E_RSATR)
-       $IF (ISR.ISRATR[order] & ~ALT(TARGET_ISRATR,0)) != 0$
-               $ERROR ISR.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "isratr", ISR.ISRATR[order], "isr", ISR.ISR[order], "ATT_ISR")$$END$
+       $IF (ISR.ISRATR[order] & ~TARGET_ISRATR) != 0$
+               $ERROR ISR.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "isratr", ISR.ISRATR[order], "ATT_ISR")$$END$
        $END$
 
 $      // intnoがATT_ISRに対する割込み番号として正しくない場合(E_PAR)
@@ -891,7 +880,7 @@ $
 $  割込み管理機能のための標準的な初期化情報の生成
 $ 
 $ 割込みハンドラの初期化に必要な情報
-$IF !ALT(OMIT_INITIALIZE_INTERRUPT,0) || ALT(USE_INHINIB_TABLE,0)$
+$IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INHINIB_TABLE,0)$
 
 $ 割込みハンドラ数
 #define TNUM_INHNO     $LENGTH(INH.ORDER_LIST)$$NL$
@@ -917,12 +906,11 @@ $IF LENGTH(INH.ORDER_LIST)$
        };$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const INHINIB, _kernel_inhinib_table);$NL$
-$END$
-$NL$
+$END$$NL$
 $END$
 
 $ 割込み要求ラインの初期化に必要な情報
-$IF !ALT(OMIT_INITIALIZE_INTERRUPT,0) || ALT(USE_INHINTB_TABLE,0)$
+$IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INHINTB_TABLE,0)$
 
 $ 割込み要求ライン数
 #define TNUM_INTNO     $LENGTH(INT.ORDER_LIST)$$NL$
@@ -938,8 +926,7 @@ $IF LENGTH(INT.ORDER_LIST)$
        };$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const INTINIB, _kernel_intinib_table);$NL$
-$END$
-$NL$
+$END$$NL$
 $END$
 
 $ 
@@ -968,14 +955,14 @@ $ // excnoがDEF_EXCによって設定済みの場合(E_OBJ)
        $END$
 
 $      // excatrが(TA_NULL)でない場合(E_RSATR)
-       $IF (EXC.EXCATR[excno] & ~ALT(TARGET_EXCATR,0)) != 0$
+       $IF (EXC.EXCATR[excno] & ~TARGET_EXCATR) != 0$
                $ERROR EXC.TEXT_LINE[excno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "excatr", EXC.EXCATR[excno], "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$
        $END$
        $i = i + 1$
 $END$
 
 $ CPU例外ハンドラのための標準的な初期化情報の生成
-$IF !ALT(OMIT_INITIALIZE_EXCEPTION,0)$
+$IF !OMIT_INITIALIZE_EXCEPTION$
 
 $ CPU例外ハンドラ数
 #define TNUM_EXCNO     $LENGTH(EXC.ORDER_LIST)$$NL$
@@ -995,8 +982,7 @@ $IF LENGTH(EXC.ORDER_LIST)$
        };$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const EXCINIB, _kernel_excinib_table);$NL$
-$END$
-$NL$
+$END$$NL$
 $END$
 
 $ 
@@ -1029,7 +1015,7 @@ $ // 静的API「DEF_ICS」が複数ある(E_OBJ)
        $END$
 
 $      // istkszがスタック領域のサイズとして正しくない場合(E_PAR)
-       $IF !EQ(ICS.ISTK[1], "NULL") && LENGTH(CHECK_STKSZ_ALIGN)
+       $IF !EQ(ICS.ISTK[1], "NULL") && CHECK_STKSZ_ALIGN
                                                        && (ICS.ISTKSZ[1] & (CHECK_STKSZ_ALIGN - 1))$
                $ERROR ICS.TEXT_LINE[1]$E_PAR: $FORMAT(_("%1% `%2%\' in %3% is not aligned"), "istksz", ICS.ISTKSZ[1], "DEF_ICS")$$END$
        $END$
index 9ddbad3..326e04f 100644 (file)
@@ -1,3 +1,5 @@
+SIL_ENDIAN_BIG,#defined(SIL_ENDIAN_BIG)
+SIL_ENDIAN_LITTLE,#defined(SIL_ENDIAN_LITTLE)
 TA_NULL,TA_NULL
 TA_ACT,TA_ACT
 TA_TPRI,TA_TPRI
@@ -23,6 +25,19 @@ TMIN_INTPRI,TMIN_INTPRI,signed
 OMIT_INITIALIZE_INTERRUPT,#defined(OMIT_INITIALIZE_INTERRUPT)
 OMIT_INITIALIZE_EXCEPTION,#defined(OMIT_INITIALIZE_EXCEPTION)
 USE_TSKINICTXB,#defined(USE_TSKINICTXB)
+TARGET_TSKATR,#defined(TARGET_TSKATR),,TARGET_TSKATR
+TARGET_INTATR,#defined(TARGET_INTATR),,TARGET_INTATR
+TARGET_INHATR,#defined(TARGET_INHATR),,TARGET_INHATR
+TARGET_ISRATR,#defined(TARGET_ISRATR),,TARGET_ISRATR
+TARGET_EXCATR,#defined(TARGET_EXCATR),,TARGET_EXCATR
+TARGET_MIN_STKSZ,#defined(TARGET_MIN_STKSZ),,TARGET_MIN_STKSZ
+CHECK_STKSZ_ALIGN,#defined(CHECK_STKSZ_ALIGN),,CHECK_STKSZ_ALIGN
+CHECK_FUNC_ALIGN,#defined(CHECK_FUNC_ALIGN),,CHECK_FUNC_ALIGN
+CHECK_FUNC_NONNULL,#defined(CHECK_FUNC_NONNULL)
+CHECK_STACK_ALIGN,#defined(CHECK_STACK_ALIGN),,CHECK_STACK_ALIGN
+CHECK_STACK_NONNULL,#defined(CHECK_STACK_NONNULL)
+CHECK_MPF_ALIGN,#defined(CHECK_MPF_ALIGN),,CHECK_MPF_ALIGN
+CHECK_MPF_NONNULL,#defined(CHECK_MPF_NONNULL)
 sizeof_ID,sizeof(ID)
 sizeof_uint_t,sizeof(uint_t)
 sizeof_SIZE,sizeof(SIZE)
@@ -32,6 +47,9 @@ sizeof_void_ptr,sizeof(void*)
 sizeof_VP,sizeof(void*)
 sizeof_intptr_t,sizeof(intptr_t)
 sizeof_FP,sizeof(FP)
+sizeof_INHNO,sizeof(INHNO)
+sizeof_INTNO,sizeof(INTNO)
+sizeof_EXCNO,sizeof(EXCNO)
 sizeof_TINIB,sizeof(TINIB)
 offsetof_TINIB_tskatr,"offsetof(TINIB,tskatr)"
 offsetof_TINIB_exinf,"offsetof(TINIB,exinf)"
@@ -77,6 +95,15 @@ sizeof_ALMINIB,sizeof(ALMINIB)
 offsetof_ALMINIB_almatr,"offsetof(ALMINIB,almatr)"
 offsetof_ALMINIB_exinf,"offsetof(ALMINIB,exinf)"
 offsetof_ALMINIB_almhdr,"offsetof(ALMINIB,almhdr)"
-sizeof_INHNO,sizeof(INHNO)
-sizeof_INTNO,sizeof(INTNO)
-sizeof_EXCNO,sizeof(EXCNO)
+sizeof_INHINIB,#!defined(OMIT_INITIALIZE_INTERRUPT),,sizeof(INHINIB)
+offset_INHINIB_inhno,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,inhno)"
+offset_INHINIB_inhatr,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,inhatr)"
+offset_INHINIB_int_entry,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,int_entry)"
+sizeof_INTINIB,#!defined(OMIT_INITIALIZE_INTERRUPT),,sizeof(INTINIB)
+offset_INTINIB_intno,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intno)"
+offset_INTINIB_intatr,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intatr)"
+offset_INTINIB_intpri,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intpri)"
+sizeof_EXCINIB,#!defined(OMIT_INITIALIZE_EXCEPTION),,sizeof(EXCINIB)
+offset_EXCINIB_excno,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,excno)"
+offset_EXCINIB_excatr,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,excatr)"
+offset_EXCINIB_exc_entry,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,exc_entry)"
index f1ad36a..5c70165 100644 (file)
@@ -6,6 +6,7 @@ exit_kernel
 p_runtsk
 p_schedtsk
 reqflg
+ipmflg
 disdsp
 dspflg
 ready_queue
index ebc7be5..49ae76e 100644 (file)
@@ -15,6 +15,7 @@
 #define p_runtsk                                       _kernel_p_runtsk
 #define p_schedtsk                                     _kernel_p_schedtsk
 #define reqflg                                         _kernel_reqflg
+#define ipmflg                                         _kernel_ipmflg
 #define disdsp                                         _kernel_disdsp
 #define dspflg                                         _kernel_dspflg
 #define ready_queue                                    _kernel_ready_queue
 #define _p_runtsk                                      __kernel_p_runtsk
 #define _p_schedtsk                                    __kernel_p_schedtsk
 #define _reqflg                                                __kernel_reqflg
+#define _ipmflg                                                __kernel_ipmflg
 #define _disdsp                                                __kernel_disdsp
 #define _dspflg                                                __kernel_dspflg
 #define _ready_queue                           __kernel_ready_queue
index c87fe80..cf25c78 100644 (file)
@@ -16,6 +16,7 @@
 #undef p_runtsk
 #undef p_schedtsk
 #undef reqflg
+#undef ipmflg
 #undef disdsp
 #undef dspflg
 #undef ready_queue
 #undef _p_runtsk
 #undef _p_schedtsk
 #undef _reqflg
+#undef _ipmflg
 #undef _disdsp
 #undef _dspflg
 #undef _ready_queue
index 1e3ff37..6adda18 100644 (file)
@@ -3,7 +3,7 @@
  *      Toyohashi Open Platform for Embedded Real-Time Systems/
  *      Advanced Standard Profile Kernel
  * 
- *  Copyright (C) 2005-2009 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -35,7 +35,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: mutex.h 1694 2010-01-01 15:59:09Z ertl-hiro $
+ *  @(#) $Id: mutex.h 1910 2010-08-25 06:30:21Z ertl-hiro $
  */
 
 /*
@@ -154,10 +154,10 @@ extern bool_t     mutex_release(MTXCB *p_mtxcb);
  *  態のタスクがある場合には,そのタスクにミューテックスをロックさせる.
  *
  *  この関数は,タスクの終了時に使われるものであるため,p_tcbで指定され
- *  ã\82\8bã\82¿ã\82¹ã\82¯ã\81®å\84ªå\85\88度ã\82\92å¤\89æ\9b´ã\81\99ã\82\8bå\87¦ç\90\86ã\81¯è¡\8cã\82\8fã\81ªã\81\84ï¼\8eã\81\93ã\81®é\96¢æ\95°ã\81®ä¸­ã\81§ã\82¿ã\82¹ã\82¯ã\81®å\84ª
- *  先度が変化し,実行すべきタスクが変わることがある.そのため,この関
- *  数から戻った後に,ディスパッチが必要か判別して,必要な場合にはディ
- *  スパッチを行わなければならない.
+ *  ã\82\8bã\82¿ã\82¹ã\82¯ã\81®å\84ªå\85\88度ã\82\92å¤\89æ\9b´ã\81\99ã\82\8bå\87¦ç\90\86ã\81¯è¡\8cã\82\8fã\81ªã\81\84ï¼\8eã\81\9fã\81 ã\81\97ï¼\8cã\81\93ã\81®é\96¢æ\95°ã\81®ä¸­ã\81§ä»\96
+ *  のタスクの優先度が変化し,実行すべきタスクが変わることがある.その
+ *  ため,この関数から戻った後に,ディスパッチが必要か判別して,必要な
+ *  場合にはディスパッチを行わなければならない.
  */
 extern bool_t  (*mtxhook_release_all)(TCB *p_tcb);
 extern bool_t  mutex_release_all(TCB *p_tcb);
index 4138ce0..62fec77 100644 (file)
@@ -5,7 +5,7 @@
  * 
  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
  *                              Toyohashi Univ. of Technology, JAPAN
- *  Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: sys_manage.c 762 2008-03-07 23:51:41Z hiro $
+ *  @(#) $Id: sys_manage.c 2018 2010-12-31 13:43:05Z ertl-hiro $
  */
 
 /*
@@ -428,7 +428,7 @@ ena_dsp(void)
 
        t_lock_cpu();
        disdsp = false;
-       if (t_get_ipm() == TIPM_ENAALL) {
+       if (ipmflg) {
                dspflg = true;
                if (p_runtsk != p_schedtsk) {
                        dispatch();
index 3ca2d32..0bf3bbb 100644 (file)
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  $Id: task.c 1812 2010-06-27 13:07:15Z ertl-hiro $
+ *  $Id: task.c 2018 2010-12-31 13:43:05Z ertl-hiro $
  */
 
 /*
@@ -77,6 +77,11 @@ TCB          *p_schedtsk;
 bool_t reqflg;
 
 /*
+ *  割込み優先度マスク全解除状態
+ */
+bool_t ipmflg;
+
+/*
  *  ディスパッチ禁止状態
  */
 bool_t disdsp;
@@ -107,6 +112,7 @@ initialize_task(void)
 
        p_runtsk = p_schedtsk = NULL;
        reqflg = false;
+       ipmflg = true;
        disdsp = false;
        dspflg = true;
 
@@ -145,8 +151,8 @@ initialize_task(void)
  *  サーチ方向が逆などの理由で優先度とビットとの対応を変更したい場合に
  *  は,PRIMAP_BITをマクロ定義すればよい.
  *
- *  また,標準ライブラリにffsがあるなら,次のように定義して標準ライブ
- *  ラリを使った方が効率が良い可能性もある.
+ *  また,ライブラリにffsがあるなら,次のように定義してライブラリ関数を
+ *  使った方が効率が良い可能性もある.
  *             #define bitmap_search(bitmap) (ffs(bitmap) - 1)
  */
 #ifndef PRIMAP_BIT
@@ -430,12 +436,9 @@ void
 call_texrtn(void)
 {
        TEXPTN  texptn;
-       PRI             saved_ipm;
-       bool_t  saved_disdsp, saved_dspflg;
+       bool_t  saved_disdsp;
 
-       saved_ipm = t_get_ipm();
        saved_disdsp = disdsp;
-       saved_dspflg = dspflg;
        p_runtsk->enatex = false;
        do {
                texptn = p_runtsk->texptn;
@@ -449,19 +452,17 @@ call_texrtn(void)
                if (!t_sense_lock()) {
                        t_lock_cpu();
                }
-               t_set_ipm(saved_ipm);
+               if (!ipmflg) {
+                       t_set_ipm(TIPM_ENAALL);
+                       ipmflg = true;
+               }
                disdsp = saved_disdsp;
-               dspflg = saved_dspflg;
-               /*
-                *  ここでp_runtsk->enatexをfalseにするのは,タスク例外処理ルー
-                *  チンから,タスク例外処理許可状態のままリターンした場合の対
-                *  策である.
-                */
+               dspflg = !disdsp;
                p_runtsk->enatex = false;
                if (p_runtsk != p_schedtsk && dspflg) {
                        /*
                         *  ここでdispatchを呼び出す処理は,相互再帰呼出しになって
-                        *  いるが,dispatchを呼ぶ前にp_runtsk->enatexをflaseにして
+                        *  いるが,dispatchを呼ぶ前にp_runtsk->enatexをfalseにして
                         *  おけば支障がない.その理由については,「TOPPERS/ASP カー
                         *  ネル 設計メモ」を参照のこと.
                         */
@@ -479,7 +480,7 @@ call_texrtn(void)
 void
 calltex(void)
 {
-       if (p_runtsk->enatex && p_runtsk->texptn != 0U) {
+       if (p_runtsk->enatex && p_runtsk->texptn != 0U && ipmflg) {
                call_texrtn();
        }
 }
index fc494d9..eea94a5 100644 (file)
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  $Id: task.h 1863 2010-07-25 12:23:05Z ertl-hiro $
+ *  $Id: task.h 2018 2010-12-31 13:43:05Z ertl-hiro $
  */
 
 /*
@@ -293,6 +293,13 @@ extern TCB *p_schedtsk;
 extern bool_t  reqflg;
 
 /*
+ *  割込み優先度マスク全解除状態
+ *
+ *  割込み優先度マスク全解除状態であることを示すフラグ.
+ */
+extern bool_t  ipmflg;
+
+/*
  *  ディスパッチ禁止状態
  *
  *  ディスパッチ禁止状態であることを示すフラグ.
index 4e023a5..23a11a4 100644 (file)
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: task_manage.c 1694 2010-01-01 15:59:09Z ertl-hiro $
+ *  @(#) $Id: task_manage.c 2018 2010-12-31 13:43:05Z ertl-hiro $
  */
 
 /*
@@ -253,13 +253,14 @@ ext_tsk(void)
                 */
                disdsp = false;
        }
-       if (t_get_ipm() != TIPM_ENAALL) {
+       if (!ipmflg) {
                /*
                 *  割込み優先度マスク(IPM)がTIPM_ENAALL以外の状態でext_tsk
                 *  が呼ばれた場合は,IPMをTIPM_ENAALLにしてからタスクを終了す
                 *  る.
                 */
                t_set_ipm(TIPM_ENAALL);
+               ipmflg = true;
        }
        dspflg = true;
 
@@ -273,7 +274,7 @@ ext_tsk(void)
                (void) make_active(p_runtsk);
        }
        exit_and_dispatch();
-       return(E_SYS);
+       ercd = E_SYS;
 
   error_exit:
        LOG_EXT_TSK_LEAVE(ercd);
@@ -344,7 +345,7 @@ ter_tsk(ID tskid)
 #endif /* TOPPERS_ter_tsk */
 
 /*
- *  タスク優先度の変更
+ *  タスクのベース優先度の変更
  */
 #ifdef TOPPERS_chg_pri
 
index c80359e..bf849ae 100644 (file)
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: kernel.h 1862 2010-07-25 11:49:51Z ertl-hiro $
+ *  @(#) $Id: kernel.h 1959 2010-11-20 02:17:27Z ertl-hiro $
  */
 
 /*
@@ -469,8 +469,8 @@ extern bool_t       xsns_xpn(void *p_excinf) throw();
  */
 #define TKERNEL_MAKER  UINT_C(0x0118)  /* カーネルのメーカーコード */
 #define TKERNEL_PRID   UINT_C(0x0007)  /* カーネルの識別番号 */
-#define TKERNEL_SPVER  UINT_C(0xf512)  /* カーネル仕様のバージョン番号 */
-#define TKERNEL_PRVER  UINT_C(0x1060)  /* カーネルのバージョン番号 */
+#define TKERNEL_SPVER  UINT_C(0xf513)  /* カーネル仕様のバージョン番号 */
+#define TKERNEL_PRVER  UINT_C(0x1070)  /* カーネルのバージョン番号 */
 
 /*
  *  キューイング回数の最大値
index 86257aa..03ba8ad 100644 (file)
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: check.h 1717 2010-01-31 11:41:03Z ertl-hiro $
+ *  @(#) $Id: check.h 1965 2010-11-20 07:22:43Z ertl-hiro $
  */
 
 /*
@@ -94,7 +94,7 @@
 /*
  *  割込み優先度のチェック(E_PAR)
  */
-#define CHECK_INTPRI_CHGIPM(inttpri) {                                         \
+#define CHECK_INTPRI_CHGIPM(intpri) {                                          \
        if (!VALID_INTPRI_CHGIPM(intpri)) {                                             \
                ercd = E_PAR;                                                                           \
                goto error_exit;                                                                        \
index 036c852..6d82a88 100644 (file)
@@ -5,7 +5,7 @@ $       Toyohashi Open Platform for Embedded Real-Time Systems/
 $       Advanced Standard Profile Kernel
 $ 
 $   Copyright (C) 2007 by TAKAGI Nobuhisa
-$   Copyright (C) 2007-2010 by Embedded and Real-Time Systems Laboratory
+$   Copyright (C) 2007-2011 by Embedded and Real-Time Systems Laboratory
 $               Graduate School of Information Science, Nagoya Univ., JAPAN
 $  
 $   上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -37,7 +37,7 @@ $   に対する適合性も含めて,いかなる保証も行わない.ま
 $   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
 $   の責任を負わない.
 $ 
-$   $Id: kernel.tf 1845 2010-07-11 13:02:57Z ertl-hiro $
+$   $Id: kernel.tf 2024 2011-01-02 08:59:23Z ertl-hiro $
 $  
 $ =====================================================================
 
@@ -181,7 +181,7 @@ $NL$
 
 $ タスクが1個以上存在することのチェック
 $IF !LENGTH(TSK.ID_LIST)$
-       $ERROR$$FORMAT("no task is registered")$$END$
+       $ERROR$$FORMAT(_("no task is registered"))$$END$
 $END$
 
 $ タスクID番号の最大値
@@ -191,7 +191,7 @@ $NL$
 $ エラーチェック
 $FOREACH tskid TSK.ID_LIST$
 $      // tskatrが([TA_ACT])でない場合(E_RSATR)
-       $IF (TSK.TSKATR[tskid] & ~(TA_ACT|ALT(TARGET_TSKATR,0))) != 0$
+       $IF (TSK.TSKATR[tskid] & ~(TA_ACT|TARGET_TSKATR)) != 0$
                $ERROR TSK.TEXT_LINE[tskid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "tskatr", TSK.TSKATR[tskid], tskid, "CRE_TSK")$$END$
        $END$
 
@@ -209,12 +209,12 @@ $END$
 $ スタック領域の生成とそれに関するエラーチェック
 $FOREACH tskid TSK.ID_LIST$
 $      // stkszが0か,ターゲット定義の最小値(TARGET_MIN_STKSZ)よりも小さい場合(E_PAR)
-       $IF TSK.STKSZ[tskid] == 0 || (LENGTH(TARGET_MIN_STKSZ) && 
-                                                                               TSK.STKSZ[tskid] < TARGET_MIN_STKSZ)$
+       $IF TSK.STKSZ[tskid] == 0 || (TARGET_MIN_STKSZ
+                                                                       && TSK.STKSZ[tskid] < TARGET_MIN_STKSZ)$
                $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is too small"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$$END$
        $END$
 $      // stkszがスタック領域のサイズとして正しくない場合(E_PAR)
-       $IF !EQ(TSK.STK[tskid], "NULL") && LENGTH(CHECK_STKSZ_ALIGN)
+       $IF !EQ(TSK.STK[tskid], "NULL") && CHECK_STKSZ_ALIGN
                                                        && (TSK.STKSZ[tskid] & (CHECK_STKSZ_ALIGN - 1))$
                $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$$END$
        $END$
@@ -236,10 +236,10 @@ $JOINEACH tskid TSK.ID_LIST ",\n"$
 $      // タスク属性,拡張情報,起動番地,起動時優先度
        $TAB${
        $SPC$($TSK.TSKATR[tskid]$), (intptr_t)($TSK.EXINF[tskid]$),
-       $SPC$($TSK.TASK[tskid]$), INT_PRIORITY($TSK.ITSKPRI[tskid]$),
+       $SPC$((TASK)($TSK.TASK[tskid]$)), INT_PRIORITY($TSK.ITSKPRI[tskid]$),
 
 $      // タスク初期化コンテキストブロック,スタック領域
-       $IF ALT(USE_TSKINICTXB,0)$
+       $IF USE_TSKINICTXB$
                $GENERATE_TSKINICTXB(tskid)$
        $ELSE$
                $SPC$$TSK.TINIB_STKSZ[tskid]$, $TSK.TINIB_STK[tskid]$,
@@ -251,7 +251,7 @@ $END$$NL$
 };$NL$
 $NL$
 
-$ タスクコントロールブロックの生成
+$ タスク管理ブロックの生成
 TCB _kernel_tcb_table[TNUM_TSKID];$NL$
 $NL$
 
@@ -298,13 +298,12 @@ $         // セマフォ初期化ブロック
        };$NL$
        $NL$
 
-$      // セマフォコントロールブロック
+$      // セマフォ管理ブロック
        SEMCB _kernel_semcb_table[TNUM_SEMID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const SEMINIB, _kernel_seminib_table);$NL$
        TOPPERS_EMPTY_LABEL(SEMCB, _kernel_semcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  イベントフラグ
@@ -333,13 +332,12 @@ $         // イベントフラグ初期化ブロック
        };$NL$
        $NL$
 
-$      // イベントフラグコントロールブロック
+$      // イベントフラグ管理ブロック
        FLGCB _kernel_flgcb_table[TNUM_FLGID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const FLGINIB, _kernel_flginib_table);$NL$
        TOPPERS_EMPTY_LABEL(FLGCB, _kernel_flgcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  データキュー
@@ -365,9 +363,9 @@ $           // dtqmbがNULLでない場合(E_NOSPT)
                        $ERROR DTQ.TEXT_LINE[dtqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "dtqmb", DTQ.DTQMB[dtqid], dtqid, "CRE_DTQ")$$END$
                $END$
 
-$              // データキュー領域
+$              // データキュー管理領域
                $IF DTQ.DTQCNT[dtqid]$
-                       static intptr_t _kernel_dtqmb_$dtqid$[$DTQ.DTQCNT[dtqid]$];$NL$
+                       static DTQMB _kernel_dtqmb_$dtqid$[$DTQ.DTQCNT[dtqid]$];$NL$
                $END$
        $END$
 
@@ -379,13 +377,12 @@ $ // データキュー初期化ブロックの生成
        };$NL$
        $NL$
 
-$      // データキューコントロールブロック
+$      // データキュー管理ブロック
        DTQCB _kernel_dtqcb_table[TNUM_DTQID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const DTQINIB, _kernel_dtqinib_table);$NL$
        TOPPERS_EMPTY_LABEL(DTQCB, _kernel_dtqcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  優先度データキュー
@@ -416,7 +413,7 @@ $           // pdqmbがNULLでない場合(E_NOSPT)
                        $ERROR PDQ.TEXT_LINE[pdqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "pdqmb", PDQ.PDQMB[pdqid], pdqid, "CRE_PDQ")$$END$
                $END$
 
-$              // 優先度データキュー領域
+$              // 優先度データキュー管理領域
                $IF PDQ.PDQCNT[pdqid]$
                        static PDQMB _kernel_pdqmb_$pdqid$[$PDQ.PDQCNT[pdqid]$];$NL$
                $END$
@@ -430,13 +427,12 @@ $ // 優先度データキュー初期化ブロックの生成
        };$NL$
        $NL$
 
-$      // 優先度データキューコントロールブロック
+$      // 優先度データキュー管理ブロック
        PDQCB _kernel_pdqcb_table[TNUM_PDQID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const PDQINIB, _kernel_pdqinib_table);$NL$
        TOPPERS_EMPTY_LABEL(PDQCB, _kernel_pdqcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  メールボックス
@@ -475,13 +471,12 @@ $         // メールボックス初期化ブロック
        };$NL$
        $NL$
 
-$      // メールボックスコントロールブロック
+$      // メールボックス管理ブロック
        MBXCB _kernel_mbxcb_table[TNUM_MBXID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const MBXINIB, _kernel_mbxinib_table);$NL$
        TOPPERS_EMPTY_LABEL(MBXCB, _kernel_mbxcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  固定長メモリプール
@@ -534,13 +529,12 @@ $ // 固定長メモリプール初期化ブロックの生成
        };$NL$
        $NL$
 
-$      // 固定長メモリプールコントロールブロック
+$      // 固定長メモリプール管理ブロック
        MPFCB _kernel_mpfcb_table[TNUM_MPFID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const MPFINIB, _kernel_mpfinib_table);$NL$
        TOPPERS_EMPTY_LABEL(MPFCB, _kernel_mpfcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  周期ハンドラ
@@ -584,13 +578,12 @@ $         // 周期ハンドラ初期化ブロック
        };$NL$
        $NL$
 
-$      // 周期ハンドラコントロールブロック
+$      // 周期ハンドラ管理ブロック
        CYCCB _kernel_cyccb_table[TNUM_CYCID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const CYCINIB, _kernel_cycinib_table);$NL$
        TOPPERS_EMPTY_LABEL(CYCCB, _kernel_cyccb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  アラームハンドラ
@@ -619,13 +612,12 @@ $         // アラームハンドラ初期化ブロック
        };$NL$
        $NL$
 
-$      // アラームハンドラコントロールブロック
+$      // アラームハンドラ管理ブロック
        ALMCB _kernel_almcb_table[TNUM_ALMID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const ALMINIB, _kernel_alminib_table);$NL$
        TOPPERS_EMPTY_LABEL(ALMCB, _kernel_almcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  オーバランハンドラ
@@ -690,7 +682,7 @@ $   // intnoがCFG_INTによって設定済みの場合(E_OBJ)
        $END$
 
 $      // intatrが([TA_ENAINT]|[TA_EDGE])でない場合(E_RSATR)
-       $IF (INT.INTATR[intno] & ~(TA_ENAINT|TA_EDGE|ALT(TARGET_INTATR,0))) != 0$
+       $IF (INT.INTATR[intno] & ~(TA_ENAINT|TA_EDGE|TARGET_INTATR)) != 0$
                $ERROR INT.TEXT_LINE[intno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "intatr", INT.INTATR[intno], "intno", INT.INTNO[intno], "CFG_INT")$$END$
        $END$
 
@@ -735,7 +727,7 @@ $   // inhnoがDEF_INHによって設定済みの場合(E_OBJ)
        $END$
 
 $      // inhatrが(TA_NULL)でない場合(E_RSATR)
-       $IF (INH.INHATR[inhno] & ~ALT(TARGET_INHATR,0)) != 0$
+       $IF (INH.INHATR[inhno] & ~TARGET_INHATR) != 0$
                $ERROR INH.TEXT_LINE[inhno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "inhatr", INH.INHATR[inhno], "inhno", INH.INHNO[inhno], "DEF_INH")$$END$
        $END$
 
@@ -757,25 +749,23 @@ $ // が指定されていない場合(E_RSATR)
 
        $IF LENGTH(INTNO[INH.INHNO[inhno]])$
                $intno = INTNO[INH.INHNO[inhno]]$
-               $IF LENGTH(FIND(INTNO_CFGINT_VALID, intno))$
-$                      // inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)
-                       $IF !LENGTH(INT.INTNO[intno])$
-                               $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' corresponding to %3% `%4%\' is not configured with %5%"), "intno", INT.INTNO[intno], "inhno", INH.INHNO[inhno], "CFG_INT")$$END$
+$              // inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)
+               $IF !LENGTH(INT.INTNO[intno])$
+                       $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' corresponding to %3% `%4%\' is not configured with %5%"), "intno", INT.INTNO[intno], "inhno", INH.INHNO[inhno], "CFG_INT")$$END$
+               $ELSE$
+                       $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
+$                              // inhatrにTA_NONKERNELが指定されておらず,inhnoに対応
+$                              // するintnoに対してCFG_INTで設定された割込み優先度が
+$                              // TMIN_INTPRIよりも小さい場合(E_OBJ)
+                               $IF INT.INTPRI[intno] < TMIN_INTPRI$
+                                       $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
+                               $END$
                        $ELSE$
-                               $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
-$                                      // inhatrにTA_NONKERNELが指定されておらず,inhnoに対応
-$                                      // するintnoに対してCFG_INTで設定された割込み優先度が
-$                                      // TMIN_INTPRIよりも小さい場合(E_OBJ)
-                                       $IF INT.INTPRI[intno] < TMIN_INTPRI$
-                                               $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
-                                       $END$
-                               $ELSE$
-$                                      // inhatrにTA_NONKERNELが指定されており,inhnoに対応
-$                                      // するintnoに対してCFG_INTで設定された割込み優先度が
-$                                      // TMIN_INTPRI以上である場合(E_OBJ)
-                                       $IF INT.INTPRI[intno] >= TMIN_INTPRI$
-                                               $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is lower than or equal to %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
-                                       $END$
+$                              // inhatrにTA_NONKERNELが指定されており,inhnoに対応
+$                              // するintnoに対してCFG_INTで設定された割込み優先度が
+$                              // TMIN_INTPRI以上である場合(E_OBJ)
+                               $IF INT.INTPRI[intno] >= TMIN_INTPRI$
+                                       $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is lower than or equal to %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
                                $END$
                        $END$
                $END$
@@ -786,8 +776,8 @@ $END$
 $ 割込みサービスルーチン(ISR)に関するエラーチェックと割込みハンドラの生成
 $FOREACH order ISR.ORDER_LIST$
 $      // isratrが(TA_NULL)でない場合(E_RSATR)
-       $IF (ISR.ISRATR[order] & ~ALT(TARGET_ISRATR,0)) != 0$
-               $ERROR ISR.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "isratr", ISR.ISRATR[order], "isr", ISR.ISR[order], "ATT_ISR")$$END$
+       $IF (ISR.ISRATR[order] & ~TARGET_ISRATR) != 0$
+               $ERROR ISR.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "isratr", ISR.ISRATR[order], "ATT_ISR")$$END$
        $END$
 
 $      // intnoがATT_ISRに対する割込み番号として正しくない場合(E_PAR)
@@ -865,7 +855,7 @@ $
 $  割込み管理機能のための標準的な初期化情報の生成
 $ 
 $ 割込みハンドラの初期化に必要な情報
-$IF !ALT(OMIT_INITIALIZE_INTERRUPT,0) || ALT(USE_INHINIB_TABLE,0)$
+$IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INHINIB_TABLE,0)$
 
 $ 割込みハンドラ数
 #define TNUM_INHNO     $LENGTH(INH.ORDER_LIST)$$NL$
@@ -891,12 +881,11 @@ $IF LENGTH(INH.ORDER_LIST)$
        };$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const INHINIB, _kernel_inhinib_table);$NL$
-$END$
-$NL$
+$END$$NL$
 $END$
 
 $ 割込み要求ラインの初期化に必要な情報
-$IF !ALT(OMIT_INITIALIZE_INTERRUPT,0) || ALT(USE_INHINTB_TABLE,0)$
+$IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INHINTB_TABLE,0)$
 
 $ 割込み要求ライン数
 #define TNUM_INTNO     $LENGTH(INT.ORDER_LIST)$$NL$
@@ -912,8 +901,7 @@ $IF LENGTH(INT.ORDER_LIST)$
        };$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const INTINIB, _kernel_intinib_table);$NL$
-$END$
-$NL$
+$END$$NL$
 $END$
 
 $ 
@@ -942,14 +930,14 @@ $ // excnoがDEF_EXCによって設定済みの場合(E_OBJ)
        $END$
 
 $      // excatrが(TA_NULL)でない場合(E_RSATR)
-       $IF (EXC.EXCATR[excno] & ~ALT(TARGET_EXCATR,0)) != 0$
+       $IF (EXC.EXCATR[excno] & ~TARGET_EXCATR) != 0$
                $ERROR EXC.TEXT_LINE[excno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "excatr", EXC.EXCATR[excno], "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$
        $END$
        $i = i + 1$
 $END$
 
 $ CPU例外ハンドラのための標準的な初期化情報の生成
-$IF !ALT(OMIT_INITIALIZE_EXCEPTION,0)$
+$IF !OMIT_INITIALIZE_EXCEPTION$
 
 $ CPU例外ハンドラ数
 #define TNUM_EXCNO     $LENGTH(EXC.ORDER_LIST)$$NL$
@@ -969,8 +957,7 @@ $IF LENGTH(EXC.ORDER_LIST)$
        };$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const EXCINIB, _kernel_excinib_table);$NL$
-$END$
-$NL$
+$END$$NL$
 $END$
 
 $ 
@@ -1003,7 +990,7 @@ $  // 静的API「DEF_ICS」が複数ある(E_OBJ)
        $END$
 
 $      // istkszがスタック領域のサイズとして正しくない場合(E_PAR)
-       $IF !EQ(ICS.ISTK[1], "NULL") && LENGTH(CHECK_STKSZ_ALIGN)
+       $IF !EQ(ICS.ISTK[1], "NULL") && CHECK_STKSZ_ALIGN
                                                        && (ICS.ISTKSZ[1] & (CHECK_STKSZ_ALIGN - 1))$
                $ERROR ICS.TEXT_LINE[1]$E_PAR: $FORMAT(_("%1% `%2%\' in %3% is not aligned"), "istksz", ICS.ISTKSZ[1], "DEF_ICS")$$END$
        $END$
@@ -1058,7 +1045,9 @@ $IF LENGTH(MBX.ID_LIST)$  _kernel_initialize_mailbox();$NL$$END$
 $IF LENGTH(MPF.ID_LIST)$       _kernel_initialize_mempfix();$NL$$END$
 $IF LENGTH(CYC.ID_LIST)$       _kernel_initialize_cyclic();$NL$$END$
 $IF LENGTH(ALM.ID_LIST)$       _kernel_initialize_alarm();$NL$$END$
+#ifdef TOPPERS_SUPPORT_OVRHDR$NL$
 $TAB$_kernel_initialize_overrun();$NL$
+#endif /* TOPPERS_SUPPORT_OVRHDR */$NL$
 $TAB$_kernel_initialize_interrupt();$NL$
 $TAB$_kernel_initialize_exception();$NL$
 }$NL$
index c7f178c..04dd583 100644 (file)
@@ -6,6 +6,7 @@ exit_kernel
 p_runtsk
 p_schedtsk
 reqflg
+ipmflg
 disdsp
 dspflg
 ready_queue
index bc4817a..25b9ab4 100644 (file)
@@ -15,6 +15,7 @@
 #define p_runtsk                                       _kernel_p_runtsk
 #define p_schedtsk                                     _kernel_p_schedtsk
 #define reqflg                                         _kernel_reqflg
+#define ipmflg                                         _kernel_ipmflg
 #define disdsp                                         _kernel_disdsp
 #define dspflg                                         _kernel_dspflg
 #define ready_queue                                    _kernel_ready_queue
 #define _p_runtsk                                      __kernel_p_runtsk
 #define _p_schedtsk                                    __kernel_p_schedtsk
 #define _reqflg                                                __kernel_reqflg
+#define _ipmflg                                                __kernel_ipmflg
 #define _disdsp                                                __kernel_disdsp
 #define _dspflg                                                __kernel_dspflg
 #define _ready_queue                           __kernel_ready_queue
index 300440d..59a5f9a 100644 (file)
@@ -16,6 +16,7 @@
 #undef p_runtsk
 #undef p_schedtsk
 #undef reqflg
+#undef ipmflg
 #undef disdsp
 #undef dspflg
 #undef ready_queue
 #undef _p_runtsk
 #undef _p_schedtsk
 #undef _reqflg
+#undef _ipmflg
 #undef _disdsp
 #undef _dspflg
 #undef _ready_queue
index 554994d..1c64ed5 100644 (file)
@@ -35,7 +35,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: overrun.c 1723 2010-01-31 13:05:57Z ertl-hiro $
+ *  @(#) $Id: overrun.c 1902 2010-08-17 22:38:52Z ertl-hiro $
  */
 
 /*
@@ -278,7 +278,7 @@ istp_ovr(ID tskid)
        i_lock_cpu();
        p_tcb->leftotm = 0U;
        ercd = E_OK;
-       t_unlock_cpu();
+       i_unlock_cpu();
 
   error_exit:
        LOG_ISTP_OVR_LEAVE(ercd);
index 7608a56..fee4a3a 100644 (file)
@@ -5,7 +5,7 @@
  * 
  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
  *                              Toyohashi Univ. of Technology, JAPAN
- *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2005-2011 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  $Id: task.c 1812 2010-06-27 13:07:15Z ertl-hiro $
+ *  $Id: task.c 2044 2011-03-06 11:48:03Z ertl-hiro $
  */
 
 /*
@@ -77,6 +77,11 @@ TCB          *p_schedtsk;
 bool_t reqflg;
 
 /*
+ *  割込み優先度マスク全解除状態
+ */
+bool_t ipmflg;
+
+/*
  *  ディスパッチ禁止状態
  */
 bool_t disdsp;
@@ -107,6 +112,7 @@ initialize_task(void)
 
        p_runtsk = p_schedtsk = NULL;
        reqflg = false;
+       ipmflg = true;
        disdsp = false;
        dspflg = true;
 
@@ -144,8 +150,8 @@ initialize_task(void)
  *  サーチ方向が逆などの理由で優先度とビットとの対応を変更したい場合に
  *  は,PRIMAP_BITをマクロ定義すればよい.
  *
- *  また,標準ライブラリにffsがあるなら,次のように定義して標準ライブ
- *  ラリを使った方が効率が良い可能性もある.
+ *  また,ライブラリにffsがあるなら,次のように定義してライブラリ関数を
+ *  使った方が効率が良い可能性もある.
  *             #define bitmap_search(bitmap) (ffs(bitmap) - 1)
  */
 #ifndef PRIMAP_BIT
@@ -302,7 +308,9 @@ make_dormant(TCB *p_tcb)
        p_tcb->wupque = false;
        p_tcb->enatex = false;
        p_tcb->texptn = 0U;
+#ifdef TOPPERS_SUPPORT_OVRTIM
        p_tcb->leftotm = 0U;
+#endif /* TOPPERS_SUPPORT_OVRTIM */
        LOG_TSKSTAT(p_tcb);
 }
 
@@ -424,12 +432,9 @@ void
 call_texrtn(void)
 {
        TEXPTN  texptn;
-       PRI             saved_ipm;
-       bool_t  saved_disdsp, saved_dspflg;
+       bool_t  saved_disdsp;
 
-       saved_ipm = t_get_ipm();
        saved_disdsp = disdsp;
-       saved_dspflg = dspflg;
        p_runtsk->enatex = false;
        do {
                texptn = p_runtsk->texptn;
@@ -443,19 +448,17 @@ call_texrtn(void)
                if (!t_sense_lock()) {
                        t_lock_cpu();
                }
-               t_set_ipm(saved_ipm);
+               if (!ipmflg) {
+                       t_set_ipm(TIPM_ENAALL);
+                       ipmflg = true;
+               }
                disdsp = saved_disdsp;
-               dspflg = saved_dspflg;
-               /*
-                *  ここでp_runtsk->enatexをfalseにするのは,タスク例外処理ルー
-                *  チンから,タスク例外処理許可状態のままリターンした場合の対
-                *  策である.
-                */
+               dspflg = !disdsp;
                p_runtsk->enatex = false;
                if (p_runtsk != p_schedtsk && dspflg) {
                        /*
                         *  ここでdispatchを呼び出す処理は,相互再帰呼出しになって
-                        *  いるが,dispatchを呼ぶ前にp_runtsk->enatexをflaseにして
+                        *  いるが,dispatchを呼ぶ前にp_runtsk->enatexをfalseにして
                         *  おけば支障がない.その理由については,「TOPPERS/ASP カー
                         *  ネル 設計メモ」を参照のこと.
                         */
@@ -473,7 +476,7 @@ call_texrtn(void)
 void
 calltex(void)
 {
-       if (p_runtsk->enatex && p_runtsk->texptn != 0U) {
+       if (p_runtsk->enatex && p_runtsk->texptn != 0U && ipmflg) {
                call_texrtn();
        }
 }
index cbf78a7..73a3700 100644 (file)
@@ -5,7 +5,7 @@
  * 
  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
  *                              Toyohashi Univ. of Technology, JAPAN
- *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2005-2011 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: task.h 1863 2010-07-25 12:23:05Z ertl-hiro $
+ *  @(#) $Id: task.h 2044 2011-03-06 11:48:03Z ertl-hiro $
  */
 
 /*
@@ -253,7 +253,9 @@ typedef struct task_control_block {
 
        TEXPTN                  texptn;                 /* 保留例外要因 */
        WINFO                   *p_winfo;               /* 待ち情報ブロックへのポインタ */
+#ifdef TOPPERS_SUPPORT_OVRTIM
        OVRTIM                  leftotm;                /* 残りプロセッサ時間 */
+#endif /* TOPPERS_SUPPORT_OVRTIM */
        TSKCTXB                 tskctxb;                /* タスクコンテキストブロック */
 } TCB;
 
@@ -289,6 +291,13 @@ extern TCB *p_schedtsk;
 extern bool_t  reqflg;
 
 /*
+ *  割込み優先度マスク全解除状態
+ *
+ *  割込み優先度マスク全解除状態であることを示すフラグ.
+ */
+extern bool_t  ipmflg;
+
+/*
  *  ディスパッチ禁止状態
  *
  *  ディスパッチ禁止状態であることを示すフラグ.
index 386df61..c148764 100644 (file)
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: task_manage.c 1717 2010-01-31 11:41:03Z ertl-hiro $
+ *  @(#) $Id: task_manage.c 2018 2010-12-31 13:43:05Z ertl-hiro $
  */
 
 /*
@@ -253,13 +253,14 @@ ext_tsk(void)
                 */
                disdsp = false;
        }
-       if (t_get_ipm() != TIPM_ENAALL) {
+       if (!ipmflg) {
                /*
                 *  割込み優先度マスク(IPM)がTIPM_ENAALL以外の状態でext_tsk
                 *  が呼ばれた場合は,IPMをTIPM_ENAALLにしてからタスクを終了す
                 *  る.
                 */
                t_set_ipm(TIPM_ENAALL);
+               ipmflg = true;
        }
        dspflg = true;
 
@@ -273,7 +274,7 @@ ext_tsk(void)
                (void) make_active(p_runtsk);
        }
        exit_and_dispatch();
-       return(E_SYS);
+       ercd = E_SYS;
 
   error_exit:
        LOG_EXT_TSK_LEAVE(ercd);
@@ -335,7 +336,7 @@ ter_tsk(ID tskid)
 #endif /* TOPPERS_ter_tsk */
 
 /*
- *  タスク優先度の変更
+ *  タスクのベース優先度の変更
  */
 #ifdef TOPPERS_chg_pri
 
index dd5ec98..aee528f 100644 (file)
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: sample1.c 1812 2010-06-27 13:07:15Z ertl-hiro $
+ *  @(#) $Id: sample1.c 1932 2010-09-19 06:57:36Z ertl-hiro $
  */
 
 /* 
@@ -145,7 +145,9 @@ void task(intptr_t exinf)
        int_t           tskno = (int_t) exinf;
        const char      *graph[] = { "|    ", "  +  ", "    *" };
        char_t          c;
+#ifdef TOPPERS_SUPPORT_OVRHDR
        T_ROVR          pk_rovr;
+#endif /* TOPPERS_SUPPORT_OVRHDR */
 
        SVC_PERROR(ena_tex());
        while (1) {
index da7e88f..647ebdc 100644 (file)
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: kernel.h 1862 2010-07-25 11:49:51Z ertl-hiro $
+ *  @(#) $Id: kernel.h 1959 2010-11-20 02:17:27Z ertl-hiro $
  */
 
 /*
@@ -451,8 +451,8 @@ extern bool_t       xsns_xpn(void *p_excinf) throw();
  */
 #define TKERNEL_MAKER  UINT_C(0x0118)  /* カーネルのメーカーコード */
 #define TKERNEL_PRID   UINT_C(0x0007)  /* カーネルの識別番号 */
-#define TKERNEL_SPVER  UINT_C(0xf512)  /* カーネル仕様のバージョン番号 */
-#define TKERNEL_PRVER  UINT_C(0x1060)  /* カーネルのバージョン番号 */
+#define TKERNEL_SPVER  UINT_C(0xf513)  /* カーネル仕様のバージョン番号 */
+#define TKERNEL_PRVER  UINT_C(0x1070)  /* カーネルのバージョン番号 */
 
 /*
  *  キューイング回数の最大値
index 0a2e2a7..2043701 100644 (file)
@@ -15,6 +15,7 @@
 #define p_runtsk                                       _kernel_p_runtsk
 #define p_schedtsk                                     _kernel_p_schedtsk
 #define reqflg                                         _kernel_reqflg
+#define ipmflg                                         _kernel_ipmflg
 #define disdsp                                         _kernel_disdsp
 #define dspflg                                         _kernel_dspflg
 #define ready_queue                                    _kernel_ready_queue
 #define _p_runtsk                                      __kernel_p_runtsk
 #define _p_schedtsk                                    __kernel_p_schedtsk
 #define _reqflg                                                __kernel_reqflg
+#define _ipmflg                                                __kernel_ipmflg
 #define _disdsp                                                __kernel_disdsp
 #define _dspflg                                                __kernel_dspflg
 #define _ready_queue                           __kernel_ready_queue
index 06dd2ed..65cdc7f 100644 (file)
@@ -16,6 +16,7 @@
 #undef p_runtsk
 #undef p_schedtsk
 #undef reqflg
+#undef ipmflg
 #undef disdsp
 #undef dspflg
 #undef ready_queue
 #undef _p_runtsk
 #undef _p_schedtsk
 #undef _reqflg
+#undef _ipmflg
 #undef _disdsp
 #undef _dspflg
 #undef _ready_queue
index 3c1cf93..9e519b2 100644 (file)
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  $Id: task.c 1812 2010-06-27 13:07:15Z ertl-hiro $
+ *  $Id: task.c 2018 2010-12-31 13:43:05Z ertl-hiro $
  */
 
 /*
@@ -77,6 +77,11 @@ TCB          *p_schedtsk;
 bool_t reqflg;
 
 /*
+ *  割込み優先度マスク全解除状態
+ */
+bool_t ipmflg;
+
+/*
  *  ディスパッチ禁止状態
  */
 bool_t disdsp;
@@ -112,6 +117,7 @@ initialize_task(void)
 
        p_runtsk = p_schedtsk = NULL;
        reqflg = false;
+       ipmflg = true;
        disdsp = false;
        dspflg = true;
 
@@ -156,8 +162,8 @@ initialize_task(void)
  *  サーチ方向が逆などの理由で優先度とビットとの対応を変更したい場合に
  *  は,PRIMAP_BITをマクロ定義すればよい.
  *
- *  また,標準ライブラリにffsがあるなら,次のように定義して標準ライブ
- *  ラリを使った方が効率が良い可能性もある.
+ *  また,ライブラリにffsがあるなら,次のように定義してライブラリ関数を
+ *  使った方が効率が良い可能性もある.
  *             #define bitmap_search(bitmap) (ffs(bitmap) - 1)
  */
 #ifndef PRIMAP_BIT
@@ -458,12 +464,9 @@ void
 call_texrtn(void)
 {
        TEXPTN  texptn;
-       PRI             saved_ipm;
-       bool_t  saved_disdsp, saved_dspflg;
+       bool_t  saved_disdsp;
 
-       saved_ipm = t_get_ipm();
        saved_disdsp = disdsp;
-       saved_dspflg = dspflg;
        p_runtsk->enatex = false;
        do {
                texptn = p_runtsk->texptn;
@@ -477,19 +480,17 @@ call_texrtn(void)
                if (!t_sense_lock()) {
                        t_lock_cpu();
                }
-               t_set_ipm(saved_ipm);
+               if (!ipmflg) {
+                       t_set_ipm(TIPM_ENAALL);
+                       ipmflg = true;
+               }
                disdsp = saved_disdsp;
-               dspflg = saved_dspflg;
-               /*
-                *  ここでp_runtsk->enatexをfalseにするのは,タスク例外処理ルー
-                *  チンから,タスク例外処理許可状態のままリターンした場合の対
-                *  策である.
-                */
+               dspflg = !disdsp;
                p_runtsk->enatex = false;
                if (p_runtsk != p_schedtsk && dspflg) {
                        /*
                         *  ここでdispatchを呼び出す処理は,相互再帰呼出しになって
-                        *  いるが,dispatchを呼ぶ前にp_runtsk->enatexをflaseにして
+                        *  いるが,dispatchを呼ぶ前にp_runtsk->enatexをfalseにして
                         *  おけば支障がない.その理由については,「TOPPERS/ASP カー
                         *  ネル 設計メモ」を参照のこと.
                         */
@@ -507,7 +508,7 @@ call_texrtn(void)
 void
 calltex(void)
 {
-       if (p_runtsk->enatex && p_runtsk->texptn != 0U) {
+       if (p_runtsk->enatex && p_runtsk->texptn != 0U && ipmflg) {
                call_texrtn();
        }
 }
index 1d1496c..3f30a8f 100644 (file)
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  $Id: task.h 1863 2010-07-25 12:23:05Z ertl-hiro $
+ *  $Id: task.h 2018 2010-12-31 13:43:05Z ertl-hiro $
  */
 
 /*
@@ -288,6 +288,13 @@ extern TCB *p_schedtsk;
 extern bool_t  reqflg;
 
 /*
+ *  割込み優先度マスク全解除状態
+ *
+ *  割込み優先度マスク全解除状態であることを示すフラグ.
+ */
+extern bool_t  ipmflg;
+
+/*
  *  ディスパッチ禁止状態
  *
  *  ディスパッチ禁止状態であることを示すフラグ.
diff --git a/asp/extension/rstr_task/include/kernel.h b/asp/extension/rstr_task/include/kernel.h
new file mode 100644 (file)
index 0000000..e668a16
--- /dev/null
@@ -0,0 +1,504 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2004-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  $Id: kernel.h 1959 2010-11-20 02:17:27Z ertl-hiro $
+ */
+
+/*
+ *             TOPPERS/ASPカーネル 標準ヘッダファイル
+ *
+ *  TOPPERS/ASPカーネルがサポートするサービスコールの宣言と,必要なデー
+ *  タ型,定数,マクロの定義を含むヘッダファイル.
+ *
+ *  アセンブリ言語のソースファイルからこのファイルをインクルードする時
+ *  は,TOPPERS_MACRO_ONLYを定義しておく.これにより,マクロ定義以外を
+ *  除くようになっている.
+ *
+ *  このファイルをインクルードする前にインクルードしておくべきファイル
+ *  はない.
+ */
+
+#ifndef TOPPERS_KERNEL_H
+#define TOPPERS_KERNEL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ *     TOPPERS共通のデータ型・定数・マクロ
+ */
+#include <t_stddef.h>
+
+/*
+ *  ターゲット依存部
+ */
+#include "target_kernel.h"
+
+#ifndef TOPPERS_MACRO_ONLY
+
+/*
+ *  データ型の定義
+ */
+
+/*
+ *  ビットパターンやオブジェクト番号の型定義
+ */
+typedef        uint_t          TEXPTN;         /* タスク例外要因のビットパターン */
+typedef        uint_t          FLGPTN;         /* イベントフラグのビットパターン */
+typedef        uint_t          INTNO;          /* 割込み番号 */
+typedef        uint_t          INHNO;          /* 割込みハンドラ番号 */
+typedef        uint_t          EXCNO;          /* CPU例外ハンドラ番号 */
+
+/*
+ *  処理単位の型定義
+ */
+typedef void   (*TASK)(intptr_t exinf);
+typedef void   (*TEXRTN)(TEXPTN texptn, intptr_t exinf);
+typedef void   (*CYCHDR)(intptr_t exinf);
+typedef void   (*ALMHDR)(intptr_t exinf);
+typedef void   (*ISR)(intptr_t exinf);
+typedef void   (*INTHDR)(void);
+typedef void   (*EXCHDR)(void *p_excinf);
+typedef void   (*INIRTN)(intptr_t exinf);
+typedef void   (*TERRTN)(intptr_t exinf);
+
+/*
+ *  メモリ領域確保のための型定義
+ */
+#ifndef TOPPERS_STK_T
+#define TOPPERS_STK_T  intptr_t
+#endif /* TOPPERS_STK_T */
+typedef        TOPPERS_STK_T   STK_T;  /* スタック領域を確保するための型 */
+
+#ifndef TOPPERS_MPF_T
+#define TOPPERS_MPF_T  intptr_t
+#endif /* TOPPERS_MPF_T */
+typedef        TOPPERS_MPF_T   MPF_T;  /* 固定長メモリプール領域を確保するための型 */
+
+/*
+ *  メッセージヘッダの型定義
+ */
+typedef        struct t_msg {                  /* メールボックスのメッセージヘッダ */
+       struct t_msg    *pk_next;
+} T_MSG;
+
+typedef        struct t_msg_pri {              /* 優先度付きメッセージヘッダ */
+       T_MSG   msgque;                         /* メッセージヘッダ */
+       PRI             msgpri;                         /* メッセージ優先度 */
+} T_MSG_PRI;
+
+/*
+ *  パケット形式の定義
+ */
+typedef struct t_rtsk {
+       STAT    tskstat;        /* タスク状態 */
+       PRI             tskpri;         /* タスクの現在優先度 */
+       PRI             tskbpri;        /* タスクのベース優先度 */
+       STAT    tskwait;        /* 待ち要因 */
+       ID              wobjid;         /* 待ち対象のオブジェクトのID */
+       TMO             lefttmo;        /* タイムアウトするまでの時間 */
+       uint_t  actcnt;         /* 起動要求キューイング数 */
+       uint_t  wupcnt;         /* 起床要求キューイング数 */
+} T_RTSK;
+
+typedef struct t_rtex {
+       STAT    texstat;        /* タスク例外処理の状態 */
+       TEXPTN  pndptn;         /* 保留例外要因 */
+} T_RTEX;
+
+typedef struct t_rsem {
+       ID              wtskid;         /* セマフォの待ち行列の先頭のタスクのID番号 */
+       uint_t  semcnt;         /* セマフォの現在の資源数 */
+} T_RSEM;
+
+typedef struct t_rflg {
+       ID              wtskid;         /* イベントフラグの待ち行列の先頭のタスクのID番号 */
+       FLGPTN  flgptn;         /* イベントフラグの現在のビットパターン */
+} T_RFLG;
+
+typedef struct t_rdtq {
+       ID              stskid;         /* データキューの送信待ち行列の先頭のタスクのID番号 */
+       ID              rtskid;         /* データキューの受信待ち行列の先頭のタスクのID番号 */
+       uint_t  sdtqcnt;        /* データキュー管理領域に格納されているデータの数 */
+} T_RDTQ;
+
+typedef struct t_rpdq {
+       ID              stskid;         /* 優先度データキューの送信待ち行列の先頭のタスク
+                                                  のID番号 */
+       ID              rtskid;         /* 優先度データキューの受信待ち行列の先頭のタスク
+                                                  のID番号 */
+       uint_t  spdqcnt;        /* 優先度データキュー管理領域に格納されているデー
+                                                  タの数 */
+} T_RPDQ;
+
+typedef struct t_rmbx {
+       ID              wtskid;         /* メールボックスの待ち行列の先頭のタスクのID番号 */
+       T_MSG   *pk_msg;        /* メッセージキューの先頭につながれたメッセージ
+                                                  の先頭番地 */
+} T_RMBX;
+
+typedef struct t_rmpf {
+       ID              wtskid;         /* 固定長メモリプールの待ち行列の先頭のタスクの
+                                                  ID番号 */
+       uint_t  fblkcnt;        /* 固定長メモリプール領域の空きメモリ領域に割り
+                                                  付けることができる固定長メモリブロックの数 */
+} T_RMPF;
+
+typedef struct t_rcyc {
+       STAT    cycstat;        /* 周期ハンドラの動作状態 */
+       RELTIM  lefttim;        /* 次に周期ハンドラを起動する時刻までの相対時間 */
+} T_RCYC;
+
+typedef struct t_ralm {
+       STAT    almstat;        /* アラームハンドラの動作状態 */
+       RELTIM  lefttim;        /* アラームハンドラを起動する時刻までの相対時間 */
+} T_RALM;
+
+/*
+ *  サービスコールの宣言
+ */
+
+/*
+ *  タスク管理機能
+ */
+extern ER              act_tsk(ID tskid) throw();
+extern ER              iact_tsk(ID tskid) throw();
+extern ER_UINT can_act(ID tskid) throw();
+extern ER              ext_tsk(void) throw();
+extern ER              ter_tsk(ID tskid) throw();
+extern ER              chg_pri(ID tskid, PRI tskpri) throw();
+extern ER              ras_pri(PRI tskpri) throw();
+extern ER              get_pri(ID tskid, PRI *p_tskpri) throw();
+extern ER              get_inf(intptr_t *p_exinf) throw();
+extern ER              ref_tsk(ID tskid, T_RTSK *pk_rtsk) throw();
+
+/*
+ *  タスク付属同期機能
+ */
+extern ER              slp_tsk(void) throw();
+extern ER              tslp_tsk(TMO tmout) throw();
+extern ER              wup_tsk(ID tskid) throw();
+extern ER              iwup_tsk(ID tskid) throw();
+extern ER_UINT can_wup(ID tskid) throw();
+extern ER              rel_wai(ID tskid) throw();
+extern ER              irel_wai(ID tskid) throw();
+extern ER              sus_tsk(ID tskid) throw();
+extern ER              rsm_tsk(ID tskid) throw();
+extern ER              dly_tsk(RELTIM dlytim) throw();
+
+/*
+ *  タスク例外処理機能
+ */
+extern ER              ras_tex(ID tskid, TEXPTN rasptn) throw();
+extern ER              iras_tex(ID tskid, TEXPTN rasptn) throw();
+extern ER              dis_tex(void) throw();
+extern ER              ena_tex(void) throw();
+extern bool_t  sns_tex(void) throw();
+extern ER              ref_tex(ID tskid, T_RTEX *pk_rtex) throw();
+
+/*
+ *  同期・通信機能
+ */
+extern ER              sig_sem(ID semid) throw();
+extern ER              isig_sem(ID semid) throw();
+extern ER              wai_sem(ID semid) throw();
+extern ER              pol_sem(ID semid) throw();
+extern ER              twai_sem(ID semid, TMO tmout) throw();
+extern ER              ini_sem(ID semid) throw();
+extern ER              ref_sem(ID semid, T_RSEM *pk_rsem) throw();
+
+extern ER              set_flg(ID flgid, FLGPTN setptn) throw();
+extern ER              iset_flg(ID flgid, FLGPTN setptn) throw();
+extern ER              clr_flg(ID flgid, FLGPTN clrptn) throw();
+extern ER              wai_flg(ID flgid, FLGPTN waiptn,
+                                               MODE wfmode, FLGPTN *p_flgptn) throw();
+extern ER              pol_flg(ID flgid, FLGPTN waiptn,
+                                               MODE wfmode, FLGPTN *p_flgptn) throw();
+extern ER              twai_flg(ID flgid, FLGPTN waiptn,
+                                               MODE wfmode, FLGPTN *p_flgptn, TMO tmout) throw();
+extern ER              ini_flg(ID flgid) throw();
+extern ER              ref_flg(ID flgid, T_RFLG *pk_rflg) throw();
+
+extern ER              snd_dtq(ID dtqid, intptr_t data) throw();
+extern ER              psnd_dtq(ID dtqid, intptr_t data) throw();
+extern ER              ipsnd_dtq(ID dtqid, intptr_t data) throw();
+extern ER              tsnd_dtq(ID dtqid, intptr_t data, TMO tmout) throw();
+extern ER              fsnd_dtq(ID dtqid, intptr_t data) throw();
+extern ER              ifsnd_dtq(ID dtqid, intptr_t data) throw();
+extern ER              rcv_dtq(ID dtqid, intptr_t *p_data) throw();
+extern ER              prcv_dtq(ID dtqid, intptr_t *p_data) throw();
+extern ER              trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout) throw();
+extern ER              ini_dtq(ID dtqid) throw();
+extern ER              ref_dtq(ID dtqid, T_RDTQ *pk_rdtq) throw();
+
+extern ER              snd_pdq(ID pdqid, intptr_t data, PRI datapri) throw();
+extern ER              psnd_pdq(ID pdqid, intptr_t data, PRI datapri) throw();
+extern ER              ipsnd_pdq(ID pdqid, intptr_t data, PRI datapri) throw();
+extern ER              tsnd_pdq(ID pdqid, intptr_t data,
+                                                                               PRI datapri, TMO tmout) throw();
+extern ER              rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri) throw();
+extern ER              prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri) throw();
+extern ER              trcv_pdq(ID pdqid, intptr_t *p_data,
+                                                                               PRI *p_datapri, TMO tmout) throw();
+extern ER              ini_pdq(ID pdqid) throw();
+extern ER              ref_pdq(ID pdqid, T_RPDQ *pk_rpdq) throw();
+
+extern ER              snd_mbx(ID mbxid, T_MSG *pk_msg) throw();
+extern ER              rcv_mbx(ID mbxid, T_MSG **ppk_msg) throw();
+extern ER              prcv_mbx(ID mbxid, T_MSG **ppk_msg) throw();
+extern ER              trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout) throw();
+extern ER              ini_mbx(ID mbxid) throw();
+extern ER              ref_mbx(ID mbxid, T_RMBX *pk_rmbx) throw();
+
+/*
+ *  メモリプール管理機能
+ */
+extern ER              get_mpf(ID mpfid, void **p_blk) throw();
+extern ER              pget_mpf(ID mpfid, void **p_blk) throw();
+extern ER              tget_mpf(ID mpfid, void **p_blk, TMO tmout) throw();
+extern ER              rel_mpf(ID mpfid, void *blk) throw();
+extern ER              ini_mpf(ID mpfid) throw();
+extern ER              ref_mpf(ID mpfid, T_RMPF *pk_rmpf) throw();
+
+/*
+ *  時間管理機能
+ */
+extern ER              get_tim(SYSTIM *p_systim) throw();
+extern ER              get_utm(SYSUTM *p_sysutm) throw();
+
+extern ER              sta_cyc(ID cycid) throw();
+extern ER              stp_cyc(ID cycid) throw();
+extern ER              ref_cyc(ID cycid, T_RCYC *pk_rcyc) throw();
+
+extern ER              sta_alm(ID almid, RELTIM almtim) throw();
+extern ER              ista_alm(ID almid, RELTIM almtim) throw();
+extern ER              stp_alm(ID almid) throw();
+extern ER              istp_alm(ID almid) throw();
+extern ER              ref_alm(ID almid, T_RALM *pk_ralm) throw();
+
+/*
+ *  システム状態管理機能
+ */
+extern ER              rot_rdq(PRI tskpri) throw();
+extern ER              irot_rdq(PRI tskpri) throw();
+extern ER              get_tid(ID *p_tskid) throw();
+extern ER              iget_tid(ID *p_tskid) throw();
+extern ER              loc_cpu(void) throw();
+extern ER              iloc_cpu(void) throw();
+extern ER              unl_cpu(void) throw();
+extern ER              iunl_cpu(void) throw();
+extern ER              dis_dsp(void) throw();
+extern ER              ena_dsp(void) throw();
+extern bool_t  sns_ctx(void) throw();
+extern bool_t  sns_loc(void) throw();
+extern bool_t  sns_dsp(void) throw();
+extern bool_t  sns_dpn(void) throw();
+extern bool_t  sns_ker(void) throw();
+extern ER              ext_ker(void) throw();
+
+/*
+ *  割込み管理機能
+ */
+extern ER              dis_int(INTNO intno) throw();
+extern ER              ena_int(INTNO intno) throw();
+extern ER              chg_ipm(PRI intpri) throw();
+extern ER              get_ipm(PRI *p_intpri) throw();
+
+/*
+ *  CPU例外管理機能
+ */
+extern bool_t  xsns_dpn(void *p_excinf) throw();
+extern bool_t  xsns_xpn(void *p_excinf) throw();
+
+#endif /* TOPPERS_MACRO_ONLY */
+
+/*
+ *  オブジェクト属性の定義
+ */
+#define TA_ACT                 UINT_C(0x02)    /* タスクを起動された状態で生成 */
+#define TA_RSTR                        UINT_C(0x04)    /* 制約タスク */
+
+#define TA_TPRI                        UINT_C(0x01)    /* タスクの待ち行列を優先度順に */
+#define TA_MPRI                        UINT_C(0x02)    /* メッセージキューを優先度順に */
+
+#define TA_WMUL                        UINT_C(0x02)    /* 複数の待ちタスク */
+#define TA_CLR                 UINT_C(0x04)    /* イベントフラグのクリア指定 */
+
+#define TA_STA                 UINT_C(0x02)    /* 周期ハンドラを動作状態で生成 */
+
+#define TA_NONKERNEL   UINT_C(0x02)    /* カーネル管理外の割込み */
+
+#define TA_ENAINT              UINT_C(0x01)    /* 割込み要求禁止フラグをクリア */
+#define TA_EDGE                        UINT_C(0x02)    /* エッジトリガ */
+
+/*
+ *  サービスコールの動作モードの定義
+ */
+#define TWF_ORW                        UINT_C(0x01)    /* イベントフラグのOR待ち */
+#define TWF_ANDW               UINT_C(0x02)    /* イベントフラグのAND待ち */
+
+/*
+ *  オブジェクトの状態の定義
+ */
+#define TTS_RUN                        UINT_C(0x01)    /* 実行状態 */
+#define TTS_RDY                        UINT_C(0x02)    /* 実行可能状態 */
+#define TTS_WAI                        UINT_C(0x04)    /* 待ち状態 */
+#define TTS_SUS                        UINT_C(0x08)    /* 強制待ち状態 */
+#define TTS_WAS                        UINT_C(0x0c)    /* 二重待ち状態 */
+#define TTS_DMT                        UINT_C(0x10)    /* 休止状態 */
+
+#define TTW_SLP                        UINT_C(0x0001)  /* 起床待ち */
+#define TTW_DLY                        UINT_C(0x0002)  /* 時間経過待ち */
+#define TTW_SEM                        UINT_C(0x0004)  /* セマフォの資源獲得待ち */
+#define TTW_FLG                        UINT_C(0x0008)  /* イベントフラグ待ち */
+#define TTW_SDTQ               UINT_C(0x0010)  /* データキューへの送信待ち */
+#define TTW_RDTQ               UINT_C(0x0020)  /* データキューからの受信待ち */
+#define TTW_SPDQ               UINT_C(0x0100)  /* 優先度データキューへの送信待ち */
+#define TTW_RPDQ               UINT_C(0x0200)  /* 優先度データキューからの受信待ち */
+#define TTW_MBX                        UINT_C(0x0040)  /* メールボックスからの受信待ち */
+#define TTW_MPF                        UINT_C(0x2000)  /* 固定長メモリブロックの獲得待ち */
+
+#define TTEX_ENA               UINT_C(0x01)    /* タスク例外処理許可状態 */
+#define TTEX_DIS               UINT_C(0x02)    /* タスク例外処理禁止状態 */
+
+#define TCYC_STP               UINT_C(0x01)    /* 周期ハンドラが動作していない */
+#define TCYC_STA               UINT_C(0x02)    /* 周期ハンドラが動作している */
+
+#define TALM_STP               UINT_C(0x01)    /* アラームハンドラが動作していない */
+#define TALM_STA               UINT_C(0x02)    /* アラームハンドラが動作している */
+
+/*
+ *  その他の定数の定義
+ */
+#define TSK_SELF               0                       /* 自タスク指定 */
+#define TSK_NONE               0                       /* 該当するタスクがない */
+
+#define TPRI_SELF              0                       /* 自タスクのベース優先度 */
+#define TPRI_INI               0                       /* タスクの起動時優先度 */
+
+#define TIPM_ENAALL            0                       /* 割込み優先度マスク全解除 */
+
+/*
+ *  構成定数とマクロ
+ */
+
+/*
+ *  サポートする機能
+ */
+#ifdef TOPPERS_TARGET_SUPPORT_DIS_INT
+#define TOPPERS_SUPPORT_DIS_INT                        /* dis_intがサポートされている */
+#endif /* TOPPERS_TARGET_SUPPORT_DIS_INT */
+
+#ifdef TOPPERS_TARGET_SUPPORT_ENA_INT
+#define TOPPERS_SUPPORT_ENA_INT                        /* ena_intがサポートされている */
+#endif /* TOPPERS_TARGET_SUPPORT_ENA_INT */
+
+#ifdef TOPPERS_TARGET_SUPPORT_GET_UTM
+#define TOPPERS_SUPPORT_GET_UTM                        /* get_utmがサポートされている */
+#endif /* TOPPERS_TARGET_SUPPORT_GET_UTM */
+
+#define TOPPERS_SUPPORT_RSTR_TASK              /* 制約タスク機能拡張 */
+
+/*
+ *  優先度の範囲
+ */
+#define TMIN_TPRI              1                       /* タスク優先度の最小値(最高値)*/
+#define TMAX_TPRI              16                      /* タスク優先度の最大値(最低値)*/
+#define TMIN_DPRI              1                       /* データ優先度の最小値(最高値)*/
+#define TMAX_DPRI              16                      /* データ優先度の最大値(最低値)*/
+#define TMIN_MPRI              1                       /* メッセージ優先度の最小値(最高値)*/
+#define TMAX_MPRI              16                      /* メッセージ優先度の最大値(最低値)*/
+#define TMIN_ISRPRI            1                       /* 割込みサービスルーチン優先度の最小値 */
+#define TMAX_ISRPRI            16                      /* 割込みサービスルーチン優先度の最大値 */
+
+/*
+ *  バージョン情報
+ */
+#define TKERNEL_MAKER  UINT_C(0x0118)  /* カーネルのメーカーコード */
+#define TKERNEL_PRID   UINT_C(0x0007)  /* カーネルの識別番号 */
+#define TKERNEL_SPVER  UINT_C(0xf513)  /* カーネル仕様のバージョン番号 */
+#define TKERNEL_PRVER  UINT_C(0x1070)  /* カーネルのバージョン番号 */
+
+/*
+ *  キューイング回数の最大値
+ */
+#define TMAX_ACTCNT            UINT_C(1)               /* 起動要求キューイング数の最大値 */
+#define TMAX_WUPCNT            UINT_C(1)               /* 起床要求キューイング数の最大値 */
+
+/*
+ *  ビットパターンのビット数
+ */
+#ifndef TBIT_TEXPTN                                    /* タスク例外要因のビット数 */
+#define TBIT_TEXPTN            (sizeof(TEXPTN) * CHAR_BIT)
+#endif /* TBIT_TEXPTN */
+
+#ifndef TBIT_FLGPTN                                    /* イベントフラグのビット数 */
+#define TBIT_FLGPTN            (sizeof(FLGPTN) * CHAR_BIT)
+#endif /* TBIT_FLGPTN */
+
+/*
+ *  メモリ領域確保のためのマクロ
+ *
+ *  以下のTOPPERS_COUNT_SZとTOPPERS_ROUND_SZの定義は,unitが2の巾乗であ
+ *  ることを仮定している.
+ */
+#ifndef TOPPERS_COUNT_SZ
+#define TOPPERS_COUNT_SZ(sz, unit)     (((sz) + (unit) - 1) / (unit))
+#endif /* TOPPERS_COUNT_SZ */
+#ifndef TOPPERS_ROUND_SZ
+#define TOPPERS_ROUND_SZ(sz, unit)     (((sz) + (unit) - 1) & ~((unit) - 1))
+#endif /* TOPPERS_ROUND_SZ */
+
+#define COUNT_STK_T(sz)                TOPPERS_COUNT_SZ(sz, sizeof(STK_T))
+#define ROUND_STK_T(sz)                TOPPERS_ROUND_SZ(sz, sizeof(STK_T))
+
+#define COUNT_MPF_T(blksz)     TOPPERS_COUNT_SZ(blksz, sizeof(MPF_T))
+#define ROUND_MPF_T(blksz)     TOPPERS_ROUND_SZ(blksz, sizeof(MPF_T))
+
+/*
+ *  その他の構成定数
+ */
+#define TMAX_MAXSEM            UINT_MAX        /* セマフォの最大資源数の最大値 */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* TOPPERS_KERNEL_H */
diff --git a/asp/extension/rstr_task/kernel/Makefile.kernel b/asp/extension/rstr_task/kernel/Makefile.kernel
new file mode 100644 (file)
index 0000000..a92f93c
--- /dev/null
@@ -0,0 +1,136 @@
+#
+#  TOPPERS/ASP Kernel
+#      Toyohashi Open Platform for Embedded Real-Time Systems/
+#      Advanced Standard Profile Kernel
+# 
+#  Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory
+#                              Toyohashi Univ. of Technology, JAPAN
+#  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+#              Graduate School of Information Science, Nagoya Univ., JAPAN
+# 
+#  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+#  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+#  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+#  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+#      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+#      スコード中に含まれていること.
+#  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+#      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+#      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+#      の無保証規定を掲載すること.
+#  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+#      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+#      と.
+#    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+#        作権表示,この利用条件および下記の無保証規定を掲載すること.
+#    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+#        報告すること.
+#  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+#      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+#      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+#      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+#      免責すること.
+# 
+#  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+#  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+#  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+#  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+#  の責任を負わない.
+# 
+#  $Id: Makefile.kernel 1887 2010-08-06 06:15:19Z ertl-hiro $
+# 
+
+#
+#              カーネルのファイル構成の定義
+#
+
+#
+#  1つのソースファイルから複数のオブジェクトファイルを生成するように作
+#  成されたソースファイルのリスト
+#
+KERNEL_FCSRCS = startup.c task.c wait.c time_event.c \
+                               task_manage.c task_refer.c task_sync.c task_except.c \
+                               semaphore.c eventflag.c dataqueue.c pridataq.c mailbox.c \
+                               mempfix.c time_manage.c cyclic.c alarm.c \
+                               sys_manage.c interrupt.c exception.c
+
+#
+#  各ソースファイルから生成されるオブジェクトファイルのリスト
+#
+startup = sta_ker.o ext_ker.o
+
+task = tskini.o tsksched.o tskrun.o tsknrun.o \
+               tskdmt.o tskact.o tskpri.o tskrpri.o tskrot.o tsktex.o
+
+wait = waimake.o waicmp.o waitmo.o waitmook.o \
+               wairel.o wobjwai.o wobjwaitmo.o iniwque.o
+
+time_event = tmeini.o tmeup.o tmedown.o tmeins.o tmedel.o tmeltim.o sigtim.o
+
+task_manage = act_tsk.o iact_tsk.o can_act.o ext_tsk.o ter_tsk.o \
+               chg_pri.o ras_pri.o get_pri.o get_inf.o
+
+task_refer = ref_tsk.o
+
+task_sync = slp_tsk.o tslp_tsk.o wup_tsk.o iwup_tsk.o can_wup.o \
+               rel_wai.o irel_wai.o sus_tsk.o rsm_tsk.o dly_tsk.o
+
+task_except = ras_tex.o iras_tex.o dis_tex.o ena_tex.o sns_tex.o ref_tex.o
+
+semaphore = semini.o sig_sem.o isig_sem.o \
+               wai_sem.o pol_sem.o twai_sem.o ini_sem.o ref_sem.o
+
+eventflag = flgini.o flgcnd.o set_flg.o iset_flg.o clr_flg.o \
+               wai_flg.o pol_flg.o twai_flg.o ini_flg.o ref_flg.o
+
+dataqueue = dtqini.o dtqenq.o dtqfenq.o dtqdeq.o dtqsnd.o dtqfsnd.o dtqrcv.o \
+               snd_dtq.o psnd_dtq.o ipsnd_dtq.o tsnd_dtq.o fsnd_dtq.o ifsnd_dtq.o \
+               rcv_dtq.o prcv_dtq.o trcv_dtq.o ini_dtq.o ref_dtq.o
+
+pridataq = pdqini.o pdqenq.o pdqdeq.o pdqsnd.o pdqrcv.o \
+               snd_pdq.o psnd_pdq.o ipsnd_pdq.o tsnd_pdq.o \
+               rcv_pdq.o prcv_pdq.o trcv_pdq.o ini_pdq.o ref_pdq.o
+
+mailbox = mbxini.o snd_mbx.o rcv_mbx.o prcv_mbx.o trcv_mbx.o \
+               ini_mbx.o ref_mbx.o
+
+mempfix = mpfini.o mpfget.o get_mpf.o pget_mpf.o tget_mpf.o \
+               rel_mpf.o ini_mpf.o ref_mpf.o
+
+time_manage = get_tim.o get_utm.o
+
+cyclic = cycini.o sta_cyc.o stp_cyc.o ref_cyc.o cyccal.o
+
+alarm = almini.o sta_alm.o ista_alm.o stp_alm.o istp_alm.o ref_alm.o almcal.o
+
+sys_manage = rot_rdq.o irot_rdq.o get_tid.o iget_tid.o \
+               loc_cpu.o iloc_cpu.o unl_cpu.o iunl_cpu.o dis_dsp.o ena_dsp.o \
+               sns_ctx.o sns_loc.o sns_dsp.o sns_dpn.o sns_ker.o
+
+interrupt = intini.o dis_int.o ena_int.o chg_ipm.o get_ipm.o
+
+exception = excini.o xsns_dpn.o xsns_xpn.o
+
+#
+#  生成されるオブジェクトファイルの依存関係の定義
+#
+$(startup) $(startup:.o=.s) $(startup:.o=.d): startup.c
+$(task) $(task:.o=.s) $(task:.o=.d): task.c
+$(wait) $(wait:.o=.s) $(wait:.o=.d): wait.c
+$(time_event) $(time_event:.o=.s) $(time_event:.o=.d): time_event.c
+$(task_manage) $(task_manage:.o=.s) $(task_manage:.o=.d): task_manage.c
+$(task_refer) $(task_refer:.o=.s) $(task_refer:.o=.d): task_refer.c
+$(task_sync) $(task_sync:.o=.s) $(task_sync:.o=.d): task_sync.c
+$(task_except) $(task_except:.o=.s) $(task_except:.o=.d): task_except.c
+$(semaphore) $(semaphore:.o=.s) $(semaphore:.o=.d): semaphore.c
+$(eventflag) $(eventflag:.o=.s) $(eventflag:.o=.d): eventflag.c
+$(dataqueue) $(dataqueue:.o=.s) $(dataqueue:.o=.d): dataqueue.c
+$(pridataq) $(pridataq:.o=.s) $(pridataq:.o=.d): pridataq.c
+$(mailbox) $(mailbox:.o=.s) $(mailbox:.o=.d): mailbox.c
+$(mempfix) $(mempfix:.o=.s) $(mempfix:.o=.d): mempfix.c
+$(time_manage) $(time_manage:.o=.s) $(time_manage:.o=.d): time_manage.c
+$(cyclic) $(cyclic:.o=.s) $(cyclic:.o=.d): cyclic.c
+$(alarm) $(alarm:.o=.s) $(alarm:.o=.d): alarm.c
+$(sys_manage) $(sys_manage:.o=.s) $(sys_manage:.o=.d): sys_manage.c
+$(interrupt) $(interrupt:.o=.s) $(interrupt:.o=.d): interrupt.c
+$(exception) $(exception:.o=.s) $(exception:.o=.d): exception.c
diff --git a/asp/extension/rstr_task/kernel/allfunc.h b/asp/extension/rstr_task/kernel/allfunc.h
new file mode 100644 (file)
index 0000000..c353997
--- /dev/null
@@ -0,0 +1,243 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  $Id: allfunc.h 1887 2010-08-06 06:15:19Z ertl-hiro $
+ */
+
+/*
+ *             すべての関数をコンパイルするための定義
+ */
+
+#ifndef TOPPERS_ALLFUNC_H
+#define TOPPERS_ALLFUNC_H
+
+/* startup.c */
+#define TOPPERS_sta_ker
+#define TOPPERS_ext_ker
+
+/* task.c */
+#define TOPPERS_tskini
+#define TOPPERS_tsksched
+#define TOPPERS_tskrun
+#define TOPPERS_tsknrun
+#define TOPPERS_tskdmt
+#define TOPPERS_tskact
+#define TOPPERS_tskpri
+#define TOPPERS_tskrpri
+#define TOPPERS_tskrot
+#define TOPPERS_tsktex
+
+/* wait.c */
+#define TOPPERS_waimake
+#define TOPPERS_waicmp
+#define TOPPERS_waitmo
+#define TOPPERS_waitmook
+#define TOPPERS_wairel
+#define TOPPERS_wobjwai
+#define TOPPERS_wobjwaitmo
+#define TOPPERS_iniwque
+
+/* time_event.c */
+#define TOPPERS_tmeini
+#define TOPPERS_tmeup
+#define TOPPERS_tmedown
+#define TOPPERS_tmeins
+#define TOPPERS_tmedel
+#define TOPPERS_tmeltim
+#define TOPPERS_sigtim
+
+/* task_manage.c */
+#define TOPPERS_act_tsk
+#define TOPPERS_iact_tsk
+#define TOPPERS_can_act
+#define TOPPERS_ext_tsk
+#define TOPPERS_ter_tsk
+#define TOPPERS_chg_pri
+#define TOPPERS_ras_pri
+#define TOPPERS_get_pri
+#define TOPPERS_get_inf
+
+/* task_refer.c */
+#define TOPPERS_ref_tsk
+
+/* task_sync.c */
+#define TOPPERS_slp_tsk
+#define TOPPERS_tslp_tsk
+#define TOPPERS_wup_tsk
+#define TOPPERS_iwup_tsk
+#define TOPPERS_can_wup
+#define TOPPERS_rel_wai
+#define TOPPERS_irel_wai
+#define TOPPERS_sus_tsk
+#define TOPPERS_rsm_tsk
+#define TOPPERS_dly_tsk
+
+/* task_except.c */
+#define TOPPERS_ras_tex
+#define TOPPERS_iras_tex
+#define TOPPERS_dis_tex
+#define TOPPERS_ena_tex
+#define TOPPERS_sns_tex
+#define TOPPERS_ref_tex
+
+/* semaphore.c */
+#define TOPPERS_semini
+#define TOPPERS_sig_sem
+#define TOPPERS_isig_sem
+#define TOPPERS_wai_sem
+#define TOPPERS_pol_sem
+#define TOPPERS_twai_sem
+#define TOPPERS_ini_sem
+#define TOPPERS_ref_sem
+
+/* eventflag.c */
+#define TOPPERS_flgini
+#define TOPPERS_flgcnd
+#define TOPPERS_set_flg
+#define TOPPERS_iset_flg
+#define TOPPERS_clr_flg
+#define TOPPERS_wai_flg
+#define TOPPERS_pol_flg
+#define TOPPERS_twai_flg
+#define TOPPERS_ini_flg
+#define TOPPERS_ref_flg
+
+/* dataqueue.c */
+#define TOPPERS_dtqini
+#define TOPPERS_dtqenq
+#define TOPPERS_dtqfenq
+#define TOPPERS_dtqdeq
+#define TOPPERS_dtqsnd
+#define TOPPERS_dtqfsnd
+#define TOPPERS_dtqrcv
+#define TOPPERS_snd_dtq
+#define TOPPERS_psnd_dtq
+#define TOPPERS_ipsnd_dtq
+#define TOPPERS_tsnd_dtq
+#define TOPPERS_fsnd_dtq
+#define TOPPERS_ifsnd_dtq
+#define TOPPERS_rcv_dtq
+#define TOPPERS_prcv_dtq
+#define TOPPERS_trcv_dtq
+#define TOPPERS_ini_dtq
+#define TOPPERS_ref_dtq
+
+/* pridataq.c */
+#define TOPPERS_pdqini
+#define TOPPERS_pdqenq
+#define TOPPERS_pdqdeq
+#define TOPPERS_pdqsnd
+#define TOPPERS_pdqrcv
+#define TOPPERS_snd_pdq
+#define TOPPERS_psnd_pdq
+#define TOPPERS_ipsnd_pdq
+#define TOPPERS_tsnd_pdq
+#define TOPPERS_rcv_pdq
+#define TOPPERS_prcv_pdq
+#define TOPPERS_trcv_pdq
+#define TOPPERS_ini_pdq
+#define TOPPERS_ref_pdq
+
+/* mailbox.c */
+#define TOPPERS_mbxini
+#define TOPPERS_snd_mbx
+#define TOPPERS_rcv_mbx
+#define TOPPERS_prcv_mbx
+#define TOPPERS_trcv_mbx
+#define TOPPERS_ini_mbx
+#define TOPPERS_ref_mbx
+
+/* mempfix.c */
+#define TOPPERS_mpfini
+#define TOPPERS_mpfget
+#define TOPPERS_get_mpf
+#define TOPPERS_pget_mpf
+#define TOPPERS_tget_mpf
+#define TOPPERS_rel_mpf
+#define TOPPERS_ini_mpf
+#define TOPPERS_ref_mpf
+
+/* time_manage.c */
+#define TOPPERS_get_tim
+#define TOPPERS_get_utm
+
+/* cyclic.c */
+#define TOPPERS_cycini
+#define TOPPERS_sta_cyc
+#define TOPPERS_stp_cyc
+#define TOPPERS_ref_cyc
+#define TOPPERS_cyccal
+
+/* alarm.c */
+#define TOPPERS_almini
+#define TOPPERS_sta_alm
+#define TOPPERS_ista_alm
+#define TOPPERS_stp_alm
+#define TOPPERS_istp_alm
+#define TOPPERS_ref_alm
+#define TOPPERS_almcal
+
+/* sys_manage.c */
+#define TOPPERS_rot_rdq
+#define TOPPERS_irot_rdq
+#define TOPPERS_get_tid
+#define TOPPERS_iget_tid
+#define TOPPERS_loc_cpu
+#define TOPPERS_iloc_cpu
+#define TOPPERS_unl_cpu
+#define TOPPERS_iunl_cpu
+#define TOPPERS_dis_dsp
+#define TOPPERS_ena_dsp
+#define TOPPERS_sns_ctx
+#define TOPPERS_sns_loc
+#define TOPPERS_sns_dsp
+#define TOPPERS_sns_dpn
+#define TOPPERS_sns_ker
+
+/* interrupt.c */
+#define TOPPERS_intini
+#define TOPPERS_dis_int
+#define TOPPERS_ena_int
+#define TOPPERS_chg_ipm
+#define TOPPERS_get_ipm
+
+/* exception.c */
+#define TOPPERS_excini
+#define TOPPERS_xsns_dpn
+#define TOPPERS_xsns_xpn
+
+#endif /* TOPPERS_ALLFUNC_H */
diff --git a/asp/extension/rstr_task/kernel/check.h b/asp/extension/rstr_task/kernel/check.h
new file mode 100644 (file)
index 0000000..d9a130b
--- /dev/null
@@ -0,0 +1,299 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  $Id: check.h 1965 2010-11-20 07:22:43Z ertl-hiro $
+ */
+
+/*
+ *             エラーチェック用マクロ
+ */
+
+#ifndef TOPPERS_CHECK_H
+#define TOPPERS_CHECK_H
+
+/*
+ *  優先度の範囲の判定
+ */
+#define VALID_TPRI(tpri)       (TMIN_TPRI <= (tpri) && (tpri) <= TMAX_TPRI)
+
+#ifndef VALID_INTPRI_CHGIPM
+#define VALID_INTPRI_CHGIPM(intpri) \
+                               (TMIN_INTPRI <= (intpri) && (intpri) <= TIPM_ENAALL)
+#endif /* VALID_INTPRI_CHGIPM */
+
+/*
+ *  タスク優先度のチェック(E_PAR)
+ */
+#define CHECK_TPRI(tpri) {                                                                     \
+       if (!VALID_TPRI(tpri)) {                                                                \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_TPRI_INI(tpri) {                                                         \
+       if (!(VALID_TPRI(tpri) || (tpri) == TPRI_INI)) {                \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_TPRI_SELF(tpri) {                                                                \
+       if (!(VALID_TPRI(tpri) || (tpri) == TPRI_SELF)) {               \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  タイムアウト指定値のチェック(E_PAR)
+ */
+#define CHECK_TMOUT(tmout) {                                                           \
+       if (!(TMO_FEVR <= (tmout))) {                                                   \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  割込み優先度のチェック(E_PAR)
+ */
+#define CHECK_INTPRI_CHGIPM(intpri) {                                          \
+       if (!VALID_INTPRI_CHGIPM(intpri)) {                                             \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  割込み番号のチェック(E_PAR)
+ */
+#define CHECK_INTNO_DISINT(intno) {                                                    \
+       if (!VALID_INTNO_DISINT(intno)) {                                               \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  その他のパラメータエラーのチェック(E_PAR)
+ */
+#define CHECK_PAR(exp) {                                                                       \
+       if (!(exp)) {                                                                                   \
+               ercd = E_PAR;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  オブジェクトIDの範囲の判定
+ */
+#define VALID_TSKID(tskid)     (TMIN_TSKID <= (tskid) && (tskid) <= tmax_tskid)
+#define VALID_SEMID(semid)     (TMIN_SEMID <= (semid) && (semid) <= tmax_semid)
+#define VALID_FLGID(flgid)     (TMIN_FLGID <= (flgid) && (flgid) <= tmax_flgid)
+#define VALID_DTQID(dtqid)     (TMIN_DTQID <= (dtqid) && (dtqid) <= tmax_dtqid)
+#define VALID_PDQID(pdqid)     (TMIN_PDQID <= (pdqid) && (pdqid) <= tmax_pdqid)
+#define VALID_MBXID(mbxid)     (TMIN_MBXID <= (mbxid) && (mbxid) <= tmax_mbxid)
+#define VALID_MPFID(mpfid)     (TMIN_MPFID <= (mpfid) && (mpfid) <= tmax_mpfid)
+#define VALID_CYCID(cycid)     (TMIN_CYCID <= (cycid) && (cycid) <= tmax_cycid)
+#define VALID_ALMID(almid)     (TMIN_ALMID <= (almid) && (almid) <= tmax_almid)
+
+/*
+ *  オブジェクトIDのチェック(E_ID)
+ */
+#define CHECK_TSKID(tskid) {                                                           \
+       if (!VALID_TSKID(tskid)) {                                                              \
+               ercd = E_ID;                                                                            \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_TSKID_SELF(tskid) {                                                      \
+       if (!(VALID_TSKID(tskid) || (tskid) == TSK_SELF)) {             \
+               ercd = E_ID;                                                                            \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_SEMID(semid) {                                                           \
+       if (!VALID_SEMID(semid)) {                                                              \
+               ercd = E_ID;                                                                            \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_FLGID(flgid) {                                                           \
+       if (!VALID_FLGID(flgid)) {                                                              \
+               ercd = E_ID;                                                                            \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_DTQID(dtqid) {                                                           \
+       if (!VALID_DTQID(dtqid)) {                                                              \
+               ercd = E_ID;                                                                            \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_PDQID(pdqid) {                                                           \
+       if (!VALID_PDQID(pdqid)) {                                                              \
+               ercd = E_ID;                                                                            \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_MBXID(mbxid) {                                                           \
+       if (!VALID_MBXID(mbxid)) {                                                              \
+               ercd = E_ID;                                                                            \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_MPFID(mpfid) {                                                           \
+       if (!VALID_MPFID(mpfid)) {                                                              \
+               ercd = E_ID;                                                                            \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_CYCID(cycid) {                                                           \
+       if (!VALID_CYCID(cycid)) {                                                              \
+               ercd = E_ID;                                                                            \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_ALMID(almid) {                                                           \
+       if (!VALID_ALMID(almid)) {                                                              \
+               ercd = E_ID;                                                                            \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  呼出しコンテキストのチェック(E_CTX)
+ */
+#define CHECK_TSKCTX() {                                                                       \
+       if (sense_context()) {                                                                  \
+               ercd = E_CTX;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_INTCTX() {                                                                       \
+       if (!sense_context()) {                                                                 \
+               ercd = E_CTX;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  呼出しコンテキストとCPUロック状態のチェック(E_CTX)
+ */
+#define CHECK_TSKCTX_UNL() {                                                           \
+       if (sense_context() || t_sense_lock()) {                                \
+               ercd = E_CTX;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#define CHECK_INTCTX_UNL() {                                                           \
+       if (!sense_context() || i_sense_lock()) {                               \
+               ercd = E_CTX;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  ディスパッチ保留状態でないかのチェック(E_CTX)
+ *  自タスクが制約タスクでないかのチェック(E_NOSPT)
+ */
+#define CHECK_DISPATCH() {                                                                     \
+       if (sense_context() || t_sense_lock() || !dspflg) {             \
+               ercd = E_CTX;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+       if ((p_runtsk->p_tinib->tskatr & TA_RSTR) != 0U) {              \
+               ercd = E_NOSPT;                                                                         \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  対象タスクが制約タスクでないかのチェック(E_NOSPT)
+ */
+#define CHECK_NONRSTR(p_tcb) {                                                         \
+       if (((p_tcb)->p_tinib->tskatr & TA_RSTR) != 0U) {               \
+               ercd = E_NOSPT;                                                                         \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  その他のコンテキストエラーのチェック(E_CTX)
+ */
+#define CHECK_CTX(exp) {                                                                       \
+       if (!(exp)) {                                                                                   \
+               ercd = E_CTX;                                                                           \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  自タスクを指定していないかのチェック(E_ILUSE)
+ */
+#define CHECK_NONSELF(p_tcb) {                                                         \
+       if ((p_tcb) == p_runtsk) {                                                              \
+               ercd = E_ILUSE;                                                                         \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+/*
+ *  その他の不正使用エラーのチェック(E_ILUSE)
+ */
+#define CHECK_ILUSE(exp) {                                                                     \
+       if (!(exp)) {                                                                                   \
+               ercd = E_ILUSE;                                                                         \
+               goto error_exit;                                                                        \
+       }                                                                                                               \
+}
+
+#endif /* TOPPERS_CHECK_H */
diff --git a/asp/extension/rstr_task/kernel/kernel.tf b/asp/extension/rstr_task/kernel/kernel.tf
new file mode 100644 (file)
index 0000000..942be75
--- /dev/null
@@ -0,0 +1,1084 @@
+$ ======================================================================
+$ 
+$   TOPPERS/ASP Kernel
+$       Toyohashi Open Platform for Embedded Real-Time Systems/
+$       Advanced Standard Profile Kernel
+$ 
+$   Copyright (C) 2007 by TAKAGI Nobuhisa
+$   Copyright (C) 2007-2011 by Embedded and Real-Time Systems Laboratory
+$               Graduate School of Information Science, Nagoya Univ., JAPAN
+$  
+$   上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+$   ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+$   変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+$   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+$       権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+$       スコード中に含まれていること.
+$   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+$       用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+$       者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+$       の無保証規定を掲載すること.
+$   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+$       用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+$       と.
+$     (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+$         作権表示,この利用条件および下記の無保証規定を掲載すること.
+$     (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+$         報告すること.
+$   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+$       害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+$       また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+$       由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+$       免責すること.
+$  
+$   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+$   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+$   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+$   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+$   の責任を負わない.
+$ 
+$   $Id: kernel.tf 2024 2011-01-02 08:59:23Z ertl-hiro $
+$  
+$ =====================================================================
+
+$ =====================================================================
+$ kernel_cfg.hの生成
+$ =====================================================================
+
+$FILE "kernel_cfg.h"$
+/* kernel_cfg.h */$NL$
+#ifndef TOPPERS_KERNEL_CFG_H$NL$
+#define TOPPERS_KERNEL_CFG_H$NL$
+$NL$
+#define TNUM_TSKID     $LENGTH(TSK.ID_LIST)$$NL$
+#define TNUM_SEMID     $LENGTH(SEM.ID_LIST)$$NL$
+#define TNUM_FLGID     $LENGTH(FLG.ID_LIST)$$NL$
+#define TNUM_DTQID     $LENGTH(DTQ.ID_LIST)$$NL$
+#define TNUM_PDQID     $LENGTH(PDQ.ID_LIST)$$NL$
+#define TNUM_MBXID     $LENGTH(MBX.ID_LIST)$$NL$
+#define TNUM_MPFID     $LENGTH(MPF.ID_LIST)$$NL$
+#define TNUM_CYCID     $LENGTH(CYC.ID_LIST)$$NL$
+#define TNUM_ALMID     $LENGTH(ALM.ID_LIST)$$NL$
+$NL$
+$FOREACH id TSK.ID_LIST$
+       #define $id$    $+id$$NL$
+$END$
+$FOREACH id SEM.ID_LIST$
+       #define $id$    $+id$$NL$
+$END$
+$FOREACH id FLG.ID_LIST$
+       #define $id$    $+id$$NL$
+$END$
+$FOREACH id DTQ.ID_LIST$
+       #define $id$    $+id$$NL$
+$END$
+$FOREACH id PDQ.ID_LIST$
+       #define $id$    $+id$$NL$
+$END$
+$FOREACH id MBX.ID_LIST$
+       #define $id$    $+id$$NL$
+$END$
+$FOREACH id MPF.ID_LIST$
+       #define $id$    $+id$$NL$
+$END$
+$FOREACH id CYC.ID_LIST$
+       #define $id$    $+id$$NL$
+$END$
+$FOREACH id ALM.ID_LIST$
+       #define $id$    $+id$$NL$
+$END$
+$NL$
+#endif /* TOPPERS_KERNEL_CFG_H */$NL$
+
+$ =====================================================================
+$ kernel_cfg.cの生成
+$ =====================================================================
+
+$FILE "kernel_cfg.c"$
+/* kernel_cfg.c */$NL$
+#include "kernel/kernel_int.h"$NL$
+#include "kernel_cfg.h"$NL$
+$NL$
+#ifndef TOPPERS_EMPTY_LABEL$NL$
+#define TOPPERS_EMPTY_LABEL(x,y) x y[0]$NL$
+#endif$NL$
+$NL$
+#if TKERNEL_PRID != 0x07u$NL$
+#error The kernel does not match this configuration file.$NL$
+#endif$NL$
+$NL$
+
+$ 
+$  インクルードディレクティブ(#include)
+$ 
+/*$NL$
+$SPC$*  Include Directives (#include)$NL$
+$SPC$*/$NL$
+$NL$
+$INCLUDES$
+$NL$
+
+$ 
+$  オブジェクトのID番号を保持する変数
+$ 
+$IF USE_EXTERNAL_ID$
+       /*$NL$
+       $SPC$*  Variables for Object ID$NL$
+       $SPC$*/$NL$
+       $NL$
+       $FOREACH id TSK.ID_LIST$
+               const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+       $END$
+       $FOREACH id SEM.ID_LIST$
+               const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+       $END$
+       $FOREACH id FLG.ID_LIST$
+               const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+       $END$
+       $FOREACH id DTQ.ID_LIST$
+               const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+       $END$
+       $FOREACH id PDQ.ID_LIST$
+               const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+       $END$
+       $FOREACH id MBX.ID_LIST$
+               const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+       $END$
+       $FOREACH id MPF.ID_LIST$
+               const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+       $END$
+       $FOREACH id CYC.ID_LIST$
+               const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+       $END$
+       $FOREACH id ALM.ID_LIST$
+               const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+       $END$
+$END$
+
+$ 
+$  トレースログマクロのデフォルト定義
+$ 
+/*$NL$
+$SPC$*  Default Definitions of Trace Log Macros$NL$
+$SPC$*/$NL$
+$NL$
+#ifndef LOG_ISR_ENTER$NL$
+#define LOG_ISR_ENTER(intno)$NL$
+#endif /* LOG_ISR_ENTER */$NL$
+$NL$
+#ifndef LOG_ISR_LEAVE$NL$
+#define LOG_ISR_LEAVE(intno)$NL$
+#endif /* LOG_ISR_LEAVE */$NL$
+$NL$
+
+$ 
+$  タスク
+$ 
+/*$NL$
+$SPC$*  Task Management Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ タスクが1個以上存在することのチェック
+$IF !LENGTH(TSK.ID_LIST)$
+       $ERROR$$FORMAT(_("no task is registered"))$$END$
+$END$
+
+$ タスクID番号の最大値
+const ID _kernel_tmax_tskid = (TMIN_TSKID + TNUM_TSKID - 1);$NL$
+$NL$
+
+$ エラーチェック
+$FOREACH tskid TSK.ID_LIST$
+$      // tskatrが([TA_ACT|TA_RSTR])でない場合(E_RSATR)
+       $IF (TSK.TSKATR[tskid] & ~(TA_ACT|TA_RSTR|TARGET_TSKATR)) != 0$
+               $ERROR TSK.TEXT_LINE[tskid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "tskatr", TSK.TSKATR[tskid], tskid, "CRE_TSK")$$END$
+       $END$
+
+$      // (TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI)でない場合(E_PAR)
+       $IF !(TMIN_TPRI <= TSK.ITSKPRI[tskid] && TSK.ITSKPRI[tskid] <= TMAX_TPRI)$
+               $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "itskpri", TSK.ITSKPRI[tskid], tskid, "CRE_TSK")$$END$
+       $END$
+
+$      // texatrが(TA_NULL)でない場合(E_RSATR)
+       $IF LENGTH(TSK.TEXATR[tskid]) && TSK.TEXATR[tskid] != 0$
+               $ERROR DEF_TEX.TEXT_LINE[tskid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "texatr", TSK.TEXATR[tskid], tskid, "DEF_TEX")$$END$
+       $END$
+$END$
+
+$ スタック領域に関するエラーチェック
+$FOREACH tskid TSK.ID_LIST$
+$      // stkszが0か,ターゲット定義の最小値(TARGET_MIN_STKSZ)よりも小さい場合(E_PAR)
+       $IF TSK.STKSZ[tskid] == 0 || (TARGET_MIN_STKSZ
+                                                                       && TSK.STKSZ[tskid] < TARGET_MIN_STKSZ)$
+               $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is too small"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$$END$
+       $END$
+$      // stkszがスタック領域のサイズとして正しくない場合(E_PAR)
+       $IF !EQ(TSK.STK[tskid], "NULL") && CHECK_STKSZ_ALIGN
+                                                       && (TSK.STKSZ[tskid] & (CHECK_STKSZ_ALIGN - 1))$
+               $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$$END$
+       $END$
+$END$
+
+$ スタック領域の生成
+$FOREACH tskid TSK.ID_LIST$
+       $IF EQ(TSK.STK[tskid], "NULL")$
+               $IF (TSK.TSKATR[tskid] & TA_RSTR) == 0$
+                       static STK_T _kernel_stack_$tskid$[COUNT_STK_T($TSK.STKSZ[tskid]$)];$NL$
+                       $TSK.TINIB_STKSZ[tskid] = FORMAT("ROUND_STK_T(%1%)", TSK.STKSZ[tskid])$
+                       $TSK.TINIB_STK[tskid] = CONCAT("_kernel_stack_", tskid)$
+               $ELSE$
+                       $TSK.TINIB_STKSZ[tskid] = FORMAT("ROUND_STK_T(%1%)", TSK.STKSZ[tskid])$
+                       $TSK.TINIB_STK[tskid] = CONCAT("_kernel_shared_stack_", +TSK.ITSKPRI[tskid])$
+$                      // 制約タスク用の共有スタックのサイズを求める
+                       $IF !LENGTH(shared_stack_size[TSK.ITSKPRI[tskid]])
+                                       || shared_stack_size[TSK.ITSKPRI[tskid]] < TSK.STKSZ[tskid]$
+                               $shared_stack_size[TSK.ITSKPRI[tskid]] = TSK.STKSZ[tskid]$
+                       $END$
+               $END$
+       $ELSE$
+               $TSK.TINIB_STKSZ[tskid] = TSK.STKSZ[tskid]$
+               $TSK.TINIB_STK[tskid] = TSK.STK[tskid]$
+       $END$
+$END$
+$FOREACH tskpri RANGE(TMIN_TPRI, TMAX_TPRI)$
+       $IF LENGTH(shared_stack_size[tskpri])$
+               static STK_T _kernel_shared_stack_$tskpri$[COUNT_STK_T($shared_stack_size[tskpri]$)];$NL$
+       $END$
+$END$
+$NL$
+
+$ タスク初期化ブロックの生成(タスクは1個以上存在する)
+const TINIB _kernel_tinib_table[TNUM_TSKID] = {$NL$
+$JOINEACH tskid TSK.ID_LIST ",\n"$
+$      // タスク属性,拡張情報,起動番地,起動時優先度
+       $TAB${
+       $SPC$($TSK.TSKATR[tskid]$), (intptr_t)($TSK.EXINF[tskid]$),
+       $SPC$((TASK)($TSK.TASK[tskid]$)), INT_PRIORITY($TSK.ITSKPRI[tskid]$),
+
+$      // タスク初期化コンテキストブロック,スタック領域
+       $IF USE_TSKINICTXB$
+               $GENERATE_TSKINICTXB(tskid)$
+       $ELSE$
+               $SPC$$TSK.TINIB_STKSZ[tskid]$, $TSK.TINIB_STK[tskid]$,
+       $END$
+
+$      // タスク例外処理ルーチンの属性と起動番地
+       $SPC$($ALT(TSK.TEXATR[tskid],"TA_NULL")$), ($ALT(TSK.TEXRTN[tskid],"NULL")$) }
+$END$$NL$
+};$NL$
+$NL$
+
+$ タスク管理ブロックの生成
+TCB _kernel_tcb_table[TNUM_TSKID];$NL$
+$NL$
+
+$ タスク生成順序テーブルの生成
+const ID _kernel_torder_table[TNUM_TSKID] = {$NL$
+$TAB$$JOINEACH tskid TSK.ORDER_LIST ", "$$tskid$$END$$NL$
+};$NL$
+$NL$
+
+$ 
+$  セマフォ
+$ 
+/*$NL$
+$SPC$*  Semaphore Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ セマフォID番号の最大値
+const ID _kernel_tmax_semid = (TMIN_SEMID + TNUM_SEMID - 1);$NL$
+$NL$
+
+$ セマフォ初期化ブロックの生成
+$IF LENGTH(SEM.ID_LIST)$
+       const SEMINIB _kernel_seminib_table[TNUM_SEMID] = {$NL$
+       $JOINEACH semid SEM.ID_LIST ",\n"$
+$              // sematrが([TA_TPRI])でない場合(E_RSATR)
+               $IF (SEM.SEMATR[semid] & ~TA_TPRI) != 0$
+                       $ERROR SEM.TEXT_LINE[semid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "sematr", SEM.SEMATR[semid], semid, "CRE_SEM")$$END$
+               $END$
+
+$              // (0 <= isemcnt && isemcnt <= maxsem)でない場合(E_PAR)
+               $IF !(0 <= SEM.ISEMCNT[semid] && SEM.ISEMCNT[semid] <= SEM.MAXSEM[semid])$
+                       $ERROR SEM.TEXT_LINE[semid]$E_PAR: $FORMAT(_("too large %1% `%2%\' of `%3%\' in %4%"), "isemcnt", SEM.ISEMCNT[semid], semid, "CRE_SEM")$$END$
+               $END$
+
+$              // (1 <= maxsem && maxsem <= TMAX_MAXSEM)でない場合(E_PAR)
+               $IF !(1 <= SEM.MAXSEM[semid] && SEM.MAXSEM[semid] <= TMAX_MAXSEM)$
+                       $ERROR SEM.TEXT_LINE[semid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "maxsem", SEM.MAXSEM[semid], semid, "CRE_SEM")$$END$
+               $END$
+
+$              // セマフォ初期化ブロック
+               $TAB${ ($SEM.SEMATR[semid]$), ($SEM.ISEMCNT[semid]$), ($SEM.MAXSEM[semid]$) }
+       $END$$NL$
+       };$NL$
+       $NL$
+
+$      // セマフォ管理ブロック
+       SEMCB _kernel_semcb_table[TNUM_SEMID];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const SEMINIB, _kernel_seminib_table);$NL$
+       TOPPERS_EMPTY_LABEL(SEMCB, _kernel_semcb_table);$NL$
+$END$$NL$
+
+$ 
+$  イベントフラグ
+$ 
+/*$NL$
+$SPC$*  Eventflag Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ イベントフラグID番号の最大値
+const ID _kernel_tmax_flgid = (TMIN_FLGID + TNUM_FLGID - 1);$NL$
+$NL$
+
+$ イベントフラグ初期化ブロックの生成
+$IF LENGTH(FLG.ID_LIST)$
+       const FLGINIB _kernel_flginib_table[TNUM_FLGID] = {$NL$
+       $JOINEACH flgid FLG.ID_LIST ",\n"$
+$              // flgatrが([TA_TPRI]|[TA_WMUL]|[TA_CLR])でない場合(E_RSATR)
+               $IF (FLG.FLGATR[flgid] & ~(TA_TPRI|TA_WMUL|TA_CLR)) != 0$
+                       $ERROR FLG.TEXT_LINE[flgid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "flgatr", FLG.FLGATR[flgid], flgid, "CRE_FLG")$$END$
+               $END$
+
+$              // イベントフラグ初期化ブロック
+               $TAB${ ($FLG.FLGATR[flgid]$), ($FLG.IFLGPTN[flgid]$) }
+       $END$$NL$
+       };$NL$
+       $NL$
+
+$      // イベントフラグ管理ブロック
+       FLGCB _kernel_flgcb_table[TNUM_FLGID];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const FLGINIB, _kernel_flginib_table);$NL$
+       TOPPERS_EMPTY_LABEL(FLGCB, _kernel_flgcb_table);$NL$
+$END$$NL$
+
+$ 
+$  データキュー
+$ 
+/*$NL$
+$SPC$*  Dataqueue Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ データキューID番号の最大値
+const ID _kernel_tmax_dtqid = (TMIN_DTQID + TNUM_DTQID - 1);$NL$
+$NL$
+
+$IF LENGTH(DTQ.ID_LIST)$
+       $FOREACH dtqid DTQ.ID_LIST$
+$              // dtqatrが([TA_TPRI])でない場合(E_RSATR)
+               $IF (DTQ.DTQATR[dtqid] & ~TA_TPRI) != 0$
+                       $ERROR DTQ.TEXT_LINE[dtqid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "dtqatr", DTQ.DTQATR[dtqid], dtqid, "CRE_DTQ")$$END$
+               $END$
+
+$              // dtqmbがNULLでない場合(E_NOSPT)
+               $IF !EQ(DTQ.DTQMB[dtqid], "NULL")$
+                       $ERROR DTQ.TEXT_LINE[dtqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "dtqmb", DTQ.DTQMB[dtqid], dtqid, "CRE_DTQ")$$END$
+               $END$
+
+$              // データキュー管理領域
+               $IF DTQ.DTQCNT[dtqid]$
+                       static DTQMB _kernel_dtqmb_$dtqid$[$DTQ.DTQCNT[dtqid]$];$NL$
+               $END$
+       $END$
+
+$      // データキュー初期化ブロックの生成
+       const DTQINIB _kernel_dtqinib_table[TNUM_DTQID] = {$NL$
+       $JOINEACH dtqid DTQ.ID_LIST ",\n"$
+               $TAB${ ($DTQ.DTQATR[dtqid]$), ($DTQ.DTQCNT[dtqid]$), $IF DTQ.DTQCNT[dtqid]$(_kernel_dtqmb_$dtqid$)$ELSE$NULL$END$ }
+       $END$$NL$
+       };$NL$
+       $NL$
+
+$      // データキュー管理ブロック
+       DTQCB _kernel_dtqcb_table[TNUM_DTQID];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const DTQINIB, _kernel_dtqinib_table);$NL$
+       TOPPERS_EMPTY_LABEL(DTQCB, _kernel_dtqcb_table);$NL$
+$END$$NL$
+
+$ 
+$  優先度データキュー
+$ 
+/*$NL$
+$SPC$*  Priority Dataqueue Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 優先度データキューID番号の最大値
+const ID _kernel_tmax_pdqid = (TMIN_PDQID + TNUM_PDQID - 1);$NL$
+$NL$
+
+$IF LENGTH(PDQ.ID_LIST)$
+       $FOREACH pdqid PDQ.ID_LIST$
+$              // pdqatrが([TA_TPRI])でない場合(E_RSATR)
+               $IF (PDQ.PDQATR[pdqid] & ~TA_TPRI) != 0$
+                       $ERROR PDQ.TEXT_LINE[pdqid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "pdqatr", PDQ.PDQATR[pdqid], pdqid, "CRE_PDQ")$$END$
+               $END$
+
+$              // (TMIN_DPRI <= maxdpri && maxdpri <= TMAX_DPRI)でない場合(E_PAR)
+               $IF !(TMIN_DPRI <= PDQ.MAXDPRI[pdqid] && PDQ.MAXDPRI[pdqid] <= TMAX_DPRI)$
+                       $ERROR PDQ.TEXT_LINE[pdqid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "maxdpri", PDQ.MAXDPRI[pdqid], pdqid, "CRE_PDQ")$$END$
+               $END$
+
+$              // pdqmbがNULLでない場合(E_NOSPT)
+               $IF !EQ(PDQ.PDQMB[pdqid], "NULL")$
+                       $ERROR PDQ.TEXT_LINE[pdqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "pdqmb", PDQ.PDQMB[pdqid], pdqid, "CRE_PDQ")$$END$
+               $END$
+
+$              // 優先度データキュー管理領域
+               $IF PDQ.PDQCNT[pdqid]$
+                       static PDQMB _kernel_pdqmb_$pdqid$[$PDQ.PDQCNT[pdqid]$];$NL$
+               $END$
+       $END$
+
+$      // 優先度データキュー初期化ブロックの生成
+       const PDQINIB _kernel_pdqinib_table[TNUM_PDQID] = {$NL$
+       $JOINEACH pdqid PDQ.ID_LIST ",\n"$
+               $TAB${ ($PDQ.PDQATR[pdqid]$), ($PDQ.PDQCNT[pdqid]$), ($PDQ.MAXDPRI[pdqid]$), $IF PDQ.PDQCNT[pdqid]$(_kernel_pdqmb_$pdqid$)$ELSE$NULL$END$ }
+       $END$$NL$
+       };$NL$
+       $NL$
+
+$      // 優先度データキュー管理ブロック
+       PDQCB _kernel_pdqcb_table[TNUM_PDQID];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const PDQINIB, _kernel_pdqinib_table);$NL$
+       TOPPERS_EMPTY_LABEL(PDQCB, _kernel_pdqcb_table);$NL$
+$END$$NL$
+
+$ 
+$  メールボックス
+$ 
+/*$NL$
+$SPC$*  Mailbox Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ メールボックスID番号の最大値
+const ID _kernel_tmax_mbxid = (TMIN_MBXID + TNUM_MBXID - 1);$NL$
+$NL$
+
+$ メールボックス初期化ブロックの生成
+$IF LENGTH(MBX.ID_LIST)$
+       const MBXINIB _kernel_mbxinib_table[TNUM_MBXID] = {$NL$
+       $JOINEACH mbxid MBX.ID_LIST ",\n"$
+$              // mbxatrが([TA_TPRI]|[TA_MPRI])でない場合(E_RSATR)
+               $IF (MBX.MBXATR[mbxid] & ~(TA_TPRI|TA_MPRI)) != 0$
+                       $ERROR MBX.TEXT_LINE[mbxid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "mbxatr", MBX.MBXATR[mbxid], mbxid, "CRE_MBX")$$END$
+               $END$
+
+$              // (TMIN_MPRI <= maxmpri && maxmpri <= TMAX_MPRI)でない場合(E_PAR)
+               $IF !(TMIN_MPRI <= MBX.MAXMPRI[mbxid] && MBX.MAXMPRI[mbxid] <= TMAX_MPRI)$
+                       $ERROR MBX.TEXT_LINE[mbxid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "maxmpri", MBX.MAXMPRI[mbxid], mbxid, "CRE_MBX")$$END$
+               $END$
+
+$              // mprihdがNULLでない場合(E_NOSPT)
+               $IF !EQ(MBX.MPRIHD[mbxid], "NULL")$
+                       $ERROR MBX.TEXT_LINE[mbxid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "mprihd", MBX.MPRIHD[mbxid], mbxid, "CRE_MBX")$$END$
+               $END$
+
+$              // メールボックス初期化ブロック
+               $TAB${ ($MBX.MBXATR[mbxid]$), ($MBX.MAXMPRI[mbxid]$) }
+       $END$$NL$
+       };$NL$
+       $NL$
+
+$      // メールボックス管理ブロック
+       MBXCB _kernel_mbxcb_table[TNUM_MBXID];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const MBXINIB, _kernel_mbxinib_table);$NL$
+       TOPPERS_EMPTY_LABEL(MBXCB, _kernel_mbxcb_table);$NL$
+$END$$NL$
+
+$ 
+$  固定長メモリプール
+$ 
+/*$NL$
+$SPC$*  Fixed-sized Memorypool Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 固定長メモリプールID番号の最大値
+const ID _kernel_tmax_mpfid = (TMIN_MPFID + TNUM_MPFID - 1);$NL$
+$NL$
+
+$IF LENGTH(MPF.ID_LIST)$
+       $FOREACH mpfid MPF.ID_LIST$
+$              // mpfatrが([TA_TPRI])でない場合(E_RSATR)
+               $IF (MPF.MPFATR[mpfid] & ~TA_TPRI) != 0$
+                       $ERROR MPF.TEXT_LINE[mpfid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "mpfatr", MPF.MPFATR[mpfid], mpfid, "CRE_MPF")$$END$
+               $END$
+
+$              // blkcntが0の場合(E_PAR)
+               $IF MPF.BLKCNT[mpfid] == 0$
+                       $ERROR MPF.TEXT_LINE[mpfid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "blkcnt", MPF.BLKCNT[mpfid], mpfid, "CRE_MPF")$$END$
+               $END$
+
+$              // blkszが0の場合(E_PAR)
+               $IF MPF.BLKSZ[mpfid] == 0$
+                       $ERROR MPF.TEXT_LINE[mpfid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "blksz", MPF.BLKSZ[mpfid], mpfid, "CRE_MPF")$$END$
+               $END$
+
+$              // 固定長メモリプール領域
+               $IF EQ(MPF.MPF[mpfid], "NULL")$
+                       static MPF_T _kernel_mpf_$mpfid$[($MPF.BLKCNT[mpfid]$) * COUNT_MPF_T($MPF.BLKSZ[mpfid]$)];$NL$
+               $END$
+
+$              // mpfmbがNULLでない場合(E_NOSPT)
+               $IF !EQ(MPF.MPFMB[mpfid], "NULL")$
+                       $ERROR MPF.TEXT_LINE[mpfid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "mpfmb", MPF.MPFMB[mpfid], mpfid, "CRE_MPF")$$END$
+               $END$
+
+$              // 固定長メモリプール管理領域
+               static MPFMB _kernel_mpfmb_$mpfid$[$MPF.BLKCNT[mpfid]$];$NL$
+       $END$
+
+$      // 固定長メモリプール初期化ブロックの生成
+       const MPFINIB _kernel_mpfinib_table[TNUM_MPFID] = {$NL$
+       $JOINEACH mpfid MPF.ID_LIST ",\n"$
+               $TAB${ ($MPF.MPFATR[mpfid]$), ($MPF.BLKCNT[mpfid]$), ROUND_MPF_T($MPF.BLKSZ[mpfid]$), $IF EQ(MPF.MPF[mpfid],"NULL")$(_kernel_mpf_$mpfid$)$ELSE$($MPF.MPF[mpfid]$)$END$, (_kernel_mpfmb_$mpfid$) }
+       $END$$NL$
+       };$NL$
+       $NL$
+
+$      // 固定長メモリプール管理ブロック
+       MPFCB _kernel_mpfcb_table[TNUM_MPFID];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const MPFINIB, _kernel_mpfinib_table);$NL$
+       TOPPERS_EMPTY_LABEL(MPFCB, _kernel_mpfcb_table);$NL$
+$END$$NL$
+
+$ 
+$  周期ハンドラ
+$ 
+/*$NL$
+$SPC$*  Cyclic Handler Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 周期ハンドラID番号の最大値
+const ID _kernel_tmax_cycid = (TMIN_CYCID + TNUM_CYCID - 1);$NL$
+$NL$
+
+$ 周期ハンドラ初期化テーブルの生成
+$IF LENGTH(CYC.ID_LIST)$
+       const CYCINIB _kernel_cycinib_table[TNUM_CYCID] = {$NL$
+       $JOINEACH cycid CYC.ID_LIST ",\n"$
+$              // cycatrが([TA_STA])でない場合(E_RSATR)
+               $IF (CYC.CYCATR[cycid] & ~TA_STA) != 0$
+                       $ERROR CYC.TEXT_LINE[cycid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "cycatr", CYC.CYCATR[cycid], cycid, "CRE_CYC")$$END$
+               $END$
+
+$              // (0 < cyctim && cyctim <= TMAX_RELTIM)でない場合(E_PAR)
+               $IF !(0 < CYC.CYCTIM[cycid] && CYC.CYCTIM[cycid] <= TMAX_RELTIM)$
+                       $ERROR CYC.TEXT_LINE[cycid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "cyctim", CYC.CYCTIM[cycid], cycid, "CRE_CYC")$$END$
+               $END$
+
+$              // (0 <= cycphs && cycphs <= TMAX_RELTIM)でない場合(E_PAR)
+               $IF !(0 <= CYC.CYCPHS[cycid] && CYC.CYCPHS[cycid] <= TMAX_RELTIM)$
+                       $ERROR CYC.TEXT_LINE[cycid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "cycphs", CYC.CYCPHS[cycid], cycid, "CRE_CYC")$$END$
+               $END$
+
+$              // 警告:cycatrにTA_STAが設定されていて,(cycphs == 0)の場合
+               $IF (CYC.CYCATR[cycid] & TA_STA) != 0 && CYC.CYCPHS[cycid] == 0$
+                       $WARNING CYC.TEXT_LINE[cycid]$$FORMAT(_("%1% is not recommended when %2% is set to %3% in %4%"), "cycphs==0", "TA_STA", "cycatr", "CRE_CYC")$$END$
+               $END$
+
+$              // 周期ハンドラ初期化ブロック
+               $TAB${ ($CYC.CYCATR[cycid]$), (intptr_t)($CYC.EXINF[cycid]$), ($CYC.CYCHDR[cycid]$), ($CYC.CYCTIM[cycid]$), ($CYC.CYCPHS[cycid]$) }
+       $END$$NL$
+       };$NL$
+       $NL$
+
+$      // 周期ハンドラ管理ブロック
+       CYCCB _kernel_cyccb_table[TNUM_CYCID];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const CYCINIB, _kernel_cycinib_table);$NL$
+       TOPPERS_EMPTY_LABEL(CYCCB, _kernel_cyccb_table);$NL$
+$END$$NL$
+
+$ 
+$  アラームハンドラ
+$ 
+/*$NL$
+$SPC$*  Alarm Handler Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ アラームハンドラID番号の最大値
+const ID _kernel_tmax_almid = (TMIN_ALMID + TNUM_ALMID - 1);$NL$
+$NL$
+
+$ アラームハンドラ初期化ブロックの生成
+$IF LENGTH(ALM.ID_LIST)$
+       const ALMINIB _kernel_alminib_table[TNUM_ALMID] = {$NL$
+       $JOINEACH almid ALM.ID_LIST ",\n"$
+$              // almatrが(TA_NULL)でない場合(E_RSATR)
+               $IF ALM.ALMATR[almid] != 0$
+                       $ERROR ALM.TEXT_LINE[almid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "almatr", ALM.ALMATR[almid], almid, "CRE_ALM")$$END$
+               $END$
+
+$              // アラームハンドラ初期化ブロック
+               $TAB${ ($ALM.ALMATR[almid]$), (intptr_t)($ALM.EXINF[almid]$), ($ALM.ALMHDR[almid]$) }
+       $END$$NL$
+       };$NL$
+       $NL$
+
+$      // アラームハンドラ管理ブロック
+       ALMCB _kernel_almcb_table[TNUM_ALMID];$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const ALMINIB, _kernel_alminib_table);$NL$
+       TOPPERS_EMPTY_LABEL(ALMCB, _kernel_almcb_table);$NL$
+$END$$NL$
+
+$ 
+$  割込み管理機能
+$ 
+/*$NL$
+$SPC$*  Interrupt Management Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 割込み番号と割込みハンドラ番号の変換テーブルの作成
+$IF LENGTH(INTNO_ATTISR_VALID) != LENGTH(INHNO_ATTISR_VALID)$
+       $ERROR$length of `INTNO_ATTISR_VALID' is different from length of `INHNO_ATTISR_VALID'$END$
+$END$
+$i = 0$
+$FOREACH intno INTNO_ATTISR_VALID$
+       $inhno = AT(INHNO_ATTISR_VALID, i)$
+       $INHNO[intno] = inhno$
+       $INTNO[inhno] = intno$
+       $i = i + 1$
+$END$
+
+$ 割込み要求ラインに関するエラーチェック
+$i = 0$
+$FOREACH intno INT.ORDER_LIST$
+$      // intnoがCFG_INTに対する割込み番号として正しくない場合(E_PAR)
+       $IF !LENGTH(FIND(INTNO_CFGINT_VALID, INT.INTNO[intno]))$
+               $ERROR INT.TEXT_LINE[intno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "intno", INT.INTNO[intno], "CFG_INT")$$END$
+       $END$
+
+$      // intnoがCFG_INTによって設定済みの場合(E_OBJ)
+       $j = 0$
+       $FOREACH intno2 INT.ORDER_LIST$
+               $IF INT.INTNO[intno] == INT.INTNO[intno2] && j < i$
+                       $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' in %3% is duplicated"), "intno", INT.INTNO[intno], "CFG_INT")$$END$
+               $END$
+               $j = j + 1$
+       $END$
+
+$      // intatrが([TA_ENAINT]|[TA_EDGE])でない場合(E_RSATR)
+       $IF (INT.INTATR[intno] & ~(TA_ENAINT|TA_EDGE|TARGET_INTATR)) != 0$
+               $ERROR INT.TEXT_LINE[intno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "intatr", INT.INTATR[intno], "intno", INT.INTNO[intno], "CFG_INT")$$END$
+       $END$
+
+$      // intpriがCFG_INTに対する割込み優先度として正しくない場合(E_PAR)
+       $IF !LENGTH(FIND(INTPRI_CFGINT_VALID, INT.INTPRI[intno]))$
+               $ERROR INT.TEXT_LINE[intno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "intpri", INT.INTPRI[intno], "CFG_INT")$$END$
+       $END$
+
+$      // カーネル管理に固定されているintnoに対して,intpriにTMIN_INTPRI
+$      // よりも小さい値が指定された場合(E_OBJ)
+       $IF LENGTH(FIND(INTNO_FIX_KERNEL, intno))$
+               $IF INT.INTPRI[intno] < TMIN_INTPRI$
+                       $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' must not have higher priority than %3%"), "intno", INT.INTNO[intno], "TMIN_INTPRI")$$END$
+               $END$
+       $END$
+
+$      // カーネル管理外に固定されているintnoに対して,intpriにTMIN_INTPRI
+$      // よりも小さい値が指定されなかった場合(E_OBJ)
+       $IF LENGTH(FIND(INTNO_FIX_NONKERNEL, intno))$
+               $IF INT.INTPRI[intno] >= TMIN_INTPRI$
+                       $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' must have higher priority than %3%"), "intno", INT.INTNO[intno], "TMIN_INTPRI")$$END$
+               $END$
+       $END$
+       $i = i + 1$
+$END$
+
+$ 割込みハンドラに関するエラーチェック
+$i = 0$
+$FOREACH inhno INH.ORDER_LIST$
+$      // inhnoがDEF_INHに対する割込みハンドラ番号として正しくない場合(E_PAR)
+       $IF !LENGTH(FIND(INHNO_DEFINH_VALID, INH.INHNO[inhno]))$
+               $ERROR INH.TEXT_LINE[inhno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "inhno", INH.INHNO[inhno], "DEF_INH")$$END$
+       $END$
+
+$      // inhnoがDEF_INHによって設定済みの場合(E_OBJ)
+       $j = 0$
+       $FOREACH inhno2 INH.ORDER_LIST$
+               $IF INH.INHNO[inhno] == INH.INHNO[inhno2] && j < i$
+                       $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' in %3% is duplicated"), "inhno", INH.INHNO[inhno], "DEF_INH")$$END$
+               $END$
+               $j = j + 1$
+       $END$
+
+$      // inhatrが(TA_NULL)でない場合(E_RSATR)
+       $IF (INH.INHATR[inhno] & ~TARGET_INHATR) != 0$
+               $ERROR INH.TEXT_LINE[inhno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "inhatr", INH.INHATR[inhno], "inhno", INH.INHNO[inhno], "DEF_INH")$$END$
+       $END$
+
+$      // カーネル管理に固定されているinhnoに対して,inhatrにTA_NONKERNEL
+$      // が指定されている場合(E_RSATR)
+       $IF LENGTH(FIND(INHNO_FIX_KERNEL, inhno))$
+               $IF (INH.INHATR[inhno] & TA_NONKERNEL) != 0$
+                       $ERROR INH.TEXT_LINE[inhno]$E_RSATR: $FORMAT(_("%1% `%2%\' must not be non-kernel interrupt"), "inhno", INH.INHNO[inhno])$$END$
+               $END$
+       $END$
+
+$      // カーネル管理外に固定されているinhnoに対して,inhatrにTA_NONKERNEL
+$      // が指定されていない場合(E_RSATR)
+       $IF LENGTH(FIND(INHNO_FIX_NONKERNEL, inhno))$
+               $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
+                       $ERROR INH.TEXT_LINE[inhno]$E_RSATR: $FORMAT(_("%1% `%2%\' must be non-kernel interrupt"), "inhno", INH.INHNO[inhno])$$END$
+               $END$
+       $END$
+
+       $IF LENGTH(INTNO[INH.INHNO[inhno]])$
+               $intno = INTNO[INH.INHNO[inhno]]$
+$              // inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)
+               $IF !LENGTH(INT.INTNO[intno])$
+                       $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' corresponding to %3% `%4%\' is not configured with %5%"), "intno", INT.INTNO[intno], "inhno", INH.INHNO[inhno], "CFG_INT")$$END$
+               $ELSE$
+                       $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
+$                              // inhatrにTA_NONKERNELが指定されておらず,inhnoに対応
+$                              // するintnoに対してCFG_INTで設定された割込み優先度が
+$                              // TMIN_INTPRIよりも小さい場合(E_OBJ)
+                               $IF INT.INTPRI[intno] < TMIN_INTPRI$
+                                       $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
+                               $END$
+                       $ELSE$
+$                              // inhatrにTA_NONKERNELが指定されており,inhnoに対応
+$                              // するintnoに対してCFG_INTで設定された割込み優先度が
+$                              // TMIN_INTPRI以上である場合(E_OBJ)
+                               $IF INT.INTPRI[intno] >= TMIN_INTPRI$
+                                       $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is lower than or equal to %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
+                               $END$
+                       $END$
+               $END$
+       $END$
+       $i = i + 1$
+$END$
+
+$ 割込みサービスルーチン(ISR)に関するエラーチェックと割込みハンドラの生成
+$FOREACH order ISR.ORDER_LIST$
+$      // isratrが(TA_NULL)でない場合(E_RSATR)
+       $IF (ISR.ISRATR[order] & ~TARGET_ISRATR) != 0$
+               $ERROR ISR.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "isratr", ISR.ISRATR[order], "ATT_ISR")$$END$
+       $END$
+
+$      // intnoがATT_ISRに対する割込み番号として正しくない場合(E_PAR)
+       $IF !LENGTH(FIND(INTNO_ATTISR_VALID, ISR.INTNO[order]))$
+               $ERROR ISR.TEXT_LINE[order]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "intno", ISR.INTNO[order], "ATT_ISR")$$END$
+       $END$
+
+$      // (TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI)でない場合(E_PAR)
+       $IF !(TMIN_ISRPRI <= ISR.ISRPRI[order] && ISR.ISRPRI[order] <= TMAX_ISRPRI)$
+               $ERROR ISR.TEXT_LINE[order]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "isrpri", ISR.ISRPRI[order], "ATT_ISR")$$END$
+       $END$
+$END$
+
+$FOREACH intno INTNO_ATTISR_VALID$
+       $inhno = INHNO[intno]$
+
+$      // 割込み番号intnoに対して登録されたISRのリストの作成
+       $isr_order_list = {}$
+       $FOREACH order ISR.ORDER_LIST$
+               $IF ISR.INTNO[order] == intno$
+                       $isr_order_list = APPEND(isr_order_list, order)$
+                       $order_for_error = order$
+               $END$
+       $END$
+
+$      // 割込み番号intnoに対して登録されたISRが存在する場合
+       $IF LENGTH(isr_order_list) > 0$
+$              // intnoに対応するinhnoに対してDEF_INHがある場合(E_OBJ)
+               $IF LENGTH(INH.INHNO[inhno])$
+                       $ERROR ISR.TEXT_LINE[order_for_error]$E_OBJ: $FORMAT(_("%1% `%2%\' in %3% is duplicated with %4% `%5%\'"), "intno", ISR.INTNO[order_for_error], "ATT_ISR", "inhno", INH.INHNO[inhno])$$END$
+               $END$
+
+$              // intnoに対するCFG_INTがない場合(E_OBJ)
+               $IF !LENGTH(INT.INTNO[intno])$
+                       $ERROR ISR.TEXT_LINE[order_for_error]$E_OBJ: $FORMAT(_("%1% `%2%\' is not configured with %3%"), "intno", ISR.INTNO[order_for_error], "CFG_INT")$$END$
+               $ELSE$
+$                      // intnoに対してCFG_INTで設定された割込み優先度がTMIN_INTPRI
+$                      // よりも小さい場合(E_OBJ)
+                       $IF INT.INTPRI[intno] < TMIN_INTPRI$
+                               $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "intno", ISR.INTNO[order_for_error], "TMIN_INTPRI")$$END$
+                       $END$
+               $END$
+
+$              // DEF_INH(inhno, { TA_NULL, _kernel_inthdr_<intno> } );
+               $INH.INHNO[inhno] = inhno$
+               $INH.INHATR[inhno] = VALUE("TA_NULL", 0)$
+               $INH.INTHDR[inhno] = CONCAT("_kernel_inthdr_", intno)$
+               $INH.ORDER_LIST = APPEND(INH.ORDER_LIST, inhno)$
+
+$              // ISR用の割込みハンドラ
+               void$NL$
+               _kernel_inthdr_$intno$(void)$NL$
+               {$NL$
+               $IF LENGTH(isr_order_list) > 1$
+                       $TAB$PRI        saved_ipm;$NL$
+                       $NL$
+                       $TAB$i_begin_int($intno$);$NL$
+                       $TAB$saved_ipm = i_get_ipm();$NL$
+               $ELSE$
+                       $TAB$i_begin_int($intno$);$NL$
+               $END$
+$              // ISRを優先度順に呼び出す
+               $JOINEACH order SORT(isr_order_list, "ISR.ISRPRI") "\tif (i_sense_lock()) {\n\t\ti_unlock_cpu();\n\t}\n\ti_set_ipm(saved_ipm);\n"$
+                       $TAB$LOG_ISR_ENTER($intno$);$NL$
+                       $TAB$((ISR)($ISR.ISR[order]$))((intptr_t)($ISR.EXINF[order]$));$NL$
+                       $TAB$LOG_ISR_LEAVE($intno$);$NL$
+               $END$
+               $TAB$i_end_int($intno$);$NL$
+               }$NL$
+       $END$
+$END$
+$NL$
+
+$ 
+$  割込み管理機能のための標準的な初期化情報の生成
+$ 
+$ 割込みハンドラの初期化に必要な情報
+$IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INHINIB_TABLE,0)$
+
+$ 割込みハンドラ数
+#define TNUM_INHNO     $LENGTH(INH.ORDER_LIST)$$NL$
+const uint_t _kernel_tnum_inhno = TNUM_INHNO;$NL$
+$NL$
+$FOREACH inhno INH.ORDER_LIST$
+       $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
+               INTHDR_ENTRY($INH.INHNO[inhno]$, $+INH.INHNO[inhno]$, $INH.INTHDR[inhno]$)$NL$
+       $END$
+$END$
+$NL$
+
+$ 割込みハンドラ初期化テーブル
+$IF LENGTH(INH.ORDER_LIST)$
+       const INHINIB _kernel_inhinib_table[TNUM_INHNO] = {$NL$
+       $JOINEACH inhno INH.ORDER_LIST ",\n"$
+               $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
+                       $TAB${ ($INH.INHNO[inhno]$), ($INH.INHATR[inhno]$), (FP)(INT_ENTRY($INH.INHNO[inhno]$, $INH.INTHDR[inhno]$)) }
+               $ELSE$
+                       $TAB${ ($INH.INHNO[inhno]$), ($INH.INHATR[inhno]$), (FP)($INH.INTHDR[inhno]$) }
+               $END$
+       $END$$NL$
+       };$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const INHINIB, _kernel_inhinib_table);$NL$
+$END$$NL$
+$END$
+
+$ 割込み要求ラインの初期化に必要な情報
+$IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INHINTB_TABLE,0)$
+
+$ 割込み要求ライン数
+#define TNUM_INTNO     $LENGTH(INT.ORDER_LIST)$$NL$
+const uint_t _kernel_tnum_intno = TNUM_INTNO;$NL$
+$NL$
+
+$ 割込み要求ライン初期化テーブル
+$IF LENGTH(INT.ORDER_LIST)$
+       const INTINIB _kernel_intinib_table[TNUM_INTNO] = {$NL$
+       $JOINEACH intno INT.ORDER_LIST ",\n"$
+               $TAB${ ($INT.INTNO[intno]$), ($INT.INTATR[intno]$), ($INT.INTPRI[intno]$) }
+       $END$$NL$
+       };$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const INTINIB, _kernel_intinib_table);$NL$
+$END$$NL$
+$END$
+
+$ 
+$  CPU例外管理機能
+$ 
+/*$NL$
+$SPC$*  CPU Exception Management Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ CPU例外ハンドラに関するエラーチェック
+$i = 0$
+$FOREACH excno EXC.ORDER_LIST$
+$      // excnoがDEF_EXCに対するCPU例外ハンドラ番号として正しくない場合(E_PAR)
+       $IF !LENGTH(FIND(EXCNO_DEFEXC_VALID, EXC.EXCNO[excno]))$
+               $ERROR EXC.TEXT_LINE[excno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$
+       $END$
+
+$      // excnoがDEF_EXCによって設定済みの場合(E_OBJ)
+       $j = 0$
+       $FOREACH excno2 EXC.ORDER_LIST$
+               $IF EXC.EXCNO[excno] == EXC.EXCNO[excno2] && j < i$
+                       $ERROR EXC.TEXT_LINE[excno]$E_OBJ: $FORMAT(_("%1% `%2%\' in %3% is duplicated"), "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$
+               $END$
+               $j = j + 1$
+       $END$
+
+$      // excatrが(TA_NULL)でない場合(E_RSATR)
+       $IF (EXC.EXCATR[excno] & ~TARGET_EXCATR) != 0$
+               $ERROR EXC.TEXT_LINE[excno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "excatr", EXC.EXCATR[excno], "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$
+       $END$
+       $i = i + 1$
+$END$
+
+$ CPU例外ハンドラのための標準的な初期化情報の生成
+$IF !OMIT_INITIALIZE_EXCEPTION$
+
+$ CPU例外ハンドラ数
+#define TNUM_EXCNO     $LENGTH(EXC.ORDER_LIST)$$NL$
+const uint_t _kernel_tnum_excno = TNUM_EXCNO;$NL$
+$NL$
+$FOREACH excno EXC.ORDER_LIST$
+       EXCHDR_ENTRY($EXC.EXCNO[excno]$, $+EXC.EXCNO[excno]$, $EXC.EXCHDR[excno]$)$NL$
+$END$
+$NL$
+
+$ CPU例外ハンドラ初期化テーブル
+$IF LENGTH(EXC.ORDER_LIST)$
+       const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = {$NL$
+       $JOINEACH excno EXC.ORDER_LIST ",\n"$
+               $TAB${ ($EXC.EXCNO[excno]$), ($EXC.EXCATR[excno]$), (FP)(EXC_ENTRY($EXC.EXCNO[excno]$, $EXC.EXCHDR[excno]$)) }
+       $END$$NL$
+       };$NL$
+$ELSE$
+       TOPPERS_EMPTY_LABEL(const EXCINIB, _kernel_excinib_table);$NL$
+$END$$NL$
+$END$
+
+$ 
+$  非タスクコンテキスト用のスタック領域
+$ 
+/*$NL$
+$SPC$*  Stack Area for Non-task Context$NL$
+$SPC$*/$NL$
+$NL$
+
+$IF !LENGTH(ICS.ORDER_LIST)$
+$      // DEF_ICSがない場合のデフォルト値の設定
+       #ifdef DEFAULT_ISTK$NL$
+       $NL$
+       #define TOPPERS_ISTKSZ          DEFAULT_ISTKSZ$NL$
+       #define TOPPERS_ISTK            DEFAULT_ISTK$NL$
+       $NL$
+       #else /* DEAULT_ISTK */$NL$
+       $NL$
+       static STK_T                            _kernel_istack[COUNT_STK_T(DEFAULT_ISTKSZ)];$NL$
+       #define TOPPERS_ISTKSZ          ROUND_STK_T(DEFAULT_ISTKSZ)$NL$
+       #define TOPPERS_ISTK            _kernel_istack$NL$
+       $NL$
+       #endif /* DEAULT_ISTK */$NL$
+$ELSE$
+
+$      // 静的API「DEF_ICS」が複数ある(E_OBJ)
+       $IF LENGTH(ICS.ORDER_LIST) > 1$
+               $ERROR$E_OBJ: $FORMAT(_("too many %1%"), "DEF_ICS")$$END$
+       $END$
+
+$      // istkszがスタック領域のサイズとして正しくない場合(E_PAR)
+       $IF !EQ(ICS.ISTK[1], "NULL") && CHECK_STKSZ_ALIGN
+                                                       && (ICS.ISTKSZ[1] & (CHECK_STKSZ_ALIGN - 1))$
+               $ERROR ICS.TEXT_LINE[1]$E_PAR: $FORMAT(_("%1% `%2%\' in %3% is not aligned"), "istksz", ICS.ISTKSZ[1], "DEF_ICS")$$END$
+       $END$
+
+       $IF EQ(ICS.ISTK[1], "NULL")$
+$              // スタック領域の自動割付け
+               static STK_T                            _kernel_istack[COUNT_STK_T($ICS.ISTKSZ[1]$)];$NL$
+               #define TOPPERS_ISTKSZ          ROUND_STK_T($ICS.ISTKSZ[1]$)$NL$
+               #define TOPPERS_ISTK            _kernel_istack$NL$
+       $ELSE$
+               #define TOPPERS_ISTKSZ          ($ICS.ISTKSZ[1]$)$NL$
+               #define TOPPERS_ISTK            ($ICS.ISTK[1]$)$NL$
+       $END$
+$END$
+$NL$
+
+$ 非タスクコンテキスト用のスタック領域
+const SIZE             _kernel_istksz = TOPPERS_ISTKSZ;$NL$
+STK_T *const   _kernel_istk = TOPPERS_ISTK;$NL$
+$NL$
+#ifdef TOPPERS_ISTKPT$NL$
+STK_T *const   _kernel_istkpt = TOPPERS_ISTKPT(TOPPERS_ISTK, TOPPERS_ISTKSZ);$NL$
+#endif /* TOPPERS_ISTKPT */$NL$
+$NL$
+
+$ 
+$  タイムイベント管理
+$ 
+/*$NL$
+$SPC$*  Time Event Management$NL$
+$SPC$*/$NL$
+$NL$
+TMEVTN   _kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID + TNUM_ALMID];$NL$
+$NL$
+
+$ 
+$  各モジュールの初期化関数
+$ 
+/*$NL$
+$SPC$*  Module Initialization Function$NL$
+$SPC$*/$NL$
+$NL$
+void$NL$
+_kernel_initialize_object(void)$NL$
+{$NL$
+$TAB$_kernel_initialize_task();$NL$
+$IF LENGTH(SEM.ID_LIST)$       _kernel_initialize_semaphore();$NL$$END$
+$IF LENGTH(FLG.ID_LIST)$       _kernel_initialize_eventflag();$NL$$END$
+$IF LENGTH(DTQ.ID_LIST)$       _kernel_initialize_dataqueue();$NL$$END$
+$IF LENGTH(PDQ.ID_LIST)$       _kernel_initialize_pridataq();$NL$$END$
+$IF LENGTH(MBX.ID_LIST)$       _kernel_initialize_mailbox();$NL$$END$
+$IF LENGTH(MPF.ID_LIST)$       _kernel_initialize_mempfix();$NL$$END$
+$IF LENGTH(CYC.ID_LIST)$       _kernel_initialize_cyclic();$NL$$END$
+$IF LENGTH(ALM.ID_LIST)$       _kernel_initialize_alarm();$NL$$END$
+$TAB$_kernel_initialize_interrupt();$NL$
+$TAB$_kernel_initialize_exception();$NL$
+}$NL$
+$NL$
+
+$ 
+$  初期化ルーチンの実行関数
+$ 
+/*$NL$
+$SPC$*  Initialization Routine$NL$
+$SPC$*/$NL$
+$NL$
+void$NL$
+_kernel_call_inirtn(void)$NL$
+{$NL$
+$FOREACH order INI.ORDER_LIST$
+$      // iniatrが(TA_NULL)でない場合(E_RSATR)
+       $IF INI.INIATR[order] != 0$
+               $ERROR INI.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "iniatr", INI.INIATR[order], "inirtn", INI.INIRTN[order], "ATT_INI")$$END$
+       $END$
+       $TAB$((INIRTN)($INI.INIRTN[order]$))((intptr_t)($INI.EXINF[order]$));$NL$
+$END$
+}$NL$
+$NL$
+
+$ 
+$  終了処理ルーチンの実行関数
+$ 
+/*$NL$
+$SPC$*  Termination Routine$NL$
+$SPC$*/$NL$
+$NL$
+void$NL$
+_kernel_call_terrtn(void)$NL$
+{$NL$
+$FOREACH rorder TER.RORDER_LIST$
+$      // teratrが(TA_NULL)でない場合(E_RSATR)
+       $IF TER.TERATR[rorder] != 0$
+               $ERROR TER.TEXT_LINE[rorder]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "teratr", TER.TERATR[rorder], "terrtn", TER.TERRTN[rorder], "ATT_TER")$$END$
+       $END$
+       $TAB$((TERRTN)($TER.TERRTN[rorder]$))((intptr_t)($TER.EXINF[rorder]$));$NL$
+$END$
+}$NL$
+$NL$
diff --git a/asp/extension/rstr_task/kernel/kernel_def.csv b/asp/extension/rstr_task/kernel/kernel_def.csv
new file mode 100644 (file)
index 0000000..96b1c05
--- /dev/null
@@ -0,0 +1,109 @@
+SIL_ENDIAN_BIG,#defined(SIL_ENDIAN_BIG)
+SIL_ENDIAN_LITTLE,#defined(SIL_ENDIAN_LITTLE)
+TA_NULL,TA_NULL
+TA_ACT,TA_ACT
+TA_RSTR,TA_RSTR
+TA_TPRI,TA_TPRI
+TA_MPRI,TA_MPRI
+TA_WMUL,TA_WMUL
+TA_CLR,TA_CLR
+TA_STA,TA_STA
+TA_NONKERNEL,TA_NONKERNEL
+TA_ENAINT,TA_ENAINT
+TA_EDGE,TA_EDGE
+TMIN_TPRI,TMIN_TPRI,signed
+TMAX_TPRI,TMAX_TPRI,signed
+TMIN_DPRI,TMIN_DPRI,signed
+TMAX_DPRI,TMAX_DPRI,signed
+TMIN_MPRI,TMIN_MPRI,signed
+TMAX_MPRI,TMAX_MPRI,signed
+TMIN_ISRPRI,TMIN_ISRPRI,signed
+TMAX_ISRPRI,TMAX_ISRPRI,signed
+TMAX_MAXSEM,TMAX_MAXSEM
+TMAX_RELTIM,TMAX_RELTIM
+TMIN_INTPRI,TMIN_INTPRI,signed
+OMIT_INITIALIZE_INTERRUPT,#defined(OMIT_INITIALIZE_INTERRUPT)
+OMIT_INITIALIZE_EXCEPTION,#defined(OMIT_INITIALIZE_EXCEPTION)
+USE_TSKINICTXB,#defined(USE_TSKINICTXB)
+TARGET_TSKATR,#defined(TARGET_TSKATR),,TARGET_TSKATR
+TARGET_INTATR,#defined(TARGET_INTATR),,TARGET_INTATR
+TARGET_INHATR,#defined(TARGET_INHATR),,TARGET_INHATR
+TARGET_ISRATR,#defined(TARGET_ISRATR),,TARGET_ISRATR
+TARGET_EXCATR,#defined(TARGET_EXCATR),,TARGET_EXCATR
+TARGET_MIN_STKSZ,#defined(TARGET_MIN_STKSZ),,TARGET_MIN_STKSZ
+CHECK_STKSZ_ALIGN,#defined(CHECK_STKSZ_ALIGN),,CHECK_STKSZ_ALIGN
+CHECK_FUNC_ALIGN,#defined(CHECK_FUNC_ALIGN),,CHECK_FUNC_ALIGN
+CHECK_FUNC_NONNULL,#defined(CHECK_FUNC_NONNULL)
+CHECK_STACK_ALIGN,#defined(CHECK_STACK_ALIGN),,CHECK_STACK_ALIGN
+CHECK_STACK_NONNULL,#defined(CHECK_STACK_NONNULL)
+CHECK_MPF_ALIGN,#defined(CHECK_MPF_ALIGN),,CHECK_MPF_ALIGN
+CHECK_MPF_NONNULL,#defined(CHECK_MPF_NONNULL)
+sizeof_ID,sizeof(ID)
+sizeof_uint_t,sizeof(uint_t)
+sizeof_SIZE,sizeof(SIZE)
+sizeof_ATR,sizeof(ATR)
+sizeof_PRI,sizeof(PRI)
+sizeof_void_ptr,sizeof(void*)
+sizeof_VP,sizeof(void*)
+sizeof_intptr_t,sizeof(intptr_t)
+sizeof_FP,sizeof(FP)
+sizeof_INHNO,sizeof(INHNO)
+sizeof_INTNO,sizeof(INTNO)
+sizeof_EXCNO,sizeof(EXCNO)
+sizeof_TINIB,sizeof(TINIB)
+offsetof_TINIB_tskatr,"offsetof(TINIB,tskatr)"
+offsetof_TINIB_exinf,"offsetof(TINIB,exinf)"
+offsetof_TINIB_task,"offsetof(TINIB,task)"
+offsetof_TINIB_ipriority,"offsetof(TINIB,ipriority)"
+offsetof_TINIB_stksz,#!defined(USE_TSKINICTXB),,"offsetof(TINIB,stksz)"
+offsetof_TINIB_stk,#!defined(USE_TSKINICTXB),,"offsetof(TINIB,stk)"
+offsetof_TINIB_texatr,"offsetof(TINIB,texatr)"
+offsetof_TINIB_texrtn,"offsetof(TINIB,texrtn)"
+sizeof_SEMINIB,sizeof(SEMINIB)
+offsetof_SEMINIB_sematr,"offsetof(SEMINIB,sematr)"
+offsetof_SEMINIB_isemcnt,"offsetof(SEMINIB,isemcnt)"
+offsetof_SEMINIB_maxsem,"offsetof(SEMINIB,maxsem)"
+sizeof_FLGPTN,sizeof(FLGPTN)
+sizeof_FLGINIB,sizeof(FLGINIB)
+offsetof_FLGINIB_flgatr,"offsetof(FLGINIB,flgatr)"
+offsetof_FLGINIB_iflgptn,"offsetof(FLGINIB,iflgptn)"
+sizeof_DTQINIB,sizeof(DTQINIB)
+offsetof_DTQINIB_dtqatr,"offsetof(DTQINIB,dtqatr)"
+offsetof_DTQINIB_dtqcnt,"offsetof(DTQINIB,dtqcnt)"
+offsetof_DTQINIB_p_dtqmb,"offsetof(DTQINIB,p_dtqmb)"
+sizeof_PDQINIB,sizeof(PDQINIB)
+offsetof_PDQINIB_pdqatr,"offsetof(PDQINIB,pdqatr)"
+offsetof_PDQINIB_pdqcnt,"offsetof(PDQINIB,pdqcnt)"
+offsetof_PDQINIB_maxdpri,"offsetof(PDQINIB,maxdpri)"
+offsetof_PDQINIB_p_pdqmb,"offsetof(PDQINIB,p_pdqmb)"
+sizeof_MBXINIB,sizeof(MBXINIB)
+offsetof_MBXINIB_mbxatr,"offsetof(MBXINIB,mbxatr)"
+offsetof_MBXINIB_maxmpri,"offsetof(MBXINIB,maxmpri)"
+sizeof_MPFINIB,sizeof(MPFINIB)
+offsetof_MPFINIB_mpfatr,"offsetof(MPFINIB,mpfatr)"
+offsetof_MPFINIB_blkcnt,"offsetof(MPFINIB,blkcnt)"
+offsetof_MPFINIB_blksz,"offsetof(MPFINIB,blksz)"
+offsetof_MPFINIB_mpf,"offsetof(MPFINIB,mpf)"
+offsetof_MPFINIB_p_mpfmb,"offsetof(MPFINIB,p_mpfmb)"
+sizeof_CYCINIB,sizeof(CYCINIB)
+offsetof_CYCINIB_cycatr,"offsetof(CYCINIB,cycatr)"
+offsetof_CYCINIB_exinf,"offsetof(CYCINIB,exinf)"
+offsetof_CYCINIB_cychdr,"offsetof(CYCINIB,cychdr)"
+offsetof_CYCINIB_cyctim,"offsetof(CYCINIB,cyctim)"
+offsetof_CYCINIB_cycphs,"offsetof(CYCINIB,cycphs)"
+sizeof_ALMINIB,sizeof(ALMINIB)
+offsetof_ALMINIB_almatr,"offsetof(ALMINIB,almatr)"
+offsetof_ALMINIB_exinf,"offsetof(ALMINIB,exinf)"
+offsetof_ALMINIB_almhdr,"offsetof(ALMINIB,almhdr)"
+sizeof_INHINIB,#!defined(OMIT_INITIALIZE_INTERRUPT),,sizeof(INHINIB)
+offset_INHINIB_inhno,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,inhno)"
+offset_INHINIB_inhatr,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,inhatr)"
+offset_INHINIB_int_entry,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,int_entry)"
+sizeof_INTINIB,#!defined(OMIT_INITIALIZE_INTERRUPT),,sizeof(INTINIB)
+offset_INTINIB_intno,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intno)"
+offset_INTINIB_intatr,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intatr)"
+offset_INTINIB_intpri,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intpri)"
+sizeof_EXCINIB,#!defined(OMIT_INITIALIZE_EXCEPTION),,sizeof(EXCINIB)
+offset_EXCINIB_excno,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,excno)"
+offset_EXCINIB_excatr,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,excatr)"
+offset_EXCINIB_exc_entry,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,exc_entry)"
diff --git a/asp/extension/rstr_task/kernel/kernel_rename.def b/asp/extension/rstr_task/kernel/kernel_rename.def
new file mode 100644 (file)
index 0000000..9c0fd66
--- /dev/null
@@ -0,0 +1,137 @@
+# startup.c
+kerflg
+exit_kernel
+
+# task.c
+p_runtsk
+p_schedtsk
+reqflg
+ipmflg
+disdsp
+dspflg
+ready_queue
+ready_primap
+initialize_task
+search_schedtsk
+make_runnable
+make_non_runnable
+make_dormant
+make_active
+change_priority
+raise_priority
+rotate_ready_queue
+call_texrtn
+calltex
+
+# wait.c
+make_wait_tmout
+wait_complete
+wait_tmout
+wait_tmout_ok
+wait_release
+wobj_make_wait
+wobj_make_wait_tmout
+init_wait_queue
+
+# time_event.c
+current_time
+min_time
+next_time
+next_subtime
+last_index
+initialize_tmevt
+tmevt_up
+tmevt_down
+tmevtb_insert
+tmevtb_delete
+tmevt_lefttim
+signal_time
+
+# semaphore.c
+initialize_semaphore
+
+# eventflag.c
+initialize_eventflag
+check_flg_cond
+
+# dataqueue.c
+initialize_dataqueue
+enqueue_data
+force_enqueue_data
+dequeue_data
+send_data
+force_send_data
+receive_data
+
+# pridataq.c
+initialize_pridataq
+enqueue_pridata
+dequeue_pridata
+send_pridata
+receive_pridata
+
+# mailbox.c
+initialize_mailbox
+
+# mempfix.c
+initialize_mempfix
+get_mpf_block
+
+# cyclic.c
+initialize_cyclic
+call_cychdr
+
+# alarm.c
+initialize_alarm
+call_almhdr
+
+# interrupt.c
+initialize_interrupt
+
+# exception.c
+initialize_exception
+
+# kernel_cfg.c
+initialize_object
+call_inirtn
+call_terrtn
+tmax_tskid
+tinib_table
+torder_table
+tcb_table
+tmax_semid
+seminib_table
+semcb_table
+tmax_flgid
+flginib_table
+flgcb_table
+tmax_dtqid
+dtqcb_table
+dtqinib_table
+tmax_pdqid
+pdqcb_table
+pdqinib_table
+tmax_mbxid
+mbxcb_table
+mbxinib_table
+tmax_mpfid
+mpfinib_table
+mpfcb_table
+tmax_cycid
+cycinib_table
+cyccb_table
+tmax_almid
+alminib_table
+almcb_table
+tnum_inhno
+inhinib_table
+tnum_intno
+intinib_table
+tnum_excno
+excinib_table
+tmevt_heap
+istksz
+istk
+istkpt
+
+INCLUDE "target"
diff --git a/asp/extension/rstr_task/kernel/kernel_rename.h b/asp/extension/rstr_task/kernel/kernel_rename.h
new file mode 100644 (file)
index 0000000..adb5eeb
--- /dev/null
@@ -0,0 +1,346 @@
+/* This file is generated from kernel_rename.def by genrename. */
+
+#ifndef TOPPERS_KERNEL_RENAME_H
+#define TOPPERS_KERNEL_RENAME_H
+
+/*
+ *  startup.c
+ */
+#define kerflg                                         _kernel_kerflg
+#define exit_kernel                                    _kernel_exit_kernel
+
+/*
+ *  task.c
+ */
+#define p_runtsk                                       _kernel_p_runtsk
+#define p_schedtsk                                     _kernel_p_schedtsk
+#define reqflg                                         _kernel_reqflg
+#define ipmflg                                         _kernel_ipmflg
+#define disdsp                                         _kernel_disdsp
+#define dspflg                                         _kernel_dspflg
+#define ready_queue                                    _kernel_ready_queue
+#define ready_primap                           _kernel_ready_primap
+#define initialize_task                                _kernel_initialize_task
+#define search_schedtsk                                _kernel_search_schedtsk
+#define make_runnable                          _kernel_make_runnable
+#define make_non_runnable                      _kernel_make_non_runnable
+#define make_dormant                           _kernel_make_dormant
+#define make_active                                    _kernel_make_active
+#define change_priority                                _kernel_change_priority
+#define raise_priority                         _kernel_raise_priority
+#define rotate_ready_queue                     _kernel_rotate_ready_queue
+#define call_texrtn                                    _kernel_call_texrtn
+#define calltex                                                _kernel_calltex
+
+/*
+ *  wait.c
+ */
+#define make_wait_tmout                                _kernel_make_wait_tmout
+#define wait_complete                          _kernel_wait_complete
+#define wait_tmout                                     _kernel_wait_tmout
+#define wait_tmout_ok                          _kernel_wait_tmout_ok
+#define wait_release                           _kernel_wait_release
+#define wobj_make_wait                         _kernel_wobj_make_wait
+#define wobj_make_wait_tmout           _kernel_wobj_make_wait_tmout
+#define init_wait_queue                                _kernel_init_wait_queue
+
+/*
+ *  time_event.c
+ */
+#define current_time                           _kernel_current_time
+#define min_time                                       _kernel_min_time
+#define next_time                                      _kernel_next_time
+#define next_subtime                           _kernel_next_subtime
+#define last_index                                     _kernel_last_index
+#define initialize_tmevt                       _kernel_initialize_tmevt
+#define tmevt_up                                       _kernel_tmevt_up
+#define tmevt_down                                     _kernel_tmevt_down
+#define tmevtb_insert                          _kernel_tmevtb_insert
+#define tmevtb_delete                          _kernel_tmevtb_delete
+#define tmevt_lefttim                          _kernel_tmevt_lefttim
+#define signal_time                                    _kernel_signal_time
+
+/*
+ *  semaphore.c
+ */
+#define initialize_semaphore           _kernel_initialize_semaphore
+
+/*
+ *  eventflag.c
+ */
+#define initialize_eventflag           _kernel_initialize_eventflag
+#define check_flg_cond                         _kernel_check_flg_cond
+
+/*
+ *  dataqueue.c
+ */
+#define initialize_dataqueue           _kernel_initialize_dataqueue
+#define enqueue_data                           _kernel_enqueue_data
+#define force_enqueue_data                     _kernel_force_enqueue_data
+#define dequeue_data                           _kernel_dequeue_data
+#define send_data                                      _kernel_send_data
+#define force_send_data                                _kernel_force_send_data
+#define receive_data                           _kernel_receive_data
+
+/*
+ *  pridataq.c
+ */
+#define initialize_pridataq                    _kernel_initialize_pridataq
+#define enqueue_pridata                                _kernel_enqueue_pridata
+#define dequeue_pridata                                _kernel_dequeue_pridata
+#define send_pridata                           _kernel_send_pridata
+#define receive_pridata                                _kernel_receive_pridata
+
+/*
+ *  mailbox.c
+ */
+#define initialize_mailbox                     _kernel_initialize_mailbox
+
+/*
+ *  mempfix.c
+ */
+#define initialize_mempfix                     _kernel_initialize_mempfix
+#define get_mpf_block                          _kernel_get_mpf_block
+
+/*
+ *  cyclic.c
+ */
+#define initialize_cyclic                      _kernel_initialize_cyclic
+#define call_cychdr                                    _kernel_call_cychdr
+
+/*
+ *  alarm.c
+ */
+#define initialize_alarm                       _kernel_initialize_alarm
+#define call_almhdr                                    _kernel_call_almhdr
+
+/*
+ *  interrupt.c
+ */
+#define initialize_interrupt           _kernel_initialize_interrupt
+
+/*
+ *  exception.c
+ */
+#define initialize_exception           _kernel_initialize_exception
+
+/*
+ *  kernel_cfg.c
+ */
+#define initialize_object                      _kernel_initialize_object
+#define call_inirtn                                    _kernel_call_inirtn
+#define call_terrtn                                    _kernel_call_terrtn
+#define tmax_tskid                                     _kernel_tmax_tskid
+#define tinib_table                                    _kernel_tinib_table
+#define torder_table                           _kernel_torder_table
+#define tcb_table                                      _kernel_tcb_table
+#define tmax_semid                                     _kernel_tmax_semid
+#define seminib_table                          _kernel_seminib_table
+#define semcb_table                                    _kernel_semcb_table
+#define tmax_flgid                                     _kernel_tmax_flgid
+#define flginib_table                          _kernel_flginib_table
+#define flgcb_table                                    _kernel_flgcb_table
+#define tmax_dtqid                                     _kernel_tmax_dtqid
+#define dtqcb_table                                    _kernel_dtqcb_table
+#define dtqinib_table                          _kernel_dtqinib_table
+#define tmax_pdqid                                     _kernel_tmax_pdqid
+#define pdqcb_table                                    _kernel_pdqcb_table
+#define pdqinib_table                          _kernel_pdqinib_table
+#define tmax_mbxid                                     _kernel_tmax_mbxid
+#define mbxcb_table                                    _kernel_mbxcb_table
+#define mbxinib_table                          _kernel_mbxinib_table
+#define tmax_mpfid                                     _kernel_tmax_mpfid
+#define mpfinib_table                          _kernel_mpfinib_table
+#define mpfcb_table                                    _kernel_mpfcb_table
+#define tmax_cycid                                     _kernel_tmax_cycid
+#define cycinib_table                          _kernel_cycinib_table
+#define cyccb_table                                    _kernel_cyccb_table
+#define tmax_almid                                     _kernel_tmax_almid
+#define alminib_table                          _kernel_alminib_table
+#define almcb_table                                    _kernel_almcb_table
+#define tnum_inhno                                     _kernel_tnum_inhno
+#define inhinib_table                          _kernel_inhinib_table
+#define tnum_intno                                     _kernel_tnum_intno
+#define intinib_table                          _kernel_intinib_table
+#define tnum_excno                                     _kernel_tnum_excno
+#define excinib_table                          _kernel_excinib_table
+#define tmevt_heap                                     _kernel_tmevt_heap
+#define istksz                                         _kernel_istksz
+#define istk                                           _kernel_istk
+#define istkpt                                         _kernel_istkpt
+
+
+#ifdef TOPPERS_LABEL_ASM
+
+/*
+ *  startup.c
+ */
+#define _kerflg                                                __kernel_kerflg
+#define _exit_kernel                           __kernel_exit_kernel
+
+/*
+ *  task.c
+ */
+#define _p_runtsk                                      __kernel_p_runtsk
+#define _p_schedtsk                                    __kernel_p_schedtsk
+#define _reqflg                                                __kernel_reqflg
+#define _ipmflg                                                __kernel_ipmflg
+#define _disdsp                                                __kernel_disdsp
+#define _dspflg                                                __kernel_dspflg
+#define _ready_queue                           __kernel_ready_queue
+#define _ready_primap                          __kernel_ready_primap
+#define _initialize_task                       __kernel_initialize_task
+#define _search_schedtsk                       __kernel_search_schedtsk
+#define _make_runnable                         __kernel_make_runnable
+#define _make_non_runnable                     __kernel_make_non_runnable
+#define _make_dormant                          __kernel_make_dormant
+#define _make_active                           __kernel_make_active
+#define _change_priority                       __kernel_change_priority
+#define _raise_priority                                __kernel_raise_priority
+#define _rotate_ready_queue                    __kernel_rotate_ready_queue
+#define _call_texrtn                           __kernel_call_texrtn
+#define _calltex                                       __kernel_calltex
+
+/*
+ *  wait.c
+ */
+#define _make_wait_tmout                       __kernel_make_wait_tmout
+#define _wait_complete                         __kernel_wait_complete
+#define _wait_tmout                                    __kernel_wait_tmout
+#define _wait_tmout_ok                         __kernel_wait_tmout_ok
+#define _wait_release                          __kernel_wait_release
+#define _wobj_make_wait                                __kernel_wobj_make_wait
+#define _wobj_make_wait_tmout          __kernel_wobj_make_wait_tmout
+#define _init_wait_queue                       __kernel_init_wait_queue
+
+/*
+ *  time_event.c
+ */
+#define _current_time                          __kernel_current_time
+#define _min_time                                      __kernel_min_time
+#define _next_time                                     __kernel_next_time
+#define _next_subtime                          __kernel_next_subtime
+#define _last_index                                    __kernel_last_index
+#define _initialize_tmevt                      __kernel_initialize_tmevt
+#define _tmevt_up                                      __kernel_tmevt_up
+#define _tmevt_down                                    __kernel_tmevt_down
+#define _tmevtb_insert                         __kernel_tmevtb_insert
+#define _tmevtb_delete                         __kernel_tmevtb_delete
+#define _tmevt_lefttim                         __kernel_tmevt_lefttim
+#define _signal_time                           __kernel_signal_time
+
+/*
+ *  semaphore.c
+ */
+#define _initialize_semaphore          __kernel_initialize_semaphore
+
+/*
+ *  eventflag.c
+ */
+#define _initialize_eventflag          __kernel_initialize_eventflag
+#define _check_flg_cond                                __kernel_check_flg_cond
+
+/*
+ *  dataqueue.c
+ */
+#define _initialize_dataqueue          __kernel_initialize_dataqueue
+#define _enqueue_data                          __kernel_enqueue_data
+#define _force_enqueue_data                    __kernel_force_enqueue_data
+#define _dequeue_data                          __kernel_dequeue_data
+#define _send_data                                     __kernel_send_data
+#define _force_send_data                       __kernel_force_send_data
+#define _receive_data                          __kernel_receive_data
+
+/*
+ *  pridataq.c
+ */
+#define _initialize_pridataq           __kernel_initialize_pridataq
+#define _enqueue_pridata                       __kernel_enqueue_pridata
+#define _dequeue_pridata                       __kernel_dequeue_pridata
+#define _send_pridata                          __kernel_send_pridata
+#define _receive_pridata                       __kernel_receive_pridata
+
+/*
+ *  mailbox.c
+ */
+#define _initialize_mailbox                    __kernel_initialize_mailbox
+
+/*
+ *  mempfix.c
+ */
+#define _initialize_mempfix                    __kernel_initialize_mempfix
+#define _get_mpf_block                         __kernel_get_mpf_block
+
+/*
+ *  cyclic.c
+ */
+#define _initialize_cyclic                     __kernel_initialize_cyclic
+#define _call_cychdr                           __kernel_call_cychdr
+
+/*
+ *  alarm.c
+ */
+#define _initialize_alarm                      __kernel_initialize_alarm
+#define _call_almhdr                           __kernel_call_almhdr
+
+/*
+ *  interrupt.c
+ */
+#define _initialize_interrupt          __kernel_initialize_interrupt
+
+/*
+ *  exception.c
+ */
+#define _initialize_exception          __kernel_initialize_exception
+
+/*
+ *  kernel_cfg.c
+ */
+#define _initialize_object                     __kernel_initialize_object
+#define _call_inirtn                           __kernel_call_inirtn
+#define _call_terrtn                           __kernel_call_terrtn
+#define _tmax_tskid                                    __kernel_tmax_tskid
+#define _tinib_table                           __kernel_tinib_table
+#define _torder_table                          __kernel_torder_table
+#define _tcb_table                                     __kernel_tcb_table
+#define _tmax_semid                                    __kernel_tmax_semid
+#define _seminib_table                         __kernel_seminib_table
+#define _semcb_table                           __kernel_semcb_table
+#define _tmax_flgid                                    __kernel_tmax_flgid
+#define _flginib_table                         __kernel_flginib_table
+#define _flgcb_table                           __kernel_flgcb_table
+#define _tmax_dtqid                                    __kernel_tmax_dtqid
+#define _dtqcb_table                           __kernel_dtqcb_table
+#define _dtqinib_table                         __kernel_dtqinib_table
+#define _tmax_pdqid                                    __kernel_tmax_pdqid
+#define _pdqcb_table                           __kernel_pdqcb_table
+#define _pdqinib_table                         __kernel_pdqinib_table
+#define _tmax_mbxid                                    __kernel_tmax_mbxid
+#define _mbxcb_table                           __kernel_mbxcb_table
+#define _mbxinib_table                         __kernel_mbxinib_table
+#define _tmax_mpfid                                    __kernel_tmax_mpfid
+#define _mpfinib_table                         __kernel_mpfinib_table
+#define _mpfcb_table                           __kernel_mpfcb_table
+#define _tmax_cycid                                    __kernel_tmax_cycid
+#define _cycinib_table                         __kernel_cycinib_table
+#define _cyccb_table                           __kernel_cyccb_table
+#define _tmax_almid                                    __kernel_tmax_almid
+#define _alminib_table                         __kernel_alminib_table
+#define _almcb_table                           __kernel_almcb_table
+#define _tnum_inhno                                    __kernel_tnum_inhno
+#define _inhinib_table                         __kernel_inhinib_table
+#define _tnum_intno                                    __kernel_tnum_intno
+#define _intinib_table                         __kernel_intinib_table
+#define _tnum_excno                                    __kernel_tnum_excno
+#define _excinib_table                         __kernel_excinib_table
+#define _tmevt_heap                                    __kernel_tmevt_heap
+#define _istksz                                                __kernel_istksz
+#define _istk                                          __kernel_istk
+#define _istkpt                                                __kernel_istkpt
+
+
+#endif /* TOPPERS_LABEL_ASM */
+
+#include "target_rename.h"
+
+#endif /* TOPPERS_KERNEL_RENAME_H */
diff --git a/asp/extension/rstr_task/kernel/kernel_unrename.h b/asp/extension/rstr_task/kernel/kernel_unrename.h
new file mode 100644 (file)
index 0000000..57ab2e9
--- /dev/null
@@ -0,0 +1,347 @@
+/* This file is generated from kernel_rename.def by genrename. */
+
+/* This file is included only when kernel_rename.h has been included. */
+#ifdef TOPPERS_KERNEL_RENAME_H
+#undef TOPPERS_KERNEL_RENAME_H
+
+/*
+ *  startup.c
+ */
+#undef kerflg
+#undef exit_kernel
+
+/*
+ *  task.c
+ */
+#undef p_runtsk
+#undef p_schedtsk
+#undef reqflg
+#undef ipmflg
+#undef disdsp
+#undef dspflg
+#undef ready_queue
+#undef ready_primap
+#undef initialize_task
+#undef search_schedtsk
+#undef make_runnable
+#undef make_non_runnable
+#undef make_dormant
+#undef make_active
+#undef change_priority
+#undef raise_priority
+#undef rotate_ready_queue
+#undef call_texrtn
+#undef calltex
+
+/*
+ *  wait.c
+ */
+#undef make_wait_tmout
+#undef wait_complete
+#undef wait_tmout
+#undef wait_tmout_ok
+#undef wait_release
+#undef wobj_make_wait
+#undef wobj_make_wait_tmout
+#undef init_wait_queue
+
+/*
+ *  time_event.c
+ */
+#undef current_time
+#undef min_time
+#undef next_time
+#undef next_subtime
+#undef last_index
+#undef initialize_tmevt
+#undef tmevt_up
+#undef tmevt_down
+#undef tmevtb_insert
+#undef tmevtb_delete
+#undef tmevt_lefttim
+#undef signal_time
+
+/*
+ *  semaphore.c
+ */
+#undef initialize_semaphore
+
+/*
+ *  eventflag.c
+ */
+#undef initialize_eventflag
+#undef check_flg_cond
+
+/*
+ *  dataqueue.c
+ */
+#undef initialize_dataqueue
+#undef enqueue_data
+#undef force_enqueue_data
+#undef dequeue_data
+#undef send_data
+#undef force_send_data
+#undef receive_data
+
+/*
+ *  pridataq.c
+ */
+#undef initialize_pridataq
+#undef enqueue_pridata
+#undef dequeue_pridata
+#undef send_pridata
+#undef receive_pridata
+
+/*
+ *  mailbox.c
+ */
+#undef initialize_mailbox
+
+/*
+ *  mempfix.c
+ */
+#undef initialize_mempfix
+#undef get_mpf_block
+
+/*
+ *  cyclic.c
+ */
+#undef initialize_cyclic
+#undef call_cychdr
+
+/*
+ *  alarm.c
+ */
+#undef initialize_alarm
+#undef call_almhdr
+
+/*
+ *  interrupt.c
+ */
+#undef initialize_interrupt
+
+/*
+ *  exception.c
+ */
+#undef initialize_exception
+
+/*
+ *  kernel_cfg.c
+ */
+#undef initialize_object
+#undef call_inirtn
+#undef call_terrtn
+#undef tmax_tskid
+#undef tinib_table
+#undef torder_table
+#undef tcb_table
+#undef tmax_semid
+#undef seminib_table
+#undef semcb_table
+#undef tmax_flgid
+#undef flginib_table
+#undef flgcb_table
+#undef tmax_dtqid
+#undef dtqcb_table
+#undef dtqinib_table
+#undef tmax_pdqid
+#undef pdqcb_table
+#undef pdqinib_table
+#undef tmax_mbxid
+#undef mbxcb_table
+#undef mbxinib_table
+#undef tmax_mpfid
+#undef mpfinib_table
+#undef mpfcb_table
+#undef tmax_cycid
+#undef cycinib_table
+#undef cyccb_table
+#undef tmax_almid
+#undef alminib_table
+#undef almcb_table
+#undef tnum_inhno
+#undef inhinib_table
+#undef tnum_intno
+#undef intinib_table
+#undef tnum_excno
+#undef excinib_table
+#undef tmevt_heap
+#undef istksz
+#undef istk
+#undef istkpt
+
+
+#ifdef TOPPERS_LABEL_ASM
+
+/*
+ *  startup.c
+ */
+#undef _kerflg
+#undef _exit_kernel
+
+/*
+ *  task.c
+ */
+#undef _p_runtsk
+#undef _p_schedtsk
+#undef _reqflg
+#undef _ipmflg
+#undef _disdsp
+#undef _dspflg
+#undef _ready_queue
+#undef _ready_primap
+#undef _initialize_task
+#undef _search_schedtsk
+#undef _make_runnable
+#undef _make_non_runnable
+#undef _make_dormant
+#undef _make_active
+#undef _change_priority
+#undef _raise_priority
+#undef _rotate_ready_queue
+#undef _call_texrtn
+#undef _calltex
+
+/*
+ *  wait.c
+ */
+#undef _make_wait_tmout
+#undef _wait_complete
+#undef _wait_tmout
+#undef _wait_tmout_ok
+#undef _wait_release
+#undef _wobj_make_wait
+#undef _wobj_make_wait_tmout
+#undef _init_wait_queue
+
+/*
+ *  time_event.c
+ */
+#undef _current_time
+#undef _min_time
+#undef _next_time
+#undef _next_subtime
+#undef _last_index
+#undef _initialize_tmevt
+#undef _tmevt_up
+#undef _tmevt_down
+#undef _tmevtb_insert
+#undef _tmevtb_delete
+#undef _tmevt_lefttim
+#undef _signal_time
+
+/*
+ *  semaphore.c
+ */
+#undef _initialize_semaphore
+
+/*
+ *  eventflag.c
+ */
+#undef _initialize_eventflag
+#undef _check_flg_cond
+
+/*
+ *  dataqueue.c
+ */
+#undef _initialize_dataqueue
+#undef _enqueue_data
+#undef _force_enqueue_data
+#undef _dequeue_data
+#undef _send_data
+#undef _force_send_data
+#undef _receive_data
+
+/*
+ *  pridataq.c
+ */
+#undef _initialize_pridataq
+#undef _enqueue_pridata
+#undef _dequeue_pridata
+#undef _send_pridata
+#undef _receive_pridata
+
+/*
+ *  mailbox.c
+ */
+#undef _initialize_mailbox
+
+/*
+ *  mempfix.c
+ */
+#undef _initialize_mempfix
+#undef _get_mpf_block
+
+/*
+ *  cyclic.c
+ */
+#undef _initialize_cyclic
+#undef _call_cychdr
+
+/*
+ *  alarm.c
+ */
+#undef _initialize_alarm
+#undef _call_almhdr
+
+/*
+ *  interrupt.c
+ */
+#undef _initialize_interrupt
+
+/*
+ *  exception.c
+ */
+#undef _initialize_exception
+
+/*
+ *  kernel_cfg.c
+ */
+#undef _initialize_object
+#undef _call_inirtn
+#undef _call_terrtn
+#undef _tmax_tskid
+#undef _tinib_table
+#undef _torder_table
+#undef _tcb_table
+#undef _tmax_semid
+#undef _seminib_table
+#undef _semcb_table
+#undef _tmax_flgid
+#undef _flginib_table
+#undef _flgcb_table
+#undef _tmax_dtqid
+#undef _dtqcb_table
+#undef _dtqinib_table
+#undef _tmax_pdqid
+#undef _pdqcb_table
+#undef _pdqinib_table
+#undef _tmax_mbxid
+#undef _mbxcb_table
+#undef _mbxinib_table
+#undef _tmax_mpfid
+#undef _mpfinib_table
+#undef _mpfcb_table
+#undef _tmax_cycid
+#undef _cycinib_table
+#undef _cyccb_table
+#undef _tmax_almid
+#undef _alminib_table
+#undef _almcb_table
+#undef _tnum_inhno
+#undef _inhinib_table
+#undef _tnum_intno
+#undef _intinib_table
+#undef _tnum_excno
+#undef _excinib_table
+#undef _tmevt_heap
+#undef _istksz
+#undef _istk
+#undef _istkpt
+
+
+#endif /* TOPPERS_LABEL_ASM */
+
+#include "target_unrename.h"
+
+#endif /* TOPPERS_KERNEL_RENAME_H */
diff --git a/asp/extension/rstr_task/kernel/sys_manage.c b/asp/extension/rstr_task/kernel/sys_manage.c
new file mode 100644 (file)
index 0000000..dbe2394
--- /dev/null
@@ -0,0 +1,555 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  $Id: sys_manage.c 2018 2010-12-31 13:43:05Z ertl-hiro $
+ */
+
+/*
+ *             システム状態管理機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+
+/*
+ *  トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_ROT_RDQ_ENTER
+#define LOG_ROT_RDQ_ENTER(tskpri)
+#endif /* LOG_ROT_RDQ_ENTER */
+
+#ifndef LOG_ROT_RDQ_LEAVE
+#define LOG_ROT_RDQ_LEAVE(ercd)
+#endif /* LOG_ROT_RDQ_LEAVE */
+
+#ifndef LOG_IROT_RDQ_ENTER
+#define LOG_IROT_RDQ_ENTER(tskpri)
+#endif /* LOG_IROT_RDQ_ENTER */
+
+#ifndef LOG_IROT_RDQ_LEAVE
+#define LOG_IROT_RDQ_LEAVE(ercd)
+#endif /* LOG_IROT_RDQ_LEAVE */
+
+#ifndef LOG_GET_TID_ENTER
+#define LOG_GET_TID_ENTER(p_tskid)
+#endif /* LOG_GET_TID_ENTER */
+
+#ifndef LOG_GET_TID_LEAVE
+#define LOG_GET_TID_LEAVE(ercd, tskid)
+#endif /* LOG_GET_TID_LEAVE */
+
+#ifndef LOG_IGET_TID_ENTER
+#define LOG_IGET_TID_ENTER(p_tskid)
+#endif /* LOG_IGET_TID_ENTER */
+
+#ifndef LOG_IGET_TID_LEAVE
+#define LOG_IGET_TID_LEAVE(ercd, tskid)
+#endif /* LOG_IGET_TID_LEAVE */
+
+#ifndef LOG_LOC_CPU_ENTER
+#define LOG_LOC_CPU_ENTER()
+#endif /* LOG_LOC_CPU_ENTER */
+
+#ifndef LOG_LOC_CPU_LEAVE
+#define LOG_LOC_CPU_LEAVE(ercd)
+#endif /* LOG_LOC_CPU_LEAVE */
+
+#ifndef LOG_ILOC_CPU_ENTER
+#define LOG_ILOC_CPU_ENTER()
+#endif /* LOG_ILOC_CPU_ENTER */
+
+#ifndef LOG_ILOC_CPU_LEAVE
+#define LOG_ILOC_CPU_LEAVE(ercd)
+#endif /* LOG_ILOC_CPU_LEAVE */
+
+#ifndef LOG_UNL_CPU_ENTER
+#define LOG_UNL_CPU_ENTER()
+#endif /* LOG_UNL_CPU_ENTER */
+
+#ifndef LOG_UNL_CPU_LEAVE
+#define LOG_UNL_CPU_LEAVE(ercd)
+#endif /* LOG_UNL_CPU_LEAVE */
+
+#ifndef LOG_IUNL_CPU_ENTER
+#define LOG_IUNL_CPU_ENTER()
+#endif /* LOG_IUNL_CPU_ENTER */
+
+#ifndef LOG_IUNL_CPU_LEAVE
+#define LOG_IUNL_CPU_LEAVE(ercd)
+#endif /* LOG_IUNL_CPU_LEAVE */
+
+#ifndef LOG_DIS_DSP_ENTER
+#define LOG_DIS_DSP_ENTER()
+#endif /* LOG_DIS_DSP_ENTER */
+
+#ifndef LOG_DIS_DSP_LEAVE
+#define LOG_DIS_DSP_LEAVE(ercd)
+#endif /* LOG_DIS_DSP_LEAVE */
+
+#ifndef LOG_ENA_DSP_ENTER
+#define LOG_ENA_DSP_ENTER()
+#endif /* LOG_ENA_DSP_ENTER */
+
+#ifndef LOG_ENA_DSP_LEAVE
+#define LOG_ENA_DSP_LEAVE(ercd)
+#endif /* LOG_ENA_DSP_LEAVE */
+
+#ifndef LOG_SNS_CTX_ENTER
+#define LOG_SNS_CTX_ENTER()
+#endif /* LOG_SNS_CTX_ENTER */
+
+#ifndef LOG_SNS_CTX_LEAVE
+#define LOG_SNS_CTX_LEAVE(state)
+#endif /* LOG_SNS_CTX_LEAVE */
+
+#ifndef LOG_SNS_LOC_ENTER
+#define LOG_SNS_LOC_ENTER()
+#endif /* LOG_SNS_LOC_ENTER */
+
+#ifndef LOG_SNS_LOC_LEAVE
+#define LOG_SNS_LOC_LEAVE(state)
+#endif /* LOG_SNS_LOC_LEAVE */
+
+#ifndef LOG_SNS_DSP_ENTER
+#define LOG_SNS_DSP_ENTER()
+#endif /* LOG_SNS_DSP_ENTER */
+
+#ifndef LOG_SNS_DSP_LEAVE
+#define LOG_SNS_DSP_LEAVE(state)
+#endif /* LOG_SNS_DSP_LEAVE */
+
+#ifndef LOG_SNS_DPN_ENTER
+#define LOG_SNS_DPN_ENTER()
+#endif /* LOG_SNS_DPN_ENTER */
+
+#ifndef LOG_SNS_DPN_LEAVE
+#define LOG_SNS_DPN_LEAVE(state)
+#endif /* LOG_SNS_DPN_LEAVE */
+
+#ifndef LOG_SNS_KER_ENTER
+#define LOG_SNS_KER_ENTER()
+#endif /* LOG_SNS_KER_ENTER */
+
+#ifndef LOG_SNS_KER_LEAVE
+#define LOG_SNS_KER_LEAVE(state)
+#endif /* LOG_SNS_KER_LEAVE */
+
+/*
+ *  タスクの優先順位の回転
+ */
+#ifdef TOPPERS_rot_rdq
+
+ER
+rot_rdq(PRI tskpri)
+{
+       uint_t  pri;
+       QUEUE   *p_queue;
+       ER              ercd;
+
+       LOG_ROT_RDQ_ENTER(tskpri);
+       CHECK_TSKCTX_UNL();
+       CHECK_TPRI_SELF(tskpri);
+
+       t_lock_cpu();
+       pri = (tskpri == TPRI_SELF) ? p_runtsk->priority : INT_PRIORITY(tskpri);
+       p_queue = &(ready_queue[pri]);
+       if (queue_empty(p_queue)) {
+               ercd = E_OK;
+       }
+       else if ((((TCB *)(p_queue->p_next))->p_tinib->tskatr & TA_RSTR) != 0U) {
+               ercd = E_NOSPT;
+       }
+       else {
+               if (rotate_ready_queue(p_queue)) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_ROT_RDQ_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_rot_rdq */
+
+/*
+ *  タスクの優先順位の回転(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_irot_rdq
+
+ER
+irot_rdq(PRI tskpri)
+{
+       QUEUE   *p_queue;
+       ER              ercd;
+
+       LOG_IROT_RDQ_ENTER(tskpri);
+       CHECK_INTCTX_UNL();
+       CHECK_TPRI(tskpri);
+
+       i_lock_cpu();
+       p_queue = &(ready_queue[INT_PRIORITY(tskpri)]);
+       if (queue_empty(p_queue)) {
+               ercd = E_OK;
+       }
+       else if ((((TCB *)(p_queue->p_next))->p_tinib->tskatr & TA_RSTR) != 0U) {
+               ercd = E_NOSPT;
+       }
+       else {
+               if (rotate_ready_queue(p_queue)) {
+                       reqflg = true;
+               }
+               ercd = E_OK;
+       }
+       i_unlock_cpu();
+
+  error_exit:
+       LOG_IROT_RDQ_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_irot_rdq */
+
+/*
+ *  実行状態のタスクIDの参照
+ */
+#ifdef TOPPERS_get_tid
+
+ER
+get_tid(ID *p_tskid)
+{
+       ER              ercd;
+
+       LOG_GET_TID_ENTER(p_tskid);
+       CHECK_TSKCTX_UNL();
+
+       t_lock_cpu();
+       *p_tskid = TSKID(p_runtsk);
+       ercd = E_OK;
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_GET_TID_LEAVE(ercd, *p_tskid);
+       return(ercd);
+}
+
+#endif /* TOPPERS_get_tid */
+
+/*
+ *  実行状態のタスクIDの参照(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_iget_tid
+
+ER
+iget_tid(ID *p_tskid)
+{
+       ER              ercd;
+
+       LOG_IGET_TID_ENTER(p_tskid);
+       CHECK_INTCTX_UNL();
+
+       i_lock_cpu();
+       *p_tskid = (p_runtsk == NULL) ? TSK_NONE : TSKID(p_runtsk);
+       ercd = E_OK;
+       i_unlock_cpu();
+
+  error_exit:
+       LOG_IGET_TID_LEAVE(ercd, *p_tskid);
+       return(ercd);
+}
+
+#endif /* TOPPERS_iget_tid */
+
+/*
+ *  CPUロック状態への移行
+ */
+#ifdef TOPPERS_loc_cpu
+
+ER
+loc_cpu(void)
+{
+       ER              ercd;
+
+       LOG_LOC_CPU_ENTER();
+       CHECK_TSKCTX();
+
+       if (!t_sense_lock()) {
+               t_lock_cpu();
+       }
+       ercd = E_OK;
+
+  error_exit:
+       LOG_LOC_CPU_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_loc_cpu */
+
+/*
+ *  CPUロック状態への移行(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_iloc_cpu
+
+ER
+iloc_cpu(void)
+{
+       ER              ercd;
+
+       LOG_ILOC_CPU_ENTER();
+       CHECK_INTCTX();
+
+       if (!i_sense_lock()) {
+               i_lock_cpu();
+       }
+       ercd = E_OK;
+
+  error_exit:
+       LOG_ILOC_CPU_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_iloc_cpu */
+
+/*
+ *  CPUロック状態の解除
+ *
+ *  CPUロック中は,ディスパッチが必要となるサービスコールを呼び出すこ
+ *  とはできないため,CPUロック状態の解除時にディスパッチャを起動する
+ *  必要はない.
+ */
+#ifdef TOPPERS_unl_cpu
+
+ER
+unl_cpu(void)
+{
+       ER              ercd;
+
+       LOG_UNL_CPU_ENTER();
+       CHECK_TSKCTX();
+
+       if (t_sense_lock()) {
+               t_unlock_cpu();
+       }
+       ercd = E_OK;
+
+  error_exit:
+       LOG_UNL_CPU_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_unl_cpu */
+
+/*
+ *  CPUロック状態の解除(非タスクコンテキスト用)
+ *
+ *  CPUロック中は,ディスパッチが必要となるサービスコールを呼び出すこ
+ *  とはできないため,CPUロック状態の解除時にディスパッチャの起動を要
+ *  求する必要はない.
+ */
+#ifdef TOPPERS_iunl_cpu
+
+ER
+iunl_cpu(void)
+{
+       ER              ercd;
+
+       LOG_IUNL_CPU_ENTER();
+       CHECK_INTCTX();
+
+       if (i_sense_lock()) {
+               i_unlock_cpu();
+       }
+       ercd = E_OK;
+
+  error_exit:
+       LOG_IUNL_CPU_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_iunl_cpu */
+
+/*
+ *  ディスパッチの禁止
+ */
+#ifdef TOPPERS_dis_dsp
+
+ER
+dis_dsp(void)
+{
+       ER              ercd;
+
+       LOG_DIS_DSP_ENTER();
+       CHECK_TSKCTX_UNL();
+
+       t_lock_cpu();
+       disdsp = true;
+       dspflg = false;
+       ercd = E_OK;
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_DIS_DSP_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_dis_dsp */
+
+/*
+ *  ディスパッチの許可
+ */
+#ifdef TOPPERS_ena_dsp
+
+ER
+ena_dsp(void)
+{
+       ER              ercd;
+
+       LOG_ENA_DSP_ENTER();
+       CHECK_TSKCTX_UNL();
+
+       t_lock_cpu();
+       disdsp = false;
+       if (ipmflg) {
+               dspflg = true;
+               if (p_runtsk != p_schedtsk) {
+                       dispatch();
+               }
+       }
+       ercd = E_OK;
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_ENA_DSP_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ena_dsp */
+
+/*
+ *  コンテキストの参照
+ */
+#ifdef TOPPERS_sns_ctx
+
+bool_t
+sns_ctx(void)
+{
+       bool_t  state;
+
+       LOG_SNS_CTX_ENTER();
+       state = sense_context() ? true : false;
+       LOG_SNS_CTX_LEAVE(state);
+       return(state);
+}
+
+#endif /* TOPPERS_sns_ctx */
+
+/*
+ *  CPUロック状態の参照
+ */
+#ifdef TOPPERS_sns_loc
+
+bool_t
+sns_loc(void)
+{
+       bool_t  state;
+
+       LOG_SNS_LOC_ENTER();
+       state = x_sense_lock() ? true : false;
+       LOG_SNS_LOC_LEAVE(state);
+       return(state);
+}
+
+#endif /* TOPPERS_sns_loc */
+
+/*
+ *  ディスパッチ禁止状態の参照
+ */
+#ifdef TOPPERS_sns_dsp
+
+bool_t
+sns_dsp(void)
+{
+       bool_t  state;
+
+       LOG_SNS_DSP_ENTER();
+       state = disdsp;
+       LOG_SNS_DSP_LEAVE(state);
+       return(state);
+}
+
+#endif /* TOPPERS_sns_dsp */
+
+/*
+ *  ディスパッチ保留状態の参照
+ */
+#ifdef TOPPERS_sns_dpn
+
+bool_t
+sns_dpn(void)
+{
+       bool_t  state;
+
+       LOG_SNS_DPN_ENTER();
+       state = (sense_context() || t_sense_lock() || !dspflg) ? true : false;
+       LOG_SNS_DPN_LEAVE(state);
+       return(state);
+}
+
+#endif /* TOPPERS_sns_dpn */
+
+/*
+ *  カーネル非動作状態の参照
+ */
+#ifdef TOPPERS_sns_ker
+
+bool_t
+sns_ker(void)
+{
+       bool_t  state;
+
+       LOG_SNS_KER_ENTER();
+       state = kerflg ? false : true;
+       LOG_SNS_KER_LEAVE(state);
+       return(state);
+}
+
+#endif /* TOPPERS_sns_ker */
diff --git a/asp/extension/rstr_task/kernel/task.c b/asp/extension/rstr_task/kernel/task.c
new file mode 100644 (file)
index 0000000..aa3e1ad
--- /dev/null
@@ -0,0 +1,518 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  $Id: task.c 2018 2010-12-31 13:43:05Z ertl-hiro $
+ */
+
+/*
+ *             タスク管理モジュール
+ */
+
+#include "kernel_impl.h"
+#include "wait.h"
+#include "task.h"
+
+/*
+ *  トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_TEX_ENTER
+#define LOG_TEX_ENTER(p_tcb, texptn)
+#endif /* LOG_TEX_ENTER */
+
+#ifndef LOG_TEX_LEAVE
+#define LOG_TEX_LEAVE(p_tcb)
+#endif /* LOG_TEX_LEAVE */
+
+#ifdef TOPPERS_tskini
+
+/*
+ *  実行状態のタスク
+ */
+TCB            *p_runtsk;
+
+/*
+ *  最高優先順位のタスク
+ */
+TCB            *p_schedtsk;
+
+/*
+ *  タスクディスパッチ/タスク例外処理ルーチン起動要求フラグ
+ */
+bool_t reqflg;
+
+/*
+ *  割込み優先度マスク全解除状態
+ */
+bool_t ipmflg;
+
+/*
+ *  ディスパッチ禁止状態
+ */
+bool_t disdsp;
+
+/*
+ *  タスクディスパッチ可能状態
+ */
+bool_t dspflg;
+
+/*
+ *  レディキュー
+ */
+QUEUE  ready_queue[TNUM_TPRI];
+
+/*
+ *  レディキューサーチのためのビットマップ
+ */
+uint16_t       ready_primap;
+
+/*
+ *  タスク管理モジュールの初期化
+ */
+void
+initialize_task(void)
+{
+       uint_t  i, j;
+       TCB             *p_tcb;
+
+       p_runtsk = p_schedtsk = NULL;
+       reqflg = false;
+       ipmflg = true;
+       disdsp = false;
+       dspflg = true;
+
+       for (i = 0; i < TNUM_TPRI; i++) {
+               queue_initialize(&(ready_queue[i]));
+       }
+       ready_primap = 0U;
+
+       for (i = 0; i < tnum_tsk; i++) {
+               j = INDEX_TSK(torder_table[i]);
+               p_tcb = &(tcb_table[j]);
+               p_tcb->p_tinib = &(tinib_table[j]);
+               p_tcb->actque = false;
+               make_dormant(p_tcb);
+               if ((p_tcb->p_tinib->tskatr & TA_ACT) != 0U) {
+                       make_active(p_tcb);
+               }
+       }
+}
+
+#endif /* TOPPERS_tskini */
+
+/*
+ *  ビットマップサーチ関数
+ *
+ *  bitmap内の1のビットの内,最も下位(右)のものをサーチし,そのビッ
+ *  ト番号を返す.ビット番号は,最下位ビットを0とする.bitmapに0を指定
+ *  してはならない.この関数では,bitmapが16ビットであることを仮定し,
+ *  uint16_t型としている.
+ *
+ *  ビットサーチ命令を持つプロセッサでは,ビットサーチ命令を使うように
+ *  書き直した方が効率が良い場合がある.このような場合には,ターゲット
+ *  依存部でビットサーチ命令を使ったbitmap_searchを定義し,
+ *  OMIT_BITMAP_SEARCHをマクロ定義すればよい.また,ビットサーチ命令の
+ *  サーチ方向が逆などの理由で優先度とビットとの対応を変更したい場合に
+ *  は,PRIMAP_BITをマクロ定義すればよい.
+ *
+ *  また,ライブラリにffsがあるなら,次のように定義してライブラリ関数を
+ *  使った方が効率が良い可能性もある.
+ *             #define bitmap_search(bitmap) (ffs(bitmap) - 1)
+ */
+#ifndef PRIMAP_BIT
+#define        PRIMAP_BIT(pri)         (1U << (pri))
+#endif /* PRIMAP_BIT */
+
+#ifndef OMIT_BITMAP_SEARCH
+
+static const unsigned char bitmap_search_table[] = { 0, 1, 0, 2, 0, 1, 0,
+                                                                                               3, 0, 1, 0, 2, 0, 1, 0 };
+
+Inline uint_t
+bitmap_search(uint16_t bitmap)
+{
+       uint_t  n = 0U;
+
+       assert(bitmap != 0U);
+       if ((bitmap & 0x00ffU) == 0U) {
+               bitmap >>= 8;
+               n += 8;
+       }
+       if ((bitmap & 0x0fU) == 0U) {
+               bitmap >>= 4;
+               n += 4;
+       }
+       return(n + bitmap_search_table[(bitmap & 0x0fU) - 1]);
+}
+
+#endif /* OMIT_BITMAP_SEARCH */
+
+/*
+ *  優先度ビットマップが空かのチェック
+ */
+Inline bool_t
+primap_empty(void)
+{
+       return(ready_primap == 0U);
+}
+
+/*
+ *  優先度ビットマップのサーチ
+ */
+Inline uint_t
+primap_search(void)
+{
+       return(bitmap_search(ready_primap));
+}
+
+/*
+ *  優先度ビットマップのセット
+ */
+Inline void
+primap_set(uint_t pri)
+{
+       ready_primap |= PRIMAP_BIT(pri);
+}
+
+/*
+ *  優先度ビットマップのクリア
+ */
+Inline void
+primap_clear(uint_t pri)
+{
+       ready_primap &= ~PRIMAP_BIT(pri);
+}
+
+/*
+ *  最高優先順位タスクのサーチ
+ */
+#ifdef TOPPERS_tsksched
+
+TCB *
+search_schedtsk(void)
+{
+       uint_t  schedpri;
+
+       schedpri = primap_search();
+       return((TCB *)(ready_queue[schedpri].p_next));
+}
+
+#endif /* TOPPERS_tsksched */
+
+/*
+ *  実行できる状態への遷移
+ *
+ *  最高優先順位のタスクを更新するのは,実行できるタスクがなかった場合
+ *  と,p_tcbの優先度が最高優先順位のタスクの優先度よりも高い場合であ
+ *  る.
+ */
+#ifdef TOPPERS_tskrun
+
+bool_t
+make_runnable(TCB *p_tcb)
+{
+       uint_t  pri = p_tcb->priority;
+
+       queue_insert_prev(&(ready_queue[pri]), &(p_tcb->task_queue));
+       primap_set(pri);
+
+       if (p_schedtsk == (TCB *) NULL || pri < p_schedtsk->priority) {
+               p_schedtsk = p_tcb;
+               return(dspflg);
+       }
+       return(false);
+}
+
+#endif /* TOPPERS_tskrun */
+
+/*
+ *  実行できる状態から他の状態への遷移
+ *
+ *  最高優先順位のタスクを更新するのは,p_tcbが最高優先順位のタスクで
+ *  あった場合である.p_tcbと同じ優先度のタスクが他にある場合は,p_tcb
+ *  の次のタスクが最高優先順位になる.そうでない場合は,レディキューを
+ *  サーチする必要がある.
+ */
+#ifdef TOPPERS_tsknrun
+
+bool_t
+make_non_runnable(TCB *p_tcb)
+{
+       uint_t  pri = p_tcb->priority;
+       QUEUE   *p_queue = &(ready_queue[pri]);
+
+       queue_delete(&(p_tcb->task_queue));
+       if (queue_empty(p_queue)) {
+               primap_clear(pri);
+               if (p_schedtsk == p_tcb) {
+                       p_schedtsk = primap_empty() ? (TCB *) NULL : search_schedtsk();
+                       return(dspflg);
+               }
+       }
+       else {
+               if (p_schedtsk == p_tcb) {
+                       p_schedtsk = (TCB *)(p_queue->p_next);
+                       return(dspflg);
+               }
+       }
+       return(false);
+}
+
+#endif /* TOPPERS_tsknrun */
+
+/*
+ *  休止状態への遷移
+ */
+#ifdef TOPPERS_tskdmt
+
+void
+make_dormant(TCB *p_tcb)
+{
+       p_tcb->tstat = TS_DORMANT;
+       p_tcb->priority = p_tcb->p_tinib->ipriority;
+       p_tcb->wupque = false;
+       p_tcb->enatex = false;
+       p_tcb->texptn = 0U;
+       LOG_TSKSTAT(p_tcb);
+}
+
+#endif /* TOPPERS_tskdmt */
+
+/*
+ *  休止状態から実行できる状態への遷移
+ */
+#ifdef TOPPERS_tskact
+
+bool_t
+make_active(TCB *p_tcb)
+{
+       activate_context(p_tcb);
+       p_tcb->tstat = TS_RUNNABLE;
+       LOG_TSKSTAT(p_tcb);
+       return(make_runnable(p_tcb));
+}
+
+#endif /* TOPPERS_tskact */
+
+/*
+ *  タスクの優先度の変更
+ *
+ *  タスクが実行できる状態の場合には,レディキューの中での位置を変更す
+ *  る.オブジェクトの待ちキューの中で待ち状態になっている場合には,待
+ *  ちキューの中での位置を変更する.
+ *
+ *  最高優先順位のタスクを更新するのは,(1) p_tcbが最高優先順位のタス
+ *  クであって,その優先度を下げた場合,(2) p_tcbが最高優先順位のタス
+ *  クではなく,変更後の優先度が最高優先順位のタスクの優先度よりも高い
+ *  場合である.(1)の場合には,レディキューをサーチする必要がある.
+ */
+#ifdef TOPPERS_tskpri
+
+bool_t
+change_priority(TCB *p_tcb, uint_t newpri)
+{
+       uint_t  oldpri;
+
+       oldpri = p_tcb->priority;
+       p_tcb->priority = newpri;
+
+       if (TSTAT_RUNNABLE(p_tcb->tstat)) {
+               /*
+                *  タスクが実行できる状態の場合
+                */
+               queue_delete(&(p_tcb->task_queue));
+               if (queue_empty(&(ready_queue[oldpri]))) {
+                       primap_clear(oldpri);
+               }
+               queue_insert_prev(&(ready_queue[newpri]), &(p_tcb->task_queue));
+               primap_set(newpri);
+
+               if (p_schedtsk == p_tcb) {
+                       if (newpri >= oldpri) {
+                               p_schedtsk = search_schedtsk();
+                               return(p_schedtsk != p_tcb && dspflg);
+                       }
+               }
+               else {
+                       if (newpri < p_schedtsk->priority) {
+                               p_schedtsk = p_tcb;
+                               return(dspflg);
+                       }
+               }
+       }
+       else {
+               if (TSTAT_WAIT_WOBJCB(p_tcb->tstat)) {
+                       /*
+                        *  タスクが,同期・通信オブジェクトの管理ブロックの共通部
+                        *  分(WOBJCB)の待ちキューにつながれている場合
+                        */
+                       wobj_change_priority(((WINFO_WOBJ *)(p_tcb->p_winfo))->p_wobjcb,
+                                                                                                                                       p_tcb);
+               }
+       }
+       return(false);
+}
+
+#endif /* TOPPERS_tskpri */
+
+/*
+ *  自タスクの優先度の引き上げ
+ */
+#ifdef TOPPERS_tskrpri
+
+bool_t
+raise_priority(uint_t newpri)
+{
+       uint_t  oldpri;
+
+       oldpri = p_runtsk->priority;
+       p_runtsk->priority = newpri;
+
+       queue_delete(&(p_runtsk->task_queue));
+       if (queue_empty(&(ready_queue[oldpri]))) {
+               primap_clear(oldpri);
+       }
+       queue_insert_next(&(ready_queue[newpri]), &(p_runtsk->task_queue));
+       primap_set(newpri);
+
+       if (p_schedtsk == p_runtsk) {
+               if (newpri > oldpri) {
+                       p_schedtsk = search_schedtsk();
+                       return(p_schedtsk != p_runtsk && dspflg);
+               }
+       }
+       else {
+               assert(!dspflg);
+               if (newpri <= p_schedtsk->priority) {
+                       p_schedtsk = p_runtsk;
+               }
+       }
+       return(false);
+}
+
+#endif /* TOPPERS_tskrpri */
+
+/*
+ *  レディキューの回転
+ *
+ *  最高優先順位のタスクを更新するのは,最高優先順位のタスクがタスクキ
+ *  ューの末尾に移動した場合である.
+ */
+#ifdef TOPPERS_tskrot
+
+bool_t
+rotate_ready_queue(QUEUE *p_queue)
+{
+       QUEUE   *p_entry;
+
+       if (p_queue->p_next->p_next != p_queue) {
+               p_entry = queue_delete_next(p_queue);
+               queue_insert_prev(p_queue, p_entry);
+               if (p_schedtsk == (TCB *) p_entry) {
+                       p_schedtsk = (TCB *)(p_queue->p_next);
+                       return(dspflg);
+               }
+       }
+       return(false);
+}
+
+#endif /* TOPPERS_tskrot */
+
+/*
+ *  タスク例外処理ルーチンの呼出し
+ *
+ *  ASPカーネルでは,タスク例外処理ルーチン内でCPUロック状態に遷移し,
+ *  元の状態に戻さずにリターンした場合,カーネルが元の状態に戻す.
+ */
+#ifdef TOPPERS_tsktex
+
+void
+call_texrtn(void)
+{
+       TEXPTN  texptn;
+       bool_t  saved_disdsp;
+
+       saved_disdsp = disdsp;
+       p_runtsk->enatex = false;
+       do {
+               texptn = p_runtsk->texptn;
+               p_runtsk->texptn = 0U;
+
+               t_unlock_cpu();
+               LOG_TEX_ENTER(p_runtsk, texptn);
+               (*((TEXRTN)(p_runtsk->p_tinib->texrtn)))(texptn,
+                                                                                               p_runtsk->p_tinib->exinf);
+               LOG_TEX_LEAVE(p_runtsk);
+               if (!t_sense_lock()) {
+                       t_lock_cpu();
+               }
+               if (!ipmflg) {
+                       t_set_ipm(TIPM_ENAALL);
+                       ipmflg = true;
+               }
+               disdsp = saved_disdsp;
+               dspflg = !disdsp;
+               p_runtsk->enatex = false;
+               if (p_runtsk != p_schedtsk && dspflg) {
+                       /*
+                        *  ここでdispatchを呼び出す処理は,相互再帰呼出しになって
+                        *  いるが,dispatchを呼ぶ前にp_runtsk->enatexをfalseにして
+                        *  おけば支障がない.その理由については,「TOPPERS/ASP カー
+                        *  ネル 設計メモ」を参照のこと.
+                        */
+                       dispatch();
+               }
+       } while (p_runtsk->texptn != 0U);
+       p_runtsk->enatex = true;
+}
+
+/*
+ *  タスク例外処理ルーチンの起動
+ */
+#ifndef OMIT_CALLTEX
+
+void
+calltex(void)
+{
+       if (p_runtsk->enatex && p_runtsk->texptn != 0U && ipmflg) {
+               call_texrtn();
+       }
+}
+
+#endif /* OMIT_CALLTEX */
+#endif /* TOPPERS_tsktex */
diff --git a/asp/extension/rstr_task/kernel/task.h b/asp/extension/rstr_task/kernel/task.h
new file mode 100644 (file)
index 0000000..bd00e47
--- /dev/null
@@ -0,0 +1,489 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  $Id: task.h 2018 2010-12-31 13:43:05Z ertl-hiro $
+ */
+
+/*
+ *             タスク管理モジュール
+ */
+
+#ifndef TOPPERS_TASK_H
+#define TOPPERS_TASK_H
+
+#include <queue.h>
+#include "time_event.h"
+
+/*
+ *  トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_TSKSTAT
+#define LOG_TSKSTAT(p_tcb)
+#endif /* LOG_TSKSTAT */
+
+/*
+ *  タスク優先度の内部表現・外部表現変換マクロ
+ */
+#define INT_PRIORITY(x)                ((uint_t)((x) - TMIN_TPRI))
+#define EXT_TSKPRI(x)          ((PRI)(x) + TMIN_TPRI)
+
+/*
+ *  タスク状態の内部表現
+ *
+ *  TCB中のタスク状態では,実行状態(RUNNING)と実行可能状態(READY)
+ *  は区別しない.両状態を総称して,実行できる状態(RUNNABLE)と呼ぶ.
+ *  二重待ち状態は,(TS_WAITING | TS_SUSPENDED)で表す.TS_WAIT_???は待
+ *  ち要因を表し,待ち状態(二重待ち状態を含む)の場合にのみ設定する.
+ */
+#define TS_DORMANT             0x00U                   /* 休止状態 */
+#define TS_RUNNABLE            0x01U                   /* 実行できる状態 */
+#define TS_WAITING             0x02U                   /* 待ち状態 */
+#define TS_SUSPENDED   0x04U                   /* 強制待ち状態 */
+
+#define TS_WAIT_DLY            (0x00U << 3)    /* 時間経過待ち */
+#define TS_WAIT_SLP            (0x01U << 3)    /* 起床待ち */
+#define TS_WAIT_RDTQ   (0x02U << 3)    /* データキューからの受信待ち */
+#define TS_WAIT_RPDQ   (0x03U << 3)    /* 優先度データキューからの受信待ち */
+#define TS_WAIT_SEM            (0x04U << 3)    /* セマフォ資源の獲得待ち */
+#define TS_WAIT_FLG            (0x05U << 3)    /* イベントフラグ待ち */
+#define TS_WAIT_SDTQ   (0x06U << 3)    /* データキューへの送信待ち */
+#define TS_WAIT_SPDQ   (0x07U << 3)    /* 優先度データキューへの送信待ち */
+#define TS_WAIT_MBX            (0x08U << 3)    /* メールボックスからの受信待ち */
+#define TS_WAIT_MPF            (0x09U << 3)    /* 固定長メモリブロックの獲得待ち */
+
+/*
+ *  タスク状態判別マクロ
+ *
+ *  TSTAT_DORMANTはタスクが休止状態であるかどうかを,TSTAT_RUNNABLEは
+ *  タスクが実行できる状態であるかどうかを判別する.TSTAT_WAITINGは待
+ *  ち状態と二重待ち状態のいずれかであるかどうかを,TSTAT_SUSPENDEDは
+ *  強制待ち状態と二重待ち状態のいずれかであるかどうかを判別する.
+ */
+#define TSTAT_DORMANT(tstat)   ((tstat) == TS_DORMANT)
+#define TSTAT_RUNNABLE(tstat)  (((tstat) & TS_RUNNABLE) != 0U)
+#define TSTAT_WAITING(tstat)   (((tstat) & TS_WAITING) != 0U)
+#define TSTAT_SUSPENDED(tstat) (((tstat) & TS_SUSPENDED) != 0U)
+
+/*
+ *  タスク待ち要因判別マクロ
+ *
+ *  TSTAT_WAIT_SLPはタスクが起床待ちであるかどうかを,TSTAT_WAIT_WOBJ
+ *  はタスクが同期・通信オブジェクトに対する待ちであるか(言い換えると,
+ *  同期通信オブジェクトの待ちキューにつながれているか)どうかを判別す
+ *  る.また,TSTAT_WAIT_WOBJCBはタスクが同期・通信オブジェクトの管理
+ *  ブロックの共通部分(WOBJCB)の待ちキューにつながれているかどうかを
+ *  判別する.
+ *
+ *  TSTAT_WAIT_SLPは,任意のタスク状態の中から,タスクが起床待ちである
+ *  ことを判別できる.すなわち,TSTAT_WAITINGにより待ち状態であることを
+ *  判別せずに,TSTAT_SLPだけを用いて起床待ち状態であることを判別できる.
+ *  これを効率的に実現するために,TS_WAIT_SLPの値を,(0x00U << 3)ではな
+ *  く(0x01U << 3)としている.そのため,タスクが時間経過待ち状態である
+ *  ことを判別するためのTSTAT_WAIT_DLYを,TSTAT_WAIT_SLPと同様の方法で
+ *  実現することはできない.
+ */
+#define TS_WAIT_MASK   (0x0fU << 3)    /* 待ち要因の取出しマスク */
+
+#define TSTAT_WAIT_SLP(tstat)          (((tstat) & TS_WAIT_MASK) == TS_WAIT_SLP)
+#define TSTAT_WAIT_WOBJ(tstat)         (((tstat) & TS_WAIT_MASK) >= TS_WAIT_RDTQ)
+#define TSTAT_WAIT_WOBJCB(tstat)       (((tstat) & TS_WAIT_MASK) >= TS_WAIT_SEM)
+
+/*
+ *  待ち情報ブロック(WINFO)の定義
+ *
+ *  タスクが待ち状態の間は,TCBおよびそのp_winfoで指されるWINFOを次の
+ *  ように設定しなければならない.
+ *
+ *  (a) TCBのタスク状態を待ち状態(TS_WAITING)にする.その際に,待ち
+ *  要因(TS_WAIT_???)も設定する.
+ *
+ *  (b) タイムアウトを監視するために,タイムイベントブロックを登録する.
+ *  登録するタイムイベントブロックは,待ちに入るサービスコール処理関数
+ *  のローカル変数として確保し,それへのポインタをWINFOのp_tmevtbに記
+ *  憶する.タイムアウトの監視が必要ない場合(永久待ちの場合)には,
+ *  p_tmevtbをNULLにする.
+ *
+ *  同期・通信オブジェクトに対する待ち状態の場合には,標準のWINFOに
+ *  p_wobjcbフィールドを追加した構造体(WINFO_WOBJ,wait.hで定義)を使
+ *  う.また,以下の(c)〜(e)の設定を行う必要がある.同期・通信オブジェ
+ *  クトに関係しない待ち(起床待ち,時間経過待ち)の場合には,(c)〜(e)
+ *  は必要ない.
+ *
+ *  (c) TCBを待ち対象の同期・通信オブジェクトの待ちキューにつなぐ.待
+ *  ちキューにつなぐために,task_queueを使う.
+ *
+ *  (d) 待ち対象の同期・通信オブジェクトの管理ブロックへのポインタを,
+ *  WINFO_WOBJのp_wobjcbに記憶する.
+ *
+ *  (e) 待ち対象の同期・通信オブジェクトに依存して記憶することが必要な
+ *  情報がある場合には,WINFO_WOBJに必要な情報のためのフィールドを追加
+ *  した構造体を定義し,WINFO_WOBJの代わりに用いる.
+ *
+ *  待ち状態を解除する際には,待ち解除したタスクに対する返値をWINFOの
+ *  wercdに設定する.wercdが必要なのは待ち解除以降であるのに対して,
+ *  p_tmevtbは待ち解除後は必要ないため,メモリ節約のために共用体を使っ
+ *  ている.そのため,wercdへエラーコードを設定するのは,タイムイベント
+ *  ブロックを登録解除した後にしなければならない.
+ */
+typedef union waiting_information {
+       ER              wercd;                  /* 待ち解除時のエラーコード */
+       TMEVTB  *p_tmevtb;              /* 待ち状態用のタイムイベントブロック */
+} WINFO;
+
+/*
+ *  タスク初期化ブロック
+ *
+ *  タスクに関する情報を,値が変わらないためにROMに置ける部分(タスク
+ *  初期化ブロック)と,値が変化するためにRAMに置かなければならない部
+ *  分(タスク管理ブロック,TCB)に分離し,TCB内に対応するタスク初期化
+ *  ブロックを指すポインタを入れる.タスク初期化ブロック内に対応する
+ *  TCBを指すポインタを入れる方法の方が,RAMの節約の観点からは望ましい
+ *  が,実行効率が悪くなるために採用していない.他のオブジェクトについ
+ *  ても同様に扱う.
+ *
+ *  タスク初期化ブロックには,DEF_TEXで定義されるタスク例外処理ルーチ
+ *  ンに関する情報も含む.
+ */
+typedef struct task_initialization_block {
+       ATR                     tskatr;                 /* タスク属性 */
+       intptr_t        exinf;                  /* タスクの拡張情報 */
+       TASK            task;                   /* タスクの起動番地 */
+       uint_t          ipriority;              /* タスクの起動時優先度(内部表現) */
+
+#ifdef USE_TSKINICTXB
+       TSKINICTXB      tskinictxb;             /* タスク初期化コンテキストブロック */
+#else /* USE_TSKINICTXB */
+       SIZE            stksz;                  /* スタック領域のサイズ(丸めた値) */
+       void            *stk;                   /* スタック領域の先頭番地 */
+#endif /* USE_TSKINICTXB */
+
+       ATR                     texatr;                 /* タスク例外処理ルーチン属性 */
+       TEXRTN          texrtn;                 /* タスク例外処理ルーチンの起動番地 */
+} TINIB;
+
+/*
+ *  TCB中のフィールドのビット幅の定義
+ *
+ *  プロセッサによっては,TCB中のフィールドのビット幅でメモリ使用量と
+ *  性能がトレードオフになるため,ターゲット依存にフィールドのビット幅
+ *  を変更することを許している.
+ */
+#ifndef TBIT_TCB_PRIORITY
+#define        TBIT_TCB_PRIORITY               8               /* priorityフィールドのビット幅 */
+#endif /* TBIT_TCB_PRIORITY */
+
+/*
+ *  タスク管理ブロック(TCB)
+ *
+ *  ASPカーネルでは,タスクの起動要求キューイング数の最大値(TMAX_ACTCNT)
+ *  と起床要求キューイング数の最大値(TMAX_WUPCNT)は1に固定されている
+ *  ため,キューイングされているかどうかの真偽値で表現することができる.
+ *  また,強制待ち要求ネスト数の最大値(TMAX_SUSCNT)が1に固定されてい
+ *  るので,強制待ち要求ネスト数(suscnt)は必要ない.
+ *
+ *  TCBのいくつかのフィールドは,特定のタスク状態でのみ有効な値を保持し,
+ *  それ以外の場合は値が保証されない(よって,参照してはならない).各
+ *  フィールドが有効な値を保持する条件は次の通り.
+ *
+ *  ・初期化後は常に有効:
+ *             p_tinib,tstat,actque
+ *  ・休止状態以外で有効(休止状態では初期値になっている):
+ *             priority,wupque,enatex,texptn
+ *  ・待ち状態(二重待ち状態を含む)で有効:
+ *             p_winfo
+ *  ・実行できる状態と同期・通信オブジェクトに対する待ち状態で有効:
+ *             task_queue
+ *  ・実行可能状態,待ち状態,強制待ち状態,二重待ち状態で有効:
+ *             tskctxb
+ */
+typedef struct task_control_block {
+       QUEUE                   task_queue;             /* タスクキュー */
+       const TINIB             *p_tinib;               /* 初期化ブロックへのポインタ */
+
+#ifdef UINT8_MAX
+       uint8_t                 tstat;                  /* タスク状態(内部表現)*/
+#else /* UINT8_MAX */
+       BIT_FIELD_UINT  tstat : 8;              /* タスク状態(内部表現)*/
+#endif /* UINT8_MAX */
+#if defined(UINT8_MAX) && (TBIT_TCB_PRIORITY == 8)
+       uint8_t                 priority;               /* 現在の優先度(内部表現)*/
+#else /* defined(UINT8_MAX) && (TBIT_TCB_PRIORITY == 8) */
+       BIT_FIELD_UINT  priority : TBIT_TCB_PRIORITY;
+                                                                       /* 現在の優先度(内部表現)*/
+#endif  /* defined(UINT8_MAX) && (TBIT_TCB_PRIORITY == 8) */
+       BIT_FIELD_BOOL  actque : 1;             /* 起動要求キューイング */
+       BIT_FIELD_BOOL  wupque : 1;             /* 起床要求キューイング */
+       BIT_FIELD_BOOL  enatex : 1;             /* タスク例外処理許可状態 */
+
+       TEXPTN                  texptn;                 /* 保留例外要因 */
+       WINFO                   *p_winfo;               /* 待ち情報ブロックへのポインタ */
+       TSKCTXB                 tskctxb;                /* タスクコンテキストブロック */
+} TCB;
+
+/*
+ *  実行状態のタスク
+ *
+ *  実行状態のタスク(=プロセッサがコンテキストを持っているタスク)の
+ *  TCBを指すポインタ.実行状態のタスクがない場合はNULLにする.
+ *
+ *  サービスコールの処理中で,自タスク(サービスコールを呼び出したタス
+ *  ク)に関する情報を参照する場合はp_runtskを使う.p_runtskを書き換え
+ *  るのは,ディスパッチャ(と初期化処理)のみである.
+ */
+extern TCB     *p_runtsk;
+
+/*
+ *  最高優先順位のタスク
+ *
+ *  実行できるタスクの中で最高優先順位のタスクのTCBを指すポインタ.実
+ *  行できるタスクがない場合はNULLにする.
+ *
+ *  ディスパッチ禁止状態など,ディスパッチが保留されている間はp_runtsk
+ *  と一致しているとは限らない.
+ */
+extern TCB     *p_schedtsk;
+
+/*
+ *  ディスパッチ/タスク例外処理ルーチン起動要求フラグ
+ *
+ *  割込みハンドラ/CPU例外ハンドラの出口処理に,ディスパッチまたは
+ *  タスク例外処理ルーチンの起動を要求することを示すフラグ.
+ */
+extern bool_t  reqflg;
+
+/*
+ *  割込み優先度マスク全解除状態
+ *
+ *  割込み優先度マスク全解除状態であることを示すフラグ.
+ */
+extern bool_t  ipmflg;
+
+/*
+ *  ディスパッチ禁止状態
+ *
+ *  ディスパッチ禁止状態であることを示すフラグ.
+ */
+extern bool_t  disdsp;
+
+/*
+ *  タスクディスパッチ可能状態
+ *
+ *  割込み優先度マスク全解除状態であり,ディスパッチ許可状態である(ディ
+ *  スパッチ禁止状態でない)ことを示すフラグ.
+ */
+extern bool_t  dspflg;
+
+/*
+ *  レディキュー
+ *
+ *  レディキューは,実行できる状態のタスクを管理するためのキューである.
+ *  実行状態のタスクも管理しているため,レディ(実行可能)キューという
+ *  名称は正確ではないが,レディキューという名称が定着しているため,こ
+ *  の名称で呼ぶことにする.
+ *
+ *  レディキューは,優先度ごとのタスクキューで構成されている.タスクの
+ *  TCBは,該当する優先度のキューに登録される.
+ */
+extern QUEUE   ready_queue[TNUM_TPRI];
+
+/*
+ *  レディキューサーチのためのビットマップ
+ *
+ *  レディキューのサーチを効率よく行うために,優先度ごとのタスクキュー
+ *  にタスクが入っているかどうかを示すビットマップを用意している.ビッ
+ *  トマップを使うことで,メモリアクセスの回数を減らすことができるが,
+ *  ビット操作命令が充実していないプロセッサで,優先度の段階数が少ない
+ *  場合には,ビットマップ操作のオーバーヘッドのために,逆に効率が落ち
+ *  る可能性もある.
+ *
+ *  優先度が16段階であることを仮定しているため,uint16_t型としている.
+ */
+extern uint16_t        ready_primap;
+
+/*
+ *  タスクIDの最大値(kernel_cfg.c)
+ */
+extern const ID        tmax_tskid;
+
+/*
+ *  タスク初期化ブロックのエリア(kernel_cfg.c)
+ */
+extern const TINIB     tinib_table[];
+
+/*
+ *  タスク生成順序テーブル(kernel_cfg.c)
+ */
+extern const ID        torder_table[];
+
+/*
+ *  TCBのエリア(kernel_cfg.c)
+ */
+extern TCB     tcb_table[];
+
+/*
+ *  タスクの数
+ */
+#define tnum_tsk       ((uint_t)(tmax_tskid - TMIN_TSKID + 1))
+
+/*
+ *  タスクIDからTCBを取り出すためのマクロ
+ */
+#define INDEX_TSK(tskid)       ((uint_t)((tskid) - TMIN_TSKID))
+#define get_tcb(tskid)         (&(tcb_table[INDEX_TSK(tskid)]))
+#define get_tcb_self(tskid)    ((tskid) == TSK_SELF ? p_runtsk : get_tcb(tskid))
+
+/*
+ *  TCBからタスクIDを取り出すためのマクロ
+ */
+#define        TSKID(p_tcb)    ((ID)(((p_tcb) - tcb_table) + TMIN_TSKID))
+
+/*
+ *  タスク管理モジュールの初期化
+ */
+extern void    initialize_task(void);
+
+/*
+ *  最高優先順位タスクのサーチ
+ *
+ *  レディキュー中の最高優先順位のタスクをサーチし,そのTCBへのポインタ
+ *  を返す.レディキューが空の場合には,この関数を呼び出してはならない.
+ */
+extern TCB     *search_schedtsk(void);
+
+/*
+ *  実行できる状態への遷移
+ *
+ *  p_tcbで指定されるタスクをレディキューに挿入する.レディキューに挿入
+ *  したタスクの優先度が,最高優先順位のタスクの優先度よりも高い場合は,
+ *  最高優先順位のタスクを更新し,ディスパッチ許可状態であればtrueを返
+ *  す.そうでない場合はfalseを返す.
+ */
+extern bool_t  make_runnable(TCB *p_tcb);
+
+/*
+ *  実行できる状態から他の状態への遷移
+ *
+ *  p_tcbで指定されるタスクをレディキューから削除する.p_tcbで指定した
+ *  タスクが最高優先順位のタスクであった場合には,最高優先順位のタスク
+ *  を設定しなおし,ディスパッチ許可状態であればtrueを返す.そうでない
+ *  場合はfalseを返す.タスクの状態は更新しない.
+ */
+extern bool_t  make_non_runnable(TCB *p_tcb);
+
+/*
+ *  休止状態への遷移
+ *
+ *  p_tcbで指定されるタスクの状態を休止状態とする.また,タスクの起動
+ *  時に初期化すべき変数の初期化と,タスク起動のためのコンテキストを設
+ *  定する.
+ */
+extern void    make_dormant(TCB *p_tcb);
+
+/*
+ *  休止状態から実行できる状態への遷移
+ *
+ *  p_tcbで指定されるタスクの状態を休止状態から実行できる状態とする.
+ *  実行できる状態に遷移したタスクへのディスパッチが必要な場合はtrue,
+ *  そうでない場合はfalseを返す.
+ */
+extern bool_t  make_active(TCB *p_tcb);
+
+/*
+ *  タスクの優先度の変更
+ *
+ *  p_tcbで指定されるタスクの優先度をnewpri(内部表現)に変更する.また,
+ *  必要な場合には最高優先順位のタスクを更新し,ディスパッチ許可状態で
+ *  あればtrueを返す.そうでない場合はfalseを返す.
+ */
+extern bool_t  change_priority(TCB *p_tcb, uint_t newpri);
+
+/*
+ *  自タスクの優先度の引き上げ
+ *
+ *  自タスクの優先度をnewpri(内部表現)に変更する.また,必要な場合に
+ *  は最高優先順位のタスクを更新し,ディスパッチ許可状態であればtrueを
+ *  返す.そうでない場合はfalseを返す.
+ */
+extern bool_t  raise_priority(uint_t newpri);
+
+/*
+ *  レディキューの回転
+ *
+ *  レディキュー中の,p_queueで指定されるタスクキューを回転させる.また,
+ *  必要な場合には最高優先順位のタスクを変更し,ディスパッチが保留され
+ *  ていなければtrueを返す.そうでない場合はfalseを返す.
+ */
+extern bool_t  rotate_ready_queue(QUEUE *p_queue);
+
+/*
+ *  タスク例外処理ルーチンの呼出し
+ *
+ *  タスク例外処理ルーチンを呼び出す.呼び出す前に,実行状態のタスクの
+ *  保留例外要因をクリアし,タスク例外処理禁止状態にし,CPUロックを解
+ *  除する.
+ *
+ *  タスク例外処理ルーチンから戻ると,まずCPUロック状態に戻し,その間
+ *  に保留例外要因が0でなくなっていれば,再びタスク例外処理ルーチンを
+ *  呼び出す.保留例外要因が0の場合には,例外処理許可状態にして関数か
+ *  らリターンする.
+ *
+ *  この関数は,実行状態のタスクが,タスク例外処理許可状態(enatexが
+ *  true)で,保留例外要因が0でない(texptnが0でない)場合に呼び出すこ
+ *  とを想定している.この関数は,CPUロック状態で呼び出さなければなら
+ *  ない.
+ */
+extern void    call_texrtn(void);
+
+/*
+ *  タスク例外処理ルーチンの起動
+ *
+ *  実行状態のタスクがタスク例外処理ルーチンの起動条件を満たしていれば,
+ *  タスク例外処理ルーチンを呼び出す.CPU例外処理ルーチンを呼び出す時
+ *  は,一時的にCPUロックを解除する.
+ *
+ *  この関数は,ディスパッチャや割込みハンドラ/CPU例外ハンドラの出口
+ *  処理から呼び出されることを想定している.この関数は,CPUロック状態
+ *  で呼び出さなければならない.
+ *
+ *  実行効率を上げるために,この関数をターゲット依存部で記述してもよい.
+ *  その場合には,OMIT_CALLTEXをマクロ定義する.
+ */
+extern void    calltex(void);
+
+#endif /* TOPPERS_TASK_H */
diff --git a/asp/extension/rstr_task/kernel/task_manage.c b/asp/extension/rstr_task/kernel/task_manage.c
new file mode 100644 (file)
index 0000000..710a00f
--- /dev/null
@@ -0,0 +1,474 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  $Id: task_manage.c 2018 2010-12-31 13:43:05Z ertl-hiro $
+ */
+
+/*
+ *             タスク管理機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "wait.h"
+
+/*
+ *  トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_ACT_TSK_ENTER
+#define LOG_ACT_TSK_ENTER(tskid)
+#endif /* LOG_ACT_TSK_ENTER */
+
+#ifndef LOG_ACT_TSK_LEAVE
+#define LOG_ACT_TSK_LEAVE(ercd)
+#endif /* LOG_ACT_TSK_LEAVE */
+
+#ifndef LOG_IACT_TSK_ENTER
+#define LOG_IACT_TSK_ENTER(tskid)
+#endif /* LOG_IACT_TSK_ENTER */
+
+#ifndef LOG_IACT_TSK_LEAVE
+#define LOG_IACT_TSK_LEAVE(ercd)
+#endif /* LOG_IACT_TSK_LEAVE */
+
+#ifndef LOG_CAN_ACT_ENTER
+#define LOG_CAN_ACT_ENTER(tskid)
+#endif /* LOG_CAN_ACT_ENTER */
+
+#ifndef LOG_CAN_ACT_LEAVE
+#define LOG_CAN_ACT_LEAVE(ercd)
+#endif /* LOG_CAN_ACT_LEAVE */
+
+#ifndef LOG_EXT_TSK_ENTER
+#define LOG_EXT_TSK_ENTER()
+#endif /* LOG_EXT_TSK_ENTER */
+
+#ifndef LOG_EXT_TSK_LEAVE
+#define LOG_EXT_TSK_LEAVE(ercd)
+#endif /* LOG_EXT_TSK_LEAVE */
+
+#ifndef LOG_TER_TSK_ENTER
+#define LOG_TER_TSK_ENTER(tskid)
+#endif /* LOG_TER_TSK_ENTER */
+
+#ifndef LOG_TER_TSK_LEAVE
+#define LOG_TER_TSK_LEAVE(ercd)
+#endif /* LOG_TER_TSK_LEAVE */
+
+#ifndef LOG_CHG_PRI_ENTER
+#define LOG_CHG_PRI_ENTER(tskid, tskpri)
+#endif /* LOG_CHG_PRI_ENTER */
+
+#ifndef LOG_CHG_PRI_LEAVE
+#define LOG_CHG_PRI_LEAVE(ercd)
+#endif /* LOG_CHG_PRI_LEAVE */
+
+#ifndef LOG_RAS_PRI_ENTER
+#define LOG_RAS_PRI_ENTER(tskpri)
+#endif /* LOG_RAS_PRI_ENTER */
+
+#ifndef LOG_RAS_PRI_LEAVE
+#define LOG_RAS_PRI_LEAVE(ercd)
+#endif /* LOG_RAS_PRI_LEAVE */
+
+#ifndef LOG_GET_PRI_ENTER
+#define LOG_GET_PRI_ENTER(tskid, p_tskpri)
+#endif /* LOG_GET_PRI_ENTER */
+
+#ifndef LOG_GET_PRI_LEAVE
+#define LOG_GET_PRI_LEAVE(ercd, tskpri)
+#endif /* LOG_GET_PRI_LEAVE */
+
+#ifndef LOG_GET_INF_ENTER
+#define LOG_GET_INF_ENTER(p_exinf)
+#endif /* LOG_GET_INF_ENTER */
+
+#ifndef LOG_GET_INF_LEAVE
+#define LOG_GET_INF_LEAVE(ercd, exinf)
+#endif /* LOG_GET_INF_LEAVE */
+
+/*
+ *  タスクの起動
+ */
+#ifdef TOPPERS_act_tsk
+
+ER
+act_tsk(ID tskid)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_ACT_TSK_ENTER(tskid);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID_SELF(tskid);
+       p_tcb = get_tcb_self(tskid);
+
+       t_lock_cpu();
+       if (TSTAT_DORMANT(p_tcb->tstat)) {
+               if (make_active(p_tcb)) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else if (!(p_tcb->actque)) {
+               p_tcb->actque = true;
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_QOVR;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_ACT_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_act_tsk */
+
+/*
+ *  タスクの起動(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_iact_tsk
+
+ER
+iact_tsk(ID tskid)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_IACT_TSK_ENTER(tskid);
+       CHECK_INTCTX_UNL();
+       CHECK_TSKID(tskid);
+       p_tcb = get_tcb(tskid);
+
+       i_lock_cpu();
+       if (TSTAT_DORMANT(p_tcb->tstat)) {
+               if (make_active(p_tcb)) {
+                       reqflg = true;
+               }
+               ercd = E_OK;
+       }
+       else if (!(p_tcb->actque)) {
+               p_tcb->actque = true;
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_QOVR;
+       }
+       i_unlock_cpu();
+
+  error_exit:
+       LOG_IACT_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_iact_tsk */
+
+/*
+ *  タスク起動要求のキャンセル
+ */
+#ifdef TOPPERS_can_act
+
+ER_UINT
+can_act(ID tskid)
+{
+       TCB             *p_tcb;
+       ER_UINT ercd;
+
+       LOG_CAN_ACT_ENTER(tskid);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID_SELF(tskid);
+       p_tcb = get_tcb_self(tskid);
+
+       t_lock_cpu();
+       ercd = p_tcb->actque ? 1 : 0;
+       p_tcb->actque = false;
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_CAN_ACT_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_can_act */
+
+/*
+ *  自タスクの終了
+ */
+#ifdef TOPPERS_ext_tsk
+
+ER
+ext_tsk(void)
+{
+       ER              ercd;
+
+       LOG_EXT_TSK_ENTER();
+       CHECK_TSKCTX();
+
+       if (t_sense_lock()) {
+               /*
+                *  CPUロック状態でext_tskが呼ばれた場合は,CPUロックを解除し
+                *  てからタスクを終了する.実装上は,サービスコール内でのCPU
+                *  ロックを省略すればよいだけ.
+                */
+       }
+       else {
+               t_lock_cpu();
+       }
+       if (disdsp) {
+               /*
+                *  ディスパッチ禁止状態でext_tskが呼ばれた場合は,ディスパッ
+                *  チ許可状態にしてからタスクを終了する.
+                */
+               disdsp = false;
+       }
+       if (!ipmflg) {
+               /*
+                *  割込み優先度マスク(IPM)がTIPM_ENAALL以外の状態でext_tsk
+                *  が呼ばれた場合は,IPMをTIPM_ENAALLにしてからタスクを終了す
+                *  る.
+                */
+               t_set_ipm(TIPM_ENAALL);
+               ipmflg = true;
+       }
+       dspflg = true;
+
+       (void) make_non_runnable(p_runtsk);
+       make_dormant(p_runtsk);
+       if (p_runtsk->actque) {
+               p_runtsk->actque = false;
+               (void) make_active(p_runtsk);
+       }
+       exit_and_dispatch();
+       ercd = E_SYS;
+
+  error_exit:
+       LOG_EXT_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ext_tsk */
+
+/*
+ *  タスクの強制終了
+ */
+#ifdef TOPPERS_ter_tsk
+
+ER
+ter_tsk(ID tskid)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_TER_TSK_ENTER(tskid);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID(tskid);
+       p_tcb = get_tcb(tskid);
+       CHECK_NONSELF(p_tcb);
+
+       t_lock_cpu();
+       if (TSTAT_DORMANT(p_tcb->tstat)) {
+               ercd = E_OBJ;
+       }
+       else {
+               if (TSTAT_RUNNABLE(p_tcb->tstat)) {
+                       /*
+                        *  p_tcbは自タスクでないため,(シングルプロセッサでは)実
+                        *  行状態でなく,make_non_runnable(p_tcb)でタスクディスパッ
+                        *  チが必要になることはない.
+                        */
+                       (void) make_non_runnable(p_tcb);
+               }
+               else if (TSTAT_WAITING(p_tcb->tstat)) {
+                       wait_dequeue_wobj(p_tcb);
+                       wait_dequeue_tmevtb(p_tcb);
+               }
+               make_dormant(p_tcb);
+               if (p_tcb->actque) {
+                       p_tcb->actque = false;
+                       if (make_active(p_tcb)) {
+                               dispatch();
+                       }
+               }
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_TER_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ter_tsk */
+
+/*
+ *  タスクのベース優先度の変更
+ */
+#ifdef TOPPERS_chg_pri
+
+ER
+chg_pri(ID tskid, PRI tskpri)
+{
+       TCB             *p_tcb;
+       uint_t  newpri;
+       ER              ercd;
+
+       LOG_CHG_PRI_ENTER(tskid, tskpri);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID_SELF(tskid);
+       CHECK_TPRI_INI(tskpri);
+       p_tcb = get_tcb_self(tskid);
+       CHECK_NONRSTR(p_tcb);
+       newpri = (tskpri == TPRI_INI) ? p_tcb->p_tinib->ipriority
+                                                                               : INT_PRIORITY(tskpri);
+
+       t_lock_cpu();
+       if (TSTAT_DORMANT(p_tcb->tstat)) {
+               ercd = E_OBJ;
+       }
+       else {
+               if (change_priority(p_tcb, newpri)) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_CHG_PRI_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_chg_pri */
+
+/*
+ *  自タスクの優先度の引き上げ
+ */
+#ifdef TOPPERS_ras_pri
+
+ER
+ras_pri(PRI tskpri)
+{
+       uint_t  newpri;
+       ER              ercd;
+
+       LOG_RAS_PRI_ENTER(tskpri);
+       CHECK_TSKCTX_UNL();
+       CHECK_TPRI_INI(tskpri);
+       if (tskpri == TPRI_INI) {
+               newpri = p_runtsk->p_tinib->ipriority;
+       }
+       else {
+               newpri = INT_PRIORITY(tskpri);
+               CHECK_ILUSE(newpri <= p_runtsk->p_tinib->ipriority);
+       }
+
+       t_lock_cpu();
+       if (raise_priority(newpri)) {
+               dispatch();
+       }
+       ercd = E_OK;
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_RAS_PRI_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_ras_pri */
+
+/*
+ *  タスク優先度の参照
+ */
+#ifdef TOPPERS_get_pri
+
+ER
+get_pri(ID tskid, PRI *p_tskpri)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_GET_PRI_ENTER(tskid, p_tskpri);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID_SELF(tskid);
+       p_tcb = get_tcb_self(tskid);
+
+       t_lock_cpu();
+       if (TSTAT_DORMANT(p_tcb->tstat)) {
+               ercd = E_OBJ;
+       }
+       else {
+               *p_tskpri = EXT_TSKPRI(p_tcb->priority);
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_GET_PRI_LEAVE(ercd, *p_tskpri);
+       return(ercd);
+}
+
+#endif /* TOPPERS_get_pri */
+
+/*
+ *  自タスクの拡張情報の参照
+ */
+#ifdef TOPPERS_get_inf
+
+ER
+get_inf(intptr_t *p_exinf)
+{
+       ER              ercd;
+
+       LOG_GET_INF_ENTER(p_exinf);
+       CHECK_TSKCTX_UNL();
+
+       t_lock_cpu();
+       *p_exinf = p_runtsk->p_tinib->exinf;
+       ercd = E_OK;
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_GET_INF_LEAVE(ercd, *p_exinf);
+       return(ercd);
+}
+
+#endif /* TOPPERS_get_inf */
diff --git a/asp/extension/rstr_task/kernel/task_sync.c b/asp/extension/rstr_task/kernel/task_sync.c
new file mode 100644 (file)
index 0000000..774b6a3
--- /dev/null
@@ -0,0 +1,538 @@
+/*
+ *  TOPPERS/ASP Kernel
+ *      Toyohashi Open Platform for Embedded Real-Time Systems/
+ *      Advanced Standard Profile Kernel
+ * 
+ *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ *                              Toyohashi Univ. of Technology, JAPAN
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  $Id: task_sync.c 1887 2010-08-06 06:15:19Z ertl-hiro $
+ */
+
+/*
+ *             タスク付属同期機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "wait.h"
+
+/*
+ *  トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_SLP_TSK_ENTER
+#define LOG_SLP_TSK_ENTER()
+#endif /* LOG_SLP_TSK_ENTER */
+
+#ifndef LOG_SLP_TSK_LEAVE
+#define LOG_SLP_TSK_LEAVE(ercd)
+#endif /* LOG_SLP_TSK_LEAVE */
+
+#ifndef LOG_TSLP_TSK_ENTER
+#define LOG_TSLP_TSK_ENTER(tmout)
+#endif /* LOG_TSLP_TSK_ENTER */
+
+#ifndef LOG_TSLP_TSK_LEAVE
+#define LOG_TSLP_TSK_LEAVE(ercd)
+#endif /* LOG_TSLP_TSK_LEAVE */
+
+#ifndef LOG_WUP_TSK_ENTER
+#define LOG_WUP_TSK_ENTER(tskid)
+#endif /* LOG_WUP_TSK_ENTER */
+
+#ifndef LOG_WUP_TSK_LEAVE
+#define LOG_WUP_TSK_LEAVE(ercd)
+#endif /* LOG_WUP_TSK_LEAVE */
+
+#ifndef LOG_IWUP_TSK_ENTER
+#define LOG_IWUP_TSK_ENTER(tskid)
+#endif /* LOG_IWUP_TSK_ENTER */
+
+#ifndef LOG_IWUP_TSK_LEAVE
+#define LOG_IWUP_TSK_LEAVE(ercd)
+#endif /* LOG_IWUP_TSK_LEAVE */
+
+#ifndef LOG_CAN_WUP_ENTER
+#define LOG_CAN_WUP_ENTER(tskid)
+#endif /* LOG_CAN_WUP_ENTER */
+
+#ifndef LOG_CAN_WUP_LEAVE
+#define LOG_CAN_WUP_LEAVE(ercd)
+#endif /* LOG_CAN_WUP_LEAVE */
+
+#ifndef LOG_REL_WAI_ENTER
+#define LOG_REL_WAI_ENTER(tskid)
+#endif /* LOG_REL_WAI_ENTER */
+
+#ifndef LOG_REL_WAI_LEAVE
+#define LOG_REL_WAI_LEAVE(ercd)
+#endif /* LOG_REL_WAI_LEAVE */
+
+#ifndef LOG_IREL_WAI_ENTER
+#define LOG_IREL_WAI_ENTER(tskid)
+#endif /* LOG_IREL_WAI_ENTER */
+
+#ifndef LOG_IREL_WAI_LEAVE
+#define LOG_IREL_WAI_LEAVE(ercd)
+#endif /* LOG_IREL_WAI_LEAVE */
+
+#ifndef LOG_SUS_TSK_ENTER
+#define LOG_SUS_TSK_ENTER(tskid)
+#endif /* LOG_SUS_TSK_ENTER */
+
+#ifndef LOG_SUS_TSK_LEAVE
+#define LOG_SUS_TSK_LEAVE(ercd)
+#endif /* LOG_SUS_TSK_LEAVE */
+
+#ifndef LOG_RSM_TSK_ENTER
+#define LOG_RSM_TSK_ENTER(tskid)
+#endif /* LOG_RSM_TSK_ENTER */
+
+#ifndef LOG_RSM_TSK_LEAVE
+#define LOG_RSM_TSK_LEAVE(ercd)
+#endif /* LOG_RSM_TSK_LEAVE */
+
+#ifndef LOG_DLY_TSK_ENTER
+#define LOG_DLY_TSK_ENTER(dlytim)
+#endif /* LOG_DLY_TSK_ENTER */
+
+#ifndef LOG_DLY_TSK_LEAVE
+#define LOG_DLY_TSK_LEAVE(ercd)
+#endif /* LOG_DLY_TSK_LEAVE */
+
+/*
+ *  起床待ち
+ */
+#ifdef TOPPERS_slp_tsk
+
+ER
+slp_tsk(void)
+{
+       WINFO   winfo;
+       ER              ercd;
+
+       LOG_SLP_TSK_ENTER();
+       CHECK_DISPATCH();
+
+       t_lock_cpu();
+       if (p_runtsk->wupque) {
+               p_runtsk->wupque = false;
+               ercd = E_OK;
+       }
+       else {
+               p_runtsk->tstat = (TS_WAITING | TS_WAIT_SLP);
+               make_wait(&winfo);
+               LOG_TSKSTAT(p_runtsk);
+               dispatch();
+               ercd = winfo.wercd;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_SLP_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_slp_tsk */
+
+/*
+ *  起床待ち(タイムアウトあり)
+ */
+#ifdef TOPPERS_tslp_tsk
+
+ER
+tslp_tsk(TMO tmout)
+{
+       WINFO   winfo;
+       TMEVTB  tmevtb;
+       ER              ercd;
+
+       LOG_TSLP_TSK_ENTER(tmout);
+       CHECK_DISPATCH();
+       CHECK_TMOUT(tmout);
+
+       t_lock_cpu();
+       if (p_runtsk->wupque) {
+               p_runtsk->wupque = false;
+               ercd = E_OK;
+       }
+       else if (tmout == TMO_POL) {
+               ercd = E_TMOUT;
+       }
+       else {
+               p_runtsk->tstat = (TS_WAITING | TS_WAIT_SLP);
+               make_wait_tmout(&winfo, &tmevtb, tmout);
+               LOG_TSKSTAT(p_runtsk);
+               dispatch();
+               ercd = winfo.wercd;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_TSLP_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_tslp_tsk */
+
+/*
+ *  タスクの起床
+ */
+#ifdef TOPPERS_wup_tsk
+
+ER
+wup_tsk(ID tskid)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_WUP_TSK_ENTER(tskid);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID_SELF(tskid);
+       p_tcb = get_tcb_self(tskid);
+       CHECK_NONRSTR(p_tcb);
+
+       t_lock_cpu();
+       if (TSTAT_DORMANT(p_tcb->tstat)) {
+               ercd = E_OBJ;
+       }
+       else if (TSTAT_WAIT_SLP(p_tcb->tstat)) {
+               if (wait_complete(p_tcb)) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else if (!(p_tcb->wupque)) {
+               p_tcb->wupque = true;
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_QOVR;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_WUP_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_wup_tsk */
+
+/*
+ *  タスクの起床(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_iwup_tsk
+
+ER
+iwup_tsk(ID tskid)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_IWUP_TSK_ENTER(tskid);
+       CHECK_INTCTX_UNL();
+       CHECK_TSKID(tskid);
+       p_tcb = get_tcb(tskid);
+       CHECK_NONRSTR(p_tcb);
+
+       i_lock_cpu();
+       if (TSTAT_DORMANT(p_tcb->tstat)) {
+               ercd = E_OBJ;
+       }
+       else if (TSTAT_WAIT_SLP(p_tcb->tstat)) {
+               if (wait_complete(p_tcb)) {
+                       reqflg = true;
+               }
+               ercd = E_OK;
+       }
+       else if (!(p_tcb->wupque)) {
+               p_tcb->wupque = true;
+               ercd = E_OK;
+       }
+       else {
+               ercd = E_QOVR;
+       }
+       i_unlock_cpu();
+
+  error_exit:
+       LOG_IWUP_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_iwup_tsk */
+
+/*
+ *  タスク起床要求のキャンセル
+ */
+#ifdef TOPPERS_can_wup
+
+ER_UINT
+can_wup(ID tskid)
+{
+       TCB             *p_tcb;
+       ER_UINT ercd;
+
+       LOG_CAN_WUP_ENTER(tskid);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID_SELF(tskid);
+       p_tcb = get_tcb_self(tskid);
+       CHECK_NONRSTR(p_tcb);
+
+       t_lock_cpu();
+       if (TSTAT_DORMANT(p_tcb->tstat)) {
+               ercd = E_OBJ;
+       }
+       else {
+               ercd = p_tcb->wupque ? 1 : 0;
+               p_tcb->wupque = false;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_CAN_WUP_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_can_wup */
+
+/*
+ *  待ち状態の強制解除
+ */
+#ifdef TOPPERS_rel_wai
+
+ER
+rel_wai(ID tskid)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_REL_WAI_ENTER(tskid);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID(tskid);
+       p_tcb = get_tcb(tskid);
+       CHECK_NONRSTR(p_tcb);
+
+       t_lock_cpu();
+       if (!TSTAT_WAITING(p_tcb->tstat)) {
+               ercd = E_OBJ;
+       }
+       else {
+               if (wait_release(p_tcb)) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_REL_WAI_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_rel_wai */
+
+/*
+ *  待ち状態の強制解除(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_irel_wai
+
+ER
+irel_wai(ID tskid)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_IREL_WAI_ENTER(tskid);
+       CHECK_INTCTX_UNL();
+       CHECK_TSKID(tskid);
+       p_tcb = get_tcb(tskid);
+       CHECK_NONRSTR(p_tcb);
+
+       i_lock_cpu();
+       if (!TSTAT_WAITING(p_tcb->tstat)) {
+               ercd = E_OBJ;
+       }
+       else {
+               if (wait_release(p_tcb)) {
+                       reqflg = true;
+               }
+               ercd = E_OK;
+       }
+       i_unlock_cpu();
+
+  error_exit:
+       LOG_IREL_WAI_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_irel_wai */
+
+/*
+ *  強制待ち状態への移行
+ */
+#ifdef TOPPERS_sus_tsk
+
+ER
+sus_tsk(ID tskid)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_SUS_TSK_ENTER(tskid);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID_SELF(tskid);
+       p_tcb = get_tcb_self(tskid);
+       CHECK_NONRSTR(p_tcb);
+
+       t_lock_cpu();
+       if (p_tcb == p_runtsk && !dspflg) {
+               ercd = E_CTX;
+       }
+       else if (TSTAT_DORMANT(p_tcb->tstat)) {
+               ercd = E_OBJ;
+       }
+       else if (TSTAT_RUNNABLE(p_tcb->tstat)) {
+               /*
+                *  実行できる状態から強制待ち状態への遷移
+                */
+               p_tcb->tstat = TS_SUSPENDED;
+               LOG_TSKSTAT(p_tcb);
+               if (make_non_runnable(p_tcb)) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else if (TSTAT_SUSPENDED(p_tcb->tstat)) {
+               ercd = E_QOVR;
+       }
+       else {
+               /*
+                *  待ち状態から二重待ち状態への遷移
+                */
+               p_tcb->tstat |= TS_SUSPENDED;
+               LOG_TSKSTAT(p_tcb);
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_SUS_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_sus_tsk */
+
+/*
+ *  強制待ち状態からの再開
+ */
+#ifdef TOPPERS_rsm_tsk
+
+ER
+rsm_tsk(ID tskid)
+{
+       TCB             *p_tcb;
+       ER              ercd;
+
+       LOG_RSM_TSK_ENTER(tskid);
+       CHECK_TSKCTX_UNL();
+       CHECK_TSKID(tskid);
+       p_tcb = get_tcb(tskid);
+       CHECK_NONRSTR(p_tcb);
+
+       t_lock_cpu();
+       if (!TSTAT_SUSPENDED(p_tcb->tstat)) {
+               ercd = E_OBJ;
+       }
+       else if (!TSTAT_WAITING(p_tcb->tstat)) {
+               /*
+                *  強制待ち状態から実行できる状態への遷移
+                */
+               p_tcb->tstat = TS_RUNNABLE;
+               LOG_TSKSTAT(p_tcb);
+               if (make_runnable(p_tcb)) {
+                       dispatch();
+               }
+               ercd = E_OK;
+       }
+       else {
+               /*
+                *  二重待ち状態から待ち状態への遷移
+                */
+               p_tcb->tstat &= ~TS_SUSPENDED;
+               LOG_TSKSTAT(p_tcb);
+               ercd = E_OK;
+       }
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_RSM_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_rsm_tsk */
+
+/*
+ *  自タスクの遅延
+ */
+#ifdef TOPPERS_dly_tsk
+
+ER
+dly_tsk(RELTIM dlytim)
+{
+       WINFO   winfo;
+       TMEVTB  tmevtb;
+       ER              ercd;
+
+       LOG_DLY_TSK_ENTER(dlytim);
+       CHECK_DISPATCH();
+       CHECK_PAR(dlytim <= TMAX_RELTIM);
+
+       t_lock_cpu();
+       p_runtsk->tstat = (TS_WAITING | TS_WAIT_DLY);
+       (void) make_non_runnable(p_runtsk);
+       p_runtsk->p_winfo = &winfo;
+       winfo.p_tmevtb = &tmevtb;
+       tmevtb_enqueue(&tmevtb, dlytim, (CBACK) wait_tmout_ok, (void *) p_runtsk);
+       LOG_TSKSTAT(p_runtsk);
+       dispatch();
+       ercd = winfo.wercd;
+       t_unlock_cpu();
+
+  error_exit:
+       LOG_DLY_TSK_LEAVE(ercd);
+       return(ercd);
+}
+
+#endif /* TOPPERS_dly_tsk */
diff --git a/asp/extension/rstr_task/test/test_rstr1.c b/asp/extension/rstr_task/test/test_rstr1.c
new file mode 100644 (file)
index 0000000..2c53ef1
--- /dev/null
@@ -0,0 +1,341 @@
+/*
+ *  TOPPERS Software
+ *      Toyohashi Open Platform for Embedded Real-Time Systems
+ * 
+ *  Copyright (C) 2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  $Id: test_rstr1.c 1887 2010-08-06 06:15:19Z ertl-hiro $
+ */
+
+/* 
+ *             制約タスクのテスト(1)
+ *
+ * 【テストの目的】
+ *
+ *  制約タスクの基本的な振舞い(ras_priサービスコール以外の動作)をテス
+ *  トする.
+ *
+ * 【テスト項目】
+ *
+ *     (A) 制約タスクが,自タスクを待ち状態にする可能性のあるサービスコー
+ *      ルを呼び出した場合,E_NOSPTエラーとなる
+ *             (A-1) slp_tsk
+ *             (A-2) tslp_tsk
+ *             (A-3) dly_tsk
+ *      ※ 他にもあるが,これだけに留める
+ *     (B) 制約タスクを対象として,chg_pri,wup_tsk,iwup_tsk,can_wup,
+ *         rel_wai,irel_wai,sus_tsk,rsm_tskを呼び出した場合,E_NOSPTエ
+ *         ラーとなる
+ *             (B-1) chg_pri
+ *             (B-2) wup_tsk
+ *             (B-3) iwup_tsk
+ *             (B-4) can_wup
+ *             (B-5) rel_wai
+ *             (B-6) irel_wai
+ *             (B-7) sus_tsk
+ *             (B-8) rsm_tsk
+ *  (C) rot_rdq,irot_rdqは,対象優先度を持つ実行できる状態のタスクの中
+ *      で最も優先順位が高いタスクが制約タスクである場合,E_NOSPTエラー
+ *      となる
+ *             (C-1) rot_rdqが正しく動作する
+ *             (C-2) rot_rdqがE_NOSPTを返す
+ *             (C-3) irot_rdqが正しく動作する
+ *             (C-4) irot_rdqがE_NOSPTを返す
+ *
+ * 【使用リソース】
+ *
+ *     TASK1: 中優先度タスク,メインタスク,最初から起動
+ *     TASK2: 高優先度タスク,制約タスク
+ *     TASK3: 中優先度タスク,制約タスク
+ *     TASK4: 中優先度タスク,制約タスク
+ *     ALM1:  アラームハンドラ
+ *
+ * 【テストシーケンス】
+ *
+ *     == TASK1(優先度:中)==
+ *     1:      act_tsk(TASK2)
+ *     == TASK2-1(優先度:高)==
+ *     2:      slp_tsk() -> E_NOSPT                                            ... (A-1)
+ *     3:      tslp_tsk(10) -> E_NOSPT                                         ... (A-2)
+ *     4:      dly_tsk(10) -> E_NOSPT                                          ... (A-3)
+ *  5: ext_tsk()
+ *     == TASK1(続き)==
+ *     6:      chg_pri(TASK3, HIGH_PRIORITY) -> E_NOSPT        ... (B-1)
+ *     7:      wup_tsk(TASK3) -> E_NOSPT                                       ... (B-2)
+ *     8:      can_wup(TASK3) -> E_NOSPT                                       ... (B-4)
+ *     9:      rel_wai(TASK3) -> E_NOSPT                                       ... (B-5)
+ *     10:     sus_tsk(TASK3) -> E_NOSPT                                       ... (B-7)
+ *     11:     rsm_tsk(TASK3) -> E_NOSPT                                       ... (B-8)
+ *     12:     sta_alm(ALM1, 10)
+ *     13:     slp_tsk()
+ *     == ALM1 ==
+ *     14:     iwup_tsk(TASK3) -> E_NOSPT                                      ... (B-3)
+ *     15:     irel_wai(TASK3) -> E_NOSPT                                      ... (B-6)
+ *     16:     iwup_tsk(TASK1)
+ *     17:     iact_tsk(TASK3)
+ *     18:     iact_tsk(TASK4)
+ *     19:     irot_rdq(MID_PRIORITY)                                          ... (C-3)
+ *     20:     irot_rdq(MID_PRIORITY) -> E_NOSPT                       ... (C-4)
+ *     21:     RETURN
+ *     == TASK3-1(優先度:中)==
+ *     22:     act_tsk(TASK2)
+ *     == TASK2-2(優先度:高)2回め ==
+ *     23:     rot_rdq(MID_PRIORITY) -> E_NOSPT                        ... (C-2)
+ *     24:     ext_tsk()
+ *     == TASK3-1(続き)==
+ *     25:     ext_tsk()
+ *     == TASK4-1(優先度:中)1回め ==
+ *     26:     ext_tsk()
+ *     == TASK1(続き)==
+ *     27:     act_tsk(TASK3)
+ *     28:     act_tsk(TASK4)
+ *     29:     act_tsk(TASK2)
+ *     == TASK2-3(優先度:高)3回め ==
+ *     30:     rot_rdq(MID_PRIORITY)                                           ... (C-1)
+ *     31:     ext_tsk()
+ *     == TASK3-2(優先度:中)2回め ==
+ *     32:     ext_tsk()
+ *     == TASK4-2(優先度:中)2回め ==
+ *     33:     ext_tsk()
+ *     == TASK1(続き)==
+ *     34: END
+ */
+
+#include <kernel.h>
+#include <test_lib.h>
+#include <t_syslog.h>
+#include "kernel_cfg.h"
+#include "test_rstr1.h"
+
+void
+alarm1_handler(intptr_t exinf)
+{
+       ER              ercd;
+
+       check_point(14);
+       ercd = iwup_tsk(TASK3);
+       check_ercd(ercd, E_NOSPT);
+
+       check_point(15);
+       ercd = irel_wai(TASK3);
+       check_ercd(ercd, E_NOSPT);
+
+       check_point(16);
+       ercd = iwup_tsk(TASK1);
+       check_ercd(ercd, E_OK);
+
+       check_point(17);
+       ercd = iact_tsk(TASK3);
+       check_ercd(ercd, E_OK);
+
+       check_point(18);
+       ercd = iact_tsk(TASK4);
+       check_ercd(ercd, E_OK);
+
+       check_point(19);
+       ercd = irot_rdq(MID_PRIORITY);
+       check_ercd(ercd, E_OK);
+
+       check_point(20);
+       ercd = irot_rdq(MID_PRIORITY);
+       check_ercd(ercd, E_NOSPT);
+
+       check_point(21);
+       return;
+
+       check_point(0);
+}
+
+void
+task1(intptr_t exinf)
+{
+       ER              ercd;
+
+       check_point(1);
+       ercd = act_tsk(TASK2);
+       check_ercd(ercd, E_OK);
+
+       check_point(6);
+       ercd = chg_pri(TASK3, HIGH_PRIORITY);
+       check_ercd(ercd, E_NOSPT);
+
+       check_point(7);
+       ercd = wup_tsk(TASK3);
+       check_ercd(ercd, E_NOSPT);
+
+       check_point(8);
+       ercd = can_wup(TASK3);
+       check_ercd(ercd, E_NOSPT);
+
+       check_point(9);
+       ercd = rel_wai(TASK3);
+       check_ercd(ercd, E_NOSPT);
+
+       check_point(10);
+       ercd = sus_tsk(TASK3);
+       check_ercd(ercd, E_NOSPT);
+
+       check_point(11);
+       ercd = rsm_tsk(TASK3);
+       check_ercd(ercd, E_NOSPT);
+
+       check_point(12);
+       ercd = sta_alm(ALM1, 10);
+       check_ercd(ercd, E_OK);
+
+       check_point(13);
+       ercd = slp_tsk();
+       check_ercd(ercd, E_OK);
+
+       check_point(27);
+       ercd = act_tsk(TASK3);
+       check_ercd(ercd, E_OK);
+
+       check_point(28);
+       ercd = act_tsk(TASK4);
+       check_ercd(ercd, E_OK);
+
+       check_point(29);
+       ercd = act_tsk(TASK2);
+       check_ercd(ercd, E_OK);
+
+       check_finish(34);
+
+       check_point(0);
+}
+
+static uint_t  task2_count = 0;
+
+void
+task2(intptr_t exinf)
+{
+       ER              ercd;
+
+       switch (++task2_count) {
+       case 1:
+               check_point(2);
+               ercd = slp_tsk();
+               check_ercd(ercd, E_NOSPT);
+
+               check_point(3);
+               ercd = tslp_tsk(10);
+               check_ercd(ercd, E_NOSPT);
+
+               check_point(4);
+               ercd = dly_tsk(10);
+               check_ercd(ercd, E_NOSPT);
+
+               check_point(5);
+               ercd = ext_tsk();
+               check_ercd(ercd, E_OK);
+
+               check_point(0);
+
+       case 2:
+               check_point(23);
+               ercd = rot_rdq(MID_PRIORITY);
+               check_ercd(ercd, E_NOSPT);
+
+               check_point(24);
+               ercd = ext_tsk();
+               check_ercd(ercd, E_OK);
+
+               check_point(0);
+
+       case 3:
+               check_point(30);
+               ercd = rot_rdq(MID_PRIORITY);
+               check_ercd(ercd, E_OK);
+
+               check_point(31);
+               ercd = ext_tsk();
+               check_ercd(ercd, E_OK);
+
+               check_point(0);
+       }
+       check_point(0);
+}
+
+static uint_t  task3_count = 0;
+
+void
+task3(intptr_t exinf)
+{
+       ER              ercd;
+
+       switch (++task3_count) {
+       case 1:
+               check_point(22);
+               ercd = act_tsk(TASK2);
+               check_ercd(ercd, E_OK);
+
+               check_point(25);
+               ercd = ext_tsk();
+               check_ercd(ercd, E_OK);
+
+               check_point(0);
+
+       case 2:
+               check_point(32);
+               ercd = ext_tsk();
+               check_ercd(ercd, E_OK);
+
+               check_point(0);
+       }
+       check_point(0);
+}
+
+static uint_t  task4_count = 0;
+
+void
+task4(intptr_t exinf)
+{
+       ER              ercd;
+
+       switch (++task4_count) {
+       case 1:
+               check_point(26);
+               ercd = ext_tsk();
+               check_ercd(ercd, E_OK);
+
+               check_point(0);
+
+       case 2:
+               check_point(33);
+               ercd = ext_tsk();
+               check_ercd(ercd, E_OK);
+
+               check_point(0);
+       }
+       check_point(0);
+}
diff --git a/asp/extension/rstr_task/test/test_rstr1.cfg b/asp/extension/rstr_task/test/test_rstr1.cfg
new file mode 100644 (file)
index 0000000..a11fbbf
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ *  $Id: test_rstr1.cfg 1887 2010-08-06 06:15:19Z ertl-hiro $
+ */
+
+/*
+ *  制約タスクのテスト(1)のシステムコンフィギュレーションファイル
+ */
+INCLUDE("target_timer.cfg");
+INCLUDE("syssvc/syslog.cfg");
+INCLUDE("syssvc/banner.cfg");
+INCLUDE("syssvc/serial.cfg");
+
+#include "test_rstr1.h"
+
+CRE_TSK(TASK1, { TA_ACT, 1, task1, MID_PRIORITY, STACK_SIZE, NULL });
+CRE_TSK(TASK2, { TA_RSTR, 2, task2, HIGH_PRIORITY, STACK_SIZE, NULL });
+CRE_TSK(TASK3, { TA_RSTR, 3, task3, MID_PRIORITY, STACK_SIZE + 256, NULL });
+CRE_TSK(TASK4, { TA_RSTR, 4, task4, MID_PRIORITY, STACK_SIZE, NULL });
+CRE_ALM(ALM1, { TA_NULL, 1, alarm1_handler });
old mode 100755 (executable)
new mode 100644 (file)
similarity index 74%
rename from asp/target/lm3s8962_gcc/lm3s8962.h
rename to asp/extension/rstr_task/test/test_rstr1.h
index b85496f..20e34ce
@@ -1,9 +1,8 @@
 /*
- *  TOPPERS/ASP Kernel
- *      Toyohashi Open Platform for Embedded Real-Time Systems/
- *      Advanced Standard Profile Kernel
+ *  TOPPERS Software
+ *      Toyohashi Open Platform for Embedded Real-Time Systems
  * 
- *  Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: lm3s8962.h 1309 2008-08-27 07:48:51Z ertl-honda $
+ *  $Id: test_rstr1.h 1887 2010-08-06 06:15:19Z ertl-hiro $
  */
 
-/*
- *  LM3S8962に関する定義
+/* 
+ *             制約タスクのテスト(1)
  */
 
-#ifndef TOPPERS_LM3S8962_H
-#define TOPPERS_LM3S8962_H
-
-#include <sil.h>
-
 /*
- *  割込み番号の最大値
+ *  ターゲット依存の定義
  */
-#define TMAX_INTNO   (15 + 32)
+#include "target_test.h"
 
 /*
- *  å\89²è¾¼ã\81¿å\84ªå\85\88度ã\81®ã\83\93ã\83\83ã\83\88å¹\85
+ *  å\84ªå\85\88度ã\81®å®\9a義
  */
-#define TBITW_IPRI     3
+#define HIGH_PRIORITY  4               /* 高優先度 */
+#define MID_PRIORITY   9               /* 中優先度 */
+#define LOW_PRIORITY   14              /* 低優先度 */
 
 /*
- *  割込み優先度ビット幅中のサブ優先度のビット幅
+ *  ターゲットに依存する可能性のある定数の定義
  */
-#define TBITW_SUBIPRI  0
+#ifndef STACK_SIZE
+#define        STACK_SIZE              4096            /* タスクのスタックサイズ */
+#endif /* STACK_SIZE */
 
+/*
+ *  関数のプロトタイプ宣言
+ */
 #ifndef TOPPERS_MACRO_ONLY
 
-#endif /* TOPPERS_MACRO_ONLY */
+extern void    task1(intptr_t exinf);
+extern void    task2(intptr_t exinf);
+extern void    task3(intptr_t exinf);
+extern void    task4(intptr_t exinf);
+extern void    alarm1_handler(intptr_t exinf);
 
-#endif /* TOPPERS_LM3S8962_H */
+#endif /* TOPPERS_MACRO_ONLY */
diff --git a/asp/extension/rstr_task/test/test_rstr2.c b/asp/extension/rstr_task/test/test_rstr2.c
new file mode 100644 (file)
index 0000000..ad106cd
--- /dev/null
@@ -0,0 +1,220 @@
+/*
+ *  TOPPERS Software
+ *      Toyohashi Open Platform for Embedded Real-Time Systems
+ * 
+ *  Copyright (C) 2010 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ * 
+ *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+ *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+ *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+ *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+ *      スコード中に含まれていること.
+ *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+ *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+ *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+ *      の無保証規定を掲載すること.
+ *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+ *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+ *      と.
+ *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+ *        作権表示,この利用条件および下記の無保証規定を掲載すること.
+ *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+ *        報告すること.
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+ *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること.
+ * 
+ *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+ *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+ *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+ *  の責任を負わない.
+ * 
+ *  $Id: test_rstr2.c 1887 2010-08-06 06:15:19Z ertl-hiro $
+ */
+
+/* 
+ *             制約タスクのテスト(2)
+ *
+ * 【テストの目的】
+ *
+ *  ras_priサービスコールの動作をテストする.
+ *
+ * 【テスト項目】
+ *
+ *     (A) 制約タスクからras_priを呼び出し,優先度を上げる
+ *             (A-1) ディスパッチ許可状態で呼び出した場合
+ *             (A-2) ディスパッチ禁止状態で,最高優先順位タスクが実行状態でな
+ *                   い場合に呼び出した場合
+ *     (B) 優先度が上がった制約タスクからras_pri(TPRI_INI)を呼び出し,起動
+ *      時優先度に戻す
+ *             (B-1) 起動時優先度よりも高い優先度のタスクが実行可能の場合に,
+ *                   タスク切換えが起こることを確認する
+ *             (B-2) 起動時優先度と同じ優先度のタスクが実行可能の場合に,タス
+ *                   ク切換えが起こらないことを確認する
+ *             (B-3) 起動時優先度よりも低い優先度のタスクが実行可能の場合に,
+ *                   タスク切換えが起こらないことを確認する
+ *     (C) 制約タスクからras_priを呼び出し,起動時優先度よりも低い優先度に
+ *         変更しようとすると,E_ILUSEになることを確認する
+ *
+ * 【使用リソース】
+ *
+ *     TASK1: 中優先度タスク,メインタスク,最初から起動
+ *     TASK2: 中優先度タスク,制約タスク
+ *     TASK3: 高優先度タスク
+ *
+ * 【テストシーケンス】
+ *
+ *     == TASK1(優先度:中)==
+ *     1:      act_tsk(TASK2)
+ *     2:      slp_tsk()
+ *     == TASK2(優先度:中)==
+ *     3:      get_pri(TSK_SELF, &tskpri)
+ *             assert(tskpri == MID_PRIORITY)
+ *     4:      ras_pri(HIGH_PRIORITY)
+ *     5:      get_pri(TSK_SELF, &tskpri)
+ *             assert(tskpri == HIGH_PRIORITY)
+ *     6:      act_tsk(TASK3)
+ *     7:      ras_pri(LOW_PRIORITY) -> E_ILUSE                        ... (C)
+ *     8:      ras_pri(TPRI_INI)                                                       ... (B-1)
+ *     == TASK3(優先度:高)==
+ *     9:      get_pri(TASK2, &tskpri)
+ *             assert(tskpri == MID_PRIORITY)
+ *     10:     slp_tsk()
+ *     == TASK2(続き)==
+ *     11:     dis_dsp()
+ *     12:     wup_tsk(TASK3)
+ *     13:     ras_pri(HIGH_PRIORITY)                                          ... (A-2)
+ *     14:     ena_dsp()
+ *     15:     ras_pri(TPRI_INI)                                                       ... (B-3)
+ *     == TASK3(続き)==
+ *     16:     chg_pri(TSK_SELF, LOW_PRIORITY)
+ *     == TASK2(続き)==
+ *     17:     ras_pri(HIGH_PRIORITY)
+ *     18:     wup_tsk(TASK1)
+ *     19:     ras_pri(TPRI_INI)                                                       ... (B-2)
+ *     20:     ext_tsk()
+ *     == TASK1(続き)==
+ *     21: END
+ */
+
+#include <kernel.h>
+#include <test_lib.h>
+#include <t_syslog.h>
+#include "kernel_cfg.h"
+#include "test_rstr1.h"
+
+void
+task1(intptr_t exinf)
+{
+       ER              ercd;
+
+       check_point(1);
+       ercd = act_tsk(TASK2);
+       check_ercd(ercd, E_OK);
+
+       check_point(2);
+       ercd = slp_tsk();
+       check_ercd(ercd, E_OK);
+
+       check_finish(21);
+
+       check_point(0);
+}
+
+void
+task2(intptr_t exinf)
+{
+       ER              ercd;
+       PRI             tskpri;
+
+       check_point(3);
+       ercd = get_pri(TSK_SELF, &tskpri);
+       check_ercd(ercd, E_OK);
+       check_assert(tskpri == MID_PRIORITY);
+
+       check_point(4);
+       ercd = ras_pri(HIGH_PRIORITY);
+       check_ercd(ercd, E_OK);
+
+       check_point(5);
+       ercd = get_pri(TSK_SELF, &tskpri);
+       check_ercd(ercd, E_OK);
+       check_assert(tskpri == HIGH_PRIORITY);
+
+       check_point(6);
+       ercd = act_tsk(TASK3);
+       check_ercd(ercd, E_OK);
+
+       check_point(7);
+       ercd = ras_pri(LOW_PRIORITY);
+       check_ercd(ercd, E_ILUSE);
+
+       check_point(8);
+       ercd = ras_pri(TPRI_INI);
+       check_ercd(ercd, E_OK);
+
+       check_point(11);
+       ercd = dis_dsp();
+       check_ercd(ercd, E_OK);
+
+       check_point(12);
+       ercd = wup_tsk(TASK3);
+       check_ercd(ercd, E_OK);
+
+       check_point(13);
+       ercd = ras_pri(HIGH_PRIORITY);
+       check_ercd(ercd, E_OK);
+
+       check_point(14);
+       ercd = ena_dsp();
+       check_ercd(ercd, E_OK);
+
+       check_point(15);
+       ercd = ras_pri(TPRI_INI);
+       check_ercd(ercd, E_OK);
+
+       check_point(17);
+       ercd = ras_pri(HIGH_PRIORITY);
+       check_ercd(ercd, E_OK);
+
+       check_point(18);
+       ercd = wup_tsk(TASK1);
+       check_ercd(ercd, E_OK);
+
+       check_point(19);
+       ercd = ras_pri(TPRI_INI);
+       check_ercd(ercd, E_OK);
+
+       check_point(20);
+       ercd = ext_tsk();
+       check_ercd(ercd, E_OK);
+
+       check_point(0);
+}
+
+void
+task3(intptr_t exinf)
+{
+       ER              ercd;
+       PRI             tskpri;
+
+       check_point(9);
+       ercd = get_pri(TASK2, &tskpri);
+       check_ercd(ercd, E_OK);
+       check_assert(tskpri == MID_PRIORITY);
+
+       check_point(10);
+       ercd = slp_tsk();
+       check_ercd(ercd, E_OK);
+
+       check_point(16);
+       ercd = chg_pri(TSK_SELF, LOW_PRIORITY);
+       check_ercd(ercd, E_OK);
+
+       check_point(0);
+}
diff --git a/asp/extension/rstr_task/test/test_rstr2.cfg b/asp/extension/rstr_task/test/test_rstr2.cfg
new file mode 100644 (file)
index 0000000..250fb6d
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ *  $Id: test_rstr2.cfg 1887 2010-08-06 06:15:19Z ertl-hiro $
+ */
+
+/*
+ *  制約タスクのテスト(2)のシステムコンフィギュレーションファイル
+ */
+INCLUDE("target_timer.cfg");
+INCLUDE("syssvc/syslog.cfg");
+INCLUDE("syssvc/banner.cfg");
+INCLUDE("syssvc/serial.cfg");
+
+#include "test_rstr2.h"
+
+CRE_TSK(TASK1, { TA_ACT, 1, task1, MID_PRIORITY, STACK_SIZE, NULL });
+CRE_TSK(TASK2, { TA_RSTR, 2, task2, MID_PRIORITY, STACK_SIZE, NULL });
+CRE_TSK(TASK3, { TA_NULL, 3, task3, HIGH_PRIORITY, STACK_SIZE, NULL });
old mode 100755 (executable)
new mode 100644 (file)
similarity index 76%
rename from asp/target/lm3s8962_gcc/target_sil.h
rename to asp/extension/rstr_task/test/test_rstr2.h
index 35eb999..cb4b63c
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  * 
- *  Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: target_sil.h 1309 2008-08-27 07:48:51Z ertl-honda $
+ *  $Id: test_rstr2.h 1887 2010-08-06 06:15:19Z ertl-hiro $
+ */
+
+/* 
+ *             制約タスクのテスト(2)
  */
 
 /*
- *   sil.hのチップ依存部(LM3S8962用)
- *
- *  このインクルードファイルは,sil.hの先頭でインクルードされる.他のファ
- *  イルからは直接インクルードすることはない.このファイルをインクルー
- *  ドする前に,t_stddef.hがインクルードされるので,それらに依存しても
- *  よい.
+ *  ターゲット依存の定義
  */
+#include "target_test.h"
 
-#ifndef TOPPERS_TARGET_SIL_H
-#define TOPPERS_TARGET_SIL_H
+/*
+ *  優先度の定義
+ */
+#define HIGH_PRIORITY  4               /* 高優先度 */
+#define MID_PRIORITY   9               /* 中優先度 */
+#define LOW_PRIORITY   14              /* 低優先度 */
 
 /*
- *  ã\83\97ã\83­ã\82»ã\83\83ã\82µã\81®ã\82¨ã\83³ã\83\87ã\82£ã\82¢ã\83³
+ *  ã\82¿ã\83¼ã\82²ã\83\83ã\83\88ã\81«ä¾\9då­\98ã\81\99ã\82\8bå\8f¯è\83½æ\80§ã\81®ã\81\82ã\82\8bå®\9aæ\95°ã\81®å®\9a義
  */
-#define SIL_ENDIAN_LITTLE
+#ifndef STACK_SIZE
+#define        STACK_SIZE              4096            /* タスクのスタックサイズ */
+#endif /* STACK_SIZE */
 
 /*
- *  プロセッサ依存で共通な定義
+ *  関数のプロトタイプ宣言
  */
-#include "arm_m_gcc/prc_sil.h"
+#ifndef TOPPERS_MACRO_ONLY
+
+extern void    task1(intptr_t exinf);
+extern void    task2(intptr_t exinf);
+extern void    task3(intptr_t exinf);
 
-#endif /* TOPPERS_TARGET_SIL_H */
+#endif /* TOPPERS_MACRO_ONLY */
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index d87429e..dddca69
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: kernel.h 1862 2010-07-25 11:49:51Z ertl-hiro $
+ *  @(#) $Id: kernel.h 1959 2010-11-20 02:17:27Z ertl-hiro $
  */
 
 /*
@@ -449,8 +449,8 @@ extern bool_t       xsns_xpn(void *p_excinf) throw();
  */
 #define TKERNEL_MAKER  UINT_C(0x0118)  /* カーネルのメーカーコード */
 #define TKERNEL_PRID   UINT_C(0x0007)  /* カーネルの識別番号 */
-#define TKERNEL_SPVER  UINT_C(0xf512)  /* カーネル仕様のバージョン番号 */
-#define TKERNEL_PRVER  UINT_C(0x1060)  /* カーネルのバージョン番号 */
+#define TKERNEL_SPVER  UINT_C(0xf513)  /* カーネル仕様のバージョン番号 */
+#define TKERNEL_PRVER  UINT_C(0x1070)  /* カーネルのバージョン番号 */
 
 /*
  *  キューイング回数の最大値
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 68894f4..f51d301
@@ -4,7 +4,7 @@
  * 
  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
  *                              Toyohashi Univ. of Technology, JAPAN
- *  Copyright (C) 2004-2008 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2004-2011 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -36,7 +36,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: sil.h 1844 2010-07-11 12:59:26Z ertl-hiro $
+ *  @(#) $Id: sil.h 2037 2011-03-06 07:56:49Z ertl-hiro $
  */
 
 /*
@@ -109,7 +109,7 @@ extern void sil_dly_nse(ulong_t dlytim) throw();
 #ifdef UINT8_MAX
 
 Inline uint8_t
-sil_reb_mem(void *mem)
+sil_reb_mem(uint8_t *mem)
 {
        uint8_t data;
 
@@ -118,7 +118,7 @@ sil_reb_mem(void *mem)
 }
 
 Inline void
-sil_wrb_mem(void *mem, uint8_t data)
+sil_wrb_mem(uint8_t *mem, uint8_t data)
 {
        *((volatile uint8_t *) mem) = data;
 }
@@ -130,7 +130,7 @@ sil_wrb_mem(void *mem, uint8_t data)
  */
 
 Inline uint16_t
-sil_reh_mem(void *mem)
+sil_reh_mem(uint16_t *mem)
 {
        uint16_t        data;
 
@@ -139,7 +139,7 @@ sil_reh_mem(void *mem)
 }
 
 Inline void
-sil_wrh_mem(void *mem, uint16_t data)
+sil_wrh_mem(uint16_t *mem, uint16_t data)
 {
        *((volatile uint16_t *) mem) = data;
 }
@@ -152,7 +152,7 @@ sil_wrh_mem(void *mem, uint16_t data)
 #ifndef TOPPERS_OMIT_SIL_REH_LEM
 
 Inline uint16_t
-sil_reh_lem(void *mem)
+sil_reh_lem(uint16_t *mem)
 {
        uint16_t        data;
 
@@ -164,7 +164,7 @@ sil_reh_lem(void *mem)
 #ifndef TOPPERS_OMIT_SIL_WRH_LEM
 
 Inline void
-sil_wrh_lem(void *mem, uint16_t data)
+sil_wrh_lem(uint16_t *mem, uint16_t data)
 {
        *((volatile uint16_t *) mem) = TOPPERS_SIL_REV_ENDIAN_UINT16(data);
 }
@@ -179,7 +179,7 @@ sil_wrh_lem(void *mem, uint16_t data)
 #ifndef TOPPERS_OMIT_SIL_REH_BEM
 
 Inline uint16_t
-sil_reh_bem(void *mem)
+sil_reh_bem(uint16_t *mem)
 {
        uint16_t        data;
 
@@ -191,7 +191,7 @@ sil_reh_bem(void *mem)
 #ifndef TOPPERS_OMIT_SIL_WRH_BEM
 
 Inline void
-sil_wrh_bem(void *mem, uint16_t data)
+sil_wrh_bem(uint16_t *mem, uint16_t data)
 {
        *((volatile uint16_t *) mem) = TOPPERS_SIL_REV_ENDIAN_UINT16(data);
 }
@@ -209,7 +209,7 @@ sil_wrh_bem(void *mem, uint16_t data)
  */
 
 Inline uint32_t
-sil_rew_mem(void *mem)
+sil_rew_mem(uint32_t *mem)
 {
        uint32_t        data;
 
@@ -218,7 +218,7 @@ sil_rew_mem(void *mem)
 }
 
 Inline void
-sil_wrw_mem(void *mem, uint32_t data)
+sil_wrw_mem(uint32_t *mem, uint32_t data)
 {
        *((volatile uint32_t *) mem) = data;
 }
@@ -231,7 +231,7 @@ sil_wrw_mem(void *mem, uint32_t data)
 #ifndef TOPPERS_OMIT_SIL_REW_LEM
 
 Inline uint32_t
-sil_rew_lem(void *mem)
+sil_rew_lem(uint32_t *mem)
 {
        uint32_t        data;
 
@@ -243,7 +243,7 @@ sil_rew_lem(void *mem)
 #ifndef TOPPERS_OMIT_SIL_WRW_LEM
 
 Inline void
-sil_wrw_lem(void *mem, uint32_t data)
+sil_wrw_lem(uint32_t *mem, uint32_t data)
 {
        *((volatile uint32_t *) mem) = TOPPERS_SIL_REV_ENDIAN_UINT32(data);
 }
@@ -257,7 +257,7 @@ sil_wrw_lem(void *mem, uint32_t data)
 #ifndef TOPPERS_OMIT_SIL_REW_BEM
 
 Inline uint32_t
-sil_rew_bem(void *mem)
+sil_rew_bem(uint32_t *mem)
 {
        uint32_t        data;
 
@@ -269,7 +269,7 @@ sil_rew_bem(void *mem)
 #ifndef TOPPERS_OMIT_SIL_WRW_BEM
 
 Inline void
-sil_wrw_bem(void *mem, uint32_t data)
+sil_wrw_bem(uint32_t *mem, uint32_t data)
 {
        *((volatile uint32_t *) mem) = TOPPERS_SIL_REV_ENDIAN_UINT32(data);
 }
old mode 100755 (executable)
new mode 100644 (file)
index 0a280a7..2f03147
@@ -4,7 +4,7 @@
  * 
  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
  *                              Toyohashi Univ. of Technology, JAPAN
- *  Copyright (C) 2004-2009 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2004-2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -36,7 +36,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: t_stddef.h 1513 2009-04-22 07:35:20Z ertl-hiro $
+ *  @(#) $Id: t_stddef.h 1958 2010-11-20 02:15:29Z ertl-hiro $
  */
 
 /*
@@ -125,6 +125,8 @@ typedef     int_t                   ER_BOOL;        /* エラーコードまたは真偽値 */
 typedef        int_t                   ER_ID;          /* エラーコードまたはID番号 */
 typedef        int_t                   ER_UINT;        /* エラーコードまたは符号無し整数 */
 
+typedef uintptr_t              MB_T;           /* 管理領域を確保するためのデータ型 */
+
 typedef        uint32_t                ACPTN;          /* アクセス許可パターン */
 typedef        struct acvct {                          /* アクセス許可ベクタ */
        ACPTN           acptn1;                         /* 通常操作1のアクセス許可パターン */
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 8f7c842..fe54256
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: t_syslog.h 1176 2008-07-01 10:24:46Z ertl-hiro $
+ *  @(#) $Id: t_syslog.h 1900 2010-08-14 02:31:44Z ertl-hiro $
  */
 
 /*
@@ -131,12 +131,12 @@ typedef struct t_syslog_rlog {
        uint_t  lowmask;        /* 低レベル出力すべき重要度 */
 } T_SYSLOG_RLOG;
 
-#ifndef TOPPERS_OMIT_SYSLOG
-
 /*
  *  ログ情報を出力するためのライブラリ関数
  */
 
+#ifndef TOPPERS_OMIT_SYSLOG
+
 extern ER      syslog_wri_log(uint_t prio, const SYSLOG *p_syslog) throw();
 
 Inline void
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 859d00a..2d7da76
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: check.h 1139 2008-06-19 07:03:34Z ertl-hiro $
+ *  @(#) $Id: check.h 1940 2010-10-03 15:09:34Z ertl-hiro $
  */
 
 /*
@@ -94,7 +94,7 @@
 /*
  *  割込み優先度のチェック(E_PAR)
  */
-#define CHECK_INTPRI_CHGIPM(inttpri) {                                         \
+#define CHECK_INTPRI_CHGIPM(intpri) {                                          \
        if (!VALID_INTPRI_CHGIPM(intpri)) {                                             \
                ercd = E_PAR;                                                                           \
                goto error_exit;                                                                        \
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index e6b1663..8cf668e
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: dataqueue.c 1774 2010-03-19 12:45:46Z ertl-hiro $
+ *  @(#) $Id: dataqueue.c 1960 2010-11-20 02:20:40Z ertl-hiro $
  */
 
 /*
@@ -183,7 +183,7 @@ initialize_dataqueue(void)
 void
 enqueue_data(DTQCB *p_dtqcb, intptr_t data)
 {
-       *(p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail) = data;
+       (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail)->data = data;
        p_dtqcb->count++;
        p_dtqcb->tail++;
        if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
@@ -201,7 +201,7 @@ enqueue_data(DTQCB *p_dtqcb, intptr_t data)
 void
 force_enqueue_data(DTQCB *p_dtqcb, intptr_t data)
 {
-       *(p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail) = data;
+       (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail)->data = data;
        p_dtqcb->tail++;
        if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
                p_dtqcb->tail = 0U;
@@ -224,7 +224,7 @@ force_enqueue_data(DTQCB *p_dtqcb, intptr_t data)
 void
 dequeue_data(DTQCB *p_dtqcb, intptr_t *p_data)
 {
-       *p_data = *(p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->head);
+       *p_data = (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->head)->data;
        p_dtqcb->count--;
        p_dtqcb->head++;
        if (p_dtqcb->head >= p_dtqcb->p_dtqinib->dtqcnt) {
old mode 100755 (executable)
new mode 100644 (file)
index 50aab24..4d06bed
@@ -5,7 +5,7 @@
  * 
  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
  *                              Toyohashi Univ. of Technology, JAPAN
- *  Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: dataqueue.h 748 2008-03-07 17:18:06Z hiro $
+ *  @(#) $Id: dataqueue.h 1960 2010-11-20 02:20:40Z ertl-hiro $
  */
 
 /*
 #include <queue.h>
 
 /*
+ *  データ管理ブロック
+ */
+typedef struct data_management_block {
+       intptr_t        data;                   /* データ本体 */
+} DTQMB;
+
+/*
  *  データキュー初期化ブロック
  *
  *  この構造体は,同期・通信オブジェクトの初期化ブロックの共通部分
@@ -59,7 +66,7 @@
 typedef struct dataqueue_initialization_block {
        ATR                     dtqatr;                 /* データキュー属性 */
        uint_t          dtqcnt;                 /* データキューの容量 */
-       intptr_t        *p_dtqmb;               /* データキュー管理領域の先頭番地 */
+       DTQMB           *p_dtqmb;               /* データキュー管理領域の先頭番地 */
 } DTQINIB;
 
 /*
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index a596ffd..eb48769
@@ -5,7 +5,7 @@
  * 
  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
  *                              Toyohashi Univ. of Technology, JAPAN
- *  Copyright (C) 2005-2009 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: exception.c 1653 2009-10-10 18:04:15Z ertl-hiro $
+ *  @(#) $Id: exception.c 2010 2010-12-31 12:44:33Z ertl-hiro $
  */
 
 /*
@@ -127,7 +127,7 @@ xsns_xpn(void *p_excinf)
        bool_t  state;
 
        LOG_XSNS_XPN_ENTER(p_excinf);
-       state = (exc_sense_unlock(p_excinf) && p_runtsk->enatex) ? false : true;
+       state = (exc_sense_intmask(p_excinf) && p_runtsk->enatex) ? false : true;
        LOG_XSNS_XPN_LEAVE(state);
        return(state);
 }
old mode 100755 (executable)
new mode 100644 (file)
diff --git a/asp/kernel/genoffset.tf b/asp/kernel/genoffset.tf
new file mode 100644 (file)
index 0000000..486a2fb
--- /dev/null
@@ -0,0 +1,146 @@
+$ ======================================================================
+$ 
+$   TOPPERS/ASP Kernel
+$       Toyohashi Open Platform for Embedded Real-Time Systems/
+$       Advanced Standard Profile Kernel
+$ 
+$   Copyright (C) 2011 by Embedded and Real-Time Systems Laboratory
+$               Graduate School of Information Science, Nagoya Univ., JAPAN
+$  
+$   上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
+$   ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
+$   変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
+$   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
+$       権表示,この利用条件および下記の無保証規定が,そのままの形でソー
+$       スコード中に含まれていること.
+$   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
+$       用できる形で再配布する場合には,再配布に伴うドキュメント(利用
+$       者マニュアルなど)に,上記の著作権表示,この利用条件および下記
+$       の無保証規定を掲載すること.
+$   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
+$       用できない形で再配布する場合には,次のいずれかの条件を満たすこ
+$       と.
+$     (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
+$         作権表示,この利用条件および下記の無保証規定を掲載すること.
+$     (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
+$         報告すること.
+$   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+$       害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
+$       また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+$       由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
+$       免責すること.
+$  
+$   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
+$   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
+$   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
+$   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
+$   の責任を負わない.
+$ 
+$   $Id: genoffset.tf 2046 2011-04-03 02:33:08Z ertl-hiro $
+$ 
+$ =====================================================================
+
+$ 
+$  #defineディレクティブの生成
+$ 
+$FUNCTION DEFINE$
+       #define $ARGV[1]$$TAB$$FORMAT("%d", +ARGV[2])$$NL$
+$END$
+
+$ 
+$  ビットのサーチ
+$ 
+$FUNCTION SEARCH_BIT$
+       $_val = ARGV[1]$
+       $FOREACH _val_bit RANGE(0,7)$
+               $IF (_val & 1) != 0$
+                       $RESULT = _val_bit$
+               $END$
+               $_val = _val >> 1$
+       $END$
+$END$
+
+$ 
+$  ビットフィールドのオフセットとビット位置の定義の生成
+$ 
+$FUNCTION DEFINE_BIT$
+       $label = ARGV[1]$
+       $struct_size = ARGV[2]$
+       $output_size = ARGV[3]$
+
+       $top = SYMBOL(label)$
+       $IF !LENGTH(top)$
+               $ERROR$$FORMAT("label %1% not found", label)$$END$
+       $ELSE$
+               $val = 0$
+               $FOREACH i RANGE(0,struct_size-1)$
+                       $tmp_val = PEEK(top + i, 1)$
+                       $IF val == 0 && tmp_val != 0$
+                               $val = tmp_val$
+                               $offset = i$
+                       $END$
+               $END$
+
+               $IF val == 0$
+                       $ERROR$$FORMAT("bit not found in %1%", ARGV[1])$$END$
+               $ELSE$
+                       $val_bit = SEARCH_BIT(val)$
+                       $RESULT = {}$
+                       $IF EQ(output_size, "W")$
+                               $IF SIL_ENDIAN_BIG$
+                                       $val_bit = val_bit + 24 - ((offset & 0x03) << 3)$
+                               $ELSE$
+                                       $val_bit = val_bit + ((offset & 0x03) << 3)$
+                               $END$
+                               $offset = offset & ~0x03$
+                       $ELSE$$IF EQ(output_size, "H")$
+                               $IF SIL_ENDIAN_BIG$
+                                       $val_bit = val_bit + 8 - ((offset & 0x01) << 3)$
+                               $ELSE$
+                                       $val_bit = val_bit + ((offset & 0x01) << 3)$
+                               $END$
+                               $offset = offset & ~0x01$
+                       $END$$END$
+               $END$
+
+               #define $label$$TAB$$FORMAT("%d", +offset)$$NL$
+               #define $label$_bit$TAB$$FORMAT("%d", +val_bit)$$NL$
+               #define $label$_mask$TAB$$FORMAT("0x%x", 1 << val_bit)$$NL$
+       $END$
+$END$
+
+$ 
+$  バイト配置のチェック
+$ 
+$FUNCTION MAGIC_CHECK$
+       $size = ARGV[1]$
+       $check = ARGV[2]$
+
+       $label = FORMAT("MAGIC_%d", +size)$
+       $top = SYMBOL(label)$
+       $IF !LENGTH(top)$
+               $ERROR$$FORMAT("label %1% not found", label)$$END$
+       $ELSE$
+               $FOREACH offset RANGE(1,size)$
+                       $IF SIL_ENDIAN_BIG$
+                               $val = PEEK(top + offset - 1, 1)$
+                       $ELSE$
+                               $val = PEEK(top + size - offset, 1)$
+                       $END$
+                       $IF val != AT(check, offset - 1)$
+                               $ERROR$$FORMAT("value check of %1% failed", label)$$END$
+                       $END$
+               $END$
+       $END$
+$END$
+
+$MAGIC_CHECK(1, { 0x12 })$
+$MAGIC_CHECK(2, { 0x12, 0x34 })$
+$MAGIC_CHECK(4, { 0x12, 0x34, 0x56, 0x78 })$
+
+$ 
+$  ファイルヘッダの生成
+$ 
+$FILE "offset.h"$
+/* offset.h */$NL$
+$NL$
old mode 100755 (executable)
new mode 100644 (file)
index de9dfe4..1df1b46
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: interrupt.c 1646 2009-10-01 05:19:30Z ertl-hiro $
+ *  @(#) $Id: interrupt.c 2009 2010-12-31 12:43:54Z ertl-hiro $
  */
 
 /*
@@ -200,15 +200,22 @@ chg_ipm(PRI intpri)
 
        t_lock_cpu();
        t_set_ipm(intpri);
-       if (intpri != TIPM_ENAALL) {
-               dspflg = false;
-       }
-       else if (!disdsp) {
-               dspflg = true;
-               if (p_runtsk != p_schedtsk) {
-                       dispatch();
+       if (intpri == TIPM_ENAALL) {
+               ipmflg = true;
+               if (!disdsp) {
+                       dspflg = true;
+                       if (p_runtsk != p_schedtsk) {
+                               dispatch();
+                       }
+               }
+               if (p_runtsk->enatex && p_runtsk->texptn != 0U) {
+                       call_texrtn();
                }
        }
+       else {
+               ipmflg = false;
+               dspflg = false;
+       }
        ercd = E_OK;
        t_unlock_cpu();
 
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 8eabad2..6042b79
@@ -5,7 +5,7 @@ $       Toyohashi Open Platform for Embedded Real-Time Systems/
 $       Advanced Standard Profile Kernel
 $ 
 $   Copyright (C) 2007 by TAKAGI Nobuhisa
-$   Copyright (C) 2007-2010 by Embedded and Real-Time Systems Laboratory
+$   Copyright (C) 2007-2011 by Embedded and Real-Time Systems Laboratory
 $               Graduate School of Information Science, Nagoya Univ., JAPAN
 $  
 $   上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -37,7 +37,7 @@ $   に対する適合性も含めて,いかなる保証も行わない.ま
 $   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
 $   の責任を負わない.
 $ 
-$   $Id: kernel.tf 1845 2010-07-11 13:02:57Z ertl-hiro $
+$   $Id: kernel.tf 2024 2011-01-02 08:59:23Z ertl-hiro $
 $  
 $ =====================================================================
 
@@ -181,7 +181,7 @@ $NL$
 
 $ タスクが1個以上存在することのチェック
 $IF !LENGTH(TSK.ID_LIST)$
-       $ERROR$$FORMAT("no task is registered")$$END$
+       $ERROR$$FORMAT(_("no task is registered"))$$END$
 $END$
 
 $ タスクID番号の最大値
@@ -191,7 +191,7 @@ $NL$
 $ エラーチェック
 $FOREACH tskid TSK.ID_LIST$
 $      // tskatrが([TA_ACT])でない場合(E_RSATR)
-       $IF (TSK.TSKATR[tskid] & ~(TA_ACT|ALT(TARGET_TSKATR,0))) != 0$
+       $IF (TSK.TSKATR[tskid] & ~(TA_ACT|TARGET_TSKATR)) != 0$
                $ERROR TSK.TEXT_LINE[tskid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "tskatr", TSK.TSKATR[tskid], tskid, "CRE_TSK")$$END$
        $END$
 
@@ -209,12 +209,12 @@ $END$
 $ スタック領域の生成とそれに関するエラーチェック
 $FOREACH tskid TSK.ID_LIST$
 $      // stkszが0か,ターゲット定義の最小値(TARGET_MIN_STKSZ)よりも小さい場合(E_PAR)
-       $IF TSK.STKSZ[tskid] == 0 || (LENGTH(TARGET_MIN_STKSZ) && 
-                                                                               TSK.STKSZ[tskid] < TARGET_MIN_STKSZ)$
+       $IF TSK.STKSZ[tskid] == 0 || (TARGET_MIN_STKSZ
+                                                                       && TSK.STKSZ[tskid] < TARGET_MIN_STKSZ)$
                $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is too small"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$$END$
        $END$
 $      // stkszがスタック領域のサイズとして正しくない場合(E_PAR)
-       $IF !EQ(TSK.STK[tskid], "NULL") && LENGTH(CHECK_STKSZ_ALIGN)
+       $IF !EQ(TSK.STK[tskid], "NULL") && CHECK_STKSZ_ALIGN
                                                        && (TSK.STKSZ[tskid] & (CHECK_STKSZ_ALIGN - 1))$
                $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$$END$
        $END$
@@ -236,10 +236,10 @@ $JOINEACH tskid TSK.ID_LIST ",\n"$
 $      // タスク属性,拡張情報,起動番地,起動時優先度
        $TAB${
        $SPC$($TSK.TSKATR[tskid]$), (intptr_t)($TSK.EXINF[tskid]$),
-       $SPC$($TSK.TASK[tskid]$), INT_PRIORITY($TSK.ITSKPRI[tskid]$),
+       $SPC$((TASK)($TSK.TASK[tskid]$)), INT_PRIORITY($TSK.ITSKPRI[tskid]$),
 
 $      // タスク初期化コンテキストブロック,スタック領域
-       $IF ALT(USE_TSKINICTXB,0)$
+       $IF USE_TSKINICTXB$
                $GENERATE_TSKINICTXB(tskid)$
        $ELSE$
                $SPC$$TSK.TINIB_STKSZ[tskid]$, $TSK.TINIB_STK[tskid]$,
@@ -251,7 +251,7 @@ $END$$NL$
 };$NL$
 $NL$
 
-$ タスクコントロールブロックの生成
+$ タスク管理ブロックの生成
 TCB _kernel_tcb_table[TNUM_TSKID];$NL$
 $NL$
 
@@ -298,13 +298,12 @@ $         // セマフォ初期化ブロック
        };$NL$
        $NL$
 
-$      // セマフォコントロールブロック
+$      // セマフォ管理ブロック
        SEMCB _kernel_semcb_table[TNUM_SEMID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const SEMINIB, _kernel_seminib_table);$NL$
        TOPPERS_EMPTY_LABEL(SEMCB, _kernel_semcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  イベントフラグ
@@ -333,13 +332,12 @@ $         // イベントフラグ初期化ブロック
        };$NL$
        $NL$
 
-$      // イベントフラグコントロールブロック
+$      // イベントフラグ管理ブロック
        FLGCB _kernel_flgcb_table[TNUM_FLGID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const FLGINIB, _kernel_flginib_table);$NL$
        TOPPERS_EMPTY_LABEL(FLGCB, _kernel_flgcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  データキュー
@@ -365,9 +363,9 @@ $           // dtqmbがNULLでない場合(E_NOSPT)
                        $ERROR DTQ.TEXT_LINE[dtqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "dtqmb", DTQ.DTQMB[dtqid], dtqid, "CRE_DTQ")$$END$
                $END$
 
-$              // データキュー領域
+$              // データキュー管理領域
                $IF DTQ.DTQCNT[dtqid]$
-                       static intptr_t _kernel_dtqmb_$dtqid$[$DTQ.DTQCNT[dtqid]$];$NL$
+                       static DTQMB _kernel_dtqmb_$dtqid$[$DTQ.DTQCNT[dtqid]$];$NL$
                $END$
        $END$
 
@@ -379,13 +377,12 @@ $ // データキュー初期化ブロックの生成
        };$NL$
        $NL$
 
-$      // データキューコントロールブロック
+$      // データキュー管理ブロック
        DTQCB _kernel_dtqcb_table[TNUM_DTQID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const DTQINIB, _kernel_dtqinib_table);$NL$
        TOPPERS_EMPTY_LABEL(DTQCB, _kernel_dtqcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  優先度データキュー
@@ -416,7 +413,7 @@ $           // pdqmbがNULLでない場合(E_NOSPT)
                        $ERROR PDQ.TEXT_LINE[pdqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "pdqmb", PDQ.PDQMB[pdqid], pdqid, "CRE_PDQ")$$END$
                $END$
 
-$              // 優先度データキュー領域
+$              // 優先度データキュー管理領域
                $IF PDQ.PDQCNT[pdqid]$
                        static PDQMB _kernel_pdqmb_$pdqid$[$PDQ.PDQCNT[pdqid]$];$NL$
                $END$
@@ -430,13 +427,12 @@ $ // 優先度データキュー初期化ブロックの生成
        };$NL$
        $NL$
 
-$      // 優先度データキューコントロールブロック
+$      // 優先度データキュー管理ブロック
        PDQCB _kernel_pdqcb_table[TNUM_PDQID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const PDQINIB, _kernel_pdqinib_table);$NL$
        TOPPERS_EMPTY_LABEL(PDQCB, _kernel_pdqcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  メールボックス
@@ -475,13 +471,12 @@ $         // メールボックス初期化ブロック
        };$NL$
        $NL$
 
-$      // メールボックスコントロールブロック
+$      // メールボックス管理ブロック
        MBXCB _kernel_mbxcb_table[TNUM_MBXID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const MBXINIB, _kernel_mbxinib_table);$NL$
        TOPPERS_EMPTY_LABEL(MBXCB, _kernel_mbxcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  固定長メモリプール
@@ -534,13 +529,12 @@ $ // 固定長メモリプール初期化ブロックの生成
        };$NL$
        $NL$
 
-$      // 固定長メモリプールコントロールブロック
+$      // 固定長メモリプール管理ブロック
        MPFCB _kernel_mpfcb_table[TNUM_MPFID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const MPFINIB, _kernel_mpfinib_table);$NL$
        TOPPERS_EMPTY_LABEL(MPFCB, _kernel_mpfcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  周期ハンドラ
@@ -584,13 +578,12 @@ $         // 周期ハンドラ初期化ブロック
        };$NL$
        $NL$
 
-$      // 周期ハンドラコントロールブロック
+$      // 周期ハンドラ管理ブロック
        CYCCB _kernel_cyccb_table[TNUM_CYCID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const CYCINIB, _kernel_cycinib_table);$NL$
        TOPPERS_EMPTY_LABEL(CYCCB, _kernel_cyccb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  アラームハンドラ
@@ -619,13 +612,12 @@ $         // アラームハンドラ初期化ブロック
        };$NL$
        $NL$
 
-$      // アラームハンドラコントロールブロック
+$      // アラームハンドラ管理ブロック
        ALMCB _kernel_almcb_table[TNUM_ALMID];$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const ALMINIB, _kernel_alminib_table);$NL$
        TOPPERS_EMPTY_LABEL(ALMCB, _kernel_almcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
 
 $ 
 $  割込み管理機能
@@ -665,7 +657,7 @@ $   // intnoがCFG_INTによって設定済みの場合(E_OBJ)
        $END$
 
 $      // intatrが([TA_ENAINT]|[TA_EDGE])でない場合(E_RSATR)
-       $IF (INT.INTATR[intno] & ~(TA_ENAINT|TA_EDGE|ALT(TARGET_INTATR,0))) != 0$
+       $IF (INT.INTATR[intno] & ~(TA_ENAINT|TA_EDGE|TARGET_INTATR)) != 0$
                $ERROR INT.TEXT_LINE[intno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "intatr", INT.INTATR[intno], "intno", INT.INTNO[intno], "CFG_INT")$$END$
        $END$
 
@@ -710,7 +702,7 @@ $   // inhnoがDEF_INHによって設定済みの場合(E_OBJ)
        $END$
 
 $      // inhatrが(TA_NULL)でない場合(E_RSATR)
-       $IF (INH.INHATR[inhno] & ~ALT(TARGET_INHATR,0)) != 0$
+       $IF (INH.INHATR[inhno] & ~TARGET_INHATR) != 0$
                $ERROR INH.TEXT_LINE[inhno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "inhatr", INH.INHATR[inhno], "inhno", INH.INHNO[inhno], "DEF_INH")$$END$
        $END$
 
@@ -732,25 +724,23 @@ $ // が指定されていない場合(E_RSATR)
 
        $IF LENGTH(INTNO[INH.INHNO[inhno]])$
                $intno = INTNO[INH.INHNO[inhno]]$
-               $IF LENGTH(FIND(INTNO_CFGINT_VALID, intno))$
-$                      // inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)
-                       $IF !LENGTH(INT.INTNO[intno])$
-                               $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' corresponding to %3% `%4%\' is not configured with %5%"), "intno", INT.INTNO[intno], "inhno", INH.INHNO[inhno], "CFG_INT")$$END$
+$              // inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)
+               $IF !LENGTH(INT.INTNO[intno])$
+                       $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' corresponding to %3% `%4%\' is not configured with %5%"), "intno", INT.INTNO[intno], "inhno", INH.INHNO[inhno], "CFG_INT")$$END$
+               $ELSE$
+                       $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
+$                              // inhatrにTA_NONKERNELが指定されておらず,inhnoに対応
+$                              // するintnoに対してCFG_INTで設定された割込み優先度が
+$                              // TMIN_INTPRIよりも小さい場合(E_OBJ)
+                               $IF INT.INTPRI[intno] < TMIN_INTPRI$
+                                       $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
+                               $END$
                        $ELSE$
-                               $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
-$                                      // inhatrにTA_NONKERNELが指定されておらず,inhnoに対応
-$                                      // するintnoに対してCFG_INTで設定された割込み優先度が
-$                                      // TMIN_INTPRIよりも小さい場合(E_OBJ)
-                                       $IF INT.INTPRI[intno] < TMIN_INTPRI$
-                                               $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
-                                       $END$
-                               $ELSE$
-$                                      // inhatrにTA_NONKERNELが指定されており,inhnoに対応
-$                                      // するintnoに対してCFG_INTで設定された割込み優先度が
-$                                      // TMIN_INTPRI以上である場合(E_OBJ)
-                                       $IF INT.INTPRI[intno] >= TMIN_INTPRI$
-                                               $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is lower than or equal to %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
-                                       $END$
+$                              // inhatrにTA_NONKERNELが指定されており,inhnoに対応
+$                              // するintnoに対してCFG_INTで設定された割込み優先度が
+$                              // TMIN_INTPRI以上である場合(E_OBJ)
+                               $IF INT.INTPRI[intno] >= TMIN_INTPRI$
+                                       $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is lower than or equal to %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
                                $END$
                        $END$
                $END$
@@ -761,8 +751,8 @@ $END$
 $ 割込みサービスルーチン(ISR)に関するエラーチェックと割込みハンドラの生成
 $FOREACH order ISR.ORDER_LIST$
 $      // isratrが(TA_NULL)でない場合(E_RSATR)
-       $IF (ISR.ISRATR[order] & ~ALT(TARGET_ISRATR,0)) != 0$
-               $ERROR ISR.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "isratr", ISR.ISRATR[order], "isr", ISR.ISR[order], "ATT_ISR")$$END$
+       $IF (ISR.ISRATR[order] & ~TARGET_ISRATR) != 0$
+               $ERROR ISR.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "isratr", ISR.ISRATR[order], "ATT_ISR")$$END$
        $END$
 
 $      // intnoがATT_ISRに対する割込み番号として正しくない場合(E_PAR)
@@ -840,7 +830,7 @@ $
 $  割込み管理機能のための標準的な初期化情報の生成
 $ 
 $ 割込みハンドラの初期化に必要な情報
-$IF !ALT(OMIT_INITIALIZE_INTERRUPT,0) || ALT(USE_INHINIB_TABLE,0)$
+$IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INHINIB_TABLE,0)$
 
 $ 割込みハンドラ数
 #define TNUM_INHNO     $LENGTH(INH.ORDER_LIST)$$NL$
@@ -866,12 +856,11 @@ $IF LENGTH(INH.ORDER_LIST)$
        };$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const INHINIB, _kernel_inhinib_table);$NL$
-$END$
-$NL$
+$END$$NL$
 $END$
 
 $ 割込み要求ラインの初期化に必要な情報
-$IF !ALT(OMIT_INITIALIZE_INTERRUPT,0) || ALT(USE_INHINTB_TABLE,0)$
+$IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INHINTB_TABLE,0)$
 
 $ 割込み要求ライン数
 #define TNUM_INTNO     $LENGTH(INT.ORDER_LIST)$$NL$
@@ -887,8 +876,7 @@ $IF LENGTH(INT.ORDER_LIST)$
        };$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const INTINIB, _kernel_intinib_table);$NL$
-$END$
-$NL$
+$END$$NL$
 $END$
 
 $ 
@@ -917,14 +905,14 @@ $ // excnoがDEF_EXCによって設定済みの場合(E_OBJ)
        $END$
 
 $      // excatrが(TA_NULL)でない場合(E_RSATR)
-       $IF (EXC.EXCATR[excno] & ~ALT(TARGET_EXCATR,0)) != 0$
+       $IF (EXC.EXCATR[excno] & ~TARGET_EXCATR) != 0$
                $ERROR EXC.TEXT_LINE[excno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "excatr", EXC.EXCATR[excno], "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$
        $END$
        $i = i + 1$
 $END$
 
 $ CPU例外ハンドラのための標準的な初期化情報の生成
-$IF !ALT(OMIT_INITIALIZE_EXCEPTION,0)$
+$IF !OMIT_INITIALIZE_EXCEPTION$
 
 $ CPU例外ハンドラ数
 #define TNUM_EXCNO     $LENGTH(EXC.ORDER_LIST)$$NL$
@@ -944,8 +932,7 @@ $IF LENGTH(EXC.ORDER_LIST)$
        };$NL$
 $ELSE$
        TOPPERS_EMPTY_LABEL(const EXCINIB, _kernel_excinib_table);$NL$
-$END$
-$NL$
+$END$$NL$
 $END$
 
 $ 
@@ -978,7 +965,7 @@ $   // 静的API「DEF_ICS」が複数ある(E_OBJ)
        $END$
 
 $      // istkszがスタック領域のサイズとして正しくない場合(E_PAR)
-       $IF !EQ(ICS.ISTK[1], "NULL") && LENGTH(CHECK_STKSZ_ALIGN)
+       $IF !EQ(ICS.ISTK[1], "NULL") && CHECK_STKSZ_ALIGN
                                                        && (ICS.ISTKSZ[1] & (CHECK_STKSZ_ALIGN - 1))$
                $ERROR ICS.TEXT_LINE[1]$E_PAR: $FORMAT(_("%1% `%2%\' in %3% is not aligned"), "istksz", ICS.ISTKSZ[1], "DEF_ICS")$$END$
        $END$
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index d703e5c..ef56d81
@@ -4,7 +4,7 @@ $   TOPPERS/ASP Kernel
 $       Toyohashi Open Platform for Embedded Real-Time Systems/
 $       Advanced Standard Profile Kernel
 $ 
-$   Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
+$   Copyright (C) 2008-2011 by Embedded and Real-Time Systems Laboratory
 $               Graduate School of Information Science, Nagoya Univ., JAPAN
 $  
 $   上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -36,30 +36,30 @@ $   に対する適合性も含めて,いかなる保証も行わない.ま
 $   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
 $   の責任を負わない.
 $ 
-$   @(#) $Id: kernel_check.tf 1755 2010-02-14 02:37:36Z ertl-hiro $
+$   @(#) $Id: kernel_check.tf 2062 2011-04-10 16:27:41Z ertl-hiro $
 $  
 $ =====================================================================
 
 $ 
 $  関数の先頭番地のチェック
 $ 
-$IF LENGTH(CHECK_FUNC_ALIGN) || LENGTH(CHECK_FUNC_NONNULL)$
+$IF CHECK_FUNC_ALIGN || CHECK_FUNC_NONNULL$
 $      // タスクとタスク例外処理ルーチンの先頭番地のチェック
        $tinib = SYMBOL("_kernel_tinib_table")$
        $FOREACH tskid TSK.ID_LIST$
                $task = PEEK(tinib + offsetof_TINIB_task, sizeof_FP)$
-               $IF LENGTH(CHECK_FUNC_ALIGN) && (task & (CHECK_FUNC_ALIGN - 1))$
+               $IF CHECK_FUNC_ALIGN && (task & (CHECK_FUNC_ALIGN - 1)) != 0$
                        $ERROR TSK.TEXT_LINE[tskid]$E_PAR: 
                                $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
                                "task", TSK.TASK[tskid], tskid, "CRE_TSK")$$END$
                $END$
-               $IF LENGTH(CHECK_FUNC_NONNULL) && (task == 0)$
+               $IF CHECK_FUNC_NONNULL && task == 0$
                        $ERROR TSK.TEXT_LINE[tskid]$E_PAR: 
                                $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
                                "task", TSK.TASK[tskid], tskid, "CRE_TSK")$$END$
                $END$
                $texrtn = PEEK(tinib + offsetof_TINIB_texrtn, sizeof_FP)$
-               $IF LENGTH(CHECK_FUNC_ALIGN) && (texrtn & (CHECK_FUNC_ALIGN - 1))$
+               $IF CHECK_FUNC_ALIGN && (texrtn & (CHECK_FUNC_ALIGN - 1)) != 0$
                        $ERROR DEF_TEX.TEXT_LINE[tskid]$E_PAR: 
                                $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
                                "texrtn", TSK.TEXRTN[tskid], tskid, "DEF_TEX")$$END$
@@ -71,12 +71,12 @@ $   // 周期ハンドラの先頭番地のチェック
        $cycinib = SYMBOL("_kernel_cycinib_table")$
        $FOREACH cycid CYC.ID_LIST$
                $cychdr = PEEK(cycinib + offsetof_CYCINIB_cychdr, 4)$
-               $IF LENGTH(CHECK_FUNC_ALIGN) && (cychdr & (CHECK_FUNC_ALIGN - 1))$
+               $IF CHECK_FUNC_ALIGN && (cychdr & (CHECK_FUNC_ALIGN - 1)) != 0$
                        $ERROR CYC.TEXT_LINE[cycid]$E_PAR: 
                                $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
                                "cychdr", CYC.CYCHDR[cycid], cycid, "CRE_CYC")$$END$
                $END$
-               $IF LENGTH(CHECK_FUNC_NONNULL) && (cychdr == 0)$
+               $IF CHECK_FUNC_NONNULL && cychdr == 0$
                        $ERROR CYC.TEXT_LINE[cycid]$E_PAR: 
                                $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
                                "cychdr", CYC.CYCHDR[cycid], cycid, "CRE_CYC")$$END$
@@ -88,12 +88,12 @@ $   // アラームハンドラの先頭番地のチェック
        $alminib = SYMBOL("_kernel_alminib_table")$
        $FOREACH almid ALM.ID_LIST$
                $almhdr = PEEK(alminib + offsetof_ALMINIB_almhdr, 4)$
-               $IF LENGTH(CHECK_FUNC_ALIGN) && (almhdr & (CHECK_FUNC_ALIGN - 1))$
+               $IF CHECK_FUNC_ALIGN && (almhdr & (CHECK_FUNC_ALIGN - 1)) != 0$
                        $ERROR ALM.TEXT_LINE[almid]$E_PAR: 
                                $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
                                "almhdr", ALM.ALMHDR[almid], almid, "CRE_ALM")$$END$
                $END$
-               $IF LENGTH(CHECK_FUNC_NONNULL) && (almhdr == 0)$
+               $IF CHECK_FUNC_NONNULL && almhdr == 0$
                        $ERROR ALM.TEXT_LINE[almid]$E_PAR: 
                                $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
                                "almhdr", ALM.ALMHDR[almid], almid, "CRE_ALM")$$END$
@@ -105,34 +105,36 @@ $END$
 $ 
 $  スタック領域の先頭番地のチェック
 $ 
-$IF LENGTH(CHECK_STACK_ALIGN) || LENGTH(CHECK_STACK_NONNULL)$
+$IF CHECK_STACK_ALIGN || CHECK_STACK_NONNULL$
 $      // タスクのスタック領域の先頭番地のチェック
-       $IF !ALT(USE_TSKINICTXB,0)$
-               $tinib = SYMBOL("_kernel_tinib_table")$
-               $FOREACH tskid TSK.ID_LIST$
+       $tinib = SYMBOL("_kernel_tinib_table")$
+       $FOREACH tskid TSK.ID_LIST$
+               $IF USE_TSKINICTXB$
+                       $stk = GET_STK_TSKINICTXB(tinib)$
+               $ELSE$
                        $stk = PEEK(tinib + offsetof_TINIB_stk, sizeof_void_ptr)$
-                       $IF LENGTH(CHECK_STACK_ALIGN) && (stk & (CHECK_STACK_ALIGN - 1))$
-                               $ERROR TSK.TEXT_LINE[tskid]$E_PAR: 
-                                       $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
-                                       "stk", TSK.STK[tskid], tskid, "CRE_TSK")$$END$
-                       $END$
-                       $IF LENGTH(CHECK_STACK_NONNULL) && (stk == 0)$
-                               $ERROR TSK.TEXT_LINE[tskid]$E_PAR: 
-                                       $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
-                                       "stk", TSK.STK[tskid], tskid, "CRE_TSK")$$END$
-                       $END$
-                       $tinib = tinib + sizeof_TINIB$
                $END$
+               $IF CHECK_STACK_ALIGN && (stk & (CHECK_STACK_ALIGN - 1)) != 0$
+                       $ERROR TSK.TEXT_LINE[tskid]$E_PAR: 
+                               $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
+                               "stk", TSK.STK[tskid], tskid, "CRE_TSK")$$END$
+               $END$
+               $IF CHECK_STACK_NONNULL && stk == 0$
+                       $ERROR TSK.TEXT_LINE[tskid]$E_PAR: 
+                               $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
+                               "stk", TSK.STK[tskid], tskid, "CRE_TSK")$$END$
+               $END$
+               $tinib = tinib + sizeof_TINIB$
        $END$
 
 $      // 非タスクコンテキスト用のスタック領域の先頭番地のチェック
        $istk = PEEK(SYMBOL("_kernel_istk"), sizeof_void_ptr)$
-       $IF LENGTH(CHECK_STACK_ALIGN) && (istk & (CHECK_STACK_ALIGN - 1))$
+       $IF CHECK_STACK_ALIGN && (istk & (CHECK_STACK_ALIGN - 1)) != 0$
                $ERROR ICE.TEXT_LINE[1]$E_PAR: 
                        $FORMAT(_("%1% `%2%\' in %3% is not aligned"),
                        "istk", ICS.ISTK[1], "DEF_ICS")$$END$
        $END$
-       $IF LENGTH(CHECK_STACK_NONNULL) && (istk == 0)$
+       $IF CHECK_STACK_NONNULL && istk == 0$
                $ERROR ICE.TEXT_LINE[1]$E_PAR: 
                        $FORMAT(_("%1% `%2%\' in %3% is null"),
                        "istk", ICS.ISTK[1], "DEF_ICS")$$END$
@@ -142,17 +144,17 @@ $END$
 $ 
 $  固定長メモリプール領域の先頭番地のチェック
 $ 
-$IF LENGTH(CHECK_MPF_ALIGN) || LENGTH(CHECK_MPF_NONNULL)$
+$IF CHECK_MPF_ALIGN || CHECK_MPF_NONNULL$
 $      // 固定長メモリプール領域の先頭番地のチェック
        $mpfinib = SYMBOL("_kernel_mpfinib_table")$
        $FOREACH mpfid MPF.ID_LIST$
                $mpf = PEEK(mpfinib + offsetof_MPFINIB_mpf, sizeof_void_ptr)$
-               $IF LENGTH(CHECK_MPF_ALIGN) && (mpf & (CHECK_MPF_ALIGN - 1))$
+               $IF CHECK_MPF_ALIGN && (mpf & (CHECK_MPF_ALIGN - 1)) != 0$
                        $ERROR MPF.TEXT_LINE[mpfid]$E_PAR: 
                                $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
                                "mpf", MPF.MPF[mpfid], mpfid, "CRE_MPF")$$END$
                $END$
-               $IF LENGTH(CHECK_MPF_NONNULL) && (mpf == 0)$
+               $IF CHECK_MPF_NONNULL && mpf == 0$
                        $ERROR MPF.TEXT_LINE[mpfid]$E_PAR: 
                                $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
                                "mpf", MPF.MPF[mpfid], mpfid, "CRE_MPF")$$END$
old mode 100755 (executable)
new mode 100644 (file)
index 7acb2d7..65902a6
@@ -1,3 +1,5 @@
+SIL_ENDIAN_BIG,#defined(SIL_ENDIAN_BIG)
+SIL_ENDIAN_LITTLE,#defined(SIL_ENDIAN_LITTLE)
 TA_NULL,TA_NULL
 TA_ACT,TA_ACT
 TA_TPRI,TA_TPRI
@@ -22,6 +24,19 @@ TMIN_INTPRI,TMIN_INTPRI,signed
 OMIT_INITIALIZE_INTERRUPT,#defined(OMIT_INITIALIZE_INTERRUPT)
 OMIT_INITIALIZE_EXCEPTION,#defined(OMIT_INITIALIZE_EXCEPTION)
 USE_TSKINICTXB,#defined(USE_TSKINICTXB)
+TARGET_TSKATR,#defined(TARGET_TSKATR),,TARGET_TSKATR
+TARGET_INTATR,#defined(TARGET_INTATR),,TARGET_INTATR
+TARGET_INHATR,#defined(TARGET_INHATR),,TARGET_INHATR
+TARGET_ISRATR,#defined(TARGET_ISRATR),,TARGET_ISRATR
+TARGET_EXCATR,#defined(TARGET_EXCATR),,TARGET_EXCATR
+TARGET_MIN_STKSZ,#defined(TARGET_MIN_STKSZ),,TARGET_MIN_STKSZ
+CHECK_STKSZ_ALIGN,#defined(CHECK_STKSZ_ALIGN),,CHECK_STKSZ_ALIGN
+CHECK_FUNC_ALIGN,#defined(CHECK_FUNC_ALIGN),,CHECK_FUNC_ALIGN
+CHECK_FUNC_NONNULL,#defined(CHECK_FUNC_NONNULL)
+CHECK_STACK_ALIGN,#defined(CHECK_STACK_ALIGN),,CHECK_STACK_ALIGN
+CHECK_STACK_NONNULL,#defined(CHECK_STACK_NONNULL)
+CHECK_MPF_ALIGN,#defined(CHECK_MPF_ALIGN),,CHECK_MPF_ALIGN
+CHECK_MPF_NONNULL,#defined(CHECK_MPF_NONNULL)
 sizeof_ID,sizeof(ID)
 sizeof_uint_t,sizeof(uint_t)
 sizeof_SIZE,sizeof(SIZE)
@@ -31,6 +46,9 @@ sizeof_void_ptr,sizeof(void*)
 sizeof_VP,sizeof(void*)
 sizeof_intptr_t,sizeof(intptr_t)
 sizeof_FP,sizeof(FP)
+sizeof_INHNO,sizeof(INHNO)
+sizeof_INTNO,sizeof(INTNO)
+sizeof_EXCNO,sizeof(EXCNO)
 sizeof_TINIB,sizeof(TINIB)
 offsetof_TINIB_tskatr,"offsetof(TINIB,tskatr)"
 offsetof_TINIB_exinf,"offsetof(TINIB,exinf)"
@@ -76,6 +94,15 @@ sizeof_ALMINIB,sizeof(ALMINIB)
 offsetof_ALMINIB_almatr,"offsetof(ALMINIB,almatr)"
 offsetof_ALMINIB_exinf,"offsetof(ALMINIB,exinf)"
 offsetof_ALMINIB_almhdr,"offsetof(ALMINIB,almhdr)"
-sizeof_INHNO,sizeof(INHNO)
-sizeof_INTNO,sizeof(INTNO)
-sizeof_EXCNO,sizeof(EXCNO)
+sizeof_INHINIB,#!defined(OMIT_INITIALIZE_INTERRUPT),,sizeof(INHINIB)
+offset_INHINIB_inhno,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,inhno)"
+offset_INHINIB_inhatr,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,inhatr)"
+offset_INHINIB_int_entry,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,int_entry)"
+sizeof_INTINIB,#!defined(OMIT_INITIALIZE_INTERRUPT),,sizeof(INTINIB)
+offset_INTINIB_intno,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intno)"
+offset_INTINIB_intatr,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intatr)"
+offset_INTINIB_intpri,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intpri)"
+sizeof_EXCINIB,#!defined(OMIT_INITIALIZE_EXCEPTION),,sizeof(EXCINIB)
+offset_EXCINIB_excno,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,excno)"
+offset_EXCINIB_excatr,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,excatr)"
+offset_EXCINIB_exc_entry,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,exc_entry)"
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 8a563fd..163f336
@@ -6,6 +6,7 @@ exit_kernel
 p_runtsk
 p_schedtsk
 reqflg
+ipmflg
 disdsp
 dspflg
 ready_queue
old mode 100755 (executable)
new mode 100644 (file)
index 78f28f0..e40ff5f
@@ -15,6 +15,7 @@
 #define p_runtsk                                       _kernel_p_runtsk
 #define p_schedtsk                                     _kernel_p_schedtsk
 #define reqflg                                         _kernel_reqflg
+#define ipmflg                                         _kernel_ipmflg
 #define disdsp                                         _kernel_disdsp
 #define dspflg                                         _kernel_dspflg
 #define ready_queue                                    _kernel_ready_queue
 #define _p_runtsk                                      __kernel_p_runtsk
 #define _p_schedtsk                                    __kernel_p_schedtsk
 #define _reqflg                                                __kernel_reqflg
+#define _ipmflg                                                __kernel_ipmflg
 #define _disdsp                                                __kernel_disdsp
 #define _dspflg                                                __kernel_dspflg
 #define _ready_queue                           __kernel_ready_queue
old mode 100755 (executable)
new mode 100644 (file)
index d283737..fcbcc22
@@ -16,6 +16,7 @@
 #undef p_runtsk
 #undef p_schedtsk
 #undef reqflg
+#undef ipmflg
 #undef disdsp
 #undef dspflg
 #undef ready_queue
 #undef _p_runtsk
 #undef _p_schedtsk
 #undef _reqflg
+#undef _ipmflg
 #undef _disdsp
 #undef _dspflg
 #undef _ready_queue
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 1573964..a8fb27c
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: startup.c 1430 2009-01-14 17:37:56Z ertl-hiro $
+ *  @(#) $Id: startup.c 2067 2011-05-05 00:46:29Z ertl-hiro $
  */
 
 /*
@@ -142,7 +142,13 @@ ext_ker(void)
         *  非タスクコンテキストに切り換えて,exit_kernelを呼び出す.
         */
        call_exit_kernel();
-       assert(0);
+
+       /*
+        *  コンパイラの警告対策(ここへ来ることはないはず)
+        */
+       SIL_UNL_INT();
+       LOG_EXT_KER_LEAVE(E_SYS);
+       return(E_SYS);
 }
 
 /*
old mode 100755 (executable)
new mode 100644 (file)
index 5b52450..1d801ac
@@ -5,7 +5,7 @@
  * 
  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
  *                              Toyohashi Univ. of Technology, JAPAN
- *  Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: sys_manage.c 748 2008-03-07 17:18:06Z hiro $
+ *  @(#) $Id: sys_manage.c 2008 2010-12-31 12:41:42Z ertl-hiro $
  */
 
 /*
@@ -428,7 +428,7 @@ ena_dsp(void)
 
        t_lock_cpu();
        disdsp = false;
-       if (t_get_ipm() == TIPM_ENAALL) {
+       if (ipmflg) {
                dspflg = true;
                if (p_runtsk != p_schedtsk) {
                        dispatch();
old mode 100755 (executable)
new mode 100644 (file)
index 5f7376c..3b700f9
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  $Id: task.c 1874 2010-07-29 14:23:02Z ertl-hiro $
+ *  $Id: task.c 2011 2010-12-31 12:45:41Z ertl-hiro $
  */
 
 /*
@@ -77,6 +77,11 @@ TCB          *p_schedtsk;
 bool_t reqflg;
 
 /*
+ *  割込み優先度マスク全解除状態
+ */
+bool_t ipmflg;
+
+/*
  *  ディスパッチ禁止状態
  */
 bool_t disdsp;
@@ -107,6 +112,7 @@ initialize_task(void)
 
        p_runtsk = p_schedtsk = NULL;
        reqflg = false;
+       ipmflg = true;
        disdsp = false;
        dspflg = true;
 
@@ -423,12 +429,9 @@ void
 call_texrtn(void)
 {
        TEXPTN  texptn;
-       PRI             saved_ipm;
-       bool_t  saved_disdsp, saved_dspflg;
+       bool_t  saved_disdsp;
 
-       saved_ipm = t_get_ipm();
        saved_disdsp = disdsp;
-       saved_dspflg = dspflg;
        p_runtsk->enatex = false;
        do {
                texptn = p_runtsk->texptn;
@@ -442,19 +445,17 @@ call_texrtn(void)
                if (!t_sense_lock()) {
                        t_lock_cpu();
                }
-               t_set_ipm(saved_ipm);
+               if (!ipmflg) {
+                       t_set_ipm(TIPM_ENAALL);
+                       ipmflg = true;
+               }
                disdsp = saved_disdsp;
-               dspflg = saved_dspflg;
-               /*
-                *  ここでp_runtsk->enatexをfalseにするのは,タスク例外処理ルー
-                *  チンから,タスク例外処理許可状態のままリターンした場合の対
-                *  策である.
-                */
+               dspflg = !disdsp;
                p_runtsk->enatex = false;
                if (p_runtsk != p_schedtsk && dspflg) {
                        /*
                         *  ここでdispatchを呼び出す処理は,相互再帰呼出しになって
-                        *  いるが,dispatchを呼ぶ前にp_runtsk->enatexをflaseにして
+                        *  いるが,dispatchを呼ぶ前にp_runtsk->enatexをfalseにして
                         *  おけば支障がない.その理由については,「TOPPERS/ASP カー
                         *  ネル 設計メモ」を参照のこと.
                         */
@@ -472,7 +473,7 @@ call_texrtn(void)
 void
 calltex(void)
 {
-       if (p_runtsk->enatex && p_runtsk->texptn != 0U) {
+       if (p_runtsk->enatex && p_runtsk->texptn != 0U && ipmflg) {
                call_texrtn();
        }
 }
old mode 100755 (executable)
new mode 100644 (file)
index c743333..180bada
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  $Id: task.h 1839 2010-07-10 17:27:27Z ertl-hiro $
+ *  $Id: task.h 2008 2010-12-31 12:41:42Z ertl-hiro $
  */
 
 /*
@@ -288,6 +288,13 @@ extern TCB *p_schedtsk;
 extern bool_t  reqflg;
 
 /*
+ *  割込み優先度マスク全解除状態
+ *
+ *  割込み優先度マスク全解除状態であることを示すフラグ.
+ */
+extern bool_t  ipmflg;
+
+/*
  *  ディスパッチ禁止状態
  *
  *  ディスパッチ禁止状態であることを示すフラグ.
old mode 100755 (executable)
new mode 100644 (file)
index 1eb2a6d..90ba87b
@@ -5,7 +5,7 @@
  * 
  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
  *                              Toyohashi Univ. of Technology, JAPAN
- *  Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2005-2011 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: task_except.c 748 2008-03-07 17:18:06Z hiro $
+ *  $Id: task_except.c 2023 2011-01-02 08:59:06Z ertl-hiro $
  */
 
 /*
@@ -122,7 +122,7 @@ ras_tex(ID tskid, TEXPTN rasptn)
        }
        else {
                p_tcb->texptn |= rasptn;
-               if (p_tcb == p_runtsk && p_runtsk->enatex) {
+               if (p_tcb == p_runtsk && p_runtsk->enatex && ipmflg) {
                        call_texrtn();
                }
                ercd = E_OK;
@@ -159,7 +159,7 @@ iras_tex(ID tskid, TEXPTN rasptn)
        }
        else {
                p_tcb->texptn |= rasptn;
-               if (p_tcb == p_runtsk && p_runtsk->enatex) {
+               if (p_tcb == p_runtsk && p_runtsk->enatex && ipmflg) {
                        reqflg = true;
                }
                ercd = E_OK;
@@ -222,7 +222,7 @@ ena_tex(void)
        }
        else {
                p_runtsk->enatex = true;
-               if (p_runtsk->texptn != 0U) {
+               if (p_runtsk->texptn != 0U && ipmflg) {
                        call_texrtn();
                }
                ercd = E_OK;
old mode 100755 (executable)
new mode 100644 (file)
index 4428e29..e6060ba
@@ -5,7 +5,7 @@
  * 
  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
  *                              Toyohashi Univ. of Technology, JAPAN
- *  Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: task_manage.c 1595 2009-06-26 01:59:29Z ertl-hiro $
+ *  @(#) $Id: task_manage.c 2008 2010-12-31 12:41:42Z ertl-hiro $
  */
 
 /*
@@ -252,13 +252,14 @@ ext_tsk(void)
                 */
                disdsp = false;
        }
-       if (t_get_ipm() != TIPM_ENAALL) {
+       if (!ipmflg) {
                /*
                 *  割込み優先度マスク(IPM)がTIPM_ENAALL以外の状態でext_tsk
                 *  が呼ばれた場合は,IPMをTIPM_ENAALLにしてからタスクを終了す
                 *  る.
                 */
                t_set_ipm(TIPM_ENAALL);
+               ipmflg = true;
        }
        dspflg = true;
 
@@ -269,7 +270,7 @@ ext_tsk(void)
                (void) make_active(p_runtsk);
        }
        exit_and_dispatch();
-       return(E_SYS);
+       ercd = E_SYS;
 
   error_exit:
        LOG_EXT_TSK_LEAVE(ercd);
@@ -331,7 +332,7 @@ ter_tsk(ID tskid)
 #endif /* TOPPERS_ter_tsk */
 
 /*
- *  タスク優先度の変更
+ *  タスクのベース優先度の変更
  */
 #ifdef TOPPERS_chg_pri
 
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 1e7a3b6..1a35c97 100644 (file)
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  * 
- *  Copyright (C) 2005-2009 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2005-2011 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -34,7 +34,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: test_lib.c 1573 2009-05-31 13:47:28Z ertl-hiro $
+ *  @(#) $Id: test_lib.c 2067 2011-05-05 00:46:29Z ertl-hiro $
  */
 
 /* 
@@ -104,6 +104,9 @@ test_finish(void)
        SIL_LOC_INT();
        syslog_flush();
        ext_ker();
+
+       /* ここへ来ることはないはず */
+       SIL_UNL_INT();
 }
 
 /*
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 9cb09cb..ce31a20
@@ -5,7 +5,7 @@
 # 
 #  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
 #                              Toyohashi Univ. of Technology, JAPAN
-#  Copyright (C) 2006-2010 by Embedded and Real-Time Systems Laboratory
+#  Copyright (C) 2006-2011 by Embedded and Real-Time Systems Laboratory
 #              Graduate School of Information Science, Nagoya Univ., JAPAN
 # 
 #  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -37,7 +37,7 @@
 #  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
 #  の責任を負わない.
 # 
-#  @(#) $Id: Makefile 1786 2010-05-16 20:27:00Z ertl-hiro $
+#  @(#) $Id: Makefile 2048 2011-04-03 02:36:03Z ertl-hiro $
 # 
 
 #
@@ -197,10 +197,11 @@ KERNEL_COBJS := $(KERNEL_COBJS)
 KERNEL_CFLAGS := $(KERNEL_CFLAGS) -I$(SRCDIR)/kernel
 ifdef OMIT_MAKEOFFSET
   OFFSET_H =
-  KERNEL_AUX_COBJS =
 else
   OFFSET_H = offset.h
-  KERNEL_AUX_COBJS = makeoffset.o
+ifndef OFFSET_TF
+  KERNEL_AUX_COBJS := $(KERNEL_AUX_COBJS) makeoffset.o
+endif
 endif
 
 #
@@ -246,6 +247,7 @@ endif
 #
 vpath %.c $(KERNEL_DIR) $(SYSSVC_DIR) $(APPL_DIR)
 vpath %.S $(KERNEL_DIR) $(SYSSVC_DIR) $(APPL_DIR)
+vpath %.cfg $(APPL_DIR)
 
 #
 #  コンパイルのための変数の定義
@@ -268,25 +270,32 @@ ifdef LDSCRIPT
 endif
 
 #
-#  offset.h の生成規則(構造体内のオフセット値の算出)
+#  オフセットファイル(offset.h)の生成規則
 #
+ifdef OFFSET_TF
+offset.h: kernel_cfg.timestamp
+       $(CFG) --pass 3 --kernel asp $(INCLUDES) \
+                               --rom-image cfg1_out.srec --symbol-table cfg1_out.syms \
+                               -T $(OFFSET_TF) $(CFG_TABS) $(APPL_CFG)
+else
 offset.h: makeoffset.s $(SRCDIR)/utils/genoffset
        $(PERL) $(SRCDIR)/utils/genoffset makeoffset.s > offset.h
+endif
 
 #
 #  カーネルのコンフィギュレーションファイルの生成
 #
-cfg1_out.c:
-       $(CFG) --pass 1 --kernel asp $(INCLUDES) $(CFG_TABS) $(APPL_CFG)
+cfg1_out.c: $(APPL_CFG)
+       $(CFG) --pass 1 --kernel asp $(INCLUDES) $(CFG_TABS) $<
 
 kernel_cfg.timestamp: $(START_OBJS) cfg1_out.o $(END_OBJS) $(HIDDEN_OBJS)
-kernel_cfg.timestamp $(CFG2_OUT):
+kernel_cfg.timestamp $(CFG2_OUT): $(APPL_CFG)
        $(LINK) $(CFLAGS) $(LDFLAGS) $(CFG1_OUT_LDFLAGS) -o $(CFG1_OUT) \
                                                $(START_OBJS) cfg1_out.o $(END_OBJS)
        $(NM) -C $(CFG1_OUT) > cfg1_out.syms
        $(OBJCOPY) -O srec -S $(CFG1_OUT) cfg1_out.srec
        $(CFG) --pass 2 --kernel asp $(INCLUDES) \
-                               -T $(TARGETDIR)/target.tf $(CFG_TABS) $(APPL_CFG)
+                               -T $(TARGETDIR)/target.tf $(CFG_TABS) $<
        touch kernel_cfg.timestamp
 
 #
@@ -306,14 +315,15 @@ banner.o: kernel_cfg.timestamp $(filter-out banner.o,$(ALL_OBJS)) \
 #
 #  全体のリンク
 #
-$(OBJFILE): kernel_cfg.timestamp $(ALL_OBJS) $(filter %.a,$(ALL_LIBS))
+$(OBJFILE): $(APPL_CFG) kernel_cfg.timestamp $(ALL_OBJS) \
+                                                                                       $(filter %.a,$(ALL_LIBS))
        $(LINK) $(CFLAGS) $(LDFLAGS) -o $(OBJFILE) $(START_OBJS) \
                        $(APPL_OBJS) $(SYSSVC_OBJS) $(CFG_OBJS) $(ALL_LIBS) $(END_OBJS)
        $(NM) -C $(OBJFILE) > $(OBJNAME).syms
        $(OBJCOPY) -O srec -S $(OBJFILE) $(OBJNAME).srec
        $(CFG) --pass 3 --kernel asp $(INCLUDES) \
                                --rom-image $(OBJNAME).srec --symbol-table $(OBJNAME).syms \
-                               -T $(TARGETDIR)/target_check.tf $(CFG_TABS) $(APPL_CFG)
+                               -T $(TARGETDIR)/target_check.tf $(CFG_TABS) $<
 
 #
 #  バイナリファイルの生成
@@ -380,8 +390,8 @@ kernel_cfg.d cfg1_out.d: %.d: %.c
 #
 #  特殊な依存関係作成ルールの定義
 #
-cfg1_out.depend:
-       @$(CFG) -M cfg1_out.c $(INCLUDES) $(APPL_CFG) >> Makefile.depend
+cfg1_out.depend: $(APPL_CFG)
+       @$(CFG) -M cfg1_out.c $(INCLUDES) $< >> Makefile.depend
 
 makeoffset.d: makeoffset.c
        @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) $(MAKEDEP_OPTS) \
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 7a05601..b40811d
@@ -5,7 +5,7 @@
  * 
  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
  *                              Toyohashi Univ. of Technology, JAPAN
- *  Copyright (C) 2004-2010 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2004-2011 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: banner.c 1691 2010-01-01 15:55:49Z ertl-hiro $
+ *  @(#) $Id: banner.c 2042 2011-03-06 11:26:14Z ertl-hiro $
  */
 
 /*
@@ -57,7 +57,7 @@ static const char banner[] = "\n"
 " (" __DATE__ ", " __TIME__ ")\n"
 "Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory\n"
 "                            Toyohashi Univ. of Technology, JAPAN\n"
-"Copyright (C) 2004-2010 by Embedded and Real-Time Systems Laboratory\n"
+"Copyright (C) 2004-2011 by Embedded and Real-Time Systems Laboratory\n"
 "            Graduate School of Information Science, Nagoya Univ., JAPAN\n"
 TARGET_COPYRIGHT;
 
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index f5f5b5e..76b8e33
@@ -65,7 +65,7 @@ extern "C" {
 #endif /* LOGTASK_STACK_SIZE */
 
 #ifndef LOGTASK_PORTID
-#define LOGTASK_PORTID         SIO_PORTID      /* システムログ用のシリアルポート番号 */
+#define LOGTASK_PORTID         1               /* システムログ用のシリアルポート番号 */
 #endif /* LOGTASK_PORTID */
 
 #ifndef LOGTASK_INTERVAL
old mode 100755 (executable)
new mode 100644 (file)
index ef08c77..94ee22e
@@ -5,7 +5,7 @@
  * 
  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
  *                              Toyohashi Univ. of Technology, JAPAN
- *  Copyright (C) 2006-2008 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2006-2011 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: serial.c 1176 2008-07-01 10:24:46Z ertl-hiro $
+ *  @(#) $Id: serial.c 2055 2011-04-10 11:36:13Z ertl-hiro $
  */
 
 /*
old mode 100755 (executable)
new mode 100644 (file)
index 4332236..1c8290a
@@ -1,5 +1,5 @@
 /*
- *  @(#) $Id: serial.cfg 823 2008-03-18 13:02:11Z hiro $
+ *  @(#) $Id: serial.cfg 2060 2011-04-10 15:36:38Z ertl-hiro $
  */
 
 /*
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
diff --git a/asp/target/cq_starm_gcc/E_PACKAGE b/asp/target/cq_starm_gcc/E_PACKAGE
deleted file mode 100755 (executable)
index 7e12d55..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-E_PACKAGE asp_cq_starm_gcc
-VERSION %date
-
-INCLUDE ../../MANIFEST
-INCLUDE ../../arch/arm_m_gcc/MANIFEST
diff --git a/asp/target/cq_starm_gcc/MANIFEST b/asp/target/cq_starm_gcc/MANIFEST
deleted file mode 100755 (executable)
index a1db161..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-PACKAGE asp_arch_arm_m_gcc
-
-E_PACKAGE
-MANIFEST
-Makefile.target
-cq_starm.h
-cq_starm.ld
-target.tf
-target_cfg1_out.h
-target_check.tf
-target_config.c
-target_config.h
-target_def.csv
-target_kernel.h
-target_rename.def
-target_rename.h
-target_serial.c
-target_serial.cfg
-target_serial.h
-target_sil.h
-target_stddef.h
-target_support.S
-target_syssvc.h
-target_test.h
-target_timer.cfg
-target_timer.h
-target_unrename.h
-target_user.txt
diff --git a/asp/target/cq_starm_gcc/Makefile.target b/asp/target/cq_starm_gcc/Makefile.target
deleted file mode 100755 (executable)
index cc7586d..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-#
-#              Makefile のターゲット依存部(CQ-STARM用)
-#
-
-#
-#  ボード名,プロセッサ名,開発環境名の定義
-#
-BOARD = cq_starm
-PRC   = arm_m
-TOOL  = gcc
-
-#
-#  GNU開発環境のターゲットアーキテクチャの定義
-#
-GCC_TARGET = arm-none-eabi
-
-#
-#  各セグメントの開始アドレスの定義
-#
-TEXT_START_ADDRESS = 0x08000000
-DATA_START_ADDRESS = 0x20000000
-
-#
-#  非タスクコンテキスト用のスタックの初期値(底)
-#
-DEFAULT_STK_TOP = 0x20005000
-
-#
-#  コンパイルオプション
-#
-INCLUDES := $(INCLUDES) -I$(TARGETDIR)
-CDEFS := $(CDEFS)
-COPTS := $(COPTS) -mcpu=cortex-m3
-
-#
-#  カーネルに関する定義
-#
-KERNEL_DIR := $(KERNEL_DIR) $(TARGETDIR)
-KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) target_support.o 
-KERNEL_COBJS := $(KERNEL_COBJS) target_config.o prc_timer.o
-KERNEL_CFLAGS := $(KERNEL_CFLAGS) -fno-strict-aliasing -mcpu=cortex-m3
-
-#
-#  システムサービスに関する定義
-#
-SYSSVC_DIR := $(SYSSVC_DIR)
-SYSSVC_COBJS := $(SYSSVC_COBJS) target_serial.o
-
-#
-#  コンフィギュレータ関係の変数の定義
-#
-CFG_TABS := $(CFG_TABS) --cfg1-def-table $(TARGETDIR)/target_def.csv
-
-#
-#  トレースログに関する設定
-#
-ifeq ($(ENABLE_TRACE),true)
-       COPTS := $(COPTS) -DTOPPERS_ENABLE_TRACE
-       KERNEL_DIR := $(KERNEL_DIR) $(SRCDIR)/arch/logtrace
-       KERNEL_COBJS := $(KERNEL_COBJS) trace_config.o trace_dump.o
-endif
-
-#
-#  ROM化時は ROM_BOOTをtrueに定義する
-#
-ifeq ($(ROM_BOOT),true)
-       CDEFS := $(CDEFS) -DROM_BOOT
-endif
-
-#
-#  リンカスクリプトの定義
-#                                                                                                                              
-LDSCRIPT = $(SRCDIR)/target/$(BOARD)_$(TOOL)/cq_starm.ld
-
-#
-#  スタートアップモジュールに関する定義
-#
-#  cq_starm.ldに「STARTUP(start.o)」を記述したため,スタートアップモジュー
-#  ルの名前をHIDDEN_OBJSに定義する.また,LDFLAGSに-nostdlibを追加している.
-#
-HIDDEN_OBJS = start.o
-
-$(HIDDEN_OBJS): %.o: %.S
-       $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $<
-
-$(HIDDEN_OBJS:.o=.d): %.d: %.S
-       @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \
-               -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend
-
-LDFLAGS := -nostdlib $(LDFLAGS)
-
-#
-#  依存関係の定義
-#
-cfg1_out.c: $(TARGETDIR)/target_def.csv
-kernel_cfg.timestamp: $(TARGETDIR)/target.tf
-$(OBJFILE): $(TARGETDIR)/target_check.tf
-
-#
-#  プロセッサ依存部のインクルード
-#
-include $(SRCDIR)/arch/$(PRC)_$(TOOL)/Makefile.prc
diff --git a/asp/target/cq_starm_gcc/cq_starm.h b/asp/target/cq_starm_gcc/cq_starm.h
deleted file mode 100755 (executable)
index d75a45f..0000000
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- *  TOPPERS/JSP Kernel
- *      Toyohashi Open Platform for Embedded Real-Time Systems/
- *      Just Standard Profile Kernel
- *
- *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
- *                              Toyohashi Univ. of Technology, JAPAN
- *  Copyright (C) 2005-2007 by Embedded and Real-Time Systems Laboratory
- *              Graduate School of Information Science, Nagoya Univ., JAPAN
- * 
- *  上記著作権者は,Free Software Foundation によって公表されている 
- *  GNU General Public License の Version 2 に記述されている条件か,以
- *  下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェア(本ソフトウェ
- *  アを改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
- *  利用と呼ぶ)することを無償で許諾する.
- *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
- *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
- *      スコード中に含まれていること.
- *  (2) 本ソフトウェアを再利用可能なバイナリコード(リロケータブルオブ
- *      ジェクトファイルやライブラリなど)の形で利用する場合には,利用
- *      に伴うドキュメント(利用者マニュアルなど)に,上記の著作権表示,
- *      この利用条件および下記の無保証規定を掲載すること.
- *  (3) 本ソフトウェアを再利用不可能なバイナリコードの形または機器に組
- *      み込んだ形で利用する場合には,次のいずれかの条件を満たすこと.
- *    (a) 利用に伴うドキュメント(利用者マニュアルなど)に,上記の著作
- *        権表示,この利用条件および下記の無保証規定を掲載すること.
- *    (b) 利用の形態を,別に定める方法によって,上記著作権者に報告する
- *        こと.
- *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
- *      害からも,上記著作権者を免責すること.
- * 
- *  本ソフトウェアは,無保証で提供されているものである.上記著作権者は,
- *  本ソフトウェアに関して,その適用可能性も含めて,いかなる保証も行わ
- *  ない.また,本ソフトウェアの利用により直接的または間接的に生じたい
- *  かなる損害に関しても,その責任を負わない.
- * 
- */
-#ifndef TOPPERS_CQ_STARM_H
-#define TOPPERS_CQ_STARM_H
-
-#include <sil.h>
-
-/*
- * CORTEX-M3 CPUの依存部のインクルード
- */
-#include "arm_m_gcc/arm_m.h"
-
-/*
- *  システムクロックの定義(発振子周波数8MHz)
- */
-#define HSE_CLOCK              (8000000)
-#define SYS_CLOCK              (HSE_CLOCK * 9)
-#define PCLK1_CLOCK            ((HSE_CLOCK * 9) >> 1)
-#define PCLK2_CLOCK            (HSE_CLOCK * 9)
-
-/*
- *  割込み番号の最大値
- */
-#define TMAX_INTNO   (16 + 42)
-
-/*
- *  割込み優先度のビット幅
- */
-#define TBITW_IPRI     4
-
-/*
- *  割込み優先度ビット幅中のサブ優先度のビット幅
- */
-#define TBITW_SUBIPRI  0
-
-/*
- *  割込みベクタ番号定義
- */
-#define IRQ_VECTOR_USART1              (16 + 37)
-#define IRQ_VECTOR_USART2              (16 + 38)
-
-
-/* STM32F10Xのペリフェラルレジスタ定義 */
-#define PERIPH_REG_BASE                        (0x40000000UL)
-#define SRAM_BASE                              (0x20000000UL)
-
-#define APB1_PERIPH                            (PERIPH_REG_BASE)
-#define APB2_PERIPH                            (PERIPH_REG_BASE + 0x10000)
-#define AHB_PERIPH                             (PERIPH_REG_BASE + 0x20000)
-
-/* BUS:APB1 */
-#define TIM2_BASE                              (APB1_PERIPH)
-#define TIM3_BASE                              (APB1_PERIPH + 0x400)
-#define TIM4_BASE                              (APB1_PERIPH + 0x800)
-#define RTC_BASE                               (APB1_PERIPH + 0x2800)
-#define WWDG_BASE                              (APB1_PERIPH + 0x2C00)
-#define IWDG_BASE                              (APB1_PERIPH + 0x3000)
-#define SPI2_BASE                              (APB1_PERIPH + 0x3800)
-#define USART2_BASE                            (APB1_PERIPH + 0x4400)
-#define USART3_BASE                            (APB1_PERIPH + 0x4800)
-#define I2C1_BASE                              (APB1_PERIPH + 0x5400)
-#define I2C2_BASE                              (APB1_PERIPH + 0x5800)
-#define USB_BASE                               (APB1_PERIPH + 0x5C00)
-#define CAN_BASE                               (APB1_PERIPH + 0x6400)
-#define BKP_BASE                               (APB1_PERIPH + 0x6C00)
-#define PWR_BASE                               (APB1_PERIPH + 0x7000)
-
-/* BUS:APB2 */
-#define AFIO_BASE                              (APB2_PERIPH)
-#define EXTI_BASE                              (APB2_PERIPH + 0x400)
-#define GPIOA_BASE                             (APB2_PERIPH + 0x800)
-#define GPIOB_BASE                             (APB2_PERIPH + 0xC00)
-#define GPIOC_BASE                             (APB2_PERIPH + 0x1000)
-#define GPIOD_BASE                             (APB2_PERIPH + 0x1400)
-#define GPIOE_BASE                             (APB2_PERIPH + 0x1800)
-#define ADC1_BASE                              (APB2_PERIPH + 0x2400)
-#define ADC2_BASE                              (APB2_PERIPH + 0x2800)
-#define TIM1_BASE                              (APB2_PERIPH + 0x2C00)
-#define SPI1_BASE                              (APB2_PERIPH + 0x3000)
-#define USART1_BASE                            (APB2_PERIPH + 0x3800)
-
-/* BUS:AHB */
-#define DMA_BASE                               (AHB_PERIPH)
-#define RCC_BASE                               (AHB_PERIPH + 0x1000)
-#define FLASH_BASE                             (AHB_PERIPH + 0x2000)
-
-/* System Control space */
-#define SCS_BASE                               (0xE000E000)
-#define SYSTM_BASE                             (SCS_BASE + 0x0010)
-#define NVIC_BASE                              (SCS_BASE + 0x0100)
-#define SYSCB_BASE                             (SCS_BASE + 0x0D00)
-
-/* RCC */
-#define RCC_CR                                 (RCC_BASE)
-#define RCC_CFGR                               (RCC_BASE + 0x04)
-#define RCC_CIR                                        (RCC_BASE + 0x08)
-#define RCC_APB2RSTR                   (RCC_BASE + 0x0C)
-#define RCC_APB1RSTR                   (RCC_BASE + 0x10)
-#define RCC_AHBENR                             (RCC_BASE + 0x14)
-#define RCC_APB2ENR                            (RCC_BASE + 0x18)
-#define RCC_APB1ENR                            (RCC_BASE + 0x1C)
-#define RCC_BDCR                               (RCC_BASE + 0x20)
-#define RCC_CSR                                        (RCC_BASE + 0x24)
-
-
-/* NVIC */
-#define NVIC_ENAVLE_REG(ch)            (NVIC_BASE + ((ch) >> 5))
-#define NVIC_DISABLE_REG(ch)   (NVIC_BASE + 0x80 + ((ch) >> 5))
-#define NVIC_SET_PEND_REG(ch)  (NVIC_BASE + 0x100 + ((ch) >> 5))
-#define NVIC_CLEAR_PEND_REG(ch)        (NVIC_BASE + 0x180 + ((ch) >> 5))
-#define NVIC_ACTIVE_REG(ch)            (NVIC_BASE + 0x200 + ((ch) >> 5))
-#define NVIC_PRIO_REG(ch)              (NVIC_BASE + 0x300 + ((ch) >> 2))
-
-/* GPIOx */
-#define GPIO_CRL(x)                            (x)
-#define GPIO_CRH(x)                            ((x) + 0x04)
-#define GPIO_IDR(x)                            ((x) + 0x08)
-#define GPIO_ODR(x)                            ((x) + 0x0C)
-#define GPIO_BSRR(x)                   ((x) + 0x10)
-#define GPIO_BRR(x)                            ((x) + 0x14)
-#define GPIO_LCKR(x)                   ((x) + 0x18)
-
-/* AFIO */
-#define AFIO_EVCR                              (AFIO_BASE)
-#define AFIO_MAPR                              (AFIO_BASE + 0x04)
-#define AFIO_EXTICR1                   (AFIO_BASE + 0x08)
-#define AFIO_EXTICR2                   (AFIO_BASE + 0x0C)
-#define AFIO_EXTICR3                   (AFIO_BASE + 0x10)
-#define AFIO_EXTICR4                   (AFIO_BASE + 0x14)
-
-/* FLASH */
-#define FLASH_ACR                              (FLASH_BASE)
-
-/* RCCレジスタ定義 */
-#define CR_PLL_RDY                             (0x02000000)
-#define CR_PLL_ON                              (0x01000000)
-#define CR_HSE_RDY                             (0x00020000)
-#define CR_HSE_ON                              (0x00010000)
-#define CR_HSI_RDY                             (0x00000002)
-#define CR_HSI_ON                              (0x00000001)
-#define CFGR_PLLMUL_MASK               (0x003C0000)
-#define CFGR_PLL_XTPRE                 (0x00020000)
-#define CFGR_PLL_SRC                   (0x00010000)
-#define CFGR_HPRE_MASK                 (0x000000F0)
-#define CFGR_PPRE2_MASK                        (0x00003800)
-#define CFGR_PPRE1_MASK                        (0x00000700)
-#define CFGR_SWS_MASK                  (0x0000000C)
-#define CFGR_SW_MASK                   (0x00000003)
-#define CFGR_SW_PLL                            (0x02)
-#define APB1ENR_USART2_EN              (0x00020000)
-#define APB2ENR_ADC3_EN                        (0x8000)
-#define APB2ENR_USART1_EN              (0x4000)
-#define APB2ENR_TIM8_EN                        (0x2000)
-#define APB2ENR_SPI1_EN                        (0x1000)
-#define APB2ENR_TIM1_EN                        (0x0800)
-#define APB2ENR_ADC2_EN                        (0x0400)
-#define APB2ENR_ADC1_EN                        (0x0200)
-#define APB2ENR_IOPG_EN                        (0x0100)
-#define APB2ENR_IOPF_EN                        (0x0080)
-#define APB2ENR_IOPE_EN                        (0x0040)
-#define APB2ENR_IOPD_EN                        (0x0020)
-#define APB2ENR_IOPC_EN                        (0x0010)
-#define APB2ENR_IOPB_EN                        (0x0008)
-#define APB2ENR_IOPA_EN                        (0x0004)
-#define APB2ENR_AFIO_EN                        (0x0001)
-#define AHBENR_SDIO_EN                 (0x0400)
-#define AHBENR_FSMC_EN                 (0x0100)
-#define AHBENR_CRCE_EN                 (0x0040)
-#define AHBENR_FLITF_EN                        (0x0010)
-#define AHBENR_SRAM_EN                 (0x0004)
-#define AHBENR_DMA_EN                  (0x0001)
-
-/* FLASHレジスタ定義 */
-#define ACR_LATENCY_MASK               (0x07)
-#define ACR_LATENCY_ZERO               (0x00)
-#define ACR_LATENCY_ONE                        (0x01)
-#define ACR_LATENCY_TWO                        (0x02)
-
-/* GPIOxレジスタ定義 */
-#define CNF_IN_ANALOG                  (0x00)
-#define CNF_IN_FLOATING                        (0x01)
-#define CNF_IN_PULL                            (0x02)
-#define CNF_OUT_GP_PP                  (0x00)
-#define CNF_OUT_GP_OD                  (0x01)
-#define CNF_OUT_AF_PP                  (0x02)
-#define CNF_OUT_AF_OD                  (0x03)
-#define MODE_INPUT                             (0x00)
-#define MODE_OUTPUT_10MHZ              (0x01)
-#define MODE_OUTPUT_2MHZ               (0x02)
-#define MODE_OUTPUT_50MHZ              (0x03)
-
-#define CR_MODE_MASK(x)                        (0x03 << ((x) << 2))
-#define CR_CNF_MASK(x)                 (0x0C << ((x) << 2))
-#define CR_MODE(x,v)                   (((v) & 0x03) << ((x) << 2))
-#define CR_CNF(x,v)                            ((((v) << 2) & 0x0C) << ((x) << 2))
-
-/* AFIOレジスタ定義 */
-#define MAPR_USART2_REMAP              (0x0008)
-
-#ifndef TOPPERS_MACRO_ONLY
-
-#endif /* TOPPERS_MACRO_ONLY */
-#endif /* TOPPERS_CQ_STARM_H */
diff --git a/asp/target/cq_starm_gcc/cq_starm.ld b/asp/target/cq_starm_gcc/cq_starm.ld
deleted file mode 100755 (executable)
index af2077d..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-MEMORY
-{
-    FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K
-    SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 20K
-}
-
-PROVIDE(hardware_init_hook = 0);
-PROVIDE(software_init_hook = 0);
-PROVIDE(software_term_hook = 0);
-STARTUP(start.o)
-
-SECTIONS
-{
-    .text :
-    {
-        __text = .;
-               *(.vector)
-        *(.text)
-        *(.text.*)
-    } > FLASH
-       _etext = .;
-       PROVIDE(etext = .);
-
-       .rodata :
-       {
-        *(.rodata)
-        *(.rodata.*)
-    } > FLASH
-
-       .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) }
-       __exidx_start = .;
-       .ARM.exidx   : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) }
-       __exidx_end = .;
-
-       __idata_start = .;
-    .data : AT (__idata_start)
-    {
-               __data_start = .;
-        *(vtable)
-        *(.data)
-        *(.data.*)
-    } > SRAM
-       __idata_end = __idata_start + SIZEOF(.data);
-       _edata = .;
-       PROVIDE(edata = .);
-
-       . = ALIGN(4);
-
-    .bss :
-    {
-        __bss_start  = .;
-        *(.bss)
-        *(COMMON)
-        . = ALIGN(4);
-    } > SRAM
-       . = ALIGN(4);
-       _end = .;
-       __bss_end = .;
-       PROVIDE(end = .);
-}
diff --git a/asp/target/cq_starm_gcc/target.tf b/asp/target/cq_starm_gcc/target.tf
deleted file mode 100755 (executable)
index 64154f5..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-$ 
-$     パス2のターゲット依存テンプレート(CQ-STARM用)
-$ 
-
-$ 
-$  プロセッサ依存のテンプレートファイルのインクルード
-$ 
-$INCLUDE"arm_m_gcc/prc.tf"$
diff --git a/asp/target/cq_starm_gcc/target_cfg1_out.h b/asp/target/cq_starm_gcc/target_cfg1_out.h
deleted file mode 100755 (executable)
index 0ccf0a1..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/*
- *             cfg1_out.cをリンクするために必要なスタブの定義
- */
-
-/*
- *  コア依存のスタブの定義 
- */
-#include "arm_m_gcc/prc_cfg1_out.h"
diff --git a/asp/target/cq_starm_gcc/target_check.tf b/asp/target/cq_starm_gcc/target_check.tf
deleted file mode 100755 (executable)
index 8c1bef7..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-$ 
-$     パス3のターゲット依存テンプレート(CQ-STARM用)
-$ 
-
-$ 
-$  パス3のプロセッサ依存のテンプレートのインクルード
-$ 
-$INCLUDE"arm_m_gcc/prc_check.tf"$
diff --git a/asp/target/cq_starm_gcc/target_config.c b/asp/target/cq_starm_gcc/target_config.c
deleted file mode 100755 (executable)
index 1d64760..0000000
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- *  TOPPERS/ASP Kernel
- *      Toyohashi Open Platform for Embedded Real-Time Systems/
- *      Advanced Standard Profile Kernel
- * 
- *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
- *                              Toyohashi Univ. of Technology, JAPAN
- *  Copyright (C) 2005-2007 by Embedded and Real-Time Systems Laboratory
- *              Graduate School of Information Science, Nagoya Univ., JAPAN
- * 
- *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
- *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
- *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
- *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
- *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
- *      スコード中に含まれていること.
- *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
- *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
- *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
- *      の無保証規定を掲載すること.
- *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
- *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
- *      と.
- *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
- *        作権表示,この利用条件および下記の無保証規定を掲載すること.
- *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
- *        報告すること.
- *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
- *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
- *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
- *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
- *      免責すること.
- * 
- *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
- *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
- *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
- *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
- *  の責任を負わない.
- * 
- */
-
-/*
- * ターゲット依存モジュール(CQ-STARM用)
- */
-#include "kernel_impl.h"
-#include <sil.h>
-#include "cq_starm.h"
-#include "target_serial.h"
-#include "target_syssvc.h"
-
-
-/*
- * GPIOレジスタ操作関数
- */
-Inline void set_cr_mode(uint32_t reg, uint_t p, int_t v)
-{
-       if (p < 8) {
-               sil_andw((void*)GPIO_CRL(reg), ~CR_MODE_MASK(p));
-               sil_orw((void*)GPIO_CRL(reg), CR_MODE(p, v));
-       } else if (8 <= p && p < 16) {
-               sil_andw((void*)GPIO_CRH(reg), ~CR_MODE_MASK(p - 8));
-               sil_orw((void*)GPIO_CRH(reg), CR_MODE(p - 8, v));
-       }
-}
-
-Inline void set_cr_cnf(uint32_t reg, uint_t p, int_t v)
-{
-       if (p < 8) {
-               sil_andw((void*)GPIO_CRL(reg), ~CR_CNF_MASK(p));
-               sil_orw((void*)GPIO_CRL(reg), CR_CNF(p, v));
-       } else if (8 <= p && p < 16) {
-               sil_andw((void*)GPIO_CRH(reg), ~CR_CNF_MASK(p - 8));
-               sil_orw((void*)GPIO_CRH(reg), CR_CNF(p - 8, v));
-       }
-}
-
-Inline void set_port_pull(uint32_t reg, uint_t p, bool_t up)
-{
-       if (up) {
-               sil_wrw_mem((void*)GPIO_BSRR(reg), 0x01 << p);
-       } else {
-               sil_wrw_mem((void*)GPIO_BRR(reg), 0x01 << p);
-       }
-}
-
-/*
- * ターゲット依存部 初期化処理
- */
-void target_initialize(void)
-{
-       /*
-        *  プロセッサクロック(RCC)の初期化
-        */
-       /* HSEの有効化 */
-       sil_orw((void*)RCC_CR, CR_HSE_ON);
-
-       /* HSE有効待ち */
-       while ((sil_rew_mem((void*)RCC_CR) & CR_HSE_RDY) == 0) ;
-
-       /* FLASH ROMは2wait待ち */
-       sil_andw((void*)FLASH_ACR, ~ACR_LATENCY_MASK);
-       sil_orw((void*)FLASH_ACR, ACR_LATENCY_TWO);
-
-       /* HCLK = SYSCLK, PCLK2 = HCLK, PCLK1 = HCLK/2  */
-       sil_orw((void*)RCC_CFGR, 0x00 | (0x00 << 11) | (0x04 << 8));
-
-       /* PLLCLK = 8MHz x 9 = 72MHz, HSE as PLL clock */
-       sil_orw((void*)RCC_CFGR, 0x07 << 18);
-       sil_orw((void*)RCC_CFGR, CFGR_PLL_SRC);
-
-       /* PLLの有効化 */
-       sil_orw((void*)RCC_CR, CR_PLL_ON);
-
-       /* PLL有効待ち */
-       while ((sil_rew_mem((void*)RCC_CR) & CR_PLL_RDY) == 0) ;
-
-       /* PLLをシステムクロックに選択 */
-       sil_orw((void*)RCC_CFGR, CFGR_SW_PLL);
-
-       /* PLLのシステムクロック選択待ち */
-       while ((sil_rew_mem((void*)RCC_CFGR) & CFGR_SWS_MASK) != (CFGR_SW_PLL << 2)) ;
-
-
-       /*
-        *  プロセッサ依存部の初期化
-        */
-       prc_initialize();
-
-       /*
-        *  ペリフェラルの有効化
-        */
-       sil_orw((void*)RCC_APB2ENR, APB2ENR_USART1_EN | APB2ENR_IOPA_EN |
-                       APB2ENR_IOPC_EN | APB2ENR_AFIO_EN);
-#if (TNUM_PORT >= 2)
-       sil_orw((void*)RCC_APB2ENR, APB2ENR_IOPD_EN);
-       sil_orw((void*)RCC_APB1ENR, APB1ENR_USART2_EN);
-#endif
-       /*
-        *  I/Oポートの初期化
-        */
-       /* USART1(RX)  プルアップ */
-       set_cr_mode(GPIOA_BASE, 10, MODE_INPUT);
-       set_cr_cnf(GPIOA_BASE, 10, CNF_IN_FLOATING);
-
-       /* USART1(TX) */
-       set_cr_mode(GPIOA_BASE, 9, MODE_OUTPUT_50MHZ);
-       set_cr_cnf(GPIOA_BASE, 9, CNF_OUT_AF_PP);
-
-#if (TNUM_PORT >= 2)
-       /* USART2(RX)  プルアップ */
-       set_cr_mode(GPIOD_BASE, 6, MODE_INPUT);
-       set_cr_cnf(GPIOD_BASE, 6, CNF_IN_FLOATING);
-
-       /* USART2(TX) */
-       set_cr_mode(GPIOD_BASE, 5, MODE_OUTPUT_50MHZ);
-       set_cr_cnf(GPIOD_BASE, 5, CNF_OUT_AF_PP);
-
-       /* USART2ポートのリマップ(PD5,6) */
-       sil_orw((void*)AFIO_MAPR, MAPR_USART2_REMAP);
-#endif
-       /* LEDポート */
-       set_cr_mode(GPIOC_BASE, 6, MODE_OUTPUT_50MHZ);
-       set_cr_cnf(GPIOC_BASE, 6, CNF_OUT_GP_PP);
-
-       /*
-        *  バーナー出力用のシリアル初期化
-        */
-       target_usart_init(SIO_PORTID);
-}
-
-/*
- * ターゲット依存部 終了処理
- */
-void target_exit(void)
-{
-       /* プロセッサ依存部の終了処理 */
-       prc_terminate();
-}
-
-/*
- * システムログの低レベル出力のための文字出力
- */
-void target_fput_log(char_t c)
-{
-       if (c == '\n') {
-               sio_pol_snd_chr('\r', SIO_PORTID);
-       }
-       sio_pol_snd_chr(c, SIO_PORTID);
-}
diff --git a/asp/target/cq_starm_gcc/target_def.csv b/asp/target/cq_starm_gcc/target_def.csv
deleted file mode 100755 (executable)
index e69de29..0000000
diff --git a/asp/target/cq_starm_gcc/target_kernel.h b/asp/target/cq_starm_gcc/target_kernel.h
deleted file mode 100755 (executable)
index 91fb6b7..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *  TOPPERS/ASP Kernel
- *      Toyohashi Open Platform for Embedded Real-Time Systems/
- *      Advanced Standard Profile Kernel
- * 
- *  Copyright (C) 2007 by Embedded and Real-Time Systems Laboratory
- *              Graduate School of Information Science, Nagoya Univ., JAPAN
- * 
- *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
- *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
- *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
- *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
- *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
- *      スコード中に含まれていること.
- *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
- *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
- *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
- *      の無保証規定を掲載すること.
- *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
- *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
- *      と.
- *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
- *        作権表示,この利用条件および下記の無保証規定を掲載すること.
- *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
- *        報告すること.
- *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
- *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
- *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
- *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
- *      免責すること.
- * 
- *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
- *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
- *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
- *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
- *  の責任を負わない.
- * 
- */
-
-/*
- *  kernel.hのターゲット依存部(CQ-STARM用)
- *
- *  このインクルードファイルは,kernel.hでインクルードされる.他のファ
- *  イルから直接インクルードすることはない.このファイルをインクルード
- *  する前に,t_stddef.hがインクルードされるので,それらに依存してもよ
- *  い.
- */
-
-#ifndef TOPPERS_TARGET_KERNEL_H
-#define TOPPERS_TARGET_KERNEL_H
-
-#define TMIN_INTPRI            (-15)           /* 割込み優先度の最小値(最高値)*/
-
-/*
- *  サポートする機能の定義
- */
-#define TOPPERS_SUPPORT_GET_UTM                /* get_utmをサポートする */
-
-/*
- *  タイムティックの定義
- */
-#define TIC_NUME                       1U              /* タイムティックの周期の分子 */
-#define TIC_DENO                       1U              /* タイムティックの周期の分母 */
-
-/*
- *  プロセッサで共通な定義
- */
-#include "arm_m_gcc/prc_kernel.h"
-
-#endif /* TOPPERS_TARGET_KERNEL_H */
diff --git a/asp/target/cq_starm_gcc/target_rename.def b/asp/target/cq_starm_gcc/target_rename.def
deleted file mode 100755 (executable)
index 1d3b764..0000000
+++ /dev/null
@@ -1 +0,0 @@
-INCLUDE        "arm_m_gcc/prc"
diff --git a/asp/target/cq_starm_gcc/target_rename.h b/asp/target/cq_starm_gcc/target_rename.h
deleted file mode 100755 (executable)
index 40764b4..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/* This file is generated from target_rename.def by genrename. */
-
-#ifndef TOPPERS_TARGET_RENAME_H
-#define TOPPERS_TARGET_RENAME_H
-
-
-#ifdef TOPPERS_LABEL_ASM
-
-
-#endif /* TOPPERS_LABEL_ASM */
-
-#include "arm_m_gcc/prc_rename.h"
-
-#endif /* TOPPERS_TARGET_RENAME_H */
diff --git a/asp/target/cq_starm_gcc/target_serial.c b/asp/target/cq_starm_gcc/target_serial.c
deleted file mode 100755 (executable)
index 8560bf9..0000000
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- *  TOPPERS/ASP Kernel
- *      Toyohashi Open Platform for Embedded Real-Time Systems/
- *      Advanced Standard Profile Kernel
- * 
- *  Copyright (C) 2007 by Embedded and Real-Time Systems Laboratory
- *              Graduate School of Information Science, Nagoya Univ., JAPAN
- * 
- *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
- *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
- *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
- *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
- *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
- *      スコード中に含まれていること.
- *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
- *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
- *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
- *      の無保証規定を掲載すること.
- *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
- *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
- *      と.
- *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
- *        作権表示,この利用条件および下記の無保証規定を掲載すること.
- *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
- *        報告すること.
- *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
- *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
- *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
- *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
- *      免責すること.
- * 
- *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
- *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
- *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
- *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
- *  の責任を負わない.
- * 
- */
-
-/*
- * シリアルドライバ(CQ-STARM用)
- */
-
-#include <kernel.h>
-#include <sil.h>
-#include "target_serial.h"
-#include "target_syssvc.h"
-
-/*
- * レジスタ設定値
- */
-#define PORT2SIOPID(x) ((x) + 1)
-#define INDEX_PORT(x)  ((x) - 1)
-#define GET_SIOPCB(x)  (&siopcb_table[INDEX_PORT(x)])
-
-/*
- * USARTレジスタ定義
- */
-#define USART_SR(x)            (x)
-#define USART_DR(x)            (x + 0x04)
-#define USART_BRR(x)   (x + 0x08)
-#define USART_CR1(x)   (x + 0x0C)
-#define USART_CR2(x)   (x + 0x10)
-#define USART_CR3(x)   (x + 0x14)
-#define USART_GTPR(x)  (x + 0x18)
-
-#define SR_TXE                 (0x0080)
-#define SR_RXNE                        (0x0020)
-#define SR_ORE                 (0x0008)
-#define SR_FE                  (0x0002)
-#define SR_PE                  (0x0001)
-#define CR1_UE                 (0x2000)
-#define CR1_TXEIE              (0x0080)
-#define CR1_RXNEIE             (0x0020)
-#define CR1_TE                 (0x0008)
-#define CR1_RE                 (0x0004)
-#define CR3_EIE                        (0x0001)
-
-/*
- * シリアルI/Oポート管理ブロックエリア
- */
-SIOPCB siopcb_table[TNUM_PORT];
-
-static const uint32_t sioreg_table[TNUM_PORT] = {
-       USART1_BASE,
-#if (TNUM_PORT >= 2)
-       USART2_BASE
-#endif
-};
-
-Inline bool_t  sio_putready(SIOPCB* siopcb)
-{
-       return (sil_rew_mem((void*)USART_SR(siopcb->reg)) & SR_TXE) != 0;
-}
-
-Inline bool_t sio_getready(SIOPCB* siopcb)
-{
-       return (sil_rew_mem((void*)USART_SR(siopcb->reg)) & SR_RXNE) != 0;
-}
-
-/*
- *  ターゲットのシリアル初期化
- */
-void target_usart_init(ID siopid)
-{
-       uint32_t tmp, usartdiv, fraction;
-       uint32_t reg = sioreg_table[INDEX_PORT(siopid)];
-       uint32_t src_clock;
-
-       /* USARTの無効化 */
-       sil_andw((void*)USART_CR1(reg), ~CR1_UE);
-
-       /* 1STOP BIT */
-       sil_wrw_mem((void*)USART_CR2(reg), 0);
-
-       /* 1START BIT, 8DATA bits, Parityなし */
-       sil_wrw_mem((void*)USART_CR1(reg), 0);
-
-       /* CR3初期化 */
-       sil_wrw_mem((void*)USART_CR3(reg), 0);
-
-       /* 通信速度設定 */
-       if (siopid == 1) {
-               /* fck=72MHz */
-               src_clock = PCLK2_CLOCK;
-       } else {
-               /* fck=36MHz */
-               src_clock = PCLK1_CLOCK;
-       }
-       tmp = (1000 * (src_clock / 100)) / ((BPS_SETTING / 100) * 16);
-       usartdiv = (tmp / 1000) << 4;
-       fraction = tmp - ((usartdiv >> 4) * 1000);
-       fraction = ((16 * fraction) + 500) / 1000;
-       usartdiv |= (fraction & 0x0F);
-       sil_wrw_mem((void*)USART_BRR(reg), usartdiv);
-
-       /* 送受信の有効化、エラー割込みの有効化 */
-       sil_orw((void*)USART_CR1(reg), CR1_RE | CR1_TE);
-       sil_orw((void*)USART_CR3(reg), CR3_EIE);
-
-       /* USARTの有効化 */
-       sil_orw((void*)USART_CR1(reg), CR1_UE);
-}
-
-/*
- *  ターゲットのシリアル終了
- */
-void target_usart_term(ID siopid)
-{
-       uint32_t reg = sioreg_table[INDEX_PORT(siopid)];
-
-       /* USARTの無効化 */
-       sil_andw((void*)USART_CR1(reg),  ~CR1_UE);
-}
-
-/*
- *  SIO初期化
- */
-void sio_initialize(intptr_t exinf)
-{
-       int i;
-
-       for (i = 0; i < TNUM_PORT; i++) {
-               siopcb_table[i].port = i;
-               siopcb_table[i].reg = sioreg_table[i];
-               siopcb_table[i].exinf = 0;
-       }
-}
-
-/*
- *  シリアルオープン
- */
-SIOPCB *sio_opn_por(ID siopid, intptr_t exinf)
-{
-       SIOPCB* siopcb;
-
-       if (siopid > TNUM_PORT) {
-               return NULL;
-       }
-
-       siopcb = GET_SIOPCB(siopid);
-       siopcb->exinf = exinf;
-
-       target_usart_init(siopid);
-
-       return siopcb;
-}
-
-/*
- *  シリアルクローズ
- */
-void sio_cls_por(SIOPCB *p_siopcb)
-{
-       target_usart_term(PORT2SIOPID(p_siopcb->port));
-}
-
-/*
- *  割込みハンドラ
- */
-void sio_isr(intptr_t exinf)
-{
-       SIOPCB* siopcb = GET_SIOPCB(exinf);
-
-       if (sio_putready(siopcb)) {
-               sio_irdy_snd(siopcb->exinf);
-       }
-       if (sio_getready(siopcb)) {
-               sio_irdy_rcv(siopcb->exinf);
-       }
-}
-
-/*
- *  1文字送信
- */
-bool_t sio_snd_chr(SIOPCB *siopcb, char_t c)
-{
-       if (sio_putready(siopcb)) {
-               sil_wrw_mem((void*)USART_DR(siopcb->reg), c);
-
-               return true;
-       }
-
-       return false;
-}
-
-/*
- *  1文字受信
- */
-int_t sio_rcv_chr(SIOPCB *siopcb)
-{
-       int_t c = -1;
-
-       if (sio_getready(siopcb)) {
-               c = sil_rew_mem((void*)USART_DR(siopcb->reg)) & 0xFF;
-       }
-
-       return c;
-}
-
-/*
- *  コールバックの許可
- */
-void sio_ena_cbr(SIOPCB *siopcb, uint_t cbrtn)
-{
-       switch (cbrtn) {
-       case SIO_RDY_SND:
-               sil_orw((void*)USART_CR1(siopcb->reg), CR1_TXEIE);
-               break;
-       case SIO_RDY_RCV:
-               sil_orw((void*)USART_CR1(siopcb->reg), CR1_RXNEIE);
-               break;
-       default:
-               break;
-       }
-}
-
-/* 
- *  コールバックの禁止
- */
-void sio_dis_cbr(SIOPCB *siopcb, uint_t cbrtn)
-{
-       switch (cbrtn) {
-       case SIO_RDY_SND:
-               sil_andw((void*)USART_CR1(siopcb->reg), ~CR1_TXEIE);
-               break;
-       case SIO_RDY_RCV:
-               sil_andw((void*)USART_CR1(siopcb->reg), ~CR1_RXNEIE);
-               break;
-       default:
-               break;
-       }
-}
-
-/*
- *  1文字出力(ポーリングでの出力)
- */
-void sio_pol_snd_chr(char_t c, ID siopid)
-{
-       uint32_t reg = sioreg_table[INDEX_PORT(siopid)];
-
-       sil_wrw_mem((void*)USART_DR(reg), c);
-
-       while ((sil_rew_mem((void*)USART_SR(reg)) & SR_TXE) == 0) ;
-}
diff --git a/asp/target/cq_starm_gcc/target_serial.cfg b/asp/target/cq_starm_gcc/target_serial.cfg
deleted file mode 100755 (executable)
index 031aa61..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/*
- *  SIOドライバ(CQ-STARM用)のコンフィグレーションファイル
- */
-
-#include "target_serial.h"
-ATT_INI({ TA_NULL, 0, sio_initialize });
-ATT_ISR({ TA_NULL, SIO_PORTID, INTNO_SIO, sio_isr, 1 });
-CFG_INT(INTNO_SIO, { TA_ENAINT|INTATR_SIO, INTPRI_SIO });
diff --git a/asp/target/cq_starm_gcc/target_sil.h b/asp/target/cq_starm_gcc/target_sil.h
deleted file mode 100755 (executable)
index e60588b..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *  TOPPERS Software
- *      Toyohashi Open Platform for Embedded Real-Time Systems
- * 
- *  Copyright (C) 2007 by Embedded and Real-Time Systems Laboratory
- *              Graduate School of Information Science, Nagoya Univ., JAPAN
- * 
- *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
- *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
- *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
- *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
- *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
- *      スコード中に含まれていること.
- *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
- *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
- *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
- *      の無保証規定を掲載すること.
- *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
- *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
- *      と.
- *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
- *        作権表示,この利用条件および下記の無保証規定を掲載すること.
- *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
- *        報告すること.
- *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
- *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
- *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
- *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
- *      免責すること.
- * 
- *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
- *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
- *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
- *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
- *  の責任を負わない.
- * 
- */
-
-/*
- *  sil.hのターゲット依存部(APSH2A用)
- *
- *  このインクルードファイルは,sil.hの先頭でインクルードされる.他のファ
- *  イルからは直接インクルードすることはない.このファイルをインクルー
- *  ドする前に,t_stddef.hがインクルードされるので,それらに依存しても
- *  よい.
- */
-
-#ifndef TOPPERS_TARGET_SIL_H
-#define TOPPERS_TARGET_SIL_H
-
-/*
- *  プロセッサのインディアン定義
- *    STM32F10Xはリトルエンディアン
- */
-#define SIL_ENDIAN_LITTLE
-
-/*
- *  プロセッサで共通な定義 
- */
-#include "arm_m_gcc/prc_sil.h"
-
-/*
- *  STM32F10X用一般共通レジスタ操作関数
- */
-#define sil_orb( mem, val )            sil_wrb_mem( mem, sil_reb_mem( mem ) | val )
-#define sil_andb( mem, val )   sil_wrb_mem( mem, sil_reb_mem( mem ) & val )
-#define sil_orh( mem, val )            sil_wrh_mem( mem, sil_reh_mem( mem ) | val )
-#define sil_andh( mem, val )   sil_wrh_mem( mem, sil_reh_mem( mem ) & val )
-#define sil_orw( mem, val )            sil_wrw_mem( mem, sil_rew_mem( mem ) | val )
-#define sil_andw( mem, val )   sil_wrw_mem( mem, sil_rew_mem( mem ) & val )
-
-
-#endif /* TOPPERS_TARGET_SIL_H */
diff --git a/asp/target/cq_starm_gcc/target_stddef.h b/asp/target/cq_starm_gcc/target_stddef.h
deleted file mode 100755 (executable)
index 07fd5eb..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *  TOPPERS Software
- *      Toyohashi Open Platform for Embedded Real-Time Systems
- * 
- *  Copyright (C) 2007 by Embedded and Real-Time Systems Laboratory
- *              Graduate School of Information Science, Nagoya Univ., JAPAN
- * 
- *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
- *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
- *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
- *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
- *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
- *      スコード中に含まれていること.
- *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
- *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
- *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
- *      の無保証規定を掲載すること.
- *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
- *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
- *      と.
- *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
- *        作権表示,この利用条件および下記の無保証規定を掲載すること.
- *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
- *        報告すること.
- *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
- *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
- *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
- *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
- *      免責すること.
- * 
- *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
- *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
- *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
- *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
- *  の責任を負わない.
- * 
- */
-
-/*
- *  t_stddef.hのターゲット依存部(APSH2A用)
- *
- *  このインクルードファイルは,t_stddef.hの先頭でインクルードされる.
- *  他のファイルからは直接インクルードすることはない.他のインクルード
- *  ファイルに先立って処理されるため,他のインクルードファイルに依存し
- *  てはならない.
- */
-
-#ifndef TOPPERS_TARGET_STDDEF_H
-#define TOPPERS_TARGET_STDDEF_H
-
-/*
- *  ターゲットを識別するためのマクロの定義
- */
-#define TOPPERS_CQSTARM                        /* システム略称 */
-
-
-/*
- *  開発環境で共通な定義
- */
-#define TOPPERS_STDINT_TYPE1
-#define TOPPERS_STDFLOAT_TYPE1
-#include "gcc/tool_stddef.h"
-
-/*
- *  プロセッサで共通な定義
- */
-#include "arm_m_gcc/prc_stddef.h"
-
-#ifndef TOPPERS_MACRO_ONLY
-
-/*
- *  アサーションの失敗時の実行中断処理(T.B.D)
- */
-Inline void
-TOPPERS_assert_abort(void)
-{
-    while(1);
-}
-
-#endif /* TOPPERS_MACRO_ONLY */
-#endif /* TOPPERS_TARGET_STDDEF_H */
diff --git a/asp/target/cq_starm_gcc/target_test.h b/asp/target/cq_starm_gcc/target_test.h
deleted file mode 100755 (executable)
index 4d37af8..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  TOPPERS/ASP Kernel
- *      Toyohashi Open Platform for Embedded Real-Time Systems/
- *      Advanced Standard Profile Kernel
- * 
- *  Copyright (C) 2007 by Embedded and Real-Time Systems Laboratory
- *              Graduate School of Information Science, Nagoya Univ., JAPAN
- * 
- *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
- *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
- *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
- *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
- *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
- *      スコード中に含まれていること.
- *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
- *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
- *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
- *      の無保証規定を掲載すること.
- *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
- *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
- *      と.
- *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
- *        作権表示,この利用条件および下記の無保証規定を掲載すること.
- *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
- *        報告すること.
- *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
- *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
- *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
- *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
- *      免責すること.
- * 
- *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
- *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
- *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
- *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
- *  の責任を負わない.
- * 
- */
-
-/*
- *             テストプログラムのターゲット依存定義(CQ-STARM用)
- */
-
-#ifndef TOPPERS_TARGET_TEST_H
-#define TOPPERS_TARGET_TEST_H
-
-#define STACK_SIZE                     (1024)
-
-/*
- *  プロセッサ依存モジュール(ARM-M用)
- */
-#include "arm_m_gcc/prc_test.h"
-
-#endif /* TOPPERS_TARGET_TEST_H */
diff --git a/asp/target/cq_starm_gcc/target_timer.cfg b/asp/target/cq_starm_gcc/target_timer.cfg
deleted file mode 100755 (executable)
index 6101f40..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "target_timer.h"
-
-INCLUDE("arm_m_gcc/prc_timer.cfg");
diff --git a/asp/target/cq_starm_gcc/target_timer.h b/asp/target/cq_starm_gcc/target_timer.h
deleted file mode 100755 (executable)
index 15b5976..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  TOPPERS/ASP Kernel
- *      Toyohashi Open Platform for Embedded Real-Time Systems/
- *      Advanced Standard Profile Kernel
- * 
- *  Copyright (C) 2007 by Embedded and Real-Time Systems Laboratory
- *              Graduate School of Information Science, Nagoya Univ., JAPAN
- * 
- *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
- *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
- *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
- *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
- *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
- *      スコード中に含まれていること.
- *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
- *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
- *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
- *      の無保証規定を掲載すること.
- *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
- *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
- *      と.
- *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
- *        作権表示,この利用条件および下記の無保証規定を掲載すること.
- *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
- *        報告すること.
- *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
- *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
- *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
- *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
- *      免責すること.
- * 
- *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
- *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
- *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
- *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
- *  の責任を負わない.
- * 
- */
-
-/*
- *  タイマドライバ(CQ-STARM用)
- */
-
-#ifndef TOPPERS_TARGET_TIMER_H
-#define TOPPERS_TARGET_TIMER_H
-
-/*
- *  タイマ値の内部表現とミリ秒単位との変換
- */
-#define TIMER_CLOCK            (SYS_CLOCK / 1000)
-
-/*
- *  タイマ割込みハンドラ登録のための定数
- */
-#define INTPRI_TIMER    (-6)          /* 割込み優先度 */
-#define INTATR_TIMER    0U            /* 割込み属性 */
-
-/*
- *  プロセッサ依存部で定義する
- */
-#include "arm_m_gcc/prc_timer.h"
-
-#endif /* TOPPERS_TARGET_TIMER_H */
diff --git a/asp/target/cq_starm_gcc/target_unrename.h b/asp/target/cq_starm_gcc/target_unrename.h
deleted file mode 100755 (executable)
index 52518b1..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-/* This file is generated from target_rename.def by genrename. */
-
-/* This file is included only when target_rename.h has been included. */
-#ifdef TOPPERS_TARGET_RENAME_H
-#undef TOPPERS_TARGET_RENAME_H
-
-
-#ifdef TOPPERS_LABEL_ASM
-
-
-#endif /* TOPPERS_LABEL_ASM */
-
-#include "arm_m_gcc/prc_unrename.h"
-
-#endif /* TOPPERS_TARGET_RENAME_H */
diff --git a/asp/target/cq_starm_gcc/target_user.txt b/asp/target/cq_starm_gcc/target_user.txt
deleted file mode 100755 (executable)
index a49e1cf..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-=====================================================================
-                         CQ-STARMターゲット依存部 (asp-1.3.1対応)
-                                  Last Modified: '08/07/31
-=====================================================================
-
-○概要
-
-CQ-STARMターゲット依存部は,プロセッサにSTM32F10x(Cortex-M3)を搭載した,
-(株)ESP企画製のCQ-STARM+CQ-STARMBBをサポートしている.
-
-
-○カーネルの使用リソース
-
-カーネルは以下のリソースを使用する.
-
-  ・ROM
-     コードを配置する.
-     使用量は使用するAPIの数に依存する.
-
-  ・RAM
-     データを配置する.
-        使用量はオブジェクト数に依存する.
-  
-  ・SysTick
-     カーネル内部のティックの生成に用いる.
-     
-  ・USARTチャネル1
-     コンソールの出力に使用.
-
-
-○他のターゲットへの移植
-
-CQ-STARMターゲット依存部で使用するシリアルは,STM32F10xの内蔵機能の
-みを使用するため,STM32F10x系のCotex-M3を用いた環境には容易にポーティ
-ングが可能である.ポーティングに関しては,以下の初期化ルーチンにターゲ
-ット毎の初期化を追加すればよい.
-
-  ・target_initialize() : target_config.c
-    ターゲット依存部の初期化(C言語)
-  ・_hardware_init_hook : target_support.S
-    低レベルのターゲット依存の初期化
-    スタートアップモジュールの中で,メモリの初期化の前に呼び出される
-
-
-○デバッグ環境
-
-デバッグ環境としては,JTAGデバッガの使用を前提とする.
-デバッガはGDBを使用.
-JTAGハードウェアは,limex製のARM-USB-TINYを使用.
-ソフトウェアとして,OpenOCDを使用.バージョンは、r657-20080516.
-
-OpenOCDについては、以下のサイトを参照
-   http://openocd.berlios.de/web/
-
-OpenOCDを使用してデバッグする場合,TOPPERS_CUSTOM_IDELを定義して,アイドル時に
-サスペンドしないように注意すること.WFI命令でサスペンドした場合,OpenOCDを使っ
-てデバックできなくなるという問題があるためである.
-
-○コンパイラ
-
-GCC 4.2.3 で動作確認を行った.動作確認した GCC 4.2.3 は,以下のサイトから
-バイナリパッケージをダウンロードして用いた.
-
-   http://www.codesourcery.com/gnu_toolchains/arm/download.html
-
-
-○割込み優先度
-
-割込み優先度として指定可能な範囲は,-15 〜 -1 である.
-
-○コンソール出力
-
-コンソール出力には,USARTのチャネル1を用いる.CQ-STRM+CQ-STARMBB上ではUSARTの
-チャネル1は,P2に接続されている.通信フォーマットは以下の通りである.
-
-  ・1152200bps, Data 8bit, Parity none, Stop 1bit, Flow control none
-
-○アドレスマッピング
-
- 0x0800,0000 - 0x0802,0000 内蔵FlashROM 128KB
-               ・vectorセクション
-               ・textセクション
-               ・rodataセクション
- 0x2000,0000 - 0x2000,5000 内蔵RAM 20KB
-               ・dataセクション
-               ・bssセクション
-
-○各種設定の変更
-
-幾つかのパラメータは変更可能になっている.設定ファイル毎に設定可能項目
-は次のようになっている.
-
-●Makefile.target の設定項目
-
-・GCC_TARGET
-  GCCの suffix を定義
-
-・TEXT_START_ADDRESS/DATA_START_ADDRESS
-  テキストセクション,データセクションの開始アドレス
-
-・DEFAULT_STK_TOP
-  ディフォルトの非タスクコンテキスト用のスタックの終了番地
-   ・非タスクコンテキスト用スタックポインタの初期値(底)
-
-・INCLUDES
-  インクルード指定
-
-・COPTS
-  Cコンパイラへのオプション
-
-・LDFLAGS
-  リンカへのオプション
-
-●target_config.h の設定項目
-
-・DEFAULT_ISTKSZ
-  ディフォルトの非タスクコンテキスト用のスタックサイズ
-
-・SIL_DLY_TIM1/2
-  微少時間待ちのための定義
-
-●target_syssvc.h の設定項目
-
-・BPS_SETTING
-  コンソールに使用するポート(SCIFのポート1)のボーレート
-
-
-○変更履歴
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index a0856ac..69ca6eb
@@ -1,9 +1,5 @@
 #
-#  @(#) $Id: Makefile.target 1526 2009-04-29 03:53:12Z ertl-hiro $
-# 
-
-#
-#              Makefile のターゲット依存部(DVE68K/40用)
+#              Makefileのターゲット依存部(DVE68K/40用)
 #
 
 #
old mode 100755 (executable)
new mode 100644 (file)
index 0beb0e3..62b9a63
@@ -5,7 +5,7 @@
  * 
  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
  *                              Toyohashi Univ. of Technology, JAPAN
- *  Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2005-2011 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: dve68k.h 817 2008-03-18 01:33:12Z hiro $
+ *  @(#) $Id: dve68k.h 2066 2011-05-03 12:29:54Z ertl-hiro $
  */
 
 /*
 /*
  *  DGAへのアクセス関数
  */
-#define dga_rew_reg(addr)                      sil_rew_mem(addr)
-#define dga_wrw_reg(addr, val)         sil_wrw_mem(addr, val)
+#define dga_rew_reg(addr)                      sil_rew_mem(((uint32_t *) addr))
+#define dga_wrw_reg(addr, val)         sil_wrw_mem(((uint32_t *) addr), val)
 
 /*
  *  DGAのレジスタへのアクセス関数
 Inline uint32_t
 dga_read(void *addr)
 {
-       return((uint32_t) dga_rew_reg(addr));
+       return(dga_rew_reg(addr));
 }
 
 Inline void
@@ -212,8 +212,8 @@ dga_set_ilv(void *addr, uint_t shift, uint_t level)
 /*
  *  μPD72001へのアクセス関数
  */
-#define upd72001_reb_reg(addr)                 sil_reb_mem(addr)
-#define upd72001_wrb_reg(addr, val)            sil_wrb_mem(addr, val)
+#define upd72001_reb_reg(addr)                 sil_reb_mem(((uint8_t *) addr))
+#define upd72001_wrb_reg(addr, val)            sil_wrb_mem(((uint8_t *) addr), val)
 
 /*
  *  開発環境依存の処理
old mode 100755 (executable)
new mode 100644 (file)
index 6b7b973..fa4db5a
@@ -22,16 +22,6 @@ $INTNO_CFGINT_VALID = { 1,2,...,7;9,10,...,31 }$
 $INTPRI_CFGINT_VALID = { -7,-6,...,-1 }$
 
 $ 
-$  カーネル管理外の割込み
-$ 
-$TARGET_INHATR = TA_NONKERNEL$
-
-$ 
-$  チェック方法の指定
-$ 
-$CHECK_STKSZ_ALIGN = 4$
-
-$ 
 $  標準テンプレートファイルのインクルード
 $ 
 $INCLUDE "kernel/kernel.tf"$
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 687cff6..f94b8c6
@@ -3,16 +3,6 @@ $              パス3のターゲット依存テンプレート(DVE68K/40用)
 $ 
 
 $ 
-$  チェック方法の指定
-$ 
-$CHECK_FUNC_ALIGN = 2$
-$CHECK_FUNC_NONNULL = 1$
-$CHECK_STACK_ALIGN = 4$
-$CHECK_STACK_NONNULL = 1$
-$CHECK_MPF_ALIGN = 4$
-$CHECK_MPF_NONNULL = 1$
-
-$ 
 $  標準テンプレートファイルのインクルード
 $ 
 $INCLUDE "kernel/kernel_check.tf"$
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 9bd660c..00f114a
@@ -5,7 +5,7 @@
  * 
  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
  *                              Toyohashi Univ. of Technology, JAPAN
- *  Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -37,7 +37,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: target_config.h 887 2008-04-11 11:16:07Z hiro $
+ *  @(#) $Id: target_config.h 1952 2010-10-24 00:44:26Z ertl-hiro $
  */
 
 /*
 #include "dve68k.h"
 
 /*
+ *  ターゲット定義のオブジェクト属性
+ */
+#define TARGET_INHATR  TA_NONKERNEL    /* カーネル管理外の割込み */
+
+/*
+ *  エラーチェック方法の指定
+ */
+#define CHECK_STKSZ_ALIGN      4       /* スタックサイズのアライン単位 */
+#define CHECK_FUNC_ALIGN       2       /* 関数のアライン単位 */
+#define CHECK_FUNC_NONNULL             /* 関数の非NULLチェック */
+#define CHECK_STACK_ALIGN      4       /* スタック領域のアライン単位 */
+#define CHECK_STACK_NONNULL            /* スタック領域の非NULLチェック */
+#define CHECK_MPF_ALIGN                4       /* 固定長メモリプール領域のアライン単位 */
+#define CHECK_MPF_NONNULL              /* 固定長メモリプール領域の非NULLチェック */
+#define CHECK_MB_ALIGN         4       /* 管理領域のアライン単位 */
+
+/*
  *  トレースログに関する設定
  */
 #ifdef TOPPERS_ENABLE_TRACE
@@ -91,6 +108,7 @@ extern void          *board_addr;    /* ローカルメモリの先頭アドレス */
  *  ビットパターンを求めるのを容易にするために,8は欠番になっている.
  */
 #define VALID_INTNO(intno)     (1U <= (intno) && (intno) <= 31U && (intno) != 8U)
+#define        VALID_INTNO_CREISR(intno)       VALID_INTNO(intno)
 #define VALID_INTNO_DISINT(intno)      VALID_INTNO(intno)
 #define VALID_INTNO_CFGINT(intno)      VALID_INTNO(intno)
 
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
diff --git a/asp/target/lm3s8962_gcc/MANIFEST b/asp/target/lm3s8962_gcc/MANIFEST
deleted file mode 100755 (executable)
index 6eb3c35..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-PACKAGE asp_arch_arm_m_gcc
-
-MANIFEST
-Makefile.target
-lm3s8962.h
-lm3s8962_ram.ld
-lm3s8962_rom.ld
-target.tf
-target_cfg1_out.h
-target_check.tf
-target_config.c
-target_config.h
-target_def.csv
-target_kernel.h
-target_rename.def
-target_rename.h
-target_serial.c
-target_serial.cfg
-target_serial.h
-target_sil.h
-target_stddef.h
-target_syssvc.h
-target_test.h
-target_timer.cfg
-target_timer.h
-target_unrename.h
-target_user.txt
diff --git a/asp/target/lm3s8962_gcc/Makefile.target b/asp/target/lm3s8962_gcc/Makefile.target
deleted file mode 100755 (executable)
index 9b2c42c..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-#
-#  @(#) $Id: Makefile.target 1309 2008-08-27 07:48:51Z ertl-honda $
-# 
-
-#
-#              Makefile のターゲット依存部(LM3S8962用)
-#
-
-#
-#  ボード名,プロセッサ名,開発環境名の定義
-#
-BOARD = lm3s8962
-PRC   = arm_m
-TOOL  = gcc
-
-DRIVER_DIR = ../../../target/cortex_m3/prog_luminary/LuminaryMicro_driver/
-
-#
-#  コンパイルオプション
-#
-INCLUDES := $(INCLUDES) -I$(TARGETDIR) -I$(DRIVER_DIR)
-COPTS := $(COPTS) -mlittle-endian -mcpu=cortex-m3
-LDFLAGS := $(LDFLAGS) -mlittle-endian
-LIBS := $(LIBS) $(DRIVER_DIR)/arm-none-eabi-gcc/libdriver.a $(DRIVER_DIR)/arm-none-eabi-gcc/libgr.a
-
-#
-#  カーネルに関する定義
-#
-KERNEL_DIR := $(KERNEL_DIR) $(TARGETDIR)
-KERNEL_ASMOBJS := $(KERNEL_ASMOBJS)
-KERNEL_COBJS := $(KERNEL_COBJS) target_config.o prc_timer.o
-
-#
-#  システムサービスに関する定義
-#
-SYSSVC_DIR := $(SYSSVC_DIR) 
-SYSSVC_COBJS := $(SYSSVC_COBJS) target_serial.o
-
-#
-#  コンフィギュレータ関係の変数の定義
-#
-CFG_TABS := $(CFG_TABS) --cfg1-def-table $(TARGETDIR)/target_def.csv
-
-#
-#  トレースログに関する設定
-#
-ifeq ($(ENABLE_TRACE),true)
-      COPTS := $(COPTS) -DTOPPERS_ENABLE_TRACE
-      KERNEL_DIR := $(KERNEL_DIR) $(SRCDIR)/arch/logtrace
-      KERNEL_COBJS := $(KERNEL_COBJS) trace_config.o trace_dump.o
-endif
-
-#
-#  GNU開発環境のターゲットアーキテクチャの定義
-#
-GCC_TARGET = arm-none-eabi
-
-#
-#  リンカスクリプトの定義
-#
-#LDSCRIPT = $(TARGETDIR)/lm3s8962_ram.ld
-LDSCRIPT = $(TARGETDIR)/lm3s8962_rom.ld
-
-#
-#  スタートアップモジュールに関する定義
-#
-#  lm3s8962.ldに「STARTUP(start.o)」を記述したため,スタートアップモジュー
-#  ルの名前をHIDDEN_OBJSに定義する.また,LDFLAGSに-nostdlibを追加している.
-#
-HIDDEN_OBJS = start.o
-
-$(HIDDEN_OBJS): %.o: %.S
-       $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $<
-
-$(HIDDEN_OBJS:.o=.d): %.d: %.S
-       @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \
-               -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend
-
-LDFLAGS := -nostdlib $(LDFLAGS)
-
-#
-#  依存関係の定義
-#
-cfg1_out.c: $(TARGETDIR)/target_def.csv
-kernel_cfg.timestamp: $(TARGETDIR)/target.tf
-$(OBJFILE): $(TARGETDIR)/target_check.tf
-
-#
-#  プロセッサ依存部のインクルード
-#
-include $(SRCDIR)/arch/$(PRC)_$(TOOL)/Makefile.prc
diff --git a/asp/target/lm3s8962_gcc/lm3s8962_ram.ld b/asp/target/lm3s8962_gcc/lm3s8962_ram.ld
deleted file mode 100755 (executable)
index 41bf4c3..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-MEMORY
-{
-    ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K
-    RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
-}
-
-OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm","elf32-littlearm") 
-OUTPUT_ARCH(arm)
-
-PROVIDE(hardware_init_hook = 0);
-PROVIDE(software_init_hook = 0);
-PROVIDE(software_term_hook = 0);
-STARTUP(start.o)
-ENTRY(_start)
-
-SECTIONS
-{
-    .text :
-    {  
-        __text = . ; 
-        KEEP(*(.vector))
-        *(.text*)
-        *(.glue_7t)
-        *(.glue_7)
-    } > RAM
-    _etext = . ;
-    PROVIDE (etext = .)        ;
-
-    .rodata : { 
-        *(.rodata*) 
-    } > RAM
-
-    . = ALIGN(4);
-    __idata_start = . ;
-    .data   :  AT(__idata_start) 
-    {
-        __data_start = . ;
-        *(vtable)
-        *(.data*)
-    } > RAM
-    __idata_end = __idata_start + SIZEOF(.data);
-    _edata  =  . ;
-    PROVIDE (edata = .);
-    . = ALIGN(4);
-
-    .bss       :
-    {
-       __bss_start = . ;
-      *(.bss*)
-      *(COMMON)
-      . = ALIGN(32 / 8);
-    } > RAM
-   . = ALIGN(32 / 8);
-     _end = .          ;
-    __bss_end = .;
-    PROVIDE (end = .)  ;
-
-    .comment 0 : { *(.comment) }
-
-  /* DWARF debug sections.
-     Symbols in the DWARF debugging sections are relative to 
-     the beginning of the section so we begin them at 0.  */
-
-  /* DWARF 1 */
-  .debug          0 : { *(.debug) }
-  .line           0 : { *(.line) }
-
-  /* GNU DWARF 1 extensions */
-  .debug_srcinfo  0 : { *(.debug_srcinfo) }
-  .debug_sfnames  0 : { *(.debug_sfnames) }
-
-  /* DWARF 1.1 and DWARF 2 */
-  .debug_aranges  0 : { *(.debug_aranges) }
-  .debug_pubnames 0 : { *(.debug_pubnames) }
-
-  /* DWARF 2 */
-  .debug_info     0 : { *(.debug_info) }
-  .debug_abbrev   0 : { *(.debug_abbrev) }
-  .debug_line     0 : { *(.debug_line) }
-  .debug_frame    0 : { *(.debug_frame) }
-  .debug_str      0 : { *(.debug_str) }
-  .debug_loc      0 : { *(.debug_loc) }
-  .debug_macinfo  0 : { *(.debug_macinfo) }
-
-  /* SGI/MIPS DWARF 2 extensions */
-  .debug_weaknames 0 : { *(.debug_weaknames) }
-  .debug_funcnames 0 : { *(.debug_funcnames) }
-  .debug_typenames 0 : { *(.debug_typenames) }
-  .debug_varnames  0 : { *(.debug_varnames) }
-}
\ No newline at end of file
diff --git a/asp/target/lm3s8962_gcc/lm3s8962_rom.ld b/asp/target/lm3s8962_gcc/lm3s8962_rom.ld
deleted file mode 100755 (executable)
index 6278354..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-MEMORY
-{
-    ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K
-    RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
-}
-
-OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm","elf32-littlearm") 
-OUTPUT_ARCH(arm)
-
-PROVIDE(hardware_init_hook = 0);
-PROVIDE(software_init_hook = 0);
-PROVIDE(software_term_hook = 0);
-STARTUP(start.o)
-
-SECTIONS
-{
-    .text :
-    {
-        __text = . ; 
-        *(.vector)
-        *(.text*)
-        *(.glue_7t)
-        *(.glue_7)
-    } > ROM
-    _etext = . ;
-    PROVIDE (etext = .)        ;
-
-    .rodata : { 
-        *(.rodata*) 
-    } > ROM
-
-    . = ALIGN(4);
-    __idata_start = . ;
-    .data   :  AT(__idata_start) 
-    {
-        __data_start = . ;
-        *(vtable)
-        *(.data*)
-    } > RAM
-    __idata_end = __idata_start + SIZEOF(.data);
-    _edata  =  . ;
-    PROVIDE (edata = .);
-    . = ALIGN(4);
-
-    .bss       :
-    {
-       __bss_start = . ;
-      *(.bss*)
-      *(COMMON)
-      . = ALIGN(32 / 8);
-    } > RAM
-   . = ALIGN(32 / 8);
-     _end = .          ;
-    __bss_end = .;
-    PROVIDE (end = .)  ;
-
-    .comment 0 : { *(.comment) }
-
-  /* DWARF debug sections.
-     Symbols in the DWARF debugging sections are relative to 
-     the beginning of the section so we begin them at 0.  */
-
-  /* DWARF 1 */
-  .debug          0 : { *(.debug) }
-  .line           0 : { *(.line) }
-
-  /* GNU DWARF 1 extensions */
-  .debug_srcinfo  0 : { *(.debug_srcinfo) }
-  .debug_sfnames  0 : { *(.debug_sfnames) }
-
-  /* DWARF 1.1 and DWARF 2 */
-  .debug_aranges  0 : { *(.debug_aranges) }
-  .debug_pubnames 0 : { *(.debug_pubnames) }
-
-  /* DWARF 2 */
-  .debug_info     0 : { *(.debug_info) }
-  .debug_abbrev   0 : { *(.debug_abbrev) }
-  .debug_line     0 : { *(.debug_line) }
-  .debug_frame    0 : { *(.debug_frame) }
-  .debug_str      0 : { *(.debug_str) }
-  .debug_loc      0 : { *(.debug_loc) }
-  .debug_macinfo  0 : { *(.debug_macinfo) }
-
-  /* SGI/MIPS DWARF 2 extensions */
-  .debug_weaknames 0 : { *(.debug_weaknames) }
-  .debug_funcnames 0 : { *(.debug_funcnames) }
-  .debug_typenames 0 : { *(.debug_typenames) }
-  .debug_varnames  0 : { *(.debug_varnames) }
-}
\ No newline at end of file
diff --git a/asp/target/lm3s8962_gcc/target.tf b/asp/target/lm3s8962_gcc/target.tf
deleted file mode 100755 (executable)
index b69a828..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-$ 
-$     パス2のターゲット依存テンプレート(LM3S8962用)
-$ 
-
-$ 
-$  プロセッサ依存テンプレートのインクルード
-$ 
-$INCLUDE"arm_m_gcc/prc.tf"$
diff --git a/asp/target/lm3s8962_gcc/target_cfg1_out.h b/asp/target/lm3s8962_gcc/target_cfg1_out.h
deleted file mode 100755 (executable)
index 74ca307..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- *  @(#) $Id: target_cfg1_out.h 1309 2008-08-27 07:48:51Z ertl-honda $
- */
-
-/*
- *             cfg1_out.cをリンクするために必要なスタブの定義
- */
-
-/*
- *  プロセッサ依存のスタブの定義 
- */
-#include "arm_m_gcc/prc_cfg1_out.h"
diff --git a/asp/target/lm3s8962_gcc/target_check.tf b/asp/target/lm3s8962_gcc/target_check.tf
deleted file mode 100755 (executable)
index c0d5b80..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-$ 
-$     パス3のターゲット依存テンプレート(LM3S8962用)
-$ 
-
-$ 
-$  パス3のチップ依存のテンプレートのインクルード
-$ 
-$INCLUDE"arm_m_gcc/prc_check.tf"$
diff --git a/asp/target/lm3s8962_gcc/target_config.h b/asp/target/lm3s8962_gcc/target_config.h
deleted file mode 100755 (executable)
index c5e73ff..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  TOPPERS/ASP Kernel
- *      Toyohashi Open Platform for Embedded Real-Time Systems/
- *      Advanced Standard Profile Kernel
- * 
- *  Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
- *              Graduate School of Information Science, Nagoya Univ., JAPAN
- * 
- *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
- *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
- *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
- *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
- *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
- *      スコード中に含まれていること.
- *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
- *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
- *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
- *      の無保証規定を掲載すること.
- *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
- *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
- *      と.
- *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
- *        作権表示,この利用条件および下記の無保証規定を掲載すること.
- *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
- *        報告すること.
- *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
- *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
- *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
- *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
- *      免責すること.
- * 
- *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
- *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
- *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
- *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
- *  の責任を負わない.
- * 
- *  @(#) $Id: target_config.h 1309 2008-08-27 07:48:51Z ertl-honda $
- */
-
-/*
- *  チップ依存モジュール(LM3S8962用)
- *
- *  カーネルのターゲット依存部のインクルードファイル.kernel_impl.hのター
- *  ゲット依存部の位置付けとなる.
- */
-
-#ifndef TOPPERS_TARGET_CONFIG_H
-#define TOPPERS_TARGET_CONFIG_H
-
-/*
- *  ターゲット依存部のハードウェア資源の定義
- */
-#include "lm3s8962.h"
-
-/*
- *  トレースログに関する設定
- */
-#ifdef TOPPERS_ENABLE_TRACE
-#include "logtrace/trace_config.h"
-#endif /* TOPPERS_ENABLE_TRACE */
-
-/*
- *  デフォルトの非タスクコンテキスト用のスタック領域の定義
- *  8byte単位で取得される. 
- */
-#define DEFAULT_ISTKSZ      (0x1000U/8U)   /* 4KByte */
-
-/*
- *  微少時間待ちのための定義(本来はSILのターゲット依存部)
- */
-#define SIL_DLY_TIM1    162
-#define SIL_DLY_TIM2    100
-
-#ifndef TOPPERS_MACRO_ONLY
-
-/*
- *  ターゲットシステム依存の初期化
- */
-extern void    target_initialize(void);
-
-/*
- *  ターゲットシステムの終了
- *
- *  システムを終了する時に使う.
- */
-extern void    target_exit(void) NoReturn;
-
-#endif /* TOPPERS_MACRO_ONLY */
-
-/*
- *  チップ依存モジュール(ARM-M用)
- */
-#include "arm_m_gcc/prc_config.h"
-
-#endif /* TOPPERS_TARGET_CONFIG_H */
diff --git a/asp/target/lm3s8962_gcc/target_def.csv b/asp/target/lm3s8962_gcc/target_def.csv
deleted file mode 100755 (executable)
index e69de29..0000000
diff --git a/asp/target/lm3s8962_gcc/target_kernel.h b/asp/target/lm3s8962_gcc/target_kernel.h
deleted file mode 100755 (executable)
index 2174e4e..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  TOPPERS/ASP Kernel
- *      Toyohashi Open Platform for Embedded Real-Time Systems/
- *      Advanced Standard Profile Kernel
- * 
- *  Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
- *              Graduate School of Information Science, Nagoya Univ., JAPAN
- * 
- *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
- *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
- *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
- *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
- *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
- *      スコード中に含まれていること.
- *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
- *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
- *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
- *      の無保証規定を掲載すること.
- *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
- *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
- *      と.
- *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
- *        作権表示,この利用条件および下記の無保証規定を掲載すること.
- *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
- *        報告すること.
- *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
- *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
- *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
- *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
- *      免責すること.
- * 
- *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
- *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
- *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
- *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
- *  の責任を負わない.
- * 
- *  @(#) $Id: target_kernel.h 1309 2008-08-27 07:48:51Z ertl-honda $
- */
-
-/*
- *  kernel.hのチップ依存部(LM3S8962用)
- *
- *  このインクルードファイルは,kernel.hでインクルードされる.他のファ
- *  イルから直接インクルードすることはない.このファイルをインクルード
- *  する前に,t_stddef.hがインクルードされるので,それらに依存してもよ
- *  い.
- */
-
-#ifndef TOPPERS_TARGET_KERNEL_H
-#define TOPPERS_TARGET_KERNEL_H
-
-/*
- *  カーネル管理の割込み優先度の範囲
- *
- *  TMIN_INTPRIの定義を変更することで,このレベルよりも高い割込み優先度
- *  を持つものをカーネル管理外の割込みとするかを変更できる.
- *
- *  TMIN_INTPRIに設定できる値は,
- *   -(2^(TBIW_IPRI)) + (2^TBITW_SUBIPRI)) 〜 -1
- *  の範囲である.
- *  例えば優先度のビット幅(TBITW_IPRI)が8bit,そのうち,subpriorityのビット幅
- *  (TBITW_SUBIPRI) が1bitの場合は,-254 〜 -1 の範囲である.
- *  この場合,TMIN_INTPRIを -252 とすると,-253,-254の割込みがカーネル管理外
- *  となる.-254とすると,NMI以外はカーネル管理外の割込みは設けないことになる.
- *  なお,TMIN_INTPRIは,subpriorityに相当する部分は,'0'となるように指定する
- *  こと. 
- */
-#define TMIN_INTPRI            (-7)            /* 割込み優先度の最小値(最高値)*/
-
-/*
- *  サポートする機能の定義
- */
-#define TOPPERS_SUPPORT_GET_UTM                        /* get_utmをサポートする */
-
-/*
- *  タイムティックの定義
- */
-#define TIC_NUME   1U            /* タイムティックの周期の分子 */
-#define TIC_DENO   1U            /* タイムティックの周期の分母 */
-
-/*
- *  チップ依存で共通な定義
- */
-#include "arm_m_gcc/prc_kernel.h"
-
-#endif /* TOPPERS_TARGET_KERNEL_H */
diff --git a/asp/target/lm3s8962_gcc/target_rename.def b/asp/target/lm3s8962_gcc/target_rename.def
deleted file mode 100755 (executable)
index 22a1439..0000000
+++ /dev/null
@@ -1 +0,0 @@
-INCLUDE "arm_m_gcc/prc"
diff --git a/asp/target/lm3s8962_gcc/target_rename.h b/asp/target/lm3s8962_gcc/target_rename.h
deleted file mode 100755 (executable)
index 40764b4..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/* This file is generated from target_rename.def by genrename. */
-
-#ifndef TOPPERS_TARGET_RENAME_H
-#define TOPPERS_TARGET_RENAME_H
-
-
-#ifdef TOPPERS_LABEL_ASM
-
-
-#endif /* TOPPERS_LABEL_ASM */
-
-#include "arm_m_gcc/prc_rename.h"
-
-#endif /* TOPPERS_TARGET_RENAME_H */
diff --git a/asp/target/lm3s8962_gcc/target_serial.c b/asp/target/lm3s8962_gcc/target_serial.c
deleted file mode 100755 (executable)
index d593305..0000000
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- *  TOPPERS/ASP Kernel
- *      Toyohashi Open Platform for Embedded Real-Time Systems/
- *      Advanced Standard Profile Kernel
- * 
- *  Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
- *              Graduate School of Information Science, Nagoya Univ., JAPAN
- * 
- *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
- *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
- *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
- *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
- *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
- *      スコード中に含まれていること.
- *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
- *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
- *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
- *      の無保証規定を掲載すること.
- *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
- *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
- *      と.
- *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
- *        作権表示,この利用条件および下記の無保証規定を掲載すること.
- *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
- *        報告すること.
- *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
- *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
- *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
- *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
- *      免責すること.
- * 
- *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
- *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
- *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
- *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
- *  の責任を負わない.
- * 
- *  @(#) $Id: target_serial.c 1309 2008-08-27 07:48:51Z ertl-honda $
- */
-
-/*
- *  シリアルI/Oデバイス(SIO)ドライバ(LM3S8962用)
- */
-
-#include <kernel.h>
-#include <t_syslog.h>
-#include "target_serial.h"
-#include "hw_memmap.h"
-#include "hw_types.h"
-#include "uart.h"
-
-/*
- *  シリアルI/Oポート初期化ブロックの定義
- */
-typedef struct sio_port_initialization_block {
-       uint32_t base;
-       INTNO    intno;
-} SIOPINIB;
-
-/*
- *  シリアルI/Oポート管理ブロックの定義
- */
-struct sio_port_control_block {
-       const SIOPINIB  *p_siopinib;  /* シリアルI/Oポート初期化ブロック */
-       intptr_t        exinf;        /* 拡張情報 */
-       bool_t          opnflg;       /* オープン済みフラグ */
-};
-
-/*
- * シリアルI/Oポート初期化ブロック
- */
-const SIOPINIB siopinib_table[TNUM_SIOP] = {
-       {(uint32_t)UART0_BASE, (INTNO)INTNO_SIO}
-};
-
-/*
- *  シリアルI/Oポート管理ブロックのエリア
- */
-SIOPCB siopcb_table[TNUM_SIOP];
-
-/*
- *  シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
- */
-#define INDEX_SIOP(siopid)     ((uint_t)((siopid) - 1))
-#define get_siopcb(siopid)     (&(siopcb_table[INDEX_SIOP(siopid)]))
-
-/*
- *  SIOドライバの初期化
- */
-void
-sio_initialize(intptr_t exinf)
-{
-       SIOPCB  *p_siopcb;
-       uint_t  i;
-
-       /*
-        *  シリアルI/Oポート管理ブロックの初期化
-        */
-       for (p_siopcb = siopcb_table, i = 0; i < TNUM_SIOP; p_siopcb++, i++) {
-               p_siopcb->p_siopinib = &(siopinib_table[i]);
-               p_siopcb->opnflg = false;
-       }
-}
-
-
-/*
- *  シリアルI/Oポートのオープン
- */
-SIOPCB *
-sio_opn_por(ID siopid, intptr_t exinf)
-{
-       SIOPCB          *p_siopcb;
-       const SIOPINIB  *p_siopinib;
-       bool_t  opnflg;
-       ER      ercd;
-
-       p_siopcb = get_siopcb(siopid);
-       p_siopinib = p_siopcb->p_siopinib;
-
-       /*
-        *  オープンしたポートがあるかをopnflgに読んでおく.
-        */
-       opnflg = p_siopcb->opnflg;
-
-       p_siopcb->exinf = exinf;
-
-       /*
-        *  ハードウェアの初期化
-        */
-       UARTConfigSetExpClk(p_siopinib->base, SysCtlClockGet(), 115200,
-                                               (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
-                                                UART_CONFIG_PAR_NONE));
-
-       /*
-        *  シリアルI/O割込みのマスクを解除する.
-        */
-       if (!opnflg) {
-               ercd = ena_int(p_siopinib->intno);
-               assert(ercd == E_OK);
-       }
-
-       return(p_siopcb);
-}
-
-/*
- *  シリアルI/Oポートのクローズ
- */
-void
-sio_cls_por(SIOPCB *p_siopcb)
-{
-       /*
-        *  デバイス依存のクローズ処理.
-        */
-
-
-       /*
-        *  シリアルI/O割込みをマスクする.
-        */
-       if (!(p_siopcb->opnflg)) {
-               dis_int(p_siopcb->p_siopinib->intno);
-       }
-}
-
-/*
- *  SIOの割込みサービスルーチン
- */
-void
-sio_isr(intptr_t exinf)
-{
-       SIOPCB          *p_siopcb;
-
-       p_siopcb = get_siopcb(exinf);
-
-       /*
-        *  割込みのクリア
-        */
-       UARTIntClear(p_siopcb->p_siopinib->base,
-                                UARTIntStatus(p_siopcb->p_siopinib->base, true));
-
-       if (UARTCharsAvail(p_siopcb->p_siopinib->base)) {
-               /*
-                *  受信通知コールバックルーチンを呼び出す.
-                */
-               sio_irdy_rcv(p_siopcb->exinf);
-       }
-       if (UARTSpaceAvail(p_siopcb->p_siopinib->base)) {
-               /*
-                *  送信可能コールバックルーチンを呼び出す.
-                */
-               sio_irdy_snd(p_siopcb->exinf);
-       }
-}
-
-/*
- *  シリアルI/Oポートへの文字送信
- */
-bool_t
-sio_snd_chr(SIOPCB *p_siopcb, char c)
-{
-       if(UARTSpaceAvail(p_siopcb->p_siopinib->base)){
-               UARTCharPutNonBlocking(p_siopcb->p_siopinib->base, c);
-               return(true);
-       }
-       return(false);
-}
-
-/*
- *  シリアルI/Oポートからの文字受信
- */
-int_t
-sio_rcv_chr(SIOPCB *p_siopcb)
-{
-       if(UARTCharsAvail(p_siopcb->p_siopinib->base)){
-               return(UARTCharGetNonBlocking(p_siopcb->p_siopinib->base));
-       }
-       return(-1);
-}
-
-/*
- *  シリアルI/Oポートからのコールバックの許可
- */
-void
-sio_ena_cbr(SIOPCB *p_siopcb, uint_t cbrtn)
-{
-       switch (cbrtn) {
-         case SIO_RDY_SND:
-               UARTIntEnable(p_siopcb->p_siopinib->base, UART_INT_TX);
-               break;
-         case SIO_RDY_RCV:
-               UARTIntEnable(p_siopcb->p_siopinib->base, UART_INT_RX|UART_INT_RT);
-               break;
-       }
-}
-
-/*
- *  シリアルI/Oポートからのコールバックの禁止
- */
-void
-sio_dis_cbr(SIOPCB *p_siopcb, uint_t cbrtn)
-{
-       switch (cbrtn) {
-         case SIO_RDY_SND:
-               UARTIntDisable(p_siopcb->p_siopinib->base, UART_INT_TX);
-               break;
-         case SIO_RDY_RCV:
-               UARTIntDisable(p_siopcb->p_siopinib->base, UART_INT_RX|UART_INT_RT);
-               break;
-       }
-}
diff --git a/asp/target/lm3s8962_gcc/target_serial.cfg b/asp/target/lm3s8962_gcc/target_serial.cfg
deleted file mode 100755 (executable)
index 221601c..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- *  @(#) $Id: target_serial.cfg 1309 2008-08-27 07:48:51Z ertl-honda $
- */
-
-/*
- *  SIOドライバ(PL011用)のコンフィギュレーションファイル
- */
-
-#include "target_serial.h"
-ATT_INI({ TA_NULL, 0, sio_initialize });
-ATT_ISR({TA_NULL, 1, INTNO_SIO, sio_isr, 1});
-CFG_INT(INTNO_SIO, { INTATR_SIO, INTPRI_SIO });
-
diff --git a/asp/target/lm3s8962_gcc/target_serial.h b/asp/target/lm3s8962_gcc/target_serial.h
deleted file mode 100755 (executable)
index f8bcb27..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- *  TOPPERS/ASP Kernel
- *      Toyohashi Open Platform for Embedded Real-Time Systems/
- *      Advanced Standard Profile Kernel
- * 
- *  Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
- *              Graduate School of Information Science, Nagoya Univ., JAPAN
- * 
- *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
- *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
- *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
- *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
- *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
- *      スコード中に含まれていること.
- *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
- *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
- *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
- *      の無保証規定を掲載すること.
- *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
- *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
- *      と.
- *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
- *        作権表示,この利用条件および下記の無保証規定を掲載すること.
- *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
- *        報告すること.
- *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
- *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
- *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
- *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
- *      免責すること.
- * 
- *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
- *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
- *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
- *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
- *  の責任を負わない.
- * 
- *  @(#) $Id: target_serial.h 1309 2008-08-27 07:48:51Z ertl-honda $
- */
-
-/*
- *    シリアルI/Oデバイス(SIO)ドライバ
- */
-
-#ifndef TOPPERS_TARGET_SERIAL_H
-#define TOPPERS_TARGET_SERIAL_H
-
-#include "lm3s8962.h"
-#include "hw_ints.h"
-
-/*
- *  SIOの割込みハンドラのベクタ番号
- */
-#define INHNO_SIO       INT_UART0  /* 割込みハンドラ番号 */
-#define INTNO_SIO       INT_UART0  /* 割込み番号 */
-#define INTPRI_SIO       -3        /* 割込み優先度 */
-#define INTATR_SIO       0         /* 割込み属性 */
-
-#ifndef TOPPERS_MACRO_ONLY
-
-/*
- *  シリアルI/Oポート管理ブロックの定義
- */
-typedef struct sio_port_control_block    SIOPCB;
-
-/*
- *  コールバックルーチンの識別番号
- */
-#define SIO_RDY_SND    1U        /* 送信可能コールバック */
-#define SIO_RDY_RCV    2U        /* 受信通知コールバック */
-
-/*
- *  シリアルI/Oポート数の定義
- */
-#define TNUM_SIOP       1       /* サポートするシリアルI/Oポートの数 */
-
-/*
- *  SIOドライバの初期化
- */
-extern void sio_initialize(intptr_t exinf);
-
-/*
- *  シリアルI/Oポートのオープン
- */
-extern SIOPCB *sio_opn_por(ID siopid, intptr_t exinf);
-
-/*
- *  シリアルI/Oポートのクローズ
- */
-extern void sio_cls_por(SIOPCB *p_siopcb);
-
-/*
- *  SIOの割込みサービスルーチン
- */
-extern void sio_isr(intptr_t exinf);
-
-/*
- *  シリアルI/Oポートへの文字送信
- */
-extern bool_t sio_snd_chr(SIOPCB *p_siopcb, char c);
-
-/*
- *  シリアルI/Oポートからの文字受信
- */
-extern int_t sio_rcv_chr(SIOPCB *p_siopcb);
-
-/*
- *  シリアルI/Oポートからのコールバックの許可
- */
-extern void sio_ena_cbr(SIOPCB *p_siopcb, uint_t cbrtn);
-
-/*
- *  シリアルI/Oポートからのコールバックの禁止
- */
-extern void sio_dis_cbr(SIOPCB *p_siopcb, uint_t cbrtn);
-
-/*
- *  シリアルI/Oポートからの送信可能コールバック
- */
-extern void sio_irdy_snd(intptr_t exinf);
-
-/*
- *  シリアルI/Oポートからの受信通知コールバック
- */
-extern void sio_irdy_rcv(intptr_t exinf);
-
-#endif /* TOPPERS_MACRO_ONLY */
-#endif /* TOPPERS_TARGET_SERIAL_H */
diff --git a/asp/target/lm3s8962_gcc/target_stddef.h b/asp/target/lm3s8962_gcc/target_stddef.h
deleted file mode 100755 (executable)
index dc457b1..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  TOPPERS Software
- *      Toyohashi Open Platform for Embedded Real-Time Systems
- * 
- *  Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
- *              Graduate School of Information Science, Nagoya Univ., JAPAN
- * 
- *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
- *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
- *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
- *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
- *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
- *      スコード中に含まれていること.
- *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
- *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
- *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
- *      の無保証規定を掲載すること.
- *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
- *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
- *      と.
- *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
- *        作権表示,この利用条件および下記の無保証規定を掲載すること.
- *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
- *        報告すること.
- *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
- *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
- *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
- *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
- *      免責すること.
- * 
- *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
- *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
- *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
- *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
- *  の責任を負わない.
- * 
- *  @(#) $Id: target_stddef.h 1309 2008-08-27 07:48:51Z ertl-honda $
- */
-
-/*
- *  t_stddef.hのターゲット依存部(LM3S8962用)
- *
- *  このインクルードファイルは,t_stddef.hの先頭でインクルードされる.
- *  他のファイルからは直接インクルードすることはない.他のインクルード
- *  ファイルに先立って処理されるため,他のインクルードファイルに依存し
- *  てはならない.
- */
-
-#ifndef TOPPERS_TARGET_STDDEF_H
-#define TOPPERS_TARGET_STDDEF_H
-
-/*
- *  ターゲットを識別するためのマクロの定義
- */
-#define TOPPERS_LM3S8962                               /* システム略称 */
-
-/*
- *  開発環境で共通な定義
- *
- *  開発環境でstdint.hが用意されている場合には,TOPPERS_STDINT_TYPE1の
- *  マクロ定義を削除し,stdint.hをインクルードすればよい.
- */
-#define TOPPERS_STDINT_TYPE1
-#define TOPPERS_STDFLOAT_TYPE1
-#include "gcc/tool_stddef.h"
-
-/*
- *  プロセッサ依存で共通な定義
- */
-#include "arm_m_gcc/prc_stddef.h"
-
-
-#ifndef TOPPERS_MACRO_ONLY
-
-/*
- *  アサーションの失敗時の実行中断処理(T.B.D)
- */
-Inline void
-TOPPERS_assert_abort(void)
-{
-    
-}
-
-#endif /* TOPPERS_MACRO_ONLY */
-#endif /* TOPPERS_TARGET_STDDEF_H */
diff --git a/asp/target/lm3s8962_gcc/target_syssvc.h b/asp/target/lm3s8962_gcc/target_syssvc.h
deleted file mode 100755 (executable)
index 609c94d..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  TOPPERS/ASP Kernel
- *      Toyohashi Open Platform for Embedded Real-Time Systems/
- *      Advanced Standard Profile Kernel
- * 
- *  Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
- *              Graduate School of Information Science, Nagoya Univ., JAPAN
- * 
- *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
- *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
- *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
- *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
- *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
- *      スコード中に含まれていること.
- *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
- *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
- *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
- *      の無保証規定を掲載すること.
- *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
- *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
- *      と.
- *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
- *        作権表示,この利用条件および下記の無保証規定を掲載すること.
- *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
- *        報告すること.
- *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
- *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
- *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
- *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
- *      免責すること.
- * 
- *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
- *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
- *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
- *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
- *  の責任を負わない.
- * 
- *  @(#) $Id: target_syssvc.h 1309 2008-08-27 07:48:51Z ertl-honda $
- */
-
-/*
- *  システムサービスのターゲット依存部(LM3S8962用)
- *
- *  システムサービスのターゲット依存部のインクルードファイル.このファ
- *  イルの内容は,コンポーネント記述ファイルに記述され,このファイルは
- *  無くなる見込み.
- */
-
-#ifndef TOPPERS_TARGET_SYSSVC_H
-#define TOPPERS_TARGET_SYSSVC_H
-
-/*
- *  ターゲットシステムのハードウェア資源の定義
- */
-#include "lm3s8962.h"
-
-/*
- *  トレースログに関する設定
- */
-#ifdef TOPPERS_ENABLE_TRACE
-#include "logtrace/trace_config.h"
-#endif /* TOPPERS_ENABLE_TRACE */
-
-/*
- *  起動メッセージのターゲットシステム名
- */
-#define TARGET_NAME    "LM3S8962(ARM Cortex-M3)"
-
-/*
- *  システムログの低レベル出力のための文字出力
- *
- *  ターゲット依存の方法で,文字cを表示/出力/保存する.
- */
-extern void    target_fput_log(char_t c);
-
-/*
- *  サポートするシリアルポートの数
- */
-#define TNUM_PORT        1
-
-/*
- *  システムログタスク関連の定数の定義
- *
- *  デフォルト値の通り.
- */
-
-#endif /* TOPPERS_TARGET_SYSSVC_H */
diff --git a/asp/target/lm3s8962_gcc/target_test.h b/asp/target/lm3s8962_gcc/target_test.h
deleted file mode 100755 (executable)
index 5c9ac7b..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  TOPPERS/ASP Kernel
- *      Toyohashi Open Platform for Embedded Real-Time Systems/
- *      Advanced Standard Profile Kernel
- * 
- *  Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
- *              Graduate School of Information Science, Nagoya Univ., JAPAN
- * 
- *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
- *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
- *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
- *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
- *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
- *      スコード中に含まれていること.
- *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
- *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
- *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
- *      の無保証規定を掲載すること.
- *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
- *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
- *      と.
- *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
- *        作権表示,この利用条件および下記の無保証規定を掲載すること.
- *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
- *        報告すること.
- *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
- *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
- *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
- *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
- *      免責すること.
- * 
- *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
- *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
- *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
- *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
- *  の責任を負わない.
- * 
- *  @(#) $Id: target_test.h 1309 2008-08-27 07:48:51Z ertl-honda $
- */
-
-/*
- *             テストプログラムのターゲット依存定義(LM3S8962用)
- */
-
-#ifndef TOPPERS_TARGET_TEST_H
-#define TOPPERS_TARGET_TEST_H
-
-/*
- *  プロセッサ依存モジュール(ARM-M用)
- */
-#include "arm_m_gcc/prc_test.h"
-
-#endif /* TOPPERS_TARGET_TEST_H */
diff --git a/asp/target/lm3s8962_gcc/target_timer.cfg b/asp/target/lm3s8962_gcc/target_timer.cfg
deleted file mode 100755 (executable)
index 4d20e73..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- *  @(#) $Id: target_timer.cfg 1309 2008-08-27 07:48:51Z ertl-honda $
- */
-
-/*
- *    タイマドライバのコンフィギュレーションファイル
- */
-#include "target_timer.h"
-INCLUDE("arm_m_gcc/prc_timer.cfg");
diff --git a/asp/target/lm3s8962_gcc/target_timer.h b/asp/target/lm3s8962_gcc/target_timer.h
deleted file mode 100755 (executable)
index 83a079a..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  TOPPERS/ASP Kernel
- *      Toyohashi Open Platform for Embedded Real-Time Systems/
- *      Advanced Standard Profile Kernel
- * 
- *  Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
- *              Graduate School of Information Science, Nagoya Univ., JAPAN
- * 
- *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
- *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
- *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
- *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
- *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
- *      スコード中に含まれていること.
- *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
- *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
- *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
- *      の無保証規定を掲載すること.
- *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
- *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
- *      と.
- *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
- *        作権表示,この利用条件および下記の無保証規定を掲載すること.
- *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
- *        報告すること.
- *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
- *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
- *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
- *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
- *      免責すること.
- * 
- *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
- *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
- *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
- *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
- *  の責任を負わない.
- * 
- *  @(#) $Id: target_timer.h 1309 2008-08-27 07:48:51Z ertl-honda $
- */
-
-/*
- *  タイマドライバ(LM3S8962用)
- */
-
-#ifndef TOPPERS_TARGET_TIMER_H
-#define TOPPERS_TARGET_TIMER_H
-
-/*
- *  タイマ値の内部表現とミリ秒単位との変換
- */
-#define TIMER_CLOCK 50000
-
-/*
- *  タイマ割込みハンドラ登録のための定数
- */
-#define INTPRI_TIMER    (-6)          /* 割込み優先度 */
-#define INTATR_TIMER    0U            /* 割込み属性 */
-
-/*
- *  チップ依存モジュール(ARM-M用)
- */
-#include "arm_m_gcc/prc_timer.h"
-
-#endif /* TOPPERS_TARGET_TIMER_H */
diff --git a/asp/target/lm3s8962_gcc/target_unrename.h b/asp/target/lm3s8962_gcc/target_unrename.h
deleted file mode 100755 (executable)
index 52518b1..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-/* This file is generated from target_rename.def by genrename. */
-
-/* This file is included only when target_rename.h has been included. */
-#ifdef TOPPERS_TARGET_RENAME_H
-#undef TOPPERS_TARGET_RENAME_H
-
-
-#ifdef TOPPERS_LABEL_ASM
-
-
-#endif /* TOPPERS_LABEL_ASM */
-
-#include "arm_m_gcc/prc_unrename.h"
-
-#endif /* TOPPERS_TARGET_RENAME_H */
diff --git a/asp/target/lm3s8962_gcc/target_user.txt b/asp/target/lm3s8962_gcc/target_user.txt
deleted file mode 100755 (executable)
index d245fae..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-=====================================================================
-                              LM3S8962依存部
-                                  Last Modified: 27 Aug 2008 17:56:46
-=====================================================================
-
-(1) 対応しているターゲットシステムの種類・構成
-
-LM3S8962依存部は,LUMINARY MICRO社のLM3S8962をサポートしている.使用し
-ているリソースはSYSTICとUART0だけであるので,LUMINARY MICRO社の他のチ
-ップでも容易に動作する.チップ初期化やUARTに関するデバイスドライバは
-LUMINARY MICRO社 から提供されている,"Stellaris Peripheral Driver 
-Libary"を用いる.
-
-(2) 使用する開発環境と動作検証した条件(バージョン,オプション等)
-
-コンパイラはGCCを用いる動作確認に用いたコンパイラは以下の通りである.
-
-  gcc version 4.2.3 (Sourcery G++ Lite 2008q1-126)
-
-デバッグ環境は,LM3S8962を搭載したLUMINARY MICRO社の評価ボード 
-LM3S8962 Ethernet+CAN Evaluation Kits のデバッグモジュール経由でのフラ
-ッシュメモリへの書き込みとデバッグを確認した.
-
-(3) ターゲット定義事項の規定
-
-(3-1) 割込み優先度
-
-割込み優先度として指定可能な範囲は,-7 〜 -1 である.TMIN_INTPRIに-7よ
-り小さな値を設定することにより,カーネル管理外の割込みをサポートする.
-
-(4) メモリマップ
-
-プログラムはFLASHへデータはRAMへ配置する.配置を変更するには,
-lm3s8962_rom.ld を変更すること.
-
-(5) シリアルインタフェースドライバの情報
-
-シリアルインタフェースドライバでは,UART0を用いる.通信フォーマットは,
-115200bps, 8bit, non-parity, 1topbitである.
-
-(6) システムログ機能の情報
-
-システムログの低レベル出力は,UART0を用いる.通信フォーマットは,
-115200bps, 8bit, non-parity, 1topbitである.
-
-(7) ライブラリの指定
-
-"Stellaris Peripheral Driver Libary" に含まれる,libdriver.a と 
-libgr.a をリンク対象とする必要がある.指定方法は,Makefile.target の 
-LIBS に指定すればよい.
-
-(8) ディレクトリ構成・ファイル構成
-
- ./lm3s8962_gcc 
-   ./Makefile.target
-   ./lm3s8962.h
-   ./lm3s8962_ram.ld
-   ./lm3s8962_rom.ld
-   ./target.tf
-   ./target_cfg1_out.h
-   ./target_check.tf
-   ./target_config.c
-   ./target_config.h
-   ./target_def.csv
-   ./target_kernel.h
-   ./target_rename.def
-   ./target_rename.h
-   ./target_serial.c
-   ./target_serial.cfg
-   ./target_serial.h
-   ./target_sil.h
-   ./target_stddef.h
-   ./target_syssvc.h
-   ./target_test.h
-   ./target_timer.cfg
-   ./target_timer.h
-   ./target_unrename.h
-   ./target_user.txt
-
-(9) バージョン履歴
-
-2008/08/27
- ・ライブラリのリンク方法を明記.
-
-2008/07/11
- ・最初のリリース
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 2dce14b..908fbd1
@@ -33,6 +33,7 @@ xsns_xpnは,CPU例外が発生した状況が次の条件をすべて満たす
  ・タスクコンテキスト
  ・割込みロック解除状態
  ・CPUロック解除状態
+ ・割込み優先度マスク全解除状態
  ・タスク例外許可状態
 
 (J) xsns_dpnが正しい値を返すこと
@@ -99,13 +100,13 @@ CPU例外の発生する状況は,次のように分類することができ
 
 (7) (d-1)(e-1)(f-2) → タスク例外によるリカバリー可能
 
-(8) (d-2)(e-2)(f-2) â\86\92 ã\82¿ã\82¹ã\82¯ä¾\8bå¤\96ã\81«ã\82\88ã\82\8bã\83ªã\82«ã\83\90ã\83ªã\83¼å\8f¯è\83½
+(8) (d-2)(e-2)(f-2) â\86\92 ã\83ªã\82«ã\83\90ã\83ªã\83¼ä¸\8då\8f¯
        !(d-2)(e-1)(f-2)のテストは省く.
 
-(9) (d-3)(e-2)(f-2) â\86\92 ã\82¿ã\82¹ã\82¯ä¾\8bå¤\96ã\81«ã\82\88ã\82\8bã\83ªã\82«ã\83\90ã\83ªã\83¼å\8f¯è\83½
+(9) (d-3)(e-2)(f-2) â\86\92 ã\83ªã\82«ã\83\90ã\83ªã\83¼ä¸\8då\8f¯
        !(d-3)(e-1)(f-2)のテストは省く.
 
-(10) (d-4)(e-2)(f-2) â\86\92 ã\82¿ã\82¹ã\82¯ä¾\8bå¤\96ã\81«ã\82\88ã\82\8bã\83ªã\82«ã\83\90ã\83ªã\83¼å\8f¯è\83½
+(10) (d-4)(e-2)(f-2) â\86\92 ã\83ªã\82«ã\83\90ã\83ªã\83¼ä¸\8då\8f¯
        !(d-4)(e-1)(f-2)のテストは省く.
 
 (11) (d-1)(e-2)(f-2) → 両方法によるリカバリー可能
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 6183dbe..d338490
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  * 
- *  Copyright (C) 2007-2009 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2007-2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -34,7 +34,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: test_cpuexc10.c 1577 2009-05-31 14:30:51Z ertl-hiro $
+ *  @(#) $Id: test_cpuexc10.c 2005 2010-12-31 04:20:08Z ertl-hiro $
  */
 
 /* 
@@ -43,8 +43,7 @@
  * 【テストの目的】
  *
  *  割込み優先度マスク=TMIN_INTPRI-1,ディスパッチ許可状態,タスク例外
- *  許可状態で発生したCPU例外におけるシステム状態のテスト.タスク例外に
- *  よりリカバリーできることもテストする.
+ *  許可状態で発生したCPU例外におけるシステム状態のテスト.
  *
  *  このテストは,割込み優先度マスクをTMIN_INTPRI-1に設定できる場合のみ
  *  実施する.
  *     (C) CPU例外ハンドラ実行開始時にディスパッチ禁止フラグが変化しないこと
  *     (D) CPU例外ハンドラ実行開始時にタスク例外処理禁止フラグが変化しないこと
  *     (E) CPU例外ハンドラリターン時にCPUロックフラグが元に戻ること
+ *             !CPU例外ハンドラからリターンできる場合のみテストする.
  *     (F) CPU例外ハンドラリターン時に割込み優先度マスクが元に戻ること
+ *             !CPU例外ハンドラからリターンできる場合のみテストする.
  *     (G) CPU例外ハンドラリターン時にディスパッチ禁止フラグが変化しないこと
+ *             !CPU例外ハンドラからリターンできる場合のみテストする.
  *     (H) CPU例外ハンドラリターン時にタスク例外処理禁止フラグが変化しないこと
- *     (I) xsns_xpnがfalseを返すこと.ただし,trueを返すことも許されている
+ *             !CPU例外ハンドラからリターンできる場合のみテストする.
+ *     (I) xsns_xpnがtrueを返すこと
  *     (J) xsns_dpnがtrueを返すこと
- *     (L) タスク例外によるリカバリーができること
  *
  * 【使用リソース】
  *
  *
  * 【テストシーケンス】
  *
- *     == TASK1ï¼\88中å\84ªå\85\88度ï¼\8c\9b\9eç\9b®ï¼\89==
+ *     == TASK1(中優先度)==
  *     1:      状態のチェック
  *             chg_ipm(TMIN_INTPRI-1)
  *             ena_tex()
  *     2:      状態のチェック
  *             RAISE_CPU_EXCEPTION
  *     == CPUEXC1 ==
- *     3:      状態のチェック                           ... (A),(C),(D)
- *             xsns_xpn() == false                     ... (I)
- *             !trueであってもテストプログラムを続行する
+ *     3:      状態のチェック                           ... (A)(C)(D)
+ *             xsns_xpn() == true                      ... (I)
  *             xsns_dpn() == true                      ... (J)
- *  4: iras_tex(TASK1, 1U)
- *             iloc_cpu()
- *     リターン
- *     == TASK1のタスク例外処理ルーチン ==
- *     5:      状態のチェック                           ... (E),(F),(G),(H)
- *     6:      act_tsk(TASK1)                          ... (L)
- *     7:      ext_tsk()                                       ... (L)
- *     == TASK1(中優先度,2回目)==
- *     8:      状態のチェック                           ... (L)
- *     9:      テスト終了
+ *     4:      CPU例外ハンドラからリターンできない場合は,ここで終了
+ *     4:      リターン
+ *     == TASK1(続き)==
+ *     5:      状態のチェック                           ... (E)(F)(G)(H)
+ *     6:      テスト終了
  */
 
 #include <kernel.h>
 #include "kernel_cfg.h"
 #include "test_cpuexc.h"
 
-int_t  task1_count = 0;
-
 void
 task1(intptr_t exinf)
 {
        ER              ercd;
 
-       switch (++task1_count) {
-       case 1:
-               check_point(1);
-               check_state(false, false, TIPM_ENAALL, false, false, true);
-               ercd = chg_ipm(TMAX_INTPRI - 1);
-               if (ercd == E_PAR) {
-                       syslog_0(LOG_NOTICE, "This test program is not necessary.");
-                       ext_ker();
-               }
-               check_ercd(ercd, E_OK);
-               ercd = ena_tex();
-               check_ercd(ercd, E_OK);
-
-               check_point(2);
-               check_state(false, false, TMAX_INTPRI - 1, false, true, false);
-               RAISE_CPU_EXCEPTION;
-
-               check_point(0);
-               break;
+       check_point(1);
+       check_state(false, false, TIPM_ENAALL, false, false, true);
+       ercd = chg_ipm(TMAX_INTPRI - 1);
+       if (ercd == E_PAR) {
+               syslog_0(LOG_NOTICE, "This test program is not necessary.");
+               ext_ker();
+       }
+       check_ercd(ercd, E_OK);
+       ercd = ena_tex();
+       check_ercd(ercd, E_OK);
 
-       case 2:
-               check_point(8);
-               check_state(false, false, TIPM_ENAALL, false, false, true);
+       check_point(2);
+       check_state(false, false, TMAX_INTPRI - 1, false, true, false);
+       RAISE_CPU_EXCEPTION;
 
-               check_finish(9);
-               break;
+       check_point(5);
+       check_state(false, false, TMAX_INTPRI - 1, false, true, false);
 
-       default:
-               check_point(0);
-               break;
-       }
+       check_finish(6);
 }
 
 void
 tex_task1(TEXPTN texptn, intptr_t exinf)
 {
-       ER              ercd;
-
-       check_point(5);
-       check_state(false, false, TMAX_INTPRI - 1, false, true, true);
-
-       check_point(6);
-       ercd = act_tsk(TASK1);
-       check_ercd(ercd, E_OK);
-
-       check_point(7);
-       ercd = ext_tsk();
-       check_ercd(ercd, E_OK);
-
        check_point(0);
 }
 
@@ -178,18 +147,14 @@ alarm1_handler(intptr_t exinf)
 void
 cpuexc_handler(void *p_excinf)
 {
-       ER              ercd;
-
        check_point(3);
        check_state_i(true, false, false, true, false);
-       if (xsns_xpn(p_excinf) == true) {
-               syslog_0(LOG_WARNING, "xsns_xpn returns true.");
-       }
+       check_assert(xsns_xpn(p_excinf) == true);
        check_assert(xsns_dpn(p_excinf) == true);
 
+#ifdef CANNOT_RETURN_CPUEXC
+       check_finish(4);
+#endif /* CANNOT_RETURN_CPUEXC */
+
        check_point(4);
-       ercd = iras_tex(TASK1, 1U);
-       check_ercd(ercd, E_OK);
-       ercd = iloc_cpu();
-       check_ercd(ercd, E_OK);
 }
old mode 100755 (executable)
new mode 100644 (file)
index 3e459e9..2dd5a1f
@@ -34,7 +34,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: test_cpuexc11.c 1577 2009-05-31 14:30:51Z ertl-hiro $
+ *  @(#) $Id: test_cpuexc11.c 2005 2010-12-31 04:20:08Z ertl-hiro $
  */
 
 /* 
  *     2:      状態のチェック
  *             RAISE_CPU_EXCEPTION
  *     == CPUEXC1(1回目)==
- *     3:      状態のチェック                           ... (A),(C),(D)
+ *     3:      状態のチェック                           ... (A)(C)(D)
  *             xsns_xpn() == false                     ... (I)
  *             xsns_dpn() == false                     ... (J)
  *     4:      iact_tsk(TASK2)
  *             iloc_cpu()
  *             リターン
  *     == TASK2(高優先度)==
- *     5:      状態のチェック                           ... (E),(F),(G),(H)
+ *     5:      状態のチェック                           ... (E)(F)(G)(H)
  *     6:      ter_tsk(TASK1)                          ... (K)
  *     7:      act_tsk(TASK1)                          ... (K)
  *     8:      ext_tsk()
  *     10:     状態のチェック
  *             RAISE_CPU_EXCEPTION
  *     == CPUEXC1(2回目)==
- *     11:     状態のチェック                           ... (A),(C),(D)
+ *     11:     状態のチェック                           ... (A)(C)(D)
  *             xsns_xpn() == false                     ... (I)
  *             xsns_dpn() == false                     ... (J)
  *     12:     iras_tex(TASK1, 1U)
  *             iloc_cpu()
  *             リターン
  *     == TASK1のタスク例外処理ルーチン ==
- *     13:     状態のチェック                           ... (E),(F),(G),(H)
+ *     13:     状態のチェック                           ... (E)(F)(G)(H)
  *     14:     act_tsk(TASK1)                          ... (L)
  *     15:     ext_tsk()                                       ... (L)
  *     == TASK1(中優先度,3回目)==
old mode 100755 (executable)
new mode 100644 (file)
index f84fe3d..1c4cd93
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  * 
- *  Copyright (C) 2007-2009 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2007-2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -34,7 +34,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: test_cpuexc12.c 1577 2009-05-31 14:30:51Z ertl-hiro $
+ *  @(#) $Id: test_cpuexc12.c 2005 2010-12-31 04:20:08Z ertl-hiro $
  */
 
 /* 
  *     2:      状態のチェック
  *             RAISE_CPU_EXCEPTION
  *     == CPUEXC1 ==
- *     3:      状態のチェック                           ... (A),(C),(D)
+ *     3:      状態のチェック                           ... (A)(C)(D)
  *             xsns_xpn() == true                      ... (I)
  *             xsns_dpn() == true                      ... (J)
  *     4:      CPU例外ハンドラからリターンできない場合は,ここで終了
- *     4:      iloc_cpu()
- *             リターン
+ *     4:      リターン
  *     == TASK1(続き)==
  *     5:      状態のチェック                           ... (E)(F)(G)(H)
  *     6:      テスト終了
@@ -138,8 +137,6 @@ alarm1_handler(intptr_t exinf)
 void
 cpuexc_handler(void *p_excinf)
 {
-       ER              ercd;
-
        check_point(3);
        check_state_i(true, false, true, true, true);
        check_assert(xsns_xpn(p_excinf) == true);
@@ -150,6 +147,4 @@ cpuexc_handler(void *p_excinf)
 #endif /* CANNOT_RETURN_CPUEXC */
 
        check_point(4);
-       ercd = iloc_cpu();
-       check_ercd(ercd, E_OK);
 }
old mode 100755 (executable)
new mode 100644 (file)
index 284b137..9d5e727
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  * 
- *  Copyright (C) 2007-2009 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2007-2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -34,7 +34,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: test_cpuexc13.c 1577 2009-05-31 14:30:51Z ertl-hiro $
+ *  @(#) $Id: test_cpuexc13.c 2005 2010-12-31 04:20:08Z ertl-hiro $
  */
 
 /* 
  *     2:      状態のチェック
  *             RAISE_CPU_EXCEPTION
  *     == CPUEXC1 ==
- *     3:      状態のチェック                           ... (A),(C),(D)
+ *     3:      状態のチェック                           ... (A)(C)(D)
  *             xsns_xpn() == true                      ... (I)
  *             xsns_dpn() == true                      ... (J)
  *     4:      CPU例外ハンドラからリターンできない場合は,ここで終了
- *     4:      iloc_cpu()
- *             リターン
+ *     4:      リターン
  *     == TASK1(続き)==
  *     5:      状態のチェック                           ... (E)(F)(G)(H)
  *     6:      テスト終了
@@ -138,8 +137,6 @@ alarm1_handler(intptr_t exinf)
 void
 cpuexc_handler(void *p_excinf)
 {
-       ER              ercd;
-
        check_point(3);
        check_state_i(true, false, false, true, true);
        check_assert(xsns_xpn(p_excinf) == true);
@@ -150,6 +147,4 @@ cpuexc_handler(void *p_excinf)
 #endif /* CANNOT_RETURN_CPUEXC */
 
        check_point(4);
-       ercd = iloc_cpu();
-       check_ercd(ercd, E_OK);
 }
old mode 100755 (executable)
new mode 100644 (file)
index c686301..39e44a4
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  * 
- *  Copyright (C) 2007-2009 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2007-2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -34,7 +34,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: test_cpuexc2.c 1577 2009-05-31 14:30:51Z ertl-hiro $
+ *  @(#) $Id: test_cpuexc2.c 2005 2010-12-31 04:20:08Z ertl-hiro $
  */
 
 /* 
@@ -92,8 +92,7 @@
  *             xsns_xpn() == true                      ... (I)
  *             xsns_dpn() == true                      ... (J)
  *     5:      CPU例外ハンドラからリターンできない場合は,ここで終了
- *     5:      iunl_cpu()
- *             リターン
+ *     5:      リターン
  *     == ALM1(続き)==
  *     6:      状態のチェック                           ... (E)(G)(H)
  *             リターン
@@ -166,8 +165,6 @@ alarm1_handler(intptr_t exinf)
 void
 cpuexc_handler(void *p_excinf)
 {
-       ER              ercd;
-
        check_point(4);
        check_state_i(true, true, true, true, false);
        check_assert(xsns_xpn(p_excinf) == true);
@@ -178,6 +175,4 @@ cpuexc_handler(void *p_excinf)
 #endif /* CANNOT_RETURN_CPUEXC */
 
        check_point(5);
-       ercd = iunl_cpu();
-       check_ercd(ercd, E_OK);
 }
old mode 100755 (executable)
new mode 100644 (file)
index d09e4bf..969e54a
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  * 
- *  Copyright (C) 2007-2009 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2007-2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -34,7 +34,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: test_cpuexc3.c 1577 2009-05-31 14:30:51Z ertl-hiro $
+ *  @(#) $Id: test_cpuexc3.c 2005 2010-12-31 04:20:08Z ertl-hiro $
  */
 
 /* 
  *     3:      状態のチェック
  *             RAISE_CPU_EXCEPTION
  *     == CPUEXC1 ==
- *     4:      状態のチェック                           ... (A),(C),(D)
+ *     4:      状態のチェック                           ... (A)(C)(D)
  *             xsns_xpn() == true                      ... (I)
  *             xsns_dpn() == true                      ... (J)
  *     5:      CPU例外ハンドラからリターンできない場合は,ここで終了
- *     5:      iloc_cpu()
- *             リターン
+ *     5:      リターン
  *     == ALM1(続き)==
  *     6:      状態のチェック                           ... (E)(G)(H)
  *             リターン
@@ -161,8 +160,6 @@ alarm1_handler(intptr_t exinf)
 void
 cpuexc_handler(void *p_excinf)
 {
-       ER              ercd;
-
        check_point(4);
        check_state_i(true, false, true, true, false);
        check_assert(xsns_xpn(p_excinf) == true);
@@ -173,6 +170,4 @@ cpuexc_handler(void *p_excinf)
 #endif /* CANNOT_RETURN_CPUEXC */
 
        check_point(5);
-       ercd = iloc_cpu();
-       check_ercd(ercd, E_OK);
 }
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 10c2e8c..4fe9220
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  * 
- *  Copyright (C) 2007-2009 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2007-2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -34,7 +34,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: test_cpuexc8.c 1577 2009-05-31 14:30:51Z ertl-hiro $
+ *  @(#) $Id: test_cpuexc8.c 2005 2010-12-31 04:20:08Z ertl-hiro $
  */
 
 /* 
@@ -43,8 +43,7 @@
  * 【テストの目的】
  *
  *  割込み優先度マスク=TMAX_INTPRI,ディスパッチ許可状態,タスク例外許
- *  可状態で発生したCPU例外におけるシステム状態のテスト.タスク例外によ
- *  りリカバリーできることもテストする.
+ *  可状態で発生したCPU例外におけるシステム状態のテスト.
  *
  *  このテストは,TMAX_INTPRIとTMIN_INTPRIが異なる場合のみ実施する.
  *
  *     (C) CPU例外ハンドラ実行開始時にディスパッチ禁止フラグが変化しないこと
  *     (D) CPU例外ハンドラ実行開始時にタスク例外処理禁止フラグが変化しないこと
  *     (E) CPU例外ハンドラリターン時にCPUロックフラグが元に戻ること
+ *             !CPU例外ハンドラからリターンできる場合のみテストする.
  *     (F) CPU例外ハンドラリターン時に割込み優先度マスクが元に戻ること
+ *             !CPU例外ハンドラからリターンできる場合のみテストする.
  *     (G) CPU例外ハンドラリターン時にディスパッチ禁止フラグが変化しないこと
+ *             !CPU例外ハンドラからリターンできる場合のみテストする.
  *     (H) CPU例外ハンドラリターン時にタスク例外処理禁止フラグが変化しないこと
- *     (I) xsns_xpnがfalseを返すこと
+ *             !CPU例外ハンドラからリターンできる場合のみテストする.
+ *     (I) xsns_xpnがtrueを返すこと
  *     (J) xsns_dpnがtrueを返すこと
- *     (L) タスク例外によるリカバリーができること
  *
  * 【使用リソース】
  *
  *
  * 【テストシーケンス】
  *
- *     == TASK1ï¼\88中å\84ªå\85\88度ï¼\8c\9b\9eç\9b®ï¼\89==
+ *     == TASK1(中優先度)==
  *     1:      状態のチェック
  *             chg_ipm(TMAX_INTPRI)
  *             ena_tex()
  *     2:      状態のチェック
  *             RAISE_CPU_EXCEPTION
  *     == CPUEXC1 ==
- *     3:      状態のチェック                           ... (A),(C),(D)
- *             xsns_xpn() == false                     ... (I)
+ *     3:      状態のチェック                           ... (A)(C)(D)
+ *             xsns_xpn() == true                      ... (I)
  *             xsns_dpn() == true                      ... (J)
- *  4: iras_tex(TASK1, 1U)
- *             iloc_cpu()
- *     リターン
- *     == TASK1のタスク例外処理ルーチン ==
- *     5:      状態のチェック                           ... (E),(F),(G),(H)
- *     6:      act_tsk(TASK1)                          ... (L)
- *     7:      ext_tsk()                                       ... (L)
- *     == TASK1(中優先度,2回目)==
- *     8:      状態のチェック                           ... (L)
- *     9:      テスト終了
+ *     4:      CPU例外ハンドラからリターンできない場合は,ここで終了
+ *     4:      リターン
+ *     == TASK1(続き)==
+ *     5:      状態のチェック                           ... (E)(F)(G)(H)
+ *     6:      テスト終了
  */
 
 #include <kernel.h>
 #include "kernel_cfg.h"
 #include "test_cpuexc.h"
 
-int_t  task1_count = 0;
-
 void
 task1(intptr_t exinf)
 {
        ER              ercd;
 
-       switch (++task1_count) {
-       case 1:
-               if (TMAX_INTPRI == TMIN_INTPRI) {
-                       syslog_0(LOG_NOTICE, "This test program is not necessary.");
-                       ext_ker();
-               }
-
-               check_point(1);
-               check_state(false, false, TIPM_ENAALL, false, false, true);
-               ercd = chg_ipm(TMAX_INTPRI);
-               check_ercd(ercd, E_OK);
-               ercd = ena_tex();
-               check_ercd(ercd, E_OK);
-
-               check_point(2);
-               check_state(false, false, TMAX_INTPRI, false, true, false);
-               RAISE_CPU_EXCEPTION;
+       if (TMAX_INTPRI == TMIN_INTPRI) {
+               syslog_0(LOG_NOTICE, "This test program is not necessary.");
+               ext_ker();
+       }
 
-               check_point(0);
-               break;
+       check_point(1);
+       check_state(false, false, TIPM_ENAALL, false, false, true);
+       ercd = chg_ipm(TMAX_INTPRI);
+       check_ercd(ercd, E_OK);
+       ercd = ena_tex();
+       check_ercd(ercd, E_OK);
 
-       case 2:
-               check_point(8);
-               check_state(false, false, TIPM_ENAALL, false, false, true);
+       check_point(2);
+       check_state(false, false, TMAX_INTPRI, false, true, false);
+       RAISE_CPU_EXCEPTION;
 
-               check_finish(9);
-               break;
+       check_point(5);
+       check_state(false, false, TMAX_INTPRI, false, true, false);
 
-       default:
-               check_point(0);
-               break;
-       }
+       check_finish(6);
 }
 
 void
 tex_task1(TEXPTN texptn, intptr_t exinf)
 {
-       ER              ercd;
-
-       check_point(5);
-       check_state(false, false, TMAX_INTPRI, false, true, true);
-
-       check_point(6);
-       ercd = act_tsk(TASK1);
-       check_ercd(ercd, E_OK);
-
-       check_point(7);
-       ercd = ext_tsk();
-       check_ercd(ercd, E_OK);
-
        check_point(0);
 }
 
@@ -177,16 +147,14 @@ alarm1_handler(intptr_t exinf)
 void
 cpuexc_handler(void *p_excinf)
 {
-       ER              ercd;
-
        check_point(3);
        check_state_i(true, false, false, true, false);
-       check_assert(xsns_xpn(p_excinf) == false);
+       check_assert(xsns_xpn(p_excinf) == true);
        check_assert(xsns_dpn(p_excinf) == true);
 
+#ifdef CANNOT_RETURN_CPUEXC
+       check_finish(4);
+#endif /* CANNOT_RETURN_CPUEXC */
+
        check_point(4);
-       ercd = iras_tex(TASK1, 1U);
-       check_ercd(ercd, E_OK);
-       ercd = iloc_cpu();
-       check_ercd(ercd, E_OK);
 }
old mode 100755 (executable)
new mode 100644 (file)
index a42fcec..8d18cb1
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  * 
- *  Copyright (C) 2007-2009 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2007-2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -34,7 +34,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: test_cpuexc9.c 1577 2009-05-31 14:30:51Z ertl-hiro $
+ *  @(#) $Id: test_cpuexc9.c 2005 2010-12-31 04:20:08Z ertl-hiro $
  */
 
 /* 
@@ -43,8 +43,7 @@
  * 【テストの目的】
  *
  *  割込み優先度マスク=TMIN_INTPRI,ディスパッチ許可状態,タスク例外許
- *  可状態で発生したCPU例外におけるシステム状態のテスト.タスク例外によ
- *  りリカバリーできることもテストする.
+ *  可状態で発生したCPU例外におけるシステム状態のテスト.
  *
  * 【テスト項目】
  *
  *     (C) CPU例外ハンドラ実行開始時にディスパッチ禁止フラグが変化しないこと
  *     (D) CPU例外ハンドラ実行開始時にタスク例外処理禁止フラグが変化しないこと
  *     (E) CPU例外ハンドラリターン時にCPUロックフラグが元に戻ること
+ *             !CPU例外ハンドラからリターンできる場合のみテストする.
  *     (F) CPU例外ハンドラリターン時に割込み優先度マスクが元に戻ること
+ *             !CPU例外ハンドラからリターンできる場合のみテストする.
  *     (G) CPU例外ハンドラリターン時にディスパッチ禁止フラグが変化しないこと
+ *             !CPU例外ハンドラからリターンできる場合のみテストする.
  *     (H) CPU例外ハンドラリターン時にタスク例外処理禁止フラグが変化しないこと
- *     (I) xsns_xpnがfalseを返すこと.ただし,trueを返すことも許されている
+ *             !CPU例外ハンドラからリターンできる場合のみテストする.
+ *     (I) xsns_xpnがtrueを返すこと
  *     (J) xsns_dpnがtrueを返すこと
- *     (L) タスク例外によるリカバリーができること
  *
  * 【使用リソース】
  *
  *
  * 【テストシーケンス】
  *
- *     == TASK1ï¼\88中å\84ªå\85\88度ï¼\8c\9b\9eç\9b®ï¼\89==
+ *     == TASK1(中優先度)==
  *     1:      状態のチェック
  *             chg_ipm(TMIN_INTPRI)
  *             ena_tex()
  *     2:      状態のチェック
  *             RAISE_CPU_EXCEPTION
  *     == CPUEXC1 ==
- *     3:      状態のチェック                           ... (A),(C),(D)
- *             xsns_xpn() == false                     ... (I)
- *             !trueであってもテストプログラムを続行する
+ *     3:      状態のチェック                           ... (A)(C)(D)
+ *             xsns_xpn() == true                      ... (I)
  *             xsns_dpn() == true                      ... (J)
- *  4: iras_tex(TASK1, 1U)
- *             iloc_cpu()
- *     リターン
- *     == TASK1のタスク例外処理ルーチン ==
- *     5:      状態のチェック                           ... (E),(F),(G),(H)
- *     6:      act_tsk(TASK1)                          ... (L)
- *     7:      ext_tsk()                                       ... (L)
- *     == TASK1(中優先度,2回目)==
- *     8:      状態のチェック                           ... (L)
- *     9:      テスト終了
+ *     4:      CPU例外ハンドラからリターンできない場合は,ここで終了
+ *     4:      リターン
+ *     == TASK1(続き)==
+ *     5:      状態のチェック                           ... (E)(F)(G)(H)
+ *     6:      テスト終了
  */
 
 #include <kernel.h>
 #include "kernel_cfg.h"
 #include "test_cpuexc.h"
 
-int_t  task1_count = 0;
-
 void
 task1(intptr_t exinf)
 {
        ER              ercd;
 
-       switch (++task1_count) {
-       case 1:
-               check_point(1);
-               check_state(false, false, TIPM_ENAALL, false, false, true);
-               ercd = chg_ipm(TMAX_INTPRI);
-               check_ercd(ercd, E_OK);
-               ercd = ena_tex();
-               check_ercd(ercd, E_OK);
-
-               check_point(2);
-               check_state(false, false, TMAX_INTPRI, false, true, false);
-               RAISE_CPU_EXCEPTION;
-
-               check_point(0);
-               break;
+       check_point(1);
+       check_state(false, false, TIPM_ENAALL, false, false, true);
+       ercd = chg_ipm(TMIN_INTPRI);
+       check_ercd(ercd, E_OK);
+       ercd = ena_tex();
+       check_ercd(ercd, E_OK);
 
-       case 2:
-               check_point(8);
-               check_state(false, false, TIPM_ENAALL, false, false, true);
+       check_point(2);
+       check_state(false, false, TMIN_INTPRI, false, true, false);
+       RAISE_CPU_EXCEPTION;
 
-               check_finish(9);
-               break;
+       check_point(5);
+       check_state(false, false, TMIN_INTPRI, false, true, false);
 
-       default:
-               check_point(0);
-               break;
-       }
+       check_finish(6);
 }
 
 void
 tex_task1(TEXPTN texptn, intptr_t exinf)
 {
-       ER              ercd;
-
-       check_point(5);
-       check_state(false, false, TMAX_INTPRI, false, true, true);
-
-       check_point(6);
-       ercd = act_tsk(TASK1);
-       check_ercd(ercd, E_OK);
-
-       check_point(7);
-       ercd = ext_tsk();
-       check_ercd(ercd, E_OK);
-
        check_point(0);
 }
 
@@ -171,18 +140,14 @@ alarm1_handler(intptr_t exinf)
 void
 cpuexc_handler(void *p_excinf)
 {
-       ER              ercd;
-
        check_point(3);
        check_state_i(true, false, false, true, false);
-       if (xsns_xpn(p_excinf) == true) {
-               syslog_0(LOG_WARNING, "xsns_xpn returns true.");
-       }
+       check_assert(xsns_xpn(p_excinf) == true);
        check_assert(xsns_dpn(p_excinf) == true);
 
+#ifdef CANNOT_RETURN_CPUEXC
+       check_finish(4);
+#endif /* CANNOT_RETURN_CPUEXC */
+
        check_point(4);
-       ercd = iras_tex(TASK1, 1U);
-       check_ercd(ercd, E_OK);
-       ercd = iloc_cpu();
-       check_ercd(ercd, E_OK);
 }
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index bb45190..78b46dc
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  * 
- *  Copyright (C) 2006-2009 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2006-2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -34,7 +34,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: test_sysstat1.c 1652 2009-10-10 18:01:05Z ertl-hiro $
+ *  @(#) $Id: test_sysstat1.c 2006 2010-12-31 04:20:56Z ertl-hiro $
  */
 
 /* 
  *     8:      ena_dsp()
  *     9:      dis_tex()
  *     10:     dis_dsp() ... タスク例外処理ルーチンを呼び出す準備
- *             chg_ipm(TMIN_INTPRI)
  *             ena_tex()
  *     11:     ras_tex(TSK_SELF, 0x0001)
  *     == TASK1タスク例外処理ルーチン(1回目)==
  *     12:     初期状態のチェック
  *     13:     ena_dsp() ... 3つの状態を変化させ,リターンで元にもどるか調べる
- *             chg_ipm(TIPM_ENAALL)
+ *             chg_ipm(TMIN_INTPRI)
  *             ena_tex()
  *             リターン
  *     == TASK1(続き)==
@@ -86,7 +85,7 @@ tex_task1(TEXPTN texptn, intptr_t exinf)
        switch (texptn) {
        case 0x0001:
                check_point(12);
-               check_state(false, false, TMIN_INTPRI, true, true, true);
+               check_state(false, false, TIPM_ENAALL, true, true, true);
 
                /*
                 *  ディスパッチ許可,割込み優先度マスク変更,タスク例外処理許可
@@ -94,11 +93,11 @@ tex_task1(TEXPTN texptn, intptr_t exinf)
                check_point(13);
                ercd = ena_dsp();
                check_ercd(ercd, E_OK);
-               ercd = chg_ipm(TIPM_ENAALL);
+               ercd = chg_ipm(TMIN_INTPRI);
                check_ercd(ercd, E_OK);
                ercd = ena_tex();
                check_ercd(ercd, E_OK);
-               check_state(false, false, TIPM_ENAALL, false, false, false);
+               check_state(false, false, TMIN_INTPRI, false, true, false);
                break;
 
        default:
@@ -190,16 +189,14 @@ task1(intptr_t exinf)
        check_state(false, false, TIPM_ENAALL, false, false, true);
 
        /*
-        *  ディスパッチ禁止,割込み優先度マスク変更,タスク例外処理許可
+        *  ディスパッチ禁止,タスク例外処理許可
         */
        check_point(10);
        ercd = dis_dsp();
        check_ercd(ercd, E_OK);
-       ercd = chg_ipm(TMIN_INTPRI);
-       check_ercd(ercd, E_OK);
        ercd = ena_tex();
        check_ercd(ercd, E_OK);
-       check_state(false, false, TMIN_INTPRI, true, true, false);
+       check_state(false, false, TIPM_ENAALL, true, true, false);
 
        /*
         *  タスク例外処理を要求
@@ -214,7 +211,7 @@ task1(intptr_t exinf)
         *  チェック
         */
        check_point(14);
-       check_state(false, false, TMIN_INTPRI, true, true, false);
+       check_state(false, false, TIPM_ENAALL, true, true, false);
 
        /*
         *  CPUロック状態に
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index f1b5870..9c719ed
@@ -2,7 +2,7 @@
  *  TOPPERS Software
  *      Toyohashi Open Platform for Embedded Real-Time Systems
  * 
- *  Copyright (C) 2006-2009 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2006-2010 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
@@ -34,7 +34,7 @@
  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
  *  の責任を負わない.
  * 
- *  @(#) $Id: test_tex1.c 1577 2009-05-31 14:30:51Z ertl-hiro $
+ *  @(#) $Id: test_tex1.c 2007 2010-12-31 05:48:15Z ertl-hiro $
  */
 
 /* 
  *
  * 【テスト項目】
  *
- *     (A) ras_tex,ref_texのエラー検出
+ *     (A) ras_texのエラー検出
  *             (A-1) 対象タスクが休止状態
  *             (A-2) 対象タスクのタスク例外処理ルーチンが定義されていない
- *     (B) dis_tex,ena_texのエラー検出
+ *     (B) dis_texのエラー検出
  *             (B-1) 自タスクのタスク例外処理ルーチンが定義されていない
- *     (C) ras_texの正常処理
- *             (C-1) 対象タスクが自タスクかつタスク例外処理許可で,すぐに起動
- *             (C-2) 対象タスクが自タスクでない
- *             (C-3) 対象タスクが自タスクだがタスク例外処理禁止
- *     (D) ena_texの正常処理
- *             (D-1) タスク例外処理要求があり,すぐに起動
- *             (D-2) タスク例外処理要求がない
- *     (E) タスクディスパッチャによる起動
- *             (E-1) ディスパッチ後のタスクがタスク例外許可でタスク例外処理要
+ *     (C) ena_texのエラー検出
+ *             (C-1) 自タスクのタスク例外処理ルーチンが定義されていない
+ *     (D) ref_texのエラー検出
+ *             (D-1) 対象タスクが休止状態
+ *             (D-2) 対象タスクのタスク例外処理ルーチンが定義されていない
+ *     (E) ras_texの正常処理
+ *             (E-1) 対象タスクが自タスク,タスク例外処理許可,かつ割込み優先
+ *                       度マスク全解除状態で,すぐに実行開始
+ *             (E-2) 対象タスクが自タスクでない
+ *             (E-3) 対象タスクが自タスクだが,タスク例外処理禁止
+ *             (E-4) 対象タスクが自タスクでタスク例外処理許可だが,割込み優先
+ *                       度マスクが全解除でない
+ *     (F) ena_texの正常処理
+ *             (F-1) タスク例外処理要求があり,かつ割込み優先度マスク全解除状
+ *                       態で,すぐに実行開始
+ *             (F-2) タスク例外処理要求がない
+ *             (F-3) タスク例外処理要求があるが,割込み優先度マスクが全解除で
+ *                       ない
+ *     (G) chg_ipmの正常処理
+ *             (G-1) タスク例外処理要求があり,かつタスク例外処理許可で,すぐ
+ *                       に実行開始
+ *             (G-2) タスク例外処理要求がない
+ *             (G-3) タスク例外処理要求があるが,タスク例外処理禁止
+ *     (H) タスクディスパッチャによる起動
+ *             (H-1) ディスパッチ後のタスクがタスク例外許可でタスク例外処理要
  *                       求あり
- *     (F) タスク例外処理ルーチンからのリターンによる起動(連続起動)
- *     (G) タスク例外処理ルーチンからの戻り時による状態復帰
- *             (G-1) タスクに戻ってくる時
- *             (G-2) タスク例外処理ルーチンが連続起動される時
- *     (H) タスク例外処理ルーチンの多重起動
- *     (I) タスク例外処理ルーチンからの戻り時のタスク切換え
+ *     (I) タスク例外処理ルーチンからのリターンによる起動(連続起動)
+ *     (J) タスク例外処理ルーチンからの戻り時による状態復帰
+ *             (J-1) タスクに戻ってくる時
+ *             (J-2) タスク例外処理ルーチンが連続起動される時
+ *     (K) タスク例外処理ルーチンの多重起動
+ *     (L) タスク例外処理ルーチンからの戻り時のタスク切換え
  *
  * 【使用リソース】
  *
  *     == TASK1(優先度:10)==
  *     1:      初期状態のチェック
  *             ref_tex(TSK_SELF, &rtex)
- *             ras_tex(TASK3, 0x0001)          ... (A-2)
- *             ras_tex(TASK4, 0x0001)          ... (A-1)
- *             ref_tex(TASK3, &rtex)           ... (A-2)
- *             ref_tex(TASK4, &rtex)           ... (A-1)
- *     2:      ena_tex()                                       ... (D-2)
+ *             ras_tex(TASK3, 0x0001) -> E_OBJ         ... (A-2)
+ *             ras_tex(TASK4, 0x0001) -> E_OBJ         ... (A-1)
+ *             ref_tex(TASK3, &rtex) -> E_OBJ          ... (D-2)
+ *             ref_tex(TASK4, &rtex) -> E_OBJ          ... (D-1)
+ *     2:      ena_tex()                                                       ... (F-2)
  *             ref_tex(TSK_SELF, &rtex)
- *     3:      ras_tex(TSK_SELF, 0x0001)       ... (C-1)
+ *     3:      ras_tex(TSK_SELF, 0x0001)                       ... (E-1)
  *     == TASK1タスク例外処理ルーチン(1回目)==
  *     4:      初期状態のチェック
  *     5:      dis_dsp() ... 4つの状態をそれぞれ変化させる
  *             loc_cpu()
  *             リターン
  *     == TASK1(続き)==
- *     6:      戻ってきた状態のチェック    ... (G-1)
- *     7:      dis_dsp() ... 3つの状態をそれぞれ変化させる
- *             chg_ipm(TMIN_INTPRI)
+ *     6:      戻ってきた状態のチェック                    ... (J-1)
+ *     7:      dis_dsp() ... ディスパッチ禁止,タスク例外処理禁止
  *             dis_tex()
- *     8:      ras_tex(TASK1, 0x0002)          ... (C-3)
+ *     8:      ras_tex(TASK1, 0x0002)                          ... (E-3)
  *             ref_tex(TSK_SELF, &rtex)
- *     9:      ena_tex()                                       ... (D-1)
+ *     9:      ena_tex()                                                       ... (F-1)
  *     == TASK1タスク例外処理ルーチン(2回目)==
  *     10:     初期状態のチェック
- *     11:     ras_tex(TASK1, 0x0001)          ... (C-3)
- *             ras_tex(TASK1, 0x0002)          ... (C-3)
+ *     11:     ras_tex(TASK1, 0x0001)                          ... (E-3)
+ *             ras_tex(TASK1, 0x0002)                          ... (E-3)
  *     12:     ena_dsp() ... 3つの状態をそれぞれ変化させる
  *             chg_ipm(TMAX_INTPRI)
  *             loc_cpu()
- *             リターン                                    ... (F)
+ *             リターン                                                    ... (I)
  *     == TASK1タスク例外処理ルーチン(3回目)==
  *     13:     初期状態のチェック
- *     14:     ena_dsp() ... 3つの状態をそれぞれ変化させる
+ *     14:     ena_dsp() ... ディスパッチ許可,タスク例外許可
  *             chg_ipm(TMAX_INTPRI)
  *             ena_tex()
- *     15: ras_tex(TSK_SELF, 0x0004)   ... (H)
+ *             chg_ipm(TIPM_ENAALL)                            ... (G-2)
+ *             chg_ipm(TMAX_INTPRI)
+ *     15: ras_tex(TSK_SELF, 0x0004)                   ... (E-4)
+ *             dis_tex()
+ *             chg_ipm(TIPM_ENAALL)                            ... (G-3)
+ *             chg_ipm(TMAX_INTPRI)
+ *             ena_tex()                                                       ... (F-3)
+ *     16:     chg_ipm(TIPM_ENAALL)                            ... (G-1)(K)
  *     == TASK1タスク例外処理ルーチン(4回目)==
- *     16:     初期状態のチェック
- *     17:     dis_dsp() ... 3つの状態をそれぞれ変化させる
- *             chg_ipm(TIPM_ENAALL)
+ *     17:     初期状態のチェック
+ *     18:     dis_dsp() ... 3つの状態をそれぞれ変化させる
+ *             chg_ipm(TMAX_INTPRI)
  *             loc_cpu()
  *             リターン
  *     == TASK1タスク例外処理ルーチン(3回目続き)==
- *     18:     戻ってきた状態のチェック    ... (G-2)
+ *     19:     戻ってきた状態のチェック                    ... (J-2)
  *             リターン
  *     == TASK1(続き)==
- *     19:     戻ってきた状態のチェック    ... (G-1)
- *     20: ena_dsp()
- *             chg_ipm(TIPM_ENAALL)
+ *     20:     戻ってきた状態のチェック                    ... (J-1)
+ *     21: ena_dsp()
  *             rot_rdq(TPRI_SELF)
  *     == TASK2(優先度:10)    ==
- *     21:     初期状態のチェック
- *     22:     ena_tex()
+ *     22:     初期状態のチェック
+ *     23:     ena_tex()
  *             rot_rdq(TPRI_SELF)
  *     == TASK3(優先度:10)    ==
- *     23:     初期状態のチェック
- *     24:     ena_tex()
- *     25:     dis_tex()                                       ... (B-1)
- *             ext_tsk()                                       ... (B-1)
+ *     24:     初期状態のチェック
+ *     25:     ena_tex() -> E_OBJ                                      ... (C-1)
+ *     26:     dis_tex() -> E_OBJ                                      ... (B-1)
+ *             ext_tsk()
  *     == TASK1(続き)==
- *     26: ras_tex(TASK2, 0x0001)              ... (C-2)
+ *     27: ras_tex(TASK2, 0x0001)                              ... (E-2)
  *             ref_tex(TASK2, &rtex)
- *     27:     rot_rdq(TPRI_SELF)                      ... (E-1)
+ *     28:     rot_rdq(TPRI_SELF)                                      ... (H-1)
  *     == TASK2タスク例外処理ルーチン(1回目)==
- *     28:     初期状態のチェック
+ *     29:     初期状態のチェック
  *             リターン
  *     == TASK2(続き)==
- *     29: ras_tex(TSK_SELF, 0x0002)
+ *     30: ras_tex(TSK_SELF, 0x0002)
  *     == TASK2タスク例外処理ルーチン(2回目)==
- *     30:     初期状態のチェック
- *     31:     dis_dsp
+ *     31:     初期状態のチェック
+ *     32:     dis_dsp()
  *             rot_rdq(TPRI_SELF)
- *     32:     リターン                                    ... (I)
+ *     33:     リターン                                                    ... (L)
  *     == TASK1(続き)==
- *     33:     リターン(タスク終了)
+ *     34:     リターン(タスク終了)
  *     == TASK2(続き)==
- *     34:     テスト終了
+ *     35:     テスト終了
  */
 
 #include <kernel.h>
@@ -192,7 +213,7 @@ tex_task1(TEXPTN texptn, intptr_t exinf)
 
        case 0x0002:
                check_point(10);
-               check_state(false, false, TMIN_INTPRI, true, true, true);
+               check_state(false, false, TIPM_ENAALL, true, true, true);
 
                /*
                 *  タスク例外処理を要求
@@ -218,7 +239,7 @@ tex_task1(TEXPTN texptn, intptr_t exinf)
 
        case 0x0003:
                check_point(13);
-               check_state(false, false, TMIN_INTPRI, true, true, true);
+               check_state(false, false, TIPM_ENAALL, true, true, true);
 
                /*
                 *  ディスパッチ許可,割込み優先度マスク変更,タスク例外許可
@@ -232,11 +253,28 @@ tex_task1(TEXPTN texptn, intptr_t exinf)
                check_ercd(ercd, E_OK);
                check_state(false, false, TMAX_INTPRI, false, true, false);
 
+               ercd = chg_ipm(TIPM_ENAALL);
+               check_ercd(ercd, E_OK);
+               ercd = chg_ipm(TMAX_INTPRI);
+               check_ercd(ercd, E_OK);
+
                /*
                 *  タスク例外処理を要求
                 */
                check_point(15);
                ercd = ras_tex(TSK_SELF, 0x0004);
+
+               ercd = dis_tex();
+               check_ercd(ercd, E_OK);
+               ercd = chg_ipm(TIPM_ENAALL);
+               check_ercd(ercd, E_OK);
+               ercd = chg_ipm(TMAX_INTPRI);
+               check_ercd(ercd, E_OK);
+               ercd = ena_tex();
+               check_ercd(ercd, E_OK);
+
+               check_point(16);
+               ercd = chg_ipm(TIPM_ENAALL);
                /* ここでタスク例外処理ルーチンが動作する */
                check_ercd(ercd, E_OK);
 
@@ -244,25 +282,25 @@ tex_task1(TEXPTN texptn, intptr_t exinf)
                 *  タスク例外処理からのリターンにより元の状態に戻っていること
                 *  をチェック
                 */
-               check_point(18);
-               check_state(false, false, TMAX_INTPRI, false, true, false);
+               check_point(19);
+               check_state(false, false, TIPM_ENAALL, false, false, false);
                break;
 
        case 0x0004:
-               check_point(16);
-               check_state(false, false, TMAX_INTPRI, false, true, true);
+               check_point(17);
+               check_state(false, false, TIPM_ENAALL, false, false, true);
 
                /*
                 *  ディスパッチ禁止,割込み優先度マスク変更,CPUロック
                 */
-               check_point(17);
+               check_point(18);
                ercd = dis_dsp();
                check_ercd(ercd, E_OK);
-               ercd = chg_ipm(TIPM_ENAALL);
+               ercd = chg_ipm(TMAX_INTPRI);
                check_ercd(ercd, E_OK);
                ercd = loc_cpu();
                check_ercd(ercd, E_OK);
-               check_state(false, true, TIPM_ENAALL, true, true, true);
+               check_state(false, true, TMAX_INTPRI, true, true, true);
                break;
 
        default:
@@ -331,16 +369,14 @@ task1(intptr_t exinf)
        check_state(false, false, TIPM_ENAALL, false, false, false);
 
        /*
-        *  ディスパッチ禁止,割込み優先度マスク変更,タスク例外処理禁止
+        *  ディスパッチ禁止,タスク例外処理禁止
         */
        check_point(7);
        ercd = dis_dsp();
        check_ercd(ercd, E_OK);
-       ercd = chg_ipm(TMIN_INTPRI);
-       check_ercd(ercd, E_OK);
        ercd = dis_tex();
        check_ercd(ercd, E_OK);
-       check_state(false, false, TMIN_INTPRI, true, true, true);
+       check_state(false, false, TIPM_ENAALL, true, true, true);
 
        /*
         *  タスク例外処理を要求
@@ -365,17 +401,15 @@ task1(intptr_t exinf)
         *  タスク例外処理からのリターンにより元の状態に戻っていることを
         *  チェック
         */
-       check_point(19);
-       check_state(false, false, TMIN_INTPRI, true, true, false);
+       check_point(20);
+       check_state(false, false, TIPM_ENAALL, true, true, false);
 
        /*
         *  タスク2に切り換える
         */
-       check_point(20);
+       check_point(21);
        ercd = ena_dsp();
        check_ercd(ercd, E_OK);
-       ercd = chg_ipm(TIPM_ENAALL);
-       check_ercd(ercd, E_OK);
        ercd = rot_rdq(TPRI_SELF);
        /* ここで他のタスクが動作する */
        check_ercd(ercd, E_OK);
@@ -383,7 +417,7 @@ task1(intptr_t exinf)
        /*
         *  タスク2に対してタスク例外処理を要求
         */
-       check_point(26);
+       check_point(27);
        ercd = ras_tex(TASK2, 0x0001);
        check_ercd(ercd, E_OK);
        ercd = ref_tex(TASK2, &rtex);
@@ -394,7 +428,7 @@ task1(intptr_t exinf)
        /*
         *  タスク2に切り換える
         */
-       check_point(27);
+       check_point(28);
        ercd = rot_rdq(TPRI_SELF);
        /* ここで他のタスクが動作する */
        check_ercd(ercd, E_OK);
@@ -402,7 +436,7 @@ task1(intptr_t exinf)
        /*
         *  タスク終了
         */
-       check_point(33);
+       check_point(34);
 }
 
 void
@@ -412,18 +446,18 @@ tex_task2(TEXPTN texptn, intptr_t exinf)
 
        switch (texptn) {
        case 0x0001:
-               check_point(28);
+               check_point(29);
                check_state(false, false, TIPM_ENAALL, false, false, true);
                break;
 
        case 0x0002:
-               check_point(30);
+               check_point(31);
                check_state(false, false, TIPM_ENAALL, false, false, true);
 
                /*
                 *  ディスパッチを禁止して,タスク切換えを要求する.
                 */
-               check_point(31);
+               check_point(32);
                ercd = dis_dsp();
                check_ercd(ercd, E_OK);
                ercd = rot_rdq(TPRI_SELF);
@@ -433,7 +467,7 @@ tex_task2(TEXPTN texptn, intptr_t exinf)
                 *  タスク例外処理ルーチンからのリターンで,タスク切換えが発生
                 *  する.
                 */
-               check_point(32);
+               check_point(33);
                break;
 
        default:
@@ -450,13 +484,13 @@ task2(intptr_t exinf)
        /*
         *  初期状態のチェック
         */
-       check_point(21);
+       check_point(22);
        check_state(false, false, TIPM_ENAALL, false, false, true);
 
        /*
         *  タスク例外処理の許可
         */
-       check_point(22);
+       check_point(23);
        ercd = ena_tex();
        check_ercd(ercd, E_OK);
        check_state(false, false, TIPM_ENAALL, false, false, false);
@@ -471,7 +505,7 @@ task2(intptr_t exinf)
        /*
         *  タスク例外処理を要求
         */
-       check_point(29);
+       check_point(30);
        ercd = ras_tex(TSK_SELF, 0x0002);
        /* ここでタスク例外処理ルーチンが動作する */
        check_ercd(ercd, E_OK);
@@ -479,7 +513,7 @@ task2(intptr_t exinf)
        /*
         *  テスト終了
         */
-       check_finish(34);
+       check_finish(35);
 }
 
 void
@@ -490,13 +524,13 @@ task3(intptr_t exinf)
        /*
         *  初期状態のチェック
         */
-       check_point(23);
+       check_point(24);
        check_state(false, false, TIPM_ENAALL, false, false, true);
 
        /*
         *  タスク例外処理の許可
         */
-       check_point(24);
+       check_point(25);
        ercd = ena_tex();
        check_ercd(ercd, E_OBJ);
        check_state(false, false, TIPM_ENAALL, false, false, true);
@@ -504,7 +538,7 @@ task3(intptr_t exinf)
        /*
         *  タスク例外処理の禁止
         */
-       check_point(25);
+       check_point(26);
        ercd = dis_tex();
        check_ercd(ercd, E_OBJ);
        check_state(false, false, TIPM_ENAALL, false, false, true);
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 0261c65..a4c3e0e 100755 (executable)
@@ -37,7 +37,7 @@
 #  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
 #  の責任を負わない.
 # 
-#  @(#) $Id: genoffset 1840 2010-07-10 17:29:42Z ertl-hiro $
+#  @(#) $Id: genoffset 1891 2010-08-06 10:22:51Z ertl-hiro $
 # 
 
 #
@@ -251,12 +251,21 @@ while ($line = <INFILE>) {
        elsif ($line =~ /^[ \t]*_?BIT_REF_([0-9]+):/) {
                do ref_bit($1);
        }
-       elsif ($line =~ /^[ \t]*_?BIT_([BL])([BHW])_([^ \t]+):/) {
-               do parse_bit($1, $2, $3);
-       }
        elsif ($line =~ /^[ \t]*SIL_ENDIAN = ([BL])/) {
                $sil_endian = $1;
        }
 }
+#
+#  コンパイラがグローバル変数の配置順序を変更すると,BIT_REF_?が下にな
+#  る可能性があるため,頭から読み直す.
+#
+seek(INFILE, 0, SEEK_SET);
+while ($line = <INFILE>) {
+       chomp $line;
+
+       if ($line =~ /^[ \t]*_?BIT_([BL])([BHW])_([^ \t]+):/) {
+               do parse_bit($1, $2, $3);
+       }
+}
 close(INFILE);
 exit($error);
index af8000e..00cb9aa 100755 (executable)
@@ -37,7 +37,7 @@
 #  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
 #  の責任を負わない.
 # 
-#  @(#) $Id: makedep 1524 2009-04-29 03:37:27Z ertl-hiro $
+#  @(#) $Id: makedep 2004 2010-12-31 00:43:36Z ertl-hiro $
 # 
 
 require "getopt.pl";
@@ -48,9 +48,13 @@ require "getopt.pl";
 #  -O <cc_opts>                Cコンパイラ/CPPに渡すオプション
 #  -X                          ソースファイルを強制的にCヘッダファイルと見なす
 #
-#  -T <target>         ターゲットのファイル名
-#  -D <t_dir>          ターゲットのディレクトリ名を指定する
-#  -d                          ターゲットのディレクトリ部を保持する
+#  -T <target>         ターゲット名(のリスト)
+#  -D <t_dir>          ターゲットのディレクトリ名を指定する(-Tを用いた場
+#                                      合は無効)
+#  -d                          ターゲットのディレクトリ部を保持する(-Tを用いた場
+#                                      合は無効)
+#  -S                          複数のターゲットがある依存ルールを,ターゲット毎に
+#                                      分割する(こうしないと対応できないmakeがあるらしい)
 #
 #  -R <dirname>                Cygwin環境におけるルートディレクトリ名を指定する
 #                                      (デフォルトはcygdrive)
@@ -64,7 +68,7 @@ $cc_path = $opt_C;
 $cc_opts = $opt_O;
 
 if ($opt_T) {
-       $target_file = $opt_T;
+       $target_name = $opt_T;
 }
 elsif ($opt_D) {
        $target_dir = $opt_D;
@@ -93,25 +97,12 @@ if ($uname[0] =~ /^cygwin/i) {
 #  %dependlist に作られた依存関係を出力する
 #
 sub output_dependlist {
-       local($file) = @_;
-       local($target, $column, $len);
+       local($target) = @_;
+       local($column, $len, $file);
 
-       if ($target_file) {
-               $target = $target_file;
-       }
-       else {
-               $target = $file;
-               $target =~ s/(.*)\.(.*)/$1.o/;
-       }       
-       if (defined($target_dir)) {
-               $target =~ s/^.*\/([^\/]+)$/$1/;
-               if ($target_dir) {
-                       $target = $target_dir."/".$target;
-               }
-       }
        print $target, ": ";
        $column = length($target) + 2;
-    
+
        foreach $file (keys(%dependlist)) {
                $len = length($file) + 1;
                if ($column > 8 && $column + $len >= 70) {
@@ -163,5 +154,27 @@ sub makedepend_one {
 foreach $file (@ARGV) {
        %dependlist = ();
        do makedepend_one($file);
-       do output_dependlist($file) if (%dependlist);
+       if (%dependlist) {
+               if ($target_name) {
+                       if ($opt_S) {
+                               foreach $target (split(/[ \t]+/, $target_name)) {
+                                       do output_dependlist($target);
+                               }
+                       }
+                       else {
+                               do output_dependlist($target_name);
+                       }
+               }
+               else {
+                       $target = $file;
+                       $target =~ s/(.*)\.(.*)/$1.o/;
+                       if (defined($target_dir)) {
+                               $target =~ s/^.*\/([^\/]+)$/$1/;
+                               if ($target_dir) {
+                                       $target = $target_dir."/".$target;
+                               }
+                       }
+                       do output_dependlist($target);
+               }
+       }
 }