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

📄 main.c

📁 this is RealTimeOS(uITRON) for hitachi H8 processor.
💻 C
字号:
/*
 *	AzkiRTOS - Sample demo program
 *	Copyright (C) 1999, Anchor Systems Corporation
 *	All rights reserved.
 *
 *	偙偺僼傽僀儖偼丄AzkiRTOS偺堦晹暘偱偡丅
 *	偙偺僼傽僀儖偺偺挊嶌尃偼傾儞僇乕僔僗僥儉僘姅幃夛幮偵懏偟傑偡偑丄
 *	扤偱傕僼傽僀儖傪柍曄峏丄傑偨偼曄峏偟偰帺桼偵巊偆偙偲偑偱偒傑偡丅
 *	傑偨柍彏偱嵞攝晍偡傞偙偲傕壜擻偱偡偑丄僆儕僕僫儖偺挊嶌尃昞帵傪
 *	偦偺傑傑偺宍偱娷傔偰偔偩偝偄丅
 *
 *	偨偩偟丄柍曄峏傑偨偼曄峏偟偨傕偺傪惢昳偺堦晹偲偟偰偱偼側偔丄
 *	儕傾儖僞僀儉OS偦偺傕偺偲偟偰柍抐偱嵞斕攧偡傞偙偲偼偱偒傑偣傫丅
 *
 *	傾儞僇乕僔僗僥儉僘(姅)偼丄柍曄峏傑偨偼曄峏偟偨AzkiRTOS傪慻傒崬傫偩
 *	惢昳偺晄嬶崌偵懳偟偰堦愗愑擟傪晧偆傕偺偱偼偁傝傑偣傫丅AzkiRTOS傪
 *	娷傔AzkiRTOS傪慻傒崬傫偩惢昳慡懱偺摦嶌曐徹偼丄AzkiRTOS傪慻傒崬傫偩
 *	惢昳偺奐敪幰偺愑擟偲側傝傑偡丅
 *
 *	$Revision: 18 $
 *	$Archive: /AnchorPlace/goodies/AzRTOS/main.c $
 */

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include "azrtos.h"

#define ON				1
#define OFF				0
#define arraysizeof(a)	(sizeof(a) / sizeof(a[0]))


/**************************************************************
 *	億乕僩掕媊
 **************************************************************/

#pragma ADDRESS p0			3e0H	/* P0 億乕僩 */
#pragma ADDRESS pd0			3e2H	/* P0 億乕僩曽岦儗僕僗僞 */
#pragma ADDRESS p1			3e1H	/* P1 億乕僩 */
#pragma ADDRESS pd1			3e3H	/* P1 億乕僩曽岦儗僕僗僞 */
#pragma ADDRESS p2			3e4H	/* P2 億乕僩 */
#pragma ADDRESS pd2			3e6H	/* P2 億乕僩曽岦儗僕僗僞 */

#pragma ADDRESS p10			3f4H	/* P10 億乕僩 */
#pragma ADDRESS pd10		3f6H	/* P10 億乕僩曽岦儗僕僗僞 */

#pragma ADDRESS int0ic		05dH	/* INT 0 妱傝崬傒惂屼儗僕僗僞 */

char p0, pd0, p1, pd1, p2, pd2;		/* PORT傪愨懳斣抧偵傾僒僀儞 */
char p10, pd10;
char int0ic;


/**************************************************************
 * TCBs and stacks
 **************************************************************/

AzTCB	task1;						/* 僞僗僋1 偺 TCB */
UB		stack1[128];				/* 僞僗僋1 偺僗僞僢僋 */
void	entry1(int);				/* 僞僗僋1 偺擖傝岥娭悢 */

AzTCB	task2;						/* 僞僗僋2 偺 TCB */
UB		stack2[128];				/* 僞僗僋2 偺僗僞僢僋 */
void	entry2(int);				/* 僞僗僋2 偺擖傝岥娭悢 */

