转自:https://blog.csdn.net/u010650845/article/details/72466995
/*
** ver : 2.52
** file : OS_CPU.H
** brief : 头文件,与处理器类型相关
*/
#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 int INT16U; /* 无符号16位整数 */
typedef signed int INT16S; /* 有符号16位整数 */
typedef unsigned long INT32U; /* 无符号32位整数 */
typedef signed long INT32S; /* 有符号32位整数 */
typedef float FP32; /* 单精度浮点 */
typedef double FP64; /* 双精度浮点 */
typedef unsigned int OS_STK; /* 对站入口宽度16位 */
typedef unsigned short OS_CPU_SR; /* CPU状态寄存器宽度16位 */
#define BYTE INT8S
#define UBYTE INT8U
#define WORD INT16S
#define UWORD INT16U
#define LONG INT32S
#define ULONG INT32U
/*
*****************************************************************************************
* Intel 80x86 (实模式, 大模式)
*
* Method #1: 最简单的一种方法实现开关中断,但是在这个过程中存在着小小的问题,如果在中断
* 禁止的情况下调用ucosii函数,那么从ucosii返回时,中断可能会变成允许的了.
*
* Method #2: 先将中断状态保存然后在关中断,开中断时从堆栈中恢复原来的中断状态,如果调用
* 前中断是开着的则调用后中断还是开着的,调用前中断时关掉的则调用后中断还是断
* 掉的
*
* Method #3: 得到当前PSW寄存器的值,并保存在局部变量cpu_sr中,开中断时将局部变量的值赋值
* 给PSW
*******************************************************************************************
*/
#define OS_CRITICAL_METHOD 2 /* 实现临界段的方法 */
#if OS_CRITICAL_METHOD == 1
#define OS_ENTER_CRITICAL() asm CLI /* 关中断 */
#define OS_EXIT_CRITICAL() asm STI /* 开中断 */
#endif
#if OS_CRITICAL_METHOD == 2
#define OS_ENTER_CRITICAL() asm {PUSHF; CLI} /* 关中断 */
#define OS_EXIT_CRITICAL() asm POPF /* 开中断 */
#endif
#if OS_CRITICAL_METHOD == 3
#define OS_ENTER_CRITICAL() (cpu_sr = OSCPUSaveSR()) /* 关中断 */
#define OS_EXIT_CRITICAL() (OSCPURestoreSR(cpu_sr)) /* 关中断 */
#endif
/*
****************************************************************************************
* Intel 80x86 (实模式, 大模式) 杂项
****************************************************************************************
*/
#define OS_STK_GROWTH 1 /* 堆栈增长方向,高地址向低地址 */
#define uCOS 0x80 /* 中断向量表用于任务切换 */
#define OS_TASK_SW() asm INT uCOS
/*
****************************************************************************************
* 全局变量
****************************************************************************************
*/
OS_CPU_EXT INT8U OSTickDOSCtr;
/*
***************************************************************************************
* 声明
***************************************************************************************
*/
void OSTaskStkInit_FPE_x86(OS_STK **pptos, OS_STK **ppbos, INT32U *psize);
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR OSCPUSaveSR(void);
void OSCPURestoreSR(OS_CPU_SR cpu_sr);
#endif