亚洲欧美第一页_禁久久精品乱码_粉嫩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 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 <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 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 portBASE_TYPE xSchedulerRunning = 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 );

	/* The ISR used depends on whether the preemptive or cooperative
	scheduler is being used. */
	#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();
		xSchedulerRunning = pdFALSE;
	}
	else
	{
		xSchedulerRunning = pdTRUE;

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

	return xSchedulerRunning;
}
/*-----------------------------------------------------------*/

/* The ISR used depends on whether the preemptive or cooperative
scheduler is being used. */
#if( configUSE_PREEMPTION == 1 )
	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( xSchedulerRunning == 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 ) 1193180UL;
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| 国产精品久久久久久久久果冻传媒| 日韩欧美你懂的| 中文字幕日本乱码精品影院| 全国精品久久少妇| 色婷婷精品大在线视频| 国产偷国产偷亚洲高清人白洁| 偷拍一区二区三区四区| 99热在这里有精品免费| 久久久久九九视频| 丝袜美腿一区二区三区| 91福利区一区二区三区| 中文字幕第一页久久| 毛片av中文字幕一区二区| 在线观看免费视频综合| |精品福利一区二区三区| 国产精品亚洲综合一区在线观看| 欧美精品国产精品| 亚洲一区在线观看视频| av亚洲产国偷v产偷v自拍| 久久亚洲精华国产精华液| 日本中文字幕一区| 欧美日韩一区在线观看| 亚洲美腿欧美偷拍| 9久草视频在线视频精品| 国产欧美中文在线| 国产精品一区二区久久精品爱涩 | 亚洲国产精品综合小说图片区| 成人黄色软件下载| 欧美激情在线一区二区| 国产精品一区一区| 欧美国产欧美综合| 99久久精品免费精品国产| 国产精品久久久爽爽爽麻豆色哟哟 | 色妞www精品视频| 中文字幕在线观看不卡| 99在线视频精品| 亚洲三级在线观看| 色一情一乱一乱一91av| 亚洲精品成人少妇| 欧美在线一二三| 偷窥国产亚洲免费视频| 欧美一区二区三区性视频| 秋霞电影网一区二区| 精品国产免费人成电影在线观看四季| 美女视频一区二区三区| 久久久久国产精品厨房| 成人午夜看片网址| 又紧又大又爽精品一区二区| 欧美在线观看一二区| 日本欧美一区二区三区乱码| 久久看人人爽人人| 91色.com| 日本欧美久久久久免费播放网| 欧美zozozo| 不卡一区二区三区四区| 一区二区三区精品在线| 日韩一区二区精品在线观看| 国产福利91精品一区二区三区| 1000精品久久久久久久久| 制服视频三区第一页精品| 国产乱子伦视频一区二区三区| 国产精品乱码人人做人人爱| 欧美日韩亚洲综合| 国产在线视频不卡二| 专区另类欧美日韩| 欧美一级在线观看| 91亚洲精品久久久蜜桃网站 | 国产福利一区二区| 亚洲一卡二卡三卡四卡| 亚洲精品一区二区精华| 色综合久久久久| 韩国一区二区在线观看| 亚洲一区在线视频观看| 久久精品欧美日韩| 在线不卡a资源高清| 波多野结衣亚洲| 日本aⅴ精品一区二区三区| 亚洲国产精品t66y| 日韩欧美国产一区二区在线播放| 91丨porny丨在线| 久久国产精品第一页| 亚洲已满18点击进入久久| 久久精品男人的天堂| 7777女厕盗摄久久久| 91在线视频官网| 国产一区二区三区黄视频 | 亚洲乱码国产乱码精品精的特点 | 欧美在线|欧美| 成人美女在线观看| 国内成人精品2018免费看| 亚洲成人av中文| 亚洲素人一区二区| 中文字幕乱码久久午夜不卡 | 国产成人亚洲综合色影视| 首页亚洲欧美制服丝腿| 亚洲色图19p| 国产精品久久久久久久久晋中| 欧美成人伊人久久综合网| 欧美日韩国产一二三| 日本韩国一区二区| 成a人片国产精品| 国产成人自拍网| 国产精选一区二区三区| 美女尤物国产一区| 美腿丝袜亚洲综合| 久久国产精品一区二区| 免费成人在线观看视频| 琪琪久久久久日韩精品| 天天做天天摸天天爽国产一区| 亚洲欧美激情小说另类| 亚洲免费观看视频| 一区二区三区视频在线看| 成人免费小视频| 一区二区三区美女视频| 亚洲在线视频网站| 亚洲国产精品一区二区www在线| 一区二区三区在线高清| 亚洲成a人片在线观看中文| 亚洲大片在线观看| 蜜臀av性久久久久蜜臀aⅴ | 久久亚洲综合色一区二区三区| 欧美一区二区三级| 亚洲精品一线二线三线无人区| 欧美大白屁股肥臀xxxxxx| 精品免费一区二区三区| 精品国产三级a在线观看| 国产日产欧产精品推荐色 | 久久久一区二区三区| 欧美一级欧美三级| 久久久久国产精品麻豆| 亚洲天堂中文字幕| 亚洲第一成年网| 国模娜娜一区二区三区| 不卡的电视剧免费网站有什么| 91免费视频网| 5566中文字幕一区二区电影| 日韩情涩欧美日韩视频| 久久精品视频在线免费观看| 亚洲欧洲三级电影| 舔着乳尖日韩一区| 国产99久久久久| 欧美性感一类影片在线播放| 日韩免费高清视频| 亚洲人吸女人奶水| 麻豆精品一区二区三区| 成人精品在线视频观看| 欧美日韩一级片在线观看| 2017欧美狠狠色| 亚洲一区二区成人在线观看| 免费看日韩精品| 91香蕉国产在线观看软件| 91精品国产综合久久久久久漫画| 国产色91在线| 亚洲18色成人| 99热在这里有精品免费| 日韩亚洲电影在线| 亚洲欧美日韩综合aⅴ视频| 麻豆91在线看| 欧美在线免费观看亚洲| 久久久www成人免费毛片麻豆| 亚洲国产精品人人做人人爽| 国产成人精品免费看| 欧美欧美欧美欧美| 中文字幕一区二区不卡| 国产在线乱码一区二区三区| 日本乱人伦aⅴ精品| 国产欧美一区二区精品性色超碰| 性做久久久久久免费观看欧美| 国产一区二区三区高清播放| 精品视频在线免费看| 中文字幕亚洲综合久久菠萝蜜| 久久国产麻豆精品| 91麻豆精品国产91久久久| 一区二区三区不卡视频在线观看| 成人小视频免费在线观看| 日韩欧美亚洲另类制服综合在线| 亚洲一二三专区| 91啦中文在线观看| 国产精品午夜在线观看| 国产一二三精品| 精品精品欲导航| 毛片av一区二区| 欧美大肚乱孕交hd孕妇| 亚洲午夜私人影院| 91国偷自产一区二区三区成为亚洲经典 | 一区二区在线看| 成人爱爱电影网址| 久久九九影视网| 国产成人无遮挡在线视频| 精品久久久久久久久久久久久久久久久 | 一区在线观看免费| 成人av免费网站| 国产精品不卡在线| 波多野结衣的一区二区三区| 国产精品视频观看| 91麻豆免费视频| 亚洲综合在线第一页| 在线免费不卡视频| 午夜精品久久久久久不卡8050|