應(yīng)用軟件iccavr使用說明_第1頁
應(yīng)用軟件iccavr使用說明_第2頁
應(yīng)用軟件iccavr使用說明_第3頁
應(yīng)用軟件iccavr使用說明_第4頁
應(yīng)用軟件iccavr使用說明_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

ICCAVR翻 方法一a 打開我的電腦雙擊光盤中文件SETUP.EXE按照屏幕提示選定一個安裝路徑后進(jìn)行安裝方法二a 在開始菜單中選擇運行項目在運行框中填入按確定鍵開始安裝按上述方法進(jìn)行安裝后得到的是一個只可以使用30天的未版對正式版 ICCAVR正式版分標(biāo)準(zhǔn)版和專業(yè)版在標(biāo)準(zhǔn)版中有一些功能限制如 壓縮工程和文件的配置檢查在標(biāo)準(zhǔn)版中不可以使用30天的用戶可以這樣啟動ICCAVR編譯器的集成環(huán)境IDE將正式版中附帶的一張名稱為UnlockDiskIDE的Help菜單中尋找標(biāo)題為ImportingaLicensefromaFloppy的一項并且進(jìn)行單擊 ICCAVR軟件自動進(jìn)行當(dāng)完成后會提示你文件已從軟盤移走當(dāng)你確定并再次重新啟動ICCAVR后會發(fā)現(xiàn)軟件已經(jīng)完成30天的用戶可這樣對這類用戶在程序啟動時已不能進(jìn)入IDE環(huán)境而是出現(xiàn)一個提示你的框你應(yīng)該選擇YES 這時會出現(xiàn)一個框框上有一個標(biāo)題為ImportingaLicensefromaFloppyDisk的按鈕 將正式版中附帶的一張名稱為UnlockDisk的軟盤插入你機(jī)器的軟盤驅(qū)動器中單擊上一步中提到的按鈕 ICCAVR軟件自動進(jìn)行 當(dāng)你確定并再次重新啟動ICCAVR后會發(fā)現(xiàn)軟件已經(jīng)完成注UnlockDisk軟盤在時應(yīng)打開寫保護(hù)否則無法完成完成后UnlockDisk軟盤成為一張空盤不可以在另一臺機(jī)器上進(jìn)行 位置時應(yīng)該首先在 菜單中選擇YourLicensetoaFloppyDisk一項 文件傳送到一張軟盤上然二ICCAVRImageCraft的ICCAVR是一種使用符合ANSI標(biāo)準(zhǔn)的C語言來開發(fā)微控制器ICCAVR是一個綜合了編輯器和工程管理器的集成工作環(huán)境IDE其可源文件全部被組織到工程之中文件的編輯和工程的構(gòu)筑也在這個環(huán)境中完成編譯錯誤顯示在狀態(tài)窗口中并且當(dāng)你用鼠標(biāo)單擊編譯錯誤時光標(biāo)會自動跳轉(zhuǎn)到編輯窗口中引起INHEX格式文件INHEX格式文件可被大多數(shù)的編程器所支持用于程序到中去ICCAVR32位的程序支持長文件名CICCAVR所必須具備的知識因此要求讀者在閱讀本說明書之前應(yīng)對C語言有了一定程度的理解文件類型是由它們的擴(kuò)展名決定的IDE和編譯器可以使用以下幾種類型的文件 C C.prj擴(kuò)展名----表示是工程文件這個文件保存由IDE所創(chuàng)建和修改的一個工程的有.a擴(kuò)展名----庫文件它可以由幾個庫封裝在一起libcavr.aC的庫和AVR特殊程序調(diào)用的基本庫如果庫被器會將其到您的模塊或文件中 C.o由匯編文件匯編產(chǎn)生的目標(biāo)文件多個目標(biāo)文件可以成一個可執(zhí)行文.hexINHEX格式文件其中包含了程序的機(jī)器代.eep HEX格式文件包含了EEPROM的初始.cofCOFF格式輸出文件用于ATMELAvrStudio環(huán)境下進(jìn)行程序調(diào)試 .cmdNoICE2.xx NoICE3.xx ImageCraft 這個附注必須在函數(shù)之前定義它說明函數(shù)func1func2是中斷操作函數(shù) 器在中斷操作函數(shù)中生成中斷返回指令reti來代替普通返回指令ret并且保存和恢復(fù)函數(shù)所使用的全部寄存器同樣編譯器根據(jù)中斷向量號vectornumber生成中斷向量地址 k<func1><func2>...這個附注指定了函數(shù)不生成揮發(fā)寄存器來保存和恢復(fù)代碼它的典型應(yīng)用是在#pragma#pragma改變數(shù)據(jù)段名稱使其與命令行選項相適應(yīng)這個附注在分配全局變量至中時必須被使用讀者可參考EEPROM的例子#pragmaabs_address:<address>函數(shù)與全局?jǐn)?shù)據(jù)不使用浮動定位重定位而是從<address>開始分配絕對地址#pragmaC++ 你可以在你的源代碼中使用C//類型的注釋 你可以使用0b<1|0>*來指定二進(jìn)制常數(shù)例如0b10101等于十進(jìn)制數(shù)21你可以使用asm("string")函數(shù)來指定匯編代 IARCAVRCIAR編譯系統(tǒng)轉(zhuǎn)換到ImageCraft編譯系統(tǒng)時絕大多數(shù)符合ANSIC標(biāo)準(zhǔn)的程序代碼不需要轉(zhuǎn)換IARCIO寄存器的定義與ICCAVR也是相同的中斷操作描述ICCAVRpragmaIAR引入了語法擴(kuò)充interrupt關(guān)鍵字下面是一個對照#pragmainterrupt_handlerfunc:4//4是這個中斷的向量號func在IAR中interrupt[vector_name]func()//vector_name是某一個中斷向量的名稱IARC的中斷向量地址使用中斷名稱來代替以增加程序的可讀性IAR引入flash關(guān)鍵字將項目分配進(jìn)入程序存貯空間FLASH存貯器ICCAVR使const關(guān)鍵字來達(dá)到相同的目的數(shù)匯編宏等IAR不支持匯編符號而ICCAVR支持匯三ICCAVR自你啟動IDE后首先從Project菜單系統(tǒng)選擇Open命令進(jìn)入\icc\examples.avr目錄并且選擇并打開led 工程工程管理器顯示在這個工程中只有一個文件led.c 后從Project菜單中選擇Options命令打開工程編譯選項在"Target"標(biāo)號下選擇目標(biāo)處理器然后從Project菜單中選擇MakeProject命令I(lǐng)DE將調(diào)用編譯器編譯這個工程文件如果沒有錯誤在與源文件同一個在這個例子中是\icc\examples.avr中輸出一led.hexINHEX格式大多數(shù)能支持AVRMCU的編程器和模擬器都支持這種格式并且能這個程序進(jìn)入你的目標(biāo)系統(tǒng)這樣就完成了一個程序如果你希望用支持COFF調(diào)試信息的工具來測試你的程序比如AVRStudio那么你需要從Project菜單中選擇Options命令在編譯下選擇COFF輸出文件格式對在工程窗口中雙擊文件名IDE將使用編輯器打開這個文件按這個方法打開led.c作為試驗可設(shè)置一些錯誤例如從一行中刪除分號現(xiàn)在從Project菜單中選擇MakeProject命令I(lǐng)DE首先自動保存已經(jīng)改變的文件并且開始編譯這個文件這時在狀態(tài)窗口中會顯示錯誤信息單擊狀態(tài)窗口中錯誤信息行或單擊其左邊的錯誤符號光標(biāo)將移到編輯器中錯誤行的下面一行上基本上所有C編譯器都是這樣 從ProjectNew命令并且瀏覽至你希望輸出工程文件的輸出文件的名稱取決于你的工程文件名稱例如如果你創(chuàng)建一個名稱為foo.prj的工程那么輸出文件名稱為foo.hex或foo.cof等自從創(chuàng)建你自己的工程后你可以開始寫你的源代碼(C或匯編格式) 文件加入到工程文件排列中單擊中Build 圖標(biāo)可以很容易地構(gòu)筑這個工程IDE輸出與ATMEL的AVRStudio完全兼容的COFF文件你可以使用ATMEL的AVRStudio來調(diào)試你的代碼C一個C程序必須定義一個main調(diào)用函數(shù)編譯器會將你的程序與啟動代碼和庫函數(shù)成一個可執(zhí)行文件因此你也可以在你的目標(biāo)系統(tǒng)中執(zhí)行它啟動代碼的用途在C通常你的main例程完成一些初始化后然后是無限循環(huán)地運行作為例子讓我\icc\examples中的文件led.c#include/*LED的變化圖案延時程序需要有足夠的延時時間*/voidDelay(){unsignedchara,for(a=1;a;a++)for(b=1;b;b++);}{PORTB~BIT(i);/*LED*/}void{DDRB /*定義B口輸出PORTB=0xFF; /*B口全部為高電平對應(yīng)LED熄滅*/while(1){/*LED*/fori0;i8;i++)/*LEDfor(i=8;i>0;i--)/*LED跳躍for(i=0;i<8;i+=2)for(i=7;i>0;i-=2)}}mainIO寄存器后之后它運行在一個無限循環(huán)中并且在這個循環(huán)中改變LED的步進(jìn)圖案LED是在LED_On例程中被改變的LED_OnIOCPU運行很快為能夠看見圖案LED_On例程調(diào)用了延時例程因為延時的實際延時值不能被確定這一對嵌套循環(huán)只能給出延時的近似延時時間如果這個實際定時時間是重要的那么這個例程應(yīng)該其它的例子8515intr.cC寫一個中斷處理過程這兩個例子可以作為你的程序的起點四ICCAVRIDE工程的所有文件然而我們有時也需要將一個文件單獨地編譯為目標(biāo)文件或最終的輸出文件這時可以這樣操作從IDE菜單 中選擇CompileFile... 命令來執(zhí)行toObject和toOutput中的任意一個當(dāng)你調(diào)用這個命令時文件應(yīng)該是打開的編譯一個文件為目標(biāo)文件toObject對檢查語法錯誤和編譯一個新的啟動文件是很有用的編譯一個文件為輸出文件toOutput對較小的并且是一個文件的程序較為有用注意這里使用默認(rèn)的編譯選項為創(chuàng)建一個新的工程從菜單Project中選擇New命令I(lǐng)DE框在框中你可以指定工程的名稱這也是你的輸出文件的名稱如果你使用一些已經(jīng)建立的源文件你可在菜單Project中選擇AddFile(s)命令另外你可以在菜單File中選擇New命令來建立一個新的源文件來輸入你的代碼你可以在菜單File中選擇Save或SaveAs命令來保存文件然后你可以象上面所述調(diào)用AddFile(s)命令將文件加入到工程中也可在當(dāng)前編輯窗口中單擊鼠標(biāo)右鍵選擇AddtoProject同一個中但也可不作這樣要求工程的編譯選項使用菜單中Project中的Options工程管理允許你將多個文件組織進(jìn)同一個工程而且定義它們的編譯選項這個特性允許你將工程分解成許多小的模塊當(dāng)你處理工程構(gòu)筑時只有一個文件被修改和重新編譯如果一個頭文件作了修改當(dāng)你編譯包含這個頭文件的源文件時IDE會自動重新編一個源文件可以寫成C或匯編格式的任意一種C文件必須使用.c擴(kuò)展名匯編文件必須使用.s文檔文件放在工程管理窗口中工程管理器在構(gòu)筑工程時對源文件以外的文件不予理睬對目標(biāo)器件不同的工程可以在編譯選項中設(shè)置有關(guān)參數(shù) 使用默認(rèn)的編譯選項你可以將現(xiàn)有編譯選項設(shè)置成默認(rèn)選項也可將默認(rèn)編譯選項裝入現(xiàn)有工程中默認(rèn)編譯選項保存在default.prj文件中 IDE交流信息的主要區(qū)域在這個窗口中你可以修改相應(yīng)的文件當(dāng)編譯存在錯誤時用鼠標(biāo)單擊有關(guān)錯誤信息時編輯器會自動將光標(biāo)定位在錯誤行的位置注意對C源文件中缺少分號的錯誤編輯器定位于其下面一行應(yīng)用構(gòu)筑向?qū)怯糜趧?chuàng)建設(shè)備初始化代碼的一個圖形界面你可以單擊工具條中的Wizard 按鈕或菜單Tools 中的ApplicationBuilder 應(yīng)用構(gòu)筑向?qū)褂镁幾g選項中指定的目 MCU來產(chǎn)生相應(yīng)的選項和代應(yīng)用構(gòu)筑向?qū)э@示目標(biāo)MCU的每一個設(shè)備子系統(tǒng)它的使用是很顯而易見的在這里你可以設(shè)置MCU的所具有的中斷內(nèi)存定時器IO端口UART SPI和模擬量比較器等設(shè)備并產(chǎn)生相應(yīng)的代碼如果你需要的話還可產(chǎn)生main()函數(shù)IDE有一個內(nèi)置的終端仿真器注意它不包含任意一個ISP在系統(tǒng)編程功能但它可以作為一個簡單的終端或以顯示你的目標(biāo)裝置的調(diào)試信息也可一個ASC碼文件6.20版本開始IDEISP五菜單解釋環(huán)境中單擊右鍵那么File文件菜New新建一個文件Reopen重新打開歷史文件有關(guān)歷史文件顯示的右邊的子菜單中Open打開一個已以經(jīng)存在的文件用于編輯文件用瀏覽窗口選擇ReloadformDisk放棄全部的修改從磁盤中重新裝載當(dāng)前文件Reload….fromBackUP從最后一次的備份文件中裝載當(dāng)前文件Save保存當(dāng)前文件如果環(huán)境設(shè)置中設(shè)置了保存?zhèn)浞菸募t將原文件以SaveasCloseCompileFile…toObject編譯當(dāng)前文件成目標(biāo)文件注意目標(biāo)文件不可以直接用于對編程或用于調(diào)試其主要用于語法檢查為創(chuàng)建新的啟動文件或庫產(chǎn)生目標(biāo)CompileFiletoOutputSaveAllClossAll 打印當(dāng) Edit編輯菜 撤消最后一次的修改 撤消最后一次的Undo DeleteSelectAllBlock Block Find…在編輯窗口中尋找一個文本MatchCase–WholeWord–Up/Down–FindinFiles...–在當(dāng)前打開的文件中或在當(dāng)前工程的所有文件中或當(dāng)前 的文件中尋找一段文本它有以下選項CaseSensitive大小寫敏感WholeWord-全字匹配RegularExpression–Rece...–在編輯器中替換文FindAgain–GotoLineNumber–AddBookmark–添加書簽DeleteBookmark–刪除書簽NextBookmark–GotoBookmark–View視圖菜StatusWindow–如果選中顯示狀態(tài)窗口ProjectMakefile–makefile文件OutputListingFile–以只讀方式打開列表文件Project工程菜New...–Open打開一個已經(jīng)存在的工程文件OpenAllFiles...–打開工程的全部源文件CloseAllFiles–關(guān)閉全部打開的文件Reopen...––RebuildAll–AddFile(s)–RemoveSelectedFiles–Option...–打開工程編譯選項Close–SaveAsTools工具菜EnvironmentOptions–打開環(huán)境和終端仿真器選項EditorandPrintOptions–打開編輯和打印選項AVRCalc–AVR計算器可以計算UART的波特率定時器的定時常數(shù)ApplicationBuilder–ConfigureTools–CompilerOptions編譯選項總共有三個頁面 Compiler和IncludePath(s你可以指定包含文件的路徑AssemblerIncludePath(s)–指定匯編包含文件的路徑LibraryPath–器所使用的庫文件的路徑–StrictANSICChecking–ANSIC語法檢查AcceptExtensions–C++類型語法擴(kuò)充MacroDefine(s)–定義宏宏之間用空格或分號分 宏定義形式如name[:value]#defineDEBUG1MacroUndefine(s)–同上但意義相反OutputFileFormat–輸出文件格式COFF/HEXInHEX或COFFOptimizations–代碼優(yōu)化Default–基本優(yōu)化象寄存器分 共用相同的子例程izeCodeSizeReduction–只有專業(yè)版才可使用它調(diào)用了代碼壓縮優(yōu)化去DeviceConfiguration–MemorySizes–要選擇"Custom"時指定內(nèi)存大小包括ROMSRAMEEPROMTextAddress–通常代碼地址開始于中斷向量區(qū)域后面DataAddress–指定數(shù)據(jù)起始地址通常–EnhancedCore–IORegistersOffsetInternalSRAM–SRAM的偏移量例如,8515SRAM0x60,IO512Mega603,IOSRAM空間中因此SRAM也是從0開始的InternalExternalSRAM–SRAM類型PRINTFVersion–選擇PRINTF的版本Small或Basic:%c,%d,x,%Xu,andsLong:%ld,%lu,%lx,Floatingpoint:%f支持注意這個選項需要很大的AVRStudioSimulatorIO–如果選 AdditionalLibraries–使用標(biāo)準(zhǔn)庫以外的附加庫StringsinFLASHFLASH存貯器中ReturnStackSize–指定編譯器使用的硬件堆棧的大小編譯器使用的軟件堆棧的大小NonDefaultStartup–允許你指定一個啟動文件的位置系統(tǒng)默認(rèn)的啟動文件在Paths頁中指定這樣IDE可以使用多個啟動文件UnusedROMFillPattern–ROM六C這個器會自動將啟動文件連接到您的程序之前并將標(biāo)準(zhǔn)庫libcavr.a與你的程相連接啟動文件根據(jù)目標(biāo)MCU的不同在crtavr.o和crtatmega.o中間任意選擇一個啟動文件定義了一個全局符號start 它也是您的程序的起點啟動文件的功能有定義一個退出點如果你的主函數(shù)main()啟動文件也定義了復(fù)位向量你不需要修改啟動文件來使用別的中斷具體可參cd\ ;<edit ;crtavr.s<opencrtavr.susingtheIDE>;IDE打開crtavr.s<Choose"CompileFileTo->Object">;選擇編譯到目標(biāo)文件創(chuàng)建一個新的crtavr.ocopycrtavr.o..\lib ;拷貝到庫如果您使用的MCUMega你應(yīng)該用"crtatmega"代替"crtavr"Mega的每個中斷地址使用兩個字word而非Mega每一個中斷地址使用一個字word.你也可以有多個啟動文件你可以在工程選項框中很方便地直接指定一個啟動文件加入您的工程中注意您必須指定啟動文件的絕對路徑或啟動文件必須位于工程選項庫路徑所指定的中1庫源代這個庫源代碼缺省路徑為c:\icc\libsrc.avr\libsrc.zip是一個保護(hù)的ZIP壓縮文件你可以從互連網(wǎng)上任意一個UNZIP程序進(jìn)行解壓縮當(dāng)本軟件被開鎖后顯示在"About"框中例如unzip-s;unzip提示輸入 AVR特殊函數(shù)-----ICCAVR有許多UARTEEPROM和SPI的函數(shù)堆棧檢3io*.h(io2313.h,io8515.h,iom603.h,...等這些文件中是從ATMEL公開的定義IO寄存器的源文件經(jīng)過修改得到的應(yīng)該用這些文件來代替老的avr.h文件PORTB=1;uc=45其它頭文C#include預(yù)編譯指令包含這些包含了這些函數(shù)的頭文件讀者可參考返回非整型值的函數(shù)assert.h-assert(),宏ctype.h–字符類型函數(shù)float.h–浮點數(shù)limits.h–math.h浮點運算函數(shù)stdarg.h–變量參數(shù)表.stddef.h–標(biāo)準(zhǔn)定義stdio.h–標(biāo)準(zhǔn)輸入輸出IO函數(shù)stdlib.h–包含內(nèi)存分配函數(shù)的標(biāo)準(zhǔn)庫string.h–字符串處理函數(shù)下列函數(shù)按照輸入的ACSII字符集字符分類使用這些函數(shù)之前應(yīng)當(dāng)用c是數(shù)字或字母返回非零數(shù)值否則返回零intisalpha(intc是字母返回非零數(shù)值否則返回零 trl(int如果c是控制字符如FF,BELL,LF..等返回非零數(shù)值否則返回intisdigit(intc是數(shù)字返回非零數(shù)值否則返回零intisgraph(intcintislower(intc是小寫字母返回非零數(shù)值否則返回零intisprint(intc是一個可打印字符返回非零數(shù)值否則返回零intispunct(intcintisspace(int如果c是一個空格字符返回非零數(shù)值包括空格CR,FF,HT,NL,和 否則返回intisupper(intc是大寫字母返回非零數(shù)值否則返回零intisxdigit(intc是十六進(jìn)制數(shù)字返回非零數(shù)值否則返回零inttolower(intc是大寫字母則返回c對應(yīng)的小寫字母其它類型仍然返回cinttoupper(intc)c是小寫字母則返回c對應(yīng)的大寫字母其它類型仍然返回下列函數(shù)支持浮點數(shù)運算使用這些函數(shù)之前必須用#include 包floatasin(floatfloatacos(floatfloatatan(floatfloatatan2(floatx,float返回y/x的反正切其范圍在- 之floatceil(floatx的一個整型數(shù)小數(shù)部分四舍五入floatcos(floatfloatcosh(floatx)floatexp(floatexexfloatexp10(floatx)10為底的冪floatfabs(floatfloatfloor(floatx)floatfmod(floatx,floatfloatfrexp(floatx,int把浮點數(shù)x分解成數(shù)字部分 尾數(shù)和以2為底的指數(shù)n兩個部分即 2 的范圍為 y值被函數(shù)返回而n值存放到pexp指向的變量floatfround(floatfloatldexp(floatx,intexp)返回 2exfloatlog(floatfloatlog10(floatfloatmodf(floatx,float*pint)pint指向的變量小數(shù)部分應(yīng)01floatpow(floatx,floatxyfloatsqrt(floatfloatsin(floatx)floatsinh(floatfloattan(floatfloattanh(floatx)標(biāo)準(zhǔn)的文件輸入輸出是不能真正植入微控制器MCU的標(biāo)準(zhǔn)stdio.h的許多內(nèi)容不可以使用不過有一些IO函數(shù)是被支持的同樣使用之前應(yīng)用"#include<stdio.h>"預(yù)處理并且需要初始化輸出端口最低層的IO程序是單字符的輸入(getchar)和輸出(putchar)程序如果你針對不同的裝置使用的IO函數(shù)例如用printf輸出LCD你需要全部重新定為在ATMEL的AVRStudio模擬器終端IO窗口使用標(biāo)準(zhǔn)IO函數(shù)應(yīng)當(dāng)在編譯選注意作為缺省單字符輸出函數(shù)putchar是輸出到UART裝置沒有修改無論如何為使輸出能如期望的那樣出現(xiàn)在程序終端窗口中'\n'字符必須被映射為成對的回車和換行CR/LFintintprintf(char*fmt,..)frm%d--輸出有符號十%o--輸出無符號八%x-%X除了大寫字母使用'A'-'F'外%u-–%c–ASCII字符形式輸出只輸出一個字符%f–%S–輸出在FLASHprintf支持三個版本取決于你的特別需要和代碼的大小越高的要求代碼越大基本形:%c,%d,%x,%u,和%s格式說明符是承認(rèn)的長整形:%ld,lu,lx被支持,以適用于精度要求較高的領(lǐng)域浮點形:全部格式包括%f被支持你使用編譯選項框來選擇版本代碼大小的增加是值得關(guān)注intputchar(int輸出單個字符這個庫程序使用了UART以查尋方式輸出單個字符注意輸出’\n’字intputs(charintsprintf(char*buf,charfrmprintf"constchar*"支持功能cprintf和csprintf是將FLASHprinf和sprinf標(biāo)準(zhǔn)庫頭文件<stdlib.h>定義了宏NULL和RAND_MAX和新定義的類型size_t并且描述了下列函數(shù)注意在你調(diào)用任意內(nèi)存分配程序比如..calloc malloc和realloc)之前必須調(diào)用_NewHeap來初始化堆heapintatoi(char*s)s為整型數(shù)并返回它字符串s起始必須是整型數(shù)形式字符doubleatof(constchars為雙精度浮點數(shù)并返回它字符串slongatol(chars為長整型數(shù)并返回它,字符串s0void*calloc(size_tnelem,size_tsize)分配"nelem"個數(shù)據(jù)項的內(nèi)存連續(xù)空 0voidexit(status)終止程序運行典型的是無限循環(huán)mainvoid(voidsize0void_NewHeap(void*start,void*end)初始化內(nèi)存分配程序的堆一個典型的調(diào)用是將符號_bss_end+1的地址用作"start"符號_bss_end定義為編譯器用來存放全局變量和字符串的數(shù)據(jù)內(nèi)存的結(jié)束加1的目的是堆棧檢查函數(shù)使用_bss_end字節(jié)存貯為標(biāo)志字節(jié)這個結(jié)束值不能被放入堆棧中externchar_NewHeap(&_bss_end+1,&_bss_end+201);//200intptrsize字節(jié)size可比原來大或小返回指向該內(nèi)存voidsrand(unsignedlongstrtol(char*s,char**endptr,int按照"base."的格式轉(zhuǎn)換"s"中起始字符為長整型數(shù)如果"endptr"不為空*endptr將設(shè)unsignedlongstrtoul(char*s,char**endptr,int除了返回類型為無符號長整型數(shù)外其余同用"#include<string.h>"預(yù)處理后編譯器支持下列函數(shù)<string.h>定義了NULL 型size_t和下列字符串及字符陣列函數(shù)void*memchr(void*s,intc,size_tsnc相同的字符如果成功返回匹配字符的地址指針否則返回NULLintmemcmp(void*s1,void*s2,size_t對字符串s1和s2的前n個字符進(jìn)行比較如果相同則返回 如果s1中字符大于中字符則返回1s1s2中字符則返回-1void*memcpy(void*s1,void*s2,size_tn)拷貝s2中n個字符至 void*memmove(void*s1,void*s2,size_t拷貝s2中n個字符至 返回 其與memcpy基本相同但拷貝區(qū)可以重void*memset(void*s,intc,size_tsn個字節(jié)的c它返回schar*strcat(char*s1,char*s2)s2s1的結(jié)尾返回char*strchr(char*s,ints1cNULL字符如果成功返回指向匹配字符的指針如果沒有匹配字符找到返回空指針intstrcmp(char*s1,char比較兩個字符串如果相同返回0s1>s21如果s1<s2則返回-1char*strcpy(char*s1,char*s2)拷貝字符串s2至字符串 返回size_tstrcspn(char*s1,chars1搜索與字符串s2NULLs1中size_tstrlen(char返回字符串s的長度不包括NULLchar*strncat(char*s1,char*s2,size_t拷貝字符串s2不含結(jié)束NULL字符中n個字符到s1如果s2長度比n小則拷貝s2返回s1intstrncmp(char*s1,char*s2,size_tstrcmp函數(shù)相同但其只比較前nchar*strncpy(char*s1,char*s2,size_tstrcpy函數(shù)相同但其只拷貝前nchar*strpbrk(char*s1,charstrcspn函數(shù)相同但它返回的是在s1匹配字符的地址指針否則返回char*strrchr(char*s,ints中搜索最后出現(xiàn)的c并返回它的指針否則返回NULL.size_tstrspn(char*s1,char*s2)s1s2不匹配的第一個字符NULL字符其返回char*strstr(char*s1,chars1s2s1中匹配子字符串的地址指針否則返回NULL"constchar*"這些函數(shù)除了它的操作對象是在FLASH中常數(shù)字符串外其余同c中的函size_tcstrlen(constcharchar*cstrcpy(char*dst,constchar*src);intcstrcmp(constchar*s1,char*s2);初始化變量foo下一個參數(shù)分派指定的類型注意那個類型必須是高級類型如 longdouble小的整型類型如"char"va_end(va_list例如printf()vfprintf()來實現(xiàn)#include<stdarg.h>intprintf(char*fmt,{va_listva_start(ap,fmt);vfprintf(fmt,ap);}有幾個庫函數(shù)是用于檢查堆棧是否溢出內(nèi)存圖如下如果硬件堆棧增長到軟件堆棧中那么軟件堆棧的內(nèi)容將會被改變也就是說局部變量和別的堆棧項目被改變硬件堆棧是用作函數(shù)的返回地址如果你的函數(shù)調(diào)用層次太深偶然會發(fā)生這種情況同樣地軟件堆棧溢出進(jìn)數(shù)據(jù)區(qū)域?qū)淖內(nèi)肿兞炕蚱渌o態(tài)分配的項目如果你使用動態(tài)分配內(nèi)存還會改變堆項目這種情況在你定義了太多的局部變量或一個局部集合啟動代碼寫了一個正確的關(guān)于數(shù)據(jù)區(qū)的地址字節(jié)和一個類似的正確的關(guān)于軟件堆棧的地址字節(jié)作為警戒線[注意6.20版本之]注意如果你使用動態(tài)分配內(nèi)存你必須跳過警戒線字節(jié)_bss_end來分配你的堆參考內(nèi)你調(diào)用_StackCheck(void)函數(shù)來檢查堆棧溢出如果警戒線字節(jié)仍然保持正確的值那么函數(shù)檢查通過如果堆棧溢出那么警戒線字節(jié)將可能被破壞注意當(dāng)你的程序堆棧溢出的時候你的程序?qū)⒖赡苓\行不正常或偶然_StackCheck檢查錯誤條件時它調(diào)用了帶一個參數(shù)的函數(shù)_StackOverflowed(charc)如果1那么硬件堆棧有過溢出如果參數(shù)是0那么軟件堆棧曾經(jīng)溢出在那個例子中制造了兩個功能調(diào)用它是兩個堆棧都可能溢出的無論如何在_StackOverflowed執(zhí)行起作用時第二個調(diào)用不可以出現(xiàn)作為例子如果函數(shù)復(fù)位了CPU那么將不能返回_StackCheck函_StackOverflowed當(dāng)它被調(diào)用時庫會用一個缺省的_StackOverflowed函數(shù)來跳轉(zhuǎn)到0的位置因此復(fù)位CPU和程序你可能希望用一個函數(shù)來代替它以指示的錯誤條件一個作為例子它可能切斷所有的中斷并且點亮LED注意自堆棧溢出指示故障程序以來_StackOverflowed函數(shù)或許不能執(zhí)行任何太復(fù)雜的事或?qū)崿F(xiàn)程序的正常工作這兩個函數(shù)的原型在頭文件macros.h.中七AVR硬件的編 AVR的低層硬件AVR系列使用高級語言編程時有很高的C語言密度它允許你對目標(biāo)MCU的底層硬件進(jìn)行由于AVR性能除了要最大程序地優(yōu)化代碼外很少使用匯編偶然情況下目標(biāo)MCU的硬件特點在C語言中不能很好地使用很顯然使用匯編和預(yù)處理宏能訪頭文件io*.h如io8515.hiom603.h等定義了指定AVRMCU的IO寄存器細(xì)這些文件是從ATMEL發(fā)布的文件經(jīng)過修改以匹配這個編譯器的語法要求文件macros.h定義了許多有用的宏例如宏UART_TRANSMIT_ON()UART開始工作這個編譯器的效率很高當(dāng)由IO寄存器映射的內(nèi)存時能產(chǎn)生單周期指令象inoutsbissbi等參考IO寄存器注意老的頭文件avr.h定義IObit有一些模糊盡管io*.hbit的位置因此使用io*.hIObit很多時候你將需要使用定義在macros.h文件中的BIT()宏例如#define 0x80//RAM...(你的C程序)MCUCR|=SRE; ...(C程序#include<macros.h>MCUCR|=BIT(SRE);一個共同的任務(wù)是編程微控制器MCU打開或關(guān)閉IO寄存器的一些位bit很幸運CC結(jié)構(gòu)C定a|b–按位或這個表達(dá)式指示中a被表達(dá)式中的b按位進(jìn)行或運算這慣用于打開某些位尤其常用|=的形式 PORTA|= //打開位7(最a&b–1時有用例如IfPORTA&0x81) //7注意圓括號需要括在&運算符的周圍因為它和==相比運算優(yōu)先級較低這是C程a^b–按位異或這個運算對一個位取反有用例如在下面的例子中7PORTA^= //~a–按位取反.在表達(dá)式中這個運算執(zhí)行一個取反當(dāng)用按位與運算關(guān)閉某些位時與這個運算組合使用尤其有用如PORTA&=~0x80;//這個編譯器對這些運算能產(chǎn)生最理想的機(jī)器指令例如sbic指令可以用在根據(jù)位的AVRMCU它的程序存貯器和數(shù)據(jù)存貯器是分開的這樣的設(shè)計是有一些優(yōu)點的例如分開的地址空間允許AVR裝置比傳統(tǒng)結(jié)構(gòu)的存貯器例如Atmega系列允許有超過64K字WORD的程序存貯器和64K字節(jié)的數(shù)據(jù)存貯器將來的MCU裝置可能用到的程序存貯器而程序計數(shù)器仍保留在16位上不幸的是C不是在這種機(jī)器上發(fā)明的特別地C指針是任意一個數(shù)據(jù)指針或函數(shù)指針C規(guī)則已經(jīng)指定你不可以假設(shè)數(shù)據(jù)和函數(shù)指針能被向前和向后修改可是同是哈佛結(jié)構(gòu)的AVR要求數(shù)據(jù)指針能指向任一個數(shù)據(jù)內(nèi)存和程序內(nèi)存非標(biāo)準(zhǔn)C解決了這個問題ImageCraftAVR編譯器使用"const"限定詞表示項目是在程序存貯器中注意對指針描述這個const限定詞可以應(yīng)用于不同的場合不管是限定指針變量自己還是指向項目的指針例如constinttable[]={1,2,3};constchar*ptr1;char*constptr2;constchar*constptr3;"table"是表格式樣分配進(jìn)程序存貯器"ptr1"針在程序存貯器"ptr2"是一個項目在程序存貯器而指向數(shù)據(jù)的指針在數(shù)據(jù)存貯器最后"ptr3"是項目在程序存貯器而指向數(shù)據(jù)的指針也在程序存貯器在大多數(shù)的例子中"table"和和"ptr1"是很典型的C編譯器生成LPM指令來 C標(biāo)準(zhǔn)不要求"const"數(shù)據(jù)是放入只讀存貯器中而且在傳統(tǒng)結(jié)構(gòu)中除了正確訪問就沒有要緊的了因而在承認(rèn)參數(shù)的Cconst限定是非傳統(tǒng)的無論如何這樣做與標(biāo)準(zhǔn)C函數(shù)定義是有一定的例如標(biāo)準(zhǔn)"strcpy"strcpy(char*dst,constchar*src)帶有const限定的第二個ICCAVR下const限定詞表示第二個參數(shù)指向程序存貯器是不合適的因此這些函數(shù)定義設(shè)有const限制最后注意只有常數(shù)變量以文件存貯類型放入FLASH中例如定義在函數(shù)體外的變量或有靜態(tài)存貯類型限制的變量如果你使用有const限制的局部變量將不被放入FLASH中定的復(fù)雜性這頁說明字符串這個編譯器將帶有const說明的表和項目放入程序存貯器中最的是字符串的分配和處理問題在于Cchar指針如果字符串是分配進(jìn)程序存貯器中那么所有字符串庫函數(shù)中的任意一個必須被成不同于指針的操作或者字符串也必須ImageCraft編譯器提出了解決這個問題的兩個方法這個缺省的方法是同時分配字符串在數(shù)據(jù)和程序存貯器中所有涉及的字符串是拷貝進(jìn)數(shù)據(jù)存貯器的為了確保它們的值是正確的在程序啟動時字符串是由程序存貯器拷貝進(jìn)數(shù)據(jù)存貯器中的因此只有單一的字符串拷貝函數(shù)是必須的編譯器執(zhí)行全局變量初始化也 如constcharo[]="o在這個例子中o可以在上下文中作為字符串使用但不能用作標(biāo)準(zhǔn)C庫中字符Printf已被擴(kuò)展成帶%SFLASH中字符串另外新的字符串函數(shù)已加入了對只存貯于FLASH中字符串的支持只分配全部字符串到FLASH存貯當(dāng)對應(yīng)"Project->Options->Target->StringsInFLASHOnly"檢查框被選中時你可以指揮編譯器將字符串只放在FLASH中這時稱必須很地調(diào)用庫函數(shù)當(dāng)這個選項是選中的字符串類型"constchar*"是有效的并且你必須保證函數(shù)獲得了合適的參數(shù)類型除了新的"constchar*"與字符串有關(guān)系外創(chuàng)建了cprintfcsprintf函數(shù)承認(rèn)字符串格式的類型參考標(biāo)準(zhǔn)輸入輸出函數(shù)注意當(dāng)選項2只分配全部字符串到FLASH存貯器中時應(yīng)使用cprintf()對constconstcharptr[]類型字符串并且加%S當(dāng)選項1時應(yīng)使用 對constchar*及constcharptr[]類型字符串并且加生成代碼使用兩個堆棧一個是用于子程序調(diào)用和中斷操作的硬件堆棧一個是用于以堆棧結(jié)構(gòu)傳遞的參數(shù)臨時變量和局部變量的軟件堆棧硬件堆棧起初是用于存貯函數(shù)返回的地址它代表了許多小的軟件堆棧通常如果%fprintf()16字節(jié)函數(shù)最多40個字節(jié)的硬件堆棧應(yīng)該是足夠的硬件堆棧是從數(shù)據(jù)內(nèi)存的頂部開始分配的而軟件堆棧是在它下面一定數(shù)量字節(jié)處分配硬件堆棧和數(shù)據(jù)內(nèi)存的大小是受在編譯器選項中的目標(biāo)裝置項設(shè)定限制的數(shù)據(jù)區(qū)從0x60開始分配在IO空間后面是正確的允許數(shù)據(jù)區(qū)和軟件堆棧彼此相向生長32K64KSRAM任意一個程序失敗的重要原因是堆棧溢出到其它數(shù)據(jù)內(nèi)存的范圍兩個堆棧中的任意一個都可能溢出并且當(dāng)一個堆棧溢出時會偶然產(chǎn)生壞的事情你可以使用堆棧檢查函數(shù)檢 匯編允許你寫匯編代碼進(jìn)你的C文件中當(dāng)然在你的工程使用匯編源文件作為一個部件是良好的匯編的語法是多個匯編可以被符號\n分隔成新的一行String可以被用來指定多個除了額外增加的ASM 為了在匯編中一個C的變量可使用%<變量名>格式如registerunsignedcharuc;asm("mov%uc,R0\n"任意一個C變量都可以被 如果你在匯編指令中需使用一個CPU寄存器你必須使用寄存器存貯類register 來強(qiáng)制分配一個局部變量到CPU寄存器中通常使用匯編局部寄存器的能力是有限的如果你在函數(shù)中描述了太多的寄存器變量就很可能沒有寄存器可用在這種情況你將從匯編程序得到一個錯誤那時也不能控制寄存器變量的分配所以你的匯編指令很可能失敗作為例子使用LDI指令需要使用R16~R31中的一個寄存器但這里沒有請求使用匯編同樣也沒有上半部分匯編可以被用在C函數(shù)的內(nèi)部或外部編譯器將匯編的每行都分解成可讀的不象AVR匯編器ImageCraft匯編器允許放置在任意地方所以你可以在你的匯編代碼中創(chuàng)建當(dāng)匯編在函數(shù)外部時你可能得到一個警告你不要理睬這個警告 IOIO寄存器包括狀態(tài)寄存器SREG可以被兩條路線IO地址在0x00和0x3f之INOUTIO寄存器或者使用在0x200x5F之間的數(shù)據(jù)內(nèi)存地址可以使用普通數(shù)據(jù)指令和地址模式兩種方法在C中都可使用數(shù)據(jù)內(nèi)存地址一個直接地址可以通過加指針類型符號直接例如SREG的數(shù)據(jù)內(nèi)存在地址是0x5F:unsignedcharc*(volatileunsignedchar*)0x5F;//*(volatileunsignedchar*)0x5F|=0x80;//注意數(shù)據(jù)內(nèi)存地址0到31涉及到CPU寄存器注意不要不注意地改變CPU寄存器當(dāng)在IO寄存器范圍中的數(shù)據(jù)內(nèi)存時編譯器自動生成低級指令象inout sbrcIO地址你可以使用匯編和預(yù)處理宏來IO地registerunsignedcharuc;asm("in%uc,$3F");//SREGasm("out //注意老的頭文件avr.h定義IObit有一些模糊盡管io*.hbit的位置因此使用io*.hIObit很多時候你將需要使用定義在macros.h文件中的BIT()宏例如#define 0x80//RAMC程序)MCUCR|=SRE; ...(C程序#include<macros.h>MCUCR|=BIT(SRE); 你的程序可能需要使用絕對內(nèi)存地址例如外部IO設(shè)備通常被映射成特殊的內(nèi)存這些可能包括LCD界面和雙口SRAM通常你可以使用匯編或單獨的匯編文件來描C在下面有例子中假設(shè)有一個兩字節(jié)的LCD控制寄存器定位在0x1000地址一個兩字節(jié)的LCD數(shù)據(jù)寄存器定位在0x1002地址并且有一個100SRAM定位在0x2000的地址. org .blkbexternunsignedintLCD_control_register,LCD_data_register;externchardual_port_SRAM[100]; 匯編遵守同樣的匯編語則除了它被附加了一個asm()偽函數(shù)在C文件中".org0x1000""_LCD_data_register::.blkwasm(".org0x2000""_dual_port_SRAM::.blkb100");在C中你仍然要使用"extern"描述變量正象上面使用單獨的匯編文件那樣否則 C任務(wù)Tasks作為匯編界面的描述和調(diào)用規(guī)則編譯器通常在生成代碼來保存和恢復(fù)保護(hù)的寄存器在一些情況下這些行為可能是不合適的例如如果你使用RTOS實時操作系統(tǒng)RTOS管理著寄存器的保存和恢復(fù)并作為任務(wù)切換處理的一部分編譯器如果再插入這些代碼就為了這種行為你可以使用 k"例 kdrive_motorvoiddrive_motor(){...voidemit_siren()這個附注(pragma)必須被用在函數(shù)定義之前注意作為默認(rèn)的情況 C中斷操作中斷操作中C中可以使用無論函數(shù)定義在文件的什么地 你必須用一個附#pragmainterrupt_handler<name>:<vectornumber>"vectornumber"中斷的向量號注意向量號是從1開始的那是復(fù)位向量這個附注對中斷操作函數(shù)編譯器生成RETIRET指令而且保存和恢復(fù)在函數(shù)中用#pragma void{}rjmp ;對普通 jmp 上述指令定位在0x06字節(jié)地址針對普通裝置和0x0c字節(jié)地址針對Mega裝置Mega使用2個字作為中斷向量非Mega使用1字作為中斷向量 你可以在一個interrupt_handler附注中放置多個用空格分開的名稱分別帶有多個不同的向量號例如C函數(shù)無論如何要小心匯編程序要保存和恢復(fù)揮發(fā)寄存器參考匯編界面C函數(shù)不做這些工作如果你使用匯編中斷操作那么你必須自己定義向量你使用"abs"屬性描述絕對區(qū)域用".org"來rjmp或jmp指令的正確地址注意這個".org"使用的是字節(jié)地址;ATMega.area .org0x6;ATMega.area ;.org0xC UART默認(rèn)的庫函數(shù)getchar和putchar使用查尋模式從UART\icc\examples.avr有一個以中斷方式工作的IO程序可以代替默認(rèn)的程序 EEPROMEEPROM在運行時可以使用庫函數(shù)訪 在調(diào)用這些函數(shù)之前加入"object"可以是任意程序變量包括結(jié)構(gòu)和數(shù) 例EEPROM_Read(0x1i);//2iEEPROM_WRITE(intlocation,object)這個宏調(diào)用了EEPROMWriteBytes函數(shù)將數(shù)據(jù)對象寫入到EEPROM"object"可以是任意程序變量包括結(jié)構(gòu)和數(shù) 例EEPROM_WRITE(0x1, //寫兩個字節(jié)至AVREEPROM256MCU即使不需要高地址字節(jié)它們也是欠佳的因為它仍然是要寫的如果它關(guān)系重大你可以為EEPROM較少的目標(biāo)裝置重新編譯庫源代碼EEPROM可以在你的程序源文件中初始化在C源文件中它作為一個全局變量被分配到特殊調(diào)用區(qū)域"eeprom."中的這是可以用附注實現(xiàn)的結(jié)果是產(chǎn)生擴(kuò)展名為.eep的輸出文件例如intfoo=0x1234;chartable[]={0,1,2,3,4,5};#pragmadata:dataEEPROM_READ((int)&foo, //i等于第二個附注是必須的為返回默認(rèn)的"data."區(qū)域需要重設(shè)數(shù)注意因為AVR的硬件原因初始化EEPROM0地址是不可以使用注意當(dāng)使用外部描述比如在另一個文件中的foo你不需要加入這個附注如externintfoo;inti;EEPROM_READ((int)&foo,intEEPROMwrite(intlocation,unsignedcharEEPROM0voidEEPROMReadBytes(intlocation,void*ptrint從EEPROM指定位置處開始"size"個字節(jié)至由"ptr."指向的緩沖EEPROM指定位置處開始寫"size""ptr."13一個以查尋模式SPI的函數(shù)是提供的的信息參考14相對轉(zhuǎn)移/8K(rjmp和rcall)為實現(xiàn)這個目的相對轉(zhuǎn)移和調(diào)用的范圍是以8K為分界的例如一個較遠(yuǎn)的跳轉(zhuǎn)跳轉(zhuǎn)到0x2100字節(jié)處0x20008K實際上會跳轉(zhuǎn)到地址0x100處8K八C 長度(字節(jié)) unsigned signed -char unsigned (signed) - (signed) - (signed) (*)char""unsigned

