加嵌入式C語言概述市公開課一等獎省賽課獲獎?wù)n件_第1頁
加嵌入式C語言概述市公開課一等獎省賽課獲獎?wù)n件_第2頁
加嵌入式C語言概述市公開課一等獎省賽課獲獎?wù)n件_第3頁
加嵌入式C語言概述市公開課一等獎省賽課獲獎?wù)n件_第4頁
加嵌入式C語言概述市公開課一等獎省賽課獲獎?wù)n件_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

嵌入式C語言概述加嵌入式C語言概述第1頁引入變量定義時機加嵌入式C語言概述第2頁for(loop=1;loop<=limit;loop++)

for(loop=limit;loop!=0;loop--)加嵌入式C語言概述第3頁目錄任務(wù)和模塊中止服務(wù)程序數(shù)據(jù)指針數(shù)據(jù)指針函數(shù)指針動態(tài)內(nèi)存申請關(guān)鍵字volatile加嵌入式C語言概述第4頁多任務(wù)還是單任務(wù)

(1)從CPU復(fù)位時指定地址開始執(zhí)行;

(2)跳轉(zhuǎn)至匯編代碼startup處執(zhí)行;

(3)跳轉(zhuǎn)至用戶主程序main執(zhí)行,在main中完成:

a.初試化各硬件設(shè)備;

b.初始化各軟件模塊;

c.進入死循環(huán)(無限循環(huán)),調(diào)用各模塊處理函數(shù)加嵌入式C語言概述第5頁模塊劃分

(1)模塊即是一個.c文件和一個.h文件結(jié)合,頭文件(.h)中是對于該模塊接口申明;

(2)某模塊提供給其它模塊調(diào)用外部函數(shù)及數(shù)據(jù)需在.h漢字件中冠以extern關(guān)鍵字申明;

(3)模塊內(nèi)函數(shù)和全局變量需在.c文件開頭冠以static關(guān)鍵字申明;

(4)永遠不要在.h文件中定義變量!定義變量和申明變量區(qū)分在于定義會產(chǎn)生內(nèi)存分配操作一個嵌入式系統(tǒng)通常包含兩類模塊:

(1)硬件驅(qū)動模塊,一個特定硬件對應(yīng)一個模塊;

(2)軟件功效模塊,其模塊劃分應(yīng)滿足低偶合、高內(nèi)聚要求加嵌入式C語言概述第6頁/*module1.h*/

inta=5;/*在模塊1.h文件中定義inta*/

/*module1.c*/

#include"module1.h"/*在模塊1中包含模塊1.h文件*/

/*module2.c*/

#include"module1.h"/*在模塊2中包含模塊1.h文件*/

/*module3.c*/

#include"module1.h"/*在模塊3中包含模塊1.h文件*/加嵌入式C語言概述第7頁/*module1.h*/

externinta;/*在模塊1.h文件中申明inta*/

/*module1.c*/

#include"module1.h"/*在模塊1中包含模塊1.h文件*/

inta=5;/*在模塊1.c文件中定義inta*/

/*module2.c*/

#include"module1.h"/*在模塊2中包含模塊1.h文件*/

/*module3.c*/

#include"module1.h"/*在模塊3中包含模塊1.h文件*/加嵌入式C語言概述第8頁中止服務(wù)程序

__interrupt、#programinterrupt等中止服務(wù)程序需要滿足以下要求:

(1)不能返回值;

(2)不能向ISR傳遞參數(shù);

(3)ISR應(yīng)該盡可能短小精悍;

(4)printf(char*lpFormatString,…)函數(shù)會帶來重入和性能問題,不能在ISR中采取。加嵌入式C語言概述第9頁一個硬件驅(qū)動模塊通常應(yīng)包含以下函數(shù):

(1)中止服務(wù)程序ISR

(2)硬件初始化

a.修改存放器,設(shè)置硬件參數(shù)(如UART應(yīng)設(shè)置其波特率,AD/DA設(shè)備應(yīng)設(shè)置其采樣速率等);

b.將中止服務(wù)程序入口地址寫入中止向量表:

/*設(shè)置中止向量表*/

m_myPtr=make_far_pointer(0l);/*返回voidfar型指針voidfar**/

m_myPtr+=ITYPE_UART;/*ITYPE_UART:uart中止服務(wù)程序*/

/*相對于中止向量表首地址偏移*/

*m_myPtr=&UART_Isr;/*UART_Isr:UART中止服務(wù)程序*/加嵌入式C語言概述第10頁

(3)設(shè)置CPU針對該硬件控制線

a.假如控制線可作PIO(可編程I/O)和控制信號用,則設(shè)置CPU內(nèi)部對應(yīng)存放器使其作為控制信號;

b.設(shè)置CPU內(nèi)部針對該設(shè)備中止屏蔽位,設(shè)置中止方式(電平觸發(fā)還是邊緣觸發(fā))。

