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

ASP3, TINET, mbed を更新

Location:
EcnlProtoTool/trunk/asp3_dcre/kernel
Files:
45 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/asp3_dcre/kernel/Makefile.kernel

    r321 r429  
    66#  Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory
    77#                              Toyohashi Univ. of Technology, JAPAN
    8 #  Copyright (C) 2005-2016 by Embedded and Real-Time Systems Laboratory
     8#  Copyright (C) 2005-2018 by Embedded and Real-Time Systems Laboratory
    99#              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010#
     
    6868                wobjwai.o wobjwaitmo.o iniwque.o
    6969
    70 time_event = tmeini.o tmeup.o tmedown.o tmecur.o tmeset.o \
    71                 tmereg.o tmeenq.o tmedeq.o tmechk.o tmeltim.o sigtim.o
     70time_event = tmeini.o tmeup.o tmedown.o tmecur.o tmeset.o tmereg.o \
     71                tmeenqrel.o tmedeq.o tmechk.o tmeltim.o sigtim.o
    7272
    7373task_manage = acre_tsk.o del_tsk.o act_tsk.o can_act.o get_tst.o \
     
    112112                sns_ctx.o sns_loc.o sns_dsp.o sns_dpn.o sns_ker.o
    113113
    114 interrupt = isrini.o isrcal.o acre_isr.o del_isr.o \
    115                 intini.o dis_int.o ena_int.o chg_ipm.o get_ipm.o
     114interrupt = isrini.o isrcal.o acre_isr.o del_isr.o intini.o \
     115                dis_int.o ena_int.o clr_int.o ras_int.o prb_int.o chg_ipm.o get_ipm.o
    116116
    117117exception = excini.o xsns_dpn.o
     
    120120#  生成されるオブジェクトファイルの依存関係の定義
    121121#
    122 $(startup) $(startup:.o=.s): startup.c
    123 $(task) $(task:.o=.s): task.c
    124 $(taskhook) $(taskhook:.o=.s): taskhook.c
    125 $(wait) $(wait:.o=.s): wait.c
    126 $(time_event) $(time_event:.o=.s): time_event.c
    127 $(task_manage) $(task_manage:.o=.s): task_manage.c
    128 $(task_refer) $(task_refer:.o=.s): task_refer.c
    129 $(task_sync) $(task_sync:.o=.s): task_sync.c
    130 $(task_term) $(task_term:.o=.s): task_term.c
    131 $(semaphore) $(semaphore:.o=.s): semaphore.c
    132 $(eventflag) $(eventflag:.o=.s): eventflag.c
    133 $(dataqueue) $(dataqueue:.o=.s): dataqueue.c
    134 $(pridataq) $(pridataq:.o=.s): pridataq.c
    135 $(mutex) $(mutex:.o=.s): mutex.c
    136 $(mempfix) $(mempfix:.o=.s): mempfix.c
    137 $(time_manage) $(time_manage:.o=.s): time_manage.c
    138 $(cyclic) $(cyclic:.o=.s): cyclic.c
    139 $(alarm) $(alarm:.o=.s): alarm.c
    140 $(sys_manage) $(sys_manage:.o=.s): sys_manage.c
    141 $(interrupt) $(interrupt:.o=.s): interrupt.c
    142 $(exception) $(exception:.o=.s): exception.c
     122$(addprefix $(OBJDIR)/, $(startup)) $(startup:.o=.s): startup.c
     123$(addprefix $(OBJDIR)/, $(task)) $(task:.o=.s): task.c
     124$(addprefix $(OBJDIR)/, $(taskhook)) $(taskhook:.o=.s): taskhook.c
     125$(addprefix $(OBJDIR)/, $(wait)) $(wait:.o=.s): wait.c
     126$(addprefix $(OBJDIR)/, $(time_event)) $(time_event:.o=.s): time_event.c
     127$(addprefix $(OBJDIR)/, $(task_manage)) $(task_manage:.o=.s): task_manage.c
     128$(addprefix $(OBJDIR)/, $(task_refer)) $(task_refer:.o=.s): task_refer.c
     129$(addprefix $(OBJDIR)/, $(task_sync)) $(task_sync:.o=.s): task_sync.c
     130$(addprefix $(OBJDIR)/, $(task_term)) $(task_term:.o=.s): task_term.c
     131$(addprefix $(OBJDIR)/, $(semaphore)) $(semaphore:.o=.s): semaphore.c
     132$(addprefix $(OBJDIR)/, $(eventflag)) $(eventflag:.o=.s): eventflag.c
     133$(addprefix $(OBJDIR)/, $(dataqueue)) $(dataqueue:.o=.s): dataqueue.c
     134$(addprefix $(OBJDIR)/, $(pridataq)) $(pridataq:.o=.s): pridataq.c
     135$(addprefix $(OBJDIR)/, $(mutex)) $(mutex:.o=.s): mutex.c
     136$(addprefix $(OBJDIR)/, $(mempfix)) $(mempfix:.o=.s): mempfix.c
     137$(addprefix $(OBJDIR)/, $(time_manage)) $(time_manage:.o=.s): time_manage.c
     138$(addprefix $(OBJDIR)/, $(cyclic)) $(cyclic:.o=.s): cyclic.c
     139$(addprefix $(OBJDIR)/, $(alarm)) $(alarm:.o=.s): alarm.c
     140$(addprefix $(OBJDIR)/, $(sys_manage)) $(sys_manage:.o=.s): sys_manage.c
     141$(addprefix $(OBJDIR)/, $(interrupt)) $(interrupt:.o=.s): interrupt.c
     142$(addprefix $(OBJDIR)/, $(exception)) $(exception:.o=.s): exception.c
  • EcnlProtoTool/trunk/asp3_dcre/kernel/alarm.c

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2005-2016 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2005-2018 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    164164        ALMINIB         *p_alminib;
    165165        ATR                     almatr;
    166         T_NFYINFO       nfyinfo, *p_nfyinfo;
    167         ER                      ercd, rercd;
     166        T_NFYINFO       *p_nfyinfo;
     167        ER                      ercd;
    168168
    169169        LOG_ACRE_ALM_ENTER(pk_calm);
     
    171171
    172172        almatr = pk_calm->almatr;
    173         nfyinfo = pk_calm->nfyinfo;
    174 
    175         CHECK_RSATR(almatr, TA_NULL);
    176         rercd = check_nfyinfo(&nfyinfo);
    177         if (rercd != E_OK) {
    178                 ercd = rercd;
     173
     174        CHECK_VALIDATR(almatr, TA_NULL);
     175        ercd = check_nfyinfo(&(pk_calm->nfyinfo));
     176        if (ercd != E_OK) {
    179177                goto error_exit;
    180178        }
     
    189187                p_alminib = (ALMINIB *)(p_almcb->p_alminib);
    190188                p_alminib->almatr = almatr;
    191                 if (nfyinfo.nfymode == TNFY_HANDLER) {
    192                         p_alminib->exinf = nfyinfo.nfy.handler.exinf;
    193                         p_alminib->nfyhdr = (NFYHDR)(nfyinfo.nfy.handler.tmehdr);
     189                if (pk_calm->nfyinfo.nfymode == TNFY_HANDLER) {
     190                        p_alminib->exinf = pk_calm->nfyinfo.nfy.handler.exinf;
     191                        p_alminib->nfyhdr = (NFYHDR)(pk_calm->nfyinfo.nfy.handler.tmehdr);
    194192                }
    195193                else {
    196194                        p_nfyinfo = &aalm_nfyinfo_table[p_alminib - aalminib_table];
    197                         *p_nfyinfo = nfyinfo;
     195                        *p_nfyinfo = pk_calm->nfyinfo;
    198196                        p_alminib->exinf = (intptr_t) p_nfyinfo;
    199197                        p_alminib->nfyhdr = notify_handler;
     
    283281                        p_almcb->almsta = true;
    284282                }
    285                 tmevtb_enqueue(&(p_almcb->tmevtb), almtim);
     283                tmevtb_enqueue_reltim(&(p_almcb->tmevtb), almtim);
    286284                ercd = E_OK;
    287285        }
     
    385383        /*
    386384         *  通知ハンドラを,CPUロック解除状態で呼び出す.
     385         *
     386         *  アラーム通知の生成/削除はタスクからしか行えないため,アラーム
     387         *  通知初期化ブロックをCPUロック解除状態で参照しても問題ない.
    387388         */
    388389        unlock_cpu();
  • EcnlProtoTool/trunk/asp3_dcre/kernel/alarm.trb

    r321 r429  
    66#
    77#   Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN
    8 #   Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
     8#   Copyright (C) 2015-2019 by Embedded and Real-Time Systems Laboratory
    99#               Graduate School of Information Science, Nagoya Univ., JAPAN
    1010#
     
    5252
    5353  def prepare(key, params)
    54     # almatrが無効の場合(E_RSATR)[NGKI2491]
    55     #(TA_STA以外のビットがセットされている場合)
    56     if (params[:almatr] & ~($TA_STA)) != 0
     54    # almatrが無効の場合(E_RSATR)[NGKI2491][NGKI3423][NGKI3424]
     55    #(TA_NULLでない場合)
     56    if (params[:almatr] != $TA_NULL)
    5757      error_illegal_id("E_RSATR", params, :almatr, :almid)
    5858    end
  • EcnlProtoTool/trunk/asp3_dcre/kernel/allfunc.h

    r321 r429  
    44 *      Advanced Standard Profile Kernel
    55 *
    6  *  Copyright (C) 2005-2015 by Embedded and Real-Time Systems Laboratory
     6 *  Copyright (C) 2005-2018 by Embedded and Real-Time Systems Laboratory
    77 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    88 *
     
    8181#define TOPPERS_tmeset
    8282#define TOPPERS_tmereg
    83 #define TOPPERS_tmeenq
     83#define TOPPERS_tmeenqrel
    8484#define TOPPERS_tmedeq
    8585#define TOPPERS_tmechk
     
    257257#define TOPPERS_dis_int
    258258#define TOPPERS_ena_int
     259#define TOPPERS_clr_int
     260#define TOPPERS_ras_int
     261#define TOPPERS_prb_int
    259262#define TOPPERS_chg_ipm
    260263#define TOPPERS_get_ipm
  • EcnlProtoTool/trunk/asp3_dcre/kernel/check.h

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2005-2015 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2005-2019 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    6565
    6666/*
    67  *  オブジェクト番号の範囲の判定
    68  */
    69 #ifndef VALID_INTNO_DISINT
    70 #define VALID_INTNO_DISINT(intno)    VALID_INTNO(intno)
    71 #endif /* VALID_INTNO_DISINT */
    72 
    73 #ifndef VALID_INTNO_CREISR
    74 #define VALID_INTNO_CREISR(intno)    VALID_INTNO(intno)
    75 #endif /* VALID_INTNO_CREISR */
    76 
    77 /*
    7867 *  優先度の範囲の判定
    7968 */
     
    8574                                (TMIN_ISRPRI <= (isrpri) && (isrpri) <= TMAX_ISRPRI)
    8675
    87 #ifndef VALID_INTPRI_CHGIPM
    88 #define VALID_INTPRI_CHGIPM(intpri) \
    89                                 (TMIN_INTPRI <= (intpri) && (intpri) <= TIPM_ENAALL)
    90 #endif /* VALID_INTPRI_CHGIPM */
    91 
    9276/*
    9377 *  相対時間の範囲の判定
     
    9882 *  タイムアウト指定値の範囲の判定
    9983 */
    100 #define VALID_TMOUT(tmout)      ((tmout) <= TMAX_RELTIM || (tmout) == TMO_FEVR \
    101                                                                                                         || (tmout) == TMO_POL)
     84#define VALID_TMOUT(tmout)      ((tmout) <= TMAX_RELTIM || (tmout) == TMO_FEVR)
    10285
    10386/*
     
    208191
    209192/*
    210  *  オブジェクトIDのチェック(E_ID)
     193 *  不正ID番号のチェック(E_ID)
    211194 */
    212195#define CHECK_ID(exp) do {                                                                      \
     
    218201
    219202/*
    220  *  予約属性エラーのチェック(E_RSATR)
    221  */
    222 #define CHECK_RSATR(atr, valid_atr) do {                                        \
     203 *  属性が無効なビットが立っていないかのチェック(E_RSATR)
     204 */
     205#define CHECK_VALIDATR(atr, valid_atr) do {                                     \
    223206        if (((atr) & ~(valid_atr)) != 0U) {                                             \
    224207                ercd = E_RSATR;                                                                         \
     
    238221
    239222/*
    240  *  不正使用エラーのチェック(E_ILUSE)
     223 *  サービスコール不正使用のチェック(E_ILUSE)
    241224 */
    242225#define CHECK_ILUSE(exp) do {                                                           \
     
    248231
    249232/*
    250  *  静的なオブジェクト状態エラーのチェック(E_OBJ)
     233 *  オブジェクト状態エラーのチェック(E_OBJ)
    251234 */
    252235#define CHECK_OBJ(exp) do {                                                                     \
  • EcnlProtoTool/trunk/asp3_dcre/kernel/cyclic.c

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2005-2016 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2005-2018 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    175175        CYCINIB         *p_cycinib;
    176176        ATR                     cycatr;
    177         T_NFYINFO       nfyinfo, *p_nfyinfo;
    178         RELTIM          cyctim;
    179         RELTIM          cycphs;
    180         ER                      ercd, rercd;
     177        RELTIM          cyctim, cycphs;
     178        T_NFYINFO       *p_nfyinfo;
     179        ER                      ercd;
    181180
    182181        LOG_ACRE_CYC_ENTER(pk_ccyc);
     
    184183
    185184        cycatr = pk_ccyc->cycatr;
    186         nfyinfo = pk_ccyc->nfyinfo;
    187185        cyctim = pk_ccyc->cyctim;
    188186        cycphs = pk_ccyc->cycphs;
    189187
    190         CHECK_RSATR(cycatr, TA_STA);
    191         rercd = check_nfyinfo(&nfyinfo);
    192         if (rercd != E_OK) {
    193                 ercd = rercd;
     188        CHECK_VALIDATR(cycatr, TA_STA);
     189        ercd = check_nfyinfo(&(pk_ccyc->nfyinfo));
     190        if (ercd != E_OK) {
    194191                goto error_exit;
    195192        }
     
    206203                p_cycinib = (CYCINIB *)(p_cyccb->p_cycinib);
    207204                p_cycinib->cycatr = cycatr;
    208                 if (nfyinfo.nfymode == TNFY_HANDLER) {
    209                         p_cycinib->exinf = nfyinfo.nfy.handler.exinf;
    210                         p_cycinib->nfyhdr = (NFYHDR)(nfyinfo.nfy.handler.tmehdr);
     205                if (pk_ccyc->nfyinfo.nfymode == TNFY_HANDLER) {
     206                        p_cycinib->exinf = pk_ccyc->nfyinfo.nfy.handler.exinf;
     207                        p_cycinib->nfyhdr = (NFYHDR)(pk_ccyc->nfyinfo.nfy.handler.tmehdr);
    211208                }
    212209                else {
    213210                        p_nfyinfo = &acyc_nfyinfo_table[p_cycinib - acycinib_table];
    214                         *p_nfyinfo = nfyinfo;
     211                        *p_nfyinfo = pk_ccyc->nfyinfo;
    215212                        p_cycinib->exinf = (intptr_t) p_nfyinfo;
    216213                        p_cycinib->nfyhdr = notify_handler;
     
    221218                if ((p_cyccb->p_cycinib->cycatr & TA_STA) != 0U) {
    222219                        p_cyccb->cycsta = true;
    223                         tmevtb_enqueue(&(p_cyccb->tmevtb), p_cyccb->p_cycinib->cycphs);
     220                        tmevtb_enqueue_reltim(&(p_cyccb->tmevtb),
     221                                                                                p_cyccb->p_cycinib->cycphs);
    224222                }
    225223                else {
     
    311309                 *  初回の起動のためのタイムイベントを登録する[ASPD1036].
    312310                 */
    313                 tmevtb_enqueue(&(p_cyccb->tmevtb), p_cyccb->p_cycinib->cycphs);
     311                tmevtb_enqueue_reltim(&(p_cyccb->tmevtb), p_cyccb->p_cycinib->cycphs);
    314312                ercd = E_OK;
    315313        }
     
    414412        /*
    415413         *  通知ハンドラを,CPUロック解除状態で呼び出す.
     414         *
     415         *  周期通知の生成/削除はタスクからしか行えないため,周期通知初期
     416         *  化ブロックをCPUロック解除状態で参照しても問題ない.
    416417         */
    417418        unlock_cpu();
  • EcnlProtoTool/trunk/asp3_dcre/kernel/cyclic.trb

    r321 r429  
    66#
    77#   Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN
    8 #   Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
     8#   Copyright (C) 2015-2019 by Embedded and Real-Time Systems Laboratory
    99#               Graduate School of Information Science, Nagoya Univ., JAPAN
    1010#
     
    5252
    5353  def prepare(key, params)
    54     # cycatrが無効の場合(E_RSATR)[NGKI2383]
     54    # cycatrが無効の場合(E_RSATR)[NGKI2383][NGKI2370][ASPS0172]
    5555    #(TA_STA以外のビットがセットされている場合)
    5656    if (params[:cycatr] & ~($TA_STA)) != 0
     
    5858    end
    5959
    60     # (0 < cyctim && cyctim <= TMAX_RELTIM)でない場合(E_PAR)[NGKI2397]
     60    # cyctimが有効範囲外の場合(E_PAR)[NGKI2397]
     61    #(0 < cyctim && cyctim <= TMAX_RELTIMでない場合)
    6162    if !(0 < params[:cyctim] && params[:cyctim] <= $TMAX_RELTIM)
    6263      error_illegal_id("E_PAR", params, :cyctim, :cycid)
    6364    end
    6465
    65     # (0 <= cycphs && cycphs <= TMAX_RELTIM)でない場合(E_PAR)[NGKI2399]
     66    # cycphsが有効範囲外の場合(E_PAR)[NGKI2399]
     67    #(0 <= cycphs && cycphs <= TMAX_RELTIMでない場合)
    6668    if !(0 <= params[:cycphs] && params[:cycphs] <= $TMAX_RELTIM)
    6769      error_illegal_id("E_PAR", params, :cycphs, :cycid)
  • EcnlProtoTool/trunk/asp3_dcre/kernel/dataqueue.c

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2005-2017 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2005-2018 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    356356        p_dtqmb = pk_cdtq->dtqmb;
    357357
    358         CHECK_RSATR(dtqatr, TA_TPRI);
     358        CHECK_VALIDATR(dtqatr, TA_TPRI);
     359        if (p_dtqmb != NULL) {
     360                CHECK_PAR(MB_ALIGN(p_dtqmb));
     361        }
    359362
    360363        lock_cpu();
     
    364367        else {
    365368                if (dtqcnt != 0 && p_dtqmb == NULL) {
    366                         p_dtqmb = kernel_malloc(sizeof(DTQMB) * dtqcnt);
     369                        p_dtqmb = malloc_mpk(sizeof(DTQMB) * dtqcnt);
    367370                        dtqatr |= TA_MBALLOC;
    368371                }
     
    423426                p_dtqinib = (DTQINIB *)(p_dtqcb->p_dtqinib);
    424427                if ((p_dtqinib->dtqatr & TA_MBALLOC) != 0U) {
    425                         kernel_free(p_dtqinib->p_dtqmb);
     428                        free_mpk(p_dtqinib->p_dtqmb);
    426429                }
    427430                p_dtqinib->dtqatr = TA_NOEXS;
     
    449452snd_dtq(ID dtqid, intptr_t data)
    450453{
    451         DTQCB   *p_dtqcb;
    452         WINFO_SDTQ winfo_sdtq;
    453         ER              ercd;
     454        DTQCB           *p_dtqcb;
     455        WINFO_SDTQ      winfo_sdtq;
     456        ER                      ercd;
    454457
    455458        LOG_SND_DTQ_ENTER(dtqid, data);
     
    473476        else {
    474477                winfo_sdtq.data = data;
    475                 p_runtsk->tstat = TS_WAITING_SDTQ;
    476                 wobj_make_wait((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_sdtq);
     478                wobj_make_wait((WOBJCB *) p_dtqcb, TS_WAITING_SDTQ,
     479                                                                                        (WINFO_WOBJ *) &winfo_sdtq);
    477480                dispatch();
    478481                ercd = winfo_sdtq.winfo.wercd;
     
    513516                        }
    514517                        else {
    515                                 request_dispatch();
     518                                request_dispatch_retint();
    516519                        }
    517520                }
     
    538541tsnd_dtq(ID dtqid, intptr_t data, TMO tmout)
    539542{
    540         DTQCB   *p_dtqcb;
    541         WINFO_SDTQ winfo_sdtq;
    542         TMEVTB  tmevtb;
    543         ER              ercd;
     543        DTQCB           *p_dtqcb;
     544        WINFO_SDTQ      winfo_sdtq;
     545        TMEVTB          tmevtb;
     546        ER                      ercd;
    544547
    545548        LOG_TSND_DTQ_ENTER(dtqid, data, tmout);
     
    567570        else {
    568571                winfo_sdtq.data = data;
    569                 p_runtsk->tstat = TS_WAITING_SDTQ;
    570                 wobj_make_wait_tmout((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_sdtq,
    571                                                                                                                 &tmevtb, tmout);
     572                wobj_make_wait_tmout((WOBJCB *) p_dtqcb, TS_WAITING_SDTQ,
     573                                                                (WINFO_WOBJ *) &winfo_sdtq, &tmevtb, tmout);
    572574                dispatch();
    573575                ercd = winfo_sdtq.winfo.wercd;
     
    612614                        }
    613615                        else {
    614                                 request_dispatch();
     616                                request_dispatch_retint();
    615617                        }
    616618                }
    617         ercd = E_OK;
     619                ercd = E_OK;
    618620        }
    619621        unlock_cpu();
     
    634636rcv_dtq(ID dtqid, intptr_t *p_data)
    635637{
    636         DTQCB   *p_dtqcb;
    637         WINFO_RDTQ winfo_rdtq;
    638         ER              ercd;
     638        DTQCB           *p_dtqcb;
     639        WINFO_RDTQ      winfo_rdtq;
     640        ER                      ercd;
    639641
    640642        LOG_RCV_DTQ_ENTER(dtqid, p_data);
     
    657659        }
    658660        else {
    659                 p_runtsk->tstat = TS_WAITING_RDTQ;
    660                 make_wait(&(winfo_rdtq.winfo));
     661                make_wait(TS_WAITING_RDTQ, &(winfo_rdtq.winfo));
    661662                queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
    662663                winfo_rdtq.p_dtqcb = p_dtqcb;
     
    723724trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout)
    724725{
    725         DTQCB   *p_dtqcb;
    726         WINFO_RDTQ winfo_rdtq;
    727         TMEVTB  tmevtb;
    728         ER              ercd;
     726        DTQCB           *p_dtqcb;
     727        WINFO_RDTQ      winfo_rdtq;
     728        TMEVTB          tmevtb;
     729        ER                      ercd;
    729730
    730731        LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout);
     
    751752        }
    752753        else {
    753                 p_runtsk->tstat = TS_WAITING_RDTQ;
    754                 make_wait_tmout(&(winfo_rdtq.winfo), &tmevtb, tmout);
     754                make_wait_tmout(TS_WAITING_RDTQ, &(winfo_rdtq.winfo), &tmevtb, tmout);
    755755                queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
    756756                winfo_rdtq.p_dtqcb = p_dtqcb;
  • EcnlProtoTool/trunk/asp3_dcre/kernel/dataqueue.trb

    r321 r429  
    66#
    77#   Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN
    8 #   Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
     8#   Copyright (C) 2015-2019 by Embedded and Real-Time Systems Laboratory
    99#               Graduate School of Information Science, Nagoya Univ., JAPAN
    1010#
     
    5454    params[:dtqmb] ||= "NULL"
    5555
    56     # dtqatrが無効の場合(E_RSATR)[NGKI1669]
     56    # dtqatrが無効の場合(E_RSATR)[NGKI1669][NGKI1661]
    5757    #(TA_TPRI以外のビットがセットされている場合)
    5858    if (params[:dtqatr] & ~($TA_TPRI)) != 0
  • EcnlProtoTool/trunk/asp3_dcre/kernel/eventflag.c

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2005-2017 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2005-2018 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    216216        flgatr = pk_cflg->flgatr;
    217217
    218         CHECK_RSATR(flgatr, TA_TPRI|TA_WMUL|TA_CLR);
     218        CHECK_VALIDATR(flgatr, TA_TPRI|TA_WMUL|TA_CLR);
    219219
    220220        lock_cpu();
     
    292292set_flg(ID flgid, FLGPTN setptn)
    293293{
    294         FLGCB   *p_flgcb;
    295         QUEUE   *p_queue;
    296         TCB             *p_tcb;
    297         WINFO_FLG *p_winfo_flg;
    298         ER              ercd;
     294        FLGCB           *p_flgcb;
     295        QUEUE           *p_queue;
     296        TCB                     *p_tcb;
     297        WINFO_FLG       *p_winfo_flg;
     298        bool_t          lock;
     299        ER                      ercd;
    299300
    300301        LOG_SET_FLG_ENTER(flgid, setptn);
    301         CHECK_UNL();
     302        lock = sense_lock();
    302303        CHECK_ID(VALID_FLGID(flgid));
    303304        p_flgcb = get_flgcb(flgid);
    304305
    305         lock_cpu();
     306        if (!lock)
     307                lock_cpu();
    306308        if (p_flgcb->p_flginib->flgatr == TA_NOEXS) {
    307309                ercd = E_NOEXS;
     
    328330                        }
    329331                        else {
    330                                 request_dispatch();
     332                                request_dispatch_retint();
    331333                        }
    332334                }
    333335                ercd = E_OK;
    334336        }
    335         unlock_cpu();
     337        if (!lock)
     338                unlock_cpu();
    336339
    337340  error_exit:
     
    351354{
    352355        FLGCB   *p_flgcb;
     356        bool_t lock;
    353357        ER              ercd;
    354358
    355359        LOG_CLR_FLG_ENTER(flgid, clrptn);
    356         CHECK_TSKCTX_UNL();
     360        lock = sense_lock();
    357361        CHECK_ID(VALID_FLGID(flgid));
    358362        p_flgcb = get_flgcb(flgid);
    359363
    360         lock_cpu();
     364        if (!lock)
     365                lock_cpu();
    361366        if (p_flgcb->p_flginib->flgatr == TA_NOEXS) {
    362367                ercd = E_NOEXS;
     
    366371                ercd = E_OK;
    367372        }
    368         unlock_cpu();
     373        if (!lock)
     374                unlock_cpu();
    369375
    370376  error_exit:
     
    383389wai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
    384390{
    385         FLGCB   *p_flgcb;
    386         WINFO_FLG winfo_flg;
    387         ER              ercd;
     391        FLGCB           *p_flgcb;
     392        WINFO_FLG       winfo_flg;
     393        ER                      ercd;
    388394
    389395        LOG_WAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn);
     
    411417                winfo_flg.waiptn = waiptn;
    412418                winfo_flg.wfmode = wfmode;
    413                 p_runtsk->tstat = TS_WAITING_FLG;
    414                 wobj_make_wait((WOBJCB *) p_flgcb, (WINFO_WOBJ *) &winfo_flg);
     419                wobj_make_wait((WOBJCB *) p_flgcb, TS_WAITING_FLG,
     420                                                                                        (WINFO_WOBJ *) &winfo_flg);
    415421                dispatch();
    416422                ercd = winfo_flg.winfo.wercd;
     
    477483twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout)
    478484{
    479         FLGCB   *p_flgcb;
    480         WINFO_FLG winfo_flg;
    481         TMEVTB  tmevtb;
    482         ER              ercd;
     485        FLGCB           *p_flgcb;
     486        WINFO_FLG       winfo_flg;
     487        TMEVTB          tmevtb;
     488        ER                      ercd;
    483489
    484490        LOG_TWAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn, tmout);
     
    510516                winfo_flg.waiptn = waiptn;
    511517                winfo_flg.wfmode = wfmode;
    512                 p_runtsk->tstat = TS_WAITING_FLG;
    513                 wobj_make_wait_tmout((WOBJCB *) p_flgcb, (WINFO_WOBJ *) &winfo_flg,
    514                                                                                                                 &tmevtb, tmout);
     518                wobj_make_wait_tmout((WOBJCB *) p_flgcb, TS_WAITING_FLG,
     519                                                                (WINFO_WOBJ *) &winfo_flg, &tmevtb, tmout);
    515520                dispatch();
    516521                ercd = winfo_flg.winfo.wercd;
     
    575580        FLGCB   *p_flgcb;
    576581        ER              ercd;
    577    
     582        bool_t lock;
     583
    578584        LOG_REF_FLG_ENTER(flgid, pk_rflg);
    579         CHECK_TSKCTX_UNL();
     585        lock = sense_lock();
    580586        CHECK_ID(VALID_FLGID(flgid));
    581587        p_flgcb = get_flgcb(flgid);
    582588
    583         lock_cpu();
     589        if (!lock)
     590                lock_cpu();
    584591        if (p_flgcb->p_flginib->flgatr == TA_NOEXS) {
    585592                ercd = E_NOEXS;
     
    590597                ercd = E_OK;
    591598        }
    592         unlock_cpu();
     599        if (!lock)
     600                unlock_cpu();
    593601
    594602  error_exit:
  • EcnlProtoTool/trunk/asp3_dcre/kernel/eventflag.trb

    r321 r429  
    66#
    77#   Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN
    8 #   Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
     8#   Copyright (C) 2015-2019 by Embedded and Real-Time Systems Laboratory
    99#               Graduate School of Information Science, Nagoya Univ., JAPAN
    1010#
     
    5151
    5252  def prepare(key, params)
    53     # flgatrが無効の場合(E_RSATR)[NGKI1562]
     53    # flgatrが無効の場合(E_RSATR)[NGKI1562][NGKI1550]
    5454    #(TA_TPRI,TA_WMUL,TA_CLR以外のビットがセットされている場合)
    5555    if (params[:flgatr] & ~($TA_TPRI|$TA_WMUL|$TA_CLR)) != 0
  • EcnlProtoTool/trunk/asp3_dcre/kernel/exception.trb

    r321 r429  
    66#
    77#   Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN
    8 #   Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
     8#   Copyright (C) 2015-2019 by Embedded and Real-Time Systems Laboratory
    99#               Graduate School of Information Science, Nagoya Univ., JAPAN
    1010#
     
    5151
    5252#
     53#  DEF_EXCで使用できるCPU例外ハンドラ番号のデフォルト定義
     54#
     55if !defined?($EXCNO_DEFEXC_VALID)
     56  $EXCNO_DEFEXC_VALID = $EXCNO_VALID
     57end
     58
     59#
    5360#  CPU例外ハンドラに関するエラーチェック
    5461#
    55 $cfgData[:DEF_EXC].each do |key, params|
    56   # excnoがCPU例外ハンドラ番号として正しくない場合(E_PAR)[NGKI3134]
    57   if $EXCNO_VALID.index(params[:excno]).nil?
     62$cfgData[:DEF_EXC].each do |_, params|
     63  # excnoが有効範囲外の場合(E_PAR)[NGKI3134]
     64  if !$EXCNO_DEFEXC_VALID.include?(params[:excno])
    5865    error_illegal("E_PAR", params, :excno)
    5966  end
    6067
    61   # excatrが無効の場合(E_RSATR)[NGKI3131]
     68  # excatrが無効の場合(E_RSATR)[NGKI3131][NGKI5178][NGKI3123]
    6269  #(TARGET_EXCATR以外のビットがセットされている場合)
    6370  if (params[:excatr] & ~($TARGET_EXCATR)) != 0
    6471    error_illegal_sym("E_RSATR", params, :excatr, :excno)
     72  end
     73
     74  # ターゲット依存のエラーチェック
     75  if defined? TargetCheckDefExc()
     76    TargetCheckDefExc(params)
    6577  end
    6678end
     
    8294    #  CPU例外ハンドラのエントリ
    8395    #
    84     $cfgData[:DEF_EXC].each do |key, params|
     96    $cfgData[:DEF_EXC].each do |_, params|
    8597      $kernelCfgC.add("EXCHDR_ENTRY(#{params[:excno]}, " \
    8698                                                "#{params[:excno].val}, #{params[:exchdr]})")
     
    92104    #
    93105    $kernelCfgC.add("const EXCINIB _kernel_excinib_table[TNUM_DEF_EXCNO] = {")
    94     $cfgData[:DEF_EXC].each_with_index do |(key, params), index|
     106    $cfgData[:DEF_EXC].each_with_index do |(_, params), index|
    95107      $kernelCfgC.add(",") if index > 0
    96108      $kernelCfgC.append("\t{ (#{params[:excno]}), (#{params[:excatr]}), " \
  • EcnlProtoTool/trunk/asp3_dcre/kernel/genoffset.trb

    r321 r429  
    11# -*- coding: utf-8 -*-
     2#
     3#   TOPPERS Software
     4#       Toyohashi Open Platform for Embedded Real-Time Systems
    25#
    3 #   TOPPERS/ASP Kernel
    4 #       Toyohashi Open Platform for Embedded Real-Time Systems/
    5 #       Advanced Standard Profile Kernel
    6 #
    7 #   Copyright (C) 2011-2016 by Embedded and Real-Time Systems Laboratory
     6#   Copyright (C) 2011-2018 by Embedded and Real-Time Systems Laboratory
    87#               Graduate School of Information Science, Nagoya Univ., JAPAN
    98
     
    3736#   の責任を負わない.
    3837#
    39 #   $Id$
     38#   $Id: genoffset.trb 936 2018-04-07 09:46:42Z ertl-hiro $
    4039#
    4140
     
    4443#
    4544
    46 # 
     45#
    4746#  タイムスタンプファイルの指定
    48 # 
     47#
    4948$timeStampFileName = "offset.timestamp"
    5049
    51 # 
     50#
    5251#  offset.hの先頭部分の生成
    53 # 
     52#
    5453$offsetH = GenFile.new("offset.h")
    5554$offsetH.add2("/* offset.h */")
    5655
    57 #
    58 #  #defineディレクティブの生成
    59 #
    60 def GenerateDefine(symbol, value)
    61   $offsetH.add("#define #{symbol}\t#{value}")
    62 end
    63 
    64 #
     56#
    6557#  ビットのサーチ
    66 # 
     58#
    6759def SearchBit(val)
    6860  (0..7).each do |valBit|
     
    7466end
    7567
    76 # 
    77 #  ビットフィールドのオフセットとビット位置の定義の生成
    78 # 
    79 def GenerateDefineBit(label, structSize, outputSize)
     68#
     69#  ビットフィールドのオフセットとビット位置の算出
     70#
     71def BitOffsetPosition(label, structSize, outputSize)
    8072  top = SYMBOL(label)
    8173  if top.nil?
     
    9688      error_exit("bit not found in `#{label}'")
    9789    else
    98       valBit = SearchBit(val)
     90      position = SearchBit(val)
    9991      case outputSize
    100       when "W"
    101         if $SIL_ENDIAN_BIG
    102           valBit = valBit + 24 - ((offset & 0x03) << 3)
     92      when 4, "W"
     93        if $endianLittle
     94          position = position + ((offset & 0x03) << 3)
    10395        else
    104           valBit = valBit + ((offset & 0x03) << 3)
     96          position = position + 24 - ((offset & 0x03) << 3)
    10597        end
    10698        offset &= ~0x03
    107       when "H"
    108         if $SIL_ENDIAN_BIG
    109           valBit = valBit + 8 - ((offset & 0x01) << 3)
     99      when 2, "H"
     100        if $endianLittle
     101          position = position + ((offset & 0x01) << 3)
    110102        else
    111           valBit = valBit + ((offset & 0x01) << 3)
     103          position = position + 8 - ((offset & 0x01) << 3)
    112104        end
    113105        offset &= ~0x01
    114106      end
    115107    end
    116 
    117     $offsetH.add("#define #{label}\t#{offset}")
    118     $offsetH.add("#define #{label}_bit\t#{valBit}")
    119     $offsetH.add("#define #{label}_mask\t#{sprintf("0x%x", 1 << valBit)}")
     108    return offset, position
    120109  end
    121110end
    122111
    123 #
    124 #  バイト配置のチェック
    125 #
    126 def magicCheck(size, check)
    127   label = "MAGIC_#{size}"
    128   top = SYMBOL(label)
    129   if top.nil?
    130     error_exit("label `#{label}' not found")
    131   else
    132     1.upto(size).each do |offset|
    133       if $SIL_ENDIAN_BIG
    134         val = PEEK(top + offset - 1, 1)
    135       else
    136         val = PEEK(top + size - offset, 1)
    137       end
    138       if val != check.at(offset - 1)
    139         error_exit("value check of `#{label}' failed")
    140       end
    141     end
     112# 以下の定義は,過去のバージョンとの互換性のために残している.
     113
     114#
     115#  #defineディレクティブの生成
     116#
     117def GenerateDefine(symbol, value)
     118  $offsetH.add("#define #{symbol}\t#{value}")
     119end
     120
     121#
     122#  ビットフィールドのオフセットとビット位置の定義の生成
     123#
     124def GenerateDefineBit(label, structSize, outputSize)
     125  offset, position = BitOffsetPosition(label, structSize, outputSize)
     126  if !offset.nil?
     127    GenerateDefine(label, offset)
     128    GenerateDefine("#{label}_bit", position)
     129    GenerateDefine("#{label}_mask", sprintf("0x%x", 1 << position))
    142130  end
    143131end
    144 
    145 magicCheck(1, [ 0x12 ])
    146 magicCheck(2, [ 0x12, 0x34 ])
    147 magicCheck(4, [ 0x12, 0x34, 0x56, 0x78 ])
  • EcnlProtoTool/trunk/asp3_dcre/kernel/interrupt.c

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2005-2016 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2005-2019 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    9393#endif /* LOG_ENA_INT_LEAVE */
    9494
     95#ifndef LOG_CLR_INT_ENTER
     96#define LOG_CLR_INT_ENTER(intno)
     97#endif /* LOG_CLR_INT_ENTER */
     98
     99#ifndef LOG_CLR_INT_LEAVE
     100#define LOG_CLR_INT_LEAVE(ercd)
     101#endif /* LOG_CLR_INT_LEAVE */
     102
     103#ifndef LOG_RAS_INT_ENTER
     104#define LOG_RAS_INT_ENTER(intno)
     105#endif /* LOG_RAS_INT_ENTER */
     106
     107#ifndef LOG_RAS_INT_LEAVE
     108#define LOG_RAS_INT_LEAVE(ercd)
     109#endif /* LOG_RAS_INT_LEAVE */
     110
     111#ifndef LOG_PRB_INT_ENTER
     112#define LOG_PRB_INT_ENTER(intno)
     113#endif /* LOG_PRB_INT_ENTER */
     114
     115#ifndef LOG_PRB_INT_LEAVE
     116#define LOG_PRB_INT_LEAVE(ercd)
     117#endif /* LOG_PRB_INT_LEAVE */
     118
    95119#ifndef LOG_CHG_IPM_ENTER
    96120#define LOG_CHG_IPM_ENTER(intpri)
     
    108132#define LOG_GET_IPM_LEAVE(ercd, p_intpri)
    109133#endif /* LOG_GET_IPM_LEAVE */
     134
     135/*
     136 *  割込み番号の範囲の判定
     137 */
     138#ifndef VALID_INTNO_DISINT
     139#define VALID_INTNO_DISINT(intno)       VALID_INTNO(intno)
     140#endif /* VALID_INTNO_DISINT */
     141
     142#ifndef VALID_INTNO_CLRINT
     143#define VALID_INTNO_CLRINT(intno)       VALID_INTNO(intno)
     144#endif /* VALID_INTNO_CLRINT */
     145
     146#ifndef VALID_INTNO_RASINT
     147#define VALID_INTNO_RASINT(intno)       VALID_INTNO(intno)
     148#endif /* VALID_INTNO_RASINT */
     149
     150#ifndef VALID_INTNO_PRBINT
     151#define VALID_INTNO_PRBINT(intno)       VALID_INTNO(intno)
     152#endif /* VALID_INTNO_PRBINT */
     153
     154#ifndef VALID_INTNO_CREISR
     155#define VALID_INTNO_CREISR(intno)       VALID_INTNO(intno)
     156#endif /* VALID_INTNO_CREISR */
     157
     158/*
     159 *  割込み優先度の範囲の判定
     160 */
     161#ifndef VALID_INTPRI_CHGIPM
     162#define VALID_INTPRI_CHGIPM(intpri)     \
     163                                        (TMIN_INTPRI <= (intpri) && (intpri) <= TIPM_ENAALL)
     164#endif /* VALID_INTPRI_CHGIPM */
    110165
    111166/*
     
    266321        isrpri = pk_cisr->isrpri;
    267322
    268         CHECK_RSATR(isratr, TARGET_ISRATR);
     323        CHECK_VALIDATR(isratr, TARGET_ISRATR);
    269324        CHECK_PAR(VALID_INTNO_CREISR(intno));
    270325        CHECK_PAR(FUNC_ALIGN(isr));
     
    384439                lock_cpu();
    385440        }
    386         if (disable_int(intno)) {                                       /*[NGKI3086]*/
     441        if (check_intno_cfg(intno)) {
     442                disable_int(intno);                                             /*[NGKI3086]*/
    387443                ercd = E_OK;
    388444        }
     
    421477                lock_cpu();
    422478        }
    423         if (enable_int(intno)) {                                        /*[NGKI3099]*/
     479        if (check_intno_cfg(intno)) {
     480                enable_int(intno);                                              /*[NGKI3099]*/
    424481                ercd = E_OK;
    425482        }
     
    438495#endif /* TOPPERS_SUPPORT_ENA_INT */
    439496#endif /* TOPPERS_ena_int */
     497
     498/*
     499 *  割込み要求のクリア[NGKI3920]
     500 */
     501#ifdef TOPPERS_clr_int
     502#ifdef TOPPERS_SUPPORT_CLR_INT                                  /*[NGKI3927]*/
     503
     504ER
     505clr_int(INTNO intno)
     506{
     507        bool_t  locked;
     508        ER              ercd;
     509
     510        LOG_CLR_INT_ENTER(intno);
     511        CHECK_PAR(VALID_INTNO_CLRINT(intno));           /*[NGKI3921][NGKI3930]*/
     512
     513        locked = sense_lock();
     514        if (!locked) {
     515                lock_cpu();
     516        }
     517        if (check_intno_cfg(intno) && check_intno_clear(intno)) {
     518                clear_int(intno);                                               /*[NGKI3924]*/
     519                ercd = E_OK;
     520        }
     521        else {
     522                ercd = E_OBJ;                                                   /*[NGKI3923][NGKI3929]*/
     523        }
     524        if (!locked) {
     525                unlock_cpu();
     526        }
     527
     528  error_exit:
     529        LOG_CLR_INT_LEAVE(ercd);
     530        return(ercd);
     531}
     532
     533#endif /* TOPPERS_SUPPORT_CLR_INT */
     534#endif /* TOPPERS_clr_int */
     535
     536/*
     537 *  割込みの要求[NGKI3932]
     538 */
     539#ifdef TOPPERS_ras_int
     540#ifdef TOPPERS_SUPPORT_RAS_INT                                  /*[NGKI3939]*/
     541
     542ER
     543ras_int(INTNO intno)
     544{
     545        bool_t  locked;
     546        ER              ercd;
     547
     548        LOG_RAS_INT_ENTER(intno);
     549        CHECK_PAR(VALID_INTNO_RASINT(intno));           /*[NGKI3933][NGKI3942]*/
     550
     551        locked = sense_lock();
     552        if (!locked) {
     553                lock_cpu();
     554        }
     555        if (check_intno_cfg(intno) && check_intno_raise(intno)) {
     556                raise_int(intno);                                               /*[NGKI3936]*/
     557                ercd = E_OK;
     558        }
     559        else {
     560                ercd = E_OBJ;                                                   /*[NGKI3935][NGKI3941]*/
     561        }
     562        if (!locked) {
     563                unlock_cpu();
     564        }
     565
     566  error_exit:
     567        LOG_RAS_INT_LEAVE(ercd);
     568        return(ercd);
     569}
     570
     571#endif /* TOPPERS_SUPPORT_RAS_INT */
     572#endif /* TOPPERS_ras_int */
     573
     574/*
     575 *  割込み要求のチェック[NGKI3944]
     576 */
     577#ifdef TOPPERS_prb_int
     578#ifdef TOPPERS_SUPPORT_PRB_INT                                  /*[NGKI3951]*/
     579
     580ER_BOOL
     581prb_int(INTNO intno)
     582{
     583        bool_t  locked;
     584        ER_BOOL ercd;
     585
     586        LOG_PRB_INT_ENTER(intno);
     587        CHECK_PAR(VALID_INTNO_PRBINT(intno));           /*[NGKI3945][NGKI3952]*/
     588
     589        locked = sense_lock();
     590        if (!locked) {
     591                lock_cpu();
     592        }
     593        if (check_intno_cfg(intno)) {
     594                ercd = (ER_BOOL) probe_int(intno);              /*[NGKI3948]*/
     595        }
     596        else {
     597                ercd = E_OBJ;                                                   /*[NGKI3947]*/
     598        }
     599        if (!locked) {
     600                unlock_cpu();
     601        }
     602
     603  error_exit:
     604        LOG_PRB_INT_LEAVE(ercd);
     605        return(ercd);
     606}
     607
     608#endif /* TOPPERS_SUPPORT_PRB_INT */
     609#endif /* TOPPERS_prb_int */
    440610
    441611/*
     
    456626        t_set_ipm(intpri);                                                      /*[NGKI3111]*/
    457627        if (intpri == TIPM_ENAALL && enadsp) {
    458                 dspflg = true;
    459                 p_schedtsk = search_schedtsk();
     628                set_dspflg();
    460629                if (p_runtsk->raster && p_runtsk->enater) {
    461630                        task_terminate(p_runtsk);
  • EcnlProtoTool/trunk/asp3_dcre/kernel/interrupt.trb

    r321 r429  
    66#
    77#   Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN
    8 #   Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
     8#   Copyright (C) 2015-2019 by Embedded and Real-Time Systems Laboratory
    99#               Graduate School of Information Science, Nagoya Univ., JAPAN
    1010#
     
    3838#   の責任を負わない.
    3939#
    40 #   $Id$
     40#   $Id: interrupt.trb 1167 2019-02-03 17:06:17Z ertl-hiro $
    4141#
    4242
     
    5454#  フォルト定義
    5555#
    56 if $INTNO_CREISR_VALID.nil?
     56if !defined?($INTNO_CREISR_VALID)
    5757  $INTNO_CREISR_VALID = $INTNO_VALID
    5858end
    59 if $INHNO_CREISR_VALID.nil?
     59if !defined?($INHNO_CREISR_VALID)
    6060  $INHNO_CREISR_VALID = $INHNO_VALID
    6161end
     
    6464#  CFG_INTで使用できる割込み優先度のデフォルト定義
    6565#
    66 if $INTPRI_CFGINT_VALID.nil?
     66if !defined?($INTPRI_CFGINT_VALID)
    6767  $INTPRI_CFGINT_VALID = $TMIN_INTPRI.upto($TMAX_INTPRI).to_a
    6868end
     
    8787#  割込み要求ラインに関するエラーチェック
    8888#
    89 $cfgData[:CFG_INT].each do |key, params|
    90   #     intnoが割込み番号として正しくない場合(E_PAR)[NGKI2972]
    91   if $INTNO_VALID.index(params[:intno]).nil?
     89$cfgData[:CFG_INT].each do |_, params|
     90  # intnoが有効範囲外の場合(E_PAR)[NGKI2972]
     91  if !$INTNO_VALID.include?(params[:intno])
    9292    error_illegal("E_PAR", params, :intno)
    9393  end
    9494
    95   #     intatrが無効の場合(E_RSATR)[NGKI2969
     95  # intatrが無効の場合(E_RSATR)[NGKI2969][NGKI2944][NGKI2945
    9696  #(TA_ENAINT,TA_EDGE,TARGET_INTATR以外のビットがセットされている場合)
    9797  if (params[:intatr] & ~($TA_ENAINT|$TA_EDGE|$TARGET_INTATR)) != 0
     
    9999  end
    100100
    101   #     intpriがCFG_INTに対する割込み優先度として正しくない場合(E_PAR)
    102   #     [NGKI2973]
    103   if $INTPRI_CFGINT_VALID.index(params[:intpri]).nil?
    104     error_illegal_sym("E_OBJ", params, :intpri, :intno)
    105   end
    106 
    107   # カーネル管理外に固定されているintnoに対して,intpriにTMIN_INTPRI
    108   #     りも小さい値が指定されなかった場合(E_OBJ)[NGKI2983]
    109   if !$INTNO_FIX_NONKERNEL.nil?
    110     if !$INTNO_FIX_NONKERNEL.index(params[:intno]).nil?
    111       if params[:intpri] >= $TMIN_INTPRI
    112         error_ercd("E_OBJ", params, "%%intno must have higher priority " \
     101  # intpriがCFG_INTに対する割込み優先度として正しくない場合(E_PAR)
     102  # [NGKI2973]
     103  if !$INTPRI_CFGINT_VALID.include?(params[:intpri])
     104    error_illegal_sym("E_PAR", params, :intpri, :intno)
     105  end
     106
     107  # カーネル管理外に固定されているintnoに対して,intpriにTMIN_INTPRI
     108  # 上の値が指定された場合(E_OBJ)[NGKI2983]
     109  if defined?($INTNO_FIX_NONKERNEL) \
     110                                && $INTNO_FIX_NONKERNEL.include?(params[:intno])
     111    if params[:intpri] >= $TMIN_INTPRI
     112      error_ercd("E_OBJ", params, "%%intno must have higher priority " \
    113113                                                                                        "than TMIN_INTPRI in %apiname")
    114       end
    115     end
    116   end
    117 
    118   #     カーネル管理に固定されているintnoに対して,intpriにTMIN_INTPRIより
    119   #     も小さい値が指定された場合(E_OBJ)[NGKI2984]
    120   if !$INTNO_FIX_KERNEL.nil?
    121     if !$INTNO_FIX_KERNEL.index(params[:intno]).nil?
    122       if params[:intpri] < $TMIN_INTPRI
    123         error_ercd("E_OBJ", params, "%%intno must have lower or equal " \
     114    end
     115  end
     116
     117  # カーネル管理に固定されているintnoに対して,intpriにTMIN_INTPRIより
     118  # も小さい値が指定された場合(E_OBJ)[NGKI2984]
     119  if defined?($INTNO_FIX_KERNEL) \
     120                                && $INTNO_FIX_KERNEL.include?(params[:intno])
     121    if params[:intpri] < $TMIN_INTPRI
     122      error_ercd("E_OBJ", params, "%%intno must have lower or equal " \
    124123                                                                        "priority to TMIN_INTPRI in %apiname")
    125       end
    126     end
     124    end
     125  end
     126
     127  # ターゲット依存のエラーチェック[NGKI2985]
     128  if defined? TargetCheckCfgInt()
     129    TargetCheckCfgInt(params)
    127130  end
    128131end
     
    131134#  割込みハンドラに関するエラーチェック
    132135#
    133 $cfgData[:DEF_INH].each do |key, params|
    134   # inhnoが割込みハンドラ番号として正しくない場合(E_PAR)[NGKI3055]
    135   if $INHNO_VALID.index(params[:inhno]).nil?
     136$cfgData[:DEF_INH].each do |_, params|
     137  # inhnoが有効範囲外の場合(E_PAR)[NGKI3055]
     138  if !$INHNO_VALID.include?(params[:inhno])
    136139    error_illegal("E_PAR", params, :inhno)
    137140  end
    138141
    139   # inhatrが無効の場合(E_RSATR)[NGKI3052]
     142  # inhatrが無効の場合(E_RSATR)[NGKI3052][NGKI2957][NGKI2959]
    140143  #(TARGET_INHATR以外のビットがセットされている場合)
    141144  if (params[:inhatr] & ~($TARGET_INHATR)) != 0
     
    143146  end
    144147
    145   #     カーネル管理外に固定されているinhnoに対して,inhatrにTA_NONKERNELが
    146   #     指定されていない場合(E_RSATR)[NGKI3067]
    147   if !$INHNO_FIX_NONKERNEL.nil?
    148     if !$INHNO_FIX_NONKERNEL.index(params[:inhno]).nil?
    149       if (params[:inhatr] & $TA_NONKERNEL) == 0
    150         error_ercd("E_RSATR", params, "%%inhno must be " \
     148  # カーネル管理外に固定されているinhnoに対して,inhatrにTA_NONKERNELが
     149  # 指定されていない場合(E_RSATR)[NGKI3067]
     150  if defined?($INHNO_FIX_NONKERNEL) \
     151                                && $INHNO_FIX_NONKERNEL.include?(params[:inhno])
     152    if (params[:inhatr] & $TA_NONKERNEL) == 0
     153      error_ercd("E_RSATR", params, "%%inhno must be " \
    151154                                                                "non-kernel interrupt in %apiname")
    152       end
    153     end
    154   end
    155 
    156   #     カーネル管理に固定されているinhnoに対して,inhatrにTA_NONKERNELが指
    157   #     定されている場合(E_RSATR)[NGKI3068]
    158   if !$INHNO_FIX_KERNEL.nil?
    159     if !$INHNO_FIX_KERNEL.index(params[:inhno]).nil?
    160       if (params[:inhatr] & $TA_NONKERNEL) != 0
    161         error_ercd("E_RSATR", params, "%%inhno must not be " \
     155    end
     156  end
     157
     158  # カーネル管理に固定されているinhnoに対して,inhatrにTA_NONKERNELが指
     159  # 定されている場合(E_RSATR)[NGKI3068]
     160  if defined?($INHNO_FIX_KERNEL) \
     161                                && $INHNO_FIX_KERNEL.include?(params[:inhno])
     162    if (params[:inhatr] & $TA_NONKERNEL) != 0
     163      error_ercd("E_RSATR", params, "%%inhno must not be " \
    162164                                                                "non-kernel interrupt in %apiname")
    163       end
    164     end
    165   end
    166 
    167   if $toIntnoVal.has_key?(params[:inhno].val)
     165    end
     166  end
     167
     168  if $INHNO_CREISR_VALID.include?(params[:inhno])
     169    # 割込みハンドラ番号に対応する割込み番号がある場合
    168170    intnoVal = $toIntnoVal[params[:inhno].val]
    169171
     
    174176    else
    175177      intnoParams = $cfgData[:CFG_INT][intnoVal]
     178
    176179      if (params[:inhatr] & $TA_NONKERNEL) == 0
    177180        # inhatrにTA_NONKERNELが指定されておらず,inhnoに対応するintno
     
    193196    end
    194197  end
     198
     199  # ターゲット依存のエラーチェック[NGKI3078]
     200  if defined? TargetCheckDefInh()
     201    TargetCheckDefInh(params)
     202  end
    195203end
    196204
     
    198206#  割込みサービスルーチン(ISR)に関するエラーチェック
    199207#
    200 $cfgData[:CRE_ISR].sort.each do |key, params|
    201   #     isratrが無効の場合(E_RSATR)[NGKI2998
     208$cfgData[:CRE_ISR].sort.each do |_, params|
     209  # isratrが無効の場合(E_RSATR)[NGKI2998][NGKI2952][NGKI5176
    202210  #(TARGET_ISRATR以外のビットがセットされている場合)
    203211  if (params[:isratr] & ~($TARGET_ISRATR)) != 0
     
    205213  end
    206214
    207   #     intnoがCRE_ISRに対する割込み番号として正しくない場合(E_PAR)
    208   #     [NGKI3003]
    209   if $INTNO_CREISR_VALID.index(params[:intno]).nil?
     215  # intnoが有効範囲外の場合(E_PAR)[NGKI3003]
     216  if !$INTNO_CREISR_VALID.include?(params[:intno])
    210217    error_illegal("E_PAR", params, "intno")
    211218  end
    212219
    213   #     (TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI)でない場合(E_PAR)
    214   #     [NGKI3005]
     220  # isrpriが有効範囲外の場合(E_PAR)[NGKI3005]
     221  #(TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRIでない場合)
    215222  if !($TMIN_ISRPRI <= params[:isrpri] && params[:isrpri] <= $TMAX_ISRPRI)
    216223    error_illegal("E_PAR", params, "isrpri")
    217224  end
    218 end
    219 
    220 $INTNO_CREISR_VALID.each do |intnoVal|
    221   # 割込み番号intnoに対して登録されたISRのリストの作成
    222   isrParamsList = []
    223   $cfgData[:CRE_ISR].sort.each do |key, params|
    224     if params[:intno] == intnoVal
    225       isrParamsList.push(params)
    226     end
    227   end
    228 
    229   #     割込み番号intnoに対して登録されたISRが存在する場合
    230   if isrParamsList.size > 0
    231     inhnoVal = $toInhnoVal[intnoVal]
    232 
    233     # intnoに対応するinhnoに対してDEF_INHがある場合(E_OBJ)[NGKI3013]
    234     if $cfgData[:DEF_INH].has_key?(inhnoVal)
    235       inhnoParams = $cfgData[:DEF_INH][inhnoVal]
    236       error_ercd("E_OBJ", isrParamsList[0], "%%intno in %apiname " \
    237                                         "is duplicated with inhno #{inhnoParams[:inhno]}")
    238     end
    239 
    240     # intnoに対するCFG_INTがない場合(E_OBJ)[NGKI3012]
    241     if !$cfgData[:CFG_INT].has_key?(intnoVal)
    242       error_ercd("E_OBJ", isrParamsList[0], "%%intno in %apiname " \
     225
     226  # intnoに対応するinhnoに対してDEF_INHがある場合(E_OBJ)[NGKI3013]
     227  inhnoVal = $toInhnoVal[params[:intno].val]
     228  if $cfgData[:DEF_INH].has_key?(inhnoVal)
     229    error_ercd("E_OBJ", params, "%%intno in %apiname is duplicated " \
     230                                        "with inhno #{$cfgData[:DEF_INH][inhnoVal][:inhno]}")
     231  end
     232
     233  # intnoに対するCFG_INTがない場合(E_OBJ)[NGKI3012]
     234  if !$cfgData[:CFG_INT].has_key?(params[:intno])
     235    error_ercd("E_OBJ", params, "%%intno in %apiname " \
    243236                                                                        "is not configured with CFG_INT")
    244     else
    245       intnoParams = $cfgData[:CFG_INT][intnoVal]
    246 
    247       # intnoに対してCFG_INTで設定された割込み優先度がTMIN_INTPRIよりも
    248       # 小さい場合(E_OBJ)[NGKI3014]
    249       if intnoParams[:intpri] < $TMIN_INTPRI
    250         error_ercd("E_OBJ", isrParamsList[0],
    251                                                 "intpri `#{intnoParams[:intpri]}' configured for " \
    252                                                 "%%intno with CFG_INT in higher than TMIN_INTPRI")
    253       end
    254     end
     237  else
     238    intnoParams = $cfgData[:CFG_INT][params[:intno]]
     239
     240    # intnoでカーネル管理外の割込みを指定した場合(E_OBJ)[NGKI3014]
     241    #(intnoに対してCFG_INTで設定された割込み優先度がTMIN_INTPRIよりも小
     242    #  さい場合)
     243    if intnoParams[:intpri] < $TMIN_INTPRI
     244      error_ercd("E_OBJ", params,
     245                                        "intpri `#{intnoParams[:intpri]}' configured for " \
     246                                        "%%intno with CFG_INT in higher than TMIN_INTPRI")
     247    end
     248  end
     249
     250  # ターゲット依存のエラーチェック
     251  if defined? TargetCheckCreIsr()
     252    TargetCheckCreIsr(params)
    255253  end
    256254end
     
    298296  inhnoVal = $toInhnoVal[intnoVal]
    299297
    300   # 次のDEF_INHに相当するデータを生成
     298  # 次の静的APIに相当するデータを生成
    301299  # DEF_INH(inhno, { TA_NULL, _kernel_inthdr_<intno> } );
    302300  $cfgData[:DEF_INH][inhnoVal] = {
     
    306304  }
    307305
    308   # 割込みサービスルーチン用の割込みハンドラ
     306  # 割込みサービスルーチンを呼び出す割込みハンドラの生成[NGKI2941]
    309307  $kernelCfgC.add("void")
    310308  $kernelCfgC.add("_kernel_inthdr_#{intnoVal}(void)")
     
    335333
    336334# 割込みサービスルーチン生成順序テーブルの生成
    337 $kernelCfgC.add("const ID _kernel_isrorder_table[TNUM_SISRID] = { ")
    338 $kernelCfgC.append("\t")
    339 $cfgData[:CRE_ISR].each_with_index do |(key, params), index|
    340   $kernelCfgC.append(", ") if index > 0
    341   $kernelCfgC.append("#{params[:isrid]}")
    342 end
    343 $kernelCfgC.add
    344 $kernelCfgC.add2("};")
     335if $cfgData[:CRE_ISR].size != 0
     336  $kernelCfgC.add("const ID _kernel_isrorder_table[TNUM_SISRID] = { ")
     337  $kernelCfgC.append("\t")
     338  $cfgData[:CRE_ISR].each_with_index do |(_, params), index|
     339    $kernelCfgC.append(", ") if index > 0
     340    $kernelCfgC.append("#{params[:isrid]}")
     341  end
     342  $kernelCfgC.add
     343  $kernelCfgC.add2("};")
     344else
     345  $kernelCfgC.add2("TOPPERS_EMPTY_LABEL(const ID, " \
     346                                                                                "_kernel_isrorder_table);")
     347end
    345348
    346349#
     
    360363    #  割込みハンドラのエントリ
    361364    #
    362     $cfgData[:DEF_INH].each do |key, params|
     365    $cfgData[:DEF_INH].each do |_, params|
    363366      if (params[:inhatr] & $TA_NONKERNEL) == 0
    364367        $kernelCfgC.add("INTHDR_ENTRY(#{params[:inhno]}, " \
     
    372375    #
    373376    $kernelCfgC.add("const INHINIB _kernel_inhinib_table[TNUM_DEF_INHNO] = {")
    374     $cfgData[:DEF_INH].each_with_index do |(key, params), index|
     377    $cfgData[:DEF_INH].each_with_index do |(_, params), index|
    375378      $kernelCfgC.add(",") if index > 0
    376379      if (params[:inhatr] & $TA_NONKERNEL) == 0
     
    407410  if $cfgData[:CFG_INT].size != 0
    408411    $kernelCfgC.add("const INTINIB _kernel_intinib_table[TNUM_CFG_INTNO] = {")
    409     $cfgData[:CFG_INT].each_with_index do |(key, params), index|
     412    $cfgData[:CFG_INT].each_with_index do |(_, params), index|
    410413      $kernelCfgC.add(",") if index > 0
    411414      $kernelCfgC.append("\t{ (#{params[:intno]}), (#{params[:intatr]}), " \
  • EcnlProtoTool/trunk/asp3_dcre/kernel/kernel.trb

    r321 r429  
    66#
    77#   Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN
    8 #   Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
     8#   Copyright (C) 2015-2019 by Embedded and Real-Time Systems Laboratory
    99#               Graduate School of Information Science, Nagoya Univ., JAPAN
    1010#
     
    3838#   の責任を負わない.
    3939#
    40 #   $Id$
     40#   $Id: kernel.trb 1167 2019-02-03 17:06:17Z ertl-hiro $
    4141#
    4242
     
    7575
    7676#
    77 #  インクルードディレクティブ(#include)
     77#  インクルードディレクティブ(#include)の生成
    7878#
    7979$kernelCfgC.comment_header("Include Directives")
    80 $includeFiles.each do |file|
    81   $kernelCfgC.add("#include #{file}")
    82 end
     80GenerateIncludes($kernelCfgC)
    8381$kernelCfgC.add()
    8482
     
    9189  def AllocStack(stack, size)
    9290    # 大きい方に丸めたサイズで確保する[NGKI1050][NGKI3220]
    93     $kernelCfgC.add("/*static*/ STK_T #{stack}[COUNT_STK_T(#{size})];")
     91    $kernelCfgC.add("static STK_T #{stack}[COUNT_STK_T(#{size})];")
    9492    return("ROUND_STK_T(#{size})")
    9593  end
     
    107105    @OBJ_S = obj_s.tr("a-z", "A-Z")
    108106    @objid = (obj + "id").to_sym
     107    @noobj = ("no" + obj).to_sym
    109108    @api = "CRE_#{@OBJ}".to_sym
     109    @aidapi = "AID_#{@OBJ}".to_sym
    110110    @inibList = { "#{@OBJ_S}INIB" => "a#{@obj_s}inib_table"}
    111111  end
     
    114114    # AID_@OBJの処理
    115115    numAutoObjid = 0
    116     $cfgData["AID_#{@OBJ}".to_sym].each do |key, params|
    117       numAutoObjid += params["no#{@obj}".to_sym]
     116    $cfgData[@aidapi].each do |_, params|
     117      numAutoObjid += params[@noobj]
    118118    end
    119119    numObjid = $cfgData[@api].size + numAutoObjid
     
    123123
    124124    # オブジェクトのID番号のマクロ定義の生成
    125     $cfgData[@api].sort.each do |key, params|
     125    $cfgData[@api].sort.each do |_, params|
    126126      $kernelCfgH.add("#define #{params[@objid]}\t#{params[@objid].val}")
    127127    end
     
    130130    # オブジェクトのID番号を保持する変数
    131131    if $USE_EXTERNAL_ID
    132       $cfgData[@api].sort.each do |key, params|
     132      $cfgData[@api].sort.each do |_, params|
    133133        $kernelCfgC.add("const ID #{params[@objid]}_id" \
    134134                                                                                " = #{params[@objid].val};")
     
    203203  nfymode1 = nfymode & 0x0f
    204204  nfymode2 = nfymode & ~0x0f
    205   par1 = params[:par1]
     205  # par1 = params[:par1]
    206206  par2 = params[:par2]
    207207
     
    232232    error_api(params, "too many parameters for nfymode `#{nfymode}' " \
    233233                                                                                        "in %apiname of %#{objid}")
    234   elsif nfymode == $TNFY_HANDLER
     234  elsif nfymode1 == $TNFY_HANDLER && nfymode2 == 0              #[NGKI3721]
    235235    # タイムイベントハンドラの呼出し
    236236    funcname = "(NFYHDR)(#{par2})"
     
    269269
    270270    # イベント通知処理の処理
    271     if nfymode1 == $TNFY_SETVAR && nfymode2 == 0
     271    if nfymode1 == $TNFY_SETVAR && nfymode2 == 0                #[NGKI3721]
    272272      # 変数の設定
    273273      $kernelCfgC.add("\t*((intptr_t *) exinf) = (#{par2});")
    274     elsif nfymode1 == $TNFY_INCVAR && nfymode2 == 0
     274    elsif nfymode1 == $TNFY_INCVAR && nfymode2 == 0             #[NGKI3721]
    275275      # 変数のインクリメント
    276276      $kernelCfgC.add("\t(void) loc_cpu();")
     
    293293      $kernelCfgC.add("\t#{errorCode}psnd_dtq(((ID) exinf), #{par2});")
    294294    else
     295      # nfymodeの値が正しくない場合(E_PAR)[NGKI3730]
    295296      error_illegal_id("E_PAR", params, :nfymode, objid)
    296297    end
    297                        
     298
    298299    if nfymode2 != 0
    299300      # エラー通知処理の処理
    300301      $kernelCfgC.add("\tif (ercd != E_OK) {")
    301 
    302302
    303303      if nfymode2 == $TENFY_SETVAR
     
    326326                                                                                                        " (intptr_t) ercd);")
    327327      else
     328        # nfymodeの値が正しくない場合(E_PAR)[NGKI3730]
    328329        error_illegal_id("E_PAR", params, :nfymode, objid)
    329330      end
     
    360361if $cfgData[:DEF_ICS].size == 0
    361362  # DEF_ICSがない場合のデフォルト値の設定
    362   if $DEFAULT_ISTK.nil?
     363  if !defined?($DEFAULT_ISTK)
    363364    # スタック領域の自動割付け
    364365    istksz = AllocStack("_kernel_istack", "DEFAULT_ISTKSZ")
     
    369370  end
    370371else
    371   # 静的API「DEF_ICS」が複数ある(E_OBJ)[NGKI3216]
     372  # 静的API「DEF_ICS」が複数ある場合(E_OBJ)[NGKI3216]
    372373  if $cfgData[:DEF_ICS].size > 1
    373374    error("E_OBJ: too many DEF_ICS")
     
    375376
    376377  # DEF_ICSがある場合の処理
    377   params = $cfgData[:DEF_ICS][1]
     378  params0 = $cfgData[:DEF_ICS][1]
    378379
    379380  # パラメータが省略された時のデフォルト値の設定
    380   params[:istk] ||= "NULL"
     381  params0[:istk] ||= "NULL"
    381382
    382383  # istkszがターゲット定義の最小値(TARGET_MIN_ISTKSZ,未定義の場合は1)
    383384  # よりも小さい場合(E_PAR)[NGKI3254]
    384   if params[:istksz] < $TARGET_MIN_ISTKSZ
    385     error_wrong("E_PAR", params, :istksz, "too small")
    386   end
    387 
    388   if params[:istk] == "NULL"
     385  if params0[:istksz] < $TARGET_MIN_ISTKSZ
     386    error_wrong("E_PAR", params0, :istksz, "too small")
     387  end
     388
     389  if params0[:istk] == "NULL"
    389390    # スタック領域の自動割付け
    390     istksz = AllocStack("_kernel_istack", params[:istksz])
     391    istksz = AllocStack("_kernel_istack", params0[:istksz])
    391392    istk = "_kernel_istack"
    392393  else
    393     # istkszがスタック領域のサイズとして正しくない場合(E_PAR)[NGKI3222]
    394     if (params[:istksz] & ($CHECK_STKSZ_ALIGN - 1)) != 0
    395       error_wrong("E_PAR", params, :istksz, "not aligned")
    396     end
    397 
    398     istksz = "(#{params[:istksz]})"
    399     istk = "(void *)(#{params[:istk]})"
     394    # istkszがターゲット定義の制約に合致しない場合(E_PAR)[NGKI3222]
     395    if (params0[:istksz] & ($CHECK_STKSZ_ALIGN - 1)) != 0
     396      error_wrong("E_PAR", params0, :istksz, "not aligned")
     397    end
     398
     399    istksz = "(#{params0[:istksz]})"
     400    istk = "(void *)(#{params0[:istk]})"
    400401  end
    401402end
     
    411412
    412413#
    413 #  カーネルが割り付けるメモリ領域
    414 #
    415 $kernelCfgC.comment_header("Memory Area Allocated by Kernel")
    416 
    417 if $cfgData[:DEF_KMM].size == 0
    418   # DEF_KMMがない場合のデフォルト値の設定
    419   kmmsz = "0"
    420   kmm = "NULL"
     414#  カーネルメモリプール領域
     415#
     416$kernelCfgC.comment_header("Kernel Memory Pool Area")
     417
     418if $cfgData[:DEF_MPK].size == 0
     419  # DEF_MPKがない場合のデフォルト値の設定
     420  mpksz = "0"
     421  mpk = "NULL"
    421422else
    422   # 静的API「DEF_KMM」が複数ある(E_OBJ)
    423   if ($cfgData[:DEF_KMM].size > 1)
    424     error("E_OBJ: too many DEF_KMM")
    425   end
    426 
    427   # DEF_KMMがある場合の処理
    428   params = $cfgData[:DEF_KMM][1]
     423  # 静的API「DEF_MPK」が複数ある(E_OBJ)[NGKI5073]
     424  if ($cfgData[:DEF_MPK].size > 1)
     425    error("E_OBJ: too many DEF_MPK")
     426  end
     427
     428  # DEF_MPKがある場合の処理
     429  params0 = $cfgData[:DEF_MPK][1]
    429430
    430431  # パラメータが省略された時のデフォルト値の設定
    431   params[:kmm] ||= "NULL"
    432 
    433   # kmmszが0の場合(E_PAR)
    434   if params[:kmmsz] == 0
    435     error_wrong("E_PAR", params, :kmmsz, "zero")
    436   end
    437 
    438   if params[:kmm] == "NULL"
    439     # カーネルが割り付けるメモリ領域の自動割付け
    440     $kernelCfgC.add("static MB_T _kernel_memory" \
    441                                         "[TOPPERS_COUNT_SZ(#{params[:kmmsz]}, sizeof(MB_T))];")
    442     kmmsz = "TOPPERS_ROUND_SZ(#{params[:kmmsz]}, sizeof(MB_T))"
    443     kmm = "_kernel_memory"
     432  params0[:mpk] ||= "NULL"
     433
     434  # mpkszが0の場合(E_PAR)[NGKI5071]
     435  if params0[:mpksz] == 0
     436    error_wrong("E_PAR", params0, :mpksz, "zero")
     437  end
     438
     439  if params0[:mpk] == "NULL"
     440    # カーネルメモリプール領域の自動割付け
     441    $kernelCfgC.add("static MB_T _kernel_memory_pool" \
     442                                        "[COUNT_MB_T(#{params0[:mpksz]})];")
     443    mpksz = "ROUND_MB_T(#{params0[:mpksz]})"
     444    mpk = "_kernel_memory_pool"
    444445  else
    445     # kmmszがカーネルが割り付けるメモリ領域のサイズとして正しくない場合
    446     # (E_PAR)
    447     if (params[:kmmsz] & ($CHECK_MB_ALIGN - 1)) != 0
    448       error_wrong("E_PAR", params, :kmmsz, "not aligned")
    449     end
    450 
    451     kmmsz = "(#{params[:kmmsz]})"
    452     kmm = "(void *)(#{params[:kmm]})"
     446    # mpkszがターゲット定義の制約に合致しない場合(E_PAR)[NGKI5083]
     447    if (params0[:mpksz] & ($CHECK_MB_ALIGN - 1)) != 0
     448      error_wrong("E_PAR", params0, :mpksz, "not aligned")
     449    end
     450
     451    mpksz = "(#{params0[:mpksz]})"
     452    mpk = "(void *)(#{params0[:mpk]})"
    453453  end
    454454end
    455455
    456456$kernelCfgC.add(<<EOS)
    457 const size_t _kernel_kmmsz = #{kmmsz};
    458 MB_T *const _kernel_kmm = #{kmm};
     457const size_t _kernel_mpksz = #{mpksz};
     458MB_T *const _kernel_mpk = #{mpk};
    459459EOS
    460460
     
    484484#  初期化ルーチン機能
    485485#
     486
     487# kernel_cfg.hの生成
     488$kernelCfgH.add2("#define TNUM_INIRTN\t#{$cfgData[:ATT_INI].size}")
     489
     490# kernel_cfg.cの生成
    486491$kernelCfgC.comment_header("Initialization Routine")
    487492
    488493# エラーチェック
    489 $cfgData[:ATT_INI].each do |key, params|
    490   # iniatrが無効の場合(E_RSATR)[NGKI3241]
     494$cfgData[:ATT_INI].each do |_, params|
     495  # iniatrが無効の場合(E_RSATR)[NGKI3241][NGKI3202][NGKI3203]
    491496  #(TA_NULLでない場合)
    492497  if (params[:iniatr] != $TA_NULL)
     
    495500end
    496501
    497 # 初期化ルーチンの実行関数の生成
    498 $kernelCfgC.append(<<EOS)
    499 void
    500 _kernel_call_inirtn(void)
    501 {
    502 EOS
    503 $cfgData[:ATT_INI].each do |key, params|
    504   $kernelCfgC.add("\t((INIRTN)(#{params[:inirtn]}))" \
    505                                                                 "((intptr_t)(#{params[:exinf]}));")
    506 end
    507 $kernelCfgC.add2("}")
     502# 初期化ルーチンの数の定義
     503$kernelCfgC.add2("const uint_t _kernel_tnum_inirtn = TNUM_INIRTN;");
     504
     505# 初期化ルーチンテーブルの生成
     506if $cfgData[:ATT_INI].size > 0
     507  $kernelCfgC.add("const INIRTNB _kernel_inirtnb_table[TNUM_INIRTN] = {")
     508  $cfgData[:ATT_INI].each_with_index do |(_, params), index|
     509    $kernelCfgC.add(",") if index > 0
     510    $kernelCfgC.append("\t{ (INIRTN)(#{params[:inirtn]}), " \
     511                                                                "(intptr_t)(#{params[:exinf]}) }")
     512  end
     513  $kernelCfgC.add
     514  $kernelCfgC.add2("};")
     515else
     516  $kernelCfgC.add2("TOPPERS_EMPTY_LABEL(const INIRTNB, " \
     517                                                                                "_kernel_inirtnb_table);")
     518end
    508519
    509520#
    510521#  終了処理ルーチン機能
    511522#
     523
     524# kernel_cfg.hの生成
     525$kernelCfgH.add2("#define TNUM_TERRTN\t#{$cfgData[:ATT_TER].size}")
     526
     527# kernel_cfg.cの生成
    512528$kernelCfgC.comment_header("Termination Routine")
    513529
    514530# エラーチェック
    515 $cfgData[:ATT_TER].each do |key, params|
    516   # teratrが無効の場合(E_RSATR)[NGKI3248]
     531$cfgData[:ATT_TER].each do |_, params|
     532  # teratrが無効の場合(E_RSATR)[NGKI3248][NGKI3208][NGKI3209]
    517533  #(TA_NULLでない場合)
    518534  if (params[:teratr] != $TA_NULL)
     
    521537end
    522538
    523 # 終了処理ルーチンの実行関数の生成
    524 $kernelCfgC.append(<<EOS)
    525 void
    526 _kernel_call_terrtn(void)
    527 {
    528 EOS
    529 $cfgData[:ATT_TER].reverse_each do |key, params|
    530   $kernelCfgC.add("\t((TERRTN)(#{params[:terrtn]}))" \
    531                                                                 "((intptr_t)(#{params[:exinf]}));")
    532 end
    533 $kernelCfgC.add2("}")
     539# 終了処理ルーチンの数の定義
     540$kernelCfgC.add2("const uint_t _kernel_tnum_terrtn = TNUM_TERRTN;");
     541
     542# 終了処理ルーチンテーブルの生成
     543if $cfgData[:ATT_TER].size > 0
     544  $kernelCfgC.add("const TERRTNB _kernel_terrtnb_table[TNUM_TERRTN] = {")
     545  $cfgData[:ATT_TER].reverse_each.each_with_index do |(_, params), index|
     546    $kernelCfgC.add(",") if index > 0
     547    $kernelCfgC.append("\t{ (TERRTN)(#{params[:terrtn]}), " \
     548                                                                "(intptr_t)(#{params[:exinf]}) }")
     549  end
     550  $kernelCfgC.add
     551  $kernelCfgC.add2("};")
     552else
     553  $kernelCfgC.add2("TOPPERS_EMPTY_LABEL(const TERRTNB, " \
     554                                                                                "_kernel_terrtnb_table);")
     555end
    534556
    535557#
  • EcnlProtoTool/trunk/asp3_dcre/kernel/kernel_api.def

    r331 r429  
    2323DEF_EXC .excno* { .excatr &exchdr }
    2424DEF_ICS { .istksz &istk? }
    25 DEF_KMM { .kmmsz &kmm? }
     25DEF_MPK { .mpksz &mpk? }
    2626ATT_INI { .iniatr &exinf &inirtn }
    2727ATT_TER { .teratr &exinf &terrtn }
  • EcnlProtoTool/trunk/asp3_dcre/kernel/kernel_check.trb

    r321 r429  
    11# -*- coding: utf-8 -*-
    2 # 
     2#
    33#   TOPPERS/ASP Kernel
    44#       Toyohashi Open Platform for Embedded Real-Time Systems/
     
    66#
    77#   Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN
    8 #   Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
     8#   Copyright (C) 2015-2019 by Embedded and Real-Time Systems Laboratory
    99#               Graduate School of Information Science, Nagoya Univ., JAPAN
    1010
     
    3838#   の責任を負わない.
    3939#
    40 #   $Id$
     40#   $Id: kernel_check.trb 1167 2019-02-03 17:06:17Z ertl-hiro $
    4141
    4242
     
    4545#
    4646
    47 # 
     47#
    4848#  タイムスタンプファイルの指定
    49 # 
     49#
    5050$timeStampFileName = "check.timestamp"
    5151
     
    5353#  データセクションのLMAからVMAへのコピー
    5454#
    55 if !$lmaList.nil?
     55if defined?($lmaList)
    5656  $lmaList.each do |lma|
    5757    startData = SYMBOL(lma[:START_DATA])
     
    9292    # 通知処理のパラメータが2つの場合
    9393    epar1 = params[:par3]
    94     epar2 = params[:par4]
     94    # epar2 = params[:par4]
    9595  else
    9696    # 通知処理のパラメータが1つの場合
    9797    epar1 = params[:par2]
    98     epar2 = params[:par3]
    99   end
    100 
    101   #     タイムイベントハンドラの先頭番地のチェック[NGKI3693]
     98    # epar2 = params[:par3]
     99  end
     100
     101  # タイムイベントハンドラの先頭番地が,プログラムの先頭番地として正し
     102  # くない場合(E_PAR)[NGKI3693]
    102103  if nfymode == $TNFY_HANDLER
    103104    tmehdr = nfyhdr
     
    112113  end
    113114
    114   #     イベント通知処理の変数の番地とオブジェクトIDのチェック
     115  # イベント通知処理の変数の番地とオブジェクトIDのチェック
    115116  if nfymode1 == $TNFY_SETVAR || nfymode1 == $TNFY_INCVAR
    116117    # 変数の設定/インクリメントによるタイムイベントの通知
     
    119120    params1[:p_var] = par1
    120121
    121     # 変数の番地のチェック[NGKI3699][NGKI3897]
     122    # 通知方法中の変数の番地が,intptr_t型の変数の番地として正しくない
     123    # 場合(E_PAR)[NGKI3699][NGKI3897]
    122124    if (p_var & ($CHECK_INTPTR_ALIGN - 1)) != 0
    123125      error_wrong_id("E_PAR", params1, :p_var, objid, "not aligned")
     
    132134    params1[:tskid] = par1
    133135
    134     # タスクIDのチェック[NGKI3704]
     136    # 通知方法中のタスクIDが有効範囲外の場合(E_ID)[NGKI3704]
    135137    if !($TMIN_TSKID <= tskid && tskid <= $tmax_tskid)
    136138      error_illegal_id("E_ID", params1, :tskid, objid)
     
    142144    params1[:semid] = par1
    143145
    144     # セマフォIDのチェック[NGKI3707]
     146    # 通知方法中のセマフォIDが有効範囲外の場合(E_ID)[NGKI3707]
    145147    if !($TMIN_SEMID <= semid && semid <= $tmax_semid)
    146148      error_illegal_id("E_ID", params1, :semid, objid)
     
    152154    params1[:flgid] = par1
    153155
    154     # イベントフラグIDのチェック[NGKI3710]
     156    # 通知方法中のイベントフラグIDが有効範囲外の場合(E_ID)[NGKI3710]
    155157    if !($TMIN_FLGID <= flgid && flgid <= $tmax_flgid)
    156158      error_illegal_id("E_ID", params1, :flgid, objid)
     
    162164    params1[:dtqid] = par1
    163165
    164     # データキューIDのチェック[NGKI3713]
     166    # 通知方法中のデータキューIDが有効範囲外の場合(E_ID)[NGKI3713]
    165167    if !($TMIN_DTQID <= dtqid && dtqid <= $tmax_dtqid)
    166168      error_illegal_id("E_ID", params1, :dtqid, objid)
     
    175177    params1[:p_var] = epar1
    176178
    177     # 変数の番地のチェック[NGKI3701][NGKI3897]
     179    # 通知方法中の変数の番地が,intptr_t型の変数の番地として正しくない
     180    # 場合(E_PAR)[NGKI3701][NGKI3897]
    178181    if (p_var & ($CHECK_INTPTR_ALIGN - 1)) != 0
    179182      error_wrong_id("E_PAR", params1, :p_var, objid, "not aligned")
     
    188191    params1[:tskid] = epar1
    189192
    190     # タスクIDのチェック[NGKI3704]
     193    # 通知方法中のタスクIDが有効範囲外の場合(E_ID)[NGKI3704]
    191194    if !($TMIN_TSKID <= tskid && tskid <= $tmax_tskid)
    192195      error_illegal_id("E_ID", params1, :tskid, objid)
     
    198201    params1[:semid] = epar1
    199202
    200     # セマフォIDのチェック[NGKI3707]
     203    # 通知方法中のセマフォIDが有効範囲外の場合(E_ID)[NGKI3707]
    201204    if !($TMIN_SEMID <= semid && semid <= $tmax_semid)
    202205      error_illegal_id("E_ID", params1, :semid, objid)
     
    208211    params1[:flgid] = epar1
    209212
    210     # イベントフラグIDのチェック[NGKI3710]
     213    # 通知方法中のイベントフラグIDが有効範囲外の場合(E_ID)[NGKI3710]
    211214    if !($TMIN_FLGID <= flgid && flgid <= $tmax_flgid)
    212215      error_illegal_id("E_ID", params1, :flgid, objid)
     
    218221    params1[:dtqid] = epar1
    219222
    220     # データキューIDのチェック[NGKI3715]
     223    # 通知方法中のデータキューIDが有効範囲外の場合(E_ID)[NGKI3715]
    221224    if !($TMIN_DTQID <= dtqid && dtqid <= $tmax_dtqid)
    222225      error_illegal_id("E_ID", params1, :dtqid, objid)
     
    225228end
    226229
    227 # 
     230#
    228231#  タスクに関するチェック
    229 # 
     232#
    230233tinib = SYMBOL("_kernel_tinib_table")
    231234$cfgData[:CRE_TSK].sort.each do |key, params|
     235  # taskがプログラムの先頭番地として正しくない場合(E_PAR)[NGKI1033]
    232236  task = PEEK(tinib + $offsetof_TINIB_task, $sizeof_TASK)
    233 
    234   # タスクの先頭番地のチェック[NGKI1033]
    235237  if (task & ($CHECK_FUNC_ALIGN - 1)) != 0
    236238    error_wrong_id("E_PAR", params, :task, :tskid, "not aligned")
     
    240242  end
    241243
    242   # タスクのスタック領域の先頭番地のチェック[NGKI1056]
     244  # stkがターゲット定義の制約に合致しない場合(E_PAR)[NGKI1056]
    243245  if $USE_TSKINICTXB
    244246    stk = GetStackTskinictxb(key, params, tinib)
     
    256258end
    257259
    258 # 
     260#
    259261#  固定長メモリプールに関するチェック
    260 # 
     262#
    261263mpfinib = SYMBOL("_kernel_mpfinib_table")
    262 $cfgData[:CRE_MPF].sort.each do |key, params|
     264$cfgData[:CRE_MPF].sort.each do |_, params|
    263265  mpf = PEEK(mpfinib + $offsetof_MPFINIB_mpf, $sizeof_void_ptr)
    264266
    265   # 固定長メモリプール領域の先頭番地のチェック[NGKI2249]
     267  # mpfがターゲット定義の制約に合致しない場合(E_PAR)[NGKI2249]
    266268  if (mpf & ($CHECK_MPF_ALIGN - 1)) != 0
    267269    error_wrong_id("E_PAR", params, :mpf, :mpfid, "not aligned")
     
    274276end
    275277
    276 # 
     278#
    277279#  周期通知に関するチェック
    278 # 
     280#
    279281cycinib = SYMBOL("_kernel_cycinib_table")
    280282$cfgData[:CRE_CYC].sort.each do |key, params|
     
    282284  nfyhdr = PEEK(cycinib + $offsetof_CYCINIB_nfyhdr, $sizeof_NFYHDR)
    283285
    284   #     通知情報のチェック
     286  # 通知情報のチェック
    285287  checkNotifyHandler(key, params, :cycid, exinf, nfyhdr)
    286288
     
    288290end
    289291
    290 # 
     292#
    291293#  アラーム通知に関するチェック
    292 # 
     294#
    293295alminib = SYMBOL("_kernel_alminib_table")
    294296$cfgData[:CRE_ALM].sort.each do |key, params|
     
    296298  nfyhdr = PEEK(alminib + $offsetof_ALMINIB_nfyhdr, $sizeof_NFYHDR)
    297299
    298   #     通知情報のチェック
     300  # 通知情報のチェック
    299301  checkNotifyHandler(key, params, :almid, exinf, nfyhdr)
    300302
     
    306308#
    307309isrinib = SYMBOL("_kernel_isrinib_table")
    308 $cfgData[:CRE_ISR].sort.each do |key, params|
     310$cfgData[:CRE_ISR].sort.each do |_, params|
    309311  isr = PEEK(isrinib + $offsetof_ISRINIB_isr, $sizeof_ISR)
    310312
    311   # 割込みサービスルーチンの先頭番地のチェック[NGKI3004]
     313  # isrがプログラムの先頭番地として正しくない場合[NGKI3004]
    312314  if (isr & ($CHECK_FUNC_ALIGN - 1)) != 0
    313315    error_wrong_id("E_PAR", params, :isr, :isrid, "not aligned")
     
    320322end
    321323
    322 # 
     324#
    323325#  非タスクコンテキスト用のスタック領域に関するチェック
    324 # 
    325 istkAddr = SYMBOL("_kernel_istk")
    326 if !istkAddr.nil?
    327   istk = PEEK(istkAddr, $sizeof_void_ptr)
    328 
    329   # 非タスクコンテキスト用のスタック領域の先頭番地のチェック[NGKI3222]
     326#
     327if $cfgData[:DEF_ICS].size > 0
     328  params0 = $cfgData[:DEF_ICS][1]
     329  istk = PEEK(SYMBOL("_kernel_istk"), $sizeof_void_ptr)
     330
     331  # istkがターゲット定義の制約に合致しない場合(E_PAR)[NGKI3222]
    330332  if (istk & ($CHECK_STACK_ALIGN - 1)) != 0
    331     error_wrong("E_PAR", $cfgData[:DEF_ICS][1], :istk, "not aligned")
     333    error_wrong("E_PAR", params0, :istk, "not aligned")
    332334  end
    333335  if $CHECK_STACK_NONNULL && istk == 0
    334     error_wrong("E_PAR", $cfgData[:DEF_ICS][1], :istk, "null")
    335   end
    336 end
    337 
    338 #
    339 #  カーネルが割り付けるメモリ領域に関するチェック
    340 #
    341 kmmAddr = SYMBOL("_kernel_kmm")
    342 if !kmmAddr.nil?
    343   kmm = PEEK(kmmAddr, $sizeof_void_ptr)
    344 
    345   # カーネルが割り付けるメモリ領域の先頭番地のチェック
    346   if (kmm & ($CHECK_MB_ALIGN - 1)) != 0
    347     error_wrong("E_PAR", $cfgData[:DEF_KMM][1], :kmm, "not aligned")
    348   end
    349 end
     336    error_wrong("E_PAR", params0, :istk, "null")
     337  end
     338end
     339
     340#
     341#  カーネルメモリプール領域に関するチェック
     342#
     343if $cfgData[:DEF_MPK].size > 0
     344  params0 = $cfgData[:DEF_MPK][1]
     345  mpk = PEEK(SYMBOL("_kernel_mpk"), $sizeof_void_ptr)
     346
     347  # mpkがターゲット定義の制約に合致しない場合(E_PAR)[NGKI5083]
     348  if (mpk & ($CHECK_MPK_ALIGN - 1)) != 0
     349    error_wrong("E_PAR", params0, :mpk, "not aligned")
     350  end
     351  if $CHECK_MPK_NONNULL && mpk == 0
     352    error_wrong("E_PAR", params0, :mpk, "null")
     353  end
     354end
     355
     356#
     357#  初期化ルーチンに関するチェック
     358#
     359inirtnb = SYMBOL("_kernel_inirtnb_table")
     360$cfgData[:ATT_INI].each do |_, params|
     361  inirtn = PEEK(inirtnb + $offsetof_INIRTNB_inirtn, $sizeof_INIRTN)
     362
     363  # inirtnがプログラムの先頭番地として正しくない場合(E_PAR)[NGKI3243]
     364  if (inirtn & ($CHECK_FUNC_ALIGN - 1)) != 0
     365    error_wrong("E_PAR", params, :inirtn, "not aligned")
     366  end
     367  if $CHECK_FUNC_NONNULL && inirtn == 0
     368    error_wrong("E_PAR", params, :inirtn, "null")
     369  end
     370
     371  inirtnb += $sizeof_INIRTNB
     372end
     373
     374#
     375#  終了処理ルーチンに関するチェック
     376#
     377terrtnb = SYMBOL("_kernel_terrtnb_table")
     378$cfgData[:ATT_TER].each do |_, params|
     379  terrtn = PEEK(terrtnb + $offsetof_TERRTNB_terrtn, $sizeof_TERRTN)
     380
     381  # terrtnがプログラムの先頭番地として正しくない場合(E_PAR)[NGKI3250]
     382  if (terrtn & ($CHECK_FUNC_ALIGN - 1)) != 0
     383    error_wrong("E_PAR", params, :terrtn, "not aligned")
     384  end
     385  if $CHECK_FUNC_NONNULL && terrtn == 0
     386    error_wrong("E_PAR", params, :terrtn, "null")
     387  end
     388
     389  terrtnb += $sizeof_TERRTNB
     390end
  • EcnlProtoTool/trunk/asp3_dcre/kernel/kernel_impl.h

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2004-2016 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2004-2018 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    7171
    7272/*
    73  *  型キャストを行うマクロの定義
    74  */
    75 #ifndef CAST
    76 #define CAST(type, val)         ((type)(val))
    77 #endif /* CAST */
     73 *  トレースログに関する設定
     74 */
     75#ifdef TOPPERS_ENABLE_TRACE
     76#include "arch/tracelog/trace_log.h"
     77#endif /* TOPPERS_ENABLE_TRACE */
    7878
    7979/*
     
    157157#endif /* TARGET_ISRATR */
    158158
     159#ifndef TARGET_MIN_STKSZ                        /* タスクのスタックサイズの最小値 */
     160#define TARGET_MIN_STKSZ        1U              /* 未定義の場合は0でないことをチェック */
     161#endif /* TARGET_MIN_STKSZ */
     162
    159163/*
    160164 *  ヘッダファイルを持たないモジュールの関数・変数の宣言
     
    173177
    174178/*
    175  *  初期化ルーチンの実行(kernel_cfg.c)
    176  */
    177 extern void     call_inirtn(void);
    178 
    179 /*
    180  *  終了処理ルーチンの実行(kernel_cfg.c)
    181  */
    182 extern void     call_terrtn(void);
     179 *  初期化ルーチン関係の定義(kernel_cfg.c)
     180 */
     181typedef struct initialization_routine_block {
     182        INIRTN          inirtn;                                 /* 初期化ルーチンの先頭番地 */
     183        intptr_t        exinf;                                  /* 初期化ルーチンの拡張情報 */
     184} INIRTNB;
     185
     186extern const uint_t     tnum_inirtn;            /* 初期化ルーチンの数 */
     187
     188extern const INIRTNB inirtnb_table[];   /* 初期化ルーチンブロックテーブル */
     189
     190/*
     191 *  終了処理ルーチン関係の定義(kernel_cfg.c)
     192 */
     193typedef struct termination_routine_block {
     194        TERRTN          terrtn;                                 /* 終了処理ルーチンの先頭番地 */
     195        intptr_t        exinf;                                  /* 終了処理ルーチンの拡張情報 */
     196} TERRTNB;
     197
     198extern const uint_t     tnum_terrtn;            /* 終了処理ルーチンの数 */
     199
     200extern const TERRTNB terrtnb_table[];   /* 終了処理ルーチンブロックテーブル */
    183201
    184202/*
     
    192210
    193211/*
    194  *  カーネルが割り付けるメモリ領域(kernel_cfg.c)
    195  */
    196 extern const size_t     kmmsz;          /* カーネルが割り付けるメモリ領域のサイズ */
    197 extern MB_T *const      kmm;            /* カーネルが割り付けるメモリ領域の先頭番地 */
     212 *  カーネルメモリプール領域(kernel_cfg.c)
     213 */
     214extern const size_t     mpksz;          /* カーネルメモリプール領域のサイズ */
     215extern MB_T *const      mpk;            /* カーネルメモリプール領域の先頭番地 */
    198216
    199217/*
     
    203221
    204222/*
     223 *  カーネルメモリプール領域有効フラグ(startup.c)
     224 */
     225extern bool_t   mpk_valid;
     226
     227/*
    205228 *  カーネルの起動(startup.c)
    206229 */
     
    213236
    214237/*
    215  *  カーネルの割り付けるメモリ領域の管理(startup.c)
    216  */
    217 extern void initialize_kmm(void);
    218 extern void *kernel_malloc(size_t size);
    219 extern void kernel_free(void *ptr);
     238 *  メモリプール領域の管理(startup.c)
     239 */
     240extern bool_t initialize_mempool(MB_T *mempool, size_t size);
     241extern void *malloc_mempool(MB_T *mempool, size_t size);
     242extern void free_mempool(MB_T *mempool, void *ptr);
     243
     244/*
     245 *  カーネルメモリプール領域からのメモリ獲得/解放
     246 */
     247Inline void *
     248malloc_mpk(size_t size)
     249{
     250        if (mpk_valid) {
     251                return(malloc_mempool(mpk, size));
     252        }
     253        else {
     254                return(NULL);
     255        }
     256}
     257
     258Inline void
     259free_mpk(void *ptr)
     260{
     261        if (mpk_valid) {
     262                free_mempool(mpk, ptr);
     263        }
     264}
    220265
    221266/*
     
    225270
    226271/*
    227  *  通知方法のエラーチェック
     272 *  通知方法のエラーチェック(time_manage.c)
    228273 */
    229274extern ER check_nfyinfo(const T_NFYINFO *p_nfyinfo);
    230275
    231276/*
    232  *  通知ハンドラ
     277 *  通知ハンドラ(time_manage.c)
    233278 */
    234279extern void notify_handler(intptr_t exinf);
  • EcnlProtoTool/trunk/asp3_dcre/kernel/kernel_rename.def

    r331 r429  
    11# startup.c
    22kerflg
     3mpk_valid
    34exit_kernel
    4 initialize_kmm
    5 kernel_malloc
    6 kernel_free
     5initialize_mempool
     6malloc_mempool
     7free_mempool
    78
    89# task.c
     
    5152set_hrt_event
    5253tmevtb_register
    53 tmevtb_enqueue
     54tmevtb_enqueue_reltim
    5455tmevtb_dequeue
    5556check_adjtim
     
    124125# kernel_cfg.c
    125126initialize_object
    126 call_inirtn
    127 call_terrtn
     127tnum_inirtn
     128inirtnb_table
     129tnum_terrtn
     130terrtnb_table
    128131tmax_tskid
    129132tmax_stskid
     
    193196istk
    194197istkpt
    195 kmmsz
    196 kmm
     198mpksz
     199mpk
     200
     201# tTraceLog.c
     202log_dsp_enter
     203log_dsp_leave
     204log_inh_enter
     205log_inh_leave
     206log_exc_enter
     207log_exc_leave
    197208
    198209INCLUDE "target"
  • EcnlProtoTool/trunk/asp3_dcre/kernel/kernel_rename.h

    r321 r429  
    88 */
    99#define kerflg                                          _kernel_kerflg
     10#define mpk_valid                                       _kernel_mpk_valid
    1011#define exit_kernel                                     _kernel_exit_kernel
    11 #define initialize_kmm                          _kernel_initialize_kmm
    12 #define kernel_malloc                           _kernel_kernel_malloc
    13 #define kernel_free                                     _kernel_kernel_free
     12#define initialize_mempool                      _kernel_initialize_mempool
     13#define malloc_mempool                          _kernel_malloc_mempool
     14#define free_mempool                            _kernel_free_mempool
    1415
    1516/*
     
    6667#define set_hrt_event                           _kernel_set_hrt_event
    6768#define tmevtb_register                         _kernel_tmevtb_register
    68 #define tmevtb_enqueue                          _kernel_tmevtb_enqueue
     69#define tmevtb_enqueue_reltim           _kernel_tmevtb_enqueue_reltim
    6970#define tmevtb_dequeue                          _kernel_tmevtb_dequeue
    7071#define check_adjtim                            _kernel_check_adjtim
     
    163164 */
    164165#define initialize_object                       _kernel_initialize_object
    165 #define call_inirtn                                     _kernel_call_inirtn
    166 #define call_terrtn                                     _kernel_call_terrtn
     166#define tnum_inirtn                                     _kernel_tnum_inirtn
     167#define inirtnb_table                           _kernel_inirtnb_table
     168#define tnum_terrtn                                     _kernel_tnum_terrtn
     169#define terrtnb_table                           _kernel_terrtnb_table
    167170#define tmax_tskid                                      _kernel_tmax_tskid
    168171#define tmax_stskid                                     _kernel_tmax_stskid
     
    232235#define istk                                            _kernel_istk
    233236#define istkpt                                          _kernel_istkpt
    234 #define kmmsz                                           _kernel_kmmsz
    235 #define kmm                                                     _kernel_kmm
     237#define mpksz                                           _kernel_mpksz
     238#define mpk                                                     _kernel_mpk
     239
     240/*
     241 *  tTraceLog.c
     242 */
     243#define log_dsp_enter                           _kernel_log_dsp_enter
     244#define log_dsp_leave                           _kernel_log_dsp_leave
     245#define log_inh_enter                           _kernel_log_inh_enter
     246#define log_inh_leave                           _kernel_log_inh_leave
     247#define log_exc_enter                           _kernel_log_exc_enter
     248#define log_exc_leave                           _kernel_log_exc_leave
    236249
    237250
  • EcnlProtoTool/trunk/asp3_dcre/kernel/kernel_sym.def

    r331 r429  
    1 USE_EXTERNAL_ID,true,bool,defined(USE_EXTERNAL_ID)
    2 SIL_ENDIAN_BIG,true,bool,defined(SIL_ENDIAN_BIG)
    3 SIL_ENDIAN_LITTLE,true,bool,defined(SIL_ENDIAN_LITTLE)
     1USE_EXTERNAL_ID,true,bool,defined(USE_EXTERNAL_ID),false
    42TA_NULL
    53TA_ACT
     
    4846TMIN_CYCID,,signed
    4947TMIN_ALMID,,signed
    50 USE_TSKINICTXB,true,bool,defined(USE_TSKINICTXB)
    51 OMIT_INITIALIZE_INTERRUPT,true,bool,defined(OMIT_INITIALIZE_INTERRUPT)
    52 USE_INHINIB_TABLE,true,bool,defined(USE_INHINIB_TABLE)
    53 USE_INTINIB_TABLE,true,bool,defined(USE_INTINIB_TABLE)
    54 OMIT_INITIALIZE_EXCEPTION,true,bool,defined(OMIT_INITIALIZE_EXCEPTION)
    55 DEFAULT_ISTK,,,defined(DEFAULT_ISTK)
    56 TARGET_TSKATR,,,defined(TARGET_TSKATR),0
     48USE_TSKINICTXB,true,bool,defined(USE_TSKINICTXB),false
     49OMIT_INITIALIZE_INTERRUPT,true,bool,defined(OMIT_INITIALIZE_INTERRUPT),false
     50USE_INHINIB_TABLE,true,bool,defined(USE_INHINIB_TABLE),false
     51USE_INTINIB_TABLE,true,bool,defined(USE_INTINIB_TABLE),false
     52OMIT_INITIALIZE_EXCEPTION,true,bool,defined(OMIT_INITIALIZE_EXCEPTION),false
     53DEFAULT_ISTK,,intptr,defined(DEFAULT_ISTK)
     54TARGET_TSKATR
    5755TARGET_INTATR,,,defined(TARGET_INTATR),0
    5856TARGET_INHATR,,,defined(TARGET_INHATR),0
    59 TARGET_ISRATR,,,defined(TARGET_ISRATR),0
     57TARGET_ISRATR
    6058TARGET_EXCATR,,,defined(TARGET_EXCATR),0
    61 TARGET_MIN_STKSZ,,,defined(TARGET_MIN_STKSZ),1
     59TARGET_MIN_STKSZ
    6260TARGET_MIN_ISTKSZ,,,defined(TARGET_MIN_ISTKSZ),1
    6361CHECK_STKSZ_ALIGN,,,defined(CHECK_STKSZ_ALIGN),1
    6462CHECK_INTPTR_ALIGN,,,defined(CHECK_INTPTR_ALIGN),1
    65 CHECK_INTPTR_NONNULL,true,bool,defined(CHECK_INTPTR_NONNULL)
     63CHECK_INTPTR_NONNULL,true,bool,defined(CHECK_INTPTR_NONNULL),false
    6664CHECK_FUNC_ALIGN,,,defined(CHECK_FUNC_ALIGN),1
    67 CHECK_FUNC_NONNULL,true,bool,defined(CHECK_FUNC_NONNULL)
     65CHECK_FUNC_NONNULL,true,bool,defined(CHECK_FUNC_NONNULL),false
    6866CHECK_STACK_ALIGN,,,defined(CHECK_STACK_ALIGN),1
    69 CHECK_STACK_NONNULL,true,bool,defined(CHECK_STACK_NONNULL)
     67CHECK_STACK_NONNULL,true,bool,defined(CHECK_STACK_NONNULL),false
    7068CHECK_MPF_ALIGN,,,defined(CHECK_MPF_ALIGN),1
    71 CHECK_MPF_NONNULL,true,bool,defined(CHECK_MPF_NONNULL)
     69CHECK_MPF_NONNULL,true,bool,defined(CHECK_MPF_NONNULL),false
     70CHECK_MPK_ALIGN,,,defined(CHECK_MPK_ALIGN),1
     71CHECK_MPK_NONNULL,true,bool,defined(CHECK_MPK_NONNULL),false
    7272CHECK_MB_ALIGN,,,defined(CHECK_MB_ALIGN),1
    7373sizeof_void_ptr,sizeof(void*)
     
    138138offsetof_ISRINIB_isrpri,"offsetof(ISRINIB,isrpri)"
    139139sizeof_INHINIB,sizeof(INHINIB),,!defined(OMIT_INITIALIZE_INTERRUPT)
    140 offset_INHINIB_inhno,"offsetof(INHINIB,inhno)",,!defined(OMIT_INITIALIZE_INTERRUPT)
    141 offset_INHINIB_inhatr,"offsetof(INHINIB,inhatr)",,!defined(OMIT_INITIALIZE_INTERRUPT),,
    142 offset_INHINIB_int_entry,"offsetof(INHINIB,int_entry)",,!defined(OMIT_INITIALIZE_INTERRUPT),,
     140offsetof_INHINIB_inhno,"offsetof(INHINIB,inhno)",,!defined(OMIT_INITIALIZE_INTERRUPT)
     141offsetof_INHINIB_inhatr,"offsetof(INHINIB,inhatr)",,!defined(OMIT_INITIALIZE_INTERRUPT),,
     142offsetof_INHINIB_int_entry,"offsetof(INHINIB,int_entry)",,!defined(OMIT_INITIALIZE_INTERRUPT),,
    143143sizeof_INTINIB,sizeof(INTINIB),,!defined(OMIT_INITIALIZE_INTERRUPT)
    144 offset_INTINIB_intno,"offsetof(INTINIB,intno)",,!defined(OMIT_INITIALIZE_INTERRUPT)
    145 offset_INTINIB_intatr,"offsetof(INTINIB,intatr)",,!defined(OMIT_INITIALIZE_INTERRUPT)
    146 offset_INTINIB_intpri,"offsetof(INTINIB,intpri)",,!defined(OMIT_INITIALIZE_INTERRUPT)
     144offsetof_INTINIB_intno,"offsetof(INTINIB,intno)",,!defined(OMIT_INITIALIZE_INTERRUPT)
     145offsetof_INTINIB_intatr,"offsetof(INTINIB,intatr)",,!defined(OMIT_INITIALIZE_INTERRUPT)
     146offsetof_INTINIB_intpri,"offsetof(INTINIB,intpri)",,!defined(OMIT_INITIALIZE_INTERRUPT)
    147147sizeof_EXCINIB,sizeof(EXCINIB),,!defined(OMIT_INITIALIZE_EXCEPTION)
    148 offset_EXCINIB_excno,"offsetof(EXCINIB,excno)",,!defined(OMIT_INITIALIZE_EXCEPTION)
    149 offset_EXCINIB_excatr,"offsetof(EXCINIB,excatr)",,!defined(OMIT_INITIALIZE_EXCEPTION)
    150 offset_EXCINIB_exc_entry,"offsetof(EXCINIB,exc_entry)",,!defined(OMIT_INITIALIZE_EXCEPTION)
     148offsetof_EXCINIB_excno,"offsetof(EXCINIB,excno)",,!defined(OMIT_INITIALIZE_EXCEPTION)
     149offsetof_EXCINIB_excatr,"offsetof(EXCINIB,excatr)",,!defined(OMIT_INITIALIZE_EXCEPTION)
     150offsetof_EXCINIB_exc_entry,"offsetof(EXCINIB,exc_entry)",,!defined(OMIT_INITIALIZE_EXCEPTION)
     151sizeof_INIRTNB,sizeof(INIRTNB)
     152offsetof_INIRTNB_inirtn,"offsetof(INIRTNB,inirtn)"
     153offsetof_INIRTNB_exinf,"offsetof(INIRTNB,exinf)"
     154sizeof_TERRTNB,sizeof(TERRTNB)
     155offsetof_TERRTNB_terrtn,"offsetof(TERRTNB,terrtn)"
     156offsetof_TERRTNB_exinf,"offsetof(TERRTNB,exinf)"
  • EcnlProtoTool/trunk/asp3_dcre/kernel/kernel_unrename.h

    r321 r429  
    99 */
    1010#undef kerflg
     11#undef mpk_valid
    1112#undef exit_kernel
    12 #undef initialize_kmm
    13 #undef kernel_malloc
    14 #undef kernel_free
     13#undef initialize_mempool
     14#undef malloc_mempool
     15#undef free_mempool
    1516
    1617/*
     
    6768#undef set_hrt_event
    6869#undef tmevtb_register
    69 #undef tmevtb_enqueue
     70#undef tmevtb_enqueue_reltim
    7071#undef tmevtb_dequeue
    7172#undef check_adjtim
     
    164165 */
    165166#undef initialize_object
    166 #undef call_inirtn
    167 #undef call_terrtn
     167#undef tnum_inirtn
     168#undef inirtnb_table
     169#undef tnum_terrtn
     170#undef terrtnb_table
    168171#undef tmax_tskid
    169172#undef tmax_stskid
     
    233236#undef istk
    234237#undef istkpt
    235 #undef kmmsz
    236 #undef kmm
     238#undef mpksz
     239#undef mpk
     240
     241/*
     242 *  tTraceLog.c
     243 */
     244#undef log_dsp_enter
     245#undef log_dsp_leave
     246#undef log_inh_enter
     247#undef log_inh_leave
     248#undef log_exc_enter
     249#undef log_exc_leave
    237250
    238251
  • EcnlProtoTool/trunk/asp3_dcre/kernel/mempfix.c

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2005-2016 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2005-2018 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    226226        p_mpfmb = pk_cmpf->mpfmb;
    227227
    228         CHECK_RSATR(mpfatr, TA_TPRI);
     228        CHECK_VALIDATR(mpfatr, TA_TPRI);
    229229        CHECK_PAR(blkcnt != 0);
    230230        CHECK_PAR(blksz != 0);
     
    242242        else {
    243243                if (mpf == NULL) {
    244                         mpf = kernel_malloc(ROUND_MPF_T(blksz) * blkcnt);
     244                        mpf = malloc_mpk(ROUND_MPF_T(blksz) * blkcnt);
    245245                        mpfatr |= TA_MEMALLOC;
    246246                }
     
    250250                else {
    251251                        if (p_mpfmb == NULL) {
    252                                 p_mpfmb = kernel_malloc(sizeof(MPFMB) * blkcnt);
     252                                p_mpfmb = malloc_mpk(sizeof(MPFMB) * blkcnt);
    253253                                mpfatr |= TA_MBALLOC;
    254254                        }
    255255                        if (p_mpfmb == NULL) {
    256                                 if (mpf == NULL) {
    257                                         kernel_free(mpf);
     256                                if (pk_cmpf->mpf == NULL) {
     257                                        free_mpk(mpf);
    258258                                }
    259259                                ercd = E_NOMEM;
     
    313313                p_mpfinib = (MPFINIB *)(p_mpfcb->p_mpfinib);
    314314                if ((p_mpfinib->mpfatr & TA_MEMALLOC) != 0U) {
    315                         kernel_free(p_mpfinib->mpf);
     315                        free_mpk(p_mpfinib->mpf);
    316316                }
    317317                if ((p_mpfinib->mpfatr & TA_MBALLOC) != 0U) {
    318                         kernel_free(p_mpfinib->p_mpfmb);
     318                        free_mpk(p_mpfinib->p_mpfmb);
    319319                }
    320320                p_mpfinib->mpfatr = TA_NOEXS;
     
    342342get_mpf(ID mpfid, void **p_blk)
    343343{
    344         MPFCB   *p_mpfcb;
    345         WINFO_MPF winfo_mpf;
    346         ER              ercd;
     344        MPFCB           *p_mpfcb;
     345        WINFO_MPF       winfo_mpf;
     346        ER                      ercd;
    347347
    348348        LOG_GET_MPF_ENTER(mpfid, p_blk);
     
    363363        }
    364364        else {
    365                 p_runtsk->tstat = TS_WAITING_MPF;
    366                 wobj_make_wait((WOBJCB *) p_mpfcb, (WINFO_WOBJ *) &winfo_mpf);
     365                wobj_make_wait((WOBJCB *) p_mpfcb, TS_WAITING_MPF,
     366                                                                                        (WINFO_WOBJ *) &winfo_mpf);
    367367                dispatch();
    368368                ercd = winfo_mpf.winfo.wercd;
     
    424424tget_mpf(ID mpfid, void **p_blk, TMO tmout)
    425425{
    426         MPFCB   *p_mpfcb;
    427         WINFO_MPF winfo_mpf;
    428         TMEVTB  tmevtb;
    429         ER              ercd;
     426        MPFCB           *p_mpfcb;
     427        WINFO_MPF       winfo_mpf;
     428        TMEVTB          tmevtb;
     429        ER                      ercd;
    430430
    431431        LOG_TGET_MPF_ENTER(mpfid, p_blk, tmout);
     
    450450        }
    451451        else {
    452                 p_runtsk->tstat = TS_WAITING_MPF;
    453                 wobj_make_wait_tmout((WOBJCB *) p_mpfcb, (WINFO_WOBJ *) &winfo_mpf,
    454                                                                                                                 &tmevtb, tmout);
     452                wobj_make_wait_tmout((WOBJCB *) p_mpfcb, TS_WAITING_MPF,
     453                                                                (WINFO_WOBJ *) &winfo_mpf, &tmevtb, tmout);
    455454                dispatch();
    456455                ercd = winfo_mpf.winfo.wercd;
  • EcnlProtoTool/trunk/asp3_dcre/kernel/mempfix.trb

    r321 r429  
    66#
    77#   Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN
    8 #   Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
     8#   Copyright (C) 2015-2019 by Embedded and Real-Time Systems Laboratory
    99#               Graduate School of Information Science, Nagoya Univ., JAPAN
    1010#
     
    5555    params[:mpfmb] ||= "NULL"
    5656
    57     # mpfatrが無効の場合(E_RSATR)[NGKI2225]
     57    # mpfatrが無効の場合(E_RSATR)[NGKI2225][NGKI2218]
    5858    #(TA_TPRI以外のビットがセットされている場合)
    5959    if (params[:mpfatr] & ~($TA_TPRI)) != 0
  • EcnlProtoTool/trunk/asp3_dcre/kernel/mutex.c

    r321 r429  
    44 *      Advanced Standard Profile Kernel
    55 *
    6  *  Copyright (C) 2005-2016 by Embedded and Real-Time Systems Laboratory
     6 *  Copyright (C) 2005-2018 by Embedded and Real-Time Systems Laboratory
    77 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    88 *
     
    378378        }
    379379        else {
    380                 CHECK_RSATR(mtxatr, TA_TPRI);                   /*[NGKI2025]*/
     380                CHECK_VALIDATR(mtxatr, TA_TPRI);                /*[NGKI2025]*/
    381381        }
    382382
     
    473473loc_mtx(ID mtxid)
    474474{
    475         MTXCB   *p_mtxcb;
    476         WINFO_MTX winfo_mtx;
    477         ER              ercd;
     475        MTXCB           *p_mtxcb;
     476        WINFO_MTX       winfo_mtx;
     477        ER                      ercd;
    478478
    479479        LOG_LOC_MTX_ENTER(mtxid);
     
    506506        }
    507507        else {
    508                 p_runtsk->tstat = TS_WAITING_MTX;
    509                 wobj_make_wait((WOBJCB *) p_mtxcb, (WINFO_WOBJ *) &winfo_mtx);
     508                wobj_make_wait((WOBJCB *) p_mtxcb, TS_WAITING_MTX,
     509                                                                                        (WINFO_WOBJ *) &winfo_mtx);
    510510                dispatch();
    511511                ercd = winfo_mtx.winfo.wercd;
     
    576576tloc_mtx(ID mtxid, TMO tmout)
    577577{
    578         MTXCB   *p_mtxcb;
    579         WINFO_MTX winfo_mtx;
    580         TMEVTB  tmevtb;
    581         ER              ercd;
     578        MTXCB           *p_mtxcb;
     579        WINFO_MTX       winfo_mtx;
     580        TMEVTB          tmevtb;
     581        ER                      ercd;
    582582
    583583        LOG_TLOC_MTX_ENTER(mtxid, tmout);
     
    614614        }
    615615        else {
    616                 p_runtsk->tstat = TS_WAITING_MTX;
    617                 wobj_make_wait_tmout((WOBJCB *) p_mtxcb, (WINFO_WOBJ *) &winfo_mtx,
    618                                                                                                                 &tmevtb, tmout);
     616                wobj_make_wait_tmout((WOBJCB *) p_mtxcb, TS_WAITING_MTX,
     617                                                                (WINFO_WOBJ *) &winfo_mtx, &tmevtb, tmout);
    619618                dispatch();
    620619                ercd = winfo_mtx.winfo.wercd;
  • EcnlProtoTool/trunk/asp3_dcre/kernel/mutex.trb

    r321 r429  
    66#
    77#   Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN
    8 #   Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
     8#   Copyright (C) 2015-2019 by Embedded and Real-Time Systems Laboratory
    99#               Graduate School of Information Science, Nagoya Univ., JAPAN
    1010#
     
    5151
    5252  def prepare(key, params)
    53     # mtxatrが無効の場合(E_RSATR)[NGKI2025]
    54     # (TA_NULL,TA_TPRI,TA_CEILINGのいずれでもない場合)
     53    # mtxatrが無効の場合(E_RSATR)[NGKI2025][NGKI2010]
     54    #(TA_NULL,TA_TPRI,TA_CEILINGのいずれでもない場合)
    5555    if !(params[:mtxatr] == $TA_NULL || params[:mtxatr] == $TA_TPRI \
    5656                                                                                || params[:mtxatr] == $TA_CEILING)
     
    6060    if params[:mtxatr] == $TA_CEILING
    6161      # 優先度上限ミューテックスの場合
    62       # ceilpriが未指定の場合はエラーとする
    63       if params[:ceilpri].nil?
     62      # ceilpriの記述が省略されている場合[NGKI2035]
     63      if !params.has_key?(:ceilpri)
    6464        error_api(params, "ceilpri must be specified in %apiname of %mtxid")
    6565
    66       # (TMIN_TPRI <= ceilpri && ceilpri <= TMAX_TPRI)でない場合(E_PAR)
    67       # [NGKI2037]
     66      # ceilpriが有効範囲外の場合(E_PAR)[NGKI2037]
     67      #(TMIN_TPRI <= ceilpri && ceilpri <= TMAX_TPRIでない場合)
    6868      elsif !($TMIN_TPRI <= params[:ceilpri] && params[:ceilpri] <= $TMAX_TPRI)
    6969        error_illegal_id("E_PAR", params, :ceilpri, :mtxid)
     
    7171    else
    7272      # 優先度上限ミューテックスでない場合
    73       # ceilpriが指定されている場合は警告メッセージを出す
    74       if !params[:ceilpri].nil?
     73      # ceilpriが記述されている場合は警告メッセージを出す
     74      if params.has_key?(:ceilpri)
    7575        warning_api(params, "%%ceilpri is ignored in %apiname of %mtxid")
    7676      end
  • EcnlProtoTool/trunk/asp3_dcre/kernel/pridataq.c

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2005-2016 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2005-2018 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    335335        p_pdqmb = pk_cpdq->pdqmb;
    336336
    337         CHECK_RSATR(pdqatr, TA_TPRI);
     337        CHECK_VALIDATR(pdqatr, TA_TPRI);
    338338        CHECK_PAR(VALID_DPRI(maxdpri));
     339        if (p_pdqmb != NULL) {
     340                CHECK_PAR(MB_ALIGN(p_pdqmb));
     341        }
    339342
    340343        lock_cpu();
     
    344347        else {
    345348                if (pdqcnt != 0 && p_pdqmb == NULL) {
    346                         p_pdqmb = kernel_malloc(sizeof(PDQMB) * pdqcnt);
     349                        p_pdqmb = malloc_mpk(sizeof(PDQMB) * pdqcnt);
    347350                        pdqatr |= TA_MBALLOC;
    348351                }
     
    405408                p_pdqinib = (PDQINIB *)(p_pdqcb->p_pdqinib);
    406409                if ((p_pdqinib->pdqatr & TA_MBALLOC) != 0U) {
    407                         kernel_free(p_pdqinib->p_pdqmb);
     410                        free_mpk(p_pdqinib->p_pdqmb);
    408411                }
    409412                p_pdqinib->pdqatr = TA_NOEXS;
     
    431434snd_pdq(ID pdqid, intptr_t data, PRI datapri)
    432435{
    433         PDQCB   *p_pdqcb;
    434         WINFO_SPDQ winfo_spdq;
    435         ER              ercd;
     436        PDQCB           *p_pdqcb;
     437        WINFO_SPDQ      winfo_spdq;
     438        ER                      ercd;
    436439
    437440        LOG_SND_PDQ_ENTER(pdqid, data, datapri);
     
    460463                winfo_spdq.data = data;
    461464                winfo_spdq.datapri = datapri;
    462                 p_runtsk->tstat = TS_WAITING_SPDQ;
    463                 wobj_make_wait((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_spdq);
     465                wobj_make_wait((WOBJCB *) p_pdqcb, TS_WAITING_SPDQ,
     466                                                                                        (WINFO_WOBJ *) &winfo_spdq);
    464467                dispatch();
    465468                ercd = winfo_spdq.winfo.wercd;
     
    504507                        }
    505508                        else {
    506                                 request_dispatch();
     509                                request_dispatch_retint();
    507510                        }
    508511                }
     
    529532tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout)
    530533{
    531         PDQCB   *p_pdqcb;
    532         WINFO_SPDQ winfo_spdq;
    533         TMEVTB  tmevtb;
    534         ER              ercd;
     534        PDQCB           *p_pdqcb;
     535        WINFO_SPDQ      winfo_spdq;
     536        TMEVTB          tmevtb;
     537        ER                      ercd;
    535538
    536539        LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout);
     
    563566                winfo_spdq.data = data;
    564567                winfo_spdq.datapri = datapri;
    565                 p_runtsk->tstat = TS_WAITING_SPDQ;
    566                 wobj_make_wait_tmout((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_spdq,
    567                                                                                                                 &tmevtb, tmout);
     568                wobj_make_wait_tmout((WOBJCB *) p_pdqcb, TS_WAITING_SPDQ,
     569                                                                (WINFO_WOBJ *) &winfo_spdq, &tmevtb, tmout);
    568570                dispatch();
    569571                ercd = winfo_spdq.winfo.wercd;
     
    586588rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
    587589{
    588         PDQCB   *p_pdqcb;
    589         WINFO_RPDQ winfo_rpdq;
    590         ER              ercd;
     590        PDQCB           *p_pdqcb;
     591        WINFO_RPDQ      winfo_rpdq;
     592        ER                      ercd;
    591593
    592594        LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri);
     
    609611        }
    610612        else {
    611                 p_runtsk->tstat = TS_WAITING_RPDQ;
    612                 make_wait(&(winfo_rpdq.winfo));
     613                make_wait(TS_WAITING_RPDQ, &(winfo_rpdq.winfo));
    613614                queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
    614615                winfo_rpdq.p_pdqcb = p_pdqcb;
     
    676677trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout)
    677678{
    678         PDQCB   *p_pdqcb;
    679         WINFO_RPDQ winfo_rpdq;
    680         TMEVTB  tmevtb;
    681         ER              ercd;
     679        PDQCB           *p_pdqcb;
     680        WINFO_RPDQ      winfo_rpdq;
     681        TMEVTB          tmevtb;
     682        ER                      ercd;
    682683
    683684        LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout);
     
    704705        }
    705706        else {
    706                 p_runtsk->tstat = TS_WAITING_RPDQ;
    707                 make_wait_tmout(&(winfo_rpdq.winfo), &tmevtb, tmout);
     707                make_wait_tmout(TS_WAITING_RPDQ, &(winfo_rpdq.winfo), &tmevtb, tmout);
    708708                queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
    709709                winfo_rpdq.p_pdqcb = p_pdqcb;
  • EcnlProtoTool/trunk/asp3_dcre/kernel/pridataq.trb

    r321 r429  
    66#
    77#   Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN
    8 #   Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
     8#   Copyright (C) 2015-2019 by Embedded and Real-Time Systems Laboratory
    99#               Graduate School of Information Science, Nagoya Univ., JAPAN
    1010#
     
    5454    params[:pdqmb] ||= "NULL"
    5555
    56     # pdqatrが無効の場合(E_RSATR)[NGKI1804]
     56    # pdqatrが無効の場合(E_RSATR)[NGKI1804][NGKI1795]
    5757    #(TA_TPRI以外のビットがセットされている場合)
    5858    if (params[:pdqatr] & ~($TA_TPRI)) != 0
     
    6060    end
    6161
    62     # (TMIN_DPRI <= maxdpri && maxdpri <= TMAX_DPRI)でない場合(E_PAR)
    63     # [NGKI1819]
     62        # maxdpriが有効範囲外の場合(E_PAR)[NGKI1819]
     63    #(TMIN_DPRI <= maxdpri && maxdpri <= TMAX_DPRIでない場合)
    6464    if !($TMIN_DPRI <= params[:maxdpri] && params[:maxdpri] <= $TMAX_DPRI)
    6565      error_illegal_id("E_PAR", params, :maxdpri, :pdqid)
  • EcnlProtoTool/trunk/asp3_dcre/kernel/semaphore.c

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2005-2016 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2005-2018 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    186186        maxsem = pk_csem->maxsem;
    187187
    188         CHECK_RSATR(sematr, TA_TPRI);
     188        CHECK_VALIDATR(sematr, TA_TPRI);
    189189        CHECK_PAR(0 <= isemcnt && isemcnt <= maxsem);
    190190        CHECK_PAR(1 <= maxsem && maxsem <= TMAX_MAXSEM);
     
    286286                        }
    287287                        else {
    288                                 request_dispatch();
     288                                request_dispatch_retint();
    289289                        }
    290290                }
     
    315315wai_sem(ID semid)
    316316{
    317         SEMCB   *p_semcb;
    318         WINFO_SEM winfo_sem;
    319         ER              ercd;
     317        SEMCB           *p_semcb;
     318        WINFO_SEM       winfo_sem;
     319        ER                      ercd;
    320320
    321321        LOG_WAI_SEM_ENTER(semid);
     
    336336        }
    337337        else {
    338                 p_runtsk->tstat = TS_WAITING_SEM;
    339                 wobj_make_wait((WOBJCB *) p_semcb, (WINFO_WOBJ *) &winfo_sem);
     338                wobj_make_wait((WOBJCB *) p_semcb, TS_WAITING_SEM,
     339                                                                                        (WINFO_WOBJ *) &winfo_sem);
    340340                dispatch();
    341341                ercd = winfo_sem.winfo.wercd;
     
    394394twai_sem(ID semid, TMO tmout)
    395395{
    396         SEMCB   *p_semcb;
    397         WINFO_SEM winfo_sem;
    398         TMEVTB  tmevtb;
    399         ER              ercd;
     396        SEMCB           *p_semcb;
     397        WINFO_SEM       winfo_sem;
     398        TMEVTB          tmevtb;
     399        ER                      ercd;
    400400
    401401        LOG_TWAI_SEM_ENTER(semid, tmout);
     
    420420        }
    421421        else {
    422                 p_runtsk->tstat = TS_WAITING_SEM;
    423                 wobj_make_wait_tmout((WOBJCB *) p_semcb, (WINFO_WOBJ *) &winfo_sem,
    424                                                                                                                 &tmevtb, tmout);
     422                wobj_make_wait_tmout((WOBJCB *) p_semcb, TS_WAITING_SEM,
     423                                                                (WINFO_WOBJ *) &winfo_sem, &tmevtb, tmout);
    425424                dispatch();
    426425                ercd = winfo_sem.winfo.wercd;
  • EcnlProtoTool/trunk/asp3_dcre/kernel/semaphore.trb

    r321 r429  
    66#
    77#   Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN
    8 #   Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
     8#   Copyright (C) 2015-2019 by Embedded and Real-Time Systems Laboratory
    99#               Graduate School of Information Science, Nagoya Univ., JAPAN
    1010#
     
    5151
    5252  def prepare(key, params)
    53     # sematrが無効の場合(E_RSATR)[NGKI1456]
     53    # sematrが無効の場合(E_RSATR)[NGKI1456][NGKI1448]
    5454    #(TA_TPRI以外のビットがセットされている場合)
    5555    if (params[:sematr] & ~($TA_TPRI)) != 0
     
    5757    end
    5858
    59     # (1 <= maxsem && maxsem <= TMAX_MAXSEM)でない場合(E_PAR)[NGKI1468]
     59    # maxsemが有効範囲外の場合(E_PAR)[NGKI1468]
     60    #(1 <= maxsem && maxsem <= TMAX_MAXSEMでない場合)
    6061    if !(1 <= params[:maxsem] && params[:maxsem] <= $TMAX_MAXSEM)
    6162      error_illegal_id("E_PAR", params, :maxsem, :semid)
    6263    end
    6364
    64     # (0 <= isemcnt && isemcnt <= maxsem)でない場合(E_PAR)[NGKI1466]
     65    # isemcntが有効範囲外の場合(E_PAR)[NGKI1466]
     66    #(0 <= isemcnt && isemcnt <= maxsemでない場合)
    6567    if !(0 <= params[:isemcnt] && params[:isemcnt] <= params[:maxsem])
    6668      error_wrong_id("E_PAR", params, :isemcnt, :semid, "too large")
  • EcnlProtoTool/trunk/asp3_dcre/kernel/startup.c

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2005-2016 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2005-2018 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    7979
    8080/*
     81 *  カーネルメモリプール領域有効フラグ
     82 */
     83bool_t  mpk_valid;
     84
     85/*
    8186 *  カーネルの起動
    8287 */
     
    8489sta_ker(void)
    8590{
     91        uint_t  i;
     92
    8693        /*
    8794         *  TECSの初期化
     
    102109         *  する必要がある.
    103110         */
    104         initialize_kmm();
     111        if (mpk != NULL) {
     112                mpk_valid = initialize_mempool(mpk, mpksz);
     113        }
     114        else {
     115                mpk_valid = false;
     116        }
    105117        initialize_tmevt();                                                             /*[ASPD1061]*/
    106118        initialize_object();
     
    109121         *  初期化ルーチンの実行
    110122         */
    111         call_inirtn();
     123        for (i = 0; i < tnum_inirtn; i++) {
     124                (*(inirtnb_table[i].inirtn))(inirtnb_table[i].exinf);
     125        }
    112126
    113127        /*
     
    172186exit_kernel(void)
    173187{
     188        uint_t  i;
     189
    174190        /*
    175191         *  終了処理ルーチンの実行
    176192         */
    177         call_terrtn();
     193        for (i = 0; i < tnum_terrtn; i++) {
     194                (*(terrtnb_table[i].terrtn))(terrtnb_table[i].exinf);
     195        }
    178196
    179197        /*
     
    187205
    188206/*
    189  *  カーネルの割り付けるメモリ領域の管理
     207 *  デフォルトのメモリプール管理機能
    190208 *
    191  *  メモリ領域を先頭から順に割り当て,解放されたメモリ領域を再利用しな
    192  *  いメモリ管理モジュール.
     209 *  メモリプール領域の先頭から順に割り当てを行い,すべてのメモリ領域が
     210 *  解放されるまで解放されたメモリ領域を再利用しないメモリプール管理機
     211 *  能.
    193212 */
    194213#ifdef TOPPERS_kermem
    195 #ifndef OMIT_KMM_ALLOCONLY
    196 
    197 static void     *kmm_brk;
    198 
    199 void
    200 initialize_kmm(void)
    201 {
    202         kmm_brk = ((char *) kmm) + kmmsz;
     214#ifndef OMIT_MEMPOOL_DEFAULT
     215
     216typedef struct {
     217        void    *brk;           /* メモリプール領域の未使用領域の先頭番地 */
     218        void    *limit;         /* メモリプール領域の上限 */
     219        uint_t  count;          /* 割り当てたメモリ領域の数 */
     220} MEMPOOLCB;
     221
     222bool_t
     223initialize_mempool(MB_T *mempool, size_t size)
     224{
     225        MEMPOOLCB       *p_mempoolcb = ((MEMPOOLCB *) mempool);
     226
     227        if (size >= sizeof(MEMPOOLCB)) {
     228                p_mempoolcb->brk = ((char *) mempool) + sizeof(MEMPOOLCB);
     229                p_mempoolcb->limit = ((char *) mempool) + size;
     230                p_mempoolcb->count = 0;
     231                return(true);
     232        }
     233        else {
     234                return(false);
     235        }
    203236}
    204237
    205238void *
    206 kernel_malloc(size_t size)
    207 {
    208         if (((char *) kmm_brk) - ((char *) kmm) >= size) {
    209                 kmm_brk = ((char *) kmm_brk) - size;
    210                 return(kmm_brk);
     239malloc_mempool(MB_T *mempool, size_t size)
     240{
     241        MEMPOOLCB       *p_mempoolcb = ((MEMPOOLCB *) mempool);
     242        void            *brk;
     243
     244        brk = ((MEMPOOLCB *) mempool)->brk;
     245        if (((char *)(p_mempoolcb->limit)) - ((char *) brk) >= size) {
     246                p_mempoolcb->brk = ((char *) brk) + size;
     247                p_mempoolcb->count += 1;
     248                return(brk);
    211249        }
    212250        else {
     
    216254
    217255void
    218 kernel_free(void *ptr)
    219 {
    220 }
    221 
    222 #endif /* OMIT_KMM_ALLOCONLY */
     256free_mempool(MB_T *mempool, void *ptr)
     257{
     258        MEMPOOLCB       *p_mempoolcb = ((MEMPOOLCB *) mempool);
     259
     260        p_mempoolcb->count -= 1;
     261        if (p_mempoolcb->count == 0) {
     262                p_mempoolcb->brk = ((char *) mempool) + sizeof(MEMPOOLCB);
     263        }
     264}
     265
     266#endif /* OMIT_MEMPOOL_DEFAULT */
    223267#endif /* TOPPERS_kermem */
  • EcnlProtoTool/trunk/asp3_dcre/kernel/sys_manage.c

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2005-2015 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2005-2019 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    184184                }
    185185                else {
    186                         request_dispatch();
     186                        request_dispatch_retint();
    187187                }
    188188        }
     
    205205get_tid(ID *p_tskid)
    206206{
     207        bool_t lock;
    207208        ER              ercd;
    208209
    209210        LOG_GET_TID_ENTER(p_tskid);
    210         CHECK_UNL();                                                            /*[NGKI2707]*/
    211 
    212         lock_cpu();
     211        //CHECK_UNL();                                                          /*[NGKI2707]*/
     212        lock = sense_lock();
     213
     214        if (!lock)
     215                lock_cpu();
    213216        *p_tskid = (p_runtsk == NULL) ? TSK_NONE : TSKID(p_runtsk);
    214         ercd = E_OK;
    215         unlock_cpu();
     217        ercd = E_OK;                                                            /*[NGKI2710][NGKI2709]*/
     218        if (!lock)
     219                unlock_cpu();
    216220
    217221  error_exit:
     
    399403        enadsp = true;
    400404        if (t_get_ipm() == TIPM_ENAALL) {
    401                 dspflg = true;
    402                 p_schedtsk = search_schedtsk();
     405                set_dspflg();
    403406                if (p_runtsk->raster && p_runtsk->enater) {
    404407                        task_terminate(p_runtsk);
  • EcnlProtoTool/trunk/asp3_dcre/kernel/task.c

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2005-2014 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2005-2017 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    113113                p_tcb->actque = false;
    114114                make_dormant(p_tcb);
     115                p_tcb->p_lastmtx = NULL;
    115116                if ((p_tcb->p_tinib->tskatr & TA_ACT) != 0U) {
    116117                        make_active(p_tcb);
     
    232233 *
    233234 *  実行すべきタスクを更新するのは,実行できるタスクがなかった場合と,
    234  *  p_tcbの優先度が実行すべきタスクの優先度よりも高い場合である.
     235 *  p_tcbで指定されるタスクの優先度が実行すべきタスクの優先度よりも高
     236 *  い場合である.
    235237 */
    236238#ifdef TOPPERS_tskrun
     
    256258 *  実行できる状態から他の状態への遷移
    257259 *
    258  *  実行すべきタスクを更新するのは,p_tcbが実行すべきタスクであった場合
    259  *  である.p_tcbと同じ優先度のタスクが他にある場合は,p_tcbの次のタス
    260  *  クが実行すべきタスクになる.そうでない場合は,レディキューをサーチ
    261  *  する必要がある.
     260 *  実行すべきタスクを更新するのは,p_tcbで指定されるタスクが実行すべ
     261 *  きタスクであった場合である.p_tcbで指定されるタスクと同じ優先度の
     262 *  タスクが他にある場合は,そのタスクの次のタスクが実行すべきタスクに
     263 *  なる.そうでない場合は,レディキューをサーチする必要がある.
     264 *
     265 *  自タスクに対してこの関数が呼ばれるのは,タスクディスパッチ可能状態
     266 *  に限られる.またこの関数は,非タスクコンテキストから呼ばれることは
     267 *  ないため,p_runtskとp_schedtskは必ず一致している.そのため,p_tcb
     268 *  とp_schedtskが一致するときは,必ずタスクディスパッチ可能状態である.
    262269 */
    263270#ifdef TOPPERS_tsknrun
     
    325332 *  タスクの優先度の変更
    326333 *
    327  *  タスクが実行できる状態の場合には,レディキューの中での位置を変更す
    328  *  る.オブジェクトの待ちキューの中で待ち状態になっている場合には,待
    329  *  ちキューの中での位置を変更する.
    330  *
    331  *  実行すべきタスクを更新するのは,(1) p_tcbが実行すべきタスクであって,
    332  *  その優先度を下げた場合,(2) p_tcbが実行すべきタスクではなく,変更後
    333  *  の優先度が実行すべきタスクの優先度よりも高い場合である.(1)の場合に
    334  *  は,レディキューをサーチする必要がある.
     334 *  p_tcbで指定されるタスクが実行できる状態の場合には,レディキューの
     335 *  中での位置を変更する.オブジェクトの待ちキューの中で待ち状態になっ
     336 *  ている場合には,待ちキューの中での位置を変更する.
     337 *
     338 *  実行すべきタスクを更新するのは,(1) p_tcbで指定されるタスクが実行
     339 *  すべきタスクであった場合には,優先度を下げた(または優先度が変わら
     340 *  なかった)時,(2) p_tcbで指定されるタスクが実行すべきタスクでなかっ
     341 *  た場合には,変更後の優先度が実行すべきタスクの優先度よりも高いか同
     342 *  じ時(同じ場合に更新が必要になるのは,実際には,mtxmodeがtrueの場
     343 *  合のみ)である.(1)の場合には,レディキューをサーチする必要がある.
    335344 */
    336345#ifdef TOPPERS_tskpri
     
    367376                        }
    368377                        else {
    369                                 if (mtxmode ? newpri <= p_schedtsk->priority
    370                                                         : newpri < p_schedtsk->priority) {
    371                                         p_schedtsk = p_tcb;
     378                                if (newpri <= p_schedtsk->priority) {
     379                                        p_schedtsk = (TCB *)(ready_queue[newpri].p_next);
    372380                                }
    373381                        }
  • EcnlProtoTool/trunk/asp3_dcre/kernel/task.h

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2005-2015 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2005-2017 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    186186 *  が,実行効率が悪くなるために採用していない.他のオブジェクトについ
    187187 *  ても同様に扱う.
    188  *
    189  *  タスク初期化ブロックには,DEF_TEXで定義されるタスク例外処理ルーチ
    190  *  ンに関する情報も含む.
    191188 */
    192189typedef struct task_initialization_block {
     
    239236        BIT_FIELD_UINT  tstat : 8;              /* タスク状態(内部表現)*/
    240237        BIT_FIELD_UINT  bpriority : 8;  /* ベース優先度(内部表現)*/
    241         BIT_FIELD_UINT  priority : 8    /* 現在の優先度(内部表現)*/;
     238        BIT_FIELD_UINT  priority : 8;   /* 現在の優先度(内部表現)*/
    242239#endif /* UINT8_MAX */
    243240        BIT_FIELD_BOOL  actque : 1;             /* 起動要求キューイング */
     
    380377 *  実行できる状態への遷移
    381378 *
    382  *  p_tcbで指定されるタスクをレディキューに挿入する.レディキューに挿入
    383  *  したタスクの優先度が,実行すべきタスクの優先度よりも高い場合は,実
    384  *  行すべきタスクを更新する.
     379 *  p_tcbで指定されるタスクをレディキューに挿入する.また,必要な場合
     380 *  には,実行すべきタスクを更新する.
    385381 */
    386382extern void     make_runnable(TCB *p_tcb);
     
    396392
    397393/*
     394 *  タスクディスパッチ可能状態への遷移
     395 *
     396 *  タスクディスパッチ可能状態であることを示すフラグ(dspflg)をtrueに
     397 *  し,実行すべきタスクを更新する.
     398 */
     399Inline void
     400set_dspflg(void)
     401{
     402        dspflg = true;
     403        p_schedtsk = search_schedtsk();
     404}
     405
     406/*
    398407 *  休止状態への遷移
    399408 *
     
    417426 *  必要な場合には,実行すべきタスクを更新する.
    418427 *
    419  *  p_tcbで指定されるタスクの優先順位は,優先度が同じタスクの中で,
    420  *  mtxmodeがfalseの時は最低,mtxmodeがtrueの時は最高とする.
     428 *  p_tcbで指定されるタスクが実行できる状態である場合,その優先順位は,
     429 *  優先度が同じタスクの中で,mtxmodeがfalseの時は最低,mtxmodeがtrue
     430 *  の時は最高とする.
    421431 */
    422432extern void     change_priority(TCB *p_tcb, uint_t newpri, bool_t mtxmode);
     
    425435 *  レディキューの回転
    426436 *
    427  *  レディキュー中の,p_queueで指定されるタスクキューを回転させる.また,
    428  *  必要な場合には,実行すべきタスクを更新する.
     437 *  レディキュー中の,p_queueで指定されるタスクキューを回転させる.ま
     438 *  た,必要な場合には,実行すべきタスクを更新する.
    429439 */
    430440extern void     rotate_ready_queue(QUEUE *p_queue);
  • EcnlProtoTool/trunk/asp3_dcre/kernel/task.trb

    r321 r429  
    66#
    77#   Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN
    8 #   Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
     8#   Copyright (C) 2015-2019 by Embedded and Real-Time Systems Laboratory
    99#               Graduate School of Information Science, Nagoya Univ., JAPAN
    1010#
     
    5454    params[:stk] ||= "NULL"
    5555
    56     # tskatrが無効の場合(E_RSATR)[NGKI1028]
     56    # tskatrが無効の場合(E_RSATR)[NGKI1028][NGKI3526][ASPS0009]
     57    # [NGKI1016]
    5758    #(TA_ACT,TA_NOACTQUE,TARGET_TSKATR以外のビットがセットされている場合)
    5859    if (params[:tskatr] & ~($TA_ACT|$TA_NOACTQUE|$TARGET_TSKATR)) != 0
     
    6061    end
    6162
    62     # (TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI)でない場合[NGKI1034]
     63    # itskpriが有効範囲外の場合(E_PAR)[NGKI1034]
     64    #(TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRIでない場合)
    6365    if !($TMIN_TPRI <= params[:itskpri] && params[:itskpri] <= $TMAX_TPRI)
    6466      error_illegal_id("E_PAR", params, :itskpri, :tskid)
     
    6668
    6769    # stkszがターゲット定義の最小値(TARGET_MIN_STKSZ,未定義の場合は1)
    68     # よりも小さい場合[NGKI1042]
     70    # よりも小さい場合(E_PAR)[NGKI1042]
    6971    if params[:stksz] < $TARGET_MIN_STKSZ
    7072      error_wrong_id("E_PAR", params, :stksz, :tskid, "too small")
     
    7880      params[:tinib_stk] = stkName
    7981    else
    80       # stkszがスタック領域のサイズとして正しくない場合[NGKI1056]
     82      # stkszがターゲット定義の制約に合致しない場合(E_PAR)[NGKI1056]
    8183      if (params[:stksz] & ($CHECK_STKSZ_ALIGN - 1)) != 0
    8284        error_wrong_id("E_PAR", params, :stksz, :tskid, "not aligned")
     
    8587      params[:tinib_stksz] = params[:stksz]
    8688      params[:tinib_stk] = "(void *)(#{params[:stk]})"
     89    end
     90
     91    # ターゲット依存の処理(ターゲット依存のエラーチェックを含む)
     92    if defined? TargetTaskPrepare()
     93      TargetTaskPrepare(key, params)
    8794    end
    8895  end
     
    100107end
    101108
     109# タスクが1つも登録されていない場合[NGKI0033]
     110if $cfgData[:CRE_TSK].size() == 0
     111  error("no task is registered")
     112end
     113
    102114#
    103115#  タスク管理に関する情報の生成
    104116#
    105117$kernelCfgC.comment_header("Task Management Functions")
    106 if $cfgData[:CRE_TSK].size() == 0
    107   error("no task is registered")
    108 end
    109118TaskObject.new.generate()
    110119
     
    112121$kernelCfgC.add("const ID _kernel_torder_table[TNUM_STSKID] = { ")
    113122$kernelCfgC.append("\t")
    114 $cfgData[:CRE_TSK].each_with_index do |(key, params), index|
     123$cfgData[:CRE_TSK].each_with_index do |(_, params), index|
    115124  $kernelCfgC.append(", ") if index > 0
    116125  $kernelCfgC.append("#{params[:tskid]}")
  • EcnlProtoTool/trunk/asp3_dcre/kernel/task_manage.c

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2005-2017 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2005-2018 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    126126#ifdef TOPPERS_acre_tsk
    127127
    128 #ifndef TARGET_MIN_STKSZ
    129 #define TARGET_MIN_STKSZ        1U              /* 未定義の場合は0でないことをチェック */
    130 #endif /* TARGET_MIN_STKSZ */
    131 
    132128ER_UINT
    133129acre_tsk(const T_CTSK *pk_ctsk)
     
    151147        stk = pk_ctsk->stk;
    152148
    153         CHECK_RSATR(tskatr, TA_ACT|TA_NOACTQUE|TARGET_TSKATR);
     149        CHECK_VALIDATR(tskatr, TA_ACT|TA_NOACTQUE|TARGET_TSKATR);
    154150        CHECK_PAR(FUNC_ALIGN(task));
    155151        CHECK_PAR(FUNC_NONNULL(task));
     
    168164                if (stk == NULL) {
    169165                        stksz = ROUND_STK_T(stksz);
    170                         stk = kernel_malloc(stksz);
     166                        stk = malloc_mpk(stksz);
    171167                        tskatr |= TA_MEMALLOC;
    172168                }
     
    189185
    190186                        p_tcb->actque = false;
     187                        p_tcb->p_lastmtx = NULL;
    191188                        make_dormant(p_tcb);
    192189                        if ((p_tcb->p_tinib->tskatr & TA_ACT) != 0U) {
    193190                                make_active(p_tcb);
     191                                if (p_runtsk != p_schedtsk) {
     192                                        dispatch();
     193                                }
    194194                        }
    195195                        ercd = TSKID(p_tcb);
     
    235235#else /* USE_TSKINICTXB */
    236236                if ((p_tinib->tskatr & TA_MEMALLOC) != 0U) {    /*[NGKI1109]*/
    237                         kernel_free(p_tinib->stk);
     237                        free_mpk(p_tinib->stk);
    238238                }
    239239#endif /* USE_TSKINICTXB */
     
    283283                        }
    284284                        else {
    285                                 request_dispatch();
     285                                request_dispatch_retint();
    286286                        }
    287287                }
     
    423423        }
    424424        if (tskpri == TPRI_INI) {
     425                /*
     426                 *  以下の代入文は,対象タスクが未登録の場合に無効なフィールド
     427                 *  を参照するが,その場合はnewbpriの値を使わないので,問題な
     428                 *  い.
     429                 */
    425430                newbpri = p_tcb->p_tinib->ipriority;    /*[NGKI1199]*/
    426431        }
  • EcnlProtoTool/trunk/asp3_dcre/kernel/task_refer.c

    r321 r429  
    44 *      Advanced Standard Profile Kernel
    55 *
    6  *  Copyright (C) 2005-2014 by Embedded and Real-Time Systems Laboratory
     6 *  Copyright (C) 2005-2018 by Embedded and Real-Time Systems Laboratory
    77 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    88 *
     
    6767
    6868/*
    69  *  タスクの状態参照
     69 *  タスクの状態参照[NGKI1217]
    7070 */
    7171#ifdef TOPPERS_ref_tsk
     
    7979
    8080        LOG_REF_TSK_ENTER(tskid, pk_rtsk);
    81         CHECK_TSKCTX_UNL();
     81        CHECK_TSKCTX_UNL();                                                     /*[NGKI1218][NGKI1219]*/
    8282        if (tskid == TSK_SELF) {
    83                 p_tcb = p_runtsk;
     83                p_tcb = p_runtsk;                                               /*[NGKI1248]*/
    8484        }
    8585        else {
    86                 CHECK_ID(VALID_TSKID(tskid));
     86                CHECK_ID(VALID_TSKID(tskid));                   /*[NGKI1220]*/
    8787                p_tcb = get_tcb(tskid);
    8888        }
     
    9090        lock_cpu();
    9191        if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
    92                 ercd = E_NOEXS;
     92                ercd = E_NOEXS;                                                 /*[NGKI1221]*/
    9393        }
    9494        else {
     
    9696                if (TSTAT_DORMANT(tstat)) {
    9797                        /*
    98                          *  対象タスクが休止状態の場合
     98                         *  対象タスクが休止状態の場合[NGKI1225]
    9999                         */
    100100                        pk_rtsk->tskstat = TTS_DMT;
     
    102102                else {
    103103                        /*
    104                          *  タスク状態の取出し
     104                         *  タスク状態の取出し[NGKI1225]
    105105                         */
    106106                        if (TSTAT_SUSPENDED(tstat)) {
     
    123123
    124124                        /*
    125                          *  現在優先度とベース優先度の取出し
     125                         *  現在優先度とベース優先度の取出し[NGKI1227]
    126126                         */
    127127                        pk_rtsk->tskpri = EXT_TSKPRI(p_tcb->priority);
     
    130130                        if (TSTAT_WAITING(tstat)) {
    131131                                /*
    132                                  *  待ち要因と待ち対象のオブジェクトのIDの取出し
     132                                 *  待ち要因と待ち対象のオブジェクトのIDの取出し[NGKI1229]
     133                                 *  [NGKI1231]
    133134                                 */
    134                                 switch (tstat) {
     135                                switch (tstat & TS_WAITING_MASK) {
    135136                                case TS_WAITING_SLP:
    136137                                        pk_rtsk->tskwait = TTW_SLP;
     
    185186                                 */
    186187                                if (p_tcb->p_winfo->p_tmevtb != NULL) {
    187                                         pk_rtsk->lefttmo
     188                                        pk_rtsk->lefttmo                        /*[NGKI1233][NGKI1235]*/
    188189                                                        = (TMO) tmevt_lefttim(p_tcb->p_winfo->p_tmevtb);
    189190                                }
    190191                                else {
    191                                         pk_rtsk->lefttmo = TMO_FEVR;
    192                                 }
    193                         }
    194 
    195                         /*
    196                          *  起床要求キューイング数の取出し
     192                                        pk_rtsk->lefttmo = TMO_FEVR;    /*[NGKI1234]*/
     193                                }
     194                        }
     195
     196                        /*
     197                         *  起床要求キューイング数の取出し[NGKI1239]
    197198                         */
    198199                        pk_rtsk->wupcnt = p_tcb->wupque ? 1U : 0U;
    199200
    200201                        /*
    201                          *  タスク終了要求状態の取出し
     202                         *  タスク終了要求状態の取出し[NGKI3467]
    202203                         */
    203204                        pk_rtsk->raster = p_tcb->raster;
    204205
    205206                        /*
    206                          *  タスク終了禁止状態の取出し
     207                         *  タスク終了禁止状態の取出し[NGKI3468]
    207208                         */
    208209                        pk_rtsk->dister = !(p_tcb->enater);
     
    210211
    211212                /*
    212                  *  起動要求キューイング数の取出し
     213                 *  起動要求キューイング数の取出し[NGKI1238]
    213214                 */
    214215                pk_rtsk->actcnt = p_tcb->actque ? 1U : 0U;
  • EcnlProtoTool/trunk/asp3_dcre/kernel/task_sync.c

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2005-2015 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2005-2018 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    118118
    119119/*
    120  *  起床待ち
     120 *  起床待ち[NGKI1252]
    121121 */
    122122#ifdef TOPPERS_slp_tsk
     
    129129
    130130        LOG_SLP_TSK_ENTER();
    131         CHECK_DISPATCH();
     131        CHECK_DISPATCH();                                                       /*[NGKI1254]*/
    132132
    133133        lock_cpu_dsp();
    134134        if (p_runtsk->raster) {
    135                 ercd = E_RASTER;
     135                ercd = E_RASTER;                                                /*[NGKI3455]*/
    136136        }
    137137        else if (p_runtsk->wupque) {
    138                 p_runtsk->wupque = false;
    139                 ercd = E_OK;
    140         }
    141         else {
    142                 p_runtsk->tstat = TS_WAITING_SLP;
    143                 make_wait(&winfo);
     138                p_runtsk->wupque = false;                               /*[NGKI1259]*/
     139                ercd = E_OK;
     140        }
     141        else {
     142                make_wait(TS_WAITING_SLP, &winfo);              /*[NGKI1260]*/
    144143                LOG_TSKSTAT(p_runtsk);
    145144                dispatch();
     
    156155
    157156/*
    158  *  起床待ち(タイムアウトあり)
     157 *  起床待ち(タイムアウトあり)[NGKI1253]
    159158 */
    160159#ifdef TOPPERS_tslp_tsk
     
    168167
    169168        LOG_TSLP_TSK_ENTER(tmout);
    170         CHECK_DISPATCH();
    171         CHECK_PAR(VALID_TMOUT(tmout));
     169        CHECK_DISPATCH();                                                       /*[NGKI1254]*/
     170        CHECK_PAR(VALID_TMOUT(tmout));                          /*[NGKI1256]*/
    172171
    173172        lock_cpu_dsp();
    174173        if (p_runtsk->raster) {
    175                 ercd = E_RASTER;
     174                ercd = E_RASTER;                                                /*[NGKI3455]*/
    176175        }
    177176        else if (p_runtsk->wupque) {
    178                 p_runtsk->wupque = false;
     177                p_runtsk->wupque = false;                               /*[NGKI1259]*/
    179178                ercd = E_OK;
    180179        }
    181180        else if (tmout == TMO_POL) {
    182                 ercd = E_TMOUT;
    183         }
    184         else {
    185                 p_runtsk->tstat = TS_WAITING_SLP;
    186                 make_wait_tmout(&winfo, &tmevtb, tmout);
     181                ercd = E_TMOUT;                                                 /*[NGKI1257]*/
     182        }
     183        else {                                                                          /*[NGKI1260]*/
     184                make_wait_tmout(TS_WAITING_SLP, &winfo, &tmevtb, tmout);
    187185                LOG_TSKSTAT(p_runtsk);
    188186                dispatch();
     
    199197
    200198/*
    201  *  タスクの起床
     199 *  タスクの起床[NGKI3531]
    202200 */
    203201#ifdef TOPPERS_wup_tsk
     
    210208
    211209        LOG_WUP_TSK_ENTER(tskid);
    212         CHECK_UNL();
     210        CHECK_UNL();                                                            /*[NGKI1265]*/
    213211        if (tskid == TSK_SELF && !sense_context()) {
    214                 p_tcb = p_runtsk;
    215         }
    216         else {
    217                 CHECK_ID(VALID_TSKID(tskid));
     212                p_tcb = p_runtsk;                                               /*[NGKI1275]*/
     213        }
     214        else {
     215                CHECK_ID(VALID_TSKID(tskid));                   /*[NGKI1267]*/
    218216                p_tcb = get_tcb(tskid);
    219217        }
     
    221219        lock_cpu();
    222220        if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
    223                 ercd = E_NOEXS;
     221                ercd = E_NOEXS;                                                 /*[NGKI1268]*/
    224222        }
    225223        else if (TSTAT_DORMANT(p_tcb->tstat)) {
    226                 ercd = E_OBJ;
     224                ercd = E_OBJ;                                                   /*[NGKI1270]*/
    227225        }
    228226        else if (TSTAT_WAIT_SLP(p_tcb->tstat)) {
    229                 wait_complete(p_tcb);
     227                wait_complete(p_tcb);                                   /*[NGKI1271]*/
    230228                if (p_runtsk != p_schedtsk) {
    231229                        if (!sense_context()) {
     
    233231                        }
    234232                        else {
    235                                 request_dispatch();
     233                                request_dispatch_retint();
    236234                        }
    237235                }
     
    239237        }
    240238        else if (!(p_tcb->wupque)) {
    241                 p_tcb->wupque = true;
    242                 ercd = E_OK;
    243         }
    244         else {
    245                 ercd = E_QOVR;
     239                p_tcb->wupque = true;                                   /*[NGKI1273]*/
     240                ercd = E_OK;
     241        }
     242        else {
     243                ercd = E_QOVR;                                                  /*[NGKI1274]*/
    246244        }
    247245        unlock_cpu();
     
    255253
    256254/*
    257  *  タスク起床要求のキャンセル
     255 *  タスク起床要求のキャンセル[NGKI1276]
    258256 */
    259257#ifdef TOPPERS_can_wup
     
    266264
    267265        LOG_CAN_WUP_ENTER(tskid);
    268         CHECK_TSKCTX_UNL();
     266        CHECK_TSKCTX_UNL();                                                     /*[NGKI1277][NGKI1278]*/
    269267        if (tskid == TSK_SELF) {
    270                 p_tcb = p_runtsk;
    271         }
    272         else {
    273                 CHECK_ID(VALID_TSKID(tskid));
     268                p_tcb = p_runtsk;                                               /*[NGKI1285]*/
     269        }
     270        else {
     271                CHECK_ID(VALID_TSKID(tskid));                   /*[NGKI1280]*/
    274272                p_tcb = get_tcb(tskid);
    275273        }
     
    277275        lock_cpu();
    278276        if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
    279                 ercd = E_NOEXS;
     277                ercd = E_NOEXS;                                                 /*[NGKI1281]*/
    280278        }
    281279        else if (TSTAT_DORMANT(p_tcb->tstat)) {
    282                 ercd = E_OBJ;
    283         }
    284         else {
    285                 ercd = p_tcb->wupque ? 1 : 0;
    286                 p_tcb->wupque = false;
     280                ercd = E_OBJ;                                                   /*[NGKI1283]*/
     281        }
     282        else {
     283                ercd = p_tcb->wupque ? 1 : 0;                   /*[NGKI1284]*/
     284                p_tcb->wupque = false;                                  /*[NGKI1284]*/
    287285        }
    288286        unlock_cpu();
     
    296294
    297295/*
    298  *  待ち状態の強制解除
     296 *  待ち状態の強制解除[NGKI3532]
    299297 */
    300298#ifdef TOPPERS_rel_wai
     
    307305
    308306        LOG_REL_WAI_ENTER(tskid);
    309         CHECK_UNL();
    310         CHECK_ID(VALID_TSKID(tskid));
     307        CHECK_UNL();                                                            /*[NGKI1290]*/
     308        CHECK_ID(VALID_TSKID(tskid));                           /*[NGKI1292]*/
    311309        p_tcb = get_tcb(tskid);
    312310
    313311        lock_cpu();
    314312        if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
    315                 ercd = E_NOEXS;
     313                ercd = E_NOEXS;                                                 /*[NGKI1293]*/
    316314        }
    317315        else if (!TSTAT_WAITING(p_tcb->tstat)) {
    318                 ercd = E_OBJ;
    319         }
    320         else {
    321                 wait_dequeue_wobj(p_tcb);
     316                ercd = E_OBJ;                                                   /*[NGKI1295]*/
     317        }
     318        else {
     319                wait_dequeue_wobj(p_tcb);                               /*[NGKI1296]*/
    322320                wait_dequeue_tmevtb(p_tcb);
    323                 p_tcb->p_winfo->wercd = E_RLWAI;
     321                p_tcb->p_winfo->wercd = E_RLWAI;                /*[NGKI1297]*/
    324322                make_non_wait(p_tcb);
    325323                if (p_runtsk != p_schedtsk) {
     
    328326                        }
    329327                        else {
    330                                 request_dispatch();
     328                                request_dispatch_retint();
    331329                        }
    332330                }
     
    409407
    410408/*
    411  *  強制待ち状態からの再開
     409 *  強制待ち状態からの再開[NGKI1312]
    412410 */
    413411#ifdef TOPPERS_rsm_tsk
     
    420418
    421419        LOG_RSM_TSK_ENTER(tskid);
    422         CHECK_TSKCTX_UNL();
    423         CHECK_ID(VALID_TSKID(tskid));
     420        CHECK_TSKCTX_UNL();                                                     /*[NGKI1313][NGKI1314]*/
     421        CHECK_ID(VALID_TSKID(tskid));                           /*[NGKI1316]*/
    424422        p_tcb = get_tcb(tskid);
    425423
    426424        lock_cpu();
    427425        if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
    428                 ercd = E_NOEXS;
     426                ercd = E_NOEXS;                                                 /*[NGKI1317]*/
    429427        }
    430428        else if (!TSTAT_SUSPENDED(p_tcb->tstat)) {
    431                 ercd = E_OBJ;
    432         }
    433         else if (!TSTAT_WAITING(p_tcb->tstat)) {
     429                ercd = E_OBJ;                                                   /*[NGKI1319]*/
     430        }
     431        else {
    434432                /*
    435                  *  強制待ち状態から実行できる状態への遷移
     433                 *  強制待ちからの再開[NGKI1320]
    436434                 */
    437                 p_tcb->tstat = TS_RUNNABLE;
    438                 LOG_TSKSTAT(p_tcb);
    439                 make_runnable(p_tcb);
    440                 if (p_runtsk != p_schedtsk) {
    441                         dispatch();
     435                if (!TSTAT_WAITING(p_tcb->tstat)) {
     436                        p_tcb->tstat = TS_RUNNABLE;
     437                        LOG_TSKSTAT(p_tcb);
     438                        make_runnable(p_tcb);
     439                        if (p_runtsk != p_schedtsk) {
     440                                dispatch();
     441                        }
    442442                }
    443                 ercd = E_OK;
    444         }
    445         else {
    446                 /*
    447                  *  二重待ち状態から待ち状態への遷移
    448                  */
    449                 p_tcb->tstat &= ~TS_SUSPENDED;
    450                 LOG_TSKSTAT(p_tcb);
     443                else {
     444                        p_tcb->tstat &= ~TS_SUSPENDED;
     445                        LOG_TSKSTAT(p_tcb);
     446                }
    451447                ercd = E_OK;
    452448        }
     
    461457
    462458/*
    463  *  自タスクの遅延
     459 *  自タスクの遅延[NGKI1348]
    464460 */
    465461#ifdef TOPPERS_dly_tsk
     
    473469
    474470        LOG_DLY_TSK_ENTER(dlytim);
    475         CHECK_DISPATCH();
    476         CHECK_PAR(VALID_RELTIM(dlytim));
     471        CHECK_DISPATCH();                                                       /*[NGKI1349]*/
     472        CHECK_PAR(VALID_RELTIM(dlytim));                        /*[NGKI1351]*/
    477473
    478474        lock_cpu_dsp();
    479475        if (p_runtsk->raster) {
    480                 ercd = E_RASTER;
    481         }
    482         else {
    483                 p_runtsk->tstat = TS_WAITING_DLY;
     476                ercd = E_RASTER;                                                /*[NGKI3456]*/
     477        }
     478        else {
     479                p_runtsk->tstat = TS_WAITING_DLY;               /*[NGKI1353]*/
    484480                make_non_runnable(p_runtsk);
    485481                p_runtsk->p_winfo = &winfo;
     
    487483                tmevtb.callback = (CBACK) wait_tmout_ok;
    488484                tmevtb.arg = (void *) p_runtsk;
    489                 tmevtb_enqueue(&tmevtb, dlytim);
     485                tmevtb_enqueue_reltim(&tmevtb, dlytim);
    490486                LOG_TSKSTAT(p_runtsk);
    491487                dispatch();
  • EcnlProtoTool/trunk/asp3_dcre/kernel/task_term.c

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2005-2014 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2005-2017 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    109109ext_tsk(void)
    110110{
    111         PRI             intpri;
    112111        ER              ercd;
    113112
     
    126125        }
    127126
    128         intpri = t_get_ipm();
    129         if (!enadsp || intpri != TIPM_ENAALL) {
     127        if (!dspflg) {
    130128                if (!enadsp) {
    131129                        /*
     
    135133                        enadsp = true;
    136134                }
    137                 if (intpri != TIPM_ENAALL) {
     135                if (t_get_ipm() != TIPM_ENAALL) {
    138136                        /*
    139137                         *  割込み優先度マスク(IPM)がTIPM_ENAALL以外の状態で
     
    143141                        t_set_ipm(TIPM_ENAALL);
    144142                }
    145                 dspflg = true;
    146                 p_schedtsk = search_schedtsk();
     143                set_dspflg();
    147144        }
    148145
  • EcnlProtoTool/trunk/asp3_dcre/kernel/time_event.c

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2005-2016 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2005-2019 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    4949
    5050/*
     51 *  TCYC_HRTCNTの定義のチェック
     52 */
     53#if defined(USE_64BIT_HRTCNT) && defined(TCYC_HRTCNT)
     54#error TCYC_HRTCNT must not be defined when USE_64BIT_HRTCNT.
     55#endif
     56
     57/*
    5158 *  TSTEP_HRTCNTの範囲チェック
    5259 */
     
    5663
    5764/*
    58  *  HRTCNT_BOUNDの範囲チェック
    59  */
     65 *  HRTCNT_BOUNDの定義のチェック
     66 */
     67#ifndef USE_64BIT_HRTCNT
     68
    6069#if HRTCNT_BOUND >= 4294000000U
    6170#error HRTCNT_BOUND is too large.
     
    6776#endif /* HRTCNT_BOUND >= TCYC_HRTCNT */
    6877#endif /* TCYC_HRTCNT */
     78
     79#else /* USE_64BIT_HRTCNT */
     80
     81#ifdef HRTCNT_BOUND
     82#error USE_64BIT_HRTCNT is not supported on this target.
     83#endif /* HRTCNT_BOUND */
     84
     85#endif /* USE_64BIT_HRTCNT */
    6986
    7087/*
     
    367384        }
    368385#endif /* TCYC_HRTCNT */
     386        current_hrtcnt = new_hrtcnt;                                    /*[ASPD1016]*/
    369387
    370388        previous_evttim = current_evttim;
    371389        current_evttim += (EVTTIM) hrtcnt_advance;              /*[ASPD1015]*/
    372         current_hrtcnt = new_hrtcnt;                                    /*[ASPD1016]*/
    373390        boundary_evttim = current_evttim - BOUNDARY_MARGIN;     /*[ASPD1011]*/
    374391
     
    407424
    408425        if (p_last_tmevtn < p_top_tmevtn) {
     426                /*
     427                 *  タイムイベントがない場合
     428                 */
     429#ifdef USE_64BIT_HRTCNT
     430                target_hrt_clear_event();
     431#else /* USE_64BIT_HRTCNT */
    409432                target_hrt_set_event(HRTCNT_BOUND);                     /*[ASPD1007]*/
     433#endif /* USE_64BIT_HRTCNT */
    410434        }
    411435        else if (EVTTIM_LE(top_evttim, current_evttim)) {
     
    414438        else {
    415439                hrtcnt = (HRTCNT)(top_evttim - current_evttim);
     440#ifdef USE_64BIT_HRTCNT
     441                target_hrt_set_event(hrtcnt);
     442#else /* USE_64BIT_HRTCNT */
    416443                if (hrtcnt > HRTCNT_BOUND) {
    417444                        target_hrt_set_event(HRTCNT_BOUND);             /*[ASPD1006]*/
     
    420447                        target_hrt_set_event(hrtcnt);                   /*[ASPD1002]*/
    421448                }
     449#endif /* USE_64BIT_HRTCNT */
    422450        }
    423451}
     
    442470 * 
    443471 */
    444 #ifdef TOPPERS_tmeenq
     472#ifdef TOPPERS_tmeenqrel
    445473
    446474void
    447 tmevtb_enqueue(TMEVTB *p_tmevtb, RELTIM time)
     475tmevtb_enqueue_reltim(TMEVTB *p_tmevtb, RELTIM time)
    448476{
    449477        /*
     
    467495}
    468496
    469 #endif /* TOPPERS_tmeenq */
     497#endif /* TOPPERS_tmeenqrel */
    470498
    471499/*
     
    502530
    503531bool_t
    504 check_adjtim(int_t adjtim)
     532check_adjtim(int32_t adjtim)
    505533{
    506534        if (adjtim > 0) {
    507535                return(p_last_tmevtn >= p_top_tmevtn    /*[NGKI3588]*/
    508                                         && EVTTIM_LE(top_evttim, current_evttim - TMAX_ADJTIM));
     536                                        && EVTTIM_LE(top_evttim + TMAX_ADJTIM, current_evttim));
    509537        }
    510538        else if (adjtim < 0) {                                          /*[NGKI3589]*/
     
    559587        TMEVTB  *p_tmevtb;
    560588        bool_t  callflag;
     589#ifndef TOPPERS_OMIT_SYSLOG
     590        uint_t  nocall = 0;
     591#endif /* TOPPERS_OMIT_SYSLOG */
    561592
    562593        assert(sense_context());
     
    587618                        (*(p_tmevtb->callback))(p_tmevtb->arg);
    588619                        callflag = true;
     620#ifndef TOPPERS_OMIT_SYSLOG
     621                        nocall += 1;
     622#endif /* TOPPERS_OMIT_SYSLOG */
    589623                }
    590624        } while (callflag);                                                             /*[ASPD1020]*/
    591625
     626#ifndef TOPPERS_OMIT_SYSLOG
     627        /*
     628         *  タイムイベントが処理されなかった場合.
     629         */
     630        if (nocall == 0) {
     631                syslog_0(LOG_NOTICE, "no time event is processed in hrt interrupt.");
     632        }
     633#endif /* TOPPERS_OMIT_SYSLOG */
     634
    592635        /*
    593636         *  高分解能タイマ割込みの発生タイミングを設定する[ASPD1025].
  • EcnlProtoTool/trunk/asp3_dcre/kernel/time_event.h

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2005-2015 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2005-2019 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    162162 *  の発生時刻,コールバック関数,コールバック関数へ渡す引数は,
    163163 *  p_tmevtbが指すタイムイベントブロック中に設定しておく.
     164 *
     165 *  高分解能タイマ割込みの発生タイミングの設定を行わないため,カーネル
     166 *  の初期化時か,高分解能タイマ割込みの処理中で,それが必要ない場合に
     167 *  のみ使用する.
    164168 */
    165169extern void             tmevtb_register(TMEVTB *p_tmevtb);
     
    173177 *  ントブロック中に設定しておく.
    174178 */
    175 extern void             tmevtb_enqueue(TMEVTB *p_tmevtb, RELTIM time);
     179extern void             tmevtb_enqueue_reltim(TMEVTB *p_tmevtb, RELTIM time);
    176180
    177181/*
     
    187191 *  ベント時刻を取得した後に呼び出すことを想定している.
    188192 */
    189 extern bool_t   check_adjtim(int_t adjtim);
     193extern bool_t   check_adjtim(int32_t adjtim);
    190194
    191195/*
  • EcnlProtoTool/trunk/asp3_dcre/kernel/time_manage.c

    r321 r429  
    5353#include "time_event.h"
    5454#include "target_timer.h"
     55#include <sil.h>
    5556
    5657/*
     
    9899{
    99100        ER              ercd;
     101        bool_t lock;
    100102
    101103        LOG_SET_TIM_ENTER(systim);
    102         CHECK_TSKCTX_UNL();                                                     /*[NGKI3564][NGKI3565]*/
    103 
    104         lock_cpu();
     104        //CHECK_TSKCTX_UNL();                                                   /*[NGKI3564][NGKI3565]*/
     105        CHECK_TSKCTX();
     106        lock = sense_lock();
     107
     108        if (!lock)
     109                lock_cpu();
    105110        update_current_evttim();                                        /*[ASPD1059]*/
    106111        systim_offset = systim - monotonic_evttim;      /*[ASPD1060]*/
    107112        ercd = E_OK;
    108         unlock_cpu();
     113        if (!lock)
     114                unlock_cpu();
    109115
    110116  error_exit:
     
    124130{
    125131        ER              ercd;
     132        bool_t lock;
    126133
    127134        LOG_GET_TIM_ENTER(p_systim);
    128         CHECK_TSKCTX_UNL();                                                     /*[NGKI2350][NGKI2351]*/
    129 
    130         lock_cpu();
     135        //CHECK_TSKCTX_UNL();                                                   /*[NGKI2350][NGKI2351]*/
     136        CHECK_TSKCTX();
     137        lock = sense_lock();
     138
     139        if (!lock)
     140                lock_cpu();
    131141        update_current_evttim();                                        /*[ASPD1057]*/
    132142        *p_systim = systim_offset + monotonic_evttim;   /*[ASPD1058]*/
    133143        ercd = E_OK;
    134         unlock_cpu();
     144        if (!lock)
     145                unlock_cpu();
    135146
    136147  error_exit:
     
    176187                }
    177188
    178                 set_hrt_event();                                                /*[ASPD1056]*/
     189                if (!in_signal_time) {
     190                        set_hrt_event();                                        /*[ASPD1056]*/
     191                }
    179192                ercd = E_OK;
    180193        }
  • EcnlProtoTool/trunk/asp3_dcre/kernel/wait.c

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2005-2015 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2005-2018 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    5454
    5555void
    56 make_wait_tmout(WINFO *p_winfo, TMEVTB *p_tmevtb, TMO tmout)
     56make_wait_tmout(uint_t tstat, WINFO *p_winfo, TMEVTB *p_tmevtb, TMO tmout)
    5757{
     58        p_runtsk->tstat = tstat;
    5859        make_non_runnable(p_runtsk);
    5960        p_runtsk->p_winfo = p_winfo;
     
    6667                p_tmevtb->callback = (CBACK) wait_tmout;
    6768                p_tmevtb->arg = (void *) p_runtsk;
    68                 tmevtb_enqueue(p_tmevtb, (RELTIM) tmout);
     69                tmevtb_enqueue_reltim(p_tmevtb, (RELTIM) tmout);
    6970        }
    7071}
     
    99100        make_non_wait(p_tcb);
    100101        if (p_runtsk != p_schedtsk) {
    101                 request_dispatch();
     102                request_dispatch_retint();
    102103        }
    103104
     
    119120        make_non_wait(p_tcb);
    120121        if (p_runtsk != p_schedtsk) {
    121                 request_dispatch();
     122                request_dispatch_retint();
    122123        }
    123124
     
    155156
    156157void
    157 wobj_make_wait(WOBJCB *p_wobjcb, WINFO_WOBJ *p_winfo_wobj)
     158wobj_make_wait(WOBJCB *p_wobjcb, uint_t tstat, WINFO_WOBJ *p_winfo_wobj)
    158159{
    159         make_wait(&(p_winfo_wobj->winfo));
     160        make_wait(tstat, &(p_winfo_wobj->winfo));
    160161        wobj_queue_insert(p_wobjcb);
    161162        p_winfo_wobj->p_wobjcb = p_wobjcb;
     
    167168
    168169void
    169 wobj_make_wait_tmout(WOBJCB *p_wobjcb, WINFO_WOBJ *p_winfo_wobj,
    170                                                                 TMEVTB *p_tmevtb, TMO tmout)
     170wobj_make_wait_tmout(WOBJCB *p_wobjcb, uint_t tstat,
     171                                                WINFO_WOBJ *p_winfo_wobj, TMEVTB *p_tmevtb, TMO tmout)
    171172{
    172         make_wait_tmout(&(p_winfo_wobj->winfo), p_tmevtb, tmout);
     173        make_wait_tmout(tstat, &(p_winfo_wobj->winfo), p_tmevtb, tmout);
    173174        wobj_queue_insert(p_wobjcb);
    174175        p_winfo_wobj->p_wobjcb = p_wobjcb;
  • EcnlProtoTool/trunk/asp3_dcre/kernel/wait.h

    r321 r429  
    66 *  Copyright (C) 2000 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2005-2014 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2005-2018 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    7777 *  待ち状態への遷移
    7878 *
    79  *  実行中のタスクを待ち状態に遷移させる.具体的には,実行中のタスクを
    80  *  レディキューから削除し,TCBのp_winfoフィールド,WINFOのp_tmevtbフィー
    81  *  ルドを設定する.
    82  */
    83 Inline void
    84 make_wait(WINFO *p_winfo)
    85 {
     79 *  実行中のタスクを待ち状態に遷移させる.具体的には,実行中のタスクの
     80 *  タスク状態をtstatにしてレディキューから削除し,TCBのp_winfoフィー
     81 *  ルド,WINFOのp_tmevtbフィールドを設定する.
     82 */
     83Inline void
     84make_wait(uint_t tstat, WINFO *p_winfo)
     85{
     86        p_runtsk->tstat = tstat;
    8687        make_non_runnable(p_runtsk);
    8788        p_runtsk->p_winfo = p_winfo;
     
    9394 *
    9495 *  実行中のタスクを,タイムアウト指定付きで待ち状態に遷移させる.具体
    95  *  的には,実行中のタスクをレディキューから削除し,TCBのp_winfoフィー
    96  *  ルド,WINFOのp_tmevtbフィールドを設定する.また,タイムイベントブ
    97  *  ロックを登録する.
    98  */
    99 extern void     make_wait_tmout(WINFO *p_winfo, TMEVTB *p_tmevtb, TMO tmout);
     96 *  的には,実行中のタスクのタスク状態をtstatにしてレディキューから削
     97 *  除し,TCBのp_winfoフィールド,WINFOのp_tmevtbフィールドを設定する.
     98 *  また,タイムイベントブロックを登録する.
     99 */
     100extern void     make_wait_tmout(uint_t tstat, WINFO *p_winfo,
     101                                                                        TMEVTB *p_tmevtb, TMO tmout);
    100102
    101103/*
     
    246248 *  wobj_make_wait_tmoutは,タイムイベントブロックの登録も行う.
    247249 */
    248 extern void     wobj_make_wait(WOBJCB *p_wobjcb, WINFO_WOBJ *p_winfo);
    249 extern void     wobj_make_wait_tmout(WOBJCB *p_wobjcb, WINFO_WOBJ *p_winfo,
    250                                                                                         TMEVTB *p_tmevtb, TMO tmout);
     250extern void     wobj_make_wait(WOBJCB *p_wobjcb, uint_t tstat,
     251                                                                                        WINFO_WOBJ *p_winfo_wobj);
     252extern void     wobj_make_wait_tmout(WOBJCB *p_wobjcb, uint_t tstat,
     253                                                WINFO_WOBJ *p_winfo_wobj, TMEVTB *p_tmevtb, TMO tmout);
    251254
    252255/*
Note: See TracChangeset for help on using the changeset viewer.