1ã€æ¦‚è¿°
åœ¨åµŒå…¥å¼æ‡‰ç”¨ç³»çµ±ä¸ä½¿ç”¨åµŒå…¥å¼æ“作系統å¯ä»¥æé«˜æ‡‰ç”¨ç³»çµ±çš„開發效率和æå‡åµŒå…¥å¼æ‡‰ç”¨ç³»çµ±çš„穩定å¯é æ€§ï¼Œå› æ¤ï¼Œåœ¨åµŒå…¥å¼æ‡‰ç”¨ç³»çµ±ä¸ä½¿ç”¨åµŒå…¥å¼æ“作系統將æˆç‚ºåµŒå…¥å¼æ‡‰ç”¨ç³»çµ±çš„è¨è¨ˆä¸»æµ[1]。μC/OS-II是由美國å¸è€…Labrosseè¨è¨ˆçš„一個優秀的嵌入å¼å¯¦æ™‚æ“作系統[2],它是一個æºç¢¼å…¬é–‹ã€å¯ç§»æ¤ã€å¯å›ºåŒ–ã€å¯è£å‰ªã€å å…ˆå¼çš„實時多任務æ“作系統,目å‰å·²ç¶“得到廣泛應用。
μC/OS-IIæä¾›äº†æ“ä½œç³»çµ±å¿…é ˆå…·å‚™çš„åŸºæœ¬åŠŸèƒ½ï¼ŒåŒ…æ‹¬ï¼šä»»å‹™ç®¡ç†ã€ä¿¡è™Ÿé‡ç®¡ç†ã€éƒµç®±ç®¡ç†ã€æ¶ˆæ¯éšŠåˆ—管ç†ã€äº‹ä»¶ç®¡ç†ã€æ™‚間管ç†ã€å…§å˜ç®¡ç†ï¼Œä½†å®ƒä¸æä¾›è¨å‚™ç®¡ç†å’Œæ–‡ä»¶ç³»çµ±ç®¡ç†ï¼Œå·²æœ‰ç ”究者å°Î¼C/OS-II進行了文件å系統功能擴展[3]。在實際應用ä¸ï¼Œå°ç³»çµ±è¨å‚™çš„æœ‰æ•ˆç®¡ç†ä¹Ÿæ˜¯ä¸€å€‹éžå¸¸é‡è¦çš„ä»»å‹™ï¼Œå› æ¤ï¼Œéœ€è¦å°Î¼C/OS-II進行擴展,以實ç¾é€™ä¸€åŠŸèƒ½ã€‚æœ¬æ–‡ç‚ºÎ¼C/OS-IIè¨è¨ˆäº†ä¸€å€‹å°ç³»çµ±è¨å‚™é€²è¡Œçµ±ä¸€ç®¡ç†çš„é€šç”¨é©…å‹•æ¡†æž¶ï¼Œåœ¨æ¤æ¡†æž¶ä¸‹ï¼Œå¯ä»¥å±è”½ç³»çµ±ç¡¬ä»¶çš„差異,在無約æŸåœ°ç™¼æ®ç¡¬ä»¶èƒ½åŠ›çš„å‰æä¸‹ï¼Œç‚ºä¸Šå±¤æ‡‰ç”¨æä¾›äº†çµ±ä¸€ã€ä¸€è‡´çš„調用接å£API,從而實ç¾äº†å°ç³»çµ±è¨å‚™çš„æœ‰æ•ˆç®¡ç†ã€‚
2ã€Î¼C/OS-II下通用驅動框架的基本模型
為了給上層應用æä¾›çµ±ä¸€ã€ä¸€è‡´çš„系統è¨å‚™èª¿ç”¨æŽ¥å£ï¼Œéœ€è¦å°ä¸Šå±¤æ‡‰ç”¨ç¨‹åºå°ç³»çµ±è¨å‚™çš„è¨ªå•æ“作進行抽象,在這方é¢ï¼ŒUnix系統和Linux系統åšå¾—比較æˆåŠŸ[4][5]。本文借鑒了UnixåŠLinux系統的æˆåŠŸç¶“é©—ï¼ŒåŒæ™‚è€ƒæ…®åˆ°åµŒå…¥å¼æ“作系統的特殊性,為μC/OS-II建立了如圖1所示的通用驅動框架模型。在圖1所示的通用驅動框架模型ä¸ï¼Œå…±åŒ…括三個層次:
(1ï¼‰ä¸Šå±¤è¨ªå•æŠ½è±¡æŽ¥å£å±¤ï¼šåœ¨é€™ä¸€å±¤ï¼Œé€šéŽå°è¨å‚™è¨ªå•æ“作的抽象,為上層應用æä¾›äº†5å€‹è¨ªå•æŽ¥å£API:UDFOpenã€UDFReadã€UDFWriteã€UDFIoctrlã€UDFClose,分別用于打開è¨å‚™ã€è®€è¨å‚™ã€å¯«è¨å‚™ã€è¨å‚™æŽ§åˆ¶å’Œé—œé–‰è¨å‚™ã€‚
(圖1 通用驅動框架模型)
(2)è¨å‚™ç®¡ç†æ ¸å¿ƒæ•¸æ“šçµæ§‹å±¤ï¼šé€™æ˜¯é€šç”¨é©…å‹•æ¡†æž¶çš„æ ¸å¿ƒï¼Œåœ¨é€™ä¸€å±¤ï¼Œç‚ºç³»çµ±ä¸çš„æ¯å€‹ç¡¬ä»¶è¨å‚™åˆ†é…唯一的è¨å‚™å,上層應用程åºé€šéŽå°‡è¨å‚™åä½œç‚ºåƒæ•¸å‚³éžçµ¦UDFOpen函數實ç¾å°ç›¸æ‡‰è¨å‚™çš„æ ¸å¿ƒç®¡ç†æ•¸æ“šçµæ§‹çš„定ä½å°‹å€ï¼Œé€šéŽå°‹å€ï¼ŒUDFOpen函數得到相應è¨å‚™çš„æ ¸å¿ƒç®¡ç†æ•¸æ“šçµæ§‹ï¼Œå¹¶å®šä½åˆ°ç›¸æ‡‰çš„è¨å‚™é©…動模塊,ç²å¾—相應硬件è¨å‚™çš„æ“ä½œå‡½æ•¸è¡¨ï¼Œå†é€šéŽä¸Šå±¤è¨ªå•抽象接å£å±¤çš„其他接å£å‡½æ•¸UDFReadã€UDFWriteã€UDFIoctrlå’ŒUDFClose實ç¾å°è¨å‚™çš„çµ±ä¸€è¨ªå•æŽ§åˆ¶ã€‚
(3)硬件è¨å‚™é©…動模塊層:這一層是硬件è¨å‚™é©…動模塊功能的實ç¾å±¤ï¼Œå°å„個硬件è¨å‚™çš„驅動在相應的硬件è¨å‚™é©…動模塊ä¸å®Œæˆã€‚å„個硬件è¨å‚™é©…動模塊,原則上需è¦å¯¦ç¾å¦‚下幾個函數:devOpenã€devReadã€devWriteã€devIoctrlå’Œ devClose分別完æˆç›¸æ‡‰è¨å‚™çš„æ‰“é–‹ã€è®€ã€å¯«ã€æŽ§åˆ¶å’Œé—œé–‰ï¼Œç•¶ç„¶ï¼Œå¯ä»¥æ ¹æ“šå…·é«”è¨å‚™çš„特性,åªå¯¦ç¾5個驅動函數的其ä¸ä¸€éƒ¨åˆ†ï¼Œä¾‹å¦‚,如果æŸè¨å‚™ä¸æ”¯æŒå¯«æ“作,那么就ä¸ç”¨å¯¦ç¾devWrite函數。
下é¢ï¼Œå°è©²æ¨¡åž‹çš„工作原ç†é€²è¡Œç°¡å–®æè¿°ï¼šé¦–先,在上層應用程åºå¯ä»¥è¨ªå•硬件è¨å‚™ä¹‹å‰ï¼Œéœ€è¦é¦–先打開欲æ“作的è¨å‚™ï¼Œé€™å¯ä»¥é€šéŽèª¿ç”¨â€œä¸Šå±¤è¨ªå•抽象接å£å±¤â€çš„UDFOpen函數實ç¾ã€‚上層應用程åºå°‡æ¬²æ‰“é–‹çš„è¨å‚™çš„è¨å‚™å傳éžçµ¦UDFOpen函數,UDFOpen函數通éŽè©²è¨å‚™å從“è¨å‚™ç®¡ç†æ ¸å¿ƒæ•¸æ“šçµæ§‹â€ä¸å¾—到相應è¨å‚™çš„æ ¸å¿ƒæ•¸æ“šçµæ§‹ï¼Œé€²è€Œå¾—到相應è¨å‚™çš„æ“ä½œå‡½æ•¸è¡¨ï¼Œå¹¶èª¿ç”¨è¨å‚™é©…動模塊的devOpen函數å°è¨å‚™é€²è¡Œåˆå§‹åŒ–,當完æˆç›¸æ‡‰è¨å‚™çš„åˆå§‹åŒ–åŽï¼ŒUDFOpen函數返回給上層應用程åºä¸€å€‹å¥æŸ„ï¼Œé€™å€‹å¥æŸ„是上層應用程åºé€²è¡ŒåŽçºŒè¨å‚™æ“作的基礎。ç¾åœ¨å‡è¨ä¸Šå±¤æ‡‰ç”¨ç¨‹åºéœ€è¦å¾žè¨å‚™ä¸è®€å–數據,這是通éŽèª¿ç”¨â€œä¸Šå±¤è¨ªå•抽象接å£å±¤â€çš„UDFRead函數完æˆçš„:上層應用程åºå°‡UDFOpen函數返回的è¨å‚™å¥æŸ„和相關的讀å–åƒæ•¸å‚³éžçµ¦UDFRead函數,UDFRead函數通éŽè©²å¥æŸ„從“è¨å‚™ç®¡ç†æ ¸å¿ƒæ•¸æ“šçµæ§‹â€ä¸å¾—到相應è¨å‚™çš„æ ¸å¿ƒæ•¸æ“šçµæ§‹ï¼Œé€²è€Œå¾—到相應è¨å‚™çš„æ“ä½œå‡½æ•¸è¡¨ï¼Œå¹¶èª¿ç”¨è¨å‚™é©…動模塊的devRead函數å°è¨å‚™é€²è¡Œè®€å–æ“作,當完æˆè®€å–æ“作åŽï¼Œå°‡è®€å–到的數據返回給上層應用程åºã€‚其它的æ“作如UDFWriteã€UDFIoctrlå’ŒUDFClose是類似的。
3ã€Î¼C/OS-II下通用驅動框架的實ç¾
3.1 實ç¾ç’°å¢ƒ
本文在以下的環境ä¸å¯¦ç¾äº†æ‰€è¨è¨ˆçš„通用驅動框架:開發工具采用ARMå…¬å¸çš„ADS 1.2,目標æ¿é‡‡ç”¨å‘¨ç«‹åŠŸå…¬å¸é–‹ç™¼è¨è¨ˆçš„以LPC2210為微控制器的SmartARM2210開發æ¿[6]。LPC2210是一顆以ARM7TDMI-Sç‚ºæ ¸å¿ƒçš„å¾®æŽ§åˆ¶å™¨ï¼Œæ”¯æŒ8ä½ã€16ä½ã€32ä½ç¸½ç·šï¼Œå…·æœ‰è±å¯Œçš„片內外è¨ï¼Œå…¶ä¸å°±åŒ…括兩個具有16Bytes FIFOçš„UART接å£å’Œé«˜é€ŸI2C接å£ã€‚開發主機通éŽEasyJTAG連接目標æ¿ä»¥å»ºç«‹äº¤å‰é–‹ç™¼èª¿è©¦ç’°å¢ƒã€‚
3.2 è¨å‚™ç®¡ç†æ ¸å¿ƒè¨è¨ˆæ•¸æ“šçµæ§‹çš„è¨è¨ˆå¯¦ç¾
如上文所述:通用驅動框架以“è¨å‚™ç®¡ç†æ ¸å¿ƒæ•¸æ“šçµæ§‹â€ç‚ºæ ¸å¿ƒï¼Œå®ƒåœ¨æ¨¡åž‹ä¸èµ·è‘—承上啟下的作用。è¨å‚™ç®¡ç†æ ¸å¿ƒæ•¸æ“šçµæ§‹åŒ…æ‹¬å…©å€‹çµæ§‹ï¼š
UDFFramework和UDFOperations,定義如下:
typedef struct ï½›
INT8U deviceName[UDF_MAX_NAME]; //è¨å‚™å
INT8U deviceType; //1—塊è¨å‚™, 2—å—符è¨å‚™;
INT8U canShared; //0——-ä¸å¯å…±äº«ä½¿ç”¨, 1—å¯å…±äº«ä½¿ç”¨
INT16U openCount; //å°äºŽå…±äº«è¨å‚™ï¼Œæ¤å—段為打開次數計數;
UDFOperations op; //è¨å‚™é©…動模塊æä¾›çš„è¨å‚™æ“作函數表;
ï½ UDFFramework;
è©²çµæ§‹æè¿°äº†ç³»çµ±è¨å‚™çš„特性,包括:è¨å‚™åã€è¨å‚™é¡žåž‹ã€å…±äº«è¨å‚™çš„æ‰“開計數ã€è¨å‚™æ“作函數表ç‰ï¼Œé€šéŽå»ºç«‹UDFFrameworkçµæ§‹çš„一個數組來æè¿°ç³»çµ±ä¸çš„æ‰€æœ‰è¨å‚™ï¼Œå¹¶é€šéŽè¨å‚™åå—æ®µdeviceName實ç¾å°è¨å‚™æ“作函數表UDFOperationsçµæ§‹çš„尋地定ä½ã€‚UDFOperationsçµæ§‹å®šç¾©å¦‚下:
typedef struct ï½›
INT32S (*devOpen)(void *pd);
INT32S (*devRead)(INT8S *buffer, INT32U blen, INT32U lenToRead, INT8U waitType);
INT32S (*devWrite)(INT8S *buffer, INT32U lenToWrite, INT8U waitType);
INT32S (*devIoctl)(INT32U too, void *pd);
INT32S (*devClose)(void *pd);
ï½ UDFOperations;
è©²çµæ§‹å®šç¾©äº†ç›¸æ‡‰è¨å‚™çš„æ“ä½œå‡½æ•¸è¡¨ï¼Œå…·é«”çš„æ“作函數的實ç¾åœ¨ç›¸æ‡‰çš„è¨å‚™é©…å‹•æ¨¡å¡Šä¸æä¾›ï¼Œé€šéŽä½¿ç”¨é€šç”¨é©…動框架的è¨å‚™é©…動安è£å‡½æ•¸å¯ä»¥å°‡è¨å‚™é©…動模塊安è£åˆ°UDFFrameworkçµæ§‹ä¸ã€‚
3.3 ä¸Šå±¤è¨ªå•æŠ½è±¡æŽ¥å£å±¤è¨è¨ˆå¯¦ç¾
基于è¨å‚™ç®¡ç†æ ¸å¿ƒæ•¸æ“šçµæ§‹ï¼Œä¸Šå±¤è¨ªå•抽象接å£å±¤ç‚ºä¸Šå±¤æ‡‰ç”¨æä¾›äº†5個API函數:UDFOpenã€UDFReadã€UDFWriteã€UDFIoctrlã€UDFClose。本文以UDFOpenå’ŒUDFRead為例說明這些API函數的實ç¾é‚輯。UDFOpen函數的實ç¾é‚輯如下:
INT32S UDFOpen(char *deviceName, void *pd)
ï½›
在UDFFrameworkçµæ§‹æ•¸çµ„䏿Ÿ¥æ‰¾å為deviceNameçš„è¨å‚™ï¼›
if (找到å為deviceNameçš„è¨å‚™ï¼‰ ï½›
if (è¨å‚™å·²è¢«å…¶å®ƒæ‡‰ç”¨æ‰“開) ï½›
if (è¨å‚™ä¸å¯å…±äº«ï¼‰
返回出錯信æ¯å¹¶è¿”回;
else
å°‡è¨å‚™çš„æ‰“開計數器openCountåŠ 1
ï½
else ï½›
從UDFFrameworkçµæ§‹ä¸å¾—到該è¨å‚™çš„UDFOperationsçµæ§‹æ•¸æ“šå¹¶èª¿ç”¨è©²è¨å‚™çš„devOpen函數åˆå§‹åŒ–該è¨å‚™ï¼›
å°‡UDFFrameworkçµæ§‹çš„æ•¸çµ„ä¸‹æ¨™ä½œç‚ºå¥æŸ„handle返回給上層應用程åºï¼›
ï½
ï½
else ï½›
æç¤ºè¨å‚™é©…動未安è£å¹¶è¿”回;
ï½
ï½
UDFRead函數的實ç¾é‚輯如下:
INT32S UDFRead(INT32U handle, INT8S *buffer, INT32U blen, INT32U lenToRead, INT8U waitType)
ï½›
åˆ¤æ–·åƒæ•¸handle奿Ÿ„是å¦åˆæ³•ï¼›
if (handleåˆæ³•)
return UDFF[handle].op.devRead(buffer, blen, lenToRead, waitType);
else
返回出錯信æ¯å¹¶è¿”回;
ï½
3.4 硬件è¨å‚™é©…動模塊的è¨è¨ˆå¯¦ç¾
本文在該通用驅動框架下實ç¾äº†UART0è¨å‚™å’ŒI2C接å£è¨å‚™CAT1025JI-30çš„E2PROMè¨å‚™çš„驅動模塊。LPC2210çš„UART0è¨å‚™æ»¿è¶³16C550å·¥æ¥æ¨™æº–,具有16Bytes的接收FIFOå’Œ16Bytes的發é€FIFOï¼Œæœ¬æ–‡é‡‡ç”¨ä¸æ–·æ–¹å¼æŽ¥æ”¶æ•¸æ“šã€æŸ¥è©¢æ–¹å¼ç™¼é€æ•¸æ“šï¼ŒæŒ‰ç…§é€šç”¨é©…動框架è¨å‚™é©…動模塊的è¨è¨ˆè¦æ±‚,為UART0實ç¾äº†ä»¥ä¸‹é©…動函數:UART0Openã€UART0Readã€UART0Writeã€UART0Ioctrlã€UART0Close,并通éŽé€šç”¨é©…動框架的è¨å‚™é©…動程åºå®‰è£å‡½æ•¸InstallDriverå°‡UART0驅動模塊安è£åˆ°UDFFrameworkçµæ§‹æ•¸çµ„ä¸ã€‚å°CAT1025JI-30è¨å‚™çš„é©…å‹•æ¨¡å¡Šçš„å¯¦ç¾æ˜¯é¡žä¼¼çš„。
4ã€çµæŸèªž
本文在μC/OS-II下è¨è¨ˆäº†ä¸€å€‹é€šç”¨é©…動框架模型以實ç¾å°ç³»çµ±ç¡¬ä»¶è¨å‚™çš„統一ã€ä¸€è‡´çš„管ç†ï¼Œå¹¶åœ¨ä»¥ARM7TDMI-Sç‚ºæ ¸å¿ƒã€ä»¥LPC2210為微控制器的開發æ¿ä¸Šé€²è¡Œäº†å¯¦ç¾ï¼Œçµæžœè¡¨æ˜Žï¼Œè©²æ¡†æž¶å¯¦ç¾ç°¡å–®ä½†æ•ˆçŽ‡å’Œå¯é 性方é¢éƒ½æœ‰æ¯”較好的表ç¾ã€‚åŒæ™‚,雖然該框架是在LPC2210開發æ¿ä¸Šå¯¦ç¾çš„,但代碼是用ANSI C編寫的,å¯ä»¥è¼ƒå®¹æ˜“地移æ¤åˆ°å…¶å®ƒé¡žåž‹çš„目標æ¿ä¸Šã€‚
本文作者創新點:在μC/OS-II下,æå‡ºå¹¶è¨è¨ˆäº†ä¸€å€‹ç°¡å–®ä½†æ˜¯é«˜æ•ˆçš„é€šç”¨é©…å‹•æ¡†æž¶ï¼Œå®ƒä¸€æ–¹é¢æ“´å±•了μC/OS-II的功能,å¦ä¸€æ–¹é¢åœ¨è©²é€šç”¨é©…動框架的管ç†ä¸‹ï¼Œå¯å¯¦ç¾å°ç³»çµ±ç¡¬ä»¶è¨å‚™çš„統一管ç†ï¼Œå¹¶ç‚ºä¸Šå±¤æ‡‰ç”¨æä¾›äº†çµ±ä¸€ã€ä¸€è‡´çš„調用接å£ï¼Œæ–¹ä¾¿äº†ä¸Šå±¤æ‡‰ç”¨å°ç¡¬ä»¶è¨å‚™çš„è¨ªå•æŽ§åˆ¶ã€‚