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

📄 os_cpu_c.c

📁 ARM7 based on STR71x, UCOS migration
💻 C
字号:
/*********************************************************************************************************
												uC/OS-II
										The Real-Time Kernel

								(c) Copyright 1992-2004, Micrium, Weston, FL
											All Rights Reserved

												ARM7 Port

 File : OS_CPU_C.C
 By   : Yujun Huang
********************************************************************************************************/

#define  OS_CPU_GLOBALS
#include "ucos_ii.h"
//#include "71x_map.h"

#define SYS_MODE	(0x0000001FL)
#define USER_MODE	(0x00000010L)

/********************************************************************************************************
										INITIALIZE A TASK'S STACK

 Description: This function is called by either OSTaskCreate() or OSTaskCreateExt() to initialize the
			  stack frame of the task being created.  This function is highly processor specific.

 Arguments  : task			is a pointer to the task code

			  p_arg			is a pointer to a user supplied data area that will be passed to the task
							when the task first executes.

			  ptos			is a pointer to the top of stack.  It is assumed that 'ptos' points to
							a 'free' entry on the task stack.  If OS_STK_GROWTH is set to 1 then 
							'ptos' will contain the HIGHEST valid address of the stack.  Similarly, if
							OS_STK_GROWTH is set to 0, the 'ptos' will contains the LOWEST valid address
							of the stack.

			  opt			specifies options that can be used to alter the behavior of OSTaskStkInit().
							(see uCOS_II.H for OS_TASK_OPT_???).

 Returns	: Always returns the location of the new top-of-stack' once the processor registers have
			  been placed on the stack in the proper order.

 Note(s)	: 1) Interrupts are enabled when your task starts executing.
			  2) All tasks run in SYS mode.
********************************************************************************************************/
OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
{
	OS_STK *stk;

	opt		 = opt;							// 'opt'没有使用。作用是避免编译器警告('opt' is not used, prevent warning)
	stk		 = ptos;						// 获取堆栈指针(Load stack pointer)

	*(stk)	 = (OS_STK)task;				// Entry Point(PC)
	*(--stk) = (INT32U)0x14141414L;			// R14 (LR)

	*(--stk) = (INT32U)0x12121212L;			// R12
	*(--stk) = (INT32U)0x11111111L;			// R11
	*(--stk) = (INT32U)0x10101010L;			// R10
	*(--stk) = (INT32U)0x09090909L;			// R9
	*(--stk) = (INT32U)0x08080808L;			// R8
	*(--stk) = (INT32U)0x07070707L;			// R7
	*(--stk) = (INT32U)0x06060606L;			// R6
	*(--stk) = (INT32U)0x05050505L;			// R5
	*(--stk) = (INT32U)0x04040404L;			// R4
	*(--stk) = (INT32U)0x03030303L;			// R3
	*(--stk) = (INT32U)0x02020202L;			// R2
	*(--stk) = (INT32U)0x01010101L;			// R1
	*(--stk) = (INT32U)pdata;				// R0 : argument(第一个参数使用R0传递)
//	*(--stk) = (INT32U)ARM_SYS_MODE;		// CPSR  允许 IRQ, FIQ 中断(Enable both IRQ and FIQ interrupts)
	*(--stk) = (INT32U)USER_MODE;			// CPSR  允许 IRQ, FIQ 中断(Enable both IRQ and FIQ interrupts)
	return (stk);
}

#if OS_CPU_HOOKS_EN
/********************************************************************************************************
										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.
********************************************************************************************************/
void  OSTaskCreateHook (OS_TCB *ptcb)
{
    ptcb = ptcb;						// Prevent compiler warning
//	(void)ptcb;							// Prevent compiler warning
}

/********************************************************************************************************
										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.
********************************************************************************************************/
void  OSTaskDelHook (OS_TCB *ptcb)
{
    ptcb = ptcb;						// Prevent compiler warning
//	(void)ptcb;							// Prevent compiler warning
}

/********************************************************************************************************
											TASK SWITCH HOOK

 Description: This function is called when a task switch is performed.  This allows you to perform other
			   operations during a context switch.

 Arguments	: none

 Note(s)	: 1) Interrupts are disabled during this call.
			  2) It is assumed that the global pointer 'OSTCBHighRdy' points to the TCB of the task that
			     will be 'switched in' (i.e. the highest priority task) and, 'OSTCBCur' points to the 
			     task being switched out (i.e. the preempted task).
********************************************************************************************************/
void  OSTaskSwHook (void)
{

}