(4)提供一系列針對該設(shè)備操作接口函數(shù)。比如,對于LCD,其驅(qū)動模塊應(yīng)提供繪制像素、畫線、繪制矩陣、顯示字符點陣等函數(shù);而對于實時鐘,其驅(qū)動模塊則需提供獲取時間、設(shè)置時間等函數(shù)。加嵌入式C語言概述第11頁unsignedchar*p=(unsignedchar*)0xF000FF00;

*p=11;int*p=(int*)0xF000FF00;longint*p=(longint*)0xF000FF00;數(shù)據(jù)指針

加嵌入式C語言概述第12頁typedefvoid(*lpFunction)();/*定義一個無參數(shù)、無返回類型*/

/*函數(shù)指針類型*/

lpFunctionlpReset=(lpFunction)0xF000FFF0;/*定義一個函數(shù)指針,指向*/

/*CPU開啟后所執(zhí)行第一條指令位置*/

lpReset();/*調(diào)用函數(shù)*/

函數(shù)指針

加嵌入式C語言概述第13頁數(shù)組vs.動態(tài)申請

在嵌入式系統(tǒng)中動態(tài)內(nèi)存申請存在比普通系統(tǒng)編程時更嚴格要求,這是因為嵌入式系統(tǒng)內(nèi)存空間往往是十分有限,不經(jīng)意內(nèi)存泄露會很快造成系統(tǒng)瓦解。

所以一定要確保你malloc和free成對出現(xiàn),誰申請,就由誰釋放加嵌入式C語言概述第14頁char*p=malloc(…);

if(p==NULL)

…;

function(p);

free(p);

p=NULL;

而函數(shù)function則接收參數(shù)p,以下:

voidfunction(char*p)

{

…/*一系列針對p操作*/

}加嵌入式C語言概述第15頁關(guān)鍵字volatile

inta,b,c;

a=inWord(0x100);/*讀取I/O空間0x100端口內(nèi)容存入a變量*/

b=a;

a=inWord(0x100);/*再次讀取I/O空間0x100端口內(nèi)容存入a變量*/

c=a;inta,b,c;

a=inWord(0x100);/*讀取I/O空間0x100端口內(nèi)容存入a變量*/

b=a;

c=a;volatileinta;加嵌入式C語言概述第16頁volatile變量可能用于以下幾個情況:

(1)并行設(shè)備硬件存放器(如:狀態(tài)存放器,例中代碼屬于這類);

(2)一個中止服務(wù)子程序中會訪問到非自動變量(也就是全局變量);

(3)多線程應(yīng)用中被幾個任務(wù)共享變量。加嵌入式C語言概述第17頁1使用宏定義

在C語言中,宏是產(chǎn)生內(nèi)嵌代碼唯一方法。#defineMIN(A,B)((A)<=(B)?(A):(B))//為何使用宏,不用函數(shù)?2使用存放器變量

register是一個"提議"型關(guān)鍵字3內(nèi)嵌匯編

_asm{}其它慣用伎倆加嵌入式C語言概述第18頁4利用硬件特征

CPU內(nèi)部RAM>外部同時RAM>外部異步RAM>FLASH/ROM

5活用位操作

/*方法1*/

inti,j;

i=879/16;

j=562%32;

/*方法2*/

inti,j;

i=879>>4;

j=562-(562>>5<<5);加嵌入式C語言概述第19頁#defineINT_I2_MASK0x0040

wTemp=inword(INT_MASK);

outword(INT_MASK,wTemp&~INT_I2_MASK);#defineINT_I2_MASK0x0040

wTemp=inword(INT_MASK);

outword(INT_MASK,wTemp|INT_I2_MASK);#defineINT_I2_MASK0x0040

wTemp=inword(INT_MASK);

if(wTemp&INT_I2_MASK)

{

…/*該位為1*/

}加嵌入式C語言概述第20頁其它常見問題漢字和圖形顯示菜單處理動畫處理鍵盤處理時間處理加嵌入式C語言概述第21頁IIARM中C和匯編混合編程1.匯編舉例2.ARM程序組織3.在C語言中內(nèi)嵌匯編5在C中調(diào)用匯編函數(shù)4.在匯編中使用C定義全局變量6.在匯編中調(diào)用C函數(shù)

加嵌入式C語言概述第22頁

AREAinit,CODE,READONLYCODE32Mode_USREQU0x10;CPSR中各種處理器模式對應(yīng)控制位I_BitEQU0x80;CPSR中中止禁止位F_BitEQU0x40USR_StackEQU0x00203000;定義RAM最高地址,無重映射ENTRYBInitReset;0x00ResethandlerundefvecBundefvec;0x04UndefinedInstructionswivecBswivec;0x08SoftwareInterruptpabtvecBpabtvec;0x0CPrefetchAbortdabtvecBdabtvec;0x10DataAbortrsvdvecBrsvdvec;0x14reservedirqvecBirqvec;0x18IRQfiqvecBfiqvec;0x1cFIQInitReset MSRCPSR_c,#Mode_USR|I_Bit|F_Bit;改成用戶模式且禁止IRQ和FIQ中止 LDRSP,=USR_Stack

