ICCV8 for R是單片機編輯軟件,可以在軟件上直接使用R編輯器設計單片機,可以使用“設置/編輯器/顏色”或在編輯器內部單擊鼠標右鍵,單擊“配置編輯器”來更改編輯器的顏色,可以在動鼠標的同時按住Contl鍵來放大和縮小編輯器,支持尋址絕對內存位置,您的程序可能需要解決絕對內存位置,例如外部IO外設通常映到特定的內存位置,這些可能包括LCD接口和雙端口SRAM,您也可以在特定位置分配數據,以便在引導加載程序和主應用程序之間或在訪問雙端口RAM的兩個單獨的處理器之間進行通信,在項目樹中鍵入內容時,您可以通過按ALT-G輕松地找到/打開文件,每個項目可以有多個構建目標,例如,用于構建庫的目標和用于使用該庫構建應用程序的目標!
ICCV8 軟件功能
訪問K范圍之外的內存
通過16位指針,R通常可以訪問K字節的數據存儲器,用于功能的K字程序存儲器和用于恒定數據的K字節程序存儲器。 后者需要澄清:由于代碼必須在字邊界上對齊,因此R使用字地址訪問代碼(例如,用于函數調用)。 這允許函數調用以16位字地址達到Mega128閃存空間的完整128K字節/ K字。 但是,閃存中的常量數據使用字節地址,因此R通常只能使用LPM指令訪問閃存低K字節中的常量數據。
為了解決這些限制,R使用RAMPZ IO寄存器來允許對閃存的大于K的訪問。 XMega具有四個此類IO寄存器:RAMPX,RAMPY,RAMPZ和RAMPD,以允許對數據和閃存進行大于K的訪問。
C任務
如匯編接口和調用約定頁面中所述,編譯器通常會生成代碼以保存和恢復保留的寄存器。在某些情況下,這種行為可能是不希望的。例如,如果您使用的是RTOS(實時作系統),則RTOS會在任務切換過程中管理寄存器的保存和還原,并且編譯器插入的代碼將變得多余。
引導加載程序應用
一些較新的大型設備支持引導加載程序應用程序。您可以將引導加載程序構建為的應用程序,也可以將單個程序包含主代碼和引導加載程序代碼。
匯編中斷處理程序
您可以在匯編中編寫中斷處理程序。但是,如果在匯編處理程序中調用C函數,則匯編例程必須保存和恢復易失寄存器,因為C函數不會(除非將它們聲明為中斷處理程序,否則不應直接調用它們)。
特定的R問題
Atmel提供了各種各樣的R設備,它們的內存大小和外圍設備有所不同。本節介紹了一些R和設備特定的問題。
R功能
R使用哈佛架構并將程序和數據存儲器分開。
程序存儲器的大小以字節為單位指定(例如M32具有32K字節的閃存),但每條指令的長度至少為2個字節。因此,指令中編碼的程序位置是字地址。當用作文字表等的存儲時,程序存儲器可使用lpm / elpm指令系列進行字節尋址。
適用于R程序的ICCV8(例如,適當的編譯器,匯編器和鏈接器)在大多數情況下使用字節地址,并且這些工具會根據需要進行適當的字地址轉換。
寄存器不是全部通用的。使用立即源作數(例如addi,ldi等)的R指令僅對高16個寄存器R16至R31進行作。只有3組“指針”寄存器:R26 / R27或X,R28 / R29或Y,以及R30 / R31或Z。Y和Z可以使用帶偏移量的位移模式,但X不能使用這種模式。
生成的代碼使用兩個堆棧作為調用返回地址的本機硬件堆棧和使用Y指針的軟件堆棧。雖然這使確保兩個堆棧都具有足夠的空間更具,但是使用單個堆棧的替代方產生更多的代碼。
特定于設備的指令
具有8K或更少字節程序存儲器的設備不支持jmp和call指令,僅支持rjmp和rcall相對指令。 R的初始生成(有時稱為“經典” R)沒有更新的指令,例如乘法指令和擴展的lpm指令。
相對跳轉/呼叫包裝
在具有8K程序存儲器的設備上,可以使用相對的跳轉和調用指令(rjmp和rcall)到達所有存儲器位置。為此,將相對的跳轉和調用環繞8K邊界。例如,向前跳轉到字節位置0x2100(0x2000為8K)被包裝到字節位置0x100
功能指針
為了與代碼壓縮器(tm)完全兼容,所有間接函數引用都必須通過額外的間接級別。如果您通過使用函數指針來調用函數,這將在C中自動為您完成。換句話說,函數指針的行為與預期的一樣,只是略慢一些。
C機器程序
大多數C作都轉換為直接的Atmel R指令。但是,有些作被轉換為子例程調用,因為它們涉及許多機器指令,并且如果以內聯方式完成轉換,將導致過多的代碼膨脹。這些例程以匯編語言編寫,并且可以通過以下事實加以區分:例程名稱不是以下劃線開頭或具有兩個下劃線前綴。這些例程可能使用也可能不使用標準調用約定,并且您不應該直接使用它們,因為我們可能會根據編譯器版本來更改它們的名稱或實現。
外部SRAM數據存儲器
如果選擇具有32K或K外部SRAM的設備目標,則堆棧將放置在內部SRAM的頂部,并朝著低內存地址向下生長。數據存儲器從硬件堆棧的頂部開始并向上增長。
分配方式有所不同,因為內部SRAM的訪問時間比外部SRAM的訪問時間快,并且在大多數情況下,將堆棧項目分配給更快的內存更有利
堆棧和堆函數
除了靜態程序區域外,C運行時環境還包含兩個其他數據區域:堆棧區域和堆區域。堆棧用于過程調用,局部和臨時變量以及參數傳遞。堆用于由標準C malloc(),calloc()和realloc()調用創建的動態分配的對象。要使用堆函數,必須首先初始化堆區域
司機
編譯器驅動程序每個輸入文件,并根據文件的擴展名和已接收的命令行參數對文件進行作。 .c文件和.s文件分別是C源文件和程序集源文件。 IDE的設計理念是使其盡可能易于使用。但是,命令行編譯器非常靈活。您可以通過將命令行參數傳遞給它來控制它的行為。如果要使用自己的GUI(例如Codewght或Multiedit編輯器)與編譯器進行交互,則需要了解以下幾點。
編譯器參數
IDE通過將命令行參數傳遞給編譯器驅動程序來控制編譯器的行為。通常,您不需要知道這些命令行參數的作用,但是在執行構建時,您可以在生成的makefile和“狀態窗口”中看到它們。但是,如果您想使用自己的編輯器/ IDE(例如Codewght)來驅動編譯器,則此頁面記錄了TI MSP430 IDE所使用的選項。所有參數都傳遞給驅動程序,而驅動程序又將適當的參數傳遞給不同的通道。
MISRA / Lint代碼
MISRA C是由MISRA(汽車工業軟件可協會)http://www.misra.org.uk開發的C編程語言的編碼標準。 MISRA C準則最初旨在提高程序在汽車工業中的安全和可移植,而嵌入式設備的漸流行,如今已被許多組織在汽車工業以外的嵌入式領域采用MISRA C準則。 (如果您熟悉MISRA C,則可以認為它是Lint的超集。)
代碼壓縮器(tm)
代碼壓縮器(tm)優化器是最先進的優化程序,可將最終程序大小從5-18%減小。它在我們針對特定目標的編譯器的高級版和專業版中可用。它適用于您的整個程序,可在所有文件中搜索減小程序大小的機會。我們比其他任何人都為商業嵌入式編譯器提供了這種創新技術。
方便的功能
C:B的一些更有用的功能是:
折疊和展開代碼,使顯示更整潔。
使用Edit-> …(comment)…注釋/取消注釋選定的文本塊。
使用TAB縮進所選文本的塊,并使用shift-TAB縮進。
通過下拉列表(工具箱圖標下的行)跳轉到任何函數定義。
右鍵單擊一個函數名稱,選擇以查找其實現或聲明。
右鍵單擊源文件上的任意位置,選擇“交換頭文件/源文件”以打開具有相同名稱的頭文件。
使用插件->源代碼格式化程序(AStyle)格式化源代碼。
菜單參考:構建選項-項目
項目類型-僅對高級和專業版本啟用。
允許您構建常規可執行文件輸出或庫文件輸出。
Makefile選項-指定在生成的Makefile中使用“相對路徑”還是“絕對路徑”。
在生成之前執行命令-在生成項目之前執行用戶定義的命令。有關C :: B支持的變量的列表,請參見下文。
成功構建后執行命令-成功構建項目后執行用戶定義的命令。有關C :: B支持的變量的列表,請參見下文。
R Studio版本(COFF)-指定您使用的R Studio版本。
請注意,Studio 4.0及更高版本允許源文件和COFF文件位于不同的目錄中,而Studio 4.06及更高版本可以擴展結構成員
構建選項-路徑
包含路徑-您可以指定編譯器應在其中搜索包含文件的目錄。您可以通過使用分號或空格分隔路徑來指定多個目錄。如果路徑包含空格,則將其用雙引號引起來。
如果未指定完整路徑(即,路徑不以或驅動器號開頭),則該路徑相對于Pject目錄(即.cbp文件所在的位置)。
編譯器驅動程序會自動將c: iccv8avr include添加到包含路徑,因此您無需顯式添加它。
匯編器包含路徑-您可以指定匯編器應在其中搜索包含文件的目錄。您可以通過使用分號或空格分隔路徑來指定多個目錄。如果路徑包含空格,則將其用雙引號引起來。
生成選項-編譯器
嚴格-ANSI C是從原始K&R C演變而來的。雖然ANSI C標準比K&R C具有更嚴格的語言和更嚴格的類型等,但它仍允許某些可能不安全的作。如果選擇此選項,則編譯器會警告有關沒有原型的函數類型的聲明和轉換,指向整數的指針和指向枚舉的指針之間的分配以及從指針到較小整數類型的轉換。它還警告無法識別的控制行,文字中的非ANSI語言擴展和源字符,未引用的變量和靜態函數以及聲明不完整類型的數組。
此選項通常應為ON,并且應研究所有警告以確保可接受。
ICCV8 軟件特色
1、現在為所有增強型核心設備啟用“使用ELPM / RAMPZ。
2、添加了8位優化。大多數,如果不是全部可以按照標準C規則合法完成的表達式完成8位作而不是提升的int類型。
3、將大多數程序提高1%到2%甚至更多變量被廣泛使用。
4、為AT90USB82和AT90USB162添加了設備條目編譯器。
5、編譯器將參數寄存器保存到另一個保存的注冊而不保存保留的寄存器。
6、這通常只是如果函數沒有其他局部變量并且它發生了用參數調用其他C函數。
ICCV8 安裝方法
1、打開iccv8avr_8.04.exe開始安裝,點擊next
2、閱讀軟件的安裝協議,點擊accept接受
3、設置軟件的安裝地址c:iccv8avr
4、設置開始菜單文件夾
5、提示準備安裝界面,點擊install
6、軟件已經安裝到電腦,打開主程序開始使用!
ICCV8 使用說明
1、軟件界面如圖所示,您可以同時打開多個項目
2、每個項目可以有多個構建目標。 例如,用于構建庫的目標和用于使用該庫構建應用程序的目標
3、代碼:: Blocks當前不是C / C ++源文件的默認應用程序。
是否要將其設置為默認值?
以后您始終可以從環境設置中更改關聯。
不,保留一切
不,保留一切(但是下次再問我)
是的,將代碼:塊與C / C ++文件類型相關聯
是的,將代碼::與每種受支持的類型相關聯(包括來自其他IDE的項目文件)
4、提示新項目設計界面,可以選擇你需要創建的編輯項目
5、歡迎使用新的GLUT項目向導!
該向導將指導您使用GLUT OpenGL擴展來創建新項目。
當您準備好繼續時,請單擊“下一步”。
6、請選擇要在其中創建新項目的文件夾及其標題。
7、請在計算機上選擇GLUT的位置。
這是安裝(解壓縮)GLUT的頂級文件夾。
為了幫助您,此文件夾必須包含子文件夾“ include”和“ lib”。
8、常規設置
iShow啟動時啟動屏幕
僅允許一個正在運行的實例(需要重新啟動應用程序才能生效)動態數據交換(需要重新啟動應用程序才能生效)
使用已經運行的實例而不是啟動新實例(如果可能)
把它放在最上面
9、縮略語
自動完成與代碼完成插件無關。 通過鍵入以下關鍵字之一并按Ctrl-J來調用它。 ,將相應類型的關鍵字替換為相應的代碼。
ICCV8 教程
標準IO功能
由于標準文件IO對于嵌入式微控制器沒有意義,因此許多標準stdio.h內容均不適用。盡管如此,仍支持某些IO功能。使用這些功能之前,請使用#include 。您將需要初始化輸出端口。最低級別的IO例程由單字符輸入(getchar)和輸出(putchar)例程組成。您將需要實現這些例程,因為它們專用于目標設備。我們提供示例實現,在大多數情況下,您只需要將正確的示例文件復制到您的項目中即可。請參見下面的功能說明。您不需要修改高級標準IO功能,例如pntf,spntf,scanf等。
在多個輸出設備上使用pntf
在多個設備上使用pntf非常簡單。您可以編寫自己的putchar(),以便根據全局變量和更改此變量的函數將其寫入不同的設備。,當您要切換為使用其他設備時,只需調用設備更改功能即可。您甚至可以通過使用vfpntf()函數來實現帶有某種設備編號參數的pntf版本,如下所述。
字符串函數
支持以下字符串函數。在使用這些功能之前,請使用#include >。文件定義NULL和typedefs size_t,以及以下字符串和字符數組函數:
void * memchr(void * s,int c,size_t n)搜索大小為n的數組s中c的首次出現。如果找不到匹配項,它將返回匹配元素的地址或空指針。
int memcmp(void * s1,void * s2,size_t n)比較兩個數組,每個數組的大小均為n。如果數組相等,則返回0;如果s1中的第一個不同元素大于s2中的對應元素,則返回0。否則,它返回一個小于0的數字。
void * memcpy(void * s1,const void * s2,size_t n)將從s2開始的n個字節復制到s1中。
void * memmove(void * s1,const void * s2,size_t n)將s2復制到s1中,每個大小均為n。即使輸入重疊,該例程也可以正常工作。它返回s1。
void * memset(void * s,int c,size_t n)將c存儲在大小為n的數組s的所有元素中。返回s。
char * strcat(char * s1,const char * s2)將s2連接到s1上。它返回s1。
char * strchr(const char * s,int c)搜索c在s中的首次出現,包括其終止的空字符。如果找不到匹配項,它將返回匹配元素的地址或空指針。
int strcmp(const char * s1,const char * s2)比較兩個字符串。如果字符串相等,則返回0;如果s1中的第一個不同元素大于s2中的對應元素,則返回0。
否則,它返回一個小于0的數字。
int strcoll(const char * s1,const char * s2)使用語言環境比較兩個字符串。在我們的編譯器下,這與strcmp函數完全相同。
堆棧功能
提供了幾個庫函數來堆棧溢出。 考慮下面的內存映; 如果硬件堆棧擴展到軟件堆棧,則軟件堆棧的內容將更改。 這將更改局部變量和其他堆疊項目的值。 由于硬件堆棧用于函數返回地址,所以如果您的函數調用樹嵌套太深,則可能會發生這種情況。
同樣,溢出到數據區的軟件堆棧會修改全局變量或其他靜態分配的項(如果使用動態分配的內存,則將修改堆項)。 如果聲明太多局部變量或局部聚集變量太大,則可能會發生這種情況。
如果您經常使用函數pntf,那么格式字符串可能會在數據區域中占用大量空間
概括
要使用堆棧功能:
1. #include
2.插入_StackCheck();在您要堆棧是否溢出的代碼中。這可能在您代碼中的任何位置,例如在看門狗定時器功能中。
3. _StackCheck()檢測到堆棧溢出時,它將調用函數_StackOverflowed(),該函數的整數參數值為1表示硬件堆棧已溢出,值為0表示軟件堆棧已溢出。
4.默認的_StackOverflowed()庫函數跳轉到位置0并重置程序。若要更改此默認行為,請在源代碼中編寫自己的_StackOverflowed函數。這將覆蓋默認值。對于程序調試,您的_StackOverflowed函數應該執行某些作以指示難狀況,可能是通過閃爍LED來進行。如果使用調試器,則可以在_StackOverflowed函數中設置斷點以查看是否被調用。
頭文件Rdef.h中列出了這兩個函數的原型。
哨兵
啟動代碼在數據區域上方的地址處寫入一個前哨字節,并在軟件堆棧上方的地址處寫入一個類似字節。如果前哨字節被更改,則說明發生了堆棧溢出。
訪問R功能
C的優勢在于,盡管它是高級語言,但它允許您訪問目標設備的低級功能。 有了這種功能,除了在最優化的代碼至關重要的情況下,幾乎沒有理由使用匯編。 即使在目標功能在C中不可用的情況下,通常也可以使用內聯匯編和預處理器宏來透明地訪問這些功能。
io ??? v.h頭文件
IO寄存器的命名方案,位定義和中斷向量在這些頭文件中進行了標準化。 io ??? v.h標頭文件為R的IO寄存器和位,中斷向量號以及鎖定/保險絲位(如果支持)定義了符號名(僅適用于Mega R)。 IO寄存器和位名稱的定義與數據手冊中的規定相同,只有少數例外和擴展名(請注意,摘要頁面有時會有拼寫錯誤!)。 文件iccioavr.h有條件地包括所有這些io ???? v.h文件,具體取決于定義的設備宏(由IDE向下傳遞)。
程序數據和常量存儲器
R是哈佛架構機器,將程序存儲器與數據存儲器分開。這種設計有幾個優點。其中之一是,與傳統架構相比,單獨的地址空間允許R設備訪問更多的總內存。在具有非哈佛架構的8位CPU中,它可以尋址的內存最大數量通常為K字節。要在此類設備問超過K字節,通常需要使用某種類型的尋呼方案。使用哈佛架構,Atmel R設備具有多種變體,它們的總地址空間超過K字節,而無需使用分頁方案。
不幸的是,C不是在這樣的機器上發明的。 C指針既可以是數據指針也可以是函數指針,并且C規則已經指定了您不能假定可以反復轉換數據和函數指針。另一方面,
像R這樣的哈佛架構機器,數據指針可能指向數據存儲器或閃存(程序存儲器)中的常量數據。
堆棧
生成的代碼使用兩個堆棧:子例程調用和中斷處理程序使用的硬件堆棧,以及用于為參數,臨時變量和局部變量分配堆棧幀的軟件堆棧。 盡管看起來很麻煩,但使用兩個堆棧而不是一個堆棧可以最透明和代碼高效地使用數據RAM。
由于硬件堆棧主要用于存儲函數返回地址,因此它通常比軟件堆棧小得多。 通常,如果您的程序不是調用密集型的,并且不使用調用密集型庫函數(例如%f格式的pntf),則默認的16字節應該可以正常工作。 在大多數情況下,硬件堆棧的最大值為40個字節就足夠了,除非您的程序具有深度遞歸的例程。
全球注冊
有時,如果您的程序可以訪問全局寄存器,則效率更高。 例如,在中斷處理程序中,您可能想增加程序另一部分可能需要訪問的全局變量。 由于保存和恢復寄存器的開銷以及訪問全局變量所在的內存的開銷,以這種方式使用常規C全局變量可能比中斷處理程序需要更多的開銷。
您可以通過選中“編譯器”->“選項”->“目標”->“不使用R20..R23”選項,要求編譯器不使用寄存器R20,R21,R22和R23。 通常不應該此選項,因為編譯器可能會使用較少的寄存器,因此可能會生成較大的程序。 除此設置外,您無法保留其他寄存器。