基于SEP3203的NUCLEUS的移植_第1頁
基于SEP3203的NUCLEUS的移植_第2頁
基于SEP3203的NUCLEUS的移植_第3頁
基于SEP3203的NUCLEUS的移植_第4頁
基于SEP3203的NUCLEUS的移植_第5頁
已閱讀5頁,還剩8頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、基于SEP3203的NUCLEUS的移植 任毅 050842引言隨著計算機技術的發展,嵌入式系統的應用愈來愈廣泛,對人們的生活產生了巨大的影響。通常,嵌入式系統的軟件部分都應用了實時操作系統(簡稱RTOS),在特定的RTOS之上開發應用軟件,可以讓程序開發人員屏蔽掉許多底層硬件細節,提高軟件功能設計效率,簡化開發難度,同時使得程序調試方便,移植簡單,易維護,大大縮短開發周期,RTOS也因此越來越受到嵌入式系統開發人員的青睞。目前實時操作系統很多,如VxWorks、Windows CE、pSOS、Nucleus等。其中Nucleus的良好的可移植性及高度的模塊化,使得運用十分方便。下面通過詳細介

2、紹了基于東芯IV SEP3203F50移動終端平臺的Nulceus操作系統在ARM7上的移植。一硬件環境東芯IV SEP3203F50是東南大學ASIC中心設計的一款16/32 位RISC 微控制器,內嵌了ARM7TDMI 處理器內核,整個芯片可以運行在運行在75MHz。集成了支持黑白,灰度,彩色的LCD 控制器;支持低成本的NAND Flash 控制器并可從其直接啟動;支持多種外存類型:SRAM,NOR Flash,SDRAM;支持實時鐘(RTC);支持四通道的定時器和兩通道的PWM。SEP3203 處理器內嵌20KByte 零等待的靜態存儲器(SRAM),用于多媒體處理時的核心代碼與數據的

3、存放,用戶也可以將操作系統的核心代碼或LCD 幀緩存存放在該處理器中用于提供更高的性能和更低的能量消耗; 6 通道DMA 控制器,為用戶提供了高速的數據傳輸通道。為了支持低成本的系統方案,SEP3203 支持外部32 位/16 位數據總線,結合ARM 提供的Thumb 指令集,將大大降低系統成本和功耗,考慮到Nand Flash 的成本優勢,SEP3203 處理器提供專用的Nand Flash 控制器,并支持系統直接從Nand Flash 啟動。二實時操作系統介紹Nucleus PLUS的95%是由標準C編寫的,其余5%為匯編語言。匯編語言被分為三個依賴目標系統的部分初始化,線程管理,定時器管

4、理。內核的其余部分只要重新編譯即可用于新的CPU的結構。Nucleus PLUS 采用了軟件組件的方法。每個組件具有單一而明確的目的,通常由幾個C及匯編語言模塊構成,提供清晰的外部接口,對組件的引用就是通過這些接口完成的。除了少數一些特殊情況外,不允許從外部對組件內的全局進行訪問。由于采用了軟件組件的方法,Nucleus PLUS各個組件非常易于替換和復用。例如隊列服務和管道服務間毫無聯系。所有Nucleus PLUS的功能或組件按邏輯關系被劃分為單獨的文件。這樣,在最終的執行文件中只有需要的功能組件。Nucleus PLUS的組件包括任務控制、內存管理、任務間通信、任務的同步與互斥、中斷管理

5、、定時器及工/0驅動等。Nucleus PLUS提供如下組件:任務控制管理、內存管理、定時器管理、中斷、系統診斷、I/0驅動管理等共16個組件.Nucleus PLUS除了其功能強大的內核外,還提供了面向INTERNET,TCP/IP, WEB瀏覽器、圖形以及文件系統的軟件包三 操作系統的移植操作系統的移植主要分為三方面的工作:1 BOOTLOADER(主程序的啟動代碼)的編寫。2 FLASHDOWNLOAD(FLASH燒寫程序)的編寫。3 BSP(板級支持包)的編寫。以下將以上述三方面分類詳細記錄NUCLEUS在SEP3203上的移植工作。BOOTLOADER的編寫。BOOTLOADER是主

