歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

UC/OS-II 操作系統移植

一.移植相關文件

μC/OS-II的代碼包括核心代碼(與處理器無關),配置代碼(與用戶實際應用相關)和移植代碼。其中移植μC/OS-II所需的代碼是移植代碼,移植代碼包括1個匯編文件(OS_CPU_A.ASM),1個C程序文件(OS_CPU_C.C)和1個頭文件(OS_CPU.H)。由於Keil  uVision3編譯器默認匯編文件後綴名為“S”,所以移植代碼OS_CPU_A.ASM改名為OS_CPU_A.S。

uC/OS-II核心代碼與處理器無關,所以不管移植到哪個板子上,它們都是不用修改的,可直接粘貼過去。

我們主要的工作是OS_CPU.H,OS_CPU_A.ASM(在Keil 中為OS_CPU_A.S)和OS_CPU_C.C因為它們是處理器相關的。

1.   OS_CUP.H

先看下代碼:

  1. /***************************************Copyright (c)******************************************** 
  2. **                                       西安郵電學院 
  3. **                                        XNMS項目組 
  4. **                                         
  5. ** 
  6. **                               http://blog.csdn.net/tigerjb 
  7. ** 
  8. **-----------------------------------------文件信息------------------------------------------------------ 
  9. **文   件   名: os_cpu.h 
  10. **創   建   人: 冀博 
  11. **最後修改日期: 2010年1月14日 
  12. **描        述: μCOS-II在LPC210x上的移植代碼CPU配置部分,用Keil  uVision3編譯 
  13. ********************************************************************************************************/ 
  14.  
  15. #ifdef  OS_CPU_GLOBALS  
  16. #define OS_CPU_EXT  
  17. #else  
  18. #define OS_CPU_EXT  extern  
  19. #endif   
  20.   
  21. /********************************************************************************************************** 
  22. *                    定義與編譯器無關的數據類型 
  23. **********************************************************************************************************/  
  24.   
  25. typedef unsigned char  BOOLEAN;                 /* 布爾變量                                 */  
  26. typedef unsigned char  INT8U;                   /* 無符號8位整型變量                        */  
  27. typedef signed   char  INT8S;                   /* 有符號8位整型變量                        */  
  28. typedef unsigned short INT16U;                  /* 無符號16位整型變量                       */  
  29. typedef signed   short INT16S;                  /* 有符號16位整型變量                       */  
  30. typedef unsigned int   INT32U;                  /* 無符號32位整型變量                       */  
  31. typedef signed   int   INT32S;                  /* 有符號32位整型變量                       */  
  32. typedef float          FP32;                    /* 單精度浮點數(32位長度)                 */  
  33. typedef double         FP64;                    /* 雙精度浮點數(64位長度)                 */  
  34.   
  35. typedef INT32U         OS_STK;                  /* 堆棧是32位寬度                           */  
  36.   
  37. /* 以下是兼容UC/OS V1.XX的數據類型,在uC/OS-II沒有使用  */ 
  38. #define BYTE           INT8S  
  39. #define UBYTE          INT8U  
  40. #define WORD           INT16S  
  41. #define UWORD          INT16U  
  42. #define LONG           INT32S  
  43. #define ULONG          INT32U   
  44.   
  45. /* ********************************************************************************************************* 
  46. *                    與ARM7體系結構相關的一些定義 
  47. **********************************************************************************************************/ 
  48. #define     OS_CRITICAL_METHOD     2            /* 選擇開、關中斷的方式 */   
  49.   
  50.   
  51. __swi(0x00) void OS_TASK_SW(void);              /*  任務級任務切換函數          */  
  52. __swi(0x01) void _OSStartHighRdy(void);         /*  運行優先級最高的任務        */  
  53. __swi(0x02) void OS_ENTER_CRITICAL(void);       /*  關中斷                      */  
  54. __swi(0x03) void OS_EXIT_CRITICAL(void);        /*  開中斷                      */  
  55.   
  56. __swi(0x40) void *GetOSFunctionAddr(int Index); /*  獲取系統服務函數入口        */  
  57. __swi(0x41) void *GetUsrFunctionAddr(int Index);/*  獲取自定義服務函數入口      */  
  58. __swi(0x42) void OSISRBegin(void);              /*  中斷開始處理                */  
  59. __swi(0x43) int  OSISRNeedSwap(void);           /*  判斷中斷是否需要切換        */  
  60.   
  61. __swi(0x80) void ChangeToSYSMode(void);         /*  任務切換到系統模式          */  
  62. __swi(0x81) void ChangeToUSRMode(void);         /*  任務切換到用戶模式          */  
  63. __swi(0x82) void TaskIsARM(INT8U prio);         /*  任務代碼是ARM代碼           */  
  64. __swi(0x83) void TaskIsTHUMB(INT8U prio);       /*  任務代碼是THUMB             */ 
  65.  
  66. #define OS_STK_GROWTH    1                      /*  堆棧是從上往下長的          */  
  67.  
  68. #define     USR32Mode       0x10                /*  用戶模式                    */  
  69. #define     SYS32Mode       0x1f                /*  系統模式                    */  
  70. #define     NoInt           0x80  
  71.  
  72. #ifndef USER_USING_MODE  
  73. #define USER_USING_MODE USR32Mode               /*  任務缺省模式                 */  
  74. #endif  
  75.  
  76. #ifndef OS_SELF_EN  
  77. #define OS_SELF_EN     0                        /*  允許返回OS與任務分別編譯、固化*/      
  78. #endif   
  79.   
  80.   
  81. OS_CPU_EXT INT32U OsEnterSum;                   /*  關中斷計數器(開關中斷的信號量)    */  
Copyright © Linux教程網 All Rights Reserved