⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 azrtos.c

📁 this is RealTimeOS(uITRON) for hitachi H8 processor.
💻 C
📖 第 1 页 / 共 3 页
字号:
		tcb->m_wupcnt = 0;
	}

	az_ei();
	return ercd;
}

ER isig_sem(ID semid)
{
	/* 妱傝崬傒僴儞僪儔偐傜僙儅僼僅帒尮傪曉媝偡傞僔僗僥儉僐乕儖 */
	ER ercd;
	AzSemaphore* sem = semid;
	if (!sem)
	{
		/* 晄惓僙儅僼僅ID */
		return E_ID;
	}

	ercd = E_OK;
	az_pushflag();
	az_di();

	if (&sem->m_queue == sem->m_queue.m_next)
	{
		/* 偙偺僙儅僼僅偺帒尮妉摼傪懸偭偰偄傞僞僗僋偼側偄偺偱丄僉儏乕僀儞僌偡傞 */
		if (++sem->m_count < 0)
		{
			--sem->m_count;
			ercd = E_QOVR;
		}
	}
	else /* 懸偭偰偄傞僞僗僋偑偁偭偨 */
	{
		/* 僞僗僋傪僙儅僼僅僉儏乕偐傜奜偟丄READY 忬懺偵偡傞 */
		AzTCB* tcb = MAINLINK_TO_TCB(sem->m_queue.m_next);
		az_unlink_node(&tcb->m_mainlink);
		az_unlink_timeout(tcb);
		az_insert_ready(tcb);
	}

	az_popflag();
	return ercd;
}

ER az_twai_sem(AzSemaphore* sem, TMO tmout)
{
	/* 僙儅僼僅帒尮傪妉摼偡傞僔僗僥儉僐乕儖 */
	ER ercd;
	if (!sem)
		return E_ID;

	az_di();
	if (is_dispatch_disabled())
	{
		/* 僨傿僗僷僢僠嬛巭拞丄懸偪忬懺偵側傞壜擻惈偺偁傞僔僗僥儉僐乕儖偼幐攕偡傞 */
		ercd = E_CTX;
	}
	else if (sem->m_count > 0)
	{
		/* 僙儅僼僅帒尮偑僉儏乕僀儞僌偝傟偰偄偨 */
		sem->m_count--;
		ercd = E_OK;
	}
	else if (tmout == 0)
	{
		/* 億乕儕儞僌側偺偱丄懸偨偢偵儕僞乕儞偡傞 */
		ercd = E_TMOUT;
	}
	else /* 僙儅僼僅懸偪敪惗 */
	{
		/* 僞僀儉傾僂僩偑巜掕偝傟偰偄傟偽丄僞僀儅乕僉儏乕傊擖傟傞 */
		AzTCB* tcb = az_curtcb;
		ASSERT(tcb && tcb->m_state == TTS_RUN);
		if (tmout > 0)
			az_link_timeout(tcb, tmout);

		/* 偙偺僞僗僋偺 TCB 傪 READY 僉儏乕偐傜僙儅僼僅偺僉儏乕傊堏偡 */
		az_delete_ready(tcb);
		az_insert_before(&sem->m_queue, &tcb->m_mainlink);
		tcb->m_state = TTS_WAI;
		tcb->m_waitfor = TTW_SEM;

		/* 僇儗儞僩僞僗僋偑懸偪忬懺偲側偭偨偺偱丄僨傿僗僷僢僠偑昁梫 */
		az_schedule_dispatch();
		ercd = E_OK;
	}
	az_ei();
	return E_OK;
}

ER iref_sem(T_RSEM* pk_rsem, ID semid)
{
	/* 僙儅僼僅偺忬懺傪庢摼偡傞僔僗僥儉僐乕儖 */
	AzSemaphore* sem = semid;
	if (!sem)
		return E_ID;
	if (!pk_rsem)
		return E_PAR;

	az_pushflag();
	az_di();

	if (&sem->m_queue == sem->m_queue.m_next)
		pk_rsem->wtsk = FALSE;
	else
		pk_rsem->wtsk = (BOOL_ID) MAINLINK_TO_TCB(sem->m_queue.m_next);
	pk_rsem->semcnt = sem->m_count;

	az_popflag();
	return E_OK;
}

