ucosii在arm移植_第1頁(yè)
ucosii在arm移植_第2頁(yè)
ucosii在arm移植_第3頁(yè)
ucosii在arm移植_第4頁(yè)
ucosii在arm移植_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、設(shè)計(jì)題目1 uCOS-II 在ARM 微處理器上的移植及編譯2 設(shè)計(jì)目的與要求1了解uCOS-II 內(nèi)核的主要結(jié)構(gòu)。2掌握將uCOS-II 內(nèi)核移植到ARM 處理器上的基本方法。3. 在給定的設(shè)備(UP-TECH PXA270-S嵌入式開(kāi)發(fā)平臺(tái)、PC 機(jī) 、WinXP、ADS1.2 集成開(kāi)發(fā)環(huán)境、仿真器驅(qū)動(dòng)程序、超級(jí)終端通訊程序。)上加以實(shí)驗(yàn),學(xué)會(huì)自己分析、找出解決問(wèn)題的方法;4. 對(duì)設(shè)計(jì)中遇到的問(wèn)題和困難,獨(dú)立思考,查閱資料,分析、觀察、判斷、試驗(yàn)、再判斷以尋找答案。5. 分析結(jié)果,寫(xiě)出設(shè)計(jì)總結(jié)報(bào)告論述自己的觀點(diǎn),并應(yīng)將參考資料列在報(bào)告后面以備查詢。內(nèi)容盡量翔實(shí)(如上機(jī)過(guò)

2、程、環(huán)境搭建),其中必須有按自己所理解、用自己的語(yǔ)言所描述的內(nèi)容,否則不予計(jì)分。3 設(shè)計(jì)環(huán)境或器材、原理與說(shuō)明4 設(shè)計(jì)過(guò)程(步驟)或程序代碼Main.c: C main 函數(shù),ucos-ii初始化等定義#include "./inc/sys/lib.h"#include <string.h>#include <stdio.h>#include "./inc/drv/register.h" /* register.h 中時(shí)對(duì)philips arm 2xxx 寄存器的定義*/#ifndef TRUE#define TRUE 1#end

3、if#ifndef FALSE#define FALSE 0#endiftypedef unsigned char uint8; /* 無(wú)符號(hào)8位整型變量 */typedef signed char int8; /* 有符號(hào)8位整型變量 */typedef unsigned short uint16; /* 無(wú)符號(hào)16位整型變量*/typedef signed short int16; /* 有符號(hào)16位整型變量*/typedef unsigned int uint32; /* 無(wú)符號(hào)32位整型變量*/typedef signed int int32; /* 有符號(hào)32位整型變量*/typed

4、ef float fp32; /* 單精度浮點(diǎn)數(shù)(32位長(zhǎng)度)*/typedef double fp64; /* 雙精度浮點(diǎn)數(shù)(64位長(zhǎng)度)*/* 系統(tǒng)設(shè)置, Fosc、Fcclk、Fcco、Fpclk必須定義*/#define Fosc12000000 /晶振頻率,10MHz25MHz,應(yīng)當(dāng)與實(shí)際一至#define Fcclk (Fosc * 5) /系統(tǒng)頻率,必須為Fosc的整數(shù)倍(132),且<=60MHZ#define Fcco (Fcclk * 4) /CCO頻率,必須為Fcclk的2、4、8、16倍,范圍為156MHz320MHz#define Fpclk (Fcclk /

5、4) * 4 /VPB時(shí)鐘頻率,只能為(Fcclk / 4)的1、2、4倍(上面這些系統(tǒng)頻率的設(shè)置是要與我們要連接的硬件(即目標(biāo)機(jī))相一致的,只有這些頻率與目標(biāo)機(jī)相一致才可以觀察到實(shí)驗(yàn)現(xiàn)象,否則會(huì)出錯(cuò)。)void DelayNS(uint32 dly) uint32 i; for(; dly>0; dly-) for(i=0; i<5000; i+); /*長(zhǎng)軟件延時(shí)*/#define UART_BPS115200 /* 定義通訊波特率 */void UART0_Ini(void) uint16 Fdiv; U0LCR = 0x83; / DLAB = 1,可設(shè)置波特率 Fdiv

