IAR 中如何声明 全局变量

IAR 中如何声明 全局变量,第1张

首先要在c文件中定义

比如在mainc中做如下定义:char global_char;

如果该变量要在别的c文件中使用,则必须在h文件中进行声明,例如在inith中要写:

extern char global_char;

这样即可,在c文件中要包含进该头文件,即#include<inith>。

优秀不优秀,每个人的侧重点不同,无法一概而论。

其中CodeWarrior和IAR针对的单片机种类较多,适用面较广。Keil相对来说狭窄一些,主要面向51/251/166以及部分ARM平台(7、9、Mx/R4)。

至于编译器的效率方面这几方总在打嘴仗,也很难说清楚谁的编译器效率更高(因为要取决于具体的应用和源程序的书写)。就我来看对于普通用户而言其实差别不是那么明显的。

从易用性和体验来说,个人觉得CodeWarrior > IAR > Keil。这个是跟每个人的编程/调试习惯和调试需求有关系的。

IAR中的问题解决方法求解

很显然你没有使能寄存器的位定义。方法如下:Project ——> Option ——> General Options ——> System(如下图所示),勾选

Enable bit definitions in I/O-Include files即可

2MCU型号选择

如果和我一样都次都是以空工程创建的话,不过忘了第一步先进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处理

复制代码

/ 错误描述 /

// tftc中定义内联函数

#pragma inline = forced //强制inline

void TFT_Write_Colour(const RGB_COLOUR rgb)

{

//code

}

// tfth中声明函数

void TFT_Write_Colour(const RGB_COLOUR rgb);

// mainc中调用函数

// 编译报错:main中引用了未定义的外部函数TFT_Write_Colour。

/ 解决办法 /

// tfth中“定义函数”

#pragma inline = forced //在IAR EW430中,这里必须用强制inline;用inline可能导致编译器忽略内联,而定义成普通函数而出错。

void TFT_Write_Colour(const RGB_COLOUR rgb)

{

//code

}

// mainc中包含tfth,并调用函数

// 结果:编译正确

复制代码

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的安装中license打开方法是:打开IAR软件,在软件目录中点击help/License mangerd出IAR License manager界面,点击license/offline activation。

出现license wizard界面,开注册机,将license number 赋值到 license wizard界面的license number,在 license wizard界面点击“下一步”。

点击"NO”,接下来会出现save activation information,选择一个地方存储activationinfotxt文件点击“下一步”。

将第9步生成txt文件加载到注册机activate license中,点击activate license,会d出另存生成一个activationresponsetxt文件。

在第10步界面,use the response file to activate the license,中将第11步产生文件加载进来,点击“下一步”,完成注册。

IAR for ARM破解版 是一款非常好用的集成开发环境软件,该集成开发环境中包含了IAR的C/C++编译器、 汇编工具、链接器、库管理器、文本编辑器、工程管理器和C-SPY调试器,支持ARM,AVR,MSP430等芯片内核平台。

IAR是构建应用程序所需的所有工具(构建工具链)的集成环境:C / C ++编译器,C / C ++库,汇编器,链接器,库工具,编辑器。

带有Make实用程序的项目经理,以及IAR C-SPY®调试器。专门用于构建源代码的工具称为构建工具。

以上就是关于IAR 中如何声明 全局变量全部的内容,包括:IAR 中如何声明 全局变量、Codewarrior、IAR和Keil是常见的编译软件,所用编译器分别是什么哪个编译器更优秀啊、IAR中的问题解决方法求解等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10093106.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存