亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? os.c

?? MINI-os code,you can download !
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*********************************************************************************************************
**												   Mini OS
**                                   The Real-Time Kernel For Avr Atmega8/16 CPU
**
**                                  (c) Copyright 2004-2004, wanghong
**                                           All Rights Reserved
**
**                                                  V1.20
**
**
** Filename: os.c
** Created by: wanghong
** Date: 2004.09.05
** Description: Mini OS for Avr Atmega8/16 CPU
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Date:
** Description:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "os_config.h"
#include "os.h"
#include <string.h>



OS_TASK_STATUS			os_task_stat[OS_MAX_TASK_N];		// task's state
OS_MSG	OS_MSG_MEM_TYP	os_msg_q[OS_MAX_MSG_N];				// message pool
unsigned char			os_msg_total;						// total number of messages in message pool
unsigned char			os_msg_cnt[OS_MAX_TASK_N];			// message counter of each task
SIGNAL_TYPE				os_signal[OS_MAX_TASK_N];			// bit-mapped signal of each task
unsigned char			os_task_rdy[(OS_MAX_TASK_N+7)/8];	// ready table of task list
unsigned char			os_timer[OS_MAX_TASK_N];			// task's timer
unsigned int			os_stkptr[OS_MAX_TASK_N+1];			// task's stack pointer(added 1 to fast the task switch process)
unsigned int			os_stkptr_sw[OS_MAX_TASK_N];		// task's sw stack pointer
unsigned char			os_task_curr;						// id of the current task(0~MAX_TASK_N-1)
unsigned char			os_task_next;						// id of the next task to run
unsigned char			os_isr_sig;							// flag indicates there is(are) a task(s) has been set ready by an interrupt service routine.
unsigned char			os_task_switching;					// task switching is in process

unsigned long			os_time;							// os free run timer

#if OS_TASK_STAT_EN
unsigned long			os_idle_ctr;
unsigned long			os_idle_ctr_max;
signed char				os_cpu_usage;
#endif

#if OS_STK_CHK_EN
signed char				os_stk_usage;
signed char				os_stk_usage_max;
#endif

static const unsigned char task_rdy_table[32]=
{
	0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
	0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
	0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
	0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
};
#define SET_TASK_READY(task_id)	do{os_task_rdy[(task_id>>3)] |= task_rdy_table[task_id];}while(0)
#define CLR_TASK_READY(task_id)	do{os_task_rdy[(task_id>>3)] &= ~task_rdy_table[task_id];}while(0)



/**********************************************************
 *  os_create_task: starts the defined task function using
 *		the task number specified by task_id. The task is
 *		marked as ready and is ready to execute
 *
 *  @param task_id: task id
 *  @param ptask_entry: task's entry address
 *  @return 0: task create successfully,
 *			0xff: task could not be started or if no task
 *				was defined using the specified task number
 **********************************************************/
