ucOS學習筆記(5)——一步一步移植ucOS到STM32
1.關于AREA--AREA是arm匯編中的段標志,它代表一個段的開始。所謂段是指一個獨立的,被命名的,不可分割一組代碼或者數(shù)據,一個單獨的代碼段是一個應用功能的最小單元。原文如下“sectionsare independent, named, indivisible seqnces of code or data. A single code section is the minimum required to prod? an application”。
2.關于ENTRY--ENDTRY英文原意是入口的意思,在匯編語言中它代表了一個代碼段中被執(zhí)行的第一條指令的位置。如果代碼中有C語言代碼,C的初始化庫就已經包含了entry,一般這個entry就是main函數(shù)的入口,轉換為標識符就是__main所在的位置。在一個文件中如果包含了多個ENTRY連接過程將報錯。這也就解釋了學習筆記4中編譯報錯的問題。知道原因我們可以直接去掉init.s中的ENTRY,再編譯就直接OK了。
OS學習筆記(4)中已經可以完成編譯了,但這個代碼是無法正常運行的。因為一般的ARM代碼都由四個部分組成,第一部分為初始化代碼,包括堆棧初始化等操作,第二部分是中斷向量表,第三部分是函數(shù)主體,這一部分一般是用C或者C++寫成,最后一部分為中斷代碼。前邊的移植編譯工作基本上把第一部分,第三部分做了,還有中斷向量表和中斷函數(shù)沒有完成。于是接下來的工作就是將這兩部分代碼添加到工程中。
添加中斷向量表
按照之前的習慣我們直接找到ST開發(fā)板源碼包中的中斷向量文件vectors.s添加進當前工程,編譯發(fā)生以下錯誤:
1..OUTPUT OSII.axf: Error: L6218E: Undefined symbol OSPendSV (referred from vectors.o).
沒有找到OSPendSV,這個函數(shù)是用于任務切換時保存堆棧相關數(shù)據的,該函數(shù)實際上已經在os_cpu_a.asm中被micrium實現(xiàn)了。只是名字變?yōu)榱薕S_CPU_PendSVHandler,因此我們只需要將vectors.s中的這個OS_CPU_PendSV改為OS_CPU_PendSVHandler就可以了。
2..OUTPUT OSII.axf: Error: L6218E: Undefined symbol Tmr_TickISR_Handler (referred from vectors.o).
這個錯誤表示沒有找到system tick函數(shù),而這個函數(shù)實際上夜市在os_cpu_c.c中被micrium實現(xiàn)了,名字是OS_CPU_SysTickHandler?,F(xiàn)在只需要將Tmr_TickISR_Handler改為OS_CPU_SysTickHandler即可。
3..OUTPUT OSII.axf: Error: L6218E: Undefined symbol Image$$ARM_LIB_STACK$$ZI$$Limit (referred from vectors.o).
這個問題是表明連接器找不到ARM_LIB_STACK這個段造成的,由于micrium在移植 OS到STM32平臺的時候自己寫了分散加載文件,在分散加載文件中增加了一個ARM_LIB_STACK段,而我們沒有使用它的分散加載文件導致找不到該段。micrium的分散加載文件如下:
LR_IROM1 0x08000000 0x00020000 ;; Load region
{
ER_IROM1 0x08000000 0x08020000
{
vectors.o (VECT, +First)
init.o (INIT)
* (+RO)
}
RW_IRAM1 0x20000000 0x00004C00
{
* (+RW,+ZI)
} ;; The following declarations select the "two region model" ;
;; A default __user_initial_stackheap() will be used ;
ARM_LIB_HEAP 0x20004700 EMPTY 0x00000200 {}
ARM_LIB_STACK 0x20004B00 EMPTY -0x00000200 {}
}
解決這個問題的方法是借助ST官方給的例程,參考前端的棧初始化代碼,將以下代碼拷貝到vectors.s的頂部就可以了。
Stack_Size EQU 0x00000800
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; If you need to use external SRAM mounted on STM3210E-EVAL board as data memory
; and internal SRAM for Stack, uncomment the following line and comment the line above
;__initial_sp EQU 0x20000000 + Stack_Size ; "Use MicroLIB" must be checked in
; the Project->Options->Target window
; Amount of memory (in bytes) allocated for Heap
; Tailor this val to your application needs
;//
;//
;//
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
然后去掉原文中的IMPORT l Image$$ARM_LIB_STACK$$ZI$$Limitl I,同時將下邊的l Image$$ARM_LIB_STACK$$ZI$$Limitl I改為__initial_sp即可。
至此,所有關于STM32的 OS移植基本完成,下一步就是寫板級支持包bsp.c,并完成系統(tǒng)測試代碼編寫。
http://blog.163.com/tianyake@yeah/blog/static/7493314120114924056775/
評論