原創(chuàng):給大家一點(diǎn)關(guān)于BASCOM編譯器的參考
首先,它的優(yōu)點(diǎn)是有目共睹的,我想選擇它的哥們也一定是看上了它的這個(gè)優(yōu)點(diǎn):易用上手快,容易出成果!BASCOM確實(shí)很容易上手,2002年初我剛開始接觸AVR的時(shí)候,就是完全靠它的HELP系統(tǒng)加老龍的SL系列實(shí)驗(yàn)開發(fā)器自己摸索的,就是現(xiàn)在,我也還經(jīng)常在HELP系統(tǒng)中CTRL+C和CTRL+V例子代碼,代碼很簡單易懂,對(duì)格式要求也不很嚴(yán)格,不用做芯片的初始化工作,有時(shí)就是連簡單的CONFIG語句都省了,編譯一樣成功,但是C語言就要在寫程序之前先寫大量初始化芯片的語句,比較煩人。同時(shí),它支持部分匯編語句也是值得高級(jí)用戶稱道的,如DDR=XXX語句就可以配置IO口的寄存器等,比CONFIG語句更靈活更好用,結(jié)合使用更是能隨心所欲,方便極了。對(duì)于部分比較常用的模塊化功能如讀取RC5遙控編碼,讀寫LCD等都簡單到了一句搞定的地步,很適合業(yè)余開發(fā)者和學(xué)生興趣班使用。
但是它的某些方面確實(shí)有些問題!比較嚴(yán)重的是:
1、程序結(jié)構(gòu)化能力差。常用的功能想做成函數(shù)或模塊調(diào)用以節(jié)省空間,但是最終往往達(dá)不到效果,而編譯器卻沒有提示出錯(cuò),給人摸不著頭腦的感覺。例如,想把AD轉(zhuǎn)換作為一個(gè)自定義函數(shù),供主程序反復(fù)調(diào)用,但是最終轉(zhuǎn)換結(jié)果卻出現(xiàn)很多嚴(yán)重的錯(cuò)誤,遠(yuǎn)遠(yuǎn)偏離正確值,如果直接把該段代碼寫在主程序模塊中就一切OK,很是傷腦筋,這點(diǎn)對(duì)于程序規(guī)模比較大的,或是初學(xué)者是很不利的,解決辦法只有將公用代碼放在某個(gè)程序段中不斷的GOSUB和RETURN,要想跟C語言的優(yōu)秀的結(jié)構(gòu)化風(fēng)格比是不可能的。
2、部分語句有兼容性問題。如RC5SEND語句,在90S系列芯片中完全通過,而在MEGA系列芯片中完全失效,沒有任何動(dòng)靜,編譯過程中又沒有任何提示,這意味著MEGA系列無法使用這種簡單的辦法來擴(kuò)展鍵盤了。
3、用戶很少,網(wǎng)上例子代碼貧乏,無法跟其他用戶交流,這點(diǎn)對(duì)于初學(xué)者比較慘。
4、現(xiàn)成的算法少,很多需要自己重頭研究編寫,比較辛苦。
5、程序代碼空間的利用率低,完成同樣功能的程序,編譯的結(jié)果往往比C編譯器的大的多,比如一個(gè)寫LCD語句就會(huì)編譯出幾百的字節(jié)來,無法根據(jù)源程序大小來估計(jì)最終FLASH的使用率,而且一旦超出FLASH大小范圍只有干瞪眼的份,無法根據(jù)自己程序的實(shí)際情況來優(yōu)化空間,畢竟是調(diào)用現(xiàn)成的模塊嘛。
6、對(duì)硬件的操作很模糊,似乎隔離了用戶跟硬件打交道的權(quán)利,這當(dāng)然是為了給用戶簡單易用著想的,但當(dāng)用戶用了很多年BASCOM以后再想換換其他的編譯器,卻發(fā)現(xiàn)自己天天在用的芯片自己卻一點(diǎn)也不知道它的硬件結(jié)構(gòu)和使用方法,沒法放棄BASCOM了,貪圖方便的結(jié)果,慘?。?BR>
以上是我這些年研究BASCOM的“成果”,供大家參考??傮w上來說,這款軟件是可以給80分的,還算是不錯(cuò)的編譯器,適合簡單的作些端口控制的小程序,不適合包含大量算法和運(yùn)算量比較密集的項(xiàng)目;適合像我這樣的業(yè)余玩家(不過今年我已經(jīng)逐步放棄BASCOM而轉(zhuǎn)向ICC了)和作為非該專業(yè)學(xué)校的學(xué)生使用,不適合靠單片機(jī)混飯吃和將來打算深入研究的用戶。
另外,還想對(duì)壇子里某些哥們的一些觀點(diǎn)提出異議:
1、BASCOM語言的AVR開發(fā)工具編譯出來的程序執(zhí)行效率低。我認(rèn)為,這恐怕是受了計(jì)算機(jī)GW-BASIC或是TURBO-BASIC時(shí)代的影像,想當(dāng)然的把這頂帽子扣在BASCOM-AVR身上了,以前計(jì)算機(jī)的BASIC語言包括VB確實(shí)效率低,原因是他們生成的代碼不是最終目標(biāo)機(jī)器的代碼,而是經(jīng)過一個(gè)RUNTIME的程序在內(nèi)存解釋后運(yùn)行的。而單片機(jī)的BASIC編譯器是直接將代碼編譯成AVR相應(yīng)芯片的機(jī)器碼的,不需要在單片機(jī)的內(nèi)存駐留RUNTIME程序,執(zhí)行效率不會(huì)很低(垃圾代碼多則另當(dāng)別論),排除垃圾代碼的影像,執(zhí)行效率是跟其他編譯器編譯出來的一樣的。
2、BASIC語言結(jié)構(gòu)化能力差。我認(rèn)為這也是受了早期計(jì)算機(jī)教科書的誤導(dǎo)而以訛傳訛,BASIC發(fā)展到了QuickBASIC以后,結(jié)構(gòu)化能力已經(jīng)很強(qiáng),具備很多結(jié)構(gòu)化的思想和編程方式,已經(jīng)具有函數(shù)、模塊、局部變量、全局變量、數(shù)據(jù)傳遞等,已經(jīng)擺脫了早期BASIC語言GOTO和程序行號(hào)的陰影,而上面我提到的BASIC-AVR結(jié)構(gòu)化差的問題則是這個(gè)軟件開發(fā)的個(gè)別問題了,畢竟它只能盡量兼容QUICKBASIC,這點(diǎn)在HELP里也說得很清楚了。
亂七八糟談了一大堆,有什么不對(duì)的還請(qǐng)各位大俠不吝賜教,謝謝!