static unsigned char	*p1;
static unsigned char	*p2;
unsigned char os_create_task (unsigned char task_id, void (*task_entry)(void))
{
	unsigned char	i;
	
	
	/* judge no err with the task to create */
	if (task_id >= OS_MAX_TASK_N	||	// id err
		task_entry == NULL			||	// task not defined
		task_id == os_task_curr		||	// task already exist
		os_task_stat[task_id].active
	)
	{
		return (0xff);
	}
	
	
	/* move task entry address on the stack */
	if (os_task_curr < task_id)
	{
		i	= os_task_curr;

		while (i < task_id)
		{
			i++;
			
			p1 = (unsigned char *)os_stkptr[i];			// add stack base address
			p2	= (unsigned char *)os_stkptr[i+1];
			
			while (p1 != p2)
			{
				*(p1+2) = *p1;
				p1--;
			}

			os_stkptr[i] += 2;
		}
	}
	else if (os_task_curr > task_id)
	{
		/* adjust stack pointer, p1 = sp; sp -= 2; */
		OS_ENTER_CRITICAL();
		{
			asm("push R0");			/* save r0/r1 */
			asm("push R1");
			asm("in r0, 0x3d");		/* stack pointer(N) */
			asm("in r1, 0x3e");
			asm("sts _p1,R0");
			asm("sts _p1+1,R1");
			asm("pop R1");			/* restore r0/r1 */
			asm("pop R0");
			
			asm("push R0");			/* sp -= 2(N-2) */
			asm("push R0");
		}
		OS_EXIT_CRITICAL();
		p1	+= 2;					/* p1 = sp(N) */
		
		i	= os_task_curr;

		while (i > task_id)
		{
			p2 = (unsigned char *)os_stkptr[i] + 1;		// task stack pointer 2

			while (p1 < p2)								// move 2 bytes data down on the stack
			{
				*(p1 - 2) = *(p1);
				p1++;
			}
			p1 = (unsigned char *)os_stkptr[i] + 1;		// task stack pointer 1
			os_stkptr[i] -= 2;							// the stack pointer of task -2 for moving down 2 bytes data
			i--;
		}
	}
	
	
	/*-- task timer init, copy the entry point address
		of the task onto the stack, make task active/ready --*/
	OS_ENTER_CRITICAL();
	os_timer[task_id]	= 0;
	OS_EXIT_CRITICAL();
	*((unsigned char *)((unsigned int)(os_stkptr[task_id] - 1)))	= (unsigned char)((*(const unsigned int *)task_entry)>>8);
	*((unsigned char *)((unsigned int)(os_stkptr[task_id])))		= (unsigned char)*(const unsigned int *)task_entry;
	
	
	os_task_stat[task_id].active	= 1;
	os_task_stat[task_id].ready		= 1;
	SET_TASK_READY(task_id);
	
	return (0);
}

/**********************************************************
 *  os_wait: halts the current task and waits for one or
 *		several events such as a time interval, a time-out, a message,
 *		or a bit-mapped signal from another task or interrupt.
 *
 *  @param typ: event or events to wait for and can be any
 *				combination of the following manifest constants:
 *				(K_TMO, K_SIG, K_MSG).
 *	@param timeout: the number of timer ticks to wait for an
 *				interval event (K_IVL) or a time-out event (K_TMO).
 *	@param dummy: not used.
 *
 *  @return EVENT_SIG: A signal was received.
 *			EVENT_MSG: A message was received.
 *			EVENT_TMO: A time-out has completed or an interval
 *						has expired.
 *			NOT_OK: The value of the typ argument is invalid.
 **********************************************************/
#pragma ctask	os_wait
unsigned char os_wait (unsigned char typ, unsigned char timeout, unsigned int dummy)
{
	unsigned char	event;
	
	
	dummy	= dummy;			// prevent compiler warning.
	
	if ((typ & (K_TMO|K_IVL|K_SIG|K_MSG)) == 0)
	{
		return NOT_OK;
	}
	
	event	= 0;
	OS_ENTER_CRITICAL();
	
	/*-- 1. see if we wait for message --*/
	if (typ & K_MSG)
	{
		os_task_stat[os_task_curr].waitmsg	= 1;
	}
	else
	{
		os_task_stat[os_task_curr].waitmsg	= 0;
	}

	/*-- 2. see if we wait for bit-mapped signal --*/
	if (typ & K_SIG)
	{
		os_task_stat[os_task_curr].waitsig	= 1;
	}
	else
	{
		os_task_stat[os_task_curr].waitsig	= 0;
	}

	/*-- 3. see if we wait for a interval or time out --*/
	if ((typ & K_IVL) || (typ & K_TMO))
	{
		os_task_stat[os_task_curr].waitto	= 1;
	}
	else
	{
		os_task_stat[os_task_curr].waitto	= 0;
	}

	/*-- 4.1 see if we wait for interval timer out --*/
	if (typ & K_IVL)
	{
		unsigned char	t_sum;

		if (os_timer[os_task_curr] == 0)
		{
			goto	normal_wait_a_timeout;			// normal wait time out
		}
		
		/* if a time out happened, set a time-out event */
		t_sum	= os_timer[os_task_curr] + timeout;
		if (t_sum == 0 || (t_sum >= os_timer[os_task_curr] && t_sum >= timeout))
		{
			os_timer[os_task_curr]	= t_sum;
			event = EVENT_TMO;
		}
		/* else wait for a time-out */
		else
		{
			os_timer[os_task_curr]	= t_sum;
		}
	}
	/*-- 4.2 else see if we wait for time out --*/
	else if (typ & K_TMO)
	{
normal_wait_a_timeout:
		/* see if we really want to wait for a time out */
		os_timer[os_task_curr]	= timeout;
		if (timeout == 0)
		{
			event 		= EVENT_TMO;				// no, set time-out event
		}
	}
	
	/*-- 4.3 see if we get a time out event, return without task switch, user can reset
		the task timer by "K_TMO" with timeout=0.
		--*/
	if (event == EVENT_TMO)
	{
		/* clear wait time-out, and time-out flag */
		os_task_stat[os_task_curr].waitto	= 0;
		os_task_stat[os_task_curr].toflag	= 0;
		OS_EXIT_CRITICAL();
		
		return EVENT_TMO;
	}


	/*-- 5. clear the ready bit if we have no message and no signal waitting --*/
	if ((!os_task_stat[os_task_curr].waitmsg || os_msg_cnt[os_task_curr] == 0)	&&
		(!os_task_stat[os_task_curr].waitsig || os_signal[os_task_curr] == 0)
	)
	{
		os_task_stat[os_task_curr].ready	= 0;
		CLR_TASK_READY(os_task_curr);
	}


	OS_EXIT_CRITICAL();

	/*-- 6. perform a task switch --*/
	asm("rjmp _os_switch_task");
}

