/* * シリアルI/Oポートへの非同期文字出力 */ void sio_asnd_chr( INT c ) { SIOPCB* siopcb ; UH uhBase ; int i ; /* * CPUロック状態にする */ BOOL bLocked ; if ( sns_loc() ) bLocked = TRUE ; else { bLocked = FALSE ; if ( sns_ctx() ) iloc_cpu() ; else loc_cpu() ; } /* * 非同期用ポートを開く */ if ( ( siopcb = sio_opn_por( LOGTASK_PORTID, siopcb_table[LOGTASK_PORTID-1].vpiExinf ) ) != NULL ) { uhBase = siopcb->uhBase ; /* * LFならまずCRを送出 */ if ( c == '\n' ) { for ( i = 0 ; i < TXREADY_TIMEOUT ; i++ ) { if ( __SFR(uhBase) & __UxCR_TXEMPTY ) break ; } if ( i < TXREADY_TIMEOUT ) { __SFRW(uhBase+4) = __UxTX_STOPBIT | '\r' ; } } /* * データ送出 */ for ( i = 0 ; i < TXREADY_TIMEOUT ; i++ ) { if ( __SFR(uhBase) & __UxCR_TXEMPTY ) break ; } if ( i < TXREADY_TIMEOUT ) { __SFRW(uhBase+4) = __UxTX_STOPBIT | c ; } } /* * CPUロックを元に戻す */ if ( !bLocked ) { if ( sns_ctx() ) iunl_cpu() ; else unl_cpu() ; } }
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(); } }
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 */ }
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)); }
/* * シリアルポートのクローズ */ ER serial_cls_por(ID portid) { SPCB *spcb; ER ercd; if (sns_ctx()) { /* コンテキストのチェック */ return(E_CTX); } if (!(1 <= portid && portid <= TNUM_PORT)) { return(E_ID); /* ポート番号のチェック */ } spcb = get_spcb(portid); _syscall(loc_cpu()); if (!(spcb->openflag)) { /* オープン済みかのチェック */ ercd = E_OBJ; } else { /* * ハードウェア依存のクローズ処理 */ sio_cls_por(spcb->siopcb); spcb->openflag = FALSE; ercd = E_OK; } _syscall(unl_cpu()); return(ercd); }
/* * シリアルポートのオープン */ ER serial_opn_por(ID portid) { SPCB *spcb; ER ercd; if (sns_ctx()) { /* コンテキストのチェック */ return(E_CTX); } if (!(1 <= portid && portid <= TNUM_PORT)) { return(E_ID); /* ポート番号のチェック */ } spcb = get_spcb(portid); _syscall(loc_cpu()); if (spcb->openflag) { /* オープン済みかのチェック */ ercd = E_OBJ; } else { /* * 変数の初期化 */ spcb->ioctl = (IOCTL_ECHO | IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV); spcb->rcv_read_ptr = spcb->rcv_write_ptr = 0; spcb->rcv_count = 0; spcb->rcv_fc_chr = '\0'; spcb->rcv_stopped = FALSE; spcb->snd_read_ptr = spcb->snd_write_ptr = 0; spcb->snd_count = 0; spcb->snd_stopped = FALSE; /* * ハードウェア依存のオープン処理 */ spcb->siopcb = sio_opn_por(portid, (VP_INT) spcb); /* * 受信通知コールバックを許可する. */ sio_ena_cbr(spcb->siopcb, SIO_ERDY_RCV); spcb->openflag = TRUE; ercd = E_OK; } _syscall(unl_cpu()); return(ercd); }
/*---------------------------------------------------------------------------* * Routine: sys_sem_signal *---------------------------------------------------------------------------* * Description: * Signals (releases) a semaphore * Inputs: * sys_sem_t sem -- Semaphore to signal *---------------------------------------------------------------------------*/ void sys_sem_signal(sys_sem_t *data) { ER ercd; if (sns_ctx()) { ercd = isig_sem(data->id); } else { ercd = sig_sem(data->id); } // if (osSemaphoreRelease(data->id) != osOK) if (ercd != E_OK) { // syslog(LOG_NOTICE, "Error with ercd=%d in sys_sem_signal.", ercd); // mbed_die(); /* Can be called by ISR do not use printf */ return; } // syslog(LOG_NOTICE, " Semaphore (ID=%d) was released.", data->id); }
/* * シリアルI/Oポートからの非同期文字入力 */ INT sio_arcv_chr( void ) { SIOPCB* siopcb ; UH uhBase ; INT c = -1 ; /* * タスクコンテキストからのみ使用可 */ if ( sns_ctx() || sns_loc() || sns_dsp() ) return -1 ; /* * CPUロック状態にする */ loc_cpu() ; /* * 非同期用ポートを開く */ if ( ( siopcb = sio_opn_por( LOGTASK_PORTID, siopcb_table[LOGTASK_PORTID-1].vpiExinf ) ) != NULL ) { uhBase = siopcb->uhBase ; /* * 受信待ち */ while(1) { if ( __SFR(uhBase) & __UxCR_RXREADY ) { c = __SFRW(uhBase+2) & 0xff ; if ( c == '\r' ) { c = '\n' ; siopcb->bLastIsCr = TRUE ; } else { if ( c == '\n' && siopcb->bLastIsCr ) c = -1 ; siopcb->bLastIsCr = FALSE ; } } if ( c != -1 ) break ; unl_cpu() ; dly_tsk( 50 ) ; loc_cpu() ; } } /* * CPUロックを解除 */ unl_cpu() ; return c ; }
/* * シリアルポートの制御 */ ER serial_ctl_por(ID portid, UINT ioctl) { SPCB *spcb; if (sns_ctx()) { /* コンテキストのチェック */ return(E_CTX); } if (!(1 <= portid && portid <= TNUM_PORT)) { return(E_ID); /* ポート番号のチェック */ } spcb = get_spcb(portid); if (!(spcb->openflag)) { /* オープン済みかのチェック */ return(E_OBJ); } spcb->ioctl = ioctl; return(E_OK); }
/* * シリアルポート状態の参照 */ ER serial_ref_por(ID portid, T_SERIAL_RPOR *pk_rpor) { SPCB *spcb; if (sns_ctx()) { /* コンテキストのチェック */ return(E_CTX); } if (!(1 <= portid && portid <= TNUM_PORT)) { return(E_ID); /* ポート番号のチェック */ } spcb = get_spcb(portid); if (!(spcb->openflag)) { /* オープン済みかのチェック */ return(E_OBJ); } pk_rpor->reacnt = spcb->rcv_count; pk_rpor->wricnt = spcb->snd_count; return(E_OK); }
static void up(struct semaphore *sem) { ER ercd = (sns_loc() || sns_ctx()) ? lsig_sem(sem->id) : sig_sem(sem->id); assert(ercd == E_OK); }