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

📄 rtos.h

📁 一个完整的rtos源代码.运行在嵌入80186 cpu上.提供4个任务,信号灯,定时器,schedule等.
💻 H
📖 第 1 页 / 共 2 页
字号:

typedef UH 					STATUS_REG;

typedef struct t_rmbx{
	VP	exinf;
	BOOL_ID	wtsk;
	T_MSG	*pk_msg;
} T_RMBX;

typedef struct t_memblc
{
	UB data[MEM_BLOCK_SIZE];
   UH attr;
} T_MEMBLC;
#define MEMORY_BLOCK_NOT_USED 0
#define MEMORY_BLOCK_USED		1

/* version information reference */
typedef struct t_ver
{
	UINT maker;				/* vendor */
	UINT id;					/* format number */
	UINT spver;				/* specification version */
	UINT prver;				/* product version */
	UINT prno[4];			/* product control information */
	UINT cpu;				/* CPU information */
	UINT var;				/* variation descriptor */
} T_VER;

/* context */
typedef struct t_context
{
   UH di;
   UH si;
   UH argreg;
	FP	task;					/* procedure */
} T_CONTEXT;

/* task control queue */
typedef struct t_queue
{							/* double linking queue */
	struct t_queue *next;	/* next queue */
	struct t_queue *prev;	/* previous queue */
} T_QUEUE;

/* TSKCB(task control block) */
typedef struct t_tskcb
{
	T_QUEUE		queue;	/* queue */
	T_CONTEXT	*stackp;	/* statck pointer(context) */
	UINT			tskstat;	/* status */
	PRI			tskpri;	/* priority */
	UINT			tskwait;	/* wait */
	INT			wupcnt;	/* number of wake-up queing */
#ifndef NO_SUSCNT
	INT			suscnt;	/* number nesting of SUSPEND */
#endif
	UINT			waiptn;	/* event flag patern */
	UINT			wfmode;	/* even flag mode */
								/* requested size of memory pool */
	SYSTIME		*waistm;	/* pointer of wait time */
	VP				*ans;		/* return value without dispatch */
	PRI			itskpri;	/* initial priority */
	T_CONTEXT	*istackp;/* pointer of initial statck */
	FP				itask;		/* start address of initial task */
#ifdef _TIME_SLICE_
	INT			tmslc;	/* time slice : 0=none */
#endif
#ifndef NO_ERCHK
	SYSTIME		ttltic;	/* total time (msec unit) */
#endif
} T_TSKCB;

/* SEMCB(semaphore control block) */
typedef	struct	t_semcb
{
	T_QUEUE	queue;			/* wait task */
	INT		semcnt;			/* count of semaphore */
	INT		maxsem;			/* maximum count of semaphore */
#ifndef NO_ERCHK
	PRI		sempri;			/* priority */
#endif
}	T_SEMCB;

/* FLGCB(event flag control block) */
typedef	struct	t_flgcb
{
	T_QUEUE	queue;			/* wait task */
	UINT	flgptn;			/* event flag value */
}	T_FLGCB;

/* MSGCB(message control block) */
typedef	struct	t_msgcb
{
	T_QUEUE	queue;				/* wait task */
	INT		head;				/* top of message queue */
	INT		tail;				/* tail of message queue */
	T_MSG		msgque[MSGQUEMAX];	/* message queue */
}	T_MSGCB;

/* MPFCB(fixed memory pool control block) */
typedef	struct	t_mpfcb
{
	T_QUEUE	queue;				/* wait task */
}	T_MPFCB;

/* MPLCB(variable memory pool control block) */
typedef	struct	t_mplcb
{
	T_QUEUE	queue;				/* wait task */
}	T_MPLCB;

/* DLYCB(delay time control block) */
typedef	struct	t_dlycb
{
	T_QUEUE	queue;				/* wait task */
}	T_DLYCB;