/**********************************************************
 *  isr_send_signal: sends a bit-mapped signal to task task_id. If the
 *		specified task is already waiting for a signal,	this
 *		function call readies the task for execution. Otherwise,
 *		the signal is stored in the signal flag of the task.
 *		The isr_send_signal function may be called only from interrupt service routine.
 *
 *  @param task_id: task id
 *  @param signal: bit-mapped signal
 *  @return 0: if successful,
 *			0xff: signal invalid or the specified task does not exist.
 **********************************************************/
unsigned char isr_send_signal (unsigned char task_id, SIGNAL_TYPE signal)
{
	if (OS_MAX_TASK_N <= task_id	||
		0x0000 == signal
	)
	{
		return 0xff;
	}
	
	
	os_signal[task_id]	|= signal;
	os_task_stat[task_id].sigflag	= 1;
	if (os_task_stat[task_id].waitsig)
	{
		os_task_stat[task_id].ready	= 1;
		SET_TASK_READY(task_id);
		os_isr_sig	= 1;
	}


	return 0;
}

/**********************************************************
 *  os_send_signal: sends a bit-mapped signal to task task_id. If the
 *		specified task is already waiting for a signal,	this
 *		function call readies the task for execution. Otherwise,
 *		the signal is stored in the signal flag of the task.
 *		The os_send_signal function may be called only from task functions.
 *
 *  @param task_id: task id
 *  @param signal: bit-mapped signal
 *  @return 0: if successful,
 *			0xff: signal invalid or the specified task does not exist.
 **********************************************************/
unsigned char os_send_signal (unsigned char task_id, SIGNAL_TYPE signal)
{
	if (OS_MAX_TASK_N <= task_id	||
		0x0000 == signal
	)
	{
		return 0xff;
	}


	OS_ENTER_CRITICAL();
	os_signal[task_id]	|= signal;
	os_task_stat[task_id].sigflag	= 1;
	if (os_task_stat[task_id].waitsig)
	{
		os_task_stat[task_id].ready	= 1;
		SET_TASK_READY(task_id);
	}
	OS_EXIT_CRITICAL();


	return 0;
}

/**********************************************************
 *  os_get_signal: get a bit-mapped signal of the current task.
 *		This function may be called only from task functions.
 *
 *  @param none
 *  @return: bit-mapped signal
 *			0: no signal or the specified task does not exist.
 **********************************************************/
SIGNAL_TYPE os_get_signal (void)
{
	SIGNAL_TYPE	signal;


	OS_ENTER_CRITICAL();
	signal	= os_signal[os_task_curr];				// task get itself's signal
	OS_EXIT_CRITICAL();


	return signal;
}

