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

📄 os_cpu.h

📁 ucos_ii在S3C2410上的移植
💻 H
字号:
/*
*************************************************************************************************************
*                                               uC/OS-II实时内核
*
*                        (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
*                                          All Rights Reserved
*                        (c) Copyright ARM Limited 1999.  All rights reserved.
*											ARM 专用代码
*
* 文件名称 : OS_CPU.H
**************************************************************************************************************
*/

#ifndef __OS_CPU_H__
	#define __OS_CPU_H__

	#ifdef  OS_CPU_GLOBALS
		#define OS_CPU_EXT
	#else
		#define OS_CPU_EXT  extern
	#endif

/*
*************************************************************************************************************
*                                              数据类型
*************************************************************************************************************
*/

	typedef unsigned char  BOOLEAN;
	typedef unsigned char  INT8U;                              /*        无符号 8位                			*/
	typedef signed   char  INT8S;                              /*        有符号 8位                			*/
	typedef unsigned short INT16U;                             /*        无符号 16位                            			*/
	typedef signed   short INT16S;                             /*        有符号 16位               			*/
	typedef unsigned int   INT32U;                             /*        无符号 32位               			*/
	typedef signed   int   INT32S;                             /*        有符号 32位               			*/
	typedef float          FP32;                               /*        单精度浮点型          				*/
	typedef double         FP64;                               /*        双精度浮点型          				*/

	typedef unsigned int   OS_STK;                             /*        单个堆栈的宽度        				*/
	typedef unsigned int   OS_CPU_SR;                          /*  定义CPU状态寄存器的容量 (PSR = 32 bits) 	*/

	#define BYTE           INT8S                               /*        定义和以前兼容的数据类型   		*/
	#define UBYTE          INT8U                     
	#define WORD           INT16S                    
	#define UWORD          INT16U
	#define LONG           INT32S
	#define ULONG          INT32U

/* 
*************************************************************************************************************
*                              ARM
*
* 方法 #1:  使用简单的指令开关中断。即使在进入临界段前中断是关闭的,但在从临界段退出后,中断打开。
*             
* 方法 #2:  预处理中断状态来开关中断。换句话说,如果在进入临界段时中断是关闭的,那么,在程序退出临界段时,中断
*           仍是关闭的。
*
* 方法 #3:  预处理中断状态来开关中断。通常用局部变量'cpu_sr'来保存进入临界段前的中断标志,之后关闭中断。 
*           变量'cpu_sr'分布在所有要关闭中断的uC/OS-II'的函数中。退出临界段时需要把保存在变量'cpu_sr'的进入前
*           的中断状态复制到CPU的状态寄存器中。
*
* 注意   :  方法 #1 没有使用
*             ------------------------------
*            | 方法   | SDT 2.51 | ADS 1.2  |
*            |========+==========+==========|
*            |   1    |   N/I    |   N/I    |
*            |   2    |   是     |   否     |
*            |   3    |   是     |   是     |
*             ------------------------------
*************************************************************************************************************
*/

/* 请不要修改此段程序, ADS 仅能支持 OS_CRITICAL_METHOD  3 */

	#define     NOINT              	0xc0 
	#define		SVC32MODE			0x13  	// 定义管理模式标号量
	#define 	SYS32MODE       	0x1f	// 定义系统模式标号量
	
	#define 	ADS
   
	#if defined (ADS)
		#define  OS_CRITICAL_METHOD    3
	
	#elif defined (SDT)
		#define  OS_CRITICAL_METHOD    2
		
	#else
        #error Please define a valid tool chain   
	#endif
	
/********************************************************************************************************
*								定义的SDT下的开关中断的方法
********************************************************************************************************/

	#if      OS_CRITICAL_METHOD == 2
		
		#define  OS_ENTER_CRITICAL() 	IRQFIQDE                                 /* 关中断             */
		/* 注意: R0 寄存器需要保存, for it gets saved outside. 参考 SDT 用户手册 6-5 */
		#define IRQFIQDE  __asm                       \
		{                                             \
        	mrs r0,CPSR;                              \
        	stmfd sp!,{r0};                           \
        	orr r0,r0,#NOINT;                         \
        	msr CPSR_c,r0;                            \
		}

		#define  OS_EXIT_CRITICAL() 	IRQFIQRE                                 /* 恢复中断             */

		#define IRQFIQRE  __asm                       \
		{                                             \
        	ldmfd sp!,{r0};                           \
        	msr CPSR_c,r0;                            \
		}
		
	#endif
	
/**********************************************************************************************************
*                       		定义的ADS下的开关中断的方法
**********************************************************************************************************/

	#if      OS_CRITICAL_METHOD == 3
	
		#define  OS_ENTER_CRITICAL()  (cpu_sr = OSCPUSaveSR())               /* 关中断                    */
		#define  OS_EXIT_CRITICAL()   (OSCPURestoreSR(cpu_sr))                /* 开中断                   */
		
	#endif

/*
*************************************************************************************************************
*                           					ARM 杂项
*************************************************************************************************************
*/

	#define  OS_STK_GROWTH        1                                            /* 堆栈增涨方向,从高到低  */

	#define  OS_TASK_SW()         OSCtxSw()

/*
*************************************************************************************************************
*                                              PROTOTYPES
*************************************************************************************************************
*/

	void UCOS_IRQHandler(void);
	void OSCtxSw(void);
	void OSIntCtxSw(void);

	#if OS_CRITICAL_METHOD == 3                      	             /* 为CPU状态寄存器分配存储           */
		OS_CPU_SR  	OSCPUSaveSR(void);
		void       	OSCPURestoreSR(OS_CPU_SR cpu_sr);
	#endif

#endif /*__OS_CPU_H__*/ 	



/*
	// angel takes up stack 
	#define SEMIHOSTED_STACK_NEEDS 		1024

	// 空闲任务的堆栈 (字) 
	#ifdef SEMIHOSTED
		#define OS_IDLE_STK_SIZE        (32 + SEMIHOSTED_STACK_NEEDS)
	#else
		#define OS_IDLE_STK_SIZE        64
	#endif
*/

⌨️ 快捷键说明

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