一種基于ARM920T的現(xiàn)場(chǎng)總線控制系統(tǒng)
getc函數(shù):unsigned char (*getc)(can_bus *priv)該函數(shù)從設(shè)備接口讀取一個(gè)字符,它只用于非中斷方式,通過查詢?cè)O(shè)備是否處于準(zhǔn)備(ready)狀態(tài)來等待一個(gè)字符。
set_config函數(shù):bool (*set_config)(can_bus *priv,cyg_can_info_t *config)該函數(shù)用于對(duì)指定的端口配置。如果對(duì)硬件配置成功,則返回true;如果端口不支持給定的配置參數(shù),則返回false。
start_xmit函數(shù):void (*start_xmit)can_bus *priv)在中斷方式下,該函數(shù)使能發(fā)送端,允許發(fā)送中斷的產(chǎn)生。
stop_xmit函數(shù):void (*stop_xmit)(can_bus *priv)在中斷方式下,當(dāng)數(shù)據(jù)發(fā)送結(jié)束后,該函數(shù)進(jìn)制發(fā)送端,進(jìn)制發(fā)送中斷產(chǎn)生。
start_recv函數(shù):void (*stop_xmit)(can_bus *priv)
stop_recv函數(shù):void (*stop_xmit)(can_bus *priv)
4.3 發(fā)送中斷處理函數(shù)
CAN總線在中斷方式下的負(fù)責(zé)對(duì)中斷進(jìn)行處理函數(shù)是中斷服務(wù)程序ISR和中斷滯后服務(wù)程序DSR。對(duì)中斷的處理主要有三種模式,第一種模式是在中斷服務(wù)程序ISR內(nèi)完成所有設(shè)備處理工作,第二種是在中斷滯后服務(wù)程序DSR內(nèi)實(shí)現(xiàn),第三中是將對(duì)設(shè)備的處理推遲到中斷線程內(nèi)進(jìn)行。在驅(qū)動(dòng)程序的設(shè)計(jì)中采用的是第二種模式。
在這種模式中,中斷處理程序ISR只是簡(jiǎn)單的通過對(duì)設(shè)備進(jìn)行編程或者直接調(diào)用cyg_drv_interrupt_mask()函數(shù)防止新中斷的產(chǎn)生,然后將調(diào)用DSR作進(jìn)一步的處理。DSR完成大部分的硬件處理工作,并有可能對(duì)某個(gè)條件變量產(chǎn)生一個(gè)信號(hào)來喚醒新的中斷。最后,DSR調(diào)用cyg_drv_interrupt_unmask(),重新使能中斷。中斷處理過程如圖所示:
4.4 綁定設(shè)備中斷
設(shè)備驅(qū)動(dòng)程序的初始化函數(shù)在系統(tǒng)初始化過程或者設(shè)備初始使用時(shí)被調(diào)用,初始化函數(shù)不僅要設(shè)置設(shè)備的參數(shù),還要為設(shè)備分配相應(yīng)的數(shù)據(jù)結(jié)構(gòu):例如輸入輸出緩沖區(qū)等,最后還將設(shè)備中斷進(jìn)行綁定。
每一個(gè)設(shè)備在初始化時(shí)會(huì)產(chǎn)生一個(gè)對(duì)應(yīng)的中斷對(duì)象,所有的中斷對(duì)象存儲(chǔ)在系統(tǒng)的中斷向量鏈表中。當(dāng)某個(gè)中斷發(fā)生時(shí),系統(tǒng)根據(jù)中斷碼到中斷向量鏈表中尋找相應(yīng)的中斷對(duì)象,再跳轉(zhuǎn)到中斷對(duì)象記錄的中斷處理程序的位置執(zhí)行。
宏cyg_drv_interrupt_create(vector,priority,data,isr,dsr,handle,intr)用于產(chǎn)生設(shè)備的中斷對(duì)象。其中,vector是中斷向量,priority中斷優(yōu)先級(jí),data是數(shù)據(jù)指針,isr是中斷處理程序ISR的地址,dsr是中斷滯后處理程序DSR的地址,handle是返回句柄,intr是中斷對(duì)象存放的位置。
宏cyg_drv_interrupt_attach(interrupt)用于將中斷向量加入到中斷向量鏈表。參數(shù)interrupt是將要連接的中斷的句柄。
設(shè)備中斷綁定后,當(dāng)設(shè)備產(chǎn)生中斷時(shí)系統(tǒng)會(huì)找到相應(yīng)的中斷向量,然后把控制權(quán)交給中斷處理程序,進(jìn)行中斷的處理。
5、兩種擴(kuò)展方式比較
對(duì)于兩種不同的CAN與ARM9連接方式,IO口連接直觀簡(jiǎn)單;而利用數(shù)據(jù)信號(hào)線連接能節(jié)省IO口,給CPU更多開發(fā)空間。兩者在驅(qū)動(dòng)程序上差異不大,主要體現(xiàn)在底層數(shù)據(jù)讀寫時(shí)序?qū)崿F(xiàn)上。前者簡(jiǎn)單易于編寫和理解,后者只是在對(duì)時(shí)序的理解上略有難度,并不會(huì)使代碼更加冗長。
6、結(jié)束語
本文通過在現(xiàn)場(chǎng)總線控制系統(tǒng)上擴(kuò)展CAN總線模塊,詳細(xì)講解了如何在ARM9上擴(kuò)展CAN總線模塊,給出了全I(xiàn)O口擴(kuò)展和利用數(shù)據(jù)信號(hào)線擴(kuò)展兩種方式;并詳細(xì)說明如何在高實(shí)時(shí)性操作系統(tǒng)eCos上開發(fā)CAN驅(qū)動(dòng)程序;最后對(duì)兩種擴(kuò)展方式做了簡(jiǎn)單的比較。該現(xiàn)場(chǎng)總線控制系統(tǒng)在國家十一五某國防項(xiàng)目中得到了很好的應(yīng)用。同時(shí)也為大中型國有企業(yè)自動(dòng)化生產(chǎn)線的建設(shè)和改造,電力系統(tǒng)自動(dòng)化的實(shí)現(xiàn)提供很好的借鑒。
陀螺儀相關(guān)文章:陀螺儀原理
評(píng)論