⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_cpu_c.c

📁 MCB2300_ucgui_LCD320240.rar LPC2368的uc/gui的移植
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
*********************************************************************************************************
*   											uC/OS-II
*   									  The Real-Time Kernel
*
*
*   						  (c) Copyright 1992-2007, Micrium, Weston, FL
*   									   All Rights Reserved
*
*   										Generic ARM Port
*
* File  	: OS_CPU_C.C
* Version   : V1.82
* By		: Jean J. Labrosse
*   		  Jean-Denis Hatier
*
* For   	: ARM7 or ARM9
* Mode  	: ARM or Thumb
* Toolchain : RealView Development Suite
*   		  RealView Microcontroller Development Kit (MDK)
*   		  ARM Developer Suite (ADS)
*   		  Keil uVision
*********************************************************************************************************
*/


#define  OS_CPU_GLOBALS
#include <ucos_ii.h>

/*$PAGE*/
/*
*********************************************************************************************************
*   										  LOCAL CONSTANTS
*
* Note(s) : 1) ARM_MODE_ARM is the CPSR bit mask for ARM Mode
*   		2) ARM_MODE_THUMB is the CPSR bit mask for THUMB Mode
*   		3) ARM_SVC_MODE_THUMB is the CPSR bit mask for SVC MODE + THUMB Mode
*   		4) ARM_SVC_MODE_ARM is the CPSR bit mask for SVC MODE + ARM Mode
			5) OS_NTASKS_FP  establishes the number of tasks capable of supporting floating-point.  One
*   		   task is removed for the idle task because it doesn't do floating-point at all.
*   		6) OS_FP_STORAGE_SIZE  currently allocates 1024 bytes of storage in order to accomodate
*   		   thirty-two, single precision 32 bit, or sixteen double precision 64 bit VFP registers.
*********************************************************************************************************
*/

#define  ARM_MODE_ARM   		0x00000000
#define  ARM_MODE_THUMB 		0x00000020

#define  ARM_SVC_MODE_THUMB    (0x00000013L + ARM_MODE_THUMB)
#define  ARM_SVC_MODE_ARM      (0x00000013L + ARM_MODE_ARM)

#define  OS_NTASKS_FP   	   (OS_MAX_TASKS + OS_N_SYS_TASKS - 1)
#define  OS_FP_STORAGE_SIZE 		   128L

/*
*********************************************************************************************************
*   									   LOCAL VARIABLES
*********************************************************************************************************
*/

#if OS_TMR_EN > 0
static  INT16U  OSTmrCtr;
#endif

#if OS_CPU_FPU_EN > 0
static  OS_MEM  *OSFPPartPtr;   										/* Pointer to memory partition for storing FPU registers	*/
static  INT32U   OSFPPart[OS_NTASKS_FP][OS_FP_STORAGE_SIZE / sizeof(INT32U)];
#endif

/*$PAGE*/
/*
*********************************************************************************************************
*   									 INITIALIZE FP SUPPORT
*
* Description: This function initializes the memory partition used to save FPU registers
*   		   during a context switch.  This function MUST be called AFTER calling
*   		   OSInit(). OS_CPU_FPU_EN must be defined > 0 in order to compile FPU support into the
*   		   build.
*
* Arguments  : none
*
* Returns    : none
*
* Note(s)    : 1) Tasks that are to use FP support MUST be created with OSTaskCreateExt().
*   		   2) For the ARM VFP, 1024 bytes are required to save the VFP context.
*   			  The INT32U data type is used to ensure that storage is aligned on a 32-bit boundary.
*   		   3) If you need to perform floating point operations from within the OSStatTaskHook(),
*   			  then you must change the 'Options' attribute for OSTaskCreatExt() when creating
*   			  the statistics task. This only applies if OS_TaskStat() was created with OSTaskCreateExt().
*********************************************************************************************************
*/

#if OS_CPU_FPU_EN > 0
void OS_CPU_FP_Init(void)
{
	INT8U    err;
#if OS_TASK_STAT_EN && OS_TASK_CREATE_EXT_EN
	OS_TCB  *ptcb;
	void	*pblk;
#endif


	OSFPPartPtr = OSMemCreate(&OSFPPart[0][0], OS_NTASKS_FP, OS_FP_STORAGE_SIZE, &err);

#if OS_TASK_STAT_EN && OS_TASK_CREATE_EXT_EN							/* CHANGE 'OPTIONS' for OS_TaskStat()   					*/
	ptcb = OSTCBPrioTbl[OS_TASK_STAT_PRIO];
	ptcb->OSTCBOpt |= OS_TASK_OPT_SAVE_FP;  							/* Allow floating-point support for Statistic task  		*/
	pblk = OSMemGet(OSFPPartPtr, &err); 					 /* Get storage for VFP registers   						 */
	if (pblk != (void *) 0)
	{
		/* Did we get a memory block?   							*/
		ptcb->OSTCBExtPtr = pblk;   									/* Yes, Link to task's TCB                                  */
		OS_CPU_FP_Save(pblk);   										/*  	Save the VFP registers in block 					*/
	}
#endif
}
#endif

