freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

一種基于嵌入式internet的遠(yuǎn)程醫(yī)療監(jiān)護(hù)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)碩士學(xué)位論文doc(已改無(wú)錯(cuò)字)

2022-08-14 13:52:47 本頁(yè)面
  

【正文】 現(xiàn): ,它負(fù)責(zé)硬件的初始化工作,工作完成后主動(dòng)把CPU控制權(quán)交給主程序,其完成的具體工作是:(1)建立異常向量表,當(dāng)處理器異常發(fā)生時(shí)跳轉(zhuǎn)到相應(yīng)的異常處理處;(2)對(duì)處理器的復(fù)位控制器、Flash控制器、看門(mén)狗以及電源管理控制器進(jìn)行初始化,保證處理器的正常啟動(dòng);(3)將異常向量表復(fù)制到內(nèi)部RAM,并將RAM重映射到地址0處;(4)為ARM處理器的各個(gè)模式設(shè)置堆棧,最后進(jìn)入管理模式并跳轉(zhuǎn)到主程序入口處。在Keil 181。Vison4開(kāi)發(fā)環(huán)境中,針對(duì)AT91SAM7X256有啟動(dòng)代碼示例。 RT_Thread是一個(gè)多線程的系統(tǒng),線程在建立時(shí)并不會(huì)馬上運(yùn)行,它必須等待線程調(diào)度器將其從堆棧中推入CPU寄存器才會(huì)運(yùn)行。因此需要為每一個(gè)線程分配堆??臻g,這樣才能保證線程正確的開(kāi)始或恢復(fù)運(yùn)行。()函數(shù),來(lái)設(shè)置線程棧的初始狀態(tài)、入口和參數(shù)等,其具體代碼如下所示:rt_uint8_t *rt_hw_stack_init(void *entry, void *parameter, rt_uint8_t *stack_addr, void *exit){rt_uint32_t *stk。 stk = (rt_uint32_t *)stack_addr。 *(stk) = (rt_uint32_t)entry。 //壓入線程入口地址到棧頂 *(stk) = (rt_uint32_t)exit。 //lr:線程退出時(shí)跳轉(zhuǎn)的函數(shù)地址 *(stk) = 0。 //r12 *(stk) = 0。 //r11 *(stk) = 0。 //r10 *(stk) = 0。 //r9 *(stk) = 0。 //r8 *(stk) = 0。 //r7 *(stk) = 0。 //r6 *(stk) = 0。 //r5 *(stk) = 0。 //r4 *(stk) = 0。 //r3 *(stk) = 0。 //r2 *(stk) = 0。 //r1 *(stk) = (unsigned long)parameter。 //r0:線程輸入?yún)?shù) *(stk) = SVCMODE。 //cpsr *(stk) = SVCMODE。 //spsr return (rt_uint8_t *)stk。 //返回當(dāng)前的線程棧地址}在使用rt_thread_create()函數(shù)建立線程時(shí),rt_hw_stack_init()函數(shù)被調(diào)用,其輸入?yún)?shù)分別為線程入口地址、線程可選的傳遞參數(shù)、線程棧首地址和線程退出時(shí)跳轉(zhuǎn)函數(shù)的地址(實(shí)際為rt_thread_exit()函數(shù)地址)。由于此時(shí)線程尚未運(yùn)行,所以將線程入口地址壓入棧,然后采用降序棧的方式為各寄存器分配棧空間并設(shè)置初始值,此時(shí)寄存器r1~r12對(duì)應(yīng)的??臻g可以初始化為任何值。cpsr和spsr寄存器初始為SVCMODE,是讓線程運(yùn)行在管理模式下,函數(shù)的最后返回stk地址到線程控制塊中。 (1)實(shí)現(xiàn)臨界區(qū)處理函數(shù),即處理器中斷禁止和使能函數(shù),分別是rt_base_t rt_hw_interrupt_disable()和rt_hw_interrupt_enable(rt_base_t level)。這兩個(gè)函數(shù)通過(guò)設(shè)置處理器的程序狀態(tài)寄存器cpsr的中斷禁止位來(lái)實(shí)現(xiàn),并通過(guò)一個(gè)變量level,來(lái)保存中斷開(kāi)/關(guān)狀態(tài),用來(lái)在結(jié)束臨界區(qū)訪問(wèn)時(shí),回到以前的狀態(tài)。具體代碼如下:rt_hw_interrupt_disable PROC MRS r0, cpsr //level變量保存當(dāng)前狀態(tài) ORR r1, r0, 0xc0 //設(shè)置cpsr寄存器,禁止FIQ和IRQ中斷 MSR cpsr_c, r1 BX lr ENDPrt_hw_interrupt_enable PROC MSR cpsr_c, r0 //恢復(fù)以前的狀態(tài) BX lr ENDP(2)實(shí)現(xiàn)線程級(jí)的線程切換函數(shù)void rt_hw_context_switch(rt_uint32 from, rt_uint32 to),輸入?yún)?shù)為要切換的兩個(gè)線程的線程棧首地址。函數(shù)通過(guò)保存當(dāng)前上下文到線程棧中,恢復(fù)并切換到新線程的上下文來(lái)實(shí)現(xiàn)。具體代碼如下所示:rt_hw_context_switch PROC/* from所指線程入棧 */ STMFD sp!, {lr} STMFD sp!, {r0r12, lr} //r0~r12, lr入棧/ MRS r4, cpsr //cpsr入棧 STMFD sp!, {r4} MRS r4, spsr //spsr入棧 STMFD sp!, {r4} STR sp, [r0] //線程棧地址入棧 /* to所指線程出棧 */ LDR sp, [r1] //載入線程棧地址 LDMFD sp!, {r4} MSR spsr_cxsf, r4 //spsr出棧 LDMFD sp!, {r4} MSR cpsr_cxsf, r4 //cpsr出棧 LDMFD sp!, {r0r12, lr, pc} //r0~r12, lr, pc出棧 ENDP(3)實(shí)現(xiàn)中斷級(jí)的線程切換函數(shù)rt_hw_context_switch_interrupt_do(rt_base_t flag)。其實(shí)現(xiàn)過(guò)程與線程級(jí)切換相似,不同之處在于其需要進(jìn)行處理器模式轉(zhuǎn)換,即從IRQ(或FIQ)模式變?yōu)楣芾砟J?,這就需要對(duì)公有寄存器資源進(jìn)行保護(hù)和使用。(4)在本文件中,還實(shí)現(xiàn)了IRQ和FIQ的中斷入口函數(shù)IRQ_Handler和FIQ_Handler,它們的實(shí)現(xiàn)過(guò)程類(lèi)似。 中斷入口函數(shù)當(dāng)中斷發(fā)生時(shí),保存現(xiàn)場(chǎng),然后跳轉(zhuǎn)到中斷處理函數(shù),處理完成后進(jìn)行上下文切換或直接退出中斷,在中斷處理程序執(zhí)行前后,需要通過(guò)rt_interrupt_enter()和rt_interrupt_leave()函數(shù)追蹤中斷嵌套的層數(shù)。 設(shè)備驅(qū)動(dòng)層實(shí)現(xiàn)嵌入式操作系統(tǒng)RT_Thread的設(shè)備管理模塊為應(yīng)用提供了一個(gè)對(duì)設(shè)備進(jìn)行訪問(wèn)的通用接口,并通過(guò)定義的數(shù)據(jù)結(jié)構(gòu)對(duì)設(shè)備管理程序和設(shè)備信息進(jìn)行管理。設(shè)備管理模塊實(shí)現(xiàn)了對(duì)設(shè)備驅(qū)動(dòng)程序的封裝,應(yīng)用程序通過(guò)設(shè)備管理模塊提供的標(biāo)準(zhǔn)接口訪問(wèn)底層設(shè)備,這種方式使得與設(shè)備的硬件操作相關(guān)的代碼與應(yīng)用隔離,雙方只需關(guān)注自己的功能,這樣不但提高了可移植性,同時(shí)也降低了代碼的復(fù)雜度,提高了系統(tǒng)的可靠性。下面是RT_Thread的設(shè)備管理控制塊:struct rt_device{struct rt_object parent。enum rt_device_class_type type。 //設(shè)備類(lèi)型rt_uint16_t flag, open_flag。 //設(shè)備參數(shù)及打開(kāi)時(shí)參數(shù)/* 設(shè)備回調(diào)接口 */rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size)。 //接收回調(diào)rt_err_t (*tx_plete)(rt_device_t dev, void* buffer)。 //發(fā)送回調(diào)/* 設(shè)備公共接口 */rt_err_t (*init) (rt_device_t dev)。 //設(shè)備初始化rt_err_t (*open) (rt_device_t dev, rt_uint16_t oflag)。 //打開(kāi)設(shè)備rt_err_t (*close) (rt_device_t dev)。 //關(guān)閉設(shè)備rt_size_t (*read) (rt_device_t dev, rt_off_t pos, //讀設(shè)備void* buffer, rt_size_t size)。rt_size_t (*write) (rt_device_t dev,rt_off_t pos, //寫(xiě)設(shè)備const void* buffer, rt_size_t size)。rt_err_t (*control)(rt_device_t dev, rt_uint8_t cmd, //控制設(shè)備void *args)。 /* 設(shè)備私有數(shù)據(jù) */void* private。 }。設(shè)備驅(qū)動(dòng)的實(shí)現(xiàn)就是根據(jù)硬件設(shè)備實(shí)現(xiàn)以上控制塊中對(duì)應(yīng)的接口函數(shù)。當(dāng)需要使用當(dāng)前設(shè)備時(shí),調(diào)用rt_device_register()函數(shù)注冊(cè)設(shè)備到系統(tǒng)中,然后調(diào)用相應(yīng)接口函數(shù)即可實(shí)現(xiàn)對(duì)設(shè)備的訪問(wèn)。 以太網(wǎng)驅(qū)動(dòng)LwIP本身具有了TCP/IP模型中的網(wǎng)際層和傳輸層,而要實(shí)現(xiàn)嵌入式Internet,即完整可用的TCP/IP協(xié)議,還需實(shí)現(xiàn)網(wǎng)絡(luò)接口層,課題已經(jīng)選擇了以太網(wǎng)作為網(wǎng)絡(luò)接口層局域網(wǎng)技術(shù),并在硬件上實(shí)現(xiàn)了以太網(wǎng)接口,那么剩下的工作就是完成以太網(wǎng)的驅(qū)動(dòng)部分,即數(shù)據(jù)鏈路層,實(shí)現(xiàn)物理層與上層協(xié)議間的數(shù)據(jù)交換[27]。數(shù)據(jù)鏈路層分兩部分進(jìn)行實(shí)現(xiàn),第一部分是底層網(wǎng)絡(luò)接口,它的目的在于脫離硬件,為上層協(xié)議提供各種以太網(wǎng)操作接口,實(shí)現(xiàn)以太網(wǎng)初始化、以太網(wǎng)數(shù)據(jù)幀的接收和發(fā)送;第二部分是硬件接口,直接與底層硬件打交道,包括對(duì)底層硬件的初始化和讀寫(xiě)操作,以及中斷處理程序。 數(shù)據(jù)鏈路層實(shí)現(xiàn) 底層網(wǎng)絡(luò)接口RT_Thread操作系統(tǒng)將LwIP作為其外圍模塊,不但實(shí)現(xiàn)了LwIP的操作系統(tǒng)模擬層,而且實(shí)現(xiàn)了以太網(wǎng)驅(qū)動(dòng)的底層網(wǎng)絡(luò)接口,因此以太網(wǎng)驅(qū)動(dòng)只需專(zhuān)注于硬件接口的實(shí)現(xiàn)。但是為了成功的實(shí)現(xiàn)硬件接口,有必要了解底層網(wǎng)絡(luò)接口的實(shí)現(xiàn)過(guò)程。(1)eth_device_init(),以太網(wǎng)初始化函數(shù)。此函數(shù)向LwIP注冊(cè)鏈路層發(fā)送函數(shù),對(duì)網(wǎng)卡進(jìn)行初始化,建立穩(wěn)定的物理連接鏈路并建立接收和發(fā)送線程。其中在網(wǎng)卡初始化時(shí)需要調(diào)用硬件接口的初始化函數(shù)sam7xethinit,來(lái)對(duì)底層硬件進(jìn)行初始化。(2)eth_tx_thread(),以太網(wǎng)數(shù)據(jù)幀發(fā)送線程。此線程會(huì)堵塞接收來(lái)自上層協(xié)議的數(shù)據(jù)幀,然后調(diào)用硬件接口的發(fā)送函數(shù)sam7xethtx將此數(shù)據(jù)幀發(fā)送出去。數(shù)據(jù)幀的地址由鏈路層發(fā)送函數(shù)netiflinkoutput以郵箱形式傳遞給發(fā)送線程。(3)eth_rx_thread(),以太網(wǎng)數(shù)據(jù)幀接收線程。該線程同樣會(huì)堵塞接收數(shù)據(jù)幀,不過(guò)此時(shí)的數(shù)據(jù)幀來(lái)自底層硬件。當(dāng)?shù)讓佑布邮盏揭粠瑪?shù)據(jù)時(shí),會(huì)觸發(fā)中斷,中斷處理函數(shù)sam7xeth_isr()發(fā)送郵箱給接收線程。接收線程收到郵箱后,脫離堵塞狀態(tài),調(diào)用sam7xethrx函數(shù),讀取數(shù)據(jù)幀到LwIP的包緩沖區(qū)(pbuf),最后由eth_input()傳遞到上層協(xié)議。其中eth_input()會(huì)對(duì)以太網(wǎng)幀頭進(jìn)行解析,根據(jù)以太網(wǎng)幀頭攜帶的上層協(xié)議類(lèi)型(IP或ARP)傳遞數(shù)據(jù)。 硬件接口硬件接口的主要任務(wù)是實(shí)現(xiàn)數(shù)據(jù)幀在EMAC緩沖區(qū)與LwIP pbuf之間的傳遞。所以在硬件接口實(shí)現(xiàn)之前,需要了解EMAC的基本運(yùn)作機(jī)制。 EMAC接收緩沖處理機(jī)制在EMAC接收數(shù)據(jù)幀之前,需要在RAM區(qū)建立接收緩沖區(qū)隊(duì)列來(lái)暫存數(shù)據(jù)幀,并建立接收緩沖區(qū)描述符隊(duì)列對(duì)這些緩沖區(qū)進(jìn)行描述。描述符隊(duì)列成員由兩個(gè)字組成,第一個(gè)字保存緩沖區(qū)地址,第二個(gè)字保存接收狀態(tài),整個(gè)描述符隊(duì)列的首地址保存到接收隊(duì)列指針寄存器中。當(dāng)有一幀數(shù)據(jù)到達(dá)時(shí),EMAC會(huì)立即讀取接收隊(duì)列指針寄存器得到當(dāng)前緩沖區(qū)描述符的地址,進(jìn)而通過(guò)描述符獲得真正的接收緩沖區(qū)地址,接著EMAC的接收DMA開(kāi)始工作,把收到的數(shù)據(jù)寫(xiě)入接收緩沖區(qū),其中接收隊(duì)列指針寄存器的值會(huì)隨著數(shù)據(jù)幀的不斷到達(dá)自動(dòng)更新。發(fā)送機(jī)制與接收基本相似,這里不再贅述。從EMAC的運(yùn)作機(jī)制可以看出,在進(jìn)行緩沖區(qū)描述符隊(duì)列初始化后,EMAC會(huì)自動(dòng)完成與物理層之間的數(shù)據(jù)接收和發(fā)送,我們要做的是讀取接收緩沖區(qū)內(nèi)的幀或?qū)懭霐?shù)據(jù)幀到發(fā)送緩沖區(qū)。下面描述硬件接口四個(gè)函數(shù)的具體實(shí)現(xiàn):(1)sam7xethinit此函數(shù)用來(lái)初始化以太網(wǎng)硬件,它需要完成以下工作:① 配置EMAC時(shí)鐘和引腳,并使能EMAC與PHY之間的通信;② 復(fù)位PHY芯片,使其進(jìn)入U(xiǎn)TP模式(也就是非屏蔽雙絞線模式),并建立實(shí)際的物理鏈路,在這個(gè)過(guò)程中PHY會(huì)與物理鏈路進(jìn)行自動(dòng)協(xié)商,協(xié)商的結(jié)果用來(lái)設(shè)置EMAC自身的鏈路速度和單雙工方式;③ 初始化緩沖區(qū)描述符,使每個(gè)描述符指向正確的緩沖區(qū)地址,然后將描述符首地址寫(xiě)入到隊(duì)列指針寄存器,同時(shí)初始化描述符的狀態(tài)位;④ 設(shè)置EMAC為MII模式,清除接收和發(fā)送狀態(tài)寄存器,最后配置中斷。(2)sam7xethtx此函數(shù)實(shí)現(xiàn)pbuf內(nèi)數(shù)據(jù)幀到發(fā)送緩沖區(qū)的搬運(yùn)。 sam7xethtx實(shí)現(xiàn)流程首先從描述符中獲得可用的緩沖區(qū)地址,如果沒(méi)有則延遲一段時(shí)間,然后把pbuf內(nèi)數(shù)據(jù)幀復(fù)制到該緩沖區(qū),如果復(fù)制完指定長(zhǎng)度的數(shù)據(jù)幀或到達(dá)數(shù)據(jù)幀尾,那么frame_last標(biāo)志置位。隨后對(duì)當(dāng)前描述符進(jìn)行填充,包括發(fā)送緩沖區(qū)的數(shù)據(jù)實(shí)際長(zhǎng)度、最后一個(gè)緩沖區(qū)標(biāo)記(即frame_last)、WRAP位(如果確實(shí)是最后一個(gè)描述符)。最后根據(jù)frame_last標(biāo)志啟動(dòng)數(shù)據(jù)幀發(fā)送或繼續(xù)搬運(yùn)數(shù)據(jù)幀。(3)sam7xethrx該函數(shù)是底層硬件與上層協(xié)議棧的連接樞紐,它負(fù)責(zé)將接收緩沖區(qū)內(nèi)的一幀數(shù)據(jù)搬運(yùn)到協(xié)議棧的pbuf中。首先跳過(guò)接收緩沖區(qū)內(nèi)的幀碎片,如果有可用的數(shù)據(jù)幀,則獲取幀長(zhǎng),然后調(diào)用LwIP的pbuf_alloc()函數(shù)申請(qǐng)pbuf空間,如果有足夠的pbuf空間,則將數(shù)據(jù)幀從接收緩沖區(qū)復(fù)制到pbuf中,最后使能以太網(wǎng)接收完成中斷。 sam7xethrx實(shí)現(xiàn)流程(4)sam7xeth_isr實(shí)現(xiàn)EMAC中斷的處理,
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1