/*
** 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
uC/OS-II源碼解析(os_cpu.h)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.