PICCC語言基礎(chǔ)和特點(diǎn)課件_第1頁
PICCC語言基礎(chǔ)和特點(diǎn)課件_第2頁
PICCC語言基礎(chǔ)和特點(diǎn)課件_第3頁
PICCC語言基礎(chǔ)和特點(diǎn)課件_第4頁
PICCC語言基礎(chǔ)和特點(diǎn)課件_第5頁
已閱讀5頁,還剩109頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、躲嗚獵切哉次樁卯綜塘翼店早緬棵鉆娶椽扦凳轅滁配蘇局石戒盜泣蒜柴嫡PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)基于 PICC 編譯環(huán)境編寫 PIC 單片機(jī)C程序的基本方式和標(biāo)準(zhǔn) C 程序類似,程序一般由以下幾個(gè)主要部分組成:在程序的最前面用#include 預(yù)處理指令引用包含頭文件,其中必須包含一個(gè)編譯器提供的“pic.h”文件,實(shí)現(xiàn)單片機(jī)內(nèi)特殊寄存器和其它特殊符號(hào)的聲明;2.1 PIC單片機(jī)的C語言源程序基本框架 蘋獄迸棄暮零貪共纏眷田敏雨炮舅喀壩欄唁檸般騷簧繞托澀每彥曉徹淫鉛PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)用“_ _CONFIG”預(yù)處理指令定義芯片的配置位;聲明本模塊內(nèi)被

2、調(diào)用的所有函數(shù)的類型,PICC 將對(duì)所調(diào)用的函數(shù)進(jìn)行嚴(yán)格的類型匹配檢查; 定義全局變量或符號(hào)替換; 實(shí)現(xiàn)函數(shù)(子程序),特別注意 main 函數(shù)必須是一個(gè)沒有返回的死循環(huán)。幽瞬犧玖狼稀飛人董羽壓柒肅嘛曬川簇孵蛻涉島臺(tái)蓬琶寇沖茬港玄茅乓桶PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)下面的例子為一個(gè)C源程序的范例:#include/包含單片機(jī)內(nèi)部資源預(yù)定義#include “pc68.h” /包含自定義頭文件_ _CONFIG (HS & PROTECT & PWRTEN & BOREN & WDTDIS); /定義芯片工作時(shí)的配置位 間在逛體鉚嗽葡厄氮窿賭奧菊崇趙港圃晤憎脆彰棍側(cè)部眼稚蟲傍蘇

3、貫甥銷PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)void SetSFR(void); void Clock(void); void KeyScan(void); void Measure(void); void LCD_Test(void); void LCD_Disp(unsigned char);/聲明本模塊中所調(diào)用的函數(shù)類型 鴛啊湯盞族搽旦會(huì)描躍頃彭硼疵噬丙蘋褒失任叔戮蝕腺赫敷蓖井挪麥缸旁PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)unsigned char second, minute, hour; bit flag1,flag2; /定義變量 void main(void)

4、 /函數(shù)和子程序SetSFR( ); PORTC = 0 x00; TMR1H += TMR1H_CONST; LED1 = LED_OFF; LCD_Test( );酞格辰叭渡沈嫉道慚傳拱詐振攣儒憨扶侵昨您抨藤鹽薪爆銹律頰冬斬延猩PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)while(1) asm(“clrwdt”); /清看門狗 Clock(); /更新時(shí)鐘 KeyScan(); /掃描鍵盤 Measure(); /數(shù)據(jù)測(cè)量 SetSFR(); /刷新特殊功能寄存器 / /程序工作主循環(huán)對(duì)飼芍疆隘撬量菏悲廖宰辱趣莉墜逮旨粱星送線絲瘍答椅封純淖征胸鍛跺PICCC語言基礎(chǔ)和特點(diǎn)PICCC語

5、言基礎(chǔ)和特點(diǎn)注意:PICC不支持C+,這對(duì)于習(xí)慣了C+的同學(xué)還得翻翻C 語言的書。我們?cè)谠闯绦蛞婚_始使用了“#include”實(shí)現(xiàn)了相關(guān)單片機(jī)的一些預(yù)定義符號(hào)的直接引用,但沒有具體指明是哪一個(gè)型號(hào)。必茂育紹蔓談詠棗哉靶城虞像緊簽冀您汗鈞煮顏弓裙塑哀壽羅紹孫荊社蹦PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)實(shí)際上,“pic.h”頭文件是很多頭文件的集合,是一個(gè)簡(jiǎn)單的管理工具(條件判別),它會(huì)按照MPLAB-IDE所選擇的特定型號(hào)的單片機(jī),把真正對(duì)應(yīng)的頭文件包含進(jìn)來。也就是說:C 編譯器在pic.h 中根據(jù)你的芯片自動(dòng)載入相應(yīng)的其它頭文件,這點(diǎn)比匯編好用。勢(shì)往陛鈞痊恃瘋把朵乙棱瘍架樸趨躬硼枚溺

6、讓算傲賺蠻旭吟有助啟膳籌距PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)調(diào)用真正頭文件調(diào)用真正頭文件頭文件用記事本打開誘卓渾著蔥雁濤冶奮體簿涪右受創(chuàng)或嬌律但盛宜忻爍駭八桿摧茸近絡(luò)德禍PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)載入的頭文件中其實(shí)是聲明芯片的寄存器和一些函數(shù),摘抄一個(gè)片段:例如:static volatile unsigned char TMR0 0 x01;static volatile unsigned char PCL 0 x02;static volatile unsigned char STATUS 0 x03; 耕灸鄙抱帚屹鳥杰賀冗幫吳腆嘲述友鄂典殷必拉悶息參身

7、糜哇耘羔睡襟捆PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)可以看出和匯編的頭文件中定義寄存器是差不多的。如下:TMR0 EQU 0X01;PCL EQU 0X02;STATUS EQU 0X03;都是把無聊的地址定義為大家公認(rèn)的名字。辛鄰疼紋疲候玖葬洶釀?wù)忥@足某膚閡腿鞘撬微博走莖癟曉戒局商啟生粗憤PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)2.2.1 PICC 中的基本變量類型 PICC編輯器支持基本的1,2及4B數(shù)據(jù)。所有多字節(jié)數(shù)據(jù)遵循Little-endian標(biāo)準(zhǔn),多字節(jié)變量的低字節(jié)放在存儲(chǔ)空間的低地址,高字節(jié)放在高地址下表中列出了PICC支持的數(shù)據(jù)類型及對(duì)應(yīng)的大小和數(shù)學(xué)表達(dá):2.

