




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.1嵌入式C語(yǔ)言的預(yù)處理偽指令5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型5.3程序的控制結(jié)構(gòu)5.4函數(shù)5.5數(shù)組5.6指針5.7構(gòu)造數(shù)據(jù)類型5.8匯編語(yǔ)言與C/C++的混合編程5.9嵌入式Linux下C語(yǔ)言編程——文件的操作第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.1嵌入式C語(yǔ)言的預(yù)處理偽指令1.文件包含偽指令文件包含偽指令可將頭文件包含到程序中,頭文件中定義的內(nèi)容符號(hào)常量,復(fù)合變量原型、用戶定義的變量原型和函數(shù)的原型說(shuō)明等。編譯器編譯預(yù)處理時(shí)用文件包含的正文件內(nèi)容替換到實(shí)際程序中。(1)文件包含偽指令的格式#include<頭文件名.h>;標(biāo)準(zhǔn)頭文件#include“頭文件名.h”
;自定義頭文件#include宏標(biāo)識(shí)符
第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.1嵌入式C語(yǔ)言的預(yù)處理偽指令(2)包含文件偽指令的說(shuō)明●常在頭文件名后用.h作為擴(kuò)展名,可帶或不帶路經(jīng)?!耦^文件可分為標(biāo)準(zhǔn)頭文件和自定義頭文件?!窦饫ㄌ?hào)內(nèi)的頭文件為標(biāo)準(zhǔn)頭文件,由開(kāi)發(fā)環(huán)境或系統(tǒng)提供?!耠p引號(hào)內(nèi)的頭文件為用戶自定義頭文件。搜索時(shí),首先在當(dāng)前目錄中搜索,其次按環(huán)境變量include指定的目錄順序搜索?!袼阉鞯筋^文件后,就將該偽指令直接用頭文件內(nèi)容替換。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.1嵌入式C語(yǔ)言的預(yù)處理偽指令例5.1標(biāo)準(zhǔn)頭文件定義#include<string.h>#include<stdio.h>string.h和stdio.h是標(biāo)準(zhǔn)頭文件,按環(huán)境變量include指定的目錄順序搜索string.h和stdio.h。例5.2用戶自定義頭文件定義
#include“s3c2410-adc.h”s3c2410-adc.h頭文件是用戶自定義有關(guān)三星s3c2410的ARM處理器的A/D轉(zhuǎn)換器各寄存器。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.1嵌入式C語(yǔ)言的預(yù)處理偽指令2.宏定義偽指令宏定義偽指令分為:簡(jiǎn)單宏、參數(shù)宏、條件宏、預(yù)定義宏及宏釋放。(1)簡(jiǎn)單宏格式如下:#define宏標(biāo)識(shí)符宏體●宏體是由單詞序列組成。宏體超長(zhǎng)時(shí),允許使用續(xù)行符“\”進(jìn)行續(xù)行,續(xù)行符和其后的換行符\n都不會(huì)進(jìn)入宏體。●在定義宏時(shí),應(yīng)盡量避免使用C語(yǔ)言的關(guān)鍵字和預(yù)處理器的預(yù)定義宏,以免引起災(zāi)難性的后果?!裨谠次募?,用預(yù)處理器偽指令定義過(guò)宏標(biāo)識(shí)符之后,就可用宏標(biāo)識(shí)編寫(xiě)程序。當(dāng)源文件被預(yù)處理器處理時(shí),每遇到該宏標(biāo)識(shí)符,預(yù)處理器便將宏展為宏體。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.1嵌入式C語(yǔ)言的預(yù)處理偽指令(2)參數(shù)宏格式如下:#define宏標(biāo)識(shí)符(形式參數(shù)表)宏體形式參數(shù)表為逗號(hào)分割的形式參數(shù)?!窈牦w是由單詞序列組成。宏體超長(zhǎng)時(shí),允許使用續(xù)行符“\”進(jìn)行續(xù)行,續(xù)行符和其后的換行符\n都不會(huì)進(jìn)入宏體?!袷褂脜?shù)宏時(shí),形式參數(shù)表應(yīng)換為同樣個(gè)數(shù)的實(shí)參數(shù)表,這一點(diǎn)類似于函數(shù)的調(diào)用。參數(shù)宏與函數(shù)的區(qū)別在于參數(shù)宏的形參數(shù)表中沒(méi)有類型說(shuō)明符?!耦A(yù)處理器在處理參數(shù)宏時(shí)使用2遍宏展開(kāi)。第1遍展開(kāi)宏體,第2遍對(duì)展開(kāi)后的宏體用實(shí)參數(shù)替換形式參數(shù)。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)例5.3在Linux系統(tǒng)的/include/asm-arm/arch-s3c2410/S3C2410.h頭文件中定義了各NandFlash控制寄存器,其源代碼如下:#definebNAND_CTL(Nb)__REG(0x4e000000+(Nb))#defineNFCONFbNAND_CTL(0x00)#defineNFCMDbNAND_CTL(0x04)#defineNFADDRbNAND_CTL(0x08)#defineNFDATAbNAND_CTL(0x0c)#defineNFSTATbNAND_CTL(0x10)#defineNFECCbNAND_CTL(0x14)5.1嵌入式C語(yǔ)言的預(yù)處理偽指令第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.1嵌入式C語(yǔ)言的預(yù)處理偽指令例5.4在Linux下ARMS3C2410X芯片的A/D轉(zhuǎn)換的驅(qū)動(dòng)程序的頭文件s3c2410-adc.h中定義了下面三個(gè)宏。#defineADC_WRITE(ch,prescale)((ch)<<16|(prescale))/*ADC通道號(hào)與預(yù)標(biāo)值合成一個(gè)字*/#defineADC_WRITE_GETCH(data)(((data)>>16)&0x7)
/*獲得ADC通道號(hào)*/#defineADC_WRITE_GETPRE(data)((data)&0xff)
/*獲得ADC的預(yù)定標(biāo)值*/第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)
例5.5在Linux下ARMS3C2410X芯片的A/D轉(zhuǎn)換的驅(qū)動(dòng)程序?qū)崿F(xiàn)代碼s3c2410-adc.c中的系統(tǒng)資源和宏定義。#defineDEVICE_NAME"s3c2410-adc“/*定義ADC設(shè)備的名字*/#defineADCRAW_MINOR1staticintadcMajor=0;/*定義ADC設(shè)備的主設(shè)備號(hào)*/typedefstruct{structsemaphorelock;/*內(nèi)核信號(hào)量,當(dāng)多個(gè)用戶程序同時(shí)訪問(wèn)一個(gè)ADC控制器時(shí),用lock進(jìn)行同步*/wait_queue_head_twait;/*等待隊(duì)列*/intchannel;/*ADC通道號(hào)*/intprescale;/*預(yù)定標(biāo)值*/}ADC_DEV;5.1嵌入式C語(yǔ)言的預(yù)處理偽指令第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)staticADC_DEVadcdev;#defineSTART_ADC_AIN(ch,prescale)\do{ADCCON=PRESCALE_EN|PRSCVL(prescale)|ADC_INPUT((ch));\ADCCON|=ADC_START;\}while(0)/*設(shè)置S3C2410X的ADC的通道為ch、預(yù)定標(biāo)值為prescale*///PRESCALE_EN
宏對(duì)應(yīng)ARMS3C2410X芯片的A/D轉(zhuǎn)換控制寄存器的第14位PRSCEMN,即A/D轉(zhuǎn)換器預(yù)標(biāo)器使能;//PRSCVL宏對(duì)應(yīng)ARMS3C2410X芯片的A/D轉(zhuǎn)換控制寄存器的第6位,設(shè)置預(yù)定標(biāo)值;//ADC_INPUT宏對(duì)應(yīng)ARMS3C2410X芯片的A/D轉(zhuǎn)換控制寄存器的第3~5位,選擇通道號(hào);//ADCCON|=ADC_START;ADCCON0為置1,準(zhǔn)備采集數(shù)據(jù)5.1嵌入式C語(yǔ)言的預(yù)處理偽指令第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.1嵌入式C語(yǔ)言的預(yù)處理偽指令(3)條件宏定義格式如下:格式1:#ifdef宏標(biāo)識(shí)符#undef宏標(biāo)識(shí)符#define宏標(biāo)識(shí)符宏體#else#define宏標(biāo)識(shí)符宏體#endif第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)格式2:#ifndef宏標(biāo)識(shí)符
#define宏標(biāo)識(shí)符宏體#else#undef宏標(biāo)識(shí)符#define宏標(biāo)識(shí)符宏體#endif其中:
格式1是測(cè)試存在,格式2是測(cè)試不存在。
else可有,也可沒(méi)有。5.1嵌入式C語(yǔ)言的預(yù)處理偽指令第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.1嵌入式C語(yǔ)言的預(yù)處理偽指令(4)宏釋放用于釋放原先定義的宏標(biāo)識(shí)符。經(jīng)釋放后的宏標(biāo)識(shí)符可再次用于定義其他宏體。格式如下:#undef宏標(biāo)識(shí)符例5.6#defineSIZE512…buf=SIZE*blks/*宏擴(kuò)展為buf=512*blks;*/…undefSIZE#defineSIZE128…buf=SIZE*blks/*宏擴(kuò)展為buf=128*blks;*/第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.1嵌入式C語(yǔ)言的預(yù)處理偽指令3.條件編譯偽指令格式如下:#if(條件表達(dá)式1)
…#elif(條件表達(dá)式2)
…#elif(條件表達(dá)式3)…#elif(條件表達(dá)式n)…#else…#endif
第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.1嵌入式C語(yǔ)言的預(yù)處理偽指令例5.7#if_B0SIZE==B0SIZE_BYTEtypedefunsignedcharPB0SIZE;#elif_B0SIZE==B0SIZE_SHORTtypedefunsignedshortPB0SIZE;#elif_B0SIZE==B0SIZE_WORDtypedefunsignedlongPB0SIZE;#endif第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型
5.2.1數(shù)據(jù)類型與表達(dá)式第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型(1)類型修飾符
第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型(2)訪問(wèn)修飾符C語(yǔ)言有兩個(gè)用于控制訪問(wèn)和修改變量方式的修飾符,分別是常量(const)和易變量(volatile)。帶const修飾符定義出的常量在程序運(yùn)行過(guò)程中始終保持不變。例如:constintnum;例如:constintnum=100;volatile修飾符用于提醒編譯程序,該變量的值可以不通過(guò)程序中明確定義的方法來(lái)改變。const和volatile可以同時(shí)使用。例如,假設(shè)0x30是一個(gè)只隨外部條件而變化的口地址值,那么就恰好需要用下述說(shuō)明來(lái)避免偶然因素所產(chǎn)生的副作用的影響。constvolatileunsignedchar*port=0x30;
第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型2.構(gòu)造數(shù)據(jù)類型數(shù)組是一組連續(xù)、有序的存放在一起的具有相同類型的數(shù)據(jù)。結(jié)構(gòu)體是將不同類型的數(shù)據(jù)按一定順序存放在一起的數(shù)據(jù)結(jié)構(gòu)。共用體是將不同類型的數(shù)據(jù)都存放在同一起始地址的內(nèi)存單元中,共用一段內(nèi)存以節(jié)省內(nèi)存單元。枚舉是只有幾種可能的值,將其一一列舉出來(lái)。實(shí)際是用符號(hào)來(lái)表示若干個(gè)可取的整型值,它是整型的一個(gè)子集。
第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型3.指針類型指針可以有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu);能動(dòng)態(tài)分配內(nèi)存;能方便地使用字符串;有效而方便地使用數(shù)組;在調(diào)用函數(shù)時(shí)能得到多于一個(gè)的值;能直接處理內(nèi)存地址等。指針類型迥異于前述各種數(shù)據(jù)類型,不管是簡(jiǎn)單類型的數(shù)據(jù),還是構(gòu)造類型數(shù)據(jù),均是代表數(shù)據(jù)的,而指針類型是代表地址的。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型5.2.2常量1.數(shù)值常量(1)整型常量整型常量也稱為整型常數(shù)或整數(shù)。C整型常量按進(jìn)制分可分為十進(jìn)制整數(shù),八進(jìn)制整數(shù)和十六進(jìn)制整數(shù)。(2)實(shí)型常量實(shí)型常量有單精度實(shí)型常量和雙精度實(shí)型常量??捎眯?shù)形式或指數(shù)形式表示。(3)字符常量第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型2.字符串常量字符串常量簡(jiǎn)稱字符串,是用一對(duì)雙引號(hào)括起來(lái)的字符序列。例如“China”就是一個(gè)字符串常量。若數(shù)字被定義為字符型之后就不能參與數(shù)值運(yùn)算,如`5`和5是不同的。`5`是字符常量,不能直接參與運(yùn)算,而只能以其ASCII碼值(0x35)來(lái)參與運(yùn)算。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型3.符號(hào)常量(1)不帶參數(shù)的宏定義宏定義命令#define的一般形式是:#define宏名字符串用來(lái)終止宏名作用域命令#undef的一般形式是:#undef宏名例5.8:#definePI3.14159/*定義PI為常量,其值是3.14159*/main(){…
}#undefPI/*終止宏名PI的作用域*/f1()第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型(2)帶參數(shù)的宏定義它不是進(jìn)行簡(jiǎn)單的字符串替換,還要進(jìn)行參數(shù)替換。其定義的一般形式為:#define宏名(參數(shù)表)字符串其中字符串中包括參數(shù)表中所指定的參數(shù)。在使用時(shí),要將程序中宏名后的實(shí)際參數(shù)代入字符串中參數(shù)的位置。例如:#defineS(a,b)a*b
…
area=S(3,2);經(jīng)編譯預(yù)處理,該語(yǔ)句被展開(kāi)成
area=3*2;
第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型
說(shuō)明:
(1)宏名和參數(shù)表左括號(hào)之間不能有空格,否則按不帶參宏替換了。
(2)字符串中應(yīng)注意括號(hào)的使用,以保證運(yùn)算次序。如上例改成
area=S(1+2,2); 經(jīng)展開(kāi)后變成
area=1+2*2; 這就不合要求了。此時(shí),可改寫(xiě)成 #defineS(a,b)(a)*(b)
…
area=S(1+2,2)
經(jīng)展開(kāi)后變成
area=(1+2)*(2); 就不會(huì)出現(xiàn)錯(cuò)誤了。
第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型5.2.3變量1.變量的定義變量定義的一般形式如下:[存儲(chǔ)類型]類型說(shuō)明符[修飾符]標(biāo)識(shí)符[=初值][,標(biāo)識(shí)符[=初值]]…
;變量的定義由5部分組成,方括號(hào)中的可有可無(wú),變量定義的具體情況而定。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型(1)類型說(shuō)明符●對(duì)于數(shù)字與字符,其常用的類型主要有8種:char、unsignedchar、int、unsigned、long、unsignedlong、float、double?!駐oid類型(抽象型),在具體化時(shí)可用類型強(qiáng)制來(lái)指定類型說(shuō)明符中的任意一類?!裢ㄟ^(guò)typedef定義的類型別名。為了增加程序的可讀性和移植程序時(shí)的方便,C語(yǔ)言允許用戶為C語(yǔ)言固有的類型用typedef起別名。格式如下:typedefC固有的簡(jiǎn)單類型或復(fù)合類型別名標(biāo)識(shí)符;用別名代替原來(lái)的類型,在說(shuō)明中用作類型說(shuō)明符。別名一般用大寫(xiě)字符,例如:typedeflongBIGBIGx=80000;第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型(2)標(biāo)識(shí)符●變量名可以是C語(yǔ)言中允許的合法標(biāo)識(shí)符?!衩恳粋€(gè)變量都必須進(jìn)行類型說(shuō)明,也就是變量要先定義,后使用?!癞?dāng)一個(gè)變量被指定為某一確定類型時(shí),將為它分配若干相應(yīng)字節(jié)的內(nèi)存空間。如在32位體系的ARM系統(tǒng)中,char型為1字節(jié),int型為4字節(jié),float為4字節(jié),double為8字節(jié)。當(dāng)然,不同的體系結(jié)構(gòu)的系統(tǒng)可能稍有差異?!褡兞靠梢栽诔绦騼?nèi)的三個(gè)地方定義:在函數(shù)內(nèi)部,在函數(shù)的參數(shù)(形參)定義中或在所有的函數(shù)外部。由此定義的變量分別稱為局部變量,形式參數(shù)和全局變量。在不同地方定義的變量,其作用域范圍不同。在同一層次定義的變量不能與數(shù)組、指針、函數(shù)和其它變量同名。●變量是用來(lái)存放數(shù)據(jù)的,由于數(shù)據(jù)有不同的類型,因此要定義相應(yīng)類型的變量去存放它。這些數(shù)據(jù)稱為相應(yīng)變量的值。
第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型(3)存儲(chǔ)類型存儲(chǔ)類型指定被說(shuō)明對(duì)象所在內(nèi)存區(qū)域的屬性。存儲(chǔ)空間分為代碼區(qū)與數(shù)據(jù)區(qū)兩個(gè)部分。變量存儲(chǔ)在數(shù)據(jù)區(qū),數(shù)據(jù)區(qū)又可分為靜態(tài)存儲(chǔ)區(qū)與動(dòng)態(tài)存儲(chǔ)區(qū)。靜態(tài)存儲(chǔ)是指在程序運(yùn)行期間給變量分配固定存儲(chǔ)空間的方式。如全局變量存放在靜態(tài)存儲(chǔ)區(qū)中,程序運(yùn)行時(shí)分配空間,程序運(yùn)行完釋放。動(dòng)態(tài)存儲(chǔ)是指在程序運(yùn)行時(shí)根據(jù)實(shí)際需要?jiǎng)討B(tài)分配存儲(chǔ)空間的方式。如形式參數(shù)存放在動(dòng)態(tài)存儲(chǔ)區(qū)中,在函數(shù)調(diào)用時(shí)分配空間,調(diào)用完成釋放。對(duì)于靜態(tài)存儲(chǔ)方式的變量可在編譯時(shí)初始化,默認(rèn)初值為0或空字符。對(duì)動(dòng)態(tài)存儲(chǔ)方式的變量如不賦初值,則它的值是一個(gè)不確定的值。在C語(yǔ)言中,具體的存儲(chǔ)類別有自動(dòng)(auto)、寄存器(register)、靜態(tài)(static)及外部(extern)四種。靜態(tài)存儲(chǔ)類別與外部存儲(chǔ)類別變量存放在靜態(tài)存儲(chǔ)區(qū),自動(dòng)存儲(chǔ)類別變量存放在動(dòng)態(tài)存儲(chǔ)區(qū),寄存器存儲(chǔ)類別直接送寄存器。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型●局部變量的存儲(chǔ)方式局部變量一般用自動(dòng)方式存儲(chǔ),用保留字auto加以定義,此時(shí)稱為自動(dòng)變量,是動(dòng)態(tài)存儲(chǔ),在函數(shù)的調(diào)用過(guò)程中存在,由編譯系統(tǒng)自動(dòng)處理。例如:voidf(){autointi,j;autofloatx,y;/*局部變量i,j,x,y以自動(dòng)方式存儲(chǔ)*/}C語(yǔ)言規(guī)定,自動(dòng)變量可省去說(shuō)明符auto。如果希望函數(shù)調(diào)用完后局部變量的值被保留,不釋放其所占存儲(chǔ)單元,這時(shí)必須將其存儲(chǔ)方式定義為靜態(tài)存儲(chǔ)方式,用保留字static加以定義。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型●全局變量的存儲(chǔ)方式全局變量一般用外部存儲(chǔ)方式存儲(chǔ),用保留字extern加以定義。變量的作用域是構(gòu)成整個(gè)程序的所有程序文件,也就是定義的外部變量可供其它程序文件使用。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型例如5.9程序由兩個(gè)程序文件與組成。/**/externinta;/*定義extern存儲(chǔ)方式變量a*/main(){intpow();intn;intp;scanf(″%d″,&n);p=pow(n);printf(″p=%d\n″,p);}第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型/**/externinta;/*申明本文件中使用的是已定義的外部變量a*/intpow(x)intx;{inti,t=1;for(i=1;i<=x;i++)t*=i;return(t);}
第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型(4)賦初值部分●若初值省略,則存儲(chǔ)類型是自動(dòng)(auto)●寄存器(register)的變量為隨機(jī)值●存儲(chǔ)類型是static的變量被編譯器自動(dòng)清0●對(duì)于指針,無(wú)論什么存儲(chǔ)類型,一律置為空指針(Null)。使用等號(hào)為變量賦初值,注意的是:指針必須用地址量作為初值,字符可用其編碼值(例如ASCII碼)或用單引號(hào)括起的字符作為初值。對(duì)于靜態(tài)變量,只在定義說(shuō)明時(shí)賦初值一次。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型(5)修飾符用于對(duì)變量進(jìn)行特殊的修飾。修飾符包括以下3類:●const——常量修飾符,被修飾的變量或變量指針是常量?!駐olatile——易失性修飾符,說(shuō)明所定義的變量或指針,是可以被多種原因修改的。如有的變量在中斷服務(wù)程序中會(huì)被修改,有的會(huì)被I/0口修改,這種修改帶有隨機(jī)性,防止丟失任何一次這種修改,因此要把它修飾為易失性的變量,注意,禁止把它作為寄存器變量處理,也禁止對(duì)它進(jìn)行任何形式的優(yōu)化。●near、far——近、遠(yuǎn)修飾符,用于說(shuō)明訪問(wèn)內(nèi)存中變量在位置上的遠(yuǎn)近。特別注意:●格式中的方括號(hào)是可選項(xiàng),可有可無(wú)?!褚粋€(gè)說(shuō)明語(yǔ)句可以同時(shí)說(shuō)明多個(gè)同類型的變量,變量之間用逗號(hào)隔開(kāi),變量可以在說(shuō)明時(shí)賦初值;●說(shuō)明語(yǔ)句一定要有終止符“;”結(jié)束。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型2.C語(yǔ)言中各種類型的變量
C語(yǔ)言中有以下幾種類型的變量:整型變量、實(shí)型變量、字符型變量和構(gòu)造類型變量等?!裾妥兞坑脕?lái)存放整型數(shù)值。整型變量可分為:基本型(int),短整型(shortint或short),長(zhǎng)整型(longint或long)和無(wú)符號(hào)型(unsignedint,unsignedshort,unsignedlong)?!駥?shí)型變量分為單精度型(float)和雙精度型(double)兩類?!褡址?char)變量?jī)?nèi)存放字符型常量,在內(nèi)存單元中僅占一個(gè)字節(jié)。其內(nèi)存中存放的是該字符的ASCII碼?!衩杜e型變量枚舉型是一個(gè)整型常量的集合。這些常量指定了所有該類型變量可能具有的各種合法值。枚舉在我們?nèi)粘I钪惺殖R?jiàn)。例如,星期的枚舉為:{星期日,星期一,星期二,星期三,星期四,星期五,星期六}。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型2.C語(yǔ)言中各種類型的變量
C語(yǔ)言中有以下幾種類型的變量:整型變量、實(shí)型變量、字符型變量和構(gòu)造類型變量等?!裾妥兞坑脕?lái)存放整型數(shù)值。整型變量可分為:基本型(int),短整型(shortint或short),長(zhǎng)整型(longint或long)和無(wú)符號(hào)型(unsignedint,unsignedshort,unsignedlong)?!駥?shí)型變量分為單精度型(float)和雙精度型(double)兩類。●字符型(char)變量?jī)?nèi)存放字符型常量,在內(nèi)存單元中僅占一個(gè)字節(jié)。其內(nèi)存中存放的是該字符的ASCII碼?!衩杜e型變量枚舉型是一個(gè)整型常量的集合。這些常量指定了所有該類型變量可能具有的各種合法值。枚舉在我們?nèi)粘I钪惺殖R?jiàn)。例如,星期的枚舉為:{星期日,星期一,星期二,星期三,星期四,星期五,星期六}。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型5.2.4運(yùn)算符第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型5.2.4運(yùn)算符說(shuō)明:(1)+、-、*、%與數(shù)學(xué)中運(yùn)算類似,先乘除后加減,也就是按優(yōu)先級(jí)順序進(jìn)行運(yùn)算,優(yōu)先級(jí)小的先運(yùn)算。(2)求余運(yùn)算符(%)僅用于整型數(shù)據(jù),不能用于實(shí)型和雙精度實(shí)型。它的作用是取整數(shù)除法的余數(shù)。如1%2的結(jié)果是1;10%3的結(jié)果也是1。(3)賦值運(yùn)算符(=)是將右邊表達(dá)式的值賦給左邊的變量。賦值運(yùn)算符左邊必須是變量等有存貯單元的元素,而不能是常量或表達(dá)式。(4)++、--僅用于整型變量,指針變量。用于整型變量在原值上加1或減1;用于指針變量是取下一地址或上一地址。(5)+、-、*、/、%可以與賦值號(hào)=組成復(fù)合賦值運(yùn)算符+=、-=、*=、/=、%=。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型2.關(guān)系運(yùn)算符和邏輯運(yùn)算符
第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型2.關(guān)系運(yùn)算符和邏輯運(yùn)算符
說(shuō)明:(1)當(dāng)關(guān)系運(yùn)算符兩邊的值滿足關(guān)系時(shí)為真,返回1;如不滿足關(guān)系時(shí)為假,返回0。(2)關(guān)系運(yùn)算符>、>=、<、<=的優(yōu)先級(jí)相同,如在表達(dá)式中同時(shí)出現(xiàn)時(shí),則自左向右順序運(yùn)算。而“==”與“!=”的優(yōu)先級(jí)低于>、>=、<、<=這四種關(guān)系運(yùn)算符。例如:printf(″%d\n″,5>3>1);運(yùn)行輸出結(jié)果為0。因?yàn)閮蓚€(gè)>是同一優(yōu)先級(jí),5>3的結(jié)果為1,而1>1的關(guān)系不滿足,所以最后結(jié)果為0。又如:printf(″%d\n″,1==11<35);運(yùn)行輸出結(jié)果為1。因?yàn)?lt;的優(yōu)先級(jí)比==高,則11<35的結(jié)果為1,而1==1的關(guān)系滿足,所以最后結(jié)果為1。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型3.位運(yùn)算符
第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.3程序的控制結(jié)構(gòu)
5.3程序的控制結(jié)構(gòu)程序控制語(yǔ)句用于控制程序的流程,以實(shí)現(xiàn)程序的各種結(jié)構(gòu)方式。包括:條件判斷語(yǔ)句:if,switch循環(huán)執(zhí)行語(yǔ)句:dowhile,while,for轉(zhuǎn)向語(yǔ)句:break,goto,continue,return第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.3程序的控制結(jié)構(gòu)
5.3.1選擇結(jié)構(gòu)用if語(yǔ)句可以實(shí)現(xiàn)簡(jiǎn)單選擇結(jié)構(gòu)。其語(yǔ)法形式為
if(表達(dá)式) 語(yǔ)句1 else 語(yǔ)句2
執(zhí)行順序是:首先計(jì)算表達(dá)式的值,若表達(dá)式值為true,則執(zhí)行語(yǔ)句1;否則執(zhí)行語(yǔ)句2。
if語(yǔ)句中的語(yǔ)句2可以為空,當(dāng)語(yǔ)句2為空時(shí),else可以省略,成為如下形式:
if(表達(dá)式) 語(yǔ)句1
其中,語(yǔ)句1和語(yǔ)句2不僅可以是一條語(yǔ)句,而且可以是大花括號(hào)括起來(lái)的多條語(yǔ)句,即復(fù)合語(yǔ)句。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.3程序的控制結(jié)構(gòu)
5.3.2switch語(yǔ)句switch語(yǔ)句的語(yǔ)法形式如下:
switch(表達(dá)式) { case 常量表達(dá)式1:語(yǔ)句1 case 常量表達(dá)式2:語(yǔ)句2 case 常量表達(dá)式n:語(yǔ)句n default: 語(yǔ)句 n+1 }第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.3程序的控制結(jié)構(gòu)
5.3.3循環(huán)結(jié)構(gòu)嵌入式LunuxC語(yǔ)言中有三種循環(huán)控制語(yǔ)句,即while,dowhile,for循環(huán)語(yǔ)句。while和dowhile是兩種不同的循環(huán)結(jié)構(gòu),即當(dāng)型循環(huán)和直型循環(huán),其格式如下:1.while語(yǔ)句(當(dāng)型循環(huán))while語(yǔ)句的語(yǔ)法形式為:
while(表達(dá)式) {
循環(huán)體語(yǔ)句
}第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.3程序的控制結(jié)構(gòu)
5.3.3循環(huán)結(jié)構(gòu)
2.do-while語(yǔ)句(直型循環(huán))語(yǔ)法形式:
do {
循環(huán)體語(yǔ)句
}while(表達(dá)式);
執(zhí)行順序是:當(dāng)流程執(zhí)行到do后,立即執(zhí)行循環(huán)體語(yǔ)句,然后再判斷循環(huán)條件表達(dá)式的值。當(dāng)表達(dá)式為true時(shí),繼續(xù)執(zhí)行循環(huán)體;否則結(jié)束循環(huán),該語(yǔ)句結(jié)構(gòu)使循環(huán)至少執(zhí)行一次。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.3程序的控制結(jié)構(gòu)
3.for語(yǔ)句
for語(yǔ)句的使用最為靈活,既可以用于循環(huán)次數(shù)確定的情況,也可以用于循環(huán)次數(shù)未知的情況。for語(yǔ)句的語(yǔ)法形式如下:
for(表達(dá)式1;表達(dá)式2;表達(dá)式3)for語(yǔ)句的執(zhí)行流程為:(1)首先計(jì)算表達(dá)式1的值。(2)再計(jì)算表達(dá)式2,如果表達(dá)式2的值為false,則退出循環(huán)。(3)如果表達(dá)式2的值為true,則執(zhí)行一次循環(huán)體,然后計(jì)算表達(dá)式3的值。(4)轉(zhuǎn)回(2),表達(dá)式2的值決定是否繼續(xù)執(zhí)行循環(huán)體。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.3程序的控制結(jié)構(gòu)
5.3.4其他控制語(yǔ)句1.break語(yǔ)句
break語(yǔ)句只用于switch語(yǔ)句或循環(huán)體中,作用是使程序從switch語(yǔ)句內(nèi)跳出或結(jié)束本次循環(huán),轉(zhuǎn)去執(zhí)行后面的語(yǔ)句。由于break語(yǔ)句的轉(zhuǎn)移方向是明確的,所以不需要語(yǔ)句標(biāo)號(hào)與之配合。2.continue語(yǔ)句
continue語(yǔ)句僅用于循環(huán)體中,其作用是結(jié)束本次循環(huán),接著開(kāi)始判斷循環(huán)條件,決定是否繼續(xù)執(zhí)行下一次循環(huán)。3.goto語(yǔ)句
goto語(yǔ)句的語(yǔ)法格式為
goto<語(yǔ)句標(biāo)號(hào)> goto語(yǔ)句的作用是跳轉(zhuǎn)到語(yǔ)句標(biāo)號(hào)處執(zhí)行程序。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.4函數(shù)
5.4函數(shù)1.函數(shù)定義一個(gè)完整的函數(shù)定義由兩部分組成,即函數(shù)頭與函數(shù)體。函數(shù)定義的一般語(yǔ)法形式為:<類型標(biāo)識(shí)符><函數(shù)名說(shuō)明符>(形式參數(shù)表){
說(shuō)明性語(yǔ)句序列; 實(shí)現(xiàn)函數(shù)功能的語(yǔ)句系列;}
其中,類型標(biāo)識(shí)符規(guī)定了函數(shù)的返回值類型。函數(shù)的返回值是返回給主調(diào)函數(shù)的處理結(jié)果,由函數(shù)體部分的return語(yǔ)句帶回。無(wú)返回值的函數(shù)其類型標(biāo)識(shí)符為void,不必有return語(yǔ)句。形式參數(shù)表(簡(jiǎn)稱形參表)的內(nèi)容如下:類型l形參名1,類型2形參名2,…,類型n形參名n第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.4函數(shù)2.調(diào)用函數(shù)調(diào)用函數(shù)必須遵守先定義后調(diào)用的原則,否則,需要在調(diào)用函數(shù)之前在主調(diào)函數(shù)中聲明函數(shù)原型。函數(shù)原型聲明形式:(1)<類型標(biāo)識(shí)符><被調(diào)函數(shù)名>(參數(shù)類型1,參數(shù)類型2…);(2)<類型標(biāo)識(shí)符><被調(diào)函數(shù)名>(參數(shù)類型1參數(shù)名1,參數(shù)類型2參數(shù)名2…);
函數(shù)的調(diào)用形式:
<函數(shù)名>(實(shí)參1,實(shí)參2,…,實(shí)參n)第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.4函數(shù)
例如在<arch\arm\mm\mm-armv.c>中出現(xiàn)的create_mapping函數(shù)定義(省略了括號(hào)內(nèi)“{}”的語(yǔ)句)。
staticvoid__initcreate_mapping(structmap_desc*md){…}定義這個(gè)函數(shù)的各項(xiàng)含義如下:
(1)類型說(shuō)明符staticvoid__init,其中的static說(shuō)明符用于指明這個(gè)靜態(tài)的函數(shù)只可被這一文件內(nèi)的其他函數(shù)調(diào)用。
void說(shuō)明符指明該函數(shù)是無(wú)返值類型。而__init是宏定義的說(shuō)明符。(2)函數(shù)名為create_mapping。(3)這個(gè)函數(shù)只有一個(gè)形式參數(shù)md,其形參類說(shuō)明符是structmap_desc*,是一個(gè)指向結(jié)構(gòu)體map_desc的指針。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.4函數(shù)3.內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)與一般函數(shù)不同的是,它不是在調(diào)用時(shí)發(fā)生轉(zhuǎn)移,而是在編譯時(shí)將函數(shù)體嵌入在每一個(gè)調(diào)用語(yǔ)句處。這樣就相對(duì)節(jié)省了參數(shù)傳遞、系統(tǒng)棧的保護(hù)與恢復(fù)等的開(kāi)銷。
內(nèi)聯(lián)函數(shù)的定義形式為:<inline><類型標(biāo)識(shí)符><被調(diào)函數(shù)名>(含類型說(shuō)明的形參表){
函數(shù)體}第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.4函數(shù)例5.12內(nèi)聯(lián)函數(shù)例題。
#include<iostream.h>#include<iomanip.h>inlineintmax(inta,intb){if(a>b)returna;elsereturnb;}voidmain() { inta,b,c,d; a=210; b=150; c=20; d=max(a,b); d=max(d,c);//編譯時(shí)兩個(gè)調(diào)用處均被替換為max函數(shù)體語(yǔ)句printf(″Thebiggestof%d%d%dis%d″,a,b,c,d)
}
程序運(yùn)行結(jié)果為
Thebiggestof21015020is210第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.4函數(shù)4.系統(tǒng)函數(shù)的使用系統(tǒng)函數(shù)的原型聲明由系統(tǒng)提供,并且已分類存于不同的頭文件中。用include指令嵌入相應(yīng)頭文件,然后可使用系統(tǒng)函數(shù)。include指令格式如下。#include<標(biāo)準(zhǔn)頭文件名.h>
其中:頭文件名可帶或不帶路經(jīng),尖括號(hào)內(nèi)為標(biāo)準(zhǔn)頭文件,由開(kāi)發(fā)環(huán)境或系統(tǒng)提供。若頭文件為用戶自定義頭文件,則頭文件在雙引號(hào)內(nèi)。例5.13標(biāo)準(zhǔn)頭文件定義#include<string.h>#include<sys/types.h>string.h和types.h是標(biāo)準(zhǔn)頭文件,按環(huán)境變量include指定的目錄順序搜索string.h和types.h。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.4函數(shù)4.系統(tǒng)函數(shù)的使用系統(tǒng)函數(shù)的原型聲明由系統(tǒng)提供,并且已分類存于不同的頭文件中。用include指令嵌入相應(yīng)頭文件,然后可使用系統(tǒng)函數(shù)。include指令格式如下。#include<標(biāo)準(zhǔn)頭文件名.h>
其中:頭文件名可帶或不帶路經(jīng),尖括號(hào)內(nèi)為標(biāo)準(zhǔn)頭文件,由開(kāi)發(fā)環(huán)境或系統(tǒng)提供。若頭文件為用戶自定義頭文件,則頭文件在雙引號(hào)內(nèi)。例5.13標(biāo)準(zhǔn)頭文件定義#include<string.h>#include<sys/types.h>string.h和types.h是標(biāo)準(zhǔn)頭文件,按環(huán)境變量include指定的目錄順序搜索string.h和types.h。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.5數(shù)組
1.一維數(shù)組(1)數(shù)組的定義數(shù)組在使用前必須先聲明。聲明一個(gè)一維數(shù)組的形式如下:
<類型標(biāo)識(shí)符><數(shù)組名>[數(shù)組長(zhǎng)度]
注意:數(shù)組長(zhǎng)度是個(gè)常量表達(dá)式。數(shù)組中的每個(gè)元素可以當(dāng)成普通的變量使用。訪問(wèn)一維數(shù)組元素的形式如下:
<數(shù)組名>[下標(biāo)]
注意:下標(biāo)的值也是從0開(kāi)始,不能超過(guò)該維的長(zhǎng)度減1。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.5數(shù)組
(2)數(shù)組的初始化數(shù)組的初始化有以下幾種方式。形式1:定義時(shí)整體初始化與變量在定義時(shí)初始化一樣,數(shù)組也可以在定義時(shí)進(jìn)行初始化,格式如下:
<類型標(biāo)識(shí)符><數(shù)組名>[數(shù)組長(zhǎng)度]={第0個(gè)元素值,第1個(gè)元素值,…,第n-1個(gè)元素值};例如對(duì)字這符數(shù)組進(jìn)行初始化:
chara[10]={`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`,`j`,`k`};第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.5數(shù)組
形式2:定義時(shí)部分初始化數(shù)組在定義時(shí)可對(duì)其中的部分?jǐn)?shù)據(jù)進(jìn)行初始化。當(dāng)“{}”中值的個(gè)數(shù)少于元素個(gè)數(shù)時(shí),只給前面部分元素賦值。例如如下定義就是對(duì)數(shù)組的前5個(gè)數(shù)據(jù)初始化,而后5個(gè)數(shù)據(jù)自動(dòng)賦0(在字符數(shù)組中自動(dòng)賦`\0`)。
chara[10]={`a`,`b`,`c`,`d`,`e`};第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.5數(shù)組
形式3:數(shù)組全部賦值若想要對(duì)數(shù)組中元素全部賦值,則可以省略數(shù)組下標(biāo)中的常數(shù),在此時(shí),編譯器會(huì)自動(dòng)定義數(shù)組元素的個(gè)數(shù),其格式如下:
<類型標(biāo)識(shí)符><數(shù)組名>[]={第0個(gè)元素值,第1個(gè)元素值,…,第n個(gè)元素值};例如:
chara[]={`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`,`j`,`k`};第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.5數(shù)組
2.多維數(shù)組
(1)多維數(shù)組的定義多維數(shù)組的聲明形式如下:
<類型標(biāo)識(shí)符><數(shù)組名>[長(zhǎng)度1][長(zhǎng)度2]…[長(zhǎng)度n]
(2)多維數(shù)組的引用多維數(shù)組中元素的引用和一維數(shù)組的引用很相似,可通過(guò)下標(biāo)引用的方式進(jìn)行的。其表示形式為:
<數(shù)組名>[第1維下標(biāo)][第2維下標(biāo)]…[第n維下標(biāo)]第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.5數(shù)組
(2)多維數(shù)組的初始化以下是二維數(shù)組的初始化形式:
形式1:分段賦值
<類型標(biāo)識(shí)符><數(shù)組名>[第1維長(zhǎng)度][第2維長(zhǎng)度]={{第0個(gè)第2維數(shù)據(jù)組}, {第1個(gè)第2維數(shù)據(jù)組},…,{第n-1個(gè)第2維數(shù)據(jù)組}}
其中,n等于第1維長(zhǎng)度。
形式2:按行連續(xù)賦值
<類型標(biāo)識(shí)符><數(shù)組名>[第1維長(zhǎng)度][第2維長(zhǎng)度]={{第0個(gè)元素值,第1個(gè)元值,…,第m個(gè)元素值}}其中,m小于或等于第1維長(zhǎng)度×第2維長(zhǎng)度。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.5數(shù)組
3.數(shù)組作為函數(shù)的參數(shù)將整個(gè)數(shù)組作為參數(shù)傳遞給函數(shù),可通過(guò)傳遞不帶方括號(hào)的數(shù)組名來(lái)進(jìn)行,其形式大體上有以下兩種:形式1:
<類型標(biāo)識(shí)符><函數(shù)名>(類型標(biāo)識(shí)符數(shù)組名[],int長(zhǎng)度)形式2:<類型標(biāo)識(shí)符><函數(shù)名>(類型標(biāo)識(shí)符數(shù)組名[長(zhǎng)度])第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.5數(shù)組
4.數(shù)組與字符串(1)字符數(shù)組的初始化有兩種特殊的初始化方法,形式如下:
形式1:
char<數(shù)組名>[]="字符串"
形式2:
char<數(shù)組名>[]={"字符串"}
兩種形式效果相同,且在末尾加個(gè)“\0”,例如:
charpMyStrinq[]="Thisisacomputer";
它等同于:
charpMyString[]={'T','h','i','s','','a','','c','o','m','p','u','t','e','r','\0'};或
charpMyStrinq[]={"Thisisacomputer"};第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.5數(shù)組
(2)字符串的基本運(yùn)算
求字符串的長(zhǎng)度假設(shè)字符串保存在數(shù)組pString中,求字符串長(zhǎng)度的程序代碼如下:
charpString[]="abcd"; intnSize=0; while(pString[nSize]!='\0') nSize++;
執(zhí)行完畢后,整型變量nSize中保存的值就是字符串pString的長(zhǎng)度。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.5數(shù)組
字符串的復(fù)制假設(shè)源字符串保存在數(shù)組pSource中,目的字符型數(shù)組為pDestination,則字符串復(fù)制的程序段如下:
charpSource[]="abcd"; charpDestination[]=[5];//源字符串長(zhǎng)度+1 intnIndex=0; while(pSource[nSize]!='\0?') { pDestination[nIndex]=pSource[nIndex]; nIndex++; } pDestination[nIdex]='\0';//標(biāo)識(shí)字符串結(jié)束第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.5數(shù)組
字符串的連接假設(shè)源字符串保存在字符數(shù)組pDest中,要連接進(jìn)來(lái)的字符串保存在字符數(shù)組pTocat中,則程序代碼為:
charpTocat[]="efg";charpDest[8]="abcd";intnSize=0;intnIndex=0;while(pDest[nSize]!=0)//找到被要連接的字符串的尾部
nSize++;do { pDest[nSize++]=pTocat[nIndex]; nIndex++; }while(pTocat[nIndex]!='\0'); pDest[nSize]='\0';第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)(3)字符串處理函數(shù)要引入#include<string.h>語(yǔ)句第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)(3)字符串處理函數(shù)要引入#include<string.h>語(yǔ)句第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.5數(shù)組
字符串的連接假設(shè)源字符串保存在字符數(shù)組pDest中,要連接進(jìn)來(lái)的字符串保存在字符數(shù)組pTocat中,則程序代碼為:
charpTocat[]="efg";charpDest[8]="abcd";intnSize=0;intnIndex=0;while(pDest[nSize]!=0)//找到被要連接的字符串的尾部
nSize++;do { pDest[nSize++]=pTocat[nIndex]; nIndex++; }while(pTocat[nIndex]!='\0'); pDest[nSize]='\0';第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8匯編語(yǔ)言與C/C++的混合編程匯編語(yǔ)言與C/C++的混合編程在C/C++代碼中嵌入?yún)R編指令。在匯編程序和C/C++的程序之間進(jìn)行變量的互訪。匯編程序、C/C++程序間的相互調(diào)用。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8匯編語(yǔ)言與C/C++的混合編程5.8.1內(nèi)嵌匯編指令是嵌入在C/C++程序中使用,但不能直接引用C語(yǔ)言的變量定義,數(shù)據(jù)交換必須通過(guò)ATPCS進(jìn)行。1.內(nèi)嵌匯編指令的語(yǔ)法格式__asm__(“instruction...instruction”);//Linuxgcc中支持__asm{ instruction…instruction};//ADS中支持
特別注意:是“__asm”是兩個(gè)下劃線。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.1內(nèi)嵌匯編指令2.內(nèi)嵌匯編指令的特點(diǎn)(1)操作數(shù)●內(nèi)嵌的匯編指令中作為操作數(shù)的寄存器和常量可以是C/C++表達(dá)式。是char、short、int類型,而且這些表達(dá)式都是作為無(wú)符號(hào)數(shù)進(jìn)行操作?!窬幾g器將會(huì)計(jì)算這些表達(dá)式的值,并為其分配寄存器。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.1內(nèi)嵌匯編指令(2)物理寄存器
內(nèi)嵌匯編指令中使用物理寄存器的限制:
不能直接向PC寄存器中賦值,程序的跳轉(zhuǎn)只能通過(guò)B指令和BL指令實(shí)現(xiàn)。
在內(nèi)嵌匯編指令中,不要使用過(guò)于復(fù)雜的C/C++表達(dá)式。
編譯器可能會(huì)使用R12寄存器或R13寄存器存放編譯的中間結(jié)果,在計(jì)算表達(dá)式值時(shí)可能會(huì)將寄存器R0到R3、R12以及R14用于子程序調(diào)用。
指令中不要使用指定的物理寄存器。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.1內(nèi)嵌匯編指令(3)常量在內(nèi)嵌的匯編指令中,常量前的符號(hào)#可省略。若表達(dá)式前使用了符號(hào)#,則必須是一個(gè)常量。(4)指令展開(kāi)內(nèi)嵌的匯編指令中如果包含常量操作數(shù),該指令可能會(huì)被匯編器展開(kāi)成幾條指令。例如指令:
ADDR0,R0,#1023
可能會(huì)被展開(kāi)成下面的指令序列:
ADDR0,R0,#1024SUBR0,R0,#01
MUL指令會(huì)被展開(kāi)成一系列加法和移位操作。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.1內(nèi)嵌匯編指令(5)標(biāo)號(hào)C/C++程序中的標(biāo)號(hào)可被內(nèi)嵌的匯編指令使用。但只有B指令可使用C/C++程序中的標(biāo)號(hào),指令BL不能使用C/C++程序中的標(biāo)號(hào)。指令B使用C/C++程序中的標(biāo)號(hào)格式:B{cond}label(6)內(nèi)存單元的分配所用的內(nèi)存單元的分配都是通過(guò)C/C++程序完成的,分配的內(nèi)存單元通過(guò)變量供內(nèi)嵌的匯編器使用。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.1內(nèi)嵌匯編指令(7)SWI和BL指令的使用內(nèi)嵌SWI和BL指令中3個(gè)可選寄存器列表
第1個(gè)寄存器列表中的寄存器用于存放輸入的參數(shù)。
第2個(gè)寄存器列表中的寄存器用于存放返回的參數(shù)。
第3個(gè)寄存器列表中的寄存器的內(nèi)容可能被被調(diào)用的子程序破壞,即這些寄存器是供被調(diào)用的子程序作為工作寄存器。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.1內(nèi)嵌匯編指令3.內(nèi)嵌的匯編器與armasm的區(qū)別
在功能和使用方法上主要有以下特點(diǎn):
不能寫(xiě)PC(movpc,lr)
不支持偽指令LDRRn,=expression,但可用指令:LDRRn,expression來(lái)代替。
除nop外,不支持ADR、ADRL等偽指令。
指令中的C變量不要與任何物理寄存器重名
LDM/STM指令中的寄存器列表只能使用物理寄存器,不能使用C表達(dá)式
不支持指令BX/BLX
用戶不用維護(hù)數(shù)據(jù)棧
不要輕易改變處理器模式。
不支持內(nèi)存分配操作第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.1內(nèi)嵌匯編指令4.內(nèi)嵌匯編指令的應(yīng)用舉例下面是在ADS1.2下編譯通過(guò)程序,程序中內(nèi)嵌匯編指令。例5.14字符串復(fù)制本例中使用了指令BL調(diào)用子程序。在內(nèi)嵌的BL指令中,除了正常的操作數(shù)外,還必須增加以下三個(gè)可選的寄存器列表:
第1個(gè)用于存放輸入的參數(shù)
第2個(gè)用于存放返回的結(jié)果
第3個(gè)作為子程序的工作寄存器程序代碼如下:#include<stdio.h>voidmy_strcpy(char*src,constchar*dst){intch;__asm{loop:LDRBch,[src],#1STRBch,[dst],#1CMPch,#0BNEloop};}intmain(void){constchar*a="HelloWorld!";
charb[20];__asm{ MOVR0,a MOVR1,b BLmy_strcpy,{R0,R1}};printf("OriginalString:%s\n",a);printf(“CopiedString:%s\n",b);return0;}
例中主函數(shù)main(void)中的BLmy_strcpy,{R0,R1}指令的輸入寄存器列表為{R0,R1};它沒(méi)有輸出寄存器列表;被子程序使用的工作寄存器為ATPCS的默認(rèn)工作寄存器R0~R3、R12、lr以及PSR。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.1內(nèi)嵌匯編指令例5.15使能和禁止中斷本例主要介紹怎樣利用內(nèi)嵌的匯編程序?qū)崿F(xiàn)使能和禁止中斷。通過(guò)修改CPSR寄存器中的bit7可使能和禁止中斷。但這些操作必須在特權(quán)模式下進(jìn)行,因?yàn)樵谟脩裟J较虏荒苄薷募拇嫫鰿PSR中的控制位。源程序代碼如下。程序代碼如下:__inlinevoidenable_IRQ(void){inttmp;__asm{MRStmp,CPSRBICtmp,tmp,#0x80MSRCPSR_c,tmp}}__inlinevoiddisable_IRQ(void){inttmp;__asm{MRStmp,CPSRORRtmp,tmp,0x80MSRCPSR_c,tmp
}}intmain(void){disable_IRQ()
;enable_IRQ()
;}第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.2從匯編程序中訪問(wèn)C程序變量
在C程序中聲明的全局變量可被匯編程序通過(guò)地址間接訪問(wèn)。具體訪問(wèn)方法如下:
使用IMPORT偽操作聲明該全局變量。
使用LDR偽指令讀取該全局變量的內(nèi)存地址,通常該全局變量的內(nèi)存地址值存放在程序的數(shù)據(jù)緩沖池中(literalpool)。
根據(jù)該數(shù)據(jù)的類型,使用相應(yīng)的LDR指令讀取該全局變量的值;使用相應(yīng)的STR指令修改該全局變量的值。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.2從匯編程序中訪問(wèn)C程序變量各數(shù)據(jù)類型及對(duì)應(yīng)的LDR/STR指令如下:對(duì)于無(wú)符號(hào)的char類型變量通過(guò)指令LDRB/STRB來(lái)讀/寫(xiě)。對(duì)于無(wú)符號(hào)的short類型變量通過(guò)指令LDRH/STRH來(lái)讀/寫(xiě)。對(duì)于int類型的變量通過(guò)指令LDR/STR來(lái)讀/寫(xiě)對(duì)于有符號(hào)的char類型的變量通過(guò)指令LDRSB來(lái)讀取。對(duì)于有符號(hào)的char類型的變量通過(guò)指令STRB來(lái)寫(xiě)入。對(duì)于有符號(hào)的short類型的變量通過(guò)指令LDRSH來(lái)讀取。對(duì)于有符號(hào)的short類型的變量通過(guò)指令STRH來(lái)寫(xiě)入。對(duì)于小于8個(gè)字的結(jié)構(gòu)型變量,可以通過(guò)一條LDM/STM指令來(lái)讀/寫(xiě)整個(gè)變量。對(duì)于結(jié)構(gòu)型變量的數(shù)據(jù)成員,可以使用相應(yīng)的LDR/STR指令來(lái)訪問(wèn),這時(shí)必須知道該數(shù)據(jù)成員相對(duì)于結(jié)構(gòu)型變量開(kāi)始地址的偏移量。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.2從匯編程序中訪問(wèn)C程序變量例5.16從匯編程序中訪問(wèn)C程序全局變量在匯編程序中訪問(wèn)C程序全局變量。程序中變量globvl是在C程序中聲明的全局變量。在匯編程序中首先用IMPORT偽操作聲明該變量;將其內(nèi)存地址讀入到寄存器R1中;再將其內(nèi)存單元中的值讀入到寄存器R0中;修改后再將寄存器R0的值賦于變量globvl。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.2從匯編程序中訪問(wèn)C程序變量
例5.16從匯編程序中訪問(wèn)C程序全局變量源程序代碼如下:AREAglobals,CODE,READONLY EXPORTasmsub IMPORTglobvlasmsub LDRr1,=globvl LDRr0,[r1] ADDr0,r0,#2
STRr0,[r1] MOVpc,lr END第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.3編程序與C/C++程序的相互調(diào)用規(guī)則—ARPCSATPCS(ARM-ThumbProcedureCallStandard)規(guī)則。1.寄存器的使用規(guī)則
寄存器的使用必須滿足下面規(guī)則:
子程序間通過(guò)寄存器R0~R3來(lái)傳遞參數(shù),記為A1~A4。被調(diào)用的子程序在返回前無(wú)須恢復(fù)寄存器R0~R3的內(nèi)容。
子程序中使用寄存器R4~R11來(lái)保存局部變量。記為V1~V8。如果在子程序中使用到了寄存器V1~V8中的某些寄存器,則子程度進(jìn)入時(shí)必須保存這些寄存器的值,在返回前必須恢復(fù)這些寄存器的值;對(duì)于子程序中沒(méi)有用到的寄存器,則不必進(jìn)行這些操作。在Thumb程序中,通常只能使用寄存器R4~R7來(lái)保存局部變量。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.3匯編程序與C/C++程序的相互調(diào)用規(guī)則——ARPCS
寄存器R12用作子程序間的scratch寄存器,常用于子程序間的連接代碼段中,記作IP。
寄存器R13用作數(shù)據(jù)棧指針,記作SP。在子程序中寄存器R13不能用作其他用途。寄存器SP在進(jìn)入子程序時(shí)的值和退出子程序時(shí)的值必須相等。
寄存器R14稱為鏈接寄存器,記作LR。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,則寄存器R14可作其他用途。
R15是程序計(jì)數(shù)器,記作PC。不能作其他用途。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.3匯編程序與C/C++程序的相互調(diào)用規(guī)則—ARPCS第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.3匯編程序與C/C++程序的相互調(diào)用規(guī)則——ARPCS2.?dāng)?shù)據(jù)棧的使用規(guī)則有下面4種數(shù)據(jù)棧:
FD(FullDescending)滿遞減;
ED(EmptyDescending)空遞減;
FA(FullAscending)滿遞增;
EA(EmptyAscending)空遞增。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.3匯編程序與C/C++程序的相互調(diào)用規(guī)則—ARPCS
ATPCS規(guī)定數(shù)據(jù)棧為FD(滿遞減)類型,并且對(duì)數(shù)據(jù)棧的操作是8字節(jié)對(duì)齊的。異常中斷的處理程序可使用中斷程序的數(shù)據(jù)棧。
數(shù)據(jù)棧指針(StackPoint):最后一個(gè)寫(xiě)入棧的數(shù)據(jù)的內(nèi)存地址。
數(shù)據(jù)棧的基地址(StackBase):數(shù)據(jù)棧的最高地址。ATPSC中的數(shù)據(jù)棧是FD型,最早入棧的數(shù)據(jù)所占的內(nèi)存單元是基地址的下一個(gè)內(nèi)存單元。
數(shù)據(jù)棧界限(StackLimit):數(shù)據(jù)棧中可使用的最低的內(nèi)存單元地址。
數(shù)據(jù)棧中的數(shù)據(jù)幀(StackFrames):數(shù)據(jù)棧是為子程序分配用來(lái)保存寄存器和局部變量的區(qū)域。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.3匯編程序與C/C++程序的相互調(diào)用規(guī)則——ARPCS3.參數(shù)的傳遞規(guī)則參數(shù)傳遞規(guī)則具體如下:(1)參數(shù)個(gè)數(shù)固定的子程序參數(shù)傳遞規(guī)則對(duì)于參數(shù)個(gè)數(shù)固定的子程序,如果系統(tǒng)包含浮點(diǎn)運(yùn)算的硬件部件,浮點(diǎn)參數(shù)將按照下面規(guī)則傳遞:
各個(gè)浮點(diǎn)參數(shù)按順序處理。
為每個(gè)浮點(diǎn)參數(shù)分配FP寄存器。方法是:滿足該浮點(diǎn)參數(shù)需要的且編號(hào)最小的一組連續(xù)的FP寄存器。第一個(gè)整數(shù)參數(shù),通過(guò)寄存器R0~R3來(lái)傳遞。其他參數(shù)通過(guò)數(shù)據(jù)棧傳遞。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.3匯編程序與C/C++程序的相互調(diào)用規(guī)則——ARPCS(2)參數(shù)個(gè)數(shù)可變的子程序參數(shù)傳遞規(guī)則
●當(dāng)參數(shù)不超過(guò)4個(gè),用R0~R3傳遞參數(shù),當(dāng)參數(shù)超過(guò)4個(gè)時(shí),使用數(shù)據(jù)棧來(lái)傳遞參數(shù)?!裨趨?shù)傳遞時(shí),所有參數(shù)看作是存放在連續(xù)的內(nèi)存字單元中的字?jǐn)?shù)據(jù)。然后,依次將各字?jǐn)?shù)據(jù)傳遞到寄存器R0~R3中,如果參數(shù)多于4個(gè),將剩余的字?jǐn)?shù)據(jù)傳送到數(shù)據(jù)棧中,入棧的順序與參數(shù)順序相反,即最后一個(gè)字?jǐn)?shù)據(jù)先入棧。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.3匯編程序與C/C++程序的相互調(diào)用規(guī)則——ARPCS(3)子程序結(jié)果返回規(guī)則子程序返回結(jié)果規(guī)則如下:
結(jié)果為一個(gè)32位整數(shù),可通過(guò)寄存器R0返回;
結(jié)果為一個(gè)64位整數(shù),可通過(guò)寄存器R0,R1返回,依次類推;
結(jié)果為一個(gè)浮點(diǎn)數(shù)時(shí),可通過(guò)運(yùn)算部件的寄存器F0、D0或者S0來(lái)返回;
結(jié)果為復(fù)合型的浮點(diǎn)數(shù)(如復(fù)數(shù))時(shí),可通過(guò)寄存器F0~Fn或者D0~Dn來(lái)返回。
對(duì)于位數(shù)更多的結(jié)果,需通過(guò)內(nèi)存來(lái)傳遞,如通過(guò)數(shù)據(jù)棧來(lái)傳遞。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.4匯編程序與C/C++程序的相互調(diào)用1.C語(yǔ)言程序調(diào)用匯編語(yǔ)言程序
匯編語(yǔ)言程序的設(shè)計(jì)要遵守ATPCS。在匯編語(yǔ)言中需用EXPORT偽操作來(lái)說(shuō)明,使得本程序可被其他程序調(diào)用。
C語(yǔ)言程序調(diào)用該匯編語(yǔ)言程序之前,需要在C語(yǔ)言程序中使用extern關(guān)鍵詞來(lái)聲明該匯編語(yǔ)言程序。
第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.4匯編程序與C/C++程序的相互調(diào)用#include<stdio.h>externvoidmy_strcpy(char*d,constchar*s);intmain(){constchar*srcstr="Firststring-source";chardststr[]="Secondstring-destination";printf("Beforecopying:\n");printf("%s\n%s\n",srcstr,dststr);my_strcpy(dststr,srcstr);printf("Aftercopying:\n");printf("%s\n%s\n",srcstr,dststr);return0;}例5.17C語(yǔ)言程序調(diào)用匯編語(yǔ)言程序完成字符串復(fù)制
C語(yǔ)言源程序如下:AREASCopy,CODE,READONLYEXPORTmy_strcpymy_strcpyLDRBr2,[r1],#1STRBr2,[r0],#1CMPr2,#0BNEmy_strcpyMOVpc,lrEND
根據(jù)ATPCS規(guī)則,函數(shù)的前4個(gè)參數(shù)在R0~R3中。在本例匯編程序中,寄存器R0中存放第1個(gè)參數(shù),即dststr;寄存器R1中存放第2個(gè)參數(shù),即srcstr。C語(yǔ)言代碼源程序可保存為strtest.c,匯編語(yǔ)言程序是scopy.s。第5章嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)5.8.4匯編程序與C/C++程序的相互調(diào)用2.匯編語(yǔ)言中調(diào)用C語(yǔ)言中定義的函數(shù)
匯編程序的設(shè)計(jì)要遵循ATPCS,保證程序調(diào)用時(shí)參數(shù)的正確傳遞。在匯編程序中使用IMPORT偽操作聲明將要調(diào)用C程序。下面是一個(gè)匯編程序調(diào)用C程序的例子。其中在匯編程序中設(shè)置好各參數(shù)的值。本例中有5個(gè)參數(shù),分別使用寄存器R0存放第一個(gè)參數(shù),R1存放第2個(gè)參數(shù),R2存放第3個(gè)參數(shù),R3存放第4個(gè)參數(shù),第5個(gè)參數(shù)利用數(shù)據(jù)棧傳送。由于利用數(shù)據(jù)棧傳遞參數(shù),在程序調(diào)用結(jié)束后要調(diào)整數(shù)據(jù)棧指針。例5.18匯編語(yǔ)言程序調(diào)用C語(yǔ)言程序//C程序g()返回5個(gè)整數(shù)的和intg(inta,intb,intc,intd,inte){returna+b+c+d+e;};匯編程序調(diào)用C程序g()計(jì)算5個(gè)整數(shù)i,2*i,3*i,4*i,5*i的和EXPORTfAREAf,CODE,READONLYIMPORTg
;使用偽操作數(shù)IMPORT聲明C程序g()STRlr,[sp,#-4]!;保存返回地址ADDr1,r0,r0;假設(shè)進(jìn)入程序f時(shí),r0中的值為i,r1值設(shè)為2*iADDr2,r1,r0;r2的值設(shè)為3*iADDr3,r1,r2;r3的值設(shè)為5*iSTRr3,[s
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 合作伙伴管理數(shù)據(jù)統(tǒng)計(jì)表
- 鋼絲繩施工方案
- 關(guān)于開(kāi)展消防安全培訓(xùn)的正式通知
- HZS拌合站施工方案
- 生產(chǎn)效率提升方案實(shí)戰(zhàn)案例分享
- 樓板隔音涂料施工方案
- js丙綸防水施工方案
- 網(wǎng)絡(luò)維護(hù)技術(shù)操作手冊(cè)
- 季度營(yíng)銷工作計(jì)劃書(shū)
- 東營(yíng)廠區(qū)屏障施工方案
- 報(bào)驗(yàn)申請(qǐng)表模板
- 《中外廣播電視史》課件
- 北京四中英語(yǔ)教學(xué)觀
- 小學(xué)生主題班會(huì) 我能傾聽(tīng)不插嘴 課件(共21張PPT)
- 兒童感覺(jué)統(tǒng)合講座課件
- 采購(gòu)員崗位月度KPI績(jī)效考核表
- 山地光伏施工方案
- 六年級(jí)心理健康ppt名師優(yōu)質(zhì)課獲獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件
- 四川輕化工大學(xué)
- 六西格瑪質(zhì)量管理在口腔科器械管理中的作用
- 高中心理健康教育-認(rèn)識(shí)自我悅納自我教學(xué)課件設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論