导航:首页 > 源码编译 > iar编译器命令行

iar编译器命令行

发布时间:2023-01-06 22:22:31

⑴ 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 菜单项,则显示在线汇编代码窗口。

阅读全文

与iar编译器命令行相关的资料

热点内容
Python取ID对应的值 浏览:630
现在我的世界什么服务器最混乱 浏览:762
美国好的源码出售 浏览:323
苹果ipad文件夹怎么添加文字 浏览:481
腾讯云连接自己的服务器地址 浏览:216
硕士英语综合教程pdf 浏览:46
分段加密的安全性 浏览:507
咪咕直播为什么没有适配安卓系统 浏览:172
php模版大全 浏览:102
没车能解压吗 浏览:634
php开发oa系统源码 浏览:759
怎么安装苹果ios的app 浏览:581
app拉新如何机刷 浏览:480
zendeclipseforphp 浏览:480
同时有几个微信如何加密微信 浏览:86
大众20t压缩比 浏览:566
程序员要记住的500个单词 浏览:831
wq快捷方式在哪个文件夹 浏览:965
云南到河北源码 浏览:92
安卓手机怎么玩造梦3 浏览:60