ã€æ‘˜è¦ã€‘μC/OS-Ⅱ是一個æºç¢¼å…¬é–‹çš„å¯¦æ™‚åµŒå…¥å¼æ“作系統(tÇ’ng),它的特點在于公開的æºä»£ç¢¼ï¼Œå¾ˆå¼·çš„ç§»æ¤æ€§ï¼Œå å…ˆå¼å¤šä»»å‹™(wù),æ¯å€‹ä»»å‹™(wù)有單ç¨çš„æ£§ï¼Œä¸æ–·ç®¡ç†åŠå¾ˆå¼·çš„ç©©(wÄ›n)定性與å¯é 性ç‰ï¼Œç›®å‰è¶Šä¾†è¶Šå—到實時嵌入å¼ç³»çµ±(tÇ’ng)è¨(shè)計者的關(guÄn)注,本文詳細講述了如何把uC/OS-IIæ“作系統(tÇ’ng)ç§»æ¤åˆ°M16C62單片機ä¸ï¼Œå¹¶çµ¦å‡ºäº†ä»¥M16C62å–®ç‰‡æ©Ÿç‚ºæ ¸å¿ƒè™•ç†å™¨æ§‹(gòu)æˆçš„一個實時多任務(wù)系統(tÇ’ng)çš„è¨(shè)計方案。
ã€é—œ(guÄn)éµè©žã€‘åµŒå…¥å¼æ“作系統(tÇ’ng)〠uC/OS-II〠M16C62 單片機〠實時〠多任務(wù)
å‰è¨€
éš¨è‘—å¾®é›»åæŠ€è¡“(shù)和網(wÇŽng)絡(luò)的發(fÄ)展,人們å°ç¶²(wÇŽng)絡(luò)çš„èªè˜æ—¥ç›Šæ·±å…¥ã€‚ç¶²(wÇŽng)絡(luò)終端產(chÇŽn)å“也越來越å—到人們的關(guÄn)æ³¨ï¼ŒåµŒå…¥å¼æ“作系統(tÇ’ng)的應(yÄ«ng)ç”¨ä¹Ÿå¾—åˆ°äº†å‰æ‰€æœªæœ‰çš„發(fÄ)展,人們å°åµŒå…¥å¼çš„ç ”ç©¶ä¹Ÿæœ‰äº†é•·è¶³çš„é€²æ¥ã€‚基于æŸå€‹æ“作系統(tÇ’ng)的實時ã€å¤šä»»å‹™(wù)系統(tÇ’ng)çš„è¨(shè)è¨ˆåˆæ‡‰(yÄ«ng)用æˆç‚ºå–®ç‰‡æ©Ÿæ‡‰(yÄ«ng)用的新的發(fÄ)展趨勢。
uC/OS是一個公開æºä»£ç¢¼çš„åµŒå…¥å¼æ“作系統(tÇ’ng),uC/OS-II是由uC/OS V1.1版å‡ç´šè€Œä¾†ï¼Œåœ¨åŽŸä¾†ç‰ˆæœ¬çš„åŸºç¤Ž(chÇ”)上,uC/OS-II有了許多新功能,如:內(nèi)å˜ç®¡ç†ï¼›åœ¨ä»»å‹™(wù)建立ã€åˆªé™¤ã€ä»»å‹™(wù)切æ›ã€æ™‚é˜ç¯€(jié)æ‹åˆ‡æ›è™•ç†éŽç¨‹ä¸ï¼Œå…許用戶調(dià o)用自定義的函數(shù);支æŒä»»å‹™(wù)控制塊(TCB)功能擴展;能效驗å„å †æ£§ä½¿ç”¨æƒ…æ³ï¼›ä»¥åŠå…¶å®ƒä¸€äº›æ–°åŠŸèƒ½ã€‚M16C62單片機是三è±å…¬å¸åœ¨90年代末推出的新一代16ä½å–®ç‰‡æ©Ÿï¼Œæ˜¯ç›®å‰æ‡‰(yÄ«ng)用最廣泛的16ä½å–®ç‰‡æ©Ÿä¹‹ä¸€ã€‚M16Cæ—單片機èžåˆäº†åŸºäºŽå¯„å˜å™¨å’ŒåŸºäºŽå˜å„²å™¨åž‹å…©ç¨®çµ(jié)æ§‹(gòu)的優(yÅu)é»žï¼Œå¾žè€Œèƒ½å¤ ?qÅ«)å´¿F(xià n)類似RISCçš„é«˜é€Ÿè™•ç†æ€§èƒ½ã€‚M16C62å–®ç‰‡æ©Ÿå…·æœ‰è¶…ä½ŽåŠŸè€—ã€æ¥µå¼·çš„æŠ—干擾能力和很高的C語言編程效率ç‰ç‰¹é»žï¼Œç‰‡å…§(nèi)集æˆäº†10ä½A/D轉(zhuÇŽn)æ›å™¨ã€DMA控制器ã€ç•°æ¥é€šä¿¡é€šé“ã€å®šæ™‚器ç‰è±å¯Œçš„周邊功能電路模塊,éžå¸¸é©åˆæ‡‰(yÄ«ng)用在å°åž‹å¯¦æ™‚ã€å¤šä»»å‹™(wù)ã€åµŒå…¥å¼ç³»çµ±(tÇ’ng)ä¸ã€‚把uC/OS-IIç§»æ¤åˆ°M16C62單片機ä¸ï¼Œå°±å¯ä»¥æ§‹(gòu)æˆä¸€å€‹å¯¦æ™‚多任務(wù)應(yÄ«ng)用系統(tÇ’ng)。下é¢å°±ä¾†è«‡?wù)勅绾伟製C/OS-IIç§»æ¤åˆ°M16C62單片機ä¸ï¼Œå¹¶ä»¥æ¤è¨(shè)計一個實時多任務(wù)系統(tÇ’ng)。
1ã€uC/OS-II的移æ¤
uC/OS-II采用完全å å…ˆå¼çš„實時內(nèi)æ ¸ï¼Œæœ€å¤šå¯ä»¥ç®¡ç†56個任務(wù),æ¯å€‹ä»»å‹™(wù)å°æ‡‰(yÄ«ng)一個ä¸åŒçš„優(yÅu)å…ˆç´šï¼Œå› è€Œï¼ŒuC/OS-IIæ“作系統(tÇ’ng)并䏿”¯æŒæ™‚間片輪轉(zhuÇŽn)調(dià o)度法。但是全部UC/OS-II的函數(shù)調(dià o)用與æœå‹™(wù)的執(zhÃ)行時間是å¯çŸ¥çš„,也就是,uC/OS-II系統(tÇ’ng)æœå‹™(wù)的執(zhÃ)行時間ä¸ä¾è³´äºŽæ‡‰(yÄ«ng)用程åºä»»å‹™(wù)的多少。å¦å¤–,uC/OS-II䏿¯å€‹ä»»å‹™(wù)都有自己單ç¨çš„æ£§ï¼Œæ¯å€‹æ£§çš„大å°å¯ä»¥æ ¹æ“š(jù)應(yÄ«ng)用程åºçš„需è¦é€²è¡Œåˆ†é…,這樣壓低了系統(tÇ’ng)å°RAMçš„éœ€æ±‚ï¼›åœ¨ä¸æ–·ç®¡ç†æ–¹é¢ï¼ŒuC/OS-IIä¸çš„䏿–·å¯ä»¥ä½¿æ£åœ¨åŸ·(zhÃ)行的任務(wù)掛起,如果優(yÅu)先級更高的任務(wù)è¢«ä¸æ–·å–šé†’,則高優(yÅu)先級的任務(wù)åœ¨ä¸æ–·åµŒå¥—全部退出åŽç«‹å³åŸ·(zhÃ)行,uC/OS-IIçš„ä¸æ–·åµŒå¥—å¯é”255層。
uC/OS-IIçš„æºç¢¼å¤§éƒ¨åˆ†æ˜¯ç”¨å¯ç§»æ¤æ€§å¾ˆå¼·çš„ANSI C å¯«çš„ã€‚åªæ˜¯å’Œå¾®è™•ç†å™¨æœ‰é—œ(guÄn)的很å°ä¸€éƒ¨åˆ†ä»£ç¢¼æ˜¯ç”¨åŒ¯ç·¨å¯«çš„,這樣把uC/OS-IIç§»æ¤åˆ°MC16C62ä¸å°±è®Šå¾—相å°å®¹æ˜“å¾ˆå¤šï¼Œä¸»è¦æ˜¯è¦ä¿®æ”¹å’Œè™•ç†å™¨æœ‰é—œ(guÄn)的代碼,如:OS-CPU.Hã€OS-CPU-A.ASMã€OS-CPU-C.C。
(1)ã€OS-CUP.Hé æ–‡ä»¶
OS_CUP.Hé æ–‡ä»¶ä¸»è¦æ˜¯å®šç¾©å’Œè™•ç†å™¨æœ‰é—œ(guÄn)的數(shù)據(jù)類型,在M16C62ä¸çš„æ•¸(shù)據(jù)é¡žåž‹åŒ…æ‹¬ç„¡ç¬¦è™Ÿæ•´åž‹ã€æœ‰ç¬¦è™Ÿæ•´åž‹ã€ç„¡ç¬¦è™Ÿå—ç¬¦åž‹ã€æœ‰ç¬¦è™Ÿå—符型ç‰.å› æ¤,OS_CPU.Hé æ–‡ä»¶å°é€™äº›é¡žåž‹é€²è¡Œå…¨æ–°çš„定義。除了和處ç†å™¨æœ‰é—œ(guÄn)的數(shù)據(jù)類型定義外,在OS-CUP.Hä¸é‚„作了有關(guÄn)䏿–·ç¦æ¢ã€ä¸æ–·å…許ã€å †æ£§çš„增長方å‘ç‰ä¸€äº›ç°¡å–®å®çš„定義。
(2)ã€OS-CPU-A.ASM文件
在OS-CPU-A.ASM文件ä¸åŒ…å«å››å€‹åŒ¯ç·¨èªžè¨€çš„函數(shù):OSStartHighRdy()ã€OSCtxsw()ã€OSIntCtxsw()ã€OSTickISR()。在uC/OS-IIä¸è™•于就緒態(tà i)的任務(wù)çš„å †æ£§çµ(jié)æ§‹(gòu)ï¼Œçœ‹èµ·ä¾†å’Œå‰›ä¸æ–·çš„æƒ…å½¢æ˜¯ä¸€æ¨£çš„ã€‚è¦æƒ³é‹è¡Œæœ€é«˜å„ª(yÅu)先級任務(wù),移æ¤è¦åšçš„æ˜¯å°±æ˜¯å°‡æ‰€æœ‰è™•ç†å™¨çš„寄å˜å™¨æŒ‰é †åºå¾žä»»å‹™(wù)å †æ£§ä¸æ¢å¾©å‡ºä¾†ï¼Œå¹¶ä¸”通éŽä¸€æ¢ä¸æ–·è¿”回語å¥ä¾†å¯¦ç¾(xià n)任務(wù)的切æ›ã€‚å› è€Œï¼ŒOSStartHighRdyï¼ˆï¼‰å°±æ˜¯ä½¿è¦æ¢å¾©çš„任務(wù)å †æ£§æŒ‡é‡æŒ‡åˆ°ä»»å‹™(wù)控制塊的0åå€çš„å…§(nèi)å˜å–®å…ƒä¸ã€‚ä¹Ÿå°±æ˜¯è¦æŠŠä¿å˜åœ¨ä»»å‹™(wù)å †æ£§ä¸çš„æ•¸(shù)據(jù)以åŠCPU寄å˜å™¨,如R0ã€R1ã€R2ã€R3ã€A0ã€A1ã€SBå’ŒFB返回到系統(tÇ’ng)ç•¶å‰çš„寄å˜å™¨ä¸ï¼Œå¹¶æŠŠç•¶å‰å †æ£§æŒ‡é‡æŒ‡åˆ°PC指é‡çš„ä½ç½®ã€‚
在uC/OS-IIä¸ä»»å‹™(wù)的切æ›å•題是通éŽç™¼(fÄ)è»Ÿä»¶ä¸æ–·å‘½ä»¤æˆ–ä¾é 處ç†å™¨åŸ·(zhÃ)行陷阱指令來完æˆçš„ã€‚ä½†æ˜¯ä¸æ–·æœå‹™(wù)例程ã€é™·é˜±æˆ–異常處ç†ä¾‹ç¨‹çš„å‘é‡åœ°å€å¿…é ˆæŒ‡å‘OSCtxSw()。在M16C62單片機ä¸å¯ä»¥é€šéŽå®šç¾©è»Ÿä»¶ä¸æ–·0來完æˆä»»å‹™(wù)的切æ›ã€‚å› è€Œ,在M16C62ä¸çš„䏿–·å‘é‡è¡¨ä¸çš„0è™Ÿè»Ÿä»¶ä¸æ–·åœ°å€æŒ‡å‘OSCtxSWï¼ˆï¼‰ã€‚å°æ‡‰(yÄ«ng)çš„ä¸æ–·è™Ÿç‚º0。
OSInCtxSw()用來在ISRä¸åŸ·(zhÃ)行切æ›åŠŸèƒ½ã€‚ç”±äºŽé€™å€‹å‡½æ•¸(shù)æœ¬èº«å°±æ˜¯åœ¨ä¸æ–·ä¸è¢«èª¿(dià o)ç”¨ï¼Œå› è€Œï¼Œåœ¨ä¸æ–·è™•ç†æ™‚寄å˜å™¨çš„狀態(tà i)已經(jÄ«ng)都被æ£ç¢ºä¿å˜äº†ã€‚在OSInCtxSw()函數(shù)ä¸è¦é€²è¡Œå †æ£§æ¸…ç†å·¥ä½œï¼Œåªæœ‰é€™æ¨£è¢«ä¸æ–·çš„任務(wù)çš„å †æ£§å…§(nèi)容æ‰èƒ½æ£ç¢ºè¿”回。
OSTickISR()這個函數(shù)時UC/OS-IIæ‰€è¦æ±‚的時é˜åŸºæº–ï¼Œå³æ™‚é˜ç¯€(jié)æ‹ï¼ŒuC/OS-II的時é˜ç¯€(jié)æ‹é »çŽ‡åœ¨10到100之間,通常為了計算方便而è¨(shè)為整數(shù)。在M16C62䏿œ‰å¤šå€‹å®šæ™‚計數(shù)器å¯ä»¥é¸æ“‡ç”¨ä¾†ä½œç‚ºç³»çµ±(tÇ’ng)的時é˜åŸºæº–。在該系統(tÇ’ng)ä¸åˆ©ç”¨æ™‚é˜å®šæ™‚器A0來產(chÇŽn)ç”Ÿé »çŽ‡ç‚º100的一個時é˜ç¯€(jié)æ‹.OSTickISRï¼ˆï¼‰æ˜¯ä¸€å€‹ä¸æ–·éŸ¿æ‡‰(yÄ«ng)函數(shù),å› è€Œå¿…é ˆåœ¨M16C62çš„ä¸æ–·å‘é‡è¡¨ä¸,A0çš„ä¸æ–·å‘釿‡‰(yÄ«ng)分é…給OSTickISR(),å°æ‡‰(yÄ«ng)çš„ä¸æ–·å‘é‡è™Ÿæ˜¯21。
(3)ã€OS_CPU_C.C文件
在這個C文件ä¸åŒ…å«6個簡單的C函數(shù),而這6個函數(shù)ä¸å’Œç§»æ¤é—œ(guÄn)系最密切的OSTaskInit()函數(shù),這個函數(shù)是用來創(chuà ng)建一個任務(wù)å †æ£§.OSTaskCreat()和OSTaskExt()就是通éŽèª¿(dià o)用這個函數(shù)來åˆå§‹åŒ–任務(wù)çš„å †æ£§çµ(jié)æ§‹(gòu)çš„,ç”±æ¤çœ‹ä¾†,OSTaskInit()是移æ¤çš„é—œ(guÄn)éµ.在å‰é¢çš„OS_CPU_A.ASM文件ä¸,任務(wù)çš„åˆ‡æ›æ˜¯é€šéŽèª¿(dià o)ç”¨ä¸€å€‹è»Ÿä¸æ–·0來實ç¾(xià n)任務(wù)切æ›ï¼Œé€šéŽä¸æ–·çš„è¿”å›žæŒ‡ä»¤ä½¿å †æ£§ä¸çš„æ•¸(shù)據(jù)返回到CPU寄å˜å™¨,使最高優(yÅu)先級的任務(wù)å æœ‰CPU,å› è€Œ,OSTaskInit()函數(shù)è¦åšçš„å°±æ˜¯æ¨¡æ“¬ä¸æ–·ç™¼(fÄ)生時處ç†å™¨å£“棧的éŽç¨‹,把CPU的寄å˜å™¨å…§(nèi)容壓到任務(wù)å †æ£§ä¸ã€‚在M16C62單片機ä¸,系統(tÇ’ng)åˆ†ç‚ºå…©å€‹å †æ£§,å³ï¼šç”¨æˆ¶å †æ£§å’Œä¸æ–·å †æ£§ï¼Œè€Œåœ¨uC/OS-II進行任務(wù)åˆ‡æ›æ˜¯é€šéŽè»Ÿä¸æ–·0來實ç¾(xià n)çš„ï¼Œå› æ¤,uC/OS-II的任務(wù)å †æ£§æ˜¯M16C62ä¸çš„䏿–·å †æ£§ã€‚在M16C62ä¸ï¼ŒéŸ¿æ‡‰(yÄ«ng)䏿–·åŽå †æ£§çš„狀態(tà i)如圖(一)所示:

圖(一):響應(yÄ«ng)䏿–·åŽçš„å †æ£§ç‹€æ…‹(tà i)
æ–·å †æ£§ä¸ä¾æ¬¡ä¿å˜ç¨‹åºè¨ˆæ•¸(shù)器PC和標志寄å˜å™¨FLGä¸çš„å…§(nèi)å®¹ï¼Œå› æ¤ï¼Œåœ¨å‡½æ•¸(shù)ä¸å°±æ˜¯è¦æ¨¡æ“¬é€™æ¨£çš„一個壓棧éŽç¨‹ã€‚先壓入FLAG的高四ä½å’ŒPC指é‡çš„高四ä½,接著壓入FLAG低ä½ã€PCä¸é–“å…«ä½å’ŒPC的低八ä½ã€‚在ä¿å˜å®ŒP(guÄn)Cå’ŒFLAGä½åŽå°±æ‡‰(yÄ«ng)該為CPU的寄å˜å™¨FBã€SBã€A1ã€A0ã€R3ã€R2ã€R1å’ŒR0分é…相應(yÄ«ng)å˜å„²ç©ºé–“。OSTaskInit()函數(shù)返回的是任務(wù)å †æ£§çš„æŒ‡é‡ã€‚
2ã€å¤šä»»å‹™(wù)系統(tÇ’ng)è¨(shè)計
多任務(wù)系統(tÇ’ng)çš„è¨(shè)計是以M16C62單片機為CPU,以uC/OS-II為æ“作系統(tÇ’ng)æ§‹(gòu)æˆä¸€å€‹å¯¦æ™‚多任務(wù)系統(tÇ’ng),系統(tÇ’ng)包括一個基于SPI總線的溫度傳感器(DS1722)ã€ä¸€å€‹åŸºäºŽI2C總線的實時é˜ï¼ˆX1226)ã€ä¸€å€‹LCD(JM202A)和éµç›¤ã€‚M16C62工作在微處ç†å™¨æ¨¡å¼,片外擴展一個32K×16ä½çš„RAM(Cy7c1021b)和由兩片EEPROM(EEP29010-90)構(gòu)æˆçš„å˜å„²å™¨ã€‚多任務(wù)系統(tÇ’ng)çš„è¨(shè)計主è¦åŒ…括:單片機資æºåˆ†é…和多任務(wù)è¨(shè)計兩個方é¢ã€‚
(1)ã€M16C62單片機資æºåˆ†é…
M16C62單片機是一個16ä½å–®ç‰‡æ©Ÿï¼Œç·šæ€§å°‹å€ç©ºé–“是1M,但片內(nèi)çš„RAM大å°åªæœ‰3Kbyteï¼Œå› æ¤è¦ä½¿å¤šä»»å‹™(wù)系統(tÇ’ng)能æ£å¸¸ç©©(wÄ›n)å®šåœ°å·¥ä½œå¿…é ˆåˆç†åˆ†é…資æºã€‚uC/OS-II䏿‰€æœ‰å…§(nèi)æ ¸ä»£ç¢¼å¿…é ˆåœ¨RAMå€(qÅ«)而把系統(tÇ’ng)å †æ£§å€(qÅ«)劃塊到3K RAM å€(qÅ«)外。通éŽå°Ncrt0.a30å’ŒSect30.inc這兩個M16C62é…置文件,å¯ä»¥å®Œæˆå°å–®ç‰‡æ©Ÿçš„資æºåŠƒåˆ†ã€‚NC30ç·¨è¯å™¨ä¸€é–‹å§‹å°±æœƒç·¨è¯Ncrt0.a30å’ŒSect30.inc這兩個文件,完æˆå°CPUçš„åˆå§‹åŒ–,和資æºåˆ†é…,主è¦åŒ…括:å˜å„²å™¨ç©ºé–“ã€RAMå€(qÅ«)分é…ã€ä¸æ–·å‘é‡åˆ†é…ã€å †æ£§å€(qÅ«)劃分ç‰ã€‚
(2)ã€å¤šä»»å‹™(wù)è¨(shè)計
該系統(tÇ’ng)ä¸é™¤äº†uC/OS-II的空閑任務(wù)外,還包括實時é˜ä»»å‹™(wù)ã€æº«åº¦é‡‡é›†ä»»å‹™(wù)å’Œéµç›¤ä¸æ–·ä»»å‹™(wù)和數(shù)據(jù)å˜å„²ä»»å‹™(wù)。實時é˜ä¸»è¦æ˜¯èƒ½ç²¾ç¢ºè¨˜éŒ„系統(tÇ’ng)的日期,任務(wù)優(yÅu)先級為10,該任務(wù)處于一直工作狀態(tà i);溫度采集任務(wù)的優(yÅu)先級為20ï¼Œä¸»è¦æ˜¯å®Œæˆæº«åº¦æ•¸(shù)據(jù)的采集;數(shù)據(jù)å˜å„²ä»»å‹™(wù)是在溫度發(fÄ)生較大變化的時候記錄當時的時間和溫度,任務(wù)優(yÅu)先級為30,在一般情æ³ä¸‹é€™å€‹ä»»å‹™(wù)是處在掛起狀態(tà i),一旦溫度變動超éŽé 置范åœï¼Œæº«åº¦é‡‡é›†ä»»å‹™(wù)就會發(fÄ)出一個有效信號é‡ä½¿è™•于掛起態(tà i)的數(shù)據(jù)å˜å„²ä»»å‹™(wù)轉(zhuÇŽn)為就緒態(tà i)。éµç›¤ä¸æ–·ä»»å‹™(wù)是通éŽM16C62çš„éµç›¤ä¸æ–·ä¾†å®Œæˆåƒæ•¸(shù)çš„è¨(shè)定,該任務(wù)以䏀個䏿–·è™•ç†å‡½æ•¸(shù)的形å¼ä¾†å®Œæˆçš„。系統(tÇ’ng)çš„ç¨‹åºæµç¨‹åœ–如圖(二)所示。