#ifdef DEBUG_OS
/* trace buffer control block for debug */
typedef	struct	t_dbgtrccb
{
	ID		tskid;			/* task ID */
	PRI		tskpri;		/* priority */
	char*	srvnm;			/* savice name */
	UINT	tim;				/* time : UINT for PARTNER-J */
}	T_DBGTRCCB;
#endif

struct progaddrsptr {
	void (*func)(void);
};

#ifndef _RTOS_H
#define _RTOS_H
/* ////////////////////////////////////////////////////////////////////////////
; EXTERNAL Subroutine
//////////////////////////////////////////////////////////////////////////// */
/*=============================================================================
; Subroutine
=============================================================================*/

/* you can use function in task independent */
#define ista_tsk	sta_tsk
#define iter_tsk	ter_tsk
#define ichg_pri	chg_pri
#define irot_rdq	rot_rdq
#define irel_wai	rel_wai
#define iwup_tsk	wup_tsk
#define ican_wup	can_wup
#define isus_tsk	sus_tsk
#define irsm_tsk	rsm_tsk
#define isig_sem	sig_sem
#define ipreq_sem	preq_sem
#define iset_flg	set_flg
#define iclr_flg	clr_flg
#define ipol_flg	pol_flg
#define isnd_msg	snd_msg
#define iprcv_msg	prcv_msg
#define ipget_blf	pget_blf
#define iset_tim	set_tim
#define iget_tim	get_tim
#define iget_ver	get_ver

#ifdef _TIME_SLICE_
extern void init_rtos( ID tskid, PRI tskpri, INT tmslc );
extern void init_task( ID tskid, T_CONTEXT *stackp, FP task, PRI tskpri, INT tmslc );
#else
extern void init_rtos( ID tskid, PRI tskpri );
extern void init_task( ID tskid, T_CONTEXT *stackp, FP task, PRI tskpri );
#endif

#ifndef NO_ERCHK
#if SEMMAX
extern void init_sem( ID semid, PRI sempri );
#endif
#endif
extern void start_rtos( void );

extern ER	dis_dsp( void );
extern ER	ena_dsp( void );
extern ER	sta_tsk( ID tskid, INT stacd );
extern void ext_tsk( void );
extern ER	ter_tsk ( ID tskid );
extern ER	chg_pri( ID tskid, PRI tskpri );
extern ER	rot_rdq( PRI tskpri );
extern ER	rel_wai( ID tskid );
extern ER	get_tid( ID *p_tskid );

extern ER	slp_tsk( void );
extern ER	wup_tsk( ID tskid );
extern ER	can_wup( INT *p_wupcnt, ID tskid );
extern ER	sus_tsk( ID tskid );
extern ER	rsm_tsk( ID tskid );

extern ER	sig_sem( ID semid );
extern ER	wai_sem( ID semid );
extern ER	preq_sem( ID semid );
extern ER	check_sem( ID semid );

extern ER	set_flg( ID flgid, UINT setptn );
extern ER	clr_flg( ID flgid, UINT clrptn );
extern ER	wai_flg( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode );
extern ER	pol_flg( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode );
extern ER	snd_msg( ID mbxid, T_MSG *pk_msg );
extern ER	rcv_msg( T_MSG *ppk_msg, ID mbxid );
extern ER	prcv_msg( T_MSG *ppk_msg, ID mbxid );
//extern ER	ref_mbx( T_MSG *ppk_msg, ID mbxid );
extern ER ref_mbx( T_RMBX *pk_rmbx, ID mbxid );

extern ER	loc_cpu( void );
extern ER	unl_cpu( void );
extern void ent_int( void );
extern void ret_int( void );

extern ER	set_tim( SYSTIME *pk_tim );
extern ER	get_tim( SYSTIME *pk_tim );
extern ER	dly_tsk( DLYTIME dlytim );

extern ER	pget_blf( VP *p_blk, ID mplid);
extern ER	get_blf( VP *p_blk, ID mplid);
extern ER	rel_blf( ID mplid, VP blk );

