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

正文內(nèi)容

ucos-2內(nèi)核在80c51系列單片機(jī)上的移植研究(編輯修改稿)

2025-07-25 10:04 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 它具有內(nèi)核可裁減性,可確定性的特點(diǎn),并提供很多系統(tǒng)服務(wù),比如信號(hào)量,互斥信號(hào)量,事件標(biāo)志,消息郵箱,消息隊(duì)列,內(nèi)存的分配和釋放等。目標(biāo)機(jī)——80C51 硬件資源在系統(tǒng)移植之前,必須先了解目標(biāo)機(jī)的硬件資源,然后根據(jù)特定的硬件編寫(xiě)相應(yīng)的代碼。80C51 系列單片機(jī)具有結(jié)構(gòu)簡(jiǎn)單,應(yīng)用靈活等特點(diǎn)。其硬件資源如下:CPU:8 位的微處理器;內(nèi)存:片內(nèi) RAM(128B),片外 RAM(64KB)、片內(nèi) ROM(4KB),片外 EPROM(64KB);時(shí)鐘:片內(nèi)振蕩器和時(shí)鐘產(chǎn)生電路,振蕩頻率為 6~12MHZ,2 個(gè) 16 位定時(shí)/ 計(jì)數(shù)器;中斷:5 個(gè)中斷源,兩級(jí)中斷;外設(shè):4 個(gè) 8 位并行 I/O 接口 P0~P3;1 個(gè)全雙工的串行 I/O 口(UART)。移植中采用的編譯器移植中采用 KeilCx51 編譯器,整個(gè)移植在 KeilCx51 開(kāi)發(fā)平臺(tái)上進(jìn)行。KeilCx51 是 Keil 公司的一款針對(duì) C5l 系列單片機(jī)的編譯器,版本為 ,它是目前最高效的,靈活的 80C51開(kāi)發(fā)平臺(tái)。在 KeilCx51 環(huán)境下移植 uC/OSII 可直接進(jìn)行軟件仿真,仿真過(guò)程中不必將程序下載到硬件上運(yùn)行。等程序在軟件仿真平臺(tái)測(cè)試通過(guò)后,直接將其燒錄到硬件芯片上。的模塊簡(jiǎn)介由于設(shè)計(jì) uC/OSII 時(shí)就考慮到了在不同處理器上移植,因而移植 uC/OSII 實(shí)際上需要修改的代碼量很小。整個(gè)嵌入收稿日期:20220423Email:作者簡(jiǎn)介:趙建華(1982-)(WSN)無(wú)線傳感器網(wǎng)絡(luò)(WSN)80C51)摘要:介紹了一種實(shí)時(shí)操作系統(tǒng)——-2097-式系統(tǒng)的結(jié)構(gòu)如圖 1 所示,uC/OSII 內(nèi)核可以分為與處理器無(wú)關(guān)的代碼,無(wú)處理器相關(guān)的代碼以及與應(yīng)用相關(guān)的代碼 3 個(gè)部分。移植中只需修改與處理器相關(guān)部分的文件,即包括:, 和 ,其它代碼幾乎不需要改變。2具體移植步驟以下是移植的步驟,分別修改各個(gè)與硬件相關(guān)的文件。 修改 文件 中包含兩部分的代碼,數(shù)據(jù)類型定義代碼和與處理器相關(guān)的代碼。移植主要修改與處理器相關(guān)代碼。首先定義:EA=0 關(guān)中斷;EA=1 開(kāi)中斷。這樣定義即減少了程序行數(shù),又避免了退出臨界區(qū)后關(guān)中斷造成的死機(jī)。由于 MCS51堆棧從下往上增長(zhǎng)(1=向下,0= 向上),所以 OS_STK_GROWTH定義為 0。最后,把 OSCtxSw()預(yù)定義為 OS_TASK_SW()。因?yàn)?MCS51 沒(méi)有軟中斷指令,所以用程序調(diào)用代替。實(shí)踐表明,對(duì)于 MCS51,用子程序調(diào)用入棧,用中斷返回指令 RETI出棧是沒(méi)有問(wèn)題的。在沒(méi)有中斷發(fā)生的情況下復(fù)位中斷系統(tǒng)也不會(huì)影響系統(tǒng)正常運(yùn)行。修改 文件在這個(gè)文件中,只需要修改任務(wù)堆棧初始化函數(shù) OSTaskStkInit()。uC/OSII 中每個(gè)任務(wù)都有自己的堆棧空間,并且必須聲明為 OS_STK 類型,主要完成對(duì)用戶任務(wù)的堆棧進(jìn)行初始化。OSTaskStkInit()函數(shù)總是返回棧頂?shù)刂?。為了說(shuō)明這個(gè)函數(shù)的工作流程,我們自己設(shè)計(jì)了一個(gè)堆??臻g,如圖 2 所示。其中 OSTCBCur 指向當(dāng)前任務(wù)控制塊 TCB,TCB 結(jié)構(gòu)體中 OSTCBStkPtr 指向用戶堆棧的棧頂,用戶堆棧長(zhǎng)度存放在用戶堆棧的最底部,長(zhǎng)度之上空間存放系統(tǒng)堆棧映像,即:用戶堆棧空間大小=系統(tǒng)堆??臻g大小+1。SP 總是先加 1 再存數(shù)據(jù),因此,SP 初始時(shí)指向系統(tǒng)堆棧起始地址(OSStack)減 1 處(即 OSStkStart)。很明顯系統(tǒng)堆棧存儲(chǔ)空間大小=(SP–OSStkStart)。任務(wù)切換時(shí),先保存當(dāng)前任務(wù)堆棧內(nèi)容。即把系統(tǒng)棧數(shù)據(jù)拷貝到用戶棧。方法是:用(SPOSStkStar)得出保存字節(jié)數(shù),將其寫(xiě)入用戶堆棧最低地址內(nèi),以用戶堆棧最低地址為起址,以 OSStkStart 為系統(tǒng)堆棧起址,由系統(tǒng)棧向用戶??截悢?shù)據(jù),循環(huán)(SPOSStkStart)次,每次拷貝前先將各自棧指針增 1。其次,恢復(fù)最高優(yōu)先級(jí)任務(wù)系統(tǒng)堆棧。方法是:獲得最高優(yōu)先級(jí)任務(wù)用戶堆棧最低地址,從中取出“長(zhǎng)度 Length”,以最高優(yōu)先級(jí)任務(wù)用戶堆棧最低地址為起址,以 OSStkStart 為系統(tǒng)堆棧起址,由用戶棧向系統(tǒng)棧拷貝數(shù)據(jù),循環(huán)“長(zhǎng)度 length”數(shù)值指示的次數(shù),每次拷貝前先將各自棧指針增 1。用戶堆棧初始化時(shí)從下向上依次保存:用戶堆棧長(zhǎng)度(15),PCL,PCH,PSW,ACC,B,DPL,DPH,R0,R1,R2,R3,R4,R5,R6,R7。不保存 SP,任務(wù)切換時(shí)根據(jù)用戶堆棧長(zhǎng)度計(jì)算得出。修改 文件 uC/OSII 移植實(shí)例要求用戶編寫(xiě) 4 個(gè)簡(jiǎn)單匯編語(yǔ)言函數(shù):?OSStartHighRdy//使就緒態(tài)任務(wù)中優(yōu)先級(jí)最高的任務(wù)開(kāi)始運(yùn)行?OSCtxSw//低優(yōu)先級(jí)任務(wù)切換到高優(yōu)先級(jí)任務(wù)?OSTickISR//時(shí)鐘節(jié)拍中斷?OSIntCtxSw//在 ISR 中執(zhí)行任務(wù)切換功能 修改 OSStartHighRdyOSStartHighRdy 主要完成高優(yōu)先級(jí)任務(wù)寄存器的恢復(fù)。必須恢復(fù)該任務(wù)在 CPU 使用權(quán)被剝奪時(shí)保留下來(lái)的全部寄存器的值,以便讓這個(gè)高優(yōu)先級(jí)任務(wù)能夠繼續(xù)運(yùn)行。即把用戶堆棧中的 PCL,PCH,PSW,ACC,B,DPL,DPH,R0,R1,R2,R3,R4,R5,R6,R7 全部拷貝到系統(tǒng)堆棧,然后系統(tǒng)堆棧再進(jìn)行 POP 操作,將保存的這些值彈出到 CPU 的各個(gè)寄存器。使得此高優(yōu)先級(jí)任務(wù)得到運(yùn)行。其中部分關(guān)鍵代碼如下:MOVXA,@DPTR。調(diào)整 DPTR,使其指向用戶堆棧的最低地址MOVR5,A。R5=用戶堆棧長(zhǎng)度,因?yàn)槎褩iL(zhǎng)度放在用戶堆棧最低處MOVR0,OSStkStart。OSSktStart 為系統(tǒng)堆棧起始地址restore_stack:。從用戶堆棧到系統(tǒng)堆棧的 copyINCDPTRINCR0MOVXA,@DPTRMOV@R0,ADJNZR5,restore_stackPOPALL。為自定義宏,將所有寄存器實(shí)現(xiàn)出棧 修改 OSCtxSwOSCtxSw 為任務(wù)切換函數(shù),實(shí)現(xiàn)從低優(yōu)先級(jí)任務(wù)到高優(yōu)先級(jí)任務(wù)切換。要實(shí)現(xiàn)任務(wù)切換,一般包括兩個(gè)過(guò)程:①保存當(dāng)前低優(yōu)先級(jí)任務(wù)的全部寄存器的值以及堆棧的長(zhǎng)度值;②恢復(fù)高優(yōu)先級(jí)任務(wù)以前在 CPU 使用權(quán)被剝奪時(shí)保存下來(lái)的全部寄存器的值,即前一個(gè)匯編程序 OSStartHighRdy 實(shí)現(xiàn)的功能。其中部分關(guān)鍵代碼如下:。以下代碼完成第①步操作圖1uC/OSⅡ軟件體系結(jié)構(gòu)時(shí)鐘 CPU 其它設(shè)備應(yīng)用程序軟件uC/OSⅡ設(shè)置(與應(yīng)用相關(guān)的代碼)OS_CFGHⅡ.uCOS_Ⅱ.uC/OSⅡ移植(與處理器相關(guān)的代碼) 圖2 自定義的用戶堆棧和系統(tǒng)堆棧結(jié)構(gòu)用戶堆棧長(zhǎng)度長(zhǎng)度低地址系統(tǒng)硬件堆棧長(zhǎng)度=SPOSStkStart低地址101不關(guān)心OSStackOSStkStartSPOSTCBCurOSTCBCur→OSTCBStkPtr……uC/OSⅡ(與處理器無(wú)關(guān)的代碼)-2098-PUSHALL。 用戶定義的宏,將全部 CPU 寄存器保存到系統(tǒng)堆棧MOVA,SP。以下 3 句實(shí)現(xiàn)獲得堆棧的長(zhǎng)度SUBBA,OSStkStartMOVR5,A。R5 里保存堆棧長(zhǎng)度,并將其保存在用戶堆棧最底下save_stack:。以下實(shí)現(xiàn)從系統(tǒng)堆棧到用戶堆棧的拷貝INCDPTR。指向用戶堆棧INCR0。指向系統(tǒng)堆棧MOVA,@R0MOVX@DPTR,ADJNZR5,save_stack。而第②步代碼和 OSStartHighRdy 代碼一樣,除此之外,將當(dāng)前優(yōu)先級(jí)最高任務(wù)的任務(wù)控制塊指針 OSTCBHighRdy 賦值給當(dāng)前任務(wù)控制塊指針 OSTCBCur。修改 OSTickISRuC/OSII 要求用戶提供一個(gè)周期性的時(shí)鐘源,來(lái)實(shí)現(xiàn)時(shí)間的延遲和超時(shí)功能。我們選用 8051 的 T0 定時(shí)器作為 tick時(shí)鐘。OSTickISR 函數(shù)為時(shí)鐘節(jié)拍中斷服務(wù)程序,當(dāng)產(chǎn)生計(jì)時(shí)和定時(shí)中斷時(shí),執(zhí)行此函數(shù)。此函數(shù)和其它中斷服務(wù)子程序一樣,都先要保存斷點(diǎn)和保存現(xiàn)場(chǎng),然后執(zhí)行用戶代碼,最后對(duì)恢復(fù)保存的寄存器值。其中關(guān)鍵代碼:CSEGAT000BH。0BH 為 0 號(hào)定時(shí)器 T0 的入口地址LJMPOSTickISR。跳轉(zhuǎn)到中斷服務(wù)子程序OSTickISR:PUSHALL。保存所有寄存器的宏CLRTR0。后面 4 句為設(shè)置 T0 的工作方式以及賦值MOVTH0,70H。定義 Tick=50 次/ 秒(即 秒/次)MOVTL0,00H。 和 OS_TICKS_PER_SECSETBTR0LCALL_?OSTimeTick。調(diào)用系統(tǒng) Tick 函數(shù)LCALL_?OSIntExit。系統(tǒng)函數(shù),決定是否使得高優(yōu)先級(jí)任務(wù)就緒POPALL。出棧修改 OSIntCtxSwOSIntExit 通過(guò)調(diào)用 OSIntCtxSw,在 ISR 中執(zhí)行任務(wù)切換功能。因?yàn)?OSIntCtsSw 是在 ISR 中被調(diào)用的,所以假定寄存器都被正確地保存了被中斷的任務(wù)的堆棧之中。因此,OSIntCtxSw 和上文中 OSCtxSw 的代碼基本相同,差別僅僅在于開(kāi)始之前少了一個(gè) POPALL 操作。3實(shí)驗(yàn)及其結(jié)果分析移植完成后,緊接著就是移植的正確性驗(yàn)證。下面是移植測(cè)試實(shí)驗(yàn)以及對(duì)實(shí)驗(yàn)結(jié)果的分析。實(shí)驗(yàn)的條件和指導(dǎo)思想實(shí)驗(yàn)必須確保在 Cx51 編譯器和鏈接器的正常工作的情況下進(jìn)行。主要指導(dǎo)思想是測(cè)試修改過(guò)的 OSStartHighRdy(),OSTaskStkInitOSCtxSw,OSIntCtxSw ,OSTickISR 等 5 個(gè)函數(shù),測(cè)試其在 Cx51 環(huán)境下運(yùn)行是否正常。 實(shí)驗(yàn)的過(guò)程和結(jié)果實(shí)驗(yàn)過(guò)程主要包括以下 3 個(gè)步驟:①創(chuàng)建兩個(gè)任務(wù) Task1和 Task2,驗(yàn)證 OSTaskStkInit 和 OSStartHighRdy()函數(shù);②創(chuàng)建Task1 和 Task2 后,通過(guò)二者之間的切換,驗(yàn)證 OSCtxSw 函數(shù);③初始化時(shí)鐘,開(kāi)中斷。Task1 和 Task2 各自睡眠一段時(shí)間(Task2 睡眠時(shí)間是 Task1 的 2 倍)。等睡眠時(shí)間到達(dá)后,根據(jù)各自輸出的不同結(jié)果,驗(yàn)證 OSIntCtxSw 和 OSTickISR 函數(shù)。主要測(cè)試代碼如下:OSTaskCreate(Task1,(void*)0,amp。TaskSkt1[0],2)。OSTaskCreate(Task2,(void*)0,amp。TaskSkt2[0],10)。voidTask1(void*data1)reentrant{for(。){PrintStr(\\n)。OSTimeDly(OS_TICKS_PER_SEC)。}}voidTask2(
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)教案相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1