uC/OS-II源碼解析(os_cpu.h)

/*
** 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章