6、= (Fpclk / 16) / UART_BPS; / 設(shè)置波特率 U0DLM = Fdiv / 256; U0DLL = Fdiv % 256; U0LCR = 0x03; /*初始化串口0。設(shè)置為8位數(shù)據(jù)位,1位停止位,無(wú)奇偶校驗(yàn),波特率為115200*/void UART0_SendByte(uint8 data) U0THR = data; / 發(fā)送數(shù)據(jù)(data為要發(fā)送的數(shù)據(jù)) while( (U0LSR&0x40)=0 );/ 等待數(shù)據(jù)發(fā)送完畢 /*向串口發(fā)送字節(jié)數(shù)據(jù),并等待發(fā)送完畢*/ void UART0_SendStr(uint8 const *str) while

7、(1) if( *str = '0' ) break; UART0_SendByte(*str+); / 發(fā)送數(shù)據(jù)(str為要發(fā)送的字符串的指針) /*向串口發(fā)送一字符串*/ uint8 const SEND_STRING = "FINISH MY WORK!n"int main(void) PINSEL0 = 0x00000005; / 設(shè)置I/O連接到UART0 UART0_Ini();/ while(1) UART0_SendStr(SEND_STRING); DelayNS(10);/ return(0); /*向串口UART0發(fā)送字符串"

8、 FINISH MY WORK!"*/頭文件lib.h: C庫(kù)函數(shù)定義頭文件#ifndef _LIB_H_#define _LIB_H_#include"io.h" /標(biāo)準(zhǔn)輸入輸出函數(shù)#include"sysdrv.h"/驅(qū)動(dòng)抽象層頭文件#include"./inc/marco.h" /環(huán)行緩沖區(qū)的添加以及管理的宏定義#include <stdio.h>/* VERSION版本號(hào)定義*/#define MAJOR_VERSION1#define MINOR_VERSION0#define BUILD_VERSIO

9、N1#define VERSION(MAJOR_VERSION)|(MINOR_VERSION<<8)|(BUILD_VERSION<<16)#define VERSION_STR"Build Version %d.%d.%4.4dn", MAJOR_VERSION,MINOR_VERSION,BUILD_VERSION/*定義它們的類型*/* CONSOLE宏定義,定義串口輸出輸出的控制臺(tái)*/#define CONSOLE0 /for debug#define TRACEprintf /for kernel information output#d

10、efine printkprintfvoid printfNULL(char *fmt, .);#define getchartimeout(buffer, n, timeout)Uart_GetchTimeout(CONSOLE, (char*)buffer, n, timeout)#define Uart_SendChar(nUart, ch)doif(ch)='n') Uart_SendByte(nUart), 'r');Uart_SendByte(nUart), (ch);while(0)/定義標(biāo)準(zhǔn)控制臺(tái)輸出函數(shù)(CONSOLE_PUTC)#define

11、 CONSOLE_PUTC(ch)Uart_SendChar(CONSOLE, (ch)/定義標(biāo)準(zhǔn)控制臺(tái)輸入函數(shù)(CONSOLE_GETC)#define CONSOLE_GETC()Uart_Getch(CONSOLE)/*定義系統(tǒng)配置*/#define MCLKFcclk#define MBASECLKFosc/*定義mdelay宏,毫秒級(jí)延時(shí)*/#define mdelay(n)udelay(n*1000)#define SECONDOS_TICKS_PER_SEC/*功能定義*/typedef void (*serial_loop_func_t)(void);/*定義緩沖區(qū)(P15為內(nèi)

12、存管理的協(xié)處理器)*/#define FlushCache()_asmmcr p15, 0, r0, c7, c7, 0/*lib.c*/void udelay(int time); /Watchdog Timer is used.void Port_Init(void); /端口初始化int Uart_Init(int whichUart,int baud);int Set_UartLoopFunc(serial_loop_func_t func);int Clear_UartLoopFunc(int index);char Uart_Getch(int whichUart);int Uar

13、t_GetchTimeout(int whichUart, char* pbuffer, int n, int timeout);int Uart_Poll(int whichUart);int Uart_SendByte(int whichUart, int data);int Uart_GetIntNum(int whichUart);void Uart_Printf(int whichUart, char *fmt,.);void Uart_SendString(int whichUart, char *pt);int Set_UartLoopFunc(serial_loop_func_

14、t func);int Clear_UartLoopFunc(int index);#endif觀察并分析ucos-ii文件夾內(nèi)容:A、 與處理器無(wú)關(guān)的文件:os_core.cos_flag.cos_mbox.cos_mem.cos_mutex.cos_q.cos_sem.cos_task.cos_time.cucos_II.Cucos_ii.h這些文件在移植過(guò)程中,只需要給函數(shù)加上重入屬性即可。B、 與應(yīng)用相關(guān)的文件:includes.h: 包含內(nèi)核的標(biāo)準(zhǔn)庫(kù)頭文件; os_cfg.h: “OS_TICKS_PER_SEC”、“ OS_FLAGS”注意可能需要修改。C、 與處理器相關(guān)的文件:o