floatsdoublesIEEE32位格式7位表示指數(shù)23位表示尾數(shù)1位表示unsignedsignedstructunsigneda:1,b:這個結(jié)構(gòu)體的長度只有一個1 2C語言中的名稱在匯編文件中是以下劃線為前墜的如函數(shù)main()_main()的名稱的有效長度為32個字符 在名稱后面加兩個冒號:可以定義成一個全局變量例如.word1(C文件中externintR16/R17傳遞第二個參數(shù)則通過R18/R19傳遞如果參數(shù)是長整型或浮點數(shù)則通過R16/R17/R18/R19傳遞其余參數(shù)通過軟件堆棧傳遞比整型參數(shù)小的如char參數(shù)擴(kuò)展成整型int長度傳遞即使函數(shù)原型是可用的R16/R17已傳遞了第一個參數(shù)而第二個參數(shù)是長整型或浮點數(shù)則第二個參數(shù)的低半部分通過R18/R19傳遞而高半部分通過軟件堆棧傳遞R16/R17R28/R29Y d)別的寄存器如可以在匯編語言函數(shù)中使用而不被保護(hù)和恢復(fù)這些寄存器是調(diào)用揮發(fā)寄存器e中斷處這不同于普通的函數(shù)調(diào)用在中斷操作中必須保護(hù)和恢復(fù)它所使用的全部寄存器C函數(shù)來描述中斷處理那么編譯器有能力自動完成的如果使用匯編寫中斷處理而它又調(diào)用了普通的C函數(shù)那么匯編操作必須保護(hù)和恢復(fù)揮發(fā)性寄存器普通C函數(shù)調(diào)用不保護(hù)它們中斷處理操作同普通程序操作是異步的中斷處理或它的函數(shù)調(diào)用不能改變?nèi)我庖粋€MCU寄存器3浮點函數(shù)之前應(yīng)當(dāng)用#include語句包含頭文件<math.h> 值后你的程序?qū)⒉还ぷ鬟@和那些返回整型值的函數(shù)是有不同之處的如果傳遞結(jié)構(gòu)值結(jié)構(gòu)允許通過堆棧傳遞而不是通過寄存器傳遞結(jié)構(gòu)索引(傳遞結(jié)構(gòu)的地址)和傳遞任意數(shù)據(jù)項目的地址是相同的,2字節(jié)的指針當(dāng)一個返回結(jié)構(gòu)的函數(shù)被調(diào)用時這個調(diào)用函數(shù)分配一個臨時貯藏庫而且傳遞一個隱藏指針給調(diào)用函數(shù)當(dāng)這個函數(shù)返回時它拷貝返回值進(jìn)這個臨時貯藏庫程序和數(shù)據(jù)區(qū)的使用變量編譯器可以生成一個對應(yīng)程序存貯器映像的輸出文件HEX文件這個文件可以被通常編譯器不能使用任意64K字節(jié)以上的程序存貯器為了64K字節(jié)邊界以上的存貯器如在Mega103裝置中你需要在設(shè)定RAMPZ寄存器后直接調(diào)用ELPM指令數(shù)據(jù)存貯器僅指內(nèi)部出文件但在程序運行時使用一個程序使用數(shù)據(jù)內(nèi)存如下圖堆內(nèi)存圖的底部是地址0開始的960x60字節(jié)是CPU寄存器和IO寄存器編譯0x60往上放置全局變量和字符串在變量區(qū)域的頂部你可以分配動態(tài)內(nèi)存在高端地址SRAM的最后位置在它的下面是向下生長的軟件堆棧它要求你作為程序師要確保硬件堆棧不生長進(jìn)軟件堆棧而軟件堆棧不生長進(jìn)堆否則將導(dǎo)致意外的結(jié)數(shù)據(jù)存貯器外部32K64KSRAMSRAM的頂部并且是朝內(nèi)存地址向下生長數(shù)據(jù)內(nèi)存是開始于硬件堆棧的頂部并且向上生長這樣分配的原因是在多數(shù)場合內(nèi)部SRAM比外部SRAM的速度要快分配堆棧 interrupt func_lit–函數(shù)表區(qū)這個區(qū)的每個字包括了函數(shù)的地址為了與代碼壓縮完全兼C中使用函數(shù)指針調(diào)用函數(shù)這是自動完成的在匯編中舉例如下;_foo.areaPL_foo::.word_foo;.arealdiR30,<PL_fooldiR31,>PL_foorcallxicall你可以間接地在函數(shù)表地址送入R30/R31寄存器對后使用庫函數(shù)xicall調(diào)用這lit–text–這個區(qū)域包括程序代碼data-這個區(qū)域包括全局變量靜態(tài)變量和字符串全局變量和字符串的初始值是保存在"idata"區(qū)域并且是在啟動時被拷貝進(jìn)數(shù)據(jù)區(qū)的bss-這個區(qū)域包括未初始化的全局變量按ANSICEEPROMeeprom-這個區(qū)域包括EEPROM數(shù)據(jù)EEPROM數(shù)據(jù)是寫進(jìn)擴(kuò)展名為.eep的輸出文件其格式IN HEX文件格式九調(diào)試ICCAVRCOFFATMELAVRStudio中進(jìn)行源AVRStudioIO及終端仿真器那么在ICCAVR的編譯選項中必須將AVRStudioSimulatorIO一項打鉤十ICCAVR1名(‘_’|[a-z])[[a-z]|[0-9]|‘_’ ICC中匯編名稱必須由下劃線或字母開始隨后跟字母數(shù)字或下劃線組成在這地址的標(biāo)號名稱中的任意一個一個名

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論