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

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

?? port.c

?? freertosV4.40 是一種small的嵌入式系統。利于嵌入式開好者入門學習嵌入式操作系統。通過對于源碼的學習可以很好的掌握freertos的運行機制。
?? C
字號:
/*
	FreeRTOS.org V4.4.0 - 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.
	***************************************************************************
*/

/*
	Changes between V4.0.0 and V4.0.1

	+ Reduced the code used to setup the initial stack frame.
	+ The kernel no longer has to install or handle the fault interrupt.
*/

/*-----------------------------------------------------------
 * Implementation of functions defined in portable.h for the ARM CM3 port.
 *----------------------------------------------------------*/

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

/* Constants required to manipulate the NVIC. */
#define portNVIC_SYSTICK_CTRL		( ( volatile unsigned portLONG *) 0xe000e010 )
#define portNVIC_SYSTICK_LOAD		( ( volatile unsigned portLONG *) 0xe000e014 )
#define portNVIC_INT_CTRL			( ( volatile unsigned portLONG *) 0xe000ed04 )
#define portNVIC_SYSPRI2			( ( volatile unsigned portLONG *) 0xe000ed20 )
#define portNVIC_SYSPRI1			( ( volatile unsigned portLONG *) 0xe000ed1c )
#define portNVIC_HARD_FAULT_STATUS	0xe000ed2c
#define portNVIC_FORCED_FAULT_BIT	0x40000000
#define portNVIC_SYSTICK_CLK		0x00000004
#define portNVIC_SYSTICK_INT		0x00000002
#define portNVIC_SYSTICK_ENABLE		0x00000001
#define portNVIC_PENDSVSET			0x10000000
#define portNVIC_PENDSV_PRI			0x00ff0000
#define portNVIC_SVCALL_PRI			0xff000000
#define portNVIC_SYSTICK_PRI		0xff000000

/* Constants required to set up the initial stack. */
#define portINITIAL_XPSR			( 0x01000000 )

/* Each task maintains its own interrupt status in the critical nesting
variable. */
unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa;

/* Constant hardware definitions to assist asm code. */
const unsigned long ulHardFaultStatus = portNVIC_HARD_FAULT_STATUS;
const unsigned long ulNVICIntCtrl = ( unsigned long ) 0xe000ed04;
const unsigned long ulForceFaultBit = portNVIC_FORCED_FAULT_BIT;
const unsigned long ulPendSVBit = portNVIC_PENDSVSET;

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

/*
 * Set the MSP/PSP to a known value.
 */
void prvSetMSP( unsigned long ulValue );
void prvSetPSP( unsigned long ulValue );

/*-----------------------------------------------------------*/

/* 
 * See header file for description. 
 */
portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters )
{
	/* Simulate the stack frame as it would be created by a context switch
	interrupt. */
	*pxTopOfStack = portINITIAL_XPSR;	/* xPSR */
	pxTopOfStack--;
	*pxTopOfStack = ( portSTACK_TYPE ) pxCode;	/* PC */
	pxTopOfStack--;
	*pxTopOfStack = 0xfffffffd;	/* LR */
	pxTopOfStack -= 5;	/* R12, R3, R2 and R1. */
	*pxTopOfStack = ( portSTACK_TYPE ) pvParameters;	/* R0 */
	pxTopOfStack -= 9;	/* R11, R10, R9, R8, R7, R6, R5 and R4. */
	*pxTopOfStack = 0x00000000; /* uxCriticalNesting. */

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

__asm void prvSetPSP( unsigned long ulValue )
{
	PRESERVE8
	msr psp, r0
	bx lr;
}
/*-----------------------------------------------------------*/

__asm void prvSetMSP( unsigned long ulValue )
{
	PRESERVE8
	msr msp, r0
	bx lr;
}
/*-----------------------------------------------------------*/

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

	/* Make PendSV, CallSV and SysTick the lowest priority interrupts. */
	*(portNVIC_SYSPRI2) |= portNVIC_PENDSV_PRI;
	*(portNVIC_SYSPRI2) |= portNVIC_SYSTICK_PRI;
	*(portNVIC_SYSPRI1) |= portNVIC_SVCALL_PRI;

	/* Start the first task. */
	prvSetPSP( 0 );
	prvSetMSP( *((unsigned portLONG *) 0 ) );
	*(portNVIC_INT_CTRL) |= portNVIC_PENDSVSET;

	/* Enable interrupts */
	portENABLE_INTERRUPTS();

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

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

void vPortYieldFromISR( void )
{
	/* Set a PendSV to request a context switch. */
	*(portNVIC_INT_CTRL) |= portNVIC_PENDSVSET;	
	portENABLE_INTERRUPTS();
}
/*-----------------------------------------------------------*/

__asm void vPortDisableInterrupts( void )
{
	PRESERVE8
	cpsid i;
	bx lr;
}
/*-----------------------------------------------------------*/

__asm void vPortEnableInterrupts( void )
{
	PRESERVE8
	cpsie i;
	bx lr;
}
/*-----------------------------------------------------------*/

void vPortEnterCritical( void )
{
	vPortDisableInterrupts();
	uxCriticalNesting++;
}
/*-----------------------------------------------------------*/

void vPortExitCritical( void )
{
	uxCriticalNesting--;
	if( uxCriticalNesting == 0 )
	{
		vPortEnableInterrupts();
	}
}
/*-----------------------------------------------------------*/

__asm void xPortPendSVHandler( void )
{
	extern uxCriticalNesting;
	extern pxCurrentTCB;
	extern vTaskSwitchContext;

	PRESERVE8

	/* Start first task if the stack has not yet been setup. */
	mrs r0, psp
	cbz r0, no_save

	/* Save the context into the TCB. */
	sub r0, #0x20
	stm r0, {r4-r11}
	sub r0, #0x04
	ldr r1, =uxCriticalNesting
	ldr r1, [r1]
	stm r0, {r1}
	ldr r1, =pxCurrentTCB
	ldr r1, [r1]
	str r0, [r1]

no_save;
	
	/* Find the task to execute. */
	ldr r0, =vTaskSwitchContext
	push {r14}
	cpsid i
	blx r0
	cpsie i
	pop {r14}	

	/* Restore the context. */
	ldr r1, =pxCurrentTCB
	ldr r1, [r1];
	ldr r0, [r1];
	ldm r0, {r1, r4-r11}
	ldr r2, =uxCriticalNesting
	str r1, [r2]
	ldr r2, [r2]
	add r0, #0x24
	msr psp, r0
	orr r14, #0xd

	/* Exit with interrupts in the state required by the task. */
	cbnz r2, sv_disable_interrupts
	
	bx r14

sv_disable_interrupts;
	cpsid i
	bx r14
}
/*-----------------------------------------------------------*/

__asm void xPortSysTickHandler( void )
{
	extern vTaskIncrementTick
	PRESERVE8

	/* Call the scheduler tick function. */
	ldr r0, =vTaskIncrementTick
	push {r14}
	cpsid i
	blx r0
	cpsie i
	pop {r14}	

	/* If using preemption, also force a context switch. */
	#if configUSE_PREEMPTION == 1
	extern vPortYieldFromISR
		push {r14}
		ldr r0, =vPortYieldFromISR
		blx r0
		pop {r14}
	#endif

	/* Exit with interrupts in the correct state. */
	ldr r2, =uxCriticalNesting
	ldr r2, [r2]
	cbnz r2, tick_disable_interrupts

	bx r14

tick_disable_interrupts;
	cpsid i
	bx r14
}
/*-----------------------------------------------------------*/

/*
 * Setup the systick timer to generate the tick interrupts at the required
 * frequency.
 */
void prvSetupTimerInterrupt( void )
{
	/* Configure SysTick to interrupt at the requested rate. */
	*(portNVIC_SYSTICK_LOAD) = configCPU_CLOCK_HZ / configTICK_RATE_HZ;
	*(portNVIC_SYSTICK_CTRL) = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE;
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品 欧美精品| 国产精品色呦呦| 国产99一区视频免费| 亚洲国产日韩a在线播放性色| 久久女同精品一区二区| 91精品在线麻豆| 丁香天五香天堂综合| 日韩电影一区二区三区| 亚洲一区二区三区爽爽爽爽爽| 欧美精品一二三区| 色婷婷综合久久久久中文一区二区 | 2020国产精品久久精品美国| 欧美日韩一卡二卡| 成人av网站在线观看免费| 国模少妇一区二区三区| 日韩中文字幕91| 日韩成人伦理电影在线观看| 亚洲成av人片一区二区| 一区二区免费在线播放| 亚洲精品视频观看| 亚洲天堂a在线| 中文一区一区三区高中清不卡| 日本乱人伦一区| 91国产成人在线| 制服丝袜亚洲精品中文字幕| 6080亚洲精品一区二区| 欧美日韩黄色影视| 欧美日韩第一区日日骚| 欧美日韩一区二区三区四区| 欧美日韩一级片在线观看| 欧美性感一区二区三区| 欧美在线一区二区三区| 色婷婷狠狠综合| 欧洲精品视频在线观看| 欧美性猛交xxxxxx富婆| 3751色影院一区二区三区| 欧美精品国产精品| 91精品国产高清一区二区三区蜜臀| 777奇米四色成人影色区| 日韩一级大片在线观看| 26uuu亚洲综合色| 国产精品少妇自拍| 亚洲狠狠爱一区二区三区| 午夜精品一区二区三区三上悠亚| 热久久一区二区| 国产精品综合一区二区三区| eeuss鲁一区二区三区| 91久久一区二区| 色噜噜狠狠一区二区三区果冻| 欧美精品在线一区二区三区| 欧美一级精品大片| 国产女主播视频一区二区| 一区二区三区.www| 日av在线不卡| 91麻豆视频网站| 久久蜜桃av一区精品变态类天堂 | 久久国产乱子精品免费女| 国产传媒久久文化传媒| 欧美视频在线观看一区二区| 精品国产污污免费网站入口| 国产清纯白嫩初高生在线观看91 | 成人免费黄色大片| 欧美日韩你懂得| 国产精品欧美一区喷水| 午夜视频一区二区| 国产精品456| 91精品麻豆日日躁夜夜躁| 国产精品欧美久久久久无广告 | 亚洲精品美腿丝袜| 国产中文字幕精品| 色老汉av一区二区三区| 日韩免费高清电影| 亚洲一区免费观看| 风间由美性色一区二区三区| 91精品一区二区三区久久久久久| 成人免费在线视频| 久久不见久久见免费视频1| 色婷婷精品大在线视频 | 欧美精选在线播放| 亚洲精品日日夜夜| av在线不卡免费看| 久久精品一区二区三区av| 奇米影视在线99精品| 欧美在线一二三四区| 精品国产第一区二区三区观看体验| 日韩视频一区在线观看| 亚洲影院理伦片| 色先锋资源久久综合| 国产精品丝袜一区| 大陆成人av片| 国产蜜臀97一区二区三区| 国产原创一区二区| 欧美喷潮久久久xxxxx| 亚洲人成网站精品片在线观看| 丰满白嫩尤物一区二区| 精品裸体舞一区二区三区| 蜜桃视频一区二区| 日韩欧美一二区| 久久国产尿小便嘘嘘| 久久伊人中文字幕| 国产传媒日韩欧美成人| 中文字幕欧美三区| 99久久国产免费看| 综合欧美亚洲日本| 一本大道久久a久久精二百| 亚洲人妖av一区二区| 色八戒一区二区三区| 一卡二卡三卡日韩欧美| 色综合久久中文综合久久97| 一区二区三区国产豹纹内裤在线| 在线观看成人免费视频| 午夜电影网一区| 精品国产a毛片| 成人自拍视频在线| 一区二区三区欧美在线观看| 欧美性生活一区| 久久精品国产成人一区二区三区 | 亚洲一区二区三区美女| 欧美在线观看视频一区二区三区| 亚洲动漫第一页| 精品少妇一区二区三区视频免付费| 国产黑丝在线一区二区三区| 亚洲欧洲av另类| 欧美在线小视频| 婷婷久久综合九色综合伊人色| 7777精品伊人久久久大香线蕉的| 国产一区二区三区综合| 亚洲免费在线观看| 日韩精品一区二区三区视频| caoporen国产精品视频| 亚洲一区二区综合| 精品久久国产字幕高潮| 97se亚洲国产综合自在线不卡| 三级精品在线观看| 国产偷国产偷亚洲高清人白洁| 欧美日韩综合不卡| 福利一区二区在线观看| 国产精品成人午夜| 正在播放一区二区| 99视频精品全部免费在线| 婷婷中文字幕一区三区| 欧美国产综合一区二区| 欧美专区亚洲专区| 国产精品一线二线三线| 亚洲成人一二三| 国产精品成人一区二区艾草 | 亚洲综合清纯丝袜自拍| 久久综合资源网| 91精品国产色综合久久| 欧洲av一区二区嗯嗯嗯啊| 国产成人精品影视| 久久丁香综合五月国产三级网站| 亚洲国产综合91精品麻豆| 欧美国产激情一区二区三区蜜月| 91精品久久久久久久久99蜜臂| 在线观看亚洲a| 激情欧美日韩一区二区| 亚洲男人天堂av网| xnxx国产精品| 日韩亚洲国产中文字幕欧美| 欧美日韩亚洲综合一区二区三区| 92精品国产成人观看免费| 韩国女主播一区| 久久精品72免费观看| 亚洲成人你懂的| 无码av中文一区二区三区桃花岛| 亚洲男人天堂av网| 亚洲天堂精品视频| 自拍av一区二区三区| 亚洲国产成人一区二区三区| 国产欧美日韩在线| 精品粉嫩aⅴ一区二区三区四区| 日韩一区二区三区高清免费看看 | 日韩一级二级三级精品视频| 久久香蕉国产线看观看99| 久久精品一区四区| 亚洲桃色在线一区| 亚洲国产一区视频| 蜜桃91丨九色丨蝌蚪91桃色| 国产精品77777| 91高清视频在线| 精品剧情v国产在线观看在线| 国产精品拍天天在线| 亚洲一区av在线| 国产一区二区电影| 91福利精品视频| 精品国产一二三区| 一区二区三区四区蜜桃| 精品午夜久久福利影院 | 天天射综合影视| 国产精品1区二区.| 欧美日韩在线播放三区四区| 精品少妇一区二区| 亚洲视频一区二区在线观看| 日本一不卡视频| 91视频观看视频| 国产亚洲综合在线| 亚洲一区二区五区| 国产成人一区在线| 777xxx欧美|