UCOS-II移植ARM的讀書筆記(補12.11)

真是很鬱悶,昨天晚上邊看移植代碼邊記下來的筆記不知道怎麼回事在保存的時候竟然不見了。。。5555。。。一個晚上工作的結果啊,關鍵是我是第一次也是正式開始移植的學習之路啊。。。真是夠倒黴的。。。。今天在工作之前先把昨天的筆記重新回顧一下,其實後來想想也許是件好事,可以讓我今天在不借助其他的幫助的情況下自己看代碼自己跟自己講一遍,其實很多看起來是倒黴看起來是灰心的事情把我們的觀點換一下那麼就是一件好事。。這樣的情況發生在我的身上已經挺多次了。。。。好啦,廢話不說,開始補昨天的日記
UCOS-II的移植需要提供2,3個文件分別介紹如下:
一:OS_CPU.H
1 與編譯器有關的數據類型
   只是按照不同的編譯器編寫對應的數據類型的typedef
   對應於ARM7的數據類型的編寫如下
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;                    /* 單精度浮點數(32位長度)                 */
typedef double         FP64;                    /* 雙精度浮點數(64位長度)                 */
 
   在上面定義的各種數據類型中按照ARM7的堆棧寬度選擇INT32U
typedef INT32U         OS_STK;                  /* 堆棧是32位寬度                           */
 
   接下來一部分是爲了兼容低版本UCOS的數據類型所編寫的代碼,在UCOS-II中暫不考慮
 
2 與處理器相關的代碼
    先定義中斷的實現方式,預先設定的中斷方式有三種,在ARM7中設置爲方式2
#define     OS_CRITICAL_METHOD     2            /* 選擇開、關中斷的方式 */
 
    接下來的一段是我暫時還沒有完全搞懂的一部分,只知道是設定了12個軟件中斷的函數,當調用這些函數之前都會執行對應中斷號的事情。。具體的看到後面應該能完全搞懂軟件中斷的實現方式,該段代碼在後面的文件中會有具體的解釋,這裏暫時不看
 
    定義堆棧的生長方式,ARM7內核支持兩種生長方式,但是ADS的C語言編譯器只支持從上往下的生長方式,因此:
#define OS_STK_GROWTH    1                      /*  堆棧是從上往下長的,0-從下往上的生長方式         */
 
    最後幾行分別定義了用戶模式01和系統模式1f以及IRQ中斷禁止的指令80三個立即數,方便調用。
    還有兩個預定義往後看應該知道作用,暫不考慮,不是很重要。
 
 
二:OS_CPU_C.C
    個文件中要求用戶編寫10個簡單的C函數,但是隻有1個函數是必要的,其餘的函數必須聲明,但不一定要包含任何代碼,大致看了一下作用好像是用來調試之類的。唯一要編寫的是OSTaskStkInit()
    OSTaskStkInit()函數的功能是初始化任務的棧結構,任務的堆棧結構與CPU的體系結構、編譯器有密切的關聯。從ARM的結構可以寫出如下的棧結構:程序計數器PC,程序鏈接器LR,R12-R1,R0用於傳遞第一個參數pdata,CPSR/SPSR,關中斷計數器(用於計算關中斷的次數,這樣就實現了中斷的嵌套),返回的地址指針是指向的最後一個存入的數據,而不是一個空地址。
    軟件中斷異常SWI服務程序C語言部分
    void SWI_Exception(int SWI_Num, int *Regs):參數SWI_Num對應前面文件中定義的功能號,其中0、1號的功能在後面的文件中定義,這裏只定義了其他10個功能。
    2、3分別對應關中斷和開中斷
    關中斷:MRS     R0, SPSR         //在軟件中斷的時候直接對程序狀態保存寄存器SPSR操作也就是對CPSR的操作
                   ORR     R0, R0, #NoInt    //在彙編語言中對寄存器的對應位置位用ORR,清零用BIC
                   MSR     SPSR_c, R0        //SPSR_c表示的是隻改變SPSR的控制段的8位代碼,其他三段_f,_s,_x中標誌位在_f段,其他爲保留位
    開中斷:MRS     R0, SPSR       //在開中斷中基本與上面相同,只是ORR改成BIC清零
                   BIC     R0, R0, #NoInt
                   MSR     SPSR_c, R
    由於需要實現中斷嵌套,所以只有當關中斷的計數器減爲0的時候才能夠開中斷,而且每次關中斷的時候該計數器都應該加1。另外,插入彙編語言時用_asm指令。
 
    80、81、82、83分別對應系統模式、用戶模式、ARM指令集、THUMB指令集
    系統模式:MRS     R0, SPSR
                        BIC     R0, R0, #0x1f     //先將控制模式的低5位清零
                        ORR     R0, R0, #SYS32Mode       //設置成系統模式的1F
                        MSR     SPSR_c, R0
    用戶模式:MRS     R0, SPSR
                        BIC     R0, R0, #0x1f
                        ORR     R0, R0, #USR32Mode     //設置成用戶模式的10
                        MSR     SPSR_c, R0
    ARM指令集與THUMB指令集的代碼如下:
    ptcb = OSTCBPrioTbl[Regs[0]];
                if (ptcb != NULL)
                {
                    ptcb -> OSTCBStkPtr[1] &= ~(1 << 5);
                }
    ptcb = OSTCBPrioTbl[Regs[0]];
                if (ptcb != NULL)
                {
                    ptcb -> OSTCBStkPtr[1] |= (1 << 5);
                }
    昨天就是看到這裏,出現了一個意識到是不能忽悠的地方就是UCOS裏面的任務控制塊OS_TCB的概念,因此今天的任務就是把這部分看看。。。
    大概回憶了一下昨天晚上的工作,開始今天的工作吧
 
   
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章