ER iset_tim(SYSTIME* pk_tim)
{
	/* 僔僗僥儉帪娫傪愝掕偡傞僔僗僥儉僐乕儖 */
	if (!pk_tim)
		return E_PAR;

	az_pushflag();
	az_di();
	az_systime = *pk_tim;
	az_popflag();
	return E_OK;
}

ER iget_tim(SYSTIME* pk_tim)
{
	/* 僔僗僥儉帪娫傪庢摼偡傞僔僗僥儉僐乕儖 */
	if (!pk_tim)
		return E_PAR;

	az_pushflag();
	az_di();
	*pk_tim = az_systime;
	az_popflag();
	return E_OK;
}

ER az_dly_tsk(DLYTIME dlytim)
{
	/* 巜掕帪娫帺僞僗僋偺幚峴傪抶墑偝偣傞僔僗僥儉僐乕儖 */
	ER ercd;
	if (dlytim < 0)
		return E_PAR;

	az_di();
	if (is_dispatch_disabled())
	{
		/* 僨傿僗僷僢僠嬛巭拞偼懸偪忬懺偵側傟側偄 */
		ercd = E_CTX;
	}
	else if (dlytim == 0)
	{
		/* dlytim == 0 偼丄壗傕偟側偄 */
		ercd = E_OK;
	}
	else /* dlytim > 0 */
	{
		/* 僇儗儞僩僞僗僋傪 READY 僉儏乕偐傜奜偟丄僞僀儅乕僉儏乕傊搊榐偡傞 */
		AzTCB* tcb = az_curtcb;
		ASSERT(tcb && tcb->m_state == TTS_RUN);

		az_delete_ready(tcb);
		az_link_timeout(tcb, dlytim);
		tcb->m_state = TTS_WAI;
		tcb->m_waitfor = TTW_DLY;

		/* 僇儗儞僩僞僗僋偑僨傿儗僀忬懺偵側偭偨偺偱丄僨傿僗僷僢僠偑昁梫 */
		az_schedule_dispatch();
		ercd = E_OK;
	}
	az_ei();
	return ercd;
}


/****************************************************************************
 * AzkiRTOS - 僞僀儉傾僂僩僉儏乕偺娗棟
 ****************************************************************************/

#if AZ_TIMERINTERVAL > 0

void az_link_timeout(AzTCB* tcb, TMO tmout)
{
	/* tcb 傪僞僀儉傾僂僩僉儏乕傊擖傟傞 */
	/* 偙偺娭悢偼 OS 撪晹偺僨乕僞峔憿傪曄峏偡傞偺偱丄妱傝崬傒嬛巭忬懺偱偺傒屇傋傞 */
	AzLink* node = az_timer.m_next;
	while (node != &az_timer)
	{
		/* node 傛傝傕愭偵僞僀儉傾僂僩偡傞側傜丄node 偺帪娫傪嵎偟堷偄偰丄
		   偦偺慜偵憓擖偡傞 */
		if (TIMELINK_TO_TCB(node)->m_timeout > tmout)
		{
			TIMELINK_TO_TCB(node)->m_timeout -= tmout;
			break;
		}

		/* 摨偠偐傕偭偲屻側偺偱丄偙偺僞僀儉傾僂僩帪娫傪嵎偟堷偄偰師偺僲乕僪傊恑傓 */
		tmout -= TIMELINK_TO_TCB(node)->m_timeout;
		node = node->m_next;
	}

	/* 憓擖応強偑尒偮偐偭偨偺偱丄憓擖偟丄TCB 偵懸偪帪娫傪愝掕偡傞 */
	az_insert_before(node, &tcb->m_timelink);
	tcb->m_timeout = tmout;
	ASSERT(tmout > 0);
}

void az_unlink_timeout(AzTCB* tcb)
{
	/* 僞僀儉傾僂僩僉儏乕傊擖偭偰偄側偗傟偽丄壗傕偟側偄 */
	AzLink* next = tcb->m_timelink.m_next;
	if (!next)
		return;

	/* 僞僀儉傾僂僩僉儏乕偐傜奜偡 */
	az_unlink_node(&tcb->m_timelink);

	/* 僉儏乕偺嵟屻偱側偗傟偽丄師偺僞僀儉傾僂僩懸偪僞僗僋傊帪娫傪壛嶼偡傞 */
	if (next != &az_timer)
		TIMELINK_TO_TCB(next)->m_timeout += tcb->m_timeout;
}


