《智能光電系統設計》課件 項目5 嵌入式C語言_第1頁
《智能光電系統設計》課件 項目5 嵌入式C語言_第2頁
《智能光電系統設計》課件 項目5 嵌入式C語言_第3頁
《智能光電系統設計》課件 項目5 嵌入式C語言_第4頁
《智能光電系統設計》課件 項目5 嵌入式C語言_第5頁
已閱讀5頁,還剩12頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

項目5嵌入式C語言任務目標1、通過對嵌入式C語言的學習,溫習C語言基本語法,并了解嵌入式C語言的若干要點。2、學會分析程序的執行過程,進而理解嵌入式C語言的普通C語言的區別,即嵌入式C語言需要驅動硬件,因此更多地處于往復循環過程中。5.1數據類型在C語言中有int、char、float等數據類型,在嵌入式程序編寫時,這些數據類型依然可用,不過嵌入式C語言中,對正整數做了一些特殊的定義,如uint8_t、uint16_t、uint32_t等,uint8_t表示8位的無符號字符型數據,可從0取到0xFF,uint16_t表示16位的無符號字符型數據,可從0取到0xFFFF,uint32_t表示32位的無符號字符型數據,可從0取到0xFFFFFFFF。舉例來說,如果寫定義一個名為n1的變量,可寫:uint8_tn1=0xFF;但是,如果uint8_tn1=0xFFF;在編譯時會有警告,因為uint8_t的最大值是0xFF,0XFFF已經超過其取值范圍。在有些系統中,也有用U8、U16、U32分別表示8位、16位、32位無符號字符型數據的。uint16_t比uint8_t多占用了1倍的存儲空間,因此在編寫程序時,可依據數據的大小選用不同的數據長度來定義。5.2結構體5.2.1C語言中的結構體結構體是C語言中的一種數據類型,是由不同類型的數據組合成的一個整體,這些組合在一個整體中的數據是互相聯系的,這樣的數據結構稱為結構體。舉例來說:structdate//聲明一個結構體類型{intyear;intmonth;intday;}data是一個結構體,也是一種數據類型,其中的三個成員用來表示年、月、日,具有明顯的共性聯系。5.2.1C語言中的結構體再舉例來說:

structstudent{intnum;charname[20];charsex;intage;structdatebirthday;charaddr[30];}student1,student2;student是一個結構體類型,其中的一個成員是structdatebirthday;這個成員本身也是一個data類型的結構體,結構體變量名是birthday。student1和student2是student類型的結構體變量。成員的賦值方式舉例如下:student1.num=10010;student1.birthday.month=7;此時,如果再定義一個指針變量p,指向結構體student,即structstudent*p;5.2.1C語言中的結構體再舉例來說:

structstudent{intnum;charname[20];charsex;intage;structdatebirthday;charaddr[30];}student1,student2;此時,如果再定義一個指針變量p,指向結構體student,即structstudent*p;則可以通過指針p給結構體變量student1或student2賦值。方法如下:p=&student1;(*p).num=10011;等價于student1.num=10011;在C語言中,為了使用方便和使之直觀,可以把(*p).num改用p->num來代替,它表示*p所指向的結構體變量中的num成員,同樣,(*p).name等價于p->name。5.2.2嵌入式語句中的結構體舉例嵌入式系統中大量用到結構體,在使用時,也可以把其看成一種特殊的數據類型。比如typedefstruct{__IOuint32_tCRL;__IOuint32_tCRH;__IOuint32_tIDR;__IOuint32_tODR;

__IOuint32_tBSRR;__IOuint32_tBRR;__IOuint32_tLCKR;}GPIO_TypeDef;就是定義了一個名為GPIO_TypeDef的結構體,其含有CRL等7個成員。5.2.2嵌入式語句中的結構體舉例#defineGPIOA_BASE(APB2PERIPH_BASE+0x00000800UL)語句表示將GPIOA端口的地址賦給GPIOA_BASE。#defineGPIOA((GPIO_TypeDef*)GPIOA_BASE)語句中,((GPIO_TypeDef*)GPIOA_BASE)表示將GPIOA_BASE強轉換為指針類型的結構體,而整句表示用GPIOA替代(GPIO_TypeDef*)GPIOA_BASE。那么現在GPIOA就表示以GPIOA_BASE為基地址、類型為GPIO_TypeDef結構體的一個指針,所以程序里可以用GPIOA->CRL=……等給成員賦值。如果沒有指向,單純用GPIO_TypeDef->ODR=……賦值沒有任何意義,因為并沒有明確的指向。

