/* * シリアルI/Oポートへのポーリングでの出力 */ void scif_pol_putc(char c, ID siopid) { const SIOPINIB *p_siopinib; uint16_t fsrval; SIL_PRE_LOC; p_siopinib = get_siopinib(siopid); while(1) { /* * リエントラントにするため、全割込みロック状態にする。 */ SIL_LOC_INT(); fsrval = sil_reh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCFSR)); if (fsrval & SCFSR_TDFE) { sil_wrb_mem((uint8_t *)p_siopinib->port + REG_SCFTDR, c); sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCFSR), ~(SCFSR_TEND | SCFSR_TDFE)); /* * リターンする前に全割込みロックフラグを元の状態に戻す。 */ SIL_UNL_INT(); return; } else { /* * ここで全割込みロックを解除して、割込みを受け付ける。 */ SIL_UNL_INT(); } } }
static intptr_t uart_snd_chr(intptr_t c) { SIL_PRE_LOC; SIL_LOC_INT(); if(uart_tx_fifo_sem == 0) { SIL_UNL_INT(); return false; } else { uart_tx_fifo_sem--; UART1.RBR_THR = c; SIL_UNL_INT(); return true; } // return (uart_send(&UART1, c)); }
ER ext_ker(void) { SIL_PRE_LOC; LOG_EXT_KER_ENTER(); /* * 割込みロック状態に移行 */ SIL_LOC_INT(); /* * カーネル動作の終了 */ LOG_KER_LEAVE(); kerflg = false; /* * カーネルの終了処理の呼出し * * 非タスクコンテキストに切り換えて,exit_kernelを呼び出す. */ call_exit_kernel(); /* * コンパイラの警告対策(ここへ来ることはないはず) */ SIL_UNL_INT(); LOG_EXT_KER_LEAVE(E_SYS); return(E_SYS); }
/* * トレースログの読出し */ ER trace_rea_log(TRACE *p_trace) { ER_UINT ercd; SIL_PRE_LOC; SIL_LOC_INT(); /* * トレースログバッファからの取出し */ if (trace_count > 0U) { *p_trace = trace_buffer[trace_head]; trace_count--; trace_head++; if (trace_head >= TCNT_TRACE_BUFFER) { trace_head = 0U; } ercd = E_OK; } else { ercd = E_OBJ; } SIL_UNL_INT(); return(ercd); }
void uart_sio_isr(/*ID siopid*/intptr_t unused) { if(uart_rcv_cbflg) while(uart_getready(&UART1)) { //uart_rx = buf[i]; /* * 受信通知コールバックルーチンを呼び出す. */ sio_irdy_rcv(uart_siopcb->exinf); } uint32_t lsr = UART1.LSR; if(uart_snd_cbflg && (lsr & UART_LSR_THRE) /*uart_putready(p_uart)*/) { // uart_tx_fifo_sem = 16; // /* // * 送信可能コールバックルーチンを呼び出す. // */ // sio_irdy_snd(p_siopcb->exinf); SIL_PRE_LOC; SIL_LOC_INT(); uart_tx_fifo_sem = 16; SIL_UNL_INT(); //for(int i = 0; i < 16 && uart_snd_cbflg; ++i) sio_irdy_snd(uart_siopcb->exinf); } }
/* * カーネルの終了 */ ER ext_ker(void) { SIL_PRE_LOC; LOG_EXT_KER_ENTER(); /* * 割込みロック状態に移行 */ SIL_LOC_INT(); /* * カーネル動作の終了 */ LOG_KER_LEAVE(); kerflg = false; /* * カーネルの終了処理の呼出し * * 非タスクコンテキストに切り換えて,exit_kernelを呼び出す. */ call_exit_kernel(); /* * SIL_UNL_INTを呼び出すが,ここに到達することはない. * 記述するのはSIL_PRE_LOCで宣言される変数がある場合に, * コンパイラが出力する警告を抑制するためである. */ SIL_UNL_INT(); LOG_EXT_KER_LEAVE(E_SYS) return E_SYS; }
void task1(intptr_t exinf) { ER ercd; SIL_PRE_LOC; check_point(1); check_state(false, false, TIPM_ENAALL, false, false, true); ercd = dis_dsp(); check_ercd(ercd, E_OK); ercd = ena_tex(); check_ercd(ercd, E_OK); check_point(2); check_state(false, false, TIPM_ENAALL, true, true, false); SIL_LOC_INT(); RAISE_CPU_EXCEPTION; check_point(5); SIL_UNL_INT(); check_point(6); check_state(false, false, TIPM_ENAALL, true, true, false); check_finish(7); }
/* * ログバッファからの読出し * * CPUロック状態や実行コンテキストによらず動作できるように実装してある. */ ER_UINT syslog_rea_log(SYSLOG *p_syslog) { ER_UINT ercd; SIL_PRE_LOC; LOG_SYSLOG_REA_LOG_ENTER(p_syslog); SIL_LOC_INT(); /* * ログバッファからの取出し */ if (syslog_count > 0U) { *p_syslog = syslog_buffer[syslog_head]; syslog_count--; syslog_head++; if (syslog_head >= TCNT_SYSLOG_BUFFER) { syslog_head = 0U; } ercd = (ER_UINT) syslog_lost; syslog_lost = 0U; } else { ercd = E_OBJ; } SIL_UNL_INT(); LOG_SYSLOG_REA_LOG_LEAVE(ercd, p_syslog); return(ercd); }
/* * NIC ハードウェア割り込み禁止 * TINET使用時必要 */ void ed_dis_inter(void) { SIL_PRE_LOC; SIL_LOC_INT(); define_int_plevel(ED_IPR, ED_LEVEL0, ED_IPR_SHIFT);// 優先度=0 SIL_UNL_INT(); }
void ed_ena_inter(void) { SIL_PRE_LOC; SIL_LOC_INT(); define_int_plevel(ED_IPR, ED_PRI, ED_IPR_SHIFT);// 優先度=ED_PRI SIL_UNL_INT(); }
void EDMA30SetComplIsr(uint_t tcc, ISR isr, intptr_t exinf) { assert(0 <= tcc && tcc < EDMA3_NUM_TCC); SIL_PRE_LOC; SIL_LOC_INT(); edma_isrs[tcc] = isr; edma_isr_exinfs[tcc] = exinf; SIL_UNL_INT(); }
static intptr_t bt_snd_chr(intptr_t c) { bool_t retval = false; SIL_PRE_LOC; SIL_LOC_INT(); if(bt_send_buffer_bytes[bt_send_buffer_idx] < BT_SND_BUF_SIZE) { bt_send_buffer[bt_send_buffer_idx][bt_send_buffer_bytes[bt_send_buffer_idx]++] = c; retval = true; } SIL_UNL_INT(); return retval; }
void check_point(uint_t count) { bool_t errorflag = false; ER rercd; ID prcid; SIL_PRE_LOC; /* * 割込みロック状態に */ SIL_LOC_INT(); /* * PRCID取得 */ sil_get_pid(&prcid); /* * シーケンスチェック */ if (++check_count[prcid-1] == count) { syslog_2(LOG_NOTICE, "PE %d : Check point %d passed.", prcid, count); } else { syslog_2(LOG_ERROR, "## PE %d : Unexpected check point %d.", prcid, count); errorflag = true; } /* * カーネルの内部状態の検査 */ if (check_bit_func != NULL) { rercd = (*check_bit_func)(); if (rercd < 0) { syslog_2(LOG_ERROR, "## Internal inconsistency detected (%s, %d).", itron_strerror(rercd), SERCD(rercd)); errorflag = true; } } /* * エラーが検出された場合は,テストプログラムを終了する. */ if (errorflag) { test_finish(); } /* * 割込みロック状態を解除 */ SIL_UNL_INT(); }
HRTCNT fch_hrt(void) { HRTCNT hrtcnt; SIL_PRE_LOC; LOG_FCH_HRT_ENTER(); SIL_LOC_INT(); hrtcnt = target_hrt_get_current(); /*[NGKI3571]*/ SIL_UNL_INT(); LOG_FCH_HRT_LEAVE(hrtcnt); return(hrtcnt); }
void alarm1_handler(intptr_t exinf) { SIL_PRE_LOC; check_point(3); check_state_i(true, false, true, true, false); SIL_LOC_INT(); RAISE_CPU_EXCEPTION; check_point(6); SIL_UNL_INT(); check_point(7); check_state_i(true, false, true, true, false); alm1_flag = true; }
/* * ログバッファの状態参照 */ ER syslog_ref_log(T_SYSLOG_RLOG *pk_rlog) { SIL_PRE_LOC; LOG_SYSLOG_REF_LOG_ENTER(pk_rlog); SIL_LOC_INT(); pk_rlog->count = syslog_count; pk_rlog->lost = syslog_lost; pk_rlog->logmask = syslog_logmask; pk_rlog->lowmask = ~syslog_lowmask_not; SIL_UNL_INT(); LOG_SYSLOG_REF_LOG_LEAVE(pk_rlog); return(E_OK); }
/* * バリア同期 */ void barrier_sync(uint_t phase) { volatile uint_t i, j; volatile uint_t flag; ID prcid; SIL_PRE_LOC; /* * 割込みロック状態に */ SIL_LOC_INT(); /* * PRCID取得 * どのような状態でも取得できるように sil_get_pid() を使用する. */ sil_get_pid(&prcid); local_phase[prcid - 1] = phase; if (prcid == TOPPERS_MASTER_PRCID) { do{ flag = 0; for (i = 0; i < TNUM_PRCID; i++){ if (local_phase[i] == phase){ flag++; } } for (j = 0; j < 100; j++); }while (flag < TNUM_PRCID); global_phase = phase; } else { while (global_phase != phase) { for (j = 0; j < 100; j++); } } /* * 割込みロック状態を解除 */ SIL_UNL_INT(); }
/* * ログ情報の出力 * * CPUロック状態や実行コンテキストによらず動作できるように実装してある. */ ER syslog_wri_log(uint_t prio, const SYSLOG *p_syslog) { SIL_PRE_LOC; LOG_SYSLOG_WRI_LOG_ENTER(prio, p_syslog); SIL_LOC_INT(); /* * ログ時刻の設定 */ ((SYSLOG *) p_syslog)->logtim = _kernel_current_time; /* * ログバッファに記録 */ if ((syslog_logmask & LOG_MASK(prio)) != 0U) { syslog_buffer[syslog_tail] = *p_syslog; syslog_tail++; if (syslog_tail >= TCNT_SYSLOG_BUFFER) { syslog_tail = 0U; } if (syslog_count < TCNT_SYSLOG_BUFFER) { syslog_count++; } else { syslog_head = syslog_tail; syslog_lost++; } } /* * 低レベル出力 */ if (((~syslog_lowmask_not) & LOG_MASK(prio)) != 0U) { syslog_print(p_syslog, target_fput_log); target_fput_log('\n'); } SIL_UNL_INT(); LOG_SYSLOG_WRI_LOG_LEAVE(E_OK); return(E_OK); }
bool_t sns_ker(void) { bool_t state; SIL_PRE_LOC; LOG_SNS_KER_ENTER(); /* * PCBへアクセスするため割込みを禁止する * sns_ker()は全割込みロック状態で呼び出される場合が * あるため,SILを用いる. */ SIL_LOC_INT(); state = (get_my_p_pcb())->kerflg ? false : true; SIL_UNL_INT(); LOG_SNS_KER_LEAVE(state); return(state); }
/* * トレースログの書込み */ ER trace_wri_log(TRACE *p_trace) { SIL_PRE_LOC; if (trace_mode != TRACE_STOP) { SIL_LOC_INT(); /* * トレース時刻の設定 * * LOG_WRI_LOG_ENTERから呼ばれた場合にp_trace->logtimを書き換 * えてしまうのは気持ちが悪いが,wri_logの方で上書きするため問 * 題はない. */ p_trace->logtim = TRACE_GET_TIM(); /* * トレースバッファに記録 */ trace_buffer[trace_tail] = *p_trace; trace_tail++; if (trace_tail >= TCNT_TRACE_BUFFER) { trace_tail = 0U; } if (trace_count < TCNT_TRACE_BUFFER) { trace_count++; if (trace_count >= TCNT_TRACE_BUFFER && (trace_mode & TRACE_AUTOSTOP) != 0U) { trace_mode = TRACE_STOP; } } else { trace_head = trace_tail; } SIL_UNL_INT(); } return(E_OK); }
ER get_utm(SYSUTM *p_sysutm) { SYSUTM utime; SYSTIM time; #if TIC_DENO != 1 uint_t subtime; #endif /* TIC_DENO != 1 */ CLOCK clock1, clock2; bool_t ireq; SIL_PRE_LOC; LOG_GET_UTM_ENTER(p_sysutm); SIL_LOC_INT(); time = next_time; #if TIC_DENO != 1 subtime = next_subtime; #endif /* TIC_DENO != 1 */ clock1 = target_timer_get_current(); ireq = target_timer_probe_int(); clock2 = target_timer_get_current(); SIL_UNL_INT(); utime = ((SYSUTM) time) * 1000U; #if TIC_DENO != 1 utime += subtime * 1000U / TIC_DENO; #endif /* TIC_DENO != 1 */ if (!ireq || clock1 > clock2) { utime -= TIC_NUME * 1000U / TIC_DENO; } utime += TO_USEC(clock1); *p_sysutm = utime; LOG_GET_UTM_LEAVE(E_OK, *p_sysutm); return(E_OK); }
/* * write trace log */ ER trace_wri_log(TRACE *p_trace) { SIL_PRE_LOC; if (trace_mode != TRACE_STOP) { SIL_LOC_INT(); /* * record log time */ p_trace->logtim = TRACE_GET_TIM(); /* * write into the buffer */ trace_buffer[trace_tail] = *p_trace; trace_tail++; if (trace_tail >= TCNT_TRACE_BUFFER) { trace_tail = 0U; } if (trace_count < TCNT_TRACE_BUFFER) { trace_count++; if (trace_count >= TCNT_TRACE_BUFFER && (trace_mode & TRACE_AUTOSTOP) != 0U) { trace_mode = TRACE_STOP; } } else { trace_head = trace_tail; } SIL_UNL_INT(); } return(E_OK); }