/****************************************************************************
 * AzkiRTOS - 僔僗僥儉僞僀儅乕妱傝崬傒僴儞僪儔
 ****************************************************************************/

void az_timer_handler(void);
#pragma INTHANDLER az_timer_handler

/* NC30 偑妱傝崬傒僴儞僪儔偺擖傝岥偵帺摦憓擖偡傞儅僋儘
   __MR_IntEntry 傪掕媊偟偰偍偐側偄偲丄僐儞僷僀儖偱偒側偄丅*/
_asm("__MR_IntEntry .MACRO\n .ENDM");

void az_timer_handler(void)
{
	/* 僞僀儅乕偺妱傝崬傒僴儞僪儔偐傜屇傃弌偝傟丄僞僀儉傾僂僩僉儏乕偺柺搢傪傒傞 */
	/* pushm r0, r1, r2, r3, a0, a1, fb 傑偨偼丄摨摍偺僐乕僪 */
	/* __MR_IntEntry */
	/* 妱傝崬傒敪惗捈屻側偺偱丄偙偺帪揰偱偼妱崬傒嬛巭忬懺偱偁傞 */

	AzLink* node;
	/* TRACE("A0 Handler"); */

#pragma ASM
	/* 僔僗僥儉帪娫(48-bit)傪msec扨埵偱恑傔傞 */
	add.w	#AZ_TIMERINTERVAL, _az_systime
	adcf.w	_az_systime + 2
	adcf.w	_az_systime + 4
#pragma ENDASM

	/* NOTE:
	 *	僞僀儉傾僂僩偺張棟偼丄嵟埆暋悢偺僞僗僋傪堦搙偵READY忬懺傊堏峴偝偣傞偙偲
	 *	偑偁傝摼傞丅偦偺偨傔嵟挿妱傝崬傒嬛巭帪娫偺曐徹偑擄偟偔側偭偰偟傑偆丅
	 *	塣埆偔10屄偺僞僗僋偑堦搙偵僞僀儉傾僂僩偟偨傜丄壓偺儖乕僾傪10夞孞傝曉偡
	 *	偙偲偵側偭偰偟傑偆偐傜偱偁傞丅
	 *
	 *	偙傟傪旔偗傞偵偼丄慡儕儞僋偺忬懺偑柕弬偟偰偄側偄帪揰偱堦搙妱傝崬傒傪
	 *	嫋壜偡傞傛偆曄峏偡傞丅偍偦傜偔僞僗僋傪1偮僞僀儉傾僂僩偝偣偰丄儕儞僋偺
	 *	偮側偓曄偊偑姰椆偟偨帪揰偑揔摉偱偼側偄偐偲巚偆丅慡懱偺張棟検偼憹偊傞偑
	 *	妱傝崬傒嬛巭帪娫偺忋尷偼尒愊傕傝傗偡偔側傞丅
	 */
	node = az_timer.m_next;
	if (node != &az_timer)
	{
		AzTCB* tcb = TIMELINK_TO_TCB(node);
		ASSERT(tcb->m_state == TTS_WAI);
		ASSERT(tcb->m_timeout > 0);
		tcb->m_timeout--;

		while (tcb->m_timeout <= 0)
		{
			/* 僞僀儉傾僂僩偟偨傜TCB傪僞僀儉傾僂僩僉儏乕偐傜奜偡 */
			/* TRACE("TIMEOUT"); */
			az_unlink_node(node);

			/* 懸偪忬懺偑僞僀儉傾僂僩偱廔傢偭偨偙偲傪帵偡儕僞乕儞抣傪愝掕偡傞丅
			 * 偨偩偟 dly_tsk() 偼丄僞僀儉傾僂僩偑惓忢廔椆側偺偱丄E_OK 偺傑傑
			 * 偱傛偄丅
			 */
			if (tcb->m_waitfor != TTW_DLY)
			{
				az_store_result(tcb, E_TMOUT);

				/* dly_tsk() 偱側偗傟偽丄壗偐偺懸偪僉儏乕(椺偊偽僙儅僼僅)偵
				 * 擖偭偰偄傞壜擻惈偑偁傞偺偱丄儊僀儞儕儞僋偑壗偐偵儕儞僋偟
				 * 偰偄傟偽奜偡(slp_tsk 側偳偱偼丄偳偺僉儏乕傊傕儕儞僋偝傟偰
				 * 偄側偄)
				 */
				if (tcb->m_mainlink.m_next)
					az_unlink_node(&tcb->m_mainlink);
			}

			/* READY僉儏乕傊憓擖偡傞 */
			az_insert_ready(tcb);

			/* m_timeout == 0 偺僞僗僋偑懕偄偰偄傞偐傕偟傟側偄偺偱師傕挷傋傞 */
			node = az_timer.m_next;
			if (node == &az_timer)
				break;

			tcb = TIMELINK_TO_TCB(node);
			ASSERT(tcb->m_state == TTS_WAI);
		}
	}

	/* 摿偵偙偙偱妱傝崬傒嫋壜傪偡傞昁梫偼側偄偑丄偙偙傑偱偺僞僀儉傾僂僩張棟偼
	 * 嵟埆偐側傝挿偔側傝摼傞偺偱丄彮偟偱傕妱傝崬傒嬛巭帪娫傪抁偔偡傞偨傔偵丄
	 * 僨傿僗僷僢僠傊撍擖偡傞慜偺堦弖丄妱傝崬傒傪嫋壜偟偰偄傞丅*/
	az_ei();

	/* NOTE: 儔僂儞僪儘價儞僗働僕儏乕儕儞僌傪峴偄偨偄応崌偼丄
	   偙偙偱 irot_rdq(TPRI_RUN) 傪屇傇 */
	//irot_rdq(TPRI_RUN);

	/* 埲壓偼 #pragma INTHANDLER 偵傛傝惗惉偝傟偨僴儞僪儔偺弌岥僐乕僪 */
	/* popm  r0, r1, r2, r3, a0, a1, fb */
	/* int #34 ---> 昁梫側傜嵟屻偵抶墑偝傟偰偄偨僨傿僗僷僢僠傪幚峴偡傞 */
}