6、程序的啟動代碼。它首先完成相關接口的寄存器配置,并把主程序從nor flash中的相應位置搬運到SDRAM的指定地址下,最后完成地址重映射,和pc指針的重新指向以指明主程序的入口點。它包含三個部分代碼:芯片接口配置,代碼搬運,地址重映射。a。芯片接口配置如下:配置PMU(電源管理)ldrr1, =0x1000100c ;/配置pmc,p121ldrr2, =0x0ffff;/7bff ; /pcsr 所有時鐘開strr2,r1(將R2中的數據寫入以R1為地址的存儲器中)配置內部時鐘源控制寄存器為0xffff,即將所有內部時鐘源控制位打開。ldrr1, =0x10001014 ; /pmdr n

7、ormal模式p122ldrr2, =0x1strr2,r1配置系統工作模式控制寄存器位0x01,即系統工作模式為normal模式。 ldrr1, =0x10001000 ; /pltr pll穩定過度時間 p118 ldrr2, =0x00d200cdstrr2,r1配置主PLL穩定過渡時間寄存器為0x00d200cd,即pll的穩定過渡時間。ldrr1, =0x10001004 ; /pmcr系統主時鐘pll的控制寄存器ldrr2, =0X1228 ; /根據start算的p119strr2,r1配置主PLL控制寄存器為0x1228,芯片資料提供。ldrr1, =0x10001008 ;

8、/pucr 關usb的pllp120ldrr2, =0X1530 ;/0530strr2,r1配置usb的PLL控制寄存器為0X1530,芯片資料提供。配置EMI(外部存儲器接口)ldrr1, =0x11000000 ;配置Sdram為16位,Norflash為16位ldrr2, =0xB91331FFJ ;090001ff /p90/0x1011 1001 0001 0011 0011 0001 ffstrr2, r1 配置存儲器參數寄存器,讀寫各為15個周期。CSA片選使能,16位外部設備,可讀可寫,CSB片選使能,32位設備可讀寫。CSC片選使能,32位設備可讀寫。CSD片選使能,16位

9、設備可讀寫。CSE片選使能,16位設備可讀寫。外接SDRAM. CSF片選使能,32位設備可讀寫。外接SDRAM.ldrr1, =0x11000014 ;THE ADD OF EMIADDR_SMCONF1/p95 ldrr2, =0x01004077 strr2, r1 配置SDRAM時序配置寄存器1,refresh命令與后續命令之間有7個clock的時間延時。Active命令與對同一個bank的讀寫命令之間要插入4個clock. 某個BANK的PRECHARGE命令和下一個對同一BANK 的active 命令之間要插入2個clock。CAS 延遲,即讀命令和SDRAM 數據有效之間的間隔為

10、2個clock不將SDCLK 掛起,即不將SDRAM 置于低功耗模式。每個刷新時鐘沿到來時,對SDRAM 作刷新操作的行數為1行。8位行地址,11位列地址。b。代碼搬運如下:ldrr3, =0x00000000ldrr1, =0x30000000;the address of SDRAMldrr2, =0x20001000;the address of NorFlashr1中存放的是SDRAM的地址,即我們所希望的主程序代碼所被搬運到的SDRAM中的位置。(注:就通常情況而言,0x30000000是SDRAM的起始地址,當被地址重映射后此處為0x00000000地址所在位置,當發生異常后ARM

11、7的體系架構決定將會使指針跳轉到此地址下,此處必須放置中斷向量表。所以此處必須空出0x20的空間,這也是為什么我們ASIXOS的BOOT在搬運時目標地址0x30002000,我們在移植NUCLEUS時為什么可以不遵守這一規律了。因為我們在NUCLEUS的代碼首部開了一個0x20空間的存儲空間并清零。在程序運行初始化時將異常向量表搬入。也就是說當代碼搬運完成后我們雖然是將代碼放入了0x30000000起始的SDRAM中,但從0x30000000到0x30000020一段的SDRAM實際上是沒有值的。它被空出用來放異常向量表。)r2中存放的是主程序在NorFlash中的位置,這個地址是由FLASH

