1. 中断的用法 ICCAVR #pragma interrupt_handler <function_name>:<interrupt_vetor_number> 如果想要多个中断入口使用同一个中断服务程序,只要用不同的向量号多次声明就可以了,例如,计划定时器1和0溢出共用time_ovf中断函数,可以定义如下: #pragma interrupt_handler time_ovf:7 time_ovf:8
CodeVisionAVR 中断的用法: interrupt[interrupt_vetor_number] function_name 如: interrupt [TIM1_OVF] void timer1_overflow(void)
2. 头文件 ICCAVR 在macros.h中,定义了一个“#define BIT(x) (1<<(x))”的宏,用该宏来操作位变量,编译后生成的代码质量更高。如下例: #define PORTA0 0 #define PORTA1 1 #define PORTA2 2 #define PORTA3 3 #define PORTA4 4 #define PORTA5 5 #define PORTA6 6 #define PORTA7 7 在使用时,应该在文件头加入“#include <macros.h>”定义,如要将PORTA7清零,可能使用如下语句: PORTA&=~BIT(PORTA7) 要装饰PORTA7置位,可以使用如下语句: PORTA|=BIT(PORTA7)
3. 对寄存器变量的访问 CodeVisionAVR 定义了新的数据类型“sfrb”和“sfrw”,使C语言可以直接访问MCU的有关寄存器。如: sfrb DDRD=x011
ICCAVR 没有定义类似的数据类型,而是采用强制类型转换和指针的概念来实现访问MCU的寄存器,如: #define DDRD (*(volatile unsigned char *)0x31) //加上了0x20 则在ICCAVR中访问: DDRD=0xff;
4. 使用AVR片内不同的存储空间 由于AVR单片机内部有三种类型的存储空间(ARM、EEPROM和FLASH),CodeVisionAVR和ICCAVR均对语法进行的扩充。 对字符串的处理两者相同,即对于用户没有指定只能保存在Flash中的字符串,在启动时将字符从程序存储区复制到数据存储区。 ICCAVR 对const类型进行的扩充,编译器会自将const类型数据分配进FLASH存储中,对片内EEPROM存贮器的访问,ICCAVR只能通过调用头文件eeprom.h中的函数EEPROM进行。ICCAVR不支持将全局变量或局部变量分配至EEPROM,通常只将常量分配至有EEPROM中,一般定义如下: #program data:eeprom/flash const unsigned char table[]={0x3f,0x06...,}; #program data:data
CodeVisionAVR 扩充了flash和eeprom两个关键词,使用flash将const定义的常量分配进Flash存器,以节省RAM的使用。而eeprom关键词限定的变量则被分配进片内EEPROM中,在C语言中访问EEPROM中变量的方法与访问RAM中变量的方法完全相同,包括指针形式的访问。 注意:在CVAVR中,有两种存储模式“TINY”和“SMALL”,其中“TINY”模式使用1个字节(8位)的指针,因此只能访问不大于256字节的存储空间;“SMALL”模式使用2个字节的指针,可以访问不大于64K字节的存储空间。当使用外部数据存储器时,必须使用“SMALL”,如果没有使用外部数据存储器,应优先使用“TINY”模式。 CVAVR指向字符串的指针数组至多只支持8个元素,注意,是指向字符串的指针数组,普通数组则没有这个限制。 如: char flash *string[8]={"a","b","c","d","e","f","g","h"};
5. 位变量 CodeVisionAVR 可以直接定义位变量 bit on_off=1; ICCAVR 在ICCAVR 6.26C中,不能直接定义位变量,但是可以使用C语言中的结构体定义位变量,如下例: struct data //存放于SRAM中 { unsigned bit0:1; unsigned bit1:1; unsigned bit2:1; unsigned bit3:1; unsigned bit4:1; unsigned bit5:1; unsigned bit6:1; unsigned bit7:1; } 上例中,成员列表的位域的类型必须用unsigned或signed定义关键字。a、b均占用一个字节的存储空间。定义之后就可以直接使用位变量了,如: a.bit1=0; a.bit7=1; if(a.bit5==1)
|