新闻中心

EEPW首页>嵌入式系统>设计应用> 【IAR学习】学习笔记

【IAR学习】学习笔记

作者: 时间:2016-11-25 来源:网络 收藏

5.2.1定义没有存储特性的绝对地址变量必须加__no_init 或者const对象特性

__no_init char t @ 0x65;//定义在I/O地址以外
const char t @ 0x65;//定义只读变量的地址

例:

#i nclude
__no_init char u @ 0x65 ;
void main(void)
{u++;}

对应汇编:

void main(void)
main:
{u++;}
00000000 E6E5 LDI R30, 101
00000002 E0F0 LDI R31, 0
00000004 8100 LD R16, Z
00000006 9503 INC R16
00000008 8300 ST Z, R16
0000000A 9508 RET

5.2.2带存储特性的关键字定义变量的绝对地址__io,__ext_io定义变量在i/o空间

#i nclude
__io char u @ 0x65 ;
void main(void)
{u++;}

对应汇编:

void main(void)
main:
{u++;}
00000000 91000065 LDS R16, 101
00000004 9503 INC R16
00000006 93000065 STS 101, R16
0000000A 9508 RET

从5.2.1和5.2.2对比,发现用5.2.2方法定义代码小多了。

5.3.关键字volatile保证从最原始的位置读取变量。在IAR编译器里,除了__no_init和__root定义的变量外,其他的类型的变量都包含有volatile和__no_init特性

IAR for AVR 学习笔记(6)--中断及相关函数操作

6.1.中断函数:

在IAR编译器里用关键字来__interrupt来定义一个中断函数。用#pragma vector来提供中断函数的入口地址

#pragma vector=0x12//定时器0溢出中断入口地址
__interrupt void time0(void)
{
;
}

上面的入口地址写成#pragma vector=TIMER0_OVF_vect更直观,每种中断的入口地址在头文件里有描述。函数名称time0可以为任意名称。中断函数会自动保护局部变量,但不会保护全局变量。

6.2.内在函数也可以称为本征函数

编译器自己编写的能够直接访问处理器底层特征的函数。在intrinsics.h中有描述完整类型在comp_a90.h里有进一步的简化书写方式

6.2.1延时函数,以周期为标准

__delay_cycles(unsigned long );

如果处理器频率为1M,延时100us,如下:

__delay_cycles(100 );

当然你也可以对该函数进行修改:

#define CPU_F 1000000
#define delay_us (unsigned long) __delay_cycles((unsigned long )*CPU_F)
#define delay_ms (unsigned long) __delay_cycles((unsigned long )*CPU_F/1000)

6.2.2中断指令

__disable_interrupt( );//插入CLI指令, 也可以用_CLI();也可以SREG_Bit7=0;
__enable_interrupt( );// 插入SEI指令,也可以用_SEI();也可以SREG_Bit7=1;

其实对于状态字的置位和清零只有BSET S 和BCLR S两条指令。像SEI不过是BSET 7;的另一个名字而已。AVR指令中还有很多类似的现象,如:ORI 和 SBR 指令完全一样,号称130多条指令的AVR其实没有那么多指令的。

6.2.3从FLASH空间指定地址读取数据

__extended_load_program_memory(unsigned char __farflash *);
__load_program_memory(unsigned char __flash *);

该条指令以及正确的使用方法在4.5.flash 操作宏函数里详细讲解,这里不再重复

6.2.4乘法函数

__fracdtional_multiply_signed(signed char, signed char);
__fractional_multiply_signed_with_unsigned(signed char, unsigned char);
__fractional_multiply_unsigned(unsigned char, unsigned char);
//以上为定点小数乘法
__multiply_signed(signed char, signed char);//有符号数乘法
__multiply_signed_with_unsigned(signed char, unsigned char);
//有符号数和无符号数乘法
__multiply_unsigned(unsigned char, unsigned char);//无符号数乘法

6.2.4 半字节交换指令

__swap_nibbles(unsigned char);

6.2.5 MCU控制指令

__no_operation();//空操作指令
_NOP();
__sleep();//休眠指令
_SLEEP();
__watchdog_reset();//看门狗清零
_WDR();

IAR for AVR 学习笔记(7)--头文件含义

avr_macros.h里面包含了读写16位寄存器的简化书写,和几个位操作函数

comp_a90.h对大量的内在函数做了简要书写

ina90.h包含"inavr.h" "comp_A90.h"文件

intrinsics.h内在函数提供最简单的操作处理器底层特征。休眠,看门狗,FLASH函数。

iomacro.H I/O寄存器定义文件样本。

iom8.h 包含I/O等寄存器定义

IAR for AVR 学习笔记(8)--汇编嵌入方式

嵌入汇编语言

在线汇编:使用asm或者__asm,推荐使用__asm。

#i nclude
void main()
{
asm("NOP "
"CLH "
"OR R16,R17 ");
}

不过IAR提供了完全可以访问底层的函数,建议不要频繁使用汇编


上一页 1 2 3 下一页

关键词:IAR学习学习笔

评论


技术专区

关闭