12、DOWNLOAD所決定的。r3用于代碼搬運的計數。LOOPldrr4, r2, #4strr4, r1, #4(將R4中的字寫入以R1為地址的寄存器,并將新地址R4+4寫入R1)add r3, r3, #1cmpr3,#0x20000 ; /10000 ;/a8000要看二進制大小 ;bne LOOP 此段代碼將flash中指定位置的代碼按指定大小每四個為一個單位搬運到指定的SDRAM中.代碼大小為0x20000.這個大小是根據二進制文件的大小計算的(512KB)ldr pc, =0x200000b0;/pc指針復位,防止取錯值movr0, r0movr0, r0;此處即為0x200000b0

13、所在位置。movr0, r0movr0, r0此段代碼目的是當完成代碼搬運工作后指針已經在SDRAM中了,但我們的啟動工作還沒有完成。所以要將pc指針重新指到BOOTLOADER中來。連續四個mov r0,r0是為了適應ARM7的三級流水線機制。c。代碼搬運如下:REMAPldrr1, =0x11000010 ;REMAP 0 ADDRESS TO SDRAM/p94 0x1011ldrr2, =0x0000000b strr2, r1 配置片選空間remap配置寄存器。片選使能使CSE重新映射即將SDRAM的首地址映射到0地址。ldr pc, =0x30000020movr0, r0movr

14、0, r0movr0, r0movr0, r0將pc指針指向SDRAM的0x30000020處,此時代碼搬運已經完成。0x30000020處存放的是一條跳轉指令。跳轉到系統初始化函數,即INT_Initialize連續四個mov r0,r0是為了適應ARM7的三級流水線機制。FLASHDOWNLOAD的編寫。FLASHDOWNLOAD是代碼的燒錄程序,它將程序燒寫到FLASH中。其中燒寫工作主要分為兩部分,一部分是燒寫BOOTLOADER,另一部分是燒寫主程序。#if 1/temp = NorFlash_bolckerase(0x20000000 );for(i=0;i<0x200;i+

