機電之家資源網(wǎng)
單片機首頁|單片機基礎|單片機應用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓信息
贊助商
嵌入式C編程技術(四)
嵌入式C編程技術(四)
 更新時間:2008-8-18 14:36:17  點擊數(shù):56
【字體: 字體顏色
ct{ int maxaddr; int end; }*list2; }; statenextprev*list1*list2〖〗 〖〗addr[]name\[0\][]\:[]name\[LEN\ 1\]maxaddr[]end圖4復雜數(shù)據(jù)結構的定義和訪問 下面的程序是訪問圖4數(shù)據(jù)結構的例子。 程序1: 1〖3〗#define uchar unsigned char〖1〗2〖3〗#define uint unsigned int〖1〗3〖3〗#define LEN 10〖1〗4〖1〗5〖3〗struct dat{〖1〗6〖3〗uint state;〖1〗7〖3〗uint next;〖1〗8〖3〗uint prev;〖1〗9〖3〗struct{〖1〗10〖3〗uint addr;〖1〗11〖3〗uchar name\[LEN\];〖1〗12〖3〗}*list;〖1〗13〖3〗};〖1〗14〖3〗〖1〗15〖3〗void func1(struct dat *proc1,struct dat *proc2)〖1〗16〖3〗{〖1〗17〖〗1〖〗uchar i;〖1〗18〖〗1〖〗for(i=0;ilist->name\[i\]=proc2->list->name\[i\];〖1〗20〖〗1〖〗}程序2: 1〖3〗#define uchar unsigned char〖1〗2〖3〗#define uint unsigned int〖1〗3〖3〗#define LEN 10〖1〗4〖1〗5〖3〗struct dat{〖1〗6〖3〗uint state;〖1〗7〖3〗uint next;〖1〗8〖3〗uint prev;〖1〗9〖3〗struct{〖1〗10〖3〗uint addr;〖1〗11〖3〗uchar name\[LEN\];〖1〗12〖3〗}*list;〖1〗13〖3〗};〖1〗14〖1〗15〖3〗void func2(struct dat *proc1,struct dat *proc2)〖1〗16〖3〗{〖1〗17〖〗1〖〗uchar i;〖1〗18〖〗1〖〗uchar *p1,*p2;〖1〗19〖〗1〖〗for(p1=proc1->list->name,p2=proc2->〖1〗20〖〗1〖〗list->name,i=0;i0;i--);〖1〗11〖〗1〖1〗12〖〗1〖〗i=10;〖1〗13〖〗1〖〗while(i--);〖1〗14〖〗1〖1〗15〖〗1〖〗for(j=0;j<10;j++);〖1〗16〖〗1〖〗〖1〗17〖〗1〖〗j=10;〖1〗18〖〗1〖〗while(j--);〖1〗19〖〗1〖〗}; FUNCTION main (BEGIN) ;SOURCE LINE # 6 ;SOURCE LINE # 7 ;SOURCE LINE # 8 0000 E4〖3〗CLRA〖1〗0001 F500〖〗R〖〗MOVi,A〖1〗0003〖〗?C0001:〖1〗0003 E500〖〗R〖〗MOVA,i〖1〗0005 C3〖3〗CLRC〖1〗0006 940A〖3〗SUBBA,#0AH〖1〗0008 5004〖3〗JNC?C0002〖1〗000A 0500〖〗R〖〗INCi〖1〗000C 80F5〖3〗SJMP?C0001〖1〗000E〖〗?C0002:〖〗〖3〗;SOURCE LINE # 10〖1〗000E 75000A〖〗R〖〗MOVi,#0AH〖1〗0011〖〗?C0004:〖1〗0011 E500〖〗R〖〗MOVA,i〖1〗0013 D3〖3〗SETBC〖1〗0014 9400〖3〗SUBBA,#00H〖1〗0016 4004〖3〗JC?C0005〖1〗0018 1500〖〗R〖〗DECi〖1〗001A 80F5〖3〗SJMP?C0004〖1〗001C〖〗?C0005:〖〗〖3〗;SOURCE LINE # 12〖1〗001C 75000A〖〗R〖〗MOVi,#0AH〖1〗001F〖〗?C0007:〖〗〖3〗;SOURCE LINE # 13〖1〗001F AF00〖〗R〖〗MOVR7,i〖1〗0021 1500〖〗R〖〗DECi〖1〗0023 EF〖3〗MOVA,R7〖1〗0024 70F9〖3〗JNZ?C0007〖1〗0026〖〗?C0008:〖〗〖3〗;SOURCE LINE # 15〖1〗0026 E4〖3〗CLRA〖1〗0027 F500〖〗R〖〗MOVj,A〖1〗0029 F500〖〗R〖〗MOVj+01H,A〖1〗002B〖〗?C0009:〖1〗002B C3〖3〗CLRC〖1〗002C E500〖〗R〖〗MOV A,j+01H〖1〗002E 940A〖3〗SUBBA,#0AH〖1〗0030 E500〖〗R〖〗MOV A,j〖1〗0032 9400〖3〗SUBBA,#00H〖1〗0034 500A〖3〗JNC?C0010〖1〗0036 0500〖〗R〖〗INCj+01H〖1〗0038 E500〖〗R〖〗MOVA,j+01H〖1〗003A 7002〖3〗JNZ?C0015〖1〗003C 0500〖〗R〖〗INCj〖1〗003E〖〗?C0015:〖1〗003E 80EB〖3〗SJMP?C0009〖1〗0040〖〗?C0010:〖〗〖3〗;SOURCE LINE # 17〖1〗0040 750000〖〗R〖〗MOVj,#00H〖1〗0043 75000A〖〗R〖〗MOVj+01H,#0AH〖1〗0046〖〗?C0012:〖〗〖3〗;SOURCE LINE # 18〖1〗0046 E500〖〗R〖〗MOVA,j+01H〖1〗0048 1500〖〗R〖〗DECj+01H〖1〗004A AE00〖〗R〖〗MOVR6,j〖1〗004C 7002〖3〗JNZ?C0016〖1〗004E 1500〖〗R〖〗DECj〖1〗0050〖〗?C0016:〖1〗0050 4E〖3〗ORLA,R6〖1〗0051 70F3〖3〗JNZ?C0012〖〗〖3〗;SOURCE LINE # 19〖1〗0053〖〗?C0014:〖1〗0053 22〖3〗RET〖3〗; FUNCTION main (END)從上面程序可以得出結論:應盡可能使用字符型變量,while(i--)循環(huán)的代碼效率要高一些。 4 函數(shù)返回地址的控制 在編寫C程序過程中,有時希望從函數(shù)內(nèi)跳出來,轉到某處執(zhí)行程序。特別是在中斷處理程序中出錯等的情況下,希望提前返回,并且轉到特定的地址。在用匯編語言編制程序時,都知道中斷返回要采用RETI指令。中斷服務程序的最后1條指令必須是RETI,否則從硬件上就不能中斷,再進入其他的中斷服務程序。下面是RETI指令完成的操作: RETI;PC15~8←(SP),SP←SP-1 ;PC7~0←(SP),SP←SP-1 實際上,在C語言中使用堆棧并不神秘,控制返回地址也不復雜。請看下面程序: 1〖3〗#include 〖1〗2〖3〗#define uchar unsigned char〖1〗3〖3〗#define uint unsigned int〖1〗4〖3〗#define SLAVE 2〖1〗5〖1〗6〖3〗void SIOINT(void) interrupt 4 using 1〖1〗7〖3〗{〖1〗8〖〗1〖〗uchar a,i;〖1〗9〖〗1〖〗uchar xdata *data Rbuf;〖1〗10〖〗1〖〗uchar data * data sppt;〖1〗11〖〗1〖1〗12〖〗1〖〗RI=0;〖1〗13〖〗1〖〗ES=0;〖1〗14〖〗1〖〗a=SBUF;〖1〗15〖〗1〖〗if(a!=SLAVE)〖1〗16〖〗1〖〗{ SBUF=0xff;〖1〗17〖〗2〖〗while(TI!=1);TI=0;〖1〗18〖〗2〖〗ES=1;goto retend;〖1〗19〖〗2〖〗}〖1〗20〖〗1〖〗SBUF=a;〖1〗21〖〗1〖〗while(TI!=1);TI=0;〖1〗22〖〗1〖〗while(RI!=1);RI=0;〖1〗23〖〗1〖〗a=SBUF;〖1〗24〖〗1〖〗SM2=0;〖1〗25〖〗1〖〗Rbuf=0;〖1〗26〖〗1〖〗*Rbuf=a;〖1〗27〖〗1〖〗SBUF=0xaa;〖1〗28〖〗1〖〗while(TI!=1);TI=0;〖1〗29〖〗1〖〗for(i=1;i<16;i++)〖1〗30〖〗1〖〗{ while(RI!=1);RI=0;〖1〗31〖〗2〖〗a=SBUF;〖1〗32〖〗2〖〗Rbuf\[i\]=a;〖1〗33〖〗2〖〗SBUF=0xaa;〖1〗34〖〗2〖〗while(TI!=1);TI=0;〖1〗35〖〗2〖〗}〖1〗36〖〗1〖1〗37〖〗1〖〗reti: ES=1;SM2=1;〖1〗38〖〗1〖〗sppt=SP;〖1〗39〖〗1〖〗sppt-=4;〖1〗40〖〗1〖〗*sppt=0x0;sppt--;*sppt=0x0;〖1〗41〖〗1〖〗retend:;〖1〗42〖〗1〖〗} ; FUNCTION SIOINT (BEGIN) 0000 C0E0〖3〗PUSHACC〖1〗0002 C083〖3〗PUSHDPH〖1〗0004 C082〖3〗PUSHDPL〖1〗0006 C0D0〖3〗PUSHPSW〖1〗0008 75D008〖3〗MOVPSW,#08H〖〗[3];SOURCE LINE # 6[3];SOURCE LINE # 12〖1〗000B C298〖3〗CLRRI[3];SOURCE LINE # 13〖1〗000D C2AC〖3〗CLRES[3];SOURCE LINE # 14;\ \ \ \ Variable `a' assigned to Register `R7' \ \ \ \ 000F AF99〖3〗MOVR7,SBUF〖〗[3];SOURCE LINE # 15〖1〗0011 EF〖3〗MOVA,R7〖1〗0012 6402〖3〗XRLA,#02H〖1〗0014 600C〖3〗JZ?C0001〖〗[3];SOURCE LINE # 16〖1〗0016 7599FF〖3〗MOVSBUF,#0FFH〖1〗0019〖〗?C0002:〖〗〖〗[3];SOURCE LINE # 17〖1〗0019 3099FD〖3〗JNBTI,?C0002〖1〗001C〖〗?C0003:〖1〗001C C299〖3〗CLRTI〖〗[3];SOURCE LINE # 18〖1〗001E D2AC〖3〗SETBES〖1〗0020 8056〖3〗SJMP?C0019〖〗[3];SOURCE LINE # 19〖1〗0022〖〗?C0001:〖〗[3];SOURCE LINE # 20〖1〗0022 8F99〖3〗MOVSBUF,R7〖1〗0024〖〗?C0005:〖〗[3];SOURCE LINE # 21〖1〗0024 3099FD〖3〗JNBTI,?C0005〖1〗0027〖〗?C0006:〖1〗0027 C299〖3〗CLRTI〖1〗0029〖〗?C0007:〖〗[3];SOURCE LINE # 22〖1〗0029 3098FD〖3〗JNBRI,?C0007〖1〗002C〖〗?C0008:〖1〗002C C298〖3〗CLRRI〖〗[3];SOURCE LINE # 23〖1〗002E AF99〖3〗MOVR7,SBUF〖〗[3];SOURCE LINE # 24〖1〗0030 C29D〖3〗CLRSM2〖〗[3];SOURCE LINE # 25;\ \ \ \ Variable `Rbuf' assigned to Register `R4/R5' \ \ \ \ 0032 E4〖3〗CLRA〖1〗0033 FD〖3〗MOVR5,A〖1〗0034 FC〖3〗MOVR4,A〖〗[3];SOURCE LINE # 26〖1〗0035 F582〖3〗MOVDPL,A〖1〗0037 F583〖3〗MOVDPH,A〖1〗0039 EF〖3〗MOVA,R7〖1〗003A F0〖3〗MOVX@DPTR,A[3];SOURCE LINE # 27〖1〗003B 7599AA〖3〗MOVSBUF,#0AAH〖1〗003E〖〗?C0009:〖〗[3];SOURCE LINE # 28〖1〗003E 3099FD〖3〗JNBTI,?C0009〖1〗0041〖〗?C0010:〖1〗0041 C299〖3〗CLRTI〖〗[3];SOURCE LINE # 29;\ \ \ \ Variable `i ' assigned to Register `R6' \ \ \ \ 0043 7E01〖3〗MOVR6,#01H〖1〗0045〖〗?C0011:〖1〗0045 EE〖3〗MOVA,R6〖1〗0046 C3〖3〗CLRC〖1〗0047 9410〖3〗SUBBA,#010H〖1〗0049 501C〖3〗JNCreti〖〗[3];SOURCE LINE # 30〖1〗004B〖〗?C0014:〖1〗004B 3098FD〖3〗JNBRI,?C0014〖1〗004E〖〗?C0015:〖1〗004E C298〖3〗CLRRI〖〗[3];SOURCE LINE # 31〖1〗0050 AF99〖3〗MOVR7,SBUF〖〗[3];SOURCE LINE # 32〖1〗0052 ED〖3〗MOVA,R5〖1〗0053 2E〖3〗ADDA,R6〖1〗0054 F582〖3〗MOVDPL,A〖1〗0056 E4〖3〗CLRA〖1〗0057 3C〖3〗ADDCA,R4〖1〗0058 F583〖3〗MOVDPH,A〖1〗005A EF〖3〗MOVA,R7〖1〗005B F0〖3〗MOVX@DPTR,A〖〗[3];SOURCE LINE # 33〖1〗005C 7599AA〖3〗MOV SBUF,#0AAH〖1〗005F〖〗?C0016:〖〗[3];SOURCE LINE # 34〖1〗005F 3099FD〖3〗JNBTI,?C0016〖1〗0062〖〗?C0017:〖1〗0062 C299〖3〗CLRTI〖〗[3];SOURCE LINE # 35〖1〗0064 0E〖3〗INCR6〖1〗0065 80DE〖3〗SJMP?C0011〖〗[3];SOURCE LINE # 37〖1〗0067〖〗reti:〖1〗0067 D2AC〖3〗SETBES〖1〗0069 D29D〖3〗SETBSM2〖〗[3];SOURCE LINE # 38〖1〗006B AF81〖3〗MOV R7,SP;\ \ \ \ Variable `sppt' assigned to Register `R7' \ \ \ \ ;SOURCE LINE # 39 006D 74FC〖3〗MOVA,#0FCH〖1〗006F 2F〖3〗ADDA,R7〖1〗0070 FF〖3〗MOVR7,A〖〗[3];SOURCE LINE # 40〖1〗0071 F8〖3〗MOVR0,A〖1〗0072 E4〖3〗CLRA〖1〗0073 F6〖3〗MOV@R0,A〖1〗0074 1F〖3〗DECR7〖1〗0075 A80F〖3〗MOVR0,AR7〖1〗0077 F6〖3〗MOV@R0,A〖〗[3];SOURCE LINE # 41〖1〗0078〖〗retend:〖〗[3];SOURCE LINE # 42〖1〗0078〖〗?C0019:〖1〗0078 D0D0〖3〗POPPSW〖1〗007A D082〖3〗POPDPL〖1〗007C D083〖3〗POPDPH〖1〗007E D0E0〖3〗POPACC〖1〗0080 32〖3〗RETI; FUNCTION SIOINT (END) 上面的程序是1個多機通信的中斷服務程序,從機的地址用“SLAVE”定義。從機地址和功能字節(jié)第9位為1,后跟15個字節(jié)的數(shù)據(jù),功能字節(jié)和數(shù)據(jù)接收到后放入到“Rbuf\[ \]”數(shù)組中。服務程序的正常返回處是“retend:”,若出錯就可以跳到“reti:”處,然后返回到0000H開始重新執(zhí)行程序。值得注意的是:處理堆棧時,使用了“sppt\ =4;”,這是由于在中斷服務程序入口處用了4條“PUSH”指令向堆棧中壓入4個字節(jié)內(nèi)容保護現(xiàn)場。 “*sppt=0x0;sppt\ \ ;*sppt=0x0;”語句是修改堆棧中的內(nèi)容以備中斷返回的“RETI”指令使用。在中斷服務程序中是不可以輕易跳出的,因而這是1個非常重要的嵌入式C編程技巧。 (待續(xù))
  • 上一篇: 針對FPGA實現(xiàn)安全的系統(tǒng)內(nèi)編程功能
  • 下一篇: 嵌入式C編程技術(五)
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關文章
    網(wǎng)友評論:(只顯示最新5條。)
    關于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發(fā)消息66821730(技術支持)點擊這里給我發(fā)消息66821730(廣告投放) 點擊這里給我發(fā)消息41031197(編輯) 點擊這里給我發(fā)消息58733127(審核)
    本站提供的機電設備,機電供求等信息由機電企業(yè)自行提供,該企業(yè)負責信息內(nèi)容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯(lián)系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術支持

    主辦:杭州市高新區(qū)(濱江)機電一體化學會
    中國行業(yè)電子商務100強網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1