AVR035高效AVRC编程.docVIP

  • 7
  • 0
  • 约2.36万字
  • 约 20页
  • 2016-12-29 发布于重庆
  • 举报
AVR035: 高效 AVR C 编程 翻译:邵子扬 2006年12月30日 shaoziyang@ 特点 访问 I/O 内存 访问内存映射的 I/O 端口 访问 Flash 中数据 访问 EEPROM 中数据 创建 EEPROM 数据文件 高效使用变量和数据类型 使用位和位掩码 使用宏和函数 18个减少代码大小的方法 5个减少 RAM 需求的方法 程序调试步骤 更新到支持 IAR V2 编译器 介绍 C 高级语言在单片机编程中变得越来越受欢迎。使用C语言相对汇编语言有很多优点:减少开发时间、容易维护和移植(译者:其实写得不好的C程序和汇编一样难以维护和移植),以及方便重复利用代码。其代价可能是更大的代码大小和降低了运行速度。为了减少这些影响, AVR架构调整了典型的C编译器产生的解码和执行指令。 IAR C编译器在AVR架构和指令集规范发布之前就完成了。编译器开发团队和AVR开发团队合作的结果就是产生出高效、高性能的单片机代码。 这篇应用笔记描述了怎样利用AVR架构的优点和开发工具产生比其他单片机更加高效率的C代码。 为C代码调整的硬件架构 32 个工作寄存器是高效C编程的关键。这些寄存器和传统的累加器有相同的功能,除了数量是32个以外。在一个时钟周期内,AVR单片机可以将任意两个寄存器的内容送到ALU中进行运算,并将结果写回到寄存器中。 当数据存放在32个工作寄存器时,每个运算指令无需从内存中移动数据或移动数据到内存。一些寄存器还可以联合起来组成16位指针,用来提高访问程序和内存中数据的效率。对于很大的内存,指针还可以联合第三个8位寄存器组成24位指针,用来直接访问 16M 字节空间的数据,而不用分页。 地址模式 AVR架构有4个内存指针,用来访问数据和程序空间。堆栈指针(SP)专门用来存放函数返回地址;C 编译器分配一个指针作为参数堆栈;剩下的两个指针可以被C编译器用于载入和存放数据。下面的例子显示了C语言中典型指针操作的效率。 char *pointer1 = table[0]; char *pointer2 = table[49]; *pointer1++ = *--pointer2; 产生下面的汇编代码: LD R16,-Z ; 预先递减Z指针并载入数据 ST X+,R16 ; 存放数据和递增 下面显示了4种指针寻址的模式和例子。所有指针操作都是单字指令,执行时需要两个时钟周期。 间接寻址:寻址数组和指针变量。如 *pointer = 0x00; 带有偏移量的间接寻址:允许指针指向第一个元素,通过增加偏移量而不是修改指针值的方式访问一个结构体的所有单元。也用于访问软件堆栈和数组。 带有递增的间接寻址:在访问后,数组和指针变量将递增的高效寻址方式。如 *pointer++ = 0xFF; 带有预先递减的间接寻址:在访问前,数组和指针变量将递减的高效寻址。如 *--pointer = 0xFF; 指针也用于访问 Flash 程序空间。此外,指针的间接寻址也能用在直接寻址数据空间。这使得可以用双字指令访问整个数据空间。 16/32位变量的支持 AVR 指令集包括了处理16位数的特殊指令,包括加/减一个数到字(ADIW, SBIW)。算术计算和比较16位数在两个指令以及两个时钟周期中完成。32位算术计算和比较需要4个指令和4个时钟周期。这比大多数16位处理器有更高的效率。 AVR单片机的C编程 初始化堆栈 在上电后或复位后,需要在调用任何函数之前设置堆栈指针。由连接命令文件判定堆栈指针的位置和大小。内存大小的配置和堆栈指针设置在应用笔记“AVR032: 修改连接命令文件“中说明了。 访问I/O端口 AVR的I/O在C语言中很容易访问。所有I/O寄存器都在名为“ioxxxx.h“头文件中声明,这里 xxxx 是AVR 单片机的型号。下面的代码显示了访问I/O 端口的例子,每一行C代码下是对应的汇编代码。 #include io8515.h /* Include header file with symbolic names */ __C_task void main(void) { char temp; /* Declare a temporary variable*/ /*To read and write to an I/O register*/ temp = PIND; /* Read PIND into a variable*/ // IN R16,LOW(16) ; Read I/O memory TCCR0 = 0x4F;

文档评论(0)

1亿VIP精品文档

相关文档