圖(二):系統(tÇ’ng)ä¸»ç¨‹åºæµåœ–
3ã€çµ(jié)æŸèªž
把uC/OS-IIç§»æ¤åˆ°M16C62單片機ä¸ï¼Œå¹¶ä»¥M16C62單片機為微處ç†å™¨æ§‹(gòu)æˆä¸€å€‹å¯¦æ™‚多任務(wù)系統(tÇ’ng),ä¸åƒ…系統(tÇ’ng)è¨(shè)計簡潔ã€ç¡¬ä»¶çµ(jié)æ§‹(gòu)相å°èˆ‡51系列單片機來說也è¦ç°¡å–®ï¼Œè€Œä¸”具有較強的抗干擾能力和系統(tÇ’ng)ç©©(wÄ›n)定性。以M16C62為微處ç†å™¨ï¼Œä»¥uC/OS-II為實時æ“作系統(tÇ’ng)æ§‹(gòu)æˆçš„多任務(wù)系統(tÇ’ng)能廣泛應(yÄ«ng)用在å°åž‹å¯¦æ™‚多任務(wù)系統(tÇ’ng)ä¸ï¼Œå…·æœ‰è¼ƒå¥½çš„æ‡‰(yÄ«ng)ç”¨å‰æ™¯ã€‚