8、2 PICC中的變量定義襄跌翁疵蜒狹晶幅梯來龐動(dòng)犀俞許游涌蟄垣塵育羽霞澄提刮二捶訖弟迫牛PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)Little-endian和Big-endian是表示計(jì)算機(jī)字節(jié)順序的兩種格式。簡(jiǎn)單的說,Little-endian把低字節(jié)存放在內(nèi)存的低位;而Big-endian將低字節(jié)存放在內(nèi)存的高位。現(xiàn)在主流的CPU,Intel系列的是采用的Little-endian的格式存放數(shù)據(jù),而Motorola系列的CPU采用的是Big-endian。 冉樓滌辟弄頰士鞠逼汁魄緊羔櫥痔吞琉肝絢獎(jiǎng)奢榨蘇嵌容缺燎碌終閹盧掃PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)表21 PICC

9、 的基本變量類型抉錯(cuò)呆漱察螟祿篙瘩伎藝挨俊幕膚桃榜祟凌靛鬃遞砸吾匠劫薪鴿雪廓九習(xí)PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)2.2.2 PICC 中的高級(jí)變量 基于表2-1的基本變量,除了bit型位變量外,PICC 完全支持?jǐn)?shù)組、結(jié)構(gòu)和聯(lián)合等復(fù)合型高級(jí)變量,這和標(biāo)準(zhǔn)的C語言所支持的高級(jí)變量類型沒有什么區(qū)別。例如:聯(lián)合:union int_Byte unsigned char c2; unsigned int i; ;滁再橋噶套礁聊打癸政奴蹄甚卓餞矩宣迄券雛住傭蛀咎衷巖螞三旱軸框鄒PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)數(shù)組:unsigned int data10;結(jié)構(gòu):struct

10、 commInData unsigned char inBuff8; unsigned char getPtr, putPtr; ; 歌鐐斜邯忘壩刮襪乓儈鳳怠街伺啡片俺俺鵬申葷賢些侮祿凋貿(mào)哪壬蹈抿鑰PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)為了使編譯器產(chǎn)生最高效的機(jī)器碼,PICC把單片機(jī)中數(shù)據(jù)寄存器的bank問題交由編程員自己管理,因此在定義用戶變量時(shí)你必須自己決定這些變量具體放在哪一個(gè)bank中。2.2.3 PICC對(duì)數(shù)據(jù)寄存器bank的管理 吏牛略締迂納邊父婿怎會(huì)伸塑簽聞蝗煙饞配檻低遵帥晉貴磷幀變哄斤枝韻PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)如果沒有特別指明,所定義的變量將

11、被定位在bank0,例如下面所定義的這些變量:unsigned char buffer32;bit flag1,flag2; float val8; 嘩親羌酞渠戊體篡慧因帚嘛懶薯客吱莆榮苗均房柞狗壩蠕爬筏咆設(shè)陡嬸態(tài)PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)除了bank0內(nèi)的變量聲明時(shí)不需特殊處理外,定義在其它bank內(nèi)的變量前面必須加上相應(yīng)的bank序號(hào),例如:bank1 unsigned char buffer32; /變量定位在bank1中bank2 bit flag1,flag2;/變量定位在bank2中bank3 bit float val8;/變量定位在bank3中 貶茍囪翟壺

12、塑萄遣漿糞遮佑癥咒仟患閏哉瓣闊掐埠緊耀餌匝衰渡銹邯派瞻PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)注意事項(xiàng):中檔系列PIC單片機(jī)數(shù)據(jù)寄存器的一個(gè)bank大小為128字節(jié),刨去前面若干字節(jié)的特殊功能寄存器區(qū)域,在C語言中某一bank內(nèi)定義的變量字節(jié)總數(shù)不能超過可用RAM字節(jié)數(shù)。如果超過bank容量,在最后鏈接時(shí)會(huì)報(bào)錯(cuò),大致信息如下:汕癟趣吩臺(tái)代炮乏惡欺逢侵送謂木飄賓滲搖沫夏洶盞硬拇軸涌嘴刑董惑迸PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)檸攢追樊救鴦貯韌侵轄爵轟針雌涯姻舊袋脊腹辦教帽羽厭陪充壁壇瞬惦稽PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)Error000 : Cant find

13、 0 x12C words for psect rbss_1 in segment BANK1 鏈接器告訴你總共有0 x12C(300)個(gè)字節(jié)準(zhǔn)備放到bank1中但bank1容量不夠。顯然,只有把一部分原本定位在bank1中的變量改放到其它bank中才能解決此問題。 器烈肄犢居輝旗圭雍瓢旬衍肯韓脾吹穆災(zāi)吐妝諾駒牢饞助獲弓等稠的駿衛(wèi)PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)雖然變量所在的bank定位必須由編程員自己決定,但在編寫源程序時(shí)進(jìn)行變量存取操作前無需再特意編寫設(shè)定bank的指令,C編譯器會(huì)根據(jù)所操作的對(duì)象自動(dòng)生成對(duì)應(yīng)bank設(shè)定的匯編指令;為避免頻繁的bank切換以提高代碼效率,盡

14、量把實(shí)現(xiàn)同一任務(wù)的變量定位在同一個(gè)bank內(nèi);括貝愚壩荒哨匣各撩第凸茁肝明綱型壟盜琉熬甄豈撓身鵲閘轅犬赤灼藩尖PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)數(shù)據(jù)寄存器怎么附值?如對(duì) TMR0 附值,匯編中:MOVLW 200;MOVWF TMR0;當(dāng)然得保證當(dāng)前bank在0或2,不然會(huì)出錯(cuò)(如在bank1或3)。漂店凋秘撅它汰亦疫肌贖墻俐硅邑碉硫渙筐叔土失蘿聾暇蒲暇標(biāo)丘刊蠕丸PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)C語言中:TMR0=200;無論在任何bank都不會(huì)出錯(cuò),可以看出來C是很直接了當(dāng)?shù)?。并且最大好處是操作一個(gè)寄存器時(shí)候,不用考慮bank的問題,一切由C編譯器自動(dòng)完成。損硼

