永发信息网

IAR中的问题解决方法求解

答案:1  悬赏:10  手机版
解决时间 2021-03-02 21:38
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};
__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就行了.追问貌似没有能解决我的这个问题的答案吧
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
急急急。。成都华阳客运站到茶店子客运站的公
有关玻璃的问题玻璃的主要成分为二氧化硅,试
请帮忙看下工资?,为什么总工资额与分解后的工
中国太平洋财产保险股份有限公司重庆市合川支
联想笔记本电脑适配器的驱动程序出现问题 连
七小子怪老头之怪老头的把戏中的好片段
每天赚5分多少天才能赚50
充补词语。什么拿什么稳?
皖垦农产品贵池路店这个地址在什么地方,我要
物业管理区域内物业管理事项的决策机构是()。
把人给问懵了说明什么意思?
刚做镜头,请问:为什么镜头要用个红外滤光片
山西省农村信用社浑源县东大街储蓄所在哪里啊
怎么学习瘦金体,我想学一个字体,谁能指导下我
三河火车站在哪里啊
推荐资讯
什么是阿尔伯特亲王穿刺?
有关两栖动物的叙述中,错误的是AA. 既能生活
韩流这个地址在什么地方,我要处理点事
根据《房屋建筑工程和市政机场设施工程实行见
电影<平行理论>
TPU由透明变成不透明是什么原因
雪花怎么形成的?
知乎兰新三四线新动态
抢救枕骨大孔疝(脑室系统扩大者)最有效的急救
任丘哪里有便宜干净的旅馆??
简普寨饭馆地址在哪,我要去那里办事
洋葱苗怎么吃
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?