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

正文內(nèi)容

畢業(yè)設(shè)計(jì)-基于單片機(jī)的多任務(wù)程序設(shè)計(jì)(編輯修改稿)

2025-01-08 18:49 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 合編程的總體思想是用 C語(yǔ)言編寫(xiě)程序主 體,用匯編語(yǔ)言來(lái)編寫(xiě)具體的某個(gè)功能模塊,下面主要介紹編寫(xiě)具有 C51接口的匯編模塊。 對(duì)于匯編模塊首先將其處理成一個(gè)單獨(dú)的匯編源代碼文件 (擴(kuò)展名為 .asm),然后在 C51 程序中用關(guān)鍵字 extern 將該模塊聲明為外部函數(shù)。所以主要的工作是編寫(xiě)匯編模塊,具體有一下兩種方法: 西南大學(xué)本科畢業(yè)論文(設(shè)計(jì)) 14 (1)編寫(xiě)一個(gè)有函數(shù)頭無(wú)函數(shù)體或者函數(shù)體很簡(jiǎn)單的 C語(yǔ)言函數(shù),把它放置在單獨(dú)的文件中,通過(guò)生成資源文件 (.src)來(lái)獲得相應(yīng)的匯編模塊結(jié)構(gòu),然后在這個(gè)文件中進(jìn)行匯編語(yǔ)言的編寫(xiě),最后將資源文件的擴(kuò)展名改為 .asm. (2)編寫(xiě)功能完善的 C語(yǔ)言函數(shù) ,同樣將其放置在單獨(dú)的文件中,然后編譯生成資源文件 (.src),最后將其擴(kuò)展名改為 .asm 3 以 KEIL 為開(kāi)發(fā)平臺(tái)基于 AT89C51單片機(jī)的多任務(wù)調(diào)度器設(shè)計(jì) 多任務(wù)調(diào)度器是多任務(wù)系統(tǒng)的核心,他 就像是一位管家,管理 CPU在各個(gè)任務(wù) (本文中的任務(wù)與函數(shù)在某種程度上是等價(jià)的 )之間進(jìn)行跳轉(zhuǎn)以及為用戶創(chuàng)建的任務(wù)提供系統(tǒng) 函數(shù)。 用戶在設(shè)計(jì)各個(gè)任務(wù)時(shí) 只需調(diào)用它提供的系統(tǒng)函數(shù),而 不用關(guān)心調(diào)度器的原理和運(yùn)行情況,就好 像它 不存在 一樣。 調(diào)度器在任務(wù)需要延時(shí)和系統(tǒng)時(shí)鐘中斷到來(lái)時(shí)將進(jìn)行任務(wù)切換 調(diào)度器為用戶提供的 系統(tǒng)函數(shù)如 圖 1所示: 圖 1 系統(tǒng)函數(shù) system function 系統(tǒng)函數(shù) (C 函數(shù) )都被定義為可重入函數(shù),因?yàn)樗麄兌伎赡茉谌蝿?wù)中被調(diào)用即可能被打斷。 多任務(wù)系統(tǒng)結(jié)構(gòu)圖如圖 2所示: 多任務(wù)調(diào)度器系統(tǒng)函數(shù) 創(chuàng)建任務(wù)函數(shù) 任務(wù)堆棧初始化函數(shù) 任務(wù)延時(shí)函數(shù) 任務(wù)切換函數(shù) 時(shí)鐘中斷處理函數(shù) 時(shí)鐘中斷重置函數(shù) 啟動(dòng)多任務(wù)系統(tǒng)函數(shù) 西南大學(xué)本科畢業(yè)論文(設(shè)計(jì)) 15 圖 2 多任務(wù)結(jié)構(gòu)圖 multitasking structure chart 多任務(wù)系統(tǒng)程序設(shè)計(jì)的主要結(jié)構(gòu) 如下 void main() { Initial_System()。 Task_Create(task0,amp。Task_Stack0[0],0)。 Task_Create(task1,amp。Task_Stack1[0],1)。 Task_Create(task2,amp。EMPTYTASK[0],3)。 Start_System()。 } Task0,task1,task2 是任務(wù)函數(shù)名 并且它們都被聲明為可重入函數(shù)。 用戶 在針對(duì)不同問(wèn)題編程時(shí) 只需編寫(xiě) task0,task1, Initial_System()和 task2, 而 task2 是空閑任務(wù)它只需進(jìn)行任務(wù)切換 而 task0 和 task1 不能互相調(diào)用, 它們 是兩個(gè)相對(duì)獨(dú)立的函數(shù) 。 task0 和 task1 的結(jié)構(gòu)如下: void task0() reentrant { While(1) { 添加代碼 任務(wù) 1 任務(wù) 2 任務(wù) 3 多任務(wù)調(diào)度器 時(shí)鐘中斷到來(lái) 調(diào)用延時(shí)函數(shù) 西南大學(xué)本科畢業(yè)論文(設(shè)計(jì)) 16 } } Void task1() reentrant { While(2) { 添加代碼 } } 當(dāng)函數(shù) task0 正 在運(yùn)行時(shí),因?yàn)樗陨硎菬o(wú)限循環(huán)結(jié)構(gòu),通常情況下 task1 是不會(huì)得到運(yùn)行的。為了能讓 task1也得到運(yùn)行 ,調(diào)度器首先 在 task0 運(yùn)行前 開(kāi)啟時(shí)鐘中斷, 并為 task0 和 task1 開(kāi)辟各自的任務(wù)堆??臻g, 當(dāng) 時(shí)鐘中斷到來(lái)時(shí),系統(tǒng)會(huì)去執(zhí)行時(shí)鐘中斷處理函數(shù),而時(shí)鐘中斷處理函數(shù)將 task0 任務(wù)的工作環(huán)境 保存到 task0的任務(wù)堆棧中,然后恢復(fù) task1 的任務(wù)堆棧,因?yàn)槿蝿?wù)堆棧中保存了 任務(wù) 程序代碼的地址,當(dāng)中斷處理函數(shù)返回時(shí), 系統(tǒng) 會(huì)自動(dòng)跳到 task1 代碼中, 同時(shí) task0 通過(guò) 調(diào)用調(diào)度器的系統(tǒng)延時(shí)函數(shù), task1 也能得到運(yùn)行,因?yàn)橄到y(tǒng)延時(shí)函數(shù)調(diào)用了任務(wù)切換函數(shù)。 創(chuàng)建任務(wù) 對(duì)于每一個(gè)任務(wù) (函數(shù) ),它都有一套自己的寄存器 , 局部變量 和仿真堆棧,當(dāng)進(jìn)行任務(wù)切換時(shí),這些內(nèi)容都必須保護(hù)起來(lái),等到下次運(yùn)行時(shí)再恢復(fù), 而保護(hù)在這里的意思就是將它們放在一個(gè)安全的地方,這個(gè)地方就是任務(wù)堆棧。 為了使系統(tǒng)能夠找到任務(wù), 必須在創(chuàng)建任務(wù)時(shí)定義一種全局?jǐn)?shù)據(jù)結(jié)構(gòu),它將保存任務(wù)的狀態(tài) (運(yùn)行狀態(tài),任務(wù)堆棧地址,任務(wù)延時(shí)計(jì)數(shù) ), 本文中此結(jié)構(gòu)就是任務(wù)控制塊 TCB,它的定義如下: struct TCB { uchar xdata *Taskstack_Bottom。 uchar T_state。 uint T_delay。 }。 西南大學(xué)本科畢業(yè)論文(設(shè)計(jì)) 17 Taskstack_Bottom 為任務(wù)堆棧底指針, T_state 為任務(wù)狀態(tài)變量, T_delay 為任務(wù)延時(shí)計(jì)數(shù)。 首先根據(jù)任務(wù)數(shù)創(chuàng)建一個(gè)全局任務(wù)控制塊數(shù)組 和 全局 任務(wù)堆棧數(shù)組 ,然后在創(chuàng)建具體任務(wù)時(shí)對(duì)其進(jìn)行初始化。 所以創(chuàng)建任務(wù)就是初始化任務(wù)堆棧和 初始化 任務(wù)控制塊。 創(chuàng)建任務(wù)函數(shù)定義如下: void Task_Create(void (code *pointer)(void),uchar xdata *stack,uchar Taskid) reentrant pointer 為函數(shù)指針, stack 為任務(wù)堆棧棧底指針, Taskid 為任務(wù) id 創(chuàng)建任務(wù)函數(shù)流程圖如圖 3所示 : 圖 3 創(chuàng)建任務(wù) 函數(shù) 流程圖 create task function flow chart 任務(wù)堆棧初始化 在啟動(dòng)多任務(wù) 系統(tǒng)之前,創(chuàng)建的各個(gè)任務(wù)的任務(wù)堆??雌饋?lái)應(yīng)該是 像 剛發(fā)生過(guò)中斷一樣, 也就通過(guò)任務(wù)堆棧系統(tǒng)能夠找到該任務(wù)所對(duì)應(yīng)的代碼。 在 C51 中由于內(nèi)部 ram 資源太小只有 128B,因此本文將全局變量、 任務(wù)堆棧 、仿真堆棧 都放 在外部數(shù)據(jù)存儲(chǔ)區(qū)中,在任務(wù)創(chuàng)建過(guò)程中,對(duì)任務(wù)堆棧初始化 是關(guān)鍵點(diǎn) 。由于每一個(gè)任務(wù)都被聲明為可重入函數(shù),系統(tǒng)會(huì)將任務(wù)的局部變量和參數(shù)放置在仿真堆棧中,所以保存仿真堆棧和仿真堆棧指針也是必須的, C51 系統(tǒng)仿真堆棧指針有 3種類(lèi)型,由于本文將仿真堆棧放置在任務(wù)堆棧的頂部,而任務(wù)堆棧被安排在外部數(shù)據(jù)存儲(chǔ)區(qū)中,所以此時(shí)的仿真堆棧指針為 C_XBP(指向仿真堆棧的棧底 ),為雙字節(jié)指針。 開(kāi)始 結(jié)束 任務(wù)堆棧初始化 任務(wù)控制塊初始化 西南大學(xué)本科畢業(yè)論文(設(shè)計(jì)) 18 任務(wù)堆棧要保存的內(nèi) 容就是任務(wù)運(yùn)行時(shí)所有寄存器的值,仿真堆棧的內(nèi)容和仿真堆棧指針, 圖 4較直觀的說(shuō)明了任務(wù)堆棧的整體結(jié)構(gòu)。 圖 4 任務(wù) 堆棧結(jié)構(gòu) task stack structure 硬件堆棧為 SP 所指向的堆棧 C_BXP 和 C_BXP+1指向仿真堆棧底部 任務(wù)堆棧初始化設(shè)計(jì)如圖 5所示 : 硬件堆棧長(zhǎng)度 硬件堆棧 C_XBP C_XBP+1 仿真堆??臻g 任務(wù)堆棧頂部 剩余空間 仿真堆棧底部 西南大學(xué)本科畢業(yè)論文(設(shè)計(jì)) 19 圖 5 初始化后的任務(wù)堆棧 the task stack after initial 因?yàn)槿蝿?wù)堆棧初始化關(guān)系到系統(tǒng)能否正常啟動(dòng),所以特別將該函數(shù)代碼寫(xiě)出來(lái),如下所示: void Task_Initial(void (code *p)(void),uchar xdata *s) reentrant { uchar xdata *stack=s。 *stack++=17。 *stack++=(uint)pamp。0xFF。 *stack++=(uint)p8。 17 (uint)pamp。0xFF (uint)(s+LENGTH)8 (uint)p8 ACC B PSW psw DPH DPL 從此處往上八格為 R0R7 (uint)(s+LENGTH)amp。0XFF 西南大學(xué)本科畢業(yè)論文(設(shè)計(jì)) 20 *stack++=0x11。//ACC *stack++=0x22。//B *stack++=0x00。//PSW *stack++=0x00。//DPH *stack++=0x00。//DPL *stack++=0x00。//R0 *stack++=0x01。//R1 *stack++=0x02。//R2 *stack++=0x03。//R3 *stack++=0x04。//R4 *stack++=0x05。//R5 *stack++=0x06。//R6 *stack++=0x07。//R7 *stack++=(uint)(s+LENGTH)8。//?C_XBP 高字節(jié) *stack++=(uint)(s+LENGTH)amp。0XFF。//?C_XBP+1 } 其中 p為函數(shù)指針 (指向函數(shù)首部 ), s 為任務(wù)堆棧首地址, LENGTH 為任務(wù)堆??傞L(zhǎng)度, 17 為硬件 堆棧長(zhǎng)度。對(duì)于任務(wù)堆棧初始化最重要的 就是設(shè)置好 任務(wù)堆棧長(zhǎng)度,函數(shù)指針,和仿真堆棧指針。 任務(wù)控制塊初始化 任務(wù)控制塊初始化就是對(duì) 結(jié)構(gòu)圖成員 變量 Taskstack_Bottom, T_state 和T_delay 初始化 。 Taskstack_Bottom 指向任務(wù)堆棧棧底;任務(wù)有 ready 和 delay 狀態(tài),初始化時(shí)將 T_state 設(shè)置為 ready 就緒態(tài); T_delay 賦值 0即任務(wù)沒(méi)有延時(shí)。 任務(wù)切換 系統(tǒng)函數(shù) 當(dāng)任務(wù)調(diào)用任務(wù)切換函數(shù) 或調(diào)用系統(tǒng)延時(shí)函數(shù) 后,系統(tǒng)將轉(zhuǎn)去執(zhí)行其它任務(wù) ,即此任務(wù)主動(dòng)放棄 CPU 使用權(quán) 。對(duì)于多任務(wù)系統(tǒng)任務(wù) 切換 函數(shù)是相當(dāng)重要的,它僅次于時(shí)鐘中斷處理函數(shù)。 任務(wù)切換就是將當(dāng)前任務(wù)的硬件堆棧和仿真堆棧指針入任務(wù)堆棧,同時(shí)將下一個(gè)將要運(yùn)行的任務(wù)的硬件堆棧和仿真堆棧指針出任務(wù)堆棧。 西南大學(xué)本科畢業(yè)論文(設(shè)計(jì)) 21 因?yàn)檫M(jìn)行出棧入棧要直接操作硬件寄存器,而 C51 無(wú)法直接操 作系統(tǒng)寄存器,所以必須用匯編語(yǔ)言編寫(xiě)任務(wù)切換函數(shù),所以編寫(xiě)時(shí)要特別注意相關(guān)數(shù)據(jù)的傳遞,和指針的變化情況。這里就要用到前面介紹的混合編程,在 C 文件中用 extern 聲明該函數(shù)即可直接調(diào)用。 任務(wù)切換函數(shù)流程圖如圖 6所示 : 圖 6 任務(wù)切換函數(shù)流程圖 task switch function flow chart 對(duì)于任務(wù)切換,它根據(jù) 全局任務(wù)控制塊結(jié)構(gòu)體指針變量 CURRENT(在啟動(dòng)多任務(wù)系統(tǒng)時(shí)被初始化 ),找到 正在運(yùn)行任務(wù)的任務(wù)控制塊和 即將運(yùn)行任務(wù)的任務(wù)控制塊 ,在匯編文件中 聲明其為外部變量后,就可以根據(jù)它們 找到正在 運(yùn)行任務(wù)的任務(wù)堆棧和將要被運(yùn)行的任務(wù)的任務(wù)堆棧 (此處需要特別注意,通過(guò) CURRENT 和 NEXT 可以找到Taskstack_Bottom),然后進(jìn)行入棧和出棧操作,完成任務(wù)切換 。 在進(jìn)行任務(wù)切換時(shí)首先是將中斷關(guān)閉,切換完成后再開(kāi)中斷,這樣做是為了保證開(kāi)始 重新 設(shè)置系統(tǒng)節(jié)拍時(shí)鐘 找到下次要運(yùn)行 的任務(wù) 開(kāi)中斷, 中斷返回 關(guān)中斷 寄存器和仿真堆棧指針入硬件堆棧 計(jì)算硬件堆棧長(zhǎng)度 存入 T 由 CURRENT找到當(dāng)前任務(wù)的任務(wù)堆棧 將 T傳送至任務(wù)堆棧底 將硬件堆棧復(fù)制到任務(wù)堆棧 T之后 將該任務(wù)的 TCB 指針賦給 CURRENT 由 CURRENT找到下一個(gè)任務(wù)的堆棧 出棧 (其順序與入棧相反 ) 西南大學(xué)本科畢業(yè)論文(設(shè)計(jì)) 22 在切換時(shí)不被外部打擾,防止程序進(jìn)入不可預(yù)知狀態(tài)。 任務(wù)切換函數(shù) 為 switchtask(),任務(wù)可直接調(diào)用 。 時(shí)鐘中斷處理函數(shù) 由于本文采用的是時(shí)間片調(diào)度算法,所以時(shí)鐘中斷的處理 就非常重要,同樣它也是用匯編語(yǔ)言編寫(xiě)。當(dāng)時(shí)鐘中斷到來(lái)時(shí),系統(tǒng)自動(dòng)跳轉(zhuǎn) 到時(shí)鐘中斷處理函數(shù), 處理過(guò)程首先是將當(dāng)前任務(wù)硬件堆棧和仿真堆棧指針入棧,然后將任務(wù)控制塊數(shù)組中處于等待狀態(tài)任務(wù)的等待時(shí)間計(jì)數(shù)減一,如果該值由 1 變成 0 則將該任務(wù)的狀態(tài)設(shè)置為ready(就緒態(tài) ),然后找到下一個(gè)將要運(yùn)行的任務(wù),恢復(fù)該任務(wù)寄存器并執(zhí)行該任務(wù) ,它的功能與任務(wù)切換函數(shù)類(lèi)似 。 特別說(shuō)明, 51 單片機(jī)中的中斷處理函數(shù)不能被其它函數(shù)調(diào)用,也沒(méi)有參數(shù)傳遞,它只在發(fā)生中斷時(shí)由系統(tǒng)調(diào)用。 其流程圖如圖 7所示 : 圖 7 時(shí)鐘中斷處理函數(shù)流程圖 timer interrupt processing flow chart 任務(wù)延時(shí) 當(dāng)前運(yùn)行的任務(wù)除了在時(shí)鐘到來(lái)時(shí)會(huì)放棄 CPU使用權(quán)之外,也可以利用延時(shí)函數(shù)主動(dòng)放
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1