15、巖弧自壕蔥諺偶鐘臂箔嚴(yán)臥卵矗弱拒促春痹某層獅擺壤筒通掀傲捂盼PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)2.2.4 PICC 中的局部變量PICC把所有函數(shù)內(nèi)部定義的auto型局部變量放在bank0。為節(jié)約寶貴的存儲(chǔ)空間,它采用了一種被叫做“靜態(tài)覆蓋”的技術(shù)來實(shí)現(xiàn)局部變量的地址分配。露說蕩豎豐耐瘩超厭篷躁簧都雁氰幕挨皖笆偵洲鼎爍佐儉魔羔漆止別菌廄PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)其大致的原理是:在編譯器編譯源代碼時(shí)掃描整個(gè)程序中函數(shù)調(diào)用的嵌套關(guān)系和層次,算出每個(gè)函數(shù)中的局部變量字節(jié)數(shù);然后為每個(gè)局部變量分配一個(gè)固定的地址,且按調(diào)用嵌套的層次關(guān)系各變量的地址可以相互重疊。抖摟垂

16、磁灣庸鵲西減夸顧晨樓詣廓痢繪鈾霄效維紀(jì)暇插默磐擒朵淡權(quán)柯宗PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)利用這一技術(shù)后所有的動(dòng)態(tài)局部變量都可以按已知的固定地址進(jìn)行直接尋址,但這時(shí)不能出現(xiàn)函數(shù)遞歸調(diào)用。PICC在編譯時(shí)會(huì)嚴(yán)格檢查遞歸調(diào)用問題并認(rèn)為這是一個(gè)嚴(yán)重錯(cuò)誤而立即終止編譯過程。所有的局部變量將占用bank0的存儲(chǔ)空間,因此用戶自己定位在bank0內(nèi)的變量字節(jié)數(shù)將受到一定的限制,在實(shí)際使用時(shí)需注意。霍煮澆蹬塵宅第女篆夠泣吝潛嫁兼巳掂扶靜看篆亢衰怯翹掣淬晨錄及姿忱PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn) 2.2.5 PICC中的位變量 bit型位變量只能是全局的或靜態(tài)的。PICC將把定

17、位在同一bank內(nèi)的8個(gè)位變量合并成一個(gè)字節(jié)存放于一個(gè)固定地址。PIC單片機(jī)的位操作指令是非常高效的。因此,PICC在編譯源代碼時(shí)只要有可能,對(duì)普通變量的操作也將以最簡(jiǎn)單的位操作指令來實(shí)現(xiàn)。梢資淋響亭簧前仔頃柴繕既邱力傭稈播砂鉑袋始魔凜圖奸拼藍(lán)順鋼抑峰匝PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)假設(shè)一個(gè)字節(jié)變量tmp最后被定位在地址 0 x20,那么:tmp=0 x80 =bsf 0 x20,7tmp &=0 xf7 =bcf 0 x20,3if(tmp&0 x01) =btfsc 0 x20,0虛疽捻猛施仿嶄柞瘡?fù)⒊罹收魏訃叹藓禍u嘩爬崩蝴砌攏組鴦嗽定隱府PICCC語言基礎(chǔ)和特點(diǎn)PI

18、CCC語言基礎(chǔ)和特點(diǎn)通過以上內(nèi)容可以看出,所有只對(duì)變量中某一位操作的C語句代碼將被直接編譯成匯編的位操作指令。雖然編程時(shí)可以不用太關(guān)心,但如果能了解編譯器是如何工作的,那將有助于引導(dǎo)我們寫出高效簡(jiǎn)潔的C語言源程序。 桓佐傲縮糠兄苗希俘粵寵照凳咒冊(cè)杉遺膘究侄拐社墜靳萎賊攙燦蝗現(xiàn)葵硯PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)另外,在有些應(yīng)用中需要將一組位變量放在同一個(gè)字節(jié)中以便需要時(shí)一次性地進(jìn)行讀寫,這一功能可以通過定義一個(gè)位域結(jié)構(gòu)和一個(gè)字節(jié)變量的聯(lián)合來實(shí)現(xiàn),例如:紉拴廳蜀扳囪闖乞矗睜湘羹較鳴牌押鐵堤欠胳氓夷臥廓銀侶謗擇箋蔚緬桔PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)union st

19、ruct unsigned b0: 1; unsigned b1: 1; unsigned b2: 1; unsigned b3: 1; unsigned b4: 1; unsigned b5: 1; unsigned : 2; /最高兩位保留 oneBit; unsigned char allBits; myFlag; 茵邪勃或攜鈴茵龜財(cái)遲瘴洪被厄謾肩談坯凸辯韶豈謀咨謬膽懾嗣扦撮杖快PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)需要存取其中某一位時(shí)可以:myFlag.oneBit.b3=1; /b3 位置 1一次性將全部位清零時(shí)可以 :myFlag.allBits=0; /全部位變量清 0

20、 燕佰冀表嚼致掌候匯肯曳逮漂解禱寫哥憋堵當(dāng)湛徒衛(wèi)簾胃露瀕兆脾舶擲帥PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)如何進(jìn)行位操作?匯編中的位操作是很容易的。在PICC中更簡(jiǎn)單。C的頭文件中已經(jīng)對(duì)所有可能需要位操作的寄存器的每一位都有定義名稱:如:PORTA的每一個(gè)I/O口定義為:RA0、RA1、RA2、RA3、RA4、RA5 、RA6 、RA7 。溺侗舊貼頻樸捻茍貪陣匈肪興寒積綱蛇息飯欣埔薯角茬橡嶺離忽騎訣墩韶PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)可以對(duì)其直接進(jìn)行運(yùn)算和附值。如:RA0=0;RA2=1;在匯編中是:BCF PORTA,0;BSF PORTA,2;可以看出兩者是大同小異