15、s_cpu.h: 數(shù)據(jù)類型、關(guān)中斷方法、任務(wù)堆棧方向、任務(wù)切換的宏定義都需要修改。os_cpu_a.s: OSTickISR()、OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()這幾個(gè)函數(shù)的編寫(xiě),是整個(gè)移植的關(guān)鍵。os_cpu_c.c:OSTaskStkInit()函數(shù)的編寫(xiě),移植C/OS-II 需要在OS_CPU_C.C中定義六個(gè)函數(shù),而實(shí)際上需要定義的只有OSTaskStkInit()一個(gè)函數(shù)。該函數(shù)用來(lái)初始化任務(wù)的堆棧OSADDTASK.C:(其中調(diào)用了osaddition.h和OSADDTASK.h)#include"./ucos-ii/incl

16、udes.h" /* uC/OS interface */#include "./ucos-ii/add/osaddition.h" /包含創(chuàng)建系統(tǒng)附加任務(wù)的頭文件#include "./inc/drivers.h" /系統(tǒng)設(shè)置以及定義各個(gè)頻率的頭文件#include "./inc/marco.h" /環(huán)行緩沖區(qū)的添加以及管理的宏定義#include "./inc/sys/lib.h"#include "./inc/drv/tchScr.h" /觸摸屏任務(wù)的頭文件OS_STK SYS_

17、Task_Stack64; /system task刷新任務(wù)堆棧#define SYS_Task_Prio/定義OS任務(wù)static void SYS_Task(void *Id);/*系統(tǒng)任務(wù),有最高的優(yōu)先級(jí)(1),啟動(dòng)系統(tǒng)的其他任務(wù)*/static void SYS_Task(void *Id)OSRunning=TRUE;/系統(tǒng)開(kāi)始運(yùn)行uHALr_InstallSystemTimer();/OpenUartRev(0)打開(kāi)緩沖區(qū);printk("start system task.n");#if OS_KeyBoard_Scan_Task=1 /鍵盤(pán)初始化#endif

18、OSTaskDel(OS_PRIO_SELF);void OSAddTask_Init() /系統(tǒng)附加任務(wù)的初始化定義#if OS_KeyBoard_Scan_Task=1Key_init();#endifOSTaskCreate(SYS_Task, (void *)0, (OS_STK *)&SYS_Task_Stack64-1, SYS_Task_Prio);/創(chuàng)建系統(tǒng)任務(wù)(STACKSIZE=8*8=64)os_cpu_c.c:#include "includes.h" /* from uCOS directory */#include "ippor

19、t.h" /* from Interniche directory */*初始化任務(wù)的堆棧OSTaskCreate()和OSTaskCreateExt()通過(guò)調(diào)用OSTaskStkInit()來(lái)初始化任務(wù)的堆棧結(jié)構(gòu)。因此,堆棧看起來(lái)就像剛發(fā)生過(guò)中斷并將所有的寄存器保存到堆棧中的情形一樣。這里我們定義了堆棧是從上往下長(zhǎng)的。在用戶建立任務(wù)的時(shí)候,用戶傳遞任務(wù)的地址,pdata 指針,任務(wù)的堆棧棧頂和任務(wù)的優(yōu)先級(jí)給OSTaskCreate()和OSTaskCreateExt()。一旦用戶初始化了堆棧,OSTaskStkInit()就需要返回堆棧指針?biāo)傅牡刂?。OSTaskCreate()和

20、OSTaskCreateExt()會(huì)獲得該地址并將它保存到任務(wù)控制塊(OS_TCB)中。*/OS_STK * OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt) unsigned int * stk; /*把指針定義成無(wú)符號(hào)數(shù)*/ stk = (unsigned int *)ptos; /* 裝載堆棧指針*/ opt+; /* 建立任務(wù)環(huán)境,使用滿遞減堆棧 */ *-stk = (unsigned int) task; /* pc */ *-stk = (unsigned int) task

