void cpuexc_handler(void *p_excinf) { ID tskid; syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", p_excinf); if (sns_ctx() != true) { syslog(LOG_WARNING, "sns_ctx() is not true in CPU exception handler."); } if (sns_dpn() != true) { syslog(LOG_WARNING, "sns_dpn() is not true in CPU exception handler."); } syslog(LOG_INFO, "sns_loc = %d sns_dsp = %d sns_tex = %d", sns_loc(), sns_dsp(), sns_tex()); syslog(LOG_INFO, "xsns_dpn = %d xsns_xpn = %d", xsns_dpn(p_excinf), xsns_xpn(p_excinf)); if (xsns_xpn(p_excinf)) { syslog(LOG_NOTICE, "Sample program ends with exception."); SVC_PERROR(ext_ker()); assert(0); } SVC_PERROR(iget_tid(&tskid)); SVC_PERROR(iras_tex(tskid, 0x8000U)); }
void cpuexc_handler(VP p_excinf) { ID tskid; syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", p_excinf); if (sns_ctx() != TRUE) { syslog(LOG_WARNING, "sns_ctx() is not TRUE in CPU exception handler."); } if (sns_dpn() != TRUE) { syslog(LOG_WARNING, "sns_dpn() is not TRUE in CPU exception handler."); } syslog(LOG_DEBUG, "sns_loc = %d sns_dsp = %d", (int)sns_loc(), (int)sns_dsp()); syslog(LOG_DEBUG, "vxsns_loc = %d vxsns_ctx = %d vxsns_dsp = %d vxsns_dpn = %d", (int)vxsns_loc(p_excinf), (int)vxsns_ctx(p_excinf), (int)vxsns_dsp(p_excinf), (int)vxsns_dpn(p_excinf)); if (!vxsns_loc(p_excinf) && !vxsns_ctx(p_excinf)) { syscall(iget_tid(&tskid)); syscall(iras_tex(tskid, 0x8000)); } else { syslog(LOG_NOTICE, "Sample program ends with exception."); kernel_exit(); } }
ER_UINT serial_rea_dat(ID portid, char *buf, UINT len) { SPCB *spcb; BOOL buffer_empty; UINT i; if (sns_dpn()) { /* コンテキストのチェック */ return(E_CTX); } if (!(1 <= portid && portid <= TNUM_PORT)) { return(E_ID); /* ポート番号のチェック */ } spcb = get_spcb(portid); if (!(spcb->openflag)) { /* オープン済みかのチェック */ return(E_OBJ); } buffer_empty = TRUE; /* ループの1回めは wai_sem する */ for (i = 0; i < len; i++) { if (buffer_empty) { _syscall(wai_sem(spcb->spinib->rcv_semid)); } buffer_empty = serial_rea_chr(spcb, buf++); } if (!buffer_empty) { _syscall(sig_sem(spcb->spinib->rcv_semid)); } return((ER_UINT) len); }
void cpuexc_handler(void *p_excinf) { syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", p_excinf); if (sns_ctx() != true) { syslog(LOG_WARNING, "sns_ctx() is not true in CPU exception handler."); } if (sns_dpn() != true) { syslog(LOG_WARNING, "sns_dpn() is not true in CPU exception handler."); } syslog(LOG_INFO, "sns_loc = %d sns_dsp = %d xsns_dpn = %d", sns_loc(), sns_dsp(), xsns_dpn(p_excinf)); if (xsns_dpn(p_excinf)) { syslog(LOG_NOTICE, "Sample program ends with exception."); SVC_PERROR(ext_ker()); assert(0); } #ifdef PREPARE_RETURN_CPUEXC PREPARE_RETURN_CPUEXC; SVC_PERROR(get_tid(&cpuexc_tskid)); SVC_PERROR(act_tsk(EXC_TASK)); #else /* PREPARE_RETURN_CPUEXC */ syslog(LOG_NOTICE, "Sample program ends with exception."); SVC_PERROR(ext_ker()); assert(0); #endif /* PREPARE_RETURN_CPUEXC */ }
/* * シリアルポートのクローズ(サービスコール) */ ER serial_cls_por(ID portid) { SPCB *p_spcb; ER ercd; bool_t eflag = false; if (sns_dpn()) { /* コンテキストのチェック */ return(E_CTX); } if (!(1 <= portid && portid <= TNUM_PORT)) { return(E_ID); /* ポート番号のチェック */ } p_spcb = get_spcb(portid); SVC(dis_dsp(), gen_ercd_sys(p_spcb)); if (!(p_spcb->openflag)) { /* オープン済みかのチェック */ ercd = E_OBJ; } else { /* * ハードウェア依存のクローズ処理 */ if (loc_cpu() < 0) { eflag = true; } sio_cls_por(p_spcb->p_siopcb); p_spcb->openflag = false; if (unl_cpu() < 0) { eflag = true; } /* * セマフォの初期化 */ if (ini_sem(p_spcb->p_spinib->snd_semid) < 0) { eflag = true; } if (ini_sem(p_spcb->p_spinib->rcv_semid) < 0) { eflag = true; } /* * エラーコードの設定 */ if (eflag) { ercd = gen_ercd_sys(p_spcb); } else { ercd = E_OK; } } SVC(ena_dsp(), gen_ercd_sys(p_spcb)); error_exit: return(ercd); }
/* * シリアルポートのクローズ(受け口関数) */ ER eSerialPort_close(CELLIDX idx) { CELLCB *p_cellcb; ER ercd; bool_t eflag = false; if (sns_dpn()) { /* コンテキストのチェック */ return(E_CTX); } if (!VALID_IDX(idx)) { return(E_ID); /* ポート番号のチェック */ } p_cellcb = GET_CELLCB(idx); SVC(dis_dsp(), gen_ercd_sys(p_cellcb)); if (!VAR_openFlag) { /* オープン済みかのチェック */ ercd = E_OBJ; } else { /* * ハードウェア依存のクローズ処理 */ if (loc_cpu() < 0) { eflag = true; } cSIOPort_close(); VAR_openFlag = false; if (unl_cpu() < 0) { eflag = true; } /* * セマフォの初期化 */ if (cSendSemaphore_initialize() < 0) { eflag = true; } if (cReceiveSemaphore_initialize() < 0) { eflag = true; } /* * エラーコードの設定 */ if (eflag) { ercd = gen_ercd_sys(p_cellcb); } else { ercd = E_OK; } } SVC(ena_dsp(), gen_ercd_sys(p_cellcb)); error_exit: return(ercd); }
/* * シリアルポートからの文字列受信(サービスコール) */ ER_UINT serial_rea_dat(ID portid, char *buf, uint_t len) { SPCB *p_spcb; bool_t buffer_empty; uint_t reacnt = 0U; char c = '\0'; /* コンパイラの警告を抑止するために初期化する */ ER ercd, rercd; if (sns_dpn()) { /* コンテキストのチェック */ return(E_CTX); } if (!(1 <= portid && portid <= TNUM_PORT)) { return(E_ID); /* ポート番号のチェック */ } p_spcb = get_spcb(portid); if (!(p_spcb->openflag)) { /* オープン済みかのチェック */ return(E_OBJ); } if (p_spcb->errorflag) { /* エラー状態かのチェック */ return(E_SYS); } buffer_empty = true; /* ループの1回めはwai_semする */ while (reacnt < len) { if (buffer_empty) { SVC(rercd = wai_sem(p_spcb->p_spinib->rcv_semid), gen_ercd_wait(rercd, p_spcb)); } SVC(rercd = serial_rea_chr(p_spcb, &c), rercd); *buf++ = c; reacnt++; buffer_empty = (bool_t) rercd; /* * エコーバック処理. */ if ((p_spcb->ioctl & IOCTL_ECHO) != 0U) { SVC(rercd = wai_sem(p_spcb->p_spinib->snd_semid), gen_ercd_wait(rercd, p_spcb)); SVC(rercd = serial_wri_chr(p_spcb, c), rercd); if (!((bool_t) rercd)) { SVC(sig_sem(p_spcb->p_spinib->snd_semid), gen_ercd_sys(p_spcb)); } } } if (!buffer_empty) { SVC(sig_sem(p_spcb->p_spinib->rcv_semid), gen_ercd_sys(p_spcb)); } ercd = E_OK; error_exit: return(reacnt > 0U ? (ER_UINT) reacnt : ercd); }
/* * シリアルポートからの文字列受信(受け口関数) */ ER_UINT eSerialPort_read(CELLIDX idx, char *buffer, uint_t length) { CELLCB *p_cellcb; bool_t buffer_empty; uint_t reacnt = 0U; char c = '\0'; /* コンパイラの警告を抑止するために初期化する */ ER ercd, rercd; if (sns_dpn()) { /* コンテキストのチェック */ return(E_CTX); } if (!VALID_IDX(idx)) { /* ポート番号のチェック */ return(E_ID); } p_cellcb = GET_CELLCB(idx); if (!VAR_openFlag) { /* オープン済みかのチェック */ return(E_OBJ); } if (VAR_errorFlag) { /* エラー状態かのチェック */ return(E_SYS); } buffer_empty = true; /* ループの1回めはwai_semする */ while (reacnt < length) { if (buffer_empty) { SVC(rercd = cReceiveSemaphore_wait(), gen_ercd_wait(rercd, p_cellcb)); } SVC(rercd = serialPort_readChar(p_cellcb, &c), rercd); *buffer++ = c; reacnt++; buffer_empty = (bool_t) rercd; /* * エコーバック処理. */ if ((VAR_ioControl & IOCTL_ECHO) != 0U) { SVC(rercd = cSendSemaphore_wait(), gen_ercd_wait(rercd, p_cellcb)); SVC(rercd = serialPort_writeChar(p_cellcb, c), rercd); if (!((bool_t) rercd)) { SVC(cSendSemaphore_signal(), gen_ercd_sys(p_cellcb)); } } } if (!buffer_empty) { SVC(cReceiveSemaphore_signal(), gen_ercd_sys(p_cellcb)); } ercd = E_OK; error_exit: return(reacnt > 0U ? (ER_UINT) reacnt : ercd); }
/* * システムログ出力の待ち合わせ */ ER logtask_flush(uint_t count) { T_SYSLOG_RLOG rlog; T_SERIAL_RPOR rpor; ER ercd, rercd; ID my_logtask_portid = get_my_logtask_portid(); if (sns_dpn()) { ercd = E_CTX; } else { for (;;) { if (syslog_ref_log(&rlog) < 0) { ercd = E_SYS; goto error_exit; } if (rlog.count <= count) { if (count == 0U) { /* * countが0の場合には,シリアルバッファが空かを確 * 認する. */ if (serial_ref_por(my_logtask_portid, &rpor) < 0) { ercd = E_SYS; goto error_exit; } if (rpor.wricnt == 0U) { ercd = E_OK; goto error_exit; } } else { ercd = E_OK; goto error_exit; } } /* * LOGTASK_FLUSH_WAITミリ秒待つ. */ rercd = dly_tsk(LOGTASK_FLUSH_WAIT); if (rercd < 0) { ercd = (rercd == E_RLWAI) ? rercd : E_SYS; goto error_exit; } } } error_exit: return(ercd); }
/* * システムログ出力の待ち合わせ(受け口関数) */ ER eLogTask_flush(uint_t count) { T_SYSLOG_RLOG rlog; T_SERIAL_RPOR rpor; ER ercd, rercd; if (sns_dpn()) { ercd = E_CTX; } else { for (;;) { if (cSysLog_refer(&rlog) < 0) { ercd = E_SYS; goto error_exit; } if (rlog.count <= count) { if (count == 0U) { /* * countが0の場合には,シリアルバッファが空かを確 * 認する. */ if (cSerialPort_refer(&rpor) < 0) { ercd = E_SYS; goto error_exit; } if (rpor.wricnt == 0U) { ercd = E_OK; goto error_exit; } } else { ercd = E_OK; goto error_exit; } } /* * フラッシュ待ちの単位時間(ATTR_flushWaitμ秒)待つ. */ rercd = dly_tsk(ATTR_flushWait); if (rercd < 0) { ercd = (rercd == E_RLWAI) ? rercd : E_SYS; goto error_exit; } } } error_exit: return(ercd); }
/* * シリアルポートへの文字列送信(サービスコール) */ ER_UINT serial_wri_dat(ID portid, const char *buf, uint_t len) { SPCB *p_spcb; bool_t buffer_full; uint_t wricnt = 0U; ER ercd, rercd; if (sns_dpn()) { /* コンテキストのチェック */ return(E_CTX); } if (!(1 <= portid && portid <= TNUM_PORT)) { return(E_ID); /* ポート番号のチェック */ } p_spcb = get_spcb(portid); if (!(p_spcb->openflag)) { /* オープン済みかのチェック */ return(E_OBJ); } if (p_spcb->errorflag) { /* エラー状態かのチェック */ return(E_SYS); } buffer_full = true; /* ループの1回めはwai_semする */ while (wricnt < len) { if (buffer_full) { SVC(rercd = wai_sem(p_spcb->p_spinib->snd_semid), gen_ercd_wait(rercd, p_spcb)); } SVC(rercd = serial_wri_chr(p_spcb, *buf++), rercd); wricnt++; buffer_full = (bool_t) rercd; } if (!buffer_full) { SVC(sig_sem(p_spcb->p_spinib->snd_semid), gen_ercd_sys(p_spcb)); } ercd = E_OK; error_exit: return(wricnt > 0U ? (ER_UINT) wricnt : ercd); }
/* * シリアルポートへの文字列送信(受け口関数) */ ER_UINT eSerialPort_write(CELLIDX idx, const char *buffer, uint_t length) { CELLCB *p_cellcb; bool_t buffer_full; uint_t wricnt = 0U; ER ercd, rercd; if (sns_dpn()) { /* コンテキストのチェック */ return(E_CTX); } if (!VALID_IDX(idx)) { /* ポート番号のチェック */ return(E_ID); } p_cellcb = GET_CELLCB(idx); if (!VAR_openFlag) { /* オープン済みかのチェック */ return(E_OBJ); } if (VAR_errorFlag) { /* エラー状態かのチェック */ return(E_SYS); } buffer_full = true; /* ループの1回めはwai_semする */ while (wricnt < length) { if (buffer_full) { SVC(rercd = cSendSemaphore_wait(), gen_ercd_wait(rercd, p_cellcb)); } SVC(rercd = serialPort_writeChar(p_cellcb, *buffer++), rercd); wricnt++; buffer_full = (bool_t) rercd; } if (!buffer_full) { SVC(cSendSemaphore_signal(), gen_ercd_sys(p_cellcb)); } ercd = E_OK; error_exit: return(wricnt > 0U ? (ER_UINT) wricnt : ercd); }
/* * シリアルポートの制御(サービスコール) */ ER serial_ctl_por(ID portid, uint_t ioctl) { SPCB *p_spcb; if (sns_dpn()) { /* コンテキストのチェック */ return(E_CTX); } if (!(1 <= portid && portid <= TNUM_PORT)) { return(E_ID); /* ポート番号のチェック */ } p_spcb = get_spcb(portid); if (!(p_spcb->openflag)) { /* オープン済みかのチェック */ return(E_OBJ); } if (p_spcb->errorflag) { /* エラー状態かのチェック */ return(E_SYS); } p_spcb->ioctl = ioctl; return(E_OK); }
/* * シリアルポートの制御(受け口関数) */ ER eSerialPort_control(CELLIDX idx, uint_t ioctl) { CELLCB *p_cellcb; if (sns_dpn()) { /* コンテキストのチェック */ return(E_CTX); } if (!VALID_IDX(idx)) { return(E_ID); /* ポート番号のチェック */ } p_cellcb = GET_CELLCB(idx); if (!VAR_openFlag) { /* オープン済みかのチェック */ return(E_OBJ); } if (VAR_errorFlag) { /* エラー状態かのチェック */ return(E_SYS); } VAR_ioControl = ioctl; return(E_OK); }
/* * シリアルポート状態の参照(サービスコール) */ ER serial_ref_por(ID portid, T_SERIAL_RPOR *pk_rpor) { SPCB *p_spcb; if (sns_dpn()) { /* コンテキストのチェック */ return(E_CTX); } if (!(1 <= portid && portid <= TNUM_PORT)) { return(E_ID); /* ポート番号のチェック */ } p_spcb = get_spcb(portid); if (!(p_spcb->openflag)) { /* オープン済みかのチェック */ return(E_OBJ); } if (p_spcb->errorflag) { /* エラー状態かのチェック */ return(E_SYS); } pk_rpor->reacnt = p_spcb->rcv_count; pk_rpor->wricnt = p_spcb->snd_count; return(E_OK); }
/* * シリアルポート状態の参照(受け口関数) */ ER eSerialPort_refer(CELLIDX idx, T_SERIAL_RPOR* pk_rpor) { CELLCB *p_cellcb; if (sns_dpn()) { /* コンテキストのチェック */ return(E_CTX); } if (!VALID_IDX(idx)) { return(E_ID); /* ポート番号のチェック */ } p_cellcb = GET_CELLCB(idx); if (!VAR_openFlag) { /* オープン済みかのチェック */ return(E_OBJ); } if (VAR_errorFlag) { /* エラー状態かのチェック */ return(E_SYS); } pk_rpor->reacnt = VAR_receiveCount; pk_rpor->wricnt = VAR_sendCount; return(E_OK); }
/* * シリアルポートのオープン(受け口関数) */ ER eSerialPort_open(CELLIDX idx) { CELLCB *p_cellcb; ER ercd; if (sns_dpn()) { /* コンテキストのチェック */ return(E_CTX); } if (!VALID_IDX(idx)) { return(E_ID); /* ポート番号のチェック */ } p_cellcb = GET_CELLCB(idx); SVC(dis_dsp(), gen_ercd_sys(p_cellcb)); if (VAR_openFlag) { /* オープン済みかのチェック */ ercd = E_OBJ; } else { /* * 変数の初期化 */ VAR_ioControl = (IOCTL_ECHO | IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV); VAR_receiveReadPointer = 0U; VAR_receiveWritePointer = 0U; VAR_receiveCount = 0U; VAR_receiveFlowControl = '\0'; VAR_receiveStopped = false; VAR_sendReadPointer = 0U; VAR_sendWritePointer = 0U; VAR_sendCount = 0U; VAR_sendStopped = false; /* * これ以降,割込みを禁止する. */ if (loc_cpu() < 0) { ercd = E_SYS; goto error_exit_enadsp; } /* * ハードウェア依存のオープン処理 */ cSIOPort_open(); /* * 受信通知コールバックを許可する. */ cSIOPort_enableCBR(SIOReceiveReady); VAR_openFlag = true; VAR_errorFlag = false; if (unl_cpu() < 0) { VAR_errorFlag = true; ercd = E_SYS; goto error_exit_enadsp; } ercd = E_OK; } error_exit_enadsp: SVC(ena_dsp(), gen_ercd_sys(p_cellcb)); error_exit: return(ercd); }
/* * シリアルポートのオープン(サービスコール) */ ER serial_opn_por(ID portid) { SPCB *p_spcb; ER ercd; if (sns_dpn()) { /* コンテキストのチェック */ return(E_CTX); } if (!(1 <= portid && portid <= TNUM_PORT)) { return(E_ID); /* ポート番号のチェック */ } p_spcb = get_spcb(portid); SVC(dis_dsp(), gen_ercd_sys(p_spcb)); if (p_spcb->openflag) { /* オープン済みかのチェック */ ercd = E_OBJ; } else { /* * 変数の初期化 */ p_spcb->ioctl = (IOCTL_ECHO | IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV); p_spcb->rcv_read_ptr = 0U; p_spcb->rcv_write_ptr = 0U; p_spcb->rcv_count = 0U; p_spcb->rcv_fc_chr = '\0'; p_spcb->rcv_stopped = false; p_spcb->snd_read_ptr = 0U; p_spcb->snd_write_ptr = 0U; p_spcb->snd_count = 0U; p_spcb->snd_stopped = false; /* * これ以降,割込みを禁止する. */ if (loc_cpu() < 0) { ercd = E_SYS; goto error_exit_enadsp; } /* * ハードウェア依存のオープン処理 */ p_spcb->p_siopcb = sio_opn_por(portid, (intptr_t) p_spcb); /* * 受信通知コールバックを許可する. */ sio_ena_cbr(p_spcb->p_siopcb, SIO_RDY_RCV); p_spcb->openflag = true; p_spcb->errorflag = false; if (unl_cpu() < 0) { p_spcb->errorflag = true; ercd = E_SYS; goto error_exit_enadsp; } ercd = E_OK; } error_exit_enadsp: SVC(ena_dsp(), gen_ercd_sys(p_spcb)); error_exit: return(ercd); }