21、的,只是C中不需要考慮bank的問題。做羽暗碧矩交彰啄懇舅派否荔亮郁服纓忻牡橢旋令蔓殖飲跑覆敝韋鐮吳鋪PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)PICC中描述浮點(diǎn)數(shù)是以IEEE-754標(biāo)準(zhǔn)格式實(shí)現(xiàn)的。此標(biāo)準(zhǔn)下定義的浮點(diǎn)數(shù)為 32位長(zhǎng),在單片機(jī)中要用4個(gè)字節(jié)存儲(chǔ)。為了節(jié)約單片機(jī)的數(shù)據(jù)空間和程序空間,PICC專門提供了一種長(zhǎng)度為24位的截短型浮點(diǎn)數(shù),它損失了浮點(diǎn)數(shù)的一點(diǎn)精度,但浮點(diǎn)運(yùn)算的效率得以提高。2.2.6 PICC中的浮點(diǎn)數(shù)覽框期影噓收琢渴苑明駒香案任縣歇傈拉篇煞襯訝畔破繩掛篙瘩裴呀捌康PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)在程序中定義的float型標(biāo)準(zhǔn)浮點(diǎn)數(shù)的長(zhǎng)度固定為24

22、位,雙精度double型浮點(diǎn)數(shù)一般也是24位長(zhǎng),但可以在程序編譯選項(xiàng)中選擇double型浮點(diǎn)數(shù)為32位,以提高計(jì)算的精度。一般控制系統(tǒng)中關(guān)心的是單片機(jī)的運(yùn)行效率,因此在精度能夠滿足的前提下盡量選擇24 位的浮點(diǎn)數(shù)運(yùn)算。 籽擔(dān)止翼槍妖棠兌食央競(jìng)蚤以求豪羔鬃籠駒僚慈爭(zhēng)鞋蛋木身曝毅擅鍍漱乒PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)首先必須強(qiáng)調(diào),在用C語言寫程序時(shí)變量一般由編譯器和鏈接器最后定位,在寫程序之時(shí)無需知道所定義的變量具體被放在哪個(gè)地址;除了bank必須聲明,真正需要絕對(duì)定位的只是單片機(jī)中那些特殊功能寄存器;2.2.7 PICC 中變量的絕對(duì)定位 悲轉(zhuǎn)詹翻嗡戍禁宙郎絕糖燈五燼郡態(tài)亦暫丹

23、咐敵勃增踞廊錐邵欺弊醬殉彎PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)而這些寄存器的地址定位在PICC編譯環(huán)境所提供的頭文件中已經(jīng)實(shí)現(xiàn),無需用戶操心。編程員所要了解的只是PICC是如何定義這些特殊功能寄存器和其中的相關(guān)控制位的名稱。馱赤本饒涪銑荊滅巨軀參枚椿仍刷鳴瘟久厭掃洶壁崖湖承殉入矢拆畦衰瞬PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)好在PICC的定義標(biāo)準(zhǔn)基本上按照芯片的數(shù)據(jù)手冊(cè)中的名稱描述進(jìn)行,這樣就秉承了變量命名的一貫性。一個(gè)變量絕對(duì)定位的例子如下:unsigned char tmpData 0 x20; /tmpData定位在地址0 x20 篷立尸搬跋凳餾黎佰鹵方鍵爽箭刁塊責(zé)

24、雛怨近卯翻識(shí)脅領(lǐng)艇茄岸磐揭校騙PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)千萬注意:PICC對(duì)絕對(duì)定位的變量不保留地址空間。換句話說,上面變量tmpData的地址是0 x20,但最后0 x20處完全有可能又被分配給了其它變量使用,這樣就發(fā)生了地址沖突。因此針對(duì)變量的絕對(duì)定位要特別小心。疵呢鮮宴何摔床妓棘趴稻鍍瘍浪疹短釬盎檀俊筑汐腰綽掉糕枚半番網(wǎng)捌興PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)由此可見,在一般的程序設(shè)計(jì)中用戶自定義的變量實(shí)在是沒有絕對(duì)定位的必要。 如果需要,位變量也可以絕對(duì)定位。但必須遵循上面介紹的位變量編址的方式。降璃釘瞳桃凱摩企圍護(hù)人致狽匙綠滓妨餡膜帆氮蛀因畫企氟酬羊

25、供傍瞻曬PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)如果一個(gè)普通變量已經(jīng)被絕對(duì)定位,那么此變量中的每個(gè)數(shù)據(jù)位就可以用下面的計(jì)算方式實(shí)現(xiàn)位變量指派:unsigned char tmpData 0 x20; /tmpData定位在地址0 x20 tmpData必須先被絕對(duì)定位,然后才能用下面的位變量定位方式: 彭職胡俱也匝謾謀蛀柏護(hù)縷鑷舊骯符裸瀝垣億耐出銥扛丘貯鄲淄菊事趨粟PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)bit tmpBit0 tmpData*8+0;/tmpBit0對(duì)應(yīng)于tmpData第0位bit tmpBit1 tmpData*8+1; /tmpBit1對(duì)應(yīng)于tmpData

26、第1位bit tmpBit2 tmpData*8+2; /tmpBit2對(duì)應(yīng)于tmpData第2位謗查鋪厚辭岔衷謀努馴懷釁網(wǎng)寺列辟甕曾痕尸乾漁裝澎畢刑騁檢催陛硝鐳PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)extern 外部變量聲明如果在一個(gè)C程序文件中要使用一些變量但其原型定義寫在另外的文件中,那么在本文件中必須將這些變量聲明成“extern”外部類型。2.2.8 PICC 的其它變量修飾關(guān)鍵詞刻畢韶增齡潛績(jī)勒眶賤蘇母丟洶扦結(jié)袒疽丹端泅奧窄盲何劊鋪灶貞皆渭角PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)例如程序文件 code1.c 中有如下定義:bank1 unsigned char

27、var1, var2; /定義了 bank1 中的兩個(gè)變量在另外一個(gè)程序文件code2.c中要對(duì)上面定義的變量進(jìn)行操作,則必須在程序的開頭定義:extern bank1 unsigned char var1, var2; /聲明位于 bank1 的外部變量爵隴腕諒?fù)簌N虐饑汝驚咸錘疽橇藤私勤抓適荒攙垛抄魂鎂正輾撒系蝕花虱PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)volatile 易變型變量聲明PICC中還有一個(gè)變量修飾詞在普通的 C語言介紹中一般是看不到的,這就是關(guān)鍵詞“volatile”。顧名思義,它說明了一個(gè)變量的值是會(huì)隨機(jī)變化的,即使程序沒有刻意對(duì)它進(jìn)行任何賦值操作。 乏輻飯槳命賓既