/********************************************************************************************************
											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
********************************************************************************************************/
void  OSTaskStatHook (void)
{
}

/********************************************************************************************************
*											TICK HOOK
*
* Description: This function is called every tick.
*
* Arguments  : none
*
* Note(s)    : 1) Interrupts may or may not be ENABLED during this call.
********************************************************************************************************/
void  OSTimeTickHook (void)
{
}
#endif

/********************************************************************************************************
											OS_TCBInit() HOOK

 Description: This function is called by OS_TCBInit() after setting up most of the TCB.

 Arguments  : ptcb    is a pointer to the TCB of the task being created.

 Note(s)    : 1) Interrupts may or may not be ENABLED during this call.
********************************************************************************************************/
void  OSTCBInitHook (OS_TCB *ptcb)
{
    ptcb = ptcb;						// Prevent compiler warning
//	(void)ptcb;							// Prevent Compiler warning
}

/********************************************************************************************************
											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.
********************************************************************************************************/
void OSTaskIdleHook (void)
{
}

/********************************************************************************************************
										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.
********************************************************************************************************/
void  OSInitHookBegin (void)
{
}

/********************************************************************************************************
										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.
********************************************************************************************************/
void  OSInitHookEnd (void)
{
}

/********************************************************************************************************
							INTERRUPT DISABLE TIME MEASUREMENT, START
********************************************************************************************************/
/*
void  OS_CPU_IntDisMeasInit (void)
{
	OS_CPU_IntDisMeasNestingCtr = 0;
	OS_CPU_IntDisMeasCntsEnter  = 0;
	OS_CPU_IntDisMeasCntsExit   = 0;
	OS_CPU_IntDisMeasCntsMax    = 0;
	OS_CPU_IntDisMeasCntsDelta  = 0;
	OS_CPU_IntDisMeasCntsOvrhd  = 0;
	OS_CPU_IntDisMeasStart();								// Measure the overhead of the functions
	OS_CPU_IntDisMeasStop();
	OS_CPU_IntDisMeasCntsOvrhd  = OS_CPU_IntDisMeasCntsDelta;
}

void  OS_CPU_IntDisMeasStart (void)
{
	OS_CPU_IntDisMeasNestingCtr++;
	if (OS_CPU_IntDisMeasNestingCtr == 1) {					// Only measure at the first nested level
		OS_CPU_IntDisMeasCntsEnter = OS_CPU_IntDisMeasTmrRd();
	}
}

void  OS_CPU_IntDisMeasStop (void)
{
	OS_CPU_IntDisMeasNestingCtr--;									// Decrement nesting ctr
	if (OS_CPU_IntDisMeasNestingCtr == 0) {
		OS_CPU_IntDisMeasCntsExit  = OS_CPU_IntDisMeasTmrRd();
		OS_CPU_IntDisMeasCntsDelta = OS_CPU_IntDisMeasCntsExit - OS_CPU_IntDisMeasCntsEnter;
		if (OS_CPU_IntDisMeasCntsDelta > OS_CPU_IntDisMeasCntsOvrhd) {	// Ensure overhead < delta
			OS_CPU_IntDisMeasCntsDelta -= OS_CPU_IntDisMeasCntsOvrhd;
		}
		else {
			OS_CPU_IntDisMeasCntsDelta  = OS_CPU_IntDisMeasCntsOvrhd;
		}

		if (OS_CPU_IntDisMeasCntsDelta > OS_CPU_IntDisMeasCntsMax) {	// Track MAXIMUM
			OS_CPU_IntDisMeasCntsMax = OS_CPU_IntDisMeasCntsDelta;
		}
	}
}
*/
/*
#if OS_CRITICAL_METHOD == 3                      // Allocate storage for CPU status register
    OS_CPU_SR  cpu_sr;
#endif    

OS_CPU_SR OS_CPU_ICR_Save(void)
{
	cpu_sr = EIC->ICR;
	EIC->ICR = 3;
	return cpu_sr;
}

void OS_CPU_ICR_Restore(OS_CPU_SR cpu_sr)
{
	EIC->ICR = cpu_sr;
}
*/

⌨️ 快捷键说明

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