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

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

?? os_core.c

?? ARM7 based on STR71x, UCOS migration
?? C
?? 第 1 頁 / 共 3 頁
字號:
/********************************************************************************************************
*												uC/OS-II
*											The Real-Time Kernel
*												CORE FUNCTIONS
*
*							(c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
*											All Rights Reserved
*
* File : OS_CORE.C
* By   : Jean J. Labrosse
********************************************************************************************************/

#ifndef  OS_MASTER_FILE
#define  OS_GLOBALS
#include "includes.h"
#endif

/********************************************************************************************************
*							  MAPPING TABLE TO MAP BIT POSITION TO BIT MASK
*
* Note: Index into table is desired bit position, 0..7
*	   Indexed value corresponds to bit mask
********************************************************************************************************/

INT8U  const  OSMapTbl[]   = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};

/********************************************************************************************************
*									   PRIORITY RESOLUTION TABLE
*
* Note: Index into table is bit pattern to resolve highest priority
*	   Indexed value corresponds to highest priority bit position (i.e. 0..7)
********************************************************************************************************/
INT8U  const  OSUnMapTbl[] = {
		0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,			/* 0x00 to 0x0F								*/
		4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,			/* 0x10 to 0x1F								*/
		5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,			/* 0x20 to 0x2F								*/
		4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,			/* 0x30 to 0x3F								*/
		6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,			/* 0x40 to 0x4F								*/
		4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,			/* 0x50 to 0x5F								*/
		5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,			/* 0x60 to 0x6F								*/
		4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,			/* 0x70 to 0x7F								*/
		7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,			/* 0x80 to 0x8F								*/
		4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,			/* 0x90 to 0x9F								*/
		5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,			/* 0xA0 to 0xAF								*/
		4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,			/* 0xB0 to 0xBF								*/
		6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,			/* 0xC0 to 0xCF								*/
		4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,			/* 0xD0 to 0xDF								*/
		5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,			/* 0xE0 to 0xEF								*/
		4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0			/* 0xF0 to 0xFF								*/
};

/********************************************************************************************************
*										FUNCTION PROTOTYPES
********************************************************************************************************/
static  void  OS_InitEventList(void);
static  void  OS_InitMisc(void);
static  void  OS_InitRdyList(void);
static  void  OS_InitTaskIdle(void);
static  void  OS_InitTaskStat(void);
static  void  OS_InitTCBList(void);

/********************************************************************************************************
*											INITIALIZATION
* Description: This function is used to initialize the internals of uC/OS-II and MUST be called prior to
*			  creating any uC/OS-II object and, prior to calling OSStart().
* Arguments  : none
* Returns	: none
********************************************************************************************************/
void  OSInit (void)
{
#if OS_VERSION >= 204
	OSInitHookBegin();											// Call port specific initialization code
#endif

	OS_InitMisc();												// Initialize miscellaneous variables

	OS_InitRdyList();											// Initialize the Ready List
	OS_InitTCBList();											// Initialize the free list of OS_TCBs
	OS_InitEventList();											// Initialize the free list of OS_EVENTs

#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
	OS_FlagInit();												// Initialize the event flag structures
#endif

#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
	OS_MemInit();												// Initialize the memory manager
#endif

#if (OS_Q_EN > 0) && (OS_MAX_QS > 0)
	OS_QInit();													// Initialize the message queue structures
#endif

	OS_InitTaskIdle();											// Create the Idle Task
#if OS_TASK_STAT_EN > 0
	OS_InitTaskStat();											// Create the Statistic Task
#endif

#if OS_VERSION >= 204
	OSInitHookEnd();											// Call port specific init. code
#endif
}
/********************************************************************************************************
*											  ENTER ISR
*
* Description: This function is used to notify uC/OS-II that you are about to service an interrupt
*			  service routine (ISR).  This allows uC/OS-II to keep track of interrupt nesting and thus
*			  only perform rescheduling at the last nested ISR.
*
* Arguments  : none
*
* Returns	: none
*
* Notes	  : 1) This function should be called ith interrupts already disabled
*			  2) Your ISR can directly increment OSIntNesting without calling this function because
*				 OSIntNesting has been declared 'global'.  
*			  3) You MUST still call OSIntExit() even though you increment OSIntNesting directly.
*			  4) You MUST invoke OSIntEnter() and OSIntExit() in pair.  In other words, for every call
*				 to OSIntEnter() at the beginning of the ISR you MUST have a call to OSIntExit() at the
*				 end of the ISR.
*			  5) You are allowed to nest interrupts up to 255 levels deep.
*			  6) I removed the OS_ENTER_CRITICAL() and OS_EXIT_CRITICAL() around the increment because
*				 OSIntEnter() is always called with interrupts disabled.
********************************************************************************************************/
void OSIntEnter (void)
{
	if (OSRunning == TRUE) {
		if (OSIntNesting < 255) {
			OSIntNesting++;						// Increment ISR nesting level
		}
	}
}

