① IAR的c文件窗口 f()不显示函数怎么解决
没有显示说明当前文件的函数并未在任何地方使用,编译器优化后直接去掉了此部分代码的编译。而且这段没有被编译进去的代码,在仿真的时候,连断点都没法打上去。
你检查下代码,结构,编译条件等,想办法去掉选择方面的限制。
② 编译已通过,为什么无法找到函数定义
你把大括号的位置放错了,sushu函数被定义在了main函数里面,但是按照C语言的规定,函数不允许嵌套定义,所以你的sushu相当于没有定义(不知为何你的编译器没有报错说不允许在函数内定义函数)。解决方法是把你最后面多出来的大括号移到main函数最后面。
③ IAR7.2 怎么不能跳转到函数的定义
但你使用跳转命令的时候橘段,在界面下方可能会弹出来让你选腔伍信择跳转到哪里去,因为软件可能在几个地方能找到同名函数,所以要你选择。
要是没有出现让你选择的信息,可能的原因:
函数太近,就在当前页面,所以没动。
函数没在任何地方使用,编译的时候编译把这段代码给优化去掉了,所以伍轮你找不到。
函数使用了指针的形势,而非直接调用,或者使用的宏定义形势。
④ IAR中如何设直接查找函数、变量的定义
你选中一个函数名在上面点右键发历猛局现“Gotodefinitionof……”是灰色的,无法找到函数的定义处。但是,IAR是支持快速查找变量、类型、函数甚至是宏定义功能的。设置方法如下: 1、打开肢让工程,在菜单栏的【TOOLS】项下,选择【options...】 2、弹出的IDE options对话框中选择Project选项卡,勾选“Generatebrowseinformation" 3、设置完点击【确定】即可生效。 这时再来查找函数的定义,查找时先将鼠知数标在函数名上双击,定位光标到函数名字串,再右键弹出快捷菜单。发现原先灰色的“Gotodefinitionofuart0Send”选项已经可选了。
⑤ gcc编译文件时找不到指定函数怎么办
通常找不到指定函数不是因为编译参数问题。而是你 g.cpp 中在include f.h的时候没有使用: extern "C" { #include"f.h" } 因为C语言和cpp的编译过程中的函数名称修饰规则是不一样的。当cpp引用C库的时候必须告诉编译器,哪些函数是C函数
⑥ 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编译错误,Error[Li005]: no definition for
在uart.h中定义了一个结构体类型。
struct SERIREC{
unsigned charflag;
unsigned charCrc8_Code;
unsignedCrc16_Code;
unsigned charusedmes[7];
unsigned chari;
};
extern struct SERIREC PC ; //然后再这里声明它。
在uart.c中定义PC这个结构体的实体。。
struct SERIREC PC ; // 不定义这个,就会报 no definition
编译链接错误(语法错误):编译链接错误又分成编译错和链接错。
编译错就是普通意义上的语法错,编译器进行语法检查不通过,也就是程序违背了计算机语言的语法,例如:括号不匹配、变量名拼写错误、用保留字定义变量名等;
链接错是指程序通过了语法检查,但是无法生成可执行文件,最常见的是链接找不到lib库。初学者有时写了函数的声明,但是缺少函数的定义,此时就会出现链接错。