15、)/for bootload/0x200byte temp = *(RP)(0x31000100 + i*4); temp = NorFlash_write( (0x20000000 + i*4), temp ); /if (i % 0x50) = 0) printf("writing %d,n",(i*4); #endif該段燒錄程序從指定的文件地址0x31000100處將代碼燒錄到FLASH的0x20000000處,燒錄大小為0x200*4,即0x800。這也是我們每次燒錄程序時要將代碼的二進制文件放入0x30000100地址下的原因。大小0x800是根據BOOTLOA

16、DER的二進制文件計算的,并留有一定的余量。#if 1 for(i=0;i<0x20000;i+)/10000/50000for mp3_code/0x100000 temp = *(RP)(0x31000100 + i*4); temp = NorFlash_write( (0x20001000 + i*4), temp ); /if (i % 0x5000) = 0) printf("writing %d,n",(i*4); #endif該段燒錄程序從指定的文件地址0x31000100處將代碼燒錄到FLASH的0x20000000處,燒錄大小為0x20000*4,

17、即0x80000(512KB)。這也是我們每次燒錄程序時要將代碼的二進制文件放入0x30000100地址下的原因。大小0x80000是根據主程序的二進制文件計算的,并留有一定的余量。/主程序BSP的編寫。板級支持包文件BSP主要完成啟動,異常向量表的建立,搬運。ZO(初始化為零的區域),RO(只讀的區域),RW(可讀寫的區域)的搬運和分配以及中斷產生后的中斷源判斷和跳轉。/代碼分析如下/Exception%32 /0x00 系統開了一個大小為32個的字節的空間,空間的值為0BINT_Initialize /0x0020 函數跳轉進入系統初始化B HandlerUndefBHandlerSWIB

18、HandlerPabortBHandlerDabortB . ; NO LONGER USEDBHandlerIRQBHandlerFIQ當選擇從片外NorFlash啟動,bootloader在最后將pc指針強制跳轉到0x30000020處。由于此時配置后的EMI將零地址映射到SDRAM的首地址0x30000000。所以系統執行B INT_Initialize;跳轉至初始化函數。而系統在0x00處預留的32個的字節的空間是為了存放異常向量表;這將在函數INT_Initialize()中完成;該函數僅僅是對硬件、數據及堆棧的初始化。函數INT_Initialize()由如下幾個部分組成:1、 /

19、* Insure that the processor is in supervisor mode. */LDRa1,=0x11000010MOVa2,#0x0bSTRa2,a1 ;以上四句實現了EMI的重新映射。LDRsp,=0x31000000 MRS a1,CPSR ; Pickup current CPSRBIC a1,a1,#MODE_MASK ; Clear the mode bitsORR a1,a1,#SUP_MODE ; Set the supervisor mode bitsORR a1,a1,#LOCKOUT ; Insure IRQ/FIQ interrupts are

20、 locked out MSR CPSR_cxsf,a1 ; Setup the new CPSR;BLBoard_Init; init On_board hardware(michael)(應用程序調用)該段代碼前四句重新將零地址映射到SDRAM的首地址(在BOOTLOADER中已經映射過了,我認為可以不需要再映射一次了)。由于系統將進入初始化,需要ARM進入管理員模式,并且關閉一切中斷。此時,異常向量表還沒有搬運,地址0x00000x001F處還只是一片零空間。 此段代碼的最后一句,會使程序此時跳入函數Board_Init(),該函數要完成初始化PMU,定時器,以及串口的工作。在移植工作中

21、,我們刪除了這條語句,使用C語言編寫了與之功能相同的函數C_Board_Init(),并將在Nucleus為用戶提供的應用函數Application_Initialize( )中調用,這樣使得Board_Init()的可讀性增強,方便使用者修改。2、/* setup vector table at EXPHDL_TBLBASE */movv1,#0 movv2,#8 ldrv3,=0xea000000ldra1,=INT_TableVEC_CAL /將INT_Table的內容改為機器編碼ldra2,a1suba2,a2,v1suba2,a2,#8adda2,v3,a2,LSR #2stra2,

22、a1,#4addv1,v1,#4subsv2,v2,#1bneVEC_CAL LDRa1,=INT_Table /將 INT_Table搬運至0x00處LDRa2,=EXPHDL_TBLBASELDMIAa1!,v1-v4STMIAa2!,v1-v4LDMIAa1!,v1-v4STMIAa2!,v1-v4該段代碼實現了異常處理向量表的搬運。此時INT_Table的地址為0xD0,在其中的32字節所存放的內容是異常處理函數的地址,而實際上應當是存放跳轉入相應處理函數的具體命令語句!所以在VEC_CAL的循環中,代碼實現由地址向具體命令的轉化。而后將更新的INT_Table搬運至EXPHDL_TB

23、LBASE處,EXPHDL_TBLBASE為零地址,這樣在代碼一開始所開的32位字節的零空間就用于存放了異常函數處理表。3、建立各種數據棧。LDRa1,=ROM_Data_Start_PtrLDRa1,a1,#0;LDR a2,pc, #RAM_Start_Ptr-.-8 ; Get the start of theLDRa2,=RAM_Start_PtrLDRa2,a2,#0;LDR a4,pc, #BSS_Start_Ptr-.-8 ; Pickup the start ofLDRa4,=BSS_Start_PtrLDRa4,a4,#0 CMP a1,a2 ; Check for any

24、initial ; variable values BEQ INT_BSS_Clear ; If none, zero memory;INT_ROM_Vars_CopyCMP a2,a4 ; Check to set flags LDRCC a3, a1, #4 ; Get value from ROM STRCC a3, a2, #4 ; Put value in RAM BCC INT_ROM_Vars_Copy ; Continue;INT_BSS_Clear;LDR a2,pc, #BSS_End_Ptr-.-8 ; Pickup the end of the BSS areaLDRa

25、2,=BSS_End_PtrLDRa2,a2,#0MOV a3,#0 ; Clear value in a3;INT_BSS_Clear_LoopCMP a4,a2 ; Are the start and end equal?STRCC a3,a4,#4 ; Clear a wordBCC INT_BSS_Clear_Loop ; If so, continue with BSS clear; /* Initialize the system stack pointers. This is done after the BSS is clear because the; TCD_System_

26、Stack pointer is a BSS variable! It is assumed that available memory; starts immediately after the end of the BSS section. */;LDR a1,pc, #BSS_End_Ptr-.-8 ; Pickup the ending address of BSSLDRa1,=BSS_End_PtrLDRa1,a1,#0MOV a2,#SYSTEM_SIZE ; Pickup system stack sizeSUB a2,a2,#4 ; Subtract one word for

27、first addrADD a3,a1,a2 ; Build start of system stack areaBIC a3,a3,#3 ; Insure word aligment of stackMOV v7,a1 ; Setup initial stack limit;LDR a4,pc, #System_Limit-.-8 ; Pickup sys stack limit addrLDRa4,=System_LimitLDRa4,a4,#0STR v7,a4, #0 ; Save stack limitMOV sp,a3 ; Setup initial stack pointer;L

28、DR a4,pc, #System_Stack-.-8 ; Pickup system stack addressLDRa4,=System_StackLDRa4,a4,#0STR sp,a4, #0 ; Save stack pointerMOV a2,#IRQ_STACK_SIZE ; Pickup IRQ stack size in bytesADD a3,a3,a2 ; Allocate IRQ stack areaBIC a3,a3,#3 ; Insure word alignmentMRS a1,CPSR ; Pickup current CPSRBIC a1,a1,#MODE_M

29、ASK ; Clear the mode bitsORR a1,a1,#IRQ_MODE ; Set the IRQ mode bitsMSR CPSR_cxsf,a1 ; Move to IRQ modeMOV sp,a3 ; Setup IRQ stack pointerMOV a2,#FIQ_STACK_SIZE ; Pickup FIQ stack size in bytesADD a3,a3,a2 ; Allocate FIQ stack areaBIC a3,a3,#3 ; Insure word alignmentMRS a1,CPSR ; Pickup current CPSR

30、BIC a1,a1,#MODE_MASK ; Clear the mode bitsORR a1,a1,#FIQ_MODE ; Set the FIQ mode bitsMSR CPSR_cxsf,a1 ; Move to the FIQ modeMOV sp,a3 ; Setup FIQ stack pointerMRS a1,CPSR ; Pickup current CPSRBIC a1,a1,#MODE_MASK ; Clear mode bitsORR a1,a1,#SUP_MODE ; Set the supervisor mode bitsMSR CPSR_cxsf,a1 ; A

31、ll interrupt stacks are setup, ; return to supervisor mode; /* Define the global data structures that need to be initialized by this routine.; These structures are used to define the system timer management HISR. */; ; TMD_HISR_Stack_Ptr = (VOID *) a3; TMD_HISR_Stack_Size = TIMER_SIZE; TMD_HISR_Prio

32、rity = TIMER_PRIORITY;LDR a4,pc,#HISR_Stack_Ptr-.-8 ; Pickup variable's addressLDRa4,=HISR_Stack_PtrLDRa4,a4,#0ADD a3,a3,#4 ; Increment to next available wordSTR a3,a4, #0 ; Setup timer HISR stack pointerMOV a2,#TIMER_SIZE ; Pickup the timer HISR stack sizeBIC a2,a2,#3 ; Insure word alignmentADD

33、 a3,a3,a2 ; Allocate the timer HISR stack ; from available memory;LDR a4,pc,#HISR_Stack_Size-.-8 ; Pickup variable's addressLDRa4,=HISR_Stack_SizeLDRa4,a4,#0STR a2,a4, #0 ; Setup timer HISR stack sizeMOV a2,#TIMER_PRIORITY ; Pickup timer HISR priority (0-2);LDR a4,pc,#HISR_Priority-.-8 ; Pickup

34、variable's addressLDRa4,=HISR_PriorityLDRa4,a4,#0STR a2,a4, #0 ; Setup timer HISR priority; /* Setup the vectors loaded flag to indicate to other routines in the system whether or not all; of the default vectors have been loaded. default vector to be loaded. In the ARM60 this; variable is always

35、 set to 1. All vectors must be setup by this function. */; INT_Loaded_Flag = 0;MOV a1,#1 ; All vectors are assumed loaded;LDR a2,pc, #Loaded_Flag-.-8 ; Build address of loaded flagLDRa2,=Loaded_FlagLDRa2,a2,#0STR a1,a2,#0 ; Initialize loaded flag在代碼的最后,B INC_Initialize使函數跳轉至對操作系統各種數據結構的初始化。移植過程中文件修改

36、記錄bsp.s中關于中斷的函數的修改1 INT_IRQ_ParseLDRa1,=I_ISPC;/MOVa2,#TIMER0_MASK_BIT; clear pending bit(修改);/LDRa2,a1,#0; michael add(修改);/ORRa2,a2,#TIMER0_MASK_BIT; mask pending bit(michael) (修改);/STRa2,a1,#0; michael(修改)IMPORTTimer_Int_clear(添加)BLTimer_Int_clear(添加)BLTMT_Timer_Interrupt; Call the timer interrup

37、t processing.BIRQ_PARSE_END修改和添加原因:被屏蔽掉的代碼原先執行的功能是清除定時器中斷位和重新初始化啟動時間。由于硬件不同所以用Timer_Int_clear函數來代替以上被屏蔽的代碼來實現同樣功能。2 TEST_NEXT_LISRMOVa3, a3, LSR #1; next irq bitCMPa3,#0ADDNEa1,a1,#1BNETEST_NEXT_LISR;LDRa3, =I_ISPC;MOVa2, #1;MOVa2, a2, LSL a1;STRa2, a3,#0; clear pending bitLDRa3,=INT_Pending_BitMOVa

38、2,#1MOVa2,a2,LSL a1STRa2,a3,#0BLTCC_Dispatch_LISR;/LDRa3,=INT_Pending_Bit(修改);/LDRa3,a3,#0(修改);/LDRa2,=I_ISPC(修改);/STRa3,a2,#0(修改)修改和添加原因:被屏蔽掉的代碼所執行的功能是當中斷上來后執行完中斷調度后清除中斷最終狀態寄存器的相應中斷位。由與硬件不同G4的最終狀態寄存器是自動清空的所以不需要代碼完成。44blib.c文件中添加的函數:3 函數原型:void Timer_init(void)被調用:C_Board_Init();(44blib.c)函數功能:初始化定時

39、器添加原因:硬件寄存器不同具體函數:void Timer_init(void)write_reg(T1_LCR, 5000000); /*通道1加載計數寄存器(T1LCR),當時間復位或定時器被重新使能時的初始值;將T1LCR設為5000000。T1LCR地址:0x10003000*/write_reg(T1_CR, 0x02);/*通道1 控制寄存器(T1CR),初始值為0x2,意義:不屏蔽通道1中斷,正常工作模式,通道1禁止。T1CR地址:0x10003008*/*(RP)(T1_CR) |= 0x01;/*通道1使能*/4 函數原型:void Timer_Int_clear(void)被調用:INT_IRQ_Parse;(BSP.s)函數功能:當定時器中斷產生時,清除相應的定時器寄存器中斷位并重新使能定時器。添加原因:硬件寄存器不同具體函數:void Timer_Int_clear(void)volatile U32 clear_int;while(*(RP)(T1_IMSR) &am

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論