/********************************************************************************************************
*												EXIT ISR
*
* Description: This function is used to notify uC/OS-II that you have completed serviving an ISR.  When
*			   the last nested ISR has completed, uC/OS-II will call the scheduler to determine whether
*			   a new, high-priority task, is ready to run.
*
* Arguments	: none
*
* Returns	: none
*
* Notes		: 1) You MUST invoke OSIntEnter() and OSIntExit() in pair.  In other words, for every call
*				 to OSIntEnter() at the beginning of the ISR you MUST have a call to OSIntExit() at the
*				 end of the ISR.
*			  2) Rescheduling is prevented when the scheduler is locked (see OS_SchedLock())
********************************************************************************************************/
void  OSIntExit (void)
{
#if OS_CRITICAL_METHOD == 3								// Allocate storage for CPU status register
	OS_CPU_SR  cpu_sr;
#endif

	if (OSRunning == TRUE) {
		OS_ENTER_CRITICAL();
		if (OSIntNesting > 0) {							// Prevent OSIntNesting from wrapping
			OSIntNesting--;
		}
		if ((OSIntNesting == 0) && (OSLockNesting == 0)) {	//* Reschedule only if all ISRs complete
			OSIntExitY	= OSUnMapTbl[OSRdyGrp];			// ... and not locked.
			OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
			if (OSPrioHighRdy != OSPrioCur) {			// No Ctx Sw if current task is highest rdy
				OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
				OSCtxSwCtr++;							// Keep track of the number of ctx switches
				OSIntCtxSw();							// Perform interrupt level ctx switch
			}
		}
		OS_EXIT_CRITICAL();
	}
}
/********************************************************************************************************
*											PREVENT SCHEDULING
*
* Description: This function is used to prevent rescheduling to take place.  This allows your application
*			  to prevent context switches until you are ready to permit context switching.
* Arguments  : none
* Returns	: none
* Notes	  : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair.  In other words, for every
*				 call to OSSchedLock() you MUST have a call to OSSchedUnlock().
********************************************************************************************************/
#if OS_SCHED_LOCK_EN > 0
void  OSSchedLock (void)
{
#if OS_CRITICAL_METHOD == 3							// Allocate storage for CPU status register
	OS_CPU_SR  cpu_sr;
#endif

	if (OSRunning == TRUE) {						// Make sure multitasking is running
		OS_ENTER_CRITICAL();
		if (OSLockNesting < 255) {					// Prevent OSLockNesting from wrapping back to 0
			OSLockNesting++;						// Increment lock nesting level
		}
		OS_EXIT_CRITICAL();
	}
}
#endif

