時間:2023-03-17 18:14:07
導言:作為寫作愛好者,不可錯過為您精心挑選的10篇程序設計論文,它們將為您的寫作提供全新的視角,我們衷心期待您的閱讀,并希望這些內容能為您提供靈感和參考。
隨著計算機應用的普及,計算機應用專業也成了熱門專業,而高級程序設計語言是計算機專業的一門必修課。在高級程序設計語言中,VisualBasic語言以其易學易用和功能強大,而且能夠方便快捷地開發Windows應用程序等特征,而深受使用者歡迎。因此,其也作為中等職業學校的高級程序設計課的首選。VB是一門集知識和技能于一體、實踐性很強的課程,要求學生既要學好理論知識,又要把握實際操作技能,同時,在進行軟件開發時,要對用戶需求及市場情況進行調研,再加上計算機軟、硬件快速更新換代的特征,要求學生還要具有很強的自學能力和終身學習的思想。對于這些要求來說,傳統的教學方法難以做到。而使用強調以職業活動為導向,以人的發展為本位的“行為導向教學法”將會較好的實現這些教學要求。本文擬就在中等職業教育的計算機程序設計(VisualBasic)教學中,如何運用“行為導向教學法”進行初步探索。
一、行為導向教學法的基本理論
“行為導向教學法”是在近幾年從德國引進的現代的職業教育新模式,其目標層次是培養人的行為能力,方法層次是人的行為活動。即摘要:這種教育以行為為目標,教學以行為為導向,教學是學生積極參和的全面的教學,學習過程是學生同時用腦、心、手來進行學習的過程。
行為導向教學法具有很強的針對性,即是以職業活動為導向,以教會學生“學會學習、學會工作”為目標而開展教學活動,因此,對學習者來說,學習目的是十分明確,即現在的學習是為今后的職業服務。教學活動的開展,通常是圍繞某一課題、新問題或項目開展,是以“學習任務”為載體,引導學生自主學習和探索的過程。整個教學過程為一個包括獲取信息、制訂計劃、做出決定、實施工作計劃、控制質量、評定工作成績等環節在內的完整的行為模式。使用“行為導向教學法”,將能更好的培養學生的關鍵能力(專業能力、方法能力、社會能力、個性能力),以達到職業教育的“職業教育就是就業教育”的教學目標。
二、行為導向教學法在VisualBasic教學中的必要性和可行性
(一)必要性
現行的計算機專業類教材大多和其它學科式的教材一樣,重視知識結構的系統性,教學內容大多以線性方式展開,適用于“循序漸進”的傳統教學模式,以《VisualBasic程序設計》的教材為例,從語言基礎、流程控制、過程和數組、窗體和控件、對話框設計、菜單、工具欄和狀態欄設計等等,分章編排,在每一章的內容里,也同樣按線性方式展開。假如,在教學中仍按傳統的教學方法按章節講授,勢必降低的課程的綜合性、實用性,也缺乏趣味性,這不但難以培養學生學習喜好,使得教學雙方都陷入困境,而且,學生不知道如何在真實的情境中靈活地使用知識和運用技巧。這樣的學習,是很難面對今后職業的。要改變這一現象的方法,比較成功的是運用以課題或項目來開展教學活動的行為導向教學法進行教學,在教學中,淡化知識的系統性和連貫性,更多關注的是知識之間的聯系,在聯系中學習知識、在綜合運用中學習知識,使學生不僅學會了程序設計知識本身,又培養了學生運用程序設計的知識去解決實際新問題的能力,達到“學以致用”的教學目的。
(二)可行性
《VisualBasic程序設計》是一門實踐性和操作性很強的課程,知識涉及許多抽象的術語,如摘要:類、對象、過程、語句、控件等等,還有大量的開發工具的使用。僅就VB的開發環境為例,其中就包含了摘要:窗體設計器、代碼編輯器、對象瀏覽器、屬性窗口、工程管理器、工具箱、菜單、工具欄等等。把握和熟悉它們的最好方法,就是在不斷的結合實際的“案例”(案例教學法)或“課題”(項目教學法)的操作實踐中去把握。在教學中,教師可以把課程內容包含在兩到三個綜合貼近實際的項目,給出案例,再把這個項目分成若干個小項目(或模塊)。例如摘要:以開發一個“學生信息管理系統”為一個綜合項目(教師首先給出案例演示,以引起同學們的關注),再分別以“登錄窗口”、“查詢窗口”等為小項目進行設計開發,學習相關的基礎知識(如摘要:在設計“登錄窗口”的項目中,學生可以把握“文本框、標簽、命令按鈕、屬性設置、變量命名規則、變量定義、變量數據類型、變量的聲明語句、賦值語句”等相關知識群)。學生在具有目標明確的項目驅動下,以“做中學”的方法進行學習,這樣,不僅可以提高他們學習的主動性和學習樂趣,同時也培養了他們的關鍵能力。
二、“行為導向教學法”案例
行為導向教學法中的“項目教學法”是指師生以團隊的形式共同實施一個完整“項目”的工作而進行的教學活動。通過在開展項目過程中有針對性的工作來培養學生的關鍵能力,非凡是獨立工作能力、想象力、創新能力。項目教學法包括了計劃、實施和檢查及成果展示的全過程。它是由學生自己來完成整個過程的教學方法。以下是一個項目教學法的簡案。
項目摘要:學生信息管理系統
(一)教學目標
1.培養學生運用VisualBasic知識解決實際新問題的能力;
2.培養學生獨立學習和工作的能力;
3.培養學生和人合作的能力。
(二)項目的實施過程
三、需要重點注重的兩個新問題
(一)教師角色的轉換
在行為導向教學中,對教師提出了更高的要求。教師應是“雙師型”的教師,老師的角色由傳統的教學主導者轉變為教學活動的引導者或主持人,在教學過程中,教師以咨詢員、伙伴、朋友等角色出現在學生中,教學方法由注重“教法”轉變為注重“學法”,為此,要完成教學任務,教師要付出更多的心血。
(二)項目設計的合理性
2測量分析電路設計
A/D轉換與分析電路設計在圖3中,A/D轉換電路ADC0809的輸入端IN0~IN7分別與圖2中運算放大器的輸出端V0~V7連接,將模擬信號轉化為8位數字輸出信號,并傳送給單片機的D0~D7端口,由單片機進行分析運算。路模擬輸出信號共需要4塊ADC0809電路進行模數轉換。單片機P0.0~P0.7端口接收ADC0809輸出的8位數字信號后進行分析。
3電纜等效電阻檢測程序設計
3.1標準等效電阻值確定
端子壓接后電纜等效電阻的標準值因電纜長度不同而有差異。可采用預先設定標準值和自動確定標準值兩種方法。對線徑為0.4mm的銅芯線電纜,預先設置標準值RT標準可按照式(5)進行計算:RT標準=75+148•L(5)其中,L是電纜長度,單位為m;RT標準的單位是mΩ。自動確定標準值方法是以正常工藝在質量穩定情況下,將首根檢驗的壓接端子的電纜作為樣品,對32個芯線等效電阻進行自動檢測對比,選取其中的最小值,然后乘以系數1.05作為標準值。
3.2自動設定標準值程序設計
標準等效電阻值存放于I2C存儲器AT24C08中。檢測程序設計多路通信電纜端子精密檢測的主程序流程圖如圖5所示。以下為采集的主要函數,假設通道數為36路。
1通信協議的制定
協議是用來管理通信的法規,是網絡系統功能實現的基礎。由于DSP可以實現對網卡的直接操作,對應于OSI網絡模型,網卡包含了物理層和數據鏈路層的全部內容,因此,規定了數據鏈路層上數據幀封裝格式,就可以為基于DSP的局域網絡中任意站點之間的通信提供具體規范。因為以太網是當今最受歡迎的局域網之一,在以太網中,網卡用于實現802.3規程,其典型代表是Novell公司的NE2000和3COM公司的3C503等網卡,所以研究工作中的具體試驗平臺是以DSP為核心構成的以太局域網,主要用于語音的實時通信,所使用的網卡為Novell公司的NE2000網卡。NE2000網卡的基本組成請見參考文獻[2],其核心器件是網絡接口控制器(NIC)DP8390。該器件有三部分功能:第一是IEEE802.3MAC(媒體訪問控制)子層協議邏輯,實現數據幀的封裝和解封,CSMA/CA(帶碰撞檢測功能的載波偵聽多址接入)協議以及CRC校驗等功能;第二是寄存器堆,用戶對NE2000網卡通信過程的控制主要通過對這些寄存器堆中各種命令寄存器編程實現;第三是對網卡上緩沖RAM的讀寫控制邏輯。DP8390發送和接收采用標準的IEEE802.3幀格式。IEEE802.3參考了以太網的協議和技術規范,但對數據包的基本結構進行了修改,主要是類型字段變成了長度字段。所以,以DSP為核心的局域網內通信數據包基本格式如圖1所示。
DSP讀出數據包和打包從目的地址開始。目的地址用來指明一個數據幀在網絡中被傳送的目的節點地址。NE2000支持3種目的地址:單地址、組地址及廣播地址。單地址表示只有1個節點可以接收該幀信息;組地址表示最多可以有64個字節接收同一幀信息;而廣播地址則表示它可以被同一網絡中的所有節接收。源地址是發送幀節點的物理地址,它只能是單地址。目的地址和源地址指網卡的硬件地址,又稱物理地址。
在源地址之后的2個字節表示該幀的數據長度,只表示數據部分的長度,由用戶自己填入。數據字段由46~1500字節組成。大于1500字節的數據應分為多個幀來發送;小于46字節時,必須填充至46字節。原因有兩個:一是保證從目的地址字段到幀校驗字段長度為64字節的最短幀長,以便區分信道中的有效幀和無用信息;二是為了防止一個站發送短幀時,在第一個比特尚未到達總線的最遠端時就完成幀發送,因而在可能發生碰撞時檢測不到沖突信號。NE2000對接收到的從目的地址字段后小于64字節的幀均認為是“碎片”,并予以刪除。在數據字段,根據系統的具體功能要求,用戶可以預留出若干個字節以規定相應的協議,以便通信雙方依據這些字節中包含的信息實現不同的功能。
2基于DSP的網絡通信程序設計
如果基于網絡操作系統,用戶可以利用一些軟件對網絡操作系統的支持,很容易地編寫出優秀的網絡通信程序,但這些程序必須依附于網絡操作系統。而在DSP環境下,必須深入了解網絡接口控制器(NIC)的工作原理[2],通過對網絡直接編程,實現局域網內任意站點之間的通信而完全拋開網絡操作系統。
DSP對網卡的通信過程控制就是DSP對DP8390中各種寄存器進行編程控制,完成數據分組的正確發送和接收。DP8390的所有內部寄存器都是8位,映像到4個頁面。每個頁面有16個可供讀寫的寄存器地址(RA=00H~0fH)。頁面的選擇由命令寄存器CA控制。第0頁寄存器用于收發過程,第1頁寄存器主要用于DP8390的初始化,第2頁寄存器則用于環路診斷。DSP對寄存器的操作是將寄存器作為DSP的端口設備,其實際物理端口地址(PPA)為網卡基本I/O端口地址(BIOA)與寄存器地址(RA)之和(即PPA=BIOA+RA)。應注意的是,PPA與寄存器間并不存在一一對應關系,對PPA的讀操作與寫操作并不一定是對同一寄存器進行的,這種情況在第0頁尤其明顯。用戶數據分組在DSP和網卡交互是通過網卡的數據端口實現的,既可以用DMA方式也可以用PIO方式讀入數據分組或將數據分組送至網卡RAM緩沖區。在本系統中,DSP采用DMA方式對網卡進行數據讀寫。網卡的數據端口地址(NDPA)為網卡基本I/O地址(BIOA)加偏移地址10H(即NDPA=BIOA+10H)。
網卡通信過程控制可分為網卡初始化、接收控制和發送控制。下面分別予以討論。
2.1網卡初始化
網卡初始化的主要任務是設置所需的寄存器狀態,確定發送和接收條件,并對網卡緩沖區RAM進行劃分,建立接收和發送緩沖環。具體過程請參閱參考文獻[2]。需要說明的是,每一塊網卡被賦予一個物理地址,以便通信站點的標識。這個物理地址存在網卡的PROM(存儲地址為0000~0005H)六個單元中,在網卡初始化時,通過遠程DMA讀入DSP內存中,并送入網卡物理地址寄存器。在一步的意義在于:一方面,如果能正確讀出網卡的物理地址,則說明網卡硬件基本沒有問題,網卡的上電復位和DSP對網卡的初始化順利通過;另一方面,這個物理地址可以用于DSP網絡系統中的點名、包的過濾丟棄等服務,也就是說,在鏈路層根據數據幀攜帶的源地址和目的地址確定數據報從哪里來,是否接收或丟棄。網卡初始化時另一個重要的工作就是接收緩沖環的設置,為了有效利用緩沖區,NIC將接收緩沖區RAM構成環形緩沖結構,如圖2所示。
接收緩沖區RAM分成多個256字節的緩沖區,N個(N最大為256)這樣的緩沖區通過指針控制鏈接成一條邏輯上的緩沖環。緩沖環的開始頁面地址存入PSTART寄存器,環頁面結束地址存入PSTOP寄存器。PSTART和PSTOP確定了接收緩沖環的大小和邊界。為便于緩沖環讀寫操作,還需要2個指針:當前頁面指針CURR和邊界指針BNRY。CURR確定下一包放在何處,起著緩沖環寫頁面指針作用;BNRY指向未經DSP取走處理最早到達的數據包起始頁面,新接收的數據包不可將其覆蓋,起著緩沖環讀頁面指針的作用。也就是說,CURR可以告訴用戶網卡接收的數據分組當前放到了什么位置,而BNRY則用于確定DSP讀緩沖環到了什么地方。由于接收緩沖區為環形結構,BNRY和CURR相等時,環緩沖區可能滿也可能空。為了使NIC能辨別這兩種狀態,規定當BNRY等于CURR時,才認為環緩沖區滿;當緩沖區空時,CURR比BNRY指針值大1。因此,初始化時設置:BNRY=PSTART,CURR=PSTART+1。這時讀寫指針不一致,為了保證正確的讀寫操作,引入一軟件指針NEXTPK指示下一包起始頁面。顯然,初始化時NEXTPK=CURR。這時,緩沖環的讀指針對NEXTPK,而BNRY只是存儲分組緩沖區的起始頁面邊界指示,其值為NEXTPK-1。
2.2接收控制過程
DSP完成對DP8390的初始化后,網卡就處于接收狀態,一旦收到分組,就自動執行本地DMA,將NIC中FIFO數據送入接收緩沖環,然后向主機申請“數據分組接收到”中斷請求。DSP如果響應中斷,則啟動網卡遠程DMA讀,將網卡緩沖區中的數據分組讀入學生機存儲區,然后對接收緩沖環CURR、NEXTPK、BNRY指針內容進行修改,以便網卡能從網上正確接收后續分組。DSP響應網卡接收中斷后,接收控制過程如下:
①設置遠程DMA的起始地址;RSAR0=00H,RSAR1=Nextpk。
②設置遠程DMA操作的字節數,這個長度在46~1500字節范圍內根據具體要求自己確定。
③0AH送命令寄存器CR,啟動遠程DMA讀。
④從網卡數據端口依序讀入數據分組,注意,最先讀入的4字節非數據分組內容,第1字節為接收狀態,第2字節為下一包頁地址指針,3與4字節為接收字節數。第2字節內容應該送入Nextpk,其它字節根據用戶要求處理。
⑤修改邊界指針BNRY=Nextpk-1。
⑥清除遠程DMA字節數寄存器RBCR0和RBCR1。
2.3發送控制過程
DSP先執行遠程DMA寫操作,將內存中的數據分組傳至網卡發送緩沖區,然后啟動發送命令進行數據分組發送。發送控制過程如下:
①設置遠程DMA的起始地址為網卡發送緩沖區起始地址;
②設置遠程DMA操作的字節數;
③12H送命令寄存器CR,啟動遠程DMA寫;
④依序送出數據分組至網卡發送緩沖區;
⑤清除遠程DMA字節數寄存器;
⑥設置發送字節數寄存器TBCR0和TBCR1;
⑦12H送命令寄存器CR,啟動數據分組發送。
3發送方發送頻率的控制
發送方發送頻率的正確控制主要保護兩點:一是有一個最小發送時間間隔,否則會因為接收方不能及時接收而導致系統癱瘓;二是發送頻率能夠足具體的功能實現要求。譬如在語音的實時通信中,發送頻率就取決于聲卡的采樣頻率。在8kHz采樣頻率時,聲卡每秒鐘采樣8000字節,采用1024字節需用時128ms,如果通信協議規定發送1次傳送1024字節有效數據,則必須每128ms發送一次才能保證緩沖區有新數據待發送,也才能保證接收方有新數據播放。128ms是一個理論計算數值,在實際的操作中采樣速度和發送頻率之間總是不能完全匹配,而存放數據的緩沖區大小是有限的,如果沒有良好的控制技巧來實現正確發送,就會造成聲音抖動和延時。解決的辦法是雙緩沖技術和雙指針控制,并且根據采樣速度和發送頻率之間的匹配情況送入不同的發送通信進行處理后發送。正確發送的含義有兩方面,一是每次發送的都是新數據,二是能滿足接收方總在播放新數據的需求。
4接收方防止數據包的丟失
2高職Java程序設計課程教學的改革
2.1教學內容的改革
高職教育更側重于將學生培養成能夠滿足工作崗位或職業需求、掌握相應技能的應用型人才,因此,改革教學內容是非常有必要的。改革教學內容就是改變傳統的理論教學,引入適量的案例,將基本理論的講授穿插于案例教學中。需要特別注意的是,選擇恰當合理的案例是非常重要的,它的質量能夠直接影響到最終的教學效果。因此,教師要根據學生認知的特點選擇具有適用性及代表性的案例,而且這些被選擇的案例必須能夠包含Java程序設計中的大部分知識,這些案例既區別于課堂上的舉例,但又和它們具有一定的聯系。為了能夠很好地展開案例教學,教師在課前需要對案例教學進行周密詳細的安排,主要包括四個方面,它們分別是發放案例素材、組織案例實施、區分案例分析中的理論分析以及操作分析、安排處理案例教學中涉及到的外延知識。案例教學能夠在課堂上很好的結合理論與實踐,促進學生綜合能力的提升。學生帶著問題去分析案例,在這個過程中教師對涉及到的相關理論知識進行講授,這種方式能夠幫助學生更好地理解知識。對案例進行分析的過程不僅能夠使學生拓寬知識面,掌握分析問題的技巧,還能夠幫助學生將理論運用于實踐,更好地消化吸收所學知識。因此,相比傳統的理論教學,案例教學這種教學方法更夠滿足當今社會對應用型人才的需求。
2.2教學方法的改革
當今社會團隊協作能力是非常重要的,因此,改革教學方法最主要的一個途徑就是實行小組教學。所謂小組教學就是很據自愿或者協商的原則,將全班學生平均劃分成幾個小組,由小組成員共同推選出一個成員作為組長。在課堂上,首先教師需要在對典型案例進行講解的過程中穿插對Java語言的介紹,幫助學生更好地理解進而接受理論知識,并且深入了解Java語言面向對象的特性。然后教師通過為每個學習小組安排編程的任務來使學生對案例進行分析,并且分析討論后每個小組都要確定出最終的解決方案,由教師來點評這些方案。為了能夠使學生高效率的完成規定任務,教師要在分析討論過程中對學生提出相應的技術要求及紀律要求,并設定一個恰當的完成期限。這種教學模式充分體現了學生學習的自主性,彰顯了學生課堂的主體地位以及突出了教師協助引導的作用。小組教學的教學模式可以使學生進行不同的思想交流,擦出智慧的火花,正如蕭伯納所說“如果我有一個蘋果,你有一個蘋果,互相交換,還是你有一個蘋果,我有一個蘋果。但是我有一種想法,你有一種想法,交換一下,雙方就都有了兩種思想。”這就說明了通過小組交流,學生思維會更加活躍,從而產生更優的思想。通過小組教學,不僅可以提升學生對理論知識的認知度,培養團隊合作的能力,還能夠提升學生分析、處理、解決問題的能力。此外,在小組教學的過程中,教師能夠迅速接收到來源于學生的反饋信息,比如反饋分析案例過程中遇到的問題等信息,通過這些反饋信息,教師能夠及時的采取相應措施來解決問題,從而實現教學相長。
2.3考核方式的改革
對教學成果進行考核對無論是教還是學都能做出恰當的評價,目前我國高職院校中通常采取考核這一手段來對教學的效果進行檢驗。在傳統的教學模式下,通常采取卷面考試來進行考核,而且最終結果往往是由一次考試的成績來評定的,也就是說,無論學生平日里表現多好,但如果在作為最終考核的那次考試中發揮失常,那么就會在一定程度上否認這個學生的學習能力。而且這種考核方式并不能夠對學生的能力、知識以及技能做到真實的反映。由此看來,為了能夠對學生的學習做出恰當合理的評價,改革考核方式是非常有必要的。這就要求高職院校要制定一個科學的評價標準,重點突出對學生知識應用能力的培養。在對高職Java程序設計課程學習進行考核時,可以通過兩個方面來展開考核工作,相應地,學生總成績也由兩部分組成,一部分是綜合能力考核成績,另一部分是平時課堂表現成績。具體來講,一方面,通過案例教學,教師要求每個小組在對案例分析完成之后,做出案例的分析報告,在此基礎上,綜合小組成員的意見和建議,為假定的任意一個應用領域或虛擬企業設計一個信息管理系統,然后模擬其運行環境,最后進行編碼或者程序設計。總之,就是給予學生一個展示自我知識、技能、操作等綜合能力的機會,這種考核方式能夠使學生更加牢固、系統的掌握所學的理論知識,這方面的考核成績占據較大的比重,在總成績中通常占據60%的比例。另一方面,也就是占據總成績40%的平時成績,具體來講,就是在平時教學過程中,教師要密切關注課堂小組討論中每位學生的表現,并且加以記錄,給出相應的分數。此外,在本門學科結束學習后,教師需要組織每個小組進行小組內成員間的彼此評價,相互打分。最后,教師通過對這兩小部分的成績進行綜合的評定,給出每個學生最終的平時課堂表現成績。
1.1設計原理
為實現嵌入式田間圖像視頻采集,主控芯片選擇使用比較廣泛的S3C2440芯片,攝像頭采用芯片為中星微ZC301的USB攝像頭,把采集到的植物視頻信息傳輸到主控芯片中。主控芯片包括把采集的視頻信息顯示到LED觸摸屏上,還要把采集到的信息傳輸到PC機中。大田視頻采集模塊總體結構如圖1所示。圖1大田視頻采集模塊總體結構圖軟件方面包括USB攝像頭的驅動程序、視頻采集程序、LED實時顯示程序網絡傳輸程序的設計、調試、燒寫等操作。
1.2主要研究的內容
1)對ARM嵌入式Linux的內核,Bootloader、YAFFS根文件系統的制作和移植,即完成軟件平臺的搭建;2)中星微ZC301的USB攝像頭驅動程序的設計;3)模塊的視頻采集程序的設計;4)設計驅動LED,來顯示采集到視頻信息的程序;5)設計TCP網絡傳輸程序,把視頻信息發送出去;6)把采集到的視頻圖像顯示到PC虛擬機上。
2、總體設計
2.1平臺設計
2.1.1 BootLoader制作和移植首先按下任意鍵,使ARM9的程序運行停止在如圖2所示的在DNW軟件上出現主選擇菜單界面;接著選擇下載到flash,即選擇‘1’,使用USB下載;在DNW軟件上出現有關閃存的各個存儲區間的情況。在上一步完成的基礎上,再選擇FLb.bin要燒寫到NAND閃存中的位置,即選擇‘0’,燒寫到NAND閃存中的boot的位置;然后在DNW軟件界面下執行配置選項中的操作執行指令,來進行下載地址、COM口和波特率設置;在DNW軟件上點擊USBPort選項中的傳輸操作,找到要燒寫FLb.bin的位置,選中FLb.bin文件;文件傳輸完成后即完成了BootLoader的移植。
2.1.2 系統內核剪裁、制作和移植Linux內核的移植和引導加載程序的燒寫過程幾乎是相同的,添加內核的映像文件和BootLoader的移植都是相同的。也就是說,內核是下載到NAND閃存的kernel位置;內核移植時會出現移植進度條;移植完成后出現的和BootLoader的移植出現的提示一樣。到此,Linux內核的移植就完成了。Linux內核配置對話框如圖3所示。
2.1.3 FAFFS根文件系統的創建和燒寫過程1)使用目錄創造命令創造根文件系統的目錄,并創建在usr目錄下的bin、dev、etc等目錄,把根文件系統的框架搭建起來;2)創造根文件系統的設備文件,進入到dev目錄下使用創造命令來完成;3)安裝etc,進入到etc目錄下進行解壓etc.tar.gz;4)進入到內核目錄下使用模塊編譯命令來編制內核模塊;5)使用模塊安裝命令對模塊進行安裝;6)使用配置命令對其進行配置,編譯命令進行編譯,安裝命令進行安裝;7)進入到根文件目錄下使用ln-s命令來進行鏈接,重新再編譯內核;8)將編譯生成的內核映像文件通過USB傳輸到開發板的根文件系統中。
2.2軟件設計
2.2.1 攝像頭驅動程序設計
實現USB設備的即插即用功能的函數是攝像頭探測函數,函數名稱是sp_probe。該驅動程序中的數據傳輸模塊使用takelet來實現對數據的同步快速傳遞,此函數對圖像數據進行解碼使用的是spcode.c程序。數據傳輸模塊函數的具體名稱是sp5_init_isoc,并且在sp5_open函數中掛有該函數的入口點。打開設備是同步傳輸數據開始的標志,這里實現數據傳輸的函數是sp_m_data,它把數據傳送給驅動程序,驅動程序對數據的訪問使用的是輪詢法。Linux中的USB器件通過系統的USB層來操作下層硬件,流程圖如圖4所示。
2.2.2 模塊視頻采集程序
本系統的視頻采集程序是基于V4L開發的,主要實現圖像采集設備的初始化、讀取和關閉等,基本操作流程如圖5所示。
3、大田視頻采集模塊的安裝與調試
3.1大田視頻采集模塊安裝執行該命令要在該軟件文件所在的目錄下,將視頻采集模塊和PC虛擬機連接起來。這樣在PC虛擬機上就會顯示出視頻圖像,如圖6所示。
3.2大田視頻采集模塊現場調試在齊齊哈爾嫩江大橋以北的農田里,對種植的土豆進行試驗。模塊調試如圖7所示。圖7模塊調試一觸摸屏LED和虛擬機顯示圖像不清晰,是因為幀的大小等參數設置得小,修改后圖像較原來清晰些;觸屏和虛擬機圖像顯示不連貫是因為其顯示程序中延時設置太大,以及內核需要優化小點。大田視頻采集模塊的對農作物視頻采集穩定,觸屏的視頻圖像顯示非常清晰,且以非常高的質量把采集到的視頻圖像傳輸到了PC機上(見圖8),在其上顯示的視頻圖像清晰連貫,能對農作物進行非常有效的實時監測;操作人員能夠從其中迅速獲得農作物的自身生長發育情況和是否有病蟲害等信息,而且大田的農作物視頻信息采集受陽光的影響也很小。本次試驗非常成功。圖8PC機顯示的視頻圖像
(1)程序應最大限度的調用前期設計數據,減少人工輸入,程序需通過制作數據接口,從前期設計軟件中有選擇性的調入全橋總信息及每個墩臺的墩臺號、墩臺里程、基礎類型、初始樁長、基頂基底標高、基礎尺寸、樁基布置等信息,減少設計者重復輸入,同時降低操作錯誤率。(2)樁基展開布置時要求對每根樁的數據進行操作,現有的每個橋墩樁基數據中樁基數據需通過一定轉換,以圖形形式清晰明了的展現出來,同時還能夠提供一定格式的數據供其他程序進行計算等。(3)設計者對全橋每個橋墩基礎數據修改編輯后,程序需將數據存儲起來,以備進行下一步操作和下次查詢。但由于全橋信息量較大,需研究有效的數據存儲形式,以便設計者能快速調用和修改。
1.2數據在不同的坐標系進行坐標轉換
(1)在程序默認樁坐標、地質提供的樁坐標以及橋梁樁基計算程序樁坐標3者之間進行轉換,提供給設計者便捷的修改方式,滿足各種不同的坐標系統之間進行靈活的的轉換。(2)地質展開剖面圖的不確定性決定了基礎展開形式的多樣性,樁與樁之間的相互位置關系變化多樣,程序應能適用各種不同的情況,快速計算各樁位之間的相互位置關系。
1.3程序的繪圖及讀圖功能
(1)根據地質剖面圖的展開路徑繪制基礎展開布置圖時,程序通過讀取地質剖面圖中的信息,校核地質剖面圖的比例,定位每個鉆孔的位置,根據每根樁與各鉆孔之間的位置關系來繪制基礎展開布置圖。展開圖能按照一定的縱橫向比例繪制,每個樁位標明相應的編號等。程序應根據地質剖面圖的形式,靈活采用單點定位和多點定位,同一樁基靈活拆分,提供多樣的繪圖方式。(2)程序需對地質柱狀圖逐孔進行識別提取各地層信息后,根據專業要求將地層詳細的描述轉換到地質剖面圖中,完善各地層的地質描述。根據縱橫向比例將地層名稱、承載力值等描述添加到地質剖面圖中。(3)程序應有完善的圖面清理及圖面排版布局功能,以及樁長反讀及校核功能便于進行后續計算等。
1.4橋梁基礎的數量計算及匯總功能
(1)程序應根據全橋工程數量計算模板衍生出單墩數量計算模板進行展開后的樁基計算,以統一數量計算格式,提高程序自動轉換、批量處理效率。(2)根據每根樁的鉆孔資料進行各鉆孔土層進行分析,歸類匯總各土層的數量,盡可能精確計算單墩的基礎數量。(3)程序應將全橋各橋墩的單墩基礎數量進行匯總,生成全橋總數量。
2關鍵技術
2.1數據接口及轉換
(1)基礎的設計需要前期數據的調出量大,種類雜,數據調入調出時盡量減少對象中數據轉換,采用數組進行內部運算完成后,再將運算結果與表格進行對接,將對表格對象的操作次數降低到最少,提高運行速度。(2)設定3套坐標系統進行靈活的轉換,將數據圖形化,直觀化,如圖1所示。樁基礎設計中,地質樁號又能根據實際鉆孔路徑任意編排,樁間距能迅速計算導出,對部分數據進行監控,當數據修改時,能迅速響應,調出數據,展示圖形,操作相當方便,顯示也很直觀明了。程序計算完成后,能自動進行存儲,數據更新及時,靈活方便。任意路徑展開樁基的計算,如圖2所示。對于樁基礎,程序處理流程如圖3所示。
2.2樁基坐標轉換的實現
前期的數據收集后,通過校核補齊后轉換成程序默認的坐標系統,樁號順序按照從上到下和從左到右的順序編排的開來,這樣編排符合一般的標號習慣。橋梁設計軟件中樁排列一般是按x坐標從小到大,然后y坐標從小到大的順序排列的,這種排列方式便于程序計算。地質專業進行地質鉆孔時,形成相應鉆孔順序和坐標系統。于是程序內部需要建立3套坐標系統的相互關系網,以便能快速在各坐標系統之間進行轉換,快速與外部數據進行導入導出操作。程序內部各坐標之間的轉換關系如圖4所示。繪制展布圖時,承臺、樁及地層信息等在CAD圖中的縱橫向定位是比較棘手的問題。縱向定位主要有每根樁的樁頂高程、樁長、樁底高程、地層描述信息等,橫向定位主要是樁與鉆孔之間關系、樁與樁之間的關系定位等。縱向定位關鍵是確定定位標尺后計算高程標定縱向元素,橫向定位的關鍵是定位鉆孔按繪圖比例計算距離在定位樁位。樁基縱向定位的基本的流程如圖5所示。
2.3添加地質鉆孔信息
地層信息由地質鉆孔柱狀圖提取后展示到地質剖面圖中前,需要對地質柱狀圖進行分析過濾提取各地層信息,再在地質剖面圖中定位到鉆孔編號后根據地層上下界面高程縱向定位到各地層中去。添加地質鉆孔信息后如圖7所示。2.5單墩樁基及全橋樁基工程數量的計算計算單墩樁基工程數量時,程序通過全橋工程數量表衍生出單墩工程數量表,保持基礎工程數量計算相關工作表中各項目的完整,利用其固定性而又適應其靈活性,繼承全橋工程數量表的計算方法和特點。設計者對單墩工程數量計算完成后,程序將各墩數量匯總起來,再經過設計者復核,程序再將其與全橋工程數量整合在一起。其間的計算步驟均允許設計者參與修改,同時程序進行邏輯性校核等。匯總各墩數據到全橋工程數量表中的流程圖如圖8所示。
1引言
遺傳算法是模擬生物在自然環境中的遺傳和進化過程而形成的一種自適應全局優化概率搜索算法。總的說來,遺傳算法是按不依賴于問題本身的方式去求解問題。它的目標是搜索這個多維、高度非線性空間以找到具有最優適應值(即最小費用的)的點[1]。
基本遺傳算法是一個迭代過程,它模仿生物在自然環境中的遺傳和進化機理,反復將選擇算子、交叉算子和變異算子作用于種群,最終可得到問題的最優解和近似最優解。
2遺傳算法程序設計改進比較
2.1基本遺傳算法對TSP問題解的影響
本文研究的遺傳算法及改進算法的實現是以C++語言為基礎,在Windows2000的版本上運行,其實現程序是在MicrosoftVisualStadio6.0上編寫及運行調試的。
1)遺傳算法的執行代碼
m_Tsp.Initpop();//種群的初始化
for(inti=0;i<m_Tsp.ReturnPop();i++)
m_Tsp.calculatefitness(i);//計算各個個體的適應值
m_Tsp.statistics();//統計最優個體
while(entropy>decen||variance>decvar)//m_Tsp.m_gen<100)
{
//將新種群更迭為舊種群,并進行遺傳操作
m_Tsp.alternate();//將新種群付給舊種群
m_Tsp.generation();//對舊種群進行遺傳操作,產生新種群
m_Tsp.m_gen++;
m_Tsp.statistics();//對新產生的種群進行統計
}
2)簡單的遺傳算法與分支定界法對TSP問題求解結果的對比
遺傳算法在解決NPC問題的領域內具有尋找最優解的能力。但隨著城市個數的增加,已沒有精確解,無法確定遺傳算法求解的精度有多高。一般情況下,當迭代代數增大時,解的精度可能高,但是時間開銷也會增大。因此可以通過改進遺傳算法來提高搜索能力,提高解的精度。
2.2初始化時的啟發信息對TSP問題解的影響
1)初始化啟發信息
在上述實驗算法的基礎上,對每一個初始化的個體的每五個相鄰城市用分支界定法尋找最優子路徑,然后執行遺傳算法。
2)遺傳算法與含有啟發信息的遺傳算法求解結果的對比
當城市數增至20個時,用分支定界法已經不可能在可以接受的時間內得到精確的解了,只能通過近似算法獲得其可接受的解。試驗設計中算法的截止條件:固定迭代1000代。表2中的平均最優解為經過多次試驗(10次以上)得到的最優解的平均值,最優解的出現時間為最優解出現的平均時間,交叉操作次數為最優解出現時交叉次數的平均值。
表220個城市的TSP問題求解結果數據
算法交叉操作
次數最優解
出現時間平均
最優解
簡單遺傳算法80244.479.4s1641.8
含初始化啟發信息的GA79000.237.4s1398.9
從表2中可以看出,當初始種群時引入啟發信息將提高遺傳算法的尋優能力。同時縮短了遺傳算法的尋優時間和問題的求解精度。
2.3交叉算子對TSP問題解的影響
1)循環貪心交叉算子的核心代碼
for(i=1;i<m_Chrom;i++)
{
flag=0;
city=m_newpop[first].chrom[i-1];//確定當前城市
j=0;
while(flag==0&&j<4)
{
sign=adjcity[city][j];//adjcity數組的數據為當前城市按順序排列的鄰接城市
flag=judge(first,i,sign);//判斷此鄰接城市是否已經存在待形成的個體中
j++;
}
if(flag==0)//如果所有鄰接城市皆在待擴展的個體中
{
while(flag==0)
{
sign=(int)rand()/(RAND_MAX/(m_Chrom-1));//隨機選擇一城市
flag=judge(first,i,sign);
}
}
if(flag==1)
m_newpop[first].chrom[i]=sign;
}
2)問題描述與結果比較
下面筆者用經典的測試遺傳算法效率的OliverTSP問題來測試循環貪心交叉算子的解的精度和解效率。OliverTSP問題的30個城市位置坐標如表3所示[2]。
從表4、圖1中可以看到,貪心交叉算子大大提高了遺傳算法的尋優能力,同時也降低了交叉操作次數。在多次試驗中,貪心交叉算子找到的最優解與目前記載的最佳數據的誤差率為2.7%。而部分匹配交叉算子找到的最優解與目前記載的最佳數據的誤差率高達7%。從而可以得到交叉算子對于遺傳算法
2.4并行遺傳算法消息傳遞實現的核心代碼
1)主程序代碼
//接收各個從程序的最優個體
for(i=0;i<slave;i++)
{
MPI_Recv(Rchrom[i],chrom,MPI_UNSIGNED,MPI_ANY_SOURCE,gen,MPI_COMM_WORLD,&status);
}
//計算接收各個從程序的最優個體的回路距離
for(i=0;i<slave;i++)
{
fitness[i]=0.0;
for(intj=0;j<chrom-1;j++)
fitness[i]=fitness[i]+distance[Rchrom[i][j]][Rchrom[i][j+1]];
fitness[i]=fitness[i]+distance[Rchrom[i][0]][Rchrom[i][chrom-1]];
}
//找到最優的個體并把它記錄到文件里
for(i=0;i<slave;i++)
{
if(1/fitness[i]>min)
{
sign=i;
min=1/fitness[i];
}
}
fwrite(&gen,sizeof(int),1,out);
for(i=0;i<chrom;i++)
fwrite(&Rchrom[sign][i],sizeof(unsigned),1,out);
fwrite(&fitness[sign],sizeof(double),1,out);
//每九代向從程序發送一個最優個體
if(gen%9==0)
MPI_Bcast(Rchrom[sign],chrom,MPI_UNSIGNED,0,MPI_COMM_WORLD);
2)從程序代碼
//將上一代的最優個體傳回主程序
MPI_Send(Rchrom1,chrom,MPI_UNSIGNED,0,gen,MPI_COMM_WORLD);
//每九代接收一個最優個體并將其加入種群中替換掉最差個體
if(gen%9==0)
{
PI_Bcast(Rchrom2,chrom,MPI_UNSIGNED,0,MPI_COMM_WORLD);
Tsp.IndiAlternate(Rchrom2);
}
//進行下一代的計算
Tsp.Aternate();
Tsp.Generation();
Tsp.Statistics();
3)并行遺傳算法的性能
筆者在MPI并行環境下,用C++語言實現了一個解決TSP問題的粗粒度模型的并行遺傳算法。該程序采用的是主從式的MPI程序設計,通過從硬盤的文件中讀取數據來設置染色體長度、種群的規模、交叉概率和變異概率等參數。試驗環境為曙光TC1700機,測試的對象是OliverTSP問題的30個城市的TSP問題。
正如在測試串行遺傳算法所提到的數據結果,并行遺傳算法也沒有達到目前所記錄的最好解,但是它提高了算法的收斂性,并行遺傳算法的收斂趨勢如圖2所示[4]。
圖2遺傳算法的收斂過程
3結束語
本文通過對基本遺傳算法的不斷改進,證明了添加啟發信息、改進遺傳算子和利用遺傳算法固有的并行性都可以提高遺傳算法的收斂性,其中對遺傳算法交叉算子的改進可以大大提高遺傳算法的尋優能力。
參考文獻
[1]劉勇、康立山,陳毓屏著.非數值并行算法-遺傳算法.北京:科學出版社1995.1
對于大多數課程而言,從宏觀上將課程知識點及其關聯講授給學生非常必要,這便于學生更加系統深刻地理解所學內容。作為教材講解C語言程序設計的知識點結構。知識點之間的關聯可以層層細化,教師首先從宏觀上給學生介紹C語言程序的整體組成結構。教師對涉及的知識點進行歸類,共包含預處理命令、數據類型、運算符、語句和函數等5部分,從宏觀上梳理C語言與程序設計課程的知識點是非常必要和重要的,這樣可以避免學生“只見樹木,不見森林”,最后只學到一堆零散的知識點,只有從宏觀上把握各個知識點在知識體系中的位置和作用,才能學得深、記得牢。對于程序語言課程,如果僅僅介紹語法的運用,學生往往對知識點理解不深刻。我們在教學實踐中的體會是:在講解C語言語法的基礎上,適當地剖析編程語言在計算機中的運行機制,會讓學生的理解更加透徹。因此,我們的課堂教學方法分為如下兩部分。
1)課件講解。課件講解包括兩部分,即知識點要點總結和知識點運行機制剖析。知識點要點總結就是告訴學生該知識點如何使用;而知識點運行機制剖析則告訴學生該程序在計算機內存中的執行過程。由于絕大部分高校在開設C語言程序設計之前都會開設計算機文化基礎等課程,因此學生有足夠的計算機基礎知識來理解C語言程序的運行機制。
2)實例演示。作為一門編程語言,C語言需要在實踐中理解和掌握,因此,課堂教學中,在具體的編程環境(如VC++6.0)下演示十分必要。通過在具體的軟件環境下編程,告訴學生應該做什么和不應該做什么,并總結該知識點的注意事項。相比傳統的脫離編程環境,只在PPT或黑板上進行板書的教學模式,該方法的教學效果要好得多。在課堂教學中,具體的教學步驟如下:①使用PPT或者板書列出該知識點的注意要點;②在編程環境(如VC++6.0)下演示該知識點的用法,給出正確的和錯誤的使用方法,并進行對比;③通過幻燈片動畫或Flas等形式演示程序在計算機內存中的執行過程,讓學生更加深刻地理解程序的運行機制。
3)教學難點與重點——“復合知識點”。從C語言的教學內容來講,數組、函數和指針是教學的重點章節,這些章節之間相互關聯的部分又是重點中的難點,如數組和函數結合,數組名做函數參數,數組和指針結合,指向數組的指針變量,函數和指針結合,指向函數的指針變量等。在教學過程中要反復強調各個知識點的注意事項,如果基本知識點能夠理解透徹,上述難點內容也就迎刃而解了。
1.2上機實踐教學
在實踐教學中,教師可以通過實際教學案例循序漸進地強化學生對C語言知識點的理解。上機實踐的教學內容通常分為兩部分:基本知識點練習和綜合訓練。首先通過基本知識點的練習,讓學生掌握該知識點的使用,即鞏固課堂所學內容;然后通過一個綜合性的大作業,訓練學生綜合應用C語言知識點的能力,例如,通過編寫“學生課程成績統計系統”考查學生對數組、結構體、指針、函數、文件等知識的綜合掌握情況。對于初學編程語言的學生,往往沒有養成良好的編程習慣,出錯的可能性較大,而出錯之后進行調試又將耗費較長的時間,這勢必對學生的學習熱情產生負面影響。因此,一開始就給學生制定科學的編程步驟和規范,使學生養成良好的編程習慣,將大大減少程序出錯的可能。下面是按照上述五步編寫的一個完整的C語言程序,用來比較兩個整數的大小。按照上述五步進行編程,經過一段時間的訓練之后,學生出現語法錯誤的可能性大大降低,此時學生更多的精力將集中在程序算法的設計和實現上。
1.3考試形式
對于C語言程序設計的考核方式,我們采用知識點考核和編程實踐相結合的方式。知識點考核偏重于C語言基本語法,用于檢驗學生對知識點的掌握是否全面,此項考核約占總成績的40%;編程實踐考核用于檢驗學生的實際動手能力,學生將在規定的時間內根據題目在機器上編程,此項考核約占總成績的60%。為了實現知識點的考核,我們將考試與計算機二級C語言上機考試緊密結合,采用題庫平臺進行上機考試,學生直接在機器上答題并提交,知識點考核多采取客觀題,如填空題、程序修改題以及讀程序題等,編程題在實戰編程中考核。C語言程序設計課程的重要特點就是實踐性強,學習該課程的目的就是為了編寫程序。因此從考試的角度講,進行編程實踐是最合適的方式,通過上機編程來考核學生的學習情況也是最公正和客觀的方式。
2C語言程序設計教學實踐結果分析
中國礦業大學(北京)每年都有40多個班級同時開設C語言程序設計課程,因此該課程教學質量的高低將直接影響全校理工科學生對C語言的理解和掌握。中國礦業大學(北京)C語言程序設計教學團隊經過長期的探索總結出一套行之有效的C語言教學方法,我們將上述方法在學校越崎實驗班中進行了試點。如圖2所示,采用上述教學法的越崎實驗班的C語言程序設計課程考試成績要明顯好于其他班級,其中90分以上的學生占10.7%,80分以上的學生占總人數的53.6%。另外,學生的學習積極性比采用上述方法前得到明顯提高,很多學生都對計算機編程產生了濃厚興趣,實踐證明我們提出的上述方法是行之有效的。
要擁有一臺Pentium90以上、16MBRAM、520MB以上硬盤容量的PC機以及一臺43cm以上的大屏幕監視器和一塊OpenGL三維圖形加速卡組成的系統,就能與圖形工作站相媲美,但價格卻便宜數十倍。
本文作者一直從事計算機圖形應用開發工作。原來是在SGI工作站上利用OpenGL開發圖形程序,后來又首先在國內第一塊三維圖形加速卡AGC-3D上基于WindowsNT的VisualC++2.0環境下繼續進行開發。在開發過程中,同一OpenGL程序幾乎不用修改就能在兩個平臺間來回移植,效果甚好。
一、OpenGL特點及功能
OpenGL是一個開放的三維圖形軟件包,它獨立于窗口系統和操作系統,能十分方便地在各平臺間移植。
OpenGL具有七大功能。
(1)建模OpenGL圖形庫除了提供基本的點、線、多邊形的繪制函數外,還提供了復雜的三維物體(如球、錐、多面體、茶壺等)以及復雜曲線和曲面(如Bezier、Nurbs等曲線或曲面)繪制函數。
(2)變換OpenGL圖形庫的變換包括基本變換和投影變換。基本變換有平移、旋轉、變比和鏡像四種變換,投影變換有平行投影(又稱正射投影)和透視投影兩種變換。
(3)顏色模式設置OpenGL顏色模式有兩種,即RGBA模式和顏色索引(ColorIndex)。
(4)光照和材質設置OpenGL光有輻射光(EmittedLight)、環境光(AmbientLight)、漫反射光(DiffuseLight)和鏡面光(SpecularLight)。材質是用光反射率來表示。場景(Scene)中物體最終反映到人眼的顏色是光的紅綠藍分量與材質紅綠藍分量的反射率相乘后形成的顏色。
(5)紋理映射(TexureMapping)利用OpenGL紋理映射功能可以十分逼真地表達物體表面細節。
(6)位圖顯示和圖像增強圖像功能除了基本的拷貝和像素讀寫外,還提供了融合(Blending)、反走樣(Antialiasing)和霧(fog)的特殊圖像效果處理。
(7)雙緩存(DoubleBuffering)動畫雙緩存即前臺緩存和后臺緩存,簡而言之,后臺緩存計算場景、生成畫面,前臺緩存顯示后臺緩存已畫好的畫面。
此外,利用OpenGL還能實現深度暗示(DepthCue)、運動模糊(MotionBlur)等特殊效果。
二、OpenGLforWindowsNT圖形庫
OpenGL圖形庫一共有100多個函數。其中核心函數有115個,它們是最基本的函數,其前綴是gl;OpenGL實用庫(OpenGLutilitylibrary,GLU)的函數功能更高一些,如繪制復雜的曲線曲面、高級坐標變換、多邊形分割等,共有43個,前綴為glu;OpenGL輔助庫(OpenGLauxiliarylibrary,GLAUX)的函數是一些特殊的函數,包括簡單的窗口管理、輸入事件處理、某些復雜三維物體繪制等函數,共有31個,前綴為aux。
此外,還有六個WGL函數非常重要,專用于OpenGL和WindowsNT窗口系統的連接,其前綴為wgl,主要用于創建和選擇圖形操作描述表(renderingcontexts)以及在窗口內任一位置顯示字符位圖。這些功能是WindowsNT對OpenGL的唯一補充,見表1所示。
表1管理圖形操作描述表的WGL函數
另外,還有五個Win32函數用來處理像素格式(pixelformats)和雙緩存。由于它們是對Win32系統的擴展,因此不能應用在其他OpenGL平臺上,見表2所示。
表2管理像素格式Win32函數
三、OpenGLforWindowsNT程序設計
OpenGLforWindowsNT的程序設計與OpenGLforUNIX的程序設計有一點小區別,關鍵就在于如何將OpenGL與不同操作系統下的窗口系統連接起來。如果調用OpenGL輔助庫窗口管理函數,則不用考慮這些問題。下面將主要介紹在WindowsNT下OpenGL的程序設計關鍵。
1.圖形操作描述表
在WindowsNT下窗口程序必須首先處理設備描述表(DeviceContexts,DC),DC包含許多如何在窗口上顯示圖形的信息,即指定畫筆和刷子的顏色,設置繪圖模式、調色板、映射模式以及其他圖形屬性。同樣,OpenGLforWindowsNT的程序也必須使用DC,這與其他Windows程序類似。但是,OpenGLforWindowsNT必須處理特殊的DC圖形操作描述表,這是DC中專為OpenGL使用的一種。一個OpenGL應用圖形操作描述表內有OpenGL與WindowsNT窗口系統相關的各種信息。一個OpenGL應用首先必須創建一個圖形操作描述表,然后再啟動它,最后在所定義的窗口內按常規方式調用OpenGL函數繪制圖形。
一個圖形操作描述表不同于其他DC,它們調用每個GDI函數都需要一個句柄,而圖形操作描述表方式下只需一個句柄就可任意調用OpenGL函數。也就是說,只要當前啟用了某個圖形操作描述表,那么在未刪除圖形操作描述表之前可以調用任何OpenGL函數,進行各種操作。
2.像素格式
在創建一個圖形操作描述表之前,首先必須設置像素格式。像素格式含有設備繪圖界面的屬性,這些屬性包括繪圖界面是用RGBA模式還是顏色表模式,像系緩存是用單緩存還是雙緩存,以及顏色位數、深度緩存和模板緩存所用的位數,還有其他一些屬性信息。
(1)像素格式結構
每個OpenGL顯示設備都支持一種指定的像素格式號。一般用一個名為PIXELFORMATDESCRIPTOR的結構來表示某個特殊的像素格式,這個結構包含26個屬性信息。Win32定義的PIXELFORMATDESCRIPTOR如下所示:
typedefstructtagPIXELFORMATDESCRIPTOR
{
WORDnSize;
WORDnVersion;
DWORDdwFlags;
BYTEiPixelType;
BYTEcColorBits;
BYTEcRedBits;
BYTEcRedShift;
BYTEcGreenBits;
BYTEcGreenShift;
BYTEcBlueBits;
BYTEcBlueShift;
BYTEcAlphaBits;
BYTEcAlphaShift;
BYTEcAccumBits;
BYTEcAccumRedBits;
BYTEcAccumGreenBits;
BYTEcAccumBlueBits;
BYTEcAccumAlphaBits;
BYTEcDepthBits;
BYTEcStencilBits;
BYTEcAuxBuffers;
BYTEilayerType;
BYTEbReserved;
DWORDdwLayerMask;
DWORDdwVisibleMask;
DWORDdwDamageMask;
PIXELFORMATDESCRIPTOR,
*PPIXELFORMATDESCRIPTOR,
FAR*LPPIXELFORMATDESCRIPTOR;
(2)初始化PIXELFORMATDESCRIPTOR結構
PIXELFORMATDESCRIPTOR中每個變量值的具體含義和設置可以參
考有關資料,下面舉出一個PIXELFORMATDESCRIPTOR初始化例子來簡要
說明相關變量的意義。定義PIXELFORMATDESCRIPTOR結構的pfd如下:
PIXELFORMATDESCRIPTORpfd=
{
sizeof(PIXELFORMATDESCRIPTOR),//結構尺寸
l,//結構版本
PFD-DRAW-TO-WINDOWS|PFD-SUPPORT-OPENGL,//特性標志
PFD-TYPE-RGBA,//RGBA模式
24,//24位顏色
0,0,0,0,0,0,//不涉及這些屬性
0,0,0,0,0,0,0,//沒有alpha緩存和累積緩存
32,//32位深度緩存
0,0,//沒有模板緩存和輔助緩存
PFD-MAIN-PLANE,//主層類型
0,//保留結構數
0,0,0,//不支持結構數
};
在這個結構里,前兩個變量的含義十分明顯。第三個變量dwFlags的值是PFD-DRAW-TO-WINDOWS|PFD-SUPPORT-OPENGL,表明應用程序使用OpenGL函數來繪制窗口,第四個表明當前采用RGBA顏色模式,第五個采用24位真彩色,即1.67千萬種顏色,如果是256色系統則自動實現顏色抖動;因為沒有使用alpha緩存和累積緩存,所以從變量cAlphaBits到cAccumAlphaBits都設置為0;深度緩存設置為32位,這個緩存能解決三維場景的消隱問題;變量cAuxBuffers設置為0,在WindowsNT下不支持輔助緩存;WindowsNT下針對OpenGL變量ilayerType只能設置為PFD-MAIN-PLANE,但其他平臺也許支持PFD-OVERLAY-PLANE或PFD-UNDERLA
Y-PLANE;接下來bReserved變量只能設為0,而最后三個變量WindowsNT都不支持,故全設置成0。
(3)設置像素格式
當初始化PIXELFORMATDESCRIPTOR結構后,就要設置像素格式。下面幾段從VC++2.0的MFC程序中摘出的代碼就是設置像素格式的方式。代碼如下:
CClientDCclientDC(this);
intpixelFormat=ChoosePixelFormat(clientDC.m-hDC,&pfd);
BOOLresult=SetPixelFormat(clientDC.m-hDC,pixelFormat,&p
fd);
第一行語句說明得到一個應用窗口客戶區的設置描述表。
第二行調用ChoosePixelFormat()選擇一個像素格式,并將像素格式索引號返回給pixelFormat變量;函數中第一個參數是選擇像素格式的設置描述表的句柄,第二個參數是PIXELFORMATDESCRIPTOR結構的地址。如果調用失敗則返回0;否則返回像素格式索引號。
第三行調用SetPixelFormat()設置像素格式,三個參數分別是設備描述表的句柄、像素格式索引號和PIXELFORMATDESCRIPTOR結構的地址。如果調用成功則返回TURE;否則返回FALSE。
3.創建圖形操作描述表
正如前所述,必須創建圖形操作描述表并啟用它后,才能調用OpenGL函數在窗口內進行各種圖形操作。一般說來,利用MFC中增補的管理圖形操作描述表方法來編程比較方便。下面舉一例:
intCopenglView::OnCreate(LPCREATESTRUCTlpCreateStruct
)
{
if(CView::OnCreate(lpCreateStruct)==-1)return-1;
//TODO:Addyourspecializedcreationcodehere
PIXELFORMATDESCRIPTORpfd=
{
sizeof(PIXELFORMATDESCRIPTIOR),
//structuresizel,
//structureversionnumber
PFD-DRAW-TO-WINDOWS|PFD-SUPPORT-OPENGL,//propertyflags
PFD-TYPE-RGBA,//RGBAmode
24,//24bitcolor
0,0,0,0,0,0,//notconcernedwiththese
0,0,0,0,0,0,0,//noalphaoraccumbuffer
32,//32bitdepthbuffer
0,0,//nostencilorauxbuffer
PFD-MAIN-PLANE,//mainlayertype
0,//reserved
0,0,0//unsupported
};
CClientDCclientDC(this);
intpixelFormat=ChoosePixelFormat(clientDC.m-hDC,&pfd);
BOOLresult=SetPixelFormat(clientDC.m-hDC,pixelFormat,&p
fd);
m-hRC=wglCreateContext(clientDC.m-hRC);
return0;
}
voidCOpenglView::onDraw(CDC*pDC)
{
COpenglDoc*pDoc=GetDocument();
ASSERT-VAILD(pDoc);
//TODO:adddrawcodefornativedatahere
wglMakeCurrent(pDC->m-hDC,m-hDC);
DrawMyOpenGL();
wglMakeCurrent(pDC->m-hDC,NULL);
}
voidCOpenglView::OnDestroy()
{
CView::OnDestroy();
//TODO:Addyourmessagehandlercodehere
wglDeleteContext(m-hRC);
}
微機UNIX直接視頻圖形程序設計有兩種方法,一種是利用設備驅動程序(見參考文獻1),另一種是針對IBM標準終端進行編程,本文介紹后者。
一、圖形程序設計
1.檢測視頻適配器
視頻顯示器是由視頻適配器硬件控制的,視頻適配器決定了圖形方式下顯示圖形的分辨率及可能的顏色[2]。利用系統調用ioctl中的CONS-CURRENT命令可以檢測到當前的視頻適配器,即:
ioctl(0,CONS-CURRENT,NULL)
返回-1時表示出錯,即沒有相應的視頻適配器硬件,如果檢測到VGA卡則返回值為VGA,如果檢測到EGA卡則返回值為EGA,……。
2.初始化圖形系統
初始化圖形必須完成下列任務。
(1)獲取當前的視頻顯示方式
ioctl的CONS-GET命令用來判斷當前適配器的顯示方式,即:
ioctl(0,CONS-GET,NULL)
它返回顯示方式的值,這些值在包含文件vtkd.h中均有定義,如:SW-VAG640x480C為VGA適配器設置成640x480分辨率彩色圖形模式。
(2)設置圖形模式
直接將圖形模式值放入ioctl中的命令項即可設置相應的圖形模式,如ioctl(0,SW-VGA640x480C,NULL)
將VGA適配器設置成640x480分辨率的彩色圖形模式。
(3)獲取圖形模式下視頻緩沖區物理地址
利用ioctl的MAPCONS命令可以實現此功能,即:
char*scrnmem;
scrnmem=(char*)ioctl(0,MAPCONS,NULL)
所有實現基本圖素的操作都將針對scrnmem進行,scrnmem就是EGA/VGA相應的四個位平面的重疊地址,有關EGA/VGA的結構可參閱[2]。
3.實現基本圖素
DOS操作系統下,對EGA/VGA的各種視頻I/O寄存器進行操作是很方便的,可以直接使用匯編語言in和out指令進行讀寫。然而,UNIX操作系統下,對物理硬件的訪問都是由UNIX系統核心和設備驅動程序管理的,要訪問EGA/VGA的各種I/O寄存器,必須獲得對其訪問的特權,為了實現這種功能要求,可以使用下列ioctl系統調用方式:
ioctl(0,VGA-IOPRIVL,1)獲取VGA的各種I/O寄存器的訪問特權
ioctl(0,EGA-IOPRIVL,1)獲取EGA的各種I/O寄存器的訪問特權
UNIX操作系統基本上是采用C語言編寫的,只是在低層的系統內核方面才使用低級的匯編語言,遵循這一原則,對EGA/VGA的I/O寄存器的訪問可以采用匯編語言,而實現圖形系統的基本圖素則采用C語言。
如果用戶的UNIX系統中已有inb()和outb()函數(嵌入在/usr/include/sys/inline.h中),則可以直接使用它們完成對各種I/O寄存器的讀寫,否則,必須編寫下列低級匯編語言例程:
/*向一端口輸出一字節*/
/*從一端口輸入一字節*/
voidoutb(intport,ucharvalue)
{
-asmpushedx
-asmmovedx,port
-asmmoval,value
-asmoutdx,al
-asmpopedx
}
ucharinb(intport)
{
-asmpushedx
-asmmovedx,port
-asminal,dx
-asmpopedx
}
基本圖素一般包括:設置顏色,對調色板的操作,畫點、線、弧、矩形、圓、橢圓、多邊形、畫扇形、餅圖,任意圖形填充,多邊形填充,保存屏幕,恢復屏幕等,這些操作均可用C語言實現,細節問題可參閱[2]。
4.關閉圖形系統
退出圖形系統之前必須恢復EGA/VGA各I/O寄存器的值,并將顯示模式恢復到進入圖形模式之前的模式。采用下列ioctl調用實現:
ioctl(0,MODESWITCH|oldmode,NULL)
oldmode是進入圖形方式之前獲取的方式,UNIX系統中,獲取的方式和設置的方式之間的關系為:
設置方式值=獲取方式值|MODESWITCH
二、虛擬終端的使用
虛擬終端(VirtualTerminal,簡稱VT)加強了UNIX系統V/386的接口功能,它不僅允許單個用戶開發一個圖形應用軟件,而且允許多用戶、多道程序在同一個物理終端上運行,在開始一個用戶的應用程序之前不必停止另一個應用程序,而且各個用戶之間可以互相切換。
虛擬終端有兩種操作方式[1],一種是自動操作方式(VT-AUTO),這是默認情況,比較簡單,應用程序并不了解終端用戶接受或放棄當前VT的請求,這意味著被切換掉的進程的任何輸入輸出都可能丟失。另一種方式是進程控制方式(VT-PROCESS),該方式支持應用程序與其它正在使用VT的進程之間同步,應用程序可以負責接受或放棄使用VT。
[1]中介紹了以進程方式控制VT的過程,并以設備驅動程序方式介紹了接受和放棄對VT控制的信號處理例程。本文給出針對IBM標準終端編制VT的程序和相應的信號處理例程。
/*設置虛擬終端*/
voidsetvirtualterm(void)
{
structvt-modevtmode;
signal(SIGUSR1,release-disp);//release-disp為放棄VT的信號處理例程
signal(SIGUSR2,acquire-disp);//acquire-disp為接受VT的信號處理例程
vtmode.mode=VT_PROCESS;//設置進程控制方式
vtmode.relsig=SIGUSR1;
vtmode.acqsig=SIGUSR2;
if(ioctl(0,VT-SETMODE,&vtmode)==-1)exit(1);//出錯即終止此進程
}
/*放棄VT的信號處理例程*/
voidrelease-disp(void)
{
signal(SIGUSR1,release-disp);
保存整個圖形屏幕于內部緩沖區videobuf中;
ioctl(0),MODESWITCH|oldmode,NULL);
//oldmode為進入圖形模式之前的顯示方式
ioctl(0,VT-RELDISP,VT-TRUE);
//VT-TRUE表明同意放棄VT,如果此項為0,則表示拒絕放棄VT.
}
/*接受VT的信號處理例程*/
voidacquire-disp(void)
{
signal(SIGUSR2,acquire-disp);
ioctl(0,newmode,NULL);//newmode為應用程序所處的圖形模式
scrnmem=(char*)ioctl(0,MAPCONS,NULL);
//重新獲取圖形緩沖區的物理地址
從videobuf中恢復整個圖形屏幕,并釋放videobuf;
ioctl(0,VT-RELDISP,VT-ACKACQ);//VT-ACKACQ表明接受VT
}
在微機UNIX操作系統下,針對EGA/VGA進行直接視頻程序設計,獨立開發一個圖形程序包,不僅小巧方便,而且可以重用以前在DOS下開發的圖形應用程序。筆者在SCOUNIX系統下開發了一個小的低層圖形軟件包,許多以前的DOS圖形應用程序都可以移植到UNIX系統下來。
另外,本文介紹的程序在使用前還應包含下列文件,即:
#include<stdio.h>
#include<sys/types.h>
#include<sys/console.h>
#include<sys/vtkd.h>
#include<termio.h>
#include<sys/signal.h>
分配空間時還應加上#include<malloc.h>