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

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

?? port.c

?? MCS-51的一個Free小型操作系統,在KeilC中下編譯工作
?? C
字號:
/*
	FreeRTOS.org V4.1.3 - Copyright (C) 2003-2006 Richard Barry.

	This file is part of the FreeRTOS.org distribution.

	FreeRTOS.org is free software; you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation; either version 2 of the License, or
	(at your option) any later version.

	FreeRTOS.org is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with FreeRTOS.org; if not, write to the Free Software
	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

	A special exception to the GPL can be applied should you wish to distribute
	a combined work that includes FreeRTOS.org, without being obliged to provide
	the source code for any proprietary components.  See the licensing section 
	of http://www.FreeRTOS.org for full details of how and when the exception
	can be applied.

	***************************************************************************
	See http://www.FreeRTOS.org for documentation, latest information, license 
	and contact details.  Please ensure to read the configuration and relevant 
	port sections of the online documentation.
	***************************************************************************
*/

/*
Changes from V1.00:
	
	+ Call to taskYIELD() from within tick ISR has been replaced by the more
	  efficient portSWITCH_CONTEXT().
	+ ISR function definitions renamed to include the prv prefix.

Changes from V1.2.0:

	+ prvPortResetPIC() is now called last thing before the end of the 
	  preemptive tick routine.

Changes from V2.6.1

	+ Replaced the sUsingPreemption variable with the configUSE_PREEMPTION
	  macro to be consistent with the later ports.

Changes from V4.0.1
	
	+ Add function prvSetTickFrequencyDefault() to set the DOS tick back to
	  its proper value when the scheduler exits. 
*/

#include <stdlib.h>
#include <stdio.h>
#include <i86.h>
#include <dos.h>
#include <setjmp.h>

#include "FreeRTOS.h"
#include "task.h"
#include "portasm.h"

/*-----------------------------------------------------------
 * Implementation of functions defined in portable.h for the industrial
 * PC port.
 *----------------------------------------------------------*/

/*lint -e950 Non ANSI reserved words okay in this file only. */

#define portTIMER_INT_NUMBER	0x08

/* Setup hardware for required tick interrupt rate. */
static void prvSetTickFrequency( unsigned portLONG ulTickRateHz );

/* Restore hardware to as it was prior to starting the scheduler. */
static void prvExitFunction( void );

/* Either chain to the DOS tick (which itself clears the PIC) or clear the PIC
directly.  We chain to the DOS tick as close as possible to the standard DOS
tick rate. */
static void prvPortResetPIC( void );

/* The tick ISR used depends on whether the preemptive or cooperative scheduler
is being used. */
#if configUSE_PREEMPTION == 1
	/* Tick service routine used by the scheduler when preemptive scheduling is
	being used. */
	static void __interrupt __far prvPreemptiveTick( void );
#else
	/* Tick service routine used by the scheduler when cooperative scheduling is 
	being used. */
	static void __interrupt __far prvNonPreemptiveTick( void );
#endif
/* Trap routine used by taskYIELD() to manually cause a context switch. */
static void __interrupt __far prvYieldProcessor( void );

/* Set the tick frequency back so the floppy drive works correctly when the
scheduler exits. */
static void prvSetTickFrequencyDefault( void );

/*lint -e956 File scopes necessary here. */

/* Used to signal when to chain to the DOS tick, and when to just clear the PIC ourselves. */
static portSHORT sDOSTickCounter;							

/* Set true when the vectors are set so the scheduler will service the tick. */
static portSHORT sSchedulerRunning = pdFALSE;				

/* Points to the original routine installed on the vector we use for manual context switches.  This is then used to restore the original routine during prvExitFunction(). */
static void ( __interrupt __far *pxOldSwitchISR )();		

/* Points to the original routine installed on the vector we use to chain to the DOS tick.  This is then used to restore the original routine during prvExitFunction(). */
static void ( __interrupt __far *pxOldSwitchISRPlus1 )();	

/* Used to restore the original DOS context when the scheduler is ended. */
static jmp_buf xJumpBuf;

/*lint +e956 */

/*-----------------------------------------------------------*/
portBASE_TYPE xPortStartScheduler( void )
{
pxISR pxOriginalTickISR;
	
	/* This is called with interrupts already disabled. */

	/* Remember what was on the interrupts we are going to use
	so we can put them back later if required. */
	pxOldSwitchISR = _dos_getvect( portSWITCH_INT_NUMBER );
	pxOriginalTickISR = _dos_getvect( portTIMER_INT_NUMBER );
	pxOldSwitchISRPlus1 = _dos_getvect( portSWITCH_INT_NUMBER + 1 );

	prvSetTickFrequency( configTICK_RATE_HZ );

	/* Put our manual switch (yield) function on a known
	vector. */
	_dos_setvect( portSWITCH_INT_NUMBER, prvYieldProcessor );

	/* Put the old tick on a different interrupt number so we can
	call it when we want. */
	_dos_setvect( portSWITCH_INT_NUMBER + 1, pxOriginalTickISR );

	#if configUSE_PREEMPTION == 1
	{		
		/* Put our tick switch function on the timer interrupt. */
		_dos_setvect( portTIMER_INT_NUMBER, prvPreemptiveTick );
	}
	#else
	{
		/* We want the timer interrupt to just increment the tick count. */
		_dos_setvect( portTIMER_INT_NUMBER, prvNonPreemptiveTick );
	}
	#endif

	/* Setup a counter that is used to call the DOS interrupt as close
	to it's original frequency as can be achieved given our chosen tick
	frequency. */
	sDOSTickCounter = portTICKS_PER_DOS_TICK;

	/* Clean up function if we want to return to DOS. */
	if( setjmp( xJumpBuf ) != 0 )
	{
		prvExitFunction();
		sSchedulerRunning = pdFALSE;
	}
	else
	{
		sSchedulerRunning = pdTRUE;

		/* Kick off the scheduler by setting up the context of the first task. */
		portFIRST_CONTEXT();
	}

	return sSchedulerRunning;
}
/*-----------------------------------------------------------*/

/* The tick ISR used depends on whether the preemptive or cooperative scheduler
is being used. */
#if configUSE_PREEMPTION == 1
	/* Tick service routine used by the scheduler when preemptive scheduling is
	being used. */
	static void __interrupt __far prvPreemptiveTick( void )
	{
		/* Get the scheduler to update the task states following the tick. */
		vTaskIncrementTick();

		/* Switch in the context of the next task to be run. */
		portSWITCH_CONTEXT();

		/* Reset the PIC ready for the next time. */
		prvPortResetPIC();
	}
#else
	static void __interrupt __far prvNonPreemptiveTick( void )
	{
		/* Same as preemptive tick, but the cooperative scheduler is being used
		so we don't have to switch in the context of the next task. */
		vTaskIncrementTick();
		prvPortResetPIC();
	}
#endif
/*-----------------------------------------------------------*/


static void __interrupt __far prvYieldProcessor( void )
{
	/* Switch in the context of the next task to be run. */
	portSWITCH_CONTEXT();
}
/*-----------------------------------------------------------*/

static void prvPortResetPIC( void )
{
	/* We are going to call the DOS tick interrupt at as close a
	frequency to the normal DOS tick as possible. */

	/* WE SHOULD NOT DO THIS IF YIELD WAS CALLED. */
	--sDOSTickCounter;
	if( sDOSTickCounter <= 0 )
	{
		sDOSTickCounter = ( portSHORT ) portTICKS_PER_DOS_TICK;
		__asm{ int	portSWITCH_INT_NUMBER + 1 };		 
	}
	else
	{
		/* Reset the PIC as the DOS tick is not being called to
		do it. */
		__asm
		{
			mov	al, 20H
			out 20H, al
		};
	}
}
/*-----------------------------------------------------------*/

void vPortEndScheduler( void )
{
	/* Jump back to the processor state prior to starting the
	scheduler.  This means we are not going to be using a
	task stack frame so the task can be deleted. */
	longjmp( xJumpBuf, 1 );
}
/*-----------------------------------------------------------*/

static void prvExitFunction( void )
{
void ( __interrupt __far *pxOriginalTickISR )();

	/* Interrupts should be disabled here anyway - but no 
	harm in making sure. */
	portDISABLE_INTERRUPTS();
	if( sSchedulerRunning == pdTRUE )
	{
		/* Set the DOS tick back onto the timer ticker. */
		pxOriginalTickISR = _dos_getvect( portSWITCH_INT_NUMBER + 1 );
		_dos_setvect( portTIMER_INT_NUMBER, pxOriginalTickISR );
		prvSetTickFrequencyDefault();

		/* Put back the switch interrupt routines that was in place
		before the scheduler started. */
		_dos_setvect( portSWITCH_INT_NUMBER, pxOldSwitchISR );
		_dos_setvect( portSWITCH_INT_NUMBER + 1, pxOldSwitchISRPlus1 );
	}
	/* The tick timer is back how DOS wants it.  We can re-enable
	interrupts without the scheduler being called. */
	portENABLE_INTERRUPTS();

	/* This will free up all the memory used by the scheduler.
	exiting back to dos with INT21 AH=4CH will do this anyway so
	it is not necessary to call this. */
	vTaskCleanUpResources(); 
}
/*-----------------------------------------------------------*/

