IAR

文件路径

IAR 可以对每一个C文件单独设置包含路径

IAR 扩展关键字

IAR 扩展关键字 - CSDN博客
http://blog.csdn.net/lookedsky/article/details/50540349

IAR 扩展关键字
1.扩展关键字:用于控制数据和指针


__eeprom 用于EEPROM 存储空间, 控制数据存放,控制指针类型和存放
__tinyflash, __flash, __farflash, __hugeflash 用于flash 存储空间, 控制数据存放,控制指针类型和存放
__ext_io, __io 用于I/O存储空间, 控制数据存放,控制指针类型和存放
__regvar 放置一个变量在工作寄存器中

 

2.函数扩展关键字:


__nearfunc __farfunc 用于控制数据存放,这组关键字必须在函数声明和定义的时候指定
__interrupt. 关键字控制函数的类型。这组关键字必须在函数声明和定义的时候指定
__root. 关键字仅仅控制有定义的函数

 

3.其它特别的关键字:


@ 用于变量的绝对地址定位。也可以用#pragma location 命令
#pragma vector 提供中断函数的入口地址。
__root 保证没有使用的函数或者变量也能够包含在目标代码中
__no_init 禁止系统启动的时候初始化变量.
asm, __asm 插入汇编代码

#i nclude<iom8.h>
__root __flash unsigned char p @ 0x10 =0x56;
void main(void)
{

}

 

 


IAR 常用扩展关键字 - CSDN博客
http://blog.csdn.net/CATHY_AA/article/details/51513172

一、类型属性:
1、存储器属性:
__data16 int 16;
__regvar 定义一个变量在工作寄存器中。例:__regvar int variable_name @R4
2、一般类型属性:
(1)函数类型属性:
__interrupt void TA0_ISR (void) 定义中断函数
__monitor 函数执行过程中禁止中断
__task 不对特殊功能寄存器进行压栈保护
__nearfunc__farfunc 用于控制数据存放,这组关键字必须在函数声明和定义的时候指定
(2)数据类型属性:
const 常量
volatile 易失性变量,编译器遇到由volatile修饰的变量就不对其优化,从而每次都从内存中读取该变量的值。
二、对象属性:
1、用于变量:
__no_int 定义变量但不初始化
2、用于函数和变量:
location
__root 保证一个函数或一个变量不管使用与否都产生目标代码。
@ 用于变量的绝对地址定位
3、用于函数:
__intrinsic,__noreturn,__raw,__save_reg20,vector
__no_init 正常情况下,应用程序启动时,IAR运行时环境将全部全局和静态变量初始化为0。IAR C编译器支持声明不初始化的变量,使用__no_init类型限定符。声明__no_init的变量不需初始化。一些关键数据在系统复位(如看门狗复位或其他原因造成的复位)时的数值是不能改变的!在这种情况下可用__no_init限定。
__root 限定的函数和变量在即是没有被任何函数引用的情况下,它依然存在于目标代码中而不会被优化掉。
__task 被该关键字限定的函数在被调用时不会做寄存器保护,即没有寄存器入栈出栈操作。通常用在RTOS的启动函数中。
在IAR中实验了一下,发现编译器还是将寄存器进行了压栈操作,不知为何?
__weak 在链接阶段,一个symbol可以有多个weak定义和最多一个non-weak定义。如果symbol需要被程序引用,存在non-weak,则non-weak被引用。如果不在在non-weak,则weak中的一个会被应用。

三、 asm,__asm 插入汇编代码
推荐用法
·变量定位
__no_init int a@0x200; (注意偶地址,因为这里的a是int型的) 变量a 就定义在RAM的0x200单元,注意被定位的变量不能初始化。
__no_init char b[10]@0x207; 数组b[10]定义在0x207到(0x207+9)的地址范围内
·常量定位(无须__no_init,并且可以初始化)
const unsigned int c[4]@0x1000={1,2,3,4};(这个数组在FLASH内)
·函数定位
void Fuction(void)@"My_seg" My_seg需要在XCL文件内定义,否则编译出错。

 

IAR Error[Pe020]:identifier "EXTI" is undefined
好多东西你虽然用了,但是肯定是没有在这里面注册过,或者就是在这儿被给注释了。解决的办法如下:
在工程项目下,搜索stm32f10x_conf.h文件,然后去掉其只读属性,把你需要用到的从注释里面解放出来
我们只需要把:
//#define _EXTI
前面的上斜杠给去掉即可:
#define _EXT

IAR_IO_REG8_BIT

谁能讲解一下IAR STM8 1.3头文件io_macros.h这段程序 - tureno2011 - 博客园
https://www.cnblogs.com/tureno/articles/2828080.html

谁能讲解一下IAR STM8 1.3头文件io_macros.h这段程序:
/*---------------------------------------------
* Define NAME as an I/O 8 bit reg
* Access of 8 bit reg: NAME
*--------------------------------------------*/
#define __IO_REG8(NAME, ADDRESS, ATTRIBUTE) \
__near __no_init volatile ATTRIBUTE unsigned char NAME @ ADDRESS;

/*---------------------------------------------
* Define NAME as an I/O reg with bit accesss
* Access of 8 bit reg: NAME
* Access of bit(s): NAME_bit.noXX
*--------------------------------------------*/
#define __IO_REG8_BIT(NAME, ADDRESS, ATTRIBUTE, BIT_STRUCT) \
__near __no_init volatile ATTRIBUTE union \
{ \
unsigned char NAME; \
BIT_STRUCT NAME ## _bit; \
} @ ADDRESS;

#endif /* __IAR_SYSTEMS_ICC__ */

回答1:

将名字为NAME的寄存器定义在地址ADDRESS,指定属性为ATTRIBUTE(比如只读,读写等等)

第二个定义和第一个的不同在于这个寄存器可以进行位操作

使用这个2个定义后就可以使用
__IO_REG8(NAME, ADDRESS, ATTRIBUTE)
简短的代替下面一串
__near __no_init volatile ATTRIBUTE unsigned char NAME @ ADDRESS;

十分简单明了

补充:

__near __no_init
这些是特定编译器支持的关键字.....

 

posted @ 2018-10-31 14:14  娜娜嘭嘭嘭  阅读(805)  评论(0)    收藏  举报