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);
    }

}
Esempio n. 2
0
/*
 *  ログバッファからの読出し
 *
 *  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);
}
Esempio n. 3
0
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
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;
}
Esempio n. 5
0
/*
 *  トレースログの読出し
 */
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);
}
Esempio n. 6
0
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);
}
Esempio n. 7
0
/*
 *  シリアル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();
		}
	}
}
Esempio n. 8
0
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();
}
Esempio n. 9
0
/*
 *  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();
}
Esempio n. 10
0
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();
}
/*
 *	テストプログラムの終了
 */
void
test_finish(void)
{
	SIL_PRE_LOC;

	SIL_LOC_INT();
	syslog_flush();
	ext_ker();
}
Esempio n. 12
0
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;
}
Esempio n. 13
0
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();
}
Esempio n. 14
0
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));
}
Esempio n. 15
0
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);
}
Esempio n. 16
0
/*
 *  ログバッファの状態参照
 */
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);
}
Esempio n. 17
0
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;
}
Esempio n. 18
0
/*
 *  バリア同期
 */
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();
}
Esempio n. 19
0
/* 
 *  ログ情報の出力
 *
 *  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);
}
Esempio n. 20
0
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);
}
Esempio n. 21
0
/* 
 *  トレースログの書込み
 */
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);
}
Esempio n. 22
0
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);
}
Esempio n. 23
0
/* 
 *  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);
}