/********************************************************************************************************
*											ENABLE SCHEDULING
*
* Description: This function is used to re-allow rescheduling.
* Arguments  : none
* Returns	: none
* Notes	  : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair.  In other words, for every
*				 call to OSSchedLock() you MUST have a call to OSSchedUnlock().
********************************************************************************************************/
#if OS_SCHED_LOCK_EN > 0
void  OSSchedUnlock (void)
{
#if OS_CRITICAL_METHOD == 3										// Allocate storage for CPU status register
	OS_CPU_SR  cpu_sr;
#endif

	if (OSRunning == TRUE) {									// Make sure multitasking is running
		OS_ENTER_CRITICAL();
		if (OSLockNesting > 0) {								// Do not decrement if already 0
			OSLockNesting--;									// Decrement lock nesting level
			if ((OSLockNesting == 0) && (OSIntNesting == 0)) {	// See if sched. enabled and not an ISR
				OS_EXIT_CRITICAL();
				OS_Sched();										// See if a HPT is ready
			} else {
				OS_EXIT_CRITICAL();
			}
		}
		else {
			OS_EXIT_CRITICAL();
		}
	}
}
#endif

/********************************************************************************************************
*											START MULTITASKING
*
* Description: This function is used to start the multitasking process which lets uC/OS-II manages the
*			   task that you have created.  Before you can call OSStart(), you MUST have called OSInit()
*			   and you MUST have created at least one task.
*
* Arguments	: none
*
* Returns	: none
*
* Note		: OSStartHighRdy() MUST:
*				a) Call OSTaskSwHook() then,
*				b) Set OSRunning to TRUE.
*				c) Load the context of the task pointed to by OSTCBHighRdy.
*				d_ Execute the task.
********************************************************************************************************/
void OSStart (void)
{
	INT8U y;
	INT8U x;

	if (OSRunning == FALSE) {
		y = OSUnMapTbl[OSRdyGrp];					// Find highest priority's task priority number
		x = OSUnMapTbl[OSRdyTbl[y]];
		OSPrioHighRdy = (INT8U)((y << 3) + x);
		OSPrioCur = OSPrioHighRdy;
		OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];	// Point to highest priority task ready to run
		OSTCBCur = OSTCBHighRdy;
		OSStartHighRdy();							// Execute target specific code to start task
	}
}

/********************************************************************************************************
*										STATISTICS INITIALIZATION
*
* Description: This function is called by your application to establish CPU usage by first determining
*			  how high a 32-bit counter would count to in 1 second if no other tasks were to execute
*			  during that time.  CPU usage is then determined by a low priority task which keeps track
*			  of this 32-bit counter every second but this time, with other tasks running.  CPU usage is
*			  determined by:
*
*											 OSIdleCtr
*				 CPU Usage (%) = 100 * (1 - ------------)
*											OSIdleCtrMax
*
* Arguments  : none
* Returns	: none
********************************************************************************************************/
#if OS_TASK_STAT_EN > 0
void  OSStatInit (void)
{
#if OS_CRITICAL_METHOD == 3						// Allocate storage for CPU status register
	OS_CPU_SR  cpu_sr;
#endif	

	OSTimeDly(2);								// Synchronize with clock tick
	OS_ENTER_CRITICAL();
	OSIdleCtr	= 0L;							// Clear idle counter
	OS_EXIT_CRITICAL();
	OSTimeDly(OS_TICKS_PER_SEC);				// Determine MAX. idle counter value for 1 second
	OS_ENTER_CRITICAL();
	OSIdleCtrMax = OSIdleCtr;					// Store maximum idle counter count in 1 second
	OSStatRdy	= TRUE;
	OS_EXIT_CRITICAL();
}
#endif