static void prvSetTickFrequency( unsigned portLONG ulTickRateHz )
{
const unsigned portSHORT usPIT_MODE = ( unsigned portSHORT ) 0x43;
const unsigned portSHORT usPIT0 = ( unsigned portSHORT ) 0x40;
const unsigned portLONG ulPIT_CONST = ( unsigned portLONG ) 1193180;
const unsigned portSHORT us8254_CTR0_MODE3 = ( unsigned portSHORT ) 0x36;
unsigned portLONG ulOutput;

	/* Setup the 8245 to tick at the wanted frequency. */
	portOUTPUT_BYTE( usPIT_MODE, us8254_CTR0_MODE3 );
	ulOutput = ulPIT_CONST / ulTickRateHz;
   
	portOUTPUT_BYTE( usPIT0, ( unsigned portSHORT )( ulOutput & ( unsigned portLONG ) 0xff ) );
	ulOutput >>= 8;
	portOUTPUT_BYTE( usPIT0, ( unsigned portSHORT ) ( ulOutput & ( unsigned portLONG ) 0xff ) );
}
/*-----------------------------------------------------------*/

static void prvSetTickFrequencyDefault( void )
{
const unsigned portSHORT usPIT_MODE = ( unsigned portSHORT ) 0x43;
const unsigned portSHORT usPIT0 = ( unsigned portSHORT ) 0x40;
const unsigned portSHORT us8254_CTR0_MODE3 = ( unsigned portSHORT ) 0x36;

	portOUTPUT_BYTE( usPIT_MODE, us8254_CTR0_MODE3 );
	portOUTPUT_BYTE( usPIT0,0 );
	portOUTPUT_BYTE( usPIT0,0 );
}