21、; /* lr */ *-stk = 12; /* r12 */ *-stk = 11; /* r11 */ *-stk = 10; /* r10 */ *-stk = 9; /* r9 */ *-stk = 8; /* r8 */ *-stk = 7; /* r7 */ *-stk = 6; /* r6 */ *-stk = 5; /* r5 */ *-stk = 4; /* r4 */ *-stk = 3; /* r3 */ *-stk = 2; /* r2 */ *-stk = 1; /* r1 */ *-stk = (unsigned int) pdata; /* r0第一個(gè)參數(shù)使用R

22、0傳遞 */ *-stk = (SUPMODE); /* cpsr */ *-stk = (SUPMODE); /* spsr允許 IRQ, FIQ 中斷 */ return (OS_STK *)stk); /返回堆棧指針#if OS_CPU_HOOKS_EN/*當(dāng)用OSTaskCreate()和OSTaskCreateExt ()建立任務(wù)的時(shí)候就會(huì)調(diào)用OSTaskCreateHook()。該函數(shù)允許用戶或使用移植實(shí)例的用戶擴(kuò)展C/OS-功能。當(dāng)C/OS-設(shè)置完了自己的內(nèi)部結(jié)構(gòu)后,會(huì)在調(diào)用任務(wù)調(diào)度程序之前調(diào)用OSTaskCreateHook()。該函數(shù)被調(diào)用的時(shí)候中斷是禁止的。因此用戶應(yīng)盡量減

23、少該函數(shù)中的代碼以縮短中斷的響應(yīng)時(shí)間。當(dāng)OSTaskCreateHook()被調(diào)用的時(shí)候,它會(huì)收到指向已建立任務(wù)的OS_TCB 的指針,這樣它就可以訪問(wèn)所有的結(jié)構(gòu)成員了。*/void OSTaskCreateHook (OS_TCB *ptcb) ptcb = ptcb; /* Prevent compiler warning */* 當(dāng)任務(wù)被刪除的時(shí)候就會(huì)調(diào)用OSTaskDelHook()。該函數(shù)在把任務(wù)從C/OS-的內(nèi)部任務(wù)鏈表中解開(kāi)之前被調(diào)用。當(dāng)OSTaskDelHook()被調(diào)用的時(shí)候,它會(huì)收到指向正被刪除任務(wù)的OS_TCB 的指針,這樣它就可以訪問(wèn)所有的結(jié)構(gòu)成員了。OSTaskDel

24、Hook()可以來(lái)檢驗(yàn)TCB 擴(kuò)展是否被建立(一個(gè)非空指針)并進(jìn)行一些清除操作*/void OSTaskDelHook (OS_TCB *ptcb) ptcb = ptcb; /* Prevent compiler warning */*當(dāng)發(fā)生任務(wù)切換的時(shí)候就會(huì)調(diào)用OSTaskSwHook()。OSTaskSwHook()可以直接訪問(wèn)OSTCBCur 和OSTCBHighRdy,因?yàn)樗鼈兪侨肿兞俊STCBCur 指向被切換出去的任務(wù)OS_TCB,而OSTCBHighRdy 指向新任務(wù)OS_TCB。注意在調(diào)用OSTaskSwHook()期間中斷一直是被禁止的。因此用戶應(yīng)盡量減少該函數(shù)中的代碼

25、以縮短中斷的響應(yīng)時(shí)間。*/void OSTaskSwHook (void)/*OSTaskStatHook()每秒鐘都會(huì)被OSTaskStat()調(diào)用一次。用戶可以用OSTaskStatHook()來(lái)擴(kuò)展統(tǒng)計(jì)功能。例如,用戶可以保持并顯示每個(gè)任務(wù)的執(zhí)行時(shí)間,每個(gè)任務(wù)所用的CPU 份額,以及每個(gè)任務(wù)執(zhí)行的頻率等。*/void OSTaskStatHook (void)/*OSTimeTickHook()在每個(gè)時(shí)鐘節(jié)拍都會(huì)被OSTaskTick()調(diào)用。實(shí)際上,OSTimeTickHook()是在節(jié)拍被C/OS-真正處理,并通知用戶的移植實(shí)例或應(yīng)用程序之前被調(diào)用的。*/void OSTimeTic

