?C_XBP解析

首先在startup.a51中找到如下語句:
IF XBPSTACK <> 0
EXTRN DATA (?C_XBP)
MOV ?C_XBP,#HIGH XBPSTACKTOP
MOV ?C_XBP+1,#LOW XBPSTACKTOP
ENDIF
從前面的定義知道XBPSTACK定義爲1,因此此處將首先對C_XBP進行賦值。因C_XBP定義爲兩字節的專用指針,因此在彙編中需要對C_XBP+1也賦值(因爲在C編程中看來,地址爲C_XBP+1的RAM其實是指針C_XBP的一部分,保存此指針的低8位)。從前面定義的XBPSTACKTOP可以知道,此處執行完後,{C_XBP}=0x80,{C_XBP+1}=0x00,即在C編程中看來,此時指針C_XBP是指向存儲地址爲0x8000的地方。初始化完成後進入main()函數。

然後來跟蹤分析main()函數的執行情況。進入main()函數後,真正開始OS的語句是OSInit(),因此進入查看此函數的執行過程。在OSInit()函數中可以看到,前面都部分全部都是對任務控制塊TCB等全局變量的初始化,並沒有牽涉到指針C_XBP。在此初始化後,OSInit()函數會創建兩個任務(一個是空閒任務,一個是統計任務,當然此處假設其使能是打開的),因此需要進去OSTaskCreate()函數中去查找了,在此函數中看到了OSSched(),哦耶,立馬就清楚了。因爲在以前的學習中知道,正是在OSSched()函數中調用宏定義OS_TASK_SW()(其實就是通過此宏定義來調用OSCtxSw(),此函數是移植中最重點的函數)來進行任務切換的,而對C_XBP的操作也是此初最先開始的。通過分析可知,在第一次進行任務切換時,OS首先將公共堆棧裏的內容(從#stack到sp之間的內容)拷貝到C_XBP指針指向的地址下面的RAM空間,即此處相當於將公共堆棧裏的內容拷貝到RAM空間的最高地址部分空間內(因爲到目前爲止C_XBP指針仍然是初始化時候的值,這其實是考慮到此處的RAM空間是最不可能被用到的,因此保存在此處比較安全,當然也是有被破壞的可能的),接着將C_XBP指向剛保存的數據的RAM底端位置。然後調用C_OSCtxSw()函數進入C編程環境中進行操作。

進入C_OSCtxSw()函數後首先執行的就是將C_XBP指針的值賦給OSTCBCur->OSTCBStkPtr。但從初始化過程來看,此處可能會存在問題,因爲此時OSTCBCur指針指向的是0地址,即相當於是空指針,同樣OSTCBStkPtr指針指向的也是0地址,我不知道此時給空指針賦值是什麼用意,但我覺得穩妥的做法是應該在此處判斷一下指針是否爲空再進行賦值。另外一點疑惑就是,既然將C_XBP指針賦值給空指針,即代表其值將永遠丟失,那爲什麼還要在前面保存相應的數值,那些可是永遠也不會用到了啊(當然其實創建任務後確實也不需要再用到了)。

接下來就是將OSTCBCur指針指向最高優先級任務的任務控制塊,同時C_XBP指針指向當前任務的堆棧頂端,然後就是調用LoadCtx()切換到當前任務中執行去了。在以後的任務切換過程中,C_XBP指針將始終指向當前任務的堆棧頂端。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章