/********************************************************************************************************
*										PROCESS SYSTEM TICK
*
* Description: This function is used to signal to uC/OS-II the occurrence of a 'system tick' (also known
*			   as a 'clock tick').  This function should be called by the ticker ISR but, can also be
*			   called by a high priority task.
*
* Arguments  : none
*
* Returns	: none
********************************************************************************************************/
void OSTimeTick (void)
{
#if OS_CRITICAL_METHOD == 3								// Allocate storage for CPU status register
	OS_CPU_SR  cpu_sr;
#endif	
	OS_TCB	*ptcb;

	OSTimeTickHook();									// Call user definable hook
#if OS_TIME_GET_SET_EN > 0   
	OS_ENTER_CRITICAL();								// Update the 32-bit tick counter
	OSTime++;
	OS_EXIT_CRITICAL();
#endif
	if (OSRunning == TRUE) {	
		ptcb = OSTCBList;								// Point at first TCB in TCB list
		while (ptcb->OSTCBPrio != OS_IDLE_PRIO) {		// Go through all TCBs in TCB list
			OS_ENTER_CRITICAL();
			if (ptcb->OSTCBDly != 0) {					// Delayed or waiting for event with TO
				if (--ptcb->OSTCBDly == 0) {			// Decrement nbr of ticks to end of delay
					if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) {	// Is task suspended?
						OSRdyGrp			   |= ptcb->OSTCBBitY;	// No,  Make task R-to-R (timed out)
						OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕一区二区在线观看| 99国产欧美另类久久久精品| 一级特黄大欧美久久久| 国产精品蜜臀av| 国产精品理论在线观看| 亚洲欧洲精品一区二区精品久久久 | 久久成人免费网站| 精品一区二区在线视频| 国产精品18久久久久久vr| 国产一区二区三区免费播放| 国产91在线|亚洲| 欧美日韩免费高清一区色橹橹 | 日本不卡一二三区黄网| 国产1区2区3区精品美女| 欧美影院精品一区| 国产精品久久久久影院亚瑟| 三级精品在线观看| www.日韩大片| 国产日韩欧美精品一区| 美女在线观看视频一区二区| 91精品福利视频| 精品成人一区二区三区四区| 综合久久久久久久| 中文字幕欧美激情| 蜜臀av性久久久久蜜臀aⅴ| 91亚洲永久精品| 国产精品情趣视频| 丰满放荡岳乱妇91ww| 日韩美女主播在线视频一区二区三区| 亚洲精品国产一区二区精华液| 成人动漫av在线| 国产精品免费av| 日本韩国欧美在线| 亚洲黄色av一区| 精品福利视频一区二区三区| 精品福利av导航| 欧美视频中文一区二区三区在线观看| 99精品国产99久久久久久白柏| 久久久久久久久久看片| 国产一区二区三区观看| 久久女同精品一区二区| fc2成人免费人成在线观看播放| 国产精品久久久久久久久免费桃花 | 亚洲国产综合91精品麻豆| 欧美成人a视频| 日本在线不卡视频| 884aa四虎影成人精品一区| 日韩精品一区二区在线| 青青青爽久久午夜综合久久午夜| 欧美亚洲国产一区在线观看网站| 免费观看久久久4p| 欧美国产欧美亚州国产日韩mv天天看完整| 99国产精品一区| 美女视频黄久久| 依依成人综合视频| 久久精品视频一区| 欧美做爰猛烈大尺度电影无法无天| 免费在线一区观看| 日韩成人精品在线观看| 欧美性视频一区二区三区| 日韩激情一二三区| 亚洲精选视频在线| 国产三级精品三级| 欧美一区二区二区| 欧美三级资源在线| 99re这里都是精品| 波多野结衣91| 97久久精品人人做人人爽50路| 精久久久久久久久久久| 亚洲精品国产成人久久av盗摄 | 国产经典欧美精品| 蜜桃av一区二区| 人妖欧美一区二区| 视频一区二区三区在线| 亚洲韩国一区二区三区| 一区二区三区欧美激情| 亚洲动漫第一页| 强制捆绑调教一区二区| 伦理电影国产精品| 国产福利不卡视频| www.欧美精品一二区| 色中色一区二区| 91精品国产一区二区三区蜜臀 | 亚洲一二三四区不卡| 丝袜美腿亚洲一区二区图片| 男人操女人的视频在线观看欧美| 正在播放亚洲一区| 这里只有精品99re| 亚洲国产va精品久久久不卡综合| 午夜国产精品一区| 亚洲女性喷水在线观看一区| 国产一区二区福利视频| 尤物视频一区二区| 欧美私模裸体表演在线观看| 亚洲电影在线免费观看| 欧美在线观看一二区| 亚洲国产成人av| 日韩欧美中文一区二区| 激情丁香综合五月| 中文无字幕一区二区三区 | 亚洲精品ww久久久久久p站 | 亚洲午夜免费电影| 国产成人在线观看| 日韩一区二区三区视频在线| 国产精品久久三区| 成人性色生活片| 欧美成人video| 狠狠久久亚洲欧美| 欧美电视剧在线观看完整版| 亚洲一二三四在线| 欧美日韩在线综合| 天堂成人免费av电影一区| 日本精品视频一区二区| 樱桃视频在线观看一区| 在线观看亚洲精品视频| 五月开心婷婷久久| 日韩久久久精品| 国产在线一区观看| 国产精品网站在线播放| 91在线观看高清| 亚洲美女一区二区三区| 欧美三片在线视频观看| 天天影视色香欲综合网老头| 日韩午夜激情av| 成人涩涩免费视频| 日精品一区二区三区| 国产视频一区在线观看| 色综合天天综合给合国产| 蜜臀精品一区二区三区在线观看 | 成人免费av在线| 亚洲图片你懂的| 日韩三级在线观看| 91成人在线精品| 国产在线精品一区二区不卡了 | 日韩一区二区影院| av亚洲精华国产精华| 成人av资源站| 国产91高潮流白浆在线麻豆 | 亚洲国产一区二区视频| 国产精品护士白丝一区av| 久久久综合视频| 国产精品视频一二三区 | 色综合夜色一区| 成人国产精品免费网站| www.亚洲国产| 97精品国产97久久久久久久久久久久| 国产精品影视在线观看| 久久精品国产免费| 国产成+人+日韩+欧美+亚洲| 亚洲va天堂va国产va久| 久久精品72免费观看| 蜜臀av性久久久久av蜜臀妖精| 一区二区三区加勒比av| 夜夜嗨av一区二区三区中文字幕 | 久久夜色精品国产欧美乱极品| 亚洲精品一区在线观看| 成人免费在线播放视频| 日韩av在线播放中文字幕| 国产福利91精品一区| 欧美艳星brazzers| 亚洲国产激情av| 亚洲久本草在线中文字幕| 美腿丝袜亚洲综合| 欧美综合亚洲图片综合区| 欧美变态口味重另类| 亚洲成人免费电影| 国产·精品毛片| 精品va天堂亚洲国产| 亚洲乱码国产乱码精品精可以看 | 久久 天天综合| 欧美日韩一二三区| 国产不卡免费视频| 国产成人在线免费观看| 日韩亚洲欧美高清| 日韩电影在线看| 欧美大尺度电影在线| 麻豆精品在线视频| 久久综合九色欧美综合狠狠| 美国精品在线观看| 欧美精品一区二区不卡| 国产在线不卡一区| 中文一区二区完整视频在线观看| 成人小视频免费在线观看| 久久久久国色av免费看影院| 国产精品伊人色| 亚洲图片另类小说| 91在线播放网址| 日韩三级高清在线| 精品精品国产高清一毛片一天堂| 日本欧美一区二区三区| 中文文精品字幕一区二区| 91片在线免费观看| 国产真实乱对白精彩久久| 亚洲人成精品久久久久| 91精品国产入口| 在线亚洲精品福利网址导航| 亚洲综合色丁香婷婷六月图片| 色婷婷国产精品| 亚洲香肠在线观看| 精品成人在线观看|