26、kHook (void)/*任務(wù)控制塊TCB的初始化*/void OSTCBInitHook (OS_TCB *ptcb) ptcb = ptcb; /* Prevent Compiler warning */void OSTaskIdleHook (void)void OSInitHookEnd (void)void OSInitHookBegin (void)#endifOs_cpu_a.s;改寫(xiě)了OSIntCtxSw函數(shù)中棧指針調(diào)整的算法,根據(jù):;1、IRQStack棧的位置是固定的;2、IRQ中斷以后,在調(diào)用ISR_IrqHandler函數(shù)之前,僅僅有;STMFDsp!, r0-r12

27、, lr;入棧,計(jì)算出棧指針調(diào)整的位置。避免了因?yàn)镺SIntExit等函數(shù)經(jīng)過(guò)編譯器優(yōu)化入棧不固定的問(wèn)題EXPORTOSIntCtxSw /中斷退出時(shí)的入口EXPORTOS_TASK_SWEXPORT INTS_OFFEXPORT INTS_ONINTS_OFF /關(guān)中斷 mrs r0, cpsr ; /當(dāng)前CSR mov r1, r0 ; /復(fù)制屏蔽 orr r1, r1, #0xC0 ; /屏蔽中斷位 msr CPSR_cxsf, r1 ; /關(guān)中斷(IRQ and FIQ) and r0, r0, #0x80 ; /從初始CSR 返回FIQ 位 mov pc,lr ; /返回INTS_O

28、N /開(kāi)中斷 mrs r0, cpsr ; /當(dāng)前CSR bic r0, r0, #0xC0 ; /屏蔽中斷 msr CPSR_cxsf, r0 ; /開(kāi)中斷(IRQ and FIQ) mov pc,lr ; /返回; External symbols we need the addresses ofIMPORTOSTCBCuraddr_OSTCBCurDCDOSTCBCurIMPORTOSTCBHighRdyaddr_OSTCBHighRdyDCDOSTCBHighRdyIMPORTOSPrioCuraddr_OSPrioCurDCDOSPrioCurIMPORTOSPrioHighRdya

29、ddr_OSPrioHighRdyDCDOSPrioHighRdy IMPORT IRQStack;FIQ_STACKOSIntCtxSw /中斷級(jí)的任務(wù)切換函數(shù)/* * 函數(shù)名稱: OSIntCtxSw * 功能描述: 中斷退出時(shí)的入口 * 全局變量: OSPrioCur,OSPrioHighRdy,OSPrioCur,OSPrioHighRdy */add r7, sp, #24 ; /保存寄存器指針LDRsp, =IRQStack;IRQ_STACK ;test to del itsubr7, sp, #4;r7 is the position that just Enter Inter

30、ruptmrs r1, SPSR ; /得到暫停的PSRorr r1, r1, #0xC0 ; /關(guān)閉IRQ, FIQ.msr CPSR_cxsf, r1 ; /轉(zhuǎn)換模式(應(yīng)該是SVC_MODE)ldr r0, r7, #52 ;ldr r0, r7; /從IRQ 堆棧中得到IRQ's LR (任務(wù)PC)sub r0, r0, #4 ; /當(dāng)前PC 地址是(saved_LR - 4)STMFDsp!, r0 ; /保存任務(wù)PCSTMFDsp!, lr ; /保存LRsublr, r7, #52; /進(jìn)入IRQ中斷的時(shí)候保存r0-r12;mov lr, r7 ; /保存FIQ 堆棧ptr

31、 in LR (轉(zhuǎn)到nuke r7)ldmfd lr!, r0-r12 ; /從FIQ 堆棧中得到保存的寄存器STMFDsp!, r0-r12 ; /在任務(wù)堆棧中保存寄存器/在任務(wù)堆棧上保存PSR 和任務(wù)PSRMRSr4, CPSRbic r4, r4, #0xC0 ; /使中斷位處于使能態(tài)STMFDsp!, r4; /保存任務(wù)當(dāng)前PSRMRSr4, SPSRSTMFDsp!, r4; SPSR too; OSPrioCur = OSPrioHighRdy / 改變當(dāng)前程序LDRr4, addr_OSPrioCurLDRr5, addr_OSPrioHighRdyLDRBr6, r5STRBr

32、6, r4/得到被占先的任務(wù)TCBLDRr4, addr_OSTCBCurLDRr5, r4STRsp, r5; /保存sp 在被占先的任務(wù)的TCB/得到新任務(wù)TCB 地址LDRr6, addr_OSTCBHighRdyLDRr6, r6LDRsp, r6; /得到新任務(wù)堆棧指針OSTCBCur = OSTCBHighRdy/把最高優(yōu)先級(jí)的任務(wù)切換為當(dāng)前任務(wù)STRr6, r4 ; /設(shè)置新的當(dāng)前任務(wù)的TCB 地址LDMFDsp!, r4MSRSPSR_cxsf, r4LDMFDsp!, r4BIC r4, r4, #0xC0 ; /必須退出新任務(wù)通過(guò)允許中斷MSRCPSR_cxsf, r4LD

