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

下載本文檔

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

文檔簡介

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

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

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

(2)跳轉至匯編代碼startup處執行;

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

a.初試化各硬件設備;

b.初始化各軟件模塊;

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

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

(2)某模塊提供給其它模塊調用外部函數及數據需在.h漢字件中冠以extern關鍵字申明;

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

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

(1)硬件驅動模塊,一個特定硬件對應一個模塊;

(2)軟件功效模塊,其模塊劃分應滿足低偶合、高內聚要求加嵌入式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頁中止服務程序

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

(1)不能返回值;

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

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

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

(1)中止服務程序ISR

(2)硬件初始化

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

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

/*設置中止向量表*/

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

m_myPtr+=ITYPE_UART;/*ITYPE_UART:uart中止服務程序*/

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

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

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

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

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

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

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

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

/*函數指針類型*/

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

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

lpReset();/*調用函數*/

函數指針

加嵌入式C語言概述第13頁數組vs.動態申請

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

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

if(p==NULL)

…;

function(p);

free(p);

p=NULL;

而函數function則接收參數p,以下:

voidfunction(char*p)

{

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

}加嵌入式C語言概述第15頁關鍵字volatile

inta,b,c;

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

b=a;

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

c=a;inta,b,c;

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

b=a;

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

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

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

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

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

register是一個"提議"型關鍵字3內嵌匯編

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

CPU內部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語言中內嵌匯編5在C中調用匯編函數4.在匯編中使用C定義全局變量6.在匯編中調用C函數

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

AREAinit,CODE,READONLYCODE32Mode_USREQU0x10;CPSR中各種處理器模式對應控制位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;跳轉到__main執行,它例2加嵌入式C語言概述第23頁加嵌入式C語言概述第24頁加嵌入式C語言概述第25頁3.在C語言中內嵌匯編

內嵌匯編使用標識是__asm或者asm關鍵字,使用方法以下:__asm{instruction[;instruction]…[instruction]}asm(“instruction[;instruction]”);加嵌入式C語言概述第26頁內嵌匯編注意點a.不能直接向PC存放器賦值,程序跳轉要使用B或者BL指令b.在使用物理存放器時,不要使用過于復雜C表示式,防止物理存放器沖突c.R12和R13可能被編譯器用來存放中間編譯結果,計算表示式值時可能將R0到R3、R12及R14用于子程序調用,所以要防止直接使用這些物理存放器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;}內嵌匯編舉例C和匯編之間值傳遞是用C指針來實現,因為指針對應是地址,所以匯編中也能夠訪問。加嵌入式C語言概述第28頁4在匯編中使用C定義全局變量

/*cfile.c*定義全局變量,并作為主調程序*/#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中調用匯編函數

一是在C中申明函數原型,并加extern關鍵字;二是在匯編中用EXPORT導出函數名,并用該函數名作為匯編代碼段標識,最終用movpc,lr返回。然后,就能夠在C中使用該函數了加嵌入式C語言概述第30頁例:在C中調用匯編函數/*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和匯編之間參數傳遞是經過ATPCS(ARMThumbProcedureCallStandard)要求來進行。簡單說就是假如函數有不多于四個參數,對應用R0-R3來進行傳遞,多于4個時借助棧,函數返回值經過R0來返回。ATPCS是基于arm指令集和thumb指令集過程調用規范。加嵌入式C語言概述第32頁ATPCS存放器使用規則

存放器使用必須滿足下面規則:

1.子程序間經過存放器R0R3來傳遞參數,這時,存放器R0R3能夠記作A1-A4。被調用子程序在返回前無需恢復存放器R0-R3內容。

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

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

溫馨提示

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

評論

0/150

提交評論