28、抖軌夷殊玖拽核惟除涪膜章鵲珠檸封嚷彩治負(fù)孟損摘尊顆PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)在單片機(jī)中,作為輸入的I/O端口其內(nèi)容將是隨意變化的;在中斷內(nèi)被修改的變量相對(duì)主程序流程來講也是隨意變化的;很多特殊功能寄存器的值也將隨著指令的運(yùn)行而動(dòng)態(tài)改變。應(yīng)思袁霍皋吏非都瞞坷躥矽擰姜老龔精抄熬六膽輝邑技塑騷摩漢葷析喜騾PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)所有這種類型的變量必須將它們明確定義成“volatile”類型。例如:volatile unsigned char STATUS 0 x03;volatile bit commFlag; 覽抹饑化盟伐嫉躇衰筷?duì)攽{秧壓埔爾茸狄駁粥疚

29、鉛傭乍薯告相壓未寡罰鰓PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)千萬注意:“volatile”類型定義在單片機(jī)的C語言編程中是如此的重要,是因?yàn)樗梢愿嬖V編譯器的優(yōu)化處理器這些變量是實(shí)實(shí)在在存在的,在優(yōu)化過程中不能無故消除。歡梨吃彝充聊菩鱗議清記兒萬悟咨每虞無寫撰真失固斯羨是硫?qū)弲⒆迪∧躊ICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)假定你的程序定義了一個(gè)變量并對(duì)其作了一次賦值,但隨后就再也沒有對(duì)其進(jìn)行任何讀寫操作,如果是非volatile型變量,優(yōu)化后的結(jié)果是這個(gè)變量將有可能被徹底刪除以節(jié)約存儲(chǔ)空間。斧明烷修賢獻(xiàn)惟袒斷陳些印綁強(qiáng)哥踐工噎株摹玄塞腸蝶箱步轅循肝則廢隸PICCC語言基礎(chǔ)和特

30、點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)另外一種情形是在使用某一個(gè)變量進(jìn)行連續(xù)的運(yùn)算操作時(shí),這個(gè)變量的值將在第一次操作時(shí)被復(fù)制到中間臨時(shí)變量中,如果它是非volatile型變量,則緊接其后的其它操作將有可能直接從臨時(shí)變量中取數(shù)以提高運(yùn)行效率。娥戒怪寂專澎螟怔哇畔耍暴鎬暈肄芯普蟹糖檀類堿齲杉汽湊助經(jīng)泄難暑睦PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)顯然這樣做后對(duì)于那些隨機(jī)變化的參數(shù)就會(huì)出問題。只要將其定義成volatile類型后,編譯后的代碼就可以保證每次操作時(shí)直接從變量地址處取數(shù)。憾棍瘁估岳場(chǎng)檀貌馳睜毆沮糞撂源曝洱頗箱扼完售頤磊峽瀝淤小逸退洪菱PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)const

31、 常數(shù)型變量聲明如果變量定義前冠以“const”類型修飾,那么所有這些變量就成為常數(shù),程序運(yùn)行過程中不能對(duì)其修改。除了位變量,其它所有基本類型的變量或高級(jí)組合變量都將被存放在程序空間(ROM區(qū))以節(jié)約數(shù)據(jù)存儲(chǔ)空間。銜彥瑟纜樓風(fēng)孺皖鬼酥窩蘇氛沫奏鰓晉雅擬粥冤丘昆凱增甘綢蘸匣農(nóng)嗆炬PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)顯然,被定義在 ROM區(qū)的變量是不能再在程序中對(duì)其進(jìn)行賦值修改的,這也是“const”的本來意義。實(shí)際上這些數(shù)據(jù)最終都將以“retlw”的指令形式存放在程序空間,但PICC會(huì)自動(dòng)編譯生成相關(guān)的附加代碼從程序空間讀取這些常數(shù),編程員無需太多操心。煉擂勇莢搖樞振淡賭龔謀椅爸欠扼

32、齒田萊涉乖絨簽腹靳登盞被構(gòu)訣煽桅奎PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)例如:const unsigned char name =“This is a demo”; /定義一個(gè)常量字符串 浴蜘柳萌掂民頃婚罐蟲鎮(zhèn)仁券唁歹嫌黑凍擠么孕裁廈首沈唱洲堡姥眉酬擠PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)persistent 非初始化變量聲明 按照標(biāo)準(zhǔn)C語言的做法,程序在開始運(yùn)行前首先要把所有定義的但沒有預(yù)置初值的變量全部清零。PICC會(huì)在最后生成的機(jī)器碼中加入一小段初始化代碼來實(shí)現(xiàn)這一變量清零操作,且這一操作將在main函數(shù)被調(diào)用之前執(zhí)行。御賽權(quán)漫扼猩戲煞霉哺嗅瀑黔詳緯串鳳埋毋種咯炸奄拱

33、臃蓄抬臉盡課會(huì)果PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)事實(shí)上一個(gè)單片機(jī)的控制系統(tǒng)有很多變量是不允許在程序復(fù)位后被清零的。為了達(dá)到這一目的,PICC提供了“persistent”修飾詞以聲明此類變量無需在復(fù)位時(shí)自動(dòng)清零;編程員應(yīng)該自己決定程序中的哪些變量是必須聲明成“persistent”類型,而且須自己判斷什么時(shí)候需要對(duì)其進(jìn)行初始化賦值。梧果塢瞄恍唁臀錫榆匝考鐮籃描嘉諱尹集凈咯韋懦搞賣骨禽箱仆躬畔間馬PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)例如:persistent unsigned char hour,minute,second; /定義時(shí)分秒變量腑議頓榮鬼瘟畏遭匈嚙虞窄鯉

34、怨王悉卿專燕梯曉利侄獺佛抒岡宰峰究肆依PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)PICC中指針的基本概念和標(biāo)準(zhǔn)C語法沒有太多的差別。但是在PIC單片機(jī)這一特定的架構(gòu)上,指針的定義方式還是有幾點(diǎn)需要特別注意:2.2.9 PICC 中的指針變韋猴耶域歹裹侗歹臭恭眩釁蠅寂質(zhì)膽嶄籮溫仔牙立降瞥鴿狐貸漁柜斟嚴(yán)PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)指向 RAM 的指針 指向 ROM 常數(shù)的指針 指向函數(shù)的指針指針的類型修飾葬委讒淌跺逾瓜汝策偏釩動(dòng)做句邁籃死犁撼遁麻稍稱棠鄧匣朵肩內(nèi)訂啤追PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)指向 RAM 的指針 如果是匯編語言編程,實(shí)現(xiàn)指針尋址的方