BLX__main;跳轉(zhuǎn)到__main執(zhí)行,它例2加嵌入式C語言概述第23頁加嵌入式C語言概述第24頁加嵌入式C語言概述第25頁3.在C語言中內(nèi)嵌匯編

內(nèi)嵌匯編使用標識是__asm或者asm關(guān)鍵字,使用方法以下:__asm{instruction[;instruction]…[instruction]}asm(“instruction[;instruction]”);加嵌入式C語言概述第26頁內(nèi)嵌匯編注意點a.不能直接向PC存放器賦值,程序跳轉(zhuǎn)要使用B或者BL指令b.在使用物理存放器時,不要使用過于復(fù)雜C表示式,防止物理存放器沖突c.R12和R13可能被編譯器用來存放中間編譯結(jié)果,計算表示式值時可能將R0到R3、R12及R14用于子程序調(diào)用,所以要防止直接使用這些物理存放器d.普通不要直接指定物理存放器,而讓編譯器進行分配加嵌入式C語言概述第27頁#include<stdio.h>voidmy_strcpy(constchar*src,char*dest){charch;__asm{loop:ldrbch,[src],#1strbch,[dest],#1cmpch,#0bneloop}}intmain(){char*a="forgetitandmoveon!";charb[64];my_strcpy(a,b);printf("original:%s",a);printf("copyed:%s",b);return0;}內(nèi)嵌匯編舉例C和匯編之間值傳遞是用C指針來實現(xiàn),因為指針對應(yīng)是地址,所以匯編中也能夠訪問。加嵌入式C語言概述第28頁4在匯編中使用C定義全局變量

/*cfile.c*定義全局變量,并作為主調(diào)程序*/#include<stdio.h>intgVar_1=12;externasmDouble(void);intmain(){printf("originalvalueofgVar_1is:%d",gVar_1);asmDouble();printf("modifiedvalueofgVar_1is:%d",gVar_1);return0;};calledbymain(inC),todoubleaninteger,aglobalvardefinedinCisused.AREAasmfile,CODE,READONLYEXPORTasmDoubleIMPORTgVar_1asmDoubleldrr0,=gVar_1ldrr1,[r0]movr2,#2mulr3,r1,r2strr3,[r0]movpc,lrEND加嵌入式C語言概述第29頁5在C中調(diào)用匯編函數(shù)

一是在C中申明函數(shù)原型,并加extern關(guān)鍵字;二是在匯編中用EXPORT導(dǎo)出函數(shù)名,并用該函數(shù)名作為匯編代碼段標識,最終用movpc,lr返回。然后,就能夠在C中使用該函數(shù)了加嵌入式C語言概述第30頁例:在C中調(diào)用匯編函數(shù)/*cfile.c*inC,callanasmfunction,asm_strcpy*Sep9,*/#include<stdio.h>externvoidasm_strcpy(constchar*src,char*dest);intmain(){constchar*s="seasonsinthesun";chard[32];asm_strcpy(s,d);printf("source:%s",s);printf("destination:%s",d);return0;};asmfunctionimplementationAREAasmfile,CODE,READONLYEXPORTasm_strcpyasm_strcpyloopldrbr4,[r0],#1;addressincrementafterreadcmpr4,#0beqoverstrbr4,[r1],#1bloopovermovpc,lrEND加嵌入式C語言概述第31頁ATPCS(ARMThumbProcedureCallStandard)C和匯編之間參數(shù)傳遞是經(jīng)過ATPCS(ARMThumbProcedureCallStandard)要求來進行。簡單說就是假如函數(shù)有不多于四個參數(shù),對應(yīng)用R0-R3來進行傳遞,多于4個時借助棧,函數(shù)返回值經(jīng)過R0來返回。ATPCS是基于arm指令集和thumb指令集過程調(diào)用規(guī)范。加嵌入式C語言概述第32頁ATPCS存放器使用規(guī)則

存放器使用必須滿足下面規(guī)則:

1.子程序間經(jīng)過存放器R0R3來傳遞參數(shù),這時,存放器R0R3能夠記作A1-A4。被調(diào)用子程序在返回前無需恢復(fù)存放器R0-R3內(nèi)容。

2.在子程序中,使用存放器R4R11來保留局部變量.這時,存放器R4-R11能夠記作V1-V8。假如在子程序中使用到了存放器V1-V8中一些存放器,子程序進入時必須保留這些存放器值,在返回前必須恢復(fù)這些存放器值;對于子程序中沒有用到存放器則無須進行這些操作。在Thumb程序中,通常只能使用存放器R4-R7來保留局部變量。

3.存放器R12用作子程序間

溫馨提示

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

評論

0/150

提交評論