




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、如何用c來完成sn8系列芯片的程序設計松翰易愛華松翰科技(深圳)有限公司sonix technology co.,ltd.內容概覽一、c 與 assembly 簡述二、sn8 c studio的安裝與使用2 sn8 c studio的安裝2.2 sn8 c studio 應用實例三、數(shù)據(jù)類型與運算3.1專有數(shù)據(jù)類型3.2常量與變量3.3數(shù)據(jù)的存儲類型與存儲結構四、程序流程控制4順序結構4.2分支判斷結構4.3循環(huán)控制結構五、函數(shù)5.1函數(shù)的定義5.2函數(shù)參數(shù)傳遞與返回值5.3函數(shù)參數(shù)與全局變量六、結構體、聯(lián)合在sn8c程序屮的應用6結構體6.2聯(lián)合七、中斷7中斷斷數(shù)的定義7.2屮斷過程的分析7
2、.3中斷函數(shù)的結構八、位操作&1位的定義8.2位的運算8.3位比較在程序流程控制屮的應用九、內嵌匯編9.1如何內嵌匯編9.2內嵌匯編時變量的傳遞十、程序結構10主函數(shù)與了函數(shù)10.2構建可復用文件10.3構建具有實用性的程序一、c 與 assembly 簡述assembly (匯編)的歷史己經有半個多世紀了,從計算機的發(fā)明那天開始,匯編就注定要 與其結緣,它作為第-種真正意義上的編程語言,在計算機的發(fā)展過程小具有無可替代的地位。匯編具有少機器語言一一對應的高效率,就是由于匯編的高效率,和其緊貼硬件的特性, 使其在半個世紀z后的今天依然是目前開發(fā)單片機程序的主流工具z。但是由于編寫匯編代
3、 碼的工作量和難度都比較高,并且耍求程序員對硬件必須有較深刻的了解,其入門就相對較難。 而匯編的寫法各異,不同的程序員編寫的代碼有著巨大的差異,這就帶來了學習的難度,可讀 性差也成為了其推廣的瓶頸,程序的維護更加艱難。隨著程序復雜性的增加,開發(fā)團隊的形成, 應用而牛的高級語言就逐漸取代了其位置。c就是高級語言中針對硬件操作最優(yōu)秀的一利,c也是基于匯編的,其和互關系如圖所示。 隨著人們不斷的對c進行改善,使c的效率得到了很大的提升,其編譯效率逐漸的逼近匯編。 而c以其模塊化的編程模式,簡潔的代碼,良好的可讀性和可維護性,成為了另一種單片機開 發(fā)的主流開發(fā)工具,相比匯編而言,其具有無可比擬的優(yōu)異性
4、。圖1、c與匯編的關系sn8c是基于標準(2而乂加入sonix sn8系列芯片特征的專用c,它而對的是sonix sn8系列芯片程序開發(fā),它能產生非常簡潔的能直接運行于sn8系列芯片的優(yōu)化代碼。具冇 良好的兼容性,易學易用,既方便客八開發(fā),乂繼承了原有匯編的卓越性能。在木文當中,我們將結合匯編來講述c開發(fā)的各方面知識,以期通過對比來加深對芯片 的編程應用的了解,同吋,對熟悉c的程序員來說,可以更加深入了解芯片;而對于熟悉匯編 的程序員來說,我們可以從對比中找到從匯編到c的轉換方法。二、sn8 c studio的安裝與使用sonix sn8系列的芯片是risc內核的高性能芯片。h前,由sonix
5、提供的sn8 assembly 僅有59條指令,是一種高效的匯編語言,有s8asm和m2asm編譯器分別支持其1系和2系 芯片。在此:基礎上的sn8 c studio整合了匯編和c的編譯器,1 1、 sn8 c studio 的安裝在得到sn8 c studio的安裝包后,按照標準的windows程序安裝方法安裝就可以將軟件 安裝到機器上。12、sn8 c studio應用實例、創(chuàng)建一個工作區(qū)與vc類似,我們的工程管理模式是以工作區(qū)方式來管理,在你準備一個項目的時候, 你首先創(chuàng)建一個屬于這個項目的工作區(qū):1、打開ids-文件新建,單擊出現(xiàn)如下界面:a 2-1新建對話框2單擊workspace圖
6、標,進入workspace創(chuàng)建窗口,單擊location編輯框后的按鈕,選擇你 需要的匚作目錄,然后輸入新建workspace的name,在這里如f:圖2-2 新建workspace對話框3、單擊0k, ids的界血生成了工作區(qū)的工作界面,出現(xiàn)了 workspace窗口和output窗口。同 時,打開目標文件夾,你會發(fā)現(xiàn)在你選定的文件夾下面,牛成了一個以workspace name命名 的新文件夾,打開文件夾你可以看到一個新生成的.wsp文件,這就是新生成的workspace的配 置文件:5n8c1ex.wspm/sp爻件$i圖2-3新生成的workspace配置文件二、新建一個工程(proj
7、ect)在我們成功創(chuàng)建一個工作區(qū)后,你會發(fā)現(xiàn)我們的workspace窗口中的projiect數(shù)目為0,接 看我們就要依據(jù)項目所用的芯片母體來創(chuàng)建一個工程項目了,跟創(chuàng)建workspace相同,打開菜 單中的文件新建,單擊出現(xiàn)新建窗口,此時默認為新建projecto在右邊的project list窗口 中選擇你要使用的芯片母體和要創(chuàng)建的工程類型(一般為普通項冃),此時的h標路徑location 中已經顯示為你剛才建立的workspace冃錄,建議將工程保存在這個口錄下,不修改默認路徑。 給新建工程取一個有意義的name,在框中輸入。這里我們収與workspace相同的名稱,新建 一個2700系列芯
8、片的普通項口工程,設迸如f圖所示:1、單擊文件新建,選擇合適的選項:newnewrroject list副workspaces陽廂陽n8陽廂陽陽陽廂陽1t81t8n82700a rroject2600 project2500 project1900 project1800 project1700 project1600 project2700a sreies static library project260025001900180017001600static static static static static staticlibrary library library library
9、library libraryproject proj ect project project project projectokcancel i圖 2-4 新建 project2、單擊ok。3、新工程選項配置,在確認建立工程后,出現(xiàn)project setting對話框,左邊的project列表 中默認選中我們剛剛建立的工程,在這里我們只修改chip和code option項目下的選項,如圖 所示:圖 2-5 project setting 對話框4、選擇正確的芯片:在chip頁屮,definition文木框屮顯示系統(tǒng)依據(jù)你選定的芯片母體系列而確定的需要調用 的芯片定義文件。chip list
10、表列出了當前版木的ids所支持的這一系列的各個芯片,選中其中 你需要使用的芯片母體,selected文本框和description sc本框和應會口動改變。如圖:圖2-6選擇芯片5、設置正確的code option選項和ice mode:ice mode的設置在sn8plxxx芯片中是用丁選擇是否是ice仿真模式,在code option 列表中自動顯示選定芯片母體的code option選項,在option value項的默認值上單擊,出現(xiàn) 一個下拉列表,單擊選擇合適的選項。如圖:圖2-7設置止確的code option6、單擊ok,系統(tǒng)牛成一個沒有文件的工程,在workspace管理窗口中
11、我們可以看見當 前牛成的工程為working project,正處被激活狀態(tài)(工程名稱為加粗字休):workspace - sn8c_ex : 1 projec白鶯 sm8c_ex 口 source header圖2-8新建project的狀態(tài)被激活 打開相應的文件夾,我們會發(fā)現(xiàn)系統(tǒng)生成了很多個新的文件,其屮的.pij文件即為工程文 件,其他的文件為根據(jù)我們剛才的設置和不同的芯片生成的配置文件及頭文件。三、新建文件完成項目的新建后,我們發(fā)現(xiàn)項目管理器source文件夾下是空的,沒有任何文件,文件 就是我們編程的主要工作了 !1、打開文件-新建菜單,單擊出現(xiàn)我們前面看過很多次的new對話框,不過
12、比前面多了一個選項files,選擇new列表中的files選項,單擊按鈕,對話框如圖所示:圖2-9新建文件對話框2在file list 'i1選屮需要創(chuàng)建的文件類型,這里我們創(chuàng)建一個c source file,給文件命 名從name編輯框屮輸入,存放的地點為剛才的設定位置,默認不做修改。3、單擊0k按鈕,ids打開一個編輯窗口,最大化,顯示為剛剛建立的文件名的頁,系 統(tǒng)允許我們在這里進行程序的編寫。四、編寫程序在新建一個文件后,系統(tǒng)自動打開編輯器,并打開一個由用戶命名的空文檔,它與普通文 檔相比較沒有什么不同的z處,只不過它可以對c的關鍵字進行高亮顯示。在新的文檔里編輯 程序。c本身就
13、是一種模塊化的編程語言,sn8c的編程保持c語言的編程風格。 sn8c所具有的nonansi c的特性請參看其他章節(jié),在此不再做描述。 下面是一個簡單的c程序舉例。例2:* file name : sn8c_ex.c* post by : dragon.yi* date : 2005/09/23* test history : vi.00.220 describe:test 2708 interrupt住丄 2丄.丄丄丄“ ”“ ”丄 “丄.“/<t>p ppp pppppp /#includc <sn8p2708a.h> struct wordunsigned fin
14、t: 1; unsigned :7;jintword;unsigned int tc0cvaluc=0x64;unsigned int accbuf = 0x00; unsigned int pflagbuf = 0;/the data will auto store!interrupt intserv(void)_bclr(&intrq,5); tc0c = tcocvalue; intword.fint = 1;void initlo(void); void initlnt(void);void main(void)stkp=0x07;initio();initint();whil
15、e(l)if(intword.fint!=0) pl=0x00;p2=0x00;p3=()x()();p4=0x00;p5=0x00;po=oxoo;elsepo=oxff;pl=oxff;p2=0xff;p3=0xff;p4=0xff;p5=0xff;void initlo(void)p0m=0xff;plm=()xff;p2m=0xff;p3m 二 oxff;p4m=0xff;p5m=0xff;void initlnt(void)intrq=0x00;inten=0x00;tc()m=()x()();tc0m=0x20;tc0c=0x64;_bclr(&intrq,5); _bse
16、t(&inten,5);_bset(&tc0m,7); _bset(&stkp,7);注:程序只作為程序架構提供參考!五、調試程序在完成代碼編輯后,想要馬上順利運行基本上是不可能的,每一個程序都有經過調試的 過程,程序的調試在ids屮非常方便,ids有全而的可視化的調試工具。你可以在程序屮設置 斷點,在程序中按自己的需求來運行。可以根據(jù)不同的需求來進行調試。1、compile 和 build完成代碼的編輯后,首先要進行compile,在菜單build->compile current file單擊或在工具欄屮單擊compile按鈕和單擊快捷鍵ctrl+f7均以啟動
17、系統(tǒng)的compile程序。compile程 序會檢杏代碼屮存在的語法錯謀和軟件設置錯込 然示在ompih窗口表列岀來,用戶可以根據(jù) 表列出來的提示,對程序進行修改。若是語法錯誤,在列表中雙擊選項,系統(tǒng)會自動將光標移 動到相對應的代碼行,方便你的檢查和修改。compile通過后,進行build,同樣有3種方式可 以啟動build程序,build程序生成運行所需要的一些文件,同時檢查硬件配置和連接錯誤,用 戶必須根據(jù)提示對程序進行修改才能順利通過。2、選擇仿真方式單擊進入projcct->sctting, !l|jw我們前面已經熟悉的project setting對話框,當前就示的是 gen
18、eral頁,在primary setting組下面找到復選項use simulateo如果選屮該選項,則程序就在系 統(tǒng)提供的虛擬仿真器上仿真并顯示相應結果;若不選中該選項,則程序必須在相應系列的仿真 器上進行程序調試仿真。這里我們先選擇它。3、進入調試模式完成compile和build z后,進入菜單dcbug->bcgin debug,單擊菜單項或直接按快捷鍵f5或在圖標選項中選擇按 曾鈕單擊都可進入調試模式,進入調試模式后,系統(tǒng)界面變成如下圖:d e r 0尙 g >> t£? vi % 冷檔諛體ii 4)卩.£ .茫? *.q h f »r
19、» e護f臥 "a口葉 erowet quu qebug loebgp/tho data vill auto stow!5onb< in*egrated development system - (w8_tet604xuruxened urt tc0cvalue»llx64; unsicned mt accbuf = 0x00; imfifmd lnt pflafbuf = 0: .interrupt interv(void) .boruihtrq, 5); tcoc s tcocvalue. intword. fint « 1 3 lorktpa
20、ct - %nfl.ltt<604e) k ib8_1«sim4 a o swc«void a&w(void)uif (intvord. fint l«0)htoo»k00l1ljioiooaddr«*sm gln 31,3 inum16:53 o圖211調試程序界面3:void lmt io(void). void lmtlwt(void):stkp«)xo7; mitloo : lnitinto; vhile(l)2 he心oh 轉 cn»wxtkb |sowlnt9r(gpl»0x00; p2=
21、' <00; p>0x00.pchucl5 fit s 口 k”dr二4ryond.fl h 勻 dryondf2 hokoo0«000x000*00 00 (mlm0noisioksiob owoo系統(tǒng)界而出現(xiàn) ram windowwatch window> variable window> register window> call stack window和disassembly window ,這些窗口都是調試程序要用到的。程序的指針指向程序的入 口處,即main ()函數(shù)的第一條語句。4 應用 watch window:在調試過程中如何
22、應用watch window? watch window用在調試工程中對定義的變量進行 監(jiān)視,將需要進行監(jiān)視的variable在編輯窗口屮雙擊,然后拖放到watch window當中,運行 程序就可以在watch window中看到variable的存放地點和值的變化。如圖:namelo.addressvalue keycha tramf0x00000010oxft|1 imiv watch 1 x watch 2 入 watch3 /!圖 2-12 watch window 窗 fl系統(tǒng)會將產牛了變化的項置成紅色。為方便觀察,你最多可以將variable分別放到3個watch window當
23、中進行觀察,他們的 顯示效果是一樣的!5、應用 variable windowvariable window顯示格式和watch window的顯示格式樣,但是variable window里面的 項無法自己設定。它是以auto的狀態(tài)顯示當前運行過程中被改變的local variable,同樣系統(tǒng) 會將最近改變的量置成紅色。6、應用 register window:register window里面顯示的項是根據(jù)芯片的資源而定的,它顯示的是當前母體芯片ram 中0x80oxff空間屮專用存儲器在當前運行狀態(tài)下的值,單擊前面的“ + ”號,將擴展項f1展 開,可以得到毎一個bit的當而值。同樣,
24、在運行過程中,系統(tǒng)會將剛改變的項的值置為紅色 高亮顯示,便于我們觀察跟蹤。由tcorcannot access.spcloxadspch0x00ep00x00白ploxfff fp100x01 fpu0x01fp120x01ofp130x01fp140x01fp150x01 fp160x01fp170x01a3p20x00由i>30x00namevalue圖 2-13 register 窗口7、應用 call stack windowcall stack window顯示當前運行狀態(tài)卜,stack的使用狀況和入棧的函數(shù),用戶可以根據(jù) 顯示來判斷程序的調用狀況,進而判斷當前的狀態(tài)是否正確,
25、有沒有函數(shù)調用岀錯。圖 2-14 call stack 窗口8、應丿ij memory window:在程序運行當屮,當你想從具體的ram地址而得到它的值的時候,你可以通過memory 窗口中實現(xiàn),你可以直接在go to后面的編輯框中輸入地址,按enter鍵確認,窗口會自動跳轉 到相應的位置顯示該位置的值,方便我們在使用過程中的查找。9 應用 disassembly window:如果調試過程屮,你需耍知道程序的直接匯編碼,你可以在這個窗口屮觀察。1()、設置斷點:程序調試的時候,往往需要知道程序運行過程中某個變雖的運行狀態(tài),或者想知道某段 程序是否執(zhí)行,還有執(zhí)行后的結果;或者,需要知道某段程
26、序的運行過程是否匸確。這吋,就 必須在程序的正確位置設置斷點。將光標移到正確位置,在相應的行,單擊設置斷點的按鈕或按快捷鍵f9或者從菜單項中 設置都可以使該行程序被設置成為斷點,被設置成斷點后,運行程序,程序就會運行到斷點處 停下來,以便于用戶控制程序的執(zhí)行和觀察執(zhí)行的結果。如圖:elsep0=0xff;pl=0xff;op2=0xff;p3=0xff;p4=0xff;p5=0xff;圖215斷點執(zhí)行狀態(tài)11、跟蹤程序執(zhí)行:應用系統(tǒng)提供的debug工具,用戶可以很方便地對程序的執(zhí)行效果進行跟蹤。你可以單步, 也可越過一段程序往下執(zhí)行,這要看你的需要!調試工具同樣町以以3種方式打開:debug菜
27、 單、工具欄按鈕和快捷鍵。六、程序輸出1、仿真程序結果:將仿真器與主機連接好,在project setting中清除use simulate選項的選中狀態(tài)。將需要仿 真的硬件系統(tǒng)冃標板連接好。單擊debug按鈕或者按快捷鍵進入調試狀態(tài),就可以在實際硬件 上看到程序運行的結果,對程序進行修改直到得到正確結果。我們就得到一個正確運行的可以 燒錄到實際芯片的程序。2、輸出燒錄文檔在完成程序的調試仿真后,我們就需要將程序輸出。系統(tǒng)已經在默認目錄下生成程序的 燒錄檔xxx.sns,默認目錄為當前工程文件的目錄下。數(shù)據(jù)類型與運算sn8 c支持標準c的所有數(shù)據(jù)類型。具體有無符號字符(unsigned cha
28、r).有符號字符 (signed char)> 無符號整型(unsigned int)> 有符號整型(signed int)、無符號長型(unsigned long)、 有符號長型(signed long)浮點(float)和指針類型。還支持所有的構造類型。字符型(char)r基本類型整型(int)長整型(long)< 浮點型(float)數(shù)據(jù)類型j構造類型指針類型數(shù)組(any)結構體(struct) 共用體(union) 枚舉(enum)圖3-1數(shù)據(jù)類型3.1專有數(shù)據(jù)類型雖然sn8c支持c的所冇數(shù)據(jù)類型,但是由于它面對的是8-bit單片機,所以必然會考慮 數(shù)據(jù)類型的定義方法
29、和長度。在這些方面,sn8 c有它口己的專有的定義特征和數(shù)據(jù)長度,在 使用時一定要加于區(qū)分。請看下表:數(shù)據(jù)類型size (byte)數(shù)據(jù)取值范圍signed char (short int)1-128 +127unsigned char(shorts int)10-255signed long2-32768+32767unsigned long2065535float、double4pointer2enum1表31、數(shù)據(jù)類型長度定義表3.2常量與變量在程序設計的過程中,我們有些量可能是參考值,也町能是預設的值。總z,我們希望它 在整個程序中保持不變,并且在程序的任何地方可以提供我們調用,用來比
30、對某些條件是否成對于這樣的值,我們可以不去定義它,而直接參考數(shù)值,這在匯編編程過程中,經常會有 一些缺乏經驗的程序員這樣用。但這就需要程序員把程序中的這些值都牢牢記住,并要將他 們的值前后統(tǒng)一,這是一個非常容易出錯的過程,而且也會影響了程序的可讀性,這樣,程序 的修改和維護都非常艱難,必須處處小心翼翼,一處不慎就全盤錯誤!這是任何人不想看到的 后果。因此,建議對于程序中用到的不會改變的參考值或其他預設的值都進行一個預先的定義, 給它取一個有意義的或與其相關的名字。這個過程就是常最定義,白然,這個不變的量就稱為 常量。在標準c中,由于而對的是功能強大的cpu系統(tǒng)和大內存,用戶可以不去管它放置的地
31、 方。但是,而對一個單片機系統(tǒng),它的ram非常小,有吋會顯得很緊張。所以系統(tǒng)為了節(jié)省空 間會將一些表格等放在系統(tǒng)的rom中。而我們直接命名的常雖,則由編譯器自動將其替換為 所需要的值,這些工作就由計算機來完成好了。我們先來看看我們用匯編編寫程序時是怎么來定義常量的:如:door_service_cequ#8();80ms去門抖動toint_cequ#224;t0中斷時間segment_cequ#3;最多3段烹調注:上面數(shù)值前的#號,是sn8asm的符號,用于提示后面的是立即數(shù)。上而定義了 3個程序中會用到的參考值,順便提一下,在定義的時候加上注釋是有必耍的, 要不然時間久了你就乂不知道你定義的
32、到底是什么了。在上而的定義中,用的是匯編equ關鍵 字,在編譯過程中,程序里但凡出現(xiàn)了 equ前面的字段都會被其后面的值直接代替,因此,很 方便地減輕了程序員的工作。我們再來看看用sn8 c是如何定義這些相同的常量的:如:#define door_service_c 80 /80ms 去門抖動#dcfinc toint.c224/t0 中斷時間#define segment_c3;最多 3 段烹調上面定義的3個量是與前面匯編當中定義的3個常量是完全和同的。在進行編譯預處理時, 這些量就會被數(shù)值代替。還有一個特殊的地方,那就是一些數(shù)值列表,在匯編當中,查表項都是放在code當中的, 作為code
33、來處理,其實這些值也是常量,只不過他們的處理不同于一般常量而己,并且它們 共用一個入口。下面是一個匯編的表:disp_automenu:;顯示菜單用第二數(shù)字表格dw oooohdwoaelfh;a-1dw0ae2fhdwoae3thdw0ac4flidwoae5flidw0ae6flidw0ae7fh我們可以看到,匯編的表是用dw關鍵字定義一個word,它是存放在.code段里面的,通 過表頭地址來得到每一個相對應的值。那么在sn8c里面乂如何來處理這些表呢?在講到表的處理之前,必須先提一提變量定義關鍵字的問題。sn8c定義一個變量時,可 以指明它所放置的地方(ram或rom),分別用關鍵字_
34、ram 和rom來指定存放的地點, 如:unsigned int _ram ramveriable;將變量存放在 ram 中ram unsigned int ramveriable2;unsigned int _rom romveriable;將變赧存放在 rom 屮_rom unsigned int romveriable2;我們可以知道,當一個最放到了 rom當屮就沒法改變它的值了,其實就是我們說的常最。在c當屮,可以通過一個頭名稱來訪問的變量類型比較多,其屮數(shù)組是比較方便的一種, 我們可以通過定義一個數(shù)組來存儲這些表的數(shù)值,然示通過對數(shù)纟r的訪問來杏詢對應的值。如:unsigned lo
35、ng rom disp_automenu=顯示菜單用第二數(shù)字表格0x0000,oxoae 1 f,0x0ae2f,0x0ae3f,0x0ae4f,0x0ae5f,0x0ae6f,0x0ae7f;這是一個與上面的匯編表完全相同的表,我們將它存放在_rom中,通過調用數(shù)組來查 表,這在后面將詳細介紹。而在程序中還冇另外一類的雖是會在程序中不斷被改變的,比如程序中的計數(shù)器,狀態(tài)寄 存器等等都會隨著程序的運行而改變。我們將這一類量稱z為變量。我們先來看看匯編的定義變量的方法:.dataorgohtempids1tcmp2ds1temp3ds1temp4ds1led_dpds1stepds1 ;當前狀態(tài)
36、上面的代碼定義了 tempi、temp2、temp3、temp4、led_dp> step6個變量,它們分別占用 一個byte的ram空間,那么程序當屮就可以通過變量名對該變量的空間進行讀寫。當然在匯 編屮你也可以用一個變蜃名來訪問兩個或多個ram空間,這類似于杏表的操作,其定義如下:job_modeds 2powcr_modeds 4對上面的job_mode變最對以通過job_mode和job_mode+1來讀寫定義的兩個存儲單元, 以此類推power_inode或其他多個ram空間定義的變蜃可以通過相同的方法來定義。可見, sn8asm定義變屋的方法主要是通過ds關鍵字來申請盂要的變
37、雖空間,空間一旦被申請,就 在整個程序流程里面被占用,也就是說定義一個變量就少一個空間,這對于ram本身就很少 的單片機而言,不能不說是一種浪費°那么sn8c又是如何來定義變量的呢?要說到c的變疑,就不能不提一提變量的有效作用域。我們知道,匯編當中定義的變量都是在整個程序中冇效的,在程序中任何地方都可以改變 變量的值,這樣程序員就會經常遇到這樣的悄況:在調試程序時發(fā)現(xiàn)變量的值有誤,卻無法判 斷變量到底在什么地方被錯誤賦值或被賦予了錯誤的值,從而不得不在整個程序中到處設置斷 點,運行多次才找出問題的所在。這就是匯編當屮變量定義造成不方便的地方!而c的變量的定義區(qū)分了作用域,分為全局變量
38、和局部變量,而區(qū)分定義這兩種變量的 方法很簡單,只是在不同的位置定義就行了,這與標準c所規(guī)定的方法是一樣的,后面再詳細 討論。卜面是sn8 c定義的兒個變量:unsigned int tempi;unsigned int temp2;unsigned int temp3;unsigned int temp4;unsigned int led_dp;unsigned int step;當前狀態(tài)unsigned long job_mode;unsigned long power_mode 1;float powervalue;int templ_l;有符號的long temp2_2;從上面的定義可
39、以看到c的變量不僅區(qū)分了作用域,還有不同長度的變量類型,這樣就 方便了程序員的使用。與面向數(shù)學運算的計算機相比,單片機的編程對變量類型或數(shù)據(jù)類型的選擇更具有關鍵性 意義。sn8系列單片機是8bi(處理器的單片機,只有byie型的數(shù)據(jù)是處理器肓接支持的。對 于c這樣的高級語言,不管使用何種數(shù)據(jù)類型,雖然某一行程序從字面上看,其操作i 分簡單, 然而,實際上系統(tǒng)的c編譯器需耍用一系列機器指令對其復朵的變量類型、數(shù)據(jù)類型的進行處 理。相同的一行語句,變量選擇的類型不同,處理時就會產生很大的差別,產牛:的代碼更是差 別很多。特別是當使川浮點變量時,將明顯地贈加運算時間和程序的長度。當程序必須保證運 算
40、精度時,c編譯器將調用相應的了程序庫,把它們加到程序屮。然而許多不熟練的程序員, 在編寫c程序時往往會使用大量的、不必要的變屋類型。這就導致c編譯器相應地增加所調用 的庫函數(shù)以處理大量增加的變量類型,并最終導致程序變得過于龐大,運行速度減慢,甚至因 此會在link時,出現(xiàn)因程序過大而裝不進rom的情況。所以必須特別慎重的選擇變量和數(shù)據(jù) 類型。而對于有符號與無符號的變蜃類型。在編寫程序時,如果使用signed和unsigned兩種數(shù) 據(jù)類型,那么就得使用兩種格式類型的庫函數(shù)。這將使得占用的存儲空間成倍增長。因此在編 程時,如果只強調程序的運算速度而又不進行負數(shù)運算吋,最好采用無符號(unsign
41、ed)格式。note:1、選擇數(shù)據(jù)類型的時候,在能夠順利完成功能的情況下,請盡量選擇占空 間少的數(shù)據(jù)類型,這樣不管是在ram空間使用上還是在產生代碼效率上 都是有益的!2、能使用無符號數(shù)的都使用無符號數(shù),以免處理出錯,因為芯片內部是以 無符號數(shù)處理的。3、切記! c語言對大小寫敏感,在開始定義變量的時候就要注意要有相應 的規(guī)范可循,用駝峰式是一個好的選擇,這對于習慣于匯編的程序員來 說,可能不大習慣!當然,在標準c編程當中,經常會冇為書寫方便,對數(shù)據(jù)類型進行縮寫定義,這在sn8c 也是允許的。如:#define uchar unsigned char#define uint unsigned
42、int這樣,在以后的編程中,就可以用uchar代替unsigncd char,用uint代替unsigned int來 定義變量。33數(shù)據(jù)的存儲類型與存儲結構在前面分析查表類型數(shù)據(jù)定義的時候已經提到了數(shù)據(jù)在單片機里的存儲,會分為rom和 ram兩部分,我們分別稱之為程序存儲器(rom)和數(shù)據(jù)存儲器(ram)。它們在我們編寫匯 編的時候,會分別用關鍵字.code和.data來預先聲明。通常sn8系列單片機不用擴展存儲器,它提供種類豐富的機型,你完全可以根據(jù)你的需 求來選擇合適的機型。因此,數(shù)據(jù)只存儲在片內,尋址也不存在片內片外的區(qū)分。sn8p單片機的數(shù)據(jù)存儲器(ram)的結構如下:bankoba
43、nklooooh007fhoo8ohooffhoo1ooolffhsn8p系列單片機的通用ram區(qū)的大小依不同的芯片而不同,但都是按bank來劃分, 每一個bank內的地址為00hffh。而所有芯片的banko的80hffh的空間都是留給系統(tǒng) 專用的系統(tǒng)寄存器區(qū)。其實我們上面定義的變雖都是放在ram區(qū)的數(shù)據(jù)結構,在定義一個變雖時,我們前面已 經提到可以用_ram和rom關鍵字來指定存儲的地方,而變最定義一般都放在ram當屮, 因而ram關鍵字是缺省項。看下面的例子:unsigned int temp 1;unsigned int _ram temp2;_ram unsigned int tem
44、p3;unsigned long job_modc;unsigned long ram job_mode2;ram unsigned long job_mode3;float powervalue;float _ram powervalue;_ram float powcrvaluc;int templ_l;冇符號的int ram tempi-2;_ram temp 1-3;long temp2_2;其實上面的定義都是相同的效果,就是定義變量,并將其放置在數(shù)據(jù)存儲區(qū)(ram)內。 也就是說,我們在定義一個變量,按我們c常用的方法定義就自動地放到ram里了,缺省項 給我們帶來了很大的方便。上面已
45、經說明了,在ram存儲區(qū)內,80hffh是系統(tǒng)寄存器區(qū)。那么我們又是如何來定義系統(tǒng)寄存器區(qū)呢?我們先來看看系統(tǒng)寄存器都有哪些內容:0123456789abcdef8lhrzyxpflagrbank9ampmap4con-bdamadmadbadrpedgec-p2m-p4mp5m-intrqintenoscm-wdtrtcorpclpchdp0p2p4p5tomtcomtcoctc1mtc1ctc1rstkpepourp2urp4urp5uryzfstk7lstk7hstk6lstk6hstk5lstk5hstk4lstk4hstk3lstk3hstk2lstk2hstk1lstk1hstko
46、lstkoh表32、sn8p系列單片機系統(tǒng)寄存器列表根據(jù)不同的芯片的資源,寄存器的內容會隨之改變,但是他們定義的區(qū)域都不變。這些寄 存器都分別對應了芯片內部的資源,sn8 c針對這部分的系統(tǒng)資源,對這些寄存器進行了定義,其定義的形式如下:# definel(*(_ram unsigned int*)ox8o)#defineh(*(_ram unsigned int*)ox8l)#definer(*(_ram unsigned int*)ox82)# definez(*(_ram unsigned int*)ox83)# definey(*(_ram unsigned int*)0x84)# d
47、efinex(*(_ram unsigned int*)ox85)#definepflag(*(_ram unsigned int*)ox86)這些定義都被包含在相應芯片的頭文檔里(h),因此并不需要用戶自己去定義寄存器的相應名稱,只需要在程序的開頭包含相應的頭文檔就行了。如下所示:#include <sn8p2708a.h>note:這些系統(tǒng)寄存器都是以大寫字母進行定義的,在編寫程序時要注意這一 占/lit。程序流程控制是程序的精華所在,正確的程序流程/能實現(xiàn)正確的程序功能。安排精巧的 程序流程控制才可能使程序具有高效率。程序流程控制不管是在c還是在匯編中都是程序設計 者最值得思
48、考的地方。41順序結構順序結構是程序最基木的流程,其語句順序執(zhí)行,pc指針依次下移,是cpu內部處理指 令的初始方法。這也是編程思維的蝕初級方式,也是程序的蝕基本方式和流程。順序結構流程:圖41順序結構流程其實,其描述的是一個向量方式發(fā)展的問題,是所有問題發(fā)展和描述的基木方法,具有明 確的方向性和時間性,如圖中的a操作的發(fā)展方向只冇一個,即接下來就是b操作,中間既沒 有反復也沒有曲折變化,b 一定發(fā)生在a的后面。我們平時可以看到的c語言的實現(xiàn):(微波爐開機初始化)key_bibi_f = 1;上電響一聲menu_disp_h = oxfou;上電顯示 0:00menu_disp=();disp
49、5 = oxffu;上述簡短的幾條語句分別完成一定冃的的初始化,雖然在這星沒冇強制要求什么樣的順 序,但是執(zhí)行過程屮是嚴格按語旬的先后來開關目標的。sn8asm的實現(xiàn):bobset key_bibi_f;上電響一聲mova,#ofohmovmenu_disp_h,amova,#00hmovmcnu_disp_l,amova,#llllllllbmovdisp5,a;上電顯示0:00這是一段功能完全與上面這段c相同的匯編實現(xiàn),我們可以看見在順序結構的匯編語句 當中沒有任何的跳轉和判斷,都是按原功能的順序來描述。從對比當中我們完全可以找到它們的邏輯上的一一對應關系。4.2選擇結構事實上,完全順序結
50、構的流程的程序很少,因為很多事情并不是一帆風順,順流而下。很 多情況下,事件的發(fā)生都需要具備一定的條件,只冇一定條件下才冇可能實現(xiàn)。這就得使用選 擇結構來描述。選擇結構流程圖:圖4-2選擇結構流程圖簡單選擇結構只判斷一個條件的真假來決定下面的需要執(zhí)行的操作,這是一個最簡單的判 斷。c語言實現(xiàn):(bcd碼調整)if(result_buf > oxoa)result_buf = input + 6;rcsult_buf = input;我們看見在c語言當中,我們用判斷語句來實現(xiàn)這樣一個判斷邏輯,不管是什么樣的條 件,我們只計算其真假,做出判斷。ifelse是一個非常好的判斷組合,很容易用它來
51、完 成下列我們用匯編來實現(xiàn)的功能。sn8匯編實現(xiàn):emprs a,#oah nop bobtso fcjmp $+3 bomov a,ybomov a,yadd a,#6h;調整后的數(shù)放在a事實上,在匯編程序中,我們會遇到幾種情況的條件選擇:一是當條件是一個位變量時,我們可以直接川bobts指令來進行判斷。一是當條件是是否滿足一個預定的值,我們可以用cmprs指令來進行判斷,當然也可以 將英轉化為標志位來判斷。也可以用減法的方法將其轉化成為標志位進行判斷,就看需要來安 排了更 7/k o o 0 o 0 oa、串行多分支結構流程:事實上大多數(shù)時候,單個的條件無法分析判斷復雜的問題,冇時候一個結
52、果的出現(xiàn)需要很 多個條件同吋成立,而每一個條件成立,又都有不同的結果產生,這樣就會有一系列的有層次 的判斷!圖4-3串行多分支結構流程圖c用if, else if嵌套來實現(xiàn):if(key_bibi_f)buzzejtime = d_buzzer_time 1;響聲長愆,200msbuzzer_not = d_buzzer_not3;要響兒次,#1else if(end_bibi_f)/buzzer 10buzzejtime = d_buzzer_time2;響聲長愆,500msbuzzer_not = d_buzzer_not 1;要響幾次,#10else if(segment_bibi_f) /buzzer20buzzejtime = d_buzzer_time2;響聲長愆,500msbuzzer_not = d_buzzer_not 1;要響兒次,#4說明:kcy_bibi_f;按鍵響聲請求標志end_bibi_f;烹調結束響聲請求標志sgment_bibi_f;段切換響聲請求標志按鍵響聲:200ms/l次結束響聲:5()()ms/5次段切換響聲:500ms/2次問:sn8 asm怎么實現(xiàn)?sn8 asm的實現(xiàn):
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 董卿一年級數(shù)學試卷
- 肝患者臨床護理
- 甘肅省臨洮縣數(shù)學試卷
- 肛癰的護理課件
- 福州春考數(shù)學試卷
- 肉鴿養(yǎng)殖技術課件教學
- 肉豬養(yǎng)殖技術課件
- 2024年10月陜西陜西農信社社會招考筆試歷年參考題庫附帶答案詳解
- 2025至2030國際快遞行業(yè)市場深度研究與戰(zhàn)略咨詢分析報告
- 邯鄲市館陶縣事業(yè)單位招聘考試真題2024
- 大學2023年自主招生報名登記表
- 小學體育暑假特色作業(yè)
- 2020四川考研數(shù)學二真題【含答案】
- 壓縮機拆除方案
- DB50-T 1293-2022 松材線蟲病疫木除治技術規(guī)范(標準文本)
- 微電子工藝實驗報告
- 部編人教版小學一年級上冊寫字表田字格字帖
- JJG 5-2001 纖維卷尺、測繩檢定規(guī)程-(高清現(xiàn)行)
- 金屬材料檢驗的標準課件
- 暑假人教版7升8年級英語試卷試題及答案
- 培訓PPT:燃氣安全知識及管理PPT課件
評論
0/150
提交評論