#endif /* AZ_TIMERINTERVAL */


/****************************************************************************
 * AzukiRTOS - TCB傪READY僉儏乕傊憓擖
 ****************************************************************************/

void az_insert_ready(AzTCB* tcb)
{
	/* 桪愭弴埵偺斖埻傪妋擣 */
	ASSERT(tcb && tcb->m_priority < arraysizeof(az_ready));

	/* 僞僗僋傪READY忬懺偵曄偊偰丄READY僉儏乕傊憓擖偡傞 */
	tcb->m_state = TTS_RDY;
	tcb->m_waitfor = 0;
	az_insert_before(&az_ready[tcb->m_priority], &tcb->m_mainlink);

	/* 僇儗儞僩僞僗僋傛傝傕桪愭弴埵偑崅偗傟偽丄僨傿僗僷僢僠傪僗働僕儏乕儖偡傞 */
	if (!az_curtcb || tcb->m_priority < az_curtcb->m_priority)
		az_schedule_dispatch();
}


/****************************************************************************
 * AzkiRTOS - 憃曽岦儕儞僋儕僗僩憖嶌
 ****************************************************************************/

void az_insert_after(AzLink* list, AzLink* node)
{
	/* node 傪 list 偺屻傊儕儞僋偡傞 */
	node->m_next = list->m_next;
	node->m_prev = list;
	list->m_next->m_prev = node;
	list->m_next = node;
}

void az_insert_before(AzLink* list, AzLink* node)
{
	/* node 傪 list 偺慜偵儕儞僋偡傞 */
	node->m_prev = list->m_prev;
	node->m_next = list;
	list->m_prev->m_next = node;
	list->m_prev = node;
}

void az_unlink_node(AzLink* node)
{
	/* node 傪儕儞僋偐傜奜偡 */
	node->m_next->m_prev = node->m_prev;
	node->m_prev->m_next = node->m_next;
	node->m_next = node->m_prev = NULL;
}