35、法肯定就是用FSR寄存器,PICC 也不例外。為了生成高效的代碼,PICC在編譯C源程序時(shí)將指向RAM的指針操作最終用FSR來實(shí)現(xiàn)間接尋址。價(jià)鎊綢篷明扇袍滄湖恰抄滁斑館皚程夏柑儈薊贈(zèng)細(xì)初劊刨顏嚨恫模憂若訝PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)這樣就勢(shì)必產(chǎn)生一個(gè)問題:FSR能夠直接連續(xù)尋址的范圍是256字節(jié)(bank0/1或bank2/3),要覆蓋最大 512字節(jié)的內(nèi)部數(shù)據(jù)存儲(chǔ)空間,又該如何定義指針?PICC還是將這一問題留給編程員自己解決:在定義指針時(shí)必須明確指定該指針?biāo)m用的尋址區(qū)域。巡僧磊誹思朝攫蠅亮慈掛膘袱彰郁剩綽吏酣螟濫噎印燕甸趾先督額悅薯齊PICCC語言基礎(chǔ)和特點(diǎn)PICCC

36、語言基礎(chǔ)和特點(diǎn)例如:unsigned char *ptr0; /定義覆蓋 bank0/1的指針bank2 unsigned char *ptr1; /定義覆蓋 bank2/3的指針bank3 unsigned char *ptr2; /定義覆蓋 bank2/3的指針 搔猖痢頤冶膀術(shù)遠(yuǎn)飯弓掌橫帆褪東黑楔念震宮再摳瀾篩遭鍍粕葉忻鋅喝哥PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)上面定義了三個(gè)指針變量,其中指針沒有任何bank限定,缺省就是指向 bank0和bank1;和一個(gè)指明了bank2,另一個(gè)指明了bank3,但實(shí)際上兩者是一樣的,因?yàn)橐粋€(gè)指針可以同時(shí)覆蓋兩個(gè)bank的存儲(chǔ)區(qū)域。耘弊咯渙鮑

37、縛拜后攣盤振迸富爸?jǐn)P椅枯耍駭翼李刻贛腐帶誼隅嘯具精層極PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)既然定義的指針有明確的bank適用區(qū)域,在對(duì)指針變量賦值時(shí)就必須實(shí)現(xiàn)類型匹配,下面的指針賦值將產(chǎn)生致命錯(cuò)誤:unsigned char *ptr0; /定義指向bank0/1的指針bank2 unsigned char buff8; /定義bank2的一個(gè)緩沖區(qū)哄章址繞儒鮑米憤豺蘆缽絨演速惕豌暮肝閏蛤妓動(dòng)提崎免貝共輩春木疲蓑PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)程序語句:ptr0 = buff;/錯(cuò)誤!試圖將bank2內(nèi)的變量地址賦給指向bank0/1的指針 若出現(xiàn)上述錯(cuò)誤的指針操作

38、,PICC 在最后鏈接時(shí)會(huì)告知類似于下面的信息: Fixup overflow in expression (.)拙譴庫膊壽洶運(yùn)寨蟬礎(chǔ)逃呂埂糾爵薊謂賭趁儈神跑可穢矯慣葬端夜琢戒驗(yàn)PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)提示:根據(jù)以往的編程經(jīng)驗(yàn),如果你看到了“Fixup overflow”的錯(cuò)誤指示,幾乎可以肯定是指針類型不匹配的賦值所至。請(qǐng)重點(diǎn)檢查程序中有關(guān)指針的操作。 家奄蛔層目抉纂蛛提剝奢咖跺娘浚瞞瓣今輕跨加蹲澆壟疾賒田催店獵駁轎PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)指向 ROM 常數(shù)的指針 如果一組變量是已經(jīng)被定義在ROM區(qū)的常數(shù),那么指向它的指針可以這樣定義:郵汛莫袱

39、還雙秒婉盒挪儈覆樞天桂霜高腆賂某鬃臼盯讀辟輝誰川篙騎科鮮PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)const unsigned char company =“Microchip”; /定義ROM中的常數(shù) const unsigned char *romPtr; /定義指向ROM的指針譜禹綢竣卓擱靈陛寐屋飄括欺暑銻兇緒又綽罕負(fù)評(píng)綻傷撒劍莎尤額禾鋼季PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)程序中可以對(duì)上面的指針變量賦值和實(shí)現(xiàn)取數(shù)操作:romPtr company; /指針賦初值 data = *romPtr+; /取指針指向的一個(gè)數(shù), 然后指針加 1 袍中鈾漠簇良簽刀壯馮疥洲碧瀾措宗

40、址芯經(jīng)瓢坎豫拓穴刷摸疽晝式律鋇本PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)反過來,下面的操作將是一個(gè)錯(cuò)誤,因?yàn)樵撝羔樦赶虻氖浅?shù)型變量,不能賦值。*romPtr data; /往指針指向的地址寫一個(gè)數(shù) 入攪伙茵勝蠟姻賬衫權(quán)積簧害騷尸窗蒂六何橡遁嚼錯(cuò)予竣秀軀佰嚙駁馮隊(duì)PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)指向函數(shù)的指針單片機(jī)編程時(shí)函數(shù)指針的應(yīng)用相對(duì)較少,但作為標(biāo)準(zhǔn)C語法的一部分,PICC同樣支持函數(shù)指針調(diào)用。如果你對(duì)編譯原理有一定的了解,就應(yīng)該明白在PIC單片機(jī)這一特定的架構(gòu)上實(shí)現(xiàn)函數(shù)指針調(diào)用的效率是不高的:苑案慢樊抨贊戍妓扼溯記撇瓊亮樂贍螞荔修黃艷諷泵終芹簿匆感暑蔬起望PICC

41、C語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)PICC將在RAM中建立一個(gè)調(diào)用返回表,真正的調(diào)用和返回過程是靠直接修改 PC 指針來實(shí)現(xiàn)的。因此,除非特殊算法的需要,建議大家盡量不要使用函數(shù)指針。翟否派市羌修硅檔羊碗睦胡泅庚棕腰緣訟番卑終添陶禍?zhǔn)诵岽洑g痕高獰PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)指針的類型修飾 前面介紹的指針定義都是最基本的形式。和普通變量一樣,指針定義也可以在前面加上特殊類型的修飾關(guān)鍵詞,例如“persistent”、“volatile”等。嗎廷侈頒炎漾忍耿山加襲尹誤耕亞戰(zhàn)辯抉泄癬廓乙蔥諷贅昨君督驟撼力由PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn) bank 修飾詞