33、MFDsp!, r0-r12, lr, pcvoid OS_TASK_SW(void)/* 任務(wù)級(jí)任務(wù)切換函數(shù) */OS_TASK_SWSTMFDsp!, lr; /保存PC指針STMFDsp!, lr; /保存LR STMFDsp!, r0-r12; /保存r0-r12MRSr4, CPSRSTMFDsp!, r4; /保存CPSRMRSr4, SPSRSTMFDsp!, r4; /保存SPSR; OSPrioCur = OSPrioHighRdy /把最高優(yōu)先級(jí)的任務(wù)切換為當(dāng)前任務(wù)LDRr4, addr_OSPrioCurLDRr5, addr_OSPrioHighRdyLDRBr6, r

34、5STRBr6, r4/獲取當(dāng)前任務(wù)控制塊TCB的地址LDRr4, addr_OSTCBCurLDRr5, r4STRsp, r5; /保存sp 在被占先的任務(wù)的TCB/得到最高優(yōu)先級(jí)任務(wù)TCB 地址LDRr6, addr_OSTCBHighRdyLDRr6, r6LDRsp, r6; /得到新任務(wù)堆棧指針; OSTCBCur = OSTCBHighRdySTRr6, r4; /設(shè)置新的當(dāng)前任務(wù)的TCB 地址/保存任務(wù)方式寄存器LDMFDsp!, r4MSRSPSR_cxsf, r4LDMFDsp!, r4MSRCPSR_cxsf, r4/返回到新任務(wù)的上下文LDMFDsp!, r0-r12,

35、 lr, pc;void OSStartHighRdy(void);/* 在多任務(wù)調(diào)度開(kāi)始時(shí)運(yùn)行優(yōu)先級(jí)最高的就緒任務(wù)*/EXPORTOSStartHighRdyOSStartHighRdy/* 函數(shù)名稱: OSStartHighRdy * 功能描述: uC/OS-II啟動(dòng)時(shí)使用OSStartHighRdy運(yùn)行第一個(gè)任務(wù)*/LDRr4, addr_OSTCBCur; /讀取當(dāng)前任務(wù)控制塊TCB的地址LDRr5, addr_OSTCBHighRdy;/把指針指向優(yōu)先級(jí)最高的LDRr5, r5;/讀取堆棧指針LDRsp, r5; /切換到新任務(wù)的任務(wù)棧STRr5, r4; /設(shè)置當(dāng)前任務(wù)控制塊TCB

36、的地址LDMFDsp!, r4; /滿堆棧遞減把TCB地址裝入堆棧指針MSRSPSR_cxsf, r4 /把R4數(shù)據(jù)傳送給SPSR寄存器LDMFDsp!, r4; /從棧頂滿堆棧遞減讀取MSRCPSR_cxsf, r4; /進(jìn)入管理模式LDMFDsp!, r0-r12, lr, pc ; /運(yùn)行新任務(wù)END實(shí)驗(yàn)步驟:1先設(shè)置好終端,然后打開(kāi)PHILIPS LPC2000軟件,設(shè)置好連接串口以及頻率,執(zhí)行燒寫(xiě)時(shí)要注意跳線(即跳至1和2之間)2點(diǎn)擊Read Device ID按鍵,然后重新啟動(dòng)目標(biāo)機(jī),然后點(diǎn)擊確定獲得相應(yīng)的Part ID和BootLoader ID3瀏覽選擇要燒寫(xiě)到目標(biāo)機(jī)中的文件,