AzTCB	task3;						/* 僞僗僋3 偺 TCB */
UB		stack3[128];				/* 僞僗僋3 偺僗僞僢僋 */
void	entry3(int);				/* 僞僗僋3 偺擖傝岥娭悢 */

AzTCB	task4;						/* 僞僗僋4 偺 TCB */
UB		stack4[128];				/* 僞僗僋4 偺僗僞僢僋 */
void	entry4(int);				/* 僞僗僋4 偺擖傝岥娭悢 */

AzTCB	task5;						/* 僞僗僋5 偺 TCB */
UB		stack5[128];				/* 僞僗僋5 偺僗僞僢僋 */
void	entry5(int);				/* 僞僗僋5 偺擖傝岥娭悢 */

AzSemaphore sem1, sem2;


/**************************************************************
 * 埲壓偼丄儔僂儞僪儘價儞僗働僕儏乕儕儞僌偺僥僗僩偱偡丅
 * azrtos.c 偺 az_timer_handler() 娭悢偺廔傢傝嬤偔偵偁傞
 * 僐儊儞僩傪奜偟偰丄irot_rdq(TPRI_RUN) 傪屇傃弌偡傛偆
 * 曄峏偟偰偐傜幚峴偟偰偔偩偝偄丅億乕僩p1偵暥帤 '0'丄'1'丄'2'丄
 * '3'丄'4'丄'5' 偑弴斣偵弌椡偝傟傑偡丅偨偩偟丄偦傟偧傟10msec偺
 * 娫孞傝曉偟弌椡偝傟偰偐傜師偺抣偵愗傝懼傢傝傑偡丅
 *************************************************************/

#if 0

void entry(int arg);

void main(void)
{

	/* 埲壓偱惗惉偡傞僞僗僋偺桪愭搙 */
	int tpri = 4;

	TRACE("main() started.");

	/* P10 偺 bit 0, 1 傪弌椡偵偡傞 */
	/* P10.0 偼 LED丄P10.1 偼儕儗乕 */
	pd10 = 3;

	/* INT0 偺妱傝崬傒儗儀儖 */
	int0ic = 0x02;

	vini_sem(&sem1, 0);
	vini_sem(&sem2, 0);
	dis_dsp();

	vini_tsk(&task1, entry, tpri, stack1, arraysizeof(stack1));
	task1.m_id =1;
	sta_tsk(&task1, '1');

	vini_tsk(&task2, entry, tpri, stack2, arraysizeof(stack2));
	task2.m_id =2;
	sta_tsk(&task2, '2');

	vini_tsk(&task3, entry, tpri, stack3, arraysizeof(stack3));
	task3.m_id =3;
	sta_tsk(&task3, '3');

	vini_tsk(&task4, entry, tpri, stack4, arraysizeof(stack4));
	task4.m_id =4;
	sta_tsk(&task4, '4');

	vini_tsk(&task5, entry, tpri, stack5, arraysizeof(stack5));
	task5.m_id =5;
	sta_tsk(&task5, '5');

	TRACE("about ready to dispatch");
	ena_dsp();

	for (;;)
	{
		p1 = '0';
	}
}

void entry(int arg)
{
	TRACE("entry() started.");
	for (;;)
	{
		p1 = arg;
	}
}

#endif


/****************************************************************************
 * 僙儅僼僅傗僞僗僋晅懏偺婲彴梫媮偺僥僗僩偱偡丅
 * 僥僗僩偡傞偲偒偼丄#if 0 傪 1 偵曄偊偰偔偩偝偄丅
 ****************************************************************************/

#if 1

