⑴ DOS下面 如何用IAR編譯程序
第一種編譯方法( 編譯直接生成class 文件,執行需先創建包的路徑)
假設當前目錄為/src/java/ ,則編譯命令為:
javac HelloWorld.java
假設當前目錄為/src/ ,則編譯命令為:
javac /src/java/HelloWorld.java
或者使用相對路徑:
javac java/HelloWorld.java
執行完該命令後, 在/src/java/ 目錄下生成一個HelloWorld.class 文件。執行文件(在java 目錄下新建目錄a ,在a 目錄下新建目錄b 將HelloWorld.class 至於b 目錄下;執行java a.b.HelloWorld ),必須要按照包的結構先創建目錄。
第二種編譯方法( 編譯直接生成包的路徑)
假設當前目錄為/src/java/ ,則編譯命令為:
javac -d . HelloWorld.java
說明:"." 為指定編譯路徑為當前目錄;生成的HelloWorld.class 所有目錄為/src/java/a/b/HelloWorld.class 。
javac -d c/d HelloWorld.java
說明:c/d 為指定編譯路徑為/src/java/c/d ,同樣也可以寫成絕對路徑如javac -d d:/ HelloWorld.java ,前提是路徑必須先存在;生成的HelloWorld.class 所有目錄為/src/java/c/d/a/b /HelloWorld.class 。
假設當前目錄為/src/ ,則編譯命令為:
javac -d . java/HelloWorld.java
說明:生成的HelloWorld.class 所有目錄為/src/a/b/HelloWorld.class 。
javac -d java/c/d java/HelloWorld.java
說明:生成的HelloWorld.class 所有目錄為/src/java/a/b/HelloWorld.class 。
第三種編譯方法(先把源文件按照包結構放到指定的目錄中,然後執行編譯命令)
假設當前目錄為/src/java/,先在目錄中創建目錄/a/b,然後編譯命令:
javac a/b/HelloWorld.java
下面總結一下對於帶包的類進行編譯和執行時的一些要點:
1、編譯時可以不考慮包結構的問題,不論用哪種方法,其實本質都是一樣的,只需要讓javac命令找到所需要編譯的原文件(*.java)即可。編譯時可以用相對或者絕對路徑來為javac命令提供源文件的位置信息。
2、初學者易混淆classpath的作用,對於java命令的-cp選項和javac命令的-classpath選項,以及配置環境變數時的 CLASSPATH.其作用是不變的:都是指定所需要的class文件的位置。所不同的是,執行javac編譯時的-classpath選項用於指定被編譯的源文件需要調用另外的用戶自定義類的位置.。執行java命令是根據classpath來尋找所需要執行的class文件的位置;而javac命令不能根據classpath來找源文件,只能根據classpath來尋找所需要用到的類。
下面舉例來說明該問題:
假設以下代碼(位置:/src/java/code/a/b/TestT.java):
package a.b;
import c.d.T;
public class TestT {
public static void main(String[] args) {
T t = new T();
t.p();
}
}
package a.b;
import c.d.T;
public class TestT {
public static void main(String[] args) {
T t = new T();
t.p();
}
}
引入的文件(位置:/src/java/code/tmp/c/d/T.java)
package c.d;
public class T {
public void p(){
System.out.println("class:T");
}
}
package c.d;
public class T {
public void p(){
System.out.println("class:T");
}
}
假設現在編譯兩個文件(目錄:/src/java/),則編譯命令為:javac -classpath code/tmp code/a/b/TestT.java 執行命令為:java -cp code;code/tmp a/b/TestT
如果當前目錄為:/src/java/code/,則編譯命令為:javac -classpath tmp a/b/TestT.java執行命令為:java -cp .;tmp a/b/TestT
假設現在編譯不同磁碟的三個文件(目錄:e:/src/java/),則編譯命令為:
假設以下代碼(位置:e:/src/java/code/a/b/TestT.java):
view plain to clipboardprint?
package a.b;
import c.d.T;
import e.f.T1;
public class TestT {
public static void main(String[] args) {
T t = new T();
t.p();
T1 t1 = new T1();
t1.p();
}
}
package a.b;
import c.d.T;
import e.f.T1;
public class TestT {
public static void main(String[] args) {
T t = new T();
t.p();
T1 t1 = new T1();
t1.p();
}
}
引入的文件1(位置:d:/java/code/tmp/c/d/T.java)
view plain to clipboardprint?
package c.d;
public class T {
public void p(){
System.out.println("class:T");
}
}
package c.d;
public class T {
public void p(){
System.out.println("class:T");
}
}
引入的文件2(位置:c:/code/tmp/e/f/T1.java)
view plain to clipboardprint?
package e.f;
public class T1 {
public void p(){
System.out.println("class:T1");
}
}
package e.f;
public class T1 {
public void p(){
System.out.println("class:T1");
}
}
如果當前目錄為:e:/src/java/
編譯命令為:javac -classpath d:/java/code/tmp;c:/code/tmp code/a/b/TestT.java
執行命令為:java -cp code;d:/java/code/tmp;c:/code/tmp a/b/TestT
說明:javac命令中的classpath必須指定引入類的路徑;同樣java命令中的cp必須引入引入類的class的路徑也需指定執行類的路徑
實例:
package test;
enum T{
HELLO,WORLD,HAA;
}
package test;
import static test.T.*;
public class A {
private T t;
public A(T t){
this.t = t;
}
public static void main(String[] args){
System.out.println(new A(HELLO));
System.out.println(new A(HAA));
}
@Override
public String toString(){
return this.t + " ";
}
}
編譯命令:javac -d . T.java
javac -d . A.java
執行命令: java test.A
⑵ 用IAR嵌入式編譯程序,「section=」是什麼意思
#pragma section( "section-name" [, attributes] ) 作用是由程序指定創建一個段x0dx0a一般默認段都是由編譯器自動指定的 不過看你這樣的寫法 IAR的時候是沒有默認段的 必須由編寫者手動指定x0dx0a比如#pragma section = ".data"就是創建一個名字為.data的段,x0dx0a然後下面調用x0dx0adata_ram = __section_begin(".data");x0dx0a來獲取這個段的首地址以備其操作x0dx0a其他類似x0dx0a關於pragma section的詳細說明如下。 對於#pragma 預處理還有很多功能 感興趣可以自行搜索x0dx0a==================================================================================x0dx0a#pragma section。創建一個段。x0dx0a其格式為:#pragma section( "section-name" [, attributes] )x0dx0asection-name是必選項,用於指定段的名字。該名字不能與標准段的名字想沖突。可用/SECTION查看標准段的名稱列表。x0dx0aattributes是可選項,用於指定段的屬性。可用屬性如下,多個屬性間用逗號(,)隔開:x0dx0aread:可讀取的x0dx0awrite:可寫的x0dx0aexecute:可執行的x0dx0ashared:對於載入該段的鏡像的所有進程是共享的x0dx0anopage:不可分頁的,主要用於Win32的設備驅動程序中x0dx0anocache:不可緩存的,主要用於Win32的設備驅動程序中x0dx0adiscard:可廢棄的,主要用於Win32的設備驅動程序中x0dx0aremove:非內存常駐的,僅用於虛擬設備驅動(VxD)中x0dx0a如果未指定屬性,默認屬性為read和write。x0dx0a在創建了段之後,還要使用__declspec(allocate)將代碼或數據放入段中。x0dx0a例如:x0dx0a//pragma_section.cppx0dx0a#pragma section("mysec",read,write)x0dx0aint j = 0;x0dx0a__declspec(allocate("mysec"))x0dx0aint i = 0;x0dx0aint main(){}x0dx0a該例中, 創建了段"mysec",設置了read,write屬性。但是j沒有放入到該段中,而是放入了默認的數據段中,因為它沒有使用__declspec(allocate)進x0dx0a行聲明;而i放入了該段中,因為使用__declspec(allocate)進行了聲明。
⑶ 在IAR中編譯程序後,IAR編譯器完全沒有反應,沒有任何錯誤提示。這是怎麼回事啊
1,你的IAR版本是多少,主要針對哪款ARM或MSP430,我的是iar embedded workbench for ARM 5.41
2,BUILD的窗口沒有打開,通過"view"打開。
3,我的輸出窗口:Total number of errors: 0
Total number of warnings: 28
⑷ IAR如何編譯生成文件
項目中有些功能需要用匯編編寫,所以想讓編譯器生成一個匯編框架,但是現在只能生成.r43和.lst文件,如何能生成.s43文件。
我的方法是這樣,寫一個同名的函數,在Project中選擇Option命令,在List頁中全選擇,但現在生不成s43文件
⑸ iar使用教程
IAR使用教程:1. 下載並安裝IAR Embedded Workbench;2. 選擇相應的單片機;3. 根據項目要求,配置開發環境及編譯器;4. 編寫C程序;5. 編譯,鏈接,下載;6. 調試;7. 上機測試。
拓展:IAR Embedded Workbench也支持創建其他編程語言項目,比如C++、HTML等,對應的語言語法也支持,比如HTML標簽換行可以使用
來實現。
⑹ IAR中的問題解決方法求解
IAR中的問題解決方法求解
很顯然你沒有使能寄存器的位定義。方法如下:Project ——> Option ——> General Options ——> System(如下圖所示),勾選
Enable bit definitions in I/O-Include files即可
2.MCU型號選擇
如果和我一樣都次都是以空工程創建的話,不過忘了第一步先進Project ——> Option ——> General Options ——> Target選擇所使用的MCU型號,不然編譯免不了要報錯,如下圖所示。
3. 堆棧大小
今天下午編譯一個程序,0錯誤0警告,挺好,可一運行就跑飛,根本不能正常運行。
其實是我沒有正常設置堆棧大小導致的這種問題,尤其是在寫大工程時,這種錯誤出現的概率很高。GCC和IAR分配堆棧的方式不同,IAR先分配堆棧空間,相當於定義一個全局數組為堆棧空間,堆棧初始為堆棧空間最高地址;GCC不用先分配堆棧,自動把RAM剩餘空間作為堆棧空間,堆棧初始為RAM最高地址。
先編譯看看自己的程序用了多少ram,在看看總共有多少ram。
然後Project ——> Option ——> Linker ——> List選擇生成LIST文件,並包含stack選項,如下圖所示。
在./Debug/list目錄下,得到.map(可能是.lst等其他格式)文件,用記事本打開,找到以下內容:
****************************************
* *
* CALL GRAPH *
* *
****************************************
->Sub-tree of type: Interrupt function tree that does not make
: indirect calls
CSTACK
| Stack used (prev) : 00000000
01 int_T0_OV
| Stack used (prev) : 00000000
| + function block : 0000000C
......(省略N行)
01 main
| Stack used (prev) : 0000003A
| + function block : 00000000
<-Sub-tree of type: Function tree
| Stack used : 000000E2
找到最大的Stack used,我的就是000000E2,這就是用到的最大的堆棧空間,保守一點,我設置成0x100位元組,沒有超過剩餘RAM,再重新編譯,運行,模擬器沒有堆棧不足警告,程序也能正常運行了。
如下圖所示:
4. 查看匯編
相信一個優秀的單片機軟體工程師都多多少少會去看看編譯器的匯編代碼,看看有沒有什麼問題或者看看編譯器有沒有自作聰明的做些什麼
Project ——> Option ——> C/C++ complier ——> List,勾選output assembler files,編譯後則生成離線匯編代碼文件
此時在工程目錄下的Debug-->List即可看到所有參加編譯的C文件對應的匯編文件,後綴名為*.s90
5.內聯函數
inline函數傳統上只有C++支持,但IAR EW也支持在C代碼中使用inline.
#pragma inline:建議編譯器對緊隨其後的函數進行inline處理
#pragma inline = forced: 強制編譯器對緊隨其後的函數進行inline處理
復制代碼
/***************************** 錯誤描述 ******************************************/
// tft.c中定義內聯函數
#pragma inline = forced //強制inline
void TFT_Write_Colour(const RGB_COLOUR *rgb)
{
//...code....
}
// tft.h中聲明函數
void TFT_Write_Colour(const RGB_COLOUR *rgb);
// main.c中調用函數
// 編譯報錯:main中引用了未定義的外部函數TFT_Write_Colour。
/***************************** 解決辦法 ******************************************/
// tft.h中「定義函數」
#pragma inline = forced //在IAR EW430中,這里必須用強制inline;用inline可能導致編譯器忽略內聯,而定義成普通函數而出錯。
void TFT_Write_Colour(const RGB_COLOUR *rgb)
{
//...code....
}
// main.c中包含tft.h,並調用函數
// 結果:編譯正確
復制代碼
6. 如何把變數定義到flash空間
unsigned char __flash temptab[] = {1,2,3,4,5}; <br>__flash unsigned char a @ 0x8; // 定義變數存放在flash 空間0X08單元
7. 關於內存模型
AVR 微控制器的其中一個特點是它有一種存儲器訪問方法均衡了「cheap access limited to small memory areas」與「more expensive accessmethods that can access any location in memory」。
在AVR_IAR C/C++編譯器中,通過選擇某種存儲模式(memory model),可設置一些訪問方法為默認的存儲器訪問方法(default memory accessmethod)。共有三種可用的存儲模式——Tiny,Small 和Large。你的處理器選項決定了哪些模式可以使用。如果你不指定一種存儲模式,則編譯器自動設定-v0、-v1、-v2、-v3、-v5 選項下的默認方法為Tiny,-v4 和-v6 選項下的訪問方法為Small。
8. 關於生成文件格式的設置
如圖,在linker -> outpu ->other中可設置相應的輸出文件格式.
比如要生成bin格式,選擇raw-binary就可以了, 如果是要生成hex格式,那麼可以選intel-extern ,不過這個時候文件擴展名是*.a90,可以把"Override default " 打鉤,然後修改後綴名為hex就行了.
⑺ IAR 編譯器如何讀寫SP(單片機為78f0453)
如果IAR當中沒有默認支持你所使用的單片機,你的困難就比較難解決了。想寫xcl,ddf等文件,絕不是新手能就的。
如果支持你所選的單片機,那麼使用C來編程並不需要你設置SP。
⑻ 怎麼在IAR編譯器中顯示出代碼行標
在代碼段點擊右鍵,找到Options->Editor,將右面的Show Line Numbers 勾選上就可以了
⑼ 如何查看IAR編譯器編譯後的匯編代碼,我想知道這個編譯器是如何處理中斷的
編輯界面右擊工程點擊options菜單項,選擇c/c++ compiler選項卡中的list選項,勾選output assembler files,編譯後則生成離線匯編代碼文件。
調試界面下,點擊view / disassembly 菜單項,則顯示在線匯編代碼窗口。