37、找到之后點(diǎn)擊Upload to Flash開(kāi)始燒寫(xiě)4燒寫(xiě)完畢后關(guān)閉目標(biāo)機(jī),然后繼續(xù)跳線(即跳至2和3之間),然后打開(kāi)終端觀察串口輸出信息5 設(shè)計(jì)結(jié)果與分析實(shí)驗(yàn)過(guò)程及結(jié)果截圖:分析:難點(diǎn)一:對(duì)任務(wù)堆棧初始初始化函數(shù)OSTaskStkInit()的作用的理解通過(guò)調(diào)用OSTaskStkInit()來(lái)初始化任務(wù)的堆棧結(jié)構(gòu)。因此,堆??雌饋?lái)就像剛發(fā)生過(guò)中斷并將所有的寄存器保存到堆棧中的情形一樣。一旦用戶初始化了堆棧,OSTaskStkInit()就需要返回堆棧指針?biāo)傅牡刂?,地址將被保存到任?wù)控制塊(OS_TCB)中。難點(diǎn)二:時(shí)鐘節(jié)拍。雖然移植是可能不太了解具體的代碼,我大概花了兩天仔細(xì)的看了書(shū)和代碼,

38、有個(gè)結(jié)構(gòu)和原理的認(rèn)識(shí),這次和以前看不同,了解了代碼實(shí)現(xiàn)地細(xì)節(jié),看完會(huì)更加頭腦清醒。難點(diǎn)三: OSStartHighRdy()該函數(shù)由OSStart()函數(shù)調(diào)用,功能是在多任務(wù)調(diào)度開(kāi)始時(shí)運(yùn)行優(yōu)先級(jí)最高的就緒任務(wù)。它主要完成三件事:一是通知操作系統(tǒng),多任務(wù)調(diào)度已經(jīng)開(kāi)始;二是使SP指向優(yōu)先級(jí)最高的就緒任務(wù)的任務(wù)棧棧頂;三是恢復(fù)最高優(yōu)先級(jí)任務(wù)的運(yùn)行環(huán)境-各CPU寄存器的內(nèi)容等難點(diǎn)四:OSIntCtxSw()OsIntCtxSw()是uC/OS-II中唯一的與編譯器相關(guān)的函數(shù);該函數(shù)是用戶問(wèn)題最集中的地方。如果在多次任務(wù)切換后用戶的系統(tǒng)崩潰了,用戶應(yīng)該懷疑堆棧指針在OSIntCtxSw()中是否正確調(diào)整

39、。6 設(shè)計(jì)體會(huì)與建議設(shè)計(jì)體會(huì):通過(guò)本次移植實(shí)驗(yàn)更深刻的了解了uC/OS-II,uC/OS-II包括中斷管理、任務(wù)管理、時(shí)間管理、任務(wù)之間通信管理和內(nèi)存管理五方面功能。其結(jié)構(gòu)共分三層,層為與處理器相關(guān)的代碼,在uC/OS-II的intel8086版本上為os_cpu.h、os_cpu_c.c和os_cpu_a.s三個(gè)文件。該層完成系統(tǒng)時(shí)鐘的設(shè)置、出入中斷的管理和任務(wù)切換功能,為第層提供接口。層包括時(shí)間管理、任務(wù)調(diào)度管理、任務(wù)間的通信管理和內(nèi)存管理四部分,是OS的主體部分,全部由ANSIC代碼寫(xiě)成,與處理器無(wú)關(guān),它為用戶應(yīng)用程序提供接口。層是用戶應(yīng)用程序部分,uC/OS-II有中斷和任務(wù)兩個(gè)處理級(jí)別,用戶可以建立自己的任務(wù),編寫(xiě)必要的中斷子程,在任務(wù)之間或任務(wù)與中斷子程之間建立信號(hào)量、郵箱或消息隊(duì)列完成控制器軟件的編寫(xiě)。在前后臺(tái)系統(tǒng)中,提供一個(gè)CPU堆棧。發(fā)生中斷時(shí),將當(dāng)前使用到的寄存器壓入堆棧,保存現(xiàn)場(chǎng),執(zhí)行中斷程序;中斷程序完成后,從CPU堆棧中彈出寄存器的值,恢復(fù)現(xiàn)場(chǎng)。在多任務(wù)系統(tǒng)uC/OS-II中不是這樣。OS創(chuàng)建時(shí),為每個(gè)任務(wù)建立并初始化一個(gè)堆棧。當(dāng)發(fā)生中斷或任務(wù)切換時(shí),把當(dāng)前任務(wù)運(yùn)行現(xiàn)場(chǎng)保存起來(lái),即將所有寄存器保存到該“舊”任務(wù)的堆棧中。當(dāng)某個(gè)任務(wù)需要從就緒狀態(tài)激活到運(yùn)行狀態(tài)時(shí),OS又需將所有寄存器從該“新”任務(wù)的堆棧中彈出。這樣,每個(gè)任

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論