小型編譯器的編程實現論文結論
A. 球一份關於單片機或c語言的論文!2000字左右的
一·基於MSP430 單片機的電源監控管理系統(單片機論文)
引言
大功率直流開關電源由PFC 和DC-DC 變換器組成,為了提高可靠性,並能夠對其進行離線或遠程監控管理,在開關電源模塊內設置監控管理系統。該系統對電源故障類進行監控,對電源輸出的電壓電流進行自動設定和調節,通過串列通信介面,與遠程中心監控站進行遠程監控和管理,這一功能在通信系統基站供電系統中尤為重要。本文提出了一種基於MSP430單片機的電源監控管理系統的設計和實現。
1 系統結構和硬體電路設計
系統的整體設計結構如圖1所示。本系統採用的核心晶元為TI公司推出16位系列單片機MSP430。MSP430具有集成度高,外圍設備豐富,超低功耗等優點。單片集成了多通道12bit的A/D轉換、片內精密比較器、多個具有PWM功能的定時器、片內USART、看門狗定時器、片內數控振盪器(DCO)、大量的I/O埠以及大容量的片內存儲器,採用串列在線編程方法,單片可以滿足絕大多數的應用需要。 MSP430的這種高集成度使應用人員不必在介面、外接I/O及存儲器上花太多的精力,而可以方便的設計真正意義上的單片系統,在許多領域得到了廣泛的應用。下面介紹該系統可以實現的功能和基於MSP430F149的電控系統的設計。
1.1 系統功能:
a.開機控制。上電後,單片機開始工作,按下電源鍵,點亮指示燈後,將電網220V接入PFC,開關電源啟動工作,然後接於負載。
b.電壓設定和調節。用單片機A/D口採集開關電源的輸出電壓值,並顯示於液晶屏上,通過單片機控制數字電位計調節輸出電壓值,實現自動調節;或者通過鍵盤的左右鍵選出電壓調節頁面,用上下鍵進行手動調節;也可以通過通信介面實現遠程調節。
c.電流調節。多台開關電源並聯使用時,要求各台電源的負載電壓相等。單片機A/D口採集轉換成電壓值的負載電流值,通過通信口得到各台電流值,取電流平均值,控制數字電位計調節輸出電壓,使輸出負載電流達到平均值;或者通過鍵盤的左右鍵選出電流調節頁面,用上下鍵進行手動調節。
d.故障報警。單片機通過光電耦合器檢測到各項輸入輸出故障時,揚聲器產生蜂鳴,相應的報警燈閃爍,並在液晶屏上顯示故障類型及處理方法。
e.監測。單片機A/D口對電網電壓,輸出電壓,輸出電流進行採集測量,當出現超限時進行報警。
f.通信。包括單片機與各台開關電源間的通信和單片機與中心監控站的通信。
1.2 電壓調節電路
電壓調節電路由單片機、數字電位計X9313和可調分流基準晶元TL431組成,其電路原理圖如圖2所示。Xicor9313是固態非易失性電位器,可用作數字控制的微調電位器。TL431是TI生產的一個有良好的熱穩定性能的三端可調分流基準源,它的輸出電壓用兩個電阻就可以任意地設置到從VREF(2.5V)到36V范圍內的任何值。工作時,單片機的一個IO控制INC計數輸入腳,為其提供計數脈沖,此輸入端為下降沿觸發。另一個IO控制U/D升降輸入端,當U/D為高電平時,X9313內部計數器進行加法計數,VW端的輸出電壓上升,由於VW接地,使VH端電壓降低,而TL431的REF輸出端電壓為恆定的2.5V,從而使Vcc處輸出電壓升高;同理當U/D為低電平時,Vcc處輸出電壓降低,這樣就實現了電壓輸出調節。
1.3 模擬數據採集
MSP430F149內嵌入一個高精度的,具有采樣與保持功能的12位ADC轉換模塊,內部提供各種采樣與保持時鍾源。MSP430有8個外部輸入通道可選, 最高采樣速度可達200KHZ,並且還內置溫度感測器,可以測量晶元內的溫度,如果測量溫度高於或低於預設的溫度是,可以通過外接部件顯示告警信息,同時具有6種可編程選擇的內部參考電壓。該轉換模塊為一些需要模擬量採集的場合提供了便利。我們選擇的參考電壓是0~2.5V,這樣MSP430F149的AD解析度就是2.5/4096 = 0.61V左右。由於輸入的模擬電壓量較高,不能直接與單片機的ADC采樣埠相連,因此用串聯一個滑動變阻器的方法進行了降壓處理,成功解決了上述問題。
1.4 人機對話設計
系統的人機操作界面由液晶顯示屏、指示燈和鍵盤組成。液晶選用的是基於T6963C 的液晶模塊YM12864。鍵盤採用的是3×3 的陣列接法,系統採用了圖形用戶界面,操作簡單易行,顯示實用美觀。工作時,液晶屏可以實時顯示採集到的電網電壓、輸出電壓、輸出電流及各種報警信息,操作相應鍵盤可以進行顯示頁面的切換,對輸出電壓,輸出電流進行自動、手動及遠程式控制制調節。當有報警信息產生時,相應得指示燈會閃爍警示,同時與單片機連接的揚聲器會產生報警蜂鳴聲,以提醒操作人員做出相應的處理。
2 系統軟體設計
430 支持匯編語言和C 語言兩種語言編程,因此可以在一個工程文件中同時用兩種語言,使用匯編語言,便於在調試時尋找邏輯和指令的聯系及地址的定位正確與否。使用C 語言進行編程大大減少了工作量,編好後的程序可讀性好,易於修改和維護。開發工具使用IARSystems 公司的IAR Embedded Workbench,它集成了編輯、編譯、鏈接、下載與在線調試(Debug)等多種功能,使用方便,並具備高效的C 語言編譯能力。
考慮到軟體開發效率及可維護性,系統軟體設計遵循模塊化的編程思想,將系統功能劃分為幾個相對獨立的功能模塊。它們包括:液晶顯示模塊、AD 轉換模塊、按鍵監測響應模塊、報警監測響應模塊、電壓電流調節模塊、數據處理模塊、通信模塊。每個模塊都要進行獨立的測試,最後結合到一起。整個系統的軟體流程圖如圖3 所示。
按鍵監測模塊是其中的重要組成部分,它控制著AD轉換的啟動,顯示頁面的切換,及電壓電流的自動調節,手動調節,遠程調節的啟動和切換。報警監測模塊對開關電源的保護起著至關重要的作用,它實時的監測著開關電源是否出現故障,當發生輸入電壓過壓,輸入電壓欠壓,PFC故障時應切斷總電源,當發生輸出電壓過壓,輸出電壓欠壓,模塊過熱,及IPM保護故障時應關斷DC-DC變換器。
在對各模塊進行整合時,要注意各中斷之間的沖突。由於在MSP430 的中斷優先順序中,ADC12 采樣轉換中斷優先順序高於TIMERA 中斷,因此當在響應TIMERA 中斷的過程中會執行ADC12 采樣轉換中斷,或者TIMERA 的中斷響應被迫延遲,這樣就會影響在TIMERA中斷中執行的報警監測響應程序,不能達到對開關電源故障類的實時檢測。在本系統中,利用按鍵控制ADC12 采樣轉換中斷的啟動和關閉,從而解決中斷沖突。
3 結論
本文在基於MSP430F149電源監控管理系統的設計和實現的基礎上對MSP430的系統設計做了討論,提出並解決了在設計中出現的問題。本文作者的創新點:利用MSP430的系統結構簡單,外圍電路少,效率高的特點,設計實現了簡潔直觀、使用方便、操作全程漢字提示、監控能力強、運行穩定、安全可靠的電源監控管理系統,大大降低了成本,取得了相當可觀的經濟效益,滿足實際需求。
二·C語言論文:
嵌入式以門檻高,入門難的方式攔截了無數的學者。然而單片機作為嵌入式的入門課,如何以一種正確的方法學習單片機將關繫到是否能學習好嵌入式。
縱所周知,學習嵌入式先玩ptotel,再做單片機。Protel簡單的來說就是一個做PCB板的純英文的軟體。學習ptotel前必需具備一定的電路基礎和英語能力,電路基礎我想大部分同學都是有的,而英語這一塊卻是許多人所頭疼的。這對英語基礎差的同學是一種打擊,再者如果毅力不強,我想你是自學不下去的。毅力是學任何東西所必需的一種能力、素質,是一種遇挫折而不言敗的決心。
不管學的是protel還是單片機,首先要找一個能夠指導你的人。何謂指導,指導並不是說他要一步一步地教你去做,而是一個在關鍵時刻能夠為你指出一條道路的人。
我認為學習嵌入式方法最重要,在學protel和單片機之前應該想辦法了解關於學習它們的方法。比如說protel吧,許多人理科的學生都是以一種純理解的角度去學的,畫一個導線、元件問一下為什麼要這樣畫,生成網路表也追根溯源地問個網路表的由來。其實許多東西只是懂用就行,理論的東西懂得再多不懂用也是枉然的。
所以學習protel有地方不懂你就問你的指導員,有許多的東西是規定死了的,不是你想半天一夜就可以為你而改變的。這不同於軟體設計,軟體設計在你的苦思之下也許可以找到另一種更好的方法。
單片機嘛,不得不承認中國沒一本單片機好書。我學習單片機的時候看過的單片機書有七本,大多數都是不盡人意的。在這里我冒昧地說:中國人寫書確實缺乏一點「讀者至上」的原則。我所看過的單片機書我想有很多都是以他的角度去寫的,沒有幾個人是站穩在讀者的角度上寫的。書上的章節注釋極不清楚,許多重要的地方都是沒有說明的,說句不好聽的話,作者似乎以為讀者的水平也像他一樣高。而外國人的書呢,同樣的書,同樣的知識點,有同樣的中國人的書的兩三倍那麼厚,這是為什麼。這是因為外國人的書點點滴滴都是面向著讀者的。注釋、說明、總結應有盡有。所以,我在這里發表一個也許同胞會扔雞蛋到我身上的觀點,那就是:不管學什麼,優先選擇外文翻譯書,或是純英文書。得到一本好書對我們的影響極為巨大。這一部分我用一句話來總結就是:中國人的書適合教學,而外國人的書不僅適合教學還適合自學。
中國人的單片機書往往都是先介紹單片機的內部結構、中斷,定時器,然後再到I/O口。一開始就讓我們學習單片機內部結構,中斷、定時器的內部結構和原理,把我們弄得一塌糊塗的時候再和我們講例子,怎樣去操作實驗板。如果自學的話我想許多同學是學不下去的,幹嘛要把非得把單片機的內部結構像解剖學一樣弄個徹底才實踐去應用它呢?即使你把單片機全解剖清楚了還是不會用你手中的這塊實驗板的。我覺得如果在學單片機之前沒有學過匯編語言就直接用C語言學的話,即使學完了單片機,對單片機的內部結構和單片機的工作原理也是不清楚的。學了匯編之後再學單片機的話效果將會好得多,所以不要心急,有些東西是急不來的。
所以我認為學習單片機要在實踐中學習,先實踐再去了解它的結構和原理,如果你實在不能了解它的結構和原理那也無所謂的,只要你懂得用就可以了!(沒學過匯編的只能這么說了)
我們可以先從 I/O口學習,看一些例子燒錄些程序,再看一下現象,之後再嘗試了解一下所要用到的單片機的內部結構,最後在這個現象的知識基礎上,編一個自己想要的程序、現象出來。這樣學習的話既不無聊,成就感也有了。為什麼有些人可以把學習當一種快樂,而許多人在唉聲嘆氣,我想有一部分是出自這個原因。
不同的實驗板有不同的PCB圖,所以I/O的操作也是有所不同的。不過操作的原理都是一樣的,有些同學可能會抱怨教程里的實驗板和自己手中的實驗板不同,這是大可不必多慮的。I/O這一步在調試中看現象的理念很重要,比如改變一個語句會產生何種現象,為什麼會產生,這些都是要在調試中掌握的。
中斷的學習方法也是類似的,先實踐發現有陌生的地方就去查看相應的寄存器,等實現了自己想要的現實再慢慢地解剖一下單片機的寄存器,這樣學起來會更有意義,記得更牢。中斷也沒復雜的東西的,只不過學幾個中斷函數,優先順序之類的。有一定C語言基礎的同學在優先順序這一塊可以聯系C語言中運算符的優先順序,我相信有了C語言基礎定義一兩個中斷函數也不是什麼問題了的。
我學過的單片機的內容在我文檔的實例之中,實例的數量不多,但這些都是直接點擊單片機知識點的。隨著我的學習漸漸地深入後我再把我實現過的東西寫入實例之中吧。
希望對你有所幫助,祝成功!
B. 編程心得
編程
這是每個游戲編程FAQ里都有的問題。這個問題每星期都會在游戲開發論壇上被問上好幾次。這是個很好的問題,但是,沒人能給出簡單的答案。在某些應用程序中,總有一些計算機語言優於其他語言。下面是幾種用於編寫游戲的主要編程語言的介紹及其優缺點。希望這篇文章能幫助你做出決定。
1、C語言
如果說FORTRAN和COBOL是第一代高級編譯語言,那麼C語言就是它們的孫子輩。C語言是Dennis Ritchie在七十年代創建的,它功能更強大且與ALGOL保持更連續的繼承性,而ALGOL則是COBOL和FORTRAN的結構化繼承者。C語言被設計成一個比它的前輩更精巧、更簡單的版本,它適於編寫系統級的程序,比如操作系統。在此之前,操作系統是使用匯編語言編寫的,而且不可移植。C語言是第一個使得系統級代碼移植成為可能的編程語言。
C語言支持結構化編程,也就是說C的程序被編寫成一些分離的函數呼叫(調用)的集合,這些呼叫是自上而下運行,而不像一個單獨的集成塊的代碼使用GOTO語句控制流程。因此,C程序比起集成性的FORTRAN及COBOL的「空心粉式代碼」代碼要簡單得多。事實上,C仍然具有GOTO語句,不過它的功能被限制了,僅當結構化方案非常復雜時才建議使用。
正由於它的系統編程根源,將C和匯編語言進行結合是相當容易的。函數調用介面非常簡單,而且匯編語言指令還能內嵌到C代碼中,所以,不需要連接獨立的匯編模塊。
優點:有益於編寫小而快的程序。很容易與匯編語言結合。具有很高的標准化,因此其他平台上的各版本非常相似。
缺點:不容易支持面向對象技術。語法有時會非常難以理解,並造成濫用。
移植性:C語言的核心以及ANSI函數調用都具有移植性,但僅限於流程式控制制、內存管理和簡單的文件處理。其他的東西都跟平台有關。比如說,為Windows和Mac開發可移植的程序,用戶界面部分就需要用到與系統相關的函數調用。這一般意味著你必須寫兩次用戶界面代碼,不過還好有一些庫可以減輕工作量。
用C語言編寫的游戲:非常非常多。
資料:C語言的經典著作是《The C Programming Language》,它經過多次修改,已經擴展到最初的三倍大,但它仍然是介紹C的優秀書本。一本極好的教程是《The Waite Group's C Primer Plus》。
2、C++
C++語言是具有面向對象特性的C語言的繼承者。面向對象編程,或稱OOP是結構化編程的下一步。OO程序由對象組成,其中的對象是數據和函數離散集合。有許多可用的對象庫存在,這使得編程簡單得只需要將一些程序「建築材料」堆在一起(至少理論上是這樣)。比如說,有很多的GUI和資料庫的庫實現為對象的集合。
C++總是辯論的主題,尤其是在游戲開發論壇里。有幾項C++的功能,比如虛擬函數,為函數呼叫的決策制定增加了一個額外層次,批評家很快指出C++程序將變得比相同功能的C程序來得大和慢。C++的擁護者則認為,用C寫出與虛擬函數等價的代碼同樣會增加開支。這將是一個還在進行,而且不可能很快得出結論的爭論。
我認為,C++的額外開支只是使用更好的語言的小付出。同樣的爭論發生在六十年代高級程序語言如COBOL和FORTRAN開始取代匯編成為語言所選的時候。批評家正確的指出使用高級語言編寫的程序天生就比手寫的匯編語言來得慢,而且必然如此。而高級語言支持者認為這么點小小的性能損失是值得的,因為COBOL和FORTRAN程序更容易編寫和維護。
優點:組織大型程序時比C語言好得多。很好的支持面向對象機制。通用數據結構,如鏈表和可增長的陣列組成的庫減輕了由於處理低層細節的負擔。
缺點:非常大而復雜。與C語言一樣存在語法濫用問題。比C慢。大多數編譯器沒有把整個語言正確的實現。
移植性:比C語言好多了,但依然不是很樂觀。因為它具有與C語言相同的缺點,大多數可移植性用戶界面庫都使用C++對象實現。
使用C++編寫的游戲:非常非常多。大多數的商業游戲是使用C或C++編寫的。
資料:最新版的《The C++ Programming Language》非常好。作為教程,有兩個陣營,一個假定你知道C,另外一個假定你不知道。到目前為止,最好的C++教程是《Who's Afraid of C++》,如果你已經熟知C,那麼試一下《Teach Yourself C++》。
3、我該學習C++或是該從C開始
我不喜歡這種說法,但它是繼「我該使用哪門語言」之後最經常被問及的問題。很不幸,不存在標准答案。你可以自學C並使用它來寫程序,從而節省一大堆的時間,不過使用這種方法有兩個弊端:
你將錯過那些面向對象的知識,因為它可能在你的游戲中使得數據建模更有效率的東西。
最大的商業游戲,包括第一人稱射擊游戲很多並沒有使用C++。但是,這些程序的作者即使使用老的C的格式,他們通常堅持使用面向對象編程技術。如果你只想學C,至少要自學OO(面向對象)編程技術。OO是模擬(游戲)的完美方法,如果你不學習OO,你將不得不「辛苦」的工作。
4、匯編語言
顯然,匯編是第一個計算機語言。匯編語言實際上是你計算機處理器實際運行的指令的命令形式表示法。這意味著你將與處理器的底層打交道,比如寄存器和堆棧。如果你要找的是類英語且有相關的自我說明的語言,這不是你想要的。
確切的說,任何你能在其他語言里做到的事情,匯編都能做,只是不那麼簡單 — 這是當然,就像說你既可以開車到某個地方,也可以走路去,只是難易之分。話雖不錯,但是新技術讓東西變得更易於使用。
總的來說,匯編語言不會在游戲中單獨應用。游戲使用匯編主要是使用它那些能提高性能的零零碎碎的部分。比如說,毀滅戰士整體使用C來編寫,有幾段繪圖程序使用匯編。這些程序每秒鍾要調用數千次,因此,盡可能的簡潔將有助於提高游戲的性能。而從C里調用匯編寫的函數是相當簡單的,因此同時使用兩種語言不成問題。
特別注意:語言的名字叫「匯編」。把匯編語言翻譯成真實的機器碼的工具叫「匯編程序」。把這門語言叫做「匯編程序」這種用詞不當相當普遍,因此,請從這門語言的正確稱呼作為起點出發。
優點:最小、最快的語言。匯編高手能編寫出比任何其他語言能實現的快得多的程序。你將是利用處理器最新功能的第一人,因為你能直接使用它們。
缺點:難學、語法晦澀、堅持效率,造成大量額外代碼 — 不適於心臟虛弱者。
移植性:接近零。因為這門語言是為一種單獨的處理器設計的,根本沒移植性可言。如果使用了某個特殊處理器的擴展功能,你的代碼甚至無法移植到其他同類型的處理器上(比如,AMD的3DNow指令是無法移植到其它奔騰系列的處理器上的)。
使用匯編編寫的游戲:我不知道有什麼商業游戲是完全用匯編開發的。不過有些游戲使用匯編完成多數對時間要求苛刻的部分。
資料:如果你正在找一門匯編語言的文檔,你主要要找晶元的文檔。網路上如Intel、AMD、Motorola等有一些關於它們的處理器的資料。對於書籍而言,《Assembly Language: Step-By-Step》是很值得學習的。
5、Pascal語言
Pascal語言是由Nicolas Wirth在七十年代早期設計的,因為他對於FORTRAN和COBOL沒有強制訓練學生的結構化編程感到很失望,「空心粉式代碼」變成了規范,而當時的語言又不反對它。Pascal被設計來強行使用結構化編程。最初的Pascal被嚴格設計成教學之用,最終,大量的擁護者促使它闖入了商業編程中。當Borland發布IBM PC上的 Turbo Pascal時,Pascal輝煌一時。集成的編輯器,閃電般的編譯器加上低廉的價格使之變得不可抵抗,Pascal編程了為MS-DOS編寫小程序的首選語言。
然而時日不久,C編譯器變得更快,並具有優秀的內置編輯器和調試器。Pascal在1990年Windows開始流行時走到了盡頭,Borland放棄了Pascal而把目光轉向了為Windows 編寫程序的C++。Turbo Pascal很快被人遺忘。
最後,在1996年,Borland發布了它的「Visual Basic殺手」— Delphi。它是一種快速的帶華麗用戶界面的 Pascal編譯器。由於不懈努力,它很快贏得了一大群愛好者。
基本上,Pascal比C簡單。雖然語法類似,它缺乏很多C有的簡潔操作符。這既是好事又是壞事。雖然很難寫出難以理解的「聰明」代碼,它同時也使得一些低級操作,如位操作變得困難起來。
優點:易學、平台相關的運行(Dephi)非常好。
缺點:「世界潮流」面向對象的Pascal繼承者(Mola、Oberon)尚未成功。語言標准不被編譯器開發者認同。專利權。
移植性:很差。語言的功能由於平台的轉變而轉變,沒有移植性工具包來處理平台相關的功能。
使用Pascal編寫的游戲:幾個。DirectX的Delphi組件使得游戲場所變大了。
資料:查找跟Delphi有關的資料,請訪問:Inprise Delphi page。
6、Visual Basic
哈,BASIC。回到八十年代的石器時代,它是程序初學者的第一個語言。最初的BASIC形式,雖然易於學習,卻是可怕的無組織化,它義無返顧的使用了GOTO充斥的「空心粉式代碼」。當回憶起BASIC的行號和GOSUB命令,沒有幾個人能止住眼角的淚水。
快速前進到九十年代早期,雖然不是蘋果公司所希望的巨人,HyperCard仍然是一個在Windows下無法比擬的吸引人的小型編程環境。Windows下的HyperCard克隆品如ToolBook又慢又笨又昂貴。為了與HyperCard一決高下,微軟取得了一個小巧的名為Thunder編程環境的許可權,並把它作為Visual Basci 1.0發布,其用戶界面在當時非常具有新意。這門語言雖然還叫做Basic(不再是全部大寫),但更加結構化了,行號也被去除。實際上,這門語言與那些內置於TRS-80、Apple II及Atari里的舊的ROM BASIC相比,更像是帶Basic風格動詞的Pascal。
經過六個版本,Visual Basic變得非常漂亮。用戶界面發生了許多變化,但依然保留著「把代碼關聯到用戶界面」的主旨。這使得它在與即時編譯結合時變成了一個快速原型的優異環境。
優點:整潔的編輯環境。易學、即時編譯導致簡單、迅速的原型。大量可用的插件。雖然有第三方的DirectX插件,DirectX 7已准備提供Visual Basic的支持。
缺點:程序很大,而且運行時需要幾個巨大的運行時動態連接庫。雖然表單型和對話框型的程序很容易完成,要編寫好的圖形程序卻比較難。調用Windows的API程序非常笨拙,因為VB的數據結構沒能很好的映射到C中。有OO功能,但卻不是完全的面向對象。專利權。
移植性:非常差。因為Visual Basic是微軟的產品,你自然就被局限在他們實現它的平台上。也就是說,你能得到的選擇是:Windows,Windows或Widnows。當然,有一些工具能將VB程序轉變成Java。
使用Visual Basic編寫的游戲:一些。有很多使用VB編寫的共享游戲,還有一些是商業性的。
資料:微軟的VB頁面有一些信息。
7、Java
Java是由Sun最初設計用於嵌入程序的可移植性「小C++」。在網頁上運行小程序的想法著實吸引了不少人的目光,於是,這門語言迅速崛起。事實證明,Java不僅僅適於在網頁上內嵌動畫 — 它是一門極好的完全的軟體編程的小語言。「虛擬機」機制、垃圾回收以及沒有指針等使它很容易實現不易崩潰且不會泄漏資源的可靠程序。
雖然不是C++的正式續篇,Java從C++ 中借用了大量的語法。它丟棄了很多C++的復雜功能,從而形成一門緊湊而易學的語言。不像C++,Java強制面向對象編程,要在Java里寫非面向對象的程序就像要在Pascal里寫「空心粉式代碼」一樣困難。
優點:二進制碼可移植到其他平台。程序可以在網頁中運行。內含的類庫非常標准且極其健壯。自動分配合垃圾回收避免程序中資源泄漏。網上數量巨大的代碼常式。
缺點:使用一個「虛擬機」來運行可移植的位元組碼而非本地機器碼,程序將比真正編譯器慢。有很多技術(例如「即時」編譯器)很大的提高了Java的速度,不過速度永遠比不過機器碼方案。早期的功能,如AWT沒經過慎重考慮,雖然被正式廢除,但為了保持向後兼容不得不保留。越高級的技術,造成處理低級的機器功能越困難,Sun為這門語言增加新的「受祝福」功能的速度實在太慢。
移植性:最好的,但仍未達到它本應達到的水平。低級代碼具有非常高的可移植性,但是,很多UI及新功能在某些平台上不穩定。
使用Java編寫的游戲:網頁上有大量小的Applet,但僅有一些是商業性的。有幾個商業游戲使用Java作為內部腳本語言。
資料:Sun的官方Java頁面有一些好的信息。IBM也有一個非常好的Java頁面。JavaLobby是一個關於Java新聞的最好去處。
8、創作工具
上面所提及的編程語言涵蓋了大多數的商業游戲。但是也有一個例外,這個大游戲由於它的缺席而變得突出。
「神秘島」。沒錯,賣得最好的商業游戲不是使用以上任何一門語言編的,雖然有人說「神秘島」99%是使用 3D建模工具製作的,其根本的編程邏輯是在HyperCard里完成的。
多數創作工具有點像Visual Basic,只是它們工作在更高的層次上。大多數工具使用一些拖拉式的流程圖來模擬流程式控制制。很多內置解釋的程序語言,但是這些語言都無法像上面所說的單獨的語言那樣健壯。
優點:快速原型 — 如果你的游戲符合工具製作的主旨,你或許能使你的游戲跑得比使用其他語言快。在很多情況下,你可以創造一個不需要任何代碼的簡單游戲。使用插件程序,如Shockware及IconAuthor播放器,你可以在網頁上發布很多創作工具生成的程序。
缺點:專利權,至於將增加什麼功能,你將受到工具製造者的支配。你必須考慮這些工具是否能滿足你游戲的需要,因為有很多事情是那些創作工具無法完成的。某些工具會產生臃腫得可怕的程序。
移植性:因為創作工具是具有專利權的,你的移植性以他們提供的功能息息相關。有些系統,如Director可以在幾種平台上創作和運行,有些工具則在某一平台上創作,在多種平台上運行,還有的是僅能在單一平台上創作和運行。
使用創作工具編寫的游戲:「神秘島」和其他一些同類型的探險游戲。所有的Shockwave游戲都在網路上。
資料:Director、HyperCard、SuperCard、IconAuthor、Authorware。
9、結論
你可能希望得到一個關於「我該使用哪種語言」這個問題的更標準的結論。非常不幸,沒有一個對所有應用程序都最佳的解決方案。C適於快而小的程序,但不支持面向對象的編程。C++完全支持面向對象,但是非常復雜。Visual Basic與Delphi易學,但不可移植且有專利權。Java有很多簡潔的功能,但是慢。創作工具可以以最快的速度產生你的程序,但是僅對某一些類型的程序起作用。最好的方法是決定你要寫什麼樣的游戲,並選擇對你的游戲支持最好的語言。「試用三十天」的做法成為工業標準是件好事情。
C. 求一篇數學編程論文!急....
〔論文關鍵詞〕Viterbi 演算法 編程�
〔論文摘要〕雖然Texas Instrument推出的C6000系列DSP使對信號處理的能力顯著提高,但對信息處理能力要求的不斷提升使提對DSP程序的優化越來越成為DSP開發工作中非常重要的環節。本文討論2Mbps視頻數據流的Viterbi演算法的移植與優化策略、技巧。�
��
一、概述�
Viterbi解碼演算法是由Viterbi於1967年提出的一種最大似然解碼辦法,解碼器根據接收序列R按最大似然准則力圖找出正確的原始碼序列。隨著大規模集成電路技術的發展,採用Viterbi演算法的卷積編碼技術已成為廣泛應用的糾錯方案。Viterbi解碼過程可用狀態表示。Sj,t和Sj N/2,t表示t時刻的兩個狀態。在t1時刻,這兩個狀態值根據路徑為0或者1,轉移到狀態S2j,t1和S2j1,t1。每一種可能的狀態轉移都根據接收到的有雜訊的序列R計算路徑度量,然後選擇出各個狀態的最小度量路徑(倖存路徑)。Viterbi演算法就是通過在狀態中尋找最小量路徑向前回溯L步,最後得到的即為解碼輸出。�
在卷積碼(n,k,m)表示法中,參數k表示每次輸入信息碼位數,n表示編碼的輸出卷積碼位數,m稱為約束長度(一些書中採用k=m1為約束長度,也可稱(2,1,2)碼網格圖,r=k/n稱為信息率,即編碼效率。本文運用的是(2,1,3)碼,約速長度為2,狀態數為2�2=-4。
TMS320C6000系列DSPs(數字信號處理器)是TI公司推出的一種並行處理的數字信號處理器,是基於TI的VLIW技術的。本文採用的是TMS320C6211。該處理器的工作頻率經過倍頻可達到150MHz,每個時鍾周期最多可並行執行8條指令,從而可以實現1200MIPS定點運算能力。�
二、編程實現及優化�
根據C6000的軟體編程流程,對Viterbi演算法的編程及其優化可分為三個階段來進行。這三個階段分別為:開發C代碼、優化C代碼、編寫線性匯編代碼。在代碼編寫和優化過程中,這三個階段不是都要經過的,只要在某一階段已經滿足了演算法代碼的功能和性能要求,就不必繼續進行下面的階段。�
1.開發C代碼。這一階段完全是根據任務要求來完成演算法的代碼編寫工作。在C6000的集成開發環境CCS(Code Composer Studio)下進行代碼的編譯和功能驗證,然後可用CCS的調試工具(如Profiler),利用在程序中設置斷點的辦法可找出程序中耗時最多、最影響整體性能的代碼段。為改進代碼性能,可進入下一階段。�
在驗證了演算法代碼實現功能並以設置斷點的辦法測試代碼的性能,這段循環運行耗時(時鍾周期)為1790。顯然,性能不能達到要求,就要進入代碼優化的第二階段了。�
2.一般在代碼調試中,最影響性能的是其中的循環代碼段。而軟體流水是一種用於安排循環內的指令運行方式,盡可能充分利用CPU的功能單元等資源,使循環的多次迭代能夠並行執行的一種技術。在C6000的C/C編譯器里,採用軟體流水使編譯出來的程序代碼優化是一項核心技術。所以在進一步優化之前,需要調整並盡可能簡化代碼的結構並去除影響軟體流水的因素使其能夠被編譯器充分流水,這對大幅提高整個代碼的性能非常重要。�
所以,在考慮影響因素同時對Viterbi演算法的循環代碼進行如下調整;�
*運用內聯函數(intrinsics)替代復雜的C語言程序。C6000編譯器提供了許多intrinsics,可以快速優化C代碼。Intrinsics是直接參與C6000匯編指令映射的內聯函數。在這里運用了_extu(x,y,z),以簡化其中hamm代碼部分。
D. 求大神幫忙寫一份C語言編程的畢業論文,關於小型圖書館管理系統的;只要稿文就行了帶流程圖片的,不用帶
圖書館管理系統
(C
語言程序設計
).txt
生活是一張千瘡百孔的網,它把所有激情的水都漏光
了。寂寞就是你說話時沒人在聽,有人在聽時你卻沒話說了!
網路知道
>
電腦
/
網路
>
程序設計
> C/C++
添加到搜藏已解決
圖書管理系統
C
語言設計(
c#
免入)
懸賞分:
100 -
解決時間:
2010-6-25 14:38
1
、功能描述,新進圖書基本信息的輸入。
2.
圖書基本信息的查詢。
3.
對撤消圖書信息的刪除。
4.
為借書人辦理注冊。
5
.辦理借書手續(非注冊會員不能借書)
。
6
.辦理還書手續
信息描述:有關該系統基本信息的描述,如:圖書名稱、圖書編號、單價、作者、存在狀態、
借書人姓名、性別、學號等
大一新生的課程設計,那個只能用
C
語言來做,拜託各位了,兩天之後要上交,網上找的調
試都不成功。
記住一定要用
C
語言啊,千萬不要用
C++
,調試成功後有懸賞分的
問題補充:我的郵箱是
[email protected]
各位大俠,答完後記得留自己的名字啊,這樣我也好給分
對了,是要在
vc
的系統編譯
提問者:
g080166 -
五級最佳答案
#include <dos.h>
#include <bios.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define LEFT 0x4b00 /*
左
*/
#define RIGHT 0x4d00 /*
右
*/
#define DOWN 0x5000 /*
下
*/
#define UP 0x4800 /*
上
*/
#define SPACE 0x3920 /*
空格
*/
#define ESC 0x011b /* ESC
鍵
*/
#define ENTER 0x1c0d /*
回車鍵
*/
#define Backspace 0xe08 /*
擦除鍵
*/
#define ALT_B 12288 /*
組合鍵
ALT_B */
#define ALT_M 12800/*
組合鍵
ALT_M */
#define ALT_H 8960/*
組合鍵
ALT_H */
int key;/*
按鍵變數
*/
int textx,texty;/*
游標坐標
,x
行
,y
列
*/
struct menustruct/*
菜單用的結構體
*/
{
char name[10];/*
主菜單名
*/
char str[10][20];/*
選項
*/
int n;/*
選項數
*/
}ml[3];/*
使用了
3
個,可根據需要增刪
*/
typedef struct BookList/*
書的結構體
*/
{
char num[20];/*
圖書編號
*/
char name[20];/*
書名
*/
int price;/*
書的價格
*/
char person[20];/*
借閱人
*/
int yes;/*
判斷書是否存在或者已經借出
,1
存在
,0
借出
*/
struct BookList *next;
}Book;
typedef struct MemberList/*
會員的結構體
*/
{
char name[20];/*
會員的姓名
*/
char sex[2];/*
會員的性別
*/
int age;/*
會員的年齡
*/
struct MemberList *next;
}Member;
char save[4096];/*
保存文本區域空間
*/
/*char sav1[4096];*/
char c[4096];/*
清屏專用空間
*/
int i,j;/*
常用變數
*/
void Menu();/*
初始化界面
*/
void Selectitem();/*
定義菜單
*/
void DrawSelectitem();/*
顯示主菜單
*/
void BlackText(int x,int y,char *z);/*
選中菜單
*/
void RedText(int x,int y,char *z);/*
正常菜單
*/
void Run();/*
具體操作過程
*/
void DrawMl(int n);/*
顯示下拉菜單
*/
void MoveMl(int n,int x);/*
菜單選項的控制
*/
void Enter(int m,int n);/*
菜單選項的具體功能
*/
void BookAdd();/*
添加圖書
*/
void BookConsult();/*
圖書查詢
*/
void BookDel();/*
刪除圖書資料
*/
void BookBorrow();/*
借書
*/
void BookReturn(); /*
還書
*/
void MemberAdd(); /*
增加會員
*/
void MemberConsult();/*
查詢會員
*/
void MemberDel(); /*
刪除會員
*/
void MemberBook(); /*
查詢會員借書信息
*/
void Help(); /*
幫助
*/
void Ver(); /*
版本信息
*/
void ClrScr();/*
自定義清屏函數
*/
void
DrawFrame(int
left,int
up,int
right,int
down,int
textcolor,int
backgroundcolor);/*
畫邊框
*/
/***
主函數
****/
void main(void)
{
Menu();/*
初始化界面
*/
Run();
/*
具體操作過程
*/
}
/*
初始化界面
*/
void Menu()
{
system("cls"); /*
調用系統的清屏命令
*/
textbackground(BLUE);/*
將背景設置為藍色
*/
window(1,1,25,80);
clrscr();
textx=3;/*
游標初始化位置
*/
texty=2;
gotoxy(1,2);
printf("%c",218);/*
畫左上角
*/
for(i=0;i<78;i++)
printf("%c",196); /*
畫水平直線
*/
printf("%c",191);/*
畫右上角
*/
for(i=3;i<=23;i++)
{
gotoxy(1,i);
printf("%c",179); /*
畫垂直線
*/
gotoxy(80,i);
printf("%c",179);
}
printf("%c",192); /*
畫左下角
*/
for(i=0;i<78;i++)
printf("%c",196);
E. 計算機畢業論文範文2000字
學術堂整理了一份2000字的計算機畢業論文範文,供大家進行參考:
論文題目:《計算機教育過程中的信息安全問題》
【摘 要】隨著科學技術的不斷發展,計算機網路技術得到飛速發展和應用,而在計算機教育過程中存在著很多的不安全因素,因此計算機網路安全越來越受到人們的高度關注.本文通過介紹計算機教育的發展現狀,分析在計算機教育過程中的信息安全存在的問題,並針對計算機信息安全問題提出相應的防範措施,對今後計算機教育的信息安全研究具有重要的參考價值.
【關鍵詞】計算機教育 信息安全 存在問題 防範措施 發展現狀
一、計算機教育發展現狀
計算機網路技術的不斷普及,給人們的生活帶來很多的便利,但也存在著極大的安全隱患,即計算機網路信息安全問題.而計算機信息系統安全包括有計算機安全、網路安全和信息安全,而一般提到的就是信息安全,它在計算機教育系統中發揮著非常重要的作用,貫穿著計算機教育的全過程.正是由於計算機信息安全在人們的生產生活中充當著極其重要的作用,因此要探討計算機教育過程面臨著怎樣的信息安全問題,這值得我們加強對計算機教育過程中信息安全問題的防範,以此營造健康安全的計算機網路環境.
計算機教育信息系統是個復雜的系統性安全問題,它包含計算機系統中的硬體、軟體、計算機運作系統以及計算機的查毒系統,更甚於有計算機的病毒等.而計算機教育過程中存在的信息安全問題一般包含有硬體破壞、軟體錯誤、感染病毒、電磁輻射、管理不當以及病毒的惡意侵犯等問題都有可能威脅到計算機的信息安全問題.計算機網路系統是教育過程中一門重要的跨多個學科的綜合性科學,在我國的教育教學中逐漸被廣泛地應用起來,也同時受到社會各方面的高度關注.但計算機教育過程中存在很多的信息安全因素,需要我們加強對計算機教育信息安全的關注.
二、計算機教育過程中的信息安全存在的問題
(一)計算機病毒的危害
計算機病毒在我國頒布的計算機有關保護條例中明確將計算機病毒列為能幹擾計算機功能或者破壞計算機數據,並影響計算機的正常使用的一種信息安全病毒.當前計算機容易受到很多病毒的侵害,如木馬、火焰、網路蠕蟲等,這些計算機病毒的危害極大,傳播速度極快,影響范圍極廣,而且傳播形式多種多樣,後期的清除難度也更大,目前是計算機教育過程中信息安全面臨的最主要的問題.
(二)IP地址被盜用
在計算機教育過程中,往往會出現許多的IP地址被盜用的問題,使用戶無法正常地使用網路.IP地址被盜用一般更多地會發生在計算機IP地址許可權比較高的用戶中間,盜用者會通過網路隱藏其身份對高級用戶進行干擾和破壞,導致用戶無法正常使用計算機,可能帶來較為嚴重的影響,甚至威脅到用戶的信息安全和合法權益.
(三)網路攻擊
網路是是指攻擊者通過網路對用戶的信息進行非法訪問及破壞,而這其中包含有很多的形式,這完全取決於的個人主觀動機.有些出於非常惡意的態度而對計算機信息安全進行破壞,這其中包括有對用戶的的信息安全進行有意泄漏,對用戶造成許多負面影響,還有些的行為較為嚴重,他們會竊取國家政治軍事機密,損害國家的形象;非法盜用他人賬號提取他人銀行存款;對用戶進行網路勒索或詐騙,這些的行為將對我國的計算機信息安全造成極大的破壞和攻擊.
(四)計算機網路安全管理不健全
計算機網路安全管理中往往存在很多的問題,如計算機網路安全管理體制不健全,管理人員職責分工不明確,缺乏一定的網路安全管理機制,缺乏一定的計算機網路安全管理意識,這些使得計算機網路信息安全的風險更加嚴重,逐漸威脅計算機網路的信息安全.
三、針對計算機信息安全問題提出相應的防範措施
(一)計算機病毒的防範
計算機病毒應該採取的措施以防禦為主,然後再加強對病毒的防範和管理.應該在計算機硬體或軟體上安裝全方位的防病毒查殺軟體,定期地對計算機系統進行升級,從而保證計算機教育系統的信息安全.
(二)防技術
隨著科學技術的不斷進步,人們對身份的鑒別也有了一定的認識,人們也逐漸認識到身份認證的重要作用,因此用戶應該做的是定期地修改用戶賬戶和.而目前我國採用的最常見的防技術就是防火牆技術,防火牆技術可以對網路安全進行實時地監控,有效地防止了地干擾和破壞.
(三)提高計算機網路安全意識
計算機網路信息安全在很大程度上是由於人們對計算機信息安全的保護意識不強而引起的安全問題,計算機網路信息安全是一項綜合性較強且復雜的項目,因此應該加強對計算機信息安全人員的技術培訓,增強用戶的計算機網路安全意識,從而發揮計算機技術的更大的優勢.
四、結束語
計算機網路信息安全與我們的生活息息相關,計算機教育網路信息系統需要大家的共同維護,因此在建立健康安全的計算機信息技術平台環境,需要做的不僅僅是要建立安全的防護體系,更要做的是加強人們對計算機信息安全的防範意識,才可以建立一個通用安全的網路環境.
參考文獻
[1]高瑞.淺議計算機教育過程中的信息安全問題[J].電子製作,2015,(8)15,58-69.
[2]張大宇.計算機教育過程中的信息安全問題探討[J].中小企業管理與科技(下旬刊),2014,(6)25,45-53.
信息安全論文參考資料:
計算機信息安全論文
信息安全論文
信息網路安全雜志
網路信息安全論文
移動信息期刊
食品安全論文2000字
結論:計算機教育過程中的信息安全問題為關於對不知道怎麼寫信息安全論文範文課題研究的大學碩士、相關本科畢業論文信息安全論文開題報告範文和文獻綜述及職稱論文的作為參考文獻資料下載。
F. 理解基於對象編程的實質,寫一篇關於編程方法分析或議論的課程小論文
一、最小化窗口
點擊「X」或「Alt+F4」時,最小化窗口,
如:
protected override void WndProc(ref Message m)
{
const int WM_SYSCOMMAND = 0x0112;
const int SC_CLOSE = 0xF060;
if (m.Msg == WM_SYSCOMMAND && (int) m.WParam == SC_CLOSE)
{
// User clicked close button
this.WindowState = FormWindowState.Minimized;
return;
}
base.WndProc(ref m);
}
二、如何讓Foreach 循環運行的更快
foreach是一個對集合中的元素進行簡單的枚舉及處理的現成語句,用法如下例所示:
using System;
using System.Collections;
namespace LoopTest
{
class Class1
{
static void Main(string[] args)
{
// create an ArrayList of strings
ArrayList array = new ArrayList();
array.Add("Marty");
array.Add("Bill");
array.Add("George");
// print the value of every item
foreach (string item in array)
{
Console.WriteLine(item);
}
}
}
}
你可以將foreach語句用在每個實現了Ienumerable介面的集合里。如果想了解更多foreach的用法,你可以查看.NET Framework SDK文檔中的C# Language Specification。
在編譯的時候,C#編輯器會對每一個foreach 區域進行轉換。
IEnumerator enumerator = array.GetEnumerator();
try
{
string item;
while (enumerator.MoveNext())
{
item = (string) enumerator.Current;
Console.WriteLine(item);
}
}
finally
{
IDisposable d = enumerator as IDisposable;
if (d != null) d.Dispose();
}
這說明在後台,foreach的管理會給你的程序帶來一些增加系統開銷的額外代碼。
三、將圖片保存到一個XML文件
WinForm的資源文件中,將PictureBox的Image屬性等非文字內容都轉變成文本保存,這是通過序列化(Serialization)實現的,
例子:
using System.Runtime.Serialization.Formatters.Soap;
Stream stream = new FileStream("E:\\Image.xml",FileMode.Create,FileAccess.Write,FileShare.None);
SoapFormatter f = new SoapFormatter();
Image img = Image.FromFile("E:\\Image.bmp");
f.Serialize(stream,img);
stream.Close();
四、屏蔽CTRL-V
在WinForm中的TextBox控制項沒有辦法屏蔽CTRL-V的剪貼板粘貼動作,如果需要一個輸入框,但是不希望用戶粘貼剪貼板的內容,可以改用RichTextBox控制項,並且在KeyDown中屏蔽掉CTRL-V鍵,例子:
private void richTextBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if(e.Control && e.KeyCode==Keys.V)
e.Handled = true;
}
五、判斷文件或文件夾是否存在
使用System.IO.File,要檢查一個文件是否存在非常簡單:
bool exist = System.IO.File.Exists(fileName);
如果需要判斷目錄(文件夾)是否存在,可以使用System.IO.Directory:
bool exist = System.IO.Directory.Exists(folderName);
六、使用delegate類型設計自定義事件
在C#編程中,除了Method和Property,任何Class都可以有自己的事件(Event)。
百事通定義和使用自定義事件的步驟如下:
(1)在Class之外定義一個delegate類型,用於確定事件程序的介面
(2)在Class內部,聲明一個public event變數,類型為上一步驟定義的delegate類型
(3)在某個Method或者Property內部某處,觸發事件
(4)Client程序中使用+=操作符指定事件處理程序
例子: // 定義Delegate類型,約束事件程序的參數
public delegate void MyEventHandler(object sender, long lineNumber) ;
public class DataImports
{
// 定義新事件NewLineRead
public event MyEventHandler NewLineRead ;
public void ImportData()
{
long i = 0 ; // 事件參數
while()
{
i++ ;
// 觸發事件
if( NewLineRead != null ) NewLineRead(this, i);
//...
}
//...
}
//...
}
// 以下為Client代碼
private void CallMethod()
{
// 聲明Class變數,不需要WithEvents
private DataImports _da = null;
// 指定事件處理程序
_da.NewLineRead += new MyEventHandler(this.DA_EnterNewLine) ;
// 調用Class方法,途中會觸發事件
_da.ImportData();
}
// 事件處理程序
private void DA_EnterNewLine(object sender, long lineNumber)
{
// ...
}
七、IP與主機名解析
使用System.Net可以實現與Ping命令行類似的IP解析功能,例如將主機名解析為IP或者反過來:
private string GetHostNameByIP(string ipAddress)
{
IPHostEntry hostInfo = Dns.GetHostByAddress(ipAddress);
return hostInfo.HostName;
}
private string GetIPByHostName(string hostName)
{
System.Net.IPHostEntry hostInfo = Dns.GetHostByName(hostName);
return hostInfo.AddressList[0].ToString();
}
G. 編譯器具體實現中比較巧妙的思想有哪些
這種做法的好處是:
可以作為解釋器性能升級的一個簡單路徑,寫解釋器的代碼而得到初級編譯器的性能。事實上JamVM的解釋器可以配置為多種實現方式:switch-threading、indirect-threading、direct-threading、inline-threading,它們的差別僅在於對opcode的dispatch方式不同;所有實現方式都共享同一份handler代碼。
這種做法的缺點是:
這樣寫得到的「編譯器」無論從代碼組織還是程序思路都還是解釋器的那套,從編譯器的角度看很別扭。它最終實現出來效果跟從編譯器角度出發的template-based JIT一樣,但我覺得後者的思路更直觀,代碼也通常更清晰一些。
這種做法仍然無法跨越位元組碼邊界做任何優化,因為每個opcode對應一個單獨的handler,而這種做法的代碼生成僅僅是把handler拷貝到一起而已。
要在它的基礎之上進一步提高性能可以直接對位元組碼序列做些簡單模式匹配,以便跨越位元組碼邊界做優化。但這樣做通常是自討苦吃,工程上很難持續下去。
H. 編譯原理 相關論文
擦!這是誰啊!肯定認識…………
I. 基於圖結構應用《編碼,解碼器》的設計與實現 這個畢業設計應該從什麼思路下手啊~~計算機專高手請指點
Turbo卷積碼(TCC)是3G無線系統中所採用的前向錯誤校正(FEC)機制的整體部分。然而,Turbo解碼器所帶來的計算負擔非常重,並不太適合採用傳統DSP或RISC處理器實現。由於現場可編程邏輯陣列(FPGA)內在的並行結構,FPGA為解決3G基站收發器中所需要的符號速率FEC和其它計算密集的任務提供了一個高性能信號處理平台基礎。
Turbo 編碼
級聯碼方案(Concatenated coding schemes)是為了通過結合兩個或更多相對簡單的分量或構造模塊碼來獲得較高的編碼增益。Turbo碼認為是對級聯碼結構的一種改進,其中採用迭代演算法對相關的碼序列進行解碼。Turbo碼是通過將兩個或更多分量碼應用到同一數據序列的不同交織版本上構成的。對於任何傳統單分量編碼,解碼器的最後一級生成的都是硬判決解碼數據位。為了使象Turbo碼這樣的級聯碼方案工作得更好,解碼演算法不應被限制為只能在解碼器間傳遞硬判決。為最好地利用每個解碼器獲得的信息,解碼演算法必須可以實現軟判決交換,而不是採用硬判決。對於採用兩個分量碼的系統,解碼的概念是指將來自一個解碼器的軟判決輸入到另一個解碼器的輸入,並將此過程重復幾次以獲得更好的判決,如圖1所示 。
3GPP Turbo 編碼器
圖2為3GPP編碼器。
輸入數據流輸入到RSC1,它為每個輸入比特生成一個對等比特(Parity Bit)。輸入數據還經過交織後由RSC2處理生成第二個對等比特流。
3GPP標準定義,輸入塊的長度在40至5114 位之間。編碼器生成一個速率為1/3的包括原始輸入位和兩個對等位的系統碼。通過打孔方法可以獲得1/2編碼速度的編碼。遞歸系統編碼器的實現比較直接,然而交織器則不那麼簡單,要比標準的卷積或塊交織器復雜。
一旦將輸入數據塊長度K 提供給編碼器以後,編碼器將計算交織矩陣行數R和列數 C,並創建相應的交織數據結構。R 和 C 是數據塊長度K的函數。在輸入符號被載入到交織矩陣以後,那麼將根據一定的順序進行行間交換和列間交換。交換模式是根據塊長度K選擇的(即依賴於K)。行和列交換完成後,通過逐列讀出交織矩陣數據就可以得到最終的交織序列。在數據讀出時需要進行刪減操作,以保證在輸出中只有正確的輸入符號,請注意,交織陣列包含的數據位通常比K個原始輸入符號要多 ,因為R C>K。然後,新的序列經過RSC2編碼生成第二個對等位流。
實現交織器的一種方法是在存儲器中存儲完整的交換序列。即,一旦K 給定,即調用一個初始化常式(運行在處理器上的軟體常式或利用FPGA中的功能單元)生成相應的交換序列,然後將這一信息存儲在存儲器中。然而,這一方法需要大量的存儲器。利用Virtex -E FPGA 技術提供的 4096位每塊的片上存儲器,將需要[5114 13/4096]=17個存儲器塊。
在我們的方法中,採用一個預處理引擎生成一個序列值(存儲),這一序列值被存儲起來,交織器地址發生器將使用這些序列值。這一硬體單元採用幾個小型數據結構(素數表)來計算所需要的序列。這一準備過程需要的時鍾周期數與信息塊的長度成比例。例如,對於K=40的塊需要280時鍾周期,而對於最大塊長度K=5114,則需要 5290個時鍾周期。該過程只需要在塊長度變化時進行。地址發生器利用這些更為緊湊的數據結構來實時生成交織地址。
3GPP Turbo 解碼器
解碼器包括兩個MAP(最大後驗概率)解碼器和幾個交織器。Turbo演算法的優良的性能源於可以在兩個MAP解碼器間共享可靠性信息(extrinsic data,外數據,或稱先驗數據)。
在我們的設計中,MAP解碼器採用的是Bahl, Cocke, Jelinek 和 Rajiv (BCJR) 演算法。BCJR演算法計算每個符號的最大後驗對數似然率,並且是一種真正的軟判決演算法。考慮到數據是以塊的形式傳輸的,因此可以在時間維中前向或反向搜索一個符號序列。對於任一序列,其出現概率都是單獨符號出現概率的乘積。由於問題是線性的,因此序列概述可以利用概率的對數和來代替。
為了與一般文獻中的習慣一致,我們將解碼迭代的前向和反向狀態概率分別利用 和 來表示。通常,BCJR演算法要求在接收到整個信息後才開始解碼。對於實時應用,這一限制可能太嚴格了。例如,3GPP Turbo解碼器將需要大量存儲器存儲一個5114符號信息塊的完全狀態結構(state trellis)。對於單片FPGA設計來說,這需要的存儲資源太多了。與維特比(Vitebi)演算法類似,我們可以先從全零向量 O和數據{yk}(k 從 n 到 n-L) 開始反向迭代。L次反向迭代可獲得非常好的 n-L近似值。只要L選擇合適,最終的狀態標志(state metric)就是正確的。可以利用這一性質在信息結束前就開始進行有效的位解碼。
L 被稱為收斂長度。其典型值大約是解碼器約束長度的數倍(通常為5至10倍),並隨著信噪比的降低而增加。
通常,Turbo解碼演算法將計算所有的 (對整塊信息),將這些數值存儲起來,然後在反向迭代中與反向狀態概率一起用來計算新的外信息(extrinsic information,或稱先驗信息)。我們的設計中採用了窗口化方法。
解碼過程以一個前向迭代開始,計算包含L 個接收符號的塊i的 值。同時,對未來(i+1)塊進行一個反向迭代(標號 )。對塊i+1的反向迭代結束時,就獲得了開始對塊i 進行反向迭代所需要的正確的 初始向量。 與此同時對數似然函數(Lall)也在進行。 每一 和 處理過程都需要8個max* 操作 - 每個針對狀態結構(tellis)中的8個結點之一。最終的對數似然計算需要14個並行max* 運算符。為了提供可接受的解碼速率,在設計中採用了38個max* 功能單元。
從 C描述到FPGA設計
FPGA Turbo 編碼解碼器設計是利用基於C的設計和驗證方法進行的,如圖3所示。
演算法開發階段採用具有定點C類型的Art Library 來對定點計算的位真(bit-true)效應進行准確建模。在這一階段考察了幾種可能演算法的定點性能。一旦選定正確的量化演算法,就可利用A|rtDesignerPro創建一個專用DSP架構。A|rtDesignerPro的一個最強大的功能之一是可以插入和利用專用的數據通道核心(稱為專用單元,ASU)。利用這些ASU加速器核心可以使我們處理Turbo解碼器演算法內在的計算復雜性。
A|rtDesignerPro可自動完成寄存器分配、調度和控制器生成。在Turbo編碼解碼器設計中, A|rtDesignerr的自動循環合並可獲得最佳的;任務調度,MAP解碼步驟的內部循環都只有一個周期長。
A|rtDesignerPro生成的最終結果是可綜合的寄存器級(RT-level) VHDL或Verilog 描述。基於C的工具流支持FPGA專用功能。例如,可利用BlockRAM自動構造RAM,而寄存器文件也可利用分布式存儲器而不是觸發器來實現 。
最後,邏輯綜合和Xilinx實施工具套件將RTL HDL 轉換為 FPGA 配置位流。
FPGA Turbo 編碼解碼器實現
A|rtDesigner創建的Turbo編碼器和解碼器核心硬體結構包含許多專用ASU加速器。其中最重要的一個加速器完成max* 操作。max* 運算符根據下式計算兩個冪值a 和 b:
max* (a,b)=ln(expc(a)+expc(b))。
如 圖4所示, max* 運算是通過選擇(a,b)最大值,並應用一個存儲在查找表(LUT)中的校正因子近似進行的。這一近似演算法非常適合利用Xilinx FPGA 實現,其中LUT是其最終基本構造單元。
結果
Turbo解碼演算法硬體字長的選擇極大地影響總體性能。利用C-to-FPGA設計流程,這一定點分析是完全在C環境中完成的。結果示於圖 5。
上圖顯示出了我們的浮點Turbo解碼器演算法和對應的定點演算法之間的性能差別。模擬是在5114塊長度、5次解碼迭代和AWGN信道模型情況下進行的。結果清晰明顯出性能的損失是非常小的。
我們的Turbo解碼器的定點性能做為解碼器迭代次數的函數 ,對於1.5 dB SNR,位錯率為10-6。
解碼器功能的實現非常具有挑戰性,我們同時針對Virtex-E和 Virtex-II 器件進行了適配。Virtex-II 器件實施是採用運行在1.85 speedfile資料庫上的Xilinx 4.1i 實施工具集完成的。利用XC2V1000BG575-5 FPGA實現的最終設計,達到了66 MHz 的時鍾性能,消耗了3,060個邏輯片 和 16個塊RAM。對於從40至 5114符號長度的塊,採用5次解碼迭代循環的情況下,解碼器達到了2 至6.5 百萬符號每秒(Msym/s)的吞吐量。編碼器佔用了903個邏輯片、3個塊RAM並支持83 MHz時鍾頻率。對於從40至5114位的塊長度,速率可達到9 至20 Msym/s。
J. c語言畢業論文課題做什麼比較好 求高手給推薦
如果能力夠的話可以寫一個自創的小型語言編譯器或解釋器,保准通過。
具體你可以參考Brainfuck語言的源代碼
#include <stdio.h>
#include <stdlib.h>
char g_DataBlock[30000] = {0}; // 堆數據區
char g_CodeSegment[100000]; // BF代碼指令區
int g_CodeLen = 0; // 代碼指令長度,尾指針
int g_Stack[100]; // 棧,當進入'[',']'時用於維護指令指針
int g_StackLen = 0; // 棧指針
int analysis(); // 解析指令
int main(int argc, char **argv)
{
FILE* fSrcCodeFile; // 用於讀去源代碼文件
if (argc == 2)
{
fSrcCodeFile = fopen(argv[1], "r");
if (fSrcCodeFile == NULL)
{
perror("fopen");
return 1;
}
while (fread(&g_CodeSegment[g_CodeLen], 1, 1, fSrcCodeFile) == 1)
{// 從源文件中讀取代碼指令
g_CodeLen++;
}
}
else
{
fprintf(stderr, "%s:%d\n", __FILE__, __LINE__);
return 2;
} // end of if (argc == 2)
fclose(fSrcCodeFile);
setbuf(stdout, NULL);
return analysis(); // 解析指令
}
int analysis()
{
int iCurrCodePos = 0; // 當前指令位置
char* pCurrData = g_DataBlock + 10000; // 讓當前指針指向數據區10000號單元,以便在指針的前後都是有效操作區域
while (iCurrCodePos < g_CodeLen)
{
switch (g_CodeSegment[iCurrCodePos])
{ // 解析指令動作
case '+': // 當前數據加1
++(*pCurrData);
break;
case '-': // 當前數據減1
--(*pCurrData);
break;
case '>': // 指針右移動,向前移動
++pCurrData;
break;
case '<': // 指針做移動,向後移動
--pCurrData;
break;
case '.': // 數據當前數據
putchar((int)(*pCurrData));
//printf("put:%hd\n",*p);
break;
case ',': // 從IO獲取一個輸入作為當前數據
*pCurrData = getchar();
break;
case '[': // 循環指令處理
if (*pCurrData)
{// 當前數據不為0,將指令指針壓入棧中
g_Stack[g_StackLen++] = iCurrCodePos;
}
else
{ // 當前數據為0,找到與其匹配的']',然後開始執行']'後的指令
int j, k;
for (k = iCurrCodePos, j = 0; k < g_CodeLen; k++)
{
g_CodeSegment[k] == '[' && j++;
g_CodeSegment[k] == ']' && j--;
if (j == 0) // 找到匹配的']', 退出循環
break;
}
if (j == 0)
{ // for循環因找到匹配的']'而退出
iCurrCodePos = k;
}
else
{
fprintf(stderr, "%s:%d\n" ,__FILE__, __LINE__);
return 3;
}
} // end of if(*p)
break;
case ']': // 從棧里獲得指令指針,跳轉到對應的'['位置
iCurrCodePos = g_Stack[g_StackLen - 1]; // 取出棧頂保存的指令指針,作為當前指針
iCurrCodePos -= 1; // 指令指針後退一位,指向上一條指令。(此處減1的原因的下一條語句要加加—— ++iCurrCodePos;)
--g_StackLen; // 移動棧指針
break;
default:
break;
} // end of switch (g_CodeSegment[iCurrCodePos])
++iCurrCodePos;
} // end of while (iCurrCodePos < g_CodeLen)
return 0;
}