/*
*********************************************************************************************************
*   									OS INITIALIZATION HOOK
*   										 (BEGINNING)
*
* Description: This function is called by OSInit() at the beginning of OSInit().
*
* Arguments  : none
*
* Note(s)    : 1) Interrupts should be disabled during this call.
*********************************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
void OSInitHookBegin(void)
{
#if OS_TMR_EN > 0
	OSTmrCtr = 0;
#endif
}
#endif

/*
*********************************************************************************************************
*   									OS INITIALIZATION HOOK
*   											(END)
*
* Description: This function is called by OSInit() at the end of OSInit().
*
* Arguments  : none
*
* Note(s)    : 1) Interrupts should be disabled during this call.
*********************************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
void OSInitHookEnd(void)
{
#if OS_CPU_INT_DIS_MEAS_EN > 0
	OS_CPU_IntDisMeasInit();
#endif

#if OS_CPU_FPU_EN > 0
	OS_CPU_FP_Init();   												/* Initialize support for VFP register save / restore   	*/
#endif
}
#endif

/*
*********************************************************************************************************
*   									   TASK CREATION HOOK
*
* Description: This function is called when a task is created.
*
* Arguments  : ptcb   is a pointer to the task control block of the task being created.
*
* Note(s)    : 1) Interrupts are disabled during this call.
*********************************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0
void OSTaskCreateHook(OS_TCB *ptcb)
{
#if OS_CPU_FPU_EN > 0
	INT8U  err;
	void  *pblk;
#endif


#if OS_CPU_FPU_EN > 0
	if (ptcb->OSTCBOpt & OS_TASK_OPT_SAVE_FP)
	{
		/* See if task needs FP support 							*/
		pblk = OSMemGet(OSFPPartPtr, &err); 							/* Yes, Get storage for VFP registers   					*/
		if (pblk != (void *) 0)
		{
			/*  	Did we get a memory block?  						*/
			ptcb->OSTCBExtPtr = pblk;   								/*  	Yes, Link to task's TCB                             */
			OS_CPU_FP_Save(pblk);   									/*  		 Save the VFP registers in block				*/
		}
	}
#endif

#if OS_APP_HOOKS_EN > 0
	App_TaskCreateHook(ptcb);
#else
	(void) ptcb;														 /* Prevent compiler warning								 */
#endif
}
#endif


/*
*********************************************************************************************************
*   										TASK DELETION HOOK
*
* Description: This function is called when a task is deleted.
*
* Arguments  : ptcb   is a pointer to the task control block of the task being deleted.
*
* Note(s)    : 1) Interrupts are disabled during this call.
*********************************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0
void OSTaskDelHook(OS_TCB *ptcb)
{
#if OS_CPU_FPU_EN > 0
	if (ptcb->OSTCBOpt & OS_TASK_OPT_SAVE_FP)
	{
		/* See if task had FP support   							*/
		if (ptcb->OSTCBExtPtr != (void *) 0)
		{
			/* Yes, OSTCBExtPtr must not be NULL						*/
			OSMemPut(OSFPPartPtr, ptcb->OSTCBExtPtr);   				/*  	Return memory block to free pool					*/
		}
	}
#endif

#if OS_APP_HOOKS_EN > 0
	App_TaskDelHook(ptcb);
#else
	(void) ptcb;														 /* Prevent compiler warning								 */
#endif
}
#endif

/*
*********************************************************************************************************
*   										  IDLE TASK HOOK
*
* Description: This function is called by the idle task.  This hook has been added to allow you to do
*   		   such things as STOP the CPU to conserve power.
*
* Arguments  : none
*
* Note(s)    : 1) Interrupts are enabled during this call.
*********************************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0 && OS_VERSION >= 251
void OSTaskIdleHook(void)
{
#if OS_CPU_ARM_DCC_EN > 0
	OSDCC_Handler();
#endif

#if OS_APP_HOOKS_EN > 0
	App_TaskIdleHook();
#endif
}
#endif

/*
*********************************************************************************************************
*   										STATISTIC TASK HOOK
*
* Description: This function is called every second by uC/OS-II's statistics task.  This allows your
*   		   application to add functionality to the statistics task.
*
* Arguments  : none
*********************************************************************************************************
*/

#if OS_CPU_HOOKS_EN > 0
void OSTaskStatHook(void)
{
#if OS_APP_HOOKS_EN > 0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -