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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? port.c

?? FreeRTOS V4.2.1,增加了AVR32 UC3 和 LPC2368 的支持
?? C
字號:
/*This file has been prepared for Doxygen automatic documentation generation.*/
/*! \file *********************************************************************
 *
 * \brief FreeRTOS port source for AVR32 UC3.
 *
 * - Compiler:           IAR EWAVR32
 * - Supported devices:  All AVR32 devices can be used.
 * - AppNote:
 *
 * \author               Atmel Corporation: http://www.atmel.com \n
 *                       Support email: avr32@atmel.com
 *
 *****************************************************************************/

/*
	FreeRTOS.org V4.2.1 - Copyright (C) 2003-2007 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.

	Also see http://www.SafeRTOS.com for an IEC 61508 compliant version along
	with commercial development and support options.
	***************************************************************************
*/


/* Scheduler includes. */
#include "FreeRTOS.h"

/* Get rid of inline in task.h. */
#include "task.h"

/* AVR32 UC3 includes. */
#include <avr32/iouc3a0512.h>
#include <intrinsics.h>
#include "gpio.h"

#if configDBG
	#include "usart.h"
#endif

#if( configTICK_USE_TC==1 )
	#include "tc.h"
#endif


/* Constants required to setup the task context. */
#define portINITIAL_SR            ( ( portSTACK_TYPE ) 0x00400000 ) /* AVR32 : [M2:M0]=001 I1M=0 I0M=0, GM=0 */
#define portINSTRUCTION_SIZE      ( ( portSTACK_TYPE ) 0 )

/* Each task maintains its own critical nesting variable. */
#define portNO_CRITICAL_NESTING   ( ( unsigned portLONG ) 0 )
volatile unsigned portLONG ulCriticalNesting = 9999UL;

#if( configTICK_USE_TC==0 )
	static void prvScheduleNextTick( void );
#endif
/*-----------------------------------------------------------*/

/*
 * Low-level initialization routine called during startup, before the main
 * function.
 */
int __low_level_init(void)
{
	#if configHEAP_INIT
		#pragma segment = "HEAP"
		portBASE_TYPE *pxMem;
	#endif

	/* Enable exceptions. */
	ENABLE_ALL_EXCEPTIONS();

	/* Initialize interrupt handling. */
	INTC_init_interrupts();

	#if configHEAP_INIT
	{
		/* Initialize the heap used by malloc. */
		for( pxMem = __segment_begin( "HEAP" ); pxMem < ( portBASE_TYPE * ) __segment_end( "HEAP" ); )
		{
			*pxMem++ = 0xA5A5A5A5;
		}
	}
	#endif

	/* Code section present if and only if the debug trace is activated. */
	#if configDBG
	{
		static const usart_options_t usart_opt =
		{
		  .baudrate = configDBG_USART_BAUDRATE,
		  .charlength = 8,
		  .paritytype = USART_NO_PARITY,
		  .stopbits = USART_1_STOPBIT,
		  .channelmode = USART_MODE_NORMAL
		};

		/* Initialize the USART used for the debug trace with the configured parameters. */
		extern volatile avr32_usart_t *volatile stdio_usart_base;
		stdio_usart_base = configDBG_USART;
		gpio_enable_module_pin(configDBG_USART_RX_PIN, configDBG_USART_RX_FUNCTION);
		gpio_enable_module_pin(configDBG_USART_TX_PIN, configDBG_USART_TX_FUNCTION);
		usart_init_rs232(configDBG_USART, &usart_opt, configCPU_CLOCK_HZ);
	}
	#endif

	/* Request initialization of data segments. */
	return 1;
}
/*-----------------------------------------------------------*/

/* Added as there is no such function in FreeRTOS. */
void *pvPortRealloc( void *pv, size_t xWantedSize )
{
void *pvReturn;

	vTaskSuspendAll();
	{
		pvReturn = realloc( pv, xWantedSize );
	}
	xTaskResumeAll();

	return pvReturn;
}
/*-----------------------------------------------------------*/

/* The cooperative scheduler requires a normal IRQ service routine to
simply increment the system tick. */
/* The preemptive scheduler is defined as "naked" as the full context is saved
on entry as part of the context switch. */
#pragma shadow_registers = full   // Naked.
static void vTick( void )
{
	/* Save the context of the interrupted task. */
	portSAVE_CONTEXT_OS_INT();

	/* Schedule the COUNT&COMPARE match interrupt in (configCPU_CLOCK_HZ/configTICK_RATE_HZ)
	clock cycles from now. */
	#if( configTICK_USE_TC==1 )
		/* Clear the interrupt flag. */
		AVR32_TC.channel[configTICK_TC_CHANNEL].sr;
	#else
		prvScheduleNextTick();
	#endif
	
	/* Because FreeRTOS is not supposed to run with nested interrupts, put all OS
	calls in a critical section . */
	portENTER_CRITICAL();
		vTaskIncrementTick();
	portEXIT_CRITICAL();

	/* Restore the context of the "elected task". */
	portRESTORE_CONTEXT_OS_INT();
}
/*-----------------------------------------------------------*/

#pragma shadow_registers = full   // Naked.
void SCALLYield( void )
{
	/* Save the context of the interrupted task. */
	portSAVE_CONTEXT_SCALL();
	vTaskSwitchContext();
	portRESTORE_CONTEXT_SCALL();
}
/*-----------------------------------------------------------*/

/* The code generated by the GCC compiler uses the stack in different ways at
different optimisation levels.  The interrupt flags can therefore not always
be saved to the stack.  Instead the critical section nesting level is stored
in a variable, which is then saved as part of the stack context. */
void vPortEnterCritical( void )
{
	/* Disable interrupts */
	portDISABLE_INTERRUPTS();

	/* Now interrupts are disabled ulCriticalNesting can be accessed
	 directly.  Increment ulCriticalNesting to keep a count of how many times
	 portENTER_CRITICAL() has been called. */
	ulCriticalNesting++;
}
/*-----------------------------------------------------------*/

void vPortExitCritical( void )
{
	if(ulCriticalNesting > portNO_CRITICAL_NESTING)
	{
		ulCriticalNesting--;
		if( ulCriticalNesting == portNO_CRITICAL_NESTING )
		{
			/* Enable all interrupt/exception. */
			portENABLE_INTERRUPTS();
		}
	}
}
/*-----------------------------------------------------------*/

/* Setup the timer to generate the tick interrupts. */
static void prvSetupTimerInterrupt( void );
/*-----------------------------------------------------------*/

/*
 * Initialise the stack of a task to look exactly as if a call to
 * portSAVE_CONTEXT had been called.
 *
 * See header file for description.
 */
portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters )
{
	/* Setup the initial stack of the task.  The stack is set exactly as
	expected by the portRESTORE_CONTEXT() macro. */

	/* When the task starts, it will expect to find the function parameter in R12. */
	pxTopOfStack--;
	*pxTopOfStack-- = ( portSTACK_TYPE ) 0x08080808;					/* R8 */
	*pxTopOfStack-- = ( portSTACK_TYPE ) 0x09090909;					/* R9 */
	*pxTopOfStack-- = ( portSTACK_TYPE ) 0x0A0A0A0A;					/* R10 */
	*pxTopOfStack-- = ( portSTACK_TYPE ) 0x0B0B0B0B;					/* R11 */
	*pxTopOfStack-- = ( portSTACK_TYPE ) pvParameters;					/* R12 */
	*pxTopOfStack-- = ( portSTACK_TYPE ) 0xDEADBEEF;					/* R14/LR */
	*pxTopOfStack-- = ( portSTACK_TYPE ) pxCode + portINSTRUCTION_SIZE; /* R15/PC */
	*pxTopOfStack-- = ( portSTACK_TYPE ) portINITIAL_SR;				/* SR */
	*pxTopOfStack-- = ( portSTACK_TYPE ) 0xFF0000FF;					/* R0 */
	*pxTopOfStack-- = ( portSTACK_TYPE ) 0x01010101;					/* R1 */
	*pxTopOfStack-- = ( portSTACK_TYPE ) 0x02020202;					/* R2 */
	*pxTopOfStack-- = ( portSTACK_TYPE ) 0x03030303;					/* R3 */
	*pxTopOfStack-- = ( portSTACK_TYPE ) 0x04040404;					/* R4 */
	*pxTopOfStack-- = ( portSTACK_TYPE ) 0x05050505;					/* R5 */
	*pxTopOfStack-- = ( portSTACK_TYPE ) 0x06060606;					/* R6 */
	*pxTopOfStack-- = ( portSTACK_TYPE ) 0x07070707;					/* R7 */
	*pxTopOfStack = ( portSTACK_TYPE ) portNO_CRITICAL_NESTING;			/* ulCriticalNesting */

	return pxTopOfStack;
}
/*-----------------------------------------------------------*/

