📄 os_cpu.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 + -