extern ER	pget_blk( VP *p_blk, ID mplid, INT blksz);
extern ER	get_blk( VP *p_blk, ID mplid, INT blksz);
extern ER	rel_blk( ID mplid, VP blk );

extern void interrupt_timer( void );

extern ER	get_ver( T_VER *pk_ver );

#ifdef DEBUG_OS
extern void set_dbgtrc(T_TSKCB *tsk, char* srvnm);
#endif

extern STATUS_REG	InterruptDisable( void );
extern STATUS_REG	InterruptEnable( void );
extern void	set_SR( STATUS_REG SRkeep );
extern ER change_stack(T_CONTEXT **next, T_CONTEXT **last);
extern void copy_data (void *dest,void* sour,unsigned int num);
/*=============================================================================
; Work area
=============================================================================*/
#else	/* #ifndef _RTOS_H */

#ifdef _TIME_SLICE_
void init_rtos( ID tskid, PRI tskpri, INT tmslc );
void init_task( ID tskid, T_CONTEXT *stackp, FP task, PRI tskpri, INT tmslc );
#else
void init_rtos( ID tskid, PRI tskpri );
void init_task( ID tskid, T_CONTEXT *stackp, FP task, PRI tskpri );
#endif
#ifndef NO_ERCHK
#if SEMMAX
void init_sem( ID semid, PRI sempri );
#endif
#endif
void start_rtos( void );

ER	dis_dsp( void );
ER	ena_dsp( void );
ER	sta_tsk( ID tskid, INT stacd );
void ext_tsk( void );
ER	ter_tsk ( ID tskid );
ER	chg_pri( ID tskid, PRI tskpri );
ER	rot_rdq( PRI tskpri );
ER	rel_wai( ID tskid );
ER	get_tid( ID *p_tskid );

ER	slp_tsk( void );
ER	wup_tsk( ID tskid );
ER	can_wup( INT *p_wupcnt, ID tskid );
ER	sus_tsk( ID tskid );
ER	rsm_tsk( ID tskid );

ER	sig_sem( ID semid );
ER	wai_sem( ID semid );
ER	preq_sem( ID semid );
ER	set_flg( ID flgid, UINT setptn );
ER	clr_flg( ID flgid, UINT clrptn );
ER	wai_flg( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode );
ER	pol_flg( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode );
ER	snd_msg( ID mbxid, T_MSG *pk_msg );
ER	rcv_msg( T_MSG *ppk_msg, ID mbxid );
ER	prcv_msg( T_MSG *ppk_msg, ID mbxid );
//ER	ref_mbx( T_MSG *ppk_msg, ID mbxid );
ER ref_mbx( T_RMBX *pk_rmbx, ID mbxid );

ER	loc_cpu( void );
ER	unl_cpu( void );
void ent_int( void );
void ret_int( void );

ER	set_tim( SYSTIME *pk_tim );
ER	get_tim( SYSTIME *pk_tim );
ER	dly_tsk( DLYTIME dlytim );

ER	pget_blf( VP *p_blk, ID mplid);
ER	get_blf( VP *p_blk, ID mplid);
ER	rel_blf( ID mplid, VP blk );

ER	pget_blk( VP *p_blk, ID mplid, INT blksz);
ER	get_blk( VP *p_blk, ID mplid, INT blksz);
ER	rel_blk( ID mplid, VP blk );

void interrupt_timer( void );

ER	get_ver( T_VER *pk_ver );

#ifdef DEBUG_OS
void set_dbgtrc(T_TSKCB *tsk, char* srvnm);
#endif

STATUS_REG	InterruptDisable( void );
STATUS_REG	InterruptEnable( void );
void	set_SR( STATUS_REG SRkeep );
ER change_stack(T_CONTEXT **next, T_CONTEXT **last);
void copy_data (void *dest,void* sour,unsigned int num);


#endif	/* #ifndef _RTOS_H */

/* end ///////////////////////////////////////////////////////////////////// */
#endif	/* #ifndef _RTOS_H_ */

⌨️ 快捷键说明

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