/****************************************************************************
 * AzkiRTOS - Debugging support macros and functions
 ****************************************************************************
 * NOTE:
 *	偙偙偐傜壓偼丄AzkiRTOS 傪僔儈儏儗乕僞偱僨僶僢僌偡傞偨傔偩偗偵昁梫側娭悢
 *	偱偡丅幚婡偱摦偐偡帪偼丄婡擻偟側偄傛偆偵偟偰偔偩偝偄丅
 *
 *	僔儈儏儗乕僞偱僨僶僢僌拞丄ASSERT 傗 VERIFY 拞偺幃偑婾(FALSE)偲側偭偨応崌丄
 *	僼傽僀儖柤丄峴斣崋偲儊僢僙乕僕 "Assertion failed." 偑傾僂僩僾僢僩僂僀儞僪僂
 *	傊弌椡偝傟丄偦偺捈屻偵儊儌儕傾僋僙僗堘斀偱僽儗乕僋偡傞丅傾僂僩僾僢僩
 *	僂僀儞僪僂傊弌椡偝傟偨峴傪僟僽儖僋儕僢僋偡傞偲丄偦偙傊僞僌僕儍儞僾偱偒傞丅
 */

#ifdef _AZDEBUG

/* P11 億乕僩 (幚嵺偵偼懚嵼偟側偄僔儈儏儗乕僞儊僢僙乕僕弌椡梡億乕僩)
   僔儈儏儗乕僞偺媈帡僨僶僀僗婡擻偱偙偺斣抧(0x3f5)傪弌椡僷儔儗儖億乕僩
   (TEXT宍幃偱摨偠抣偱傕弌椡)偲偟丄傾僂僩僾僢僩僂僀儞僪僂傊僥僉僗僩偲
   偟偰弌椡偡傞傛偆愝掕偟偰偍偔丅*/

#pragma ADDRESS az_p11	3f5H
char az_p11;

static char* az_itoa(int val, char* buf)
{
	/* NC30WA 偵偼 itoa 偑側偐偭偨偺偱丄庢傝偁偊偢帺慜偱梡堄偟傑偟偨 */
	static const unsigned bases[] = { 10000, 1000, 100, 10 };
	BOOL bAny = FALSE;
	unsigned uval;
	int i;

	char* ptr = buf;
	if (val < 0)
	{
		*ptr++ = '-';
		val = -val;
	}
	uval = val;

	for (i = 0; i < arraysizeof(bases); i++)
	{
		if (uval >= bases[i])
		{
			*ptr++ = (uval / bases[i]) + '0';
			uval %= bases[i];
			bAny = TRUE;
		}
		else if (bAny)
			*ptr++ = '0';
	}
	*ptr++ = uval + '0';
	*ptr = 0;
	return buf;
}

static void az_output_message(const char* ptr)
{
	/* 暥帤楍傪傾僂僩僾僢僩僂僀儞僪僂傊憲傞 */
	while (*ptr)
		az_p11 = *ptr++;
}

void az_assertion_failed(const char __azfar * file, int line)
{
	/* line == 0 側傜僩儗乕僗儊僢僙乕僕, line >= 1 側傜 assertion/verify failed */
	/* 儊僢僙乕僕弌椡搑拞偱CPU傪墶庢傝偝傟側偄傛偆偵偡偨傔妱傝崬傒嬛巭偟偰偄傞 */
	az_pushflag();
	az_di();

	az_p11 = '\n';
	if (line)
	{
		char buf[16];
		az_output_message(file);
		az_output_message(", ");
		az_output_message(az_itoa(line, buf));
		az_output_message(" : Assertion failed.");

		/* ASSERT, VERIFY 側傜丄僔儈儏儗乕僞傪儊儌儕傾僋僙僗堘斀偱僽儗乕僋偝偣傞 */
		/* 偙傟偱僽儗乕僋偟偨傜丄傾僂僩僾僢僩僂僀儞僪僂偺儊僢僙乕僕傪僟僽儖僋儕僢僋偟偰偹 */
		*((char __azfar *) 0x80000) = 0;
	}
	else
	{
		az_output_message("TRACE: ");
		az_output_message(file);
	}
	az_popflag();
}

#endif /* _AZDEBUG */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -