版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、5.2 最簡單的多任務(wù)模型目 錄任務(wù)切換模型范例分析任務(wù)切換模型范例分析雙任務(wù)切換模型雙任務(wù)切換模型 待解決的問題待解決的問題setTaskJmp()的實(shí)現(xiàn)task 1雙任務(wù)切換模型task 0任務(wù)切換 雙任務(wù)是多任務(wù)最簡單的典型情況,而任務(wù)切換是學(xué)習(xí)多任務(wù)操作系統(tǒng)的重點(diǎn)和難點(diǎn)。多任務(wù)操作系統(tǒng)核心的基本原理在源代碼層次,任務(wù)也是一個(gè)函數(shù)。task 1task 0雙任務(wù)切換模型 雙任務(wù)是多任務(wù)最簡單的典型情況,而任務(wù)切換是學(xué)習(xí)多任務(wù)操作系統(tǒng)的重點(diǎn)和難點(diǎn)。任務(wù)切換task 0.1task 0.2task 1.1task 1.2可將任務(wù)函數(shù)分成若干程序段。在源代碼層次,任務(wù)也是一個(gè)函數(shù)。longjm
2、p(jbTask0)setjmp(jbTask1)longjmp(jbTask1)setjmp(jbTask0)雙任務(wù)切換模型|setjmp和longjmp的作用 雙任務(wù)是多任務(wù)最簡單的典型情況,而任務(wù)切換是學(xué)習(xí)多任務(wù)操作系統(tǒng)的重點(diǎn)和難點(diǎn)。任務(wù)切換task 0.1task 0.2task 1.1task 1.2若要實(shí)現(xiàn)函數(shù)之間的跳轉(zhuǎn),可使用非局部跳轉(zhuǎn)函數(shù)setjmp()和longjmp()。雙任務(wù)切換模型|setjmp和longjmp的作用 雙任務(wù)是多任務(wù)最簡單的典型情況,而任務(wù)切換是學(xué)習(xí)多任務(wù)操作系統(tǒng)的重點(diǎn)和難點(diǎn)。任務(wù)切換task 0.1task 0.2task 1.1task 1.2保存t
3、ask0上下文setjmp(jbTask1)longjmp(jbTask1)setjmp(jbTask0)longjmp(jbTask0)若要實(shí)現(xiàn)函數(shù)之間的跳轉(zhuǎn),可使用非局部跳轉(zhuǎn)函數(shù)setjmp()和longjmp()。恢復(fù)task1上下文并跳轉(zhuǎn)雙任務(wù)切換模型|setjmp和longjmp的作用 雙任務(wù)是多任務(wù)最簡單的典型情況,而任務(wù)切換是學(xué)習(xí)多任務(wù)操作系統(tǒng)的重點(diǎn)和難點(diǎn)。任務(wù)切換task 0.1task 0.2task 1.1task 1.2setjmp(jbTask1)longjmp(jbTask1)setjmp(jbTask0)longjmp(jbTask0)若要實(shí)現(xiàn)函數(shù)之間的跳轉(zhuǎn),可使用
4、非局部跳轉(zhuǎn)函數(shù)setjmp()和longjmp()。task 0.1task 1.1雙任務(wù)切換模型和程序分析任務(wù)切換task 0.2task 1.2setjmp(jbTask1)longjmp(jbTask1)setjmp(jbTask0)longjmp(jbTask0)task 0task 1void task0(void) task0Init(); while (1) task0_program1; ctmp = setjmp(jbTask0); if (ctmp = 0) longjmp(jbTask1); task0_program2; void task1(void) task1In
5、it(); while (1) task1_program1; ctmp = setjmp(jbTask1); if (ctmp = 0) longjmp(jbTask0); task1_program2; 雙任務(wù)切換模型和程序分析task 0.2task 1.2setjmp(jbTask1)longjmp(jbTask1)setjmp(jbTask0)longjmp(jbTask0)void task0(void) task0Init(); while (1) task0_program1; ctmp = setjmp(jbTask0); if (ctmp = 0) longjmp(jbTa
6、sk1); task0_program2; void task1(void) task1Init(); while (1) task1_program1; ctmp = setjmp(jbTask1); if (ctmp = 0) longjmp(jbTask0); task1_program2; task 0.1task 1.1task 0task 1任務(wù)0和1都初始化完成雙任務(wù)切換模型和程序分析task 0.2task 1.2setjmp(jbTask1)longjmp(jbTask1)setjmp(jbTask0)longjmp(jbTask0)void task0(void) task
7、0Init(); while (1) task0_program1; ctmp = setjmp(jbTask0); if (ctmp = 0) longjmp(jbTask1); task0_program2; void task1(void) task1Init(); while (1) task1_program1; ctmp = setjmp(jbTask1); if (ctmp = 0) longjmp(jbTask0); task1_program2; task 0.1task 1.1task 0task 1任務(wù)0和1都已運(yùn)行,并保存了各自的上下文雙任務(wù)切換模型和程序分析task
8、0.2task 1.2setjmp(jbTask1)longjmp(jbTask1)setjmp(jbTask0)longjmp(jbTask0)void task0(void) task0Init(); while (1) task0_program1; ctmp = setjmp(jbTask0); if (ctmp = 0) longjmp(jbTask1); task0_program2; void task1(void) task1Init(); while (1) task1_program1; ctmp = setjmp(jbTask1); if (ctmp = 0) longj
9、mp(jbTask0); task1_program2; task 0.1task 1.1task 0task 1則使用longjmp(jbTask1)后,切換到setjmp(jbTask1) 保存的位置0運(yùn)行運(yùn)行task0.1task0.1保存task0上下文雙任務(wù)切換模型和程序分析task 0.2task 1.2setjmp(jbTask1)longjmp(jbTask1)longjmp(jbTask0)void task0(void) task0Init(); while (1) task0_program1; ctmp = setjmp(jbTask0); if (ctmp = 0)
10、longjmp(jbTask1); task0_program2; void task1(void) task1Init(); while (1) task1_program1; ctmp = setjmp(jbTask1); if (ctmp = 0) longjmp(jbTask0); task1_program2; task 0.1task 1.1task 0task 1setjmp(jbTask0)在5.1.2小節(jié)中,已約定setjmp()返回值是0,longjmp()返回值是1?;謴?fù)task1上下文并跳轉(zhuǎn)1ctmp =雙任務(wù)切換模型和程序分析task 0.2task 1.2setjm
11、p(jbTask1)longjmp(jbTask1)longjmp(jbTask0)void task0(void) task0Init(); while (1) task0_program1; ctmp = setjmp(jbTask0); if (ctmp = 0) longjmp(jbTask1); task0_program2; void task1(void) task1Init(); while (1) task1_program1; ctmp = setjmp(jbTask1); if (ctmp = 0) longjmp(jbTask0); task1_program2; ta
12、sk 0.1task 1.1task 0task 1setjmp(jbTask0)在5.1.2小節(jié)中,已約定setjmp()返回值是0,longjmp()返回值是1。1 0 1ctmp =目 錄任務(wù)切換模型范例分析任務(wù)切換模型范例分析雙任務(wù)切換模型雙任務(wù)切換模型 待解決的問題待解決的問題setTaskJmp()的實(shí)現(xiàn)待解決的問題如何讓任務(wù)互不干擾地運(yùn)行 在上一小節(jié)的描述中,僅是說明任務(wù)正確運(yùn)行后的模型,若要編寫多任務(wù)操作系統(tǒng),還有兩個(gè)重要問題需要解決。待解決的問題 在上一小節(jié)的描述中,僅是說明任務(wù)正確運(yùn)行后的模型,若要編寫多任務(wù)操作系統(tǒng),還有兩個(gè)重要問題需要解決。在源代碼層次,任務(wù)也是一個(gè)函數(shù)
13、。當(dāng)函數(shù)在運(yùn)行期間被中斷打斷時(shí),將如何處理?void task0(void) task0Init(); while (1) task0_program1; . task0_program2; 如何讓任務(wù)互不干擾地運(yùn)行中斷響應(yīng)過程中的現(xiàn)場保護(hù)與恢復(fù)函數(shù)函數(shù)中斷過程堆棧指針與堆棧指針與bpbpSDCC編譯器自動(dòng)處理壓棧出棧,無需軟件干預(yù)。返回地址返回地址通用寄存器通用寄存器中斷請(qǐng)求現(xiàn)場保護(hù)R0R7ACCBPSWDPLDPHPCLPCHSPbp時(shí)間中斷響應(yīng)過程中的現(xiàn)場保護(hù)與恢復(fù)中斷服務(wù)函數(shù)函數(shù)中斷過程中斷請(qǐng)求現(xiàn)場恢復(fù)時(shí)間堆棧指針與堆棧指針與bpbp返回地址返回地址通用寄存器通用寄存器R0R7ACCB
14、PSWDPLDPHPCLPCHSPbp函數(shù)現(xiàn)場保護(hù)中斷響應(yīng)過程中的現(xiàn)場保護(hù)與恢復(fù)函數(shù)函數(shù)中斷過程中斷請(qǐng)求現(xiàn)場保護(hù)時(shí)間保證運(yùn)行的函數(shù)在中斷前后,執(zhí)行結(jié)果不變的條件:如R0 R7、ACC、B、SP、DPL、DPH等寄存器如函數(shù)內(nèi)的局部變量、計(jì)算表達(dá)式的中間值 不改變通用寄存器的值;1 不改變函數(shù)使用的堆棧內(nèi)容。2 在源代碼層次,任務(wù)也是一個(gè)函數(shù),任務(wù)的正確運(yùn)行條件與函數(shù)一致。中斷服務(wù)現(xiàn)場恢復(fù)函數(shù)間空棧堆務(wù)任間空棧堆務(wù)任任務(wù)切換中的現(xiàn)場保護(hù)與恢復(fù)任務(wù)切換過程義務(wù)1任務(wù)0任務(wù)切換時(shí)間setjmp(jbTask0)longjmp(jbTask1)PCLPCHSPbpPCLPCHSPbpR0R7ACCBP
15、SWDPTR任務(wù)堆??臻g R0R7ACCBPSWDPTR任務(wù)堆棧空間 間空棧堆務(wù)任任務(wù)切換中的現(xiàn)場保護(hù)與恢復(fù)任務(wù)切換過程任務(wù)0任務(wù)切換時(shí)間PCLPCHSPbpR0R7ACCBPSWDPTR任務(wù)堆棧空間 每個(gè)任務(wù)的堆棧須相互獨(dú)立,互不干擾間空棧堆務(wù)任任務(wù)堆棧空間 義務(wù)1setjmp(jbTask0)longjmp(jbTask1)任務(wù)切換中的現(xiàn)場保護(hù)與恢復(fù)任務(wù)切換過程任務(wù)0任務(wù)切換義務(wù)0時(shí)間setjmp(jbTask0)longjmp(jbTask1)setjmp(jbTask1)longjmp(jbTask0)任務(wù)切換PCLPCHSPbp間空棧堆務(wù)任R0R7ACCBPSWDPTR任務(wù)堆??臻g
16、間空棧堆務(wù)任任務(wù)堆??臻g 義務(wù)1任務(wù)切換互不干擾地運(yùn)行條件讓任務(wù)互不干擾地運(yùn)行條件: 不改變通用寄存器的值;1 不改變?nèi)蝿?wù)函數(shù)使用的堆棧內(nèi)容。2解決方法: 通過setjmp()和longjmp()函數(shù)配對(duì)調(diào)用;1 每個(gè)任務(wù)有各自獨(dú)立的堆??臻g。2任務(wù)切換過程任務(wù)0時(shí)間setjmp(jbTask0)longjmp(jbTask1)任務(wù)切換任務(wù)切換義務(wù)1義務(wù)0setjmp(jbTask1)longjmp(jbTask0)待解決的問題如何讓任務(wù)互不干擾地運(yùn)行 在上一小節(jié)的描述中,僅是說明任務(wù)正確運(yùn)行后的模型,若要編寫多任務(wù)操作系統(tǒng),還有兩個(gè)重要問題需要解決。主函數(shù)int main() return
17、0;如何讓任務(wù)運(yùn)行 事實(shí)上,系統(tǒng)在啟動(dòng)時(shí)沒有一個(gè)任務(wù)存在,即沒有一個(gè)任務(wù)在運(yùn)行。而任務(wù)的切換必須setjmp()和longjmp()函數(shù)配對(duì)調(diào)用。void task0(void) task0Init(); while (1) task0_program1; ctmp = setjmp(jbTask0); if (ctmp = 0) longjmp(jbTask1); task0_program2; 任務(wù)0task0();沒setjmp(task1),則無法跳轉(zhuǎn)如何讓任務(wù)運(yùn)行 事實(shí)上,系統(tǒng)在啟動(dòng)時(shí)沒有一個(gè)任務(wù)存在,即沒有一個(gè)任務(wù)在運(yùn)行。而任務(wù)的切換必須setjmp()和longjmp()函數(shù)配對(duì)
18、調(diào)用。主函數(shù)int main() return 0;task1();void task0(void) task0Init(); while (1) task0_program1; ctmp = setjmp(jbTask0); if (ctmp = 0) longjmp(jbTask1); task0_program2; 任務(wù)0void task1(void) task1Init(); while (1) task1_program1; ctmp = setjmp(jbTask1); if (ctmp = 0) longjmp(jbTask0); task1_program2; 任務(wù)1沒set
19、jmp(task0),則無法跳轉(zhuǎn)如何讓任務(wù)運(yùn)行 事實(shí)上,系統(tǒng)在啟動(dòng)時(shí)沒有一個(gè)任務(wù)存在,即沒有一個(gè)任務(wù)在運(yùn)行。而任務(wù)的切換必須setjmp()和longjmp()函數(shù)配對(duì)調(diào)用。主函數(shù)int main() return 0;void task0(void) task0Init(); while (1) task0_program1; ctmp = setjmp(jbTask0); if (ctmp = 0) longjmp(jbTask1); task0_program2; 任務(wù)0void task1(void) task1Init(); while (1) task1_program1; ctm
20、p = setjmp(jbTask1); if (ctmp = 0) longjmp(jbTask0); task1_program2; 任務(wù)1setTaskJmp() setTaskJmp() setTaskJmp(); task1(); 模擬setjmp()函數(shù)目 錄任務(wù)切換模型范例分析任務(wù)切換模型范例分析雙任務(wù)切換模型雙任務(wù)切換模型 待解決的問題待解決的問題setTaskJmp()的實(shí)現(xiàn)setjmp()的工作內(nèi)容 若要用setTaskJmp()模擬任務(wù)調(diào)用setjmp(),需先明白任務(wù)調(diào)用setjmp()所做的工作。 將返回地址壓入任務(wù)堆棧;1 保存bp到任務(wù)上下文中;2 保存堆棧指針S
21、P到任務(wù)上下文中;3 保存返回地址到任務(wù)上下文中。4堆棧指針SP的值增加2int setjmp( jmp_buf environment );是保存上下文信息的“緩沖區(qū)”,相當(dāng)于“任務(wù)堆?!?、每個(gè)任務(wù)有指定的入口地址;2、每個(gè)任務(wù)有各自獨(dú)立的堆??臻g。setTaskJmp()函數(shù)名稱名稱setTaskJmp()函數(shù)原型函數(shù)原型void setTaskJmp(void (* pfuncTask)(void), idata unsigned char *pucStk, jmp_buf jbTaskContext)輸入?yún)?shù)輸入?yún)?shù)pfuncTask: 指向任務(wù)函數(shù)的指針pucStk: 任務(wù)堆棧的指
22、針jbTaskContext: 任務(wù)上下文的存儲(chǔ)位置返回值返回值NONE描述描述模擬創(chuàng)建任務(wù)函數(shù)setTaskJmp( task0, _GucTaskStks0, _GjbTask0);task0任務(wù)函數(shù)的地址task0任務(wù)堆棧的位置保存task0的上下文信息extern unsigned char bp;char setjmp (jmp_buf jbBuf) data unsigned char *pucBuf = (data void *)0; pucBuf = (data unsigned char *)jbBuf; *pucBuf+ = bp; *pucBuf+ = SP; *pucB
23、uf+ = *(data unsigned char *)SP; *pucBuf+ = *(data unsigned char *)(char)(SP - 1); return 0;setjmp()函數(shù)setTaskJmp()模擬調(diào)用setjmp()函數(shù)/ 保存當(dāng)前bp的值/ 保存返回地址高8位/ 將pucBuf初始化為/ 空指針,避免程序異常。/ 保存當(dāng)前SP的值/ 保存返回地址低8位/ 返回0setTaskJmp()模擬調(diào)用setjmp()函數(shù)extern unsigned char bp;char setjmp (jmp_buf jbBuf) data unsigned char *p
24、ucBuf = (data void *)0; pucBuf = (data unsigned char *)jbBuf; *pucBuf+ = bp; *pucBuf+ = SP; *pucBuf+ = *(data unsigned char *)SP; *pucBuf+ = *(data unsigned char *)(char)(SP - 1); return 0;setjmp()函數(shù)/ 保存當(dāng)前bp的值/ 保存返回地址高8位/ 將pucBuf初始化為/ 空指針,避免程序異常。/ 保存當(dāng)前SP的值/ 保存返回地址低8位/ 返回0 void setTaskJmp ( void(*pfu
25、ncTask)(void), uchar *pucStk, jmp_buf TaskContext ) idata uchar *pucBuf = (data void *)0; *pucBuf = (uchar *) jbTaskContext; *pucBuf+ = 0; *pucBuf+ = (uchar *) (pucStk+2); *pucBuf+ = (uint) pfuncTask) / 256; *pucBuf = (uint) pfuncTask)%256 ;setTaskJmp()函數(shù)/ 指向jbTaskContex數(shù)組/ 保存返回地址高8位/ 指向上下文信息/ 存儲(chǔ)位置的
26、指針/ 保存SP,SP + 2保存返回地址/ 保存返回地址低8位/ 保存bp模擬模擬setjmp()調(diào)用壓棧返回地址的操作調(diào)用壓棧返回地址的操作目 錄任務(wù)切換模型范例分析任務(wù)切換模型范例分析雙任務(wù)切換模型雙任務(wù)切換模型 待解決的問題待解決的問題setTaskJmp()的實(shí)現(xiàn)任務(wù)切換模型范例分析|主函數(shù)1、為每個(gè)任務(wù)分配獨(dú)立的堆??臻g;2、調(diào)用setTaskJmp()函數(shù),模擬任務(wù)調(diào)用setjmp()函數(shù);3、調(diào)用longjmp進(jìn)入任務(wù)0,并開始運(yùn)行。static idata uchar _GucTaskStks232; static jmp_buf _GjbTask0; static jmp_buf _GjbTask1; void main(void) setTaskJmp(task0,_GucTaskStks0,GjbTask0); setTaskJmp(task1,_GucTaskStks1,GjbTask1); longjmp(_GjbTask0); / 任務(wù)1上下文/ 分配堆棧/ 任務(wù)0上下文主函數(shù)的工作內(nèi)容:跳轉(zhuǎn)到跳轉(zhuǎn)到task0的任務(wù)函數(shù)的任務(wù)函數(shù)static idata uchar _GucTaskStks232; static jmp_buf _GjbTask0; static jmp
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高科技研發(fā)中心建設(shè)合同范本3篇
- 政策對(duì)加油站的影響
- 2025年度裝配式建筑個(gè)人工程承包合同范本3篇
- 2025年銷售薪資與團(tuán)隊(duì)管理合同范本3篇
- 2025年度商業(yè)地產(chǎn)車位代理銷售與增值服務(wù)合同4篇
- 2025年度科研論文撰寫與工程招標(biāo)文件編制一體化服務(wù)合同4篇
- 二零二五版草原承包權(quán)流轉(zhuǎn)與草原生態(tài)補(bǔ)償合同3篇
- 2024年08月重慶銀行瀘州分行招考筆試歷年參考題庫附帶答案詳解
- 2024年08月中國光大銀行寧波分行零售客戶經(jīng)理招聘筆試歷年參考題庫附帶答案詳解
- 2024年08月福建福建海峽銀行總行小企業(yè)金融部總經(jīng)理選聘筆試歷年參考題庫附帶答案詳解
- OQC培訓(xùn)資料教學(xué)課件
- 2024年8月CCAA國家注冊審核員OHSMS職業(yè)健康安全管理體系基礎(chǔ)知識(shí)考試題目含解析
- 體育賽事組織與實(shí)施操作手冊
- 2024年浙江省公務(wù)員考試結(jié)構(gòu)化面試真題試題試卷答案解析
- 2023年航空公司招聘:機(jī)場安檢員基礎(chǔ)知識(shí)試題(附答案)
- 皮膚儲(chǔ)存新技術(shù)及臨床應(yīng)用
- 外研版七年級(jí)英語上冊《閱讀理解》專項(xiàng)練習(xí)題(含答案)
- 《現(xiàn)在完成時(shí)》語法復(fù)習(xí)課件(共44張-)
- 二年級(jí)下冊語文《第3單元 口語交際:長大以后做什么》課件
- 2024年遼寧石化職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫必考題
- 上海市復(fù)旦大學(xué)附中2024屆高考沖刺模擬數(shù)學(xué)試題含解析
評(píng)論
0/150
提交評(píng)論