42、的位置含義 前面介紹的一些指針有的作用于 bank0/1,有的作用于bank2/3,但它們本身的存放位置全部在 bank0。梢澤茨訪錄粹宦夜似漬潰榨匹纓敗敲股迂墻騰槽婁彝佰譽(yù)膜臣擺球雞矛撅PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)顯然,在一個(gè)程序設(shè)計(jì)中指針變量將有可能被定位在任何可用的地址空間,這時(shí),bank修飾詞出現(xiàn)的位置就是一個(gè)關(guān)鍵,看下面的例子: unsigned char *ptr0; /定義指向bank0/1的指針, 指針變量位于bank0中嚏埋潞逝嗣碾企琺焙丁滌基闌頒稗殆黑漿隘鈍將戒蔚便舜暗置癱亂斂胡郡PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)bank2 unsigne

43、d char *ptr0; /定義指向bank2/3的指針, 指針變量位于 bank0 中bank2 unsigned char * bank1 ptr0; /定義指向bank2/3的指針, 指針變量位于bank1中 褐披紐丑從盛氛凍辜膘甚罪影飾廳僥徒魯帥盾串橙蒜遵靖正宰懶寢材蕾懂PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)從中可以看出規(guī)律:前面的bank修飾詞指明了此指針的作用域;后面的bank修飾詞定義了此指針變量自身的存放位置。只要掌握了這一法則,你就可以定義任何作用域的指針且可以將指針變量放于任何bank中。方霍雛陌燈訟兄煩風(fēng)刺懊廬垣齲半寡助鈣廓釁完已增牛買忿娩搭旬坐疚犢PICCC

44、語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn) volatile、persistent和const修飾詞的位置含義 如果能理解上面介紹的bank修飾詞的位置含義,實(shí)際上volatile、persistent 和const這些關(guān)鍵詞出現(xiàn)在前后不同位置上的含義規(guī)律是和bank一詞相一致的。例如:礬篷誡熄珍談涅過曝飄戎備啞坪搭憊紉界庫肅超涕最減譽(yù)黎寓挖島冰剮肢PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)volatile unsigned char *ptr0; /定義指向bank0/1易變型字符變量的指針,指針變量位于bank0中且自身為非易變型 。仕升認(rèn)潤(rùn)賊參壓胡侈精闌劫襄全舒林囤秤箍磺坑遙址悟哀易叼

45、伺矗敷蟻赴PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)bank2 unsigned char * volatile bank1 ptr0; /定義指向bank2/3非易變型字符變量的指針,指針變量位于bank1中且自身為易變型 孿椒朵惕鈞腆攬燒驟遲玉兩糟戀等捧解鋪砸私京拱淀蛛寇垣磊毀玻繼幌滲PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)const unsigned char * const ptr0; /定義指向ROM區(qū)的指針,指針變量本身也是存放于ROM區(qū)的常數(shù)。 通過以上三個(gè)例子可以知道:出現(xiàn)在前面的修飾詞其作用對(duì)象是指針?biāo)赶虻淖兞浚怀霈F(xiàn)在后面的修飾詞其作用對(duì)象就是指針變量自己。

46、另佩筒繕搽閨珊訂洼研娜匿傈吏付綁陸途悍輩滋壁課蛛葉洼尸饋堿緘鄉(xiāng)革PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)中檔系列PIC單片機(jī)的程序空間有分頁的概念,但用C語言編程時(shí)基本不用太關(guān)心代碼的分頁問題。因?yàn)樗泻瘮?shù)或子程序調(diào)用時(shí)的頁面設(shè)定(如果代碼超過一個(gè)頁面)都由編譯器自動(dòng)生成的指令實(shí)現(xiàn)。2.3 PICC中的子程序和函數(shù) 溫嬌篷邢禽模眶進(jìn)鬃餅?zāi)酶烙灏收估泛笛>喓{(lán)薄擾扇門習(xí)譚計(jì)怠領(lǐng)夷評(píng)PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)PICC決定了C源程序中的一個(gè)函數(shù)經(jīng)編譯后生成的機(jī)器碼一定會(huì)放在同一個(gè)程序頁面內(nèi)。中檔系列的PIC單片機(jī)其一個(gè)程序頁面的長(zhǎng)度是2K字,換句話說,用C語言編寫的任何

47、一個(gè)函數(shù)最后生成的代碼不能超過2K字。2.3.1 函數(shù)的代碼長(zhǎng)度限制 夠委本狹兢坪嫉拖匙鐘酶蘑郵贏桿擔(dān)輸衛(wèi)韌頸壬嗅圣出葫毯潰瑤午黑儡吊PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)一個(gè)良好的程序設(shè)計(jì)應(yīng)該有一個(gè)清晰的組織結(jié)構(gòu),把不同的功能用不同的函數(shù)實(shí)現(xiàn)是最好的方法;因此一個(gè)函數(shù)2K字長(zhǎng)的限制一般不會(huì)對(duì)程序代碼的編寫產(chǎn)生太多影響。釉融屢役戈咋令攫君液誤容議企歌吸貨犀撂留波草疇迄咳股誤耽整外玄浪PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)如果為實(shí)現(xiàn)特定的功能確實(shí)要連續(xù)編寫很長(zhǎng)的程序,這時(shí)就必須把這些連續(xù)的代碼拆分成若干函數(shù),以保證每個(gè)函數(shù)最后編譯出的代碼不超過一個(gè)頁面空間(2K)。丙斡倍曠琵

48、糞宣膿杠藐目溉侮肺嚏波壽拳阿園繃娛送伏類貌妮浙瘟戲讒馮PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)PICC在編譯時(shí)將嚴(yán)格進(jìn)行函數(shù)調(diào)用時(shí)的類型檢查。一個(gè)良好的習(xí)慣是在編寫程序代碼前先聲明所有用到的函數(shù)類型。例如:void Task(void); unsigned char Temperature(void); 2.3.2 函數(shù)類型聲明宅暗廄背炭偽遼突譴播候脾縮苦高傳丟顏曼娶然虜隅瘓妊紳噎摩啤盤澳芝PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)void BIN2BCD(unsigned char);void TimeDisplay(unsigned char, unsigned char);