void main(void)
{
	TRACE("main() started.");
	errno = 0;

	/* P10 偺 bit 0, 1 傪弌椡偵偡傞 */
	/* P10.0 偼 LED丄P10.1 偼儕儗乕 */
	pd10 = 3;

	/* INT0 偺妱傝崬傒儗儀儖 */
	int0ic = 0x02;

	/* 僙儅僼僅偺弶婜壔 */
	vini_sem(&sem1, 0);
	vini_sem(&sem2, 0);

	/* 僞僗僋孮偺婲摦拞偼僨傿僗僷僢僠傪偟側偄 */
	dis_dsp();

	vini_tsk(&task1, entry1, 1, stack1, arraysizeof(stack1));
	task1.m_id = 1;
	sta_tsk(&task1, 1);

	vini_tsk(&task2, entry2, 3, stack2, arraysizeof(stack2));
	task2.m_id = 2;
	sta_tsk(&task2, 2);

	vini_tsk(&task3, entry3, 2, stack3, arraysizeof(stack3));
	task3.m_id = 3;
	sta_tsk(&task3, 3);

	vini_tsk(&task4, entry4, 2, stack4, arraysizeof(stack4));
	task4.m_id = 4;
	sta_tsk(&task4, 4);

	vini_tsk(&task5, entry5, 2, stack5, arraysizeof(stack5));
	task5.m_id = 5;
	sta_tsk(&task5, 5);

	/* 偡傋偰偺僞僗僋偑婲摦偱偒偨偺偱丄僨傿僗僷僢僠奐巒 */
	ena_dsp();

	for (;;)
	{
		/* Task3 偑巰傫偠傖偭偰偄偨傜丄嵞僗僞乕僩偝偣傞 */
		T_RTSK rtsk;
		if (ref_tsk(&rtsk, &task3) == E_OK && rtsk.tskstat == TTS_DMT)
		{
			TRACE("Main - Restarting Task-3");
			sta_tsk(&task3, 3);
		}

		/* Task4 偲 5 偵壗偐傗傜偡 */
		wup_tsk(&task4);
		sig_sem(&sem1);

		/* p0億乕僩偺僨乕僞傪 p1億乕僩傊僐僺乕 */
		p1 = p0;

		/* 偄偭偨傫懠偺僞僗僋偵幚峴尃傪忳傞 */
		rot_rdq(TPRI_RUN);
	}
}

void entry1(int arg)
{
	int count = 0;
	TRACE("entry1() started.");

	for (;;)
	{
		/* 婲偙偝傟偰偐傜10僇僂儞僩(1昩娫)偼丄LED傪偮偗偭傁側偟偵偡傞 */
		if (tslp_tsk(10) == E_OK)
		{
			TRACE("Task1 - tslp_tsk(10) return E_OK");
			count = 10;
		}
		strtol("4000000000", NULL, 0);

		if (--count > 0)
			p10 &= ~1;
		else
			p10 ^= 1;
	}
}

void entry2(int arg)
{
	TRACE("entry2() started.");
	for (;;)
	{
		dly_tsk(288);
		TRACE("Task2 - dly_tsk(288) time up");
		p10 ^= 2;

		chg_pri(TSK_SELF, 1);
		TRACE("Task2 - about waking up task1");
		wup_tsk(&task1);
		TRACE("Task2 - after waking up task1");
		chg_pri(TSK_SELF, TPRI_INI);
	}
}

void entry3(int arg)
{
	TRACE("entry3() started.");

	wai_sem(&sem2);
	TRACE("Task3 - Passed sem2");

	TRACE("Task3 - exiting");
	ext_tsk();
}

void entry4(int arg)
{
	TRACE("entry4() started.");
	for (;;)
	{
		slp_tsk();
		sig_sem(&sem1);
		sig_sem(&sem1);
		sig_sem(&sem1);
	}
}

void entry5(int arg)
{
	TRACE("entry5() started.");
	for (;;)
	{
		wai_sem(&sem1);
	}
}

#endif


/****************************************************************************
 * INT 0 handler
 * 僔儈儏儗乕僞偺愝掕偵傛傝丄擖椡億乕僩 p0 偺 戞7價僢僩偑 0 偐傜 1 偵曄壔偟偨
 * 偲偒偵敪惗偡傞妱傝崬傒 INT 0 偺僴儞僪儔偱偡丅
 ****************************************************************************/

void int0_handler(void);
#pragma INTHANDLER int0_handler

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

void int0_handler(void)
{
	TRACE("INT #0");
	isig_sem(&sem2);
}

⌨️ 快捷键说明

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