/*lint +e950 */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲制服丝袜av| 欧美日韩一区精品| 欧美日韩免费观看一区二区三区 | 美女在线视频一区| 不卡电影免费在线播放一区| 91精品在线免费观看| 一区二区三区在线免费播放| 国产福利一区二区三区视频在线| 欧美视频一区二区三区四区 | 久久99这里只有精品| 在线精品观看国产| 亚洲色图色小说| 国产成人精品午夜视频免费 | 国产精品18久久久久久久久久久久 | 国产精品理论在线观看| 美女视频黄 久久| 欧美精选一区二区| 亚洲第一电影网| 欧美在线你懂得| 一区二区三区毛片| 欧美在线观看视频一区二区三区| 国产精品免费av| 成人精品电影在线观看| 中文成人综合网| 成人午夜激情视频| 日韩一区在线看| 91丨九色丨蝌蚪丨老版| 中文字幕一区二区三区av| 成人午夜视频网站| 亚洲天天做日日做天天谢日日欢| 波多野结衣欧美| 亚洲欧美在线高清| 在线亚洲人成电影网站色www| 亚洲欧美日韩精品久久久久| 色欧美片视频在线观看| 一区二区三区四区亚洲| 91国偷自产一区二区三区成为亚洲经典| 亚洲欧美一区二区久久| 日本韩国一区二区三区| 亚洲一区自拍偷拍| 日韩一区二区三区在线视频| 麻豆精品国产传媒mv男同 | 国产福利精品导航| 国产精品视频九色porn| 91美女在线观看| 午夜精品久久久久影视| 日韩欧美高清一区| 国产在线播放一区二区三区| 国产精品女主播av| 欧美日韩精品一区二区在线播放| 日本不卡免费在线视频| 国产亚洲一二三区| 91蜜桃免费观看视频| 视频一区在线视频| 国产亚洲短视频| 在线观看国产91| 精品一区二区三区影院在线午夜| 久久精品水蜜桃av综合天堂| 色视频成人在线观看免| 美女www一区二区| 国产精品久久夜| 在线播放91灌醉迷j高跟美女| 国产美女精品人人做人人爽| 亚洲丝袜精品丝袜在线| 欧美一区二区在线不卡| 成人看片黄a免费看在线| 亚洲福利视频一区二区| 国产欧美日韩三级| 欧美日韩小视频| 成人一区二区在线观看| 五月天一区二区| 中文字幕在线观看不卡视频| 51午夜精品国产| 99精品久久免费看蜜臀剧情介绍| 日本不卡免费在线视频| 亚洲欧洲日产国码二区| 欧美精品一区二区在线观看| 欧美亚洲愉拍一区二区| 国产91在线观看| 男男gaygay亚洲| 亚洲综合自拍偷拍| 国产清纯美女被跳蛋高潮一区二区久久w| 欧美性猛交xxxx黑人交| 不卡的av中国片| 国产河南妇女毛片精品久久久| 亚洲成人7777| 亚洲靠逼com| 国产精品丝袜一区| 久久久久88色偷偷免费| 日韩一区二区三区视频在线观看| 在线视频欧美精品| av男人天堂一区| 丰满少妇在线播放bd日韩电影| 美日韩一区二区三区| 日韩精品五月天| 亚洲国产另类av| 亚洲一区二区精品久久av| 亚洲欧美日韩小说| 国产精品国产自产拍高清av| 国产情人综合久久777777| 精品粉嫩超白一线天av| 精品三级av在线| 日韩一区二区中文字幕| 日韩欧美中文字幕精品| 欧美挠脚心视频网站| 欧美日韩国产乱码电影| 欧美日韩一区二区三区高清| 色综合欧美在线| 一本色道久久加勒比精品| 97精品国产97久久久久久久久久久久| 高清在线成人网| av在线播放成人| 色噜噜狠狠色综合中国 | av电影天堂一区二区在线观看| 成人精品国产一区二区4080| 成人不卡免费av| 97久久精品人人做人人爽50路| 91老师片黄在线观看| 99久久99久久久精品齐齐| 91免费国产在线| 欧洲激情一区二区| 欧美日韩免费一区二区三区| 91精品国产综合久久久久久久 | 中文字幕亚洲欧美在线不卡| 中文字幕一区日韩精品欧美| 亚洲免费在线观看视频| 亚洲国产毛片aaaaa无费看 | 91亚洲精品久久久蜜桃| 91九色最新地址| 91精品国产日韩91久久久久久| 日韩你懂的在线观看| 久久久高清一区二区三区| 国产精品污网站| 亚洲一二三四久久| 蜜臀av一级做a爰片久久| 国产麻豆视频一区二区| 99国产精品久久久久久久久久久| 精品1区2区3区| 2017欧美狠狠色| 中文字幕在线免费不卡| 日韩精品亚洲一区二区三区免费| 韩国av一区二区| 色噜噜偷拍精品综合在线| 欧美一级夜夜爽| 国产精品乱子久久久久| 午夜电影久久久| 国产成人丝袜美腿| 欧美亚一区二区| 久久精品人人爽人人爽| 亚洲网友自拍偷拍| 黄色日韩三级电影| 欧美视频在线一区| 国产偷国产偷亚洲高清人白洁| 亚洲一区二区三区四区不卡| 国产精品资源在线| 欧美日韩免费电影| 国产精品初高中害羞小美女文| 婷婷中文字幕综合| 成人激情免费电影网址| 日韩欧美成人一区| 亚洲三级免费观看| 韩国成人福利片在线播放| 欧美色大人视频| 欧美—级在线免费片| 狂野欧美性猛交blacked| 色视频成人在线观看免| 久久影院午夜论| 日韩不卡一二三区| 色狠狠av一区二区三区| 国产精品欧美久久久久一区二区| 免费在线观看视频一区| 欧美色综合网站| 18成人在线观看| 波多野结衣中文一区| 久久美女高清视频| 日本aⅴ精品一区二区三区| 在线亚洲精品福利网址导航| 中文字幕在线视频一区| 国产一区二区伦理片| 日韩女优制服丝袜电影| 日韩精品亚洲专区| 欧美日韩国产综合一区二区| 亚洲免费在线视频一区 二区| 成人激情校园春色| 国产精品三级电影| 国产麻豆精品theporn| 精品动漫一区二区三区在线观看| 日韩精品久久久久久| 欧美精品丝袜久久久中文字幕| 亚洲精品免费在线| 91成人在线观看喷潮| 一区二区三区在线免费| 91久久精品日日躁夜夜躁欧美| 亚洲免费在线电影| 欧美综合视频在线观看| 午夜精品一区在线观看| 91麻豆精品久久久久蜜臀| 青青草国产精品97视觉盛宴| 宅男噜噜噜66一区二区66| 蜜臂av日日欢夜夜爽一区|