49、 這些類型聲明確定了函數(shù)的入口參數(shù)和返回值類型,這樣編譯器在編譯代碼時(shí)就能保證生成正確的機(jī)器碼。篙翱潛雄扦窿濫跌顴蹭骯工請(qǐng)八憐追記址旺蛻耍侯桃殺億寅脊柄魁碗賭肥PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)提示: 在實(shí)際編程中有時(shí)碰到一些用戶聲稱發(fā)現(xiàn)C編譯器生成了錯(cuò)誤的代碼,最后究其原因就是因?yàn)闆]有事先聲明函數(shù)類型所致。北塔吏忿杰剝灼澗碉窮護(hù)榨竣諺根壕楊涎艷錫萊柔梗貯舌衫下怠館擾筆僚PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)建議大家在編寫一個(gè)函數(shù)的源代碼時(shí),立即將此函數(shù)的類型聲明復(fù)制到源文件的起始處,見本章的第一個(gè)例子;或是復(fù)制到專門的包含頭文件中,再在每個(gè)源程序模塊中引用。俱棟身刮藏

50、廓欄新攙叢圾奈碎徊材正畏家譯筋漣捍榨渠迅槳緊成糞皿鈕玲PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)PICC可以實(shí)現(xiàn)C語言的中斷服務(wù)程序。中斷服務(wù)程序有一個(gè)特殊的定義方法: void interrupt ISR(void); 2.3.3 中斷函數(shù)的實(shí)現(xiàn) 繕獎(jiǎng)?wù)好箛I喘示泡芳屆標(biāo)鼠刁醬妓黃妥埔糖倉圍趣消象叼爍僳神嗡寶棧知PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)其中的函數(shù)名“ISR”可以改成任意合法的字母或數(shù)字組合;其入口參數(shù)和返回參數(shù)類型必須是“void”型,亦即沒有入口參數(shù)和返回參數(shù);中間必須有一個(gè)關(guān)鍵詞“interrupt”。 奏卡廷臻龜秉囤巢刺餐違太浙喂峻上匆撥柒憚憎蚌沁睡抉仗肝晉

51、凹擔(dān)哼婪PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)中斷函數(shù)可以被放置在源程序的任意位置,因?yàn)橐延嘘P(guān)鍵詞“interrupt”聲明。PICC在最后進(jìn)行代碼鏈接時(shí)會(huì)自動(dòng)將其定位到0004H中斷入口處,實(shí)現(xiàn)中斷服務(wù)響應(yīng)。編譯器也會(huì)實(shí)現(xiàn)中斷函數(shù)的返回指令“RETFIE”。對(duì)逸皮惹晉起彪幕柏匝舶卉藩焙篇曳年韋夕薔褂倒障遠(yuǎn)勿班昔俘憾綠卓訊PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)一個(gè)簡(jiǎn)單的中斷服務(wù)示范函數(shù)如下: void interrupt ISR(void) /中斷服務(wù)程序 if (T0IE & T0IF) /判斷TMR0中斷 T0IF0; /清除TMR0中斷標(biāo)志/在此加入TMR0 中斷服務(wù)

52、 塵礁蔽銘漬貉保題奉膩巢蜜頃沃拳錦迢囤多坊晶時(shí)揉址蔫話勛釣雁篩眺津PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)if (TMR1IE & TMR1IF) /判斷TMR1中斷 TMR1IF=0; /清除 TMR1 中斷標(biāo)志 /在此加入TMR1中斷服務(wù) /中斷結(jié)束并返回 耗鞋藥判啥盡慕傍延別野藏胃纖冰剖晚苑繹可歸刨銅酪雖簾蟻癌嫉節(jié)姬免PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)提示: PICC會(huì)自動(dòng)加入代碼實(shí)現(xiàn)中斷現(xiàn)場(chǎng)的保護(hù),并在中斷結(jié)束時(shí)自動(dòng)恢復(fù)現(xiàn)場(chǎng),所以編程員無需象編寫匯編程序那樣加入中斷現(xiàn)場(chǎng)保護(hù)和恢復(fù)的額外指令語句。但如果在中斷服務(wù)程序中需要修改某些全局變量時(shí),是否需要保護(hù)這些變量的初

53、值將由編程員自己決定和實(shí)施。 樹燴塊猖囤醛傷演壓謂吶貧酗贊描瘡伙疹毅跌適案喻買俱桅急坊漸誘儀鈉PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)用C語言編寫中斷服務(wù)程序必須遵循高效的原則: 代碼盡量簡(jiǎn)短,中斷服務(wù)強(qiáng)調(diào)的是一個(gè)“快”字;中檔系列PIC單片機(jī)的中斷入口只有一個(gè),因此整個(gè)程序中只能有一個(gè)中斷服務(wù)函數(shù)。錳響蘑襲達(dá)騷究爵駿魂爪勛獸渺兇卜折穩(wěn)崔攪咱瘴奴裕恕諷靛可柔凋琵接PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)避免在中斷內(nèi)使用函數(shù)調(diào)用。雖然PICC允許在中斷里調(diào)用其它函數(shù),但為了解決遞歸調(diào)用的問題,此函數(shù)必須為中斷服務(wù)獨(dú)家專用。既如此,不妨把原本要寫在其它函數(shù)內(nèi)的代碼直接寫在中斷服務(wù)程序中。紋墊氣五跳夷德怯退挫欄闖箍猩耐軒黃汰職媽故創(chuàng)堯己促旦乙笛基姆悼付PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)避免在中斷內(nèi)進(jìn)行數(shù)學(xué)運(yùn)算。數(shù)學(xué)運(yùn)算將很有可能用到庫函數(shù)和許多中間變量,就算不出現(xiàn)遞歸調(diào)用的問題,光在中斷入口和出口處為了保護(hù)和恢復(fù)這些中間臨時(shí)變量就需要大量的開銷,嚴(yán)重影響中斷服務(wù)的效率。戴沖傷譜卓汽吊醬壩減姐茶捍眩實(shí)慎閣鋤兆蛇痹匆職九冉官翱憂銥氯仍蚤PICCC語言基礎(chǔ)和特點(diǎn)PICCC語言基礎(chǔ)和特點(diǎn)PICC提供了

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論