portBASE_TYPE xPortStartScheduler( void )
{
	/* Start the timer that generates the tick ISR.  Interrupts are disabled
	here already. */
	prvSetupTimerInterrupt();

	/* Start the first task. */
	portRESTORE_CONTEXT();

	/* Should not get here! */
	return 0;
}
/*-----------------------------------------------------------*/

void vPortEndScheduler( void )
{
	/* It is unlikely that the AVR32 port will require this function as there
	is nothing to return to.  */
}
/*-----------------------------------------------------------*/

/* Schedule the COUNT&COMPARE match interrupt in (configCPU_CLOCK_HZ/configTICK_RATE_HZ)
clock cycles from now. */
#if( configTICK_USE_TC==0 )
	static void prvScheduleNextTick(void)
	{
		unsigned long lCountVal, lCompareVal;

		lCountVal = Get_system_register(AVR32_COUNT);
		lCompareVal = lCountVal + (configCPU_CLOCK_HZ/configTICK_RATE_HZ);
		Set_system_register(AVR32_COMPARE, lCompareVal);
	}
#endif
/*-----------------------------------------------------------*/

/* Setup the timer to generate the tick interrupts. */
static void prvSetupTimerInterrupt(void)
{
	#if( configTICK_USE_TC==1 )

		volatile avr32_tc_t *tc = &AVR32_TC;

		// Options for waveform genration.
		tc_waveform_opt_t waveform_opt =
		{
		.channel  = configTICK_TC_CHANNEL,             /* Channel selection. */

		.bswtrg   = TC_EVT_EFFECT_NOOP,                /* Software trigger effect on TIOB. */
		.beevt    = TC_EVT_EFFECT_NOOP,                /* External event effect on TIOB. */
		.bcpc     = TC_EVT_EFFECT_NOOP,                /* RC compare effect on TIOB. */
		.bcpb     = TC_EVT_EFFECT_NOOP,                /* RB compare effect on TIOB. */

		.aswtrg   = TC_EVT_EFFECT_NOOP,                /* Software trigger effect on TIOA. */
		.aeevt    = TC_EVT_EFFECT_NOOP,                /* External event effect on TIOA. */
		.acpc     = TC_EVT_EFFECT_NOOP,                /* RC compare effect on TIOA: toggle. */
		.acpa     = TC_EVT_EFFECT_NOOP,                /* RA compare effect on TIOA: toggle (other possibilities are none, set and clear). */

		.wavsel   = TC_WAVEFORM_SEL_UP_MODE_RC_TRIGGER,/* Waveform selection: Up mode without automatic trigger on RC compare. */
		.enetrg   = FALSE,                             /* External event trigger enable. */
		.eevt     = 0,                                 /* External event selection. */
		.eevtedg  = TC_SEL_NO_EDGE,                    /* External event edge selection. */
		.cpcdis   = FALSE,                             /* Counter disable when RC compare. */
		.cpcstop  = FALSE,                             /* Counter clock stopped with RC compare. */

		.burst    = FALSE,                             /* Burst signal selection. */
		.clki     = FALSE,                             /* Clock inversion. */
		.tcclks   = TC_CLOCK_SOURCE_TC2                /* Internal source clock 2. */
		};

		tc_interrupt_t tc_interrupt =
		{
			.etrgs=0,
			.ldrbs=0,
			.ldras=0,
			.cpcs =1,
			.cpbs =0,
			.cpas =0,
			.lovrs=0,
			.covfs=0,
		};

	#endif

	/* Disable all interrupt/exception. */
	portDISABLE_INTERRUPTS();

	/* Register the compare interrupt handler to the interrupt controller and
	enable the compare interrupt. */

	#if( configTICK_USE_TC==1 )
	{
		INTC_register_interrupt((__int_handler)&vTick, configTICK_TC_IRQ, INT0);

		/* Initialize the timer/counter. */
		tc_init_waveform(tc, &waveform_opt);

		/* Set the compare triggers.
		Remember TC counter is 16-bits, so counting second is not possible!
		That's why we configure it to count ms. */
		tc_write_rc( tc, configTICK_TC_CHANNEL, ( configPBA_CLOCK_HZ / 4) / 1000 );

		tc_configure_interrupts( tc, configTICK_TC_CHANNEL, &tc_interrupt );

		/* Start the timer/counter. */
		tc_start(tc, configTICK_TC_CHANNEL);
	}
	#else
	{
		INTC_register_interrupt((__int_handler)&vTick, AVR32_CORE_COMPARE_IRQ, INT0);
		prvScheduleNextTick();
	}
	#endif
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲综合久久av| 91老师片黄在线观看| 国产成人av在线影院| 日本精品一区二区三区高清| 欧美一区二区福利视频| 国产精品全国免费观看高清 | 日韩va欧美va亚洲va久久| 国产一区不卡在线| 精品视频在线看| 中文字幕不卡三区| 麻豆精品精品国产自在97香蕉| 91免费小视频| 国产欧美一区二区精品仙草咪| 亚洲成av人片观看| av高清不卡在线| 亚洲精品在线免费观看视频| 亚洲一区二区三区在线看| 国产在线视频不卡二| 欧美日韩激情一区二区| 中文字幕一区二区三区不卡 | 激情五月激情综合网| 欧美影片第一页| 一区在线观看视频| 国产成人av影院| 久久亚洲综合色一区二区三区| 水野朝阳av一区二区三区| 不卡一区在线观看| 久久久www成人免费毛片麻豆 | 蜜桃视频免费观看一区| 色网站国产精品| 亚洲欧洲另类国产综合| 岛国一区二区在线观看| 26uuu色噜噜精品一区二区| 午夜久久久影院| 欧美色区777第一页| 亚洲美女电影在线| 色综合亚洲欧洲| 亚洲激情图片一区| 成人涩涩免费视频| 国产农村妇女毛片精品久久麻豆| 国产一区在线观看麻豆| 欧美成人女星排行榜| 日韩高清欧美激情| 欧美一级二级三级蜜桃| 免费欧美在线视频| 日韩欧美卡一卡二| 久久狠狠亚洲综合| 久久精品人人做人人爽97| 国产精品一区在线观看你懂的| 精品国产网站在线观看| 国产一区二区在线视频| 久久精品视频免费| 成人app在线| 一区二区三区中文字幕电影| 在线观看日韩高清av| 亚洲最新在线观看| 欧美一区二区三区性视频| 久久99久久久久| 2023国产一二三区日本精品2022| 国产精品伊人色| 国产精品久久久久久久浪潮网站 | 国产精品欧美一区喷水| av不卡在线观看| 亚洲精品国产成人久久av盗摄| 日本韩国一区二区| 丝袜诱惑制服诱惑色一区在线观看| 91精品一区二区三区久久久久久| 韩国av一区二区三区| 中文幕一区二区三区久久蜜桃| 色屁屁一区二区| 玖玖九九国产精品| 国产精品蜜臀在线观看| 欧亚洲嫩模精品一区三区| 日韩电影在线一区二区| 国产女人18毛片水真多成人如厕| 97se亚洲国产综合在线| 三级在线观看一区二区| 久久久无码精品亚洲日韩按摩| 99久久精品免费看国产免费软件| 亚洲国产一区二区三区青草影视| 日韩欧美中文字幕一区| 9l国产精品久久久久麻豆| 亚洲aⅴ怡春院| 久久九九久久九九| 欧美日韩一区 二区 三区 久久精品| 麻豆视频观看网址久久| 一区视频在线播放| 日韩精品在线一区二区| 91社区在线播放| 经典三级一区二区| 一个色综合网站| 久久久www成人免费毛片麻豆| 在线日韩国产精品| 国产宾馆实践打屁股91| 亚洲一区免费观看| 中文字幕电影一区| 日韩免费福利电影在线观看| 97aⅴ精品视频一二三区| 久久国产尿小便嘘嘘| 亚洲精品美国一| 欧美国产日韩亚洲一区| 91精品国产综合久久久蜜臀粉嫩| 99re这里只有精品首页| 国产一区视频网站| 丝袜美腿亚洲综合| 玉米视频成人免费看| 日本一区二区三区在线不卡| 欧美一区二区三区公司| 欧美三区在线视频| 99精品欧美一区| 国产一区二区三区四| 麻豆精品精品国产自在97香蕉| 亚洲一二三级电影| 亚洲女人小视频在线观看| 国产精品视频第一区| 久久色成人在线| 欧美videossexotv100| 欧美精品第1页| 欧美色手机在线观看| 91极品视觉盛宴| 色综合久久久久网| 成人午夜私人影院| 国产成人av网站| 国产不卡视频在线播放| 国产成人免费9x9x人网站视频| 国内精品嫩模私拍在线| 久久精品国产精品青草| 青青国产91久久久久久| 青娱乐精品在线视频| 日本不卡不码高清免费观看| 日韩高清欧美激情| 美女看a上一区| 久久99精品国产| 国产精品一区2区| 国产黄色成人av| heyzo一本久久综合| www.色综合.com| 91麻豆免费在线观看| 欧美亚洲国产怡红院影院| 欧美日韩一二三| 91精品蜜臀在线一区尤物| 欧美一级xxx| 精品国产成人在线影院| 久久免费视频色| 国产精品私人影院| 一区二区三区在线观看国产| 亚洲午夜影视影院在线观看| 丝瓜av网站精品一区二区| 久久电影网站中文字幕| 国产一区在线观看视频| 成人午夜免费视频| 成人av午夜影院| 在线亚洲人成电影网站色www| 欧美日韩一区二区三区四区| 日韩三级av在线播放| 久久久美女毛片| 亚洲欧洲精品一区二区三区| 亚洲成年人网站在线观看| 日本系列欧美系列| 国产精品一二三区| 色悠悠亚洲一区二区| 91精品国产91久久综合桃花| 久久综合久色欧美综合狠狠| 国产精品理论在线观看| 亚洲国产sm捆绑调教视频 | 精品国产伦一区二区三区观看体验 | 日韩经典中文字幕一区| 国产尤物一区二区| 91美女在线视频| 精品久久久网站| 亚洲日本丝袜连裤袜办公室| 视频一区二区三区在线| 高清不卡一区二区| 欧美人与性动xxxx| 国产精品乱码一区二区三区软件| 亚洲国产综合色| 国产91精品精华液一区二区三区 | 欧洲精品在线观看| 精品久久人人做人人爱| 一区二区三区中文字幕精品精品 | 日韩电影免费一区| 高清在线观看日韩| 91精品国产色综合久久ai换脸| 国产精品色哟哟| 久久 天天综合| 精品视频在线视频| 国产精品每日更新在线播放网址| 婷婷国产在线综合| 91网站视频在线观看| 久久久亚洲国产美女国产盗摄 | 国产婷婷色一区二区三区在线| 亚洲一二三四久久| 粉嫩绯色av一区二区在线观看| 欧美另类高清zo欧美| 国产精品久久免费看| 久久91精品国产91久久小草| 欧美三级一区二区| 亚洲人成亚洲人成在线观看图片 | 成人午夜激情片| 久久伊人蜜桃av一区二区|