5.3順序、循環與選擇C語言的語句執行有順序、循環、選擇三種次序。下面以某個程序段為例來說明。程序如下:5.3順序、循環與選擇順序語句:語句2-3,語句5-7均是順序執行的語句,如果持續執行到這里,則按照從上到下的順序依次執行。循環語句:while(a>b){…….}是一個while循環,如果a>b一直成立,則此while循環會一直循環下去,即一直會執行HAL_GPIO_ReadPin、HAL_GPIO_WritePin等函數。出了while外,還有for循環、do{……}while循環等。選擇語句:if(key_value==0){……}/else{……}語句是一個選擇語句,在執行完HAL_GPIO_ReadPin函數后,if和else只能二選一,即要么執行語句2-4,要么執行語句5-7。5.4程序執行過程分析、中斷如前所述的while(a>b){…….}循環,在實際應用中,往往寫成while(1){…….},即將比較的結果直接設定為1,即永遠為真。進入這個循環后,就是進入一個無窮循環,或者說會一直循環下去的循環。嵌入式系統還有一種機制,叫中斷,中斷后,可以離開此while(1){…….}循環而去做其他的事情。能夠引起中斷的因素有定時器計數溢出、外部中斷、串口中斷等。當有若干個中斷事件同時出現時,優先級較高的中斷優先處理;高優先級的中斷會打斷低優先級的中斷去執行。5.5指針、函數指針、指針函數指針。指針是C語言中的一個重要概念及其特點,也是掌握C語言比較困難的部分。指針也就是內存地址,指針變量是用來存放內存地址的變量,在同一CPU構架下,不同類型的指針變量所占用的存儲單元長度是相同的,而存放數據的變量因數據的類型不同,所占用的存儲空間長度也不同。有了指針以后,不僅可以對數據本身,也可以對存儲數據的變量地址進行操作。指針運算符*。指針運算符*的功能是取指針變量所指向地址中的內容,與取地址運算符&的運算是互逆的,它是單目運算符。指針運算符的運算對象必須是地址,可以是已賦值的指針變量,也可以是變量或數組元素的地址,但不能是整數,也不能是非地址型的變量。運算結果就是地址對應的變量。取地址運算符&。取地址運算符&的功能是取變量的地址,它是單目運算符。取地址運算符的運算對象必須是已經定義的變量或數組元素,但不能是數組名。運算結果是運算對象的地址。5.5.1指針的聲明指針的標識是*號,指針的聲明舉例如下:int*p;//聲明一個int類型的指針pchar*p//聲明一個char類型的指針pint*arr[10]//聲明一個指針數組,該數組有10個元素,其中每個元素都是一個指向int類型對象的指針int(*arr)[10]//聲明一個數組指針,該指針指向一個int類型的一維數組int**p;//聲明一個指針p,該指針指向一個int類型的指針5.5.2指針函數指針函數:顧名思義,它的本質是一個函數,不過它的返回值是一個指針。其聲明的形式如下所示:ret*func(args,...);其中,func是一個函數,args是形參列表,ret*作為一個整體,是func函數的返回值,是一個指針的形式5.5.3函數指針與指針函數不同,函數指針的本質是一個指針,該指針的地址指向了一個函數,所以它是指向函數的指針。函數的定義是存在于代碼段,因此,每個函數在代碼段中,也有著自己的入口地址,函數指針就是指向代碼段中函數入口地址的指針。其聲明形式如下所示:ret(*p)(args,...);其中,ret為返回值,*p作為一個整體,代表的是指向該函數的指

溫馨提示

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

評論

0/150

提交評論