/**********************************************************
 *  os_clear_signal: clear a bit-mapped signal of the current task.
 *		This function may be called only from task functions.
 *
 *  @param signal: bit-mapped signal
 *  @return 0: if successful,
 *			0xff: the specified task does not exist.
 **********************************************************/
unsigned char os_clear_signal (SIGNAL_TYPE signal)
{
	OS_ENTER_CRITICAL();
	os_signal[os_task_curr]	&= ~signal;				// clear bit-mapped signal
	if (os_signal[os_task_curr] == 0x0000)
	{
		os_task_stat[os_task_curr].sigflag	= 0;	// clear task signal flag
	}
	OS_EXIT_CRITICAL();


	return 0;
}

/**********************************************************
 *  isr_send_message: send a message to a specific task.
 *		This function may be called only from interrupt service routine.
 *
 *  @param task_id: the specified task to receive the message.
 *  @param msg_data: data to be sent. msg_data lenght must be 3  bytes.
 *  @return 0: if successful,
 *			!0: error code.
 **********************************************************/
unsigned char isr_send_message (unsigned char task_id, unsigned char *msg_data)
{
	if (OS_MAX_TASK_N <= task_id	||
		os_task_stat[task_id].active == 0
	)
	{
		return ERR_MSG_GENERAL;
	}
	
	if (OS_MAX_MSG_N <= os_msg_total)
	{
		return ERR_MSG_OVF;
	}
	

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
从欧美一区二区三区| 亚洲va国产天堂va久久en| 亚洲美腿欧美偷拍| 日韩—二三区免费观看av| 国产一区二区导航在线播放| 91色九色蝌蚪| 中文字幕成人网| 久久99精品国产麻豆婷婷| 色婷婷精品久久二区二区蜜臂av| 日韩精品一区二区三区视频播放| 一区二区三区美女视频| 成人午夜电影网站| 精品av久久707| 日韩av一区二区三区四区| 91丨porny丨蝌蚪视频| 久久久99久久| 美女在线观看视频一区二区| 欧美伦理影视网| 亚洲一区二区av在线| 97se狠狠狠综合亚洲狠狠| 国产午夜亚洲精品理论片色戒| 蜜臀国产一区二区三区在线播放| 欧美伊人精品成人久久综合97| 国产精品高潮久久久久无| 国产成人在线看| 久久久久久久久99精品| 国产一区二区三区精品欧美日韩一区二区三区 | 成人av在线影院| 久久美女艺术照精彩视频福利播放| 日韩av一级片| 日韩三区在线观看| 久久se这里有精品| 精品国产免费视频| 国产精一区二区三区| 久久日韩粉嫩一区二区三区| 国产一区在线精品| 久久精品一区八戒影视| 丁香五精品蜜臀久久久久99网站| 国产亚洲一区二区在线观看| 国产激情一区二区三区| 国产精品麻豆网站| 91一区在线观看| 亚洲一区免费观看| 欧美日本一区二区| 精品中文字幕一区二区小辣椒| 日韩美一区二区三区| 久久99精品久久久久久动态图 | 在线免费观看日本一区| 亚洲精品视频自拍| 欧美精品视频www在线观看| 蜜臀久久99精品久久久画质超高清| 日韩一级黄色大片| 国产馆精品极品| 亚洲人成网站精品片在线观看| 日本高清成人免费播放| 日韩成人av影视| 久久这里只精品最新地址| a亚洲天堂av| 婷婷开心激情综合| 久久精品一区二区| 欧美日韩黄色一区二区| 国产精品资源站在线| 亚洲视频免费在线观看| 欧美日韩视频在线观看一区二区三区| 免费成人你懂的| 国产精品国产三级国产a| 欧美剧情电影在线观看完整版免费励志电影 | 国产欧美一区二区在线观看| 91麻豆精品秘密| 免费欧美日韩国产三级电影| 国产精品美女一区二区| 欧美日韩和欧美的一区二区| 国产精品综合久久| 亚洲高清中文字幕| 欧美激情综合五月色丁香小说| 欧美日韩一本到| 丁香六月综合激情| 日韩av一区二区三区四区| 中文字幕一区二区三区乱码在线| 91精品一区二区三区久久久久久| 成人精品视频一区二区三区 | 欧美午夜精品免费| 国产精品一区二区黑丝| 偷拍日韩校园综合在线| 国产精品美女久久久久久| 欧美成va人片在线观看| 欧美性极品少妇| eeuss国产一区二区三区| 国产综合久久久久影院| 婷婷久久综合九色国产成人| 亚洲天堂av一区| 国产亚洲精品超碰| 日韩欧美第一区| 欧美丰满嫩嫩电影| 欧美中文字幕一区二区三区| 成人久久久精品乱码一区二区三区 | 久久精品噜噜噜成人88aⅴ| 一区二区三区四区中文字幕| 国产精品天美传媒沈樵| 欧美大片免费久久精品三p| 欧美群妇大交群的观看方式| 91麻豆免费看片| 99视频精品全部免费在线| 国产精品影视在线观看| 美女视频网站黄色亚洲| 日韩黄色免费电影| 日韩精品视频网| 日本三级韩国三级欧美三级| 亚洲国产毛片aaaaa无费看| 亚洲精品国产第一综合99久久| 国产精品色眯眯| 国产精品免费aⅴ片在线观看| 国产亚洲精品久| 日本一区二区免费在线观看视频 | 国产一区二区精品久久99 | 一区二区免费在线| 一区二区三区在线免费| 亚洲美女偷拍久久| 伊人一区二区三区| 亚洲国产一区二区a毛片| 五月天婷婷综合| 麻豆中文一区二区| 精品一区二区三区免费视频| 久久疯狂做爰流白浆xx| 国产一区美女在线| 懂色av一区二区在线播放| www.欧美亚洲| 91搞黄在线观看| 欧美日韩一区二区三区在线| 欧美日韩国产一二三| 日韩欧美国产小视频| 久久亚洲精精品中文字幕早川悠里 | 夜夜嗨av一区二区三区四季av | 欧美日韩一区二区在线观看视频| 欧美日韩成人一区二区| 日韩精品专区在线| 国产精品色哟哟网站| 亚洲综合在线视频| 久久精品国产久精国产| 国产成人在线电影| 欧美中文字幕亚洲一区二区va在线| 欧美午夜影院一区| 26uuu精品一区二区在线观看| 国产精品久久久久久久久晋中| 亚洲精品成人在线| 裸体健美xxxx欧美裸体表演| 国产精品一区久久久久| 色欧美片视频在线观看| 日韩精品在线看片z| 国产精品日韩成人| 亚洲va在线va天堂| 国产乱色国产精品免费视频| 色94色欧美sute亚洲线路一ni| 91精品国产综合久久香蕉麻豆| 久久综合色综合88| 亚洲在线视频免费观看| 一本色道a无线码一区v| 欧美精品久久一区二区三区| 国产人久久人人人人爽| 偷拍自拍另类欧美| 91在线观看污| 欧美精品一区二区不卡| 亚洲午夜在线视频| 成人av电影在线网| 日韩一级片在线播放| 一区二区三区四区蜜桃| 国产精品一二三| 欧美丰满少妇xxxxx高潮对白| 国产精品电影一区二区| 捆绑变态av一区二区三区| 色菇凉天天综合网| 国产精品嫩草影院av蜜臀| 裸体一区二区三区| 欧美美女一区二区在线观看| 亚洲欧美日韩在线| 东方欧美亚洲色图在线| 精品动漫一区二区三区在线观看| 亚洲成人免费电影| 色婷婷综合久色| 国产精品对白交换视频| 成人黄色片在线观看| 2020国产成人综合网| 蜜臀久久99精品久久久画质超高清 | 欧美军同video69gay| 亚洲日本在线a| 成人av片在线观看| 欧美激情综合五月色丁香| 国产在线精品国自产拍免费| 欧美一卡2卡3卡4卡| 午夜av电影一区| 欧美日韩国产高清一区二区三区| 亚洲免费资源在线播放| 96av麻豆蜜桃一区二区| 国产精品久久国产精麻豆99网站| 国产福利一区二区三区| 久久久不卡网国产精品一区| 国产一区二区三区日韩| 国产婷婷色一区二区三区四区| 激情综合亚洲精品| 精品粉嫩超白一线天av|